Compare commits

..

27 Commits

Author SHA1 Message Date
lcw
2ea84f248c lcw 2026-01-06 22:09:05 +08:00
lcw
953cb9943d lcw 2025-12-27 22:09:13 +08:00
lcw
3fb06e3847 lcw 2025-12-27 11:10:31 +08:00
lcw
596c9f99e4 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2025-12-26 09:39:28 +08:00
lcw
e59b401828 lcw 2025-12-26 09:39:22 +08:00
669c8cb3b5 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2025-12-25 11:07:09 +08:00
22c3e0253b 更新 2025-12-25 11:07:03 +08:00
lcw
6999c36c3a lcw 2025-12-25 10:38:17 +08:00
lcw
709ce4a1e9 lcw 2025-12-25 10:35:00 +08:00
23cc528707 更新 2025-12-25 09:45:07 +08:00
bc92cfa735 更新 2025-12-25 09:37:17 +08:00
1a7b27209f 更新 2025-12-24 09:27:05 +08:00
5ae5dc7224 更新 2025-12-23 18:58:47 +08:00
039e0ce421 提交 2025-12-23 11:42:42 +08:00
369fb4c00a 提交 2025-12-22 17:22:18 +08:00
ab9249479c 提交 2025-12-22 16:04:33 +08:00
c18dde1b43 大屏调整 2025-12-20 16:48:23 +08:00
d3110fb7b9 调整大屏跳转 2025-12-20 15:45:11 +08:00
a9959ce537 调整数据监测 2025-12-20 15:32:44 +08:00
d0b7e6c768 feat: 样式菜单更新 2025-12-19 15:54:20 +08:00
56000fdbdf feat: 文字调整 2025-12-19 14:12:57 +08:00
32d5e53b59 feat:战略研判修改 2025-12-19 14:11:16 +08:00
f6ce1455da feat: 增加一个blur事件 2025-12-19 13:21:56 +08:00
f9af7e060d feaet: 调整报告接口 2025-12-19 13:21:27 +08:00
198ee8f734 更新 2025-12-19 13:15:06 +08:00
97f7736081 Merge branch 'main' of http://61.139.16.27:26684/zy_oyj/sgxt_web 2025-12-19 11:41:50 +08:00
f0910016ae 更新 2025-12-19 11:41:05 +08:00
90 changed files with 6352 additions and 1257 deletions

0
gsxt.zip Normal file
View File

138
package-lock.json generated
View File

@ -2181,51 +2181,6 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true "dev": true
}, },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"ssri": { "ssri": {
"version": "8.0.1", "version": "8.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
@ -2234,28 +2189,6 @@
"requires": { "requires": {
"minipass": "^3.1.1" "minipass": "^3.1.1"
} }
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
} }
} }
}, },
@ -15205,6 +15138,68 @@
} }
} }
}, },
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-router": { "vue-router": {
"version": "4.1.3", "version": "4.1.3",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.3.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.3.tgz",
@ -15287,7 +15282,7 @@
"integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==" "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A=="
}, },
"@popperjs/core": { "@popperjs/core": {
"version": "npm:@sxzz/popperjs-es@2.11.7", "version": "npm:@popperjs/core@npm:@sxzz/popperjs-es@2.11.7",
"resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
}, },
@ -15334,6 +15329,13 @@
"lodash-unified": "^1.0.3", "lodash-unified": "^1.0.3",
"memoize-one": "^6.0.0", "memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.2.0" "normalize-wheel-es": "^1.2.0"
},
"dependencies": {
"@popperjs/core": {
"version": "npm:@sxzz/popperjs-es@2.11.7",
"resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
}
} }
}, },
"lodash-unified": { "lodash-unified": {

View File

@ -152,19 +152,22 @@ v-deep .el-loading-mask {
} }
.popupCustomBox{ .popupCustomBox{
position: relative; position: relative;
padding: 4px 10px; background: rgba(2, 55, 114, 0.99);
box-sizing: border-box;
background: #06254282;
color: #fff; color: #fff;
border-radius: 4px; border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
.popupCustomTitle_title{ .popupCustomTitle_title{
padding: 4px;
box-sizing: border-box;
font-size: 12px; font-size: 12px;
line-height: 24px;
text-transform: none; text-transform: none;
margin-bottom: 0; margin-bottom: 0;
border-bottom: 1px dashed #ececec; border-bottom: 1px dashed #ececec;
margin-bottom: 2px; margin-bottom: 2px;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: nowrap;
} }
&::after{ &::after{
content: ''; content: '';
@ -176,7 +179,18 @@ v-deep .el-loading-mask {
height: 0; height: 0;
border-left: 10px solid transparent; border-left: 10px solid transparent;
border-right: 10px solid transparent; border-right: 10px solid transparent;
border-top: 10px solid #06254282; border-top: 10px solid rgba(2, 55, 114, 0.99);
}
.popupCustomTitle_li{
font-size: 12px;
line-height: 22px;
text-transform: none;
margin-bottom: 0;
span{
display: inline-block;
width: 45px;
text-align: center;
}
} }
} }
</style> </style>

View File

@ -60,3 +60,36 @@ export const strategicPut = (data, url) => {
data data
}) })
} }
//提交研判申请
export const ypbgSjzlTjspId = (id) => {
return request({
url: api + `/ypbg/sjzl/tjsp/${id}`,
method: "get"
})
}
//ypbg/sjzl/queryShList 查询研判内部审核人员列表
export const ypbgSjzlQueryShList = (params) => {
return request({
url: api + `/ypbg/sjzl/queryShList`,
method: "get",
params
})
}
export const ypbgSjzlYpsp = (data) => {
return request({
url: api + `/ypbg/sjzl/ypsp`,
method: "post",
data
})
}
// 提交研判申请
// / mosty - api / mosty - gsxt / ypbg / sjzl / tjsp / id
// 研判内部审核人员查询列表(市情指领导才有权限)
// /mosty-api/mosty - gsxt / ypbg / sjzl / queryShList
// 内部研判审批
// / mosty - api / mosty - gsxt / ypbg / sjzl / ypsp
// 提交上级部门审批
// / mosty - api / mosty - gsxt / ypbg / sjzl / sendFqzl
// 工作流审批回掉
// / mosty - api / mosty - gsxt / ypbg / sjzl / updateBkgzl

View File

@ -104,6 +104,19 @@ export const gsxtYpbgAddEntity = (data) => {
}) })
} }
/**
* 编辑研判报告
* @param {Object} data 研判报告数据
* @returns {Promise} 请求Promise对象
*/
export const gsxtYpbgEditEntity = (data) => {
return request({
url: api + `/gsxtYpbg/editEntity`,
method: "put",
data
})
}
/** /**
* 自建研判报告 * 自建研判报告
* @param {Object} data 自建研判数据 * @param {Object} data 自建研判数据

43
src/api/sjxsgl.js Normal file
View File

@ -0,0 +1,43 @@
import request from "@/utils/request";
const api = "/mosty-api/mosty-gsxt";
// 新增系数
export const sjxsglAddEntity = (data) => {
return request({
url: api + "/sjxsgl/addEntity",
method: "POST",
data
});
};
// 删除系数
export const sjxsglDeleteEntity = (data) => {
return request({
url: api + "/sjxsgl/deleteEntity",
method: "DELETE",
data
});
};
// 修改系数
export const sjxsglEditEntity = (data) => {
return request({
url: api + "/sjxsgl/editEntity",
method: "PUT",
data
});
};
// 分页查询
export const sjxsglGetPageList = (params) => {
return request({
url: api + "/sjxsgl/getPageList",
method: "GET",
params
});
};
export const sjxsgId = (id) => {
return request({
url: api + `/sjxsgl/${id}`,
method: "GET",
});
}

View File

@ -1,5 +1,6 @@
import request from "@/utils/request"; import request from "@/utils/request";
const api = "/mosty-api/mosty-base"; const api = "/mosty-api/mosty-base";
const fzapi = "/mosty-api/mosty-gsxt";
/* /*
* 登录 * 登录
* return promise 实例对象 * return promise 实例对象
@ -154,3 +155,11 @@ export const deleteSysDictItem = (data) => {
data data
}); });
}; };
// 方正字典
export const fzdict = (params) => {
return request({
url: fzapi + "/xsaj/dict/selectList",
method: "GET",
params
});
}

View File

@ -186,3 +186,20 @@ export const xxcjXxzhs = (data) => {
data data
}) })
} }
// 线索研判盯办统计
// 线索总数
export const xxcjQbcjSelectPage = (params) => {
return request({
url: api + `/qbcj/selectPage`,
method: "get",
params
})
}
// 下发总数列表
export const xxcjXfxsSelectPage = (params) => {
return request({
url: api + `/zlxx/selectPage`,
method: "get",
params
})
}

View File

@ -78,6 +78,13 @@ export const tbGsxtBqzhSelectList = (params) => {
params params
}) })
} }
// 组合标签详情
export const tbGsxtBqzhId = (id) => {
return request({
url: api + `/tbGsxtBqzh/${id}`,
method: "get",
})
}
// 身份标签 // 身份标签
export const yjzxSfyjSelectList = (params) => { export const yjzxSfyjSelectList = (params) => {
return request({ return request({
@ -210,4 +217,17 @@ export const sjzlQryp = (id) => {
method: "get", method: "get",
}) })
} }
export const xsajSelectPage = (params) => {
return request({
url: api + `/asj/xsaj/selectPage`,
method: "get",
params
})
}
export const xsajDictSelectList = (params) => {
return request({
url: api + ``,
method: "get",
params
})
}

View File

@ -0,0 +1,241 @@
<template>
<el-dialog :title="titleValue" width="1400px" :model-value="modelValue" append-to-body @close="closed">
<div>
<el-form :model="listQuery" class="mosty-from-wrap" :inline="true">
<el-form-item label="系数名称">
<el-input placeholder="请输入系数名称" v-model="listQuery.mc" clearable></el-input>
</el-form-item>
<el-form-item label="计算规则">
<el-input placeholder="请输入计算规则" v-model="listQuery.jsgz" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
<el-button type="info" @click="reset()"> 重置 </el-button>
</el-form-item>
</el-form>
<div class="tabBox" :class="props.Single ? 'tabBoxRadio' : ''" style="margin-top: 0px">
<el-table ref="multipleUserRef" @selection-change="handleSelectionChange" :data="tableData" border
:row-key="keyid" style="width: 100%" height="450">
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column prop="mc" align="center" label="系数名称" />
<el-table-column prop="sjbl" align="center" label="衰减比例" />
<el-table-column prop="jsgz" align="center" label="计算规则" />
</el-table>
</div>
<div class="fenye" :style="{ top: tableHeight + 'px' }">
<el-pagination class="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"></el-pagination>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closed">取消</el-button>
<el-button type="primary" @click="onComfirm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import * as rule from "@/utils/rules.js";
import * as MOSTY from "@/components/MyComponents/index";
import { ElMessage } from "element-plus";
import { defineProps, watch, ref, onMounted, nextTick } from "vue";
import { selectUnAccreditPage, selectUserDeptPage } from "@/api/user-manage";
import { sjxsglGetPageList } from "@/api/sjxsgl.js";
import { qcckPost } from "@/api/qcckApi.js";
const props = defineProps({
modelValue: {
type: Boolean,
required: true
},
titleValue: {
type: String,
default: "选择配置"
},
LeaderType: {
type: String,
default: ""
},
//是否单选
Single: {
type: Boolean,
default: true
},
roleIds: {
type: Array,
default: []
}, url: {
type: String,
default: ""
}, bh: {
type: String,
default: ""
},
chooseJfBh: {
type: String,
default: ""
}
});
const total = ref(0);
const listQuery = ref({
current: 1,
size: 20
});
const form = ref({});
const tableData = ref([]);
const emits = defineEmits(["update:modelValue", "choosedUsers"]);
onMounted(() => {
});
watch(() => props.modelValue, (val) => {
if (val) {
nextTick(() => {
getListData();
});
}
}, {
immediate: true
});
// 监听 roleIds 变化,实时更新选择状态
watch(() => props.roleIds, (newVal, oldVal) => {
console.log('roleIds变化:', newVal, oldVal);
// 只要roleIds有变化就尝试回显不需要等待modelValue为true
// 因为可能是在对话框打开后roleIds才变化
nextTick(() => {
multipleUser();
});
}, { deep: true });
const closed = () => {
// 清空新选择的内容
multipleSelectionUser.value = [];
// 取消表格中所有行的选择状态
if (multipleUserRef.value && tableData.value && tableData.value.length > 0) {
tableData.value.forEach(item => {
multipleUserRef.value.toggleRowSelection(item, false);
});
}
emits("update:modelValue", false);
};
const reset = () => {
listQuery.value = {
current: 1,
size: 20,
loginName: "",
phone: ""
};
getListData();
};
const keyid = (row) => {
return row.id;
};
// 为用户分配角色
const onComfirm = () => {
const userList = multipleSelectionUser.value;
console.log(userList);
let promes = {
list: userList.map(item => {
return {
xsid: item.id,
mc: item.mc,
sjbl: item.sjbl,
}
}),
id: props.chooseJfBh
}
qcckPost(promes, `/mosty-gsxt${props.url}`).then(res => {
ElMessage.success('操作成功');
})
closed();
};
/**
* pageSize 改变触发
*/
const handleSizeChange = (currentSize) => {
listQuery.value.size = currentSize;
getListData();
};
/**
* 页码改变触发
*/
const handleCurrentChange = (currentPage) => {
listQuery.value.current = currentPage;
getListData();
};
const getListData = () => {
const params = listQuery.value;
sjxsglGetPageList(params).then((res) => {
tableData.value = res?.records;
total.value = Number(res.total);
// 使用 nextTick 确保表格已经渲染完成后再执行回显
nextTick(() => {
multipleUser();
});
});
};
// 列表回显
function multipleUser() {
// 确保表格引用和数据都存在
if (!multipleUserRef.value || !tableData.value || tableData.value.length === 0) {
console.log('表格引用或数据不存在,无法回显');
return;
}
// 先清空之前的选择,确保选择状态的准确性
tableData.value.forEach(item => {
multipleUserRef.value.toggleRowSelection(item, false);
});
console.log('开始回显roleIds:', props.roleIds);
console.log('表格数据:', tableData.value);
// 根据 roleIds 进行回显,确保类型一致
tableData.value.forEach((item) => {
const itemId = String(item.id);
if (props.roleIds.some((id) => String(id) === itemId)) {
console.log('回显选择:', item);
multipleUserRef.value.toggleRowSelection(item, true);
}
});
}
const handleFilter = () => {
listQuery.value.current = 1;
getListData();
};
const multipleUserRef = ref(null);
const multipleSelectionUser = ref([]);
const handleSelectionChange = (val) => {
if (props.Single) {
if (val.length > 1) {
let del_row = val.shift();
multipleUserRef.value.toggleRowSelection(del_row, false);
}
multipleSelectionUser.value = val;
} else {
multipleSelectionUser.value = val;
}
};
</script>
<style lang="scss" scoped>
@import "@/assets/css/layout.scss";
@import "@/assets/css/element-plus.scss";
</style>
<style>
.tabBoxRadio .el-checkbox__inner {
border-radius: 50% !important;
}
.tabBoxRadio .el-table__header-wrapper .el-checkbox {
display: none;
}
</style>

View File

@ -5,164 +5,184 @@
v-model:h="element.height" v-model:h="element.height"
v-model:w="element.width" v-model:w="element.width"
v-model:active="element.isActive" v-model:active="element.isActive"
:draggable="true"
:resizable="true"
:handles="['tl','tr','bl','br']"
handles-type="handles"
:active-on-hover="false"
:prevent-deactivation="true"
class-name-handle="drs-handle"
class="container" class="container"
> >
<div ref="mainContentRef" class="conference-box"> <div ref="mainContentRef" class="conference-box">
<!-- 会议主题 --> <!-- Header Area -->
<div v-show="displaySubject" class="subject"> <div class="conference-header">
<h3 v-if="!editSubject" @click="editSubject = true"> <div class="header-top">
{{ displaySubject }} ({{ activeMeetingConfig?.meeting.number }}) <div class="title-section" v-show="displaySubject">
</h3> <h3 v-if="!editSubject" @click="editSubject = true" class="conference-title">
<el-input v-else v-model="subject" autofocus allow-clear @blur="updateSubject"/> {{ displaySubject }}
</h3>
<el-input v-else v-model="subject" autofocus allow-clear @blur="updateSubject" class="title-input"/>
<div class="meeting-id-tag" @click="copyMeetingNumber" v-if="activeMeetingConfig?.meeting?.number">
<span class="id-label">会议号:</span>
<span class="id-value">{{ activeMeetingConfig?.meeting?.number }}</span>
<el-icon class="copy-icon"><CopyDocument /></el-icon>
</div>
</div>
</div>
<div class="participants-info">
<el-icon><User /></el-icon>
<span class="count-text">参会人员 {{ activeMeetingConfig?.members?.length || 0 }}</span>
</div>
</div> </div>
<div class="top-box"> <!-- Video Content Area -->
<!-- 当前正在讲话 --> <div class="video-content-area">
<el-row justify="space-around"> <div class="top-box">
<el-tag v-for="name in speakingMemberNames" :key="name" bordered color="green" >{{ name }}</el-tag> <!-- 当前正在讲话 -->
</el-row> <el-row justify="space-around">
<el-tag v-for="name in speakingMemberNames" :key="name" bordered color="green" >{{ name }}</el-tag>
</el-row>
<!-- 共享者 -->
<el-tag v-if="activeMeetingConfig?.sharingMember" bordered color="orange">
{{ activeMeetingConfig?.sharingMember?.alias}}正在共享屏幕
</el-tag>
</div>
<!-- 共享者 --> <!-- 会议音视频 -->
<el-tag v-if="activeMeetingConfig?.sharingMember" bordered color="orange"> <audio id="conference_audio" ref="audioRef" :volume="80 / 100" :muted="audioOuputStatus !== 0" autoplay controls hidden />
{{ activeMeetingConfig?.sharingMember?.alias}}正在共享屏幕 <video id="conference_video" ref="videoRef" autoplay playsinline :hidden="!showVideo" class="video"/>
</el-tag>
<!-- 广播相关此处借用 video 标签获取对应的流 -->
<video id="conference_localvideo" ref="localVideoRef" autoplay playsinline :hidden="!showlocalVideo" class="video" />
<img v-if="isMicEnable" v-show="activeMeetingConfig?.broadcast" @click="stopBroadcast" src="@/assets/images/webPuc/svgs/img_broadcast.svg" alt="" class="img_broadcast">
<el-upload
v-show="false"
:show-file-list="false"
draggable
accept=".mp4"
:multiple="false"
:auto-upload="false"
:show-remove-button="false"
:show-cancel-button="false"
@change="onFileChanged"
@before-upload="beforeUpload"
/>
<video id="conference_pushVideo" ref="pushVideoRef" autoplay playsinline :hidden="!showPushlVideo" class="video"/>
<audio ref="fileAudioRef" autoplay :hidden="true" />
<div class="control-bar">
<!-- 锁定 -->
<el-button circle @click="lockConference" class="control-btn">
<el-icon size="20px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon>
<el-icon size="20px" v-else ><Unlock/></el-icon>
</el-button>
<!-- 麦克风 -->
<el-button circle @click="setMuteMic" class="control-btn">
<img v-if="isMicEnable" src="@/assets/images/webPuc/svgs/microphone.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/microphone_mute.svg" alt="">
</el-button>
<el-popover title="选择麦克风" trigger="click" position="bottom-end">
<template #reference>
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
</template>
<MicPop @changeDevice="changeDevice" />
</el-popover>
<!-- 扬声器 -->
<el-button circle @click="setMuteEar" class="control-btn">
<img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/trumpet_mute.svg" alt="">
</el-button>
<el-popover title="选择扬声器" trigger="click" position="bottom-end">
<template #reference>
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
</template>
<!-- <AudioPop @changeDevice="changeDevice" /> -->
</el-popover>
<!-- 摄像头 -->
<el-button circle @click="setCamera" class="control-btn">
<img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/camera_mute.svg" alt="">
</el-button>
<el-popover title="选择摄像头" trigger="click" position="bottom-end">
<template #reference>
<el-icon class="control-arrow" color="#fff"><ArrowDown/></el-icon>
</template>
<!-- <CameraPop @changeDevice="changeDevice" /> -->
</el-popover>
<!-- 屏幕共享 -->
<el-button circle @click="setShareScreenStatus(1)" class="control-btn">
<img src="@/assets/images/webPuc/svgs/share_video.svg" alt="">
</el-button>
<!-- 结束共享 / 结束会议 (Center) -->
<el-button v-if="activeMeetingConfig?.sharingMember?.basedata_id === userInfo?.basedata_id"
type="danger"
shape="round"
status="danger"
class="hangup-btn"
@click="setShareScreenStatus(0)">
结束共享
</el-button>
<template v-else>
<!-- 结束会议 v-if="globalStore.IS_CURRENT_MEETING_OWNER"-->
<el-button
type="danger"
shape="round"
class="hangup-btn"
@click="endConference">
结束会议
</el-button>
</template>
<!-- 成员管理 -->
<el-button circle @click="showMembers" class="control-btn">
<el-icon color="#fff" size="20"><Auatar/></el-icon>
</el-button>
<!-- 语音激励 -->
<el-button circle @click="setVoiceStimulation()" class="control-btn">
<img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt="">
</el-button>
<!-- 布局 -->
<!-- <LaoutType @setConfernceLayoutType="setConfernceLayoutType" /> -->
<!-- 画面抓取-截图 -->
<el-button circle @click="startScreenshot" class="control-btn">
<el-icon color="#fff" size="20"><Scissor/></el-icon>
</el-button>
<!-- 视频广播 -->
<el-button circle @click="broadcastAction" class="control-btn">
<img src="@/assets/images/webPuc/svgs/icon_broadcast.svg" alt="">
</el-button>
<!-- 录屏 -->
<el-button circle @click="!isRecording ? mediaRecorder.start() : mediaRecorder.stop()" class="control-btn">
<el-icon v-if="!isRecording"><Camera/></el-icon>
<el-icon v-else style="color: red"><Videopause/></el-icon>
</el-button>
<el-button circle @click="toggleFullscreen" class="control-btn">
<el-icon v-if="!isFullscreen"><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M384 192H192a64 64 0 00-64 64v192a32 32 0 1064 0V288h192a32 32 0 000-64zm384 64H576a32 32 0 100 64h192v160a32 32 0 1064 0V256a64 64 0 00-64-64zM352 768H192V608a32 32 0 10-64 0v192a64 64 0 0064 64h160a32 32 0 100-64zm544-160a32 32 0 00-32 32v128H704a32 32 0 100 64h160a64 64 0 0064-64V640a32 32 0 00-32-32z"/></svg></el-icon>
<el-icon v-else><svg class="icon" width="200" height="200" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M352 288a32 32 0 010-64h160a32 32 0 0132 32v160a32 32 0 11-64 0V320H352zm320 448a32 32 0 010 64H512a32 32 0 01-32-32V608a32 32 0 1164 0v128h128zM256 672a32 32 0 00-32-32H96a32 32 0 00-32 32v128a32 32 0 1064 0v-96h64a32 32 0 0032-32zm640-384a32 32 0 00-32 32v96h-64a32 32 0 100 64h128a32 32 0 0032-32V288a32 32 0 00-32-32z"/></svg></el-icon>
</el-button>
</div>
</div> </div>
<!-- 会议音视频 -->
<audio id="conference_audio" ref="audioRef" :volume="80 / 100" :muted="audioOuputStatus !== 0" autoplay controls hidden />
<video id="conference_video" ref="videoRef" autoplay playsinline :hidden="!showVideo" class="video"/>
<!-- 广播相关此处借用 video 标签获取对应的流 -->
<video id="conference_localvideo" ref="localVideoRef" autoplay playsinline :hidden="!showlocalVideo" class="video" />
<img v-if="isMicEnable" v-show="activeMeetingConfig?.broadcast" @click="stopBroadcast" src="@/assets/images/webPuc/svgs/img_broadcast.svg" alt="">
<el-upload
v-show="false"
:show-file-list="false"
draggable
accept=".mp4"
:multiple="false"
:auto-upload="false"
:show-remove-button="false"
:show-cancel-button="false"
@change="onFileChanged"
@before-upload="beforeUpload"
/>
<video id="conference_pushVideo" ref="pushVideoRef" autoplay playsinline :hidden="!showPushlVideo" class="video"/>
<audio ref="fileAudioRef" autoplay :hidden="true" />
<el-row class="buttonContainer" justify="space-around">
<!-- 锁定 -->
<el-button circle @click="lockConference">
<el-icon size="20px" v-if="activeMeetingConfig?.lockStatus == 1"><Lock/></el-icon>
<el-icon size="20px" v-else ><Unlock/></el-icon>
</el-button>
<!-- 麦克风 -->
<el-button circle @click="setMuteMic">
<img v-if="isMicEnable" src="@/assets/images/webPuc/svgs/microphone.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/microphone_mute.svg" alt="">
</el-button>
<el-popover title="选择麦克风" trigger="click" position="bottom-end">
<template #reference>
<el-icon style="align-self: flex-end" color="#000"><ArrowDown/></el-icon>
</template>
<MicPop @changeDevice="changeDevice" />
</el-popover>
<!-- 扬声器 -->
<el-button circle @click="setMuteEar">
<img v-if="audioOuputStatus == 1" src="@/assets/images/webPuc/svgs/earpiece.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/trumpet_mute.svg" alt="">
</el-button>
<el-popover title="选择扬声器" trigger="click" position="bottom-end">
<template #reference>
<el-icon style="align-self: flex-end" color="#000"><ArrowDown/></el-icon>
</template>
<!-- <AudioPop @changeDevice="changeDevice" /> -->
</el-popover>
<!-- 摄像头 -->
<el-button circle @click="setCamera">
<img v-if="userInfo?.camera_status === CAMERA_STATUS_OPEN" src="@/assets/images/webPuc/svgs/camera.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/camera_mute.svg" alt="">
</el-button>
<el-popover title="选择摄像头" trigger="click" position="bottom-end">
<template #reference>
<el-icon style="align-self: flex-end" color="#000"><ArrowDown/></el-icon>
</template>
<!-- <CameraPop @changeDevice="changeDevice" /> -->
</el-popover>
<!-- 屏幕共享 -->
<el-button circle @click="setShareScreenStatus(1)">
<img src="@/assets/images/webPuc/svgs/share_video.svg" alt="">
</el-button>
<!-- 成员管理 -->
<el-button circle @click="showMembers">
<el-icon color="#84888E" size="20"><Auatar/></el-icon>
</el-button>
<!-- 语音激励 -->
<el-button circle @click="setVoiceStimulation()">
<img v-if="activeMeetingConfig?.voiceStimulation" src="@/assets/images/webPuc/svgs/icon_embrave.svg" alt="">
<img v-else src="@/assets/images/webPuc/svgs/conference_icom_cancel_voice_stimulation.svg" alt="">
</el-button>
<!-- 布局 -->
<!-- <LaoutType @setConfernceLayoutType="setConfernceLayoutType" /> -->
<!-- 画面抓取-截图 -->
<el-button circle @click="startScreenshot">
<el-icon color="#84888E" size="20"><Scissor/></el-icon>
</el-button>
<!-- 视频广播 -->
<el-button circle @click="broadcastAction">
<img src="@/assets/images/webPuc/svgs/icon_broadcast.svg" alt="">
</el-button>
<!-- 录屏 -->
<el-button circle @click="!isRecording ? mediaRecorder.start() : mediaRecorder.stop()">
<el-icon v-if="!isRecording"><Camera/></el-icon>
<el-icon v-else style="color: red"><Videopause/></el-icon>
</el-button>
<!-- 结束共享 -->
<el-button v-if="activeMeetingConfig?.sharingMember?.basedata_id === userInfo?.basedata_id"
type="danger"
shape="round"
status="danger"
@click="setShareScreenStatus(0)">
结束共享
</el-button>
<template v-else>
<!-- 结束会议 v-if="globalStore.IS_CURRENT_MEETING_OWNER"-->
<el-button
type="danger"
shape="round"
@click="endConference">
结束会议
</el-button>
<!-- 退出会议 -->
<!-- <el-button
v-else
type="danger"
shape="round"
@click="hangupCall"
>退出会议</el-button
> -->
</template>
</el-row>
<!-- 关闭按钮 --> <!-- 关闭按钮 -->
<el-button class="close" type="primary" icon="Close" circle @click="close"></el-button> <el-button class="close-card-btn" type="text" circle @click="close">
<el-icon size="20"><Close /></el-icon>
</el-button>
</div> </div>
<!-- 成员管理面板 暂时未改--> <!-- 成员管理面板 暂时未改-->
@ -189,9 +209,9 @@ const store = useStore();
const element = ref({ const element = ref({
x: 500, x: 500,
y: -600, y: -600,
width: 500, width: 960,
height: 500, height: 500,
isActive: false, isActive: true,
}); });
const globalStore = store.state.useGlobalStore; const globalStore = store.state.useGlobalStore;
// 音视频会议-会控管理模块 // 音视频会议-会控管理模块
@ -241,9 +261,10 @@ const speakers = ref([]);
const selfGranted = ref(false); const selfGranted = ref(false);
const displaySubject = computed(() => { const displaySubject = computed(() => {
const text = globalStore.activeMeetingConfig?.subject || ''; const text = globalStore.activeMeetingConfig?.subject;
subject.value = text; const defaultText = text && String(text).trim() ? text : '会议的标题';
return text; subject.value = defaultText;
return defaultText;
}); });
// 0=关闭1=打开2=无扬声器 // 0=关闭1=打开2=无扬声器
@ -712,6 +733,22 @@ const setAudio = (stream) => {
}; };
}); });
}; };
const isFullscreen = ref(false);
const onFullscreenChange = () => {
isFullscreen.value = !!document.fullscreenElement;
};
const toggleFullscreen = () => {
const el = mainContentRef.value;
if (!document.fullscreenElement) {
if (el && el.requestFullscreen) {
el.requestFullscreen();
}
} else {
if (document.exitFullscreen) {
document.exitFullscreen();
}
}
};
// 设备列表变化时 // 设备列表变化时
const onDeviceListChange = (mediaDeviceInfo) => { const onDeviceListChange = (mediaDeviceInfo) => {
@ -725,6 +762,17 @@ const setAudio = (stream) => {
} }
}; };
const copyMeetingNumber = () => {
const number = activeMeetingConfig.value?.meeting?.number;
if (number) {
navigator.clipboard.writeText(number).then(() => {
ElMessage.success('会议号已复制');
}).catch(() => {
ElMessage.error('复制失败');
});
}
};
onMounted(()=>{ onMounted(()=>{
console.log(globalStore,'=====0000000000000'); console.log(globalStore,'=====0000000000000');
@ -743,6 +791,7 @@ onMounted(()=>{
// 初始化录屏媒体对象 // 初始化录屏媒体对象
addVideoOnLoadedMetadataEvnt(); addVideoOnLoadedMetadataEvnt();
document.addEventListener('fullscreenchange', onFullscreenChange);
}); });
@ -750,6 +799,7 @@ onUnmounted(() => {
emitter.off('onMediaStream'); emitter.off('onMediaStream');
emitter.off('onHangup'); emitter.off('onHangup');
removeBroadcastVideoListener(); removeBroadcastVideoListener();
document.removeEventListener('fullscreenchange', onFullscreenChange);
}); });
</script> </script>
@ -759,85 +809,223 @@ onUnmounted(() => {
position: absolute; position: absolute;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center;
margin: 2px; margin: 2px;
background: rgb(28,32,41); background: #fff;
border: 2px dashed #e8e8e8; border: none;
border-radius: 16px; border-radius: 12px;
box-shadow: 0 4px 16px rgba(0,0,0,0.15);
cursor: default;
overflow: visible;
}
.conference-box {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
position: relative;
}
/* Header Styles */
.conference-header {
padding: 16px 20px 10px;
background: #fff;
border-bottom: 1px solid #f0f0f0;
flex-shrink: 0;
}
.header-top {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
padding-bottom: 8px;
border-bottom: 2px solid #c0c4cc;
}
.title-section {
display: flex;
align-items: center;
gap: 12px;
}
.conference-title {
margin: 0;
font-size: 18px;
font-weight: 600;
color: #333;
cursor: pointer; cursor: pointer;
} }
.title-input {
width: 200px;
}
.meeting-id-tag {
display: flex;
align-items: center;
background: #e6f7ff;
color: #1890ff;
padding: 2px 8px;
border-radius: 4px;
font-size: 12px;
cursor: pointer;
transition: all 0.2s;
}
.meeting-id-tag:hover {
background: #bae7ff;
}
.id-label {
margin-right: 4px;
}
.copy-icon {
margin-left: 4px;
}
.participants-info {
display: flex;
align-items: center;
color: #666;
font-size: 13px;
gap: 6px;
}
/* Video Area Styles */
.video-content-area {
flex: 1;
position: relative;
background: #000;
margin: 10px;
border-radius: 12px;
overflow: hidden;
}
.video { .video {
width: 100%;
height: 100%;
object-fit: contain;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; pointer-events: none;
height: 100%;
object-fit: scale-down;
}
.buttonContainer {
position: absolute;
bottom: 0;
width: 96%;
margin: 8px;
padding: 5px 3px;
background: #fff;
border-radius: 3px;
}
.speaks {
align-items: center;
}
.wave {
top: 0;
width: 100%;
height: 100px;
}
.close {
position: absolute;
top: 0;
right: 0;
margin: 5px;
}
.subject {
position: absolute;
top: -53px;
padding: 0 5px;
color: #ffff;
background: #1c2029;
border-radius: 5px;
}
.subject .arco-input-wrapper {
margin: 8px 0;
}
.icon_broadcast {
fill: #fff;
}
.img_broadcast {
position: absolute;
right: 20px;
bottom: 60px;
} }
/* Top Box (Tags) */
.top-box { .top-box {
position: absolute; position: absolute;
top: 10px; top: 10px;
left: 0;
right: 0;
z-index: 10;
display: flex;
flex-direction: column;
align-items: center;
pointer-events: none;
} }
.top-box .arco-tag { .top-box .el-tag {
margin: 5px; margin: 4px;
pointer-events: auto;
} }
::v-deep .el-button.is-circle{ /* Control Bar Styles */
width: 32px; .control-bar {
height: 32px; position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
background: rgba(0, 0, 0, 0.65);
backdrop-filter: blur(10px);
border-radius: 40px;
padding: 8px 24px;
display: flex;
align-items: center;
gap: 16px;
z-index: 20;
white-space: nowrap;
}
.control-btn {
background: transparent !important;
border: none !important;
color: #fff !important;
width: 40px !important;
height: 40px !important;
padding: 0 !important;
display: flex;
justify-content: center;
align-items: center;
transition: background 0.3s;
}
.control-btn:hover {
background: rgba(255, 255, 255, 0.15) !important;
border-radius: 50%;
}
.control-btn img {
width: 24px;
height: 24px;
filter: brightness(0) invert(1); /* Make black icons white */
}
.control-arrow {
margin-left: -12px;
margin-top: 10px;
cursor: pointer;
}
.hangup-btn {
background-color: #f56c6c !important;
border-color: #f56c6c !important;
color: #fff !important;
height: 36px;
padding: 0 20px;
}
.hangup-btn:hover {
background-color: #f78989 !important;
border-color: #f78989 !important;
}
/* Close Card Button */
.close-card-btn {
position: absolute;
top: 10px;
right: 10px;
color: #999;
z-index: 100;
}
.close-card-btn:hover {
color: #666;
background: transparent;
}
/* Misc */
.img_broadcast {
position: absolute;
right: 20px;
bottom: 80px; /* Adjusted to be above control bar */
width: 40px;
height: 40px;
}
::v-deep .el-button.is-circle {
/* Reset element plus styles if needed */
}
::v-deep .drs-handle {
width: 10px;
height: 10px;
background: #1890ff;
border: 2px solid #fff;
border-radius: 2px;
box-shadow: 0 0 0 1px rgba(0,0,0,0.2);
z-index: 1000;
pointer-events: auto;
} }
</style> </style>

View File

