解决冲突

This commit is contained in:
13684185576
2025-07-31 11:39:51 +08:00
98 changed files with 55172 additions and 809 deletions

4
.gitignore vendored
View File

@ -1,6 +1,8 @@
.DS_Store
node_modules
/dist
# dist/
# build/
gsxt/
# local env files
.env.local

120
package-lock.json generated
View File

@ -1431,18 +1431,28 @@
}
},
"@paddlejs-mediapipe/opencv": {
"version": "0.0.4",
"resolved": "https://registry.npmmirror.com/@paddlejs-mediapipe/opencv/-/opencv-0.0.4.tgz",
"integrity": "sha512-bfwixZPKGFh7JcAtLToTBmBiu/nyQjVrm0gf/pn92apHJQEYyhnAFGvgDubmqQbijmtP2/fbOMR4CuSSlq2g8w=="
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@paddlejs-mediapipe/opencv/-/opencv-0.0.3.tgz",
"integrity": "sha512-ISSZVIeCUQDV4JBHmMXH4t2FQ0p/Qdz3+I1CuMPUg9qyqqYL5SbqL9ji0b6MOQyCOkO7MV37pSFjx9WjZEzP/g=="
},
"@paddlejs-models/ocr": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/@paddlejs-models/ocr/-/ocr-1.2.4.tgz",
"integrity": "sha512-mdvaWXQaCmLULEvCxcsUzHtDgmoDVzJX2LsqyMmJxSzfhgrtnscF1eLiLbaouDwg6n08koXP0BCzeB+0oAv/AQ==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@paddlejs-models/ocr/-/ocr-1.1.2.tgz",
"integrity": "sha512-uIsyO2bINgEFU2qmSdKWuUhnmyZX03Ktozh93CloiSTbWq66r0qI6KEuxzIQtm+j6pgugLXrvmtoo2tk0SbpVA==",
"requires": {
"@paddlejs-mediapipe/opencv": "0.0.4",
"@paddlejs/paddlejs-backend-webgl": "^1.1.19",
"@paddlejs/paddlejs-core": "^2.1.17"
"@paddlejs-mediapipe/opencv": "0.0.3",
"@paddlejs/paddlejs-backend-webgl": "^1.1.4",
"@paddlejs/paddlejs-core": "^2.1.7"
}
},
"@paddlejs-models/ocrdet": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@paddlejs-models/ocrdet/-/ocrdet-0.0.3.tgz",
"integrity": "sha512-V7sH8cbyhlR7wkpd1/ycfdA+HiD9XuwIQiFlnwOClFIlZ31EyW10LcMrkhaU7x8uG2BYANFeOz4mBrhE9JRElQ==",
"requires": {
"@paddlejs-mediapipe/opencv": "0.0.3",
"@paddlejs/paddlejs-backend-webgl": "^1.1.0",
"@paddlejs/paddlejs-core": "^2.1.0"
}
},
"@paddlejs/paddlejs-backend-webgl": {
@ -3356,6 +3366,16 @@
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true
},
"blueimp-canvas-to-blob": {
"version": "3.29.0",
"resolved": "https://registry.npmmirror.com/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz",
"integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg=="
},
"bmp-js": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
"integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw=="
},
"bn.js": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
@ -7905,6 +7925,11 @@
}
}
},
"idb-keyval": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.2.tgz",
"integrity": "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg=="
},
"ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@ -7922,6 +7947,15 @@
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true
},
"image-compressor.js": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/image-compressor.js/-/image-compressor.js-1.1.4.tgz",
"integrity": "sha512-DF1YFSw+m6FqpXsleD4+q9eu/wFFkm8sHuYhgYy5GWFVencXeuB1/UqC12xz+dCZooPetf5LIb8JOGkgEWmlcg==",
"requires": {
"blueimp-canvas-to-blob": "^3.14.0",
"is-blob": "^1.0.0"
}
},
"image-size": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
@ -8285,6 +8319,11 @@
"binary-extensions": "^2.0.0"
}
},
"is-blob": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/is-blob/-/is-blob-1.0.0.tgz",
"integrity": "sha512-QIZDHQZpRfMEZwSTD7egdNZS7H/awVW9FZ3yJv+gg1z8d8GPXEs76QWL67fZs2BoBqp2dGtamTJpEYFJHmD73g=="
},
"is-boolean-object": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
@ -9952,6 +9991,14 @@
"lower-case": "^1.1.1"
}
},
"node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
"requires": {
"whatwg-url": "^5.0.0"
}
},
"node-forge": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
@ -10273,6 +10320,11 @@
"is-wsl": "^1.1.0"
}
},
"opencollective-postinstall": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
"integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
},
"opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
@ -14284,6 +14336,27 @@
}
}
},
"tesseract.js": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/tesseract.js/-/tesseract.js-6.0.1.tgz",
"integrity": "sha512-/sPvMvrCtgxnNRCjbTYbr7BRu0yfWDsMZQ2a/T5aN/L1t8wUQN6tTWv6p6FwzpoEBA0jrN2UD2SX4QQFRdoDbA==",
"requires": {
"bmp-js": "^0.1.0",
"idb-keyval": "^6.2.0",
"is-url": "^1.2.4",
"node-fetch": "^2.6.9",
"opencollective-postinstall": "^2.0.3",
"regenerator-runtime": "^0.13.3",
"tesseract.js-core": "^6.0.0",
"wasm-feature-detect": "^1.2.11",
"zlibjs": "^0.3.1"
}
},
"tesseract.js-core": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-6.0.0.tgz",
"integrity": "sha512-1Qncm/9oKM7xgrQXZXNB+NRh19qiXGhxlrR8EwFbK5SaUbPZnS5OMtP/ghtqfd23hsr1ZvZbZjeuAGcMxd/ooA=="
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -14468,6 +14541,11 @@
"punycode": "^2.1.1"
}
},
"tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"traverse": {
"version": "0.6.6",
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
@ -15109,6 +15187,11 @@
"integrity": "sha512-WJrK7i6w+ULuZsGscCezbCH4Aev5U3xY87vnSimzzEgPQhb0Sa0a1rE3c2jtEwrFtSfi61Jefw3jI5/DD/3jbQ==",
"dev": true
},
"wasm-feature-detect": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz",
"integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ=="
},
"watchpack": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
@ -15263,6 +15346,11 @@
"resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
"integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
},
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"webpack": {
"version": "4.46.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz",
@ -15784,6 +15872,15 @@
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"dev": true
},
"whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"requires": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@ -16047,6 +16144,11 @@
}
}
},
"zlibjs": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/zlibjs/-/zlibjs-0.3.1.tgz",
"integrity": "sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w=="
},
"zrender": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.3.2.tgz",

View File

