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>
<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>
<script type="module" src="/src/main.ts"></script>
<script src="/js/authen.js"></script>

1
package.json

@ -32,6 +32,7 @@
"@univerjs/ui": "^0.2.5",
"@vue-office/docx": "^1.6.0",
"@vue-office/excel": "^1.7.11",
"@vueup/vue-quill": "^1.2.0",
"amfe-flexible": "^2.2.1",
"baidu-map-vue3": "^0.4.9",
"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
});
}
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
});
}
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
});
}
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>
.statistic {
text-align: center;
cursor: pointer;
.statistic-number {
font-size: 39px;
font-weight: 700;

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

@ -19,6 +19,15 @@ const shortcuts = [
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: "近一周",
value: () => {
@ -45,7 +54,7 @@ const shortcuts = [
start.setMonth(start.getMonth() - 3)
return [start, end];
},
},
}
];
</script>
<style lang="scss" scoped>

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

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

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

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

8
src/components/negative/add.vue

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

4
src/components/negative/dialog.vue

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

62
src/components/police-picker.vue

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

10
src/layout/components/Aside.vue

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

3
src/style/public.scss

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

58
src/views/data/Gabxf.vue

@ -124,24 +124,29 @@
<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"
show-overflow-tooltip
width="150"
/>
<el-table-column
label="信访人"
prop="responderName"
width="90"
show-overflow-tooltip
/>
<el-table-column label="电话" prop="responderPhone" />
<el-table-column label="身份证号码" prop="responderIdCode" />
<el-table-column label="初重信访" align="center" width="85">
<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(
@ -151,13 +156,7 @@
}}</span>
</template>
</el-table-column>
<el-table-column label="缠访闹访" width="85" 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">
<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>
@ -177,7 +176,7 @@
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column label="状态">
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag>{{
getDictLable(
@ -190,9 +189,9 @@
<el-table-column
label="办理情况"
prop="petitionProcessingStatus"
width="100"
width="90"
/>
<el-table-column label="操作" width="240">
<el-table-column label="操作" width="200">
<template #default="{ row }">
<template
v-if="
@ -315,21 +314,6 @@
) || "/"
}}</span>
</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">
<label>群众集访</label>
<span
@ -350,6 +334,22 @@
<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>

52
src/views/data/Gjxf.vue

@ -121,25 +121,30 @@
<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"
show-overflow-tooltip
width="150"
/>
<el-table-column
label="信访人"
prop="responderName"
width="90"
show-overflow-tooltip
/>
<el-table-column label="电话" prop="responderPhone" />
<el-table-column label="身份证号码" prop="responderIdCode" />
<el-table-column label="初重信访" align="center" width="85">
<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(
@ -149,13 +154,7 @@
}}</span>
</template>
</el-table-column>
<el-table-column label="缠访闹访" width="85" 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">
<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>
@ -175,9 +174,9 @@
<el-table-column
label="办理情况"
prop="petitionProcessingStatus"
width="100"
width="90"
/>
<el-table-column label="状态">
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag>{{
getDictLable(
@ -187,7 +186,7 @@
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="240">
<el-table-column label="操作" width="200">
<template #default="{ row }">
<template
v-if="
@ -296,7 +295,7 @@
<span>{{ activeRow.responderPhone }}</span>
</div>
<div class="col col-12">
<label>信访人身份证号码</label>
<label>信访人身份证</label>
<span>{{ activeRow.responderIdCode || '/' }}</span>
</div>
<div class="col col-12">
@ -308,21 +307,6 @@
) || "/"
}}</span>
</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">
<label>群众集访</label>
<span
@ -347,10 +331,18 @@
<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>

2
src/views/data/Mail12337.vue

