Browse Source

20250512

main
wxc 9 months ago
parent
commit
2cb8b583b4
  1. 52
      index.html
  2. 1
      package.json
  3. BIN
      public/imgs/police.png
  4. 22
      src/api/datav.ts
  5. 7
      src/api/mobileSupervision/inspection.ts
  6. 22
      src/api/mobileSupervision/selfexamination.ts
  7. 9
      src/api/mobileSupervision/taskProblem.ts
  8. 7
      src/api/mobileSupervision/testingAlcohol.ts
  9. 7
      src/api/system/user.ts
  10. 2
      src/components/datav/statistic.vue
  11. 11
      src/components/date-time-range-picker-ext.vue
  12. 3
      src/components/file/upload-group.vue
  13. 9
      src/components/home/work/my-comfort.vue
  14. 8
      src/components/negative/add.vue
  15. 4
      src/components/negative/dialog.vue
  16. 62
      src/components/police-picker.vue
  17. 190
      src/components/quill-editor.vue
  18. 1
      src/components/video-play.vue
  19. 10
      src/layout/components/Aside.vue
  20. 3
      src/style/public.scss
  21. 58
      src/views/data/Gabxf.vue
  22. 52
      src/views/data/Gjxf.vue
  23. 2
      src/views/data/Mail12337.vue
  24. 393
      src/views/data/PetitionComplaint.vue
  25. 5
      src/views/data/VideoInspection.vue
  26. 298
      src/views/datav/AuditSuper.vue
  27. 20
      src/views/datav/CaseVerif.vue
  28. 56
      src/views/datav/Global.vue
  29. 2
      src/views/datav/Lmgz.vue
  30. 51
      src/views/datav/MailVisits.vue
  31. 326
      src/views/datav/RightsComfort.vue
  32. 150
      src/views/datav/SceneInsp.vue
  33. 41
      src/views/datav/VideoInsp.vue
  34. 2
      src/views/datav/subonedatav/SubOneAuditSuper.vue
  35. 2
      src/views/datav/subonedatav/SubOneCaseVerif.vue
  36. 2
      src/views/datav/subonedatav/SubOneGlobal.vue
  37. 2
      src/views/datav/subonedatav/SubOneMailVisits.vue
  38. 2
      src/views/datav/subonedatav/SubOneRightsComfort.vue
  39. 66
      src/views/datav/subonedatav/SubOneSceneInsp.vue
  40. 26
      src/views/datav/subonedatav/SubOneVideoInsp.vue
  41. 206
      src/views/mobileSupervise/Inspection.vue
  42. 464
      src/views/mobileSupervise/Selfexamination.vue
  43. 175
      src/views/mobileSupervise/TaskProblem.vue
  44. 376
      src/views/mobileSupervise/TestingAlcohol.vue
  45. 1
      src/views/sensitivePerception/Model.vue
  46. 4
      src/views/sensitivePerception/ModelClueManual.vue
  47. 29
      src/views/system/Police.vue
  48. 97
      src/views/system/User.vue
  49. 4
      src/views/system/VideoConfig.vue
  50. 1
      src/views/system/Wqzg.vue
  51. 1
      src/views/work/BatchDistribute.vue
  52. 10
      src/views/work/Done.vue
  53. 1
      src/views/work/MyCountersign.vue
  54. 18
      src/views/work/Query.vue
  55. 6
      src/views/work/Todo.vue

52
index.html

@ -10,7 +10,59 @@
</head> </head>
<body> <body>
<script>
function getBrowse() {
var browser = {};
var userAgent = navigator.userAgent.toLowerCase();
var s;
(s = userAgent.match(/msie ([\d.]+)/)) ? browser.ie = s[1] : (s = userAgent.match(/firefox\/([\d.]+)/)) ? browser.firefox = s[1] : (s = userAgent.match(/chrome\/([\d.]+)/)) ? browser.chrome = s[1] : (s = userAgent.match(/opera.([\d.]+)/)) ? browser.opera = s[1] : (s = userAgent.match(/version\/([\d.]+).*safari/)) ? browser.safari = s[1] : 0;
var version = "";
if (browser.ie) {
version = 'IE ' + browser.ie;
}
else {
if (browser.firefox) {
version = 'firefox ' + browser.firefox;
}
else {
if (browser.chrome) {
version = 'chrome ' + browser.chrome;
}
else {
if (browser.opera) {
version = 'opera ' + browser.opera;
}
else {
if (browser.safari) {
version = 'safari ' + browser.safari;
}
else {
version = '未知浏览器';
}
}
}
}
}
return version;
}
function isWin64() {
var agent = navigator.userAgent.toLowerCase();// 获取window的CPU
return agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0;
}
var browseVersion = getBrowse();
console.log('浏览器版本', browseVersion)
var arr = browseVersion.split(' ')
var browse = arr[0];
var version = parseInt(arr[1].substr(0, arr[1].indexOf('.')));
if (browse === 'IE' || (browse === 'chrome' && version < 80)) {
var result = confirm(`系统检测到您的浏览器版本[${browseVersion}]太低可能会影响使用,请升级浏览器版本`);
if (result) {
}
}
</script>
<div id="app"></div> <div id="app"></div>
<script type="module" src="/src/main.ts"></script> <script type="module" src="/src/main.ts"></script>
<script src="/js/authen.js"></script> <script src="/js/authen.js"></script>

1
package.json

@ -32,6 +32,7 @@
"@univerjs/ui": "^0.2.5", "@univerjs/ui": "^0.2.5",
"@vue-office/docx": "^1.6.0", "@vue-office/docx": "^1.6.0",
"@vue-office/excel": "^1.7.11", "@vue-office/excel": "^1.7.11",
"@vueup/vue-quill": "^1.2.0",
"amfe-flexible": "^2.2.1", "amfe-flexible": "^2.2.1",
"baidu-map-vue3": "^0.4.9", "baidu-map-vue3": "^0.4.9",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",

BIN
public/imgs/police.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

22
src/api/datav.ts

@ -41,8 +41,22 @@ export function getRecentlyMailTrend12337(query) {
}); });
} }
export function getAuditOverview(time) {
return request.get({
url: `/datav/audit/overview`,
query: {
beginTime: time[0],
endTime: time[1]
}
});
}
export function getAuditProblems(time) {
return request.get({
url: `/datav/audit/problems`,
query: {
beginTime: time[0],
endTime: time[1]
}
});
}

7
src/api/mobileSupervision/inspection.ts

@ -13,3 +13,10 @@ export function listInspection(query) {
query query
}); });
} }
export function listInspectionProblems(taskId, query) {
return request.get({
url: `/task/inspection/${taskId}/problem`,
query
});
}

22
src/api/mobileSupervision/selfexamination.ts

@ -0,0 +1,22 @@
import request from "@/api/request";
export function listSelfexamination(query) {
return request.get({
url: '/task/selfexamination',
query
});
}
export function getSelfexaminationDetail(id) {
return request.get({
url: '/task/selfexamination/' + id
});
}
export function addSelfexamination(body) {
return request.post({
url: '/task/selfexamination',
body
});
}

9
src/api/mobileSupervision/taskProblem.ts

@ -0,0 +1,9 @@
import request from "@/api/request";
export function listTaskProblem(query) {
return request.get({
url: '/task/problem',
query
});
}

7
src/api/mobileSupervision/testingAlcohol.ts

@ -20,3 +20,10 @@ export function listTestingAlcohol(query) {
query query
}); });
} }
export function listTestingAlcoholPeoples(taskId, query) {
return request.get({
url: `/task/testingAlcohol/${taskId}/people`,
query
});
}

7
src/api/system/user.ts

@ -20,3 +20,10 @@ export function updateUser(body) {
body body
}); });
} }
export function updateUserPassword(body) {
return request.put({
url: '/user/password',
body
});
}

2
src/components/datav/statistic.vue