@ -216,7 +216,7 @@ const getLoginAccountInfo =() =>{
const openInit = (it,type) =>{ const openInit = (it,type) =>{
modleType.value = type; modleType.value = type;
if(type == '会议'){ if(type == '会议'){
// 判断是否有会议号 //判断是否有会议号
let into = it.number ? '确定开始会议?' : '没有找到会议,是否创建会议?' let into = it.number ? '确定开始会议?' : '没有找到会议,是否创建会议?'
ElMessageBox.confirm(into,'提示',{ ElMessageBox.confirm(into,'提示',{
confirmButtonText:'确定', confirmButtonText:'确定',
@ -226,6 +226,7 @@ const openInit = (it,type) =>{
// 会议号存在 ? 获取会议列表里面是否包含该条会议 : 创建会议 ; // 会议号存在 ? 获取会议列表里面是否包含该条会议 : 创建会议 ;
it.number ? fetchConferences(it) : conferenceActionSDK(it); it.number ? fetchConferences(it) : conferenceActionSDK(it);
}).catch(()=>{ }) }).catch(()=>{ })
} }
if(['对讲机','无人机'].includes(type)){ if(['对讲机','无人机'].includes(type)){

View File

@ -154,6 +154,10 @@ onMounted(() => {
emitter.on("showSquire", (obj) => { emitter.on("showSquire", (obj) => {
mapUtil.value.zdySquire(obj); mapUtil.value.zdySquire(obj);
}); });
// 展示气泡框
emitter.on("makerPopup", (obj) => {
mapUtil.value.makerPopup(obj);
});
// 绘制图形 - 回显区域 // 绘制图形 - 回显区域
emitter.on("drawShape", (res) => { emitter.on("drawShape", (res) => {
@ -288,6 +292,7 @@ onUnmounted(() => {
emitter.off("showPoint"); emitter.off("showPoint");
emitter.off("deletePointArea"); emitter.off("deletePointArea");
emitter.off("deletePointAreaOne"); emitter.off("deletePointAreaOne");
emitter.off("makerPopup");
emitter.off("drawShape"); emitter.off("drawShape");
emitter.off("echoPlane"); emitter.off("echoPlane");
emitter.off("removeEara"); emitter.off("removeEara");

View File

@ -167,6 +167,11 @@ onMounted(() => {
mapUtil.value.showPoint(obj); mapUtil.value.showPoint(obj);
}); });
// 展示气泡框
emitter.on("makerPopup", (obj) => {
mapUtil.value.makerPopup(obj);
});
// 清除覆盖物 // 清除覆盖物
emitter.on("deletePointArea", (res) => { emitter.on("deletePointArea", (res) => {
// 只清除与当前地图相关的覆盖物 // 只清除与当前地图相关的覆盖物
@ -325,6 +330,7 @@ onUnmounted(() => {
emitter.off("setMapCenter"); emitter.off("setMapCenter");
emitter.off("addPointArea"); emitter.off("addPointArea");
emitter.off("showPoint"); emitter.off("showPoint");
emitter.off("makerPopup");
emitter.off("deletePointArea"); emitter.off("deletePointArea");
emitter.off("deletePointAreaOne"); emitter.off("deletePointAreaOne");
emitter.off("drawShape"); emitter.off("drawShape");

View File

@ -85,7 +85,7 @@ export function MapUtil(map) {
el.style.width = size ? size : "25px"; el.style.width = size ? size : "25px";
if (flag.includes('jczMap_')) el.style.width = '45px'; if (flag.includes('jczMap_')) el.style.width = '45px';
if (showTitle) _that.makerShowTitle(item, [item.jd, item.wd], flag, '', offset) //展示标题 if (showTitle) _that.makerShowTitle(item, [item.jd, item.wd], flag, '', offset) //展示标题
if (flag == 'hm') _that.makerPopup(item, flag, 'Custom') //展示气泡框 // if (flag == 'hm') _that.makerPopup({data:item,flag:'hm_pop',type:'Custom'}) //展示气泡框
// 确保坐标格式正确,使用对象格式传递坐标 // 确保坐标格式正确,使用对象格式传递坐标
const marker = map.Marker(el, { lng: item.jd, lat: item.wd }, { anchor: 'bottom', offset: [0, 0] }) const marker = map.Marker(el, { lng: item.jd, lat: item.wd }, { anchor: 'bottom', offset: [0, 0] })
el.addEventListener("click", () => { el.addEventListener("click", () => {
@ -144,37 +144,42 @@ export function MapUtil(map) {
} }
// 展示气泡框 // 展示气泡框
MapUtil.prototype.makerPopup = (item,flag,style = 'Dark')=>{ MapUtil.prototype.makerPopup = (val)=>{
let { data,flag,type = 'Dark'} = val
// Dark Light Custom // Dark Light Custom
if(style == 'Dark' || style == 'Light') { let marker;
let list = zdyContent(flag,item);// 默认的样式 if(!_that._self[flag]) _that._self[flag] = [];
map.createPopup([item.jd,item.wd],{ if(type == 'Dark' || type == 'Light') {
let list = zdyContent(flag,data);// 默认的样式
marker = map.createPopup([data.jd,data.wd],{
style:style, // 气泡框样式: style:style, // 气泡框样式:
data:list, data:list,
title:item.ssbm, title:data.ssbm,
closeButton:false, closeButton:false,
anchor:'bottom', anchor:'bottom',
pixelOffset:[0,-50] pixelOffset:[0,-50]
}) })
}else { }else {
map.createPopup([item.jd,item.wd],{ marker = map.createPopup([data.jd,data.wd],{
style:'Custom', // // 自定义样式 style:'Custom', // // 自定义样式
attrs:{ attrs:{
class:'popupCustom' class:'popupCustom'
}, },
container: zdyContentHtml(flag,item), container: zdyContentHtml(flag,data),
closeButton:false, closeButton:false,
anchor:'bottom', anchor:'bottom',
pixelOffset:[0,-30] pixelOffset:[0,-30]
}) })
} }
_that._self[flag].push(marker)
} }
// 弹窗自定义默认内容 // 弹窗自定义默认内容
function zdyContent(flag,item){ function zdyContent(flag,item){
switch (flag) { switch (flag) {
case 'hm': case 'hm':
return [ return [
{ label:'安码线索数量',value:item.lamsx }, { label:'安码线索数量',value:item.lamsx },
{ label:'布控预警数量',value:item.bkyj }, { label:'布控预警数量',value:item.bkyj },
{ label:'红色预警数量',value:item.hsyj }, { label:'红色预警数量',value:item.hsyj },
{ label:'信息采集数量',value:item.xxcjsl }, { label:'信息采集数量',value:item.xxcjsl },
@ -185,14 +190,23 @@ export function MapUtil(map) {
function zdyContentHtml(flag,item){ function zdyContentHtml(flag,item){
let html = '' let html = ''
switch (flag) { switch (flag) {
case 'hm': case 'hm_pop':
const list = [
{ jb: "一级",sl:'5',ypl:'100%' },
{ jb: "二级",sl:'5',ypl:'100%' },
{ jb: "三级",sl:'3',ypl:'60%' },
{ jb: "四级",sl:'0',ypl:'20%' }
];
html = ` html = `
<div class="popupCustomBox"> <div class="popupCustomBox">
<div class="popupCustomTitle_title">${item.ssbm}</div> <div class="popupCustomTitle_title">
<div>临安码线索数量:${item.lamsx}</div> <span>${item.ssbm}</span>
<div>布控预警数量:${item.bkyj}</div> <span>今日警情${item.jrzs || 0}</span>
<div>红色预警数量:${item.hsyj}</div> </div>
<div>信息采集数量:${item.xxcjsl}</div> <ul>
<li class="popupCustomTitle_li"><span>级别</span> <span>数量</span> <span>研判率</span> </li>
${item.jqjb.map(it => `<li class="popupCustomTitle_li"><span>${it.jbmc}</span> <span>${it.jrsl}</span> <span>${it.ypbl}</span></li>`).join('')}
</ul>
</div> </div>
` `
break; break;
@ -793,7 +807,7 @@ export function MapUtil(map) {
// 移除边界 // 移除边界
MapUtil.prototype.createBoundarys = (res) => { MapUtil.prototype.createBoundarys = (res) => {
let { data, color, fillColor, borderColor, label, text, labelPosition } = res let { data, color, fillColor, borderColor, label, text, labelPosition, outLineWidth } = res
if (!data) return false; if (!data) return false;
// 使用传入的颜色参数,如果没有则使用默认值 // 使用传入的颜色参数,如果没有则使用默认值
const fillColorValue = fillColor || 'rgba(27, 205, 211, 0.3)'; const fillColorValue = fillColor || 'rgba(27, 205, 211, 0.3)';
@ -803,7 +817,7 @@ export function MapUtil(map) {
const polygon = map.createPolygon(data, { const polygon = map.createPolygon(data, {
color: fillColorValue, color: fillColorValue,
outLineColor: borderColorValue, outLineColor: borderColorValue,
outLineWidth: 1, outLineWidth: outLineWidth || 1,
highlightColor: highlightColorValue, highlightColor: highlightColorValue,
type: 'solid', type: 'solid',
labelOption: { labelOption: {

View File

@ -287,27 +287,56 @@ const rowcontextmenuHland = (row, column, e) => {
}; };
const timer = ref(null); const timer = ref(null);
const isCloned = ref(false);
const originalBodyHeight = ref(0);
// 鼠标进入 // 鼠标进入
const clearnScroll = () => { const clearnScroll = () => {
clearInterval(timer.value); clearInterval(timer.value);
timer.value = null; timer.value = null;
}; };
watch(() => props.tableData, () => {
nextTick(() => {
if (props.isScroll) createScroll();
})
},{deep:true});
// 鼠标离开 // 鼠标离开
const createScroll = () => { const createScroll = () => {
clearnScroll(); clearnScroll();
// 拿到table nextTick(() => {
const tabel = multipleTableRef.value.layout.table.refs; const refsPath = multipleTableRef.value?.$refs || multipleTableRef.value?.layout?.table?.refs;
// 拿到可以滚动的元素 const scrollEl = refsPath?.bodyWrapper || multipleTableRef.value?.$el?.querySelector('.el-table__body-wrapper');
const tableWrapper = tabel.bodyWrapper.firstElementChild.firstElementChild; const tableEl = scrollEl?.querySelector('table') || multipleTableRef.value?.$el?.querySelector('.el-table__body-wrapper table');
if (props.isScroll) { const bodyEl = tableEl?.tBodies?.[0];
timer.value = setInterval(() => { if (!props.isScroll || !scrollEl || !tableEl || !bodyEl) return;
tableWrapper.scrollTop += 1; if (!props.tableHeight) {
//判断滚动到底部,设置为0(可视高度+距离顶部 = 整个高度) const fixedH = scrollEl.clientHeight || multipleTableRef.value?.$el?.clientHeight || 0;
if ( tableWrapper.clientHeight + tableWrapper.scrollTop == tableWrapper.scrollHeight) { if (fixedH > 0) {
tableWrapper.scrollTop = 0; scrollEl.style.height = fixedH + 'px';
scrollEl.style.overflowY = 'auto';
} }
}, 100); }
} originalBodyHeight.value = bodyEl.offsetHeight;
const oldClone = tableEl.querySelector('tbody[data-clone="true"]');
if (oldClone) {
tableEl.removeChild(oldClone);
isCloned.value = false;
}
if (!isCloned.value) {
const clone = bodyEl.cloneNode(true);
clone.setAttribute('data-clone', 'true');
tableEl.appendChild(clone);
isCloned.value = true;
}
const target = scrollEl.firstElementChild?.firstElementChild || scrollEl;
timer.value = setInterval(() => {
target.scrollTop += 1;
if (target.scrollTop >= originalBodyHeight.value) {
target.scrollTop -= originalBodyHeight.value;
}
}, 20);
});
}; };
// 滚动-触底加载 // 滚动-触底加载
@ -370,4 +399,10 @@ onUnmounted(() => {
.header-icon { .header-icon {
white-space: nowrap; white-space: nowrap;
} }
</style> </style>
watch(() => props.isScroll, (val) => {
nextTick(() => {
if (val) createScroll();
else clearnScroll();
});
},{immediate:true});

View File

@ -3,13 +3,13 @@
<el-form-item v-for="(item, idx) in props.formList" :style="item.width && { width: item.width }" :prop="item.prop" :label="item.label" :label-width="item.labelWidth" :key="idx"> <el-form-item v-for="(item, idx) in props.formList" :style="item.width && { width: item.width }" :prop="item.prop" :label="item.label" :label-width="item.labelWidth" :key="idx">
<!-- input表单 input--> <!-- input表单 input-->
<MOSTY.Other v-if="item.type == 'input'" width="100%" clearable v-model="listQuery[item.prop]" :placeholder="`请输入${item.label}`" :disabled="item.disabled" :readonly="item.readonly" /> <MOSTY.Other v-if="item.type == 'input'" width="100%" clearable v-model="listQuery[item.prop]" :placeholder="`请输入${item.label}`" :disabled="item.disabled" :readonly="item.readonly" @blur="inputBlur($event,item)" />
<el-input v-model="listQuery[item.prop]" v-else-if="item.type == 'textarea'" type="textarea" :rows="item.rows || 3" :placeholder="`请输入${item.label}`" :disabled="item.disabled" /> <el-input v-model="listQuery[item.prop]" v-else-if="item.type == 'textarea'" type="textarea" :rows="item.rows || 3" :placeholder="`请输入${item.label}`" :disabled="item.disabled" @blur="inputBlur($event,item)"/>
<!-- 数值 inputNumber--> <!-- 数值 inputNumber-->
<el-input type="number" v-model="listQuery[item.prop]" v-else-if="item.type == 'inputNumber'" :placeholder="`请输入${item.label}`" :disabled="item.disabled" /> <el-input type="number" v-model="listQuery[item.prop]" v-else-if="item.type == 'inputNumber'" :placeholder="`请输入${item.label}`" :disabled="item.disabled" @blur="inputBlur($event,item)"/>
<!-- 数值 number--> <!-- 数值 number-->
<el-input-number v-model="listQuery[item.prop]" v-else-if="item.type == 'number'" style="width: 100%" :min="item.min || 0" :max="item.max || 1000" :disabled="item.disabled" /> <el-input-number v-model="listQuery[item.prop]" v-else-if="item.type == 'number'" :step="item.step || 1" style="width: 100%" :min="item.min || 0" :max="item.max || 1000" :disabled="item.disabled" />
<!--选择 select--> <!--选择 select-->
<MOSTY.Select v-else-if="item.type == 'select'" filterable :multiple="item.multiple" v-model="listQuery[item.prop]" :dictEnum="item.options" width="100%" clearable :placeholder="`请选择${item.label}`" :disabled="item.disabled" /> <MOSTY.Select v-else-if="item.type == 'select'" filterable :multiple="item.multiple" v-model="listQuery[item.prop]" :dictEnum="item.options" width="100%" clearable :placeholder="`请选择${item.label}`" :disabled="item.disabled" />
@ -77,7 +77,7 @@ const props = defineProps({
}); });
const elform = ref(); const elform = ref();
const listQuery = ref({}); const listQuery = ref({});
const emits = defineEmits(["update:modelValue"]); const emits = defineEmits(["update:modelValue", "blur"]);
// 提交 // 提交
const submit = (resfun) => { const submit = (resfun) => {
elform.value.validate((valid) => { elform.value.validate((valid) => {
@ -101,7 +101,12 @@ const reset = () => {
// 修改这里的watch逻辑避免无限循环 // 修改这里的watch逻辑避免无限循环
let isUpdatingFromProps = false; let isUpdatingFromProps = false;
const inputBlur = (e,item) => {
if(typeof item?.blur == 'function') {
item.blur();
}
// emits('blur', e, item);
}
watch(() => listQuery.value, (newVal) => { watch(() => listQuery.value, (newVal) => {
if (newVal && !isUpdatingFromProps) { if (newVal && !isUpdatingFromProps) {
emits("update:modelValue", newVal); emits("update:modelValue", newVal);

View File

@ -8,22 +8,22 @@
:key="index">{{ item.nodeName }}</el-checkbox> :key="index">{{ item.nodeName }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</div> </div>
<div> <el-button type="success" :icon="Plus" @click="newAdditions" v-if="optional"/></div> <div> <el-button type="success" :icon="Plus" @click="newAdditions" v-if="optional" /></div>
</div> </div>
<div v-if="optional" class="container-box"> <div v-if="optional" class="container-box">
<!-- <div v-if="flwsNode.flwsUserNode?.role.length == 0"> --> <!-- <div v-if="flwsNode.flwsUserNode?.role.length == 0"> -->
<div class="row" v-for="(item, index) in nodeData" :key="index"> <div class="row" v-for="(item, index) in nodeData" :key="index">
<MOSTY.Department filterable v-model="item.deptId" width="100%" <MOSTY.Department filterable v-model="item.deptId" width="100%"
@getDepValue="(obj) => changePostList(index, obj)" clearable placeholder="请选择所属部门" /> @getDepValue="(obj) => changePostList(index, obj)" clearable placeholder="请选择所属部门" />
<el-select class="select-user" v-model="item.userId" filterable placeholder="选择审批人" <el-select class="select-user" v-model="item.userId" filterable placeholder="选择审批人"
@change="changeUser(index)"> @change="changeUser(index)">
<el-option v-for="item in item.listData" :key="item.id" :label="item.userName" :value="item.id" /> <el-option v-for="item in item.listData" :key="item.id" :label="item.userName" :value="item.id" />
</el-select> </el-select>
<div> <div>
<el-button type="danger" @click="newDelitions(index)">删除</el-button> <el-button type="danger" @click="newDelitions(index)">删除</el-button>
</div> </div>
</div> </div>
<!-- </div> --> <!-- </div> -->
</div> </div>
<div class="container-box" v-else> <div class="container-box" v-else>
<div v-for="(item, index) in userList" :key="item.id"> <div v-for="(item, index) in userList" :key="item.id">
@ -59,7 +59,7 @@
<div v-if="showNode && showModel"> <div v-if="showNode && showModel">
</div> </div>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="close">取消</el-button> <el-button @click="close">取消</el-button>
@ -246,7 +246,7 @@ const qcckPostList = async () => {
const item = checkListData.value[i].userList[j] const item = checkListData.value[i].userList[j]
if (item.checkList && item.checkList.length > 0) { if (item.checkList && item.checkList.length > 0) {
data[checkListData.value[i].nodeId] = { data[checkListData.value[i].nodeId] = {
users: transformData(checkListData.value[i]) users: transformData(checkListData.value[i])
} }
} else { } else {
listError.push(checkListData.value[i].nodeName) listError.push(checkListData.value[i].nodeName)
@ -341,7 +341,7 @@ const queryModel = async () => {
) )
const orgId = getItem('deptId')[0].fzOrgId const orgId = getItem('deptId')[0].fzOrgId
if (!orgId) { if (!orgId) {
proxy.$message({ type: "error", message: "查询模型失败,请重试" }) proxy.$message({ type: "error", message: "查询模型失败,请重试" })
return return
} }
if (eventNode) { if (eventNode) {
@ -358,7 +358,7 @@ const queryModel = async () => {
loading.value = false loading.value = false
} }
} }
const optional=ref(false) const optional = ref(false)
// 处理事件节点 // 处理事件节点
const handleEventNode = async (eventNode, orgId) => { const handleEventNode = async (eventNode, orgId) => {
const nodeExtension = JSON.parse(eventNode.nodeExtension) const nodeExtension = JSON.parse(eventNode.nodeExtension)
@ -376,13 +376,13 @@ const handleEventNode = async (eventNode, orgId) => {
orgData = await queryListByEntity({ id: orgId }) orgData = await queryListByEntity({ id: orgId })
} else if (nodeExtension.flwsUserNode.orgType == 'parent') { } else if (nodeExtension.flwsUserNode.orgType == 'parent') {
console.log(2); console.log(2);
orgData = await querysingleByEntity({ id: orgId }) orgData = await querysingleByEntity({ id: orgId })
} else if (nodeExtension.flwsUserNode.orgType == 'parents') { } else if (nodeExtension.flwsUserNode.orgType == 'parents') {
console.log(3); console.log(3);
orgData = await queryUporgsByEntity({ id: orgId }) orgData = await queryUporgsByEntity({ id: orgId })
} else if (nodeExtension.flwsUserNode.orgType == 'appoint') { } else if (nodeExtension.flwsUserNode.orgType == 'appoint') {
console.log(4); console.log(4);
// orgData = await queryUporgsByEntity({ orgcode: orgId }) // orgData = await queryUporgsByEntity({ orgcode: orgId })
console.log(orgData); console.log(orgData);
@ -405,7 +405,7 @@ const handleEventNode = async (eventNode, orgId) => {
userList: userRes.rows[0] userList: userRes.rows[0]
}] }]
} else if (nodeExtension.flwsUserNode.orgType == 'optional') { } else if (nodeExtension.flwsUserNode.orgType == 'optional') {
optional.value=true optional.value = true
} else { } else {
const parentids = orgData.rows.map(item => item.parentid) const parentids = orgData.rows.map(item => item.parentid)
@ -514,37 +514,37 @@ const handleNormalNodes = async (resData, sequenceNode, orgId) => {
}) })
} }
function filterUsersWithOrgInfo(orgsData, checkList) { function filterUsersWithOrgInfo(orgsData, checkList) {
const result = []; const result = [];
// 如果没有数据或检查列表为空,返回空数组
if (!orgsData || !Array.isArray(orgsData) || !checkList || checkList.length === 0) {
return result;
}
// 将checkList转换为Set以提高查找效率
const checkSet = new Set(checkList);
// 遍历所有组织
for (const org of orgsData) {
// 检查组织是否有用户数据
if (org.users && Array.isArray(org.users)) {
// 筛选匹配的用户
for (const user of org.users) {
if (checkSet.has(user.userid)) {
// 创建带组织信息的用户对象
const userWithOrgInfo = {
...user, // 保留所有原始用户属性
orgCode: org.code, // 添加组织code
orgName: org.name, // 添加组织name
orgId: org.id // 添加组织id
};
result.push(userWithOrgInfo);
}
}
}
}
// 如果没有数据或检查列表为空,返回空数组
if (!orgsData || !Array.isArray(orgsData) || !checkList || checkList.length === 0) {
return result; return result;
}
// 将checkList转换为Set以提高查找效率
const checkSet = new Set(checkList);
// 遍历所有组织
for (const org of orgsData) {
// 检查组织是否有用户数据
if (org.users && Array.isArray(org.users)) {
// 筛选匹配的用户
for (const user of org.users) {
if (checkSet.has(user.userid)) {
// 创建带组织信息的用户对象
const userWithOrgInfo = {
...user, // 保留所有原始用户属性
orgCode: org.code, // 添加组织code
orgName: org.name, // 添加组织name
orgId: org.id // 添加组织id
};
result.push(userWithOrgInfo);
}
}
}
}
return result;
} }
//发消息 //发消息
const sendMessage = (gzlid) => { const sendMessage = (gzlid) => {
@ -552,11 +552,11 @@ const sendMessage = (gzlid) => {
let userList = [] let userList = []
for (let i = 0; i < checkListData.value.length; i++) { for (let i = 0; i < checkListData.value.length; i++) {
letDataCheck = [...letDataCheck, ...checkListData.value[i].checkList] letDataCheck = [...letDataCheck, ...checkListData.value[i].checkList]
userList.push(checkListData.value[i].userList) userList.push(checkListData.value[i].userList)
} }
const bkshrSfzh = filterUsersWithOrgInfo(userList, letDataCheck).map(item => { const bkshrSfzh = filterUsersWithOrgInfo(userList, letDataCheck).map(item => {
return { return {
bkshrXm: item.username, bkshrXm: item.username,
bkshrSfzh: item.userid, bkshrSfzh: item.userid,
bkshrSsbmmc: item.orgName, bkshrSsbmmc: item.orgName,
@ -586,6 +586,11 @@ const sendMessage = (gzlid) => {
console.log(res); console.log(res);
}) })
break; break;
case 'YPSH':
qcckPost(promes, '/mosty-gsxt/ypbg/sjzl/updateBkgzl').then(res => {
console.log(res);
})
break;
} }
} }
@ -603,7 +608,7 @@ const close = () => {
orgData: {}, orgData: {},
} }
] ]
optional.value=false optional.value = false
emit('update:modelValue', false) emit('update:modelValue', false)
} }
</script> </script>

View File

@ -91,7 +91,6 @@ const qcckGetCount = () => {
} else { } else {
setCookie('JSRSSIONID', res.substring(10, res.length)) setCookie('JSRSSIONID', res.substring(10, res.length))
} }
qcckGetList() qcckGetList()
}) })
} else { qcckGetList() } } else { qcckGetList() }

View File

@ -52,13 +52,14 @@ import installFilter from "@/filters";
import mitt from "mitt"; import mitt from "mitt";
import { resetForm } from "@/utils/validate"; import { resetForm } from "@/utils/validate";
import { getDict, setCascader } from '@/utils/dict'; import { getDict, setCascader, getFzDict } from '@/utils/dict';
import axios from "axios"; import axios from "axios";
// import fzui from 'fzui-fengqun-vue' // import fzui from 'fzui-fengqun-vue'
//挂载全局方法 //挂载全局方法
app.config.globalProperties.resetForm = resetForm; app.config.globalProperties.resetForm = resetForm;
app.config.globalProperties.$dict = getDict; //字典公共函数 app.config.globalProperties.$dict = getDict; //字典公共函数
app.config.globalProperties.$fzdict = getFzDict; //字典公共函数
app.config.globalProperties.$message = ELMessage; //element提示组件 app.config.globalProperties.$message = ELMessage; //element提示组件
app.config.globalProperties.$set = setCascader; //设置级联选择器回显 app.config.globalProperties.$set = setCascader; //设置级联选择器回显
app.config.globalProperties.mittBus = new mitt(); //配置事件总线 app.config.globalProperties.mittBus = new mitt(); //配置事件总线

View File

@ -117,3 +117,4 @@ export function IdCard(IdCard, type) {
} }
return user return user
} }

View File

@ -54,6 +54,12 @@ export const publicRoutes = [
name: "deploymentApproval", name: "deploymentApproval",
component: () => import("@/views/backOfficeSystem/ApprovalInformation/deploycontrol/deploymentApproval.vue"), component: () => import("@/views/backOfficeSystem/ApprovalInformation/deploycontrol/deploymentApproval.vue"),
}, },
// 布控审核信息
{
path: "/information",
name: "information",
component: () => import("@/views/backOfficeSystem/JudgmentHome/internalAuditor/information.vue"),
},
// 线索 // 线索
{ {
path: "/clueVerification", path: "/clueVerification",
@ -136,12 +142,12 @@ export const publicRoutes = [
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/index"), // component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/index"),
// meta: { title: "预警中心大屏", icon: "article" }, // meta: { title: "预警中心大屏", icon: "article" },
// }, // },
// { // {
// path: "/warningBk", // path: "/warningBk",
// name: "warningBk", // name: "warningBk",
// meta: { title: "布控预警", icon: "article" }, // meta: { title: "布控预警", icon: "article" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/warningBk/index"), // component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/warningBk/index"),
// }, // },
{ {
path: "/fouColorWarning", path: "/fouColorWarning",
name: "fouColorWarning", name: "fouColorWarning",
@ -202,12 +208,12 @@ export const publicRoutes = [
meta: { title: "布控预警", icon: "article" }, meta: { title: "布控预警", icon: "article" },
component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index"), component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/controlWarning/index"),
}, },
// { // {
// path: "/fouColorWarning", // path: "/fouColorWarning",
// name: "fouColorWarning", // name: "fouColorWarning",
// meta: { title: "四色预警", icon: "article" }, // meta: { title: "四色预警", icon: "article" },
// component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"), // component: () => import("@/views/backOfficeSystem/fourColorManage/warningControl/fouColorWarning/index"),
// }, // },
{ {
path: "/scoreRanking", path: "/scoreRanking",
name: "scoreRanking", name: "scoreRanking",
@ -224,155 +230,7 @@ export const publicRoutes = [
] ]
}, },
{
path: "/dataApplication",
name: "dataApplication",
meta: { title: "数据应用", icon: "article" },
children: [
{
path: "/IdentityManage",
name: "IdentityManage",
component: () =>
import(
"@/views/backOfficeSystem/fourColorManage/IdentityManage/index"
),
meta: {
title: "身份标签管理",
icon: "article"
}
},
{
path: "/BehaviorLabels",
name: "BehaviorLabels",
component: () =>
import(
"@/views/backOfficeSystem/fourColorManage/BehaviorLabels/index"
),
meta: {
title: "行为标签管理",
icon: "article"
}
},
{
path: "/tagManage",
name: "tagManage",
component: () =>
import(
"@/views/backOfficeSystem/fourColorManage/tagManage/index"
),
meta: {
title: "标签组合管理",
icon: "article"
}
}, {
path: "/tsypHome",
name: "tsypHome",
component: () => import("@/views/backOfficeSystem/JudgmentHome/tsypHome/index"),
meta: {
title: "模型管理",
icon: "article"
}
},
{
path: "/RlStatisticalAnalysis",
name: "RlStatisticalAnalysis",
component: () =>
import(
"@/views/backOfficeSystem/HumanIntelligence/RlStatisticalAnalysis/index"
),
meta: {
title: "上报统计分析",
icon: "article"
}
},
{
path: "/TaskScheduling",
name: "TaskScheduling",
component: () =>
import(
"@/views/backOfficeSystem/HumanIntelligence/TaskScheduling/index"
),
meta: {
title: "上报任务调度",
icon: "article"
}
},
{
path: "/ConstructionManagement",
name: "ConstructionManagement",
component: () =>
import(
"@/views/backOfficeSystem/HumanIntelligence/ConstructionManagement/index"
),
meta: {
title: "力量建设管理",
icon: "article"
}
},
{
path: "/JobAppraisal",
name: "JobAppraisal",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
meta: {
title: "工作考核",
icon: "article"
}
},
{
path: "/fileTransfer",
name: "fileTransfer",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileTransfer/index"),
meta: {
title: "文件中转",
icon: "article"
}
},
{
path: "/fileOrientation",
name: "fileOrientation",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileOrientation/index"),
meta: {
title: "文件定向传输",
icon: "article"
}
},
{
path: "/ssemanticAnalysis",
name: "semanticAnalysis",
component: () => import("@/views/backOfficeSystem/SemanticAnalysis/index.vue"),
meta: {
title: "语义分析",
icon: "article"
}
},
{
path: "/StatisticalAnalysis",
name: "StatisticalAnalysis",
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/StatisticalAnalysis/index"),
meta: {
title: "情报统计分析",
icon: "article"
}
}, {
path: "/InstructionInformation",
name: "InstructionInformation",
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/InstructionInformation/index"),
meta: {
title: "情报指令",
icon: "article"
}
}, {
path: "/RecordsOperations",
name: "RecordsOperations",
component: () => import("@/views/backOfficeSystem/ResearchJudgment/RecordsOperations/index"),
meta: {
title: "操作记录",
icon: "article"
}
}
]
},
{ {
path: "/IntelligentControl", path: "/IntelligentControl",
name: "IntelligentControl", name: "IntelligentControl",
@ -468,24 +326,15 @@ export const publicRoutes = [
component: () => import("@/views/backOfficeSystem/HumanIntelligence/ConversionSynthesis/index"), component: () => import("@/views/backOfficeSystem/HumanIntelligence/ConversionSynthesis/index"),
meta: { title: "转合成列表", icon: "article" }, meta: { title: "转合成列表", icon: "article" },
}, },
{ // {
path: "/CollectPoints", // path: "/CollectPoints",
name: "CollectPoints", // name: "CollectPoints",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectPoints/index"), // component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectPoints/index"),
meta: { // meta: {
title: "采集积分", // title: "采集积分",
icon: "article" // icon: "article"
} // }
}, // },
{
path: "/policeReport",
name: "policeReport",
component: () => import("@/views/backOfficeSystem/policeReport/index.vue"),
meta: {
title: "警情管理",
icon: "article"
}
},
{ {
path: "/transferConsultationList", path: "/transferConsultationList",
name: "transferConsultationList", name: "transferConsultationList",
@ -557,6 +406,14 @@ export const publicRoutes = [
title: "线索管理", title: "线索管理",
icon: "article" icon: "article"
} }
}, {
path: "/InstructionInformation",
name: "InstructionInformation",
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/InstructionInformation/index"),
meta: {
title: "线索下发管理",
icon: "article"
}
}, },
// { // {
// path: "/InformationFlows", // path: "/InformationFlows",
@ -625,6 +482,15 @@ export const publicRoutes = [
icon: "article" icon: "article"
}, },
children: [ children: [
{
path: "/policeReport",
name: "policeReport",
component: () => import("@/views/backOfficeSystem/policeReport/index.vue"),
meta: {
title: "警情管理",
icon: "article"
}
},
{ {
path: "/ResearchHome", path: "/ResearchHome",
name: "ResearchHome", name: "ResearchHome",
@ -634,7 +500,7 @@ export const publicRoutes = [
icon: "article" icon: "article"
} }
}, },
{ {
path: "/dataReduction", path: "/dataReduction",
name: "dataReduction", name: "dataReduction",
component: () => import("@/views/backOfficeSystem/JudgmentHome/dataReduction/index"), component: () => import("@/views/backOfficeSystem/JudgmentHome/dataReduction/index"),
@ -643,15 +509,15 @@ export const publicRoutes = [
icon: "article" icon: "article"
} }
}, },
// { // {
// path: "/situationHome", // path: "/situationHome",
// name: "situationHome", // name: "situationHome",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"), // component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
// meta: { // meta: {
// title: "战略研判", // title: "战略研判",
// icon: "article" // icon: "article"
// } // }
// }, // },
// 后面写的研判 // 后面写的研判
{ {
path: "/tacticalResearch", path: "/tacticalResearch",
@ -680,7 +546,15 @@ export const publicRoutes = [
icon: "article" icon: "article"
} }
}, },
{
path: "/internalAuditor",
name: "internalAuditor",
component: () => import("@/views/backOfficeSystem/JudgmentHome/internalAuditor/index.vue"),
meta: {
title: "内部审核人员",
icon: "article"
}
},
// { // {
// path: "/analysisReport", // path: "/analysisReport",
// name: "AnalysisReport", // name: "AnalysisReport",
@ -766,6 +640,124 @@ export const publicRoutes = [
}, },
] ]
}, },
{
path: "/dataApplication",
name: "dataApplication",
meta: { title: "数据应用", icon: "article" },
children: [
{
path: "/IntegralCoefficient",
name: "IntegralCoefficient",
component: () =>
import(
"@/views/backOfficeSystem/fourColorManage/IntegralCoefficient/index"
),
meta: {
title: "积分系数配置",
icon: "article"
}
},
{
path: "/IdentityManage",
name: "IdentityManage",
component: () =>
import(
"@/views/backOfficeSystem/fourColorManage/IdentityManage/index"
),
meta: {
title: "身份标签管理",
icon: "article"
}
},
{
path: "/BehaviorLabels",
name: "BehaviorLabels",
component: () =>
import(
"@/views/backOfficeSystem/fourColorManage/BehaviorLabels/index"
),
meta: {
title: "行为标签管理",
icon: "article"
}
},
{
path: "/tagManage",
name: "tagManage",
component: () =>
import(
"@/views/backOfficeSystem/fourColorManage/tagManage/index"
),
meta: {
title: "标签组合管理",
icon: "article"
}
}, {
path: "/tsypHome",
name: "tsypHome",
component: () => import("@/views/backOfficeSystem/JudgmentHome/tsypHome/index"),
meta: {
title: "模型管理",
icon: "article"
}
},
{
path: "/JobAppraisal",
name: "JobAppraisal",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/JobAppraisal/index"),
meta: {
title: "工作考核",
icon: "article"
}
},
{
path: "/fileTransfer",
name: "fileTransfer",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileTransfer/index"),
meta: {
title: "文件中转",
icon: "article"
}
},
{
path: "/fileOrientation",
name: "fileOrientation",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/fileOrientation/index"),
meta: {
title: "文件定向传输",
icon: "article"
}
},
{
path: "/ssemanticAnalysis",
name: "semanticAnalysis",
component: () => import("@/views/backOfficeSystem/SemanticAnalysis/index.vue"),
meta: {
title: "语义分析",
icon: "article"
}
},
{
path: "/StatisticalAnalysis",
name: "StatisticalAnalysis",
component: () => import("@/views/backOfficeSystem/ResearchJudgment/InformationFlows/StatisticalAnalysis/index"),
meta: {
title: "情报统计分析",
icon: "article"
}
}, {
path: "/RecordsOperations",
name: "RecordsOperations",
component: () => import("@/views/backOfficeSystem/ResearchJudgment/RecordsOperations/index"),
meta: {
title: "操作记录",
icon: "article"
}
}
]
},
// { // {
// path: "/BasicManagement", // path: "/BasicManagement",
// name: "BasicManagement", // name: "BasicManagement",
@ -842,116 +834,116 @@ export const publicRoutes = [
name: "systemConfigModel", name: "systemConfigModel",
// redirect: "/dict/index", // redirect: "/dict/index",
meta: { meta: {
title: "系统管理", title: "系统管理",
icon: "article" icon: "article"
}, },
children: [ children: [
{ {
path: "/user/department-ist", path: "/user/department-ist",
name: "departmentList", name: "departmentList",
component: () => import("@/views/backOfficeSystem/systemConfig/department-list/index"), component: () => import("@/views/backOfficeSystem/systemConfig/department-list/index"),
meta: { meta: {
title: "部门管理", title: "部门管理",
icon: "article-ranking" icon: "article-ranking"
} }
}, },
{ {
path: "/user/userList", path: "/user/userList",
name: "userList", name: "userList",
component: () => component: () =>
import("@/views/backOfficeSystem/systemConfig/user-list/index"), import("@/views/backOfficeSystem/systemConfig/user-list/index"),
meta: { meta: {
title: "用户管理", title: "用户管理",
icon: "article-ranking" icon: "article-ranking"
} }
}, },
{ {
path: "/user/role", path: "/user/role",
name: "userRoleIndex", name: "userRoleIndex",
component: () => component: () =>
import("@/views/backOfficeSystem/systemConfig/role-list/index"), import("@/views/backOfficeSystem/systemConfig/role-list/index"),
meta: { meta: {
title: "角色列表", title: "角色列表",
icon: "article-ranking" icon: "article-ranking"
} }
}, },
{ {
path: "/user/menuList", path: "/user/menuList",
name: "menuList", name: "menuList",
component: () => component: () =>
import("@/views/backOfficeSystem/systemConfig/menu-list/index"), import("@/views/backOfficeSystem/systemConfig/menu-list/index"),
meta: { meta: {
title: "菜单管理", title: "菜单管理",
icon: "article-ranking" icon: "article-ranking"
} }
}, },
{ {
path: "/dict/detail", path: "/dict/detail",
name: "dictDetail", name: "dictDetail",
component: () => component: () =>
import("@/views/backOfficeSystem/systemConfig/dict/detail"), import("@/views/backOfficeSystem/systemConfig/dict/detail"),
meta: { meta: {
title: "字典数据" title: "字典数据"
} }
}, },
{ {
path: "/dict/index", path: "/dict/index",
name: "dictIndex", name: "dictIndex",
component: () => component: () =>
import("@/views/backOfficeSystem/systemConfig/dict/index"), import("@/views/backOfficeSystem/systemConfig/dict/index"),
meta: { meta: {
title: "字典列表", title: "字典列表",
icon: "article-ranking" icon: "article-ranking"
} }
}, },
{ {
path: "/user/deptAllocationUser/:id", path: "/user/deptAllocationUser/:id",
name: "deptAllocationUser", name: "deptAllocationUser",
component: () => component: () =>
import( import(
"@/views/backOfficeSystem/systemConfig/department-list/deptAllocationUser" "@/views/backOfficeSystem/systemConfig/department-list/deptAllocationUser"
), ),
meta: { meta: {
title: "管理用户" title: "管理用户"
} }
}, },
{ {
path: "/user/allocationUser/:id", path: "/user/allocationUser/:id",
name: "allocationUser", name: "allocationUser",
component: () => component: () =>
import( import(
"@/views/backOfficeSystem/systemConfig/role-list/allocationUser" "@/views/backOfficeSystem/systemConfig/role-list/allocationUser"
), ),
meta: { meta: {
title: "分配用户" title: "分配用户"
} }
}, },
{ {
path: "/user/systemConfig", path: "/user/systemConfig",
name: "systemConfig", name: "systemConfig",
component: () => component: () =>
import( import(
"@/views/backOfficeSystem/systemConfig/system-config-list/index" "@/views/backOfficeSystem/systemConfig/system-config-list/index"
), ),
meta: { meta: {
title: "系统配置", title: "系统配置",
icon: "article-ranking" icon: "article-ranking"
} }
}, { }, {
path: "/calendar", path: "/calendar",
name: "calendar", name: "calendar",
component: () => import("@/views/backOfficeSystem/calendar/index.vue"), component: () => import("@/views/backOfficeSystem/calendar/index.vue"),
meta: { meta: {
title: "敏感节点", title: "敏感节点",
icon: "article" icon: "article"
} }
}, },
] ]
}, },
{ {
path: "/rests", path: "/rests",
name: "rests", name: "rests",
@ -965,26 +957,62 @@ export const publicRoutes = [
name: "CollectCrculate", name: "CollectCrculate",
component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectCrculate/index"), component: () => import("@/views/backOfficeSystem/HumanIntelligence/CollectCrculate/index"),
meta: { title: "情报采集", icon: "article" }, meta: { title: "情报采集", icon: "article" },
}, {
path: "/RlStatisticalAnalysis",
name: "RlStatisticalAnalysis",
component: () =>
import(
"@/views/backOfficeSystem/HumanIntelligence/RlStatisticalAnalysis/index"
),
meta: {
title: "上报统计分析",
icon: "article"
}
}, },
// { {
// path: "/ResearchHome", path: "/TaskScheduling",
// name: "ResearchHome", name: "TaskScheduling",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"), component: () =>
// meta: { import(
// title: "战术研判", "@/views/backOfficeSystem/HumanIntelligence/TaskScheduling/index"
// icon: "article" ),
// } meta: {
// }, title: "上报任务调度",
// { icon: "article"
// path: "/situationHome", }
// name: "situationHome", },
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"), {
// meta: { path: "/ConstructionManagement",
// title: "战略研判", name: "ConstructionManagement",
// icon: "article" component: () =>
// } import(
// }, "@/views/backOfficeSystem/HumanIntelligence/ConstructionManagement/index"
),
meta: {
title: "力量建设管理",
icon: "article"
}
},
// {
// path: "/ResearchHome",
// name: "ResearchHome",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/ResearchHome/index"),
// meta: {
// title: "战术研判",
// icon: "article"
// }
// },
// {
// path: "/situationHome",
// name: "situationHome",
// component: () => import("@/views/backOfficeSystem/JudgmentHome/situationHome/index"),
// meta: {
// title: "战略研判",
// icon: "article"
// }
// },
] ]
}, },
] ]

View File

@ -1,5 +1,5 @@
import { ref, toRefs, isRef } from 'vue'; import { ref, toRefs, isRef } from 'vue';
import { getSysDictByCode } from '@/api/sysDict' //引入封装数字字典接口 import { getSysDictByCode, fzdict } from '@/api/sysDict' //引入封装数字字典接口
import { getLocalDic } from "@/utils/localDic/index.js" import { getLocalDic } from "@/utils/localDic/index.js"
/** /**
@ -24,11 +24,11 @@ export function getDict(...args) {
return (() => { return (() => {
args.forEach((d, index) => { args.forEach((d, index) => {
res.value[d] = []; res.value[d] = [];
// 本地字典拦截,如果本地字典存在,则使用本地字典,否则使用远程字典 // 本地字典拦截,如果本地字典存在,则使用本地字典,否则使用远程字典
if (isLocalDict(d) && getLocalDic(d)) { if (isLocalDict(d) && getLocalDic(d)) {
res.value[d] = getLocalDic(d) res.value[d] = getLocalDic(d)
} else { } else {
getSysDictByCode({ getSysDictByCode({
dictCode: d dictCode: d
}).then(result => { }).then(result => {
@ -53,7 +53,42 @@ export function getDict(...args) {
return toRefs(res.value); return toRefs(res.value);
})() })()
} }
export function getFzDict(...args) {
const res = ref({});
return (() => {
args.forEach((d, index) => {
res.value[d] = [];
// 本地字典拦截,如果本地字典存在,则使用本地字典,否则使用远程字典
if (isLocalDict(d) && getLocalDic(d)) {
res.value[d] = getLocalDic(d);
} else {
fzdict({
dictLabel: d
}).then(result => {
result = result || {};
// result.itemList = Array.isArray(result.itemList) ? result.itemList : [];
// result.itemList.forEach(p => {
// p.label = p.itemName;
// p.value = p.itemValue;
// p.id = p.itemValue;
// p.elTagType = p.dictType;
// if (p?.itemList && p.itemList?.length > 0) {
// getChildren(p);
// }
// p.children = p.itemList;
// });
// console.log(res.value);
res.value[d] = result
});
}
});
// 使用toRefs确保返回的是响应式对象
return toRefs(res.value);
})()
}
export function getChildren(item) { export function getChildren(item) {
item.label = item.zdmc item.label = item.zdmc
item.value = item.dm item.value = item.dm
@ -177,3 +212,4 @@ export function getMultiDictVal(values, dict) {
}).join(','); }).join(',');
} }

View File

@ -5,19 +5,21 @@ import { getItem } from '@/utils/storage'
*/ */
const getChildrenRoutes = (routes) => { const getChildrenRoutes = (routes) => {
const result = []; const result = [];
// const { deptBizType, deptLevel } = getItem('deptId')[0] const { deptBizType, deptLevel } = getItem('deptId')[0]
const roleList = getItem('roleList') ? getItem('roleList').filter(item => item.roleCode == 'JS_666666').length > 0 : false
routes.forEach((route) => { routes.forEach((route) => {
if (route.children && route.children.length > 0) { if (route.children && route.children.length > 0) {
// if (deptBizType == '23') { if (deptBizType == '23' && roleList) {
result.push(...route.children); result.push(...route.children);
// } else { } else {
// if (route.path == '/HumanIntelligence') { // console.log(route.path);
// route.children.splice(0, 1); if (route.path == '/JudgmentHome') {
// result.push(...route.children); route.children.splice(6, 1);
// } else { result.push(...route.children);
// result.push(...route.children); } else {
// } result.push(...route.children);
// } }
}
} }
}); });
return result; return result;

View File

@ -93,6 +93,7 @@ export function timeValidate(date, type) {
const hh = time.getHours().toString().padStart(2, '0') const hh = time.getHours().toString().padStart(2, '0')
const mm = time.getMinutes().toString().padStart(2, '0') const mm = time.getMinutes().toString().padStart(2, '0')
const ss = time.getSeconds().toString().padStart(2, '0') const ss = time.getSeconds().toString().padStart(2, '0')
if (type == 'ymd') { if (type == 'ymd') {
return `${yyyy}-${MM}-${dd}`; return `${yyyy}-${MM}-${dd}`;
} }

View File

@ -1,7 +1,7 @@
// let url = "ws://89.40.9.89:2109/mosty-api/mosty-websocket/socket/"; //线上 // let url = "ws://89.40.9.89:2109/mosty-api/mosty-websocket/socket/"; //线上
let url = "ws://155.240.22.30:2109/mosty-api/mosty-websocket/socket/"; //线上 let url = "ws://155.240.22.30:2109/mosty-api/mosty-websocket/socket/"; //线上
if(process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地 url = "ws://47.108.232.77:9537/mosty-api/mosty-websocket/socket/"; //本地
} }
import { import {

View File

@ -72,7 +72,6 @@
<DictTag :tag="false" :value="row.czzt" :options="D_BZ_QBCZZT" /> <DictTag :tag="false" :value="row.czzt" :options="D_BZ_QBCZZT" />
</template> </template>
<template #lczt="{ row }"> <template #lczt="{ row }">
<DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" /> <DictTag :tag="false" :value="row.lczt" :options="D_BZ_LCZT" />
</template> </template>
<!-- 操作 --> <!-- 操作 -->
@ -190,8 +189,7 @@ const isShowTransferMerchantTc = ref(false)
const isShow = ref(false) const isShow = ref(false)
const searchConfiger = ref([ const searchConfiger = ref([
{ label: "开始时间", prop: "startTime", placeholder: "请选择开始时间", showType: "date" }, { label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "daterange" },
{ label: "结束时间", prop: "endTime", placeholder: "请选择结束时间", showType: "date" },
{ label: "所属单位", prop: "ssbmdm", placeholder: "请选择所属单位", showType: "department" }, { label: "所属单位", prop: "ssbmdm", placeholder: "请选择所属单位", showType: "department" },
{ label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" }, { label: "情报标题", prop: 'qbmc', placeholder: "请输入情报标题", showType: "input" },
{ label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select", options: D_BZ_BQJB }, { label: "标签级别", prop: 'qbjb', placeholder: "请选择标签级别", showType: "select", options: D_BZ_BQJB },
@ -394,14 +392,12 @@ const handleSumbit = () => {
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
const { lrkssj, zxkssj } = val
const promes = { const promes = {
...pageData.pageConfiger, ...pageData.pageConfiger,
...val, ...val,
lrkssj: lrkssj ? lrkssj[0] : '', startTime: val.startTime ? val.startTime[0] : '',
lrjssj: lrkssj ? lrkssj[1] : '', endTime: val.endTime ? val.endTime[1] : '',
zxkssj: zxkssj ? zxkssj[0] : '',
zxjssj: zxkssj ? zxkssj[1] : '',
} }
queryFrom.value = { ...promes } queryFrom.value = { ...promes }

View File

@ -76655,12 +76655,14 @@ export const bm = {
export const centralPoint = [ export const centralPoint = [
{ {
name: '墨脱县', name: '墨脱县',
ssbmdm:'540423000000',
point: [ point: [
95.33050808900407, 95.33050808900407,
29.322011545645807 29.322011545645807
] ]
}, { }, {
name: '巴宜区', name: '巴宜区',
ssbmdm:'540402000000',
point: [ point: [
94.36040092147607, 94.36040092147607,
29.637028970765996 29.637028970765996
@ -76668,30 +76670,35 @@ export const centralPoint = [
}, },
{ {
name: '波密县', name: '波密县',
ssbmdm:'540424000000',
point: [ point: [
95.7692249914358, 95.7692249914358,
29.85943760031867 29.85943760031867
] ]
}, { }, {
name: '察隅县', name: '察隅县',
ssbmdm:'540425000000',
point: [ point: [
97.46698612723947, 97.46698612723947,
28.661228694163327 28.661228694163327
] ]
}, { }, {
name: '工布江达县', name: '工布江达县',
ssbmdm:'540421000000',
point: [ point: [
93.24660931130188, 93.24660931130188,
29.88459424127838 29.88459424127838
] ]
}, { }, {
name: '朗县', name: '朗县',
ssbmdm:'540426000000',
point: [ point: [
93.07449497318652, 93.07449497318652,
29.045416229209337 29.045416229209337
] ]
}, { }, {
name: '米林县', name: '米林县',
ssbmdm:'540422000000',
point: [ point: [
94.21305189935441, 94.21305189935441,
29.21583429482142 29.21583429482142

View File

@ -104,11 +104,12 @@ import LineEcharts from "@/views/home/echarts/moreLineEcharts.vue";
import MyTable from "@/components/aboutTable/DarkTable.vue"; import MyTable from "@/components/aboutTable/DarkTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import {tbJqGetPageList } from '@/api/yj.js' import {tbJqGetPageList,xsajSelectPage } from '@/api/yj.js'
const router = useRouter(); const router = useRouter();
import { nextTick, onMounted, reactive, getCurrentInstance, ref, watch } from 'vue'; import { nextTick, onMounted, reactive, getCurrentInstance, ref, watch } from 'vue';
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { JQLB } = proxy.$dict("JQLB"); //获取字典数据 const { JQLB } = proxy.$dict("JQLB"); //获取字典数据
const {GA_D_XSAJXALBDM} = proxy.$fzdict("GA_D_XSAJXALBDM"); //获取字典数据
const readonly_lx = ref(false) const readonly_lx = ref(false)
const readonly_ry = ref(false) const readonly_ry = ref(false)
const readonly_dd = ref(false) const readonly_dd = ref(false)
@ -195,10 +196,11 @@ const list = reactive([
pageSize: 6, pageSize: 6,
}, },
tableColumn: [ tableColumn: [
{ label: "案件编号", prop: "ajbh", showOverflowTooltip: true }, { label: "案件编号", prop: "asjbh", showOverflowTooltip: true },
{ label: "案件内容", prop: "ajnr", showOverflowTooltip: true }, { label: "案件标题", prop: "ajmc", showOverflowTooltip: true },
{ label: "案件类型", prop: "ajlx", showOverflowTooltip: true }, { label: "简要案情", prop: "jyaq", showOverflowTooltip: true },
{ label: "案件时间", prop: "ajsj", showOverflowTooltip: true }, { label: "案件类型", prop: "ajxlbDmbcms", showOverflowTooltip: true },
{ label: "案件时间", prop: "asjfssjAsjfskssj", showOverflowTooltip: true },
], ],
}, },
{ {
@ -243,11 +245,20 @@ watch(() => JQLB.value, (val) => {
deep: true, immediate: true deep: true, immediate: true
}) })
onMounted(() => { onMounted(() => {
// getCount(); //获取统计数据 // getCount(); //获取统计数据
tabHeightFn() tabHeightFn()
getJqList() //警情列表 getJqList() //警情列表
getAjList()//案件列表
}); });
// 获取字典
const getxsajDictSelectList = () => {
xsajDictSelectList().then(res => {
console.log(res);
})
}
const getCount = () => { const getCount = () => {
// 获取处置状态统计 // 获取处置状态统计
qcckPost({}, '/mosty-gsxt/qbcj/getXscjTjByXslx').then(res => { qcckPost({}, '/mosty-gsxt/qbcj/getXscjTjByXslx').then(res => {
@ -275,12 +286,13 @@ const changeNo = (e, type) => {
break; break;
case '案件': case '案件':
list[2].pageConfiger.page = e; list[2].pageConfiger.page = e;
getAjList()
break; break;
case '风险隐患': case '风险隐患':
list[3].pageConfiger.page = e; list[3].pageConfiger.page = e;
break; break;
} }
getJqList() // getJqList()
} }
const changeSize = (e, type) => { const changeSize = (e, type) => {
switch (type) { switch (type) {
@ -293,6 +305,7 @@ const changeSize = (e, type) => {
break; break;
case '案件': case '案件':
list[2].pageConfiger.pageSize = e; list[2].pageConfiger.pageSize = e;
getAjList()
break; break;
case '风险隐患': case '风险隐患':
list[3].pageConfiger.pageSize = e; list[3].pageConfiger.pageSize = e;
@ -316,6 +329,26 @@ const getJqList = () => {
obj.data_hstj.list = [{ label: '总数', val: [0, res.total, 0, 0] }]; obj.data_hstj.list = [{ label: '总数', val: [0, res.total, 0, 0] }];
}) })
} }
const getAjList = () => {
let params = {
pageCurrent: list[2].pageConfiger.page,
pageSize: list[2].pageConfiger.pageSize,
}
console.log("执行");
xsajSelectPage(params).then(res => {
list[2].tableList = res.records || [];
list[2].pageConfiger.total = res.total;
// //模拟的统计警情接口
// obj.data_lxtj.list = [{ label: '总数', val: [0, res.total, 0, 0] }];
// obj.data_hstj.list = [{ label: '总数', val: [0, res.total, 0, 0] }];
})
}
// xsajSelectPage(promes).then(res => {
// list[2].tableList = res.records || [];
// list[2].pageConfiger.total = res.total;
// })
@ -420,7 +453,6 @@ const onSearch = () => {
}) })
} else { } else {
ElMessage.warning('请选择查询条件') ElMessage.warning('请选择查询条件')
} }
@ -602,7 +634,7 @@ const tabHeightFn = () => {
::v-deep .el-table .el-table__cell { ::v-deep .el-table .el-table__cell {
padding: 0; padding: 0;
} }
::v-deep .el-table th.el-table__cell>.cell { ::v-deep .el-table th.el-table__cell>.cell {

View File

@ -0,0 +1,206 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="内部审核" />
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #bglx="{ row }">
<DictTag :tag="false" :value="row.bglx" :options="D_BZ_YPLX" />
</template>
<template #ypfs="{ row }">
<DictTag :tag="false" :value="row.ypfs" :options="D_BZ_YPFS" />
</template>
<template #shzt="{ row }">
<span v-if="row.shzt == '01'">审批中</span>
<span v-if="row.shzt == '02'">已审批</span>
<span v-if="row.shzt == '03'">已驳回</span>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="danger" @click="internalAudit(row.id)">内部审批</el-link>
<el-link size="small" type="primary" @click="createProcess(row)">提交上级</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '研判审核', flowType: 'YPSH', modelName: '研判' }"
:path="fixedValue" @getList="getList" />
<Ypdolog v-model="showYpdolog" :dataList="dataList" @getList="getList" />
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { useRoute, useRouter } from 'vue-router'
import { reactive, ref, onMounted, getCurrentInstance, watch, computed, nextTick } from "vue";
import { ypbgSjzlQueryShList } from "@/api/huiShangyp/strategicApi.js";
import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import Ypdolog from './ypdolog.vue'
const { proxy } = getCurrentInstance();
const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX")
const searchBox = ref(); //搜索框
const router = useRouter();
const route = useRoute();
onMounted(() => {
tabHeightFn()
if (route.query.id) {
nextTick(() => {
addForm.value && addForm.value.init('edit', {
id: route.query.id
});
router.replace({ path: '/tacticalResearch' })// 移除id 避免刷新一直带参数
})
}
getList()
});
const searchConfiger = ref([
{ label: "研判议题", prop: 'ypyt', placeholder: "请输入研判议题", showType: "input" },
]);
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: "ypyt" },
{ label: "报告类型", prop: "bglx", showSolt: true },
{ label: "审核状态", prop: "shzt", showSolt: true },
{ label: "研判时间", prop: "ypsj" },
{ label: "研判要求", prop: "ypyq" },
{ label: "发起部门", prop: "ssbm" },
{ label: "研判方式", prop: "ypfs", showSolt: true },
]
});
const queryFrom = ref({});
// 搜索
const onSearch = (val) => {
const promes = {
...val,
...pageData.pageConfiger,
}
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 };
ypbgSjzlQueryShList(data).then(res => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => { pageData.tableConfiger.loading = false; })
}
// 工作流
const showSp = ref(false);
const rowData = ref()
// 固定值
const fixedValue = {
clueVerification: 'information',
byMeansOf: 'ypbg/sjzl/sendFqzl',
nobyMeansOf: 'ypbg/sjzl/sendFqzl',
recycle: 'ypbg/sjzl/sendFqzl',
}
const createProcess = (row) => {
if (row.shzt == '02') {
showSp.value = true;
rowData.value = row
} else {
proxy.$message({
message: '请先内部审批',
type: 'warning'
})
}
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
};
// 内部审核
const showYpdolog = ref(false)
const dataList = ref({})
const internalAudit = (row) => {
dataList.value = row
showYpdolog.value = true
};
</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;
}
</style>

View File

@ -0,0 +1,186 @@
<template>
<div class="information-container">
<h2 class="page-title">研判详情</h2>
<div class="info-section">
<div class="info-row">
<div class="info-item">
<span class="label">研判议题</span>
<span class="value">{{ detail.ypyt || '暂无' }}</span>
</div>
<div class="info-item">
<span class="label">研判方式</span>
<span class="value">
<DictTag v-if="detail.ypfs && D_BZ_YPFS" :tag="false" :value="detail.ypfs" :options="D_BZ_YPFS" />
<span v-else>暂无</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">报告类型</span>
<span class="value">
<DictTag v-if="detail.bglx && D_BZ_YPLX" :tag="false" :value="detail.bglx" :options="D_BZ_YPLX" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">研判时间</span>
<span class="value">{{ detail.ypsj || '暂无' }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">研判要求</span>
<span class="value">{{ detail.ypyq || '暂无' }}</span>
</div>
<div class="info-item">
<span class="label">发起部门</span>
<span class="value">{{ detail.ssbm || '暂无' }}</span>
</div>
</div>
</div>
<!-- 新增数据展示模块 -->
<div class="data-section">
<h3 class="section-title">研判部门详情</h3>
<el-table :data="detail.cyypList" stripe style="width: 100%" border>
<el-table-column prop="ypbmmc" label="研判部门" min-width="150" />
<el-table-column prop="scyq" label="上传要求" min-width="200" />
<el-table-column prop="fj" label="附件" min-width="150" show-overflow-tooltip>
<template #default="scope">
<span v-if="scope.row.fj">
<span v-for="(file, index) in JSON.parse(scope.row.fj)" :key="index">
{{ file.name }}<span v-if="index < JSON.parse(scope.row.fj).length - 1"></span>
</span>
</span>
<span v-else>暂无</span>
</template>
</el-table-column>
<el-table-column prop="wcqk" label="完成情况" min-width="120">
<template #default="scope">
{{ scope.row.wcqk == '01' ? '准备中' : '已完成' }}
</template>
</el-table-column>
<el-table-column prop="wcsj" label="完成时间" min-width="180" />
</el-table>
</div>
</div>
</template>
<script setup>
import DictTag from '@/components/DictTag/index.vue';
import { onMounted ,ref,getCurrentInstance} from 'vue';
import { useRoute } from 'vue-router'
import {sjzlGetInfo} from '@/api/yj'
const props = defineProps({
/** 字典数据 */
dict: {
type: Object,
default: () => ({})
}
});
const route = useRoute();
const { proxy } = getCurrentInstance();
const {D_BZ_YPFS, D_BZ_YPLX}=proxy.$dict("D_BZ_YPFS","D_BZ_YPLX");
const detail=ref({});
// 新增:存储用户提供的研判部门详情数据
const departmentData=ref([
{
"id": "ae9c8db058fc4bc6b18bc98ab6ef0abd",
"sjzlid": "1d538226c8c94577ab3e97f67e7e90bf",
"ypbmdm": "540421000000",
"ypbmmc": "工布江达县",
"scyq": "测试",
"fj": "[{\"id\":null,\"name\":\"app登录接口.txt\"}]",
"wcqk": "02",
"wcsj": "2025-12-26 15:12:29"
},
{
"id": "eef7b85a85784ea4b5211e4330162720",
"sjzlid": "1d538226c8c94577ab3e97f67e7e90bf",
"ypbmdm": "540402000000",
"ypbmmc": "巴宜区",
"scyq": "测试",
"fj": "[{\"id\":null,\"name\":\"Mosty888.csr\"}]",
"wcqk": "02",
"wcsj": "2025-12-26 15:12:29"
}
]);
onMounted(() => {
console.log(route.query.id);
sjzlGetInfo(route.query.id).then(res => {
detail.value=res;
console.log(res);
})
});
// /ypbg/sjzl/{id}
</script>
<style lang="scss" scoped>
.information-container {
width: 100%;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.page-title {
color: #303133;
font-size: 18px;
font-weight: bold;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid #e8e8e8;
}
.info-section {
width: 100%;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 15px;
}
.info-item {
flex: 1;
min-width: 300px;
margin-bottom: 10px;
display: flex;
align-items: flex-start;
}
.label {
font-weight: bold;
color: #606266;
margin-right: 12px;
width: 100px;
text-align: right;
line-height: 32px;
}
.value {
color: #303133;
flex: 1;
line-height: 32px;
word-break: break-word;
}
/* 新增:数据展示模块样式 */
.data-section {
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid #e8e8e8;
}
.section-title {
color: #303133;
font-size: 16px;
font-weight: bold;
margin-bottom: 15px;
}
</style>

View File

@ -0,0 +1,92 @@
<template>
<el-dialog v-model="modelValue" title="内部审核" width="35%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 15vh; overflow: auto;">
<el-form ref="ruleFormRef" :rules="rules" :model="form" label-width="auto" style="max-width: 600px">
<el-form-item label="审核状态" prop="shzt">
<el-radio-group v-model="form.shzt">
<el-radio label="02">通过</el-radio>
<el-radio label="03">拒绝</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="审核意见" prop="shyj">
<el-input v-model="form.shyj" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog(ruleFormRef)">取消</el-button>
<el-button type="primary" @click="submitForm(ruleFormRef)">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import { ypbgSjzlYpsp } from '@/api/huiShangyp/strategicApi.js'
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dataList: {
type: Object,
default: () => ({})
}
})
const emit = defineEmits(['update:modelValue','getList'])
const closeDialog = (formEl) => {
if (!formEl) return
formEl.resetFields()
emit('update:modelValue', false)
}
const rules = reactive({
shzt: [
{ required: true, message: '请选择审核状态', trigger: 'blur' }
],
shyj: [
{ required: true, message: '请输入审核意见', trigger: 'blur' }
]
})
const ruleFormRef = ref(null)
const form = reactive({
shzt: '',
shyj: ''
})
const submitForm = async (formEl) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
const promise = {
...form,
ypid: props.dataList
}
ypbgSjzlYpsp(promise).then(res => {
proxy.$message({
message: '操作成功',
type: 'success'
})
emit('getList')
formEl.resetFields()
emit('update:modelValue', false)
})
} else {
console.log('error submit!', fields)
}
})
}
</script>
<style scoped></style>

View File

@ -8,20 +8,19 @@
</div> </div>
</div> </div>
<div style="padding-bottom: 0px;" class="form_cnt"> <div style="padding-bottom: 0px;" class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules"> <FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" :disabled="title === '详情'">
<template #bmList> <template #bmList>
<div class="table-box"> <div class="table-box">
<el-table :data="tableList" border style="width: 100%"> <el-table :data="tableList" border style="width: 100%">
<el-table-column prop="ypbmmc" label="部门" width="150" align="center" /> <el-table-column prop="ypbmmc" label="部门" width="150" align="center" />
<el-table-column label="研判素材" width="280" align="center"> <el-table-column label="研判素材" width="380" align="center">
<template #default="{ row }"> <template #default="{ row }">
<el-input v-model="row.scyq" :disabled="true" placeholder="请输入研判素材" /> <el-input v-model="row.scyq" placeholder="请输入研判素材" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="附件" width="200" align="center"> <el-table-column label="附件" width="200" align="center">
<template #default="{ row }"> <template #default="{ row }">
<UploadFile v-model="row.fj" :disabled="true" :limit="1" :isImg="false" <UploadFile v-model="row.fj" :limit="1" :isImg="false" :isAll="true" />
:isAll="true" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="wcqk" label="完成状态" width="120" align="center"> <el-table-column prop="wcqk" label="完成状态" width="120" align="center">
@ -91,17 +90,29 @@
</template> </template>
<script setup> <script setup>
/**
* @typedef {Object} JudgmentDept 研判部门对象
* @property {string} ypbmdm - 研判部门代码
* @property {string} ypbmmc - 研判部门名称
* @property {string} scyq - 素材要求
* @property {Array} fj - 附件数组
* @property {string} wcqk - 完成情况01 准备中、02 已完成)
*/
import FormMessage from "@/components/aboutTable/FormMessage.vue"; import FormMessage from "@/components/aboutTable/FormMessage.vue";
import UploadFile from "@/components/MyComponents/Upload/index.vue"; import UploadFile from "@/components/MyComponents/Upload/index.vue";
// import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue" // import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue"; import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, watch, computed } from "vue";
import { sjzlAddEntity, sjzlEditEntity, sjzlGetInfo, sjzlPerfectlnfo, sjzlFstz, sjzlQryp, sjzlPerfectSorce } from '@//api/yj.js' import { sjzlGetInfo, sjzlPerfectlnfo, sjzlFstz, sjzlQryp, sjzlPerfectSorce } from '@//api/yj.js'
import { selfBuildJudgment } from "@/api/huiShangyp/tacticalApi.js"
// import { tacticalGet, strategicDelete } from "@/api/huiShangyp/strategicApi.js"; // import { tacticalGet, strategicDelete } from "@/api/huiShangyp/strategicApi.js";
import { getItem } from '@//utils/storage.js' import { getItem } from '@//utils/storage.js'
const emit = defineEmits(["updateDate", "getList"]); const emit = defineEmits(["updateDate", "getList"]);
const props = defineProps({ const props = defineProps({
dict: Object dict: Object,
/** 报告类型 01 战术研判 02战略研判 */
bglx: String,
}); });
const imgMsg = ref([]) const imgMsg = ref([])
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
@ -147,7 +158,7 @@ watch(() => props.dict, (val) => {
formData.value = [ formData.value = [
{ label: "研判议题", prop: "ypyt", type: "input", width: '48%' }, { label: "研判议题", prop: "ypyt", type: "input", width: '48%' },
{ label: "研判时间", prop: "ypsj", type: "datetime", width: '48%' }, { label: "研判时间", prop: "ypsj", type: "datetime", width: '48%' },
{ label: "报告类型", prop: "bglx", type: "radio", options: props.dict.D_BZ_YPLX, width: '48%' }, { label: "报告类型", prop: "bglx", type: "radio", options: props.dict.D_BZ_YPLX, width: '48%', disabled: true },
{ label: "研判方式", prop: "ypfs", type: "radio", options: props.dict.D_BZ_YPFS, width: '48%' }, { label: "研判方式", prop: "ypfs", type: "radio", options: props.dict.D_BZ_YPFS, width: '48%' },
{ label: "参与研判部门", prop: "jsdxBmDm", type: "department", multiple: true, depMc: 'jsdxBmMc', width: '48%' }, { label: "参与研判部门", prop: "jsdxBmDm", type: "department", multiple: true, depMc: 'jsdxBmMc', width: '48%' },
{ label: "研判要求", prop: "ypyq", type: "textarea", width: '100%' }, { label: "研判要求", prop: "ypyq", type: "textarea", width: '100%' },
@ -165,6 +176,8 @@ function updateDis(row) {
const isFinish = row.wcqk === '02' const isFinish = row.wcqk === '02'
return isShiQingBaoZhongXin.value || !iscjr || isFinish return isShiQingBaoZhongXin.value || !iscjr || isFinish
} }
/** 获取附件数组 */
function getFjArr(fj) { function getFjArr(fj) {
if (typeof fj !== 'string' || !fj) return [] if (typeof fj !== 'string' || !fj) return []
let fjArr = [] let fjArr = []
@ -176,15 +189,16 @@ function getFjArr(fj) {
return fjArr return fjArr
} }
watch(() => listQuery.value.jsdxBmDm, (val) => { watch(() => listQuery.value.jsdxBmDm, (val) => {
/** @type {Array<{ypbmdm: string, ypbmmc: string, scyq: string, fj: Array, wcqk: string}>} 参与研判部门数据数组 */ /** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
const arr = Array.isArray(val) ? val : [] const arr = Array.isArray(val) ? val : []
/** @type {Array} 参与研判部门*/
const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : [] const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : []
tableList.value = arr.map((item, i) => { tableList.value = arr.map((item, i) => {
/** 找原来的对象 */ /** 找原来的对象 */
const curr = cyypList.find(item2 => item2.ypbmdm == item) || {} const curr = cyypList.find(item2 => item2.ypbmdm == item) || {}
/** 是否是新增 */ /** 是否是新增 */
const isAddForm = !listQuery.value.id const isAddForm = !listQuery.value?.id
return { return {
// id: null, // id: null,
// sjzlid: null, // 研判战略研判ID // sjzlid: null, // 研判战略研判ID
@ -203,13 +217,24 @@ watch(() => listQuery.value.jsdxBmDm, (val) => {
const init = (type, row, wjlb) => { const init = (type, row, wjlb) => {
dialogForm.value = true; dialogForm.value = true;
title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情"; title.value = type == "add" ? "新增" : type == "edit" ? "编辑" : "详情";
outRow.value = row || {} outRow.value = row
if (row) { getDataById(row.id) } if (row) {
getDataById(row.id)
} else {
listQuery.value = {
bglx: props.bglx, // 报告类型 01 战术研判 02战略研判
ypfs: undefined, // 研判方式
ypsj: undefined, // 研判时间
ypyq: undefined, // 研判要求
cyypList: [], // 参与研判部门数据数组
}
}
}; };
// 根据id查询详情 // 根据id查询详情
const getDataById = (id) => { const getDataById = (id) => {
sjzlGetInfo(id).then((res) => { sjzlGetInfo(id).then((res) => {
listQuery.value = res || {}; listQuery.value = res || {};
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
const cyypList = Array.isArray(res.cyypList) ? res.cyypList : [] const cyypList = Array.isArray(res.cyypList) ? res.cyypList : []
listQuery.value.jsdxBmDm = cyypList.map(item => { listQuery.value.jsdxBmDm = cyypList.map(item => {
return item.ypbmdm return item.ypbmdm
@ -219,17 +244,17 @@ const getDataById = (id) => {
}) })
}); });
}; };
/** 获取附件json字符串 */
function getFjString(arr) { function getFjString(arr) {
arr = Array.isArray(arr) ? arr : [] arr = Array.isArray(arr) ? arr : []
return JSON.stringify(arr) return JSON.stringify(arr)
} }
/**获取下发部门数据 */ /**获取下发部门数据 */
const getXfbmList = () => { const getXfbmList = () => {
/** @type {Array<JudgmentDept>} 参与研判部门数据数组 */
const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : [] const cyypList = Array.isArray(listQuery.value.cyypList) ? listQuery.value.cyypList : []
return tableList.value.map((item, i) => { return tableList.value.map((item, i) => {
/** @type {JudgmentDept} 找原来的对象 */
/** 找原来的对象 */
const curr = cyypList.find(item => item.ypbmdm == item.ypbmdm) || {} const curr = cyypList.find(item => item.ypbmdm == item.ypbmdm) || {}
return { return {
id: curr.id || null, id: curr.id || null,
@ -252,21 +277,14 @@ const submit = () => {
let params = { let params = {
...listQuery.value, ...listQuery.value,
cyypList: xfbmList, cyypList: xfbmList,
// cyypList: listQuery.value.jsdxBmDm.map((item, index) => {
// return {
// ypbmdm: item,
// ypbmmc: listQuery.value.jsdxBmMc[index],
// ypcylx: '01'
// }
// })
}; };
try { try {
loading.value = true; loading.value = true;
let res let res
if (title.value == "新增") { if (title.value == "新增") {
res = await sjzlAddEntity(params) res = await selfBuildJudgment(params)
} else { } else {
res = await sjzlEditEntity(params) // res = await sjzlEditEntity(params)// 目前没有修改
} }
if (res && res > 0) { if (res && res > 0) {
loading.value = false; loading.value = false;
@ -358,7 +376,7 @@ const submitMaterialAction = async () => {
closeMaterialDialog() closeMaterialDialog()
if (outRow.value.id) { getDataById(outRow.value.id) } if (outRow.value.id) { getDataById(outRow.value.id) }
} catch (error) { } catch (error) {
console.log(error)
} finally { } finally {
materialLoading.value = false materialLoading.value = false
} }
@ -384,7 +402,7 @@ const sendNotice = () => {
proxy.$message({ type: "success", message: "下发通知成功" }); proxy.$message({ type: "success", message: "下发通知成功" });
close(); close();
} catch (error) { } catch (error) {
console.log(error);
} finally { } finally {
noticeLoading.value = false; noticeLoading.value = false;
} }
@ -405,7 +423,7 @@ const confirmJudgment = () => {
proxy.$message({ type: "success", message: "确认研判成功" }); proxy.$message({ type: "success", message: "确认研判成功" });
close(); close();
} catch (error) { } catch (error) {
console.log(error);
} finally { } finally {
confirmLoading.value = false; confirmLoading.value = false;
} }

View File

@ -0,0 +1,137 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">创建会议{{ title }} </span>
<div>
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<!-- <template #glxsmc>
<el-input placeholder="请选择关联线索" @click="chooseVisiblexS = true" readonly v-model="listQuery.glxsmc"></el-input>
</template> -->
<template #chryList>
<el-input placeholder="请选择参会人员" @click="openMeetings = true" readonly v-model="listQuery.rymc"></el-input>
</template>
</FormMessage>
</div>
</div>
<Personnel v-model="openMeetings" />
<ChooseUser v-model="chooseVisible" :Single="false" @choosedUsers="handleUserSelected" :roleIds="roleIds" />
<Xslist v-model="chooseVisiblexS" @choosed="choosed" :roleIds="roleIdsxs"></Xslist>
</template>
<script setup>
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
// import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import Personnel from '@/views/backOfficeSystem/JudgmentHome/MeetingRoom/components/Communications/personnel.vue'
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, } from "vue";
import dayjs from 'dayjs';
const emit = defineEmits(["updateDate"]);
const roleIds = ref([]); //角色id
const chooseVisible = ref(false);
const roleIdsxs = ref([]); //角色id
const chooseVisiblexS = ref(false);
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
hskssj: [{ required: true, message: "请选择会商开始时间", trigger: "change" }],
hsjssj: [{ required: true, message: "请选择会商结束时间", trigger: "change" }],
hsnr: [{ required: true, message: "请输入会商内容", trigger: "blur" }],
hsbt: [{ required: true, message: "请输入会商标题", trigger: "blur" }],
// glxsmc: [{ required: true, message: "请选择关联线索", trigger: "change" }],
chryList: [{ required: true, message: "请选择参会人员", trigger: "change" }],
});
const formData = ref([
{ label: "会商开始时间", prop: "hskssj", type: "datetime" },
{ label: "会商结束时间", prop: "hsjssj", type: "datetime" },
{ label: "会商内容", prop: "hsnr", type: "textarea", width: "100%" },
// { label: "关联线索", prop: "glxsmc", type: "slot", },
{ label: "会商标题", prop: "hsbt", type: "input" },
// { label: "参会人员", prop: "chryList", type: "slot" ,width:'100%'},
]);
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("");
const outRow = ref({})
// 初始化数据
const init = (type, row, outRowObj = {}) => {
outRow.value = outRowObj
dialogForm.value = true;
title.value = type == "add" ? "新增" : "编辑";
if (row) {
getDataById(row.id)
} else {
listQuery.value = {
hskssj: dayjs().format("YYYY-MM-DD HH:mm:ss"),
hsjssj: dayjs().add(1, "hour").format("YYYY-MM-DD HH:mm:ss"),
}
}
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({ id }, "/mosty-gsxt/wshs/selectByid").then((res) => {
res.rymc = res.chryList ? res.chryList.map(v => v.chryxm).join(",") : '';
res.chryList = res.chryList ? res.chryList.map(item => item.chryid) : [];
roleIds.value = res.chryList;
roleIdsxs.value = res.glxsid ? [res.glxsid] : [];
listQuery.value = res;
});
};
const handleUserSelected = (userData) => {
roleIds.value = userData.map(item => item.id);
listQuery.value.chryList = userData.map(item => item.id)
listQuery.value.rymc = userData.map(item => item.userName).join("、");
};
const choosed = (data) => {
listQuery.value.glxsmc = data[0].xsMc;
listQuery.value.glxsid = data[0].id;
roleIdsxs.value = data.map(item => item.id);
};
// 提交
const submit = () => {
elform.value.submit((data) => {
let url = title.value == "新增" ? "/mosty-gsxt/wshs/add" : "/mosty-gsxt/wshs/update";
let params = {
...data,
glxsid: outRow.value.id,
glxsmc: outRow.value.xsMc,
};
loading.value = true;
qcckPost(params, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
close();
}).catch(() => { loading.value = false; });
});
};
// 关闭
const close = () => {
listQuery.value = {};
roleIds.value = [];
roleIdsxs.value = [];
dialogForm.value = false;
loading.value = false;
};
// 选择参会人员
const openMeetings = ref(false)
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
</style>

View File

@ -0,0 +1,273 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">报告{{ title }} </span>
<div>
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules">
<template #bgnr>
<el-input v-model="listQuery.bgnr" style="width: 100%" placeholder="请输入关键字" class="input-with-select">
<template #append>
<el-button :icon="Search" type="primary">搜索</el-button>
</template>
</el-input>
</template>
<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"
:mode="mode" />
<!-- 编辑器 -->
<Editor :style="`height: 480px; overflow-y: hidden`" v-model="textContent" :defaultConfig="editorConfig"
:mode="mode" @onCreated="handleCreated" @onChange="handChange" />
</div>
<div v-if="outRow.id" style="display: flex; justify-content: center;">
<!-- <el-button style="display: block;" type="primary" @click="ConsultationShow = true">网上会商</el-button> -->
<el-button style="display: block;" type="primary" @click="downloadWithStyles(textContent)">下载</el-button>
</div>
</div>
</div>
<!-- 文字解析 -->
<ExtractionText v-model="showText" @change="getText"></ExtractionText>
<!-- 网上会商 -->
<!-- <Consultation v-model="ConsultationShow" /> -->
</template>
<script setup>
import { Search } from '@element-plus/icons-vue'
import { timeValidate } from '@/utils/tools.js'
import ExtractionText from "@/components/ExtractionText/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import "@wangeditor/editor/dist/css/style.css";
// import Consultation from './consultation.vue'
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue";
import { gsxtYpbgAddEntity, gsxtYpbgEditEntity } from "@/api/huiShangyp/tacticalApi.js"
const emit = defineEmits(["updateDate", 'ok']);
const props = defineProps({
dic: Object,
});
const ConsultationShow = ref(false)
const showText = ref(false);
const textContent = ref()
const { proxy } = getCurrentInstance();
const editorRef = shallowRef();
const dialogForm = ref(false); //弹窗
const mode = "default";
const dataBt = ref(`<p class="html_bt">
<h4 style=\"text-align: center;\"><span style=\"color: rgb(225, 60, 57); font-size: 32px; font-family: 标楷体;\">林芝市公安局情指中心</span></h4>
<h4 style=\"text-align: center;\"><span style=\"color: rgb(225, 60, 57); font-size: 32px; font-family: 标楷体;\">研判专刊(初稿)</span></h4></p>
<p style="text-align: center;"><span style="color: rgb(225, 60, 57); font-size: 22px; font-family: 标楷体;">市公安局情指中心编</span></p>
<p style="text-align: center;"><span style="color: rgb(225, 60, 57); font-size: 22px; font-family: 标楷体;"> ${timeValidate(new Date(), 'td')}</span></p>
<hr/>`)
//编辑器配置
const editorConfig = {
withCredentials: true, //允许跨域
placeholder: props.placeholder, //提示语
MENU_CONF: {
uploadImage: {
// 自定义上传图片
async customUpload(file, insertFn) {
let fileBlob = await compressImage(file);
let fileData = new File([fileBlob], fileBlob.name, { type: fileBlob.type });
if (fileData.size > 2 * 1024 * 1024) {
ElMessage({ message: "图片超过2MB", type: "success" });
} else {
await uploadFn(fileData, insertFn);
}
}
},
uploadVideo: {
// 自定义上传视频
async customUpload(file, insertFn) {
await uploadFn(file, insertFn);
}
}
}
};
//工具配置
const toolbarConfig = {
excludeKeys: ["blockquote", "codeBlock"] //清除不必要的工具,引用和代码块
};
const rules = reactive({
jymc: [
{ required: true, message: "请输入经验名称", trigger: "blur" }
],
fbnr: [
{ required: true, message: "请输入经验内容", trigger: "blur" }
]
});
const formData = ref([
{ label: "报告名称", prop: "bgmc", type: "input", width: "100%", blur: setEditorTextContent },
{ label: "报告内容", prop: "bgnr", type: "slot", width: "100%", blur: setEditorTextContent },
// { label: "附件内容", prop: "fj", type: "slot", width: "100%" },
]);
const listQuery = ref({
bgmc: "",
bgnr: "",
fj: ""
}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("");
/** 外面行数据 */
const outRow = ref({})
// 初始化数据
const init = (type, reportData, row) => {
listQuery.value = {
bgmc: reportData.bgmc,
bgnr: reportData.bgnr,
id: reportData.id,
// fj: reportData.fj
}
outRow.value = { ...row }
dialogForm.value = true;
title.value = type == "add" ? "新增" : "编辑";
setEditorTextContent()
};
const getText = (val, row = {}) => {
listQuery.value.fj = val.text;
setEditorTextContent()
}
function setEditorTextContent() {
let html = dataBt.value;
html += `<p style="text-align: center;"><span style="font-size: 22px;">${listQuery.value.bgmc || ''}</span></p>`
html += `<p>${listQuery.value.fj || ''}</p>`
textContent.value = html
}
// watch(() => listQuery.value, (val) => {
// },
// {
// deep: true, immediate: true
// })
// 提交
const submit = () => {
elform.value.submit((data) => {
// let url = title.value == "新增" ? "/mosty-gsxt/gsxt/jyfx/add" : "/mosty-gsxt/gsxt/jyfx/edit";
let params = {
...data,
ypid: outRow.value.id,
ypmc: outRow.value.ypyt
};
const apiFun = !listQuery.value.id ? gsxtYpbgAddEntity : gsxtYpbgEditEntity
if (!listQuery.value.id) delete params.id
apiFun(params).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("ok");
close();
}).catch(() => {
loading.value = false;
})
});
};
//编辑器创建成功
const handleCreated = (editor) => {
editorRef.value = editor;
};
//内容发生变化
const handChange = (editor) => {
// 判断是否是一个空段落,是空就传空文本
};
onBeforeUnmount(() => {
const editor = editorRef.value;
if (editor) editor.destroy();
});
// 关闭
const close = () => {
listQuery.value = {};
loading.value = false;
dialogForm.value = false;
listQuery.value = {}
};
// 带样式的下载方法
const downloadWithStyles = (textContent) => {
const wordDocument = `
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>富文本导出</title>
<style>
/* 应用两端对齐样式 */
body {
text-align: justify;
text-justify: inter-character; /* 中文文本两端对齐 */
font-family: "Microsoft YaHei", Arial, sans-serif;
}
p {
text-align: justify;
text-justify: inter-character;
}
</style>
</head>
<body>
${textContent}
</body>
</html>
`;
const blob = new Blob([wordDocument], {
type: 'application/msword'
});
saveAs(blob, '战略研判报告.doc');
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.boxlist {
width: 99%;
margin-top: 10px;
}
::v-deep .el-textarea__inner {
min-height: 550px !important;
}
.html_bt>>>p {
color: red;
}
.html_bt {
h4 {
margin: 10px 0 !important;
}
}
.cntBox {
width: 80vw;
margin: 0 auto;
}
</style>

View File

@ -2,12 +2,12 @@
<div> <div>
<div class="titleBox"> <div class="titleBox">
<PageTitle title="战略研判"> <PageTitle title="战略研判">
<!-- <el-button type="primary" @click="getDataById('add', '')"> <el-button type="primary" @click="selfCreateResearch('add')">
<el-icon style="vertical-align: middle"> <el-icon style="vertical-align: middle">
<CirclePlus /> <CirclePlus />
</el-icon> </el-icon>
<span style="vertical-align: middle">新增</span> <span style="vertical-align: middle">自建研判</span>
</el-button> --> </el-button>
</PageTitle> </PageTitle>
</div> </div>
@ -28,7 +28,10 @@
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row }"> <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)">修改</el-link> -->
<el-link size="small" type="danger" @click="getypbgSjzlTjspId(row.id)" >提交申请</el-link>
<el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link> <el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link>
<el-link size="small" type="primary" @click="createReport(row)">{{ row.ypbg?.id ? '编辑' : '创建' }}报告</el-link>
<el-link size="small" type="success" @click="createMeeting(row)">创建会议</el-link>
<el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link> <el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link>
</template> </template>
</MyTable> </MyTable>
@ -38,7 +41,12 @@
}"></Pages> }"></Pages>
</div> </div>
</div> </div>
<AddForm ref="addForm" @getList="getList" :dict="{ D_BZ_YPFS, D_BZ_YPLX }" /> <AddForm ref="addForm" :bglx="bglx" @getList="getList" :dict="{ D_BZ_YPFS, D_BZ_YPLX }" />
<!-- 创建报告 -->
<addReport ref="reportTc" :row="currRow" :dic="{ D_GS_BQ_LX }" @ok="getList" />
<!-- 创建报告 -->
<addMeeting ref="meetingTc" :row="currRow" @updateDate="getList" />
</template> </template>
<script setup> <script setup>
@ -47,12 +55,19 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { tacticalGet, strategicDelete } from "@/api/huiShangyp/strategicApi.js"; import { tacticalGet, strategicDelete } from "@/api/huiShangyp/tacticalApi.js";
import { reactive, ref, onMounted, getCurrentInstance, watch, computed,nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, watch, computed, nextTick } from "vue";
import {ypbgSjzlTjspId} from "@/api/huiShangyp/strategicApi.js"
import addReport from "./addReport.vue";
import AddForm from "./addForm.vue"; import AddForm from "./addForm.vue";
import addMeeting from "./addMeeting.vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_BZ_YPFS, D_BZ_YPLX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX") const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX")
const detailDiloag = ref();
/** 报告弹框 */
const reportTc = ref();
/** 会议弹框 */
const meetingTc = ref();
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -64,10 +79,9 @@ onMounted(() => {
addForm.value && addForm.value.init('edit', { addForm.value && addForm.value.init('edit', {
id: route.query.id id: route.query.id
}); });
router.replace({ path: '/strategicResearch' })// 移除id 避免刷新一直带参数 router.replace({ path: '/tacticalResearch' })// 移除id 避免刷新一直带参数
}) })
} }
getList() getList()
}); });
/** 是否市情报指挥中心 */ /** 是否市情报指挥中心 */
@ -104,8 +118,12 @@ const pageData = reactive({
{ label: "发起部门", prop: "ssbm" }, { label: "发起部门", prop: "ssbm" },
] ]
}); });
const queryFrom = ref({});
const isShowReport = ref(false)
const currRow = ref({})
const queryFrom = ref({});
/** 报告类型 01 战术研判 02 战略研判*/
const bglx = ref('02')
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
const promes = { const promes = {
@ -146,6 +164,7 @@ const tabHeightFn = () => {
tabHeightFn(); tabHeightFn();
}; };
}; };
// const route = useRoute()
const addForm = ref(null) const addForm = ref(null)
const getDataById = (type, row) => { const getDataById = (type, row) => {
@ -168,6 +187,39 @@ const deleteFile = (row) => {
proxy.$message.info('已取消删除'); proxy.$message.info('已取消删除');
}); });
} }
const selfCreateResearch = (type = 'add') => {
addForm.value.init(type, null, '01');
}
/** 创建报告 */
const createReport = (row) => {
const type = !row.id ? 'add' : 'edit'
reportTc.value.init(type, row?.ypbg || {}, row)
// currRow.value = { ...row }
// isShowReport.value = true
}
/** 创建会议 */
const createMeeting = (row) => {
meetingTc.value.init('add', null, row)
// currRow.value = { ...row }
// isShowReport.value = true
}
// 提交研判
const getypbgSjzlTjspId = (id) => {
proxy.$confirm('确定提交研判申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ypbgSjzlTjspId(id).then((res) => {
proxy.$message.success('提交成功');
getList();
})
}).catch(() => {
proxy.$message.info('已取消提交');
});
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -0,0 +1,137 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">创建会议{{ title }} </span>
<div>
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<!-- <template #glxsmc>
<el-input placeholder="请选择关联线索" @click="chooseVisiblexS = true" readonly v-model="listQuery.glxsmc"></el-input>
</template> -->
<template #chryList>
<el-input placeholder="请选择参会人员" @click="openMeetings = true" readonly v-model="listQuery.rymc"></el-input>
</template>
</FormMessage>
</div>
</div>
<Personnel v-model="openMeetings" />
<ChooseUser v-model="chooseVisible" :Single="false" @choosedUsers="handleUserSelected" :roleIds="roleIds" />
<Xslist v-model="chooseVisiblexS" @choosed="choosed" :roleIds="roleIdsxs"></Xslist>
</template>
<script setup>
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue";
// import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import Personnel from '@/views/backOfficeSystem/JudgmentHome/MeetingRoom/components/Communications/personnel.vue'
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, } from "vue";
import dayjs from 'dayjs';
const emit = defineEmits(["updateDate"]);
const roleIds = ref([]); //角色id
const chooseVisible = ref(false);
const roleIdsxs = ref([]); //角色id
const chooseVisiblexS = ref(false);
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
hskssj: [{ required: true, message: "请选择会商开始时间", trigger: "change" }],
hsjssj: [{ required: true, message: "请选择会商结束时间", trigger: "change" }],
hsnr: [{ required: true, message: "请输入会商内容", trigger: "blur" }],
hsbt: [{ required: true, message: "请输入会商标题", trigger: "blur" }],
// glxsmc: [{ required: true, message: "请选择关联线索", trigger: "change" }],
chryList: [{ required: true, message: "请选择参会人员", trigger: "change" }],
});
const formData = ref([
{ label: "会商开始时间", prop: "hskssj", type: "datetime" },
{ label: "会商结束时间", prop: "hsjssj", type: "datetime" },
{ label: "会商内容", prop: "hsnr", type: "textarea", width: "100%" },
// { label: "关联线索", prop: "glxsmc", type: "slot", },
{ label: "会商标题", prop: "hsbt", type: "input" },
// { label: "参会人员", prop: "chryList", type: "slot" ,width:'100%'},
]);
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("");
const outRow = ref({})
// 初始化数据
const init = (type, row, outRowObj = {}) => {
outRow.value = outRowObj
dialogForm.value = true;
title.value = type == "add" ? "新增" : "编辑";
if (row) {
getDataById(row.id)
} else {
listQuery.value = {
hskssj: dayjs().format("YYYY-MM-DD HH:mm:ss"),
hsjssj: dayjs().add(1, "hour").format("YYYY-MM-DD HH:mm:ss"),
}
}
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({ id }, "/mosty-gsxt/wshs/selectByid").then((res) => {
res.rymc = res.chryList ? res.chryList.map(v => v.chryxm).join(",") : '';
res.chryList = res.chryList ? res.chryList.map(item => item.chryid) : [];
roleIds.value = res.chryList;
roleIdsxs.value = res.glxsid ? [res.glxsid] : [];
listQuery.value = res;
});
};
const handleUserSelected = (userData) => {
roleIds.value = userData.map(item => item.id);
listQuery.value.chryList = userData.map(item => item.id)
listQuery.value.rymc = userData.map(item => item.userName).join("、");
};
const choosed = (data) => {
listQuery.value.glxsmc = data[0].xsMc;
listQuery.value.glxsid = data[0].id;
roleIdsxs.value = data.map(item => item.id);
};
// 提交
const submit = () => {
elform.value.submit((data) => {
let url = title.value == "新增" ? "/mosty-gsxt/wshs/add" : "/mosty-gsxt/wshs/update";
let params = {
...data,
glxsid: outRow.value.id,
glxsmc: outRow.value.xsMc,
};
loading.value = true;
qcckPost(params, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
close();
}).catch(() => { loading.value = false; });
});
};
// 关闭
const close = () => {
listQuery.value = {};
roleIds.value = [];
roleIdsxs.value = [];
dialogForm.value = false;
loading.value = false;
};
// 选择参会人员
const openMeetings = ref(false)
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
</style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="dialog" v-if="dialogForm"> <div class="dialog" v-if="dialogForm">
<div class="head_box"> <div class="head_box">
<span class="title">经验分享{{ title }} </span> <span class="title">报告{{ title }} </span>
<div> <div>
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button> <el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button> <el-button size="small" @click="close">关闭</el-button>
@ -9,8 +9,8 @@
</div> </div>
<div class="form_cnt"> <div class="form_cnt">
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules"> <FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules">
<template #ypnr> <template #bgnr>
<el-input v-model="listQuery.ypnr" style="width: 100%" placeholder="请输入关键字" class="input-with-select"> <el-input v-model="listQuery.bgnr" style="width: 100%" placeholder="请输入关键字" class="input-with-select">
<template #append> <template #append>
<el-button :icon="Search" type="primary">搜索</el-button> <el-button :icon="Search" type="primary">搜索</el-button>
</template> </template>
@ -27,7 +27,7 @@
:mode="mode" @onCreated="handleCreated" @onChange="handChange" /> :mode="mode" @onCreated="handleCreated" @onChange="handChange" />
</div> </div>
<div style="display: flex; justify-content: center;"> <div v-if="outRow.id" style="display: flex; justify-content: center;">
<!-- <el-button style="display: block;" type="primary" @click="ConsultationShow = true">网上会商</el-button> --> <!-- <el-button style="display: block;" type="primary" @click="ConsultationShow = true">网上会商</el-button> -->
<el-button style="display: block;" type="primary" @click="downloadWithStyles(textContent)">下载</el-button> <el-button style="display: block;" type="primary" @click="downloadWithStyles(textContent)">下载</el-button>
</div> </div>
@ -49,9 +49,9 @@ import "@wangeditor/editor/dist/css/style.css";
// import Consultation from './consultation.vue' // import Consultation from './consultation.vue'
import { Editor, Toolbar } from "@wangeditor/editor-for-vue"; import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue"; import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, shallowRef, onBeforeUnmount, watch } from "vue";
import { gsxtYpbgAddEntity } from "@/api/huiShangyp/tacticalApi.js" import { gsxtYpbgAddEntity, gsxtYpbgEditEntity } from "@/api/huiShangyp/tacticalApi.js"
const emit = defineEmits(["updateDate"]); const emit = defineEmits(["updateDate", 'ok']);
const props = defineProps({ const props = defineProps({
dic: Object, dic: Object,
}); });
@ -109,50 +109,69 @@ const rules = reactive({
] ]
}); });
const formData = ref([ const formData = ref([
{ label: "研判标题", prop: "ypbt", type: "input", width: "100%" }, { label: "报告名称", prop: "bgmc", type: "input", width: "100%", blur: setEditorTextContent },
{ label: "研判内容", prop: "ypnr", type: "slot", width: "100%" }, { label: "报告内容", prop: "bgnr", type: "slot", width: "100%", blur: setEditorTextContent },
{ label: "附件内容", prop: "fj", type: "slot", width: "100%" }, // { label: "附件内容", prop: "fj", type: "slot", width: "100%" },
]); ]);
const listQuery = ref({ const listQuery = ref({
ypbt: "", bgmc: "",
ypnr: "", bgnr: "",
fj: "" fj: ""
}); //表单 }); //表单
const loading = ref(false); const loading = ref(false);
const elform = ref(); const elform = ref();
const title = ref(""); const title = ref("");
/** 外面行数据 */
const outRow = ref({}) const outRow = ref({})
// 初始化数据 // 初始化数据
const init = (type, row) => { const init = (type, reportData, row) => {
listQuery.value = {
bgmc: reportData.bgmc,
bgnr: reportData.bgnr,
id: reportData.id,
// fj: reportData.fj
}
outRow.value = { ...row }
dialogForm.value = true; dialogForm.value = true;
title.value = type == "add" ? "新增" : "编辑"; title.value = type == "add" ? "新增" : "编辑";
setEditorTextContent()
}; };
const getText = (val, row = {}) => { const getText = (val, row = {}) => {
outRow.value = { ...row }
listQuery.value.fj = val.text; listQuery.value.fj = val.text;
setEditorTextContent()
} }
watch(() => listQuery.value, (val) => {
function setEditorTextContent() {
let html = dataBt.value; let html = dataBt.value;
html += `<p style="text-align: center;"><span style="font-size: 22px;">${val.ypbt || ''}</span></p>`
html += `<p>${val.fj || ''}</p>`
html += `<p style="text-align: center;"><span style="font-size: 22px;">${listQuery.value.bgmc || ''}</span></p>`
html += `<p>${listQuery.value.fj || ''}</p>`
textContent.value = html textContent.value = html
}, }
{
deep: true, immediate: true // watch(() => listQuery.value, (val) => {
})
// },
// {
// deep: true, immediate: true
// })
// 提交 // 提交
const submit = () => { const submit = () => {
elform.value.submit((data) => { elform.value.submit((data) => {
// let url = title.value == "新增" ? "/mosty-gsxt/gsxt/jyfx/add" : "/mosty-gsxt/gsxt/jyfx/edit"; // let url = title.value == "新增" ? "/mosty-gsxt/gsxt/jyfx/add" : "/mosty-gsxt/gsxt/jyfx/edit";
let params = { let params = {
...data, ...data,
ypid: outRow.value.id, ypid: outRow.value.id,
ypmc: outRow.value.ypyt ypmc: outRow.value.ypyt
}; };
gsxtYpbgAddEntity(params).then(() => { const apiFun = !listQuery.value.id ? gsxtYpbgAddEntity : gsxtYpbgEditEntity
if (!listQuery.value.id) delete params.id
apiFun(params).then(() => {
loading.value = false; loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" }); proxy.$message({ type: "success", message: title.value + "成功" });
emit("ok"); emit("ok");
@ -169,7 +188,7 @@ const handleCreated = (editor) => {
//内容发生变化 //内容发生变化
const handChange = (editor) => { const handChange = (editor) => {
// 判断是否是一个空段落,是空就传空文本 // 判断是否是一个空段落,是空就传空文本
console.log(editor.getHtml(), 'editor.getHtml()');
}; };
onBeforeUnmount(() => { onBeforeUnmount(() => {

View File

@ -27,9 +27,11 @@
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row }"> <template #controls="{ row }">
<el-link size="small" type="danger" @click="getypbgSjzlTjspId(row.id)" >提交申请</el-link>
<!-- <el-link size="small" type="primary" @click="getDataById('edit', row)">修改</el-link> --> <!-- <el-link size="small" type="primary" @click="getDataById('edit', row)">修改</el-link> -->
<el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link> <el-link size="small" type="primary" @click="getDataById('detail', row)">详情</el-link>
<el-link size="small" type="primary" @click="createReport(row)">创建报告</el-link> <el-link size="small" type="primary" @click="createReport(row)">{{ row.ypbg?.id ? '编辑' : '创建' }}报告</el-link>
<el-link size="small" type="success" @click="createMeeting(row)">创建会议</el-link>
<el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link> <el-link size="small" type="danger" @click="deleteFile(row)">删除</el-link>
</template> </template>
</MyTable> </MyTable>
@ -43,6 +45,8 @@
<!-- 创建报告 --> <!-- 创建报告 -->
<addReport ref="reportTc" :row="currRow" :dic="{ D_GS_BQ_LX }" @ok="getList" /> <addReport ref="reportTc" :row="currRow" :dic="{ D_GS_BQ_LX }" @ok="getList" />
<!-- 创建报告 -->
<addMeeting ref="meetingTc" :row="currRow" @updateDate="getList" />
</template> </template>
<script setup> <script setup>
@ -51,15 +55,19 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import { tacticalGet, strategicDelete } from "@/api/huiShangyp/tacticalApi.js"; import { tacticalGet, strategicDelete, } from "@/api/huiShangyp/tacticalApi.js";
import {ypbgSjzlTjspId} from "@/api/huiShangyp/strategicApi.js"
import { reactive, ref, onMounted, getCurrentInstance, watch, computed, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, watch, computed, nextTick } from "vue";
import addReport from "./addReport.vue"; import addReport from "./addReport.vue";
import AddForm from "./addForm.vue"; import AddForm from "./addForm.vue";
import addMeeting from "./addMeeting.vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX") const { D_BZ_YPFS, D_BZ_YPLX, D_GS_BQ_LX } = proxy.$dict("D_BZ_YPFS", "D_BZ_YPLX", "D_GS_BQ_LX")
/** 报告弹框 */ /** 报告弹框 */
const reportTc = ref(); const reportTc = ref();
/** 会议弹框 */
const meetingTc = ref();
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -183,13 +191,35 @@ const deleteFile = (row) => {
const selfCreateResearch = (type = 'add') => { const selfCreateResearch = (type = 'add') => {
addForm.value.init(type, null, '01'); addForm.value.init(type, null, '01');
} }
/** 创建报告 */
const createReport = (row) => { const createReport = (row) => {
reportTc.value.init('add',row) const type = !row.id ? 'add' : 'edit'
reportTc.value.init(type, row?.ypbg || {}, row)
// currRow.value = { ...row } // currRow.value = { ...row }
// isShowReport.value = true // isShowReport.value = true
} }
/** 创建会议 */
const createMeeting = (row) => {
meetingTc.value.init('add', null, row)
// currRow.value = { ...row }
// isShowReport.value = true
}
// 提交研判
const getypbgSjzlTjspId = (id) => {
proxy.$confirm('确定提交研判申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ypbgSjzlTjspId(id).then((res) => {
proxy.$message.success('提交成功');
getList();
})
}).catch(() => {
proxy.$message.info('已取消提交');
});
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -76,22 +76,21 @@ const props = defineProps({
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗 const dialogForm = ref(false); //弹窗
const rules = reactive({ const rules = reactive({
xsMc: [{ required: true, message: "请输入线索名称", trigger: "blur" }], qbmc: [{ required: true, message: "请输入线索名称", trigger: "blur" }],
xlLx: [{ required: true, message: "请选择线索类型", trigger: "change" }], qblx: [{ required: true, message: "请选择线索类型", trigger: "change" }],
qbLy: [{ required: true, message: "请选择情报来源", trigger: "change" }],
}); });
const formData = ref([ const formData = ref([
{ prop: "gapdive", type: "slot", width: '100%' }, { prop: "gapdive", type: "slot", width: '100%' },
{ label: "线索名称", prop: "xsMc", type: "input" }, { label: "线索名称", prop: "qbmc", type: "input" },
{ label: "线索类型", prop: "xlLx", type: "select", options: props.dic.D_GS_XS_LX }, { label: "线索类型", prop: "qblx", type: "select", options: props.dic.D_GS_XS_LX },
{ label: "情报来源", prop: "qbLy", type: "select", options: props.dic.D_GS_XS_LY }, // { label: "情报来源", prop: "qbly", type: "select", options: props.dic.D_GS_XS_LY },
{ label: "指向开始时间", prop: "zxkssj", type: "datetime" }, // { label: "指向开始时间", prop: "zxkssj", type: "datetime" },
{ label: "指向结束时间", prop: "zxjssj", type: "datetime" }, // { label: "指向结束时间", prop: "zxjssj", type: "datetime" },
{ label: "指向地点", prop: "zxdz", type: "input" }, { label: "线索地点", prop: "zxdz", type: "input" },
{ label: "所属专题", prop: "sszt", type: "select", options: props.dic.D_BZ_SSZT }, { label: "所属专题", prop: "sszt", type: "select", options: props.dic.D_BZ_SSZT },
{ prop: "gapline", type: "slot", width: '100%' }, { prop: "gapline", type: "slot", width: '100%' },
{ prop: "scfj", type: "slot", width: '100%' }, { prop: "scfj", type: "slot", width: '100%' },
{ label: "线索内容", prop: "xsNr", type: "textarea", width: '100%' }, { label: "线索内容", prop: "qbnr", type: "textarea", width: '100%' },
]); ]);
const fjdz = ref() const fjdz = ref()
const listQuery = ref({}); //表单 const listQuery = ref({}); //表单

View File

@ -0,0 +1,112 @@
<template>
<el-dialog v-model="modelValue" title="线索下发" width="50%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 50vh; overflow: auto;">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" />
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
const { proxy } = getCurrentInstance()
const { D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ } = proxy.$dict('D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ')
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dataList: {
type: Object,
default: () => ({})
}
})
const emit = defineEmits(['update:modelValue', 'getList'])
const elform = ref(null)
const closeDialog = (formEl) => {
emit('update:modelValue', false)
}
const rules = reactive({
glxs: [{ required: true, message: '请输入线索名称', trigger: 'blur' }],
zlbt: [{ required: true, message: '请输入指令标题', trigger: 'blur' }],
zllx: [{ required: true, message: '请选择指令类型', trigger: 'change' }],
zldj: [{ required: true, message: '请选择指令等级', trigger: 'change' }],
xfbmList: [{ required: true, message: '请选择下发部门集合', trigger: 'change' }],
zsdw: [{ required: true, message: '请选择主送单位', trigger: 'change' }],
csdw: [{ required: true, message: '请选择抄送单位', trigger: 'change' }],
zlnr: [{ required: true, message: '请输入指令内容', trigger: 'blur' }],
})
const listQuery = ref({})
const formData = ref(
[
{ label: "线索名称", prop: "glxs", type: "input" },
{ label: "指令标题", prop: "zlbt", type: "input" },
{ label: "指令类型", prop: "zllx", type: "select", options: D_GS_XS_ZLLX },
{ label: "指令等级", prop: "zldj", type: "select", options: D_GS_ZDQT_FXDJ },
{ label: "指令联系人", prop: "zllxr", type: "input" },
{ label: "指令联系电话", prop: "zllxdh", type: "input" },
{ label: "指令结束时间", prop: "jssj", type: "datetime" },
{ label: "下发部门集合", depMc: 'xfbmListMc', prop: "xfbmList", type: "department", width: "90%", multiple: true },
{ label: "主送单位", prop: "zsdw", type: "department" },
{ label: "抄送单位", prop: "csdw", type: "department" },
{ label: "指令内容", prop: "zlnr", type: "textarea", width: "90%" },
{ label: "附件地址", prop: "fjzd", type: "upload", width: "90%" },
]
)
watch(() => props.modelValue, (newVal, oldVal) => {
if (newVal) {
listQuery.value.xsid = props.dataList.id
listQuery.value.glxsid = props.dataList.id
listQuery.value.glxs = props.dataList.qbmc
}
}, { deep: true })
const submitForm = (formEl) => {
console.log(listQuery.value);
elform.value.submit((valid) => {
if (valid) {
const params = {
...listQuery.value,
fjzd:listQuery.value.fjzd? listQuery.value.fjzd.join(',') : '',
xfbmList: listQuery.value.xfbmList.map((item, index) => {
return {
ssbm: listQuery.value.xfbmListMc[index],
ssbmdm: item,
}
}),
}
qcckPost(params, '/mosty-gsxt/qbcj/xfxs').then((res) => {
proxy.$message({ type: "success", message: "下发成功" });
emit('update:modelValue', false)
// closeDialog(formEl);
}).catch(() => {
proxy.$message({ type: "error", message: "新增失败" });
});
console.log(params);
// emit('getList', listQuery)
// closeDialog(formEl)
} else {
console.log('校验失败');
}
})
// formEl.validate((valid) => {
// if (valid) {
// emit('getList', listQuery)
// closeDialog(formEl)
// } else {
// console.log('校验失败');
// }
// })
}
</script>
<style scoped></style>

View File

@ -3,105 +3,68 @@
<div class="titleBox"> <div class="titleBox">
<PageTitle title="线索数据采集"> <PageTitle title="线索数据采集">
<el-button type="primary" @click="addEdit('add', null)"> <el-button type="primary" @click="addEdit('add', null)">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon> <el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span> <span style="vertical-align: middle">新增</span>
</el-button> </el-button>
<el-button type="danger"> <el-button type="danger" @click="plDelDictItem">
<el-icon style="vertical-align: middle"><Dete /></el-icon> <el-icon style="vertical-align: middle">
<Dete />
</el-icon>
<span style="vertical-align: middle">批量删除</span> <span style="vertical-align: middle">批量删除</span>
</el-button> </el-button>
</PageTitle> </PageTitle>
</div> </div>
<!-- 搜索 --> <!-- 搜索 -->
<div ref="searchBox"> <div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"/> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
</div> </div>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox"> <div class="tabBox">
<MyTable <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:tableData="pageData.tableData" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:tableColumn="pageData.tableColumn" @chooseData="chooseData">
:tableHeight="pageData.tableHeight" <template #qblx="{ row }">
:key="pageData.keyCount" <DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" />
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth">
<template #xlLx="{row}">
<DictTag :tag="false" :value="row.xlLx" :options="D_GS_XS_LX" />
</template> </template>
<template #qbLy="{row}"> <template #cjLx="{ row }">
<DictTag :tag="false" :value="row.qbLy" :options="D_GS_XS_LY" /> <DictTag :tag="false" :value="row.cjLx" :options="D_GS_XS_LY" />
</template> </template>
<template #czzt="{row}"> <template #czzt="{ row }">
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" /> <DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_XSCZZT" />
</template> </template>
<template #zxkssj="{row}">
<span>{{ row.zxkssj }}</span> <template #shzt="{ row }">
<span>{{ row.zxjssj }}</span>
</template>
<template #shzt="{row}">
<!-- 采纳将这条信息推送到情报管理,退回 --> <!-- 采纳将这条信息推送到情报管理,退回 -->
<DictTag :tag="false" :value="row.shzt" :options="D_BZ_XSSHZT" @clickTag="clickTag(row.shzt)" /> <DictTag :tag="false" :value="row.shzt" :options="D_BZ_XSSHZT" @clickTag="clickTag(row.shzt)" />
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row }"> <template #controls="{ row }">
<template v-if="row.shzt === '0'"> <el-link size="small" type="primary" @click="addEdit('info', row)">详情</el-link>
<template v-if="!row.gzlid">
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click.stop="createProcess(row)">审核</el-link>
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
</template> </template>
<el-link size="small" type="warning" @click="openXsxf( row)">线索下发</el-link>
<!-- <el-popover placement="left" :visible="row.visible" :width="400" trigger="click">
<template #reference>
<el-link size="small" type="primary" @click.stop="handleSh(row)">审核</el-link>
</template>
<div class="flex mb10 align-center">
<div class="w70 label-pop">审核状态 :</div>
<div style="flex:1">
<el-radio-group v-model="chooseRow.shzt" @change="rules.bhyy = false">
<el-radio v-for="obj in D_BZ_XSSHZT" :key="obj.value" :label="obj.value" >{{ obj.zdmc }}</el-radio>
</el-radio-group>
</div>
</div>
<div class="flex" v-if=" chooseRow.shzt == '01'">
<div class="w70 label-pop">驳回原因 :</div>
<div style="flex:1">
<MOSTY.Other filterable style="width: 100%;" v-model="chooseRow.bhyy" type="textarea" rows="3" clearable placeholder="请输入审核原因"/>
<div class="f12" style="color: red;" v-if="rules.bhyy">请输入驳回原因</div>
</div>
</div>
<div class="mt10 flex just-center">
<el-button size="small" @click.stop="cancel(row)">取消</el-button>
<el-button size="small" type="primary" @click.stop="handleSumbit(row)">确定</el-button>
</div>
</el-popover> -->
<template v-if="!row.gzlid">
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click.stop="createProcess(row)">审核</el-link>
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
</template>
<el-link size="small" type="danger" @click="addEdit('info', row)">详情</el-link>
<!-- 续报 == 编辑 -->
<el-link size="small" type="warning" @click="addEdit('edit', row)">续报</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@changeNo="changeNo" ...pageData.pageConfiger,
@changeSize="changeSize" total: pageData.total
:tableHeight="pageData.tableHeight" }"></Pages>
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div> </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}" /> <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 }" />
</div> </div>
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '线索数据采集审批', flowType: 'XSSJCJSP',modelName:'线索' }" <SubmissionProcess v-model="showSp" :data="rowData"
:path="fixedValue" @getList="getList" /> :userData="{ ajmc: '线索数据采集审批', flowType: 'XSSJCJSP', modelName: '线索' }" :path="fixedValue" @getList="getList" />
<Xsxf v-model="xsxfShow" :dataList="rowData"/>
</template> </template>
<script setup> <script setup>
import * as MOSTY from "@/components/MyComponents/index";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -111,27 +74,20 @@ import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import Xsxf from "./components/xsxf.vue";
const router = useRouter(); const router = useRouter();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const {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_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_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(); const detailDiloag = ref();
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const isShow = ref(false) const isShow = ref(false)
const searchConfiger = ref([ const searchConfiger = ref([
{ label: "线索名称", prop: 'xsMc', placeholder: "请输入线索名称", showType: "input" }, { label: "线索名称", prop: 'qbmc', placeholder: "请输入线索名称", showType: "input" },
{ label: "内容关键字", prop: 'xsNr', placeholder: "请输入语义关键字", showType: "input" }, { label: "内容关键字", prop: 'qbnr', placeholder: "请输入语义关键字", showType: "input" },
{ label: "线索类型", prop: 'xlLx', placeholder: "请选择线索类型", showType: "select",options:D_GS_XS_LX }, { label: "线索类型", prop: 'qblx', placeholder: "请选择线索类型", showType: "select", options: D_GS_XS_LX },
{ label: "线索来源", prop: 'qbLy', placeholder: "请选择线索来源", showType: "select",options:D_GS_XS_LY }, { label: "线索来源", prop: 'cjLx', placeholder: "请选择线索来源", showType: "select", options: D_GS_XS_LY },
{ label: "开始时间", prop: 'kssj', placeholder: "请选择开始时间", showType: "datetime" },
{ label: "结束时间", prop: 'jssj', placeholder: "请选择结束时间", showType: "datetime" },
{ label: "指向地点", prop: 'zxdz', placeholder: "请输入指向地点", showType: "input" },
]); ]);
const chooseRow = ref({})
const rules = reactive({
bhyy:false,
shzt: false,
})
const pageData = reactive({ const pageData = reactive({
tableData: [], tableData: [],
keyCount: 0, keyCount: 0,
@ -145,18 +101,16 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, },
controlsWidth: 220, controlsWidth: 250,
tableColumn: [ tableColumn: [
{ label: "线索编号", prop: "xsBh" }, { label: "线索编号", prop: "xsBh" },
{ label: "线索名称", prop: "xsMc" }, { label: "线索名称", prop: "qbmc" },
{ label: "线索类型", prop: "xlLx",showSolt:true }, { label: "线索类型", prop: "qblx", showSolt: true },
{ label: "线索来源", prop: "qbLy",showSolt:true }, { label: "线索来源", prop: "cjLx", showSolt: true },
{ label: "指向时间", prop: "zxkssj",showSolt:true,showOverflowTooltip:true }, { label: "上报时间", prop: "sxsbsj", showOverflowTooltip: true },
{ label: "上报时间", prop: "sxsbsj",showOverflowTooltip:true }, { label: "线索地点", prop: "zxdz" },
{ label: "指向地点", prop: "zxdz" }, { label: "线索内容", prop: "qbnr" },
{ label: "线索内容", prop: "xsNr"}, { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "处置状态", prop: "czzt",showSolt: true},
{ label: "附件", prop: "fjdz", showSolt: true },
{ label: "审核状态", prop: "shzt", showSolt: true }, { label: "审核状态", prop: "shzt", showSolt: true },
] ]
}); });
@ -168,74 +122,67 @@ onMounted(() => {
tabHeightFn(); tabHeightFn();
}); });
const handleSh = (val) =>{
chooseRow.value = {id:val.id,shzt:'01'}
val.visible = !val.visible;
}
const cancel = (row) =>{
row.visible = false;
rules.bhyy = false;
chooseRow.value = {}
}
const handleSumbit = (row) =>{
rules.bhyy = !chooseRow.value.bhyy ? true :false;
if(chooseRow.value.shzt == '01' && rules.bhyy) return false;
let data = { ...chooseRow.value }
qcckPost(data,'/mosty-gsxt/qbcj/updateByXssh').then(res=>{
row.visible = false;
proxy.$message({ type: "success", message: "审核成功" });
getList();
})
}
// 搜索 // 搜索
const onSearch = (val) =>{ const onSearch = (val) => {
queryFrom.value = {...val} queryFrom.value = { ...val }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
} }
const changeNo = (val) =>{ const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
getList() getList()
} }
const changeSize = (val) =>{ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
getList() getList()
} }
// 获取列表 // 获取列表
const getList = () =>{ const getList = () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value,cjLx:'0' }; let data = { ...pageData.pageConfiger, ...queryFrom.value, cjLx: '0' };
qcckGet(data,'/mosty-gsxt/qbcj/selectPage').then(res=>{ qcckGet(data, '/mosty-gsxt/qbcj/selectPage').then(res => {
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
pageData.total = res.total; pageData.total = res.total;
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
}).catch(()=>{ pageData.tableConfiger.loading = false; }) }).catch(() => { pageData.tableConfiger.loading = false; })
} }
// 删除 // 删除
const delDictItem = (id) =>{ const delDictItem = (id) => {
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => { proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckPost({id},'/mosty-gsxt/qbcj/delete').then(()=>{ qcckPost({ id }, '/mosty-gsxt/qbcj/delete').then(() => {
proxy.$message({ type: "success", message: "删除成功" }); proxy.$message({ type: "success", message: "删除成功" });
getList(); getList();
}) })
}).catch(() => {}); }).catch(() => { });
}
const ids = ref()
const chooseData = (val) => {
ids.value = val.map(item => item.id)
}
const plDelDictItem = () => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckPost({ ids: ids.value }, '/mosty-gsxt/qbcj/deletes').then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
})
}).catch(() => { });
} }
// 详情 // 详情
const addEdit = (type, row) => { const addEdit = (type, row) => {
isShow.value = true; isShow.value = true;
setTimeout(()=>{ setTimeout(() => {
detailDiloag.value.init(type, row); detailDiloag.value.init(type, row);
},500) }, 500)
}; };
const clickTag = (val) =>{ const clickTag = (val) => {
if(val == '02') router.push('/IntelligenceManagement'); if (val == '02') router.push('/IntelligenceManagement');
} }
// 表格高度计算 // 表格高度计算
@ -251,21 +198,32 @@ const showSp = ref(false);
const rowData = ref() const rowData = ref()
// 固定值 // 固定值
const fixedValue = { const fixedValue = {
clueVerification:'clueVerification', clueVerification: 'clueVerification',
byMeansOf: 'qbcj/callback', byMeansOf: 'qbcj/callback',
nobyMeansOf: 'qbcj/callback', nobyMeansOf: 'qbcj/callback',
recycle:'qbcj/callback', recycle: 'qbcj/callback',
} }
const createProcess = (row) => { const createProcess = (row) => {
showSp.value = true; showSp.value = true;
rowData.value = row rowData.value = row
} }
// 线索下发
const xsxfShow = ref(false)
const openXsxf = (row) => {
xsxfShow.value = true
rowData.value = {...row}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.label-pop{ .label-pop {
position: relative; position: relative;
&::before{
&::before {
position: absolute; position: absolute;
content: '*'; content: '*';
top: 0; top: 0;
@ -279,4 +237,3 @@ const createProcess = (row) => {
background: rgba(0, 0, 0, 0.5) !important; background: rgba(0, 0, 0, 0.5) !important;
} }
</style> </style>

View File

@ -3,19 +3,43 @@
<div class="head_box"> <div class="head_box">
<span class="title">指令{{ title }} </span> <span class="title">指令{{ title }} </span>
<div> <div>
<el-button type="primary" size="small" :loading="loading" @click="submit" >保存</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> <el-button size="small" @click="close">关闭</el-button>
</div> </div>
</div> </div>
<div class="form_cnt"> <div class="form_cnt flex-between">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules"> <div class="main-content" :class="{ 'content-with-timeline': title == '详情' }">
<template #glxsid> <FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" :disabled="title == '详情'">
<div class="box pointer ellipsis" @click="chooseVisible = true"> <template #glxsid>
<span v-if="listQuery.glxs">{{ listQuery.glxs }}</span> <div class="box pointer ellipsis" @click="chooseVisible = true">
<span v-else style="color: #b8b8b8;">请选择关联线索</span> <span v-if="listQuery.glxs">{{ listQuery.glxs }}</span>
</div> <span v-else class="placeholder-text">请选择关联线索</span>
</template> </div>
</FormMessage> </template>
</FormMessage>
</div>
<div v-if="title == '详情'" class="timeline-container">
<el-timeline class="timeline-wrapper" v-if="listQuery.czlcList.length > 0">
<el-timeline-item placement="top" v-for="(activity, index) in listQuery.czlcList" :key="index"
:timestamp="activity.czsj" :color="activity.czlx == '01' ? '#409eff' : '#67c23a'" size="large">
<div class="timeline-content" :class="activity.czlx == '01' ? 'sign-type' : 'feedback-type'">
<div class="content-item">
<span class="label">处置部门</span>
<span class="value">{{ activity.ssbm }}</span>
</div>
<div class="content-item">
<span class="label">处置状态</span>
<span class="value status">{{ activity.czlx == '01' ? '签收' : '反馈' }}</span>
</div>
<div class="content-item">
<span class="label">处置内容</span>
<span class="value content">{{ activity.fknr }}</span>
</div>
</div>
</el-timeline-item>
</el-timeline>
<el-empty description="暂无处置记录" v-else />
</div>
</div> </div>
<!-- 选择线索 --> <!-- 选择线索 -->
<Xslist v-model="chooseVisible" @choosed="choosed" :roleIds="roleIds"></Xslist> <Xslist v-model="chooseVisible" @choosed="choosed" :roleIds="roleIds"></Xslist>
@ -26,7 +50,6 @@
import Xslist from '@/components/ChooseList/ChooseXs/index.vue' import Xslist from '@/components/ChooseList/ChooseXs/index.vue'
import FormMessage from '@/components/aboutTable/FormMessage.vue' import FormMessage from '@/components/aboutTable/FormMessage.vue'
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js"; import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import * as rule from "@/utils/rules.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick } from "vue"; import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick } from "vue";
const emit = defineEmits(["updateDate"]); const emit = defineEmits(["updateDate"]);
const props = defineProps({ const props = defineProps({
@ -38,16 +61,16 @@ const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗 const dialogForm = ref(false); //弹窗
const formData = ref([ const formData = ref([
{ label: "指令标题", prop: "zlbt", type: "input", }, { label: "指令标题", prop: "zlbt", type: "input", },
{ label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX }, { label: "指令类型", prop: "zllx", type: "select", options: props.dic.D_GS_XS_ZLLX },
{ label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ }, { label: "指令等级", prop: "zldj", type: "select", options: props.dic.D_GS_ZDQT_FXDJ },
{ label: "反馈结束时间", prop: "jssj", type: "datetime" }, { label: "反馈结束时间", prop: "jssj", type: "datetime" },
{ label: "联系人", prop: "zllxr", type: "input" }, { label: "联系人", prop: "zllxr", type: "input" },
{ label: "联系电话", prop: "zllxdh", type: "input" }, { label: "联系电话", prop: "zllxdh", type: "input" },
{ label: "关联线索", prop: "glxsid", type: "slot" }, { label: "关联线索", prop: "glxsid", type: "slot" },
{ label: "主送单位", prop: "zsdw", type: "department" }, { label: "主送单位", prop: "zsdw", type: "department" },
{ label: "抄送单位", prop: "csdw", type: "department" }, { label: "抄送单位", prop: "csdw", type: "department" },
{ label: "指令内容", prop: "zlnr", type: "textarea",width: '100%' }, { label: "指令内容", prop: "zlnr", type: "textarea", width: '100%' },
{ label: "附件", prop: "fjzd", type: "upload",width: '100%' }, { label: "附件", prop: "fjzd", type: "upload", width: '100%' },
]); ]);
const listQuery = ref({}); //表单 const listQuery = ref({}); //表单
const loading = ref(false); const loading = ref(false);
@ -69,14 +92,18 @@ const rules = reactive({
const init = (type, row,) => { const init = (type, row,) => {
listQuery.value.fjzd = null listQuery.value.fjzd = null
dialogForm.value = true; dialogForm.value = true;
title.value = type == 'add' ? "新增" : "编辑"; title.value = type == 'add' ? '新增' : type == 'info' ? '详情' : '编辑';
if (row) getDataById(row.id); if (row) getDataById(row.id);
}; };
// 根据id查询详情 // 根据id查询详情
const getDataById = (id) => { const getDataById = (id) => {
qcckGet({id}, '/mosty-gsxt/zlxx/selectByid').then((res) => { qcckGet({ id }, '/mosty-gsxt/zlxx/selectByid').then((res) => {
res.fjzd = res.fjzd ? res.fjzd.split(','):[]; res.fjzd = res.fjzd ? res.fjzd.split(',') : [];
listQuery.value = res; listQuery.value = {
...res,
czlcList: res.czlcList ? res.czlcList.reverse() : []
};
}); });
}; };
@ -84,22 +111,22 @@ const getDataById = (id) => {
const choosed = (val) => { const choosed = (val) => {
listQuery.value.glxs = val[0].xsMc; listQuery.value.glxs = val[0].xsMc;
listQuery.value.glxsid = val[0].id; listQuery.value.glxsid = val[0].id;
roleIds.value = val.map(v=>v.id) roleIds.value = val.map(v => v.id)
} }
// 提交 // 提交
const submit = () => { const submit = () => {
elform.value.submit((data)=>{ elform.value.submit((data) => {
let url = title.value == "新增" ? '/mosty-gsxt/zlxx/add':'/mosty-gsxt/zlxx/update'; let url = title.value == "新增" ? '/mosty-gsxt/zlxx/add' : '/mosty-gsxt/zlxx/update';
let params = { ...data } let params = { ...data }
loading.value = true; loading.value = true;
params.fjzd = params.fjzd ? params.fjzd.join(','):'' params.fjzd = params.fjzd ? params.fjzd.join(',') : ''
qcckPost(params, url).then((res) => { qcckPost(params, url).then((res) => {
loading.value = false; loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" }); proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate"); emit("updateDate");
close(); close();
}).catch(() => {loading.value = false;}); }).catch(() => { loading.value = false; });
}); });
}; };
@ -115,11 +142,115 @@ defineExpose({ init });
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/assets/css/layout.scss"; @import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss"; @import "~@/assets/css/element-plus.scss";
.box{
.box {
width: 100%; width: 100%;
height: 32px; height: 32px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #e9e9e9; border: 1px solid #e9e9e9;
padding-left: 10px; padding-left: 10px;
} }
// 新增类样式
.flex-between {
display: flex;
justify-content: space-between;
}
.main-content {
margin-right: 10px;
width: 100%;
}
.content-with-timeline {
width: 80%;
}
.placeholder-text {
color: #b8b8b8;
}
.timeline-container {
width: 18%;
}
.timeline-wrapper {
max-width: 100%;
padding: 10px;
background-color: #f5f7fa;
border-radius: 8px;
}
// 时间线样式优化
.el-timeline {
.el-timeline-item {
&::before {
height: calc(100% - 20px); // 调整时间线高度
}
.el-timeline-item__content {
min-height: 80px; // 确保内容区域有足够空间
}
.el-timeline-item__timestamp {
font-size: 12px;
color: #909399;
margin-bottom: 8px;
}
}
}
.timeline-content {
padding: 12px;
background-color: white;
border-radius: 6px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
border-left: 3px solid transparent;
&.sign-type {
border-left-color: #409eff;
.status {
color: #409eff;
}
}
&.feedback-type {
border-left-color: #67c23a;
.status {
color: #67c23a;
}
}
}
.content-item {
margin-bottom: 6px;
line-height: 1.5;
&:last-child {
margin-bottom: 0;
}
}
.label {
font-weight: 500;
color: #303133;
margin-right: 5px;
}
.value {
color: #606266;
&.status {
font-weight: 500;
}
&.content {
// display: block;
// margin-top: 5px;
// word-break: break-all;
// white-space: pre-wrap;
}
}
</style> </style>

View File

@ -0,0 +1,78 @@
<template>
<el-dialog v-model="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>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitForm">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
const { proxy } = getCurrentInstance()
const { D_GS_XS_ZLLX, D_GS_ZDQT_FXDJ } = proxy.$dict('D_GS_XS_ZLLX', 'D_GS_ZDQT_FXDJ')
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dataList: {
type: Object,
default: () => ({})
}
})
const emit = defineEmits(['update:modelValue', 'getList'])
const elform = ref(null)
const closeDialog = (formEl) => {
elform.value.reset()
emit('update:modelValue', false)
}
const rules = reactive({
fknr: [{ required: true, message: '请输入反馈内容', trigger: 'blur' }],
})
const listQuery = ref({})
const formData = ref(
[
{ label: "反馈内容", prop: "fknr", type: "textarea" ,width:'90%'},
]
)
watch(() => props.modelValue, (newVal, oldVal) => {
if (newVal) {
listQuery.value.zlxxid = props.dataList.id
}
}, { deep: true })
const submitForm = (formEl) => {
console.log(listQuery.value);
elform.value.submit((valid) => {
if (valid) {
const params = {
...listQuery.value,
}
qcckPost(params, '/mosty-gsxt/zlxx/fk').then((res) => {
proxy.$message({ type: "success", message: "反馈成功" });
emit('getList')
closeDialog()
}).catch(() => {
proxy.$message({ type: "error", message: "反馈失败" });
});
console.log(params);
} else {
console.log('校验失败');
}
})
}
</script>
<style scoped></style>

View File

@ -31,9 +31,18 @@
</template> </template>
<template #czzt="{row}"> <template #czzt="{row}">
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" /> <DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" />
</template>
<template #sffk="{row}">
{{ row.sffk == '1' ? '已反馈' : '未反馈' }}
</template>
<template #sfqs="{row}">
{{ row.sfqs == '0' ? '未签收' : '已签收' }}
</template> </template>
<template #controls="{ row }"> <template #controls="{ row }">
<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)">编辑</el-link> <el-link size="small" type="primary" @click="addEdit('edit', 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)">删除</el-link> <el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
</template> </template>
</MyTable> </MyTable>
@ -50,6 +59,7 @@
<!-- 详情 --> <!-- 详情 -->
<DetailForm ref="detailDiloag" v-if="isShow" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" /> <DetailForm ref="detailDiloag" v-if="isShow" @updateDate="getList" :dic="{D_GS_XS_ZLLX,D_GS_ZDQT_FXDJ}" />
</div> </div>
<Fk v-model="isShowFk" :dataList="dataList" @getList="getList"/>
</template> </template>
<script setup> <script setup>
@ -58,6 +68,7 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/detailForm.vue"; import DetailForm from "./components/detailForm.vue";
import Fk from "./components/fk.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js"; import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
@ -87,13 +98,15 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, },
controlsWidth: 120, controlsWidth: 240,
tableColumn: [ tableColumn: [
{ label: '指令标题', prop: 'zlbt' }, { label: '指令标题', prop: 'zlbt' },
{ label: '指令类型', prop: 'zllx',showSolt:true }, { label: '指令类型', prop: 'zllx',showSolt:true },
{ label: '指令等级', prop: 'zldj',showSolt:true }, { label: '指令等级', prop: 'zldj',showSolt:true },
{ label: '反馈截止时间', prop: 'jssj' }, { label: '反馈截止时间', prop: 'jssj' },
{ label: '处置状态', prop: 'czzt',showSolt:true }, { label: '处置状态', prop: 'czzt', showSolt: true },
{ label: '是否反馈', prop: 'sffk', showSolt: true },
{ label: '是否签收', prop: 'sfqs', showSolt: true },
] ]
}); });
@ -150,7 +163,27 @@ const addEdit = (type, row) => {
detailDiloag.value.init(type, row); detailDiloag.value.init(type, row);
}) })
}; };
// 签收
const signRow = (row) =>{
proxy.$confirm("确定要签收", "警告", {type: "warning"}).then(() => {
qcckGet({id:row.id},'/mosty-gsxt/zlxx/qs').then(()=>{
proxy.$message({ type: "success", message: "签收成功" });
getList();
})
}).catch(() => {});
}
// 反馈
const isShowFk = ref(false)
const dataList = ref()
const fkRow = (row) => {
if (row.sfqs=='0') {
proxy.$message({ type: "error", message: "请先签收" });
return;
}
isShowFk.value = true;
dataList.value = {...row};
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250; pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;

View File

@ -36,7 +36,7 @@
<template #default="{ row }"> <template #default="{ row }">
<div class="status-badge" :class="{ online: row.online }"> <div class="status-badge" :class="{ online: row.online }">
<div class="status-dot"></div> <div class="status-dot"></div>
<span>{{ row.online ? '在线' : '离线' }}</span> <span>{{ row.sfzx == '1' ? '在线' : '离线' }}</span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -113,14 +113,14 @@ const fetchData = async () => {
} }
const res = await getMonitorList(params) || {} const res = await getMonitorList(params) || {}
// 通道是否在线0 不在线 、1 在线 // 通道是否在线0 不在线 、1 在线
const onlineStatus = { // const onlineStatus = {
0: '不在线', // '0': '离线',
1: '在线' // '1': '在线'
} // }
// 处理数据,添加在线状态 // 处理数据,添加在线状态
data.value = (res || []).map(item => ({ data.value = (res || []).map(item => ({
...item, ...item,
online: onlineStatus[item.sfzx] online: item.sfzx == '1' ? 1 : 0
})) }))
} catch (error) { } catch (error) {
ElMessage.error(`获取${props.title}数据失败`) ElMessage.error(`获取${props.title}数据失败`)
@ -137,7 +137,7 @@ const total = ref(0)
// 获取表格行类名 // 获取表格行类名
const getRowClassName = ({ row }) => { const getRowClassName = ({ row }) => {
return row.online == 1 ? 'online-row' : 'offline-row' return row.online == '1' ? 'online-row' : 'offline-row'
} }
// 刷新处理 // 刷新处理

View File

@ -0,0 +1,118 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">积分系数规则{{ title }} </span>
<div>
<el-button type="primary" size="small" :loading="loading" @click="submit" >保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
</FormMessage>
</div>
</div>
</template>
<script setup>
import DialogList from '@/views/backOfficeSystem/fourColorManage/components/dialogList.vue'
import FormMessage from '@/components/aboutTable/FormMessage.vue'
import {sjxsglAddEntity ,sjxsglEditEntity,sjxsgId} from '@/api/sjxsgl.js'
import { ref,defineProps, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance } from "vue";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
type:String,
dic:Object,
});
const showDialog = ref(false); //弹窗
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("");
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const formData = reactive([
{ label: "系数名称", prop: "mc", type: "input" },
{ label: "衰减比列", prop: "sjbl", type: "number", max: 100,step:0.1 },
{ label: "计算规则", prop: "jsgz", type: "textarea" ,width:'100%'},
]);
const rules = reactive({
mc: [{ required: true, message: "请输入系数名称", trigger: "blur" }],
sjbl: [{ required: true, message: "请输入衰减比列", trigger: "blur" }],
jsgz: [{ required: true, message: "请输入计算规则", trigger: ['blur','change'] }],
});
// 初始化数据
const init = (type, row,) => {
title.value = type == 'add' ? "新增" : "编辑";
dialogForm.value = true;
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
sjxsgId(id).then((res) => {
listQuery.value = res;
});
};
// 提交
const submit = () => {
console.log("xxxxxxxx");
elform.value.submit((data) => {
const promes = {
...data
}
console.log(promes);
if ( title.value == "新增" ) {
sjxsglAddEntity(promes).then((res) => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
loading.value = false;
close();
}).catch(() => {loading.value = false;});
} else {
sjxsglEditEntity(promes).then((res) => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("updateDate");
loading.value = false;
close();
}).catch(() => {loading.value = false;});
}
// let url = title.value == "新增" ? '/mosty-gsxt/tbGsxtBqgl/save':'/mosty-gsxt/tbGsxtBqgl/update';
// let params = { ...data, bqLb:props.dic.D_GS_BQ_LB.find((it)=>it.zdmc == props.type).dm }
// params.bqLx = '01';
// loading.value = true;
// qcckPost(params, url).then((res) => {
// proxy.$message({ type: "success", message: title.value + "成功" });
// emit("updateDate");
// loading.value = false;
// close();
// }).catch(() => {loading.value = false;});
});
};
// 选择的数据
const chooseDate = (val) => {
listQuery.value.bqDlId = val[0].id;
listQuery.value.bqDlMc = val[0].bqMc;
}
// 关闭
const close = () => {
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
if(props.type == '标签细类') formData.pop()
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
</style>

View File

@ -0,0 +1,149 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="积分系数配置">
<el-button type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<span style="vertical-align: middle">新增</span>
</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<!-- 表格 -->
<div class="tabBox" :style="{height:pageData.tableHeight+20+'px'}">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" @click="delDictItem(row.id)" type="danger">删除</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div>
<!-- 编辑详情 -->
<EditAddForm v-if="show" ref="detailDiloag" :type="type" :dic="{D_GS_BQ_LX,D_GS_BQ_DJ,D_GS_SSYJ,D_GS_BQ_LB}" @updateDate="getList" />
</div>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import EditAddForm from "./components/editAddForm.vue";
import {sjxsglDeleteEntity ,sjxsglGetPageList} from '@/api/sjxsgl.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } 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 detailDiloag = ref();
const searchBox = ref(); //搜索框
const type = ref('标签大类')
const show = ref(false)
const searchConfiger = ref([
{ label: "计算规则",prop:'jsgz',placeholder: "请输入计算规则", showType: "input"},
{ label: "系数名称",prop:'mc' ,placeholder: "请输入系数名称", showType: "input"},
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 150, //操作栏宽度
tableColumn: [
{ label: "系数名称", prop: "mc" },
{ label: "衰减比列", prop: "sjbl" },
{ label: "计算规则", prop: "jsgz"},
]
});
onMounted(() => {
getList()
tabHeightFn();
});
// 搜索
const onSearch = (val) =>{
queryFrom.value = {...val}
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 };
data.bqLb = type.value == '标签大类'? '01':'02'
sjxsglGetPageList(data).then(res=>{
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(()=>{ pageData.tableConfiger.loading = false; })
}
// 删除
const delDictItem = (id) =>{
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => {
sjxsglDeleteEntity({ids:[id]}).then(()=>{
proxy.$message({ type: "success", message: "删除成功" });
getList();
})
}).catch(() => {});
}
// 新增
const addEdit = (type, row) => {
show.value = true;
nextTick(()=>{
detailDiloag.value.init(type, row);
})
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () { tabHeightFn(); };
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -12,7 +12,9 @@
<span style="vertical-align: middle">导入</span> <span style="vertical-align: middle">导入</span>
</el-button> --> </el-button> -->
<el-button type="primary" @click="addEdit('add', '')"> <el-button type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon> <el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">新增</span> <span style="vertical-align: middle">新增</span>
</el-button> </el-button>
</PageTitle> </PageTitle>
@ -23,38 +25,31 @@
</div> </div>
<!-- 表格 --> <!-- 表格 -->
<div class="tabBox"> <div class="tabBox">
<MyTable <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:tableData="pageData.tableData" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<template #bqYs="{ row }"> <template #bqYs="{ row }">
<DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" /> <DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" />
</template> </template>
<template #bqDj="{ row }"> <template #bqDj="{ row }">
<DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" /> <DictTag :tag="false" :value="row.bqDj" :options="D_GS_BQ_DJ" />
</template> </template>
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="primary" @click="addEdit('edit', row)">编辑</el-link> <el-link type="primary" @click="chooseJfFun(row)">配置系统</el-link>
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link> <el-link type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link type="danger" @click="delDictItem(row.id)">删除</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@changeNo="changeNo" ...pageData.pageConfiger,
@changeSize="changeSize" total: pageData.total
:tableHeight="pageData.tableHeight" }"></Pages>
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div> </div>
<!-- 编辑详情 --> <!-- 编辑详情 -->
<EditAddForm v-if="show" ref="detailDiloag" :dic="{D_GS_BQ_LX,D_GS_BQ_DJ,D_GS_SSYJ,D_GS_BQ_LB}" @updateDate="getList" /> <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"/>
</div> </div>
</template> </template>
@ -64,19 +59,21 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import EditAddForm from "./components/editAddForm.vue"; import EditAddForm from "./components/editAddForm.vue";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js"; import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { tbGsxtBqzhId } from "@/api/yj.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance(); 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 detailDiloag = ref(); const detailDiloag = ref();
const show = ref(false) const show = ref(false)
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const searchConfiger = ref( const searchConfiger = ref(
[ [
{ label: "组合标签名称", prop: 'bqMc', placeholder: "请输入组合标签名称", showType: "input"}, { label: "组合标签名称", prop: 'bqMc', placeholder: "请输入组合标签名称", showType: "input" },
// { label: "组合标签标签等级", prop: 'bqDj', placeholder: "请选择组合标签标签等级", showType: "select",options: D_GS_BQ_DJ }, // { label: "组合标签标签等级", prop: 'bqDj', placeholder: "请选择组合标签标签等级", showType: "select",options: D_GS_BQ_DJ },
{ label: "组合标签颜色", prop: 'bqYs', placeholder: "请选择组合标签标签颜色", showType: "select",options: D_GS_SSYJ }, { label: "组合标签颜色", prop: 'bqYs', placeholder: "请选择组合标签标签颜色", showType: "select", options: D_GS_SSYJ },
]); ]);
const queryFrom = ref({}); const queryFrom = ref({});
const pageData = reactive({ const pageData = reactive({
tableData: [], //表格数据 tableData: [], //表格数据
@ -96,9 +93,9 @@ const pageData = reactive({
{ label: "组合标签名称", prop: "bqMc" }, { label: "组合标签名称", prop: "bqMc" },
{ label: "标签代码", prop: "bqDm" }, { label: "标签代码", prop: "bqDm" },
// { label: "组合标签等级", prop: "bqDj",showSolt:true }, // { label: "组合标签等级", prop: "bqDj",showSolt:true },
{ label: "组合标签颜色", prop: "bqYs",showSolt:true }, { label: "组合标签颜色", prop: "bqYs", showSolt: true },
{ label: "组合标签分值", prop: "bqFz"}, { label: "组合标签分值", prop: "bqFz" },
{ label: "组合标签说明", prop: "bqSm",showOverflowTooltip:true }, { label: "组合标签说明", prop: "bqSm", showOverflowTooltip: true },
] ]
}); });
onMounted(() => { onMounted(() => {
@ -108,51 +105,61 @@ onMounted(() => {
// 搜索 // 搜索
const onSearch = (val) =>{ const onSearch = (val) => {
queryFrom.value = {...val} queryFrom.value = { ...val }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
getList() getList()
} }
const changeNo = (val) =>{ const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val; pageData.pageConfiger.pageCurrent = val;
getList() getList()
} }
const changeSize = (val) =>{ const changeSize = (val) => {
pageData.pageConfiger.pageSize = val; pageData.pageConfiger.pageSize = val;
getList() getList()
} }
const getList = () =>{ const getList = () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
qcckGet(queryFrom.value,'/mosty-gsxt/tbGsxtBqzh/selectPage').then((res)=>{ qcckGet(queryFrom.value, '/mosty-gsxt/tbGsxtBqzh/selectPage').then((res) => {
pageData.tableData = res.records; pageData.tableData = res.records;
pageData.total = res.total; pageData.total = res.total;
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
}).catch(()=>{ }).catch(() => {
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
}) })
} }
// 删除 // 删除
const delDictItem = (id) =>{ const delDictItem = (id) => {
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => { proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckDelete({},'/mosty-gsxt/tbGsxtBqzh/'+id).then(()=>{ qcckDelete({}, '/mosty-gsxt/tbGsxtBqzh/' + id).then(() => {
proxy.$message({ type: "success", message: "删除成功" }); proxy.$message({ type: "success", message: "删除成功" });
getList(); getList();
}) })
}).catch(() => {}); }).catch(() => { });
} }
// 新增 // 新增
const addEdit = (type, row) => { const addEdit = (type, row) => {
show.value = true; show.value = true;
nextTick(()=>{ nextTick(() => {
detailDiloag.value.init(type, row,); detailDiloag.value.init(type, row,);
}) })
}; };
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
tbGsxtBqzhId(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {

View File

@ -47,6 +47,7 @@
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <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="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(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="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>
@ -74,7 +75,8 @@
<!-- 处置建议 --> <!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy> <Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxXwyj/sjxspz" :roleIds="roleIds"/>
</template> </template>
<script setup> <script setup>
@ -87,6 +89,8 @@ import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue"; import Items from "./item/items.vue";
import {yjzxXwyjSelectList } from "@/api/yj.js";
import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import HolographicArchive from '@/views/home/components/holographicArchive.vue' import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import { tbGsxtBqglSelectList } from '@/api/zdr' import { tbGsxtBqglSelectList } from '@/api/zdr'
@ -323,6 +327,19 @@ const openSearch = () => {
tabHeightFn() tabHeightFn()
}) })
} }
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
yjzxXwyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {
if (search.value) { if (search.value) {

View File

@ -40,13 +40,14 @@
<DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" /> <DictTag :value="row.czzt" :options="D_GSXT_YJXX_CZZT" />
</template> </template>
<template #expand="{ props }"> <template #expand="{ props }">
<div class="expand-content" style="max-width: 100%"> <div class="expand-content" style="max-width: 100%; max-height: 400px; overflow-y: auto; padding: 10px;">
<Items :row="props || {}" :dict="dict" /> <Items :row="props || {}" :dict="dict" />
</div> </div>
</template> </template>
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <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="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(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="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>
@ -71,6 +72,9 @@
<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> <Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxZhyj/sjxspz" :roleIds="roleIds"/>
</template> </template>
<script setup> <script setup>
@ -81,7 +85,8 @@ import Searchs from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import Items from "./item/items.vue"; import Items from "./item/items.vue";
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList } from '@/api/yj.js' import ChooseJf from '@/components/ChooseList/ChooseJf/index.vue'
import { tbYjxxGetZbtj, tbGsxtBqzhSelectList,yjzxZhyjSelectList } from '@/api/yj.js'
import HolographicArchive from '@/views/home/components/holographicArchive.vue' import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue"; import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue' import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
@ -201,7 +206,7 @@ const getList = () => {
pageCurrent: pageData.pageConfiger.pageCurrent, pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize pageSize: pageData.pageConfiger.pageSize
} }
tbYjxxGetZbtj(promes).then((res) => { tbYjxxGetZbtj(promes).then((res) => {
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
pageData.total = res.total || 0; pageData.total = res.total || 0;
@ -300,6 +305,20 @@ const openAddModel = (row) => {
addModelRef.value.init(row) addModelRef.value.init(row)
} }
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
yjzxZhyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 搜索栏 // 搜索栏
const search = ref(false) const search = ref(false)
const openSearch = () => { const openSearch = () => {
@ -359,3 +378,4 @@ const exportExl = () => {
background: rgba(0, 0, 0, 0.5) !important; background: rgba(0, 0, 0, 0.5) !important;
} }
</style> </style>

View File

@ -75,7 +75,6 @@ const searchConfiger = ref(
[ [
{ label: "预警级别", prop: 'yjjbList', placeholder: "请输入姓名", showType: "select", options: D_BZ_YJJB }, { label: "预警级别", prop: 'yjjbList', placeholder: "请输入姓名", showType: "select", options: D_BZ_YJJB },
{ label: "预警类型", prop: 'yjlxList', placeholder: "请输入身份证号码", showType: "select", options: D_GS_ZDQT_YJLB }, { label: "预警类型", prop: 'yjlxList', placeholder: "请输入身份证号码", showType: "select", options: D_GS_ZDQT_YJLB },
]); ]);
const queryFrom = ref({}); const queryFrom = ref({});

View File

@ -47,7 +47,6 @@ watch(() => props.dict, (res) => {
{ label: "所属县局", prop: "ssxgaj", type: "input" }, { label: "所属县局", prop: "ssxgaj", type: "input" },
{ label: "所属市局", prop: "sssgaj", type: "input" }, { label: "所属市局", prop: "sssgaj", type: "input" },
{ label: "接警员姓名", prop: "jjyxm", type: "input" }, { label: "接警员姓名", prop: "jjyxm", type: "input" },
// { label: "预警内容", prop: "yjNr", type: "textarea", width: "100%" },
] ]
} }

View File

@ -47,6 +47,7 @@
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="warning" @click="pushAssess(row)">全息档案</el-link> <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="handleCzjy(row)" v-if="roleCode">处置建议</el-link>
<el-link type="primary" @click="chooseJfFun(row)" >配置系统</el-link>
<!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link> <!-- <el-link type="primary" @click="showDetail(row)">转合成</el-link>
<el-link type="danger" @click="handleQsFk(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> <el-link type="success" @click="handleQsFk(row, '签收')" v-if="row.czzt == '01' && permission_sfqs">签收</el-link>
@ -72,6 +73,9 @@
<!-- 处置建议 --> <!-- 处置建议 -->
<Czjy ref="czjyRef" @okSubmit="getList"></Czjy> <Czjy ref="czjyRef" @okSubmit="getList"></Czjy>
<ChooseJf v-model="chooseJfShow" titleValue="选择系数" :Single="false"
:chooseJfBh="chooseJfBh" url="/yjzxSfyj/sjxspz" :roleIds="roleIds"/>
</template> </template>
<script setup> <script setup>
@ -85,10 +89,11 @@ import HolographicArchive from '@/views/home/components/holographicArchive.vue'
import Information from "@/views/home/model/information.vue"; import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue' import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import AddFrom from "./components/addFrom.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 FkDialog from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/fkDialog.vue";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { yjzxSfyjSelectList } from "@/api/yj.js"; import { yjzxSfyjSelectList,yjzxyjzxSfyjSelectList } from "@/api/yj.js";
import { tbGsxtBqglSelectList } from '@/api/zdr' import { tbGsxtBqglSelectList } from '@/api/zdr'
import Detail from './components/detail.vue' import Detail from './components/detail.vue'
import { watch } from "vue"; import { watch } from "vue";
@ -159,7 +164,7 @@ onMounted(() => {
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; roleCode.value = obj ? true : false;
gettbGsxtBqglSelectList() gettbGsxtBqglSelectList()
tabHeightFn(); tabHeightFn();
getList(); getList();
@ -320,6 +325,18 @@ const addModelRef = ref(null)
const openAddFrom = (row) => { const openAddFrom = (row) => {
addModelRef.value.init('add', row) addModelRef.value.init('add', row)
} }
// 选择系数
const chooseJfShow = ref(false)
const chooseJfBh = ref()
const roleIds=ref()
const chooseJfFun = (val) => {
chooseJfBh.value=val.id
yjzxyjzxSfyjSelectList(val.id).then(res => {
roleIds.value=res.sjxspzList.map(item => item.xsid)
chooseJfShow.value = true
})
}
// 搜索栏 // 搜索栏
const search = ref(false) const search = ref(false)
const openSearch = () => { const openSearch = () => {

View File

@ -116,7 +116,7 @@ const pageData = reactive({
keyCount: 0, keyCount: 0,
tableConfiger: { tableConfiger: {
rowHieght: 61, rowHieght: 61,
showSelectType: "checkBox", showSelectType: "null",
loading: false, loading: false,
haveControls: true haveControls: true
}, },
@ -129,15 +129,12 @@ const pageData = reactive({
controlsWidth: 300, //操作栏宽度 controlsWidth: 300, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "预警图片", prop: "yjTp", showSolt: true, width: 100 }, { label: "预警图片", prop: "yjTp", showSolt: true, width: 100 },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
{ label: "处置状态", prop: "czzt", showSolt: true }, { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "预警时间", prop: "yjSj", showOverflowTooltip: true }, { label: "预警时间", prop: "yjSj", showOverflowTooltip: true },
{ label: "姓名", prop: "yjRyxm" }, { label: "标题", prop: "yjBt" },
{ label: "年龄", prop: "nl", showSolt: true, width: 80 }, { label: "内容", prop: "yjNr", showOverflowTooltip: true },
{ label: "数据来源", prop: "yjLylx", showOverflowTooltip: true },
{ label: "身份证", prop: "yjRysfzh", showOverflowTooltip: true },
// { label: "预警级别", prop: "yjJb", showSolt: true },
// { label: "相似度", prop: "xsd", showSolt: true },
{ label: "布控车牌号", prop: "yjClcph", showOverflowTooltip: true },
] ]
}); });

View File

@ -0,0 +1,116 @@
<template>
<el-dialog title="深度研判" v-model="visible" v-if="visible" width="70%" @close="close">
<el-form :model="formData" :rules="rules" ref="formRef" label-width="120px" label-position="top">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="研判议题" prop="ypyt" class="mt10">
<el-input v-model="formData.ypyt" placeholder="请输入研判议题" clearable />
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="研判时间" prop="wcsj" class="mt10">
<el-date-picker v-model="formData.wcsj" type="datetime" placeholder="请选择研判时间" style="width: 100%;" />
</el-form-item>
</el-col> -->
<el-col :span="12">
<el-form-item label="报告类型" prop="bglx" class="mt10">
<el-radio-group v-model="formData.bglx">
<el-radio v-for="value in D_BZ_YPLX" :key="value.value" :label="value.value" :value="value.value">{{
value.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="参与研判部门" prop="bmdm" class="mt10">
<MOSTY.Department clearable v-model="formData.bmdm" multiple style="width: 100%;"
@getDepValue="getdep($event)" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="研判要求" prop="ypyq" class="mt10">
<el-input v-model="formData.ypyq" placeholder="请填写研判要求" type="textarea" rows="4" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item class="mt10" center>
<div style="margin: 0 auto;">
<el-button type="primary" :loading="loading" @click="submitForm">提交</el-button>
<el-button @click="close">取消</el-button>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import * as MOSTY from "@/components/MyComponents/index";
import { ElMessage } from 'element-plus';
import { qcckPost } from '@/api/qcckApi'
import { ref, getCurrentInstance } from 'vue'
const emit = defineEmits(['change']);
const { proxy } = getCurrentInstance();
const { D_BZ_YPLX, D_BZ_YPFS } = proxy.$dict('D_BZ_YPLX', 'D_BZ_YPFS')
const visible = ref(false)
const loading = ref(false)
const formRef = ref()
const formData = ref({})
const rules = ref({
ypyt: [{ required: true, message: '请输入研判议题', trigger: 'blur' }],
// wcsj: [{ required: true, message: '请选择研判时间', trigger: 'change' }],
bglx: [{ required: true, message: '请选择报告类型', trigger: 'change' }],
ypfs: [{ required: true, message: '请选择研判方式', trigger: 'change' }],
deptIds: [{ required: true, message: '请选择参与研判部门', trigger: 'change' }],
ypyq: [{ required: true, message: '请输入研判内容', trigger: 'blur' }],
})
const init = (row) => {
visible.value = true;
formData.value = {
sjly: '03',
sjlyid: row.jjdbh,
}
}
const close = () => {
visible.value = false;
formRef.value.resetFields();
}
const deptIds = ref([])
const getdep = (e) => {
if (Array.isArray(e)) {
deptIds.value = e
} else {
deptIds.value = [e]
}
}
const submitForm = () => {
formRef.value.validate((valid) => {
if (!valid) return;
loading.value = true;
const promes = {
...formData.value,
cyypList: deptIds.value.map((item) => {
return {
ypbmmc: item.orgName,
ypbmdm: item.orgCode
}
}
),
}
qcckPost(promes, '/mosty-gsxt/lzJcjPjdb/sdyp').then(res => {
loading.value = false;
ElMessage.success('研判成功');
emit('change');
close();
}).catch(() => {
loading.value = false;
ElMessage.error('研判失败');
})
})
}
defineExpose({
init,
})
</script>

View File

@ -0,0 +1,89 @@
<template>
<el-dialog title="研判" v-model="visible" v-if="visible" width="50%" @close="close">
<el-form :model="formData" :rules="rules" ref="formRef" label-width="120px" label-position="top">
<el-divider content-position="left">警情基本信息</el-divider>
<el-descriptions class="margin-top" :column="3" border >
<el-descriptions-item>
<template #label><div class="cell-item">接警单编号</div></template>
{{ formData.jjdbh }}
</el-descriptions-item>
<el-descriptions-item>
<template #label><div class="cell-item">报警电话</div></template>
{{ formData.bjdh }}
</el-descriptions-item>
<el-descriptions-item>
<template #label><div class="cell-item"> 报警时间 </div></template>
{{ formData.bjsj }}
</el-descriptions-item>
<el-descriptions-item>
<template #label><div class="cell-item"> 接警员姓名 </div></template>
{{ formData.jjyxm }}
</el-descriptions-item>
<el-descriptions-item>
<template #label> <div class="cell-item"> 警情地址 </div> </template>
{{ formData.jqdz }}
</el-descriptions-item>
</el-descriptions>
<el-divider content-position="left">报警内容</el-divider>
<el-input v-model="formData.bjnr" placeholder="请输入报警内容" type="textarea" rows="4" readonly />
<el-form-item label="研判内容" prop="ypnr" class="mt20">
<el-input v-model="formData.ypnr" placeholder="请输入研判结果" type="textarea" rows="4" />
</el-form-item>
<el-form-item label="" class="mt20" center>
<div style="margin: 0 auto;">
<el-button type="primary" :loading="loading" @click="submitForm">提交</el-button>
<el-button @click="close">取消</el-button>
</div>
</el-form-item>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus';
import { qcckPost } from '@/api/qcckApi'
import { ref } from 'vue'
const emit = defineEmits(['change']);
const visible = ref(false)
const loading = ref(false)
const formRef = ref()
const formData = ref({})
const rules = ref({
ypnr: [{ required: true, message: '请输入研判内容', trigger: 'blur' }],
})
const init = (row) => {
visible.value = true;
formData.value = row
}
const close = () => {
visible.value = false;
formRef.value.resetFields();
}
const submitForm = () => {
formRef.value.validate((valid) => {
if (!valid) return;
let data = { ...formData.value, yplx:'01' }
loading.value = true;
qcckPost(data,'/mosty-gsxt/lzJcjPjdb/ptyp').then(res => {
loading.value = false;
ElMessage.success('研判成功');
emit('change');
close();
}).catch(() => {
loading.value = false;
ElMessage.error('研判失败');
})
})
}
defineExpose({
init,
})
</script>

View File

@ -19,12 +19,23 @@
<!-- <template #jjlx="{ row }"> <!-- <template #jjlx="{ row }">
<DictTag :tag="false" :value="row.jjlx" :options="D_BZ_JQBQ" /> <DictTag :tag="false" :value="row.jjlx" :options="D_BZ_JQBQ" />
</template> --> </template> -->
<template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_GS_BQ_DJ" />
</template>
<template #jqlbdm="{ row }"> <template #jqlbdm="{ row }">
<DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" /> <DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" />
</template> </template>
<template #ypzt="{ row }">
{{ row.ypzt === '01' ? '已研判' : '未研判' }}
</template>
<!-- <template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_BZ_JQDJ" />
</template> -->
<!-- 操作 --> <!-- 操作 -->
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="primary" @click="addEdit('edit', row)">详情</el-link> <el-link type="primary" @click="addEdit('edit', row)">详情</el-link>
<el-link type="warning" @click="handleYP('研判', row)">研判</el-link>
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link>
</template> </template>
</MyTable> </MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{ <Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -35,10 +46,17 @@
<!-- 编辑详情 --> <!-- 编辑详情 -->
<EditAddForm v-if="show" ref="detailDiloag" :dic="{ JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQFL,JQLB_DP,D_BZ_JQBQ,D_GS_SSYJ }" <EditAddForm v-if="show" ref="detailDiloag" :dic="{ JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQFL,JQLB_DP,D_BZ_JQBQ,D_GS_SSYJ }"
@updateDate="getList" /> @updateDate="getList" />
<!-- 研判弹窗 -->
<YpDialog ref="ypDialog" @change="getList" />
<DeepYpDialog ref="deepYpDialog" @change="getList" />
</div> </div>
</template> </template>
<script setup> <script setup>
import YpDialog from "./components/ypDialog.vue";
import DeepYpDialog from "./components/deepypDialog.vue";
import PageTitle from "@/components/aboutTable/PageTitle.vue"; import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue"; import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
@ -47,8 +65,9 @@ import EditAddForm from "./components/editAddForm.vue";
import { lzJcjPjdbSelectPage } from '@/api/semanticAnalysis.js' import { lzJcjPjdbSelectPage } from '@/api/semanticAnalysis.js'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { JQLB,JQLX,JQXL,JQZL,D_BZ_JQLY,D_BZ_JQFL,JQLB_DP,D_BZ_JQBQ,D_GS_SSYJ } = proxy.$dict("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 ypDialog = ref();
const deepYpDialog = ref();
const detailDiloag = ref(); const detailDiloag = ref();
const show = ref(false) const show = ref(false)
const searchConfiger = ref([ const searchConfiger = ref([
@ -70,6 +89,13 @@ const searchConfiger = ref([
placeholder: "请输入接警单编号", placeholder: "请输入接警单编号",
showType: "input" showType: "input"
}, },
{
label: "警情级别",
prop: "jqdjdm",
placeholder: "请选择警情级别",
showType: "select",
options: D_GS_BQ_DJ
},
]); ]);
const searchBox = ref(); //搜索框 const searchBox = ref(); //搜索框
const pageData = reactive({ const pageData = reactive({
@ -85,24 +111,27 @@ const pageData = reactive({
pageSize: 20, pageSize: 20,
pageCurrent: 1 pageCurrent: 1
}, //分页 }, //分页
controlsWidth: 160, //操作栏宽度 controlsWidth: 210, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "接警单编号", prop: "jjdbh" }, { label: "接警单编号", prop: "jjdbh" },
{ label: "报警电话", prop: "bjdh" }, { label: "报警电话", prop: "bjdh" },
{ label: "报警时间", prop: "bjsj" }, { label: "报警时间", prop: "bjsj" },
{ label: "报警内容", prop: "bjnr", showOverflowTooltip: true }, { label: "报警内容", prop: "bjnr", showOverflowTooltip: true },
{ label: "接警员姓名", prop: "jjyxm" }, { label: "接警员姓名", prop: "jjyxm" },
{ label: "警情级别", prop: "jqdjdm",showSolt:true },
// { label: "警情标签", prop: "jjlx", showSolt: true }, // { label: "警情标签", prop: "jjlx", showSolt: true },
{ label: "警情类型", prop: "jqlbdm",showSolt:true }, { label: "警情类型", prop: "jqlbdm",showSolt:true },
{ label: "警情地址", prop: "jqdz" }, { label: "警情地址", prop: "jqdz" },
{ label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true }, { label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true },
{ label: "研判状态", prop: "ypzt",showSolt:true },
] ]
}); });
onMounted(() => { onMounted(() => {
tabHeightFn(); tabHeightFn();
getList() getList()
}); });
const listQuery=ref({}) const listQuery = ref({})
// 搜索 // 搜索
const onSearch = (val) => { const onSearch = (val) => {
listQuery.value = { ...val }; listQuery.value = { ...val };
@ -147,6 +176,15 @@ const addEdit = (type, row) => {
}) })
}; };
const handleYP = (type, row) => {
console.log(type, row);
if(type === '研判'){
ypDialog.value.init(row);
}else{
deepYpDialog.value.init(row);
}
}
// 表格高度计算 // 表格高度计算
const tabHeightFn = () => { const tabHeightFn = () => {

View File

@ -1,22 +1,21 @@
<template> <template>
<div class="warning-card" :style="{ 'border': `1px solid ${changeBG(item.yjjb)}` }"> <div class="warning-card" :style="{ 'border': `1px solid ${changeBG(item.yjjb)}` }">
<div class="warning-image flex"> <div class="warning-image flex">
<!-- -->
<template v-if="!item.yjtp || item.yjtp.includes('baidu')"> <template v-if="!item.yjtp || item.yjtp.includes('baidu')">
<img src="@/assets/images/car.png" width="65" height="70" v-if="item.yjlb == 2" /> <img src="@/assets/images/car.png" width="65" height="70" v-if="item.yjlb == 2 || item.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else /> <img src="@/assets/images/default_male.png" width="65" height="70" v-else />
</template> </template>
<el-image preview-teleported v-else @click.stop style="width: 65px; height: 70px" :src="item.yjtp" :preview-src-list="[item.yjtp]" show-progress> <el-image preview-teleported v-else @click.stop style="width: 65px; height: 70px" :src="item.yjtp" :preview-src-list="[item.yjtp]" show-progress>
<template #error> <template #error>
<div class="image-slot error"> <div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="item.yjlb == 2" /> <img src="@/assets/images/car.png" width="65" height="70" v-if="item.yjlb == 2 || item.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else /> <img src="@/assets/images/default_male.png" width="65" height="70" v-else />
</div> </div>
</template> </template>
</el-image> </el-image>
<div class="ml10 warning-info"> <div class="ml10 warning-info">
<div class="flex just-between align-center"> <div class="flex just-between align-center">
<div class="flex align-center mt4" v-if="item.yjlb == 2"> <div class="flex align-center mt4" v-if="item.yjlb == 2 || item.yjLx == 2">
<span>{{ item.cph }}</span> <span>{{ item.cph }}</span>
</div> </div>
<div class="flex align-center mt4" v-else> <div class="flex align-center mt4" v-else>
@ -28,7 +27,7 @@
</div> </div>
<span class="tag" v-if="item.yjbq" :style="{ 'background': `${changeBG(item.yjjb)}` }">{{ item.yjbq }}</span> <span class="tag" v-if="item.yjbq" :style="{ 'background': `${changeBG(item.yjjb)}` }">{{ item.yjbq }}</span>
</div> </div>
<div v-if="item.yjlb == 2" class="flex">车牌类型 <div v-if="item.yjlb == 2 || item.yjLx == 2" class="flex">车牌类型
<DictTag :tag="false" :value="item.hplx" color="#fff" :options="dict.D_BZ_HPZL" /> <DictTag :tag="false" :value="item.hplx" color="#fff" :options="dict.D_BZ_HPZL" />
</div> </div>
<div class="mt4" v-else>身份证{{ item.rysfzh }}</div> <div class="mt4" v-else>身份证{{ item.rysfzh }}</div>

View File

@ -0,0 +1,146 @@
<template>
<el-dialog v-model="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<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>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="closeDialog">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { xxcjSelectXxsbPage, xxcjDeletes, xxcjXxzsx, xxcjUpdateCzlc, xxcjXxqd } from '@/api/xxcj.js'
import { ref, reactive, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance()
const { D_GS_XS_LX, D_BZ_QBCZZT, D_BZ_CJLX, D_BZ_LCZT } =
proxy.$dict("D_GS_XS_LX", "D_BZ_QBCZZT", "D_BZ_CJLX", "D_BZ_LCZT"); //获取字典数据
const detailDiloag = ref();
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
}, title: {
default: "下发总数",
type: String
},
sfqs: {
type: String,
default: ''
},
sffk: {
type: String,
default: ''
}
})
const searchConfiger = ref([
{ label: "名称", prop: 'qbmc', placeholder: "请输入情报名称", showType: "input" },
{ label: "所属单位", prop: "ssbmdm", placeholder: "请选择所属单位", showType: "department" },
{ label: "时间", prop: "startTime", placeholder: "请选择时间", showType: "daterange" },
{ label: "处置状态", prop: 'lczt', placeholder: "请选择处置状态", showType: "select", options: D_BZ_LCZT },
]);
const emit = defineEmits(['update:modelValue'])
const closeDialog = () => {
emit('update:modelValue', false)
}
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: false,
showSelectType: 'null',
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "情报上报时间", prop: "sxsbsj" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报标题", prop: "qbmc" },
{ label: "情报来源", prop: "qbly", showSolt: true },
{ label: "流程状态", prop: "lczt", showSolt: true },
],
tableHeight: "43vh",
});
const parameter = ref()
const onSearch = (val) => {
const promes = {
...pageData.pageConfiger,
...val,
startTime: val.startTime ? val.startTime[0] : '',
endTime: val.endTime ? val.endTime[1] : '',
}
parameter.value = { ...promes }
pageData.pageConfiger.pageCurrent = 1;
// parameter.value = { ...val }
// pageData.pageConfiger.pageCurrent = 1;
changePage()
}
watch(() => props.modelValue, (val) => {
if (val) {
changePage()
}
})
const changePage = () => {
pageData.tableConfiger.loading = true;
const promes = {
...parameter.value,
...pageData.pageConfiger,
}
xxcjSelectXxsbPage(promes).then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
changePage()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
changePage()
}
</script>
<style scoped></style>

View File

@ -0,0 +1,163 @@
<template>
<el-dialog v-model="modelValue" title="重点群体" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
fixed="right" :expand="true">
<template #qtLb="{ row }">
<DictTag :tag="false" :value="row.qtLb" :options="D_GS_ZDQT_LB" />
</template>
<template #qtFxdj="{ row }">
<DictTag :tag="false" :value="row.qtFxdj" :options="D_GS_ZDQT_FXDJ" />
</template>
<!-- <template #bqList="{ row }">
<ul>
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{
item.bqFz || 0 }} ) </li>
</ul>
</template> -->
<template #zdryList="{ row }">
<span style="color: #0072ff">{{ row.zdryList ? row.zdryList.length : 0 }}</span>
</template>
<!-- <template #qtZt="{ row }">
<DictTag :tag="false" :value="row.qtZt" :options="D_GS_ZDQT_ZT" />
</template> -->
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<ZdqtItem :row="props" :dict="{D_GS_ZDR_RYJB,D_GS_ZDR_BK_ZT,D_GS_ZDR_CZZT,D_GS_ZDQT_ZT}" />
</div>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="closeDialog">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import { useRoute, useRouter } from 'vue-router'
import ZdqtItem from "./zdqtItem.vue";
const route = useRoute()
const router = useRouter()
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 props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
}
})
const searchConfiger = ref([
{
label: "群体名称",
prop: "qtMc",
placeholder: "请输入群体名称",
showType: "input"
},
{
label: "群体风险等级",
prop: "qtFxdj",
placeholder: "请选择群体风险等级",
showType: "select",
options: D_GS_ZDQT_FXDJ
},
{
label: "群体类别",
prop: "qtLb",
placeholder: "请选择群体类别",
showType: "select",
options: D_GS_ZDQT_LB
},
{
label: "所属部门",
prop: "ssbmdm",
placeholder: "请输入所属部门",
showType: "department",
},
]);
const emit = defineEmits(['update:modelValue'])
const closeDialog = () => {
emit('update:modelValue', false)
}
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: false,
showSelectType:'null'
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "群体名称", prop: "qtMc" },
{ label: "群体类别", prop: "qtLb", showSolt: true },
{ label: "风险等级", prop: "qtFxdj", showSolt: true},
{ label: "背景资料", prop: "qtBjzl" },
{ label: "背景信息", prop: "bgxx", showSolt: true },
{ label: "管辖单位", prop: "gxSsdwmc" },
],
tableHeight: "42vh",
});
const parameter = ref()
const onSearch = (val) => {
parameter.value = { ...val }
pageData.pageConfiger.pageCurrent = 1;
changePage()
}
watch(() => props.modelValue, (val) => {
if (val) {
changePage()
}
})
const changePage = () => {
pageData.tableConfiger.loading = true;
let data = {...pageData.pageConfiger, ...parameter.value };
qcckGet(data, "/mosty-gsxt/tbGsxtZdqt/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
changePage()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
changePage()
}
</script>
<style scoped></style>

View File

@ -0,0 +1,204 @@
<template>
<el-dialog v-model="modelValue" title="重点人总数" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
:expand="true">
<template #bqList="{ row }">
<ul>
<li class="one_text_detail marks mb4" :key="index" v-for="(item, index) in row.bqList">{{ item.bqMc }}({{
item.bqFz || 0 }} ) </li>
</ul>
</template>
<template #ryXb="{ row }">
<DictTag :tag="false" :value="row.ryXb" :options="D_BZ_XB" />
</template>
<template #ryJg="{ row }">
<DictTag :tag="false" :value="row.ryJg" :options="D_BZ_XZQHDM" />
</template>
<template #ryMz="{ row }">
<DictTag :tag="false" :value="row.ryMz" :options="D_BZ_MZ" />
</template>
<template #hjdQh="{ row }">
<DictTag :tag="false" :value="row.hjdQh" :options="D_BZ_XZQHDM" />
</template>
<template #zdrZt="{ row }">
<DictTag :tag="false" :value="row.zdrZt" :options="D_GS_ZDQT_ZT" />
</template>
<template #xtSjzt="{ row }">
<div> {{ row.xtSjzt == 0 ? "注销" : row.xtSjzt == 1 ? "正常" : "封存" }}</div>
</template>
<template #expand="{ props }">
<div class="expand-content" style="max-width: 100%">
<ZdrItemfrom :row="props" :dict="{D_GS_ZDR_RYJB,D_GS_ZDR_BK_ZT,D_GS_ZDR_CZZT,D_GS_ZDQT_ZT}" />
</div>
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="success" @click="handleremove(row.id)">移除</el-link>
<el-link size="small" type="success" v-if="row.zdrZt == '01' || row.zdrZt == '03'"
@click="handleSend(row.id)">送审</el-link>
<el-link size="small" type="primary" v-if="row.zdrZt == '01' || row.zdrZt == '03'"
@click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="closeDialog">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import { useRoute, useRouter } from 'vue-router'
import { timeValidate } from '@/utils/tools.js'
import ZdrItemfrom from './zdrItem.vue'
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 obj = ref({});
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
}
})
const searchConfiger = ref([
{
label: "姓名",
prop: "ryXm",
placeholder: "请输入姓名",
showType: "input"
},
{
label: "身份证",
prop: "rySfzh",
placeholder: "请输入身份证",
showType: "input"
},
{
label: "户籍地",
prop: "hjdXz",
placeholder: "请输入户籍地",
showType: "input"
},
{
label: "人员级别",
prop: "zdrRyjb",
placeholder: "请输入人员级别",
showType: "select",
options: D_GS_ZDR_RYJB
},
{
label: "所属部门",
prop: "gxSsbmdm",
placeholder: "请输入所属部门",
showType: "department",
},
]);
const emit = defineEmits(['update:modelValue'])
const closeDialog = () => {
emit('update:modelValue', false)
}
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: false,
showSelectType:'null'
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "籍贯", prop: "ryJg", showSolt: true},
{ label: "身份证", prop: "rySfzh" },
{ label: "民族", prop: "ryMz", showSolt: true },
{ label: "户籍地区划", prop: "hjdQh", showSolt: true },
{ label: "户籍派出所", prop: "hjdPcsmc" },
],
tableHeight: "42vh",
});
const parameter = ref()
const onSearch = (val) => {
parameter.value = { ...val }
pageData.pageConfiger.pageCurrent = 1;
changePage()
}
watch(() => props.modelValue, (val) => {
if (val) {
changePage()
}
})
const changePage = () => {
pageData.tableConfiger.loading = true;
let data = {...pageData.pageConfiger, ...parameter.value };
qcckGet(data, "/mosty-gsxt/tbGsxtZdry/selectPage").then((res) => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
}
// 查看详情
const showDetail = (item) => {
router.push({
path: '/CollectCrculate',
query: {
id: item.id
}
})
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
changePage()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
changePage()
}
</script>
<style scoped>
.expand-content{
max-height: 400px;
overflow: auto;
}
</style>

View File

@ -0,0 +1,193 @@
<template>
<el-dialog v-model="modelValue" title="预警总数" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #yjtp="{ row }">
<div v-if="!row.yjtp || row.yjtp.includes('baidu')">
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else />
</div>
<el-image preview-teleported v-else @click.stop style="width: 65px; height: 70px" :src="row.yjtp"
:preview-src-list="[row.yjtp]" show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjlb == 2" />
<img src="@/assets/images/default_male.png" width="65" height="70" v-else />
</div>
</template>
</el-image>
</template>
<template #yjjb="{ row }">
<DictTag :value="row.yjjb" :tag="false" :color="bqYs(row.yjjb)" :options="D_BZ_YJJB" />
</template>
<template #yjlx="{ row }">
<DictTag :value="row.yjlx" :tag="false" :options="D_GS_ZDQT_YJLB" />
</template>
<template #yjlb="{ row }">
<DictTag :value="row.yjlb" :options="D_BZ_YJLX" />
</template>
<template #controls="{ row }">
<el-link type="warning" @click="pushAssess(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'">签收</el-link>
<el-link type="success" @click="handleQsFk(row, '反馈')" v-else-if="row.czzt == '02'">反馈</el-link>
<el-link type="success" @click="handleQsFk(row, '查看反馈')" v-else>查看反馈</el-link> -->
<!-- <el-link type="primary" @click="openAddModel(row)">详情</el-link> -->
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="closeDialog">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { ref, reactive, getCurrentInstance, watch } from "vue";
import {timeValidate} from '@/utils/tools.js'
const { proxy } = getCurrentInstance()
const { D_BZ_YJJB, D_GS_ZDQT_YJLB, D_BZ_YJLX } = proxy.$dict("D_BZ_YJJB", "D_GS_ZDQT_YJLB", "D_BZ_YJLX"); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
}
})
const searchConfiger = ref([
{ label: "预警级别", prop: 'yjjbList', placeholder: "请选择预警级别", showType: "select", options: D_BZ_YJJB },
// { label: "预警类型", prop: 'yjlxList', placeholder: "请输入身份证号码", showType: "select", options: D_GS_ZDQT_YJLB },
{
label: "上报时间",
prop: "startTime",
placeholder: "请选择时间",
showType: "datetimerange"
}, {
label: "所属部门",
prop: "ssbmdm",
placeholder: "请输入所属部门",
showType: "department",
},
]);
const emit = defineEmits(['update:modelValue'])
let today = new Date();
let startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate());
let endOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59, 999);
const closeDialog = () => {
emit('update:modelValue', false)
}
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: false,
showSelectType:'null'
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "预警图片", prop: "yjtp", showSolt: true },
{ label: "姓名", prop: "ryxm" },
{ label: "身份证号", prop: "rysfzh", width: 200 },
{ label: "预警标签", prop: "yjbq", width: 150 },
{ label: "预警地址", prop: "yjdz" },
{ label: "预警级别", prop: "yjjb", showSolt: true },
{ label: "预警类别", prop: "yjlb", showSolt: true },
{ label: "预警类型", prop: "yjlx", showSolt: true },
{ label: "预警时间", prop: "yjsj" },
{ label: "所属部门", prop: "ssbm" },
{ label: "车牌号", prop: "cph" },
],
tableHeight: "43vh",
});
const parameter = ref()
const onSearch = (val) => {
const promes = {
startTime: val.startTime && val.startTime.length > 0 ? val.startTime[0] : timeValidate(startOfDay),
endTime: val.startTime && val.startTime.length > 0 ? val.startTime[1] :timeValidate(endOfDay),
}
parameter.value = { ...val, ...promes }
pageData.pageConfiger.pageCurrent = 1;
changePage()
}
watch(() => props.modelValue, (val) => {
if (val) {
// 获取今天的开始时间和结束时间
parameter.value = {startTime:timeValidate(startOfDay), endTime:timeValidate(endOfDay)}
changePage()
}
})
const ORDIMG = 'https://89.40.7.122:38496/image'
const IMGYM = 'https://sg.lz.dsj.xz/dhimage'
const changePage = () => {
pageData.tableConfiger.loading = true;
const promes = {
...parameter.value,
yjjbList:parameter.value.yjjbList? [parameter.value.yjjbList] : [],
yjlxList: ['01'],
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
qcckPost(promes, '/mosty-gsxt/tbYjxx/getPageAllList').then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records.map(item => {
return {
...item,
yjtp: item.yjlx == '01' ? item.yjtp.replace(ORDIMG, IMGYM) : item.yjtp
}
}) || [];
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const bqYs = (val) => {
if (val == '01') {
return '#ff0202'
} else if (val == '02') {
return '#ff8c00'
} else if (val == '03') {
return '#ffd325'
} else if (val == '04') {
return '#0000ff'
}
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
changePage()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
changePage()
}
</script>
<style scoped></style>

View File

@ -0,0 +1,185 @@
<template>
<el-dialog v-model="modelValue" title="警情总数" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<!-- <template #jjlx="{ row }">
<DictTag :tag="false" :value="row.jjlx" :options="D_BZ_JQBQ" />
</template> -->
<template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_GS_BQ_DJ" />
</template>
<template #jqlbdm="{ row }">
<DictTag :tag="false" :value="row.jqlbdm" :options="JQLB" />
</template>
<template #ypzt="{ row }">
{{ row.ypzt === '01' ? '已研判' : '未研判' }}
</template>
<!-- <template #jqdjdm="{ row }">
<DictTag :tag="false" :value="row.jqdjdm" :options="D_BZ_JQDJ" />
</template> -->
<!-- 操作 -->
<!-- <template #controls="{ row }">
<el-link type="primary" @click="addEdit('edit', row)">详情</el-link>
<el-link type="warning" @click="handleYP('研判', row)">研判</el-link>
<el-link type="danger" @click="handleYP('深度研判', row)">深度研判</el-link>
</template> -->
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="closeDialog">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { lzJcjPjdbSelectPage } from '@/api/semanticAnalysis.js'
import { ref, reactive, getCurrentInstance, watch } from "vue";
import { useRoute, useRouter } from 'vue-router'
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 props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
}
})
const searchConfiger = ref([
{
label: "接警员姓名",
prop: "jjyxm",
placeholder: "请输入接警员姓名",
showType: "input"
},
{
label: "报警内容",
prop: "bjnr",
placeholder: "请输入报警内容",
showType: "input"
},
{
label: "接警单编号",
prop: "jjdbh",
placeholder: "请输入接警单编号",
showType: "input"
},
{
label: "警情级别",
prop: "jqdjdm",
placeholder: "请选择警情级别",
showType: "select",
options: D_GS_BQ_DJ
}, {
label: "上报时间",
prop: "startTime",
placeholder: "请选择时间",
showType: "daterange"
},
]);
const emit = defineEmits(['update:modelValue'])
const closeDialog = () => {
emit('update:modelValue', false)
}
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: false,
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "接警单编号", prop: "jjdbh" },
{ label: "报警电话", prop: "bjdh" },
{ label: "报警时间", prop: "bjsj" },
{ label: "报警内容", prop: "bjnr", showOverflowTooltip: true },
{ label: "接警员姓名", prop: "jjyxm" },
{ label: "警情级别", prop: "jqdjdm",showSolt:true },
// { label: "警情标签", prop: "jjlx", showSolt: true },
{ label: "警情类型", prop: "jqlbdm",showSolt:true },
{ label: "警情地址", prop: "jqdz" },
{ label: "补充接警内容", prop: "bcjjnr", showOverflowTooltip: true },
{ label: "研判状态", prop: "ypzt",showSolt:true },
],
tableHeight: "43vh",
});
const parameter = ref()
const onSearch = (val) => {
const promes = {
startTime: val.startTime && val.startTime.length > 0 ? val.startTime[0] : '',
endTime: val.startTime && val.startTime.length > 0 ? val.startTime[1] : '',
}
parameter.value = { ...val, ...promes }
pageData.pageConfiger.pageCurrent = 1;
changePage()
}
watch(() => props.modelValue, (val) => {
if (val) {
parameter.value = {startTime:timeValidate(new Date(),'ymd'),endTime:timeValidate(new Date(),'ymd')}
changePage()
}
})
const changePage = () => {
pageData.tableConfiger.loading = true;
const params = {
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
...parameter.value
}
lzJcjPjdbSelectPage(params).then(res => {
console.log(res);
pageData.tableData = res.records || [];
pageData.total = res.total;
}).finally(() => {
pageData.tableConfiger.loading = false;
})
}
// 查看详情
const showDetail = (item) => {
router.push({
path: '/CollectCrculate',
query: {
id: item.id
}
})
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
changePage()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
changePage()
}
</script>
<style scoped></style>

