Browse Source

数据台账功能

main
wxc 1 year ago
parent
commit
46f17e67b7
  1. 8
      src/api/books.ts
  2. 28
      src/api/data/petitionComplaint.ts
  3. 8
      src/api/data/videoInspection.ts
  4. 6
      src/api/work/negativeTask.ts
  5. 28
      src/api/work/news.ts
  6. 34
      src/components/data/distrbute.vue
  7. 284
      src/components/data/gab-import.vue
  8. 247
      src/components/data/gj-import.vue
  9. 568
      src/components/data/import.vue
  10. 2
      src/components/home/work/my-alarm.vue
  11. 284
      src/views/books/Ajhc.vue
  12. 12
      src/views/books/Gabxf.vue
  13. 12
      src/views/books/Gjxf.vue
  14. 12
      src/views/data/Gabxf.vue
  15. 4
      src/views/data/Gjxf.vue
  16. 114
      src/views/data/Mail12337.vue
  17. 162
      src/views/data/VideoInspection.vue
  18. 3
      src/views/sensitivePerception/ModelClueTask.vue
  19. 148
      src/views/system/DepartMaping.vue
  20. 89
      src/views/work/BatchDistribute.vue
  21. 272
      src/views/work/News.vue

8
src/api/books.ts

@ -21,3 +21,11 @@ export function listNegativeXf(query, problemSourcesCode) {
query
});
}
// 案件核查
export function listNegativeAjhc(query) {
return request.get({
url: `/negative/books/ajhc`,
query
});
}

28
src/api/data/petitionComplaint.ts

@ -1,8 +1,23 @@
import request from "@/api/request";
export function importPetitionComplaintGab(body) {
return request.post({
url: '/data/petitionComplaint/gab/import',
body
});
}
export function importPetitionComplaintGj(body) {
return request.post({
url: '/data/petitionComplaint/gj/import',
body
});
}
export function importPetitionComplaint(body) {
return request.post({
url: '/data/petitionComplaint/import',
url: '/data/petitionComplaint/gab/import',
body
});
}
@ -14,9 +29,16 @@ export function listPetitionComplaint(query) {
});
}
export function addPetitionComplaint(body) {
export function addPetitionComplaintGab(body) {
return request.post({
url: `/data/petitionComplaint/gab`,
body
});
}
export function addPetitionComplaintGj(body) {
return request.post({
url: `/data/petitionComplaint`,
url: `/data/petitionComplaint/gj`,
body
});
}

8
src/api/data/videoInspection.ts

@ -0,0 +1,8 @@
import request from "@/api/request";
export function listVideoInspection(query) {
return request.get({
url: `/videoInspection`,
query: query
});
}

6
src/api/work/negativeTask.ts

@ -27,3 +27,9 @@ export function distributeNegative(body) {
body
});
}
export function listGroupByDepart(id) {
return request.get({
url: `/negativeTask/${id}/byDepart`
});
}

28
src/api/work/news.ts

@ -0,0 +1,28 @@
import request from "@/api/request";
export function listNews(query) {
return request.get({
url: '/news',
query
});
}
export function addNews(body) {
return request.post({
url: '/news',
body
});
}
export function updateNews(body) {
return request.put({
url: '/news',
body
});
}
export function delNews(id) {
return request.del({
url: '/news/' + id
});
}

34
src/components/data/distrbute.vue