@ -637,7 +637,7 @@ const router = useRouter();
const query = ref({
size: 10,
current: 1,
responderValue: "name",
responderKey: "name",
});
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,7 +834,12 @@ function handleBathJoin() {
}
function handleJoin() {
if (
distributeList.value.filter((item) => item.id === activeRow.value.id).length ===
0
) {
distributeList.value.push(activeRow.value);
}
}
function selectable(row) {

298
src/views/datav/AuditSuper.vue

@ -7,7 +7,7 @@
<el-col :span="6">
<datav-card
title="审计整改结果"
sub-title="已整改问题数/查问题数"
sub-title="已整改问题数/查问题数"
>
<el-scrollbar height="350px">
<datav-chart-bar
@ -21,10 +21,10 @@
</el-scrollbar>
</datav-card>
<datav-card title="审计查出问题" style="height: 500px">
<datav-card title="审计项目类型">
<v-charts
style="height: 300px"
:option="option22"
:option="option2"
autoresize
/>
</datav-card>
@ -33,29 +33,29 @@
<datav-date-picker v-model="time" />
<div class="flex gap-42">
<datav-statistic
:value="temp.tempTotal"
:value="overview.problemNumber"
title="审计单位/项目"
style="width: 20%"
/>
<datav-statistic
:value="temp.tempTotalMon"
:value="overview.auditAmount"
:title="`审计总金额\n(万元)`"
:isDecimal="true"
style="width: 20%"
/>
<datav-statistic
:value="temp.tempReviewMon"
:value="overview.auditSjAmount"
:title="`审减金额\n(万元)`"
:isDecimal="true"
style="width: 20%"
/>
<datav-statistic
:value="temp.tempCheckPro"
title="查问题数"
:value="overview.negativeNumber"
title="查问题数"
style="width: 20%"
/>
<datav-statistic
:value="temp.tempPro"
:value="overview.accountableNumber"
title="追责问责数"
style="width: 20%"
/>
@ -74,37 +74,14 @@
</datav-card>
</el-col>
<el-col :span="6">
<datav-card title="审计项目类型">
<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">
<datav-card title="审计查出问题" style="height: 500px">
<v-charts
style="height: 300px"
:option="option4"
:option="problemOptions"
autoresize
/>
</div>
</datav-tab-item>
</datav-tabs>
</datav-card>
<datav-card title="审计工作动态">
<el-scrollbar height="470px">
<datav-message
@ -130,7 +107,6 @@
<file-preview :files="files" v-model:show="filePreviewShow" />
</template>
<script setup>
import vCharts from "vue-echarts";
import changshaMap from "@/assets/data/changsha.json";
@ -138,27 +114,61 @@ import * as echarts from "echarts/core";
import moment from "moment/moment.js";
import { getWorkDynamics } from "@/api/data/aduit.ts";
import { workDynamicColorMapping } from "@/enums/workDynamicColorMapping.js";
import { getAuditOverview, getAuditProblems } from '@/api/datav'
import { onMounted } from "vue";
const messages = ref([]);
const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"),
moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"),
]);
const temp = ref({
tempTotal: 0,
tempTotalMon: 0,
tempReviewMon: 0,
tempCheckPro: 0,
tempPro: 0,
watch(time, () => {
getData();
});
setTimeout(() => {
temp.value = {
tempTotal: 462,
tempTotalMon: 79224.59,
tempReviewMon: 3544.01,
tempCheckPro: 1192,
tempPro: 389,
};
}, 1000);
const overview = ref({
negativeNumber: 0,
accountableNumber: 0,
problemNumber: 0,
auditAmount: 0,
auditSjAmount: 0,
});
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 = [
{
name: "天心分局",
@ -243,7 +253,7 @@ const option = ref({
<div class="tooltip-content">
<ul class="tooltip-ul" >
<li>审计单位/项目数<span>暂无</span></li>
<li>问题数 <span>${dataItem.checkPro}</span></li>
<li>问题数 <span>${dataItem.checkPro}</span></li>
<li>追责问责数 <span>暂无</span></li>
<li>整改问题数 <span>${dataItem.changed}</span></li>
</ul>
@ -255,7 +265,7 @@ const option = ref({
<div class="tooltip-content">
<ul class="tooltip-ul"">
<li>审计单位/项目 <span>0</span></li>
<li>问题数 <span>0</span></li>
<li>问题数 <span>0</span></li>
<li>追责问责数 <span>0</span></li>
</ul>
</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 = [
{
label: "芙蓉分局",
value: "100",
rate: "100",
numerator: "1",
denominator: "1",
},
{
label: "雨花分局",
value: "91",
rate: "91",
numerator: "220",
denominator: 240,
},
{
label: "高新分局",
value: 90,
rate: 90,
numerator: 140,
denominator: 155,
},
{
label: "宁乡市局",
value: 83,
rate: 83,
numerator: 194,
denominator: 232,
label: "公交分局",
value: 100,
numerator: 8,
denominator: 8,
},
{
label: "开福分局",
value: 73,
rate: 73,
numerator: 137,
denominator: 186,
label: "岳麓分局",
value: 100,
numerator: 2,
denominator: 2,
},
{
label: "开福分局",
value: 73,
rate: 73,
numerator: 137,
denominator: 186,
label: "交警支队",
value: 100,
numerator: 2,
denominator: 2,
},
{
label: "岳麓分局",
value: 0,
numerator: 0,
rate: 0,
denominator: 11,
label: "高新分局",
value: 100,
numerator: 1,
denominator: 1,
},
];
// setTimeout(() => {
// data1.values().forEach((item) => {
// console.log(item.label);
// });
// }, 1000);
const data2 = [
{
name: "开福分局",
@ -469,107 +451,10 @@ const option2 = {
color: "#fff",
},
data: [
{ value: 23, name: "项目未按规定立项" },
{ value: 21, name: "未按规定或批准的采购方式进行采购" },
{ value: 6, name: "未按规定程序办理立项手续" },
{ value: 2, 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: "经济责任审计" },
{ value: 7, name: "执法活动财物审计" },
{ value: 1, name: "经济责任审计" },
{ value: 110, name: "政府投资审计" },
{ value: 1, name: "专项审计" },
],
},
],
@ -577,6 +462,7 @@ const option22 = {
trigger: "item",
},
};
const colors = [
{
// 绿
@ -599,13 +485,7 @@ const getWorkDynamicsData = async () => {
const data = await getWorkDynamics(time.value);
const colorNewsVoList = workDynamicColorMapping(data);
messages.value = colorNewsVoList;
};
const getData = () => {
getWorkDynamicsData();
};
onMounted(() => {
getData();
});
}
const files = ref([])
const filePreviewShow = ref(false)

20
src/views/datav/CaseVerif.vue

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

56
src/views/datav/Global.vue

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

2
src/views/datav/Lmgz.vue

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

51
src/views/datav/MailVisits.vue

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

326
src/views/datav/RightsComfort.vue

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

150
src/views/datav/SceneInsp.vue

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

41
src/views/datav/VideoInsp.vue

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

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

@ -164,7 +164,7 @@ import moment from "moment/moment.js";
const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"),
moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"),
]);
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 selectedYear = ref(currentYear); //
const time = ref([
moment().subtract(1, "year").format("YYYY-MM-DD"),
moment().startOf("year").format("YYYY-MM-DD"),
moment().format("YYYY-MM-DD"),
]);
const route = useRoute();

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

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

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

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

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

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

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

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

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

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

206
src/views/mobileSupervise/Inspection.vue

@ -58,7 +58,7 @@
/>
<el-table-column
label="参与人员"
prop="testingPerson"
prop="persons"
show-overflow-tooltip
/>
<el-table-column
@ -67,7 +67,11 @@
width="100"
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">
<template #default="{ row }">
<span>{{ row.beginTime }}</span>
@ -81,12 +85,22 @@
<span v-if="row.taskStatus === 'done'">已完成</span>
</template>
</el-table-column>
<el-table-column label="被督察单位数" prop="" />
<el-table-column label="发现问题数" prop="" />
<el-table-column label="被督察单位数" prop="departNumber" align="center" />
<el-table-column label="发现问题数" prop="problemNumber" align="center" />
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button type="primary" link>查看详情</el-button>
<el-button type="primary" link>问题清单</el-button>
<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>
@ -112,7 +126,7 @@
top="5vh"
style="margin-bottom: 0"
>
<el-scrollbar max-height="66vh">
<el-scrollbar max-height="76vh">
<el-form
:label-width="150"
ref="formRef"
@ -195,32 +209,163 @@
</div>
</el-form-item>
<el-form-item
label="任务内容"
prop="times"
prop="taskContentHtml"
:rules="{
required: true,
message: '请选择',
message: '请输入任务内容'
}"
label-position="top"
>
<el-input
type="textarea"
v-model="form.taskContent"
:autosize="{ minRows: 6 }"
<div style="width: 100%">
<quill-editor
ref="quillRef"
v-model="form.taskContentHtml"
style="
min-height: 200px;
max-height: 360px;
overflow: auto;
"
/>
</div>
</el-form-item>
</el-form>
</el-scrollbar>
<footer class="flex end mt-20">
<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>
</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>
<script setup>
import {
listInspection,
addInspection,
listInspectionProblems,
} from "@/api/mobileSupervision/inspection";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
@ -256,17 +401,48 @@ const show = ref(false);
const form = ref({});
const formRef = ref(null);
const quillRef = ref()
async function submit() {
await formRef.value.validate();
form.value.taskContent = quillRef.value.getText()
await addInspection(form.value);
feedback.msgSuccess("发布成功");
show.value = false;
getList();
form.value = {};
}
function handleShowAdd() {
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>
<style lang="scss" scoped>
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">
<el-table :data="list">
<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
label="检测时间"
prop="updateTime"
width="280"
>
label="检测单位"
prop="supDepartName"
width="120"
/>
<el-table-column
label="检测人员"
prop="persons"
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="未检测人数" 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="抽检人数"
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">
<template #default="{ row }">
<el-button
type="primary"
link
>任务详情</el-button>
@click="handleShowDetail(row)"
>任务详情</el-button
>
<el-button
type="primary"
link
>检测情况</el-button>
@click="handleTestingDetailShow(row)"
>检测情况</el-button
>
</template>
</el-table-column>
</el-table>
@ -134,7 +160,7 @@
}"
prop="persons"
>
<police-picker v-model="form.persons" />
<police-picker v-model="form.persons" :departId="form.supDepartId" />
</el-form-item>
<el-form-item
label="检测时间"
@ -364,14 +390,255 @@
>
</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
><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>
<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 useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([, "personType"]);
const dict = catchStore.getDicts(["personType"]);
const list = ref([]);
const query = ref({
@ -411,10 +678,14 @@ const formRef = ref(null);
async function submit() {
await formRef.value.validate();
if (form.value.peoples.length === 0) {
feedback.msgWarning("请生成抽检对象");
return
}
await addTestingAlcohol(form.value);
feedback.msgSuccess('发布成功')
feedback.msgSuccess("发布成功");
show.value = false;
getList()
getList();
}
async function handleGetPersonNumber(item) {
@ -430,11 +701,19 @@ function handleShowAdd() {
show.value = true;
}
function handleGenPeople() {
const sum = form.value.filterPeopleConditions
.filter((item) => item.polices)
.map((item) => item.polices.length)
.reduce((a, b) => a + b);
async function handleGenPeople() {
const arr = form.value.filterPeopleConditions
.filter((item) => item.polices).map((item) => item.polices.length);
if (arr.length === 0) {
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 = [];
form.value.filterPeopleConditions
.filter((item) => item.polices)
@ -458,6 +737,51 @@ function 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>
<style lang="scss" scoped>
h5 {
@ -466,4 +790,8 @@ h5 {
.pepole-container > * {
margin-bottom: 8px;
}
.avatar {
height: 50px;
display: block;
}
</style>

1
src/views/sensitivePerception/Model.vue

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

4
src/views/sensitivePerception/ModelClueManual.vue

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

29
src/views/system/Police.vue

@ -705,33 +705,6 @@
/>
<p class="text-small">用户密码默认为123456</p>
</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>
<footer class="flex end">
<el-button @click="show = false">取消</el-button>
@ -988,7 +961,7 @@ async function handleDel(row) {
reason = delFormData.value.delReason;
}
await delPolice(delFormData.value.id, {
reason: delFormData.value.delReason,
reason: reason
});
feedback.msgSuccess("操作成功");
delDialog.value = false;

97
src/views/system/User.vue

@ -106,6 +106,13 @@
v-perms="['user:edit']"
>编辑</el-button
>
<el-button
type="primary"
link
@click="handleUpdatePsd(row)"
v-perms="['user:updatePassword']"
>修改密码</el-button
>
</template>
</el-table-column>
</el-table>
@ -225,9 +232,66 @@
<el-button type="primary" @click="submit">确定</el-button>
</footer>
</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>
<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 feedback from "@/utils/feedback";
@ -304,6 +368,37 @@ function handleShowAdd() {
mode.value = "add";
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>
<style lang="scss" scoped>
</style>

4
src/views/system/VideoConfig.vue

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

1
src/views/system/Wqzg.vue

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

1
src/views/work/BatchDistribute.vue

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

10
src/views/work/Done.vue

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

1
src/views/work/MyCountersign.vue

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

18
src/views/work/Query.vue

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

6
src/views/work/Todo.vue

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

Loading…
Cancel
Save