View File

@ -0,0 +1,145 @@
<template>
<el-dialog v-model="modelValue" :title="title" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #zllx="{ row }">
<DictTag :tag="false" :value="row.zllx" :options="D_GS_XS_ZLLX" />
</template>
<template #zldj="{ row }">
<DictTag :tag="false" :value="row.zldj" :options="D_GS_ZDQT_FXDJ" />
</template>
<template #czzt="{ row }">
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" />
</template>
<template #sffk="{ row }">
{{ row.sffk == '1' ? '已反馈' : '未反馈' }}
</template>
<template #sfqs="{ row }">
{{ row.sfqs == '0' ? '未签收' : '已签收' }}
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="closeDialog">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue";
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_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 props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
}, title: {
default: "下发总数",
type: String
},
sfqs: {
type: String,
default: ''
},
sffk: {
type: String,
default: ''
}
})
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 },
]);
const emit = defineEmits(['update:modelValue'])
const closeDialog = () => {
emit('update:modelValue', false)
}
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: false,
showSelectType: 'null',
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
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 },
],
tableHeight: "43vh",
});
const parameter = ref()
const onSearch = (val) => {
parameter.value = { ...val }
pageData.pageConfiger.pageCurrent = 1;
changePage()
}
watch(() => props.modelValue, (val) => {
if (val) {
changePage()
}
})
const changePage = () => {
pageData.tableConfiger.loading = true;
const promes = {
...parameter.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize,
sfqs: props.sfqs,
sffk: props.sffk,
}
xxcjXfxsSelectPage(promes).then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
changePage()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
changePage()
}
</script>
<style scoped></style>