@ -22,16 +22,6 @@
prop="discoveryTime"
show-overflow-tooltip
/>
<el-table-column
label="问题发生时间"
prop="happenTime"
show-overflow-tooltip
/>
<el-table-column
label="问题来源"
prop="problemSources"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="responderName"
@ -39,16 +29,20 @@
/>
<el-table-column
label="投诉人电话"
prop="contactPhone"
prop="responderPhone"
width="120"
/>
<el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column label="涉及警种" prop="policeTypeName" />
<el-table-column
label="涉及单位"
prop="involveDepartName"
label="业务类别"
prop="businessTypeName"
show-overflow-tooltip
/>
<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"
@ -208,7 +202,13 @@ import useCatchStore from "@/stores/modules/catch";
import { distributePetitionComplaint } from "@/api/data/petitionComplaint";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["businessType", "suspectProblem", "policeType", "timeLimit", "approvalFlow"]);
const dict = catchStore.getDicts([
"businessType",
"suspectProblem",
"policeType",
"timeLimit",
"approvalFlow",
]);
const props = defineProps({
show: {

284
src/components/data/gab-import.vue

@ -0,0 +1,284 @@
<template>
<el-dialog title="公安部信访投诉导入" width="80vw" ref="dialogRef">
<header class="flex center mb-40">
<el-steps
:space="400"
:active="activeStep"
finish-status="success"
style="width: 800px"
>
<el-step title="数据导入" />
<el-step title="数据校验" />
<el-step title="数据导入" />
</el-steps>
</header>
<div style="min-height: 50vh">
<template v-if="activeStep === 0">
<el-upload
drag
:multiple="false"
:auto-upload="false"
:show-file-list="false"
v-model:file-list="fileList"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
class="mt-20"
>
<template v-if="fileList.length === 0">
<el-icon class="el-icon--upload"
><upload-filled
/></el-icon>
<div class="el-upload__text">
<p>点击或拖拽文件到此区域上传</p>
</div>
</template>
<template v-else>
<el-icon class="el-icon--upload"><Select /></el-icon>
<div class="el-upload__text">
已选择文件{{ fileList[fileList.length - 1].name }}
</div>
</template>
</el-upload>
<div class="mt-20">
<span>文件模板</span>
<a
class="link"
:href="`${BASE_PATH}/templates/公安信访投诉数据导入模板.xls`"
target="__blank"
>公安信访投诉数据导入模板.xls 下载</a
>
</div>
</template>
<template v-if="activeStep === 1">
<div class="table-container">
<el-table :data="importTableData">
<el-table-column
label="办理单位"
prop="discoverTime"
width="180"
>
<template #default="{ row }">
<depart-tree-select
size="small"
v-model="row.departId"
/>
</template>
</el-table-column>
<el-table-column
label="责任部门"
prop="involveDepartName"
width="120"
/>
<el-table-column
label="问题发生地"
prop="occurred"
width="160"
show-overflow-tooltip
/>
<el-table-column
label="信访件编号"
prop="originId"
width="160"
/>
<el-table-column
label="信访形式"
prop="channelForFilingComplaints"
width="86"
align="center"
/>
<el-table-column
label="姓名"
prop="responderName"
width="86"
/>
<el-table-column
label="身份证号"
prop="responderIdCode"
width="174"
/>
<el-table-column
label="住址"
prop="responderAddress"
width="174"
show-overflow-tooltip
/>
<el-table-column
label="手机号码"
prop="contactPhone"
width="120"
/>
<el-table-column
label="信访日期"
prop="discoveryTime"
width="110"
/>
<el-table-column
label="信访内容"
prop="thingDesc"
width="160"
show-overflow-tooltip
/>
<el-table-column
label="异常动态"
prop="abnormal"
width="100"
show-overflow-tooltip
/>
<el-table-column
label="问题发生日期"
prop="happenTime"
width="120"
/>
<el-table-column
label="信访人数"
prop="peopleNumber"
width="86"
align="center"
/>
<el-table-column
label="信访诉求"
prop="appeal"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="公安业务分类"
prop="businessTypeName"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="档案编号"
prop="fileNo"
width="110"
/>
<el-table-column
label="转往处"
prop="turnAround"
width="150"
show-overflow-tooltip
/>
<el-table-column
label="办理方式"
prop="handingMethod"
width="120"
/>
<el-table-column
label="核查人"
prop="reviewPersonName"
width="90"
/>
<el-table-column
label="具体承办单位"
prop="handleDepartName"
width="120"
/>
</el-table>
</div>
</template>
<template v-if="activeStep === 2">
<el-result
icon="success"
title="导入成功"
:sub-title="` 已成功导入${importTableData.length}条数据。`"
>
</el-result>
</template>
</div>
<footer class="flex end mt-20 v-center">
<el-button size="large" @click="handlePrev" v-if="activeStep !== 3"
>上一步</el-button
>
<el-button
type="primary"
size="large"
@click="handleNext"
v-loading="loading"
>{{ activeStep === 2 ? "确定" : "下一步" }}</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import {
importPetitionComplaintGab,
addPetitionComplaintGab,
} from "@/api/data/petitionComplaint";
import feedback from "@/utils/feedback";
import { onMounted } from "vue";
const emit = defineEmits(["close", "update"]);
const activeStep = ref(0)
const fileList = ref([]);
const importTableData = ref([]);
const loading = ref(false);
async function handleNext() {
if (activeStep.value === 0) {
if (fileList.value.length === 0) {
return;
}
const formData = new FormData();
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
importTableData.value = await importPetitionComplaintGab(
formData
);
} catch (e) {
loading.value = false;
throw e;
}
loading.value = false;
activeStep.value = 1;
return;
}
if (activeStep.value === 1) {
importTableData.value.forEach((item) => {
if (!item.departId) {
feedback.msgWarning("请选择办理单位");
throw e;
}
});
loading.value = true;
try {
await addPetitionComplaintGab(importTableData.value);
} catch(e) {
loading.value = false
return
}
loading.value = false
activeStep.value = 2;
emit('update')
return;
}
if (activeStep.value === 2) {
emit('close')
activeStep.value = 0
importTableData.value = []
fileList.value = []
}
}
function handlePrev() {
activeStep.value = activeStep.value - 1;
}
const dialogRef = ref()
watch(() => dialogRef.value?.visible, (val) => {
if (!val) {
activeStep.value = 0
importTableData.value = []
fileList.value = []
}
})
</script>
<style lang="scss" scoped>
</style>

247
src/components/data/gj-import.vue

@ -0,0 +1,247 @@
<template>
<el-dialog title="国家信访投诉导入" width="80vw" ref="dialogRef">
<header class="flex center mb-40">
<el-steps
:space="300"
:active="activeStep"
finish-status="success"
style="width: 800px"
>
<el-step title="数据导入" />
<el-step title="数据校验" />
<el-step title="数据导入" />
</el-steps>
</header>
<div style="min-height: 50vh">
<template v-if="activeStep === 0">
<el-upload
drag
:multiple="false"
:auto-upload="false"
:show-file-list="false"
v-model:file-list="fileList"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
class="mt-20"
>
<template v-if="fileList.length === 0">
<el-icon class="el-icon--upload"
><upload-filled
/></el-icon>
<div class="el-upload__text">
<p>点击或拖拽文件到此区域上传</p>
</div>
</template>
<template v-else>
<el-icon class="el-icon--upload"><Select /></el-icon>
<div class="el-upload__text">
已选择文件{{ fileList[fileList.length - 1].name }}
</div>
</template>
</el-upload>
<div class="mt-20">
<span>文件模板</span>
<a
class="link"
:href="`${BASE_PATH}/templates/国家信访投诉数据导入模板.xls`"
target="__blank"
>国家信访投诉数据导入模板.xls 下载</a
>
</div>
</template>
<template v-if="activeStep === 1">
<div class="table-container">
<el-table :data="importTableData">
<el-table-column
label="办理单位"
prop="discoverTime"
width="180"
>
<template #default="{ row }">
<depart-tree-select
size="small"
v-model="row.departId"
/>
</template>
</el-table-column>
<el-table-column
label="去向机构"
prop="handleDepartName"
width="120"
show-overflow-tooltip
/>
<el-table-column
label="问题发生地"
prop="occurred"
width="160"
show-overflow-tooltip
/>
<el-table-column
label="信访件编号"
prop="originId"
width="196"
/>
<el-table-column
label="信访形式"
prop="channelForFilingComplaints"
width="86"
align="center"
/>
<el-table-column
label="姓名"
prop="responderName"
width="86"
/>
<el-table-column
label="身份证号"
prop="responderIdCode"
width="174"
/>
<el-table-column
label="信访人住址"
prop="responderAddress"
width="174"
show-overflow-tooltip
/>
<el-table-column
label="手机号码"
prop="responderPhone"
width="120"
/>
<el-table-column
label="信访日期"
prop="discoveryTime"
width="110"
/>
<el-table-column
label="信访内容"
prop="thingDesc"
width="160"
show-overflow-tooltip
/>
<el-table-column
label="是否重信"
prop="initialPetition"
width="86"
align="center"
/>
<el-table-column
label="信访人数"
prop="peopleNumber"
width="86"
align="center"
/>
<el-table-column
label="公安业务分类"
prop="businessTypeName"
width="140"
show-overflow-tooltip
/>
</el-table>
</div>
</template>
<template v-if="activeStep === 2">
<el-result
icon="success"
title="导入成功"
:sub-title="` 已成功导入${importTableData.length}条数据。`"
>
</el-result>
</template>
</div>
<footer class="flex end mt-20 v-center">
<el-button size="large" @click="handlePrev" v-if="activeStep !== 3"
>上一步</el-button
>
<el-button
type="primary"
size="large"
@click="handleNext"
v-loading="loading"
>{{ activeStep === 2 ? "确定" : "下一步" }}</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import {
importPetitionComplaintGj,
addPetitionComplaintGj,
} from "@/api/data/petitionComplaint";
import feedback from "@/utils/feedback";
import { onMounted } from "vue";
const emit = defineEmits(["close", "update"]);
const activeStep = ref(0)
const fileList = ref([]);
const importTableData = ref([]);
const loading = ref(false);
async function handleNext() {
if (activeStep.value === 0) {
if (fileList.value.length === 0) {
return;
}
const formData = new FormData();
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
importTableData.value = await importPetitionComplaintGj(
formData
);
} catch (e) {
loading.value = false;
throw e;
}
loading.value = false;
activeStep.value = 1;
return;
}
if (activeStep.value === 1) {
importTableData.value.forEach((item) => {
if (!item.departId) {
feedback.msgWarning("请选择办理单位");
throw e;
}
});
loading.value = true;
try {
await addPetitionComplaintGj(importTableData.value);
} catch(e) {
loading.value = false
return
}
loading.value = false
activeStep.value = 2;
emit('update')
return;
}
if (activeStep.value === 2) {
emit('close')
activeStep.value = 0
importTableData.value = []
fileList.value = []
}
}
function handlePrev() {
activeStep.value = activeStep.value - 1;
}
const dialogRef = ref()
watch(() => dialogRef.value?.visible, (val) => {
if (!val) {
activeStep.value = 0
importTableData.value = []
fileList.value = []
}
})
</script>
<style lang="scss" scoped>
</style>

568
src/components/data/import.vue

@ -1,568 +0,0 @@
<template>
<el-dialog width="80vw" top="5vh" v-model="show" :title="title">
<div style="height: 600px">
<template v-if="step === 1">
<div class="mt-20">
<span>信访投诉数据台账模板</span>
<a
class="link"
:href="`${BASE_PATH}/templates/信访投诉数据台账(模板).xlsx`"
target="__blank"
>下载</a
>
</div>
<el-upload
drag
:multiple="false"
:auto-upload="false"
:show-file-list="false"
v-model:file-list="fileList"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
class="mt-20"
>
<template v-if="fileList.length === 0">
<el-icon class="el-icon--upload"
><upload-filled
/></el-icon>
<div class="el-upload__text">
点击或拖拽文件到此区域上传
</div>
</template>
<template v-else>
<el-icon class="el-icon--upload"><Select /></el-icon>
<div class="el-upload__text">
已选择文件{{ fileList[fileList.length - 1].name }}
</div>
</template>
</el-upload>
<el-radio-group v-model="dataUpdateMethod" class="mt-20">
<el-radio value="incremental" border>增量更新</el-radio>
<el-radio value="overwrite" border>覆盖更新</el-radio>
</el-radio-group>
</template>
<template v-else>
<el-page-header @back="step = 1" class="mb-20"></el-page-header>
<div style="height: 556px; overflow: hidden">
<el-scrollbar height="556px">
<el-tabs v-model="activeTab">
<el-tab-pane label="全部" name="all">
<div class="table-container">
<el-table
:data="importTableData"
ref="tableRef"
>
<el-table-column
type="selection"
:selectable="
(row) => row.state === 'success'
"
/>
<el-table-column
label="信件编号"
prop="originId"
show-overflow-tooltip
/>
<el-table-column
label="投诉渠道"
prop="channelForFilingComplaints"
show-overflow-tooltip
/>
<el-table-column
label="受理层级"
prop="acceptanceLevel"
/>
<el-table-column
label="登记时间"
prop="discoveryTime"
width="100"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="responderName"
width="90"
/>
<el-table-column
label="投诉人电话"
prop="contactPhone"
width="120"
/>
<el-table-column
label="初重信访"
align="center"
width="85"
>
<template #default="{ row }">
<span>{{
getDictLable(
dict.initialPetition,
row.initialPetition
)
}}</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"
>
<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="被投诉二级机构" prop="involveSecondDepartName" show-overflow-tooltip />
<el-table-column label="被投诉所队" prop="involveThirdDepartName" show-overflow-tooltip />
<el-table-column
label="具体内容"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column
label="数据校验"
width="90"
align="center"
>
<template #default="{ row }">
<el-tag
type="success"
v-if="
row.state === 'success'
"
>正确</el-tag
>
<el-tooltip
effect="dark"
:content="row.errMsg"
placement="top-start"
v-else
>
<el-tag type="danger"
>异常</el-tag
>
</el-tooltip>
</template>
</el-table-column>
<el-table-column
label="操作"
width="100"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>编辑</el-button
>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane name="fail">
<template #label>
<el-badge
:value="importTableFailData.length"
class="item"
>
<span>异常</span>
</el-badge>
</template>
<div class="table-container">
<el-table :data="importTableFailData">
<el-table-column
label="信件编号"
prop="originId"
show-overflow-tooltip
/>
<el-table-column
label="投诉渠道"
prop="channelForFilingComplaints"
/>
<el-table-column
label="受理层级"
prop="acceptanceLevel"
/>
<el-table-column
label="登记时间"
prop="discoveryTime"
show-overflow-tooltip
/>
<el-table-column
label="投诉人"
prop="responderName"
width="90"
/>
<el-table-column
label="投诉人电话"
prop="contactPhone"
width="120"
/>
<el-table-column
label="初重信访"
align="center"
width="90"
>
<template #default="{ row }">
<span>{{
getDictLable(
dict.initialPetition,
row.initialPetition
)
}}</span>
</template>
</el-table-column>
<el-table-column
label="缠访闹访"
width="90"
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="90"
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="被投诉二级机构" prop="involveSecondDepartName" show-overflow-tooltip />
<el-table-column label="被投诉所队" prop="involveThirdDepartName" show-overflow-tooltip />
<el-table-column
label="具体内容"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column
label="数据校验"
width="120"
>
<template #default="{ row }">
<el-tooltip
effect="dark"
:content="row.errMsg"
placement="top-start"
>
<el-tag type="danger"
>异常</el-tag
>
</el-tooltip>
</template>
</el-table-column>
<el-table-column
label="操作"
width="120"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>编辑</el-button
>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
</el-tabs>
</el-scrollbar>
</div>
</template>
</div>
<footer class="flex end mt-20 v-center">
<span class="mr-20" v-if="step === 2"
>选中<b>{{ checkRowSize }}</b
>条数据</span
>
<el-button size="large" @click="show = false">取消</el-button>
<el-button
type="primary"
size="large"
@click="handleImport"
:disabled="fileList.length === 0"
v-if="step === 1"
v-loading="loading"
>下一步</el-button
>
<el-button
type="primary"
size="large"
@click="handleSaveImport"
:disabled="checkRowSize === 0"
v-else
>确认导入</el-button
>
</footer>
</el-dialog>
<el-dialog width="660px" top="5vh" v-model="editShow" title="编辑数据">
<el-form :label-width="120" :model="form" ref="formRef">
<el-form-item
label="信件编号"
prop="originId"
:rules="{
required: true,
message: '请选择',
trigger: ['blur'],
}"
>
<el-input placeholder="请输入" v-model="form.originId" />
</el-form-item>
<el-form-item label="投诉渠道">
<el-input
placeholder="请输入"
v-model="form.channelForFilingComplaints"
/>
</el-form-item>
<el-form-item label="受理层级">
<el-input placeholder="请输入" v-model="form.acceptanceLevel" />
</el-form-item>
<el-form-item label="登记时间">
<el-date-picker type="datetime" v-model="form.discoveryTime" />
</el-form-item>
<el-form-item label="投诉人">
<el-input placeholder="请输入" v-model="form.responderName" />
</el-form-item>
<el-form-item label="投诉人电话">
<el-input placeholder="请输入" v-model="form.contactPhone" />
</el-form-item>
<el-form-item
label="初重信访"
prop="initialPetition"
:rules="{
required: true,
message: '请选择',
trigger: ['blur'],
}"
>
<el-select clearable v-model="form.initialPetition">
<el-option
v-for="item in dict.initialPetition"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label="缠访闹访"
prop="entanglementVisits"
:rules="{
required: true,
message: '请选择',
trigger: ['blur'],
}"
>
<el-select v-model="form.entanglementVisits">
<el-option :value="true" label="是" />
<el-option :value="false" label="否" />
</el-select>
</el-form-item>
<el-form-item
label="群众集访"
prop="massVisits"
:rules="{
required: true,
message: '请选择',
trigger: ['blur'],
}"
>
<el-select v-model="form.massVisits">
<el-option :value="true" label="是" />
<el-option :value="false" label="否" />
</el-select>
</el-form-item>
<el-form-item
label="被投诉机构"
prop="involveThirdDepartId"
>
<depart-tree-select
v-model="form.involveThirdDepartId"
:check-strictly="false"
@node-click="
(node) =>
(form.involveThirdDepartName = node.shortName)
"
/>
</el-form-item>
<el-form-item
label="具体内容"
prop="thingDesc"
:rules="{
required: true,
message: '请输入',
trigger: ['blur'],
}"
>
<el-input type="textarea" v-model="form.thingDesc" />
</el-form-item>
</el-form>
<footer class="flex end mt-20">
<el-button @click="editShow = false">取消</el-button>
<el-button type="primary" @click="handleEditSumbit"
>确认修改</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import { BASE_PATH } from "@/api/request";
import { getDictLable } from "@/utils/util";
import {
importPetitionComplaint,
addPetitionComplaint,
} from "@/api/data/petitionComplaint";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
import { computed } from "vue";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["initialPetition"]);
const props = defineProps({
modelValue: {
type: Boolean,
default: false,
},
title: {
type: String,
},
problemSourcesCode: {
type: String,
},
});
const emit = defineEmits(["update:modelValue", "close", "update"]);
const show = ref(false);
watch(
() => props.modelValue,
(val) => {
show.value = val;
}
);
watch(show, (val) => {
emit("update:modelValue", val);
});
const dataUpdateMethod = ref("incremental");
const fileList = ref([]);
const importTableData = ref([]);
const importTableFailData = computed(() => {
return importTableData.value.filter((item) => item.state === "fail");
});
const step = ref(1);
const loading = ref(false);
async function handleImport() {
const formData = new FormData();
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
importTableData.value = await importPetitionComplaint(formData);
loading.value = false;
step.value = 2;
nextTick(() => {});
}
const checkRowSize = computed(
() => tableRef.value?.getSelectionRows().length || 0
);
const tableRef = ref(null);
async function handleSaveImport() {
const rows = tableRef.value.getSelectionRows();
await addPetitionComplaint({
dataUpdateMethod: dataUpdateMethod.value,
problemSourcesCode: props.problemSourcesCode,
data: [...rows],
});
feedback.msgSuccess(`成功导入${rows.length}条数据`);
step.value = 1;
importTableData.value = [];
fileList.value = [];
emit("close");
emit("update");
}
let activeIndex = -1;
function handleEdit(row) {
form.value = { ...row };
activeIndex = importTableData.value.indexOf(row);
editShow.value = true;
}
const editShow = ref(false);
const form = ref({});
const formRef = ref();
const activeTab = ref("all");
async function handleEditSumbit() {
await formRef.value.validate();
form.value.state = "success";
importTableData.value[activeIndex] = form.value;
editShow.value = false;
}
</script>
<style lang="scss" scoped>
</style>

