This commit is contained in:
lcw
2025-08-16 16:54:03 +08:00
parent 71487ac647
commit 42f5e37f65
69 changed files with 5913 additions and 978 deletions

222
package-lock.json generated
View File

@ -292,6 +292,11 @@
"@babel/types": "^7.18.6"
}
},
"@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="
},
"@babel/helper-validator-identifier": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
@ -2182,6 +2187,45 @@
}
}
},
"@vue/compat": {
"version": "3.5.18",
"resolved": "https://registry.npmmirror.com/@vue/compat/-/compat-3.5.18.tgz",
"integrity": "sha512-9nJUhd2+1JBW2YRxPkF0JZ+UieK2U7FEVla+7V4d9IlzD9HztQFSFj9VVR3sy/aTIUTyEhysKvsv7geD1jEiKg==",
"requires": {
"@babel/parser": "^7.28.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
},
"@babel/parser": {
"version": "7.28.0",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz",
"integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
"requires": {
"@babel/types": "^7.28.0"
}
},
"@babel/types": {
"version": "7.28.2",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
"requires": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
}
},
"source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
}
}
},
"@vue/compiler-core": {
"version": "3.2.37",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
@ -7174,6 +7218,183 @@
"integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==",
"dev": true
},
"fzui-fengqun-api": {
"version": "1.0.1",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/fzui-fengqun-api/-/fzui-fengqun-api-1.0.1.tgz",
"integrity": "sha512-YjcHnNJgBsuSJwmHFetovRT20Gw/6DRrvzMFsAgQe81zX1El5ckGE6vA4zTld8LUDiSHWdrc618hNlcjC3A7qA==",
"requires": {
"core-js": "^3.6.5",
"vue": "^2.6.11"
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
},
"@babel/parser": {
"version": "7.28.0",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/parser/-/parser-7.28.0.tgz",
"integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
"requires": {
"@babel/types": "^7.28.0"
}
},
"@babel/types": {
"version": "7.28.2",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/types/-/types-7.28.2.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
"requires": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
}
},
"@vue/compiler-sfc": {
"version": "2.7.16",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
"integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
"requires": {
"@babel/parser": "^7.23.5",
"postcss": "^8.4.14",
"prettier": "^1.18.2 || ^2.0.0",
"source-map": "^0.6.1"
}
},
"csstype": {
"version": "3.1.3",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"vue": {
"version": "2.7.16",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/vue/-/vue-2.7.16.tgz",
"integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
"requires": {
"@vue/compiler-sfc": "2.7.16",
"csstype": "^3.1.0"
}
}
}
},
"fzui-fengqun-bpm": {
"version": "1.0.1",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/fzui-fengqun-bpm/-/fzui-fengqun-bpm-1.0.1.tgz",
"integrity": "sha512-Ym3vvUf39oNAQew+5ZFFWWCQnM68jue8NvzNtxxFHElHzdiym4fY3Ged1VYpYyaeGeNMbADKKlxNKLy/6Yj1ig==",
"requires": {
"core-js": "^3.6.5",
"fzui-fengqun-api": "^1.0.1",
"vue": "^2.6.11"
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
},
"@babel/parser": {
"version": "7.28.0",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/parser/-/parser-7.28.0.tgz",
"integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
"requires": {
"@babel/types": "^7.28.0"
}
},
"@babel/types": {
"version": "7.28.2",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/types/-/types-7.28.2.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
"requires": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
}
},
"@vue/compiler-sfc": {
"version": "2.7.16",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
"integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
"requires": {
"@babel/parser": "^7.23.5",
"postcss": "^8.4.14",
"prettier": "^1.18.2 || ^2.0.0",
"source-map": "^0.6.1"
}
},
"csstype": {
"version": "3.1.3",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"vue": {
"version": "2.7.16",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/vue/-/vue-2.7.16.tgz",
"integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
"requires": {
"@vue/compiler-sfc": "2.7.16",
"csstype": "^3.1.0"
}
}
}
},
"fzui-fengqun-vue": {
"version": "1.0.1",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/fzui-fengqun-vue/-/fzui-fengqun-vue-1.0.1.tgz",
"integrity": "sha512-UFrs02ShB9+fmEa9kuX7QLg837N1GOPURX9gRKukIM9V1dsilea1+pU/iPu8irGgE5arkOEnsm8LilxfnMILAA==",
"requires": {
"core-js": "^3.6.5",
"fzui-fengqun-api": "^1.0.1",
"fzui-fengqun-bpm": "^1.0.1",
"vue": "^2.6.11"
},
"dependencies": {
"@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
},
"@babel/parser": {
"version": "7.28.0",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/parser/-/parser-7.28.0.tgz",
"integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
"requires": {
"@babel/types": "^7.28.0"
}
},
"@babel/types": {
"version": "7.28.2",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@babel/types/-/types-7.28.2.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
"requires": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
}
},
"@vue/compiler-sfc": {
"version": "2.7.16",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
"integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
"requires": {
"@babel/parser": "^7.23.5",
"postcss": "^8.4.14",
"prettier": "^1.18.2 || ^2.0.0",
"source-map": "^0.6.1"
}
},
"csstype": {
"version": "3.1.3",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"vue": {
"version": "2.7.16",
"resolved": "http://nexus.jwzh.online:9095/repository/npm-all/vue/-/vue-2.7.16.tgz",
"integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
"requires": {
"@vue/compiler-sfc": "2.7.16",
"csstype": "^3.1.0"
}
}
}
},
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@ -11930,7 +12151,6 @@
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
"integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
"dev": true,
"optional": true
},
"pretty-error": {

View File

@ -18,6 +18,7 @@
"@paddlejs-models/ocr": "^1.1.2",
"@paddlejs-models/ocrdet": "^0.0.3",
"@types/video.js": "^7.3.42",
"@vue/compat": "^3.5.18",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^0.26.0",
@ -27,6 +28,7 @@
"el-table-infinite-scroll": "^3.0.6",
"element-plus": "2.0.2",
"file-saver": "^2.0.5",
"fzui-fengqun-vue": "^1.0.1",
"gifler": "^0.1.0",
"image-compressor.js": "^1.1.4",
"lodash": "^4.17.21",

View File

@ -32,7 +32,7 @@ addresschange();
function addresschange() {
var Uri = 'ws://192.168.0.232:10095';
Uri = Uri.replace(/wss/g, "https");
window.open(Uri, '_blank');
// window.open(Uri, '_blank');
}

View File

@ -12,6 +12,7 @@ import { useStore } from "vuex";
import { getItem, setItem} from "@/utils/storage";
import { generateNewStyle, writeNewStyle } from "@/utils/theme";
const { proxy } = getCurrentInstance();
const store = useStore();
generateNewStyle(store.getters.mainColor).then((newStyle) => {
writeNewStyle(newStyle);

86
src/api/commit.js Normal file
View File

@ -0,0 +1,86 @@
import request from "@/utils/request";
const api = "/mosty-api/mosty-base";
const gsxtApi = "/mosty-api/mosty-gsxt";
// 查询未读消息
export const queryYdxxPageList = (data) => {
return request({
url: api + "/fzmsg/queryYdxxPageList",
method: "POST",
data
});
};
//查看未读详情
export const queryWdxxDetail = (data) => {
return request({
url: api + "/fzmsg/queryWdxxDetail",
method: "POST",
data
});
};
// 查询一睹消息
export const queryWdxxPageList = (data) => {
return request({
url: api + "/fzmsg/queryWdxxPageList ",
method: "POST",
data
});
};
export const queryYdxxDetail = (data) => {
return request({
url: api + "/fzmsg/queryYdxxDetail",
method: "POST",
data
});
};
export const queryXxTj = (data) => {
return request({
url: api + "/fzmsg/queryXxTj",
method: "POST",
data
});
};
// 下发指令
export const updateBkgzl = (params) => {
return request({
url: gsxtApi + "/tbGsxtBk/updateBkgzl",
method: "get",
params
});
};
// 签收
export const qsXx = (data) => {
return request({
url: api + "/fzmsg/qsXx",
method: "post",
data
});
};
// 预警发送指令
export const sendFqzl = (data) => {
return request({
url: gsxtApi + "/tbYjxx/sendFqzl",
method: "post",
data
});
};
// 重点人发掘发送指令
export const ZdrfjSendFqzl = (data) => {
return request({
url: gsxtApi + "/tbGsxtRqfjRy/sendFqzl",
method: "post",
data
});
};
//线索流转
export const qbcjSendFqzl = (data) => {
return request({
url: gsxtApi + "/qbcj/sendFqzl",
method: "post",
data
});
};

100
src/api/spl.js Normal file
View File

@ -0,0 +1,100 @@
import request from "@/utils/request";
import axios from "axios";
import qs from 'qs'; // 或者使用 URLSearchParams
const api = "/bpm";
// 解析数据
export function ParsingText(data, fun) {
axios({
method: 'post',
url: '/chat/completions',
data: data,
headers: { 'Authorization': 'Bearer sk-064b5c53131c4046883b718f2b31c050' }
}).then((res) => {
fun(res)
})
}
//get 请求
export const splFlvGet = (params = {}, url) => {
return request({
url: url,
method: "get",
params
});
};
//get 请求
export const splGet = (params = {}, url) => {
return request({
url: api + url,
method: "get",
params
});
};
//post 请求
export const splPost = (data = {}, url) => {
return request({
url: api + url,
method: "post",
data
});
};
//put 请求
export const splPut = (data = {}, url) => {
return request({
url: api + url,
method: "put",
data
});
};
//put 请求
export const splDelete = (data = {}, url) => {
return request({
url: api + url,
method: "delete",
data
});
};
export const submitProcess = (data) => {
return request({
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
url: api + '/process/createProcess',
method: 'post',
data: qs.stringify(data)
});
};
export const queryProcessNode = (data) => {
return request({
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
url: api + '/process/queryProcessNode',
method: 'post',
data: qs.stringify(data)
});
};
export const queryProcessNodeLog = (data) => {
return request({
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
url: api + '/process/queryProcessNodeLog',
method: 'post',
data: qs.stringify(data)
});
};
export const queryProcess = (data) => {
return request({
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
url: api + '/process/queryProcess',
method: 'post',
data: qs.stringify(data)
});
};

View File

@ -1,19 +1,23 @@
.h-100{
.h-100 {
height: 100%;
}
.w-100{
.w-100 {
width: 100%;
}
.flexcc{
display: flex;
justify-content: center;
align-items: center;
.flexcc {
display: flex;
justify-content: center;
align-items: center;
}
.flexcb{
.flexcb {
display: flex;
justify-content: space-between;
align-items: center;
}
}
.font10 {
font-size: 10px;
}
@ -64,12 +68,10 @@ align-items: center;
// 分割线
.divider {
background: linear-gradient(
90.143958942072deg,
background: linear-gradient(90.143958942072deg,
rgba(14, 48, 115, 1) 0%,
rgba(70, 159, 251, 1) 50%,
rgba(14, 48, 115, 1) 100%
);
rgba(14, 48, 115, 1) 100%);
height: 1px;
}
@ -137,6 +139,7 @@ align-items: center;
.relative {
position: relative;
}
.absolute {
position: absolute;
}
@ -180,9 +183,11 @@ align-items: center;
.flex {
display: flex;
}
.flex-grow1 {
flex-grow: 1;
}
.shrink0 {
flex-shrink: 0;
}
@ -190,6 +195,7 @@ align-items: center;
.flex-warp {
flex-wrap: wrap;
}
.flex-nowrap {
flex-wrap: nowrap;
}
@ -200,7 +206,9 @@ align-items: center;
.just-between {
justify-content: space-between;
}
.just-around {
justify-content: space-around;
}
@ -221,14 +229,18 @@ align-items: center;
align-items: start;
}
.align-center {
align-items: center;
.align-space-around {
align-content: space-around;
}
.align-bottom {
align-items: flex-end;
}
.align-center {
align-items: center;
}
/**********文本省略***********/
.nowrap {
white-space: nowrap;
@ -328,11 +340,11 @@ align-items: center;
}
.ww#{$i} {
width: #{$i}+ "%";
width: #{$i}+"%";
}
.hh#{$i} {
height: #{$i}+ "%";
height: #{$i}+"%";
}
//高度
@ -345,24 +357,29 @@ align-items: center;
.lh#{$i} {
line-height: #{$i}px;
}
//自适应大号字体(通常为统计数字 18-30)
.font_size_big{
.font_size_big {
font-size: clamp(1.125rem, -0.894rem + 2.31vw, 1.875rem);
}
}
//自适应一号字体(通常为一级标题 14-18)
.font_size_title{
.font_size_title {
font-size: clamp(0.875rem, 0.37rem + 0.58vw, 1.063rem);
}
//自适应统计字体(通常为统计数字 14-22)
.font_size1{
.font_size1 {
font-size: clamp(0.875rem, -0.471rem + 1.54vw, 1.375rem);
}
//自适应二号字体(通常为二级标题 14-16)
.font_size2{
.font_size2 {
font-size: clamp(0.75rem, 0.077rem + 0.77vw, 1rem);
}
//自适应普通字体(通常为默认大小 10-14)
.font_size_default{
.font_size_default {
font-size: clamp(0.625rem, -0.048rem + 0.77vw, 0.875rem);
}
}
@ -373,6 +390,7 @@ align-items: center;
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HANYILINGXINTIJIAN";
src: url("~@/assets/font/HANYILINGXINTIJIAN-1.TTF");

BIN
src/assets/images/tztg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 B

BIN
src/assets/images/xtxx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 B

BIN
src/assets/images/xxxt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

View File

@ -1,7 +1,7 @@
<template>
<el-dialog v-model="showDialog" :destroy-on-close="true" title="新增车辆" @close="close" :close-on-click-modal="false">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules">
<template #bqList>
<!-- <template #bqList>
<div class="marks pointer" @click="chooseMarksVisible = true">
<span style="color: rgb(175 178 184);padding-left: 10px;"
v-if="!listQuery.bqList || listQuery.bqList.length == 0">请选择标签</span>
@ -10,7 +10,7 @@
:key="idx">{{ it.bqMc }}</el-tag>
</span>
</div>
</template>
</template> -->
</FormMessage>
<template #footer>
<div class="flex just-center">
@ -27,7 +27,7 @@ import ChooseMarks from "@/components/ChooseList/ChooseMarks/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { reactive, ref, getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const { D_BZ_XB } = proxy.$dict("D_BZ_XB"); // 获取字典数据
const { D_GS_ZDR_YJDJ ,BD_BK_CLYJBQ} = proxy.$dict("D_GS_ZDR_YJDJ",'BD_BK_CLYJBQ'); // 获取字典数据
const elform = ref()
const roleIds = ref([])
const showDialog = ref(false)
@ -35,46 +35,42 @@ const chooseMarksVisible = ref(false)
const emit = defineEmits(['change'])
const listQuery = ref({})
const formData = ref([
{ label: "车牌号", prop: "hphm", type: "input" },
{ label: "车架号", prop: "clCjh", type: "input" },
{ label: "车牌号", prop: "clCph", type: "input" },
{
label: "车辆颜色",
prop: "clYs",
type: "input",
},
{ label: "车辆所有人", prop: "clSyr", type: "input" },
{ label: "人身份证", prop: "clSyrsfzh", type: "input" },
{ label: "责任单位", prop: "zrSsbmdm", depMc: 'zrSsbmmc', type: "department" },
{ label: "管辖单位", prop: "gxSsbmdm", depMc: 'gxSsbmmc', type: "department" },
{ label: "管控民警姓名", prop: "gkMjXm", type: "input" },
{ label: "管控民警警号", prop: "gkMjJh", type: "input" },
{ label: "管控原因", prop: "clLkyy", type: "textarea", width: "100%" },
{ label: "所有人身份证", prop: "clSyrsfzh", type: "input" },
{ label: "所属部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "预警标签", prop: "yjbq", type: "select", options: BD_BK_CLYJBQ },
{ label: "车辆照片", prop: "fjdz", type: "upload", width: "100%" },
])
const rules = reactive({
hphm: [{ required: true, message: "请输入车牌号", trigger: "blur" }],
clCjh: [{ required: true, message: "请输入车架号", trigger: "blur" }],
clYs: [{ required: true, message: "请输入车辆颜色", trigger: "blur" }],
clSyr: [{ required: true, message: "请输入车辆所有人", trigger: "blur" }],
clSyrsfzh: [{ required: true, message: "请输入人员身份证", trigger: "blur" }],
clCph: [{ required: true, message: "请输入车牌号", trigger: "blur" }],
yjdj: [{ required: true, message: "请选择预警等级", trigger: "change" }],
yjbq: [{ required: true, message: "请选择预警标签", trigger: "change" }],
ssbmdm:[{ required: true, message: "请选择所属部门", trigger: "change" }]
})
const init = () => {
showDialog.value = true;
}
// 选择标签
const choosed = (val) => {
listQuery.value.bqList = val.map(v => {
return { bqZl: v.bqLb, bqId: v.id, bqLx: v.bqLx, bqLb: v.bqLb, bqMc: v.bqMc, bqDm: v.bqDm }
});
roleIds.value = val.map(v => v.id)
}
// const choosed = (val) => {
// listQuery.value.bqList = val.map(v => {
// return { bqZl: v.bqLb, bqId: v.id, bqLx: v.bqLx, bqLb: v.bqLb, bqMc: v.bqMc, bqDm: v.bqDm }
// });
// roleIds.value = val.map(v => v.id)
// }
// 删除数据
const closeTag = (idx) => {
listQuery.value.bqList.splice(idx, 1)
roleIds.value.splice(idx, 1)
}
// const closeTag = (idx) => {
// listQuery.value.bqList.splice(idx, 1)
// roleIds.value.splice(idx, 1)
// }
const submitForm = () => {
elform.value.submit((val) => {
@ -86,6 +82,7 @@ const submitForm = () => {
const close = () => {
elform.value.reset();
listQuery.value = {}
listQuery.value.bqList = []
roleIds.value = []
showDialog.value = false;

View File

@ -6,13 +6,13 @@
</template>
<el-form :model="listQuery" :inline="true">
<el-form-item label="车牌号">
<el-input placeholder="请输入车牌号" v-model="listQuery.hphm" clearable ></el-input>
<el-input placeholder="请输入车牌号" v-model="listQuery.hphm" clearable></el-input>
</el-form-item>
<el-form-item label="车架号">
<el-input placeholder="请输入车架号" v-model="listQuery.clCjh" clearable ></el-input>
<el-input placeholder="请输入车架号" v-model="listQuery.clCjh" clearable></el-input>
</el-form-item>
<el-form-item label="车辆所有人">
<el-input placeholder="请输入车辆所有人" v-model="listQuery.clSyr" clearable ></el-input>
<el-input placeholder="请输入车辆所有人" v-model="listQuery.clSyr" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button type="success" @click="handleFilter">查询</el-button>
@ -20,27 +20,31 @@
</el-form-item>
</el-form>
<div class="tabBox" :class="props.Single ? 'tabBoxRadio' : ''" style="margin-top: 0px">
<el-table ref="multipleUserRef" :key="keyTabel" v-loading="loading" @selection-change="handleSelectionChange" :data="tableData" border :row-key="keyid" style="width: 100%" height="450">
<el-table-column type="selection" width="55" :reserve-selection="true"/>
<el-table-column prop="hphm" align="center" label="车牌号"/>
<el-table-column prop="clCjh" align="center" label="车号"/>
<el-table-column prop="clYs" align="center" label="车辆颜色"/>
<el-table-column prop="clSyr" align="center" label="车辆所有人"/>
<el-table-column prop="gxSsbmmc" align="center" label="管辖单位"/>
<el-table-column prop="gkMjXm" align="center" label="管控民警"/>
<el-table ref="multipleUserRef" :key="keyTabel" v-loading="loading" @selection-change="handleSelectionChange"
:data="tableData" border :row-key="keyid" style="width: 100%" height="450">
<el-table-column type="selection" width="55" :reserve-selection="true" />
<el-table-column prop="hphm" align="center" label="车号" />
<el-table-column prop="clCjh" align="center" label="车架号" />
<el-table-column prop="clYs" align="center" label="车辆颜色" />
<el-table-column prop="clSyr" align="center" label="车辆所有人" />
<el-table-column prop="gxSsbmmc" align="center" label="管辖单位" />
<el-table-column prop="gkMjXm" align="center" label="管控民警" />
<el-table-column prop="gxSsbmmc" align="center" label="预警等级">
<template #default="scope">
<DictTag :tag="false" :value="scope.row.yjdj" :options="D_GS_ZDR_YJDJ" />
</template>
</el-table-column>
<el-table-column prop="yjbq" align="center" label="预警标签">
<template #default="scope">
<DictTag :tag="false" :value="scope.row.yjbq" :options="BD_BK_CLYJBQ" />
</template>
</el-table-column>
</el-table>
</div>
<div class="fenye flex just-end " :style="{ top: tableHeight + 'px' }">
<el-pagination
class="pagination"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="listQuery.pageCurrent"
:page-sizes="[10, 20, 50, 100]"
:page-size="listQuery.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
></el-pagination>
<el-pagination class="pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="listQuery.pageCurrent" :page-sizes="[10, 20, 50, 100]" :page-size="listQuery.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
</div>
<template #footer>
<div class="flex just-center">
@ -56,14 +60,15 @@
<script setup>
import AddPeo from './addPeo.vue'
import { qcckGet} from "@/api/qcckApi.js";
import { defineProps, ref ,getCurrentInstance, watch} from "vue";
import { qcckGet } from "@/api/qcckApi.js";
import { Dict } from 'core-js';
import { defineProps, ref, getCurrentInstance, watch } from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_XB,D_BZ_MZ } = proxy.$dict("D_BZ_XB","D_BZ_MZ"); //获取字典数据
const { BD_BK_CLYJBQ, D_GS_ZDR_YJDJ } = proxy.$dict("BD_BK_CLYJBQ", "D_GS_ZDR_YJDJ"); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,
default:false
default: false
},
LeaderType: {
type: String,
@ -89,7 +94,7 @@ const addPerson = ref()
const multipleUserRef = ref(null);
const multipleSelectionUser = ref([]);
const tableData = ref([]);
const emits = defineEmits(["update:modelValue", "choosed","choosedAdd"]);
const emits = defineEmits(["update:modelValue", "choosed", "choosedAdd"]);
const keyTabel = ref(0)
const keyid = (row) => {
return row.id;
@ -140,14 +145,14 @@ const handleCurrentChange = (currentPage) => {
};
const getListData = () => {
keyTabel.value++
const params = {...listQuery.value}
const params = { ...listQuery.value }
loading.value = true;
qcckGet(params,'/mosty-gsxt/tbGsxtZdcl/selectPage').then(res=>{
qcckGet(params, '/mosty-gsxt/tbGsxtZdcl/selectPage').then(res => {
loading.value = false;
tableData.value = res.records || [];
total.value = res.total;
multipleUser();
}).catch(()=>{
}).catch(() => {
loading.value = false;
})
};
@ -183,9 +188,9 @@ const zdyaddPerson = () => {
addPerson.value.init();
};
watch(()=>props.modelValue,val=>{
if(val) handleFilter();
},{immediate:true})
watch(() => props.modelValue, val => {
if (val) handleFilter();
}, { immediate: true })
</script>
@ -197,8 +202,8 @@ watch(()=>props.modelValue,val=>{
.tabBoxRadio .el-checkbox__inner {
border-radius: 50% !important;
}
.tabBoxRadio .el-table__header-wrapper .el-checkbox {
display: none;
}
</style>

View File

@ -25,7 +25,7 @@ import ChooseMarks from "@/components/ChooseList/ChooseMarks/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { reactive, ref,getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
const { D_BZ_XB } = proxy.$dict("D_BZ_XB"); // 获取字典数据
const { D_BZ_XB,D_GS_ZDR_YJDJ } = proxy.$dict("D_BZ_XB","D_GS_ZDR_YJDJ"); // 获取字典数据
const elform = ref()
const roleIds = ref([])
const showDialog = ref(false)
@ -37,21 +37,26 @@ const formData = ref([
{ label: "性别", prop: "ryXb", type: "select" ,width:'45%',options:D_BZ_XB},
{ label: "身份证号", prop: "rySfzh", type: "input" ,width:'45%'},
{ label: "手机号码", prop: "ryLxdh", type: "input",width:'45%' },
{ label: "户籍地址", prop: "hjdXz", type: "input",width:'100%'},
{ label: "户籍地派出所", prop: "hjdpcsdm",depMc:'hjdpcs', type: "department" ,width:'48%'},
{ label: "户籍地址", prop: "hjdXz", type: "input", width: '100%' },
{ label: "户籍地派出所", prop: "hjdpcsdm", depMc: 'hjdpcs', type: "department", width: '48%' },
{ label: "所属部门", prop: "ssbmdm", type: "department" },
{ label: "特征描述", prop: "qtTzms", type: "input" ,width:'100%'},
{ label: "人员标签", prop: "bqList", type: "slot" ,width:'100%'},
{ label: "车牌号", prop: "clCph", type: "input" ,width:'45%'},
{ label: "车架号", prop: "clCjh", type: "input" ,width:'45%'},
{ label: "车牌号", prop: "clCph", type: "input", width: '45%' },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "车辆识别代码", prop: "clCjh", type: "input" ,width:'45%'},
{ label: "人员照片", prop: "fjZp", type: "upload" ,width:'100%'},
])
const rules = reactive({
// fjZp: [{ required: true, message: "请上传人员照片", trigger: "blur" }],
ryXm: [{ required: true, message: "请输入姓名", trigger: "blur" }],
rySfzh: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
ryXb: [{ required: true, message: "请选择性别", trigger: "change" }],
ryLxdh: [{ required: true, message: "请输入手机号码", trigger: "blur" }],
hjdXz: [{ required: true, message: "请输入户籍地", trigger: "blur" }],
xzdXz: [{ required: true, message: "请输入现居住地址", trigger: "blur" }],
yjdj: [{ required: true, message: "请选择预警等级", trigger: "change" }],
ssbmdm:[{ required: true, message: "请选择所属部门", trigger: "change" }]
// ryLxdh: [{ required: true, message: "请输入手机号码", trigger: "blur" }],
// hjdXz: [{ required: true, message: "请输入户籍地", trigger: "blur" }],
// xzdXz: [{ required: true, message: "请输入现居住地址", trigger: "blur" }],
})
const init = () =>{
showDialog.value = true;
@ -81,6 +86,8 @@ const submitForm = () =>{
const close = () =>{
elform.value.reset();
listQuery.value = {}
listQuery.value.bqList = []
roleIds.value = []
showDialog.value = false;

View File

@ -39,8 +39,13 @@
<el-table-column prop="ryLxdh" align="center" label="手机号"/>
<el-table-column prop="qtXnsf" align="center" label="虚拟身份"/>
<el-table-column prop="clCph" align="center" label="车牌号"/>
<el-table-column prop="clCjh" align="center" label="车架号"/>
<el-table-column prop="clCjh" align="center" label="车辆识别代码"/>
<el-table-column prop="qtTzms" align="center" label="特征描述"/>
<el-table-column prop="zdrYjdj" align="center" label="预警等级">
<template #default="{ row }">
<DictTag :tag="false" :value="row.zdrYjdj" :options="D_GS_ZDR_YJDJ" />
</template>
</el-table-column>
<el-table-column prop="bqList" align="center" label="人员标签">
<template #default="{ row }">
<span v-if="row.bqList">
@ -79,7 +84,7 @@ import AddPeo from './addPeo.vue'
import { qcckGet} from "@/api/qcckApi.js";
import { defineProps, ref ,getCurrentInstance, watch} from "vue";
const { proxy } = getCurrentInstance();
const { D_BZ_XB,D_BZ_MZ } = proxy.$dict("D_BZ_XB","D_BZ_MZ"); //获取字典数据
const { D_BZ_XB,D_BZ_MZ,D_GS_ZDR_YJDJ } = proxy.$dict("D_BZ_XB","D_BZ_MZ",'D_GS_ZDR_YJDJ'); //获取字典数据
const props = defineProps({
modelValue: {
type: Boolean,

View File

@ -106,6 +106,15 @@ const handleChange = (e) => {
if (props.multiple === true) {
const data = e.map((item) => {return item[item.length - 1];});
emits("update:modelValue", data);
const obj= data.map(items=>{
return {
... depList.value.find(item=>{ return item.orgCode == items})
}
})
console.log(obj);
emits("getDepValue", obj);
} else {
const data = e ? e[e.length - 1] : "";
emits("update:modelValue", data);

View File

@ -5,7 +5,9 @@
:on-exceed="handleExceed" :on-success="handlerSuccess" :before-upload="beforeImgUpload">
<template #default>
<el-button v-if="props.showBtn" size="small" type="primary">上传文件</el-button>
<el-icon v-else><Plus /></el-icon>
<el-icon v-else>
<Plus />
</el-icon>
</template>
<template #file="{ file }" v-if="!props.showBtn">
<div v-if="props.isImg">
@ -15,7 +17,9 @@
<el-icon> <zoom-in /></el-icon>
</span>
<span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file, fileList)">
<el-icon><Delete /></el-icon>
<el-icon>
<Delete />
</el-icon>
</span>
</span>
</div>
@ -26,10 +30,14 @@
</div>
<span class="el-upload-list__item-actions">
<span v-if="!disabled" class="el-upload-list__item-delete" @click="handleDownload(file)">
<el-icon><Download /></el-icon>
<el-icon>
<Download />
</el-icon>
</span>
<span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file, fileList)">
<el-icon><Delete /></el-icon>
<el-icon>
<Delete />
</el-icon>
</span>
</span>
</div>
@ -158,6 +166,8 @@ watch(
let arr = val ? val : [];
if (arr && arr.length > 0) {
if (!props.sfUrl) {
console.log(arr, "图片");
if (Array.isArray(arr)) {
fileList.value = arr.map((el) => {
if (Object.prototype.toString.call(el) === "[object Object]") {
return {
@ -168,6 +178,20 @@ watch(
return { url: `/mosty-api/mosty-base/minio/image/download/` + el };
}
});
} else {
const fjListData=arr.split(',')
fileList.value = fjListData.map((el) => {
if (Object.prototype.toString.call(el) === "[object Object]") {
return {
url: `/mosty-api/mosty-base/minio/image/download/` + el,
name: el.name
};
} else {
return { url: `/mosty-api/mosty-base/minio/image/download/` + el };
}
});
}
} else {
fileList.value = arr.map((el) => {
if (Object.prototype.toString.call(el) === "[object Object]") {

View File

@ -1,6 +1,7 @@
<template>
<el-form ref="elform" :model="listQuery" :label-width="props.labelWidth" :rules="props.rules" :inline="props.inline"
label-position="right" :disabled="props.disabled">
<el-form-item v-for="(item, idx) in props.formList" :style="item.width && { width: item.width }" :prop="item.prop"
:label="item.label" :label-width="item.labelWidth" :key="idx">
<!-- input表单 input-->
@ -21,7 +22,7 @@
<!-- 部门department -->
<template v-else-if="item.type === 'department'">
<MOSTY.Department style="width: 100%;" clearable :isAll="item.isAll" @getDepValue="getdep($event, item.depMc)"
v-model="listQuery[item.prop]" :placeholder="listQuery[item.depMc] ? listQuery[item.depMc] : '请选择'" />
:multiple="item.multiple" v-model="listQuery[item.prop]" :placeholder="listQuery[item.depMc] ? listQuery[item.depMc] : '请选择'" />
</template>
<!-- 上传 upload -->

View File

@ -18,6 +18,7 @@
</template>
</el-dialog>
<ChooseMarks v-model="chooseMarksVisible" @choosed="choosed" :roleIds="roleIds" />
</template>
<script setup>

View File

@ -0,0 +1,303 @@
<template>
<div class="smallTitle">审批信息</div>
<div class="ww100">
<el-steps :active="0" space="500" finish-status="success" direction="vertical" status=''>
<el-step :title="item.eventType == '0' ? '发起申请' : item.eventType == '1' ? '审批结束' : item.nodeName"
v-for="(item, index) in workflow" :key="index">
<template #description>
<div class="ww100 mt10 mb20 nodeBox" v-if="item.eventType == '0'||item.eventType == '1'">
<div class="nodeorgNameTg">{{ item.xtLrrbm }}</div>
<div class="flex just-between nameTag">
<div>{{ item.log.userName }}</div>
<div class="fontColor">{{ item.eventType == '0' ? '发起' : '结束' }}</div>
</div>
<div>{{ item.log.xtLrsj }}</div>
</div>
<div v-else class="ww100 mt10 mb20 nodeBox">
<div :class="item.taskStatus=='2'?'nodeorgNameTg':'nodeorgNameDd'">{{ item.orgNameData.orgname }}</div>
<div v-for="(items, indexs) in item.log" :key="indexs">
<div class="flex just-between nameTag" >
<div>{{ items.userName }}</div>
<div :class="item.taskStatus=='2'?'fontColor':'fontColorDd'">审批中</div>
</div>
<div>{{ items.xtLrsj }}</div>
</div>
</div>
</template>
</el-step>
</el-steps>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { queryProcessNode, queryProcessNodeLog, queryProcess } from '@/api/spl'
const workflow = ref()
const getWorkflow = async (id) => {
const promes = {
processId: id
}
const process = await queryProcess(promes)
const proNode = await queryProcessNode(promes)
const proNodeLog = await queryProcessNodeLog(promes)
const sortedNodes = sortNodesWithNoPreviousFirst(proNode.rows)
workflow.value = sortedNodes.map(item => {
const log = proNodeLog.rows.filter(items => item.nodeId == items.nodeId)
if (item.eventType == '0') {
console.log(item);
return {
...item,
log: {
// userData: JSON.parse(item.userData),
// xtLrrbm:process.rows[0].xtLrrbm,
userName: process.rows[0].userName,
xtLrsj: process.rows[0].xtLrsj,
processStatus: process.rows[0].processStatus,
}
}
} else {
return {
...item,
orgNameData: JSON.parse(log[0].userData),
log: log
}
}
})
};
function sortProcessNodes(nodes) {
// 1. 创建节点映射表和子节点关系图
const nodeMap = {};
const childrenMap = {}; // 存储每个节点的子节点
// 初始化
nodes.forEach(node => {
nodeMap[node.nodeId] = node;
childrenMap[node.nodeId] = [];
});
// 2. 构建子节点关系
nodes.forEach(node => {
if (node.prevPNodeId && nodeMap[node.prevPNodeId]) {
childrenMap[node.prevPNodeId].push(node.nodeId);
}
});
// 3. 找到所有开始节点没有prevPNodeId或prevPNodeId不在节点列表中的节点
const startNodes = nodes.filter(node =>
!node.prevPNodeId || !nodeMap[node.prevPNodeId]
);
// 4. 深度优先遍历生成排序列表
const sortedNodes = [];
const visited = new Set();
function traverse(nodeId) {
if (visited.has(nodeId)) return;
visited.add(nodeId);
// 添加当前节点
sortedNodes.push(nodeMap[nodeId]);
// 获取所有子节点相同prevPNodeId的节点
const children = childrenMap[nodeId];
// 对子节点按某种规则排序(如按创建时间)
const sortedChildren = [...children].sort((a, b) => {
return new Date(nodeMap[a].xtLrsj) - new Date(nodeMap[b].xtLrsj);
});
// 递归处理每个子节点
sortedChildren.forEach(childId => {
traverse(childId);
});
}
// 从每个开始节点开始遍历
startNodes.forEach(node => {
traverse(node.nodeId);
});
// 5. 处理可能的孤立节点(不应该存在,但作为保护)
nodes.forEach(node => {
if (!visited.has(node.nodeId)) {
sortedNodes.push(node);
}
});
return sortedNodes;
}
function sortNodesWithNoPreviousFirst(nodes) {
if (!Array.isArray(nodes)) {
console.error('参数必须是一个数组');
return [];
}
if (nodes.length === 0) {
return [];
}
// 1. 创建节点ID到节点的映射表用于快速查找
const nodeMap = nodes.reduce((map, node) => {
if (node && node.nodeId) {
map[node.nodeId] = node;
}
console.log(node,"xxxxxx");
return map;
}, {});
console.log(nodeMap);
// 2. 分离节点:没有前驱的节点和有前驱的节点
const result = nodes.reduce((acc, node) => {
// 检查是否为有效节点
if (!node || !node.nodeId) {
console.warn('发现无效节点,将被忽略:', node);
return acc;
}
// 判断是否没有前驱节点
const hasNoPrevious = !node.prevPNodeId && !nodeMap[node.prevPNodeId];
if (hasNoPrevious) {
acc.noPrevious.push(node);
} else {
acc.hasPrevious.push(node);
}
return acc;
}, { noPrevious: [], hasPrevious: [] });
// 3. 合并结果:没有前驱的节点在前,有前驱的节点在后
console.log(result.noPrevious);
console.log(result.hasPrevious);
return [...result.noPrevious, ...result.hasPrevious];
}
defineExpose({
getWorkflow
})
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.smallTitle {
width: 100%;
font-size: 15px;
line-height: 50px;
font-weight: 550;
color: #606266;
}
.mapSearch {
left: 10px;
top: 10px;
z-index: 100;
}
.dialog {
::v-deep .el-form-item--default {
margin: 0 1% 0 0 !important;
padding-bottom: 0 !important;
}
}
::v-deep .avatar-uploader {
display: flex;
}
::v-deep .el-upload--picture-card i {
width: 156px;
}
.depBox {
border: 1px solid #e9e9e9;
width: 305px;
padding: 0 0 0 4px;
border-radius: 4px;
::v-deep .el-input__inner {
border: none;
}
::v-deep .el-cascader .el-input.is-focus .el-input__inner {
border-color: transparent !important;
}
::v-deep .el-input__inner:focus {
box-shadow: none;
}
::v-deep .el-input.is-disabled .el-input__inner {
border-color: transparent !important;
}
}
/* 使用深度选择器覆盖子组件样式 */
::v-deep .el-step.is-vertical .el-step__title {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__description{
padding: 0 !important;
}
::v-deep .el-step__description.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
.el-step__title.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__head.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__line {
background-color: #000000 !important;
}
.nodeBox {
width: 80%;
text-align: center;
line-height: 30px;
border-radius: 10px;
overflow: hidden;
background-color: aliceblue;
.nodeorgNameTg {
background-color: #1abe20;
}
.nameTag {
line-height: 30px;
padding: 0 10px;
}
.nodeorgNameDd {
background-color: #18a2dd;
}
.fontColor {
color: #1abe20;
} .fontColorDd {
color: #18a2dd;
}
}
</style>

View File

@ -0,0 +1,316 @@
<template>
<el-dialog class="dialog-container" :model-value="modelValue" :title="titles" :before-close="handleClose">
<div class="dialog-header">
<div class="flex align-center">下一节点
<el-checkbox v-model="showNode" :label="modelData.nodeName" size="large" />
</div>
<div> <el-button type="success" :icon="Plus" @click="newAdditions" /></div>
</div>
<div class="container-box">
<div v-if="showNode">
<el-divider content-position="left">节点</el-divider>
<div>
<div class="row" v-for="(item, index) in nodeData" :key="index">
<MOSTY.Department filterable v-model="item.deptId" width="100%"
@getDepValue="(obj) => changePostList(index, obj)" clearable placeholder="请选择所属部门" />
<el-select class="select-user" v-model="item.userId" filterable placeholder="选择审批人"
@change="changeUser(index)">
<el-option v-for="item in item.listData" :key="item.id" :label="item.userName" :value="item.id" />
</el-select>
<div>
<el-button type="danger" @click="newDelitions(index)">删除</el-button>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="qcckPostList">
确认
</el-button>
</div>
</template>
</el-dialog>
</template>
<script>
</script>
<script setup>
import { ref, getCurrentInstance, reactive, watch } from 'vue'
import { qcckGet, qcckPost } from '@/api/qcckApi'
import { splGet, splPost, submitProcess } from '@/api/spl'
import { getItem } from '@/utils/storage'
import { Plus } from '@element-plus/icons-vue'
import * as MOSTY from "@/components/MyComponents/index";
const { proxy } = getCurrentInstance();
const props = defineProps({
modelValue: {
type: Boolean,
required: true
}, title: {
type: String,
default: '发起流程'
},
createProcess: {
type: Object,
default: () => { }
}, radioData: {
type: String,
default: ''
}, path: {
type: Object,
default: {
byMeansOf: '',
nobyMeansOf: '',
clueVerification: "",
recycle: ""
}
}, userData: {
type: Object,
default: () => {
return {
ajmc: "",
flowType: ""
}
}
}
})
const emit = defineEmits(['update:modelValue', 'close', 'getList'])
const titles = ref(props.title)
const showNode = ref(true)
const InterfaceAddress = 'http://155.2422.30:2109/mosty-api/mosty-gsxt/'
// 新增
const nodeData = ref([
{
deptId: '',
userId: '',
userData: {},
orgData: {},
}
])
//新增表单
const newAdditions = () => {
nodeData.value.push({
deptId: '',
userId: '',
userData: {},
orgData: {},
listData: []
})
}
// 删除表单
const newDelitions = (item) => {
nodeData.value.splice(item, 1)
}
const chageIndex = ref(0)
// 选取角色
const changeUser = (index) => {
chageIndex.value = index
let obj = nodeData.value[index].listData.find(item => { return item.id == nodeData.value[index].userId })
nodeData.value[index].userData = {
userId: obj.userId,
userName: obj.userName,
sfzh: obj.idEntityCard,
userData: {
// id: '41fbffaf92a34b31bde6302004277486',
// orgid: '41fbffaf92a34b31bde6302004277486',
id: orgId.value,
orgid: orgId.value,
orgcode: obj.deptCode,
orgname: obj.deptName
}
}
}
//选取部门
const orgId=ref()
const changePostList = (index, e) => {
orgId.value=e.fzOrgId
chageIndex.value = index
nodeData.value[chageIndex.value].id = orgId.value
nodeData.value[chageIndex.value].orgData = {
id:orgId.value,
orgid:orgId.value,
// id: '41fbffaf92a34b31bde6302004277486',
// orgid: '41fbffaf92a34b31bde6302004277486',
orgcode: e.orgCode,
orgname: e.orgName
}
getUser()
}
// 提交
const qcckPostList = async () => {
const deptId = getItem('deptId')
let users = nodeData.value.map(item => {
return {
userId: item.userData.userId,
// userId: '540422200010197495',
userName: item.userData.userName,
userData: JSON.stringify(item.userData.userData)
// ...item.userData
}
})
let userData = {
id:deptId[0].fzOrgId,
orgid:deptId[0].fzOrgId,
// id: '41fbffaf92a34b31bde6302004277486',
// orgid: '41fbffaf92a34b31bde6302004277486',
orgcode: deptId[0].deptCode,
orgname: deptId[0].deptName,
}
const promes = {
...props.createProcess,
// processData: { ...props.createProcess.processData.sqrw, orgNameData: userData },
flowType: "ZyCompany",
iframe: `${props.path.clueVerification}?id=${props.createProcess.processData.rwbh}`,
callback: {
"START": "",//流程开始
"APPROVE": "",//节点审批通过
"BACK": "",//退回上一节点
"REVOKE": "",//撤回审批
"DONE": `${InterfaceAddress}${props.path.byMeansOf}?id=${props.createProcess.rwbh}&bkZt=05`,//流程审批通过
"ABORT": `${InterfaceAddress}${props.path.nobyMeansOf}?id=${props.createProcess.rwbh}&bkZt=06`,//审批不通过
"RECOVER": "",//流程回收
"AGAIN": `${InterfaceAddress}${props.path.recycle}?id=${props.createProcess.rwbh}&bkZt=07`//流程退回初始
},
decision: JSON.stringify({
[modelData.value.nodeId]: {
users: users,
services: [],
events: [],
userData: JSON.stringify(userData)
}
})
}
promes.processData = JSON.stringify(promes.processData)
promes.callback = JSON.stringify(promes.callback)
console.log(promes);
await submitProcess({ ...promes }).then(res => {
proxy.$message({ type: "success", message: "提交审批成功" });
sendMessage(res.rows[0])
})
await emit('getList')
emit('close')
close()
}
//获取角色
const getUser = () => {
const promes = {
size: 200, current: 1,
deptId: nodeData.value[chageIndex.value].id
}
qcckGet(promes, '/mosty-base/sysUser/selectPage').then(res => {
nodeData.value[chageIndex.value].listData = res.records
})
}
//查询模板
const modelData = ref({})
const modelMsg = ref()
const queryModel = async () => {
const prrmes = {
modelId: props.radioData,
modelStatus: 1
}
const res = await splPost(prrmes, '/model/queryModel')
const versionRes = await splPost({ modelVersionId: res.rows[0].currentVersionId }, '/modelVersion/queryModelVersion')
modelMsg.value = versionRes.rows[0]
const nodeRes = await splPost({ modelVersionId: res.rows[0].currentVersionId }, '/modelVersion/queryModelNode')
if (versionRes.rows.length > 0) {
modelData.value = nodeRes.rows.filter(item => item.nodeType == '1')[0]
}
}
//发消息
const sendMessage = (gzlid) => {
const bkshrSfzh = nodeData.value.map(item => {
return {
bkshrXm: item.userData.userName,
bkshrSfzh: item.userData.sfzh,
bkshrSsbmmc: item.userData.userData.orgname,
bkshrSsbmdm: item.userData.userData.orgcode,
}
})
const promes = {
xxly: '005',
gzlid: gzlid,
list: bkshrSfzh,
versionId: modelMsg.value.modelVersionId,
id: props.createProcess.processData.rwbh
}
switch (props.userData.flowType) {
case 'BKSP':
qcckPost(promes, '/mosty-gsxt/tbGsxtBk/updateBkgzl').then(res => {
console.log(res);
})
break;
case 'ZDRYSDFJDP':
qcckPost(promes, '/mosty-gsxt/tbGsxtRqfjRy/updateBkgzl').then(res => {
console.log(res);
})
break;
case 'XSSJCJSP':
qcckPost(promes, '/mosty-gsxt/qbcj/updateBkgzl').then(res => {
console.log(res);
})
break;
}
}
watch(() => props.modelValue, (val) => {
if (val) {
queryModel()
}
})
const close = () => {
nodeData.value = [
{
deptId: '',
userId: '',
userData: {},
orgData: {},
}
]
emit('update:modelValue', false)
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
::v-deep .el-dialog__body {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.dialog-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.container-box {
height: 300px;
overflow: auto;
.row {
margin-top: 10px;
align-items: center;
display: flex;
margin-right: 10px;
.select-user {
margin: 0 10px;
}
}
}
</style>

View File

@ -0,0 +1,143 @@
<template>
<el-dialog class="dialog-container" :model-value="modelValue" :title="title" :before-close="close">
<div style="height: 300px;overflow: auto" v-infinite-scroll="load">
<el-radio-group v-model="radio" @change="changeRadio" v-if="lyquery.rows.length > 0">
<el-radio :label="item.modelId" v-for="(item) in lyquery.rows" :key="item.id">
{{ item.modelName }}
</el-radio>
</el-radio-group>
<div class="ww100 flex just-center">
<MOSTY.Empty :show="lyquery.rows.length == 0"></MOSTY.Empty>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="onComfirm">
确认
</el-button>
</div>
</template>
</el-dialog>
<SelectingPeople v-model="showDialog"
:createProcess="createProcess" @close="close" :radioData="radioData" :path="path" @getList="emit('getList')" :userData="userData"/>
</template>
<script setup>
import { ref, getCurrentInstance, reactive, watch } from 'vue'
import SelectingPeople from './SelectingPeople.vue';
import * as MOSTY from "@/components/MyComponents/index";
import { splGet, splPost } from '@/api/spl'
const props = defineProps({
modelValue: {
type: Boolean,
required: true
}, title: {
type: String,
default: '发起流程'
}, data: {
type: Object,
default: () => { }
}, userData: {
type: Object,
default: () => {
return {
ajmc: "",
flowType: ""
}
}
}, path: {
type: Object,
default: {}
}
})
const showDialog = ref(false)
const emit = defineEmits(['update:modelValue','getList'])
const titles = ref(props.title)
const lyquery = reactive({
rows: [],
total: 0,
promes: {
page: 1,
rows: 100,
modelName:props.userData.modelName
}
})
const radio = ref(3)
const qcckGetList = () => {
const prrmes = {
...lyquery.promes
}
splGet(prrmes, '/model/queryModel').then(res => {
lyquery.rows = lyquery.promes.page == 1 ? res.rows : lyquery.rows.concat(res.rows)
lyquery.total = res.total
})
}
watch(() => props.modelValue, (newVal) => {
if (newVal) {
qcckGetList()
}
})
const createProcess = ref({})
const radioData = ref('')
const changeRadio = (e) => {
radioData.value = e
const item = lyquery.rows.find(item => item.modelId == e)
if (item) {
createProcess.value = {
modelId: e,
processName: item.modelName ? item.modelName : '',
processType:1,
processData:
{
iframe: `${props.path.clueVerification}?id=${props.data.id}`,
hostPrefix: "sgxtPath",
rwbh: props.data.id,
flowType: 'SGSP',
sqrw: props.data,
}
}
}
}
const onComfirm = () => {
showDialog.value = true
}
const load = () => {
if (lyquery.total == lyquery.rows.length) {
return
} else {
lyquery.promes.page++
qcckGetList()
}
}
const close = () => {
radio.value=''
emit('update:modelValue', false)
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
::v-deep .el-dialog__body {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.dialog-container {
height: 500px;
}
::v-deep .el-radio__label {
color: #000;
}
</style>

View File

@ -0,0 +1,153 @@
<template>
<FormMessage v-model="listQuery" :formList="formData" labelWidth="100px" ref="elform" :rules="rules">
<template #zrSsbmdm>
<MOSTY.Department filterable v-model="listQuery.zrSsbmdm" width="100%" @getDepValue="getDepValue" clearable
placeholder="请选择所属部门" :multiple="true" />
</template>
<template #ry>
<el-input readonly v-model="listQuery.ry" @click="chooseUserVisible = true" placeholder="请选择民警"></el-input>
</template>
</FormMessage>
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds" :Single="false" />
</template>
<script setup>
import { reactive, ref, onMounted, watch } from "vue";
import { sendFqzl, ZdrfjSendFqzl ,qbcjSendFqzl} from '@/api/commit'
import { getItem } from '@/utils/storage'
import * as MOSTY from "@/components/MyComponents/index";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ElMessage } from "element-plus";
const props = defineProps({
itemData: {
type: Object,
default: () => { }
}, identification: {
type: String,
default: ""
}, tacitly: {
type: Object,
default: () => { }
}
})
const emit = defineEmits(['handleClose'])
// 表单数据
const listQuery = ref({}); //表单
// 选择人员
const ryStr = ref('')
const elform = ref()
const personnelEntity = ref()
const formData = ref([
{ label: "标题", prop: "title", type: "input", width: "40%" },
{ label: "接收单位", prop: "zrSsbmdm", type: "slot", width: "40%" },
{ label: "指令状态", prop: "status", type: "input", width: "40%" },
{ label: "人员选择", prop: "ry", type: "slot", width: "40%" },
{ label: "附件", prop: "attachmentPath", type: "upload" },
{ label: "指令内容", prop: "instructionContent", type: "textarea", width: "100%" },
])
const rules = reactive({
title: [{ required: true, message: "请输入指令标题", trigger: "blur" }],
zrSsbmdm: [{ required: true, message: "请选择接收单位", trigger: "blur" }],
instructionContent: [{ required: true, message: "请输入指令内容", trigger: "blur" }],
ry: [{ required: true, message: "请选择人员", trigger: "blur" }]
});
const deptId = getItem('deptId')
const getsendFqzl = () => {
elform.value.submit(async (val) => {
if (val) {
const data = { ...listQuery.value }
delete data.ry
const promes = {
instructionsEntity: {
unitCode: deptId[0].deptCode,
unitName: deptId[0].deptName,
...data,
receivingUnitCode: listQuery.value.zrSsbmdm.toString(),
receivingUnit: listQuery.value.receivingUnit.toString(),
attachmentPath: JSON.stringify(listQuery.value.attachmentPath)
}, id: props.itemData.id,
personnelEntity: personnelEntity.value
}
try {
let res
switch (props.identification) {
case 'yj':
res = await sendFqzl(promes)
break;
case 'zdrfj':
res = await ZdrfjSendFqzl(promes)
break;
case 'qbcj':
res = await qbcjSendFqzl(promes)
break;
}
const str = JSON.parse(res)
if (str.code == 200) {
ElMessage.success('发送成功')
listQuery.value = {}
listQuery.value.attachmentPath = ''
emit('handleClose')
} else {
ElMessage.error(str.msg)
}
} catch (error) {
console.log(error);
}
}
})
}
console.log(props.itemData);
watch(() => props.itemData, (val) => {
listQuery.value.title = val[props.tacitly['title']]
if (props.tacitly['instructionContent']) {
listQuery.value.instructionContent = val[props.tacitly['instructionContent']]
}
}, { deep: true, immediate: true })
const chooseUserVisible = ref(false)
const roleIds = ref([])
// 选取角色
const handleUserSelected = (val) => {
personnelEntity.value = val.map((item, index) => {
return {
name: item.userName,
idNumber: item.idEntityCard,
phoneNumber: item.mobile,
personTypeId: "",
personTypeName: "",
domicilePlace: "",
orderId: index + 1
}
})
// ryStr.value
listQuery.value.ry = personnelEntity.value.map(item => item.name)
}
// 选取部门
const getDepValue = (e) => {
listQuery.value.receivingUnit = e.map(item => item.orgName)
}
const close = () => {
listQuery.value = {}
listQuery.value.attachmentPath = ''
}
defineExpose({
getsendFqzl,
close
})
</script>
<style scoped lang="scss"></style>

View File

@ -52,6 +52,7 @@ import mitt from "mitt";
import { resetForm } from "@/utils/validate";
import { getDict, setCascader } from '@/utils/dict';
import axios from "axios";
import fzui from 'fzui-fengqun-vue'
//挂载全局方法
app.config.globalProperties.resetForm = resetForm;
@ -65,4 +66,12 @@ installElementPlus(app);
installIcons(app);
installFilter(app);
installDirective(app);
app.use(fzui, {
getOwnHostLabel: () => {
return '/fd_api';
},
translateHostLabel: () => {
return '/fd_api';
}
})
app.use(store).use(ELMessage).use(router).use(plugins).mount("#app");

View File

@ -16,6 +16,13 @@ import store from "@/store";
*/
export const privateRoutes = [
];
/**
* 公开路由表
*/
export const publicRoutes = [
{
path: "/systemConfig",
component: layout,
@ -124,13 +131,7 @@ export const privateRoutes = [
}
}
]
}
];
/**
* 公开路由表
*/
export const publicRoutes = [
},
{
path: "/login",
name: "login",
@ -146,6 +147,24 @@ export const publicRoutes = [
name: "KeyPopulations",
component: () => import("@/views/KeyPopulations/index") //系统登录
},
// 布控审核信息
{
path: "/deploymentApproval",
name: "deploymentApproval",
component: () => import("@/views/backOfficeSystem/ApprovalInformation/deploycontrol/deploymentApproval.vue"),
},
// 线索
{
path: "/clueVerification",
name: "clueVerification",
component: () => import("@/views/backOfficeSystem/ApprovalInformation/Clue/index.vue"),
},
// 重点人发掘
{
path: "/focusExploration",
name: "focusExploration",
component: () => import("@/views/backOfficeSystem/ApprovalInformation/FocusExploration/index.vue"),
},
{
path: "/editPassword", // 注意:带有路径“/”的记录中的组件“默认”是一个不返回 Promise 的函数
component: layout,
@ -365,7 +384,7 @@ export const publicRoutes = [
"@/views/backOfficeSystem/HumanIntelligence/TaskScheduling/index"
),
meta: {
title: "人力情报信息搜索任务调度",
title: "人力情报信息收集任务调度",
icon: "article"
}
},
@ -390,15 +409,15 @@ export const publicRoutes = [
icon: "article"
}
},
// {
// path: "/MakeAcomment",
// name: "MakeAcomment",
// component: () => import("@/views/backOfficeSystem/MakeAcomment/index"),
// meta: {
// title: "情报评一评",
// icon: "article"
// }
// }
{
path: "/MakeAcomment",
name: "MakeAcomment",
component: () => import("@/views/backOfficeSystem/MakeAcomment/index"),
meta: {
title: "情报评一评",
icon: "article"
}
}
]
},
{

View File

@ -2,7 +2,7 @@
import { publicRoutes, privateRoutes } from '@/router'
function filter(data, menus) {
var newData = data.filter(x => menus ?.includes(x.name))
var newData = data.filter(x => menus?.includes(x.name))
newData.forEach(x => x.children && (x.children = filter(x.children, menus)))
return newData
}
@ -47,7 +47,7 @@ export default {
* js 指定删除数组(树结构数据)
*/
//测试比对
routes = filter(privateRoutes, menus)
// routes = filter(privateRoutes, menus)
// 最后添加 不匹配路由进入 404
routes.push({
path: '/:catchAll(.*)',

View File

@ -37,7 +37,7 @@ export default {
isReady: 0,
userName: getItem("USERNAME") || "",
keepLiiveRoute: [], //需要缓存的路由
activeId:'',//警组点击的唯一标识
activeId: '',//警组点击的唯一标识
}),
mutations: {
setToken(state, token) {
@ -85,12 +85,14 @@ export default {
login(ctx, userInfo) {
const { userName, password, kaptcha } = userInfo;
return new Promise((resolve, reject) => {
login({userName, password: Base64.encode(password), kaptcha }).then((data) => {
login({ userName, password: Base64.encode(password), kaptcha }).then((data) => {
if (data.deptList.length === 1) {
this.commit("user/setToken", data.jwtToken);
this.commit("user/setDeptId", data.deptList);
this.commit("user/setUserName", data.userName);
setItem('isOatuh', 0)
setItem('fzUserId', data.fzUserId)
setItem("USERNAME", data.userName);
setItem("roleList", data.sysRole ? data.sysRole : []);
setItem("SFRH", data.sfrh);
@ -127,9 +129,11 @@ export default {
unifiedLogin({ token, systemId, }).then((data) => {
if (data.deptList.length === 1) {
this.commit("user/setToken", data.jwtToken);
this.commit("user/setDeptId", data.deptList);
this.commit("user/setUserName", data.userName);
setItem("USERNAME", data.userName);
setItem('fzUserId', data.fzUserId)
setItem("SFRH", data.sfrh);
setItem("USERID", data.userId);
setItem("PermissionsInfo", data.permissionsInfo);

View File

@ -41,11 +41,13 @@ service.interceptors.response.use(
// 请求成功的处理
(response) => {
const { success, code, msg, message, data } = response.data;
// 需要判断当前请求是否成功
if (success && code === 10000) {
return data; // 成功后返回解析后的数据
return data ? data : response.data; // 成功后返回解析后的数据
} else if (code === 200 || code == "00000" || code == "10000" || msg == 'success') {
return data; // 成功后返回解析后的数据
return data ? data : response.data; // // 成功后返回解析后的数据
} else if (code === 401) {
store.dispatch('user/logout');
ElMessage.error(message); // 提示错误信息

View File

@ -2,14 +2,14 @@
import ImageCompressor from "image-compressor.js";
// 随机颜色 - 把16进制的颜色换成rgba格式
export function choseRbgb(color,opcity) {
if(color){
return 'rgba('+ parseInt('0x'+color.slice(1,3)) + ','+ parseInt('0x'+color.slice(3,5))+','+parseInt('0x'+color.slice(5,7)) + ','+opcity+')'
}else{
let r = Math.floor(Math.random()*256)
let g = Math.floor(Math.random()*256)
let b = Math.floor(Math.random()*256)
let a = opcity ? opcity :1
export function choseRbgb(color, opcity) {
if (color) {
return 'rgba(' + parseInt('0x' + color.slice(1, 3)) + ',' + parseInt('0x' + color.slice(3, 5)) + ',' + parseInt('0x' + color.slice(5, 7)) + ',' + opcity + ')'
} else {
let r = Math.floor(Math.random() * 256)
let g = Math.floor(Math.random() * 256)
let b = Math.floor(Math.random() * 256)
let a = opcity ? opcity : 1
return `rgba(${r},${g},${b},${a})`
}
}
@ -318,3 +318,8 @@ function _setTime(date) {
}
//拼接地址
export function setAddress(val) {
const url = '/mosty-api/mosty-base/minio/image/download/'
return url + val
}

View File

@ -5,8 +5,7 @@
<span style="color:#00B7FF;" class="f12 pointer">查看更多 </span>
</div>
<div class="asideCnt">
<MyTable @changePage="changePage" customClass="zdy_peo_table" :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" >
</MyTable>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"/>
</div>
</div>
</template>
@ -18,14 +17,7 @@ const pageData = reactive({
tableData: [
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
{ mc: "聚集事件", rs: "30", sj: "2024-10-10" },
],
keyCount: 0,

View File

@ -0,0 +1,228 @@
<template>
<div class="" style="overflow: auto;height: 100%;">
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
基础信息
</h3>
</template>
<div class="flex flex-warp just-between">
<div class="flex flex-1" v-for="(item, index) in basicInformation" :key="index">
<div class="lable">{{ item.label }}</div>
<div v-if="item.showSolt">
<DictTag :tag="false" :value="listQuery[item.key]" color="#000" :options="item.options" />
</div>
<div v-else>
{{ listQuery[item.key] }}
</div>
</div>
</div>
</el-card>
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
相关人员
</h3>
</template>
<ObjectInformation :item='listQuery' :dict="{ D_BZ_XB }" />
</el-card>
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
附件
</h3>
</template>
<div class="grid-container">
<div class="grid-item flex just-between" style="" v-for="(item, index) in srcList" :key="index">
<div class="names">{{ item.name }}</div>
<div class="icon"><a :href="setAddress(item.id)" download><el-icon><Download /></el-icon></a></div>
</div>
</div>
</el-card>
</div>
</template>
<script setup>
import ObjectInformation from './objectInformation.vue'
import { qcckGet } from '@/api/qcckApi'
import { onMounted, getCurrentInstance, ref, reactive } from 'vue'
import { useRoute } from 'vue-router'
import { setAddress } from '@/utils/tools'
const { proxy } = getCurrentInstance();
const { D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } =
proxy.$dict("D_BZ_SF", "D_BZ_XB", "D_GS_XS_LY", "D_BZ_SSZT", "D_GS_XS_LX", "D_GS_XS_QTLX"); //获取字典数据
// 基础信息
const basicInformation = ref(
[
{
label: '线索名称',
key: 'xsMc',
},
{
label: '线索类型',
key: 'xlLx',
showSolt: true,
options: D_GS_XS_LX
},
{
label: '情报来源',
key: 'qbLy',
showSolt: true,
options: D_GS_XS_LY
},
{
label: '指向开始时间',
key: 'zxkssj'
},
{
label: '指向结束时间',
key: 'zxjssj',
},
{
label: '指向地点',
key: 'zxdz',
},
{
label: '所属专题',
key: 'sszt',
showSolt: true,
options: D_BZ_SSZT
}, {
label: '线索内容',
key: 'xsNr',
},
]
)
//根据id获取数据query的id获取数据
const listQuery = ref({})
// 图片信息
const srcList = ref({})
const getDataById = (id) => {
const params = { id }
qcckGet(params, '/mosty-gsxt/qbcj/selectByid').then(res => {
listQuery.value = res
srcList.value = res.ossList
// onSubmit(res.ossList)
})
}
const route = useRoute()
onMounted(() => {
const id = route.query.id
getDataById(id)
})
// const onSubmit = async (val) => {
// const data = []
// for (let i = 0; i < val.length; i++) {
// const res = await qcckGet({}, `/mosty-base/minio/file/download/${val[i].id}`)
// data.push(res)
// }
// srcList.value = data.reduce((acc, file) => {
// const { suffix, url } = file;
// const name= suffix.startsWith('.') ? suffix.substring(1) : suffix;
// // 如果该后缀的分组不存在,则初始化
// if (!acc[name]) {
// acc[name] = [];
// }
// // 将当前文件的 url 推入对应分组的数组
// acc[name].push(url);
// return acc;
// }, []);
// console.log(srcList.value);
// }
</script>
<style lang="scss" scoped>
.card-header {
font-size: 18px;
color: #303133;
font-weight: 600;
margin: 0;
}
::v-deep .el-card {
border: none !important;
}
.flex-1 {
width: 48%;
font-family: verdana;
font-size: 14px;
margin-bottom: 20px;
.lable {
font-size: 14px;
width: 13%;
font-weight: 700;
}
}
.el-image {
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
border: 1px solid silver;
border-radius: 5px;
}
.grid-container {
display: grid;
grid-template-columns: repeat(6, 1fr);
/* 5等分列 */
gap: 0px;
width: 100%;
box-sizing: border-box;
}
.grid-item {
width: 290px;
display: flex;
align-items: center;
justify-content: center;
padding: 5px 10px;
height: 50px;
border-radius: 5px;
background-color: aliceblue;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
justify-content: space-between;
align-items: center;
img {
width: 100%;
}
}
.names{
width: 80%;
white-space: nowrap; /* 禁止换行 */
overflow: hidden; /* 隐藏溢出内容 */
text-overflow: ellipsis; /* 显示省略号 */
}
.icon{
text-align: right;
font-size: 16px;
cursor: pointer;
}
</style>

View File

@ -0,0 +1,59 @@
<template>
<MyTable :tableData="tableDate.tableData" :tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight" :key="tableDate.keyCount" :tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth">
<template #xb="{ row }">
<DictTag :tag="false" :value="row.xb" :options="dict.D_BZ_XB" />
</template>
<template #bqList="{ row }">
<span v-if="row.bqList">
<span v-for="(it, idx) in row.bqList" :key="idx"> {{ it.bqMc }}</span>
</span>
</template>
</MyTable>
</template>
<script setup>
import { ref,reactive, watch } from 'vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
const props = defineProps({
item: {
type: Object,
default:()=>{}
}, dict: {
type: Object,
default:()=>{}
}
});
let tableDate = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls:false,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: [
{ label: "姓名", prop: "xm" },
{ label: "性别", prop: "xb",showSolt:true },
{ label: "身份证号", prop: "sfzh" },
{ label: "户籍地", prop: "hjdz" },
{ label: "户籍地派出所", prop: "hjdpcs" },
{ label: "标签", prop: "bqList",showSolt:true }
]
});
watch(() => props.item, (val) => {
tableDate.tableData=val.ryList
},{deep:true})
</script>
<style lang="css" scoped>
</style>

View File

@ -0,0 +1,203 @@
<template>
<div class="" style="overflow: auto;height: 100%;">
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
基础信息
</h3>
</template>
<div class="flex flex-warp just-between">
<div class="flex flex-1" v-for="(item, index) in basicInformation" :key="index">
<div class="lable">{{ item.label }}</div>
<div v-if="item.showSolt">
<DictTag :tag="false" :value="listQuery[item.key]" color="#000" :options="item.options" />
</div>
<div v-else>
{{ listQuery[item.key] }}
</div>
</div>
</div>
</el-card>
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
附件
</h3>
</template>
<div class="grid-container">
<div class="grid-item" :key="index">
<el-image :src="setAddress( listQuery.ryFjZp)" :zoom-rate="1.2" :max-scale="7" :min-scale="0.2"
:preview-src-list="[listQuery.ryFjZp]" show-progress :initial-index="4" fit="cover">
<template #error>
<div class="image-slot">
<el-icon><icon-picture /></el-icon>
</div>
</template>
</el-image>
</div>
</div>
</el-card>
</div>
</template>
<script setup>
import { Picture as IconPicture } from '@element-plus/icons-vue'
// import ObjectInformation from './objectInformation.vue'
import { qcckGet } from '@/api/qcckApi'
import { onMounted, getCurrentInstance, ref, reactive } from 'vue'
import { useRoute } from 'vue-router'
import { setAddress } from '@/utils/tools'
const { proxy } = getCurrentInstance();
const { D_GS_RQFJ_FXDJ, D_GS_RQFJ_FXLB } =
proxy.$dict(
"D_BZ_RCSHZT",
"D_GS_RQFJ_LX",
"D_GS_RQFJ_FXDJ",
"D_BZ_SF",
"D_GS_RQFJ_FXLB"
);
// 基础信息
const basicInformation = ref(
[
{
label: '姓名',
key: 'ryXm',
},
{
label: '电话',
key: 'rySjhm'
},
{
label: '身份证号',
key: 'rySfzh'
},
{
label: '户籍地址',
key: 'ryHjdz',
},
{
label: '护照号码',
key: 'ryHzhm',
},
{
label: '现住地址',
key: 'ryXzdz',
},
{
label: '管辖单位',
key: 'gxDwMc',
}, {
label: '责任部门',
key: 'ssbm',
},
{
label: '标签',
key: 'bqList',
},
{
label: '风险积分',
key: 'fxjf',
}, {
label: '风险等级',
key: 'fxDj',
showSolt: true,
options: D_GS_RQFJ_FXDJ
}, {
label: '风险类别',
key: 'fxLb',
showSolt: true,
options: D_GS_RQFJ_FXLB
}
]
)
//根据id获取数据query的id获取数据
const listQuery = ref({})
// 图片信息
const srcList = ref([])
const getDataById = (id) => {
qcckGet({}, '/mosty-gsxt/tbGsxtRqfjRy/' + id).then(res => {
listQuery.value = res
})
}
const route = useRoute()
onMounted(() => {
const id = route.query.id
getDataById(id)
})
</script>
<style lang="scss" scoped>
.card-header {
font-size: 18px;
color: #303133;
font-weight: 600;
margin: 0;
}
::v-deep .el-card {
border: none !important;
}
.flex-1 {
width: 48%;
font-family: verdana;
font-size: 14px;
margin-bottom: 20px;
.lable {
font-size: 14px;
width: 13%;
font-weight: 700;
}
}
.el-image {
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
border: 1px solid silver;
border-radius: 5px;
}
.grid-container {
display: grid;
grid-template-columns: repeat(6, 1fr);
/* 5等分列 */
gap: 0px;
width: 100%;
box-sizing: border-box;
}
.grid-item {
width: 290px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
}
}
</style>

View File

@ -0,0 +1,184 @@
<template>
<div class="" style="overflow: auto;height: 100%;">
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
基础信息
</h3>
</template>
<div class="flex flex-warp just-between">
<div class="flex flex-1" v-for="(item,index) in basicInformation" :key="index">
<div class="lable">{{item.label}}</div>
<div v-if="item.showSolt">
<DictTag :tag="false" :value="listQuery[item.key]" color="#000"
:options="item.options"/>
</div>
<div v-else>
{{ listQuery[item.key] }}
</div>
</div>
</div>
</el-card>
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
布控信息
</h3>
</template>
<ObjectInformation :item='listQuery' :dict="{D_BZ_XB}"/>
</el-card>
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
布控附件
</h3>
</template>
<div class="grid-container">
<div v-for="(item,index) in listQuery.ossList" class="grid-item" :key="index">
<el-image :src="setAddress(item.id)" :zoom-rate="1.2" :max-scale="7" :min-scale="0.2" :preview-src-list="srcList"
show-progress :initial-index="4" fit="cover">
<template #error>
<div class="image-slot">
<el-icon><icon-picture /></el-icon>
</div>
</template>
</el-image>
</div>
</div>
</el-card>
</div>
</template>
<script setup>
import { Picture as IconPicture } from '@element-plus/icons-vue'
import ObjectInformation from './objectInformation.vue'
import {qcckGet} from '@/api/qcckApi'
import { onMounted ,getCurrentInstance,ref, reactive} from 'vue'
import { useRoute } from 'vue-router'
import {setAddress} from '@/utils/tools'
const { proxy } = getCurrentInstance();
const { D_GS_BK_DJ, D_GS_BK_DX,D_GS_BK_CZYQ,D_BZ_XB } = proxy.$dict("D_GS_BK_BKYS","D_BZ_XB","D_GS_BK_SJLX","D_GS_BK_DJ","D_GS_BK_DX","D_GS_BK_ZT","D_GS_BK_CZYQ","D_GS_BK_CZJSDWLX","D_GS_BK_TJFS"); //获取字典数据
// 基础信息
const basicInformation = ref(
[
{
label: '布控对象',
key: 'bkDx',
showSolt: true,
options:D_GS_BK_DX
},
{
label: '布控开始时间',
key:'bkSjKs'
},
{
label: '布控结束时间',
key:'bkSjJs'
},
{
label: '处置要求',
key: 'czYq',
showSolt: true,
options:D_GS_BK_CZYQ
},
{
label: '布控等级',
key: 'bkDj',
showSolt: true,
options:D_GS_BK_DJ
},
{
label: '布控事由',
key:'bkSy'
}
]
)
//根据id获取数据query的id获取数据
const listQuery = ref({})
// 图片信息
const srcList = ref([])
const getDataById = (id) => {
qcckGet({}, '/mosty-gsxt/tbGsxtBk/selectVoById/' + id).then(res => {
listQuery.value=res
srcList.value=res.ossList.map(v=>setAddress(v.id))
})
}
const route=useRoute()
onMounted(() => {
const id = route.query.id
getDataById(id)
})
</script>
<style lang="scss" scoped>
.card-header {
font-size: 18px;
color: #303133;
font-weight: 600;
margin: 0;
}
::v-deep .el-card {
border: none !important;
}
.flex-1 {
width: 48%;
font-family: verdana;
font-size: 14px;
margin-bottom: 20px;
.lable {
font-size: 14px;
width: 13%;
font-weight: 700;
}
}
.el-image {
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
border: 1px solid silver ;
border-radius: 5px;
}
.grid-container {
display: grid;
grid-template-columns: repeat(6, 1fr);
/* 5等分列 */
gap: 0px;
width: 100%;
box-sizing: border-box;
}
.grid-item {
width: 290px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
}
}
</style>

View File

@ -0,0 +1,56 @@
<template>
<MyTable :tableData="tableDate.tableData" :tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight" :key="tableDate.keyCount" :tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth">
<template #fjZp="{ row }">
<el-image :src="row.fjZp"></el-image>
</template>
<template #ryXb="{ row }">
<DictTag :tag="false" :value="row.ryXb" :options="dict.D_BZ_XB" />
</template>
<template #bqList="{ row }">
<span v-if="row.bqList">
<span v-for="(it, idx) in row.bqList" :key="idx"> {{ it.bqMc }}</span>
</span>
</template>
</MyTable>
</template>
<script setup>
import { ref,reactive, watch } from 'vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import { tableColumnList } from '../tableRow.js'
const props = defineProps({
item: {
type: Object,
default:()=>{}
}, dict: {
type: Object,
default:()=>{}
}
});
let tableDate = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false,
haveControls:false,
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 200, //操作栏宽度
tableColumn: []
});
watch(() => props.item, (val) => {
tableDate.tableColumn = tableColumnList[val.bkDx]
tableDate.tableData=val.bkdxList
},{deep:true})
</script>
<style lang="css" scoped>
</style>

View File

@ -0,0 +1,86 @@
let zdList = {}
export const Zd = (val) => {
console.log(val);
zdList = val
}
export const tableColumnList = {
'01': [
{ label: "照片", prop: "fjZp", showSolt: true },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "身份证号", prop: "rySfzh" },
{ label: "户籍地", prop: "ryHjd" },
{ label: "现居住地址", prop: "ryXjd" },
{ label: "虚拟身份", prop: "qtXnsf" },
{ label: "车牌号", prop: "clCph" },
{ label: "车辆识别代码", prop: "clCjh" },
{ label: "特征描述", prop: "qtTzms" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
], '02': [
{ label: "照片", prop: "fjZp", showSolt: true },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "身份证号", prop: "rySfzh" },
{ label: "户籍地", prop: "ryHjd" },
{ label: "现居住地址", prop: "ryXjd" },
{ label: "虚拟身份", prop: "qtXnsf" },
{ label: "车牌号", prop: "clCph" },
{ label: "车辆识别代码", prop: "clCjh" },
{ label: "特征描述", prop: "qtTzms" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
], '03': [
{ label: "车牌号", prop: "clCph" },
{ label: "车辆颜色", prop: "clYs" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "预警标签", prop: "yjbq", showSolt: true, options: zdList.BD_BK_CLYJBQ },
],
'04': [
{ label: "身份证号", prop: "rySfzh" },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
'05': [
{ label: "车辆识别代码", prop: "clCjh" },
{ label: "车牌号", prop: "clCph" },
{ label: "车主姓名", prop: "ryXm" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
'06': [
{ label: "Mac地址", prop: "mac" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
'07': [
{ label: "IMEI", prop: "imei" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
'08': [
{ label: "IMSI", prop: "imsi" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
'09': [
{ label: "电话", prop: "rySjhm", type: "input" },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
], '10': [
{ label: "照片", prop: "fjZp", showSolt: true },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "身份证号", prop: "rySfzh" },
{ label: "预警等级", prop: "yjdj", showSolt: true, options: zdList.D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
}

View File

@ -9,40 +9,12 @@
</div>
<div class="form_cnt">
<FormMessage :disabled="disabled" v-model="listQuery" :formList="formData" labelWidth="100px" ref="elform"
:rules="rules"></FormMessage>
<!-- 选择审核人 -->
<!-- <div class="ww100 mt20 ml50 mr50">
<el-steps direction="vertical" :active="listQuery.wccz" space="500" finish-status="success">
<el-step title="发起申请">
<template #description>
<div class="flex align-center ww100 mt10 mb20">
<el-input v-model="listQuery.sqrXm" readonly class="ww20"></el-input>
<el-input v-model="listQuery.sqrSsbmmc" readonly class="ww20 ml10 mr10"></el-input>
<span class="f12" style="color: #333333">
备注发起人和部门根据登陆人自动填写</span>
</div>
</template>
</el-step>
<el-step title="审核确认">
<template #description>
<div class="flex align-center ww100 mt10 mb20 depBox">
<span class="mr4">审核部门 : </span>
<MOSTY.Department :isAll="true" @getDepValue="getShdep" v-model="listQuery.shSsbmdm" clearable :placeholder="listQuery.shSsbmmc ? listQuery.shSsbmmc : ''" />
</div>
</template>
</el-step>
<el-step title="审批确认">
<template #description>
<div class="flex align-center ww100 mt10 mb20 depBox">
<span lass="mr4">审批部门 : </span>
<MOSTY.Department :isAll="true" @getDepValue="getSPdep" v-model="listQuery.spSsbmdm" clearable :placeholder="listQuery.spSsbmmc ? listQuery.spSsbmmc : ''" />
</div>
</template>
</el-step>
</el-steps>
</div> -->
:rules="rules">
</FormMessage>
</div>
</div>
<ChooseMarks v-model="chooseMarksVisible" @choosed="choosed" :roleIds="roleIds" />
</template>
<script setup>
@ -50,6 +22,7 @@ import * as rule from "@/utils/rules.js";
import * as MOSTY from "@/components/MyComponents/index";
import { getItem } from "@/utils/storage";
import MyTable from "@/components/aboutTable/MyTable.vue";
import ChooseMarks from "@/components/ChooseList/ChooseMarks/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import {
@ -87,17 +60,15 @@ watch(() => props.dic,(val) => {
formData.value = [
{ label: "车牌号", prop: "hphm", type: "input" },
{ label: "车架号", prop: "clCjh", type: "input" },
{
label: "车辆颜色",
prop: "clYs",
type: "input",
},
{ label: "车辆颜色", prop: "clYs",type: "input", },
{ label: "车辆所有人", prop: "clSyr", type: "input" },
{ label: "人员身份证", prop: "clSyrsfzh", type: "input" },
{ label: "责任单位", prop: "zrSsbmdm",depMc:'zrSsbmmc', type: "department" },
{ label: "管辖单位", prop: "gxSsbmdm",depMc:'gxSsbmmc', type: "department" },
{ label: "管控民警姓名", prop: "gkMjXm", type: "input" },
{ label: "管控民警警号", prop: "gkMjJh", type: "input" },
{ label: "预警等级", prop: "yjdj", type: "select",options:props.dic.D_GS_ZDR_YJDJ },
{ label: "预警标签", prop: "yjbq", type: "select",options:props.dic.BD_BK_CLYJBQ },
{ label: "管控原因", prop: "clLkyy", type: "textarea", width: "100%" },
{ label: "车辆照片", prop: "fjdz", type: "upload", width: "100%" },
];
@ -216,4 +187,11 @@ defineExpose({ init });
border-color: transparent !important;
}
}
.marks{
width: 100%;
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
}
</style>

View File

@ -103,7 +103,7 @@
></Pages>
</div>
<!-- 详情 -->
<AddForm ref="addFormDiloag" @updateDate="getList" :dic="{D_GS_ZDR_RYJB,D_BZ_XB,D_BZ_MZ,D_BZ_XZQHDM,D_GS_ZDR_BK_ZT,D_GS_ZDR_CZZT,D_GS_BQ_ZL,D_GS_BQ_LB,D_GS_BQ_LX,D_GS_ZDR_YJDJ,D_GS_BK_SSJZ}"/>
<AddForm ref="addFormDiloag" @updateDate="getList" :dic="{BD_BK_CLYJBQ,D_GS_ZDR_RYJB,D_BZ_XB,D_BZ_MZ,D_BZ_XZQHDM,D_GS_ZDR_BK_ZT,D_GS_ZDR_CZZT,D_GS_BQ_ZL,D_GS_BQ_LB,D_GS_BQ_LX,D_GS_ZDR_YJDJ,D_GS_BK_SSJZ}"/>
<!-- 选择用户 -->
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds"/>
<!-- 转线索 -->
@ -123,7 +123,7 @@ import AddForm from "./components/addForm.vue";
import { qcckGet, qcckPost,qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_ZDQT_ZT,D_GS_ZDR_RYJB, D_BZ_XB, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDQT_ZT","D_GS_ZDR_RYJB","D_BZ_XB","D_BZ_MZ","D_BZ_XZQHDM","D_GS_ZDR_BK_ZT","D_GS_ZDR_CZZT","D_GS_BQ_ZL","D_GS_BQ_LB","D_GS_BQ_LX","D_GS_ZDR_YJDJ","D_GS_BK_SSJZ","D_GS_BK_SQLX","D_BZ_SF","D_GS_XS_LY","D_BZ_SSZT","D_GS_XS_LX","D_GS_XS_QTLX");
const { D_GS_ZDQT_ZT,D_GS_ZDR_RYJB, D_BZ_XB,BD_BK_CLYJBQ, D_BZ_MZ, D_BZ_XZQHDM, D_GS_ZDR_BK_ZT, D_GS_ZDR_CZZT, D_GS_BQ_ZL, D_GS_BQ_LB, D_GS_BQ_LX, D_GS_ZDR_YJDJ, D_GS_BK_SSJZ, D_GS_BK_SQLX, D_BZ_SF, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX } = proxy.$dict("D_GS_ZDQT_ZT","D_GS_ZDR_RYJB","D_BZ_XB","D_BZ_MZ","D_BZ_XZQHDM","D_GS_ZDR_BK_ZT","D_GS_ZDR_CZZT","D_GS_BQ_ZL","D_GS_BQ_LB","D_GS_BQ_LX","D_GS_BK_SSJZ","D_GS_BK_SQLX","D_BZ_SF","D_GS_XS_LY","D_BZ_SSZT","D_GS_XS_LX","D_GS_XS_QTLX","BD_BK_CLYJBQ","D_GS_ZDR_YJDJ");
const obj = ref({});
const showzxs = ref(false);
const zxsDilof = ref();

View File

@ -0,0 +1,269 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">重点人员深度发掘详情</span>
<div>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="flex just-between">
<div :class="listQuery.gzlid ? 'ww79' : 'ww100'">
<div class="" style="overflow: auto;height: 100%;color: #000;">
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
基础信息
</h3>
</template>
<div class="flex flex-warp just-between">
<div class="flex flex-1" v-for="(item, index) in basicInformation" :key="index">
<div class="lable">{{ item.label }}</div>
<div v-if="item.showSolt">
<DictTag :tag="false" :value="listQuery[item.key]" color="#000" :options="item.options" />
</div>
<div v-else>
{{ listQuery[item.key] }}
</div>
</div>
</div>
</el-card>
<el-card shadow="never" style="border: none;">
<template #header>
<h3 class="card-header">
附件
</h3>
</template>
<div class="grid-container">
<div class="grid-item" :key="index">
<el-image :src="setAddress(listQuery.ryFjZp)" :zoom-rate="1.2" :max-scale="7" :min-scale="0.2"
:preview-src-list="[listQuery.ryFjZp]" show-progress :initial-index="4" fit="cover">
<template #error>
<div class="image-slot">
<el-icon><icon-picture /></el-icon>
</div>
</template>
</el-image>
</div>
</div>
</el-card>
</div>
</div>
<div class="ww20" v-if="listQuery.gzlid">
<ApprovalEcho ref="approvalEcho" />
</div>
</div>
</div>
</template>
<script setup>
import { qcckGet } from '@/api/qcckApi'
import { ref, defineExpose, watch,getCurrentInstance } from "vue";
import ApprovalEcho from "@/components/flowPath/ApprovalEcho.vue";
import { Picture as IconPicture } from '@element-plus/icons-vue'
import { setAddress } from '@/utils/tools'
const { proxy } = getCurrentInstance();
const { D_GS_RQFJ_FXDJ, D_GS_RQFJ_FXLB } =
proxy.$dict(
"D_BZ_RCSHZT",
"D_GS_RQFJ_LX",
"D_GS_RQFJ_FXDJ",
"D_BZ_SF",
"D_GS_RQFJ_FXLB"
);
const dialogForm = ref(false); //弹窗
const approvalEcho=ref()
const listQuery = ref({})
// 基础信息
const basicInformation = ref(
[
{
label: '姓名',
key: 'ryXm',
},
{
label: '电话',
key: 'rySjhm'
},
{
label: '身份证号',
key: 'rySfzh'
},
{
label: '户籍地址',
key: 'ryHjdz',
},
{
label: '护照号码',
key: 'ryHzhm',
},
{
label: '现住地址',
key: 'ryXzdz',
},
{
label: '管辖单位',
key: 'gxDwMc',
}, {
label: '责任部门',
key: 'ssbm',
},
{
label: '标签',
key: 'bqList',
},
{
label: '风险积分',
key: 'fxjf',
}, {
label: '风险等级',
key: 'fxDj',
showSolt: true,
options: D_GS_RQFJ_FXDJ
}, {
label: '风险类别',
key: 'fxLb',
showSolt: true,
options: D_GS_RQFJ_FXLB
}
]
)
// 初始化数据
const init = (row) => {
dialogForm.value = true
qcckGet({}, '/mosty-gsxt/tbGsxtRqfjRy/' + row.id).then(res => {
listQuery.value = res
})
};
watch(() => approvalEcho.value, (val) => {
if (val) {
approvalEcho.value.getWorkflow(listQuery.value.gzlid)
}
}, { deep: true })
// 关闭
const close = () => {
dialogForm.value = false;
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.dialog {
::v-deep .el-form-item--default {
margin: 0 1% 0 0 !important;
padding-bottom: 0 !important;
}
}
::v-deep .el-card {
background-color: #fff;
color: #000;
}
.nodeBox {
width: 80%;
text-align: center;
line-height: 30px;
border-radius: 10px;
overflow: hidden;
background-color: aliceblue;
.nodeorgNameTg {
background-color: #1abe20;
}
.nameTag {
line-height: 30px;
padding: 0 10px;
}
.nodeorgNameDd {
background-color: #18a2dd;
}
.fontColor {
color: #1abe20;
}
.fontColorDd {
color: #18a2dd;
}
}
.card-header {
font-size: 18px;
color: #303133;
font-weight: 600;
margin: 0;
}
::v-deep .el-card {
border: none !important;
}
.flex-1 {
width: 48%;
font-family: verdana;
font-size: 14px;
margin-bottom: 20px;
.lable {
font-size: 14px;
width: 13%;
font-weight: 700;
}
}
.el-image {
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
}
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
border: 1px solid silver;
border-radius: 5px;
}
.grid-container {
display: grid;
grid-template-columns: repeat(6, 1fr);
/* 5等分列 */
gap: 0px;
width: 100%;
box-sizing: border-box;
}
.grid-item {
width: 290px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
}
}
</style>

View File

@ -35,7 +35,10 @@
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="primary" v-if="roleList.includes('BK_SH_RY')" size="small" @click="handleDetail(row,'审核')">审核</el-link>
<el-link type="primary" size="small" @click="showDetail(row)">指令下发</el-link>
<el-link type="primary" v-if="roleList.includes('BK_SH_RY')" size="small" @click="createProcess(row)">审核</el-link>
<el-link type="primary" size="small" @click="opeshow(row)">详情</el-link>
<!-- <el-link type="primary" v-if="roleList.includes('BK_SH_RY')" size="small" @click="handleDetail(row,'审核')">审核</el-link> -->
</template>
</MyTable>
<Pages
@ -49,7 +52,14 @@
></Pages>
</div>
<Model v-model="isShow" :data="chooeRow" @change="getList" :dic="{D_BZ_RCSHZT}"></Model>
<Details ref="details"/>
</div>
<SubmissionProcess v-model="showSp" :data="rowData"
:userData="{ ajmc: '重点人员深度发掘审批', flowType: 'ZDRYSDFJDP',modelName:'重点人' }"
:path="fixedValue" @getList="getList" />
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='close'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="zdrfj" :tacitly="tacitly"/>
</Information>
</template>
<script setup>
@ -61,7 +71,10 @@ import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import Details from './details.vue'
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
const { proxy } = getCurrentInstance();
const { D_BZ_RCSHZT, D_GS_RQFJ_LX, D_GS_RQFJ_FXDJ, D_BZ_SF, D_GS_RQFJ_FXLB } =
proxy.$dict(
@ -115,9 +128,9 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 120,
controlsWidth: 240,
tableColumn: [
{ label: "姓名", prop: "ryXm",showOverflowTooltip:true ,showSolt: true},
{ label: "个人信息", prop: "ryXm",showOverflowTooltip:true ,showSolt: true},
{ label: "户籍地址", prop: "ryHjdz" ,showOverflowTooltip:true},
{ label: "护照号码", prop: "ryHzhm" ,showOverflowTooltip:true},
{ label: "现住地址", prop: "ryXzdz" ,showOverflowTooltip:true},
@ -184,6 +197,45 @@ const tabHeightFn = () => {
tabHeightFn();
};
};
// 审批流
// 固定值
const fixedValue = {
clueVerification:'focusExploration',
byMeansOf: 'tbGsxtRqfjRy/callback',
nobyMeansOf: 'tbGsxtRqfjRy/callback',
recycle:'tbGsxtRqfjRy/callback',
}
const showSp = ref(false);
const rowData = ref()
const createProcess = (row) => {
showSp.value = true;
rowData.value = row
}
const details=ref()
const opeshow = (row) => {
details.value.init(row)
}
//下发指令
const showDialog = ref(false)
const itemData = ref()
const semdFqzlRef=ref()
const handleClose = () => {
showDialog.value = false;
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value=item
}
const submit=()=>{
semdFqzlRef.value.getsendFqzl()
}
const close = () => {
semdFqzlRef.value.close()
}
const tacitly = {
title:'ryXm'
}
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,191 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">人力情报信息采集流转详情</span>
<div>
<el-button @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage disabled v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<template #gapdive>
<div style="width: 100%;height: 10px;" class="mb20">
<el-divider content-position="left">基础信息</el-divider>
</div>
</template>
<template #gapline>
<div style="width: 100%;height: 10px;" class="mb20">
<el-divider content-position="left">情报内容</el-divider>
</div>
</template>
<template #scfj>
<div style="width: 100%;padding-left: 50px;">
<div>上传附件:<span class="f12">可附电子表格Word文档图像音视频文件</span> </div>
<div><MOSTY.Upload :showBtn="true" :isAll="true" :isImg="true" disabled :limit="10" v-model="fjdz" /> </div>
</div>
</template>
</FormMessage>
<el-divider content-position="left"><span class="mr20">相关人员</span> </el-divider>
<MyTable
:tableData="pageForm.tableData"
:tableColumn="pageForm.tableColumn"
:tableHeight="pageForm.tableHeight"
:key="pageForm.keyCount"
:tableConfiger="pageForm.tableConfiger"
:controlsWidth="pageForm.controlsWidth"
>
<template #xb="{row}">
<DictTag :value="row.xb" :tag="false" :options="props.dic.D_BZ_XB" />
</template>
<template #bqList="{row}">
<div v-if="row.bqList">
<el-tag type="success" v-for="(it,idx) in row.bqList" :key="idx">{{ it.bqMc }}</el-tag >
</div>
</template>
<!-- 操作 -->
<template #controls="{ row,index }">
<el-link size="small" type="success" @click="addEdit('detail', row,index)">详情</el-link>
</template>
</MyTable>
</div>
<!-- 人员 -->
<AddPeo ref="showAdd" v-if="showPerson" v-model="showPerson" :dic="props.dic" ></AddPeo>
</div>
</template>
<script setup>
import * as MOSTY from "@/components/MyComponents/index";
import AddPeo from '@/components/addPerson/index.vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick } from "vue";
const emit = defineEmits(["change"]);
const props = defineProps({
dic: Object
});
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
xsMc: [{ required: true, message: "请输入情报名称", trigger: "blur" }],
xlLx: [{ required: true, message: "请选择情报类型", trigger: "change" }],
qbLy: [{ required: true, message: "请选择情报来源", trigger: "change" }],
});
const formData = ref([
{ prop: "gapdive", type: "slot",width:'100%' },
{ label: "情报名称", prop: "xsMc", type: "input" },
{ label: "情报类型", prop: "xlLx", type: "select", options:props.dic.D_GS_XS_LX },
{ label: "情报来源", prop: "qbLy", type: "select", options:props.dic.D_GS_XS_LY},
{ label: "情报上报时间", prop: "zxkssj", type: "datetime"},
// { label: "指向结束时间", prop: "zxjssj", type: "datetime"},
{ label: "指向地点", prop: "zxdz", type: "input"},
{ label: "所属专题", prop: "sszt", type: "select",options:props.dic.D_BZ_SSZT},
{ prop: "gapline", type: "slot",width:'100%' },
{ prop: "scfj", type: "slot",width:'100%'},
{ label: "情报内容", prop: "xsNr", type: "textarea",width:'100%'},
{ label: "群体类型", prop: "qtlx", type: "select",options:props.dic.D_GS_XS_QTLX },
{ label: "群体名称", prop: "qtmc", type: "input"},
{ label: "涉及人数", prop: "sjrs", type: "inputNumber"},
{ label: "情报报送单位", prop: "ssbmdm", type: "department"},
]);
const fjdz = ref()
const listQuery = ref({}); //表单
const loading = ref(false);
const elform = ref();
const pageForm = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false
},
controlsWidth: 220,
tableColumn: [
{ label: "姓名", prop: "xm" },
{ label: "性别", prop: "xb",showSolt:true },
{ label: "身份证号", prop: "sfzh" },
{ label: "户籍地", prop: "hjdz" },
{ label: "户籍地派出所", prop: "hjdpcs" },
{ label: "标签", prop: "bqList",showSolt:true }
]
});
const showAdd = ref()
const showPerson = ref(false)
onMounted(()=>{
tabHeightFn()
})
// 初始化数据
const init = (type, row) => {
fjdz.value = []
tabHeightFn()
dialogForm.value = true;
// 初始化表单数据,并根据详情页设置禁用状态
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({id}, "/mosty-gsxt/qbcj/selectByid").then((res) => {
fjdz.value = res.ossList || [];
listQuery.value = res;
pageForm.tableData = res.ryList || [];
});
};
// 打开弹窗
const addEdit = (type,row,index) =>{
showPerson.value = true;
nextTick(()=>{
showAdd.value.init(type,row,index)
})
}
// 关闭
const close = () => {
fjdz.value = []
listQuery.value = {};
dialogForm.value = false;
loading.value = false;
};
// 表格高度计算
const tabHeightFn = () => {
pageForm.tableHeight = window.innerHeight - 720;
window.onresize = function () {
tabHeightFn();
};
};
defineExpose({ init });
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: 99%;
height: 225px;
margin-top: 10px;
overflow: hidden;
}
::v-deep .avatar-uploader{
display: flex;
align-items: center;
}
::v-deep .el-upload-list{
margin-left: 20px;
display: flex;
align-items: center;
}
::v-deep .el-upload-list__item-name .el-icon{
top: 3px;
}
</style>

View File

@ -15,7 +15,7 @@
</template>
<template #gapline>
<div style="width: 100%;height: 10px;" class="mb20">
<el-divider content-position="left">线索内容</el-divider>
<el-divider content-position="left">情报内容</el-divider>
</div>
</template>
<template #scfj>
@ -67,26 +67,26 @@ const props = defineProps({
const { proxy } = getCurrentInstance();
const dialogForm = ref(false); //弹窗
const rules = reactive({
xsMc: [{ required: true, message: "请输入线索名称", trigger: "blur" }],
xlLx: [{ required: true, message: "请选择线索类型", trigger: "change" }],
xsMc: [{ required: true, message: "请输入情报名称", trigger: "blur" }],
xlLx: [{ required: true, message: "请选择情报类型", trigger: "change" }],
qbLy: [{ required: true, message: "请选择情报来源", trigger: "change" }],
});
const formData = ref([
{ prop: "gapdive", type: "slot",width:'100%' },
{ label: "线索名称", prop: "xsMc", type: "input" },
{ label: "线索类型", prop: "xlLx", type: "select", options:props.dic.D_GS_XS_LX },
{ label: "情报名称", prop: "xsMc", type: "input" },
{ label: "情报类型", prop: "xlLx", type: "select", options:props.dic.D_GS_XS_LX },
{ label: "情报来源", prop: "qbLy", type: "select", options:props.dic.D_GS_XS_LY},
{ label: "指向开始时间", prop: "zxkssj", type: "datetime"},
{ label: "指向结束时间", prop: "zxjssj", type: "datetime"},
{ label: "情报上报时间", prop: "zxkssj", type: "datetime"},
// { label: "指向结束时间", prop: "zxjssj", type: "datetime"},
{ label: "指向地点", prop: "zxdz", type: "input"},
{ label: "所属专题", prop: "sszt", type: "select",options:props.dic.D_BZ_SSZT},
{ prop: "gapline", type: "slot",width:'100%' },
{ prop: "scfj", type: "slot",width:'100%'},
{ label: "线索内容", prop: "xsNr", type: "textarea",width:'100%'},
{ label: "情报内容", prop: "xsNr", type: "textarea",width:'100%'},
{ label: "群体类型", prop: "qtlx", type: "select",options:props.dic.D_GS_XS_QTLX },
{ label: "群体名称", prop: "qtmc", type: "input"},
{ label: "涉及人数", prop: "sjrs", type: "inputNumber"},
{ label: "线索报送单位", prop: "ssbmdm", type: "department"},
{ label: "情报报送单位", prop: "ssbmdm", type: "department"},
]);
const fjdz = ref()
const listQuery = ref({}); //表单

View File

@ -7,60 +7,63 @@
<span style="vertical-align: middle">导出</span>
</el-button> -->
<el-button type="primary" @click="dologShowFn()">
<el-icon style="vertical-align: middle"><CirclePlus /></el-icon>
<el-icon style="vertical-align: middle">
<CirclePlus />
</el-icon>
<span style="vertical-align: middle">全域搜索</span>
</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"/>
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount" />
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<template #xlLx="{row}">
<template #xlLx="{ row }">
<DictTag :tag="false" :value="row.xlLx" :options="D_GS_XS_LX" />
</template>
<template #qbLy="{row}">
<template #qbLy="{ row }">
<DictTag :tag="false" :value="row.qbLy" :options="D_GS_XS_LY" />
</template>
<template #czzt="{row}">
<!-- <template #czzt="{row}">
<DictTag :tag="false" :value="row.czzt" :options="D_GS_XS_CZZT" />
</template>
<template #shzt="{row}">
</template> -->
<template #shzt="{ row }">
<!-- 采纳将这条信息推送到情报管理,退回 -->
<DictTag :tag="false" :value="row.shzt" :options="D_BZ_XSSHZT" @clickTag="clickTag(row.shzt)" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="primary" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click="addEdit('edit', row)">详情</el-link>
<!-- <el-link size="small" type="primary" @click="addEdit('edit', row)">下发指令</el-link> -->
<el-popconfirm title="是否进行发布?" @confirm="confirm(row)">
<template #reference>
<el-link size="small" type="primary">发布</el-link>
</template>
</el-popconfirm>
<el-popover placement="left" :visible="row.visible" :width="400" trigger="click">
<template #reference>
<el-link size="small" type="primary" @click.stop="handleSh(row)">审核</el-link>
<el-link size="small" type="primary" @click.stop="handleSh(row)">转线索</el-link>
</template>
<div class="flex mb10 align-center">
<div class="w70 label-pop">审核状态 :</div>
<div class="w70 label-pop">状态 :</div>
<div style="flex:1">
<el-radio-group v-model="chooseRow.shzt" @change="rules.bhyy = false">
<el-radio v-for="obj in D_BZ_XSSHZT" :key="obj.value" :label="obj.value" >{{ obj.zdmc }}</el-radio>
<el-radio v-for="obj in D_BZ_XSSHZT" :key="obj.value" :label="obj.value">{{ obj.zdmc }}</el-radio>
</el-radio-group>
</div>
</div>
<div class="flex" v-if=" chooseRow.shzt == '01'">
<div class="flex" v-if="chooseRow.shzt == '01'">
<div class="w70 label-pop">驳回原因 :</div>
<div style="flex:1">
<MOSTY.Other filterable style="width: 100%;" v-model="chooseRow.bhyy" type="textarea" rows="3" clearable placeholder="请输入审核原因"/>
<MOSTY.Other filterable style="width: 100%;" v-model="chooseRow.bhyy" type="textarea" rows="3" clearable
placeholder="请输入审核原因" />
<div class="f12" style="color: red;" v-if="rules.bhyy">请输入驳回原因</div>
</div>
</div>
@ -73,23 +76,19 @@
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
}"></Pages>
</div>
<!-- 新增 -->
<AddForm ref="detailDiloag" @change="change" v-if="isShow" :dic="{D_BZ_SF,D_BZ_XB,D_GS_XS_LY,D_BZ_SSZT,D_GS_XS_LX ,D_GS_XS_QTLX}" />
<AddForm ref="detailDiloag" @change="change" v-if="isShow"
:dic="{ D_BZ_SF, D_BZ_XB, D_GS_XS_LY, D_BZ_SSZT, D_GS_XS_LX, D_GS_XS_QTLX }" />
<DialogDragger title="全域搜索" top="30px" v-model="dologShow" coumClass="zdy-model-dialogs" @close="close" width="80%">
<iframe style="width: 100%; height: 1000px" src="https://www.baidu.com" frameborder="0">
<iframe style="width: 100%; height: 1000px" src="https://www.baidu.com" frameborder="0">
xxxxx
</iframe>
</iframe>
</DialogDragger>
</div>
</template>
@ -105,23 +104,24 @@ import Search from "@/components/aboutTable/Search.vue";
import AddForm from "./components/addForm.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
// import {updateBkgzl} from '@/api/'
const { proxy } = getCurrentInstance();
const {D_GS_XS_CZZT,D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB,D_BZ_XSSHZT} = proxy.$dict("D_GS_XS_CZZT","D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB","D_BZ_XSSHZT"); //获取字典数据
const { D_GS_XS_CZZT, D_GS_XS_LY, D_BZ_SSZT, D_BZ_SF, D_GS_XS_LX, D_GS_XS_QTLX, D_BZ_XB, D_BZ_XSSHZT } = proxy.$dict("D_GS_XS_CZZT", "D_GS_XS_LY", "D_BZ_SSZT", "D_BZ_SF", "D_GS_XS_LX", "D_GS_XS_QTLX", "D_BZ_XB", "D_BZ_XSSHZT"); //获取字典数据
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const chooseRow = ref({})
const rules = reactive({
bhyy:false,
bhyy: false,
shzt: false,
})
const isShow = ref(false)
const searchConfiger = ref([
{ label: "线索名称", prop: 'xsMc', placeholder: "请输入线索名称", showType: "input" },
{ label: "情报名称", prop: 'xsMc', placeholder: "请输入情报名称", showType: "input" },
{ label: "内容关键字", prop: 'xsNr', placeholder: "请输入语义关键字", showType: "input" },
{ label: "线索类型", prop: 'xlLx', placeholder: "请选择线索类型", showType: "select",options:D_GS_XS_LX },
{ label: "线索来源", prop: 'qbLy', placeholder: "请选择线索来源", showType: "select",options:D_GS_XS_LY },
{ label: "开始时间", prop: 'kssj', placeholder: "请选择开始时间", showType: "date" },
{ label: "结束时间", prop: 'jssj', placeholder: "请选择结束时间", showType: "date" },
{ label: "情报类型", prop: 'xlLx', placeholder: "请选择情报类型", showType: "select", options: D_GS_XS_LX },
{ label: "情报来源", prop: 'qbLy', placeholder: "请选择情报来源", showType: "select", options: D_GS_XS_LY },
{ label: "情报上报时间", prop: 'kssj', placeholder: "请选择开始时间", showType: "date" },
// { label: "结束时间", prop: 'jssj', placeholder: "请选择结束时间", showType: "date" },
{ label: "指向地点", prop: 'zxdz', placeholder: "请输入指向地点", showType: "input" },
]);
@ -140,20 +140,21 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 150,
controlsWidth: 240,
tableColumn: [
{ label: "上报人姓名", prop: "xssbr" },
{ label: "上报人电话", prop: "xssbrdh" },
{ label: "线索编号", prop: "xsBh" },
{ label: "线索名称", prop: "xsMc" },
{ label: "线索类型", prop: "xlLx",showSolt:true },
{ label: "线索来源", prop: "qbLy",showSolt:true },
{ label: "开始时间", prop: "zxkssj" },
{ label: "结束时间", prop: "zxjssj" },
// { label: "上报人电话", prop: "xssbrdh" },
{ label: "情报编号", prop: "xsBh" },
{ label: "情报名称", prop: "xsMc" },
{ label: "情报类型", prop: "xlLx", showSolt: true },
{ label: "情报来源", prop: "qbLy", showSolt: true },
{ label: "情报上报时间", prop: "zxkssj" },
// { label: "结束时间", prop: "zxjssj" },
{ label: "指向地点", prop: "zxdz" },
{ label: "线索内容", prop: "xsNr"},
{ label: "处置状态", prop: "czzt",showSolt: true},
{ label: "情报内容", prop: "xsNr" },
// { label: "处置状态", prop: "czzt",showSolt: true},
{ label: "附件", prop: "fjdz", showSolt: true },
// { label: "关联任务", prop: "xssbrdh" },//没有字段
{ label: "审核状态", prop: "shzt", showSolt: true },
]
});
@ -166,20 +167,20 @@ onMounted(() => {
});
const handleSh = (val) =>{
chooseRow.value = {id:val.id,shzt:'01'}
const handleSh = (val) => {
chooseRow.value = { id: val.id, shzt: '01' }
val.visible = !val.visible;
}
const cancel = (row) =>{
const cancel = (row) => {
row.visible = false;
rules.bhyy = false;
chooseRow.value = {}
}
const handleSumbit = (row) =>{
rules.bhyy = !chooseRow.value.bhyy ? true :false;
if(chooseRow.value.shzt == '01' && rules.bhyy) return false;
const handleSumbit = (row) => {
rules.bhyy = !chooseRow.value.bhyy ? true : false;
if (chooseRow.value.shzt == '01' && rules.bhyy) return false;
let data = { ...chooseRow.value }
qcckPost(data,'/mosty-gsxt/qbcj/updateByXssh').then(res=>{
qcckPost(data, '/mosty-gsxt/qbcj/updateByXssh').then(res => {
row.visible = false;
proxy.$message({ type: "success", message: "审核成功" });
getList();
@ -187,54 +188,61 @@ const handleSumbit = (row) =>{
}
// 搜索
const onSearch = (val) =>{
queryFrom.value = {...val}
const onSearch = (val) => {
queryFrom.value = { ...val }
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) =>{
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val;
getList()
}
const changeSize = (val) =>{
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList()
}
// 获取列表
const getList = () =>{
const getList = () => {
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value,cjLx:'1' };
qcckGet(data,'/mosty-gsxt/qbcj/selectPage').then(res=>{
let data = { ...pageData.pageConfiger, ...queryFrom.value, cjLx: '1' };
qcckGet(data, '/mosty-gsxt/qbcj/selectPage').then(res => {
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}).catch(()=>{ pageData.tableConfiger.loading = false; })
}).catch(() => { pageData.tableConfiger.loading = false; })
}
// 删除
const delDictItem = (id) =>{
proxy.$confirm("确定要删除", "警告", {type: "warning"}).then(() => {
qcckPost({id},'/mosty-gsxt/qbcj/delete').then(()=>{
const delDictItem = (id) => {
proxy.$confirm("确定要删除", "警告", { type: "warning" }).then(() => {
qcckPost({ id }, '/mosty-gsxt/qbcj/delete').then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
})
}).catch(() => {});
}).catch(() => { });
}
// 导出
const exportFile = () =>{
window.open('/mosty-api/mosty-gsxt/qbcj/exportQbsjcjDc?cjLx=1','_self')
const exportFile = () => {
window.open('/mosty-api/mosty-gsxt/qbcj/exportQbsjcjDc?cjLx=1', '_self')
}
// 详情
const addEdit = (type, row) => {
isShow.value = true;
setTimeout(()=>{
setTimeout(() => {
detailDiloag.value.init(type, row);
},500)
}, 500)
};
//发布
const confirm = (item) => {
qcckPost({id:item.id,sffb:1}, '/mosty-gsxt/qbcj/qbfb').then(res => {
proxy.$message({ type: "success", message: "发布成功" });
getList();
})
}
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
@ -243,15 +251,16 @@ const tabHeightFn = () => {
};
};
const dologShow = ref(false)
const dologShowFn = (val) =>{
const dologShowFn = (val) => {
dologShow.value = true;
}
</script>
<style lang="scss" scoped>
.label-pop{
.label-pop {
position: relative;
&::before{
&::before {
position: absolute;
content: '*';
top: 0;
@ -259,17 +268,17 @@ const dologShowFn = (val) =>{
color: red;
}
}
</style>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
:v-deep .el-dialog{
width: 90% !important;
:v-deep .el-dialog {
width: 90% !important;
}
.zdy-model-dialogs {
/* background-color: rgb(50, 148, 214); */
background: url("~@/assets/images/bg46.png") no-repeat center center;
@ -277,8 +286,7 @@ width: 90% !important;
padding: 8px 10px;
box-sizing: border-box;
pointer-events: auto !important;
height:calc(100% - 50px);
height: calc(100% - 50px);
overflow: auto;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">人力情报信息搜索任务调度{{ title }} </span>
<span class="title">人力情报信息收集任务调度{{ title }} </span>
<div>
<el-button type="primary" size="small" :loading="loading" @click="submit">保存</el-button>
<el-button size="small" @click="close">关闭</el-button>
@ -11,7 +11,7 @@
<FormMessage :formList="formData" v-model="listQuery" ref="elform" :rules="rules">
<!-- 线索列表-->
<template #xsList>
<el-button @click="chooseVisiblex = true;">选择</el-button>
<!-- <el-button @click="chooseVisiblex = true;">选择</el-button>
<div class="boxlist">
<MyTable :tableData="listQuery.xsList" :tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight" :key="tableDate.keyCount" :tableConfiger="tableDate.tableConfiger"
@ -19,11 +19,24 @@
<template #qbLy="{ row }">
<DictTag :tag="false" :value="row.qbLy" :options="props.dic.D_GS_XS_LY" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
</template>
</MyTable>
</div> -->
<div class="boxlist">
<MyTable :tableData="listQuery.xsList" :tableColumn="tableDate.tableColumn"
:tableHeight="tableDate.tableHeight" :key="tableDate.keyCount" :tableConfiger="tableDate.tableConfiger"
:controlsWidth="tableDate.controlsWidth" @chooseData="chooseData">
<template #qbLy="{ row }">
<DictTag :tag="false" :value="row.qbLy" :options="props.dic.D_GS_XS_LY" />
</template>
<template #controls="{ row }">
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
<!-- 弹窗 -->
<el-link size="small" type="danger" @click="delDictItem(row.id)">详情</el-link>
</template>
</MyTable>
</div>
</template>
</FormMessage>
@ -61,13 +74,19 @@ const tableDate = reactive({
}, //分页
controlsWidth: 120, //操作栏宽度
tableColumn: [
{ label: "线索名称", prop: "xsMc" },
{ label: "线索编号", prop: "xsBh"},
{ label: "线索来源", prop: "qbLy", showSolt: true},
{ label: "开始时间", prop: "zxkssj"},
{ label: "结束时间", prop: "zxjssj"},
{ label: "指向地点", prop: "zxdz"},
{ label: "线索内容", prop: "xsNr",showOverflowTooltip:true },
// { label: "线索名称", prop: "xsMc" },
// { label: "线索编号", prop: "xsBh"},
// { label: "线索来源", prop: "qbLy", showSolt: true},
// { label: "开始时间", prop: "zxkssj"},
// { label: "结束时间", prop: "zxjssj"},
// { label: "指向地点", prop: "zxdz"},
// { label: "线索内容", prop: "xsNr",showOverflowTooltip:true },
// { label: "处置状态", prop: "czzt", showSolt: true },
{ label: "反馈单位", prop: "xsMc" },
{ label: "反馈民警", prop: "xsBh"},
{ label: "反馈时间", prop: "qbLy", showSolt: true},
{ label: "反馈内容", prop: "zxkssj" },
{ label: "图片", prop: "czzt", showSolt: true },
{ label: "处置状态", prop: "czzt", showSolt: true },
]
});
@ -75,7 +94,7 @@ const dialogForm = ref(false); //弹窗
const rules = reactive({
bsDwDm: [{ required: true, message: "请选择报送单位", trigger: "change" }],
ssbmdm: [{ required: true, message: "请选择所属部门", trigger: "change" }],
ssbmdm: [{ required: true, message: "请选择所属部门", trigger: "change"}],
rwBt: [{ required: true, message: "请输入任务标题", trigger: "blur" }],
rwBh: [{ required: true, message: "请输入任务编号", trigger: "blur" }],
rwLy: [{ required: true, message: "请选择任务来源", trigger: "change" }],
@ -85,8 +104,7 @@ const rules = reactive({
rwNr: [{ required: true, message: "请输入任务内容", trigger: "blur" }],
});
const formData = ref([
{ label: "所属部门", prop: "ssbmdm",depMc:'ssbmmc', type: "department" },
{ label: "报送单位", prop: "bsDwDm",depMc:'bsDwMc', type: "department" },
{ label: "所属部门", prop: "ssbmdm", depMc: 'ssbmmc', type: "department" },
{ label: "任务标题", prop: "rwBt", type: "input" },
{ label: "任务编号", prop: "rwBh", type: "input" },
{ label: "任务类型", prop: "rwLx", type: "select", options: props.dic.D_GS_RLQB_RWDD_LX },
@ -94,8 +112,10 @@ const formData = ref([
{ label: "反馈开始时间", prop: "rwSjKs", type: "datetime" },
{ label: "反馈截止时间", prop: "rwSjFkjz", type: "datetime" },
{ label: "严重程度", prop: "rwYzcd", type: "select", options: props.dic.D_GS_RLQB_RWDD_YZCD },
{ label: "报送单位", prop: "bsDwDm", depMc: 'bsDwMc', type: "department", multiple: true, width: '100%' },
{ label: "任务内容", prop: "rwNr", type: "textarea", width: "100%" },
{ label: "线索列表", prop: "xsList", type: "slot", width: "99%" }
// { label: "线索列表", prop: "xsList", type: "slot", width: "99%" }
{ label: "反馈内容", prop: "xsList", type: "slot", width: "99%" }
]);
const listQuery = ref({}); //表单
const loading = ref(false);
@ -122,7 +142,7 @@ const submit = () => {
let url = title.value == "新增" ? "/mosty-gsxt/tbGsxtRlqbRwdd/save" : "/mosty-gsxt/tbGsxtRlqbRwdd/update";
let params = { ...data };
loading.value = true;
params.xsList = params.xsList.map((item) => item.id);
// params.xsList = params.xsList.map((item) => item.id);
qcckPost(params, url).then(() => {
loading.value = false;
proxy.$message({ type: "success", message: title.value + "成功" });

View File

@ -1,7 +1,7 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="人力情报信息搜索任务调度">
<PageTitle title="人力情报信息收集任务调度">
<el-button type="primary" @click="addEdit('add', '')">
<el-icon style="vertical-align: middle">
<CirclePlus />
@ -27,8 +27,12 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="success" @click="addEdit('edit', row)">详情</el-link>
<!-- 下发将消息推送至临安码 消息中心 -->
<el-link size="small" type="primary" @click="addEdit('xf', row)">下发</el-link>
<!-- 直接弹窗下发 -->
<!-- 下发后编辑隐藏 -->
<!-- addEdit('xf', row) -->
<el-link size="small" type="primary" @click="">下发</el-link>
<el-link size="small" type="danger" @click="deleteRow(row.id)">删除</el-link>
</template>
</MyTable>
@ -122,7 +126,7 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 150,
controlsWidth: 200,
tableColumn: [
{ label: "任务标题", prop: "rwBt" },
{ label: "任务内容", prop: "rwNr", width: 200 },

View File

@ -7,13 +7,15 @@
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="flex">
<div :class="dataOrge.gzlid?'ww80':'ww100'">
<div class="form_cnt">
<el-form :model="listQuery" :rules="rules" :disabled="disabled" ref="elform" inline :label-width="100"
label-position="left">
<div class="smallTitle">布控信息</div>
<el-form-item prop="bkBt" label="布控标题">
<!-- <el-form-item prop="bkBt" label="布控标题">
<MOSTY.Other v-model="listQuery.bkBt" placeholder="请输入布控标题" clearable />
</el-form-item>
</el-form-item> -->
<el-form-item prop="bkDx" label="布控对象">
<MOSTY.Select v-model="listQuery.bkDx" @change="shangeDx" :dictEnum="props.dic.D_GS_BK_DX"
placeholder="请选择布控对象" clearable />
@ -33,6 +35,12 @@
<template #fjZp="{ row }">
<el-image :src="row.fjZp"></el-image>
</template>
<template #yjdj="{ row }">
<DictTag :tag="false" :value="row.yjdj" :options="props.dic.D_GS_ZDR_YJDJ" />
</template>
<template #yjbq="{ row }">
<DictTag :tag="false" :value="row.yjbq" :options="props.dic.BD_BK_CLYJBQ" />
</template>
<template #ryXb="{ row }">
<DictTag :tag="false" :value="row.ryXb" :options="props.dic.D_BZ_XB" />
</template>
@ -58,28 +66,30 @@
</div>
<GdMap></GdMap>
</div>
<el-form-item prop="bkBt" label="布控要素" style="width: 100%;">
<!-- <el-form-item prop="bkBt" label="布控要素" style="width: 100%;">
<div class="flex align-center">
<el-button @click="listQuery.bkYz = it.dm" :type="listQuery.bkYz == it.dm ? 'primary' : ''"
v-for="it in props.dic.D_GS_BK_BKYS" :key="it">{{ it.zdmc }}</el-button>
</div>
</el-form-item>
</el-form-item> -->
<div style="width: 100%;" class="mt25">
<el-form-item prop="bkSjKs" label="布控开始时间" label-width="120px">
<MOSTY.Date v-model="listQuery.bkSjKs" type="datetime" format="YYYY-MM-DD HH:mm:ss" placeholder="请选择布控开始时间"
clearable />
<MOSTY.Date v-model="listQuery.bkSjKs" type="datetime" format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择布控开始时间" clearable />
</el-form-item>
<el-form-item prop="bkSjJs" label="布控结束时间" label-width="120px">
<MOSTY.Date v-model="listQuery.bkSjJs" type="datetime" format="YYYY-MM-DD HH:mm:ss" placeholder="请选择布控结束时间"
clearable />
<MOSTY.Date v-model="listQuery.bkSjJs" type="datetime" format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择布控结束时间" clearable />
</el-form-item>
</div>
<div style="width: 100%;" class="mt25">
<el-form-item prop="czYq" label="处置要求">
<MOSTY.Select v-model="listQuery.czYq" :dictEnum="props.dic.D_GS_BK_CZYQ" placeholder="请选择处置要求" clearable />
<MOSTY.Select v-model="listQuery.czYq" :dictEnum="props.dic.D_GS_BK_CZYQ" placeholder="请选择处置要求"
clearable />
</el-form-item>
<el-form-item prop="bkDj" label="布控级">
<MOSTY.Select v-model="listQuery.bkDj" :dictEnum="props.dic.D_GS_BK_DJ" placeholder="请选择布控级别" clearable />
<el-form-item prop="bkDj" label="布控级">
<MOSTY.Select v-model="listQuery.bkDj" :dictEnum="props.dic.D_GS_BK_DJ" placeholder="请选择布控级别"
clearable />
</el-form-item>
</div>
<div style="width: 100%;" class="mt10">
@ -96,65 +106,45 @@
</div>
</el-form-item>
</div>
<div class="smallTitle">审批信息</div>
<el-form-item prop="czJsdwdm" label="处置接收单位" label-width="120px" style="width: 100%;">
<div class="flex align-center ww100">
<MOSTY.Department v-model="listQuery.czJsdwdm" style="width:260px;margin-right: 10px;" placeholder="请选择处置要求"
clearable />
<el-radio-group v-model="listQuery.czJsdwlx" class="flex align-center">
<el-radio :label="it.dm" v-for="(it, idx) in props.dic.D_GS_BK_CZJSDWLX" :key="idx">{{ it.zdmc
}}</el-radio>
</el-radio-group>
</div>
</el-form-item>
<div class="ww100 mt10 mb20">
<el-form-item prop="bkTjfs" label="提醒方式">
<el-radio-group v-model="listQuery.bkTjfs" class="flex align-center">
<el-radio :label="it.dm" v-for="(it, idx) in props.dic.D_GS_BK_TJFS" :key="idx">{{ it.zdmc }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="bkSjQs" label="签收时间">
<MOSTY.Date v-model="listQuery.bkSjQs" type="datetime" format="YYYY-MM-DD HH:mm:ss" placeholder="请选择签收时间"
clearable />
</el-form-item>
</div>
<div class="ww100">
<el-steps direction="vertical" :active="listQuery.wccz" space="500" finish-status="success">
<el-step title="发起申请">
<template #description>
<div class="flex align-center ww100 mt10 mb20">
<el-input v-model="listQuery.bkfqrXm" readonly class="ww20"></el-input>
<el-input v-model="listQuery.bkfqrSsbmmc" readonly class="ww20 ml10 mr10"></el-input>
<span class="f12" style="color: #333333;"> 备注发起人和部门根据登陆人自动填写</span>
</div>
</template>
</el-step>
<el-step title="审核确认">
<template #description>
<div class="ww100 mt10 mb20 depBox">
<el-form-item prop="bkshrSsbmdm" label="审核部门:" label-width="100" style="width: 100%;">
<MOSTY.Department :isAll="true" v-model="listQuery.bkshrSsbmdm" clearable
:placeholder="listQuery.bkshrSsbmmc ? listQuery.bkshrSsbmmc : ''" />
</el-form-item>
</div>
</template>
</el-step>
<el-step title="审批确认">
<template #description>
<div class="ww100 mt10 mb20 depBox">
<el-form-item prop="bkshrSsbmdm" label="审批部门:" label-width="100" style="width: 100%;">
<MOSTY.Department :isAll="true" v-model="listQuery.bksprSsbmdm" clearable
:placeholder="listQuery.bksprSsbmmc ? listQuery.bksprSsbmmc : ''" />
</el-form-item>
</div>
</template>
</el-step>
</el-steps>
</div>
</el-form>
</div>
</div>
<div class="ww20" v-if="dataOrge.gzlid">
<!-- <div class="smallTitle">审批信息</div>
<div class="ww100">
<el-steps :active="listQuery.wccz" space="500" finish-status="success" direction="vertical" status=''>
<el-step :title="item.eventType == '0' ? '发起申请' : item.eventType == '1' ? '审批结束' : item.nodeName"
v-for="(item, index) in workflow" :key="index">
<template #description>
<div class="ww100 mt10 mb20 nodeBox" v-if="item.eventType == '0'||item.eventType == '1'">
<div class="nodeorgNameTg">{{ item.log.userData.orgname }}</div>
<div class="flex just-between nameTag">
<div>{{ item.log.userName }}</div>
<div class="fontColor">{{ item.eventType == '0' ? '发起' : '结束' }}</div>
</div>
<div>{{ item.log.xtLrsj }}</div>
</div>
<div v-else class="ww100 mt10 mb20 nodeBox">
<div :class="item.taskStatus=='2'?'nodeorgNameTg':'nodeorgNameDd'">{{ item.orgNameData.orgname }}</div>
<div v-for="(items, indexs) in item.log" :key="indexs">
<div class="flex just-between nameTag" >
<div>{{ items.userName }}</div>
<div :class="item.taskStatus=='2'?'fontColor':'fontColorDd'">审批中</div>
</div>
<div>{{ items.xtLrsj }}</div>
</div>
</div>
</template>
</el-step>
</el-steps>
</div> -->
<ApprovalEcho ref="approvalEcho"/>
</div>
</div>
</div>
<!-- 选择布控人员 -->
<BkryDialod :modelValue="chooseVisible_RY" @update:modelValue="chooseVisible_RY = $event" @choosed="choosed"
@choosedAdd="choosedAdd" :roleIds="roleIds" />
@ -164,6 +154,8 @@
<!-- 选择布控群体 -->
<BkqtDialod :modelValue="chooseVisible_QT" @update:modelValue="chooseVisible_QT = $event" @choosed="choosed"
:roleIds="roleIds" />
<BksfzDialod :modelValue="chooseVisible_SFZ" @update:modelValue="chooseVisible_SFZ = $event" @choosed="choosed"
:roleIds="roleIds" :bkDx="listQuery.bkDx" @choosedAdd="choosedAdd" />
</template>
<script setup>
@ -171,11 +163,16 @@ import { getItem } from "@/utils/storage";
import BkryDialod from '@/components/ChooseList/ChooseZdr/index.vue';
import BkqtDialod from '@/components/ChooseList/ChooseQt/index.vue';
import BkclDialod from '@/components/ChooseList/ChooseCl/index.vue';
import BksfzDialod from './dolog/sfzLog.vue';
import GdMap from "@/components/GdMap/index.vue";
import * as MOSTY from "@/components/MyComponents/index";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, nextTick } from "vue";
import { tableColumnList,Zd } from '@/views/backOfficeSystem/ApprovalInformation/tableRow.js'
import { ref, defineExpose, reactive, defineEmits, getCurrentInstance, nextTick, watch } from "vue";
import { queryProcessNode, queryProcessNodeLog, queryProcess } from '@/api/spl'
import ApprovalEcho from "@/components/flowPath/ApprovalEcho.vue";
const emit = defineEmits(["change"]);
const props = defineProps({
dic: Object
@ -226,49 +223,11 @@ let tableDate = reactive({
{ label: "手机号", prop: "rySjhm" },
{ label: "虚拟身份", prop: "qtXnsf" },
{ label: "车牌号", prop: "clCph" },
{ label: "车架号", prop: "clCjh" },
{ label: "车辆识别代码", prop: "clCjh" },
{ label: "特征描述", prop: "qtTzms" },
{ label: "人员标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
{ label: "标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
]
});
const tableColumnList = {
'01': [
{ label: "照片", prop: "fjZp", showSolt: true },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "身份证号", prop: "rySfzh" },
{ label: "户籍地", prop: "ryHjd" },
{ label: "现居住地址", prop: "ryXjd" },
{ label: "手机号", prop: "rySjhm" },
{ label: "虚拟身份", prop: "qtXnsf" },
{ label: "车牌号", prop: "clCph" },
{ label: "车架号", prop: "clCjh" },
{ label: "特征描述", prop: "qtTzms" },
{ label: "人员标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
'02': [
{ label: "照片", prop: "fjZp", showSolt: true },
{ label: "姓名", prop: "ryXm" },
{ label: "性别", prop: "ryXb", showSolt: true },
{ label: "身份证号", prop: "rySfzh" },
{ label: "户籍地", prop: "ryHjd" },
{ label: "现居住地址", prop: "ryXjd" },
{ label: "手机号", prop: "rySjhm" },
{ label: "虚拟身份", prop: "qtXnsf" },
{ label: "车牌号", prop: "clCph" },
{ label: "车架号", prop: "clCjh" },
{ label: "特征描述", prop: "qtTzms" },
{ label: "人员标签", prop: "bqList", showSolt: true, showOverflowTooltip: true }
],
'03': [
{ label: "车牌号", prop: "clCph" },
{ label: "车架号", prop: "clCjh" },
{ label: "车辆颜色", prop: "clYs" },
// { label: "车辆所有人", prop: "clSyr" },
// { label: "管辖单位", prop: "gxSsbmmc" },
// { label: "管控民警", prop: "gkMjXm" },
]
}
const title = ref('')
const disabled = ref(false)
// 初始化数据
@ -286,6 +245,8 @@ const init = (type, row) => {
disabled.value = type == 'detail' ? true : false;
dialogForm.value = true;
if (row) tableDate.tableConfiger.haveControls = false;
Zd({D_GS_BK_DJ:props.dic.D_GS_BK_DJ,BD_BK_CLYJBQ:props.dic.BD_BK_CLYJBQ})
get_bkqy_list(row)
};
@ -299,6 +260,14 @@ const get_bkqy_list = (row) => {
if (row) getDataById(row.id);
})
}
const dataOrge=ref({})
const approvalEcho = ref()
watch(() => approvalEcho.value, (val) => {
if (val) {
approvalEcho.value.getWorkflow(dataOrge.value.gzlid)
}
},{deep:true})
// 根据id获取详情
const getDataById = (id) => {
@ -306,13 +275,21 @@ const getDataById = (id) => {
res.bkfj = res.ossList || [];
res.bkqyList = res.qyList ? res.qyList.map(v => v.id) : [];
listQuery.value = res || {}
tableDate.tableColumn =tableColumnList[res.bkDx?res.bkDx:'01']
dataOrge.value=res
tableDate.tableColumn = tableColumnList[res.bkDx ? res.bkDx : '01']
})
}
watch(() => approvalEcho.value, (val) => {
if (val) {
console.log(approvalEcho.value);
approvalEcho.value.getWorkflow(dataOrge.value.gzlid)
}
},{deep:true})
const shangeDx = () => {
tableDate.tableColumn =tableColumnList[listQuery.value.bkDx]
tableDate.tableColumn = tableColumnList[listQuery.value.bkDx]
listQuery.value.bkDxxx = '';
listQuery.value.bkdxList = [];
roleIds.value = [];
@ -326,31 +303,30 @@ const deleteRow = (row) => {
}
// 单独新增的数据
const choosedAdd = (item) => {
console.log(item);
let obj = {}
if (listQuery.value.bkDx!=='03') {
obj={ id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb, rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz, rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh, clCph: item.clCph, qtTzms: item.qtTzms, bqList: item.bqList }
if (listQuery.value.bkDx !== '02') {
obj = { id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb, rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz, rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh, clCph: item.clCph, qtTzms: item.qtTzms, bqList: item.bqList }
} else {
obj={
obj = {
clCph: item.hphm, clCjh: item.clCjh, clSyr: item.clSyr, clSyrsfzh: item.clSyrsfzh,
clYs: item.clYs, gxSsbmmc: item.gxSsbmmc
clYs: item.clYs, gxSsbmmc: item.gxSsbmmc, bqList: item.bqList
}
}
switch (listQuery.value.bkDx) {
default:
obj = { ...item }
break;
}
addPerson.value.push(obj);//缓存的数据
if (!listQuery.value.bkdxList) listQuery.value.bkdxList = [];
listQuery.value.bkdxList.unshift(obj);
console.log(listQuery.value.bkdxList);
}
// 选择重点人
const choosed = (val) => {
console.log(val);
tableDate.tableColumn =tableColumnList[listQuery.value.bkDx]
console.log(tableDate.tableColumn);
tableDate.tableColumn = tableColumnList[listQuery.value.bkDx]
if (listQuery.value.bkDx == '01') {// 人员
roleIds.value = val.map(it => it.id);
let arr = val.map(item => {
@ -358,23 +334,21 @@ console.log(tableDate.tableColumn);
let bqs = bqArr.map(v => {
return { bqZl: v.bqZl, bqId: v.bqId, bqLx: v.bqLx, bqLb: v.bqLb, bqMc: v.bqMc, bqDm: v.bqDm }
})
return { id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb, rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz, rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh, clCph: item.clCph, qtTzms: item.qtTzms, bqList: bqs }
return {
id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb,
rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz,
rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh,
clCph: item.clCph, qtTzms: item.qtTzms, bqList: bqs, yjdj: item.zdrYjdj,ssbmdm:item.zrSsbmdm
}
})
listQuery.value.bkdxList = [...addPerson.value, ...arr];
} else if (listQuery.value.bkDx == '03') {
roleIds.value = val.map(it => it.id);
let arr = val.map(item => {
let bqArr = item.bqList || [];
let bqs = bqArr.map(v => {
return {
clCph: v.hphm, clCjh: v.clCjh, clSyr: v.clSyr, clSyrsfzh: v.clSyrsfzh,
clYs: v.clYs, gxSsbmmc: v.gxSsbmmc
}
})
return {
clCph: item.hphm, clCjh: item.clCjh, clSyr: item.clSyr, clSyrsfzh: item.clSyrsfzh,
clYs: item.clYs, gxSsbmmc: item.gxSsbmmc, bqList: bqs
clYs: item.clYs, gxSsbmmc: item.gxSsbmmc,yjbq: item.yjbq, yjdj: item.yjdj,ssbmdm:item.zrSsbmdm
}
})
listQuery.value.bkdxList = [...addPerson.value, ...arr];
@ -395,10 +369,10 @@ console.log(tableDate.tableColumn);
id: item.id, fjZp: item.fjZp, ryXm: item.ryXm, ryXb: item.ryXb,
rySfzh: item.rySfzh, ryHjd: item.hjdXz, ryXjd: item.xzdXz,
rySjhm: item.ryLxdh, qtXnsf: item.qtXnsf, clCjh: item.clCjh,
clCph: item.clCph, qtTzms: item.qtTzms, bqList: bqs
clCph: item.clCph, qtTzms: item.qtTzms, bqList: bqs,
yjdj: item.zdrYjdj,ssbmdm:item.zrSsbmdm
}
})
listQuery.value.bkdxList = brrPeo;
}
};
@ -410,12 +384,21 @@ const handleAddPeo = () => {
case '01':
chooseVisible_RY.value = true
break;
case '02':
chooseVisible_QT.value = true
case '04':
case '05':
case '06':
case '07':
case '08':
case '09':
case '10':
chooseVisible_SFZ.value = true
break;
case '03':
chooseVisible_CL.value = true
break;
case '02':
chooseVisible_QT.value = true
break;
}
}
@ -448,6 +431,42 @@ const close = () => {
loading.value = false;
addPerson.value = [];
roleIds.value = []
dataOrge.value={}
};
// 选择身份证
const chooseVisible_SFZ = ref(false)
// 获取布控信息的工作流
const workflow = ref()
const getWorkflow = async (id) => {
const promes = {
processId: id
}
const proNode = await queryProcessNode(promes)
const proNodeLog = await queryProcessNodeLog(promes)
const process = await queryProcess(promes)
workflow.value = proNode.rows.map(item => {
const log = proNodeLog.rows.filter(items => item.nodeId == items.nodeId)
if (item.eventType == '0') {
return {
...item,
log: {
userData: item.userData ? JSON.parse(item.userData) : JSON.parse(process.rows[0].processData).orgNameData,
userName: process.rows[0].userName,
xtLrsj: process.rows[0].xtLrsj,
processStatus: process.rows[0].processStatus,
}
}
} else {
return {
...item,
orgNameData: JSON.parse(log[0].userData),
log: log
}
}
})
};
defineExpose({ init });
@ -509,4 +528,60 @@ defineExpose({ init });
}
}
/* 使用深度选择器覆盖子组件样式 */
::v-deep .el-step.is-vertical .el-step__title {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__description{
padding: 0 !important;
}
::v-deep .el-step__description.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
.el-step__title.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__head.is-wait {
color: #000000 !important;
border-color: #000000 !important;
}
::v-deep .el-step__line {
background-color: #000000 !important;
}
.nodeBox {
width: 80%;
text-align: center;
line-height: 30px;
border-radius: 10px;
overflow: hidden;
background-color: aliceblue;
.nodeorgNameTg {
background-color: #1abe20;
}
.nameTag {
line-height: 30px;
padding: 0 10px;
}
.nodeorgNameDd {
background-color: #18a2dd;
}
.fontColor {
color: #1abe20;
} .fontColorDd {
color: #18a2dd;
}
}
</style>

View File

@ -0,0 +1,185 @@
<template>
<el-dialog v-model="modelValue" :destroy-on-close="true" title="新增布控" @close="close" :close-on-click-modal="false">
<FormMessage v-model="listQuery" :formList="formData" labelWidth="120px" ref="elform" :rules="rules">
<template #bqList>
<div class="marks pointer" @click="chooseMarksVisible = true">
<span style="color: rgb(175 178 184);padding-left: 10px;"
v-if="!listQuery.bqList || listQuery.bqList.length == 0">请选择标签</span>
<span v-else>
<el-tag @close.stop="closeTag(idx)" type="success" closable v-for="(it, idx) in listQuery.bqList"
:key="idx">{{ it.bqMc }}</el-tag>
</span>
</div>
</template>
</FormMessage>
<template #footer>
<div class="flex just-center">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</div>
</template>
</el-dialog>
<ChooseMarks v-model="chooseMarksVisible" @choosed="choosed" :roleIds="roleIds" />
</template>
<script setup>
import ChooseMarks from "@/components/ChooseList/ChooseMarks/index.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { reactive, ref, getCurrentInstance, watch } from 'vue';
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
bkDx: {
type: String,
default: '01'
}
})
const emits = defineEmits(["update:modelValue", "choosed", "choosedAdd"]);
const { proxy } = getCurrentInstance();
const { D_BZ_XB, D_GS_ZDR_YJDJ } = proxy.$dict("D_BZ_XB", "D_GS_ZDR_YJDJ"); // 获取字典数据
const elform = ref()
const roleIds = ref([])
const chooseMarksVisible = ref(false)
const listQuery = ref({})
const formData = ref()
const rules = ref()
const tableColumnList = {
'04': [
{ label: "身份证号", prop: "rySfzh", type: "input" },
{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "性别", prop: "ryXb", type: "select", options: D_BZ_XB },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'05': [
{ label: "车辆识别代码", prop: "clCjh", type: "input" },
{ label: "车牌号", prop: "clCph", type: "input", },
{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'06': [
{ label: "Mac地址", prop: "mac", type: "input" },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'07': [
{ label: "IMEI", prop: "imei", type: "input" },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'08': [
{ label: "IMSI", prop: "imsi", type: "input" },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'09': [
{ label: "电话", prop: "rySjhm", type: "input" },
{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "性别", prop: "ryXb", type: "select", options: D_BZ_XB },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
],
'10': [{ label: "姓名", prop: "ryXm", type: "input", },
{ label: "身份证号", prop: "rySfzh", type: "input" },
{ label: "预警等级", prop: "yjdj", type: "select", options: D_GS_ZDR_YJDJ },
{ label: "性别", prop: "ryXb", type: "select", options: D_BZ_XB },
{ label: "标签", prop: "bqList", type: "slot", width: '100%' },
{ label: "责任部门", prop: "ssbmdm", type: "department" },
{ label: "人员照片", prop: "fjZp", type: "upload", width: '100%' },
],
}
const rulesList = {
'04': {
rySfzh: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
},
'03': {
fjZp: [{ required: true, message: "请选择附件", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'05': {
clCjh: [{ required: true, message: "请输入车辆识别代码", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'06': {
mac: [{ required: true, message: "请输入Mac地址", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'07': {
imei: [{ required: true, message: "请输入IMEI", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'08': {
imsi: [{ required: true, message: "请输入IMSI", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
},
'09': {
dh: [{ required: true, message: "请输入电话号码", trigger: "blur" }],
ssbmdm: [{ required: true, message: "请选择责任部门", trigger: "blur" }],
yjdj: [{ required: true, message: "请输入身份证号", trigger: "blur" }],
}
}
watch(() => props.bkDx, (val, oldval) => {
formData.value = tableColumnList[val]
rules.value = rulesList[val]
}, { immediate: true })
// 选择标签
const choosed = (val) => {
listQuery.value.bqList = val.map(v => {
return { bqZl: v.bqLb, bqId: v.id, bqLx: v.bqLx, bqLb: v.bqLb, bqMc: v.bqMc, bqDm: v.bqDm }
});
roleIds.value = val.map(v => v.id)
}
// 删除数据
const closeTag = (idx) => {
listQuery.value.bqList.splice(idx, 1)
roleIds.value.splice(idx, 1)
}
const submitForm = () => {
elform.value.submit((val) => {
val.id = new Date().getTime()
emits('choosedAdd', val)
close()
})
}
const close = async () => {
roleIds.value = []
listQuery.value = {}
listQuery.value.fjZp = []
await emits("update:modelValue", false);
}
</script>
<style lang="scss" scoped>
.marks {
width: 100%;
min-height: 32px;
border: 1px solid #e9e9e9;
border-radius: 4px;
}
</style>

View File

@ -2,7 +2,7 @@
<div>
<div class="titleBox">
<PageTitle title="我的布控">
<el-button type="primary" @click="handleAdd('add',null)">发起布控</el-button>
<el-button type="primary" @click="handleAdd('add', null)">发起布控</el-button>
</PageTitle>
</div>
<!-- 搜索 -->
@ -13,14 +13,8 @@
<div class="content">
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
>
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #bkZt="{ row }">
<DictTag :tag="false" :value="row.bkZt" :options="D_GS_BK_ZT" />
</template>
@ -31,25 +25,37 @@
<DictTag :tag="false" :value="row.bkDx" :options="D_GS_BK_DX" />
</template>
<template #bkdxList="{ row }">
<span v-if="row.bkdxList"><span class="nowrap" v-for="(it,idx) in row.bkdxList" :key="idx"> {{ it.ryXm }} <span v-if="idx < row.bkdxList.length-1"></span></span></span>
<span v-if="row.bkdxList"><span class="nowrap" v-for="(it, idx) in row.bkdxList" :key="idx">
{{ it.ryXm ? it.ryXm : it.imei ? it.imei : it.imsi ? it.imsi : '' }}
<!-- :it.ryXm?it.mac:it.imsi?it.imsi:'xxxx' -->
<span v-if="idx < row.bkdxList.length - 1"></span></span></span>
<span v-else>暂无</span>
</template>
<template #sjrs="{ row }">
<!-- <template #sjrs="{ row }">
<span v-if="row.bkdxList"> {{ row.bkdxList.length }} </span>
<span v-else>0</span>
</template>
<template #qyList="{ row }">
</template> -->
<!-- <template #qyList="{ row }">
<span v-for="(it,idx) in row.qyList" :key="idx"> {{ it.qymc }} <span v-if="idx < row.qyList.length-1"></span></span>
</template>
<template #yjcs="{row}">
</template> -->
<!-- <template #yjcs="{row}">
<span @click="openWarning(row)" style="color: #00ffff;" class="mr5 pointer">{{ row.yjcs || 0}}</span>
</template>
</template> -->
<!-- 操作 -->
<template #controls="{ row }">
<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 v-if="!row.gzlid">
<el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
@click="createProcess(row)">送审</el-link>
<el-link type="primary" v-if="['01', '03', '06'].includes(row.bkZt)" size="small"
@click="handleAdd('edit', row)">编辑</el-link>
</template>
<!-- 审核通过后才有轨迹 -->
<el-link type="primary" size="small" @click="handleAdd('detail', 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)"
v-if="['01', '03', '06'].includes(row.bkZt)">删除</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -59,10 +65,16 @@
</div>
</div>
</div>
<!-- 布控对象 -->
<AddBkdx ref="addBkdxForm" @change="getList" :dic="{D_GS_BK_DX,D_GS_BK_BKYS,D_BZ_XB,D_GS_BK_CZYQ,D_GS_BK_DJ,D_GS_BK_CZJSDWLX,D_GS_BK_TJFS}" />
<!-- 布控类型 -->
<AddBkdx ref="addBkdxForm" @change="getList"
:dic="{
D_GS_BK_DX, D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_CZYQ,
D_GS_BK_DJ, BD_BK_CLYJBQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS,D_GS_ZDR_YJDJ
}" />
<!-- 预警弹窗 -->
<YjDialog ref="warningkdxForm"></YjDialog>
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '布控审批', flowType: 'BKSP',modelName:'布控' }"
:path="fixedValue" @getList="getList" />
</template>
<script setup>
@ -73,24 +85,26 @@ import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_BK_BKYS,D_BZ_XB,D_GS_BK_SJLX,D_GS_BK_DJ, D_GS_BK_DX, D_GS_BK_ZT,D_GS_BK_CZYQ,D_GS_BK_CZJSDWLX,D_GS_BK_TJFS } = proxy.$dict("D_GS_BK_BKYS","D_BZ_XB","D_GS_BK_SJLX","D_GS_BK_DJ","D_GS_BK_DX","D_GS_BK_ZT","D_GS_BK_CZYQ","D_GS_BK_CZJSDWLX","D_GS_BK_TJFS"); //获取字典数据
const { D_GS_BK_BKYS, D_BZ_XB, D_GS_BK_SJLX, D_GS_BK_DJ, BD_BK_CLYJBQ,D_GS_ZDR_YJDJ,
D_GS_BK_DX, D_GS_BK_ZT, D_GS_BK_CZYQ, D_GS_BK_CZJSDWLX, D_GS_BK_TJFS } = proxy.$dict("D_GS_ZDR_YJDJ","D_GS_BK_BKYS", "D_BZ_XB", "D_GS_BK_SJLX", "D_GS_BK_DJ", "D_GS_BK_DX", "D_GS_BK_ZT", "D_GS_BK_CZYQ", "D_GS_BK_CZJSDWLX", "D_GS_BK_TJFS", 'BD_BK_CLYJBQ'); //获取字典数据
const addBkdxForm = ref(null); //布控对象组件
const warningkdxForm = ref(); //布控对象组件
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{
label: "布控级",
label: "布控级",
prop: "bkDj",
placeholder: "请选择布控级",
placeholder: "请选择布控级",
showType: "select",
options: D_GS_BK_DJ
},
{
label: "布控对象",
label: "布控类型",
prop: "bkDx",
placeholder: "请选择布控对象",
placeholder: "请选择布控类型",
showType: "select",
options: D_GS_BK_DX
},
@ -116,23 +130,32 @@ const pageData = reactive({
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 150, //操作栏宽度
controlsWidth: 250, //操作栏宽度
tableColumn: [
{ label: "布控级别", prop: "bkDj", showSolt: true },
{ label: "布控标题", prop: "bkBt" },
{ label: "布控对象", prop: "bkDx",showSolt: true ,showOverflowTooltip:true},
{ label: "布控对象信息", prop: "bkdxList",showSolt: true,showOverflowTooltip:true },
{ label: "布控范围", prop: "qyList", showSolt: true,showOverflowTooltip:true },
{ label: "涉及人数", prop: "sjrs",showSolt: true },
{ label: "预警次数", prop: "yjcs",showSolt: true },
{ label: "开始时间", prop: "bkSjKs",showOverflowTooltip:true},
{ label: "结束时间", prop: "bkSjJs",showOverflowTooltip:true},
{ label: "布控发起人", prop: "bkfqrXm"},
{ label: "布控状态", prop: "bkZt",showSolt: true},
{ label: "布控对象", prop: "bkdxList", showSolt: true, showOverflowTooltip: true },
{ label: "布控类型", prop: "bkDx", showSolt: true, showOverflowTooltip: true },
{ label: "布控等级", prop: "bkDj", showSolt: true },
{ label: "开始时间", prop: "bkSjKs", showOverflowTooltip: true },
{ label: "结束时间", prop: "bkSjJs", showOverflowTooltip: true },
{ label: "申请人", prop: "bkfqrXm" },
{ label: "布控状态", prop: "bkZt", showSolt: true },
]
});
// 固定值
const fixedValue = {
clueVerification:'deploymentApproval',
byMeansOf: 'tbGsxtBk/gsbkCallback',
nobyMeansOf: 'tbGsxtBk/gsbkCallback',
recycle:'tbGsxtBk/gsbkCallback',
}
const showSp = ref(false);
const rowData = ref()
const createProcess = (row) => {
showSp.value = true;
rowData.value = row
}
onMounted(() => {
getList();
tabHeightFn();
@ -160,7 +183,7 @@ const getList = () => {
let data = {
...pageData.pageConfiger,
...queryFrom.value,
bkcxlx:'01'
bkcxlx: '01'
};
qcckGet(data, "/mosty-gsxt/tbGsxtBk/selectPage").then((res) => {
pageData.tableData = res.records || [];
@ -172,18 +195,18 @@ const getList = () => {
};
// 打开预警
const openWarning = (val) =>{
const openWarning = (val) => {
warningkdxForm.value.init(val)
}
const handleAdd = (type,row) => {
addBkdxForm.value.init(type,row);
const handleAdd = (type, row) => {
addBkdxForm.value.init(type, row);
};
// 送审
const handleSend = (id) =>{
const handleSend = (id) => {
proxy.$confirm("确定要送审?", "警告", { type: "warning" }).then(() => {
qcckPost({}, "/mosty-gsxt/tbGsxtBk/subExamine/"+id).then(() => {
qcckPost({}, "/mosty-gsxt/tbGsxtBk/subExamine/" + id).then(() => {
proxy.$message({ type: "success", message: "送审成功" });
getList();
});
@ -193,7 +216,7 @@ const handleSend = (id) =>{
// 删除
const handleRow = (id) => {
proxy.$confirm("确定要删除?", "警告", { type: "warning" }).then(() => {
qcckDelete({}, "/mosty-gsxt/tbGsxtBk/"+id).then(() => {
qcckDelete({}, "/mosty-gsxt/tbGsxtBk/" + id).then(() => {
proxy.$message({ type: "success", message: "删除成功" });
getList();
});
@ -212,5 +235,4 @@ const tabHeightFn = () => {
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,4 @@
export const ZL_LX_BM = [{ label: 'ZLLX10', value: 'ZLLX10' }, { label: 'ZLLX11', value: 'ZLLX11' }, { label: 'ZLLX12', value: 'ZLLX12' }, { label: 'ZLLX13', value: 'ZLLX13' }, { label: 'ZLLX14', value: 'ZLLX14' }]
export const ZL_LX_MC = [{ label: '普通预警', value: '普通预警' }, { label: '疲劳预警', value: '疲劳预警' }, { label: '超速预警', value: '超速预警' }, { label: '疲劳预警', value: '疲劳预警' }, { label: '疲劳预警', value: '疲劳预警' }]
export const ZL_JB_BM = [{ label: 'XTDJ10', value: 'XTDJ10' }, { label: 'XTDJ11', value: 'XTDJ11' }, { label: 'XTDJ12', value: 'XTDJ12' }, { label: 'XTDJ13', value: 'XTDJ13' }, { label: 'XTDJ14', value: 'XTDJ14' }]
export const ZL_JB_MC = [{ label: '一级', value: '一级' }, { label: '二级', value: '二级' }, { label: '三级', value: '三级' }, { label: '四级', value: '四级' }]

View File

@ -0,0 +1,122 @@
<template>
<FormMessage v-model="listQuery" :formList="formData" labelWidth="100px" ref="elform" :rules="rules">
<template #zrSsbmdm>
<MOSTY.Department filterable v-model="listQuery.receivingUnitCode" width="100%" @getDepValue="getDepValue"
clearable placeholder="请选择所属部门" :multiple="true" />
</template>
<template #ry>
<el-input readonly v-model="ryStr" @click="chooseUserVisible = true" placeholder="请选择民警"></el-input>
</template>
</FormMessage>
<ChooseUser v-model="chooseUserVisible" @choosedUsers="handleUserSelected" :roleIds="roleIds" :Single="false" />
</template>
<script setup>
import { reactive, ref, onMounted, watch } from "vue";
import { sendFqzl } from '@/api/commit'
import { getItem } from '@/utils/storage'
import * as MOSTY from "@/components/MyComponents/index";
import ChooseUser from "@/components/ChooseList/ChooseUser/index.vue"
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { ElMessage } from "element-plus";
const props = defineProps({
itemData: {
type: Object,
default: () => { }
}
})
const emit = defineEmits(['handleClose'])
// 表单数据
const listQuery = ref({}); //表单
// 选择人员
const ryStr = ref('')
const elform = ref()
const personnelEntity = ref()
const formData = ref([
{ label: "标题", prop: "title", type: "input", width: "40%" },
{ label: "接收单位", prop: "zrSsbmdm", type: "slot", width: "40%" },
{ label: "指令状态", prop: "status", type: "input", width: "40%" },
{ label: "人员选择", prop: "ry", type: "slot", width: "40%" },
{ label: "附件", prop: "attachmentPath", type: "upload" },
{ label: "指令内容", prop: "instructionContent", type: "textarea", width: "100%" },
])
const rules = reactive({
title: [{ required: true, message: "请输入指令标题", trigger: "blur" }],
zrSsbmdm: [{ required: true, message: "请选择接收单位", trigger: "blur" }],
instructionContent: [{ required: true, message: "请输入指令内容", trigger: "blur" }],
ry: [{ required: true, message: "请选择人员", trigger: "blur" }]
});
const deptId = getItem('deptId')
const getsendFqzl = () => {
elform.value.submit((val)=>{
elform.value.validate().then(res => {
if (res) {
const data = { ...listQuery.value }
delete data.ry
const promes = {
instructionsEntity: {
unitCode: deptId[0].deptCode,
unitName: deptId[0].deptName,
...data,
receivingUnitCode: listQuery.value.receivingUnitCode.toString(),
receivingUnit: listQuery.value.receivingUnit.toString(),
attachmentPath: JSON.stringify(listQuery.value.attachmentPath)
}, id: props.itemData.id,
personnelEntity: personnelEntity.value
}
sendFqzl(promes).then((result) => {
const res = JSON.parse(result)
if (res.code == 200) {
ElMessage.success('发送成功')
emit('handleClose')
} else {
ElMessage.error(res.msg)
}
}).catch((err) => {
console.log(err);
});
}
})
})
}
const itemData=ref(props.itemData)
watch(() =>itemData.value, (val) => {
listQuery.value.title = val.yjBt
listQuery.value.instructionContent = val.yjNr
}, { deep: true, immediate: true })
const chooseUserVisible = ref(false)
const roleIds = ref([])
// 选取角色
const handleUserSelected = (val) => {
personnelEntity.value = val.map((item, index) => {
return {
name: item.userName,
idNumber: item.idEntityCard,
phoneNumber: item.mobile,
personTypeId: "",
personTypeName: "",
domicilePlace: "",
orderId: index + 1
}
})
ryStr.value = personnelEntity.value.map(item => item.name)
}
// 选取部门
const getDepValue = (e) => {
listQuery.value.receivingUnit = e.map(item => item.orgName)
}
defineExpose({
getsendFqzl
})
</script>
<style scoped lang="scss"></style>

View File

@ -1,7 +1,7 @@
<template>
<div class="personCard relative flex mb10 pointer">
<div class="personCard relative flex mb10 pointer" >
<div class="cxbq f14 lh50 tc absolute" v-if="props.item.czzt == '03'">已完成</div>
<el-button color="#0072ff" size="small" @click="handleQs(props.item)" v-if="props.item.czzt == '01'" class="btn_qs f14 tc absolute">签收</el-button>
<el-button color="#0072ff" size="small" @click.stop="handleQs(props.item)" v-if="props.item.czzt == '01'" class="btn_qs f14 tc absolute">签收</el-button>
<el-button color="#0072ff" size="small" v-if="props.item.czzt == '02'" ref="buttonRef" @click.stop="isShowVisble = !isShowVisble;" class="btn_qs f14 tc absolute">反馈</el-button>
<div class="avatarBox relative">
<div class="marks f12 absolute" :class="changeBg(props.item.yjJb)">
@ -10,7 +10,7 @@
<div>
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="props.item.yjTp" :preview-src-list="[props.item.yjTp]"/>
</div>
<span class="smallbtn">全息档案</span>
<div> <span class="smallbtn" @click.stop="()=>{}">全息档案</span></div>
</div>
<div class="infoBox">
<div class="items">
@ -81,7 +81,7 @@ const rules = reactive({
// 处理签收
const handleQs = (val) =>{
proxy.$confirm("是否确定要签收?", "警告", { type: "warning" }).then(() => {
qcckPost({id:val.id}, "/mosty-jmxf/tbYjxx/yjqs").then(() => {
qcckPost({id:val.id}, "/mosty-gsxt/tbYjxx/yjqs").then(() => {
val.czzt = '02'
proxy.$message({ type: "success", message: "签收成功" });
});
@ -93,7 +93,7 @@ const handleSendSp = (val) =>{
elRowForm.value.validate((valid) => {
if(!valid) return;
let data = { id:val.id,...chooseRow.value }
qcckPost(data, "/mosty-jmxf/tbYjxx/yjfk").then(() => {
qcckPost(data, "/mosty-gsxt/tbYjxx/yjfk").then(() => {
val.czzt = '03';
proxy.$message({ type: "success", message: "反馈成功" });
cancelRowSp()
@ -134,6 +134,9 @@ const changetText = (type) => {
return "不关注";
}
};
const showDetail = () => {
emit('showDetail',props.item)
}
</script>

View File

@ -24,7 +24,7 @@
</el-input>
</div>
<ul class="listContent noScollLine mt10" v-infinite-scroll="loadList" style="overflow: auto" v-loading="loading">
<li v-for="(item, index) in personList" :key="index">
<li v-for="(item, index) in personList" :key="index" @click.stop="showDetail(item)">
<YjItem :item="item" type="yj" :dic="{D_BZ_YJCZZT}"></YjItem>
</li>
<MOSTY.Empty :show="!loading && personList.length <= 0"></MOSTY.Empty>
@ -63,6 +63,9 @@
</div>
</div>
</div>
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='close'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="yj" :tacitly="tacitly"/>
</Information>
</template>
<script setup>
@ -74,6 +77,8 @@ import WarningCount from "./components/WarningCount.vue";
import BarHatEcharts from "@/views/home/echarts/barHatEcharts.vue";
import { onMounted, reactive, ref,getCurrentInstance } from "vue";
import { useRouter } from "vue-router";
import Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
const { proxy } = getCurrentInstance();
const { D_BZ_YJCZZT } = proxy.$dict('D_BZ_YJCZZT')
const router = useRouter()
@ -129,7 +134,7 @@ onMounted(()=>{
})
// 触底加载
const loadList = () =>{
const loadList = () => {
if( personList.value.length == total.value) return;
pageNum.value++;
getList()
@ -138,7 +143,7 @@ const loadList = () =>{
const getList = () =>{
let params = { pageSize:10, pageNum:pageNum.value };
loading.value = true;
qcckPost({params},'/mosty-jmxf/tbYjxx/getPageList').then(res=>{
qcckPost(params,'/mosty-gsxt/tbYjxx/getPageList').then(res=>{
loading.value = false;
let arr = res.records || [];
personList.value = pageNum.value == 1 ? arr : personList.value.concat(arr);
@ -151,7 +156,7 @@ const getList = () =>{
const init = () =>{
// 预警处置统计
list.YjczDate.loading = true;
qcckGet({},'/mosty-jmxf/tbYjxx/getYjCzztTj').then(res=>{
qcckGet({},'/mosty-gsxt/tbYjxx/getYjCzztTj').then(res=>{
list.YjczDate.loading = false;
list.YjczDate.xDate = res.map(item=>item.zdmc);
list.YjczDate.list = [{
@ -174,7 +179,7 @@ const init = () =>{
// 感知元统计
list.GzyDate.loading= true;
qcckGet({},'/mosty-jmxf/tbYjxx/getGzyTj').then(res=>{
qcckGet({},'/mosty-gsxt/tbYjxx/getGzyTj').then(res=>{
list.GzyDate.loading = false;
list.GzyDate.xDate = res.map(item=>item.yj_gzymc);
list.GzyDate.list = [{
@ -186,7 +191,7 @@ const init = () =>{
// 预警级别
loadingyj.value = true;
qcckGet({},'/mosty-jmxf/tbYjxx/getYjxxTj').then(res=>{
qcckGet({},'/mosty-gsxt/tbYjxx/getYjxxTj').then(res=>{
loadingyj.value = false;
yjjbRef.value.initCharts(res)
})
@ -195,6 +200,26 @@ const init = () =>{
const seeMoreFn = () => {
router.push('/ControlApproval')
}
const showDialog = ref(false)
const itemData=ref()
const showDetail = (item) => {
showDialog.value = true;
itemData.value=item
}
const handleClose = () => {
showDialog.value = false;
}
const semdFqzlRef = ref()
const tacitly = {
title:'yjBt',
instructionContent:'yjNr'
}
const submit=()=>{
semdFqzlRef.value.getsendFqzl()
}
const close = () => {
semdFqzlRef.value.close()
}
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,299 @@
<template>
<div class="dialog" v-if="dialogForm" v-infinite-scroll="load" :infinite-scroll-disabled="disabled">
<!-- class="head_box" -->
<div style="position: sticky;top: 0;float: right;">
<el-button size="small" @click="close">关闭</el-button>
</div>
<div class="content_box">
<div>
<div class="title_box">{{ listQuery.xsMc }}</div>
<div class="content_icon flex align-center">
<div class="icon_img"><img src="@/assets/images/ly-person-icon.png" alt="" srcset=""></div>
<div class="flex align-space-around dir-column">
<div class="publisher">发布者{{ listQuery.ssbm }}{{ listQuery.fbrxm }}</div>
<div>发布于{{ listQuery.fbsj }}</div>
</div>
</div>
<p class="content_text">{{ listQuery.xsNr }} </p>
<div class="itemXs_Xs flex just-between align-center">
<div class=" flex just-between align-center">
<el-icon class="icon">
<Histogram />
</el-icon>
&nbsp;{{ listQuery.rd ? listQuery.rd : 0 }}
</div>
<div class=" flex just-between align-center">
<el-icon class="icon">
<ChatDotSquare />
</el-icon>
&nbsp;{{ pls }}
</div>
<div class="flex align-center">情报类型
<DictTag :tag="false" :value="listQuery.xlLx" color="#5c5c5c" :options="dict.D_GS_XS_LX" />
</div>
</div>
</div>
<div class="title_box virtual">评论列表</div>
<CommentList v-for="(item, index) in pagesData.listData" :key="index" :index="index" :item="item"
@postReply="postReply" @delComment="delComment" :userInfo="userInfo" @cjpjZan="cjpjZan"/>
<div class="sticky">
<div class="title_box virtual">发表评论</div>
<div class="flex flex-column ">
<el-input v-model="textarea2" style="width: 100%" type="textarea" placeholder="请输入内容" /><el-button
type="primary" @click="sendComment()">发表</el-button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, reactive, toRaw, watch, onMounted, onUnmounted } from "vue";
import CommentList from '../itemXs/commentList.vue'
import { getItem } from '@/utils/storage.js'
import { ElMessage, ElMessageBox } from 'element-plus'
import emitter from "@/utils/eventBus.js";
const emit = defineEmits(["updateDate"]);
const props = defineProps({
dict: {
type: Object,
default: () => ({})
}
});
const dialogForm = ref(false); //弹窗
const listQuery = ref({})
const textarea2 = ref()
const userInfo = ref(getItem('idEntityCard'))
// 初始化数据
const init = (row) => {
dialogForm.value = true;
// 根据id查询详情
if (row) {
qcckGet({ id: row }, "/mosty-gsxt/qbcj/selectByid").then((res) => {
listQuery.value = res;
});
cjpjSelectPage()
}
};
// 关闭
const close = () => {
dialogForm.value = false;
pagesData.pagebreak.pageCurrent = 1
};
const pagesData = reactive({
total: 0,
pagebreak: {
pageCurrent: 1,
pageSize: 10
},
listData: []
});
// 发送评论
const sendComment = () => {
const prmes = {
pldd: 'pc端发送',
plnr: textarea2.value,
cjid: listQuery.value.id,
dzs: 10
}
qcckPost(prmes, '/mosty-gsxt/gsxt/cjpj/add').then((res) => {
textarea2.value = ''; // 清空评论内容
cjpjSelectPage()
})
}
const pls=ref(0)
// 获取评论
const cjpjSelectPage = () => {
const prmes = {
...pagesData.pagebreak,
cjid: listQuery.value.id
}
qcckPost(prmes, '/mosty-gsxt/gsxt/cjpj/selectPage').then((res) => {
pagesData.listData = pagesData.pagebreak.pageCurrent == 1 ? res.records : pagesData.listData.concat(res.records)
pls.value=res.total
pagesData.total = res.pages
})
}
//回复消息
const postReply = (val) => {
qcckPost(val, '/mosty-gsxt/gsxt/cjhf/add').then((res) => {
ElMessage({
message: '回复成功',
type: 'success',
plain: true,
})
})
}
// 删除评论
const delComment = (val) => {
ElMessageBox.confirm(
'是否删除评论',
'警告',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
qcckPost([val], '/mosty-gsxt/gsxt/cjpj/remove ').then((res) => {
pagesData.pagebreak.pageCurrent= Math.ceil(pagesData.listData.length / pagesData.pagebreak.pageSize);
cjpjSelectPage()
ElMessage({
message: '删除成功',
type: 'success',
plain: true,
})
})
})
.catch(() => {
ElMessage({
type: 'info',
message: '取消删除',
})
})
}
//点赞
const cjpjZan = (val,data) => {
const promes = {
dzs: data,
id:val
}
qcckPost(promes, '/mosty-gsxt/gsxt/cjpj/gxdzs').then((res) => {
ElMessage({
message: '点赞成功',
type: 'success',
plain: true,
})
})
}
const disabled = ref(false)
defineExpose({ init });
const load = () => {
if (pagesData.pagebreak.pageCurrent < pagesData.total) {
pagesData.pagebreak.pageCurrent++
cjpjSelectPage()
} else {
disabled.value = true
}
}
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.boxlist {
width: 99%;
margin-top: 10px;
}
.content_box {
padding-top: 5px;
.title_box {
margin: 10px 0;
font-size: 20px;
font-weight: 700;
}
.virtual {
position: relative;
}
.virtual::after {
content: "";
height: 4px;
width: 70px;
position: absolute;
bottom: 0;
left: 0;
background: linear-gradient(90deg, rgba(0, 206, 255, 1) 0%, rgba(244, 244, 244, 1) 100%);
z-index: 10;
}
.sticky {
position: sticky;
bottom: -20px;
background-color: #fff;
padding: 10px 0;
}
.content_icon {
margin-top: 10px;
.icon_img {
width: 50px;
height: 50px;
border-radius: 50%;
margin-right: 10px;
img {
width: 100%;
height: 100%;
}
}
.align-space-around {
flex-wrap: wrap;
justify-content: space-between;
font-size: 12px;
color: #6e6e6e;
padding: 4px 0;
.publisher {
font-size: 16px;
font-weight: 600;
color: #000;
}
}
}
.content_text {
font-size: 16px;
margin: 20px 0;
// height: 40vh;
line-height: 30px;
overflow: auto;
color: #6c6c6c;
}
}
.itemXs_Xs {
width: 18%;
font-size: 14px;
color: #6c6c6c;
line-height: 20px;
display: flex;
align-items: center;
.icon {
font-size: 16px;
}
}
.flex-column {
align-items: flex-end
}
</style>

View File

@ -0,0 +1,75 @@
<template>
<div class="content_icon flex align-center">
<div class="icon_img"><img src="@/assets/images/ly-person-icon.png" alt=""></div>
<div class="align-space-around dir-column">
<div class="publisher">{{ item.ssbm }}{{ item.plrxm }}</div>
<div class="pubContent">{{ item.plnr }}</div>
<div class="itemXs_time flex">
<div>{{ item.pldd }}</div>
<div>{{ item.plsj }}</div>
<div>
<span @click.stop="openReply(index)">回复</span>&nbsp;&nbsp;
<span>删除</span>
</div>
</div>
<div class="pubContent flex" v-if="activeIndex === index" style="align-items: flex-end">
<el-input
v-model="textarea2"
style="flex: 1; margin-right: 10px;"
type="textarea"
placeholder="请输入内容"
/>
<el-button type="primary" @click="sendComment(item)">发表</el-button>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const emit = defineEmits(['postReply'])
const props = defineProps({
dict: {
type: Object,
default: () => ({})
},
item: {
type: Object,
default: () => ({})
},
index: {
type: Number,
default: 1
}, showIndex: {
type: Number,
default: 1
}
})
const textarea2 = ref('')
const activeIndex = ref(null)
const openReply = (index) => {
// 如果点击的是当前已打开的回复框,则关闭它
// 否则关闭其他回复框,打开当前点击的
// activeIndex.value = activeIndex.value === index ? null : index
textarea2.value = '' // 清空输入框内容
}
const sendComment = (item) => {
if (!textarea2.value.trim()) return // 防止发送空内容
const params = {
cjid: item.cjid,
plid: item.id,
hfdd: "Pc端发送",
hfnr: textarea2.value
}
emit('postReply', params)
// 发送后重置状态
textarea2.value = ''
activeIndex.value = null
}
</script>

View File

@ -0,0 +1,228 @@
<template>
<div class="content_icon flex align-center">
<div class="icon_img"><img src="@/assets/images/ly-person-icon.png" alt="" srcset=""></div>
<div class=" align-space-around dir-column">
<div class="publisher">{{ item.ssbm }}{{ item.plrxm }}</div>
<div class="pubContent">{{ item.plnr }}</div>
<div class="itemXs_time flex ">
<div> {{ item.pldd }}</div>
<div>{{ item.plsj }}</div>
<div><span @click="openReply(index)" class="hf">回复</span>
&nbsp;&nbsp;
<span class="del" @click="delComment(item)"
v-show="userInfo==item.plrsfzh"
>删除</span></div>
<div @click="showReply(item)" class="ck">查看回复</div>
<div @click="handleLike(item)" class="ck">点赞{{dzs }}</div>
</div>
<div class="pubContent flex" v-if="showInput" style="align-items: flex-end">
<el-input v-model="textarea2" style="flex: 1;margin-right: 10px;" type="textarea" placeholder="请输入内容" /><el-button
type="primary" @click="sendComment(item)">回复</el-button>
</div>
<div v-if="show">
<ReplyList :replyId="item" ref="replyList" :userInfo="userInfo"/>
</div>
</div>
</div>
</template>
<script setup>
import { ref ,computed} from 'vue'
import ReplyList from './replyList.vue'
const emit = defineEmits(['postReply','cjpjZan'])
const props = defineProps({
dict: {
type: Object,
default: () => ({})
}, item: {
type: Object,
default: () => ({})
},
index: {
type: Number,
default: 1
},
showList: {
type: Boolean,
default:false
}, userInfo: {
type: String,
default:''
}
});
const textarea2 = ref()
const showInput = ref(false)
const show = ref(false)
const dzsAdd = ref(0)
const dzs = computed(() => {
return props.item.dzs+dzsAdd.value
})
const openReply = () => {
showInput.value=! showInput.value
show.value=false
}
const replyList = ref()
const sendComment = (item) => {
const promes = {
cjid: item.cjid,
plid: item.id,
hfdd:"Pc端发送",
hfnr: textarea2.value
}
textarea2.value=''
emit('postReply',promes)
replyList.value? replyList.value.getList():""
}
const replyId = ref()
const showReply = (val) => {
show.value=!show.value
showInput.value=false
replyId.value=val
}
//删除评论
const delComment = (item) => {
emit('delComment', item.id)
}
function debounce(func, delay) {
let timer = null;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
const debouncedSubmitLike = debounce(async (item) => {
try {
await emit('cjpjZan', item.id, dzsAdd.value);
console.log('点赞成功');
} catch (error) {
console.error('点赞失败', error);
dzsAdd.value--;
}
}, 500);
const handleLike = (item) => {
dzsAdd.value++;
debouncedSubmitLike(item);
};
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.boxlist {
width: 99%;
margin-top: 10px;
}
.content_box {
padding-top: 5px;
.title_box {
margin: 10px 0;
font-size: 20px;
font-weight: 700;
}
.virtual {
position: relative;
}
.virtual::after {
content: "";
height: 4px;
width: 70px;
position: absolute;
bottom: 0;
left: 0;
background: linear-gradient(90deg, rgba(0, 206, 255, 1) 0%, rgba(244, 244, 244, 1) 100%);
z-index: 10;
}
.content_icon {
margin-top: 10px;
border-bottom: 1px solid #eee;
padding: 10px 0;
.icon_img {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
img {
width: 100%;
height: 100%;
}
}
.align-space-around {
width: calc(100% - 40px);
// flex-wrap: wrap;
font-size: 12px;
color: #6e6e6e;
padding: 4px 0;
.publisher {
font-size: 16px;
font-weight: 600;
color: #000;
}
.pubContent {
font-size: 16px;
line-height: 26px;
margin: 10px 0;
}
.itemXs_time {
justify-content: space-between;
width: 23%;
align-items: center;
color: #000;
cursor: pointer;
.del{
color: red;
}
.hf{
color: #49bb62;
}
.ck{
color: rgb(27, 115, 239);
}
}
}
}
.content_text {
margin: 20px 0;
height: 40vh;
overflow: auto;
color: #444444;
}
}
.itemXs_Xs {
width: 18%;
font-size: 14px;
color: #5c5c5c;
line-height: 20px;
display: flex;
align-items: center;
.icon {
font-size: 16px;
}
}
</style>

View File

@ -1,55 +1,72 @@
<template>
<div class="itemXs_Box">
<div class="itemXs_Box" :style="{color:fontColor,backgroundColor:bgColor}">
<div class="itemXs_Mc">
情报描述情报描述情报描述情报措述情描述情报描述情报描述情报描情报描述情报描述情报描述情报措述情描述情报描述情报描述情报描
{{ item.xsMc }}
</div>
<div class="itemXs_Ms">
情报描述情报描述情报描述情报措述情描述情报描述情报描述情报描情报描述情报描述情报描述情报措述情描述情报描述情报描述情报描
{{item.xsNr }}
</div>
<div class="itemXs_Xs flex just-between align-center">
<div class=" flex just-between align-center"><el-icon class="icon"><Histogram /></el-icon>1000</div>
<div class=" flex just-between align-center"><el-icon class="icon"><ChatDotSquare /></el-icon>15522</div>
<div class=" flex just-between align-center"><el-icon class="icon"><Clock /></el-icon>2025-10-10 10:10:10</div>
<div class=" flex just-between align-center"><el-icon class="icon"><Avatar /></el-icon>张三</div>
<div>情报类型测试数据</div>
<div class=" flex just-between align-center">
<el-icon class="icon"><Histogram /></el-icon>
{{item.rd?item.rd:0}}
</div>
<div class=" flex just-between align-center">
<el-icon class="icon"><ChatDotSquare /></el-icon>
{{item.pls?item.pls:0}}
</div>
<div class=" flex just-between align-center">
<el-icon class="icon"><Clock /></el-icon>
{{item.fbsj}}
</div>
<div class=" flex just-between align-center">
<el-icon class="icon"><Avatar /></el-icon>
{{item.fbrxm}}
</div>
<div class="flex align-center">情报类型
<DictTag :tag="false" :value="item.xlLx" color="#6c6c6c" :options="dict.D_GS_XS_LX" />
</div>
</div>
</div>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const props = defineProps({
item: {
type: Object,
default: () => { },
},
}, bgColor: {
type: String,
default: '#ffebee'
},fontColor:{
type:String,
default:'#de0909'
}, dict: {
type:Object,
default:()=>{}
}
})
</script>
<style lang="scss" scoped>
.itemXs_Box {
box-sizing: border-box;
border: 1px solid red;
// height: 100px;
width: 40%;
border-radius: 10px;
padding: 10px 15px;
width: 32.5%;
border-radius: 5px;
padding: 20px 10px;
max-height: 11vh;
.itemXs_Mc {
font-size: 16px;
font-weight: 700;
color: #de0909;
font-weight: 800;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
line-height: 20px;
line-height: 20px;
}
.itemXs_Ms {
color: #ccc;
color: #6c6c6c;
font-size: 14px;
overflow: hidden;
white-space: nowrap;
@ -57,11 +74,13 @@ line-height: 20px;
margin: 10px 0;
}
.itemXs_Xs{
font-size: 16px;
color: #ccc;
font-size: 12px;
color: #6c6c6c;
line-height: 20px;
display: flex;
align-items: center;
.icon{
font-size: 22px;
font-size: 18px;
}
}
}

View File

@ -0,0 +1,144 @@
<template>
<div class="content_icon flex align-center">
<div class="icon_img"><img src="@/assets/images/ly-person-icon.png" alt="" srcset=""></div>
<div class=" align-space-around dir-column">
<div class="publisher">{{ item.ssbm }}{{ item.hfrxm }}</div>
<div class="pubContent">{{ item.hfnr }}</div>
<div class="itemXs_time flex ">
<div> {{ item.hfdd }}</div>
<div>{{ item.hfsj }}</div>
<div><span class="del" @click="delComment(item)" v-show="userInfo==item.hfrsfzh">删除</span></div>
</div>
</div>
</div>
</template>
<script setup>
const emit=defineEmits(['postReply','delComment'])
const props = defineProps({
dict: {
type: Object,
default: () => ({})
}, item: {
type: Object,
default: () => ({})
},
index: {
type: Number,
default: 1
},
showList: {
type: Boolean,
default:false
},userInfo:{type:String,default:''}
});
const delComment = (item) => {
emit('delComment',item.id)
}
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.boxlist {
width: 99%;
margin-top: 10px;
}
.content_box {
padding-top: 5px;
.title_box {
margin: 10px 0;
font-size: 20px;
font-weight: 700;
}
.virtual {
position: relative;
}
.virtual::after {
content: "";
height: 4px;
width: 70px;
position: absolute;
bottom: 0;
left: 0;
background: linear-gradient(90deg, rgba(0, 206, 255, 1) 0%, rgba(244, 244, 244, 1) 100%);
z-index: 10;
}
.content_icon {
margin-top: 10px;
border-bottom: 1px solid #eee;
padding: 10px 0;
.icon_img {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
img {
width: 100%;
height: 100%;
}
}
.align-space-around {
width: calc(100% - 40px);
// flex-wrap: wrap;
font-size: 12px;
color: #6e6e6e;
padding: 4px 0;
.publisher {
font-size: 16px;
font-weight: 600;
color: #000;
}
.pubContent {
font-size: 16px;
line-height: 26px;
margin: 10px 0;
}
.itemXs_time {
justify-content: space-between;
width: 15%;
align-items: center;
color: #000;
.del{
color: red;
}
}
}
}
.content_text {
margin: 20px 0;
height: 40vh;
overflow: auto;
color: #444444;
}
}
.itemXs_Xs {
width: 18%;
font-size: 14px;
color: #5c5c5c;
line-height: 20px;
display: flex;
align-items: center;
.icon {
font-size: 16px;
}
}
</style>

View File

@ -0,0 +1,184 @@
<template>
<div>
<CommentList v-for="(item, index) in pagesData.listData" :key="index" :item="item" @delComment="cjhfRemove" :userInfo="userInfo"/>
<el-pagination v-if="pagesData.total > 10" v-model:current-page="pagesData.pagebreak.pageCurrent"
v-model:page-size="pagesData.pagebreak.pageSize" :size="10" :disabled="false" :total="pagesData.total"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
<div style="text-align: center;width: 100%;height: 20px;" v-if="pagesData.total == 0">暂无回复</div>
</div>
</template>
<script setup>
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, reactive, toRaw, watch, onMounted, onUnmounted } from "vue";
import CommentList from './lstItem.vue'
import { ElMessage, ElMessageBox } from 'element-plus'
const props = defineProps({
replyId: { type: Object, default: () => { } },
userInfo:{type:String,default:''}
});
const pagesData = reactive({
total: 0,
pagebreak: {
pageCurrent: 1,
pageSize: 10
},
listData: []
});
const handleSizeChange = (val) => {
pagesData.pagebreak.pageSize = val
getList()
}
const handleCurrentChange = (val) => {
pagesData.pagebreak.pageCurrent = val
getList()
}
//获取回复评论列表
const getList = () => {
const params = { ...pagesData.pagebreak, plid: props.replyId.id }
qcckPost(params, '/mosty-gsxt/gsxt/cjhf/selectPage').then(res => {
pagesData.listData = res.records
pagesData.total = res.total
// emitter.emit('pls',res.total)
})
}
// 删除评论
const cjhfRemove = (val) => {
ElMessageBox.confirm(
'是否删除评论',
'警告',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
qcckPost([val], '/mosty-gsxt/gsxt/cjhf/remove').then((res) => {
getList()
ElMessage({
message: '删除成功',
type: 'success',
plain: true,
})
})
})
.catch(() => {
ElMessage({
type: 'info',
message: '取消删除',
})
})
}
onMounted(() => {
getList()
})
defineExpose({
getList
})
</script>
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
.boxlist {
width: 99%;
margin-top: 10px;
}
.content_box {
padding-top: 5px;
.title_box {
margin: 10px 0;
font-size: 20px;
font-weight: 700;
}
.virtual {
position: relative;
}
.virtual::after {
content: "";
height: 4px;
width: 70px;
position: absolute;
bottom: 0;
left: 0;
background: linear-gradient(90deg, rgba(0, 206, 255, 1) 0%, rgba(244, 244, 244, 1) 100%);
z-index: 10;
}
.sticky {
position: sticky;
bottom: -20px;
background-color: #fff;
padding: 10px 0;
}
.content_icon {
margin-top: 10px;
.icon_img {
width: 50px;
height: 50px;
border-radius: 50%;
margin-right: 10px;
img {
width: 100%;
height: 100%;
}
}
.align-space-around {
flex-wrap: wrap;
justify-content: space-between;
font-size: 12px;
color: #6e6e6e;
padding: 4px 0;
.publisher {
font-size: 16px;
font-weight: 600;
color: #000;
}
}
}
.content_text {
font-size: 16px;
margin: 20px 0;
// height: 40vh;
line-height: 30px;
overflow: auto;
color: #444444;
}
}
.itemXs_Xs {
width: 18%;
font-size: 14px;
color: #5c5c5c;
line-height: 20px;
display: flex;
align-items: center;
.icon {
font-size: 16px;
}
}
.flex-column {
color: red;
}
</style>

View File

@ -8,25 +8,33 @@
<Search :searchArr="searchConfiger" @submit="onSearch" />
</div>
<!-- 表格 -->
<div class="tabBox " style="height: calc(100vh - 200px); display: flex;flex-wrap: wrap;">
<div v-for="(item, index) in 1000" :key="index" class="tabBox_item flex ">
<ItemXs :item="item" />
<div class="tabBox tabListBox" >
<div class="temperatureBox" ref="temperatureBox">
<div class="flex just-between temperature">
<div :class="{'active':pitchOn==1}" @click="handleAdd(1)">按热度</div>
<div>|</div>
<div :class="{'active':pitchOn==2}" @click="handleAdd(2)">按时间</div>
</div>
</div>
<div class="just-between boxData" :style="{height:tabHeight+'px'}">
<ItemXs :dict="{D_GS_XS_LX}" :item="item" v-for="(item, index) in pageData.tableData" :key="index" style="margin-bottom: 10px;" @click="handleView(item)"/>
</div>
</div>
</div>
<AddForm ref="addForm" :dict="{D_GS_XS_LX}"/>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import Search from "@/components/aboutTable/Search.vue";
import AddForm from './components/a/addForm.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import ItemXs from './components/itemXs/itemXs.vue'
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
const { proxy } = getCurrentInstance();
const { D_GS_XS_LX } = proxy.$dict("D_GS_XS_LX"); //获取字典数据
const searchConfiger = reactive([
{
label: "情报名称",
showType: "input",
@ -47,10 +55,11 @@ onMounted(() => {
tabHeightFn()
selectPagePbql()
})
// const tabHeight = ref(0)
const tabHeight = ref(0)
const temperatureBox=ref()
// 表格高度计算
const tabHeightFn = () => {
// pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
tabHeight.value = window.innerHeight - 370 - temperatureBox.value.offsetHeight;
window.onresize = function () {
tabHeightFn();
};
@ -58,7 +67,8 @@ const tabHeightFn = () => {
const pageData = reactive({
parameter: {
pageCurrent: 1,
pageSize: 10
pageSize: 10,
sort:"fbsj"
},
total: 0,
loading: false,
@ -69,9 +79,10 @@ const onSearch = (val) => {
pageData.pageCurrent = 1;
selectPagePbql()
}
const selectPagePbql = () => {
qcckGet(pageData.parameter, "/mosty-gsxt/qbcj/selectPagePbql").then((res) => {
pageData.tableData =pageData.pageCurrent==1? res.records:pageData.tableData.concat(res.records || []);
pageData.tableData =pageData.parameter.pageCurrent==1? res.records:pageData.tableData.concat(res.records || []);
pageData.total = res.total;
pageData.loading = false;
}).catch((err) => {
@ -80,9 +91,41 @@ const selectPagePbql = () => {
pageData.loading = false;
})
}
const pitchOn = ref(1)
//查看新闻
const addForm = ref()
const handleView = (row) => {
addForm.value.init(row.id)
}
const handleAdd = (val) => {
pageData.parameter.sort = val == 1 ? "fbsj" : "rd"
pageData.parameter.pageCurrent = 1;
pitchOn.value = val
selectPagePbql()
}
</script>
<style lang="scss" scoped>
.boxData{
display: flex;
flex-wrap: wrap;
overflow: auto;
}
.active{
color: #12a0ff;
}
.tabListBox{
padding: 10px 15px;
}
.temperatureBox{
margin: 10px 0;
width: 100%;
border-bottom: 1px solid #eee;
.temperature{
cursor: pointer;
padding: 10px;color: #000;width: 140px;
}
}
</style>

View File

@ -3,12 +3,16 @@
<div class="head_box">
<span class="title">{{ title }}情报信息流转</span>
<div>
<el-button type="primary" :loading="loading" @click="submit">保存</el-button>
<el-button type="primary" v-if="!listQuery.gzlid&&title!=='详情'" :loading="loading" @click="submit">保存</el-button>
<el-button @click="close">关闭</el-button>
</div>
</div>
<div class="form_cnt">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules">
<div class="flex">
<div class="form_cnt" :class="listQuery.gzlid&&title=='详情' ? 'ww80' : 'ww100'">
<FormMessage v-model="listQuery" :formList="formData" ref="elform" :rules="rules" :disabled="title == '详情'">
<template #gapdive>
<div style="width: 100%;height: 10px;" class="mb20">
<el-divider content-position="left">基础信息</el-divider>
@ -26,30 +30,32 @@
</div>
</template>
</FormMessage>
<el-divider content-position="left"><span class="mr20">相关人员</span> <el-button type="primary" size="small" @click="addEdit('add',null)">添加人员</el-button></el-divider>
<MyTable
:tableData="pageForm.tableData"
:tableColumn="pageForm.tableColumn"
:tableHeight="pageForm.tableHeight"
:key="pageForm.keyCount"
:tableConfiger="pageForm.tableConfiger"
:controlsWidth="pageForm.controlsWidth"
>
<template #xb="{row}">
<el-divider content-position="left"><span class="mr20">相关人员</span>
<el-button type="primary" size="small" @click="addEdit('add', null)" :disabled="title == '详情'">添加人员</el-button>
</el-divider>
<MyTable :tableData="pageForm.tableData" :tableColumn="pageForm.tableColumn" :tableHeight="pageForm.tableHeight"
:key="pageForm.keyCount" :tableConfiger="pageForm.tableConfiger" :controlsWidth="pageForm.controlsWidth">
<template #xb="{ row }">
<DictTag :value="row.xb" :tag="false" :options="props.dic.D_BZ_XB" />
</template>
<template #bqList="{row}">
<template #bqList="{ row }">
<div v-if="row.bqList">
<el-tag type="success" v-for="(it,idx) in row.bqList" :key="idx">{{ it.bqMc }}</el-tag >
<el-tag type="success" v-for="(it, idx) in row.bqList" :key="idx">{{ it.bqMc }}</el-tag>
</div>
</template>
<!-- 操作 -->
<template #controls="{ row,index }">
<el-link size="small" type="success" @click="addEdit('edit', row,index)">编辑</el-link>
<template #controls="{ row, index }">
<el-link size="small" type="success" @click="addEdit('edit', row, index)">编辑</el-link>
<el-link size="small" type="danger" @click="deleteRow(index)">删除</el-link>
</template>
</MyTable>
</div>
<div v-if="listQuery.gzlid&&title=='详情'" class="ww20">
<ApprovalEcho ref="approvalEcho" />
</div>
</div>
<!-- 人员 -->
<AddPeo ref="showAdd" v-model="showPeo" v-if="showPeo" :dic="props.dic" @change="getPeo"></AddPeo>
</div>
@ -61,7 +67,8 @@ import AddPeo from '@/components/addPerson/index.vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import FormMessage from "@/components/aboutTable/FormMessage.vue";
import { qcckGet, qcckPost, qcckPut } from "@/api/qcckApi.js";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick } from "vue";
import { ref, defineExpose, reactive, onMounted, defineEmits, getCurrentInstance, nextTick,watch } from "vue";
import ApprovalEcho from "@/components/flowPath/ApprovalEcho.vue";
const emit = defineEmits(["change"]);
const props = defineProps({
dic: Object
@ -74,17 +81,17 @@ const rules = reactive({
qbLy: [{ required: true, message: "请选择情报来源", trigger: "change" }],
});
const formData = ref([
{ prop: "gapdive", type: "slot",width:'100%' },
{ prop: "gapdive", type: "slot", width: '100%' },
{ label: "线索名称", prop: "xsMc", type: "input" },
{ label: "线索类型", prop: "xlLx", type: "select", options:props.dic.D_GS_XS_LX },
{ label: "情报来源", prop: "qbLy", type: "select", options:props.dic.D_GS_XS_LY},
{ label: "指向开始时间", prop: "zxkssj", type: "datetime"},
{ label: "指向结束时间", prop: "zxjssj", type: "datetime"},
{ label: "指向地点", prop: "zxdz", type: "input"},
{ label: "所属专题", prop: "sszt", type: "select",options:props.dic.D_BZ_SSZT},
{ prop: "gapline", type: "slot",width:'100%' },
{ prop: "scfj", type: "slot",width:'100%'},
{ label: "线索内容", prop: "xsNr", type: "textarea",width:'100%'},
{ label: "线索类型", prop: "xlLx", type: "select", options: props.dic.D_GS_XS_LX },
{ label: "情报来源", prop: "qbLy", type: "select", options: props.dic.D_GS_XS_LY },
{ label: "指向开始时间", prop: "zxkssj", type: "datetime" },
{ label: "指向结束时间", prop: "zxjssj", type: "datetime" },
{ label: "指向地点", prop: "zxdz", type: "input" },
{ label: "所属专题", prop: "sszt", type: "select", options: props.dic.D_BZ_SSZT },
{ prop: "gapline", type: "slot", width: '100%' },
{ prop: "scfj", type: "slot", width: '100%' },
{ label: "线索内容", prop: "xsNr", type: "textarea", width: '100%' },
]);
const fjdz = ref()
const listQuery = ref({}); //表单
@ -97,21 +104,22 @@ const pageForm = reactive({
tableConfiger: {
rowHieght: 61,
showSelectType: "checkBox",
loading: false
loading: false,
haveControls: !title.value == '详情'
},
controlsWidth: 220,
tableColumn: [
{ label: "姓名", prop: "xm" },
{ label: "性别", prop: "xb",showSolt:true },
{ label: "性别", prop: "xb", showSolt: true },
{ label: "身份证号", prop: "sfzh" },
{ label: "户籍地", prop: "hjdz" },
{ label: "户籍地派出所", prop: "hjdpcs" },
{ label: "标签", prop: "bqList",showSolt:true }
{ label: "标签", prop: "bqList", showSolt: true }
]
});
const showAdd = ref()
const showPeo = ref(false)
onMounted(()=>{
onMounted(() => {
tabHeightFn()
})
@ -125,50 +133,61 @@ const init = (type, row) => {
// 初始化表单数据,并根据详情页设置禁用状态
if (row) getDataById(row.id);
};
// 根据id查询详情
const getDataById = (id) => {
qcckGet({id}, "/mosty-gsxt/qbcj/selectByid").then((res) => {
qcckGet({ id }, "/mosty-gsxt/qbcj/selectByid").then((res) => {
fjdz.value = res.ossList || [];
listQuery.value = res;
pageForm.tableData = res.ryList || [];
});
};
const approvalEcho = ref()
watch(() => approvalEcho.value, (val) => {
if (val) {
console.log(approvalEcho.value);
approvalEcho.value.getWorkflow(listQuery.value.gzlid)
}
},{deep:true})
// 打开弹窗
const addEdit = (type,row,index) =>{
const addEdit = (type, row, index) => {
showPeo.value = true;
nextTick(()=>{
showAdd.value.init(type,row,index)
nextTick(() => {
showAdd.value.init(type, row, index)
})
}
// 新增人员
const getPeo = (val) =>{
if(val.type == '新增'){
const getPeo = (val) => {
if (val.type == '新增') {
pageForm.tableData.push(val.data);
}else{
} else {
pageForm.tableData.splice(val.index, 1, val.data); // 在索引2的位置删除一个元素并插入newValue
}
}
const deleteRow = (index) =>{
pageForm.tableData.splice(index,1)
const deleteRow = (index) => {
pageForm.tableData.splice(index, 1)
}
// 提交
const submit = () => {
elform.value.submit((data) => {
let url = title.value == "新增" ? "/mosty-gsxt/qbcj/add" : "/mosty-gsxt/qbcj/update";
let params = { ...data ,ryList:pageForm.tableData,cjLx:'0'};
let params = { ...data, ryList: pageForm.tableData, cjLx: '0' };
let fjids = [];
fjdz.value.forEach(item=>{
if(Object.prototype.toString.call(item) === '[object Object]'){
fjdz.value.forEach(item => {
if (Object.prototype.toString.call(item) === '[object Object]') {
fjids.push(item.id)
}else{
} else {
fjids.push(item)
}
})
params.fjdz = fjids.length > 0 ? fjids.join(','):'';
params.fjdz = fjids.length > 0 ? fjids.join(',') : '';
loading.value = true;
qcckPost(params, url).then((res) => {
loading.value = false;
@ -203,10 +222,12 @@ defineExpose({ init });
<style lang="scss" scoped>
@import "~@/assets/css/layout.scss";
@import "~@/assets/css/element-plus.scss";
::v-deep .el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
::v-deep .el-tabs--card>.el-tabs__header .el-tabs__item.is-active {
color: #0072ff;
background: rgba(0, 114, 255, 0.3);
}
.boxlist {
width: 99%;
height: 225px;
@ -214,17 +235,18 @@ defineExpose({ init });
overflow: hidden;
}
::v-deep .avatar-uploader{
::v-deep .avatar-uploader {
display: flex;
align-items: center;
}
::v-deep .el-upload-list{
::v-deep .el-upload-list {
margin-left: 20px;
display: flex;
align-items: center;
}
::v-deep .el-upload-list__item-name .el-icon{
::v-deep .el-upload-list__item-name .el-icon {
top: 3px;
}
</style>

View File

@ -44,9 +44,10 @@
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<template v-if="row.shzt === '0'">
</template>
<el-popover placement="left" :visible="row.visible" :width="400" trigger="click">
<!-- <el-popover placement="left" :visible="row.visible" :width="400" trigger="click">
<template #reference>
<el-link size="small" type="primary" @click.stop="handleSh(row)">审核</el-link>
</template>
@ -71,9 +72,13 @@
<el-button size="small" @click.stop="cancel(row)">取消</el-button>
<el-button size="small" type="primary" @click.stop="handleSumbit(row)">确定</el-button>
</div>
</el-popover>
</el-popover> -->
<template v-if="!row.gzlid">
<el-link size="small" type="success" @click="addEdit('edit', row)">编辑</el-link>
<el-link size="small" type="primary" @click.stop="createProcess(row)">审核</el-link>
<el-link size="small" type="danger" @click="delDictItem(row.id)">删除</el-link>
</template>
<el-link size="small" type="danger" @click="addEdit('info', row)">详情</el-link>
<!-- 续报 == 编辑 -->
<el-link size="small" type="warning" @click="addEdit('edit', row)">续报</el-link>
</template>
@ -91,6 +96,8 @@
<!-- 新增 -->
<AddForm ref="detailDiloag" @change="getList" v-if="isShow" :dic="{D_BZ_SF,D_BZ_XB,D_GS_XS_LY,D_BZ_SSZT,D_GS_XS_LX ,D_GS_XS_QTLX}" />
</div>
<SubmissionProcess v-model="showSp" :data="rowData" :userData="{ ajmc: '线索数据采集审批', flowType: 'XSSJCJSP',modelName:'线索' }"
:path="fixedValue" @getList="getList" />
</template>
<script setup>
@ -100,9 +107,11 @@ 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 SubmissionProcess from '@/components/flowPath/submissionProcess.vue'
import { qcckGet, qcckPost } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
const { proxy } = getCurrentInstance();
const {D_GS_XS_CZZT,D_GS_XS_LY, D_BZ_SSZT,D_BZ_SF,D_GS_XS_LX ,D_GS_XS_QTLX,D_BZ_XB,D_BZ_XSSHZT} = proxy.$dict("D_GS_XS_CZZT","D_GS_XS_LY","D_BZ_SSZT","D_BZ_SF","D_GS_XS_LX","D_GS_XS_QTLX","D_BZ_XB","D_BZ_XSSHZT"); //获取字典数据
@ -236,6 +245,21 @@ const tabHeightFn = () => {
tabHeightFn();
};
};
// 工作流
const showSp = ref(false);
const rowData = ref()
// 固定值
const fixedValue = {
clueVerification:'clueVerification',
byMeansOf: 'qbcj/callback',
nobyMeansOf: 'qbcj/callback',
recycle:'qbcj/callback',
}
const createProcess = (row) => {
showSp.value = true;
rowData.value = row
}
</script>
<style lang="scss" scoped>

View File

@ -39,6 +39,7 @@
<!-- 操作 -->
<template #controls="{ row }">
<el-link size="small" type="primary" @click="showDetail(row)">下发指令</el-link>
<el-link size="small" type="primary" @click="handleZL(row)">转为指令</el-link>
<el-link size="small" type="primary" @click="addEdit('detail', row)">详情</el-link>
</template>
@ -61,6 +62,9 @@
<Qbypfx v-if="showHome" @close="showHome = false"></Qbypfx>
</teleport>
</div>
<Information v-model="showDialog" title="发送指令" @submit='submit' @close='close'>
<SemdFqzl ref="semdFqzlRef" :itemData="itemData" @handleClose="handleClose" identification="qbcj" :tacitly="tacitly"/>
</Information>
</template>
<script setup>
@ -72,6 +76,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 Information from "@/views/home/model/information.vue";
import SemdFqzl from '@/components/instructionHasBeen/sendFqzl.vue'
import { qcckGet } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
@ -182,6 +188,27 @@ const tabHeightFn = () => {
tabHeightFn();
};
};
//下发指令
const showDialog = ref(false)
const itemData = ref()
const semdFqzlRef=ref()
const handleClose = () => {
showDialog.value = false;
}
const showDetail = (item) => {
showDialog.value = true;
itemData.value=item
}
const submit=()=>{
semdFqzlRef.value.getsendFqzl()
}
const close = () => {
semdFqzlRef.value.close()
}
const tacitly = {
title: 'xsMc',
instructionContent:'xsNr'
}
</script>
<style>

View File

@ -25,13 +25,13 @@
<!-- 右边 -->
<div class="home-aside asideR">
<div class="commom-aside-big">
<SituationAssessment/>
<SituationAssessment />
</div>
<div class="commom-aside-big">
<GroupWarning/>
<GroupWarning />
</div>
<div class="commom-aside-small">
<Experience/>
<Experience />
</div>
</div>
<!-- 中间 -->
@ -57,9 +57,27 @@
<!-- 左边弹窗 -->
<LeftDialog></LeftDialog>
<Fxq :initial-position="{ x: position.x, y: position.y }">
<el-badge value="0" class="item badge-top-left">
<div class='fxq fxq1'>
<div class="title" @click.stop="opneMsg('xtxx')"> <img src="@/assets/images/xtxx.png" /> 系统消息</div>
</div>
</el-badge>
<!-- <div class='fxq fxq2'>
<div class="title" @click.stop="opneMsg('tztg')"> <img src="@/assets/images/tztg.png" /> 通知通报</div>
</div>
<div class='fxq fxq3'>
<div class="title"> <img src="@/assets/images/xxxt.png" /> 消息协同</div>
</div> -->
</Fxq>
<Information v-model='showDialog' :title='title'>
<systemMessages :dict="{ BD_D_XXLX, BD_D_XXLY }" :idEntityCard='idEntityCard' :xxlx="showMsgLx" />
</Information>
</template>
<script setup>
import { ref, getCurrentInstance, reactive } from 'vue'
import LeftDialog from './dialog/leftDialog'
import GdMap from "@/components/GdMap/index.vue";
import Head from './layout/head.vue'
@ -70,17 +88,113 @@ import QblyType from './model/qblyType.vue'
import Bkcz from './model/bkcz.vue'
import ZdryWarning from './model/zdryWarning.vue'
import GroupWarning from './model/groupWarning.vue'
import Fjqk from './model/fjqk.vue'
import Yszs from './model/yszs.vue'
import DeployControl from './model/deployControl.vue';
import SituationAssessment from './model/situationAssessment.vue'
import Experience from './model/experience.vue'
import Fxq from './model/fxq.vue'
import Information from './model/information.vue'
import systemMessages from './model/mesgSwitch/systemMessages.vue'
import { getItem } from '@/utils/storage.js'
import { queryXxTj} from '@/api/commit.js'
const { proxy } = getCurrentInstance();
const { BD_D_XXLX, BD_D_XXLY } = proxy.$dict('BD_D_XXLX', 'BD_D_XXLY'); //获取字典数据
const idEntityCard = getItem('idEntityCard')
const position = reactive({
x: window.innerWidth - 120,
y: window.innerHeight - 100
})
//消息
const title = ref('系统消息')
const showDialog = ref(false)
const showMsgLx = ref('')
const opneMsg = (val) => {
showDialog.value = true
showMsgLx.value = val
switch (val) {
case 'xtxx':
title.value = '系统消息'
break;
case 'tztg':
title.value = '通知通告'
break;
case 'xxxt':
title.value = '消息协同'
break;
}
}
const queryXxTjList = () => {
queryXxTj({}).then((res) => {
console.log(res);
}).catch((err) => {
});
}
queryXxTjList()
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.transition {
transition: all 0.5s;
.fxq {
border-radius: 35px;
width: 35px;
transition: transform 0.5s ease, width 0.5s ease;
background-color: rgb(1, 127, 245);
transform-origin: left center;
overflow: hidden;
margin-bottom: 10px;
.icon {
display: flex;
align-items: center;
width: 35px;
height: 35px;
justify-content: center;
line-height: 35px;
font-size: 30px;
}
.title {
height: 35px;
line-height: 35px;
img {
margin-left: 9.5px;
width: 16px;
margin-right: 10px;
margin-top: -3px;
vertical-align: middle;
height: 16px;
}
}
}
.fxq2 {
background-color: #9d88f9;
}
.fxq1:hover {
width: 120px;
}
.fxq2:hover {
width: 120px;
// background-color: red;
}
.fxq3:hover {
width: 120px;
}
::v-deep .badge-top-left .el-badge__content {
top: 0;
right: auto;
left: -10px;
transform: translateY(-50%) translateX(-50%);
}
</style>

View File

@ -0,0 +1,194 @@
<template>
<div
class="floating-ball"
:style="ballStyle"
@mousedown="startDrag"
@touchstart="startDrag"
@click="handleClick"
>
<slot>
</slot>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const props = defineProps({
// 初始位置
initialPosition: {
type: Object,
default: () => ({ x: 0, y: 0 })
},
// 是否可拖动
draggable: {
type: Boolean,
default: true
},
// 自动吸附边缘的阈值
snapThreshold: {
type: Number,
default: 0
}
});
// watch(() => props.initialPosition, (newVal) => {
// position.value = { x: newVal.x, y: newVal.y };
// },{deep:true})
const emit = defineEmits(['click']);
const position = ref({ x: props.initialPosition.x, y: props.initialPosition.y });
const isDragging = ref(false);
const startPos = ref({ x: 0, y: 0 });
const startMousePos = ref({ x: 0, y: 0 });
const ballStyle = ref({
left: `${position.value.x}px`,
top: `${position.value.y}px`,
cursor: props.draggable ? 'move' : 'pointer'
});
// 开始拖动
const startDrag = (e) => {
if (!props.draggable) return;
isDragging.value = true;
startPos.value = { ...position.value };
// 处理鼠标和触摸事件
if (e.type === 'mousedown') {
startMousePos.value = { x: e.clientX, y: e.clientY };
} else if (e.type === 'touchstart') {
startMousePos.value = { x: e.touches[0].clientX, y: e.touches[0].clientY };
}
// 阻止默认行为和冒泡
e.preventDefault();
e.stopPropagation();
};
// 处理移动
const handleMove = (e) => {
if (!isDragging.value) return;
let clientX, clientY;
if (e.type === 'mousemove') {
clientX = e.clientX;
clientY = e.clientY;
} else if (e.type === 'touchmove') {
clientX = e.touches[0].clientX;
clientY = e.touches[0].clientY;
}
const dx = clientX - startMousePos.value.x;
const dy = clientY - startMousePos.value.y;
position.value = {
x: startPos.value.x + dx,
y: startPos.value.y + dy
};
updatePosition();
};
// 结束拖动
const endDrag = () => {
if (!isDragging.value) return;
isDragging.value = false;
snapToEdge();
};
// 自动吸附到边缘
const snapToEdge = () => {
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
// 检查是否靠近左右边缘
if (position.value.x < props.snapThreshold) {
position.value.x = 0;
} else if (position.value.x > windowWidth - props.snapThreshold) {
position.value.x = windowWidth;
}
// 检查是否靠近上下边缘
if (position.value.y < props.snapThreshold) {
position.value.y = 0;
} else if (position.value.y > windowHeight - props.snapThreshold) {
position.value.y = windowHeight;
}
updatePosition();
};
// 更新位置样式
const updatePosition = () => {
ballStyle.value = {
...ballStyle.value,
left: `${position.value.x}px`,
top: `${position.value.y}px`
};
};
// 点击事件
const handleClick = (e) => {
if (isDragging.value) {
// 如果是拖动结束的点击,不触发点击事件
isDragging.value = false;
return;
}
emit('click', e);
};
// 添加事件监听
onMounted(() => {
window.addEventListener('mousemove', handleMove);
window.addEventListener('touchmove', handleMove);
window.addEventListener('mouseup', endDrag);
window.addEventListener('touchend', endDrag);
});
// 移除事件监听
onUnmounted(() => {
window.removeEventListener('mousemove', handleMove);
window.removeEventListener('touchmove', handleMove);
window.removeEventListener('mouseup', endDrag);
window.removeEventListener('touchend', endDrag);
});
</script>
<style scoped>
.floating-ball {
position: fixed;
cursor: pointer;
width: 50px;
padding: 10px;
/* height: 50px; */
/* border-radius: 50%; */
/* background-color: #409eff; */
color: white;
/* display: flex;
justify-content: center;
align-items: center; */
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
z-index: 9999;
user-select: none;
/* transition: all 0.3s ease; */
transform: translate(-50%, -50%);
}
.ball-content {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
.icon {
font-size: 24px;
}
.floating-ball:active {
opacity: 0.8;
}
</style>

View File

@ -0,0 +1,53 @@
<template>
<el-dialog class="dialog-container"
:model-value="modelValue"
:title="title"
:before-close="close" :destroy-on-close="true"
>
<slot></slot>
<template #footer v-if="showFooter">
<div class="dialog-footer" >
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submit">
确认
</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import {ref} from 'vue'
const props=defineProps({
modelValue: {
type: Boolean,
required: true
},title:{
type:String,
default:'提示'
},showFooter:{
type:Boolean,
default:true
}
})
const emit=defineEmits(['update:modelValue','submit','close'])
const close = () => {
emit('update:modelValue',false)
emit('close')
}
const submit=()=>{
emit('submit')
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
::v-deep .el-dialog__body{
padding-top: 0 !important;
padding-bottom: 0 !important;
}
</style>

View File

@ -0,0 +1,186 @@
<template>
<!-- <el-button type="success" style='position: absolute;right:30px;'>一键忽略</el-button> -->
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="chageHandle">
<el-tab-pane label="未查看" name="first">
<MyTable customClass="zdy_peo_table" :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth">
<template #xxly="{ row }">
<DictTag :tag="false" :value="row.xxly" :options="dict.BD_D_XXLY" />
</template>
<template #xxlx="{ row }">
<DictTag :tag="false" :value="row.xxlx" :options="dict.BD_D_XXLX" />
</template>
<template #controls="{ row }">
<el-button size="small" type="primary" @click="handleDetail(row)">查看</el-button>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</el-tab-pane>
<el-tab-pane label="已查看" name="second">
<MyTable customClass="zdy_peo_table" :tableData="pageData.tableData" :tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight" :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth">
<template #xxly="{ row }">
<DictTag :tag="false" :value="row.xxly" :options="dict.BD_D_XXLY" />
</template>
<template #xxlx="{ row }">
<DictTag :tag="false" :value="row.xxlx" :options="dict.BD_D_XXLX" />
</template>
<template #controls="{ row }">
<el-button size="small" type="primary" @click="handleDetail(row)">查看</el-button>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"></Pages>
</el-tab-pane>
</el-tabs>
<Information v-model='showDialog' title='消息详情' :showFooter="false">
<Xtxi :item="msgDetail" v-if="xxlx == 'xtxx'" :dict="dict" />
</Information>
</template>
<script setup>
import { ref, reactive } from 'vue'
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Information from "@/views/home/model/information.vue";
import { queryYdxxPageList, queryWdxxPageList, queryWdxxDetail, queryYdxxDetail, qsXx } from '@/api/commit.js'
import Xtxi from './xtxi.vue'
const props = defineProps({
dict: {
type: Object,
default: () => {
}
}, idEntityCard: {
type: String,
default: ''
}, xxlx: {
type: String,
default: 'xtxx'
}
})
const activeName = ref('first')
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
loading: false,
rowHieght: 40,
haveControls: true,
},
controlsWidth: 160, //操作栏宽度
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
tableColumn: [
{ label: "消息标题", prop: "xxbt", showOverflowTooltip: true },
{ label: "消息来源", prop: "xxly", showOverflowTooltip: true, showSolt: true },
{ label: "消息描述", prop: "xxms", showOverflowTooltip: true },
{ label: "消息类型", prop: "xxlx", showOverflowTooltip: true, showSolt: true },
], tableHeight: "calc(80vh - 350px)",
});
const chageHandle = () => {
pageData.pageConfiger.pageCurrent = 1
pageData.pageConfiger.pageSize = 20
handleClick()
}
//请求数据
const handleClick = async () => {
let promes = {
page: pageData.pageConfiger.pageCurrent,
rows: pageData.pageConfiger.pageSize,
xxly: '005',
jsrid: props.idEntityCard,
// jsrid: '540422200010197495',
xxlx: ""
}
switch (props.xxlx) {
case 'xtxx':
promes.xxlx = 100
const res = activeName.value == 'first' ? await queryWdxxPageList(promes) : await queryYdxxPageList(promes)
pageData.tableData = res.rows
pageData.total = res.total
break;
case 'tztg':
promes.xxlx = 200
const tztgRes = activeName.value == 'first' ? await queryWdxxPageList(promes) : await queryYdxxPageList(promes)
pageData.tableData = tztgRes.rows
pageData.total = tztgRes.total
break;
default:
break;
}
}
const changeNo = (val) => {
pageData.pageConfiger.pageCurrent = val
handleClick()
}
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val
handleClick()
}
handleClick()
// 查看详情
const showDialog = ref(false)
const msgDetail = ref({})
const disposition = (item) => {
let arrId = ''
if (Array.isArray(item)) {
const itemMap = item.map(it => {
return it.id
})
arrId = itemMap.join(',')
} else {
arrId = item.id
}
const promes = {
xxlx: '100',
id: arrId
}
qsXx(promes).then((result) => {
handleClick()
}).catch((err) => {
console.log(err);
});
}
const handleDetail = async (item) => {
showDialog.value = true
const res = activeName.value == 'first' ? await queryWdxxDetail({ id: item.id }) : await queryYdxxDetail({ id: item.id })
if (res) {
msgDetail.value = res[0]
if (msgDetail.value.qszt == '0') {
disposition(item)
}
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.zdy_peo_table td.el-table__cell {
color: #ffffff !important;
}
.zdy_peo_table th.el-table__cell {
color: #ffffff !important;
font-size: 15px;
}
.zdy_peo_table .el-table__body tr.el-table__row--striped td.el-table__cell {
background: transparent !important;
}
.zdy_peo_table .table_blue_row {
background: linear-gradient(to right, #001D4B 0%, rgba(0, 29, 75, 0.1) 100%) !important;
}
</style>

View File

@ -0,0 +1,53 @@
<template>
<div style="height: 300px;overflow: auto;font-size: 16px;">
<div>通知标题{{ item.xxbt }}</div>
<div class="mt">通知内容{{ item.xxms }}</div>
<div class="flex align-center just-between mt">
<div class="flex align-center">接收类型
<DictTag :tag="false" :value="item.xxlx" :options="dict.BD_D_XXLX" />
</div>
<div class="flex align-center">消息来源
<DictTag :tag="false" :value="item.xxly" :options="dict.BD_D_XXLY" />
</div>
</div>
</div>
</template>
<script setup>
import {ref} from 'vue'
const props = defineProps({
item: {
type: Object,
default: () => {
}
}, dict: {
type: Object,
default: () => {
}
},
})
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.zdy_peo_table td.el-table__cell {
color: #ffffff !important;
}
.zdy_peo_table th.el-table__cell {
color: #ffffff !important;
font-size: 15px;
}
.zdy_peo_table .el-table__body tr.el-table__row--striped td.el-table__cell {
background: transparent !important;
}
.zdy_peo_table .table_blue_row {
background: linear-gradient(to right, #001D4B 0%, rgba(0, 29, 75, 0.1) 100%) !important;
}
.mt {
margin-top: 20px;
}
</style>

View File

@ -0,0 +1,53 @@
<template>
<div style="height: 300px;overflow: auto;font-size: 16px;">
<div>通知标题{{ item.xxbt }}</div>
<div class="mt">通知内容{{ item.xxms }}</div>
<div class="flex align-center just-between mt">
<div class="flex align-center">接收类型
<DictTag :tag="false" :value="item.xxlx" :options="dict.BD_D_XXLX" />
</div>
<div class="flex align-center">消息来源
<DictTag :tag="false" :value="item.xxly" :options="dict.BD_D_XXLY" />
</div>
</div>
</div>
</template>
<script setup>
import {ref} from 'vue'
const props = defineProps({
item: {
type: Object,
default: () => {
}
}, dict: {
type: Object,
default: () => {
}
},
})
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.zdy_peo_table td.el-table__cell {
color: #ffffff !important;
}
.zdy_peo_table th.el-table__cell {
color: #ffffff !important;
font-size: 15px;
}
.zdy_peo_table .el-table__body tr.el-table__row--striped td.el-table__cell {
background: transparent !important;
}
.zdy_peo_table .table_blue_row {
background: linear-gradient(to right, #001D4B 0%, rgba(0, 29, 75, 0.1) 100%) !important;
}
.mt {
margin-top: 20px;
}
</style>

View File

@ -4,11 +4,18 @@ function resolve(dir) {
return path.join(__dirname, dir);
}
const serverHost = "http://192.168.1.32:8066"//波哥
const serverHost = "http://192.168.1.32:8006"//波哥
// const serverHost = "http://192.168.0.231:8006"//线上
// const serverHost = "http://192.168.1.117:8006"//周
// const serverHost = "http://192.168.1.98:8006"//毛毛
module.exports = {
// configureWebpack: {
// resolve: {
// alias: {
// vue: '@vue/compat'
// }
// }
// },
publicPath: "./",
outputDir: "gsxt",
assetsDir: "static",
@ -44,6 +51,15 @@ module.exports = {
changeOrigin: true,
logLevel: "debug"
},
"/": {
target: "http://192.168.0.101:32001",
changeOrigin: true,
logLevel: "debug",
onProxyReq(proxyReq) {
// 在这里添加固定的 Cookie
proxyReq.setHeader('Cookie', 'clientKey-temp=1c2db6cac7dd405fb33c2a6725337925; static_version_fpip-manage=1.222; clientKey=30842687f48c4ed1818dbc45a0cdd4e1; static_version_fpip-jgpt=1.222; static_version_fpip-mdjf=1.222; static_version_fpip-tddx=1.222; static_version_fpip-dtbd=1.222; static_version_fpip-qzgl=1.222; static_version_fpip-bzdz=1.222; static_version_fpip-pcsgl=1.222; static_version_fpip-sydw=1.222')
},
},
"/chat": {
target: 'https://api.deepseek.com/chat/',
changeOrigin: true,
@ -54,6 +70,11 @@ module.exports = {
},
}
},
// resolve: {
// alias: {
// vue: '@vue/compat' // 强制使用兼容模式
// }
// },
chainWebpack(config) {
// 设置 svg-sprite-loader
// config 为 webpack 配置对象