View File

@ -0,0 +1,130 @@
<template>
<el-dialog v-model="modelValue" title="线索总数" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<div style="height: 60vh; overflow: auto;">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #qblx="{row}">
<DictTag :tag="false" :value="row.qblx" :options="D_GS_XS_LX" />
</template>
<template #cjLx="{row}">
<DictTag :tag="false" :value="row.cjLx" :options="D_GS_XS_LY" />
</template>
<!-- <template #czzt="{row}">
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" />
</template> -->
<template #shzt="{row}">
<!-- 采纳将这条信息推送到情报管理,退回 -->
<DictTag :tag="false" :value="row.shzt" :options="D_BZ_XSSHZT" @clickTag="clickTag(row.shzt)" />
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="closeDialog">确认 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue";
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","D_GS_XS_LY","D_GS_XS_LX","D_BZ_XSSHZT"); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dict: {
type: Object,
default: () => ({})
},
})
const searchConfiger = ref([
{ label: "线索名称", prop: 'qbmc', placeholder: "请输入线索名称", showType: "input" },
{ label: "内容关键字", prop: 'qbnr', placeholder: "请输入语义关键字", showType: "input" },
{ label: "线索类型", prop: 'qblx', placeholder: "请选择线索类型", showType: "select",options:D_GS_XS_LX },
{ label: "线索来源", prop: 'cjLx', placeholder: "请选择线索来源", showType: "select",options:D_GS_XS_LY },
]);
const emit = defineEmits(['update:modelValue'])
const closeDialog = () => {
emit('update:modelValue', false)
}
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: false,
showSelectType: 'null',
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "线索编号", prop: "xsBh" },
{ label: "线索名称", prop: "qbmc" },
{ label: "线索类型", prop: "qblx",showSolt:true },
{ label: "线索来源", prop: "cjLx",showSolt:true },
{ label: "上报时间", prop: "sxsbsj",showOverflowTooltip:true },
{ label: "线索内容", prop: "qbnr"},
{ label: "审核状态", prop: "shzt", showSolt: true },
],
tableHeight: "43vh",
});
const parameter = ref()
const onSearch = (val) => {
parameter.value = { ...val}
pageData.pageConfiger.pageCurrent = 1;
changePage()
}
watch(() => props.modelValue, (val) => {
if (val) {
changePage()
}
})
const changePage = () => {
pageData.tableConfiger.loading = true;
const promes = {
...parameter.value,
pageCurrent: pageData.pageConfiger.pageCurrent,
pageSize: pageData.pageConfiger.pageSize
}
xxcjQbcjSelectPage(promes).then((res) => {
pageData.total = res.total || 0;
pageData.tableConfiger.loading = false;
pageData.tableData = res.records
}).catch(() => {
pageData.tableConfiger.loading = false;
})
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
changePage()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
changePage()
}
</script>
<style scoped></style>