2
src/components/home/work/my-alarm.vue

@ -45,7 +45,7 @@ defineProps({
const emit = defineEmits(['update'])
const show = ref(false);
const activeRow = ref("");
const activeRow = ref({});
function handleEdit(row) {
show.value = true;

284
src/views/books/Ajhc.vue

@ -1,230 +1,126 @@
<template>
<div class="container">
<header>
<el-form :label-width="80">
<el-form :label-width="114">
<el-row>
<el-col :span="6"> </el-col>
</el-row>
<div class="form-row flex">
<label class="text-center">基本信息</label>
<div class="flex wrap query-box">
<div style="width: 340px">
<el-form-item label="报警时间">
<date-time-range-picker-ext
v-model="query.discoveryTime"
/>
</el-form-item>
</div>
<el-input
placeholder="期数"
style="width: 146px"
v-model="query.reportNumber"
clearable
/>
<el-input
placeholder="具体问题情况"
v-model="query.thingDesc"
clearable
style="width: 260px"
/>
<el-input
placeholder="警情编号"
v-model="query.caseNumber"
clearable
style="width: 200px"
/>
</div>
</div>
<div class="form-row flex">
<label class="text-center">核查情况</label>
<div class="flex wrap query-box">
<div style="width: 160px">
<depart-tree-select
v-model="query.involveDepartId"
placeholder="涉及单位"
/>
</div>
<div style="width: 160px">
<depart-tree-select
v-model="query.handleDepartId"
placeholder="办理单位"
/>
</div>
<el-select
style="width: 146px"
placeholder="是否整改"
clearable
v-model="query.isRectifyCode"
>
<el-option
v-for="item in dict.isRectify"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
<el-col :span="6">
<el-form-item label="案件编号">
<el-input
placeholder="回复情况"
v-model="query.checkStatusDesc"
clearable
style="width: 260px"
placeholder="请输入"
v-model="query.originId"
/>
<div class="flex gap-4">
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="投诉人">
<div class="flex gap">
<el-select
v-model="query.blameKey"
style="width: 90px"
@change="delete query.blameValue"
v-model="query.responderKey"
style="width: 160px"
@change="delete query.responderValue"
>
<el-option value="name" label="姓名" />
<el-option value="empNo" label="警号" />
<el-option value="idCode" label="身份证" />
<el-option value="phone" label="电话" />
</el-select>
<el-input
placeholder="问责人员(民警、辅警)"
v-model="query.blameValue"
placeholder="请输入"
v-model="query.responderValue"
clearable
style="width: 190px"
/>
</div>
</div>
</div>
<div class="form-row flex">
<label class="text-center">其他选项</label>
<div class="flex wrap query-box">
<el-select
style="width: 160px"
placeholder="自查或他查"
clearable
v-model="query.crtDepartLevel"
>
<el-option label="他查" :value="0" />
<el-option label="自查" :value="2" />
</el-select>
<el-select
style="width: 160px"
placeholder="办理状态"
clearable
v-model="query.processingStatus"
multiple
>
</el-form-item>
</el-col>
<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="具体内容">
<el-input
placeholder="请输入"
v-model="query.thingDesc"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否属实">
<el-select clearable v-model="query.checkStatus">
<el-option
v-for="item in dict.processingStatus"
v-for="item in dict.inspectCase"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex between mt-20 mb-26">
<div class="mb-25 flex between">
<div>
<!-- <el-button type="primary" @click="handleExport"
>数据导出</el-button
> -->
</div>
<div>
<el-button type="primary" @click="getList">
<template #icon
><icon name="el-icon-Search"
/></template>
查询</el-button
>
<template #icon>
<icon name="el-icon-Search" />
</template>
查询
</el-button>
<el-button @click="reset">重置</el-button>
</div>
</div>
</header>
<main>
<div class="table-container" v-loading="loading">
<el-table :data="list" ref="tableRef">
<div class="table-container">
<el-table :data="list">
<el-table-column
label="期数"
prop="reportNumber"
width="80"
/>
<el-table-column
label="涉及单位"
prop="involveDepartName"
width="160"
label="案件编号"
prop="originId"
show-overflow-tooltip
/>
<el-table-column
label="办理单位"
show-overflow-tooltip
width="160"
>
<template #default="{ row }">
<span
>{{ row.handleSecondDepartName
}}{{ row.handleThreeDepartName }}</span
>
</template>
</el-table-column>
<el-table-column
label="报警时间"
label="受理时间"
prop="discoveryTime"
width="150"
/>
<el-table-column
label="警情编号"
prop="caseNumber"
width="220"
show-overflow-tooltip
label="问题发生时间"
prop="happenTime"
width="150"
/>
<el-table-column
label="自查或他查"
width="100"
align="center"
>
<template #default="{ row }">
<span>{{
row.crtDepartLevel === 0 ? "他查" : "自查"
}}</span>
</template>
</el-table-column>
<el-table-column
label="具体问题情况"
prop="thingDesc"
label="问题来源"
prop="problemSources"
show-overflow-tooltip
width="200"
/>
<el-table-column
label="核查情况"
prop="checkStatusDesc"
show-overflow-tooltip
width="200"
label="投诉人"
prop="responderName"
width="90"
/>
<el-table-column
label="投诉人电话"
prop="contactPhone"
width="126"
/>
<el-table-column label="业务类别" prop="businessTypeName" />
<el-table-column label="涉嫌问题" prop="involveProblem" />
<el-table-column label="涉及单位" prop="involveDepartName" />
<el-table-column
label="整改情况"
prop="rectifyDesc"
label="具体内容"
prop="thingDesc"
show-overflow-tooltip
width="200"
/>
<el-table-column label="办理状态" width="100">
<template #default="{ row }">
<el-tag
:type="
row.processingStatus ===
ProcessingStatus.COMPLETED
? 'success'
: 'primary'
"
v-if="row.processingStatus"
>{{
getDictLable(
dict.processingStatus,
row.processingStatus
)
}}</el-tag
>
</template>
</el-table-column>
<el-table-column label="操作" width="80" fixed="right">
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleAction(row)"
v-if="row.id"
>详情</el-button
>
</template>
@ -237,14 +133,13 @@
@current-change="getList"
:current-page="query.current"
:page-sizes="[10, 20, 50]"
:page-size="query.size"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
>
</el-pagination>
</div>
</main>
</div>
<negative-dialog
@ -255,54 +150,53 @@
/>
</template>
<script setup>
import { ProcessingStatus } from "@/enums/flowEnums";
import { listNegativeHdjq } from "@/api/books";
import { BASE_PATH } from "@/api/request";
import {
listNegativeAjhc
} from "@/api/books";
import { DistributionState } from "@/enums/dictEnums";
import { getDictLable } from "@/utils/util";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
import { onMounted } from "vue";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"businessType",
"distributionState",
"timeLimit",
"approvalFlow",
"inspectCase",
"isRectify",
"processingStatus",
"suspectProblem",
"policeType",
"specialSupervision",
]);
const query = ref({
current: 1,
size: 10,
blameKey: "name",
current: 1,
responderKey: "name",
});
const list = ref([]);
const total = ref(0);
const loading = ref(false);
function getList() {
loading.value = true;
listNegativeHdjq(query.value).then((data) => {
listNegativeAjhc(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
loading.value = false;
});
}
function reset() {
query.value = {
current: 1,
size: 10,
blameKey: "name",
current: 1,
responderKey: "name",
};
getList();
}
onMounted(() => {
getList();
});
})
const show = ref(false);
const activeNegativeId = ref("");