@ -38,7 +38,7 @@ const outputValue = useTransition(value, {
<style lang="scss" scoped> <style lang="scss" scoped>
.statistic { .statistic {
text-align: center; text-align: center;
cursor: pointer;
.statistic-number { .statistic-number {
font-size: 39px; font-size: 39px;
font-weight: 700; font-weight: 700;

11
src/components/date-time-range-picker-ext.vue

@ -19,6 +19,15 @@ const shortcuts = [
return [start, end]; return [start, end];
}, },
}, },
{
text: "今年",
value: () => {
const end = new Date();
const currentYear = new Date().getFullYear();
const start = new Date(currentYear, 0, 1);
return [start, end];
},
},
{ {
text: "近一周", text: "近一周",
value: () => { value: () => {
@ -45,7 +54,7 @@ const shortcuts = [
start.setMonth(start.getMonth() - 3) start.setMonth(start.getMonth() - 3)
return [start, end]; return [start, end];
}, },
}, }
]; ];
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

3
src/components/file/upload-group.vue

@ -72,7 +72,7 @@
<div class="flex gap v-center"> <div class="flex gap v-center">
<el-select <el-select
style="width: 200px" style="width: 200px"
v-model="item.classId" v-model="item.fileClassId"
clearable clearable
v-if="fileClasss.length" v-if="fileClasss.length"
> >
@ -289,6 +289,7 @@ function cancelFileClass(item) {
} }
function handleSubmit() { function handleSubmit() {
console.log(fileList.value.filter((item) => item.filePath))
emit( emit(
"update:files", "update:files",
fileList.value.filter((item) => item.filePath) fileList.value.filter((item) => item.filePath)

9
src/components/home/work/my-comfort.vue

@ -53,8 +53,7 @@
link link
type="primary" type="primary"
@click="handleReSubmit(row)" @click="handleReSubmit(row)"
>重新提交</el-button >重新提交</el-button> -->
> -->
<el-button <el-button
link link
type="danger" type="danger"
@ -71,7 +70,7 @@
<comfort-dialog <comfort-dialog
v-model:show="show" v-model:show="show"
:id="activeRpcId" :id="activeRpcId"
:disabled="false" :disabled="dialogDisabled"
@update="emit('update')" @update="emit('update')"
/> />
</template> </template>
@ -96,9 +95,11 @@ const emit = defineEmits(["update"]);
const show = ref(false); const show = ref(false);
const activeRpcId = ref(''); const activeRpcId = ref('');
function handleShow(row) { const dialogDisabled = ref(true);
function handleShow(row, disabled) {
show.value = true; show.value = true;
activeRpcId.value = row.rpcId; activeRpcId.value = row.rpcId;
dialogDisabled.value = disabled
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

8
src/components/negative/add.vue

@ -54,14 +54,6 @@
> >
<el-select <el-select
v-model="form.businessTypeCode" v-model="form.businessTypeCode"
@change="
(val) =>
(form.businessTypeName =
dict.businessType.filter(
(item) =>
item.dictValue === val
)[0].dictLabel)
"
> >
<el-option <el-option
v-for="item in dict.businessType" v-for="item in dict.businessType"

4
src/components/negative/dialog.vue

@ -98,7 +98,9 @@
dict.timeLimit, dict.timeLimit,
negative.timeLimit negative.timeLimit
) )
}}</span> }}
<span v-if="negative.timeLimit === 'other'">({{negative.maxSignDuration}}个工作日签收{{negative.maxHandleDuration}}个工作日办理延期不超过{{negative.maxExtensionDuration}})</span>
</span>
</div> </div>
<div <div
class="col col-24" class="col col-24"

62
src/components/police-picker.vue

@ -1,13 +1,13 @@
<template> <template>
<div class="flex gap"> <div class="flex gap">
<el-tag type="info" effect="plain" closable v-for="item in modelValue" :key="item">{{ item.name }}</el-tag> <el-tag type="info" effect="plain" closable v-for="(item, index) in modelValue" :key="item" @close="handleRemove(index)">{{ item.name }}</el-tag>
<el-button size="small" type="primary" plain @click="show = true"> <el-button size="small" type="primary" plain @click="show = true">
<template #icon> <template #icon>
<icon name="el-icon-Plus" /> <icon name="el-icon-Plus" />
</template> </template>
</el-button> </el-button>
</div> </div>
<el-dialog title="选择警员" v-model="show" width="60vw" top="5vh"> <el-dialog title="选择警员" v-model="show" width="50vw" top="5vh">
<div style="min-height: 70vh"> <div style="min-height: 70vh">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="6"> <el-col :span="6">
@ -16,33 +16,34 @@
:data="treeData" :data="treeData"
:props="{ label: 'shortName', value: 'id' }" :props="{ label: 'shortName', value: 'id' }"
:default-expanded-keys="['12630']" :default-expanded-keys="['12630']"
node-key="id"
@node-click="handleSelectDepart" @node-click="handleSelectDepart"
/> />
</el-scrollbar> </el-scrollbar>
</el-col> </el-col>
<el-col :span="18"> <el-col :span="18">
<header class="flex between mb-20"> <header class="flex between mb-20">
<div class="flex gap"> <el-form class="flex gap wrap">
<el-input <el-input
placeholder="警员姓名" placeholder="警员姓名"
v-model="query.name" v-model="query.name"
clearable clearable
style="width: 220px" style="width: 190px"
/> />
<el-input <el-input
placeholder="请输入" placeholder="请输入"
v-model="query.empNo" v-model="query.empNo"
clearable clearable
style="width: 220px" style="width: 190px"
/> />
<el-input <el-input
placeholder="身份证号码" placeholder="身份证号码"
v-model="query.idCode" v-model="query.idCode"
clearable clearable
style="width: 220px" style="width: 190px"
/> />
</div> </el-form>
<el-button type="primary">查询</el-button> <el-button type="primary" @click="getList">查询</el-button>
</header> </header>
<div class="table-container"> <div class="table-container">
<el-table <el-table
@ -50,6 +51,7 @@
row-key="id" row-key="id"
max-height="890px" max-height="890px"
@selection-change="selectionChange" @selection-change="selectionChange"
v-loading="loading"
> >
<el-table-column type="selection" width="55" /> <el-table-column type="selection" width="55" />
<el-table-column <el-table-column
@ -63,20 +65,6 @@
width="100" width="100"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column
label="所属机构"
show-overflow-tooltip
>
<template #default="{ row }">
<div class="flex gap-4">
<span v-if="row.parentDepartShortName"
>{{
row.parentDepartShortName
}}/</span
><span>{{ row.departShortName }}</span>
</div>
</template>
</el-table-column>
<el-table-column <el-table-column
label="人员属性" label="人员属性"
width="120" width="120"
@ -135,9 +123,10 @@
<div class="flex gap mt-10 wrap v-center"> <div class="flex gap mt-10 wrap v-center">
<span>已选警员</span> <span>已选警员</span>
<el-tag <el-tag
v-for="item in checkPolices" v-for="(item, index) in checkPolices"
:key="item" :key="item"
closable closable
@close="handleRemove(index)"
>{{ item.name }}</el-tag >{{ item.name }}</el-tag
> >
</div> </div>
@ -163,6 +152,9 @@ const props = defineProps({
modelValue: { modelValue: {
type: Array, type: Array,
default: [] default: []
},
departId: {
type: String
} }
}); });
@ -170,29 +162,40 @@ const emit = defineEmits(['update:modelValue'])
const show = ref(false); const show = ref(false);
const query = ref({ const query = ref({
departBranch: true, departBranch: true
}); });
watch(() => props.departId, (val) => {
query.value.departId = val;
getList()
})
const total = ref(0); const total = ref(0);
const treeData = catchSotre.getDepartsAll(); const treeData = catchSotre.getDepartsAll();
const polices = ref([]); const polices = ref([]);
const loading = ref(false)
function getList() { function getList() {
loading.value = true
listPolice(query.value).then((data) => { listPolice(query.value).then((data) => {
polices.value = data.records; polices.value = data.records;
total.value = data.total; total.value = data.total;
loading.value = false
}); });
} }
const checkPolices = ref([]); const checkPolices = ref([]);
function selectionChange(selectionRows) { function selectionChange(selectionRows) {
checkPolices.value = selectionRows.map(item => { selectionRows.forEach(item => {
return { if (checkPolices.value.findIndex(o => o.empNo === item.empNo) === -1) {
checkPolices.value.push({
name: item.name, name: item.name,
empNo: item.empNo, empNo: item.empNo,
idCode: item.idCode idCode: item.idCode
})
} else {
} }
}); })
} }
function handleSelectDepart(node) { function handleSelectDepart(node) {
@ -200,6 +203,11 @@ function handleSelectDepart(node) {
getList(); getList();
} }
function handleRemove(index) {
checkPolices.value.splice(index, 1)
emit('update:modelValue', checkPolices.value)
}
function submit() { function submit() {
emit('update:modelValue', checkPolices.value) emit('update:modelValue', checkPolices.value)
show.value = false show.value = false

190
src/components/quill-editor.vue

@ -0,0 +1,190 @@
<template>
<QuillEditor
ref="quillRef"
v-model:content="content"
:options="options"
contentType="html"
@update:content="setValue()"
/>
</template>
<script setup>
import { QuillEditor, Quill } from "@vueup/vue-quill";
import "@vueup/vue-quill/dist/vue-quill.snow.css";
const props = defineProps({
modelValue: {
type: String
}
});
const emit = defineEmits(["update:modelValue"]);
const content = ref(props.modelValue);
const quillRef = ref(null);
const toolbarOptions = [
[{ header: [1, 2, 3, 4, 5, 6, false] }],
["bold", "italic", "underline", "strike"], // toggled buttons
[{ list: "ordered" }, { list: "bullet" }],
["blockquote", "code-block"],
[{ indent: "-1" }, { indent: "+1" }], // outdent/indent
[{ color: [] }, { background: [] }], // dropdown with defaults from theme
[{ align: [] }],
];
const options = reactive({
modules: {
toolbar: toolbarOptions,
},
placeholder: "请输入",
});
const setValue = () => {
//
const text = toRaw(quillRef.value).getHTML();
emit("update:modelValue", text);
};
watch(
() => props.modelValue,
(val) => {
if (val) {
content.value = val; //
} else {
toRaw(quillRef.value).setContents(""); //使
}
}
);
function getText() {
return toRaw(quillRef.value).getText()
}
defineExpose({
getText
});
</script>
<style lang="scss" >
.ql-container.ql-snow {
font-size: 14px;
}
.ql-snow {
.ql-tooltip[data-mode="link"]::before {
content: "请输入链接地址:";
}
.ql-tooltip.ql-editing a.ql-action::after {
border-right: 0px;
content: "保存";
padding-right: 0px;
}
.ql-tooltip[data-mode="video"]::before {
content: "请输入视频地址:";
}
.ql-picker.ql-size {
.ql-picker-label[data-value="12px"]::before,
.ql-picker-item[data-value="12px"]::before {
content: "12px";
}
.ql-picker-label[data-value="14px"]::before,
.ql-picker-item[data-value="14px"]::before {
content: "14px";
}
.ql-picker-label[data-value="16px"]::before,
.ql-picker-item[data-value="16px"]::before {
content: "16px";
}
.ql-picker-label[data-value="18px"]::before,
.ql-picker-item[data-value="18px"]::before {
content: "18px";
}
.ql-picker-label[data-value="20px"]::before,
.ql-picker-item[data-value="20px"]::before {
content: "20px";
}
.ql-picker-label[data-value="24px"]::before,
.ql-picker-item[data-value="24px"]::before {
content: "24px";
}
.ql-picker-label[data-value="28px"]::before,
.ql-picker-item[data-value="28px"]::before {
content: "28px";
}
.ql-picker-label[data-value="32px"]::before,
.ql-picker-item[data-value="32px"]::before {
content: "32px";
}
.ql-picker-label[data-value="36px"]::before,
.ql-picker-item[data-value="36px"]::before {
content: "36px";
}
}
.ql-picker.ql-header {
.ql-picker-label::before,
.ql-picker-item::before {
content: "文本";
}
.ql-picker-label[data-value="1"]::before,
.ql-picker-item[data-value="1"]::before {
content: "标题1";
}
.ql-picker-label[data-value="2"]::before,
.ql-picker-item[data-value="2"]::before {
content: "标题2";
}
.ql-picker-label[data-value="3"]::before,
.ql-picker-item[data-value="3"]::before {
content: "标题3";
}
.ql-picker-label[data-value="4"]::before,
.ql-picker-item[data-value="4"]::before {
content: "标题4";
}
.ql-picker-label[data-value="5"]::before,
.ql-picker-item[data-value="5"]::before {
content: "标题5";
}
.ql-picker-label[data-value="6"]::before,
.ql-picker-item[data-value="6"]::before {
content: "标题6";
}
}
.ql-picker.ql-font {
.ql-picker-label[data-value="SimSun"]::before,
.ql-picker-item[data-value="SimSun"]::before {
content: "宋体";
font-family: "SimSun" !important;
}
.ql-picker-label[data-value="SimHei"]::before,
.ql-picker-item[data-value="SimHei"]::before {
content: "黑体";
font-family: "SimHei";
}
.ql-picker-label[data-value="Microsoft-YaHei"]::before,
.ql-picker-item[data-value="Microsoft-YaHei"]::before {
content: "微软雅黑";
font-family: "Microsoft YaHei";
}
.ql-picker-label[data-value="KaiTi"]::before,
.ql-picker-item[data-value="KaiTi"]::before {
content: "楷体";
font-family: "KaiTi" !important;
}
.ql-picker-label[data-value="FangSong"]::before,
.ql-picker-item[data-value="FangSong"]::before {
content: "仿宋";
font-family: "FangSong";
}
}
}
.ql-align-center {
text-align: center;
}
.ql-align-right {
text-align: right;
}
.ql-align-left {
text-align: left;
}
</style>

1
src/components/video-play.vue

@ -37,6 +37,7 @@ onMounted(() => {
container: playerRef.value, container: playerRef.value,
isFlv: true, // 使flv isFlv: true, // 使flv
showBandwidth: false, // 使 showBandwidth: false, // 使
supportDblclickFullscreen: true,
isResize: false, isResize: false,
operateBtns, operateBtns,
loadingText: "加载中...", loadingText: "加载中...",

10
src/layout/components/Aside.vue

@ -115,17 +115,17 @@ aside {
transition: width height 0.6s; transition: width height 0.6s;
} }
.menu-item { .menu-item {
height: 56px;
padding: 0 18px;
display: flex;
justify-content: space-between;
transition: all 0.6s;
> * { > * {
margin-right: 20px; margin-right: 20px;
&:last-child { &:last-child {
margin-right: 0; margin-right: 0;
} }
} }
height: 56px;
padding: 0 18px;
display: flex;
justify-content: space-between;
transition: all 0.6s;
&:hover, &:hover,
&[active="true"] { &[active="true"] {
background-color: #22339a; background-color: #22339a;

3
src/style/public.scss

@ -19,6 +19,7 @@ body {
color: #333; color: #333;
font-family: SourceHanSansCN; font-family: SourceHanSansCN;
line-height: 1.4; line-height: 1.4;
width: 100% !important;
} }
h2 { h2 {
@ -455,7 +456,7 @@ svg+span {
background-color: #4d515d80; background-color: #4d515d80;
-webkit-backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
z-index: 999; z-index: 9999999;
} }
.position-center { .position-center {

58
src/views/data/Gabxf.vue

@ -124,24 +124,29 @@
<el-table-column <el-table-column
label="投诉渠道" label="投诉渠道"
prop="channelForFilingComplaints" prop="channelForFilingComplaints"
width="90"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
label="信访方式" label="信访方式"
prop="petitionType" prop="petitionType"
width="90"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
label="登记时间" label="登记时间"
prop="discoveryTime" prop="discoveryTime"
show-overflow-tooltip width="150"
/> />
<el-table-column <el-table-column
label="信访人" label="信访人"
prop="responderName" prop="responderName"
width="90" width="90"
show-overflow-tooltip
/> />
<el-table-column label="电话" prop="responderPhone" /> <el-table-column label="电话" prop="responderPhone" width="116" />
<el-table-column label="身份证号码" prop="responderIdCode" /> <el-table-column label="身份证号码" prop="responderIdCode" width="180" />
<el-table-column label="初重信访" align="center" width="85"> <el-table-column label="初重信访" align="center" width="60">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ <span>{{
getDictLable( getDictLable(
@ -151,13 +156,7 @@
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="缠访闹访" width="85" align="center"> <el-table-column label="群众集访" width="60" align="center">
<template #default="{ row }">
<span v-if="row.entanglementVisits === true"></span>
<span v-if="row.entanglementVisits === false"></span>
</template>
</el-table-column>
<el-table-column label="群众集访" width="85" align="center">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.massVisits === true"></span> <span v-if="row.massVisits === true"></span>
<span v-if="row.massVisits === false"></span> <span v-if="row.massVisits === false"></span>
@ -177,7 +176,7 @@
prop="thingDesc" prop="thingDesc"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column label="状态"> <el-table-column label="状态" width="100">
<template #default="{ row }"> <template #default="{ row }">
<el-tag>{{ <el-tag>{{
getDictLable( getDictLable(
@ -190,9 +189,9 @@
<el-table-column <el-table-column
label="办理情况" label="办理情况"
prop="petitionProcessingStatus" prop="petitionProcessingStatus"
width="100" width="90"
/> />
<el-table-column label="操作" width="240"> <el-table-column label="操作" width="200">
<template #default="{ row }"> <template #default="{ row }">
<template <template
v-if=" v-if="
@ -315,21 +314,6 @@
) || "/" ) || "/"
}}</span> }}</span>
</div> </div>
<div class="col col-12">
<label>缠访闹访</label>
<span
><span v-if="activeRow.entanglementVisits === true"
></span
>
<span v-else-if="activeRow.entanglementVisits === false"
></span
>
<span v-else
>/</span
>
</span
>
</div>
<div class="col col-12"> <div class="col col-12">
<label>群众集访</label> <label>群众集访</label>
<span <span
@ -350,6 +334,22 @@
<span>{{ activeRow.thirdDepartName }}</span></span <span>{{ activeRow.thirdDepartName }}</span></span
> >
</div> </div>
<div class="col col-12">
<label>办理情况</label>
<span>{{ activeRow.petitionProcessingStatus || '/' }}</span>
</div>
<div class="col col-12">
<label>接访领导</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-12">
<label>化解情况</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-12">
<label>当前状态</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-24"> <div class="col col-24">
<label>具体内容</label> <label>具体内容</label>
<span class="content">{{ activeRow.thingDesc }}</span> <span class="content">{{ activeRow.thingDesc }}</span>

52
src/views/data/Gjxf.vue

@ -121,25 +121,30 @@
<el-table-column <el-table-column
label="投诉渠道" label="投诉渠道"
prop="channelForFilingComplaints" prop="channelForFilingComplaints"
width="90"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
label="信访方式" label="信访方式"
prop="petitionType" prop="petitionType"
width="90"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
label="登记时间" label="登记时间"
prop="discoveryTime" prop="discoveryTime"
show-overflow-tooltip show-overflow-tooltip
width="150"
/> />
<el-table-column <el-table-column
label="信访人" label="信访人"
prop="responderName" prop="responderName"
width="90" width="90"
show-overflow-tooltip
/> />
<el-table-column label="电话" prop="responderPhone" /> <el-table-column label="电话" prop="responderPhone" width="116" />
<el-table-column label="身份证号码" prop="responderIdCode" /> <el-table-column label="身份证号码" prop="responderIdCode" width="180" />
<el-table-column label="初重信访" align="center" width="85"> <el-table-column label="初重信访" align="center" width="60">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ <span>{{
getDictLable( getDictLable(
@ -149,13 +154,7 @@
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="缠访闹访" width="85" align="center"> <el-table-column label="群众集访" width="60" align="center">
<template #default="{ row }">
<span v-if="row.entanglementVisits === true"></span>
<span v-if="row.entanglementVisits === false"></span>
</template>
</el-table-column>
<el-table-column label="群众集访" width="85" align="center">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.massVisits === true"></span> <span v-if="row.massVisits === true"></span>
<span v-if="row.massVisits === false"></span> <span v-if="row.massVisits === false"></span>
@ -175,9 +174,9 @@
<el-table-column <el-table-column
label="办理情况" label="办理情况"
prop="petitionProcessingStatus" prop="petitionProcessingStatus"
width="100" width="90"
/> />
<el-table-column label="状态"> <el-table-column label="状态" width="100">
<template #default="{ row }"> <template #default="{ row }">
<el-tag>{{ <el-tag>{{
getDictLable( getDictLable(
@ -187,7 +186,7 @@
}}</el-tag> }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="240"> <el-table-column label="操作" width="200">
<template #default="{ row }"> <template #default="{ row }">
<template <template
v-if=" v-if="
@ -296,7 +295,7 @@
<span>{{ activeRow.responderPhone }}</span> <span>{{ activeRow.responderPhone }}</span>
</div> </div>
<div class="col col-12"> <div class="col col-12">
<label>信访人身份证号码</label> <label>信访人身份证</label>
<span>{{ activeRow.responderIdCode || '/' }}</span> <span>{{ activeRow.responderIdCode || '/' }}</span>
</div> </div>
<div class="col col-12"> <div class="col col-12">
@ -308,21 +307,6 @@
) || "/" ) || "/"
}}</span> }}</span>
</div> </div>
<div class="col col-12">
<label>缠访闹访</label>
<span
><span v-if="activeRow.entanglementVisits === true"
></span
>
<span v-else-if="activeRow.entanglementVisits === false"
></span
>
<span v-else
>/</span
>
</span
>
</div>
<div class="col col-12"> <div class="col col-12">
<label>群众集访</label> <label>群众集访</label>
<span <span
@ -347,10 +331,18 @@
<label>办理情况</label> <label>办理情况</label>
<span>{{ activeRow.petitionProcessingStatus || '/' }}</span> <span>{{ activeRow.petitionProcessingStatus || '/' }}</span>
</div> </div>
<div class="col col-12">
<label>接访领导</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-12"> <div class="col col-12">
<label>化解情况</label> <label>化解情况</label>
<span>{{ '/' }}</span> <span>{{ '/' }}</span>
</div> </div>
<div class="col col-12">
<label>当前状态</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-24"> <div class="col col-24">
<label>具体内容</label> <label>具体内容</label>
<span class="content">{{ activeRow.thingDesc }}</span> <span class="content">{{ activeRow.thingDesc }}</span>

2
src/views/data/Mail12337.vue

@ -637,7 +637,7 @@ const router = useRouter();
const query = ref({ const query = ref({
size: 10, size: 10,
current: 1, current: 1,
responderValue: "name", responderKey: "name",
}); });
const list = ref([]); const list = ref([]);

393
src/views/data/PetitionComplaint.vue

@ -0,0 +1,393 @@
<template>
<div class="container">
<header>
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="登记时间">
<date-time-range-picker-ext
v-model="query.discoveryTime"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="录入时间">
<date-time-range-picker-ext
v-model="query.createTime"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="信件编号">
<el-input
placeholder="请输入"
v-model="query.originId"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="信访人">
<div class="flex gap">
<el-select
v-model="query.responderKey"
style="width: 160px"
@change="delete query.responderValue"
>
<el-option value="name" label="姓名" />
<el-option value="phone" label="电话" />
</el-select>
<el-input
placeholder="请输入"
v-model="query.responderValue"
clearable
/>
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="具体内容">
<el-input
placeholder="请输入"
v-model="query.thingDesc"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="被投诉机构">
<depart-tree-select
v-model="query.departId"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="初重信访">
<el-select
clearable
v-model="query.initialPetition"
>
<el-option
v-for="item in dict.initialPetition"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="状态">
<el-select
v-model="query.distributionState"
clearable
>
<el-option label="未分发" value="0"></el-option>
<el-option label="已分发" value="1"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="信访来源">
<el-select
v-model="query.problemSourcesCode"
clearable
>
<el-option label="国家信访" value="21"></el-option>
<el-option label="公安部信访" value="22"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mb-25 flex end">
<div>
<el-button type="primary" @click="getList">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="reset">重置</el-button>
</div>
</div>
</header>
<div class="table-container">
<el-table :data="list">
<el-table-column
label="信件编号"
prop="originId"
show-overflow-tooltip
/>
<el-table-column
label="投诉渠道"
prop="channelForFilingComplaints"
width="90"
show-overflow-tooltip
/>
<el-table-column
label="信访方式"
prop="petitionType"
width="90"
show-overflow-tooltip
/>
<el-table-column
label="登记时间"
prop="discoveryTime"
width="150"
/>
<el-table-column
label="信访人"
prop="responderName"
width="90"
show-overflow-tooltip
/>
<el-table-column label="电话" prop="responderPhone" width="116" />
<el-table-column label="身份证号码" prop="responderIdCode" width="180" />
<el-table-column label="初重信访" align="center" width="60">
<template #default="{ row }">
<span>{{
getDictLable(
dict.initialPetition,
row.initialPetition
)
}}</span>
</template>
</el-table-column>
<el-table-column label="群众集访" width="60" align="center">
<template #default="{ row }">
<span v-if="row.massVisits === true"></span>
<span v-if="row.massVisits === false"></span>
</template>
</el-table-column>
<el-table-column
label="被投诉机构"
show-overflow-tooltip
>
<template #default="{ row }">
<span>{{ row.secondDepartName }}</span>
<span>{{ row.thirdDepartName}}</span>
</template>
</el-table-column>
<el-table-column
label="具体内容"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column label="状态" width="90">
<template #default="{ row }">
<el-tag>{{
getDictLable(
dict.distributionState,
row.distributionState
)
}}</el-tag>
</template>
</el-table-column>
<el-table-column
label="办理情况"
prop="petitionProcessingStatus"
width="100"
/>
<el-table-column label="操作" width="160">
<template #default="{ row }">
<el-button
v-if="row.negativeId && row.distributionState === '1'"
type="primary"
link
@click="handleAction(row)"
>问题详情
</el-button>
<el-button
type="primary"
link
@click="handleDetail(row)"
>详情</el-button
>
<el-button type="danger" link @click="handleDel(row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
>
</el-pagination>
</div>
</div>
<data-distrbute
v-model:show="distributeShow"
v-model:data="distributeList"
@update="getList"
/>
<negative-dialog
v-model="negativeShow"
:id="activeNegativeId"
@close="negativeShow = false"
/>
<el-dialog title="详情" v-model="detailShow" width="60vw">
<div style="min-height: 50vh">
<div class="row" style="margin: 0 60px">
<div class="col col-12">
<label>信件编号</label>
<span>{{ activeRow.originId }}</span>
</div>
<div class="col col-12">
<label>投诉渠道</label>
<span>{{
activeRow.channelForFilingComplaints || "/"
}}</span>
</div>
<div class="col col-12">
<label>信访方式</label>
<span>{{
activeRow.petitionType || "/"
}}</span>
</div>
<div class="col col-12">
<label>登记时间</label>
<span>{{ activeRow.discoveryTime }}</span>
</div>
<div class="col col-12">
<label>信访人</label>
<span>{{ activeRow.responderName }}</span>
</div>
<div class="col col-12">
<label>信访人联系方式</label>
<span>{{ activeRow.responderPhone }}</span>
</div>
<div class="col col-12">
<label>信访人身份证</label>
<span>{{ activeRow.responderIdCode || '/' }}</span>
</div>
<div class="col col-12">
<label>初重信访</label>
<span>{{
getDictLable(
dict.initialPetition,
activeRow.initialPetition
) || "/"
}}</span>
</div>
<div class="col col-12">
<label>群众集访</label>
<span
><span v-if="activeRow.massVisits === true"></span>
<span v-else-if="activeRow.massVisits === false"
></span
>
<span v-else
>/</span
>
</span
>
</div>
<div class="col col-12">
<label>被投诉机构</label>
<span
><span>{{ activeRow.secondDepartName }}</span>
<span>{{ activeRow.thirdDepartName }}</span></span
>
</div>
<div class="col col-12">
<label>办理情况</label>
<span>{{ activeRow.petitionProcessingStatus || '/' }}</span>
</div>
<div class="col col-12">
<label>接访领导</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-12">
<label>化解情况</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-12">
<label>当前状态</label>
<span>{{ '/' }}</span>
</div>
<div class="col col-24">
<label>具体内容</label>
<span class="content">{{ activeRow.thingDesc }}</span>
</div>
</div>
</div>
</el-dialog>
</template>
<script setup>
import {
listPetitionComplaint,
delPetitionComplaint,
} from "@/api/data/petitionComplaint";
import feedback from "@/utils/feedback";
import { getDictLable } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"distributionState",
"initialPetition"
]);
const query = ref({
size: 10,
current: 1,
responderKey: "name"
});
const list = ref([]);
const total = ref(0);
function getList() {
listPetitionComplaint(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
size: 10,
current: 1,
responderKey: "name"
};
getList();
}
getList();
async function handleDel(row) {
await feedback.confirm("确定要删除该数据?");
await delPetitionComplaint(row.originId);
getList();
}
const activeNegativeId = ref("");
const negativeShow = ref(false);
function handleAction(row) {
negativeShow.value = true;
activeNegativeId.value = row.negativeId;
}
const detailShow = ref(false);
const activeRow = ref({});
function handleDetail(row) {
activeRow.value = row;
detailShow.value = true;
}
</script>
<style lang="scss" scoped>
</style>

5
src/views/data/VideoInspection.vue

@ -834,8 +834,13 @@ function handleBathJoin() {
} }
function handleJoin() { function handleJoin() {
if (
distributeList.value.filter((item) => item.id === activeRow.value.id).length ===
0
) {
distributeList.value.push(activeRow.value); distributeList.value.push(activeRow.value);
} }
}
function selectable(row) { function selectable(row) {
return row.distributionState === "0"; return row.distributionState === "0";

298
src/views/datav/AuditSuper.vue

@ -7,7 +7,7 @@
<el-col :span="6"> <el-col :span="6">
<datav-card <datav-card
title="审计整改结果" title="审计整改结果"
sub-title="已整改问题数/查问题数" sub-title="已整改问题数/查问题数"
> >
<el-scrollbar height="350px"> <el-scrollbar height="350px">
<datav-chart-bar <datav-chart-bar
@ -21,10 +21,10 @@
</el-scrollbar> </el-scrollbar>
</datav-card> </datav-card>
<datav-card title="审计查出问题" style="height: 500px"> <datav-card title="审计项目类型">
<v-charts <v-charts
style="height: 300px" style="height: 300px"
:option="option22" :option="option2"
autoresize autoresize
/> />
</datav-card> </datav-card>
@ -33,29 +33,29 @@
<datav-date-picker v-model="time" /> <datav-date-picker v-model="time" />
<div class="flex gap-42"> <div class="flex gap-42">
<datav-statistic <datav-statistic
:value="temp.tempTotal" :value="overview.problemNumber"
title="审计单位/项目" title="审计单位/项目"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="temp.tempTotalMon" :value="overview.auditAmount"
:title="`审计总金额\n(万元)`" :title="`审计总金额\n(万元)`"
:isDecimal="true" :isDecimal="true"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="temp.tempReviewMon" :value="overview.auditSjAmount"
:title="`审减金额\n(万元)`" :title="`审减金额\n(万元)`"
:isDecimal="true" :isDecimal="true"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="temp.tempCheckPro" :value="overview.negativeNumber"
title="查问题数" title="查问题数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="temp.tempPro" :value="overview.accountableNumber"
title="追责问责数" title="追责问责数"
style="width: 20%" style="width: 20%"
/> />
@ -74,37 +74,14 @@
</datav-card> </datav-card>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<datav-card title="审计项目类型"> <datav-card title="审计查出问题" style="height: 500px">
<datav-tabs>
<datav-tab-item label="政府投资审计" name="1">
<div class="mb-40">
<v-charts
style="height: 300px"
:option="option2"
autoresize
/>
</div>
</datav-tab-item>
<datav-tab-item label="专项审计" name="2">
<div class="mb-40">
<v-charts
style="height: 300px"
:option="option3"
autoresize
/>
</div>
</datav-tab-item>
<datav-tab-item label="经济责任审计" name="3">
<div class="mb-40">
<v-charts <v-charts
style="height: 300px" style="height: 300px"
:option="option4" :option="problemOptions"
autoresize autoresize
/> />
</div>
</datav-tab-item>
</datav-tabs>
</datav-card> </datav-card>
<datav-card title="审计工作动态"> <datav-card title="审计工作动态">
<el-scrollbar height="470px"> <el-scrollbar height="470px">
<datav-message <datav-message
@ -130,7 +107,6 @@
<file-preview :files="files" v-model:show="filePreviewShow" /> <file-preview :files="files" v-model:show="filePreviewShow" />
</template> </template>
<script setup> <script setup>
import vCharts from "vue-echarts"; import vCharts from "vue-echarts";
import changshaMap from "@/assets/data/changsha.json"; import changshaMap from "@/assets/data/changsha.json";
@ -138,27 +114,61 @@ import * as echarts from "echarts/core";
import moment from "moment/moment.js"; import moment from "moment/moment.js";
import { getWorkDynamics } from "@/api/data/aduit.ts"; import { getWorkDynamics } from "@/api/data/aduit.ts";
import { workDynamicColorMapping } from "@/enums/workDynamicColorMapping.js"; import { workDynamicColorMapping } from "@/enums/workDynamicColorMapping.js";
import { getAuditOverview, getAuditProblems } from '@/api/datav'
import { onMounted } from "vue";
const messages = ref([]); const messages = ref([]);
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const temp = ref({
tempTotal: 0, watch(time, () => {
tempTotalMon: 0, getData();
tempReviewMon: 0,
tempCheckPro: 0,
tempPro: 0,
}); });
setTimeout(() => {
temp.value = { const overview = ref({
tempTotal: 462, negativeNumber: 0,
tempTotalMon: 79224.59, accountableNumber: 0,
tempReviewMon: 3544.01, problemNumber: 0,
tempCheckPro: 1192, auditAmount: 0,
tempPro: 389, auditSjAmount: 0,
}; });
}, 1000);
const problemOptions = ref({
series: [
{
type: "pie",
radius: ["40%", "70%"],
label: {
color: "#fff",
},
data: [],
},
],
tooltip: {
trigger: "item",
},
});
onMounted(() => {
getData()
})
function getData() {
getAuditOverview(time.value).then(data => {
overview.value = data;
//
overview.value.problemNumber = 119;
overview.value.auditAmount = 11720.52
overview.value.auditSjAmount = 286.85
});
getAuditProblems(time.value).then(data => {
console.log(data)
problemOptions.value.series[0].data = data
});
getWorkDynamicsData();
}
let gobalTempMapVoList = [ let gobalTempMapVoList = [
{ {
name: "天心分局", name: "天心分局",
@ -243,7 +253,7 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul" > <ul class="tooltip-ul" >
<li>审计单位/项目数<span>暂无</span></li> <li>审计单位/项目数<span>暂无</span></li>
<li>问题数 <span>${dataItem.checkPro}</span></li> <li>问题数 <span>${dataItem.checkPro}</span></li>
<li>追责问责数 <span>暂无</span></li> <li>追责问责数 <span>暂无</span></li>
<li>整改问题数 <span>${dataItem.changed}</span></li> <li>整改问题数 <span>${dataItem.changed}</span></li>
</ul> </ul>
@ -255,7 +265,7 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul""> <ul class="tooltip-ul"">
<li>审计单位/项目 <span>0</span></li> <li>审计单位/项目 <span>0</span></li>
<li>问题数 <span>0</span></li> <li>问题数 <span>0</span></li>
<li>追责问责数 <span>0</span></li> <li>追责问责数 <span>0</span></li>
</ul> </ul>
</div> </div>
@ -370,66 +380,38 @@ const option1 = ref({
}, },
]), ]),
}, },
data: [0, 0, 4, 45, 16, 1, 436, 687, 3, 0, 0], data: [27, 39, 26, 16, 0, 0, 0, 0, 0, 0, 0],
}, },
], ],
}); });
const data1 = [ const data1 = [
{ {
label: "芙蓉分局", label: "公交分局",
value: "100", value: 100,
rate: "100", numerator: 8,
numerator: "1", denominator: 8,
denominator: "1",
},
{
label: "雨花分局",
value: "91",
rate: "91",
numerator: "220",
denominator: 240,
}, },
{ {
label: "高新分局", label: "岳麓分局",
value: 90, value: 100,
rate: 90, numerator: 2,
numerator: 140, denominator: 2,
denominator: 155,
},
{
label: "宁乡市局",
value: 83,
rate: 83,
numerator: 194,
denominator: 232,
},
{
label: "开福分局",
value: 73,
rate: 73,
numerator: 137,
denominator: 186,
}, },
{ {
label: "开福分局", label: "交警支队",
value: 73, value: 100,
rate: 73, numerator: 2,
numerator: 137, denominator: 2,
denominator: 186,
}, },
{ {
label: "岳麓分局", label: "高新分局",
value: 0, value: 100,
numerator: 0, numerator: 1,
rate: 0, denominator: 1,
denominator: 11,
}, },
]; ];
// setTimeout(() => {
// data1.values().forEach((item) => {
// console.log(item.label);
// });
// }, 1000);
const data2 = [ const data2 = [
{ {
name: "开福分局", name: "开福分局",
@ -469,107 +451,10 @@ const option2 = {
color: "#fff", color: "#fff",
}, },
data: [ data: [
{ value: 23, name: "项目未按规定立项" }, { value: 7, name: "执法活动财物审计" },
{ value: 21, name: "未按规定或批准的采购方式进行采购" }, { value: 1, name: "经济责任审计" },
{ value: 6, name: "未按规定程序办理立项手续" }, { value: 110, name: "政府投资审计" },
{ value: 2, name: "涉嫌项目拆分" }, { value: 1, name: "专项审计" },
{ value: 2, name: "项目开始是实施或完成后补签合同" },
{ value: 1, name: "未严格履行立项手续" },
],
},
],
tooltip: {
trigger: "item",
},
};
const option3 = {
series: [
{
type: "pie",
radius: ["40%", "70%"],
label: {
color: "#fff",
},
data: [
{
value: 321,
name: "提取、查封、扣押、冻结、处置涉案财物不规范",
},
{ value: 249, name: "法律文书填制不规范" },
{ value: 215, name: "未上缴或未及时上缴涉案资金" },
{ value: 190, name: "随身财务登记、保管、处置不规范" },
{
value: 88,
name: "执法活动财务管理制度不健全、管理责任不落实",
},
{ value: 55, name: "未按规定退还保证金" },
{ value: 13, name: "涉案财务保管场所设施配备不规范" },
{ value: 6, name: "随身财务登记、保管、处置不规范" },
],
},
],
tooltip: {
trigger: "item",
},
};
const option4 = {
series: [
{
type: "pie",
radius: ["40%", "70%"],
label: {
color: "#fff",
},
data: [
{ value: 8, name: "法律文书填写不规范" },
{
value: 3,
name: "提取、查封、扣押、冻结、处置涉案财物不规范",
},
{ value: 1, name: '"三公经费"预算执行及公开不符合规定' },
{ value: 1, name: "随身财务登记、保管、处置不规范" },
{ value: 1, name: "未按规定退还保证金" },
{ value: 1, name: "未上缴或未及时上缴涉案资金" },
{ value: 1, name: "无预算采购" },
],
},
],
tooltip: {
trigger: "item",
},
};
const option5 = {
series: [
{
type: "pie",
radius: ["40%", "70%"],
label: {
color: "#fff",
},
data: [
{ value: 143, name: "工程" },
{ value: 78, name: "信息化" },
{ value: 176, name: "服务" },
{ value: 21, name: "购物" },
],
},
],
tooltip: {
trigger: "item",
},
};
const option22 = {
series: [
{
type: "pie",
radius: ["40%", "70%"],
label: {
color: "#fff",
},
data: [
{ value: 55, name: "政府投资审计" },
{ value: 1137, name: "专项审计" },
{ value: 16, name: "经济责任审计" },
], ],
}, },
], ],
@ -577,6 +462,7 @@ const option22 = {
trigger: "item", trigger: "item",
}, },
}; };
const colors = [ const colors = [
{ {
// 绿 // 绿
@ -599,13 +485,7 @@ const getWorkDynamicsData = async () => {
const data = await getWorkDynamics(time.value); const data = await getWorkDynamics(time.value);
const colorNewsVoList = workDynamicColorMapping(data); const colorNewsVoList = workDynamicColorMapping(data);
messages.value = colorNewsVoList; messages.value = colorNewsVoList;
}; }
const getData = () => {
getWorkDynamicsData();
};
onMounted(() => {
getData();
});
const files = ref([]) const files = ref([])
const filePreviewShow = ref(false) const filePreviewShow = ref(false)

20
src/views/datav/CaseVerif.vue

@ -78,13 +78,13 @@
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.punishPre" :value="overview.punishOrg"
title="问责人次" title="问责单位数"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.punishOrg" :value="overview.punishPre"
title="问责单位数" title="问责人次"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
@ -199,7 +199,7 @@ const currentYear = new Date().getFullYear();
const years = ref([currentYear.toString(), (currentYear - 1).toString(), (currentYear - 2).toString()]); // const years = ref([currentYear.toString(), (currentYear - 1).toString(), (currentYear - 2).toString()]); //
const selectedYear = ref(currentYear); // const selectedYear = ref(currentYear); //
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const fxsjBarList = ref([]); const fxsjBarList = ref([]);
@ -209,7 +209,7 @@ const overview = ref({
total: 0, total: 0,
confirmed: 0, // confirmed: 0, //
dealCasePro: 0, // dealCasePro: 0, //
punishPre: 0, // punishPre: 0, //
punishOrg: 0, // punishOrg: 0, //
Rate: 0, // Rate: 0, //
}); });
@ -266,8 +266,8 @@ const option = ref({
<li>案件总数<span>${dataItem.total}</span></li> <li>案件总数<span>${dataItem.total}</span></li>
<li>查实案件数 <span>${dataItem.confirmed}</span></li> <li>查实案件数 <span>${dataItem.confirmed}</span></li>
<li>查处问题 <span>${dataItem.dealCasePro}</span></li> <li>查处问题 <span>${dataItem.dealCasePro}</span></li>
<li>问责人次 <span>${dataItem.punishPre}</span></li> <li>涉及人数 <span>${dataItem.punishPre}</span></li>
<li>问责单位数 <span>${dataItem.punishOrg}</span></li> <li>涉及单位数 <span>${dataItem.punishOrg}</span></li>
<li>查实率 <span>${dataItem.rate}%</span></li> <li>查实率 <span>${dataItem.rate}%</span></li>
</ul> </ul>
</div> </div>
@ -280,8 +280,8 @@ const option = ref({
<li>案件总数 <span>-</span></li> <li>案件总数 <span>-</span></li>
<li>查实案件数 <span>-</span></li> <li>查实案件数 <span>-</span></li>
<li>查处问题 <span>-</span></li> <li>查处问题 <span>-</span></li>
<li>问责人次 <span>-</span></li> <li>涉及人数 <span>-</span></li>
<li>问责单位数 <span>-</span></li> <li>涉及单位数 <span>-</span></li>
<li>查实率 <span>-</span></li> <li>查实率 <span>-</span></li>
</ul> </ul>
</div> </div>

56
src/views/datav/Global.vue

@ -44,35 +44,45 @@
<el-col :span="12"> <el-col :span="12">
<datav-date-picker v-model="time" /> <datav-date-picker v-model="time" />
<div class="flex gap-42"> <div class="flex gap-42">
<datav-statistic <!-- <datav-statistic
:value="overview.totalPro" :value="overview.totalPro"
title="问题总数" title="问题总数"
style="width: 13.66%; margin-left: 20px" style="width: 16.66%;"
/> /> -->
<datav-statistic <datav-statistic
:value="overview.supervisionPro" :value="overview.supervisionPro"
title="督导检查问题" :title="`现场(数字)\n督察问题`"
style="width: 13.66%; margin-left: 30px" style="width: 20%;"
@click="open('/datav/sceneInsp')"
/> />
<datav-statistic <datav-statistic
:value="overview.caseVerificationPro" :value="overview.caseVerificationPro"
title="案件核查问题" :title="`案件核查`"
style="width: 13.66%; margin-left: 30px" style="width: 20%; margin-left: 10px"
@click="open('/datav/caseVerif')"
/> />
<datav-statistic <datav-statistic
:value="overview.complaintPro" :value="overview.mailboxNumber"
title="信访投诉问题" :title="`局长信箱`"
style="width: 13.66%; margin-left: 30px" style="width: 20%; margin-left: 10px"
/> />
<datav-statistic <datav-statistic
:value="overview.talkPro" :value="overview.complaintPro"
title="民意感知问题" :title="`信访投诉`"
style="width: 13.66%; margin-left: 30px" style="width: 20%; margin-left: 10px"
@click="open('/datav/mailVisits')"
/> />
<!-- <datav-statistic
:value="overview.talkPro"
:title="`下发不满意\n样本`"
style="width: 16.66%; margin-left: 10px"
@click="open('/datav/jwpy')"
/> -->
<datav-statistic <datav-statistic
:value="overview.auditPro" :value="overview.auditPro"
title="审计监督问题" :title="`审计项目`"
style="width: 13.66%; margin-left: 10px" style="width: 20%; margin-left: 10px"
@click="open('/datav/auditSuper')"
/> />
</div> </div>
<v-charts <v-charts
@ -167,7 +177,7 @@ const router = useRouter();
const fxsjlist = ref([ const fxsjlist = ref([
{ {
label: "天心分局", label: "天心分局",
value: 99999, value: 0,
}, },
]); // ]); //
const jsdwlist = ref([]); // const jsdwlist = ref([]); //
@ -179,9 +189,10 @@ const overview = ref({
complaintPro: 0, complaintPro: 0,
talkPro: 0, talkPro: 0,
auditPro: 0, auditPro: 0,
mailboxNumber: 0
}); // }); //
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
@ -440,6 +451,7 @@ const getBusinessRateData = async (timeValue = time.value) => {
const getAllGlobalCountData = async (timeValue = time.value) => { const getAllGlobalCountData = async (timeValue = time.value) => {
const res = await getAllGlobalCount(timeValue); const res = await getAllGlobalCount(timeValue);
overview.value = res.overview; overview.value = res.overview;
overview.value.auditPro = 119
}; };
const getGlobalMapData = async (timeValue = time.value) => { const getGlobalMapData = async (timeValue = time.value) => {
const res = await getGlobalMap(timeValue); const res = await getGlobalMap(timeValue);
@ -504,7 +516,7 @@ function getData() {
const cardAnimation = () => { const cardAnimation = () => {
activeOrgTab.value = ((parseInt(activeOrgTab.value) % 2) + 1).toString(); activeOrgTab.value = ((parseInt(activeOrgTab.value) % 2) + 1).toString();
}; };
cardProRankIntervalId = setInterval(cardAnimation, 3000); cardProRankIntervalId = setInterval(cardAnimation, 5000);
// //
const ywlxzbCircularAnimation = () => { const ywlxzbCircularAnimation = () => {
const ywlxzbOptionTemp = ywlxzbOption?.value?.chart; const ywlxzbOptionTemp = ywlxzbOption?.value?.chart;
@ -623,7 +635,7 @@ const cartProRankAnimtionStop = () => {
temp.addEventListener("mouseleave", () => { temp.addEventListener("mouseleave", () => {
cardProRankIntervalId = setTimeout(() => { cardProRankIntervalId = setTimeout(() => {
cardAnimation(); cardAnimation();
}, 3000); }, 5000);
}); });
}; };
const ywlxzbAnimationStop = () => { const ywlxzbAnimationStop = () => {
@ -699,7 +711,11 @@ const wtlxzbAnimationStop = () => {
wtlxPieCircularIntervalId = setInterval(wtlxzbCircularAnimation, 2000); wtlxPieCircularIntervalId = setInterval(wtlxzbCircularAnimation, 2000);
}); });
}; };
// endregion
function open(path) {
router.push(path)
}
</script> </script>

2
src/views/datav/Lmgz.vue

@ -359,7 +359,7 @@ let orgRateList = ref([])
let orgCarRateList = ref([]) let orgCarRateList = ref([])
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);

51
src/views/datav/MailVisits.vue

@ -139,28 +139,32 @@
:value="overview.manageMail" :value="overview.manageMail"
title="局长信箱" title="局长信箱"
style="width: 20%" style="width: 20%"
@click="open('/data/Mailbox')"
/> />
<datav-statistic <datav-statistic
:value="overview.totalMail" :value="overview.totalMail"
title="信访总数" title="信访总数"
style="width: 20%" style="width: 20%"
@click="open('/query')"
/> />
<datav-statistic <datav-statistic
:value="overview.countryMail" :value="overview.countryMail"
title="国家信访" title="国家信访"
style="width: 20%" style="width: 20%"
@click="open('/data/gjxf')"
/> />
<datav-statistic <datav-statistic
:value="overview.policeMail" :value="overview.policeMail"
title="公安部信访" title="公安部信访"
style="width: 20%" style="width: 20%"
@click="open('/data/gabxf')"
/> />
<datav-statistic <datav-statistic
:value="overview.numberMail" :value="overview.numberMail"
title="12337信访" title="12337信访"
style="width: 20%" style="width: 20%"
@click="open('/data/mail12337')"
/> />
</div> </div>
@ -221,9 +225,9 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<datav-card title="缠访集访情况"> <datav-card title="群众集访情况">
<el-row class="mb-32"> <el-row class="mb-32">
<el-col :span="8"> <el-col :span="12">
<div class="descriptions_cell text-center"> <div class="descriptions_cell text-center">
<div class="descriptions_content"> <div class="descriptions_content">
{{ currentRightOverview.leaderReview }} {{ currentRightOverview.leaderReview }}
@ -233,17 +237,7 @@
</div> </div>
</div> </div>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="12">
<div class="descriptions_cell text-center">
<div class="descriptions_content">
{{ currentRightOverview.entanglement }}
</div>
<div class="descriptions_label">
缠访闹访
</div>
</div>
</el-col>
<el-col :span="8">
<div class="descriptions_cell text-center"> <div class="descriptions_cell text-center">
<div class="descriptions_content"> <div class="descriptions_content">
{{ currentRightOverview.mass }} {{ currentRightOverview.mass }}
@ -271,16 +265,6 @@
/> />
</el-scrollbar> </el-scrollbar>
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="缠访闹访" name="2">
<el-scrollbar height="300px">
<datav-chart-bar
:data="fxsjEntanglementMailList"
:max="11"
size="large"
:color="colors"
/>
</el-scrollbar>
</datav-tab-item>
<datav-tab-item label="群体集访" name="3"> <datav-tab-item label="群体集访" name="3">
<el-scrollbar height="300px"> <el-scrollbar height="300px">
<datav-chart-bar <datav-chart-bar
@ -306,15 +290,6 @@
/> />
</el-scrollbar> </el-scrollbar>
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="缠访闹访" name="2">
<el-scrollbar height="300px">
<datav-chart-bar
:data="bwzdEntanglementMailList"
:max="11"
size="large"
/>
</el-scrollbar>
</datav-tab-item>
<datav-tab-item label="群体集访" name="3"> <datav-tab-item label="群体集访" name="3">
<el-scrollbar height="300px"> <el-scrollbar height="300px">
<datav-chart-bar <datav-chart-bar
@ -415,7 +390,7 @@ const bwzdEntanglementMailList = ref([]); // 部委缠闹
const bwzdMassMailList = ref([]); // 访 const bwzdMassMailList = ref([]); // 访
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
@ -1083,7 +1058,11 @@ const fxsjEntanglementAnimationStop = () => {
fxsjEntanglementIntervalId = setInterval(fxsjEntanglementAnimation, 3000); fxsjEntanglementIntervalId = setInterval(fxsjEntanglementAnimation, 3000);
}); });
} }
// endregion
function open(path) {
window.open(router.resolve(path).href);
}
</script> </script>

326
src/views/datav/RightsComfort.vue

@ -16,7 +16,7 @@
<datav-tab-item label="分县市局" name="1"> <datav-tab-item label="分县市局" name="1">
<el-scrollbar height="300px"> <el-scrollbar height="300px">
<datav-chart-bar <datav-chart-bar
:data="fxsjRightsRank" :data="countyRightsBarList"
size="large" size="large"
:max="11" :max="11"
:color="colors" :color="colors"
@ -26,7 +26,7 @@
<datav-tab-item label="局属单位" name="2"> <datav-tab-item label="局属单位" name="2">
<el-scrollbar height="300px"> <el-scrollbar height="300px">
<datav-chart-bar <datav-chart-bar
:data="jsdwRightsRank" :data="bureauRightsBarList"
:max="11" :max="11"
size="large" size="large"
:color="colors" :color="colors"
@ -43,7 +43,7 @@
<datav-tab-item label="分县市局" name="1"> <datav-tab-item label="分县市局" name="1">
<el-scrollbar height="300px"> <el-scrollbar height="300px">
<datav-chart-bar <datav-chart-bar
:data="fxsjComfortMoneyRank" :data="countyComfortMoneyBarList"
size="large" size="large"
:max="11" :max="11"
:color="colors" :color="colors"
@ -53,7 +53,7 @@
<datav-tab-item label="局属单位" name="2"> <datav-tab-item label="局属单位" name="2">
<el-scrollbar height="300px"> <el-scrollbar height="300px">
<datav-chart-bar <datav-chart-bar
:data="jsdwComfortMoneyRank" :data="bureauComfortMoneyBarList"
:max="11" :max="11"
size="large" size="large"
:color="colors" :color="colors"
@ -93,27 +93,27 @@
<datav-date-picker v-model="time"/> <datav-date-picker v-model="time"/>
<div class="flex gap-42"> <div class="flex gap-42">
<datav-statistic <datav-statistic
:value="comfortOverview.comfortCaseTotal" :value="overview.rightsNumber"
title="维权案件总数" title="维权案件总数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="comfortOverview.hurtTotal" :value="overview.victimNumber"
title="受侵害人数" title="受侵害人数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="comfortOverview.comfortTotal" :value="overview.hitPersonNumber"
title="抚慰人数" title="打击处理人数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="comfortOverview.hitTotal" :value="overview.comfortPersonNumber"
title="打击处理人数" title="抚慰人数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="comfortOverview.comfortMoney" :value="overview.comfortMoney"
:title="`抚慰金额\n(万元)`" :title="`抚慰金额\n(万元)`"
:isDecimal="true" :isDecimal="true"
style="width: 20%" style="width: 20%"
@ -139,7 +139,7 @@
<datav-card title="抚慰情况"> <datav-card title="抚慰情况">
<v-charts <v-charts
style="height: 300px" style="height: 300px"
:option="comfortSituationOption" :option="comfortPoliceInjurySituation"
autoresize autoresize
/> />
</datav-card> </datav-card>
@ -157,14 +157,14 @@
<datav-tab-item label="受伤人数" name="1"> <datav-tab-item label="受伤人数" name="1">
<v-charts <v-charts
style="height: 310px;" style="height: 310px;"
:option="hurtNumOption" :option="comfortPoliceInjurySituation"
autoresize autoresize
/> />
</datav-tab-item> </datav-tab-item>
<datav-tab-item label="受伤类別" name="2"> <datav-tab-item label="受伤类別" name="2">
<v-charts <v-charts
style="height: 310px;" style="height: 310px;"
:option="hurtTypeOption" :option="comfortInjuryCategory"
autoresize autoresize
/> />
</datav-tab-item> </datav-tab-item>
@ -221,15 +221,27 @@ import {
getComfortSituation, getComfortSituation,
getRightsAndComfortRank, getPoliceHurtSituationAndHurtType, getCaseAriseSituationRate, getComfortMapIcon getRightsAndComfortRank, getPoliceHurtSituationAndHurtType, getCaseAriseSituationRate, getComfortMapIcon
} from "@/api/screen/rightsComfort.ts"; } from "@/api/screen/rightsComfort.ts";
import {
getRightsComfortData
} from "@/api/datav";
// region //
const router = useRouter(); const router = useRouter();
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const fxsjRightsRank = ref([
const overview = ref({
rightsNumber: 0,
victimNumber: 0,
hitPersonNumber: 0,
comfortPersonNumber: 0,
comfortMoney: 0
})
const countyRightsBarList = ref([
{ {
label: "岳麓分局", label: "岳麓分局",
value: 23 value: 23
@ -269,168 +281,102 @@ const fxsjRightsRank = ref([
{ {
label: "高新分局", label: "高新分局",
value: 4 value: 4
}, }
]);
]); // //
const jsdwRightsRank = ref([ const bureauRightsBarList = ref([
{ {
label: "岳麓分局", label: "交警支队",
value: 27 value: 27
}, }
{ ]);
label: "芙蓉分局", //
value: 20 const countyComfortMoneyBarList = ref([])
}, const bureauComfortMoneyBarList = ref([])
{ //
label: "天心分局", const punishmentSituationOption = ref({
value: 20 series: [
},
{
label: "雨花分局",
value: 19
},
{
label: "浏阳市局",
value: 17
},
{
label: "宁乡市局",
value: 11
},
{
label: "开福分局",
value: 11
},
{ {
label: "望城分局", type: "pie",
value: 9 radius: ["40%", "70%"],
label: {
color: "#fff",
}, },
{ data: [],
label: "长沙县局",
value: 9
}, },
{ ],
label: "高新分局", tooltip: {
value: 4 trigger: "item",
}, },
});
]); // //
const fxsjComfortMoneyRank = ref([ const comfortPoliceInjurySituation = ref(
{
label: "岳麓分局",
value: 53
},
{
label: "芙蓉分局",
value: 20
},
{
label: "天心分局",
value: 20
},
{
label: "雨花分局",
value: 19
},
{
label: "浏阳市局",
value: 17
},
{
label: "宁乡市局",
value: 11
},
{ {
label: "开福分局", series: [
value: 11
},
{ {
label: "望城分局", type: "pie",
value: 9 radius: ["40%", "70%"],
label: {
color: "#fff",
}, },
{ data: [],
label: "长沙县局",
value: 9
}, },
{ ],
label: "高新分局", tooltip: {
value: 4 trigger: "item",
}, },
}
);
]); // //
const jsdwComfortMoneyRank = ref([ const comfortInjuryCategory = ref(
{
label: "岳麓分局",
value: 33
},
{ {
label: "芙蓉分局", series: [
value: 20
},
{
label: "天心分局",
value: 20
},
{
label: "雨花分局",
value: 19
},
{
label: "浏阳市局",
value: 17
},
{
label: "宁乡市局",
value: 11
},
{
label: "开福分局",
value: 11
},
{ {
label: "望城分局", type: "pie",
value: 9 radius: ["40%", "70%"],
label: {
color: "#fff",
}, },
{ data: [],
label: "长沙县局",
value: 9
}, },
{ ],
label: "高新分局", tooltip: {
value: 4 trigger: "item",
}, },
}
);
//////////////////////////////////////////////////////////////////////////////////////////////////
function getData() {
getRightsComfortData(time.value).then(data => {
overview.value.rightsNumber = data.rightsNumber
overview.value.victimNumber = data.victimNumber
overview.value.hitPersonNumber = data.hitPersonNumber
overview.value.comfortPersonNumber = data.comfortPersonNumber
overview.value.comfortMoney = data.comfortMoney
countyComfortMoneyBarList.value = data.countyComfortMoneyBarList;
bureauComfortMoneyBarList.value = data.bureauComfortMoneyBarList;
punishmentSituationOption.value.series[0].data = data.punishmentSituation
comfortPoliceInjurySituation.value.series[0].data = data.comfortPoliceInjurySituation
comfortInjuryCategory.value.series[0].data = data.comfortInjuryCategory
})
}
]); // watch(time, () => {
const comfortOverview = ref({ getData();
comfortCaseTotal: 0, })
hurtTotal: 0, onMounted(() => {
comfortTotal: 0, getData();
hitTotal: 0, });
comfortMoney: 0,
}) //
let globalTempMapVoList = ref([]);
// endregion
// region let globalTempMapVoList = ref([]);
//
const getRightsRankList = async (timeValue) => {
const res = await getRightsAndComfortRank(timeValue);
fxsjRightsRank.value = res.fxsjRightsRankList;
jsdwRightsRank.value = res.jsdwRightsRankList;
}
//
const getComfortOverview = async (timeValue) => {
const res = await getALlComfortCount(timeValue);
comfortOverview.value = res.comfortOverview;
// comfortOverview.value.comfortCaseTotal = 136;
// comfortOverview.value.hurtTotal = 112;
// comfortOverview.value.hitTotal = 167;
}
// //
const getMapData = async (timeValue) => { const getMapData = async (timeValue) => {
const res = await getComfortMapIcon(timeValue); const res = await getComfortMapIcon(timeValue);
const mappedData = res.comfortMapVoList.map(item => { const mappedData = res.comfortMapVoList?.map(item => {
let name; let name;
switch (item.name) { switch (item.name) {
case '长沙县局': case '长沙县局':
@ -475,7 +421,6 @@ const getMapData = async (timeValue) => {
}; };
}); });
globalTempMapVoList.value = mappedData globalTempMapVoList.value = mappedData
console.log(globalTempMapVoList)
const total = mappedData.reduce((sum, item) => sum + Number(item.value), 0); const total = mappedData.reduce((sum, item) => sum + Number(item.value), 0);
const avg = total / mappedData.length; // const avg = total / mappedData.length; //
const range30Percent = avg * 0.3 // const range30Percent = avg * 0.3 //
@ -486,16 +431,6 @@ const getMapData = async (timeValue) => {
{gte: avg + range30Percent, label: "高于平均问题30%", color: "#D34343"}, {gte: avg + range30Percent, label: "高于平均问题30%", color: "#D34343"},
]; ];
} }
//
const getPunishmentSituationList = async (timeValue) => {
const res = await getPunishmentSituation(timeValue);
// punishmentSituationOption.series[0].data = res.punishmentSituationList;
}
//
const getComfortSituationList = async (timeValue) => {
const res = await getComfortSituation(timeValue);
// comfortSituationOption.series[0].data = res.comfortSituationList;
}
// - // -
const getPoliceHurtSituationList = async (timeValue) => { const getPoliceHurtSituationList = async (timeValue) => {
@ -511,25 +446,6 @@ const getCaseAriseSituationRateList = async (timeValue) => {
ariseCaseORgOption.value.series[0].data = res.incidentOrgList ariseCaseORgOption.value.series[0].data = res.incidentOrgList
} }
// endregion
function getData() {
getRightsRankList(time.value);
getComfortOverview(time.value);
getMapData(time.value)
getPunishmentSituationList(time.value);
getComfortSituationList(time.value);
getPoliceHurtSituationList(time.value);
getCaseAriseSituationRateList(time.value);
}
watch(time, () => {
getData();
})
onMounted(() => {
getData();
});
const handleClick = (params) => { const handleClick = (params) => {
const departId = params.data.departId; const departId = params.data.departId;
const url = router.resolve({ const url = router.resolve({
@ -539,7 +455,6 @@ const handleClick = (params) => {
window.open(url, "_blank"); window.open(url, "_blank");
} }
// region // region
echarts.registerMap("changsha", changshaMap); echarts.registerMap("changsha", changshaMap);
const option = ref({ const option = ref({
@ -662,42 +577,8 @@ const xzajCaseTypeOption = ref({
trigger: "item", trigger: "item",
}, },
}); });
const punishmentSituationOption = {
series: [
{
type: "pie",
radius: ["40%", "70%"],
label: {
color: "#fff",
},
data: [
{value: 91, name: "刑事追究"},
{value: 78, name: "行政处理"},
],
},
],
tooltip: {
trigger: "item",
},
};
const comfortSituationOption = {
series: [
{
type: "pie",
radius: ["40%", "70%"],
label: {
color: "#fff",
},
data: [
{value: 30, name: "民警"},
{value: 52, name: "辅警"},
],
},
],
tooltip: {
trigger: "item",
},
};
const hurtNumOption = ref({ const hurtNumOption = ref({
series: [ series: [
{ {
@ -834,7 +715,6 @@ const colors = [
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/style/datav.scss"; @import "@/style/datav.scss";

150
src/views/datav/SceneInsp.vue

@ -37,11 +37,11 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
fxsjRankOverview.changing fxsjRankOverview.processingNumber
}} }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -53,11 +53,11 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
fxsjRankOverview.changed fxsjRankOverview.completedNumber
}} }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -69,11 +69,11 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
fxsjRankOverview.correctionRate fxsjRankOverview.completedRate
}}% }}%
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -82,8 +82,8 @@
<datav-chart-bar <datav-chart-bar
:data="fxsjChangedRankList" :data="fxsjChangedRankList"
size="small" size="small"
title="整改率排名" title="办结率排名"
sub-title="已整改/问题数" sub-title="已办结/问题数"
unit="%" unit="%"
:color="dayTimeColors" :color="dayTimeColors"
/> />
@ -115,11 +115,11 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
jsdwRankOverview.changing jsdwRankOverview.processingNumber
}} }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -131,11 +131,11 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
jsdwRankOverview.changed jsdwRankOverview.completedNumber
}} }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -147,11 +147,11 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
jsdwRankOverview.correctionRate jsdwRankOverview.completedRate
}}% }}%
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -160,8 +160,8 @@
<datav-chart-bar <datav-chart-bar
:data="jsdwChangedRankList" :data="jsdwChangedRankList"
size="small" size="small"
title="整改率排名" title="办结率排名"
sub-title="已整改/问题数" sub-title="已办结/问题数"
unit="%" unit="%"
:color="dayTimeColors" :color="dayTimeColors"
/> />
@ -189,29 +189,29 @@
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.rectifingNumber" :value="overview.processingNumber"
title="整改中" title="办理中"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.rectifedNumber" :value="overview.completedNumber"
title="已整改" title="已办结"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.departNumber" :value="overview.departNumber"
title="涉及单位数" title="问责单位数"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.personNumber" :value="overview.personNumber"
title="涉及人数" title="问责人次"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.rectifyRate" :value="overview.completedRate"
value-unit="%" value-unit="%"
title="整改率" title="办结率"
style="width: 16.66%" style="width: 16.66%"
/> />
</div> </div>
@ -301,13 +301,13 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
fxsjYellowBetOverview.changing fxsjYellowBetOverview.processingNumber
}} }}
</div> </div>
<div <div
class="descriptions_label" class="descriptions_label"
> >
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -319,13 +319,13 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
fxsjYellowBetOverview.changed fxsjYellowBetOverview.completedNumber
}} }}
</div> </div>
<div <div
class="descriptions_label" class="descriptions_label"
> >
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -337,13 +337,13 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
fxsjYellowBetOverview.correctionRate fxsjYellowBetOverview.completedRate
}}% }}%
</div> </div>
<div <div
class="descriptions_label" class="descriptions_label"
> >
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -391,13 +391,13 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
jsdwYellowBetOverview.changing jsdwYellowBetOverview.processingNumber
}} }}
</div> </div>
<div <div
class="descriptions_label" class="descriptions_label"
> >
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -409,13 +409,13 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
jsdwYellowBetOverview.changed jsdwYellowBetOverview.completedNumber
}} }}
</div> </div>
<div <div
class="descriptions_label" class="descriptions_label"
> >
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -427,13 +427,13 @@
class="descriptions_content" class="descriptions_content"
> >
{{ {{
jsdwYellowBetOverview.correctionRate jsdwYellowBetOverview.completeRate
}}% }}%
</div> </div>
<div <div
class="descriptions_label" class="descriptions_label"
> >
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -465,7 +465,11 @@
:title="msg.workType" :title="msg.workType"
:content="msg.contentTxt" :content="msg.contentTxt"
:date="msg.releaseTime" :date="msg.releaseTime"
/> >
<template #link>
<div class="message-link" @click="handlePerviewFile(msg)" v-if="msg.files">查看图片</div>
</template>
</datav-message>
</el-scrollbar> </el-scrollbar>
</datav-card> </datav-card>
</el-col> </el-col>
@ -473,6 +477,8 @@
</main> </main>
</div> </div>
</el-scrollbar> </el-scrollbar>
<file-preview :files="files" v-model:show="filePreviewShow" />
</template> </template>
<script setup> <script setup>
@ -490,10 +496,6 @@ import {
getYellowBetDrug, getYellowBetDrug,
} from "@/api/data/supervisionNotify.ts"; } from "@/api/data/supervisionNotify.ts";
import router from "@/router/index.ts"; import router from "@/router/index.ts";
import {
circularChart,
workDynamics,
} from "@/views/datav/simulateData/AnimationTestData.js";
import { workDynamicColorMapping } from "@/enums/workDynamicColorMapping.js"; import { workDynamicColorMapping } from "@/enums/workDynamicColorMapping.js";
import { mapOrgNameMapping } from "@/enums/orgMapping.js"; import { mapOrgNameMapping } from "@/enums/orgMapping.js";
@ -505,7 +507,7 @@ const dict = catchStore.getDicts(["specialSupervision"]);
// region // region
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
@ -518,11 +520,11 @@ const selectedYear = ref(currentYear); // 当前选中的年份
const overview = ref({ const overview = ref({
problemNumber: 0, problemNumber: 0,
rectifingNumber: 0, processingNumber: 0,
rectifedNumber: 0, completedNumber: 0,
departNumber: 0, departNumber: 0,
personNumber: 0, personNumber: 0,
rectifyRate: 0, completedRate: 0,
}); // }); //
const fxsjRankOverview = ref({}); // const fxsjRankOverview = ref({}); //
const jsdwRankOverview = ref({}); // const jsdwRankOverview = ref({}); //
@ -532,15 +534,15 @@ const wtlxList = ref([]); // 问题涉及方面分布
const fxsjYellowBetOverview = ref({ const fxsjYellowBetOverview = ref({
proTotal: 0, proTotal: 0,
changing: 0, processingNumber: 0,
changed: 0, completedNumber: 0,
correctionRate: 0, completedRate: 0,
}); // }); //
const jsdwYellowBetOverview = ref({ const jsdwYellowBetOverview = ref({
proTotal: 0, proTotal: 0,
changing: 0, processingNumber: 0,
changed: 0, completedNumber: 0,
correctionRate: 0, completeRate: 0,
}); // }); //
const fxsjYellowBetRankList = ref([]); // const fxsjYellowBetRankList = ref([]); //
const jsdwYellowBetRankList = ref([]); // const jsdwYellowBetRankList = ref([]); //
@ -637,11 +639,11 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul" > <ul class="tooltip-ul" >
<li>通报问题数 <span>${dataItem.totalPro}</span></li> <li>通报问题数 <span>${dataItem.totalPro}</span></li>
<li>整改 <span>${dataItem.changing}</span></li> <li>办理 <span>${dataItem.processingNumber}</span></li>
<li>整改 <span>${dataItem.changed}</span></li> <li>办结 <span>${dataItem.completedNumber}</span></li>
<li>涉及单位数 <span>${dataItem.relationOrg}</span></li> <li>涉及单位数 <span>${dataItem.relationOrg}</span></li>
<li>涉及人数 <span>${dataItem.personNum}</span></li> <li>涉及人数 <span>${dataItem.personNum}</span></li>
<li>整改 <span>${dataItem.changedRate}%</span></li> <li>办结 <span>${dataItem.completedRate}%</span></li>
</ul> </ul>
</div> </div>
</div>`; </div>`;
@ -651,11 +653,11 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul""> <ul class="tooltip-ul"">
<li>通报问题数 <span>-</span></li> <li>通报问题数 <span>-</span></li>
<li>整改 <span>-</span></li> <li>办理 <span>-</span></li>
<li>整改 <span>-</span></li> <li>办结 <span>-</span></li>
<li>涉及单位数 <span>-</span></li> <li>涉及单位数 <span>-</span></li>
<li>涉及人数 <span>-</span></li> <li>涉及人数 <span>-</span></li>
<li>整改 <span>-</span></li> <li>办结 <span>-</span></li>
</ul> </ul>
</div> </div>
</div>`; </div>`;
@ -792,8 +794,8 @@ const getProblemTypeRateData = async () => {
wtlxList.value = res.wtlxList; wtlxList.value = res.wtlxList;
}; };
const getSupervisionNotifyCountData = async () => { const getSupervisionNotifyCountData = async () => {
const res = await getSupervisionNotifyCount(time.value); const data = await getSupervisionNotifyCount(time.value);
overview.value = res.overview; overview.value = data
}; };
const getSupervisionNotifyMapData = async () => { const getSupervisionNotifyMapData = async () => {
const res = await getSupervisionNotifyMap(time.value); const res = await getSupervisionNotifyMap(time.value);
@ -1095,7 +1097,15 @@ const sceneWorkDynamicsAnimationStop = () => {
); );
}); });
}; };
// endregion
const files = ref([])
const filePreviewShow = ref(false)
function handlePerviewFile(msg) {
if (msg.files) {
filePreviewShow.value = true
files.value = JSON.parse(msg.files)
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -1193,17 +1203,6 @@ const sceneWorkDynamicsAnimationStop = () => {
text-align: center; /* 水平居中 */ text-align: center; /* 水平居中 */
} }
//.tooltip::before {
// content: '';
// position: absolute;
// top: 90px; /* */
// left: -10px; /* */
// width: 0;
// height: 0;
// //border-top: 10px solid red; /* */
// //border-bottom: 10px solid green; /* */
// //border-right: 10px solid blue; /* */
//}
} }
.test { .test {
@ -1225,4 +1224,13 @@ const sceneWorkDynamicsAnimationStop = () => {
width: 90px; width: 90px;
color: #fff; color: #fff;
} }
.message-link {
font-size: 12px;
color: #eee;
&:hover {
cursor: pointer;
text-decoration: underline;
}
}
</style> </style>

41
src/views/datav/VideoInsp.vue

@ -78,29 +78,34 @@
<datav-date-picker v-model="time" /> <datav-date-picker v-model="time" />
<div class="flex gap-42"> <div class="flex gap-42">
<datav-statistic <datav-statistic
:value="overview.discoverProblem" :value="overview.total"
title="查实问题数" title="问题数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="overview.changedProblem" :value="overview.completionProblem"
title="整改问题数" title="办结问题数"
style="width: 20%"
/>
<datav-statistic
:value="overview.discoverProblem"
title="查实问题数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="overview.relativeOrg" :value="overview.relativeOrg"
title="涉及单位数" title="问责单位数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="overview.relativePer" :value="overview.relativePer"
title="涉及人数" title="问责人次"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="overview.changedRate" :value="overview.completionRate"
value-unit="%" value-unit="%"
title="整改率" title="办结率"
style="width: 20%" style="width: 20%"
/> />
</div> </div>
@ -167,6 +172,7 @@
<span>{{ item.rqsj }}</span> <span>{{ item.rqsj }}</span>
</div> </div>
</div> </div>
<el-empty description="暂无数据" v-if="videoInspections.length === 0" />
</el-scrollbar> </el-scrollbar>
</datav-card> </datav-card>
<datav-card title="问题涉及方面分布"> <datav-card title="问题涉及方面分布">
@ -206,28 +212,29 @@ import { onMounted } from "vue";
// region // region
const router = useRouter(); const router = useRouter();
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const proRankTab = ref("1"); const proRankTab = ref("1");
const fxsjRankList = ref([]); const fxsjRankList = ref([]);
const jsdwRankList = ref([]); const jsdwRankList = ref([]);
const overview = ref({ const overview = ref({
total: 0,
discoverProblem: 0, discoverProblem: 0,
changedProblem: 0, completionProblem: 0,
relativeOrg: 0, relativeOrg: 0,
relativePer: 0, relativePer: 0,
changedRate: 0, completionRate: 0,
}); });
const mapIconList = ref([ const mapIconList = ref([
{ {
originalName: "浏阳市局", originalName: "浏阳市局",
name: "浏阳市", name: "浏阳市",
discoverProblem: 135, discoverProblem: 135,
changedProblem: 135, completionProblem: 135,
relativeOrg: 89, relativeOrg: 89,
relativePer: 152, relativePer: 152,
changedRate: 100, completionRate: 100,
}, },
]); ]);
@ -356,10 +363,10 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul" > <ul class="tooltip-ul" >
<li>查实问题数 <span>${dataItem.discoverProblem}</span></li> <li>查实问题数 <span>${dataItem.discoverProblem}</span></li>
<li>整改问题数 <span>${dataItem.changedProblem}</span></li> <li>办结问题数 <span>${dataItem.completionProblem}</span></li>
<li>涉及单位数 <span>${dataItem.relativeOrg}</span></li> <li>涉及单位数 <span>${dataItem.relativeOrg}</span></li>
<li>涉及人数 <span>${dataItem.relativePer}</span></li> <li>涉及人数 <span>${dataItem.relativePer}</span></li>
<li>整改 <span>${dataItem.changedRate}%</span></li> <li>办结 <span>${dataItem.completionRate}%</span></li>
</ul> </ul>
</div> </div>
</div>`; </div>`;
@ -369,10 +376,10 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul""> <ul class="tooltip-ul"">
<li>查实问题数 <span>-</span></li> <li>查实问题数 <span>-</span></li>
<li>整改问题数 <span>-</span></li> <li>办结问题数 <span>-</span></li>
<li>涉及单位数 <span>-</span></li> <li>涉及单位数 <span>-</span></li>
<li>涉及人数 <span>-</span></li> <li>涉及人数 <span>-</span></li>
<li>整改 <span>-</span></li> <li>办结 <span>-</span></li>
</ul> </ul>
</div> </div>
</div>`; </div>`;

2
src/views/datav/subonedatav/SubOneAuditSuper.vue

@ -164,7 +164,7 @@ import moment from "moment/moment.js";
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const temp = ref({ const temp = ref({

2
src/views/datav/subonedatav/SubOneCaseVerif.vue

@ -198,7 +198,7 @@ const currentYear = new Date().getFullYear();
const years = ref([currentYear.toString(), (currentYear - 1).toString(), (currentYear - 2).toString()]); // const years = ref([currentYear.toString(), (currentYear - 1).toString(), (currentYear - 2).toString()]); //
const selectedYear = ref(currentYear); // const selectedYear = ref(currentYear); //
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const route = useRoute(); const route = useRoute();

2
src/views/datav/subonedatav/SubOneGlobal.vue

@ -182,7 +182,7 @@ const overview = ref({
auditPro: 0, auditPro: 0,
}); // }); //
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const globalTempMapVoList = ref([]); // const globalTempMapVoList = ref([]); //

2
src/views/datav/subonedatav/SubOneMailVisits.vue

@ -418,7 +418,7 @@ const bwzdLeaderReviewMailList = ref([]); // 分局领导督察
const bwzdEntanglementMailList = ref([]); // const bwzdEntanglementMailList = ref([]); //
const bwzdMassMailList = ref([]); // 访 const bwzdMassMailList = ref([]); // 访
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();

2
src/views/datav/subonedatav/SubOneRightsComfort.vue

@ -237,7 +237,7 @@ const currentMapData = ref({})
const chart = ref(null); // const chart = ref(null); //
const currentDepartId = route.query.departId; const currentDepartId = route.query.departId;
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const fxsjRightsRank = ref([ const fxsjRightsRank = ref([

66
src/views/datav/subonedatav/SubOneSceneInsp.vue

@ -30,7 +30,7 @@
{{ fxsjRankOverview.changing }} {{ fxsjRankOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -40,7 +40,7 @@
{{ fxsjRankOverview.changed }} {{ fxsjRankOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -60,7 +60,7 @@
:data="fxsjChangedRankList" :data="fxsjChangedRankList"
size="small" size="small"
title="整改率排名" title="整改率排名"
sub-title="已整改/问题数" sub-title="已办结/问题数"
unit="%" unit="%"
:label-width="110" :label-width="110"
:color="dayTimeColors" :color="dayTimeColors"
@ -85,7 +85,7 @@
{{ jsdwRankOverview.changing }} {{ jsdwRankOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -95,7 +95,7 @@
{{ jsdwRankOverview.changed }} {{ jsdwRankOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -115,7 +115,7 @@
:data="jsdwChangedRankList" :data="jsdwChangedRankList"
size="small" size="small"
title="整改率排名" title="整改率排名"
sub-title="已整改/问题数" sub-title="已办结/问题数"
unit="%" unit="%"
:label-width="110" :label-width="110"
:color="dayTimeColors" :color="dayTimeColors"
@ -146,12 +146,12 @@
/> />
<datav-statistic <datav-statistic
:value="overview.supervisionNotifyChangingTotal" :value="overview.supervisionNotifyChangingTotal"
title="整改中" title="办理中"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
:value="overview.supervisionNotifyChangedTotal" :value="overview.supervisionNotifyChangedTotal"
title="已整改" title="已办结"
style="width: 16.66%" style="width: 16.66%"
/> />
<datav-statistic <datav-statistic
@ -224,7 +224,7 @@
{{ fxsjYellowBetOverview.changing }} {{ fxsjYellowBetOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -234,7 +234,7 @@
{{ fxsjYellowBetOverview.changed }} {{ fxsjYellowBetOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -278,7 +278,7 @@
{{ jsdwYellowBetOverview.changing }} {{ jsdwYellowBetOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -288,7 +288,7 @@
{{ jsdwYellowBetOverview.changed }} {{ jsdwYellowBetOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -337,7 +337,7 @@
{{ fxsjGunControllerOverview.changing }} {{ fxsjGunControllerOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -347,7 +347,7 @@
{{ fxsjGunControllerOverview.changed }} {{ fxsjGunControllerOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -390,7 +390,7 @@
{{ jsdwGunControllerOverview.changing }} {{ jsdwGunControllerOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -400,7 +400,7 @@
{{ jsdwGunControllerOverview.changed }} {{ jsdwGunControllerOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -449,7 +449,7 @@
{{ fxsjCompanyProblemOverview.changing }} {{ fxsjCompanyProblemOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -459,7 +459,7 @@
{{ fxsjCompanyProblemOverview.changed }} {{ fxsjCompanyProblemOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -502,7 +502,7 @@
{{ jsdwCompanyProblemOverview.changing }} {{ jsdwCompanyProblemOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -512,7 +512,7 @@
{{ jsdwCompanyProblemOverview.changed }} {{ jsdwCompanyProblemOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -561,7 +561,7 @@
{{ fxsjHandleCaseOverview.changing }} {{ fxsjHandleCaseOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -571,7 +571,7 @@
{{ fxsjHandleCaseOverview.changed }} {{ fxsjHandleCaseOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -614,7 +614,7 @@
{{ jsdwHandleCaseOverview.changing }} {{ jsdwHandleCaseOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -624,7 +624,7 @@
{{ jsdwHandleCaseOverview.changed }} {{ jsdwHandleCaseOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -673,7 +673,7 @@
{{ fxsjCheckBeerOverview.changing }} {{ fxsjCheckBeerOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -683,7 +683,7 @@
{{ fxsjCheckBeerOverview.changed }} {{ fxsjCheckBeerOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -726,7 +726,7 @@
{{ jsdwCheckBeerOverview.changing }} {{ jsdwCheckBeerOverview.changing }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办理
</div> </div>
</div> </div>
</el-col> </el-col>
@ -736,7 +736,7 @@
{{ jsdwCheckBeerOverview.changed }} {{ jsdwCheckBeerOverview.changed }}
</div> </div>
<div class="descriptions_label"> <div class="descriptions_label">
整改 办结
</div> </div>
</div> </div>
</el-col> </el-col>
@ -805,7 +805,7 @@ import {workDynamicColorMapping} from "@/enums/workDynamicColorMapping.js";
// region // region
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const route = useRoute(); const route = useRoute();
@ -972,8 +972,8 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul" > <ul class="tooltip-ul" >
<li>通报问题数 <span>${dataItem.totalPro}</span></li> <li>通报问题数 <span>${dataItem.totalPro}</span></li>
<li>整改 <span>${dataItem.changing}</span></li> <li>办理 <span>${dataItem.changing}</span></li>
<li>整改 <span>${dataItem.changed}</span></li> <li>办结 <span>${dataItem.changed}</span></li>
<li>涉及单位数 <span>${dataItem.relationOrg}</span></li> <li>涉及单位数 <span>${dataItem.relationOrg}</span></li>
<li>涉及人数 <span>${dataItem.personNum}</span></li> <li>涉及人数 <span>${dataItem.personNum}</span></li>
<li>整改率 <span>${dataItem.changedRate}%</span></li> <li>整改率 <span>${dataItem.changedRate}%</span></li>
@ -986,8 +986,8 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul""> <ul class="tooltip-ul"">
<li>通报问题数 <span>-</span></li> <li>通报问题数 <span>-</span></li>
<li>整改 <span>-</span></li> <li>办理 <span>-</span></li>
<li>整改 <span>-</span></li> <li>办结 <span>-</span></li>
<li>涉及单位数 <span>-</span></li> <li>涉及单位数 <span>-</span></li>
<li>涉及人数 <span>-</span></li> <li>涉及人数 <span>-</span></li>
<li>整改率 <span>-</span></li> <li>整改率 <span>-</span></li>

26
src/views/datav/subonedatav/SubOneVideoInsp.vue

@ -83,8 +83,8 @@
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="overview.changedProblem" :value="overview.completionProblem"
title="整改问题数" title="办结问题数"
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
@ -98,9 +98,9 @@
style="width: 20%" style="width: 20%"
/> />
<datav-statistic <datav-statistic
:value="overview.changedRate" :value="overview.completionRate"
value-unit="%" value-unit="%"
title="整改率" title="办结率"
style="width: 20%" style="width: 20%"
/> />
</div> </div>
@ -210,27 +210,27 @@ import { listVideoInspection } from "@/api/data/videoInspection";
const route = useRoute(); const route = useRoute();
const currentDepartId = route.query.departId; const currentDepartId = route.query.departId;
const time = ref([ const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"), moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"), moment().format("YYYY-MM-DD"),
]); ]);
const fxsjRankList = ref([]); const fxsjRankList = ref([]);
const jsdwRankList = ref([]); const jsdwRankList = ref([]);
const overview = ref({ const overview = ref({
discoverProblem: 0, discoverProblem: 0,
changedProblem: 0, completionProblem: 0,
relativeOrg: 0, relativeOrg: 0,
relativePer: 0, relativePer: 0,
changedRate: 0, completionRate: 0,
}); });
const mapIconList = ref([ const mapIconList = ref([
{ {
originalName: "浏阳市局", originalName: "浏阳市局",
name: "浏阳市", name: "浏阳市",
discoverProblem: 135, discoverProblem: 135,
changedProblem: 135, completionProblem: 135,
relativeOrg: 89, relativeOrg: 89,
relativePer: 152, relativePer: 152,
changedRate: 100, completionRate: 100,
}, },
]); ]);
@ -358,10 +358,10 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul" > <ul class="tooltip-ul" >
<li>发现问题数 <span>${dataItem.discoverProblem}</span></li> <li>发现问题数 <span>${dataItem.discoverProblem}</span></li>
<li>整改问题数 <span>${dataItem.changedProblem}</span></li> <li>办结问题数 <span>${dataItem.completionProblem}</span></li>
<li>涉及单位数 <span>${dataItem.relativeOrg}</span></li> <li>涉及单位数 <span>${dataItem.relativeOrg}</span></li>
<li>涉及人数 <span>${dataItem.relativePer}</span></li> <li>涉及人数 <span>${dataItem.relativePer}</span></li>
<li>整改 <span>${dataItem.changedRate}%</span></li> <li>办结 <span>${dataItem.completionRate}%</span></li>
</ul> </ul>
</div> </div>
</div>`; </div>`;
@ -371,10 +371,10 @@ const option = ref({
<div class="tooltip-content"> <div class="tooltip-content">
<ul class="tooltip-ul""> <ul class="tooltip-ul"">
<li>发现问题数 <span>-</span></li> <li>发现问题数 <span>-</span></li>
<li>整改问题数 <span>-</span></li> <li>办结问题数 <span>-</span></li>
<li>涉及单位数 <span>-</span></li> <li>涉及单位数 <span>-</span></li>
<li>涉及人数 <span>-</span></li> <li>涉及人数 <span>-</span></li>
<li>整改 <span>-</span></li> <li>办结 <span>-</span></li>
</ul> </ul>
</div> </div>
</div>`; </div>`;

206
src/views/mobileSupervise/Inspection.vue

@ -58,7 +58,7 @@
/> />
<el-table-column <el-table-column
label="参与人员" label="参与人员"
prop="testingPerson" prop="persons"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
@ -67,7 +67,11 @@
width="100" width="100"
align="center" align="center"
/> />
<el-table-column label="任务内容" prop="taskContent" /> <el-table-column
label="任务内容"
prop="taskContent"
show-overflow-tooltip
/>
<el-table-column label="督察时间" prop="updateTime" width="280"> <el-table-column label="督察时间" prop="updateTime" width="280">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ row.beginTime }}</span> <span>{{ row.beginTime }}</span>
@ -81,12 +85,22 @@
<span v-if="row.taskStatus === 'done'">已完成</span> <span v-if="row.taskStatus === 'done'">已完成</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="被督察单位数" prop="" /> <el-table-column label="被督察单位数" prop="departNumber" align="center" />
<el-table-column label="发现问题数" prop="" /> <el-table-column label="发现问题数" prop="problemNumber" align="center" />
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link>查看详情</el-button> <el-button
<el-button type="primary" link>问题清单</el-button> type="primary"
link
@click="handleShowDetail(row)"
>查看详情</el-button
>
<el-button
type="primary"
link
@click="handleProblemsShow(row)"
>问题清单</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -112,7 +126,7 @@
top="5vh" top="5vh"
style="margin-bottom: 0" style="margin-bottom: 0"
> >
<el-scrollbar max-height="66vh"> <el-scrollbar max-height="76vh">
<el-form <el-form
:label-width="150" :label-width="150"
ref="formRef" ref="formRef"
@ -195,32 +209,163 @@
</div> </div>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="任务内容" prop="taskContentHtml"
prop="times"
:rules="{ :rules="{
required: true, required: true,
message: '请选择', message: '请输入任务内容'
}" }"
label-position="top"
> >
<el-input <div style="width: 100%">
type="textarea" <quill-editor
v-model="form.taskContent" ref="quillRef"
:autosize="{ minRows: 6 }" v-model="form.taskContentHtml"
style="
min-height: 200px;
max-height: 360px;
overflow: auto;
"
/> />
</div>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-scrollbar> </el-scrollbar>
<footer class="flex end mt-20"> <footer class="flex end mt-20">
<el-button type="primary" @click="submit" size="large" <el-button type="primary" @click="submit" size="large"
>发布</el-button >发布</el-button>
</footer>
</el-dialog>
<el-dialog title="任务详情" v-model="detailShow" width="40vw">
<div class="row mb-40">
<div class="col col-24">
<label>任务名称</label>
<span>{{ activeRow.taskName }}</span>
</div>
<div class="col col-24">
<label>督察单位</label>
<span>{{ activeRow.supDepartName }}</span>
</div>
<div class="col col-24">
<label>参与人员</label>
<span>{{ activeRow.persons }}</span>
</div>
<div class="col col-24">
<label>任务类型</label>
<span>{{ activeRow.supervisionType }}</span>
</div>
<div class="col col-24">
<label>督察时间</label>
<span
><span>{{ activeRow.beginTime }}</span>
<span>-</span>
<span>{{ activeRow.endTime }}</span></span
> >
</div>
<div class="col col-24">
<label>任务内容</label>
<span>{{ activeRow.taskContent }}</span>
</div>
</div>
<footer class="flex end mt-20">
<el-button size="large" @click="detailShow = false">关闭</el-button>
</footer> </footer>
</el-dialog> </el-dialog>
<el-dialog
title="问题清单"
v-model="problemsShow"
width="60vw"
style="margin-bottom: 0"
>
<header class="mb-20">
<el-form :label-width="94">
<el-row>
<el-col :span="6">
<el-form-item label="具体情况">
<el-input
v-model="problemQuery.detail"
clearable
placeholder="请输入具体情况"
/>
</el-form-item>
</el-col>
</el-row>
<div class="flex end">
<el-button type="primary" @click="getProblems">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="problemReset">重置</el-button>
</div>
</el-form>
</header>
<div style="min-height: 400px">
<div class="table-container">
<el-table :data="problems" :max-height="640" min-height="300">
<el-table-column
label="是否存在督察问题"
prop="hasProblem"
width="120"
align="center"
>
<template #default="{ row }">
<span v-if="row.hasProblem"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column
label="单位"
prop="departName"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="问题类型"
prop="problemType"
width="140"
show-overflow-tooltip
/>
<el-table-column label="具体情况" prop="detail" />
<el-table-column
label="创建时间"
prop="createTime"
width="160"
/>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowPeople(row)"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getProblems"
@current-change="getProblems"
:page-sizes="[10, 20, 50]"
v-model:page-size="problemQuery.size"
v-model:current-page="problemQuery.current"
layout="total, sizes, prev, pager, next"
:total="problemTotal"
>
</el-pagination>
</div>
</div>
</el-dialog>
</template> </template>
<script setup> <script setup>
import { import {
listInspection, listInspection,
addInspection, addInspection,
listInspectionProblems,
} from "@/api/mobileSupervision/inspection"; } from "@/api/mobileSupervision/inspection";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
@ -256,17 +401,48 @@ const show = ref(false);
const form = ref({}); const form = ref({});
const formRef = ref(null); const formRef = ref(null);
const quillRef = ref()
async function submit() { async function submit() {
await formRef.value.validate(); await formRef.value.validate();
form.value.taskContent = quillRef.value.getText()
await addInspection(form.value); await addInspection(form.value);
feedback.msgSuccess("发布成功"); feedback.msgSuccess("发布成功");
show.value = false; show.value = false;
getList(); getList();
form.value = {};
} }
function handleShowAdd() { function handleShowAdd() {
show.value = true; show.value = true;
} }
const detailShow = ref(false);
const activeRow = ref({});
function handleShowDetail(row) {
activeRow.value = row;
detailShow.value = true;
}
const problemsShow = ref(false);
const problems = ref([]);
const problemQuery = ref({});
const problemTotal = ref(0);
function handleProblemsShow(row) {
activeRow.value = row;
problemsShow.value = true;
getProblems();
}
function getProblems() {
listInspectionProblems(activeRow.value.id).then((data) => {
problems.value = data.records;
});
}
function problemReset() {
problemQuery.value = {};
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
h5 { h5 {

464
src/views/mobileSupervise/Selfexamination.vue

@ -0,0 +1,464 @@
<template>
<div class="container">
<header class="mb-20">
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="督察单位">
<depart-tree-select v-model="query.departId" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="任务名称">
<el-input
placeholder="请输入任务名称"
v-model="query.nickName"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="自查类型">
<el-select v-model="form.supervisionType" clearable>
<el-option
v-for="item in dict.supervisionType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex between">
<el-button type="primary" @click="handleShowAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
发布任务</el-button
>
<div>
<el-button type="primary" @click="getList">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="reset">重置</el-button>
</div>
</div>
</header>
<div class="table-container">
<el-table :data="list">
<el-table-column label="任务名称" prop="taskName" />
<el-table-column
label="自查单位"
prop="supDepartName"
width="120"
/>
<el-table-column
label="自查类型"
prop="type"
width="100"
align="center"
/>
<el-table-column
label="任务要求"
prop="requirement"
show-overflow-tooltip
/>
<el-table-column
label="自查内容"
prop="requirement"
show-overflow-tooltip
/>
<el-table-column label="任务时间" prop="updateTime" width="280">
<template #default="{ row }">
<span>{{ row.beginTime }}</span>
<span>-</span>
<span>{{ row.endTime }}</span>
</template>
</el-table-column>
<el-table-column label="任务状态" align="center">
<template #default="{ row }">
<span v-if="row.taskStatus === 'todo'">执行中</span>
<span v-if="row.taskStatus === 'done'">已完成</span>
</template>
</el-table-column>
<el-table-column
label="发现问题数"
prop="problemNumber"
align="center"
/>
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowDetail(row)"
>查看详情</el-button
>
<el-button
type="primary"
link
@click="handleProblemsShow(row)"
>自查情况</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
>
</el-pagination>
</div>
</div>
<el-dialog
title="发布任务"
v-model="show"
width="1076px"
top="2vh"
style="margin-bottom: 0"
>
<el-scrollbar max-height="80vh">
<el-form
:label-width="150"
ref="formRef"
:model="form"
style="min-height: 66vh"
>
<el-form-item
label="任务名称"
:rules="{
required: true,
message: '请输入任务名称',
trigger: ['blur'],
}"
prop="taskName"
>
<el-input
v-model="form.taskName"
placeholder="请输入任务名称"
/>
</el-form-item>
<el-form-item
label="自查单位"
:rules="{
required: true,
message: '请选择',
}"
prop="supDepartId"
>
<div style="width: 300px">
<depart-tree-select v-model="form.supDepartId" :check-strictly="false" />
</div>
</el-form-item>
<el-form-item
label="自查类型"
:rules="{
required: true,
message: '请选择',
}"
prop="type"
>
<el-select
v-model="form.type"
clearable
style="width: 300px"
>
<el-option
v-for="item in dict.supervisionType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label="任务时间"
prop="times"
:rules="{
required: true,
message: '请选择',
}"
>
<div style="width: 800px">
<el-date-picker
v-model="form.times"
type="datetimerange"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
/>
</div>
</el-form-item>
<el-divider />
<el-form-item
prop="requirementHtml"
:rules="{
required: true,
message: '请输入任务内容',
}"
label-position="top"
>
<template #label>
<span
class="text-primary"
style="font-size: 16px; font-weight: 500"
>任务要求</span
>
</template>
<div style="width: 100%">
<quill-editor
ref="quillRef"
v-model="form.requirementHtml"
style="min-height: 120px; overflow: auto"
/>
</div>
</el-form-item>
<el-form-item
prop="contents"
:rules="{
validator: validateContents,
}"
label-position="top"
>
<template #label>
<div class="flex between">
<h5 style="margin-top: 0">自查内容</h5>
<el-button
size="small"
type="primary"
plain
@click="form.contents.push({})"
>
<template #icon>
<icon name="el-icon-Plus" />
</template>
添加自查内容</el-button
>
</div>
</template>
<div
style="min-height: 80px; overflow: hidden; width: 100%"
>
<el-row :gutter="20">
<el-col
:span="12"
v-for="(item, index) in form.contents"
:key="index"
>
<div class="flex between mb-8">
<span>自查内容{{ index + 1 }}</span>
<el-button
size="small"
type="danger"
plain
@click="form.contents.push({})"
>
<template #icon>
<icon name="el-icon-Delete" />
</template>
删除</el-button
>
</div>
<el-form-item
:prop="`contents.${index}.title`"
:rules="{
required: true,
message: '请输入自查项目',
}"
label-position="top"
>
<el-input
placeholder="请输入自查项目"
v-model="item.title"
class="mb-18"
/>
</el-form-item>
<el-form-item
:prop="`contents.${index}.content`"
:rules="{
required: true,
message: '请输入任务内容',
}"
label-position="top"
style="margin-bottom: 32px"
>
<el-input
type="textarea"
placeholder="请输入工作要求"
v-model="item.content"
/>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form-item>
</el-form>
</el-scrollbar>
<footer class="flex end mt-20">
<el-button type="primary" @click="submit" size="large"
>发布</el-button
>
</footer>
</el-dialog>
<el-dialog title="任务详情" v-model="detailShow" width="40vw">
<div style="padding: 0 40px">
<div class="row">
<div class="col col-24">
<label>任务名称</label>
<span>{{ activeRow.taskName }}</span>
</div>
<div class="col col-24">
<label>自查单位</label>
<span>{{ activeRow.supDepartName }}</span>
</div>
<div class="col col-24">
<label>自查类型</label>
<span>{{ activeRow.type }}</span>
</div>
<div class="col col-24">
<label>任务时间</label>
<span
><span>{{ activeRow.beginTime }}</span>
<span>-</span>
<span>{{ activeRow.endTime }}</span></span
>
</div>
</div>
<h5 style="margin-top: 10px">任务要求</h5>
<div v-html="activeRow.requirementHtml"></div>
<h5>自查内容</h5>
<el-row>
<el-col
:span="12"
v-for="(item, index) in activeRow.contents"
:key="index"
>
<div style="font-size: 16px" class="mb-8">{{ index + 1}} {{ item.title }}</div>
<div>{{ item.content }}</div>
</el-col>
</el-row>
</div>
<footer class="flex end mt-20">
<el-button size="large" @click="detailShow = false">关闭</el-button>
</footer>
</el-dialog>
</template>
<script setup>
import {
listSelfexamination,
addSelfexamination,
getSelfexaminationDetail,
} from "@/api/mobileSupervision/selfexamination";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["supervisionType"]);
const list = ref([]);
const query = ref({
current: 1,
size: 10,
});
const total = ref(0);
function getList() {
listSelfexamination(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
current: 1,
size: 10,
};
getList();
}
getList();
const show = ref(false);
const form = ref({
contents: [],
});
const formRef = ref(null);
const quillRef = ref();
async function submit() {
await formRef.value.validate();
form.value.requirement = quillRef.value.getText();
await addSelfexamination(form.value);
feedback.msgSuccess("发布成功");
show.value = false;
getList();
form.value = {
contents: [],
};
}
function handleShowAdd() {
show.value = true;
}
const detailShow = ref(false);
const activeRow = ref({});
async function handleShowDetail(row) {
detailShow.value = true;
const data = await getSelfexaminationDetail(row.id);
activeRow.value = data;
}
const problemsShow = ref(false);
const problems = ref([]);
const problemQuery = ref({});
const problemTotal = ref(0);
function handleProblemsShow(row) {
activeRow.value = row;
problemsShow.value = true;
getProblems();
}
function getProblems() {
listInspectionProblems(activeRow.value.id).then((data) => {
problems.value = data.records;
});
}
function problemReset() {
problemQuery.value = {};
}
function validateContents(rule, value, cb) {
if (value.length === 0) {
cb(new Error("请添加自查内容"));
} else {
cb();
}
}
</script>
<style lang="scss" scoped>
h5 {
margin-bottom: 10px;
}
.pepole-container > * {
margin-bottom: 8px;
}
</style>

175
src/views/mobileSupervise/TaskProblem.vue

@ -0,0 +1,175 @@
<template>
<div class="container">
<header class="mb-20">
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="涉及单位">
<depart-tree-select v-model="query.departId" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="问题来源">
<el-select
clearable
v-model="query.taskType"
>
<el-option
v-for="item in dict.taskType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="问题描述">
<el-input placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="分发状态">
<el-select
v-model="query.distributionState"
clearable
>
<el-option
v-for="item in dict.distributionState"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex between">
<el-button type="primary" @click="">
生成督察通报</el-button
>
<div>
<el-button type="primary" @click="getList">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="reset">重置</el-button>
</div>
</div>
</header>
<div class="table-container">
<el-table :data="list">
<el-table-column label="发现时间" prop="createTime" />
<el-table-column label="问题来源" >
<template #default="{ row }">
<span>{{ getDictLable(dict.taskType, row.taskType) }}</span>
</template>
</el-table-column>
<el-table-column
label="涉及单位"
prop="departName"
width="120"
/>
<el-table-column
label="涉及人员"
prop="peoples"
show-overflow-tooltip
/>
<el-table-column
label="问题类型"
prop="problemType"
width="100"
align="center"
/>
<el-table-column
label="问题描述"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column label="分发状态">
<template #default="{ row }">
<span v-if="row.taskStatus === 'todo'">执行中</span>
<span v-if="row.taskStatus === 'done'">已完成</span>
</template>
</el-table-column>
<el-table-column label="操作" width="240">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowDetail(row)"
>问题详情</el-button
>
<el-button
type="primary"
link
@click="handleProblemsShow(row)"
>问题下发</el-button
>
<el-button
type="primary"
link
@click="handleProblemsShow(row)"
>处置情况</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
>
</el-pagination>
</div>
</div>
</template>
<script setup>
import { getDictLable } from "@/utils/util";
import { listTaskProblem } from '@/api/mobileSupervision/taskProblem'
import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["taskType", "distributionState"]);
const taskTypes = [
{
dictLabel: '测酒任务',
dictValue: ''
},
{
dictLabel: '督察任务',
dictValue: ''
},
{
dictLabel: '所队自查',
dictValue: ''
}
];
const query = ref({})
const list = ref([])
const total = ref(0)
function getList() {
listTaskProblem(query.value).then(data => {
list.value = data.records
})
}
onMounted(() => {
getList()
})
</script>
<style lang="scss" scoped>
</style>

376
src/views/mobileSupervise/TestingAlcohol.vue

@ -39,35 +39,61 @@
<div class="table-container"> <div class="table-container">
<el-table :data="list"> <el-table :data="list">
<el-table-column label="任务名称" prop="taskName" /> <el-table-column label="任务名称" prop="taskName" />
<el-table-column label="检测单位" prop="supDepartName" width="120" />
<el-table-column label="检测人员" prop="persons" show-overflow-tooltip />
<el-table-column label="抽检人数" prop="totalNumber" width="100" align="center" />
<el-table-column <el-table-column
label="检测时间" label="检测单位"
prop="updateTime" prop="supDepartName"
width="280" width="120"
> />
<el-table-column
label="检测人员"
prop="persons"
show-overflow-tooltip
/>
<el-table-column label="检测时间" prop="updateTime" width="280">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ row.beginTime }}</span> <span>{{ row.beginTime }}</span>
<span>-</span> <span>-</span>
<span>{{ row.endTime }}</span> <span>{{ row.endTime }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="未检测人数" prop="notDetectedNumber" width="100" align="center" /> <el-table-column
<el-table-column label="未饮酒人数" prop="notDrinkingNumber" width="100" align="center" /> label="抽检人数"
<el-table-column label="饮酒人数" prop="drinkNumber" width="100" align="center" /> prop="totalNumber"
width="100"
align="center"
/>
<el-table-column
label="未检测人数"
prop="notDetectedNumber"
width="100"
align="center"
/>
<el-table-column
label="未饮酒人数"
prop="notDrinkingNumber"
width="100"
align="center"
/>
<el-table-column
label="饮酒人数"
prop="drinkNumber"
width="100"
align="center"
/>
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
type="primary" type="primary"
link link
@click="handleShowDetail(row)"
>任务详情</el-button> >任务详情</el-button
>
<el-button <el-button
type="primary" type="primary"
link link
@click="handleTestingDetailShow(row)"
>检测情况</el-button> >检测情况</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -134,7 +160,7 @@
}" }"
prop="persons" prop="persons"
> >
<police-picker v-model="form.persons" /> <police-picker v-model="form.persons" :departId="form.supDepartId" />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
label="检测时间" label="检测时间"
@ -364,14 +390,255 @@
> >
</footer> </footer>
</el-dialog> </el-dialog>
<el-dialog title="任务详情" v-model="detailShow" width="40vw">
<div class="row mb-40">
<div class="col col-24">
<label>任务名称</label>
<span>{{ activeRow.taskName }}</span>
</div>
<div class="col col-24">
<label>检测单位</label>
<span>{{ activeRow.supDepartName }}</span>
</div>
<div class="col col-24">
<label>检测人员</label>
<span>{{ activeRow.persons }}</span>
</div>
<div class="col col-24">
<label>检测时间</label>
<span
><span>{{ activeRow.beginTime }}</span>
<span>-</span>
<span>{{ activeRow.endTime }}</span></span
>
</div>
<div class="col col-24">
<label>抽检人数</label>
<span>{{ activeRow.totalNumber }}</span>
</div>
<div class="col col-12">
<label>未饮酒人数</label>
<span>{{ activeRow.notDrinkingNumber }}</span>
</div>
<div class="col col-12">
<label>饮酒人数</label>
<span>{{ activeRow.drinkNumber }}</span>
</div>
<div class="col col-12">
<label>未检测人数</label>
<span>{{ activeRow.notDetectedNumber }}</span>
</div>
</div>
<footer class="flex end mt-20">
<el-button size="large" @click="detailShow = false">关闭</el-button>
</footer>
</el-dialog>
<el-dialog
title="检测情况"
v-model="testingDetailShow"
width="60vw"
top="2vh"
style="margin-bottom: 0"
>
<header class="mb-20">
<el-form :label-width="94">
<el-row>
<el-col :span="6">
<el-form-item label="姓名">
<el-input
v-model="peopleQuery.name"
clearable
placeholder="请输入警员姓名"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="警号">
<el-input
v-model="peopleQuery.empNo"
clearable
placeholder="请输入警号"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="检测情况">
<el-select
clearable
v-model="peopleQuery.testingResult"
>
<el-option value="已检测">已检测</el-option>
<el-option value="未检测">未检测</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col
:span="6"
v-if="peopleQuery.testingResult === '已检测'"
>
<el-form-item label="饮酒结果">
<el-select
clearable
v-model="peopleQuery.drinkResult"
>
<el-option value="饮酒">饮酒</el-option>
<el-option value="未饮酒">未饮酒</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="flex end">
<el-button type="primary" @click="getPolices">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="peopleReset">重置</el-button>
</div>
</el-form>
</header>
<div class="table-container">
<el-table :data="peoples" :max-height="640">
<el-table-column width="60" align="center">
<template #default="{ row }">
<img
class="avatar"
:src="`${BASE_PATH}/file/stream/${row.avatarUrl}`"
v-if="row.avatarUrl"
/>
<img class="avatar" src="/imgs/police.png" v-else />
</template>
</el-table-column>
<el-table-column label="姓名" prop="name" width="80" />
<el-table-column label="警号" prop="empNo" width="80" />
<el-table-column
label="单位"
prop="departName"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="检测情况"
prop="testingResult"
width="90"
/>
<el-table-column
label="测酒时间"
prop="testingTime"
width="160"
/>
<el-table-column label="饮酒情况/未检测原因" show-overflow-tooltip>
<template #default="{ row }">
<el-tag type="success" v-if="row.drinkResult === '未饮酒'">未饮酒</el-tag>
<el-tag type="error" v-if="row.drinkResult === '饮酒'">饮酒</el-tag>
<span v-if="row.drinkResult === '饮酒'" class="ml-10">(酒精含量{{ row.alcoholContent }} mg/100ml)</span>
<span>{{ row.unTestingDesc }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowPeople(row)"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getPolices"
@current-change="getPolices"
:page-sizes="[10, 20, 50]"
v-model:page-size="peopleQuery.size"
v-model:current-page="peopleQuery.current"
layout="total, sizes, prev, pager, next"
:total="peopleTotal"
>
</el-pagination>
</div>
</el-dialog>
<el-dialog title="人员检测情况" v-model="peopleDetailShow" width="40vw">
<div style="width: 600px; margin: auto">
<el-row>
<el-col :span="6">
<img
style="height: 100px"
:src="`${BASE_PATH}/file/stream/${activePeople.avatarUrl}`"
v-if="activePeople.avatarUrl"
/>
<img style="height: 100px" src="/imgs/police.png" v-else />
</el-col>
<el-col :span="18">
<div class="row">
<div class="col col-12">
<label>姓名</label>
<span>{{ activePeople.name }}</span>
</div>
<div class="col col-12">
<label>警号</label>
<span>{{ activePeople.empNo }}</span>
</div>
<div class="col col-24">
<label>警号</label>
<span>{{ activePeople.idCode }}</span>
</div>
<div class="col col-24">
<label>单位</label>
<span>{{ activePeople.departName }}</span>
</div>
</div>
</el-col>
</el-row>
<el-divider />
<div class="row">
<div class="col col-24">
<label>检测情况</label>
<span>{{ activePeople.testingResult }}</span>
</div>
<div class="col col-12">
<label>饮酒结果</label>
<span>{{ activePeople.drinkResult }}</span>
</div>
<div class="col col-12" v-if="activePeople.drinkResult === '饮酒'">
<label>酒精含量</label>
<span>{{ activePeople.alcoholContent }} mg/100ml</span>
</div>
<div class="col col-24" v-if="activePeople.unTestingDesc">
<label>未检测原因</label>
<span>{{ activePeople.unTestingDesc }} mg/100ml</span>
</div>
</div>
<div v-if="activePeople.testingFileList.length">
<div class="mb-8">测酒现场照片</div>
<file-list v-model:files="activePeople.testingFileList" />
</div>
</div>
<footer class="flex end mt-20">
<el-button size="large" @click="peopleDetailShow = false">关闭</el-button>
</footer>
</el-dialog>
</template> </template>
<script setup> <script setup>
import { listTestingAlcohol, addTestingAlcohol, getPersonNumber } from "@/api/mobileSupervision/testingAlcohol"; import { BASE_PATH } from "@/api/request";
import {
listTestingAlcohol,
addTestingAlcohol,
getPersonNumber,
listTestingAlcoholPeoples,
} from "@/api/mobileSupervision/testingAlcohol";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
const dict = catchStore.getDicts([, "personType"]); const dict = catchStore.getDicts(["personType"]);
const list = ref([]); const list = ref([]);
const query = ref({ const query = ref({
@ -411,10 +678,14 @@ const formRef = ref(null);
async function submit() { async function submit() {
await formRef.value.validate(); await formRef.value.validate();
if (form.value.peoples.length === 0) {
feedback.msgWarning("请生成抽检对象");
return
}
await addTestingAlcohol(form.value); await addTestingAlcohol(form.value);
feedback.msgSuccess('发布成功') feedback.msgSuccess("发布成功");
show.value = false; show.value = false;
getList() getList();
} }
async function handleGetPersonNumber(item) { async function handleGetPersonNumber(item) {
@ -430,11 +701,19 @@ function handleShowAdd() {
show.value = true; show.value = true;
} }
function handleGenPeople() { async function handleGenPeople() {
const sum = form.value.filterPeopleConditions const arr = form.value.filterPeopleConditions
.filter((item) => item.polices) .filter((item) => item.polices).map((item) => item.polices.length);
.map((item) => item.polices.length) if (arr.length === 0) {
.reduce((a, b) => a + b); feedback.msgWarning('请选择被抽检对象')
return
}
const sum = arr.reduce((a, b) => a + b);
if (form.value.filterPeopleNumber > sum) {
await feedback.confirm(`被抽检对象人数小于抽检人数,是否将抽检人数调整为${sum}`);
form.value.filterPeopleNumber = sum
}
const peoples = []; const peoples = [];
form.value.filterPeopleConditions form.value.filterPeopleConditions
.filter((item) => item.polices) .filter((item) => item.polices)
@ -458,6 +737,51 @@ function addPepole(peoples, polices) {
addPepole(peoples, polices); addPepole(peoples, polices);
} }
} }
const detailShow = ref(false);
const activeRow = ref({});
function handleShowDetail(row) {
activeRow.value = row;
detailShow.value = true;
}
const testingDetailShow = ref(false);
const peoples = ref([]);
function handleTestingDetailShow(row) {
activeRow.value = row;
testingDetailShow.value = true;
getPolices();
}
const peopleQuery = ref({
size: 10,
current: 1,
});
const peopleTotal = ref(0);
function getPolices() {
listTestingAlcoholPeoples(activeRow.value.id, peopleQuery.value).then(
(data) => {
peoples.value = data.records;
peopleTotal.value = data.total;
}
);
}
function peopleReset() {
peopleQuery.value = {
size: 10,
current: 1,
};
}
const activePeople = ref([]);
const peopleDetailShow = ref(false);
function handleShowPeople(row) {
activePeople.value = row;
peopleDetailShow.value = true;
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
h5 { h5 {
@ -466,4 +790,8 @@ h5 {
.pepole-container > * { .pepole-container > * {
margin-bottom: 8px; margin-bottom: 8px;
} }
.avatar {
height: 50px;
display: block;
}
</style> </style>

1
src/views/sensitivePerception/Model.vue

@ -305,6 +305,7 @@
(val) => (val) =>
handleChangeColumn(val, row) handleChangeColumn(val, row)
" "
clearable
> >
<el-option <el-option
v-for="item in fields" v-for="item in fields"

4
src/views/sensitivePerception/ModelClueManual.vue

@ -336,9 +336,7 @@
trigger: ['blur'], trigger: ['blur'],
}" }"
> >
<el-select v-model="form.businessTypeCode" style="width: 280px" @change="(val) => form.businessTypeCode = dict.businessType.filter( <el-select v-model="form.businessTypeCode" style="width: 280px">
(item) => item.dictValue === val
)[0].dictLabel">
<el-option <el-option
v-for="item in dict.businessType" v-for="item in dict.businessType"
:key="item.id" :key="item.id"

29
src/views/system/Police.vue

@ -705,33 +705,6 @@
/> />
<p class="text-small">用户密码默认为123456</p> <p class="text-small">用户密码默认为123456</p>
</el-form-item> </el-form-item>
<!-- <el-form-item label="婚姻状况">
<el-radio-group v-model="form.maritalStatus">
<el-radio
v-for="item in dict.maritalStatus"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item label="子女">
<el-radio-group v-model="form.personType">
<el-radio value="无子女"></el-radio>
<el-radio value="有子女"></el-radio>
</el-radio-group>
</el-form-item> -->
<!-- <el-form-item label="学历">
<el-select v-model="form.education">
<el-option
v-for="item in dict.education"
:key="item.dictCode"
:value="item.dictValue"
:label="item.dictLabel"
/>
</el-select>
</el-form-item> -->
</el-form> </el-form>
<footer class="flex end"> <footer class="flex end">
<el-button @click="show = false">取消</el-button> <el-button @click="show = false">取消</el-button>
@ -988,7 +961,7 @@ async function handleDel(row) {
reason = delFormData.value.delReason; reason = delFormData.value.delReason;
} }
await delPolice(delFormData.value.id, { await delPolice(delFormData.value.id, {
reason: delFormData.value.delReason, reason: reason
}); });
feedback.msgSuccess("操作成功"); feedback.msgSuccess("操作成功");
delDialog.value = false; delDialog.value = false;

97
src/views/system/User.vue

@ -106,6 +106,13 @@
v-perms="['user:edit']" v-perms="['user:edit']"
>编辑</el-button >编辑</el-button
> >
<el-button
type="primary"
link
@click="handleUpdatePsd(row)"
v-perms="['user:updatePassword']"
>修改密码</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -225,9 +232,66 @@
<el-button type="primary" @click="submit">确定</el-button> <el-button type="primary" @click="submit">确定</el-button>
</footer> </footer>
</el-dialog> </el-dialog>
<el-dialog
title="修改密码"
v-model="psdShow"
width="600"
>
<el-form :label-width="120" ref="pwdFormRef" :model="pwdForm">
<el-form-item
label="旧密码"
:rules="{
required: true,
message: '请输入旧密码',
trigger: ['blur'],
}"
prop="password"
>
<el-input
type="password"
v-model="pwdForm.password"
placeholder="请输入用戶密码"
/>
</el-form-item>
<el-form-item
label="新密码"
:rules="{
required: true,
message: '请输入新密码',
trigger: ['blur'],
}"
prop="newPassword"
>
<el-input
type="password"
v-model="pwdForm.newPassword"
placeholder="请输入新密码"
/>
</el-form-item>
<el-form-item
label="确认密码"
:rules="{
required: true,
validator: validateRePassword,
}"
prop="rePassword"
>
<el-input
type="password"
v-model="pwdForm.rePassword"
placeholder="请确认密码"
/>
</el-form-item>
</el-form>
<footer class="flex end">
<el-button @click="psdShow = false">取消</el-button>
<el-button type="primary" @click="pwdSubmit">确定</el-button>
</footer>
</el-dialog>
</template> </template>
<script setup> <script setup>
import { listUser, addUser, updateUser } from "@/api/system/user"; import { listUser, addUser, updateUser, updateUserPassword } from "@/api/system/user";
import { listRole } from "@/api/system/role"; import { listRole } from "@/api/system/role";
import feedback from "@/utils/feedback"; import feedback from "@/utils/feedback";
@ -304,6 +368,37 @@ function handleShowAdd() {
mode.value = "add"; mode.value = "add";
show.value = true; show.value = true;
} }
function handleUpdatePsd(row) {
psdShow.value = true
pwdForm.value.account = row.userName;
}
const psdShow = ref(false)
const pwdFormRef = ref()
const pwdForm = ref({})
function pwdSubmit() {
pwdFormRef.value.validate((flag) => {
if (flag) {
updateUserPassword(pwdForm.value).then(() => {
psdShow.value = false
pwdForm.value = {}
feedback.msgSuccess("操作成功");
})
}
});
}
function validateRePassword(rule, val, callback) {
if (!val) {
return callback(new Error('请输入确认密码'))
}
if (pwdForm.value.newPassword !== pwdForm.value.rePassword) {
return callback(new Error('两次密码不一致'))
}
callback()
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

4
src/views/system/VideoConfig.vue

@ -157,11 +157,11 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="视频"> <el-form-item label="视频">
<div> <div style="width: 100%">
<div style="width: 400px"> <div style="width: 400px">
<VideoPlay :url="form.videoUrl" /> <VideoPlay :url="form.videoUrl" />
</div> </div>
<p style="height: 32px">{{ form.videoUrl }}</p> <p style="height: 32px;" :title="form.videoUrl">{{ form.videoUrl }}</p>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>

1
src/views/system/Wqzg.vue

@ -249,7 +249,6 @@ async function querySearch(queryString, cb) {
} }
function handleSelect(item) { function handleSelect(item) {
console.log(item)
formData.value.empName = item.name; formData.value.empName = item.name;
formData.value.empNo = item.empNo; formData.value.empNo = item.empNo;
formData.value.idCode = item.idCode; formData.value.idCode = item.idCode;

1
src/views/work/BatchDistribute.vue

@ -793,6 +793,7 @@ async function handleNext() {
} }
if (activeStep.value === 3) { if (activeStep.value === 3) {
importShow.value = false; importShow.value = false;
auditImportShow.value = false
} }
} }

10
src/views/work/Done.vue

@ -113,6 +113,7 @@
placeholder="是否属实" placeholder="是否属实"
clearable clearable
v-model="query.checkStatus" v-model="query.checkStatus"
multiple
> >
<el-option <el-option
v-for="item in dict.inspectCase" v-for="item in dict.inspectCase"
@ -238,6 +239,7 @@
<el-option label="市局下发" :value="0" /> <el-option label="市局下发" :value="0" />
<el-option label="二级机构下发" :value="2" /> <el-option label="二级机构下发" :value="2" />
</el-select> </el-select>
<el-input style="width: 140px" v-model="query.operator" placeholder="操作人姓名" clearable />
</div> </div>
</div> </div>
</el-form> </el-form>
@ -400,7 +402,9 @@ const flowNodes = catchStore.getFlowNodes();
const dones = ref([]) const dones = ref([])
const query = ref({ const query = ref({
current: 1, current: 1,
size: 10 size: 10,
responderKey: "name",
blameKey: "name"
}); });
const total = ref(0); const total = ref(0);
const loading = ref(true) const loading = ref(true)
@ -422,7 +426,9 @@ onMounted(() => {
function reset() { function reset() {
query.value = { query.value = {
current: 1, current: 1,
size: 10 size: 10,
responderKey: "name",
blameKey: "name"
} }
getList() getList()
} }

1
src/views/work/MyCountersign.vue

@ -113,6 +113,7 @@
placeholder="是否属实" placeholder="是否属实"
clearable clearable
v-model="query.checkStatus" v-model="query.checkStatus"
multiple
> >
<el-option <el-option
v-for="item in dict.inspectCase" v-for="item in dict.inspectCase"

18
src/views/work/Query.vue

@ -112,6 +112,7 @@
placeholder="是否属实" placeholder="是否属实"
clearable clearable
v-model="query.checkStatus" v-model="query.checkStatus"
multiple
> >
<el-option <el-option
v-for="item in dict.inspectCase" v-for="item in dict.inspectCase"
@ -185,24 +186,14 @@
<el-select <el-select
style="width: 160px" style="width: 160px"
placeholder="办理中是否超时" placeholder="是否超时"
clearable clearable
v-model="query.handleTimeoutFlag" v-model="query.timeoutFlag"
> >
<el-option label="未超时" :value="false" /> <el-option label="未超时" :value="false" />
<el-option label="已超时" :value="true" /> <el-option label="已超时" :value="true" />
</el-select> </el-select>
<el-select
style="width: 140px"
placeholder="办结是否超时"
clearable
v-model="query.timeoutFlag"
>
<el-option label="办结未超时" :value="false" />
<el-option label="办结超时" :value="true" />
</el-select>
<div class="flex gap-4" style="height: 32px"> <div class="flex gap-4" style="height: 32px">
<el-select <el-select
v-model="query.responderKey" v-model="query.responderKey"
@ -399,7 +390,7 @@
v-else-if="row.handleTimeout" v-else-if="row.handleTimeout"
type="danger" type="danger"
effect="dark" effect="dark"
>超时 >超时
{{ formatTimeText(row.handleTimeout) }}</el-tag {{ formatTimeText(row.handleTimeout) }}</el-tag
> >
</template> </template>
@ -915,6 +906,7 @@ function updateQuery() {
} }
if (route.query.extensionFlag === "true") { if (route.query.extensionFlag === "true") {
query.value.extensionFlag = true; query.value.extensionFlag = true;
query.value.processingStatus = ['signing', 'processing', 'approval'];
} }
} }

6
src/views/work/Todo.vue

@ -112,6 +112,7 @@
placeholder="是否属实" placeholder="是否属实"
clearable clearable
v-model="query.checkStatus" v-model="query.checkStatus"
multiple
> >
<el-option <el-option
v-for="item in dict.inspectCase" v-for="item in dict.inspectCase"
@ -240,6 +241,7 @@
<el-option label="市局下发" :value="0" /> <el-option label="市局下发" :value="0" />
<el-option label="二级机构下发" :value="2" /> <el-option label="二级机构下发" :value="2" />
</el-select> </el-select>
<el-input style="width: 140px" v-model="query.operator" placeholder="操作人姓名" clearable />
</div> </div>
</div> </div>
</el-form> </el-form>
@ -485,6 +487,8 @@ const todos = ref([]);
const query = ref({ const query = ref({
current: 1, current: 1,
size: 10, size: 10,
responderKey: "name",
blameKey: "name"
}); });
const total = ref(0); const total = ref(0);
const loading = ref(true); const loading = ref(true);
@ -506,6 +510,8 @@ function reset() {
query.value = { query.value = {
current: 1, current: 1,
size: 10, size: 10,
responderKey: "name",
blameKey: "name"
}; };
getList(); getList();
} }

Loading…
Cancel
Save