@ -15,7 +15,8 @@
"@fullcalendar/list": "^5.9.0",
"@fullcalendar/timegrid": "^5.9.0",
"@fullcalendar/vue3": "^5.9.0",
"@paddlejs-models/ocr": "^1.2.4",
"@paddlejs-models/ocr": "^1.1.2",
"@paddlejs-models/ocrdet": "^0.0.3",
"@types/video.js": "^7.3.42",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
@ -27,11 +28,13 @@
"element-plus": "2.0.2",
"file-saver": "^2.0.5",
"gifler": "^0.1.0",
"image-compressor.js": "^1.1.4",
"lodash": "^4.17.21",
"mitt": "^3.0.0",
"moment": "^2.30.1",
"ol": "^6.14.1",
"pinia": "^3.0.1",
"tesseract.js": "^6.0.1",
"vue": "^3.2.8",
"vue-router": "^4.0.11",
"vuex": "^4.0.2",

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
import * as ocr from "@paddlejs-models/ocr";
import { ref, nextTick, provide, onMounted,getCurrentInstance } from "vue";
import { useStore } from "vuex";
import { getItem } from "@/utils/storage";
import { getItem, setItem} from "@/utils/storage";
import { generateNewStyle, writeNewStyle } from "@/utils/theme";
const { proxy } = getCurrentInstance();
const store = useStore();
@ -26,7 +26,7 @@ const reload = () => {
provide("reload", reload);
onMounted(() => {
document.title = "林芝";
initPage()
// initPage()
});
/**
@ -41,7 +41,6 @@ const initPage = async () => {
} catch (err) {
proxy.$message({ type: "error", message: "加载失败,请刷新页面" });
imgIsLoad = false;
// initPage()
}
}

View File

@ -599,7 +599,7 @@ export const selectUserDeptPage = (data = {}) => {
///unifiedLogin
export const unifiedLogin = (data) => {
return request({
url: api + `/unifiedLogin`,
url: api + `/ssoLogin`,
method: "POST",
data
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 948 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 2C10.477 2 6 6.477 6 12C6 19.5 16 30 16 30C16 30 26 19.5 26 12C26 6.477 21.523 2 16 2ZM16 16C13.791 16 12 14.209 12 12C12 9.791 13.791 8 16 8C18.209 8 20 9.791 20 12C20 14.209 18.209 16 16 16Z" fill="#00f0ff" stroke="#ffffff" stroke-width="1"/>
</svg>

Before

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,125 @@
<template>
<div style="border: 1px solid #ccc">
<!-- 工具栏 -->
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" />
<!-- 编辑器 -->
<Editor :style="`height: ${props.heightNumber}px; overflow-y: hidden`" v-model="editorVal" :defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" @onChange="handChange" />
</div>
</template>
<script setup>
import { compressImage } from "@/utils/tools.js";
import "@wangeditor/editor/dist/css/style.css";
import { qcckPost } from "@/api/qcckApi.js";
import { ElMessage } from "element-plus";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import {
ref,
onMounted,
shallowRef,
onBeforeUnmount,
defineEmits,
defineProps,
watch
} from "vue";
const props = defineProps({
// 编辑器内容
modelValue: {
type: String,
default: ""
},
markitVal: {
type: String,
default: ""
},
placeholder: {
type: String,
default: "请输入内容。。。。"
},
heightNumber: {
type: Number,
default: 500
}
});
const editorVal = ref("");
const editorRef = shallowRef();
const mode = "default";
const valueHtml = ref(""); //内容
//工具配置
const toolbarConfig = {
excludeKeys: ["blockquote", "codeBlock"] //清除不必要的工具,引用和代码块
};
const emits = defineEmits(["update:modelValue", "changeFn"]);
//编辑器配置
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);
}
}
// server: "/mosty-api/mosty-base/minio/image/upload",
// base64LimitSize: 10000 * 1024,
},
uploadVideo: {
// 自定义上传视频
async customUpload(file, insertFn) {
await uploadFn(file, insertFn);
}
}
}
};
watch(
[() => props.markitVal, () => editorRef.value],
(val) => {
// if (val) editorRef.value = val;
if ((val[0] && val[1]) || val[0] == "") {
editorVal.value = val[0];
}
},
{ deep: true, immediate: true }
);
const uploadFn = (file, insertFn) => {
let param = new FormData();
param.append("file", file);
qcckPost(param, "/mosty-base/minio/image/upload").then((res) => {
insertFn(res);
});
};
//编辑器创建成功
const handleCreated = (editor) => {
editorRef.value = editor;
};
//内容发生变化
const handChange = (editor) => {
// console.log(editor.getHtml(),'editor.getText()');
// 判断是否是一个空段落,是空就传空文本
if (editor.isEmpty()) {
emits("changeFn", editor.getText());
} else {
emits("changeFn", editor.getHtml());
}
};
onBeforeUnmount(() => {
const editor = editorRef.value;
if (editor) editor.destroy();
});
</script>
<style lang="scss" scoped>
</style>

View File

@ -1,12 +1,21 @@
<template>
<div class="form-item-box" :style="{ width: width }">
<el-date-picker style="width:100%" v-model="modelValue" type="date" v-bind="$attrs" @change="onInput" :placeholder="placeholder" :value-format="props.format"/>
<el-date-picker
style="width:100%"
v-model="localModelValue"
:type="props.type"
v-bind="$attrs"
@change="onInput"
:placeholder="placeholder"
:value-format="props.format"
/>
</div>
</template>
<script setup>
import { COMPONENT_WIDTH } from "@/constant";
import { ref, defineProps, defineEmits, defineExpose } from "vue";
import { ref, defineProps, defineEmits, defineExpose, computed } from "vue";
const props = defineProps({
//获取组件传值
placeholder: {
@ -25,12 +34,21 @@ const props = defineProps({
default: COMPONENT_WIDTH,
type: String
},
type: {
default: "date",
type: String
}
});
const emits = defineEmits(["update:modelValue"]);
// 使用计算属性处理双向绑定
const localModelValue = computed({
get: () => props.modelValue,
set: (value) => emits("update:modelValue", value)
});
const onInput = (e) => {
emits("update:modelValue", e);
};
</script>
</script>

View File

@ -83,6 +83,10 @@ const props = defineProps({
inline: {
type: Boolean,
default: true
},
disabled: {
type: Boolean,
default: false
}
});
const elform = ref();
@ -103,18 +107,25 @@ const reset = () => {
elform.value.resetFields()
}
// 修改这里的watch逻辑避免无限循环
let isUpdatingFromProps = false;
watch(() => listQuery.value, (newVal) => {
if (newVal) emits("update:modelValue", newVal);
}, { immediate: true, deep: true });
if (newVal && !isUpdatingFromProps) {
emits("update:modelValue", newVal);
}
}, { deep: true });
watch(() => props.modelValue, (newVal) => {
// 只有在新值确实变化时才更新(避免空值覆盖)
if (newVal && Object.keys(newVal).length > 0) {
isUpdatingFromProps = true;
listQuery.value = { ...newVal };
setTimeout(() => {
isUpdatingFromProps = false;
}, 0);
}
}, { immediate: true, deep: true });
defineExpose({ submit, reset });
</script>

View File

@ -1,12 +1,10 @@
<template>
<div style="width: 100%">
<div style="width: 100%" :class="getConfiger.showSelectType === 'radio' ? 'tabBoxRadio' : ''">
<!-- hasChildren要在tableData中定义表示当前行有没有下一级 children要在tableData中定义表示下一级的数据-->
<el-table
ref="multipleTableRef"
:data="tableData"
@selection-change="handleSelectionChange"
@current-change="handleCurrentChange"
@row-click="singleElection"
:row-key="getConfiger.rowKey"
:border="getConfiger.border"
:default-expand-all="getConfiger.defaultExpandAll"
@ -21,23 +19,7 @@
:highlight-current-row="getConfiger.showSelectType === 'radio'"
:row-style="{ height: getConfiger.rowHeight === 'auto' ? getConfiger.rowHeight : getConfiger.rowHeight + 'px'}"
>
<el-table-column
type="selection"
width="55"
v-if="getConfiger.showSelectType === 'checkBox'"
/>
<el-table-column
width="55"
v-else-if="getConfiger.showSelectType === 'radio'"
#default="{ row }"
>
<el-radio
class="radio"
v-model="getConfiger.radioChoose"
:label="row[getConfiger.rowKey]"
>&nbsp;</el-radio
>
</el-table-column>
<el-table-column type="selection" width="55" />
<el-table-column
type="index"
label="序号"
@ -148,19 +130,16 @@ onMounted(() => {
});
// 可选的时候选择的数据
const handleSelectionChange = (val) => {
emit("chooseData", val);
};
// 单选的时候选择的数据
const handleCurrentChange = (val) => {
currentRow.value = val;
emit("chooseData", val);
};
const singleElection = (val) => {
if (getConfiger.showSelectType === "radio") {
getConfiger.radioChoose = val[getConfiger.rowKey];
if(getConfiger.showSelectType === 'radio' && val.length > 1){
let del_row = val.shift();
multipleTableRef.value.toggleRowSelection(del_row, false);
currentRow.value = val;
emit("chooseData", val);
}else{
emit("chooseData", val);
}
};
// 懒加载数据的方法
const load = (date, treeNode, resolve) => {
setTimeout(() => {
@ -184,25 +163,14 @@ const load = (date, treeNode, resolve) => {
function setDefaultChoose() {
nextTick(() => {
// 多选的默认选中
if (
props.tableConfiger.defaultSelectKeys?.length > 0 &&
props.tableConfiger.showSelectType === "checkBox"
) {
if ( props.tableConfiger.defaultSelectKeys?.length > 0 && props.tableConfiger.showSelectType === "checkBox" ) {
props.tableData.forEach((item) => {
if (
props.tableConfiger.defaultSelectKeys.findIndex(
(v) => v === item[props.tableConfiger.rowKey]
) > -1
) {
if ( props.tableConfiger.defaultSelectKeys.findIndex( (v) => v === item[props.tableConfiger.rowKey] ) > -1) {
multipleTableRef.value.toggleRowSelection(item, true);
}
});
// 单选的默认选中
} else if (
props.tableConfiger.defaultSelectKeys &&
props.tableConfiger.defaultSelectKeys?.length > 0 &&
props.tableConfiger.showSelectType === "radio"
) {
} else if ( props.tableConfiger.defaultSelectKeys && props.tableConfiger.defaultSelectKeys?.length > 0 && props.tableConfiger.showSelectType === "radio" ) {
getConfiger.radioChoose = props.tableConfiger.defaultSelectKeys[0];
}
});
@ -212,3 +180,12 @@ function setDefaultChoose() {
<style lang = "scss">
</style>
<style>
.tabBoxRadio .el-checkbox__inner {
border-radius: 50% !important;
}
.tabBoxRadio .el-table__header-wrapper .el-checkbox {
display: none;
}
</style>

View File

@ -0,0 +1,114 @@
<template>
<el-dialog v-model="modelValue" center width="1000px" :destroy-on-close="true" title="报告模板" @close="close" :close-on-click-modal="false">
<div class="cntBox">
<!-- 工具栏 -->
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" />
<!-- 编辑器 -->
<Editor :style="`height: ${props.heightNumber}px; overflow-y: hidden`" v-model="textContent" :defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" @onChange="handChange" />
</div>
<template #footer>
<el-button type="primary">暂存</el-button>
<el-button type="primary">下载</el-button>
<el-button type="primary" @click="close">取消</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { compressImage } from "@/utils/tools.js";
import "@wangeditor/editor/dist/css/style.css";
import { qcckPost } from "@/api/qcckApi.js";
import { ElMessage } from "element-plus";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { ref, shallowRef, onBeforeUnmount, defineEmits, defineProps, watch } from "vue";
const props = defineProps({
modelValue:{
type:Boolean,
default:false
},
// 编辑器内容
textContent: {
type: String,
default: ""
},
placeholder: {
type: String,
default: "请输入内容。。。。"
},
heightNumber: {
type: Number,
default: 448
}
});
const editorRef = shallowRef();
const mode = "default";
//工具配置
const toolbarConfig = {
excludeKeys: ["blockquote", "codeBlock"] //清除不必要的工具,引用和代码块
};
const emits = defineEmits(["update:textContent", "changeFn"]);
//编辑器配置
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 uploadFn = (file, insertFn) => {
let param = new FormData();
param.append("file", file);
qcckPost(param, "/mosty-base/minio/image/upload").then((res) => {
insertFn(res);
});
};
//编辑器创建成功
const handleCreated = (editor) => {
editorRef.value = editor;
};
//内容发生变化
const handChange = (editor) => {
console.log(editor.getHtml(),'====editor.getHtml()');
// 判断是否是一个空段落,是空就传空文本
if (editor.isEmpty()) {
emits("changeFn", editor.getText());
} else {
emits("changeFn", editor.getHtml());
}
};
onBeforeUnmount(() => {
const editor = editorRef.value;
if (editor) editor.destroy();
});
</script>
<style lang="scss" scoped>
.cntBox{
height: 60vh;
padding: 8px;
box-sizing: border-box;
overflow: hidden;
overflow-y: auto;
border: 1px dashed #e9e9e9;
}
</style>

View File

@ -56,7 +56,9 @@ onMounted(() => {
active.value = "LZ";
});
const logout = () => {
store.dispatch("user/logout");
window.opener = null;
window.open('', '_self');
window.close();
store.commit("app/clearTag", null, { immediate: true });
store.commit("permission/deleteRouter", { immediate: true });
store.commit("user/deleteKeepLiiveRoute", "home");

View File

@ -28,13 +28,12 @@ const updatePwd = () => {
const store = useStore();
const logout = () => {
store.dispatch("user/logout");
store.commit("app/clearTag", null, {
immediate: true
});
store.commit("permission/deleteRouter", {
immediate: true
});
window.opener = null;
window.open('', '_self');
window.close();
store.commit("app/clearTag", null, { immediate: true });
store.commit("permission/deleteRouter", { immediate: true });
store.commit("user/deleteKeepLiiveRoute", "home");
};
</script>

View File

@ -221,7 +221,7 @@ export default {
removeAllItem();
// 待补充 清理权限相关的配置
if (isOatuh) {
window.location.href = `http://80.149.27.78:8001/login`;
window.location.href = `http://155.240.22.102:40992`;
} else {
router.push("/login");
}

View File

@ -73,17 +73,24 @@ service.interceptors.response.use(
// 通用下载方法
export function download(url, params, filename, config) {
let token = localStorage.getItem('token')
return axios.post(url, params, {"Content-type": "multipart/form-data",headers:{"Authorization": `${token}`}}).then( async (data) => {
const isBlob = blobValidate(data.data);
console.log(isBlob,'====data');
return service.post(url, params, {
transformRequest: [(params) => { return tansParams(params) }],
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob',
...config
}).then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data.data])
const blob = new Blob([data])
saveAs(blob, filename)
} else {
ElMessage.error('网络异常');
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
ElMessage.error(errMsg);
}
// downloadLoadingInstance.close();
}).catch((r) => {
ElMessage.error('下载文件出现错误,请联系管理员!')
})
}

View File

@ -1,6 +1,6 @@
import ImageCompressor from "image-compressor.js";
// 随机颜色 - 把16进制的颜色换成rgba格式
export function choseRbgb(color,opcity) {
if(color){
@ -13,6 +13,36 @@ export function choseRbgb(color,opcity) {
return `rgba(${r},${g},${b},${a})`
}
}
// 随机十六进制颜色
export function randomHexColor() { // 随机生成十六进制颜色
var hex = Math.floor(Math.random() * 16777216).toString(16);
while (hex.length < 6) {
hex = '0' + hex;
}
return '#' + hex;
}
/**
* 压缩图片
* @param {*} file
* @param {*} quality 压缩比
*/
export function compressImage(file, quality = 0.6) {
return new Promise((resolve, reject) => {
new ImageCompressor(file, {
quality, //压缩质量
success(res) {
let fileData = new File([res], res.name, { type: res.type });
resolve(fileData);
},
error(e) {
reject("图片压缩失败,请稍后再试");
},
});
});
};
// 今天周几
export function weekValidate() {
let week = new Date().getDay()

View File

@ -18,7 +18,7 @@
</div>
<div class="foot">
<div class="footBtn"><span>发布指令</span></div>
<div class="footBtn" @click="gozl"><span>发布指令</span></div>
</div>
</div>
</template>
@ -29,6 +29,11 @@ import Head from "@/views/home/layout/head.vue";
import ImportantPerson from "./model/importantPerson.vue";
import Zdrqhd from "./model/zdrqhd.vue";
import Yjclqktj from "./model/yjclqktj.vue";
import { useRoute, useRouter } from 'vue-router';
const router = useRouter()
const gozl = () =>{
router.push('/InstructionInformation')
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";

View File

@ -2,8 +2,8 @@
<div class="personBox" id="zdrxxtj">
<div class="asideTitle mt60">
<div>
<span class="title">重点人信息统计</span>
<span :class="active == it ? 'active'+`${idx}`:''" @click="changeDate(it)" class="tabsBtn pointer" v-for="(it,idx) in btns" :key="it">{{ it }}</span>
<span class="title">重点人信息统计</span>
<span :class="active == it ? 'active'+`${idx}`:''" @click="changeDate(it)" class="tabsBtn pointer" v-for="(it,idx) in btns" :key="it">{{ it }}</span>
</div>
</div>
<div class="asideCnt">
@ -15,6 +15,16 @@
<template #qtFxdj="{row}">
<DictTag :tag="false" :value="row.qtFxdj" :options="D_GS_ZDQT_FXDJ"/>
</template>
<template #bqList="{row}">
<span v-if="row.bqList">
<span v-for="(it, idx) in row.bqList" :key="idx">{{it.bqMc }}</span>
</span>
</template>
<template #qbcjList="{row}">
<span v-if="row.qbcjList">
<span v-for="(it, idx) in row.qbcjList" :key="idx">{{it.xsMc }}</span>
</span>
</template>
<template #qtZt="{row}">
<DictTag :tag="false" :value="row.qtZt" :options="D_GS_ZDQT_ZT"/>
</template>
@ -34,10 +44,7 @@ const keywords = ref(''); // 搜索关键字
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT,D_BZ_RYBQ,D_GS_ZDQT_FXDJ } = proxy.$dict('D_GS_ZDQT_ZT','D_BZ_RYBQ','D_GS_ZDQT_FXDJ') //获取字典数据
const pageData = reactive({
tableData: [
{ ryXm: "王五", rySfzh: "330102199505057890", bq: "吸毒人员" },
{ ryXm: "王五", rySfzh: "330102199505057890", bq: "吸毒人员" },
],
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
@ -54,8 +61,8 @@ const pageData = reactive({
tableColumn: [
{ label: "姓名", prop: "ryXm", showOverflowTooltip: true },
{ label: "身份证号码", prop: "rySfzh",showOverflowTooltip: true },
{ label: "标签", prop: "bq",showOverflowTooltip: true },
{ label: "所属线索", prop: "xsmc",showOverflowTooltip: true },
{ label: "标签", prop: "bqList",showOverflowTooltip: true,showSolt:true },
{ label: "所属线索", prop: "qbcjList",showOverflowTooltip: true,showSolt:true },
]
});

View File

@ -1,182 +0,0 @@
<template>
<!-- 弹框 -->
<el-dialog v-model="dialogVisible" title="智能解析数据" width="80vw">
<div class="infoCnt">
<div class="baseInfo">
<div v-for="(item, index) in tableData" :key="index" >
发掘文本{{ index + 1 }}:<span class="text-danger">{{ item.fjWb }}</span>
</div>
</div>
<MyTable
:tableData="pageData.dtoList"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
:row-class-name="({ row }) => (row.status ? '' : 'row-deleted')"
>
<!-- 管辖单位 -->
<template #gxDwDm="{ row }">
<el-select
v-model="row.gxDwDm"
placeholder="请选择管辖单位"
style="width: 130px"
@change="handleDeptChange('gxDwMc', $event, row)"
:disabled="!row.status"
>
<el-option v-for="item in deptList" :key="item.value" :label="item.label" :value="item.value.toString()"/>
</el-select>
</template>
<!-- 是否关注 -->
<template #sfGz="{ row }">
<el-radio-group v-model="row.sfGz">
<el-radio v-for="(item, index) in D_BZ_SF" size="large" :key="index" :label="item.zdmc || item.label" :value="item.dm || item.value"></el-radio>
</el-radio-group>
</template>
<!-- 管辖单位 -->
<template #ryFjZp="{ row }"> 照片上传 </template>
<template :key="idx" v-for="(item,idx) in pageData.tableColumn.filter((col) => !['gxDwDm', 'sfGz', 'ryFjZp'].includes(col.prop) )" #[item.prop]="{ row }">
<el-input style="width: 100px" v-model="row[item.prop]" :placeholder="'请输入' + item.label" :disabled="!row.status" />
</template>
<!-- 操作列 -->
<template #controls="{ row, $index }">
<el-link v-if="row.status" type="danger" @click="delDictItem($index)">删除</el-link>
<el-link v-else type="primary" @click="recover($index)"> 恢复 </el-link>
</template>
</MyTable>
<div class="stats">
共 {{ pageData.dtoList.length }} 条数据, 其中
{{ pageData.dtoList.filter((x) => !x.status).length }} 条已标记删除
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitData"> 确定 </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, defineEmits,onMounted, getCurrentInstance, defineExpose } from "vue";
import { selectUserDeptPage } from "@/api/user-manage";
import { ElMessage } from "element-plus";
const { proxy } = getCurrentInstance();
const { D_BZ_SF } = proxy.$dict("D_BZ_SF"); //获取字典数据
const props = defineProps({
tableData: {
type: Array,
default: () => []
}
});
const emit = defineEmits(['upadate'])
const dialogVisible = ref(false);
const pageData = reactive({
dtoList: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false
},
tableHeight: 330,
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 80,
tableColumn: [
{ label: "管辖单位", prop: "gxDwDm", showSolt: true, width: 200 },
{ label: "姓名", prop: "ryXm", showSolt: true, width: 130 },
{ label: "手机号码", prop: "rySjhm", showSolt: true, width: 130 },
{ label: "身份证号码", prop: "rySfzh", showSolt: true, width: 130 },
{ label: "户籍地址", prop: "ryHjdz", showSolt: true, width: 130 },
{ label: "护照号码", prop: "ryHzhm", showSolt: true, width: 130 },
{ label: "现住地址", prop: "ryXzdz", showSolt: true, width: 130 },
{ label: "银行卡号", prop: "ryYhkh", showSolt: true, width: 130 },
{ label: "是否关注", prop: "sfGz", showSolt: true, width: 130 },
{ label: "附件照片", prop: "ryFjZp", showSolt: true, width: 130 }
]
});
const deptList = ref([]); //部门列表
onMounted(() => {
getdepartmentList();
});
// 获取部门列表
const getdepartmentList = () => {
selectUserDeptPage().then((res) => {
deptList.value = res?.records.map((item) => ({
label: item.deptName,
value: item.deptId
}));
});
};
const handleDeptChange = (nameField, selectedValue, row) => {
// 找到选中的部门
const selectedDept = deptList.value.find((item) => item.value.toString() === selectedValue);
// 更新名称
row[nameField] = selectedDept ? selectedDept.label : "";
};
const init = () => {
dialogVisible.value = true;
qcckGet({}, "/mosty-gsxt/tbGsxtRqfjRy/createCbfj").then((res) => {
pageData.dtoList = res.map((item) => ({ ...item, status: true }));
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
// 删除方法
const delDictItem = (index) => {
pageData.dtoList[index].status = false;
ElMessage.success("已标记为删除");
};
// 恢复方法
const recover = (index) => {
pageData.dtoList[index].status = true;
ElMessage.success("已恢复");
};
// 提交
const submitData = () => {
const validData = pageData.dtoList.filter((item) => item.status);
qcckPost(validData, "/mosty-gsxt/tbGsxtRqfjRy/saveList").then((res) => {
ElMessage.success("新增成功");
dialogVisible.value = false;
emit("upadate");
close();
})
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
/* 为已删除的行添加特殊样式 */
.el-table .row-deleted {
background-color: #fef0f0;
color: #f56c6c;
}
.infoCnt{
height: 63vh;
}
.baseInfo{
font-size: 16px;
max-height: 230px;
overflow: hidden;
overflow-y: auto;
line-height: 24px;
color: #000;
font-weight: 600;
letter-spacing: 1px;
.text-danger {
color: #333;
font-weight: normal;
}
}
</style>

View File

@ -3,119 +3,50 @@
<div class="head_box" >
<span class="title">{{ title }}重点人管理</span>
<div>
<el-button
type="primary"
size="small"
:loading="loading"
@click="submit"
v-if="title.value !== '详情'"
>保存</el-button
>
<el-button type="primary" size="small" :loading="loading" @click="submit" v-if="!disabled">保存</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>
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" ref="elform" :rules="rules"></FormMessage>
</div>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
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 { selectUserDeptPage } from "@/api/user-manage";
import { ref, defineExpose,defineProps, defineEmits } from "vue";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dic: Object
});
const { proxy } = getCurrentInstance();
const { D_GS_RQFJ_LX } = proxy.$dict("D_GS_RQFJ_LX"); //获取字典数据
const tagDialog = ref();
const dialogForm = ref(false); //弹窗
const formData = ref([
{ label: "发掘类型", prop: "fjLx", type: "select", options: D_GS_RQFJ_LX },
{ label: "发掘文本", prop: "fjWb", type: "textarea", width: "100%" }
{ label: "数据来源", prop: "sjly", type: "select", options:props.dic.D_GS_RQFJ_LX,disabled:true },
{ label: "是否发掘", prop: "sffj", type: "select", options: props.dic.D_BZ_SF,disabled:true },
{ label: "数据时间", prop: "sj", type: "datetime"},
{ label: "指向地点", prop: "dd", type: "textarea", width: "100%" },
{ label: "数据内容", prop: "nr", type: "textarea", width: "100%" },
]);
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const title = ref("");
const editpeo = ref();
const title = ref("编辑");
const disabled = ref(false)
// 初始化数据
const init = (type, row) => {
const init = (row) => {
dialogForm.value = true;
title.value = type == "add" ? "新增" : type == "info" ? "详情" : "编辑";
// 初始化表单数据,并根据详情页设置禁用状态
formData.value = [
{
label: "发掘类型",
prop: "fjLx",
type: "select",
options: D_GS_RQFJ_LX,
disabled: title.value === "详情"
},
{
label: "发掘文本",
prop: "fjWb",
type: "textarea",
width: "100%",
disabled: title.value === "详情"
}
];
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({}, "/mosty-gsxt/tbGsxtRqfjNr/" + id).then((res) => {
listQuery.value = res;
});
listQuery.value = JSON.parse(JSON.stringify(row))
};
// 提交
const submit = () => {
elform.value.submit((data) => {
let url =
title.value == "新增"
? "/mosty-gsxt/tbGsxtRqfjNr/save"
: "/mosty-gsxt/tbGsxtRqfjNr/update";
let params = { ...data };
qcckPost(params, url)
.then((res) => {
proxy.$message({ type: "success", message: title.value + "成功" });
emit("onSearch");
close();
})
.catch(() => {});
emit('updateDate',data)
close();
});
};
// 接收父组件传入的数据并回显
const setFormData = (data) => {
listQuery.value = {
...data // 假设 data 包含所有需要的字段
};
};
// 关闭
const close = () => {
listQuery.value = {};
@ -123,14 +54,7 @@ const close = () => {
loading.value = false;
};
// 2. 暴露获取数据的方法
const getFormData = () => {
// 可以在这里添加验证逻辑
return {
formData: listQuery.value
};
};
defineExpose({ init, setFormData });
defineExpose({ init });
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,152 @@
<template>
<div>
<el-dialog v-model="props.modelValue" @closed="closeDialog" center :title="title" width="1280px">
<div ref="searchRef">
<Search :searchArr="searchConfiger" @submit="onSearch" ></Search>
</div>
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
@chooseData="chooseData">
<template #sjly="{row}">
<DictTag :tag="false" :value="row.sjly" :options="props.dic.D_GS_RQFJ_LX" />
</template>
<template #sffj="{row}">
<DictTag :tag="false" :value="row.sffj" :options="props.dic.D_BZ_SF" />
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{...pageData.pageConfiger}"></Pages>
<template #footer>
<el-button @click="cancelDailg">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { qcckGet, qcckDelete } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { ref,reactive, onMounted, nextTick,getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue:{
type:Boolean,
default:false
},
dic:{
type:Object,
default:{}
}
})
const chooseList = ref([])
const title =ref('')
const searchRef = ref()
const emits = defineEmits(['update:modelValue','cancel','submit'])
const searchConfiger = ref([
{ label: "指向地点", prop: "dd", placeholder: "请输入指向地点", showType: "input" },
{ label: "数据内容", prop: "nr", placeholder: "请输入数据内容", showType: "input" },
{ label: "是否发掘", prop: "sffj", placeholder: "请输入数据内容", showType: "select" },
{ label: "数据时间", prop: "times", showType: "datetimerange" },
]);
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "radio",
rowKey:'id',
haveControls: false,
loading: false,
},
pageConfiger: {
total: 0,
pageSize: 20,
pageCurrent: 1
},
tableColumn: [
{ label: "数据来源", prop: "sjly",showSolt:true},
{ label: "是否发掘", prop: "sffj",showSolt:true},
{ label: "数据时间", prop: "sj", showOverflowTooltip: true,},
{ label: "指向地点", prop: "dd", showOverflowTooltip: true,},
{ label: "数据内容", prop: "nr", showOverflowTooltip: true},
],
});
const dm = ref('');
const init = (val) =>{
tabHeightFn();
dm.value = val;
let zdlist = props.dic.D_GS_RQFJ_LX || []
let obj = zdlist.find(v=>v.dm == val);
title.value = obj ? obj.zdmc+'选择' :'选择数据';
getList()
}
const getList = () =>{
let params = {
fjlx:dm.value,
pageCurrent:pageData.pageConfiger.pageCurrent,
pageSize:pageData.pageConfiger.pageSize,
}
pageData.tableConfiger.loading = true;
qcckGet(params,'/mosty-gsxt/qbcj/getZdryCbfjtc').then(res=>{
let arr = res.records || [];
pageData.tableData = arr.map((item)=>{
item.sjly = dm.value ;
return item;
});
pageData.pageConfiger.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(()=>{
pageData.tableConfiger.loading = false;
})
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
};
const chooseData = (val) =>{
if(Array.isArray(val)) chooseList.value = val;
}
const handleSubmit = () =>{
if(chooseList.value.length == 0) return proxy.$message({ type: "warning", message: "请选择数据" });;
emits('submit',chooseList.value);
cancelDailg()
}
const cancelDailg = () =>{
emits('update:modelValue',false);
emits('cancel');
chooseList.value = []
}
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchRef.value.offsetHeight - 320;
window.onresize = function () {
tabHeightFn();
};
};
defineExpose({init})
</script>
<style lang="scss" scoped>
::v-deep .el-dialog{
margin-top: 30px;
}
</style>

View File

@ -2,58 +2,50 @@
<div class="statistical-analysis">
<!-- 左侧树形菜单 -->
<div class="left-menu">
<CheckBox :data="checkData" customClass="all" @changeData="changeData"></CheckBox>
<el-radio-group :disabled="isEdit" v-model="active" @change="changeRadio">
<el-radio :label="it.dm" v-for="it in D_GS_RQFJ_LX" :key="it.dm">{{ it.zdmc }}</el-radio>
</el-radio-group>
<div class="cancelBtn" @click="active = ''">取消</div>
</div>
<!-- 右侧内容区 -->
<div class="right-content">
<Search :searchArr="searchConfiger" @submit="onSearch"> </Search>
<div class="tableCnt1 mb10 pl10 pr10">
<PageTitle title="发掘内容" style="color: #333">
<el-button type="primary" size="small" @click="handleData('add', '')">
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle" @click="handleData('add', '')">新增</span>
</el-button>
<el-button type="primary" size="small" @click="isImport = true">
<span style="vertical-align: middle">导入内容</span>
</el-button>
<el-button type="danger" size="small" @click="deleteRow(idsTop)">
<el-icon style="vertical-align: middle">
<Delete />
</el-icon>
<span style="vertical-align: middle">批量删除</span>
</el-button>
</PageTitle>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger0" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseDataTop">
<template #fjLx="{ row }">
<DictTag :tag="false" :value="row.fjLx" :options="D_GS_RQFJ_LX" />
<PageTitle title="发掘内容" style="color: #333"></PageTitle>
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfigerTop"
:controlsWidth="pageData.controlsWidth">
<template #sjly="{ row }">
<DictTag :tag="false" :value="row.sjly" :options="D_GS_RQFJ_LX" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="success" @click="handleData('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click="handleData('info', row)">查看</el-link>
<el-link size="small" type="danger" @click="deleteRow([row.id])">删除</el-link>
<template #controls="{ row}">
<el-link size="small" type="success" @click="handleData(row)">编辑</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
</template>
</MyTable>
<div class="ww100 flex just-center mt8">
<el-button type="primary" @click="intelligent">智能解析</el-button>
<el-button type="primary" v-loading="btnLoading" @click="intelligent">智能解析 </el-button><span v-if="btnLoading" class="f12 ml5 mt15" style="color: #333;">解析中</span>
</div>
</div>
<div class="tableCnt mb10 pl10 pr10">
<PageTitle title="模型智能识别/LP解析结果" style="color: #333"></PageTitle>
<PageTitle title="解析结果" style="color: #333"></PageTitle>
<div ref="searchBox" class="mb8">
<el-button :type="it == '批量删除' ? 'danger' : 'primary'" size="small" v-for="it in btnsList" :key="it"
@click="chooseType(it)">
{{ it }}
</el-button>
<el-button :type="it == '批量删除' ? 'danger' : 'primary'" size="small" v-for="it in btnsList" :key="it" @click="chooseType(it)">{{ it }}</el-button>
</div>
<div>
<MyTable :tableData="pageData.tableData2" :tableColumn="pageData.tableColumn2"
:tableHeight="pageData.tableHeight2" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth" @chooseData="chooseDataBottom">
<MyTable
:tableData="pageData.tableData2"
:tableColumn="pageData.tableColumn2"
:tableHeight="pageData.tableHeight2"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseDataBottom">
<template #bqList="{ row }">
<div v-if="row.bqList">
<el-tag v-for="(it, idx) in row.bqList" :key="idx">{{ it.bqMc }}</el-tag>
@ -80,45 +72,40 @@
<el-link size="small" type="primary" @click="viewDetails(row)">查看</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight2" :pageConfiger="{
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</div>
</div>
</div>
<!-- 弹窗智能分析 -->
<IntelligentParsing :tableData="pageData.tableData" ref="IntelligentParsingRef" @upadate="getModelList" />
<addForm ref="addFormDiloag" @onSearch="onSearch" />
<Model v-model="isShow" :type="chooselx" :ids="ids" @change="getModelList" :dic="{ D_GS_RQFJ_FXDJ }"></Model>
<Export :show="isImport" lx="fjnr" @closeImport="isImport = false" @handleImport="getList" />
<!-- 新增 -->
<addForm ref="addFormDiloag" v-if="showEdit" @updateDate="updateDate" :dic="{D_GS_RQFJ_LX,D_BZ_SF}" />
<!-- 弹窗 -->
<ListDialog ref="modelList" v-model="showDialog" v-if="showDialog" @submit="handelSub" @cancel="active = ''" :dic="{D_GS_RQFJ_LX,D_BZ_SF}"></ListDialog>
</div>
</template>
<script setup>
import { download } from "@/utils/request";
import Export from "@/components/export/index.vue";
import CheckBox from "@/components/checkBox/index.vue";
import { getItem } from "@/utils/storage";
import ListDialog from './components/listDialog.vue'
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 addForm from "./components/addForm.vue";
import Model from "./components/model.vue";
import IntelligentParsing from "./components/IntelligentParsing.vue";
import { ElMessage } from "element-plus";
import { qcckGet, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import { qcckGet, qcckDelete,ParsingText } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_RQFJ_LX, D_GS_RQFJ_FXDJ, D_BZ_SF, D_GS_RQFJ_FXLB } = proxy.$dict(
"D_GS_RQFJ_FXDJ",
"D_GS_RQFJ_LX",
"D_GS_RQFJ_FXDJ",
"D_BZ_SF",
"D_GS_RQFJ_FXLB"
); //获取字典数据
const { D_GS_RQFJ_LX, D_GS_RQFJ_FXDJ, D_BZ_SF, D_GS_RQFJ_FXLB } = proxy.$dict( "D_GS_RQFJ_FXDJ", "D_GS_RQFJ_LX", "D_GS_RQFJ_FXDJ", "D_BZ_SF", "D_GS_RQFJ_FXLB"); //获取字典数据
const showDialog = ref(false)
const btnLoading = ref(false)
const modelList = ref()
const searchConfiger = ref([
{
label: "管辖部门",
@ -134,34 +121,19 @@ const searchConfiger = ref([
options: D_BZ_SF
}
]);
const isImport = ref(false);
const checkData = reactive({
hasChoose: ["警情"],
list: ["警情", "人力情报", "线索", "民警处置文本", "交通事故"]
});
const btnsList = reactive([
"级别变更",
"警种变更",
"指定分配",
"添加标签",
"导出",
"批量删除"
]);
const active = ref('');
const btnsList = reactive(["级别变更","警种变更","指定分配","添加标签","导出","批量删除"]);
const chooselx = ref("");
const isShow = ref(false);
const idsTop = ref([]);
const ids = ref([]);
const addFormDiloag = ref();
const IntelligentParsingRef = ref();
const showEdit = ref(false);
const searchBox = ref();
const queryFrom = ref({});
const pageData = reactive({
tableData: [],
tableData2: [],
keyCount: 0,
tableConfiger0: {
tableConfigerTop: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false
@ -179,8 +151,10 @@ const pageData = reactive({
},
controlsWidth: 160,
tableColumn: [
{ label: "发掘类型", prop: "fjLx", showSolt: true },
{ label: "发掘文本 ", prop: "fjWb", showOverflowTooltip: true }
{ label: "数据来源", prop: "sjly",showSolt:true},
{ label: "数据时间", prop: "sj", showOverflowTooltip: true,},
{ label: "指向地点", prop: "dd", showOverflowTooltip: true,},
{ label: "数据内容", prop: "nr", showOverflowTooltip: true},
],
tableColumn2: [
{ label: "姓名", prop: "ryXm", showOverflowTooltip: true },
@ -193,42 +167,12 @@ const pageData = reactive({
{ label: "管辖单位", prop: "gxDwDm", showOverflowTooltip: true },
{ label: "管控民警", prop: "gxMj", showOverflowTooltip: true },
{ label: "责任部门", prop: "ssbm", showOverflowTooltip: true },
{
label: "标签",
prop: "bqList",
showOverflowTooltip: true,
showSolt: true
},
{
label: "风险等级",
prop: "fxDj",
showOverflowTooltip: true,
showSolt: true
},
{
label: "风险类别",
prop: "fxLb",
showOverflowTooltip: true,
showSolt: true
},
{
label: "是否关注",
prop: "sfGz",
showOverflowTooltip: true,
showSolt: true
},
{
label: "是否转布控人员",
prop: "sfZbkry",
showOverflowTooltip: true,
showSolt: true
},
{
label: "是否转重点人员",
prop: "sfZzdry",
showOverflowTooltip: true,
showSolt: true
}
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true},
{ label: "风险等级", prop: "fxDj", showOverflowTooltip: true, showSolt: true},
{ label: "风险类别", prop: "fxLb", showOverflowTooltip: true, showSolt: true},
{ label: "是否关注", prop: "sfGz", showOverflowTooltip: true, showSolt: true},
{ label: "是否转布控人员", prop: "sfZbkry", showOverflowTooltip: true, showSolt: true},
{ label: "是否转重点人员", prop: "sfZzdry", showOverflowTooltip: true, showSolt: true}
]
});
@ -236,7 +180,6 @@ const pageData = reactive({
const onSearch = (val) => {
queryFrom.value = { ...val };
pageData.pageConfiger.pageCurrent = 1;
getList();
};
const changeNo = (val) => {
@ -248,61 +191,29 @@ const changeSize = (val) => {
getModelList();
};
// 获取内容列表
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...queryFrom.value };
let url = "/mosty-gsxt/tbGsxtRqfjNr/selectPage";
qcckGet(data, url)
.then((res) => {
pageData.tableData = res.records || [];
pageData.tableConfiger.loading = false;
})
.catch(() => {
pageData.tableConfiger.loading = false;
});
};
//获取模型识别列表
const getModelList = () => {
let data = { ...pageData.pageConfiger };
pageData.tableConfiger0.loading = true;
qcckGet(data, "/mosty-gsxt/tbGsxtRqfjRy/selectPage")
.then((res) => {
pageData.tableConfiger0.loading = false;
pageData.tableData2 = res.records || [];
pageData.total = res.total;
ids.value = [];
})
.catch(() => {
pageData.tableConfiger0.loading = false;
});
pageData.tableConfiger.loading = true;
qcckGet(data, "/mosty-gsxt/tbGsxtRqfjRy/selectPage").then((res) => {
pageData.tableConfiger.loading = false;
pageData.tableData2 = res.records || [];
pageData.total = res.total;
ids.value = [];
}).catch(() => {
pageData.tableConfiger.loading = false;
});
};
//新增- 编辑
const handleData = (type, row) => {
addFormDiloag.value.init(type, row);
};
// 智能解析
const intelligent = () => {
IntelligentParsingRef.value.init();
showEdit.value = true;
nextTick(()=>{
addFormDiloag.value.init(type, row);
})
};
// 选择数据
const chooseDataTop = (val) => {
if (Array.isArray(val)) idsTop.value = val.map((item) => item.id);
};
//删除操作
const deleteRow = (ids) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
ids.forEach((id) => {
qcckGet({}, "/mosty-gsxt/tbGsxtRqfjNr/closeById/" + id).then((res) => {
ElMessage.success("删除成功");
getList();
});
});
});
};
const deleteRowBottom = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckDelete({}, "/mosty-gsxt/tbGsxtRqfjRy/" + id).then((res) => {
@ -328,28 +239,85 @@ const chooseType = (val) => {
isShow.value = true;
break;
case "导出":
// download("/mosty-api/mosty-gsxt/tbGsxtRqfjRy/exportRyfjFxjg", {"bkBt":"1"},`模型智能识别/LP解析结果_${new Date().getTime()}.xlsx`);
let fjrSfzh = getItem("idEntityCard");
window.open('/mosty-api/mosty-gsxt/tbGsxtRqfjRy/exportRyfjFxjg?fjrSfzh='+fjrSfzh,'_self')
break;
case "批量删除":
if (ids.value.length == 0)
return ElMessage.warning("请选择对应删除的数据");
ids.value.forEach((id) => {
deleteRowBottom(id);
});
if (ids.value.length == 0) return ElMessage.warning("请选择对应删除的数据");
ids.value.forEach((id) => { deleteRowBottom(id); });
break;
}
};
const changeRadio = () =>{
showDialog.value = true;
nextTick(()=>{
modelList.value.init(active.value)
})
}
//删除操作
const deleteRow = (id) => {
pageData.tableData = pageData.tableData.filter(v=>v.id != id);
};
const updateDate = (val) =>{
let index = pageData.tableData.findIndex(v=>v.id == val.id);
if(index != -1) pageData.tableData[index] = val;
}
const handelSub = (val) =>{
pageData.tableData = val;
}
// 智能解析
const intelligent = () => {
if(pageData.tableData.length == 0) return proxy.$message({ type: "warning", message: "请先选择数据" });
let content = pageData.tableData[0].nr;
let obj = {
"model": "deepseek-reasoner",
"messages": [
{
"role": "system",
"content":  "# 角色定位\n你是一名资深警务人员尤其擅长对警情、案件、线索等非结构化文本数据进行阅读理解并从中提取各种对象特征信息进行结构化并总结各种对象之间的关联关系。\n##   - person:人物   - id:唯一值   - ryXm:姓名   - rySjhm:手机号   - rySfzh:身份证号   - ryHjdz:户籍地   - ryHzhm:护照号码   - ryXzdz:现居住地址   "
},
{
"role": "user",
"content": "# 任务\n根据警情信息识别对象信息以及对象之间的关联关系。最后以json形式输出不要做任何解释。直接给出完整的json\n## 注意\n- 各种不同类型的对象分别用对象数组存储;\n- 对象之间的关系存储在relation数组中\n\n# 警情信息\n  - "
}
],
"max_tokens": 4096,
"stream": false
}
obj.messages[0].content += content + "## 注意点\n- 地址信息能够根据上下文信息按照省、市、县、街道/乡镇、路名分段补全并标准化。例如:四川省 成都市 高新区 桂溪街道 交子大道11号\n- 对象之间的关联关系由对象类型、对象id、关系类型、目标对象类型、目标对象id 5个属性组成。\n"
btnLoading.value = true;
ParsingText( obj,(res)=>{
console.log(res,'===========系欸小蜀');
btnLoading.value = false;
let content = res.data.choices[0].message.content;
let message = null;
try{
message = content ? JSON.parse(content):''
}catch(err){
proxy.$message({ type: "danger", message: "解析异常,请重新上传解析" });
}
if(!message) return proxy.$message({ type: "danger", message: "解析异常,请重新上传解析" });
console.log(message,'============params上手');
})
};
const tabHeightFn = () => {
pageData.tableHeight2 =
window.innerHeight - searchBox.value.offsetHeight - 650;
pageData.tableHeight2 = window.innerHeight - searchBox.value.offsetHeight - 650;
window.onresize = function () {
tabHeightFn();
};
};
onMounted(() => {
getList();
tabHeightFn();
getModelList();
});
@ -371,32 +339,26 @@ onMounted(() => {
border-right: 1px solid #e8e8e8;
color: #333;
line-height: 32px;
::v-deep .checkBox {
flex-direction: column;
.checkall {
margin: 0;
}
}
::v-deep .el-checkbox-group {
::v-deep .el-radio-group{
display: flex;
flex-direction: column;
padding-left: 10px;
box-sizing: border-box;
}
::v-deep .is-checked {
background: rgb(242, 249, 255);
margin-bottom: 4px;
::v-deep .el-radio{
width: 100%;
margin-right: 0;
color: #333;
}
::v-deep .el-checkbox {
padding-left: 8px;
margin-right: 4px;
}
.all {
width: calc(100% - 4px);
.cancelBtn{
text-align: center;
height: 40px;
line-height: 40px;
background: #6da4e8;
color: #fff;
border-radius: 4px;
margin: 10px;
cursor: pointer;
}
}

View File

@ -85,6 +85,7 @@
</template>
<script setup>
import { download } from "@/utils/request";
import * as MOSTY from "@/components/MyComponents/index";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
@ -211,6 +212,11 @@ const delDictItem = (id) =>{
}).catch(() => {});
}
// 导出
const exportFile = () =>{
window.open('/mosty-api/mosty-gsxt/qbcj/exportQbsjcjDc?cjLx=1','_self')
}
// 详情
const addEdit = (type, row) => {
isShow.value = true;

View File

@ -3,7 +3,7 @@
<!-- 左侧树形菜单 -->
<div class="left-menu">
<!-- 这个部分用的是组件-后期替换 -->
<MOSTY.DepartmentTree width="310px" @change="init" placeholder="管理部门" clearable filterable :isBmId="true" v-model="listQuery.ssbmdm" />
<MOSTY.DepartmentTree width="310px" @change="init" placeholder="管理部门" clearable filterable v-model="listQuery.ssbmdm" />
</div>
<!-- 右侧内容区 -->
@ -32,7 +32,7 @@
<div class="chart-item">
<div class="chart-title">
<span>线索类型</span>
<el-button type="primary">导出统计表</el-button>
<el-button type="primary" @click="handleExport('线索类型')">导出统计表</el-button>
</div>
<div class="chart">
<PieEcharts echartsId="bsqkEpieChart" :key="ketcount" color="#333" :data="obj.xslxList"></PieEcharts>
@ -41,7 +41,7 @@
<div class="chart-item">
<div class="chart-title">
<span>采纳情况</span>
<el-button type="primary">导出统计表</el-button>
<el-button type="primary" @click="handleExport('采纳情况')">导出统计表</el-button>
</div>
<div class="chart">
<DbarEcharts echartsId="bar3DChart" :key="ketcount" :data="obj.cnList"></DbarEcharts>
@ -50,7 +50,7 @@
<div class="chart-item">
<div class="chart-title">
<span>处置状态</span>
<el-button type="primary">导出统计表</el-button>
<el-button type="primary" @click="handleExport('处置状态')">导出统计表</el-button>
</div>
<ul class="chart mt8">
<li v-for="(it, idx) in obj.czztList" :key="idx" class="mb6">
@ -64,7 +64,7 @@
<div class="chart-item">
<div class="chart-title">
<span>奖惩情况</span>
<el-button type="primary">导出统计表</el-button>
<el-button type="primary" @click="handleExport('奖惩情况')">导出统计表</el-button>
</div>
<lineEcharts color="#333" :key="ketcount" echartsId="areaChart" :data="obj.jcqkList"></lineEcharts>
</div>
@ -74,6 +74,7 @@
</template>
<script setup>
import { download } from "@/utils/request";
import { timeValidate, timeSlotChange } from "@/utils/tools.js";
import * as MOSTY from "@/components/MyComponents/index";
import lineEcharts from "@/views/home/echarts/lineEcharts.vue";
@ -171,6 +172,25 @@ const handleDateChange = (val) => {
if(val[0] == timeSlotChange('本年')[0] && val[1] == timeSlotChange('本年')[1]) radio.value = 3;
};
// 导出
const handleExport = (type) =>{
switch(type){
case '线索类型':
window.open('/mosty-api/mosty-gsxt/qbcj/getXscjTjByXslxDc','_self')
break;
case '采纳情况':
window.open('/mosty-api/mosty-gsxt/qbcj/getXscjTjByXslxDc','_self')
break;
case '处置状态':
window.open('/mosty-api/mosty-gsxt/qbcj/getXscjTjByCzztDc','_self')
break;
case '奖惩情况':
window.open('/mosty-api/mosty-gsxt/tbJlqk/getShygkhtjDc','_self')
break;
}
}
// 重置
const handleRest = () => {
radio.value = 0;

View File

@ -146,9 +146,9 @@
</div>
</div>
<!-- 选择布控人员 -->
<BkryDialod v-model="chooseVisible_RY" @choosed="choosed" @choosedAdd="choosedAdd" :roleIds="roleIds" />
<BkryDialod :modelValue="chooseVisible_RY" @update:modelValue="chooseVisible_RY = $event" @choosed="choosed" @choosedAdd="choosedAdd" :roleIds="roleIds" />
<!-- 选择布控群体 -->
<BkqtDialod v-model="chooseVisible_QT" @choosed="choosed" :roleIds="roleIds" />
<BkqtDialod :modelValue="chooseVisible_QT" @update:modelValue="chooseVisible_QT = $event" @choosed="choosed" :roleIds="roleIds" />
</template>
<script setup>

View File

@ -46,8 +46,8 @@
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" v-if="row.bkZt == '01'" size="small" @click="handleSend(row.id)">送审</el-link>
<el-link type="primary" v-if="row.bkZt == '01'" size="small" @click="handleAdd('edit',row)">编辑</el-link>
<el-link type="primary" v-if="['01','03','06'].includes(row.bkZt)" size="small" @click="handleSend(row.id)">送审</el-link>
<el-link type="primary" v-if="['01','03','06'].includes(row.bkZt)" size="small" @click="handleAdd('edit',row)">编辑</el-link>
<el-link type="primary" size="small" @click="handleAdd('detail',row)">详情</el-link>
<el-link type="danger" size="small" @click="handleRow(row.id)">删除</el-link>
</template>

View File

@ -75,8 +75,10 @@ import * as MOSTY from "@/components/MyComponents/index";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/detailForm.vue";
import { useRoute, useRouter } from 'vue-router';
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const route = useRoute();
const { proxy } = getCurrentInstance();
const detailDiloag = ref();
const searchBox = ref(); //搜索框
@ -139,6 +141,7 @@ import * as MOSTY from "@/components/MyComponents/index";
pageData.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value };
delete data.daterange; // 删除daterange字段
if(route.query.tsypid) data.tsypid = route.query.tsypid;
qcckGet(data,'/mosty-gsxt/wshs/selectPage').then(res=>{
let arr = res.records || [];
arr.forEach(item => {

View File

@ -28,7 +28,7 @@
<span v-for="idx in 3" :key="idx" :class="'sircleL'+idx" class="sircle mr5"></span>
<span class="ml10 mr10">专题研判</span>
<span v-for="idx in 3" :key="idx" :class="'sircleR'+idx" class="sircle ml5"></span>
<el-button class="btn" type="primary">研判报告</el-button>
<el-button class="btn" type="primary" @click="handleYP">研判报告</el-button>
</div>
<div class="commCnt">
<div ref="searchBox">
@ -52,8 +52,8 @@
>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" size="small">网上会商</el-link>
<el-link type="primary" size="small">处置</el-link>
<el-link type="primary" size="small" @click="handleHs(row)">网上会商</el-link>
<el-link type="primary" size="small" @click="gozl(row)">处置</el-link>
</template>
</MyTable>
</div>
@ -62,20 +62,26 @@
</div>
</div>
</div>
<YpModel v-model="showModel" :textContent="textContent" ></YpModel>
</template>
<script setup>
import YpModel from '@/components/ypModel/index.vue'
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import MoreBarEcharts from "@/views/home/echarts/moreBarEcharts.vue";
import LineEcharts from "@/views/home/echarts/moreLineEcharts.vue";
import Search from "@/components/aboutTable/Search.vue";
import MyTable from "@/components/aboutTable/DarkTable.vue";
import { useRoute, useRouter } from 'vue-router';
const router = useRouter();
import { nextTick, onMounted, reactive,getCurrentInstance ,ref, watch } from 'vue';
import { set } from "lodash";
const { proxy } = getCurrentInstance();
const {D_BZ_SSZT,D_GS_XS_LY} = proxy.$dict("D_BZ_SSZT","D_GS_XS_LY"); //获取字典数据
const searchBox = ref();
const listBoxRef = ref();
const showModel = ref(false);
const textContent = ref('');
// 图数据
const obj = reactive({
data_lxtj:{
@ -103,9 +109,9 @@ const searchConfiger = ref([
{ label: "结束时间", prop: 'jssj', placeholder: "请选择结束时间", showType: "datetime" },
])
// 每个列表对应的值
const list = ref([
// { title:'诈骗', tableList:[]},
])
const list = ref([])
const searchForm = ref({}) //赛选
// 列表公用
const pageData = reactive({
tableColumn:[
@ -175,7 +181,7 @@ const tabHeightFn = () => {
const handleGetList = () => {
list.value.forEach((item, index) => {
let params = { sszt: item.dm, pageNum: 1, pageSize: 20 };
let params = { sszt: item.dm, pageNum: 1, pageSize: 20,...searchForm.value };
qcckGet(params, '/mosty-gsxt/qbcj/selectPage').then(res => {
list.value[index].tableList = res.records || [];
list.value[index].total = res.total;
@ -184,6 +190,38 @@ const handleGetList = () => {
});
};
const handleHs = (val) =>{
router.push({path:'/MeetingRoom',query:{tsypid:val.id}})
}
const gozl = () =>{
router.push('/InstructionInformation')
}
// 搜索
const onSearch = (val) =>{
searchForm.value = val;
handleGetList()
}
const handleYP = () =>{
let params = {
hskssj:searchForm.value.kssj,
hsjssj:searchForm.value.jssj,
}
qcckPost(params,'/mosty-gsxt/wshs/getDcypbg').then(res=>{
let data = res || {};
let html = `<p class="html_bt">${data.bt}</p>`
html+=`<p>${data.head}</p>`
html+=`<p>${data.nr}</p>`
html+=`<p>${data.bc}</p>`
html+=`<p>${data.end}</p>`
textContent.value = html;
showModel.value = true;
})
}
watch(()=>D_BZ_SSZT.value, (val) => {
let zdlist = val || [];
list.value = zdlist.map(v => ({ title: v.zdmc,dm:v.dm,keyCount:0, tableList: [],page:1,total:0 }));
@ -348,5 +386,8 @@ watch(()=>D_BZ_SSZT.value, (val) => {
::v-deep .el-link {
margin: 3px;
}
.html_bt >>>p{
color: red;
}
</style>

View File

@ -0,0 +1,150 @@
<template>
<div class="dialog" v-if="showDialog">
<div class="head_box">
<span class="title">查看详情 </span>
<div>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="listBox">
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"></Search>
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<template #zdrRyjb="{ row }">
<DictTag :value="row.zdrRyjb" :tag="false" :options="D_GS_ZDR_RYJB" />
</template>
<template #zdrYjdj="{ row }">
<DictTag :value="row.zdrYjdj" :tag="false" :options="D_GS_ZDR_YJDJ" />
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div>
</div>
</div>
</template>
<script setup>
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckPost } from "@/api/qcckApi.js";
import {ref,reactive, nextTick,getCurrentInstance} from 'vue';
const { proxy } = getCurrentInstance();
const { D_GS_ZDR_RYJB,D_GS_ZDR_YJDJ} = proxy.$dict("D_GS_ZDR_RYJB","D_GS_ZDR_YJDJ"); //获取字典数据
const showDialog = ref(false)
const searchBox = ref(); //搜索框
const searchConfiger = ref(
[
{ label: "姓名", prop: 'ryXm', placeholder: "请输入姓名", showType: "input"},
{ label: "身份证号", prop: 'rySfzh', placeholder: "请输入身份证号", showType: "input"},
]);
const pageData = reactive({
tableData: [], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 160, //操作栏宽度
tableColumn: [
{ label: "姓名", prop: "ryXm" },
{ label: "身份证号", prop: "rySfzh" },
{ label: "联系电话", prop: "ryLxdh" },
{ label: "重点人员级别", prop: "zdrRyjb",showSolt:true },
{ label: "预警等级", prop: "zdrYjdj",showSolt:true },
{ label: "关联民警", prop: "gkMjXm" },
{ label: "民警警号", prop: "gkMjJh" },
]
});
const item = ref({})
const sjlx = ref([])
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 280;
window.onresize = function () {
tabHeightFn();
};
};
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();
};
const getList = () =>{
let params = {
id:item.value.id,
sjLx:sjlx.value,
pageCurrent:pageData.pageConfiger.pageCurrent,
pageSize:pageData.pageConfiger.pageSize,
}
pageData.tableConfiger.loading = true;
qcckPost(params,'/mosty-gsxt/tsyp/getRyPage').then(res=>{
pageData.tableConfiger.loading = false;
console.log(res,'===');
pageData.tableData = res.records || []
pageData.total = res.total;
}).catch(()=>{
pageData.tableConfiger.loading = false;
})
}
const close = () =>{
pageData.tableData = [];
showDialog.value = false;
}
const init = (val,lxs) =>{
showDialog.value = true;
item.value = val;
sjlx.value = lxs;
getList()
nextTick(()=>{
tabHeightFn()
})
}
defineExpose({init})
</script>
<style lang="scss" scoped>
.listBox{
height: calc(100% - 50px);
::v-deep .searchBox{
margin-bottom: 0 !important;
}
}
</style>

View File

@ -15,72 +15,46 @@
<Search :searchArr="searchConfiger" @submit="onSearch"> </Search>
</div>
<ul class="cntlsit mb10" v-if="show" v-infinite-scroll="load" :style="{height:listHeight+'px'}" v-loading="loading">
<li class="cntItem" v-for="(it,idx) in list" :key="idx">
<li class="cntItem" @click.stop="lookDeatl(it)" v-for="(it,idx) in list" :key="idx">
<div class="ww100"><img class="ww100" style="height: 168px;" src="@/assets/images/mxbg.jpg" alt=""></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">名称{{ it.ypMc }}</div>
<div class="f14 lh24 pl4 pr4 one_text_detail">类型<DictTag :value="it.ypLx" :tag="false" :options="D_SG_TSYPGZ" /></div>
<div class="flex ww100 f14 lh24 pl4 pr4 one_text_detail">类型<DictTag :value="it.ypLx" :tag="false" :options="D_SG_TSYPGZ" /></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">数量{{ it.num }}</div>
<div class="foot">
<span class="ml10 pointer" style="color:#027ff0 ;"><el-icon style="top: 2px;"><Document /></el-icon>报告</span>
<span class="ml10 pointer" style="color:#f4ac47 ;"><el-icon style="top: 2px;"><Files /></el-icon>会商</span>
<span class="ml10 pointer" @click.stop="handleYp(it)" style="color:#027ff0 ;"><el-icon style="top: 2px;"><Document /></el-icon>报告</span>
<span class="ml10 pointer" @click="handleHs(it)" style="color:#f4ac47 ;"><el-icon style="top: 2px;"><Files /></el-icon>会商</span>
</div>
</li>
<li class="cntItem" v-for="(it,idx) in list" :key="idx">
<div class="ww100"><img class="ww100" style="height: 168px;" src="@/assets/images/mxbg.jpg" alt=""></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">名称{{ it.ypMc }}</div>
<div class="f14 lh24 pl4 pr4 one_text_detail">类型<DictTag :value="it.ypLx" :tag="false" :options="D_SG_TSYPGZ" /></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">数量{{ it.num }}</div>
<div class="foot">
<span class="ml10 pointer" style="color:#027ff0 ;"><el-icon style="top: 2px;"><Document /></el-icon>报告</span>
<span class="ml10 pointer" style="color:#f4ac47 ;"><el-icon style="top: 2px;"><Files /></el-icon>会商</span>
</div>
</li>
<li class="cntItem" v-for="(it,idx) in list" :key="idx">
<div class="ww100"><img class="ww100" style="height: 168px;" src="@/assets/images/mxbg.jpg" alt=""></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">名称{{ it.ypMc }}</div>
<div class="f14 lh24 pl4 pr4 one_text_detail">类型<DictTag :value="it.ypLx" :tag="false" :options="D_SG_TSYPGZ" /></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">数量{{ it.num }}</div>
<div class="foot">
<span class="ml10 pointer" style="color:#027ff0 ;"><el-icon style="top: 2px;"><Document /></el-icon>报告</span>
<span class="ml10 pointer" style="color:#f4ac47 ;"><el-icon style="top: 2px;"><Files /></el-icon>会商</span>
</div>
</li>
<li class="cntItem" v-for="(it,idx) in list" :key="idx">
<div class="ww100"><img class="ww100" style="height: 168px;" src="@/assets/images/mxbg.jpg" alt=""></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">名称{{ it.ypMc }}</div>
<div class="f14 lh24 pl4 pr4 one_text_detail">类型<DictTag :value="it.ypLx" :tag="false" :options="D_SG_TSYPGZ" /></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">数量{{ it.num }}</div>
<div class="foot">
<span class="ml10 pointer" style="color:#027ff0 ;"><el-icon style="top: 2px;"><Document /></el-icon>报告</span>
<span class="ml10 pointer" style="color:#f4ac47 ;"><el-icon style="top: 2px;"><Files /></el-icon>会商</span>
</div>
</li>
<li class="cntItem" v-for="(it,idx) in list" :key="idx">
<div class="ww100"><img class="ww100" style="height: 168px;" src="@/assets/images/mxbg.jpg" alt=""></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">名称{{ it.ypMc }}</div>
<div class="f14 lh24 pl4 pr4 one_text_detail">类型<DictTag :value="it.ypLx" :tag="false" :options="D_SG_TSYPGZ" /></div>
<div class="f14 lh24 pl4 pr4 one_text_detail">数量{{ it.num }}</div>
<div class="foot">
<span class="ml10 pointer" style="color:#027ff0 ;"><el-icon style="top: 2px;"><Document /></el-icon>报告</span>
<span class="ml10 pointer" style="color:#f4ac47 ;"><el-icon style="top: 2px;"><Files /></el-icon>会商</span>
</div>
</li>
<MOSTY.Empty :show="!loading && list.length <= 0"></MOSTY.Empty>
<div class="ww100 flex just-center">
<MOSTY.Empty :show="!loading && list.length <= 0"></MOSTY.Empty>
</div>
<div class="tc ww100 mb4" style="color: #a29f9f;" v-if="total == list.length && total>0">暂时没有数据了</div>
</ul>
</div>
</div>
<!-- 详情 -->
<Detail ref="detailForm"></Detail>
<YpModel v-model="showModel" :textContent="textContent" ></YpModel>
</template>
<script setup>
import YpModel from '@/components/ypModel/index.vue'
import Detail from './components/detail.vue'
import * as MOSTY from "@/components/MyComponents/index";
import CheckBox from "@/components/checkBox/index.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance,watch } from "vue";
import { qcckPost } from "@/api/qcckApi.js";
import { useRoute, useRouter } from 'vue-router';
import { reactive, ref, onMounted, getCurrentInstance,watch, nextTick } from "vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
const { D_SG_SJLY,D_SG_TSYPGZ} = proxy.$dict("D_SG_SJLY","D_SG_TSYPGZ"); //获取字典数据
const searchBox = ref(); //搜索框
const showModel = ref(false);
const textContent = ref('');
const refBtn = ref();
const show = ref(false)
const detailForm = ref()
const listHeight = ref()
const searchConfiger = ref([
{ label: "研判名称", prop: "ypMc", placeholder: "请输入研判名称", showType: "input" },
@ -113,25 +87,50 @@ onMounted(()=>{
})
const load = () =>{
console.log('加载');
}
// 数据类型
const changeData_sjly = (val) =>{
checkData.sjlxBtn.hasChoose = val;
let dms = [];
D_SG_SJLY.value.forEach(item => {
if(val.includes(item.zdmc)) dms.push(item.dm);
});
formData.value.sjLx = dms;
page.value = 1;
getLits();
}
// 研判类型
const changeData_yplx = (val) =>{
checkData.yplxBtn.hasChoose = val;
let dms = [];
D_SG_TSYPGZ.value.forEach(item => {
if(val.includes(item.zdmc)) dms.push(item.dm);
});
formData.value.ypLx = dms;
page.value = 1;
getLits();
}
const onSearch = (val) =>{
formData.value = {...formData.value,...val,};
page.value = 1;
getLits();
}
const load = () =>{
if(total.value == list.value.length) return;
page.value++;
getLits();
}
const getLits = () =>{
let params = {
pageCurrent:page.value,
pageSize:8
pageSize:8,
...formData.value
}
loading.value = true;
qcckGet(params,'/mosty-gsxt/tsyp/selectPage').then(res=>{
qcckPost(params,'/mosty-gsxt/tsyp/selectPage').then(res=>{
let arr = res.records || [];
list.value = page.value == 1 ? arr : list.value.concat(arr);
total.value = res.total;
@ -141,6 +140,31 @@ const getLits = () =>{
})
}
const handleYp = (val) =>{
let params = { tsypid:val.id, }
qcckPost(params,'/mosty-gsxt/wshs/getDcypbg').then(res=>{
let data = res || {};
let html = `<p class="html_bt">${data.bt}</p>`
html+=`<p>${data.head}</p>`
html+=`<p>${data.nr}</p>`
html+=`<p>${data.bc}</p>`
html+=`<p>${data.end}</p>`
textContent.value = html;
showModel.value = true;
})
}
const handleHs = (val) =>{
router.push({path:'/MeetingRoom',query:{tsypid:val.id}})
}
// 查看详情
const lookDeatl = (val) =>{
nextTick(()=>{
detailForm.value.init(val,formData.value.sjLx)
})
}
// 表格高度计算
const tabHeightFn = () => {
listHeight.value = window.innerHeight - searchBox.value.offsetHeight - refBtn.value.offsetHeight - 182;

View File

@ -72,8 +72,8 @@ import Search from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
import ZlForm from "./components/zlForm.vue";
import HbForm from "./components/hbForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { qcckGet } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const {D_GS_ZDQT_FXDJ,D_GS_XS_ZLLX,D_GS_XS_CZZT,D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB,D_BZ_XSSHZT} = proxy.$dict("D_GS_ZDQT_FXDJ","D_GS_XS_ZLLX","D_GS_XS_CZZT","D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB","D_BZ_XSSHZT"); //获取字典数据
const detailDiloag = ref();

View File

@ -16,8 +16,9 @@
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { reactive } from "vue";
import { onMounted, reactive , ref} from "vue";
const pageData = reactive({
tableData: [],
keyCount: 0,
@ -34,23 +35,44 @@ const pageData = reactive({
tableHeight:143,
controlsWidth: 52,
tableColumn: [
{ label: "号码类型", prop: "zzMc",width:'70px' },
{ label: "号码", prop: "sjrs",width:'70px'},
{ label: "所属人员", prop: "bq",width:'50px'},
{ label: "线索数", prop: "xss",width:'70px'},
{ label: "指令数", prop: "zls" ,width:'70px'},
{ label: "号码类型", prop: "hmlx",width:'70px',showOverflowTooltip:true },
{ label: "号码", prop: "hm",width:'120px',showOverflowTooltip:true},
{ label: "线索数", prop: "glxss",width:'70px',showOverflowTooltip:true},
{ label: "指令数", prop: "glzls" ,width:'70px',showOverflowTooltip:true},
]
});
const searchData = ref({})
onMounted(()=>{
getDate()
})
const init = (val) =>{
searchData.value = val;
getDate()
}
function getDate (){
let params = { ...searchData.value }
delete params.dateRange;
pageData.pageConfiger.loading = true;
qcckGet(params,'/mosty-gsxt/tbGsxtZdqt/getRdhm').then(res=>{
pageData.tableData = res || [];
pageData.pageConfiger.loading = false;
}).catch(()=>{
pageData.pageConfiger.loading = false;
})
}
defineExpose({init})
</script>
<style lang="scss" scoped>
::v-deep .el-table .cell{
padding: 0;
}
::v-deep .el-table tr{
background: rgba(239, 245, 247,1) !important;
}
::v-deep .el-table th.el-table__cell{
background: rgba(239, 245, 247,1) !important;
}

View File

@ -8,6 +8,11 @@
:fixed ="false"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth">
<template #bqList="{row}">
<span v-if="row.bqList">
<span v-for=" it in row.bqList" :key="it">{{ it.bqMc }}</span>
</span>
</template>
<template #controls="{ row }">
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
</template>
@ -18,7 +23,8 @@
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { onMounted, reactive } from "vue";
import { onMounted, reactive , ref} from "vue";
const pageData = reactive({
tableData: [],
keyCount: 0,
@ -35,33 +41,45 @@ const pageData = reactive({
tableHeight:143,
controlsWidth: 52,
tableColumn: [
{ label: "姓名", prop: "zzMc",width:'70px' },
{ label: "身份证", prop: "sjrs",width:'70px'},
{ label: "标签", prop: "bq",width:'50px'},
{ label: "线索数", prop: "xss",width:'70px'},
{ label: "指令数", prop: "zls" ,width:'70px'},
{ label: "姓名", prop: "ryXm",width:'70px',showOverflowTooltip:true },
{ label: "身份证", prop: "rySfzh",width:'70px',showOverflowTooltip:true},
{ label: "标签", prop: "bqList",width:'50px',showSolt:true,showOverflowTooltip:true},
{ label: "线索数", prop: "xssl",width:'70px',showOverflowTooltip:true},
{ label: "指令数", prop: "zlsl" ,width:'70px',showOverflowTooltip:true},
]
});
const searchData = ref({})
onMounted(()=>{
getDate()
})
const init = (val) =>{
searchData.value = val;
getDate()
}
function getDate (){
qcckGet({},' /mosty-gsxt/tbGsxtZdry/getRdRy').then(res=>{
console.log(res,'--------99');
let params = { ...searchData.value }
delete params.dateRange;
pageData.pageConfiger.loading = true;
qcckGet(params,'/mosty-gsxt/tbGsxtZdry/getRdRy').then(res=>{
pageData.tableData = res || [];
pageData.pageConfiger.loading = false;
}).catch(()=>{
pageData.pageConfiger.loading = false;
})
}
defineExpose({init})
</script>
<style lang="scss" scoped>
::v-deep .el-table .cell{
padding: 0;
}
::v-deep .el-table tr{
background: rgba(239, 245, 247,1) !important;
}
::v-deep .el-table th.el-table__cell{
background: rgba(239, 245, 247,1) !important;
}

View File

@ -16,8 +16,9 @@
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { reactive } from "vue";
import { onMounted, reactive , ref} from "vue";
const pageData = reactive({
tableData: [],
keyCount: 0,
@ -34,23 +35,44 @@ const pageData = reactive({
tableHeight:143,
controlsWidth: 52,
tableColumn: [
{ label: "线索名称", prop: "xsMc",width:'70px' },
{ label: "涉及人数", prop: "sjrs",width:'70px'},
{ label: "标签", prop: "bq",width:'50px'},
{ label: "风险等级", prop: "fxdj",width:'70px'},
{ label: "指向地点", prop: "zxdz" ,width:'70px'},
{ label: "线索名称", prop: "xsMc",width:'70px',showOverflowTooltip:true },
{ label: "涉及人数", prop: "sjrs",width:'70px',showOverflowTooltip:true},
{ label: "线索内容", prop: "xsNr",width:'120px',showOverflowTooltip:true},
{ label: "指向地点", prop: "zxdz" ,width:'70px',showOverflowTooltip:true},
]
});
const searchData = ref({})
onMounted(()=>{
getDate()
})
const init = (val) =>{
searchData.value = val;
getDate()
}
function getDate (){
let params = { ...searchData.value }
delete params.dateRange;
pageData.pageConfiger.loading = true;
qcckGet(params,'/mosty-gsxt/qbcj/getRdXs').then(res=>{
pageData.tableData = res || [];
pageData.pageConfiger.loading = false;
}).catch(()=>{
pageData.pageConfiger.loading = false;
})
}
defineExpose({init})
</script>
<style lang="scss" scoped>
::v-deep .el-table .cell{
padding: 0;
}
::v-deep .el-table tr{
background: rgba(239, 245, 247,1) !important;
}
::v-deep .el-table th.el-table__cell{
background: rgba(239, 245, 247,1) !important;
}

View File

@ -8,6 +8,14 @@
:fixed ="false"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth">
<template #sjrs="{ row }">
<span> {{ row.zdryList? row.zdryList.length : 0 }} </span>
</template>
<template #bqList="{ row }">
<span v-if="row.bqList">
<span v-for="(it,idx) in row.bqList" :key="idx"> {{ it.bqMc }}</span>
</span>
</template>
<template #controls="{ row }">
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
</template>
@ -16,8 +24,9 @@
</template>
<script setup>
import { qcckGet } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { reactive } from "vue";
import { onMounted, reactive , ref} from "vue";
const pageData = reactive({
tableData: [],
keyCount: 0,
@ -34,23 +43,46 @@ const pageData = reactive({
tableHeight:143,
controlsWidth: 52,
tableColumn: [
{ label: "组织名称", prop: "zzMc",width:'70px' },
{ label: "涉及人数", prop: "sjrs",width:'70px'},
{ label: "标签", prop: "bq",width:'50px'},
{ label: "线索数", prop: "xss",width:'70px'},
{ label: "指令数", prop: "zls" ,width:'70px'},
{ label: "组织名称", prop: "qtMc",width:'70px',showOverflowTooltip:true },
{ label: "涉及人数", prop: "sjrs",width:'70px',showSolt:true,showOverflowTooltip:true},
{ label: "标签", prop: "bqList",width:'50px',showSolt:true,showOverflowTooltip:true},
{ label: "线索数", prop: "xssl",width:'70px',showOverflowTooltip:true},
{ label: "指令数", prop: "zlsl" ,width:'70px',showOverflowTooltip:true},
]
});
const searchData = ref({})
onMounted(()=>{
getDate()
})
const init = (val) =>{
searchData.value = val;
getDate()
}
function getDate (){
let params = { ...searchData.value }
delete params.dateRange;
pageData.pageConfiger.loading = true;
qcckGet(params,'/mosty-gsxt/tbGsxtZdqt/getRdzz').then(res=>{
pageData.tableData = res || [];
pageData.pageConfiger.loading = false;
}).catch(()=>{
pageData.pageConfiger.loading = false;
})
}
defineExpose({init})
</script>
<style lang="scss" scoped>
::v-deep .el-table .cell{
padding: 0;
}
::v-deep .el-table tr{
background: rgba(239, 245, 247,1) !important;
}
::v-deep .el-table th.el-table__cell{
background: rgba(239, 245, 247,1) !important;
}

View File

@ -5,11 +5,11 @@
<span class="pointer" @click="close"><el-icon><Close /></el-icon></span>
</div>
<div class="seachsBox">
<Search :searchArr="searchConfiger" @submit="onSearch">
<Search :searchArr="searchConfiger" @submit="onSearch" @reset="reset">
<template #defaultSlot>
<div class="flex align-center">
<span class="marks" @click="active = idex" :class="active == idex ? 'activeBtn' : ''" v-for="(it, idex) in time" :key="idex">{{ it.label }}</span>
<el-date-picker v-model="listQuery.dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
<span class="marks" @click="changeTime(idex)" :class="active == idex ? 'activeBtn' : ''" v-for="(it, idex) in time" :key="idex">{{ it.label }}</span>
<el-date-picker @change="handleDateChange" v-model="listQuery.dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
</div>
</template>
</Search>
@ -19,25 +19,25 @@
<div class="model">
<div class="modelTitle">热点线索</div>
<div class="cnt">
<Hot_xs></Hot_xs>
<Hot_xs ref="RedRdxs"></Hot_xs>
</div>
</div>
<div class="model">
<div class="modelTitle">热点组织</div>
<div class="cnt">
<Hot_zz></Hot_zz>
<Hot_zz ref="RedRdzz"></Hot_zz>
</div>
</div>
<div class="model">
<div class="modelTitle">热点人员</div>
<div class="cnt">
<Hot_ry></Hot_ry>
<Hot_ry ref="RedRdry"></Hot_ry>
</div>
</div>
<div class="model">
<div class="modelTitle">热点号码</div>
<div class="cnt">
<Hot_hm></Hot_hm>
<Hot_hm ref="RedRdhm"></Hot_hm>
</div>
</div>
</div>
@ -53,19 +53,19 @@
<div class="model">
<div class="modelTitle">诉求分类</div>
<div class="cnt">
<Zqfl></Zqfl>
<Zqfl ref="RedSqfl"></Zqfl>
</div>
</div>
<div class="model">
<div class="modelTitle">重点线索分类</div>
<div class="cnt">
<Zdxsfl></Zdxsfl>
<Zdxsfl ref="RedZdxsfl"></Zdxsfl>
</div>
</div>
<div class="model">
<div class="modelTitle">指令次数</div>
<div class="cnt">
<Zlcs></Zlcs>
<Zlcs ref="RedZlcs"></Zlcs>
</div>
</div>
</div>
@ -74,6 +74,7 @@
</template>
<script setup>
import { timeSlotChange } from "@/utils/tools.js";
import GdMap from "@/components/GdMap/index.vue";
import Hot_xs from './hot_xs/index.vue'
import Hot_zz from './hot_zz/index.vue'
@ -83,51 +84,90 @@ import Zqfl from './zqfl/index.vue'
import Zlcs from './zlcs/index.vue'
import Zdxsfl from './zdxsfl/index.vue'
import Search from "@/components/aboutTable/Search.vue";
import { reactive, ref } from "vue";
import { reactive, ref, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const { SGXTQTSQLX } = proxy.$dict("SGXTQTSQLX"); //获取字典数据
const emits = defineEmits(['close'])
const listQuery = ref({});
const active = ref(0);
const active = ref(-1);
const time = reactive([
{ label: "今天", value: "10" },
{ label: "近一周", value: "20" },
{ label: "近一月", value: "30" },
{ label: "近一季度", value: "40" },
{ label: "近一年", value: "50" }
{ label: "周", value: "20" },
{ label: "月", value: "30" },
{ label: "季度", value: "40" },
{ label: "年", value: "50" }
]);
const searchConfiger = reactive([
{
label: "所属部门",
prop: "ssbmdm",
placeholder: "请选择",
showType: "department"
},
{
label: "数据周期",
prop: "sjzq",
placeholder: "请选择",
showType: "defaultSlot"
},
{
label: "热点集访单位",
prop: "jfdw",
placeholder: "请选择",
showType: "select"
},
{
label: "行为特征",
prop: "xwtz",
placeholder: "请选择",
showType: "select"
},
{ label: "所属部门", prop: "ssbmdm", placeholder: "请选择", showType: "department" },
{ label: "数据周期", prop: "sjzq", placeholder: "请选择", showType: "defaultSlot"},
{ label: "指向地点", prop: "zxdz", placeholder: "请输入", showType: "input" },
{
label: "事件诱因类型",
prop: "yxlx",
placeholder: "请选择",
showType: "select"
},
{ label: "诉求类型", prop: "sqlx", placeholder: "请选择", showType: "select" }
{ label: "诉求类型", prop: "qtsq", placeholder: "请选择", showType: "select",options:SGXTQTSQLX }
]);
const RedRdxs = ref()
const RedRdzz = ref()
const RedRdry = ref()
const RedRdhm = ref()
const RedSqfl = ref()
const RedZlcs = ref()
const RedZdxsfl = ref()
const changeTime = (idex) =>{
active.value = idex;
switch(idex){
case 0: //日
listQuery.value.dateRange = timeSlotChange('天')
break;
case 1: //周
listQuery.value.dateRange = timeSlotChange('本周')
break;
case 2: //月
listQuery.value.dateRange = timeSlotChange('本月')
break;
case 3: //季度
listQuery.value.dateRange = timeSlotChange('本季度')
break;
case 4: //年
listQuery.value.dateRange = timeSlotChange('本年')
break;
}
listQuery.value.hskssj = listQuery.value.dateRange[0] +' 00:00:00';
listQuery.value.hsjssj = listQuery.value.dateRange[1] +' 23:59:59';;
}
const handleDateChange = (val) => {
active.value = -1;
if(!val) return;
listQuery.value.hskssj = val[0] +' 00:00:00';
listQuery.value.hsjssj = val[1]+' 23:59:59';
if(val[0] == timeSlotChange('天')[0] && val[1] == timeSlotChange('天')[1]) active.value = 0;
if(val[0] == timeSlotChange('本周')[0] && val[1] == timeSlotChange('本月')[1]) active.value = 1;
if(val[0] == timeSlotChange('本月')[0] && val[1] == timeSlotChange('本月')[1]) active.value = 2;
if(val[0] == timeSlotChange('本季度')[0] && val[1] == timeSlotChange('本季度')[1]) active.value = 3;
if(val[0] == timeSlotChange('本年')[0] && val[1] == timeSlotChange('本年')[1]) active.value = 4;
};
const onSearch = (val) =>{
listQuery.value = {...listQuery.value,...val}
loadDate()
}
const reset = (val) =>{
listQuery.value = {};
active.value = -1;
listQuery.value.dateRange = '';
listQuery.value.hskssj = '';
listQuery.value.hsjssj = '';
loadDate()
}
const loadDate = () =>{
RedRdxs.value.init(listQuery.value)
RedRdzz.value.init(listQuery.value)
RedRdry.value.init(listQuery.value)
RedRdhm.value.init(listQuery.value)
RedSqfl.value.init(listQuery.value)
RedZlcs.value.init(listQuery.value)
RedZdxsfl.value.init(listQuery.value)
}
// 关闭
function close(){

View File

@ -1,5 +1,5 @@
<template>
<div class="comom-cnt">
<div class="comom-cnt" v-loading="loading">
<LineEcharts echartsId="qbsbEcharts111" :data="dataList"></LineEcharts>
</div>
</template>
@ -7,19 +7,42 @@
<script setup>
import { qcckPost } from "@/api/qcckApi.js";
import LineEcharts from "@/views/home/echarts/moreLineEcharts.vue";
import { reactive, onMounted } from 'vue';
import { reactive, onMounted,ref } from 'vue';
const dataList = reactive({
xData:['巴宜区','工布江达县','米林县','墨脱县','波密县','察隅县','朗县'],
xData:[],
color:['#0386FB','#00FFFF'],
labelColor:'#333',
list:[
{label:'总数',val:[10,0,10,0,10,0,0]},
{label:'已处置',val:[0,10,10,10,0,10,0]},
{label:'',val:[0,0,10,0,0,0,0]},
]
});
onMounted(() => {
});
const loading=ref(false)
const searchData = ref({})
onMounted(()=>{
getDate()
})
const init = (val) =>{
searchData.value = val;
getDate()
}
function getDate (){
let params = { ...searchData.value }
delete params.dateRange;
loading.value = true;
qcckPost(params,'/mosty-gsxt/qbcj/getXscjTjByXslx').then(res=>{
loading.value = false;
let arr = res || [];
dataList.xData = arr.map(v=>{return v.zdmc});
dataList.list[0].val = arr.map(v=>{return v.count});
}).catch(()=>{
loading.value = false;
})
}
defineExpose({init})

View File

@ -1,5 +1,5 @@
<template>
<ul class="box-zl">
<ul class="box-zl" v-loading="loading">
<li class="items" v-for="(it,idx) in list" :key="idx">
<div>{{ it.num }}</div>
<div>{{ it.label }}</div>
@ -9,13 +9,43 @@
</template>
<script setup>
import { reactive } from 'vue';
const list = reactive([
{ label:'线索数量', num :0 },
{ label:'线索转指令数量', num :0 },
{ label:'关联群体数量', num :0 },
{ label:'关联人员数量', num :0 },
import { qcckPost } from "@/api/qcckApi.js";
import { onMounted , ref} from "vue";
const list = ref([
{ label:'线索数量', num :0 ,type:'xs'},
{ label:'线索转指令数量', num :0,type:'zlxx' },
{ label:'关联群体数量', num :0 ,type:'zdqt'},
{ label:'关联人员数量', num :0,type:'zdry' },
])
const loading = ref(false)
const searchData = ref({})
onMounted(()=>{
getDate()
})
const init = (val) =>{
searchData.value = val;
getDate()
}
function getDate (){
let params = { ...searchData.value }
delete params.dateRange;
loading.value = true;
qcckPost(params,'/mosty-gsxt/qbcj/getXscjTjForZs').then(res=>{
for(let key in res){
let index = list.value.findIndex(v=>v.type == key);
if(index!= -1) list.value[index].num = res[key];
}
loading.value = false;
}).catch(()=>{
loading.value = false;
})
}
defineExpose({init})
</script>
<style lang="scss" scoped>

View File

@ -1,31 +1,43 @@
<template>
<div class="comom-cnt">
<div class="comom-cnt" v-loading="loading">
<PieEcharts echartsId="zqflEcharts" color="#333" :data="dataList"></PieEcharts>
</div>
</template>
<script setup>
import { qcckPost } from "@/api/qcckApi.js";
import { randomHexColor ,choseRbgb} from '@/utils/tools.js'
import PieEcharts from "@/views/home/echarts/pieEcharts.vue";
import { reactive, onMounted } from 'vue';
const dataList = reactive([
{
label: "待办",
value: 2056,
color:['#FF6B9A','#FF4B7A']
},
{
label: "已办",
value: 4356,
color:['#FFAA33','#FF8A00'],
},
]);
onMounted(() => {
});
import { qcckGet } from "@/api/qcckApi.js";
import { onMounted , ref} from "vue";
const loading=ref(false)
const dataList = ref([]);
const searchData = ref({})
onMounted(()=>{
getDate()
})
const init = (val) =>{
searchData.value = val;
getDate()
}
function getDate (){
let params = { ...searchData.value }
delete params.dateRange;
loading.value = true;
qcckGet(params,'/mosty-gsxt/tbGsxtZdqt/getSqflTj').then(res=>{
loading.value = false;
let arr = res || [];
dataList.value = arr.map(item=>{
let color = randomHexColor()
let color1 = choseRbgb(color,0.5)
return{ label: item.zdmc, value: item.dm, color:[color,color1] }
})
}).catch(()=>{
loading.value = false;
})
}
defineExpose({init})
</script>

View File

@ -271,7 +271,7 @@ const getText = (val) =>{
"messages": [
{
"role": "system",
"content":  "# 角色定位\n你是一名资深警务人员尤其擅长对警情、案件、线索等非结构化文本数据进行阅读理解并从中提取各种对象特征信息进行结构化并总结各种对象之间的关联关系。\n##  - person:人物   - id:唯一值   - name:姓名   - enName:英文姓名   - nickName:绰号   - aliasName:别名   - screenName:网名   - idcard:身份证号码   - phoneNo:手机号码   - bankCard:银行卡号   - passporNumber:护照号码   - permanentResidenceAddress:户籍地址   - residenceAddress:现住地址- jbxx:基本信息- id:唯一值     - xsmc:线索名称     - xslx:线索类型     - qbly:情报来源     - kssj:开始时间     - jssj:结束时间     - qtlx:群体类型     - qtmc:群体名称     - sjrs:设计人数     - sbdw:送报单- yjtq:语义提取 "
"content":  "# 角色定位\n你是一名资深警务人员尤其擅长对警情、案件、线索等非结构化文本数据进行阅读理解并从中提取各种对象特征信息进行结构化并总结各种对象之间的关联关系。\n##  - person:人物   - id:唯一值   - name:姓名   - enName:英文姓名   - nickName:绰号   - aliasName:别名   - screenName:网名   - idcard:身份证号码   - phoneNo:手机号码   - bankCard:银行卡号   - passporNumber:护照号码   - permanentResidenceAddress:户籍地址   - residenceAddress:现住地址- jbxx:基本信息- id:唯一值     - xsmc:线索名称     - xslx:线索类型     - qbly:情报来源     - kssj:开始时间     - jssj:结束时间     - qtlx:群体类型     - qtmc:群体名称     - sjrs:设计人数     - sbdw:送报单- yjtq:语义提取     "
},
{
"role": "user",
@ -281,7 +281,7 @@ const getText = (val) =>{
"max_tokens": 4096,
"stream": false
}
let marks = (pageData.tableData.map(v=> '- '+v.yymc)).join('     ');
let marks = (pageData.tableData.splice(0,10).map(v=> '- '+v.yymc)).join('     ');
obj.messages[0].content = obj.messages[0].content + marks + "## 注意点\n- 地址信息能够根据上下文信息按照省、市、县、街道/乡镇、路名分段补全并标准化。例如:四川省 成都市 高新区 桂溪街道 交子大道11号\n- 对象之间的关联关系由对象类型、对象id、关系类型、目标对象类型、目标对象id 5个属性组成。\n"
// 拼接字典 线索类型:
let xslx = '线索类型是一个字典,字典内容包括:' + (D_GS_XS_LX.value.map(item=>item.dm+':'+item.zdmc).join(','))+'\n'

View File

@ -84,7 +84,7 @@ const changeBG = (str) => {
.orange {
background: url("~@/assets/images/GroupOrange.png") no-repeat center center;
background-size: 100% 100%;
background-size: 100% 100%;
}
.yellow {
background: url("~@/assets/images/GroupYellow.png") no-repeat center center;
@ -92,7 +92,7 @@ const changeBG = (str) => {
}
.blue {
background: url("~@/assets/images/GroupBlue.png") no-repeat center center;
background-size: 100% 100%;
background-size: 100% 100%;
}
</style>
</style>

View File

@ -1,8 +1,9 @@
<template>
<DialogDragger title="预警详情" top="150px" v-model="props.show" @close="close">
<ul class="warningList" ref="gjyjList">
<li v-for="item in props.data" :key="item.id">
<YjItem :data="item"/>
<YjItem :item="item"/>
</li>
<MOSTY.Empty :show="props.data.length <= 0" :imgSize="150"></MOSTY.Empty>
</ul>

View File

@ -9,11 +9,11 @@ import { ref, watch ,defineProps,nextTick } from "vue";
const props = defineProps({
echartsId:{
type:String,
default:'barId'
default:'lineId'
},
color:{
type:String,
default:'#0072ff'
default:'lineId'
},
data:{
type:Array,
@ -72,7 +72,7 @@ const initChart = (data) => {
},
series: [
{
name: "",
name: "情报反馈统计",
type: "pie",
radius: ["40%", "75%"],
center: ["30%", "50%"],

View File

@ -19,11 +19,7 @@
<script setup>
import emitter from "@/utils/eventBus.js";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import Search from "@/components/aboutTable/Search.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import { ref, defineProps, defineEmits, reactive, onMounted } from "vue";
import { TRUE } from "ol/functions";
import { defineProps, defineEmits } from "vue";
const emits = defineEmits(["update:modelValue", "close"]);
const props = defineProps({
title: {

View File

@ -173,7 +173,9 @@ const handleBtns = (val) => {
window.open(NPShref.href, "_blank");
break;
case "退出登录":
store.dispatch("user/logout");
window.opener = null;
window.open('', '_self');
window.close();
store.commit("app/clearTag", null, { immediate: true });
store.commit("permission/deleteRouter", { immediate: true });
store.commit("user/deleteKeepLiiveRoute", "home");

View File

@ -10,23 +10,23 @@
<img width="30" height="30" src="" alt="">
</template>
<template #ryXb="{row}">
<DictTag :tag="false" :value="row.ryXb" :options="D_BZ_XB"/>
<DictTag :tag="false" :value="row.ryXb" color="#fff" :options="D_BZ_XB"/>
</template>
<template #zdrRyjb="{row}">
<DictTag :tag="false" :value="row.zdrRyjb" :options="D_GS_ZDR_RYJB"/>
<DictTag :tag="false" :value="row.zdrRyjb" color="#fff" :options="D_GS_ZDR_RYJB"/>
</template>
<template #zdrBkZt="{row}">
<DictTag :tag="false" :value="row.zdrBkZt" :options="D_GS_ZDR_BK_ZT"/>
<DictTag :tag="false" :value="row.zdrBkZt" color="#fff" :options="D_GS_ZDR_BK_ZT"/>
</template>
<template #zdrCzzt="{row}">
<DictTag :tag="false" color="#FDBC3A" :value="row.zdrCzzt" :options="D_GS_ZDR_CZZT" />
</template>
<!-- *************** -->
<template #qtFxdj="{row}">
<DictTag :value="row.qtFxdj" :options="D_GS_ZDQT_FXDJ" />
<DictTag :value="row.qtFxdj" color="#fff" :options="D_GS_ZDQT_FXDJ" />
</template>
<template #qtLb="{row}">
<DictTag :value="row.qtLb" :options="D_GS_ZDQT_LB" />
<DictTag :value="row.qtLb" color="#fff" :options="D_GS_ZDQT_LB" />
</template>
</MyTable>

View File

@ -22,13 +22,13 @@
:tableConfiger="pageData.tableConfiger"
>
<template #ryXb="{row}">
<DictTag :tag="false" :value="row.ryXb" :options="D_BZ_XB" />
<DictTag :tag="false" :value="row.ryXb" color="#fff" :options="D_BZ_XB" />
</template>
<template #qtLb="{row}">
<DictTag :tag="false" :value="row.qtLb" :options="D_GS_ZDQT_LB" />
<DictTag :tag="false" :value="row.qtLb" color="#fff" :options="D_GS_ZDQT_LB" />
</template>
<template #qtFxdj="{row}">
<DictTag :tag="false" :value="row.qtFxdj" :options="D_GS_ZDQT_FXDJ" />
<DictTag :tag="false" :value="row.qtFxdj" color="#fff" :options="D_GS_ZDQT_FXDJ" />
</template>
<template #tp="{ row }">
<img width="30" height="30" src="" alt="" />
@ -81,29 +81,29 @@ onMounted(() => {
const changeIndex = (index) =>{
activeIndex.value = index;
page.value = 1;
pageData.tableData = [];
switch(index){
case 0:
pageData.tableColumn = [
{ label: "照片", prop: "tp", showSolt: true },
{ label: "姓名", prop: "ryXm", showOverflowTooltip: true },
{ label: "性别", prop: "ryXb", showOverflowTooltip: true,showSolt:true },
{ label: "身份证号码", prop: "rySfzh", showOverflowTooltip: true },
{ label: "管控原因", prop: "zdrLkyy", showOverflowTooltip: true }
]
break;
case 1:
pageData.tableColumn = [
{ label: "照片", prop: "tp", showSolt: true },
{ label: "群体名称", prop: "qtMc", showOverflowTooltip: true },
{ label: "群体类别", prop: "qtLb", showOverflowTooltip: true,showSolt:true },
{ label: "风险等级", prop: "qtFxdj", showOverflowTooltip: true ,showSolt: true},
{ label: "列控原因", prop: "zdrLkyy", showOverflowTooltip: true }
]
break;
}
pageData.keyCount++;
getList()
pageData.tableData = [];
switch(index){
case 0:
pageData.tableColumn = [
{ label: "照片", prop: "tp", showSolt: true },
{ label: "姓名", prop: "ryXm", showOverflowTooltip: true },
{ label: "性别", prop: "ryXb", showOverflowTooltip: true,showSolt:true },
{ label: "身份证号码", prop: "rySfzh", showOverflowTooltip: true },
{ label: "管控原因", prop: "zdrLkyy", showOverflowTooltip: true }
]
break;
case 1:
pageData.tableColumn = [
{ label: "照片", prop: "tp", showSolt: true },
{ label: "群体名称", prop: "qtMc", showOverflowTooltip: true },
{ label: "群体类别", prop: "qtLb", showOverflowTooltip: true,showSolt:true },
{ label: "风险等级", prop: "qtFxdj", showOverflowTooltip: true ,showSolt: true},
{ label: "列控原因", prop: "zdrLkyy", showOverflowTooltip: true }
]
break;
}
pageData.keyCount++;
getList()
}
// 获取列表

View File

@ -25,10 +25,10 @@ import { ref ,reactive, onMounted,getCurrentInstance} from 'vue';
const { proxy } = getCurrentInstance();
const checkData = reactive({
list: ["红", "橙", "黄", "蓝"],
hasChoose: ["红"]
hasChoose: ["红","橙", "黄", "蓝"]
});
const total = ref(0);
const yjJb = ref('');
const yjJb = ref('10,20,30,40');
const pageNum = ref(1);
const loading = ref(false); // 加载中
const personList = ref([]);
@ -48,7 +48,8 @@ function changeData(val){
if(it == '蓝') ids.push(40);
});
yjJb.value = ids.join(',')
getList()
if(val.length == 0) personList.value = [];
else getList();
}
// 触底加载
@ -59,9 +60,9 @@ const loadList = () =>{
}
const getList = () =>{
let params = { pageSize:10, pageNum:pageNum.value,yjJb:yjJb.value };
let data = { pageSize:10, pageNum:pageNum.value,yjJb:yjJb.value };
loading.value = true;
qcckPost({params},'/mosty-jmxf/tbYjxx/getPageList').then(res=>{
qcckPost(data,'/mosty-jmxf/tbYjxx/getPageList').then(res=>{
loading.value = false;
let arr = res.records || [];
personList.value = pageNum.value == 1 ? arr : personList.value.concat(arr);
@ -144,5 +145,4 @@ const chooseItem = (item) =>{
background: #000;
}
</style>
</style>

View File

@ -0,0 +1,42 @@
<template></template>
<script setup>
import { ref, onMounted } from "vue";
import { useStore } from "vuex";
import { useRouter } from "vue-router";
import {
setItem
} from "@/utils/storage";
const loginDialog = ref(false);
const deptList = ref([]);
const store = useStore();
function redirectAuth() {
let token = location.hash.slice(20) || null;
if (token != null) {
token = token.replace(/\ +/g, "");
setItem("SSOTOKEN", token)
handleLogin({ token: token});
} else {
window.location.href = `http://155.240.22.102:40992`;
}
}
const handleLogin = (e) => {
store.dispatch("user/oatuhLogin", e).then((res) => {
// 登录后操作
if (res.deptList.length === 1) {
window.location.hash = "/";
} else {
deptList.value = [...res.deptList];
loginDialog.value = true;
authorization.value = res.jwtToken;
}
});
};
onMounted(() => {
redirectAuth();
});
</script>
<style></style>

View File

@ -4,10 +4,13 @@ function resolve(dir) {
return path.join(__dirname, dir);
}
const serverHost = "http://192.168.1.98:8006"
const serverHost = "http://192.168.8.15:8066"//波哥
// const serverHost = "http://192.168.0.231:8006"//线上
// const serverHost = "http://192.168.1.117:8006"//周
// const serverHost = "http://192.168.1.98:8006"//毛毛
module.exports = {
publicPath: "./",
outputDir: "ylth",
outputDir: "gsxt",
assetsDir: "static",
lintOnSave: false, //process.env.NODE_ENV === 'development',
productionSourceMap: false,
@ -41,6 +44,14 @@ module.exports = {
changeOrigin: true,
logLevel: "debug"
},
"/chat": {
target: 'https://api.deepseek.com/chat/',
changeOrigin: true,
logLevel: "debug",
pathRewrite: {
"^/chat": "/"
}
},
}
},
chainWebpack(config) {