12
src/views/books/Gabxf.vue

@ -93,9 +93,9 @@
</el-form>
<div class="flex between mt-20 mb-26">
<div>
<!-- <el-button type="primary" @click="handleExport"
<el-button type="primary" @click="handleExport"
>数据导出</el-button
> -->
>
</div>
<div>
<el-button type="primary" @click="getList">
@ -171,7 +171,7 @@
getInvolveProblem(
row.involveProblem,
dict.suspectProblem
) || "/"
)
}}</span>
</template>
</el-table-column>
@ -179,6 +179,7 @@
label="业务类别"
prop="businessTypeName"
width="200"
show-overflow-tooltip
/>
<el-table-column
label="处理情况简要描述"
@ -258,6 +259,7 @@
/>
</template>
<script setup>
import { BASE_PATH } from "@/api/request";
import { ProcessingStatus } from "@/enums/flowEnums";
import { ProblemSources } from "@/enums/dictEnums";
import { listNegativeXf } from "@/api/books";
@ -311,6 +313,10 @@ function handleAction(row) {
show.value = true;
activeNegativeId.value = row.id;
}
function handleExport() {
window.open(`${BASE_PATH}/negative/books/export/xf/${ProblemSources.GABXF}`)
}
</script>
<style lang="scss" scoped>
</style>