View File

@ -0,0 +1,194 @@
<template>
<div class="warning-item" >
<el-divider content-position="left">重点群体信息</el-divider>
<div class="info-container">
<div class="info-row">
<div class="info-item">
<span class="label">户籍地详址</span>
<span class="value">{{ row.hjdXz || '暂无' }}</span>
</div>
<div class="info-item">
<span class="label">管辖单位</span>
<span class="value">{{ row.gxSsbmmc || '暂无' }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">人员级别</span>
<span class="value">
<DictTag v-if="row.zdrRyjb" :tag="false" :value="row.zdrRyjb" :options="dict.D_GS_ZDR_RYJB" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">列控原因</span>
<span class="value">{{ row.zdrLkyy || '暂无' }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">开始时间</span>
<span class="value">{{ row.zdrRkkssj || '暂无' }}</span>
</div>
<div class="info-item">
<span class="label">截至时间</span>
<span class="value">{{ row.zdrRkjssj || '暂无' }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">稳控人数</span>
<span class="value">{{ row.zdryList?.length || 0 }}</span>
</div>
<div class="info-item">
<span class="label">状态</span>
<span class="value">
<DictTag v-if="row.qtZt" :tag="false" :value="row.qtZt" :options="dict.D_GS_ZDR_CZZT" />
<span v-else>暂无</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">管控状态</span>
<span class="value">
<DictTag v-if="row.zdrBkZt" :tag="false" :value="row.zdrBkZt" :options="dict.D_GS_ZDR_BK_ZT" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">处置状态</span>
<span class="value">
<DictTag v-if="row.zdrCzzt" :tag="false" :value="row.zdrCzzt" :options="dict.D_GS_ZDR_CZZT" />
<span v-else>暂无</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">审核状态</span>
<span class="value">
<DictTag v-if="row.zdrZt" :tag="false" :value="row.zdrZt" :options="dict.D_GS_ZDQT_ZT" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">系统状态</span>
<span class="value">
<div v-if="row.xtSjzt"> {{ row.xtSjzt == 0 ? "注销" : row.xtSjzt == 1 ? "正常" : "封存" }}</div>
<span v-else>暂无</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">创建单位</span>
<span class="value">{{ row.xtCjbmmc || '暂无' }}</span>
</div>
<div class="info-item">
<span class="label">创建时间</span>
<span class="value">{{ row.xtCjsj || '暂无' }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="label">标签</span>
<span class="value tag-container">
<ul v-if="row.bqList" style="margin: 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; align-items: flex-start; gap: 12px;">
<li class="" :key="index" v-for="(item, index) in row.bqList" style="white-space: normal; word-break: break-all; flex: 0 0 auto;">
{{ item.bqMc }}({{item.bqFz || 0 }} ) <span v-if="index < row.bqList.length - 1"></span>
</li>
</ul>
<span v-else>暂无</span>
</span>
</div>
</div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border-radius: 8px;
background-color: #fafafa;
}
// 新增的信息展示样式
.info-container {
margin-bottom: 15px;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
}
.info-item {
flex: 1;
min-width: 300px;
margin-bottom: 8px;
display: flex;
// align-items: center;
}
.info-item.full-width {
flex-basis: 100%;
min-width: 100%;
}
.label {
font-weight: bold;
color: #606266;
margin-right: 8px;
width: 100px;
text-align: right;
}
.value {
color: #303133;
flex: 1;
word-break: break-word;
}
.item-row{
border-bottom: 1px dashed #e8e8e8;
line-height: 36px;
padding-bottom: 10px;
margin-bottom: 10px;
}
.info-item{
line-height: 36px;
width: 100%;
.text{
display: inline-block;
width: 25%;
margin-right: 10px;
}
}
</style>

View File

@ -0,0 +1,157 @@
<template>
<div class="warning-item" >
<el-divider content-position="left">重点人员信息</el-divider>
<div class="info-container">
<div class="info-row">
<div class="info-item">
<span class="label">户籍地详址</span>
<span class="value">{{ row.hjdXz || '暂无' }}</span>
</div>
<div class="info-item">
<span class="label">管辖单位</span>
<span class="value">{{ row.gxSsbmmc || '暂无' }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">人员级别</span>
<span class="value">
<DictTag v-if="row.zdrRyjb" :tag="false" :value="row.zdrRyjb" :options="dict.D_GS_ZDR_RYJB" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">管控原因</span>
<span class="value">{{ row.zdrLkyy || '暂无' }}</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">管控状态</span>
<span class="value">
<DictTag v-if="row.zdrBkZt" :tag="false" :value="row.zdrBkZt" :options="dict.D_GS_ZDR_BK_ZT" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">处置状态</span>
<span class="value">
<DictTag v-if="row.zdrCzzt" :tag="false" :value="row.zdrCzzt" :options="dict.D_GS_ZDR_CZZT" />
<span v-else>暂无</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item">
<span class="label">审核状态</span>
<span class="value">
<DictTag v-if="row.zdrZt" :tag="false" :value="row.zdrZt" :options="dict.D_GS_ZDQT_ZT" />
<span v-else>暂无</span>
</span>
</div>
<div class="info-item">
<span class="label">系统状态</span>
<span class="value">
<div v-if="row.xtSjzt"> {{ row.xtSjzt == 0 ? "注销" : row.xtSjzt == 1 ? "正常" : "封存" }}</div>
<span v-else>暂无</span>
</span>
</div>
</div>
<div class="info-row">
<div class="info-item full-width">
<span class="label">标签</span>
<span class="value">
<ul v-if="row.bqList" style="display: flex;" >
<li :key="index" v-for="(item, index) in row.bqList">
{{ item.bqMc }}({{item.bqFz || 0 }} ) <span v-if="index < row.bqList.length - 1"></span>
</li>
</ul>
<span v-else>暂无</span>
</span>
</div>
</div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
/** 表格行数据 */
row: {
type: Object,
default: () => ({})
},
dict: {
type: Object,
default: () => ({
D_GS_SSYJ: [],
D_GSXT_YJXX_CZZT: []
})
},
})
</script>
<style lang="scss" scoped>
.warning-item {
width: 100%;
padding: 15px;
border-radius: 8px;
background-color: #fafafa;
}
// 新增的信息展示样式
.info-container {
margin-bottom: 15px;
}
.info-row {
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;
}
.info-item {
flex: 1;
min-width: 300px;
margin-bottom: 8px;
display: flex;
align-items: center;
}
.info-item.full-width {
flex-basis: 100%;
min-width: 100%;
}
.label {
font-weight: bold;
color: #606266;
margin-right: 8px;
width: 100px;
text-align: right;
}
.value {
color: #303133;
flex: 1;
word-break: break-word;
}
.item-row{
border-bottom: 1px dashed #e8e8e8;
line-height: 36px;
padding-bottom: 10px;
margin-bottom: 10px;
}
.info-item{
line-height: 36px;
width: 100%;
.text{
display: inline-block;
width: 25%;
margin-right: 10px;
}
}
</style>

View File

@ -3,157 +3,146 @@
</template> </template>
<script setup> <script setup>
import * as echarts from "echarts"; import * as echarts from "echarts";
import { fa } from "element-plus/es/locale.mjs";
import { onMounted, ref, reactive, defineProps, onUnmounted, watch, nextTick } from "vue"; import { onMounted, ref, reactive, defineProps, onUnmounted, watch, nextTick } from "vue";
const props = defineProps({ const props = defineProps({
echartsId:{ echartsId:{
type:String, type:String,
default:'lineId' default:'3DbarId'
}, },
data:{ data:{
type:Object, type:Array,
default:{ default:[]
list:[],
colors:[]
}
} }
}); });
watch(()=>props.data,val=>{
nextTick(()=>{ haandleData(val) })
},{immediate:true,deep:true})
const haandleData = (data)=>{ // 保存echarts实例
let val = [],x_value=[] const myChart = ref(null);
let color = data.colors;
let topColor = data.topColor;
data.list.forEach(item=>{
val.push(item.val);
x_value.push(item.label);
})
chartFn(val,x_value,color,topColor)
}
function chartFn(val,x_value,color,topColor) { // 定义resize处理函数
var myChart = echarts.init(document.getElementById(props.echartsId)); const handleResize = () => {
const sideData1 = val//[100, 110, 120, 134, 190, 230]; if (myChart.value) {
const name = ''; //"销量"; myChart.value.resize();
var x_value = x_value;//['周一', '周二', '周三', '周四', '周五', '周六', '周日'] }
var option = { };
tooltip: { trigger: 'axis' },
legend: { function chartFn() {
show: false, // 如果已有实例,先销毁
}, if (myChart.value) {
myChart.value.dispose();
}
// 创建新实例
myChart.value = echarts.init(document.getElementById(props.echartsId));
// 处理数据
const sideData1 = props.data.map(v => {
return {
value: v.value * 1.2,
itemStyle: {
color: v.color || '#1bd6c2'
}
};
});
const topData1 = props.data.map(v => {
return {
value: v.value + 0.1,
itemStyle: {
color: v.color || '#1bd6c2'
}
};
});
const option = {
grid: { grid: {
top:"30px", top: '8%',
left:"5px", left: '2%',
right:"0px", right: '2%',
bottom:"10%", bottom: '12%',
containLabel: true containLabel: true
}, },
toolbox: { tooltip: {
show: true, trigger: 'axis',
axisPointer: {
lineStyle: {
color: '#ddd'
}
},
backgroundColor: 'rgba(255,255,255,1)',
padding: [5, 10],
textStyle: {
color: '#7588E4'
},
extraCssText: 'box-shadow: 0 0 5px rgba(0,0,0,0.3)'
}, },
calculable: true, xAxis: {
xAxis: [ type: 'category',
{ data: props.data.map(v => v.label),
type: 'category', axisTick: {
splitLine: { show: false
show: false },
}, axisLine: {
data: x_value, show: false
axisLabel: { },
show: true, axisLabel: {
textStyle: { show: true,
color: "#333" //X轴文字颜色 color: '#fff',
}, interval: 0
},
} }
], },
yAxis: [ yAxis: {
{ type: 'value',
name:'单位:元/吨', splitLine: {
nameTextStyle: { color: "#fff" }, show: true,
type: 'value', lineStyle: {
splitLine: { show: false }, type: 'dashed',
axisLabel: { color: 'rgba(14,95,255,0.5)'
show: true, }
textStyle: { },
color: "#333" //X轴文字颜色 axisTick: {
}, show: false
}, },
axisLine: {
show: false
},
axisLabel: {
color: '#fff'
} }
], },
series: [ series: [
{ {
name: name,
tooltip: { show: false },
type: 'bar', type: 'bar',
barWidth: 12, data: props.data.map(v => v.value),
barWidth: '22', // 柱子的宽度
z: 1,
itemStyle: { itemStyle: {
normal: { color: '#004056' // 底部柱子的颜色
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: color ? color[0] : '#28EEBF'// 0% 处的颜色
}, {
offset: 1,
color: color ? color[1] : '#0DBAC5', // 100% 处的颜色
}], false)
}
},
data: sideData1,
barGap: 0,
label: {
show: true,
position: 'top',
distance: 10,
textStyle: {
color: '#0EBBC5',
fontSize: 14,
fontWeight: 'bold'
},
formatter: '{c}'
} }
}, },
{ {
name: name,
type: 'bar', type: 'bar',
barWidth: 12,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
offset: 0,
color: color ? color[0] : '#28EEBF'// 0% 处的颜色
}, {
offset: 1,
color: color ? color[1] : '#0DBAC5', // 100% 处的颜色
}], false)
}
},
barGap: 0,
data: sideData1, data: sideData1,
label: { barWidth: '22', // 柱子的宽度
show: true, z: 2,
position: 'top', itemStyle: {
textStyle: { color: function(params) {
color: 'white', return params.data.itemStyle.color || '#1bd6c2';
fontSize: 10
} }
} }
}, },
{ {
name: name, type: 'scatter',
tooltip: { data: topData1,
show: false
},
type: 'pictorialBar',
itemStyle: { itemStyle: {
borderWidth: 1, borderWidth: 1,
borderColor: '#fff', borderColor: '#fff',
color: topColor || '#1bd6c2' // 顶部方块的颜色 color: function(params) {
return params.data.itemStyle.color || '#1bd6c2';
}
}, },
symbol: 'path://M 0,0 l 90,0 l -60,60 l -90,0 z', symbol: 'path://M 0,0 l 90,0 l -60,60 l -90,0 z',
symbolSize: ['22', '12'], // 第一个值控制顶部方形大小 symbolSize: ['22', '12'],
symbolOffset: ['-0', '-6'], // 控制顶部放行 左右和上下 symbolOffset: ['-0', '-6'],
symbolRotate: -30, symbolRotate: -30,
symbolPosition: 'end', symbolPosition: 'end',
barGap: 0, barGap: 0,
@ -162,11 +151,29 @@ function chartFn(val,x_value,color,topColor) {
} }
] ]
}; };
option && myChart.setOption(option);
window.addEventListener('resize',function(){ option && myChart.value.setOption(option);
myChart.resize();
})
} }
// 监听数据变化
watch(() => props.data, val => {
nextTick(() => { chartFn() })
}, { immediate: true, deep: true })
// 组件挂载时初始化图表并添加事件监听
onMounted(() => {
chartFn();
window.addEventListener('resize', handleResize);
});
// 组件卸载时清理资源
onUnmounted(() => {
if (myChart.value) {
myChart.value.dispose();
myChart.value = null;
}
window.removeEventListener('resize', handleResize);
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -7,30 +7,42 @@ import { onMounted, ref, reactive, defineProps, onUnmounted, watch, nextTick } f
const props = defineProps({ const props = defineProps({
echartsId:{ echartsId:{
type:String, type:String,
default:'lineId' default:'barId'
}, },
data:{ color:{
type:Object, type:String,
default:{ default:'#fff'
list:[], },
colors:[] data:{
} type:Array,
default:[]
} }
}); });
watch(()=>props.data,val=>{
nextTick(()=>{ // 保存echarts实例
chartFn() const myChart = ref(null);
})
},{immediate:true,deep:true}) // 定义resize处理函数
const handleResize = () => {
if (myChart.value) {
myChart.value.resize();
}
};
function chartFn() { function chartFn() {
var myChart = echarts.init(document.getElementById(props.echartsId)); // 如果已有实例,先销毁
if (myChart.value) {
myChart.value.dispose();
}
// 创建新实例
myChart.value = echarts.init(document.getElementById(props.echartsId));
var option = { var option = {
grid: { grid: {
top: "16%", top: "8%",
right: "2%", right: "5%",
left: "2%", left: "10%",
bottom: "4%", bottom: "12%",
containLabel:true containLabel:true
}, },
tooltip: { tooltip: {
@ -45,13 +57,19 @@ function chartFn() {
textStyle: { textStyle: {
color: "#7588E4" color: "#7588E4"
}, },
extraCssText: "box-shadow: 0 0 5px rgba(0,0,0,0.3)"
}, },
xAxis: { xAxis: {
type: "category", type: "category",
data:props.data.list.map(v=>{return v.label}), data:props.data.map(v=>{return v.label}),
axisTick: { show: false }, axisTick: { show: false },
axisLine: { show: false }, axisLine: { show: false },
axisLabel: { color: "#fff",magin:20 }, axisLabel: {
show: true,
color: props.color,
interval: 0, // 强制显示所有标签
// rotate: 15, // 标签旋转角度
}
}, },
yAxis: { yAxis: {
type: "value", type: "value",
@ -64,41 +82,47 @@ function chartFn() {
}, },
axisTick: { show: false }, axisTick: { show: false },
axisLine: { show: false }, axisLine: { show: false },
axisLabel: { color: "#fff" }, axisLabel: { color: props.color },
}, },
series: [ series: [
{ {
data: props.data.map(v=>{return v.value}),
type: "bar", type: "bar",
barGap:'80%', barWidth: "30%",
barWidth: "20px",
data: props.data.list.map(v=>{return v.val}),
label:{
normal:{show:true,position:'top',color:'#EB00FF'}
},
itemStyle: { itemStyle: {
normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
color:function name(params) { { offset: 0, color: "rgba(102, 195, 226, 1)" },
let colorList = [] { offset: 1, color: "rgba(2, 80, 212, 1)" }
if(props.data.colors && props.data.colors.length>0){ ]),
props.data.colors.forEach(item => { borderRadius: [4, 4, 0, 0],
colorList.push(new echarts.graphic.LinearGradient( 0,0,0, 1,[{offset:0,color:item[0]},{offset:1,color:item[1]}])) shadowColor: "rgba(0,160,221,1)",
}); shadowBlur: 2
}
if(colorList.length > 0) return colorList[params.dataIndex]
else return new echarts.graphic.LinearGradient( 0,0,0, 1,[{ offset: 0,color: "rgba(0,244,255,1)"},{ offset: 1, color: "rgba(0,77,167,1)" }])
},
shadowColor: "rgba(0,160,221,1)",
shadowBlur: 2
}
}, },
} }
] ]
}; };
option && myChart.setOption(option); option && myChart.value.setOption(option);
window.addEventListener('resize',function(){
myChart.resize();
})
} }
// 监听数据变化
watch(()=>props.data,val=>{
nextTick(()=>{ chartFn() })
},{immediate:true,deep:true})
// 组件挂载时初始化图表并添加事件监听
onMounted(()=>{
chartFn();
window.addEventListener('resize', handleResize);
});
// 组件卸载时清理资源
onUnmounted(()=>{
if (myChart.value) {
myChart.value.dispose();
myChart.value = null;
}
window.removeEventListener('resize', handleResize);
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -9,21 +9,34 @@ const props = defineProps({
type:String, type:String,
default:'lineId' default:'lineId'
}, },
color:{ color:{
type:String, type:String,
default:'#fff' default:'#fff'
}, },
data:{ data:{
type:Array, type:Array,
default:[] default:[]
} }
}); });
watch(()=>props.data,val=>{
nextTick(()=>{ chartFn() }) // 保存echarts实例
},{immediate:true,deep:true}) const myChart = ref(null);
// 定义resize处理函数
const handleResize = () => {
if (myChart.value) {
myChart.value.resize();
}
};
function chartFn() { function chartFn() {
var myChart = echarts.init(document.getElementById(props.echartsId)); // 如果已有实例,先销毁
if (myChart.value) {
myChart.value.dispose();
}
// 创建新实例
myChart.value = echarts.init(document.getElementById(props.echartsId));
var option = { var option = {
grid: { grid: {
top: "8%", top: "8%",
@ -51,8 +64,7 @@ function chartFn() {
data:props.data.map(v=>{return v.label}), data:props.data.map(v=>{return v.label}),
axisTick: { show: false }, axisTick: { show: false },
axisLine: { show: false }, axisLine: { show: false },
axisLabel: { color: "#fff" }, axisLabel: {
axisLabel: {
show: true, show: true,
color: props.color, color: props.color,
interval: 0, // 强制显示所有标签 interval: 0, // 强制显示所有标签
@ -103,11 +115,28 @@ function chartFn() {
} }
] ]
}; };
option && myChart.setOption(option); option && myChart.value.setOption(option);
window.addEventListener('resize',function(){
myChart.resize();
})
} }
// 监听数据变化
watch(()=>props.data,val=>{
nextTick(()=>{ chartFn() })
},{immediate:true,deep:true})
// 组件挂载时初始化图表并添加事件监听
onMounted(()=>{
chartFn();
window.addEventListener('resize', handleResize);
});
// 组件卸载时清理资源
onUnmounted(()=>{
if (myChart.value) {
myChart.value.dispose();
myChart.value = null;
}
window.removeEventListener('resize', handleResize);
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -0,0 +1,446 @@
<template>
<div class="homeBox" style="background-color: #07274d;">
<!-- 头部 -->
<Head></Head>
<!-- 左边 -->
<!-- 右边 -->
<!-- 中间 -->
<div class="home-center">
<div class="middle-top">
<Yszs />
</div>
<div class="flex middle-bottom mt10">
<div style="width: 30px;position: absolute;z-index: 100;left: 0;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
<el-icon :size="20" v-if="ispLayBack" @click="closeLayBack">
<Bell />
</el-icon>
<el-icon :size="20" v-else @click="openLayBack">
<MuteNotification />
</el-icon>
</div>
<div style="width: 30px;position: absolute;z-index: 100;left: 34px;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
<el-tooltip class="item" effect="dark" :content="showNotification ? '通知关闭' : '通知打开'" placement="bottom">
<el-icon :size="20" @click="showNotification = !showNotification" style="top: 3px;">
<Open v-if="showNotification" />
<TurnOff v-else />
</el-icon>
</el-tooltip>
</div>
<div style="width: 100%;border: 1px sienna;position: relative">
<GdMap></GdMap>
</div>
<div class="flex-1" style="width: 340px;position: absolute;z-index: 100;right: 0;">
<DeployControl />
</div>
<div class="flex-1" style="width: 340px;position: absolute;z-index: 100;left: 0;top: 30%;">
<GeneralWindow />
</div>
</div>
</div>
</div>
</template>
<script setup>
import { qcckGet ,qcckPost} from "@/api/qcckApi.js";
import { ref, onMounted, onUnmounted } from 'vue'
import LeftDialog from './dialog/leftDialog'
import GdMap from "@/components/GdMap/index.vue";
import Head from './layout/head.vue'
import DbCount from './model/dbCount.vue'
import QbsbCount from './model/qbsbCount.vue'
import QblyType from './model/qblyType.vue'
import TextType from './model/textType.vue'
import Bkcz from './model/bkcz.vue'
import WarningLevels from './model/warningLevels.vue'
import BkWarning from './model/bkWarning.vue'
import Yszs from './model/yszs.vue'
import DeployControl from './model/deployControl.vue';
import Experience from './model/experience.vue'
import Calendar from './model/calendar.vue'
import KeyPpersonneltypes from './model/keyPpersonneltypes.vue'
import WarningDistrict from './model/WarningDistrict.vue'
import WarningPoints from './model/warningPoints.vue'
import { getItem, setItem } from "@/utils/storage";
import emitter from "@/utils/eventBus.js";
import { bm, centralPoint } from '@/views/backOfficeSystem/IntelligentControl/DeploymentArea/xzqh.js'
import Judgment from './model/judgment.vue'
import { tbYjxxGetList } from '@/api/zdr.js'
import GeneralWindow from './model/generalWindow.vue'
import WebSoketClass from '@/utils/webSocket.js'
import { timeValidate } from '@/utils/tools.js'
import Statistics from './model/statistics.vue'
// 导入音频播放器工具类
import audioPlayer from '@/utils/audioPlayer'
const webSoket = new WebSoketClass()
const modelWarning = ref(true)
const changeXzqh = (val, trg) => {
setTimeout(() => {
// 先移除已有的边界
emitter.emit('removeBj')
if (trg) {
// 如果传入的是多个区域数据(二维数组)
const features = val.map((area, index) => ({
geometry: {
type: "Polygon",
coordinates: [area] // 确保格式正确
},
properties: { },
type: "Feature"
}))
// 循环为每个区域创建单独的多边形,这样可以设置不同的样式
features.forEach((feature, index) => {
emitter.emit('setBoundarys', {
data: {
type: "FeatureCollection",
features: [feature]
},
color: 'rgba(209, 112, 65, 0.8)',
fillColor: 'rgba(255, 255, 255,0)',
outLineWidth: 2,
})
})
} else {
// 保持原来的逻辑,处理单个区域
emitter.emit('setBoundarys', {
data: {
type: "FeatureCollection",
features: [
{
geometry: {
type: "Polygon",
coordinates: [val] // 使用正确的GeoJSON格式
},
properties: {},
type: "Feature"
}
]
},
color: 'rgba(209 112 65,1)',
fillColor: 'rgba(255, 255, 255,0)',
})
}
}, 3000)
}
const getDepId = () => {
const deptId = getItem('deptId')
const deptLevel = deptId[0].deptLevel ? deptId[0].deptLevel : null
const deptCode = deptId[0].deptCode ? deptId[0].deptCode : null
if (deptLevel.startsWith('2')) {
const data = Object.values(bm).map(item => item);
changeXzqh(data, true)
} else {
switch (deptCode) {
case '54040200000'://巴宜区
changeXzqh(bm[542621])
break;
case '54042400000'://波密县
changeXzqh(bm[542625])
break;
case '54042500000'://察隅县
changeXzqh(bm[542626])
break;
case '54042100000'://工布江达县
changeXzqh(bm[542622])
break;
case '54042600000'://朗县
changeXzqh(bm[542627])
break;
case '54042200000'://米林县
changeXzqh(bm[542623])
break;
case '54042300000'://墨脱县
changeXzqh(bm[542624])
break;
default:
const data = Object.values(bm).map(item => item);
changeXzqh(data, true)
break;
}
}
}
const indexNum = ref(0) //当前展示的气泡框
const showNotification = ref(false) //是否自动展开提示
const makerCenter = () => {
const dw = require("@/assets/point/dingwei.png")
qcckGet({},'/mosty-gsxt/tbYjxx/selectSsbm').then(res=>{
emitter.emit('deletePointArea','hm')
emitter.emit('deletePointArea','hm_pop')
let list = res || [];
list.forEach(item => {
let obj = centralPoint.find(i => i.name == item.ssbm || i.ssbmdm == item.ssbmdm);
if(obj){
item.jd = obj.point[0];
item.wd = obj.point[1];
}
})
emitter.emit("addPointArea", { coords:list, icon: dw, flag: "hm", size: '14px', showTitle: false, offset: [0, -25] });
if(!showNotification.value){
setTimeout(() => {
// 没有主动展开提示,默认循环一个一个展示
if(list.length > 0){
emitter.emit("makerPopup", { data:list[indexNum.value], flag: "hm_pop",type:'Custom'});
indexNum.value == list.length ? indexNum.value = 0 : indexNum.value++
}
}, 1000);
}else{
// 主动展开提示,默认展示所有
}
})
}
//播放音频
const ispLayBack = ref(true)
// 打开播放
const openLayBack = () => {
ispLayBack.value = true
}
// 关闭播放
const closeLayBack = () => {
ispLayBack.value = false
audioPlayer.pause()
}
// 初始化音频播放器
const initAudioPlayer = () => {
// 使用工具类初始化音频播放器
audioPlayer.init(require('@/assets/images/yjsy.mp3'))
.then(() => {
console.log('音频播放器初始化成功');
// 只有当ispLayBack为true时才播放
if (ispLayBack.value) {
audioPlayer.muted = false
}
})
.catch(error => {
console.error('初始化音频播放器失败:', error);
})
}
const bnTimer = ref(null)
// 组件挂载时初始化音频播放器
onMounted(() => {
getDepId()
makerCenter()
bnTimer.value = setInterval(()=>{
// makerCenter()
},10000)
})
// 布控预警上图
const getTbYjxxGetList = () => {
// 设置为当天时间范围00:00:00 到 23:59:59
const today = new Date();
const startTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0).getTime();
const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 23, 59, 59).getTime();
const promes = {
startTime:timeValidate(startTime),
endTime:timeValidate(endTime),
}
tbYjxxGetList(promes).then(res => {
const coords = res.map(item => {
return {
id: item.id,
jd: item.jd,
wd: item.wd,
yjtp: item.yjTp,
yjnr: item.yjNr,
yjLx: item.yjlx,
yjlx: '01',
yjsj: item.yjSj,
rysfzh: item.yjRysfzh,
ryxm: item.yjRyxm,
}
})
const icon = require("@/assets/point/yj.png")
emitter.emit('addPoint', { coords: coords, icon: icon, flag: 'yj', fontColor: '#FF0000' })
})
}
let timing = ref(true)
// 情报翻转
const reversalPushShow = ref(true)
const reversalPush = () => {
reversalPushShow.value = !reversalPushShow.value
// 移除clearInterval调用避免定时器被清除
}
// 论坛翻转
const reversalShow = ref(true)
const reversal= () => {
reversalShow.value = !reversalShow.value
// 移除clearInterval调用避免定时器被清除
}
// 鼠标移入
const mouseEnter = () => {
clearInterval(timing.value)
}
// 鼠标移出
const mouseLeave = () => {
// 清除可能存在的旧定时器,避免多个定时器同时运行
clearInterval(timing.value)
// 设置为5秒自动切换更容易测试效果
timing.value = setInterval(() => {
reversalPush()
reversal()
}, 30000)
}
function changeModel(){
modelWarning.value = !modelWarning.value
}
onUnmounted(() => {
clearInterval(timing.value)
clearInterval(bnTimer.value)
// 组件卸载时停止音频播放并释放资源
if (audioPlayer) {
audioPlayer.destroy()
}
// 组件卸载时关闭WebSocket连接
if (webSoket) {
webSoket.closeConnection()
}
})
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.fxq {
border-radius: 35px;
width: 35px;
transition: transform 0.5s ease, width 0.5s ease;
background-color: rgb(1, 127, 245);
transform-origin: left center;
overflow: hidden;
margin-bottom: 10px;
.icon {
display: flex;
align-items: center;
width: 35px;
height: 35px;
justify-content: center;
line-height: 35px;
font-size: 30px;
}
.title {
height: 35px;
line-height: 35px;
img {
margin-left: 9.5px;
width: 16px;
margin-right: 10px;
margin-top: -3px;
vertical-align: middle;
height: 16px;
}
}
}
.fxq2 {
background-color: #9d88f9;
}
.fxq1:hover {
width: 120px;
}
.fxq2:hover {
width: 120px;
// background-color: red;
}
.fxq3:hover {
width: 120px;
}
::v-deep .badge-top-left .el-badge__content {
top: 0;
right: auto;
left: -10px;
transform: translateY(-50%) translateX(-50%);
}
.badge-content {
display: flex;
flex-direction: column;
overflow: hidden;
transition: all 0.3s ease;
max-height: 200px;
/* 默认展开的最大高度 */
min-height: 45px;
/* 确保收缩时有足够空间显示第一个图标 */
}
.badge-content:not(.expanded) {
max-height: 45px;
}
/* 收缩时只显示第一个图标,隐藏其他内容 */
.badge-content:not(.expanded)> :not(:first-child) {
opacity: 0;
max-height: 0;
margin: 0;
padding: 0;
overflow: hidden;
}
.badge-container {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
}
.home-foot-t {
display: flex;
}
/* Vue 过渡动画 - 翻转效果 */
.flip-enter-active,
.flip-leave-active {
transition: transform 0.6s ease, opacity 0.6s ease;
transform-style: preserve-3d;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.flip-enter-from {
transform: rotateY(90deg) translateZ(0);
opacity: 0;
}
.flip-leave-to {
transform: rotateY(-90deg) translateZ(0);
opacity: 0;
}
/* 包装层样式 */
.flip-wrapper {
position: relative;
width: 100%;
// height: calc(100%/3 - 8px);
height: 100%;
backface-visibility: hidden;
perspective: 1000px;
}
</style>

View File

@ -56,8 +56,7 @@
<Yszs /> <Yszs />
</div> </div>
<div class="flex middle-bottom mt10"> <div class="flex middle-bottom mt10">
<div <div style="width: 30px;position: absolute;z-index: 100;left: 0;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
style="width: 30px;position: absolute;z-index: 100;left: 0;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
<el-icon :size="20" v-if="ispLayBack" @click="closeLayBack"> <el-icon :size="20" v-if="ispLayBack" @click="closeLayBack">
<Bell /> <Bell />
</el-icon> </el-icon>
@ -65,6 +64,14 @@
<MuteNotification /> <MuteNotification />
</el-icon> </el-icon>
</div> </div>
<div style="width: 30px;position: absolute;z-index: 100;left: 34px;background-color: #07274d;height: 30px;text-align: center;line-height:30px;">
<el-tooltip class="item" effect="dark" :content="showNotification ? '通知关闭' : '通知打开'" placement="bottom">
<el-icon :size="20" @click="handleOpenNotification" style="top: 3px;">
<Open v-if="showNotification" />
<TurnOff v-else />
</el-icon>
</el-tooltip>
</div>
<div style="width: 100%;border: 1px sienna;position: relative"> <div style="width: 100%;border: 1px sienna;position: relative">
<GdMap></GdMap> <GdMap></GdMap>
</div> </div>
@ -83,7 +90,15 @@
<WarningPoints></WarningPoints> <WarningPoints></WarningPoints>
</div> </div>
<div style="width: 33%;"> <div style="width: 33%;">
<WarningLevels></WarningLevels> <transition name="flip" mode="out-in">
<div :key="'qb'" v-if="modelWarning" class="flip-wrapper">
<WarningLevels @changeModel="changeModel"></WarningLevels>
</div>
<div :key="'text'" v-else class="flip-wrapper">
<BkWarning @changeModel="changeModel"></BkWarning>
</div>
</transition>
</div> </div>
<div style="width: 33%;"> <div style="width: 33%;">
<Bkcz></Bkcz> <Bkcz></Bkcz>
@ -98,7 +113,7 @@
<script setup> <script setup>
import { qcckGet ,qcckPost} from "@/api/qcckApi.js"; import { qcckGet ,qcckPost} from "@/api/qcckApi.js";
import { ref, onMounted, onUnmounted } from 'vue' import { ref, onMounted, onUnmounted,getCurrentInstance } from 'vue'
import LeftDialog from './dialog/leftDialog' import LeftDialog from './dialog/leftDialog'
import GdMap from "@/components/GdMap/index.vue"; import GdMap from "@/components/GdMap/index.vue";
import Head from './layout/head.vue' import Head from './layout/head.vue'
@ -108,6 +123,7 @@ import QblyType from './model/qblyType.vue'
import TextType from './model/textType.vue' import TextType from './model/textType.vue'
import Bkcz from './model/bkcz.vue' import Bkcz from './model/bkcz.vue'
import WarningLevels from './model/warningLevels.vue' import WarningLevels from './model/warningLevels.vue'
import BkWarning from './model/bkWarning.vue'
import Yszs from './model/yszs.vue' import Yszs from './model/yszs.vue'
import DeployControl from './model/deployControl.vue'; import DeployControl from './model/deployControl.vue';
import Experience from './model/experience.vue' import Experience from './model/experience.vue'
@ -126,21 +142,22 @@ import { timeValidate } from '@/utils/tools.js'
import Statistics from './model/statistics.vue' import Statistics from './model/statistics.vue'
// 导入音频播放器工具类 // 导入音频播放器工具类
import audioPlayer from '@/utils/audioPlayer' import audioPlayer from '@/utils/audioPlayer'
const { proxy } = getCurrentInstance();
const { D_BZ_JQDJ } = proxy.$dict('D_BZ_JQDJ')
const webSoket = new WebSoketClass() const webSoket = new WebSoketClass()
const modelWarning = ref(true)
const changeXzqh = (val, trg) => { const changeXzqh = (val, trg) => {
setTimeout(() => { setTimeout(() => {
// 先移除已有的边界 // 先移除已有的边界
emitter.emit('removeBj') emitter.emit('removeBj')
if (trg) { if (trg) {
console.log("多个");
// 如果传入的是多个区域数据(二维数组) // 如果传入的是多个区域数据(二维数组)
const features = val.map((area, index) => ({ const features = val.map((area, index) => ({
geometry: { geometry: {
type: "Polygon", type: "Polygon",
coordinates: [area] // 确保格式正确 coordinates: [area] // 确保格式正确
}, },
properties: { properties: { },
},
type: "Feature" type: "Feature"
})) }))
// 循环为每个区域创建单独的多边形,这样可以设置不同的样式 // 循环为每个区域创建单独的多边形,这样可以设置不同的样式
@ -152,6 +169,7 @@ const changeXzqh = (val, trg) => {
}, },
color: 'rgba(209, 112, 65, 0.8)', color: 'rgba(209, 112, 65, 0.8)',
fillColor: 'rgba(255, 255, 255,0)', fillColor: 'rgba(255, 255, 255,0)',
outLineWidth: 2,
}) })
}) })
} else { } else {
@ -212,20 +230,46 @@ const getDepId = () => {
changeXzqh(data, true) changeXzqh(data, true)
break; break;
} }
}
}
const indexNum = ref(0) //当前展示的气泡框
const showNotification = ref(false) //是否自动展开提示
const allDep = ref([]) //所有部门
const handleOpenNotification = () => {
clearInterval(popupTimer.value)
showNotification.value = !showNotification.value;
emitter.emit('deletePointArea','hm_pop')
if(showNotification.value){
// 主动展开提示,默认展示所有
allDep.value.forEach(item => {
emitter.emit("makerPopup", { data:item, flag: "hm_pop",type:'Custom'});
})
} else {
// 关闭主动展开后,恢复循环单条气泡展示
startPopupLoop()
} }
} }
const makerCenter = () => { const makerCenter = () => {
const dw = require("@/assets/point/dingwei.png") const dw = require("@/assets/point/dingwei.png")
qcckGet({},'/mosty-gsxt/tbYjxx/selectSsbm').then(res=>{ qcckGet({},'/mosty-gsxt/lzJcjPjdb/selectCount').then(res=>{
// qcckGet({},'/mosty-gsxt/tbYjxx/selectSsbm').then(res=>{
emitter.emit('deletePointArea','hm')
let list = res || []; let list = res || [];
list.forEach(item => { list.forEach(item => {
let obj = centralPoint.find(i => i.name == item.ssbm); (item.jqjb || []).forEach(v=>{
v.jbmc = D_BZ_JQDJ.value.find(itm => itm.value == v.jbdm).label
})
let obj = centralPoint.find(i => i.name == item.ssbm || i.ssbmdm == item.ssbmdm);
if(obj){ if(obj){
item.jd = obj.point[0]; item.jd = obj.point[0];
item.wd = obj.point[1]; item.wd = obj.point[1];
} }
}) })
allDep.value = list;
emitter.emit("addPointArea", { coords:list, icon: dw, flag: "hm", size: '14px', showTitle: false, offset: [0, -25] }); emitter.emit("addPointArea", { coords:list, icon: dw, flag: "hm", size: '14px', showTitle: false, offset: [0, -25] });
}) })
} }
@ -258,16 +302,32 @@ const initAudioPlayer = () => {
console.error('初始化音频播放器失败:', error); console.error('初始化音频播放器失败:', error);
}) })
} }
const bnTimer = ref(null)
const popupTimer = ref(null)
const startPopupLoop = () => {
clearInterval(popupTimer.value)
popupTimer.value = setInterval(() => {
if (!showNotification.value && allDep.value.length > 0) {
emitter.emit('deletePointArea','hm_pop')
emitter.emit("makerPopup", { data: allDep.value[indexNum.value], flag: "hm_pop", type:'Custom' })
indexNum.value = (indexNum.value + 1) % allDep.value.length
}
}, 10000)
}
// 组件挂载时初始化音频播放器 // 组件挂载时初始化音频播放器
onMounted(() => { onMounted(() => {
getDepId() getDepId()
makerCenter() makerCenter()
bnTimer.value = setInterval(()=>{
makerCenter()
},60000)
startPopupLoop()
mouseLeave() mouseLeave()
getTbYjxxGetList() getTbYjxxGetList()
// 初始化音频播放器 // 初始化音频播放器
initAudioPlayer() initAudioPlayer()
webSoket.connect() // webSoket.connect()
// 监听音频播放事件获取WebSocket消息数据 // 监听音频播放事件获取WebSocket消息数据
emitter.on("openYp", (newsDate) => { emitter.on("openYp", (newsDate) => {
// 使用工具类播放音频,自动处理静音切换 // 使用工具类播放音频,自动处理静音切换
@ -344,6 +404,7 @@ const reversal= () => {
reversalShow.value = !reversalShow.value reversalShow.value = !reversalShow.value
// 移除clearInterval调用避免定时器被清除 // 移除clearInterval调用避免定时器被清除
} }
// 鼠标移入 // 鼠标移入
const mouseEnter = () => { const mouseEnter = () => {
clearInterval(timing.value) clearInterval(timing.value)
@ -358,8 +419,14 @@ const mouseLeave = () => {
reversal() reversal()
}, 30000) }, 30000)
} }
function changeModel(){
modelWarning.value = !modelWarning.value
}
onUnmounted(() => { onUnmounted(() => {
clearInterval(timing.value) clearInterval(timing.value)
clearInterval(bnTimer.value)
clearInterval(popupTimer.value)
// 组件卸载时停止音频播放并释放资源 // 组件卸载时停止音频播放并释放资源
if (audioPlayer) { if (audioPlayer) {
audioPlayer.destroy() audioPlayer.destroy()

View File

@ -148,7 +148,7 @@ const store = useStore();
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
const btns = reactive({ const btns = reactive({
rightBtn: ["实支撑", "安全监控"], rightBtn: ["实支撑", "安全监控"],
leftBtn: ["数据整合", '分析研判'], leftBtn: ["数据整合", '分析研判'],
moreBtn: [ moreBtn: [
{ name: '后台', img: require('@/assets/images/Group427322486.png') }, { name: '后台', img: require('@/assets/images/Group427322486.png') },
@ -195,7 +195,7 @@ const handleBtns = (val) => {
router.push("/ResearchHome"); router.push("/ResearchHome");
break; break;
case "后台": case "后台":
router.push("/editPassword"); router.push("/fouColorWarning");//editPassword
break; break;
case "安全监控": case "安全监控":
router.push("/BaseLibrary"); router.push("/BaseLibrary");

View File

@ -0,0 +1,85 @@
<template>
<div class="comom-title">
<div class="title">布控预警级别统计<span class="switchover" @click.stop="reversalPush">切换</span></div>
</div>
<div class="comom-cnt" style="border-right: 1px solid #ebebeb;width: 100%;" v-loading="loadingyj">
<DbarEcharts echartsId="bar3DYkChart" :data="cnList"></DbarEcharts>
</div>
</template>
<script setup>
import DbarEcharts from "@/views/home/echarts/3DbarEcharts.vue";
import { qcckGet } from "@/api/qcckApi.js";
import { onMounted,ref,defineEmits ,reactive} from "vue";
const emit = defineEmits(["changeModel"])
const loadingyj = ref(false)
let cnList = reactive({
list: [
{ label:'一级',val:0,type:'01' },
{ label:'二级',val:0,type:'02' },
{ label:'三级',val:0,type:'03' },
{ label:'四级',val:0,type:'04' },
],
topColor:'#1bd6c2',
colors: ["#28EEBF","#0DBAC5"],
})
onMounted(() => {
getYjczDate()
});
const getYjczDate = () => {
loadingyj.value = true;
qcckGet({}, '/mosty-gsxt/tbYjxx/bdbkYjxxTj').then(res => {
loadingyj.value = false;
let list = res || []
cnList.list.forEach(item => {
let obj = list.find(v => v.yj_jb == item.type)
item.val = obj?.count || 0
})
})
};
const reversalPush = () => {
emit('changeModel')
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
::v-deeep .comom-title{
background: url("~@/assets/images/bg18.png") no-repeat center center;
background-size: 100% 100%;
}
::v-deeep .comom-cnt{
background: url("~@/assets/images/bg18.png") no-repeat center center;
background-size: 100% 100%;
}
::v-deep .el-table td.el-table__cell{
color: #ffffff;
}
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{
background: rgba(0,61,130,0.75);
}
.switchover{
cursor: pointer;
font-size: 14px;
margin-left: 20px;
color: rgb(255, 146, 4);
}
</style>
<style lang="scss">
.zdy_bkcz_table td.el-table__cell {
color: #ffffff !important;
}
.zdy_bkcz_table th.el-table__cell {
color: #ffffff !important;
font-size: 15px;
}
</style>

View File

@ -216,8 +216,6 @@ const gettingData = () => {
const getAllFestivals = (date,boolean=false) => { const getAllFestivals = (date,boolean=false) => {
console.log(date);
const time = new Date(date) const time = new Date(date)
const solar = Solar.fromDate(time) const solar = Solar.fromDate(time)
const lunar = solar.getLunar() const lunar = solar.getLunar()

View File

@ -1,9 +1,10 @@
<template> <template>
<div class="comom-title"> <div class="comom-title">
<span class="title">线索研判盯办统计</span> <span class="title">线索研判盯办统计</span>
<el-popover placement="right" :width="430" :visible="visible"> <el-popover placement="right" :width="430" :visible="visible">
<template #reference> <template #reference>
<div class="title" style="position: relative;z-index: 10000;height: 40px;width: 40px;" @click="visible = true"></div> <div class="title" style="position: relative;z-index: 10000;height: 40px;width: 40px;" @click="visible = true">
</div>
</template> </template>
<div> <div>
<div class="qbltData"> <div class="qbltData">
@ -15,23 +16,30 @@
</el-popover> </el-popover>
</div> </div>
<ul class="comom-cnt xsBox flex flex-warp just-between align-center"> <ul class="comom-cnt xsBox flex flex-warp just-between align-center">
<li class="xs-item" v-for="(item, idx) in contentItem" :key="idx"> <li class="xs-item" v-for="(item, idx) in contentItem" :key="idx" @click="openTc(item.type)">
{{ item.label }}:{{ item.value }} {{ item.label }}:{{ item.value }}
</li> </li>
</ul> </ul>
<TotalNumberClues v-model="openShow.xfzs" :title="title" :sfqs="sfqs" :sffk="sffk" />
<TotalNumberDistributions v-model="openShow.xszs" />
<informationCollection v-model="openShow.cjzs" :title="title"/>
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from 'vue'; import { ref, onMounted, reactive } from 'vue';
import TimeData from '@/views/home/model/mesgSwitch/timeData.vue' import TimeData from '@/views/home/model/mesgSwitch/timeData.vue'
import TotalNumberClues from '@/views/home/components/totalNumberClues.vue'
import TotalNumberDistributions from '@/views/home/components/totalNumberDistributions.vue'
import informationCollection from '@/views/home/components/informationCollection.vue'
import { qbcjDpxsCount } from "@/api/model.js" import { qbcjDpxsCount } from "@/api/model.js"
const contentItem = ref([ const contentItem = ref([
{ label: '线索总数', value: '0' }, { label: '信息采集总数', value: '0', type: 'cjzs' },
{ label: '下发总数', value: '0' }, { label: '线索总数', value: '0', type: 'xszs' },
{ label: '已处置总数', value: '0' }, { label: '下发总数', value: '0', type: 'xfzs' },
{ label: '反馈总数', value: '0' }, { label: '已签收', value: '0', type: 'yqss' },
{ label: '未反馈总数', value: '0' }, { label: '未签收', value: '0', type: 'wqss' },
{ label: '未处置总数', value: '0' }, { label: '已反馈', value: '0', type: 'fkzs' },
]) ])
const visible = ref(false) const visible = ref(false)
const changeTime = (val) => { const changeTime = (val) => {
@ -40,22 +48,84 @@ const changeTime = (val) => {
} }
getCount() getCount()
} }
const title = ref('线索总数')
onMounted(() => { onMounted(() => {
qbcjDpxsCount({}, '/mosty-gsxt/tbXs/getXsCount').then(res => {
qbcjDpxsCount({}, '/mosty-gsxt/qbcj/dpxsCount').then(res => {
res = res || {} res = res || {}
// 根据API返回的数据更新contentItem // 根据API返回的数据更新contentItem
contentItem.value = [ contentItem.value = [
{ label: '线索总数', value: res.xszs || 0 }, { label: '信息采集总数', value: res.cjzs || 0, type: 'cjzs' },
{ label: '下发总数', value: res.xfzs || 0 }, { label: '线索总数', value: res.xszs || 0, type: 'xszs' },
{ label: '已处置总数', value: res.yczzs || 0 }, { label: '下发总数', value: res.xfzs || 0, type: 'xfzs' },
{ label: '反馈总数', value: res.fkzs || 0 }, { label: '已签收', value: res.yqss || 0, type: 'yqss' },
{ label: '未反馈总数', value: res.wfkzs || 0 }, { label: '未签收', value: res.wfkzs || 0, type: 'wqss' },
{ label: '未处置总数', value: res.wczzs || 0 }, { label: '已反馈', value: res.fkzs || 0, type: 'fkzs' },
] ]
}) })
}) })
const openShow = reactive({
cjzs: false,
xszs: false,
xfzs: false,
yqss: false,
wqss: false,
fkzs: false,
})
const sfqs = ref('')
const sffk = ref('')
const openTc = (val) => {
sfqs.value = ''
sffk.value = ''
switch (val) {
case 'cjzs':
openShow.cjzs = true
title.value = '信息采集总数'
break;
case 'xszs':
openShow.xszs = true
title.value = '线索总数'
break;
case 'wqss':
sfqs.value = '0'
sffk.value = ''
openShow.xfzs = true
title.value = '未签收'
break;
case 'xfzs':
openShow.xfzs = true
title.value = '下发总数'
break;
case 'yqss':
sfqs.value = '1'
sffk.value = ''
openShow.xfzs = true
title.value = '已签收'
break;
case 'fkzs':
sfqs.value = ''
sffk.value = '1'
openShow.xfzs = true
title.value = '已反馈'
break;
}
}
// // 信息采集总数
// const xsCount = () => {
// xxcjQbcjSelectPage({}).then(res => {
// console.log(res);
// })
// }
// // 线索总数
// const xfxsCount = () => {
// xxcjXfxsSelectPage({}).then(res => {
// console.log(res);
// })
// }
const close = () => { const close = () => {
visible.value = false visible.value = false
} }
@ -68,8 +138,11 @@ const close = () => {
.xsBox { .xsBox {
background: url("~@/assets/images/bg_12.png") no-repeat center center; background: url("~@/assets/images/bg_12.png") no-repeat center center;
background-size: 100% 100%; background-size: 100% 100%;
position: relative;
z-index: 299;
.xs-item { .xs-item {
cursor: pointer;
width: 31%; width: 31%;
height: 36px; height: 36px;
line-height: 36px; line-height: 36px;
@ -78,6 +151,7 @@ const close = () => {
background-size: 100% 100%; background-size: 100% 100%;
} }
} }
.qbltData { .qbltData {
width: 100%; width: 100%;
display: flex; display: flex;

View File

@ -207,10 +207,10 @@ const content = ref({
const chooseItem = (item) => { const chooseItem = (item) => {
console.log(item.yjlx); console.log(item.yjlx);
switch (item.yjlx) { switch (item.yjlx) {
case '01': case '01':
tbYjxxGetInfo(item.id).then(res => { tbYjxxGetInfo(item.id).then(res => {
console.log(res);
content.value = { content.value = {
id: item.id, id: item.id,
ryxm: res.yjRyxm || '', ryxm: res.yjRyxm || '',
@ -221,11 +221,13 @@ const chooseItem = (item) => {
yjnr: res.yjNr || '', yjnr: res.yjNr || '',
yjbq: res.yjbqmc || '', yjbq: res.yjbqmc || '',
yjlx: item.yjlx || '', yjlx: item.yjlx || '',
yjLx: res.yjLx || '',
jd: res.jd || 0, jd: res.jd || 0,
wd: res.wd || 0, wd: res.wd || 0,
yjjb: item.yjjb || '', yjjb: item.yjjb || '',
czzt: res.czzt || '', czzt: res.czzt || '',
yjbt: res.yjBt || '', yjbt: res.yjBt || '',
cph: res.yjClcph || '',
} }
emitter.emit('showHomeYJ', [content.value]); emitter.emit('showHomeYJ', [content.value]);
}) })

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="comom-title" @click="chooseForumPost"> <div class="comom-title" @click="chooseForumPost">
<!-- <span class="title">情报论坛</span> --> <!-- <span class="title">情报论坛</span> -->
<div class="title">情报论坛<span class="switchover" @click.stop="reversalPush">切换</span></div> <div class="title" style="width: 100%;">情报论坛<span class="switchover" @click.stop="reversalPush">切换</span></div>
</div> </div>
<div class="comom-cnt" > <div class="comom-cnt" >
<div class="zdryBox"> <div class="zdryBox">
@ -213,7 +213,8 @@ onBeforeUnmount(() => {
.switchover{ .switchover{
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
margin-left: 20px; margin-left: 20%;
color: rgb(255, 146, 4); color: rgb(255, 146, 4);
} }
</style> </style>

View File

@ -1,8 +1,7 @@
<template> <template>
<div class="comom-title"> <div class="comom-title">
<!-- <span class="title">重点人员类型</span> --> <div class="title" style="width: 70%;">重点人员类型<span class="switchover" @click.stop="reversalPush">切换</span></div>
<div class="title">重点人员类型<span class="switchover" @click.stop="reversalPush">切换</span></div> <div class="title titleFz" @click="visible = true">
<div class="title titleFz" style="" @click="visible = true">
查看列表 查看列表
</div> </div>
</div> </div>
@ -66,5 +65,6 @@ tbGsxtZdryzdryBqtjFn()
font-size: 14px; font-size: 14px;
margin-left: 20px; margin-left: 20px;
color: rgb(255, 146, 4); color: rgb(255, 146, 4);
margin-left: 23%;
} }
</style> </style>

View File

@ -37,6 +37,7 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Search from "@/components/aboutTable/Search.vue"; import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue"; import Pages from "@/components/aboutTable/Pages.vue";
import { qbcjSelectPage } from "@/api/Intelligence.js"; import { qbcjSelectPage } from "@/api/Intelligence.js";
import {xxcjSelectPage,xxcjXxzsx} from '@/api/xxcj.js'
import { ref, reactive, getCurrentInstance, watch } from "vue"; import { ref, reactive, getCurrentInstance, watch } from "vue";
import { useRoute,useRouter } from 'vue-router' import { useRoute,useRouter } from 'vue-router'
const route = useRoute() const route = useRoute()
@ -68,9 +69,9 @@ const searchConfiger = ref([
options: D_BZ_QBSBLY options: D_BZ_QBSBLY
}, { }, {
label: "上报时间", label: "上报时间",
prop: "lrkssj", prop: "startTime",
placeholder: "请选择时间", placeholder: "请选择时间",
showType: "daterange" showType: "datetimerange"
}, },
@ -86,7 +87,7 @@ const pageData = reactive({
tableConfiger: { tableConfiger: {
loading: false, loading: false,
rowHieght: 40, rowHieght: 40,
haveControls: true, haveControls: false,
}, },
controlsWidth: 160, //操作栏宽度 controlsWidth: 160, //操作栏宽度
total: 0, total: 0,
@ -109,8 +110,8 @@ const pageData = reactive({
const parameter = ref() const parameter = ref()
const onSearch = (val) => { const onSearch = (val) => {
const promes = { const promes = {
lrkssj: val.lrkssj && val.lrkssj.length > 0 ? val.lrkssj[0] : '', startTime: val.startTime && val.startTime.length > 0 ? val.startTime[0] : '',
lrjssj: val.lrkssj && val.lrkssj.length > 0 ? val.lrkssj[1] : '', endTime: val.startTime && val.startTime.length > 0 ? val.startTime[1] : '',
} }
parameter.value = { ...val, ...promes } parameter.value = { ...val, ...promes }
pageData.pageConfiger.pageCurrent = 1; pageData.pageConfiger.pageCurrent = 1;
@ -123,8 +124,8 @@ watch(() => props.modelValue, (val) => {
}) })
const changePage = () => { const changePage = () => {
pageData.tableConfiger.loading = true; pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...parameter.value }; let data = { ...pageData.pageConfiger, ...parameter.value,qbjb:'01' };
qbcjSelectPage(data).then(res => { xxcjSelectPage(data).then(res => {
pageData.tableData = res.records || []; pageData.tableData = res.records || [];
pageData.total = res.total; pageData.total = res.total;
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;

View File

@ -1,9 +1,8 @@
<template> <template>
<div> <div>
<el-date-picker v-model="listQuery" :type="type" :shortcuts="shortcuts" range-separator="至" start-placeholder="开始时间" <el-date-picker v-model="listQuery" :type="type" :shortcuts="shortcuts" range-separator="至" start-placeholder="开始时间"
:value-format="valueFrmat" :format="valueFrmat" end-placeholder="结束时间" @change="changeTime" /> :value-format="valueFrmat" :format="valueFrmat" end-placeholder="结束时间" @change="changeTime" />
</div> </div>
</template> </template>
<script setup> <script setup>

View File

@ -1,5 +1,5 @@
<template> <template>
<el-dialog :model-value="modelValue" @update:model-value="emit('update:modelValue', $event)" title="重点人员列表" width="70%" @close="closeDialog" destroy-on-close> <el-dialog :model-value="modelValue" @update:model-value="emit('update:modelValue', $event)" title="重点人员列表" width="70%" @close="closeDialog" destroy-on-close append-to-body>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search> <Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
<MyTable customClass="zdy_peo_table" :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" <MyTable customClass="zdy_peo_table" :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="comom-title"> <div class="comom-title">
<div class="title">岗位标兵<span class="switchover" @click="reversalPush">切换</span></div> <div class="title" style="width: 100%;">岗位标兵<span class="switchover" @click="reversalPush">切换</span></div>
<el-popover :visible="visible" placement="right" :width="430"> <el-popover :visible="visible" placement="right" :width="430">
<template #reference> <template #reference>
<div class="title" style="position: relative;z-index: 10000;height: 40px;width: 40px;" @click="visible = true"> <div class="title" style="position: relative;z-index: 10000;height: 40px;width: 40px;" @click="visible = true">
@ -100,5 +100,6 @@ const close = () => {
font-size: 14px; font-size: 14px;
margin-left: 20px; margin-left: 20px;
color: rgb(255, 146, 4); color: rgb(255, 146, 4);
margin-left: 25%;
} }
</style> </style>

View File

@ -11,15 +11,22 @@
<div class="table-wrapper"> <div class="table-wrapper">
<el-table :data="tableData" style="width: 100%" height="calc(100% - 1px)" :header-cell-style="{ <el-table
background: 'transparent', :data="tableData"
color: '#0d4b8a', style="width: 100%"
borderColor: '#0d4b8a' stripe
}" :row-style="{ height="calc(100% - 1px)"
background: 'transparent', :header-cell-style="{
color: '#fff', background: 'transparent',
borderColor: '#0d4b8a' color: '#ffffff',
}" stripe> borderColor: '#0d4b8a'
}"
:row-style="{
background: 'transparent',
color: '#fff',
borderColor: '#0d4b8a'
}"
>
<el-table-column prop="ssbm" label="部门名称" min-width="120" show-overflow-tooltip /> <el-table-column prop="ssbm" label="部门名称" min-width="120" show-overflow-tooltip />
<el-table-column prop="xm" label="姓名" min-width="80" show-overflow-tooltip /> <el-table-column prop="xm" label="姓名" min-width="80" show-overflow-tooltip />
<!-- 信息员积分 研判员积分 --> <!-- 信息员积分 研判员积分 -->
@ -90,7 +97,7 @@ defineExpose({
gap: 10px; gap: 10px;
.tab-button { .tab-button {
padding: 0px 4px; padding: 0px 10px;
background: rgba(0, 77, 167, 0.6); background: rgba(0, 77, 167, 0.6);
color: #fff; color: #fff;
border: 1px solid #0099ff; border: 1px solid #0099ff;
@ -98,15 +105,17 @@ defineExpose({
cursor: pointer; cursor: pointer;
transition: all 0.3s ease; transition: all 0.3s ease;
font-size: 14px; font-size: 14px;
opacity: 0.3;
&:hover { &:hover {
background: rgba(0, 77, 167, 0.8); // background: rgba(0, 77, 167, 0.8);
opacity: 0.4;
} }
&.active { &.active {
background: rgba(0, 244, 255, 0.8); opacity: 1;
color: #000; // background: rgba(0, 244, 255, 0.8);
border-color: #00f4ff; // color: #0072ff;
// border-color: #00f4ff;
} }
} }
} }
@ -184,4 +193,7 @@ defineExpose({
} }
} }
} }
::v-deep .el-table .cell.el-tooltip{
color: #fff;
}
</style> </style>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="comom-title"> <div class="comom-title">
<div class="title">情报文本类型<span class="switchover" @click="reversalPush">切换</span></div> <div style=" width: 100%;" class="title">信息来源类型统计<span class="switchover" @click="reversalPush">切换</span></div>
<el-popover placement="right" :width="430" :visible="visible"> <el-popover placement="right" :width="430" :visible="visible">
<template #reference> <template #reference>
<div class="title" style="position: relative;z-index: 10000;height: 40px;width: 40px;" @click="visible = true"></div> <div class="title" style="position: relative;z-index: 10000;height: 40px;width: 40px;" @click="visible = true"></div>
@ -20,13 +20,15 @@
</template> </template>
<script setup> <script setup>
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost,qcckGet } from "@/api/qcckApi.js";
import BarHatEcharts from "@/views/home/echarts/barHatEcharts.vue"; import BarHatEcharts from "@/views/home/echarts/barHatEcharts.vue";
import { onMounted, reactive, ref } from "vue"; import { onMounted, reactive, ref } from "vue";
import TimeData from '@/views/home/model/mesgSwitch/timeData.vue' import TimeData from '@/views/home/model/mesgSwitch/timeData.vue'
const list = ref({ const list = ref({
xDate: ['上访','诈骗','敲诈勒索','盗窃'], xDate: ['共享','内部','林安码'],
list:[{ name: "总数", value: [0,0,0,0] ,color:['rgba(0,244,255,1)','rgba(0,77,167,1)'] ,hatColor:'#087df9'}], list:[{ name: "总数", value: [0,0,0] ,color:['rgba(0,244,255,1)','rgba(0,77,167,1)'] ,hatColor:'#087df9'}],
// xDate: ['上访','诈骗','敲诈勒索','盗窃'],
// list:[{ name: "总数", value: [0,0,0,0] ,color:['rgba(0,244,255,1)','rgba(0,77,167,1)'] ,hatColor:'#087df9'}],
}) })
onMounted(() => { onMounted(() => {
@ -38,13 +40,14 @@ const getCount = () => {
startTime: listQuery.value?.startTime || "", startTime: listQuery.value?.startTime || "",
endTime: listQuery.value?.endTime || "" endTime: listQuery.value?.endTime || ""
} }
qcckPost(promes, '/mosty-gsxt/qbcj/getXscjTjBySszt').then(res => { qcckGet(promes, '/mosty-gsxt/xxcj/xxlylx').then(res => {
console.log(res); list.value.list[0].value = [res.gxxx || 0,res.nbxx || 0,res.lam || 0]
list.value.xDate = res ? res.map(v=> v.zdmc):[];
list.value.list[0].value = res ? res.map(v => v.count) : [0, 0, 0, 0];
console.log(list.value);
}) })
// qcckPost(promes, '/mosty-gsxt/qbcj/getXscjTjBySszt').then(res => {
// list.value.xDate = res ? res.map(v=> v.zdmc):[];
// list.value.list[0].value = res ? res.map(v => v.count) : [0, 0, 0, 0];
// console.log(list.value);
// })
} }
const visible = ref(false) const visible = ref(false)
const changeTime = (val) => { const changeTime = (val) => {
@ -85,5 +88,7 @@ const close = () => {
font-size: 14px; font-size: 14px;
margin-left: 20px; margin-left: 20px;
color: rgb(255, 146, 4); color: rgb(255, 146, 4);
width: 100%;
margin-left: 10%;
} }
</style> </style>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="comom-title"> <div class="comom-title">
<div class="title">四色预警统计</div> <div class="title">四色预警统计<span class="switchover" @click.stop="reversalPush">切换</span></div>
</div> </div>
<div class="comom-cnt" style="border-right: 1px solid #ebebeb;width: 100%;" v-loading="loadingyj"> <div class="comom-cnt" style="border-right: 1px solid #ebebeb;width: 100%;" v-loading="loadingyj">
<WarningCount ref="yjjbRef"></WarningCount> <WarningCount ref="yjjbRef"></WarningCount>
@ -10,9 +10,15 @@
<script setup> <script setup>
import { qcckGet, qcckPost } from "@/api/qcckApi.js"; import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import WarningCount from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/WarningCount.vue"; import WarningCount from "@/views/backOfficeSystem/fourColorManage/warningControl/centerHome/components/WarningCount.vue";
import { onMounted,ref } from "vue"; import { onMounted,ref,defineEmits } from "vue";
const yjjbRef = ref() const yjjbRef = ref()
const loadingyj = ref(false) const loadingyj = ref(false)
const emit = defineEmits(["changeModel"])
const reversalPush = () => {
emit('changeModel')
}
const getYjczDate = () => { const getYjczDate = () => {
loadingyj.value = true; loadingyj.value = true;
qcckGet({}, '/mosty-gsxt/tbYjxx/getYjxxTj').then(res => { qcckGet({}, '/mosty-gsxt/tbYjxx/getYjxxTj').then(res => {
@ -50,7 +56,13 @@ getYjczDate()
} }
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{ ::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{
background: rgba(0,61,130,0.75); background: rgba(0,61,130,0.75);
}
.switchover{
cursor: pointer;
font-size: 14px;
margin-left: 20px;
color: rgb(255, 146, 4);
} }
</style> </style>
<style lang="scss"> <style lang="scss">
@ -61,4 +73,5 @@ getYjczDate()
color: #ffffff !important; color: #ffffff !important;
font-size: 15px; font-size: 15px;
} }
</style> </style>

View File

@ -9,7 +9,7 @@
:tableColumn="pageData.tableColumn" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :key="pageData.keyCount"
:isScroll="true" :isScroll="isScroll"
:tableConfiger="pageData.tableConfiger" :tableConfiger="pageData.tableConfiger"
> >
</DarkTable> </DarkTable>
@ -17,9 +17,10 @@
</template> </template>
<script setup> <script setup>
import { reactive,onMounted } from 'vue' import { reactive,onMounted,ref } from 'vue'
import DarkTable from '@/components/aboutTable/DarkTable.vue' import DarkTable from '@/components/aboutTable/DarkTable.vue'
import { qcckGet } from "@/api/qcckApi.js"; import { qcckGet } from "@/api/qcckApi.js";
const isScroll = ref(false)
const pageData = reactive({ const pageData = reactive({
tableData: [], tableData: [],
keyCount: 0, keyCount: 0,
@ -47,10 +48,12 @@ const getList = () => {
pageData.tableConfiger.loading = true pageData.tableConfiger.loading = true
qcckGet({},'/mosty-gsxt/tbYjxx/selectYjxxFzTen').then(res => { qcckGet({},'/mosty-gsxt/tbYjxx/selectYjxxFzTen').then(res => {
let list = res || [] let list = res || []
isScroll.value = list.length > 3 ? true : false;
pageData.tableData = list.map((item, index) => { pageData.tableData = list.map((item, index) => {
item.order = index + 1 item.order = index + 1
return item return item
}) })
pageData.tableConfiger.loading = false pageData.tableConfiger.loading = false
}).catch(() => { }).catch(() => {
pageData.tableConfiger.loading = false pageData.tableConfiger.loading = false

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="ww100 h80 flex just-between align-center pl10 pr10"> <div class="ww100 h80 flex just-between align-center pl10 pr10">
<div class="flex align-center" v-for="(item, idx) in contentItem" :key="idx"> <div class="flex align-center" v-for="(item, idx) in contentItem" :key="idx" @click="openTc(item.type)">
<div class="mr10"><img :src="item.icon" alt=""></div> <div class="mr10"><img :src="item.icon" alt=""></div>
<div class="vountItem"> <div class="vountItem">
<div style="color:#ffffff" class="f16 lh20">{{ item.label }}</div> <div style="color:#ffffff" class="f16 lh20">{{ item.label }}</div>
@ -8,14 +8,23 @@
</div> </div>
</div> </div>
</div> </div>
<PoliceReports v-model="openJqzs"/>
<NumberWarnings v-model="openYjzs"/>
<keyPerson v-model="openZdry"/>
<keyGroups v-model="openZdqt"/>
</template> </template>
<script setup> <script setup>
import { qcckPost } from "@/api/qcckApi.js"; import { qcckPost } from "@/api/qcckApi.js";
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import PoliceReports from '@/views/home/components/policeReports.vue'
import NumberWarnings from '@/views/home/components/numberWarnings.vue'
import keyPerson from "@/views/home/components/keyPerson.vue";
import keyGroups from "@/views/home/components/keyGroups.vue";
const contentItem = ref([ const contentItem = ref([
{ type:"jqzs", label: "警情总数", value: "0" ,icon:require('@/assets/images/top-1.png')}, { type:"jqzs", label: "今日警情", value: "0" ,icon:require('@/assets/images/top-1.png')},
{ type:"yjzs", label: "预警总数", value: "0",icon:require('@/assets/images/top-2.png') }, { type:"yjzs", label: "今日预警", value: "0",icon:require('@/assets/images/top-2.png') },
{ type:"zdry", label: "重点人员总数", value: "0",icon:require('@/assets/images/top-3.png') }, { type:"zdry", label: "重点人员总数", value: "0",icon:require('@/assets/images/top-3.png') },
{ type:"zdqt", label: "重点群体总数", value: "0" ,icon:require('@/assets/images/top-4.png')}, { type:"zdqt", label: "重点群体总数", value: "0" ,icon:require('@/assets/images/top-4.png')},
]); ]);
@ -32,6 +41,29 @@ const getCount = () =>{
} }
}) })
} }
// 打开警情总数
const openJqzs = ref(false)
const openYjzs = ref(false)
const openZdry = ref(false)
const openZdqt = ref(false)
const openTc = (val) => {
switch (val) {
case 'jqzs':
openJqzs.value = true
break;
case 'yjzs':
openYjzs.value = true
break;
case 'zdry':
openZdry.value = true
break;
case 'zdqt':
openZdqt.value = true
break;
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -5,12 +5,12 @@ function resolve(dir) {
} }
// http://47.108.232.77:9537/mosty-api/mosty-zhgj/docs.html // http://47.108.232.77:9537/mosty-api/mosty-zhgj/docs.html
// const serverHost = "http://47.108.232.77:9537"//线上 // const serverHost = "http://47.108.232.77:9537"//线上
// const serverHost = "http://192.168.0.231:8006"//线上 const serverHost = "http://192.168.2.206:8006"//线上
// const serverHost = "http://192.168.191.75:8006"//周 // const serverHost = "http://192.168.191.75:8006"//周
// const serverHost = "http://192.168.212.75:8016"//周 // const serverHost = "http://192.168.212.75:8016"//周
// const serverHost = "http://192.168.1.98:8006"//毛毛 // const serverHost = "http://192.168.1.98:8006"//毛毛
// const serverHost = "http://192.168.193.75:8006"//线上 // const serverHost = "http://192.168.193.75:8006"//线上
const serverHost = "http://47.108.232.77:9537"//线上 // const serverHost = "http://47.108.232.77:9537"//线上
module.exports = { module.exports = {
// configureWebpack: { // configureWebpack: {
// resolve: { // resolve: {