12
src/views/books/Gjxf.vue

@ -93,9 +93,9 @@
</el-form>
<div class="flex between mt-20 mb-26">
<div>
<!-- <el-button type="primary" @click="handleExport"
<el-button type="primary" @click="handleExport"
>数据导出</el-button
> -->
>
</div>
<div>
<el-button type="primary" @click="getList">
@ -171,7 +171,7 @@
getInvolveProblem(
row.involveProblem,
dict.suspectProblem
) || "/"
)
}}</span>
</template>
</el-table-column>
@ -179,6 +179,7 @@
label="业务类别"
prop="businessTypeName"
width="200"
show-overflow-tooltip
/>
<el-table-column
label="处理情况简要描述"
@ -258,6 +259,7 @@
/>
</template>
<script setup>
import { BASE_PATH } from "@/api/request";
import { ProcessingStatus } from "@/enums/flowEnums";
import { ProblemSources } from "@/enums/dictEnums";
import { listNegativeXf } from "@/api/books";
@ -311,6 +313,10 @@ function handleAction(row) {
show.value = true;
activeNegativeId.value = row.id;
}
function handleExport() {
window.open(`${BASE_PATH}/negative/books/export/xf/${ProblemSources.GABXF}`)
}
</script>
<style lang="scss" scoped>
</style>

12
src/views/data/Gabxf.vue

@ -60,7 +60,7 @@
</el-form>
<div class="mb-25 flex between">
<div>
<el-button type="primary" @click="show = true"
<el-button type="primary" @click="handleShowImport"
>数据导入</el-button
>
<el-badge
@ -205,10 +205,8 @@
</div>
</div>
<data-import
<data-gab-import
v-model="show"
title="公安部信访投诉 数据导入"
:problemSourcesCode="ProblemSources.GABXF"
@close="show = false"
@update="getList"
/>
@ -230,7 +228,6 @@ import { BASE_PATH } from "@/api/request";
import {
importPetitionComplaint,
listPetitionComplaint,
addPetitionComplaint,
delPetitionComplaint,
} from "@/api/data/petitionComplaint";
import { ProblemSources, DistributionState } from "@/enums/dictEnums";
@ -307,6 +304,11 @@ function handleAction(row) {
negativeShow.value = true;
activeNegativeId.value = row.negativeId;
}
function handleShowImport() {
console.log('handleShowImport')
show.value = true
}
</script>
<style lang="scss" scoped>
</style>

4
src/views/data/Gjxf.vue

@ -206,10 +206,8 @@
</div>
</div>
<data-import
<data-gj-import
v-model="show"
title="国家信访投诉 数据导入"
:problemSourcesCode="ProblemSources.GJXFPT"
@close="show = false"
@update="getList"
/>

114
src/views/data/Mail12337.vue

@ -84,16 +84,17 @@
label="信件编号"
prop="onlyId"
show-overflow-tooltip
width="180"
/>
<el-table-column label="投诉渠道" prop="letterSource" />
<el-table-column label="投诉渠道" prop="letterSource" width="120" />
<el-table-column
label="登记时间"
prop="discoverTime"
show-overflow-tooltip
width="150"
/>
<el-table-column label="投诉人" prop="name" width="90" />
<el-table-column label="电话" prop="phone" />
<el-table-column label="电话" prop="phone" width="116" />
<el-table-column label="被投诉机构" show-overflow-tooltip>
<template #default="{ row }">
@ -106,15 +107,14 @@
prop="wjwfProject"
show-overflow-tooltip
/>
<el-table-column label="是否属实" prop="isReal">
<el-table-column label="是否属实" prop="isReal" width="100">
<template v-slot="scope">
<span v-if="scope.row.isReal === 1">属实</span>
<span v-else-if="scope.row.isReal === 2">部分属实</span>
<span v-else-if="scope.row.isReal === 3">不属实</span>
<span v-else>未知状态</span>
</template>
</el-table-column>
<el-table-column label="状态">
<el-table-column label="状态" width="120">
<template #default="{ row }">
<el-tag
>{{
@ -126,7 +126,7 @@
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<el-table-column label="操作" width="120">
<template #default="{ row }">
<el-button type="danger" link @click="handleDel(row)"
>删除
@ -166,6 +166,7 @@
</header>
<div style="min-height: 50vh">
<template v-if="activeStep === 0">
<div v-loading="loading">
<el-upload
drag
:multiple="false"
@ -184,12 +185,17 @@
</div>
</template>
<template v-else>
<el-icon class="el-icon--upload"><Select /></el-icon>
<el-icon class="el-icon--upload"
><Select
/></el-icon>
<div class="el-upload__text">
已选择文件{{ fileList[fileList.length - 1].name }}
已选择文件{{
fileList[fileList.length - 1].name
}}
</div>
</template>
</el-upload>
</div>
</template>
<template v-if="activeStep === 1">
<div class="table-container">
@ -206,6 +212,12 @@
/>
</template>
</el-table-column>
<el-table-column
label="被举报单位名称"
prop="reportedOrgName"
width="200"
show-overflow-tooltip
/>
<el-table-column
label="信息受理登记时间"
prop="discoverTime"
@ -219,7 +231,7 @@
<el-table-column
label="举报人姓名"
prop="name"
width="100"
width="80"
/>
<el-table-column
label="手机号码"
@ -237,17 +249,17 @@
width="80"
show-overflow-tooltip
/>
<el-table-column
label="核查简要情况"
prop="reviewDes"
show-overflow-tooltip
width="250"
/>
<el-table-column
label="是否政法干警"
prop="isLawPolice"
width="70"
/>
<el-table-column
label="被举报单位名称"
prop="reportedOrgName"
width="160"
show-overflow-tooltip
/>
<el-table-column
label="单位所属层级"
prop="reportedOrgLevel"
@ -324,12 +336,7 @@
prop="reviewedPersonIsleader"
width="130"
/>
<el-table-column
label="核查简要情况"
prop="reviewDes"
show-overflow-tooltip
width="200"
/>
<el-table-column
label="办理结果"
prop="processResult"
@ -359,7 +366,7 @@
</div>
</template>
<template v-if="activeStep === 2">
<el-form :model="formData" ref="formRef" style="margin: 0 80px">
<el-form :model="formData" ref="formRef" style="margin: 0 80px" v-loading="loading">
<el-form-item
label="任务名称"
prop="taskName"
@ -421,27 +428,6 @@
"
/>
</el-form-item>
<el-form-item
label="下发流程"
prop="distributionFlow"
:rules="{
required: true,
message: '请选择下发流程',
}"
>
<el-radio-group
v-model="formData.distributionFlow"
class="block"
>
<el-radio
v-for="item in dict.distributionFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
label="审核流程"
prop="approvalFlow"
@ -481,19 +467,26 @@
<el-result
icon="success"
title="下发成功"
:sub-title="`${formData.taskName} 已成功导入系统,并完成下发。您可通过“我的工作”或“批量下发”功能进行查看。`"
>
<template #sub-title>
<p>
<span>{{ formData.taskName }}</span>
已成功导入系统并完成下发您可通过<span class="link pointer" @click="router.push('/work/BatchDistribute')">批量下发</span> <span class="link pointer" @click="router.push('/query')">综合查询</span>功能进行查看
</p>
</template>
</el-result>
</template>
</div>
<footer class="flex end mt-20 v-center">
<el-button size="large" @click="handlePrev" v-if="activeStep !== 3">上一步</el-button>
<el-button size="large" @click="handlePrev" v-if="activeStep !== 3"
>上一步</el-button
>
<el-button
type="primary"
size="large"
@click="handleNext"
v-loading="loading"
>{{ activeStep === 3 ? '确定' : '下一步' }}</el-button
:disabled="loading"
>{{ activeStep === 3 ? "确定" : "下一步" }}</el-button
>
</footer>
</el-dialog>
@ -523,6 +516,8 @@ const dict = catchStore.getDicts([
"businessType",
]);
const router = useRouter()
const query = ref({
size: 10,
current: 1,
@ -616,25 +611,26 @@ async function handleNext() {
}
activeStep.value = 3;
loading.value = false;
return
getList();
return;
}
if (activeStep.value === 3) {
importShow.value = false
activeStep.value = 0
formData.value = {}
importTableData.value = []
fileList.value = []
importShow.value = false;
activeStep.value = 0;
formData.value = {};
importTableData.value = [];
fileList.value = [];
}
}
watch(importShow, (val) => {
if (val) {
activeStep.value = 0
formData.value = {}
importTableData.value = []
fileList.value = []
activeStep.value = 3;
formData.value = {};
importTableData.value = [];
fileList.value = [];
}
})
});
</script>
<style lang="scss" scoped>
</style>

162
src/views/data/VideoInspection.vue

@ -0,0 +1,162 @@
<template>
<div class="container">
<header>
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="预警类型">
<el-input
placeholder="请输入"
v-model="query.systemKeyName"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="案事件名称">
<el-input
placeholder="请输入"
v-model="query.title"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发生单位">
<depart-tree-select
v-model="query.departId"
placeholder="涉及单位"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex end mt-20 mb-26">
<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="alarmLevel"
width="120"
/>
<el-table-column label="预警类别" prop="systemKeyName" />
<el-table-column label="预警时间" prop="" />
<el-table-column label="案事件名称" prop="title" />
<el-table-column label="发生单位名称" prop="fsdwGajgmc" />
<el-table-column label="下发状态" width="120">
<template #default="{ row }">
<span class="text-danger">未下发</span>
</template>
</el-table-column>
<el-table-column label="操作" width="160">
<template #default="{ row }">
<el-button type="primary" link>查看详情</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:current-page="query.current"
: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="80vw">
<div class="row">
<div class="col col-6">
<label>预警时间</label>
<span>{{ }}</span>
</div>
<div class="col col-6">
<label>预警级别</label>
<span>{{ }}</span>
</div>
<div class="col col-6">
<label>预警开始时间</label>
<span>{{ }}</span>
</div>
<div class="col col-6">
<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>{{ }}</span>
</div>
<div class="col col-24">
<label>督察方式</label>
<span>{{ }}</span>
</div>
<div class="col col-24">
<label>预警名称</label>
<span>{{ }}</span>
</div>
<div class="col col-24">
<label>预警标题</label>
<span>{{ }}</span>
</div>
</div>
</el-dialog>
</template>
<script setup>
import { listVideoInspection } from "@/api/data/videoInspection";
import feedback from "@/utils/feedback";
const query = ref({
current: 1,
size: 10,
});
const list = ref([]);
const total = ref(0);
function getList() {
listVideoInspection(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
onMounted(() => {
getList();
});
function reset() {
query.value = {
current: 1,
size: 10,
};
getList();
}
const show = ref(false);
</script>
<style scoped>
</style>

3
src/views/sensitivePerception/ModelClueTask.vue

@ -160,9 +160,6 @@
</div>
</el-dialog>
<el-dialog title="分发详情" v-model="show" width="80vw">
</el-dialog>
</template>
<script lang="ts" setup>
import { listModelClueTask, listModelClueByDepart, listModelClues } from "@/api/sensitivePerception/modelClueTask";

148
src/views/system/DepartMaping.vue

@ -1,6 +1,6 @@
<template>
<div class="container">
<el-tabs v-model="activeName">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="情指行" name="情指行"> </el-tab-pane>
<el-tab-pane label="重点人员" name="重点人员"> </el-tab-pane>
<el-tab-pane label="民意感知" name="民意感知"> </el-tab-pane>
@ -13,13 +13,13 @@
<div class="flex wrap query-box">
<el-input
placeholder="单位编码"
v-model="query.originId"
v-model="query.externalId"
clearable
style="width: 200px"
/>
<el-input
placeholder="单位名称"
v-model="query.originId"
v-model="query.externalName"
clearable
style="width: 200px"
/>
@ -32,10 +32,28 @@
<div class="flex wrap query-box">
<div style="width: 280px">
<depart-tree-select
v-model="query.involveDepartId"
v-model="query.internalId"
placeholder="请选择机构"
/>
</div>
<el-select
style="width: 200px"
placeholder="单位层级"
v-model="query.level"
>
<el-option
value="2"
label="二级单位"
></el-option>
<el-option
value="3"
label="三级单位"
></el-option>
<el-option
value="4"
label="四级单位"
></el-option>
</el-select>
</div>
</div>
</el-col>
@ -56,6 +74,79 @@
</div>
</div>
</header>
<p></p>
<el-tabs v-model="activeMaping">
<el-tab-pane label="全部" name="all">
<div class="table-container">
<el-table :data="list">
<el-table-column
:label="`${activeName}单位编码`"
prop="externalId"
width="150"
/>
<el-table-column
:label="`${activeName}单位名称`"
prop="externalName"
/>
<el-table-column
label="数字督察单位"
prop="internalName"
/>
<el-table-column
label="单位层级"
prop="level"
width="100"
align="center"
>
<template #default="{ row }">
<span v-if="row.level === 2">二级单位</span>
<span v-if="row.level === 3">三级单位</span>
<span v-if="row.level === 4">四级单位</span>
</template>
</el-table-column>
<el-table-column
label="最后修改时间"
prop="updateTime"
width="160"
/>
<el-table-column label="操作" width="160">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(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"
:current-page="query.current"
: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>
</el-tab-pane>
<el-tab-pane label="未映射" name="noMaping">
<template #label>
<el-badge :value="0">
<span>未映射</span>
</el-badge>
</template>
<div class="table-container">
<el-table :data="list">
<el-table-column
@ -67,7 +158,22 @@
:label="`${activeName}单位名称`"
prop="externalName"
/>
<el-table-column label="数字督察单位" prop="internalName" />
<el-table-column
label="数字督察单位"
prop="internalName"
/>
<el-table-column
label="单位层级"
prop="level"
width="100"
align="center"
>
<template #default="{ row }">
<span v-if="row.level === 2">二级单位</span>
<span v-if="row.level === 3">三级单位</span>
<span v-if="row.level === 4">四级单位</span>
</template>
</el-table-column>
<el-table-column
label="最后修改时间"
prop="updateTime"
@ -75,10 +181,16 @@
/>
<el-table-column label="操作" width="160">
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)"
<el-button
type="primary"
link
@click="handleEdit(row)"
>编辑</el-button
>
<el-button type="danger" link @click="handleDel(row)"
<el-button
type="danger"
link
@click="handleDel(row)"
>删除</el-button
>
</template>
@ -98,6 +210,8 @@
>
</el-pagination>
</div>
</el-tab-pane>
</el-tabs>
</div>
<el-dialog
@ -186,11 +300,15 @@ import {
listDepartMaping,
addDepartMaping,
updateDepartMaping,
delDepartMaping
delDepartMaping,
} from "@/api/system/departMaping";
import feedback from "@/utils/feedback";
const activeName = ref("情指行");
const query = ref({});
const activeMaping = ref("all");
const query = ref({
current: 1,
size: 10,
});
const list = ref([]);
const total = ref(0);
@ -201,6 +319,14 @@ function getList() {
});
}
function reset() {
query.value = {
current: 1,
size: 10,
};
getList();
}
watch(activeName, () => {
getList();
});
@ -232,7 +358,7 @@ async function handleDel(row) {
await feedback.confirm("确定要删除该数据?");
await delDepartMaping(row.id);
getList();
feedback.msgSuccess('删除成功')
feedback.msgSuccess("删除成功");
}
async function submit() {
@ -247,7 +373,7 @@ async function submit() {
source: activeName.value,
};
getList();
feedback.msgSuccess('操作成功')
feedback.msgSuccess("操作成功");
}
</script>
<style lang="scss" scoped>

89
src/views/work/BatchDistribute.vue

@ -69,12 +69,14 @@
<el-button
type="primary"
link
@click="handleDetailShow(row.id)"
>查看详情</el-button
>
<el-button
type="primary"
link
v-if="row.source === '12337'"
@click="handleExport12337(row.id)"
>生成结果文件</el-button
>
</template>
@ -250,27 +252,6 @@
"
/>
</el-form-item>
<el-form-item
label="下发流程"
prop="distributionFlow"
:rules="{
required: true,
message: '请选择下发流程',
}"
>
<el-radio-group
v-model="formData.distributionFlow"
class="block"
>
<el-radio
v-for="item in dict.distributionFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
label="审核流程"
prop="approvalFlow"
@ -310,8 +291,13 @@
<el-result
icon="success"
title="下发成功"
:sub-title="`${formData.taskName} 已成功导入系统,并完成下发。您可通过“我的工作”或“批量下发”功能进行查看。`"
>
<template #sub-title>
<p>
<span>{{ formData.taskName }}</span>
已成功导入系统并完成下发您可通过<span class="link pointer" @click="router.push('/work/BatchDistribute')">批量下发</span> <span class="link pointer" @click="router.push('/query')">综合查询</span>功能进行查看
</p>
</template>
</el-result>
</template>
</div>
@ -330,9 +316,50 @@
</el-dialog>
<Loading :loading="loading" :loadingText="loadingText" />
<el-dialog title="查看详情" v-model="show" width="80vw">
<div style="min-height: 500px">
<div class="table-container">
<el-table :data="taskDetailList">
<el-table-column
label="单位名称"
prop="departName"
width="200"
show-overflow-tooltip
/>
<el-table-column
label="问题数量"
prop="size"
width="200"
show-overflow-tooltip
/>
<el-table-column
label="办结数量"
prop="completedSize"
width="200"
/>
<el-table-column
label="办结率"
align="center"
prop="completedSize"
/>
<el-table-column
label="查实数量"
align="center"
prop="verifySize"
/>
<el-table-column
label="涉及人数"
align="center"
prop="personalSize"
/>
</el-table>
</div>
</div>
</el-dialog>
</template>
<script setup>
import { listNegativeTaskImport, importNegative, distributeNegative } from "@/api/work/negativeTask";
import { listNegativeTaskImport, importNegative, distributeNegative, listGroupByDepart } from "@/api/work/negativeTask";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
import { BASE_PATH } from "@/api/request";
@ -342,8 +369,10 @@ const dict = catchStore.getDicts([
"approvalFlow",
"distributionFlow",
"businessType",
]);
const router = useRouter()
const query = ref({});
const list = ref([]);
const total = ref(0);
@ -445,6 +474,20 @@ watch(importShow, (val) => {
fileList.value = []
}
})
function handleExport12337(id) {
window.open(`${BASE_PATH}/data/petitionComplaint12337/export/result?taksId=${id}`)
}
const show = ref(false)
const taskDetailList = ref([])
async function handleDetailShow(id) {
const data = await listGroupByDepart(id)
taskDetailList.value = data;
show.value = true;
}
</script>
<style lang="scss" scoped>
</style>

272
src/views/work/News.vue

@ -0,0 +1,272 @@
<template>
<div class="container">
<header>
<el-form :label-width="120">
<el-row>
<el-col :span="6">
<el-form-item label="发布时间">
<date-time-range-picker-ext
v-model="query.releaseTime"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="动态类型">
<el-select v-model="query.hostLevel" clearable>
<el-option
v-for="item in dict.newsWorkSource"
: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.hostLevel" clearable>
<el-option
v-for="item in dict.newsWorkType"
: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="请输入"
v-model="query.contextTxt"
clearable
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex between mt-20 mb-26">
<el-button type="primary" @click="handleAdd">
<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="releaseTime" width="160" />
<el-table-column label="动态类型" prop="source" width="130" />
<el-table-column label="动态分类" prop="workType" width="120" />
<el-table-column label="动态内容" prop="contentTxt" />
<el-table-column label="操作" width="160">
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(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"
:current-page="query.current"
: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
v-model="show"
:title="mode === 'add' ? '新增工作动态' : '编辑工作动态'"
width="900"
>
<el-form
:label-width="140"
:model="formData"
ref="fomrRef"
style="min-height: 40vh"
>
<el-row>
<el-col :span="12">
<el-form-item
label="动态类型"
prop="source"
:rules="{
required: true,
message: '请选择',
trigger: ['blur'],
}"
>
<el-radio-group v-model="formData.source">
<el-radio
v-for="item in dict.newsWorkSource"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="发布时间"
prop="releaseTime"
:rules="{
required: true,
message: '请选择',
trigger: ['blur'],
}"
>
<el-date-picker
v-model="formData.releaseTime"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm"
time-format="HH:mm"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item
label="动态分类"
prop="workType"
:rules="{
required: true,
message: '请选择',
trigger: ['blur'],
}"
>
<el-radio-group v-model="formData.workType">
<el-radio
v-for="item in dict.newsWorkType"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{ item.remark ? `(${item.remark})` : "" }}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
label="动态内容"
prop="contentTxt"
:rules="{
required: true,
message: '请输入',
trigger: ['blur'],
}"
>
<el-input
v-model="formData.contentTxt"
clearable
placeholder="请输入"
type="textarea"
:autosize="{ minRows: 6, maxRows: 10 }"
/>
</el-form-item>
</el-form>
<footer class="flex end mt-40">
<el-button @click="show = false" size="large">取消</el-button>
<el-button type="primary" @click="submit" size="large"
>保存</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import { listNews, addNews, updateNews, delNews } from "@/api/work/news";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["newsWorkType", "newsWorkSource"]);
const query = ref({
current: 1,
size: 10,
});
const list = ref([]);
const total = ref(0);
function getList() {
listNews(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
current: 1,
size: 10,
};
getList();
}
onMounted(() => {
getList();
});
const show = ref(false);
const mode = ref("add");
const formData = ref({});
const fomrRef = ref();
function handleAdd() {
formData.value = { internalId: "" };
show.value = true;
mode.value = "add";
}
function handleEdit(row) {
formData.value = { ...row };
show.value = true;
mode.value = "edit";
}
async function handleDel(row) {
await feedback.confirm("确定要删除该数据?");
await delNews(row.id);
getList();
feedback.msgSuccess("删除成功");
}
async function submit() {
await fomrRef.value.validate();
if (mode.value === "add") {
await addNews(formData.value);
} else {
await updateNews(formData.value);
}
show.value = false;
formData.value = {};
getList();
feedback.msgSuccess("操作成功");
}
</script>
<style lang="scss" scoped>
</style>
Loading…
Cancel
Save