数字督察一体化平台-前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

819 lines
31 KiB

<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.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="登记时间">
<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-row>
<el-row>
<el-col :span="6">
<el-form-item label="是否属实">
<el-select clearable v-model="query.checkStatus">
<el-option
v-for="item in dict.inspectCase"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</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
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-row>
</el-form>
<div class="mb-25 flex between">
<div>
<el-button type="primary" @click="importShow = true"
>数据导入
</el-button>
</div>
<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="onlyId"
show-overflow-tooltip
width="180"
/>
<el-table-column
label="投诉渠道"
prop="letterSource"
width="120"
/>
<el-table-column
label="登记时间"
prop="discoverTime"
width="150"
/>
<el-table-column label="投诉人" prop="name" width="90" />
<el-table-column label="电话" prop="phone" width="116" />
<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="wjwfProject"
show-overflow-tooltip
/>
<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>
</template>
</el-table-column>
<el-table-column label="状态" width="120">
<template #default="{ row }">
<el-tag
>{{
getDictLable(
dict.distributionState,
row.distributionState
)
}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button type="primary" link @click="handleAction(row)" v-if="row.distributionState === '1'">问题详情</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>
<el-dialog
v-model="importShow"
title="12337信访投诉导入"
width="80vw"
top="8vh"
>
<header class="flex center mb-40">
<el-steps
:space="200"
:active="activeStep"
finish-status="success"
style="width: 800px"
>
<el-step title="数据导入" />
<el-step title="数据校验" />
<el-step title="问题下发" />
<el-step title="完成下发" />
</el-steps>
</header>
<div style="min-height: 50vh">
<template v-if="activeStep === 0">
<div v-loading="loading">
<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-10">
说明:请上传12337信访投诉台账表格进行导入操作,上传成功后点击“下一步”进行数据核验。
</div>
</div>
</template>
<template v-if="activeStep === 1">
<div class="table-container">
<el-table :data="importTableData" max-height="500px">
<el-table-column width="180">
<template #header>
<span class="text-danger">核查办理单位*</span>
</template>
<template #default="{ row }">
<template v-if="row.departId">
<span>{{ row.departName }}</span>
</template>
<depart-tree-select
size="small"
v-model="row.departId"
v-else
/>
</template>
</el-table-column>
<el-table-column
label="核查单位"
prop="reviewOrg"
width="120"
/>
<el-table-column
label="被举报单位名称"
prop="reportedOrgName"
width="170"
show-overflow-tooltip
/>
<el-table-column
label="信息受理登记时间"
prop="discoverTime"
width="170"
>
<template #header>
<span class="text-danger"
>信息受理登记时间*</span
>
</template>
</el-table-column>
<el-table-column
label="线索来源"
prop="letterSource"
width="86"
/>
<el-table-column
label="举报人姓名"
prop="name"
width="80"
/>
<el-table-column
label="手机号码"
prop="phone"
width="116"
/>
<el-table-column
label="身份证号"
prop="idCode"
width="174"
/>
<el-table-column
label="现住地详址"
prop="address"
width="80"
show-overflow-tooltip
/>
<el-table-column
prop="wjwfProject"
show-overflow-tooltip
width="250"
>
<template #header>
<span class="text-danger"
>涉嫌违纪违法事项*</span
>
</template>
</el-table-column>
<el-table-column
label="是否政法干警"
prop="isLawPolice"
width="70"
/>
<el-table-column
label="单位所属层级"
prop="reportedOrgLevel"
width="80"
/>
<el-table-column
label="涉嫌违纪问题项目"
prop="againstProProject"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="涉嫌贪污贿赂类犯罪"
prop="corruptionGuilt"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="涉嫌渎职类犯罪"
prop="omissionGuilt"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="涉嫌侵犯公民人身权利类犯罪"
prop="invadeEntitlementGuilt"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="涉嫌侵犯财产类犯罪"
prop="invadeFinanceGuilt"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="其他"
prop="otherGuilt"
width="80"
show-overflow-tooltip
/>
<el-table-column
label="转办时间"
prop="passTime"
width="170"
/>
<el-table-column
label="核查时间"
prop="reviewTime"
width="110"
/>
<el-table-column
label="核查人"
prop="reviewPersonName"
width="90"
/>
<el-table-column
label="核查人联系方式"
prop="reviewPersonPhone"
width="120"
/>
<el-table-column
label="被核查人类别"
prop="reviewedPersonType"
width="120"
/>
<el-table-column
label="被核查人是否属于领导班子成员"
prop="reviewedPersonIsleader"
width="130"
/>
<el-table-column
label="办理结果"
prop="processResult"
width="130"
/>
<el-table-column
label="是否办结"
prop="isOver"
width="60"
/>
<el-table-column
label="是否申请异议"
prop="isDissent"
width="70"
/>
<el-table-column
label="是否存在附件"
prop="isAnnex"
width="70"
/>
<el-table-column
label="线索举报时间"
prop="reportTime"
width="180"
/>
</el-table>
</div>
<div class="mt-10">
说明:数据校验展示信访投诉关键信息,标红内容为必填项!
</div>
<div class="text-danger text-wrap mt-10 text-small">
{{ errMsg }}
</div>
</template>
<template v-if="activeStep === 2">
<el-form
:model="formData"
ref="formRef"
style="margin: 0 80px"
v-loading="loading"
>
<el-form-item
label="任务名称"
prop="taskName"
:rules="{
required: true,
message: '请输入任务名称',
}"
>
<el-input
v-model="formData.taskName"
style="width: 280px"
placeholder="请输入"
/>
</el-form-item>
<el-form-item
label="业务类别"
prop="businessTypeCode"
:rules="{
required: true,
message: '请选择业务类别',
trigger: ['blur'],
}"
>
<el-select
v-model="formData.businessTypeCode"
@change="
(val) =>
(formData.businessTypeName =
dict.businessType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
style="width: 280px"
>
<el-option
v-for="item in dict.businessType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label="办理时限"
prop="timeLimit"
:rules="{
required: true,
message: '请选择办理时限',
}"
>
<time-limit-select
v-model="formData.timeLimit"
v-model:maxSignDuration="formData.maxSignDuration"
v-model:maxHandleDuration="
formData.maxHandleDuration
"
v-model:maxExtensionDuration="
formData.maxExtensionDuration
"
/>
</el-form-item>
<el-form-item
label="下发流程"
prop="distributionFlow"
:rules="{
required: true,
message: '请选择下发流程',
}"
>
<el-radio-group v-model="formData.distributionFlow">
<el-radio
v-for="item in dict.distributionFlow"
: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="approvalFlow"
:rules="{
required: true,
message: '请选择审核流程',
}"
>
<div>
<el-radio-group v-model="formData.approvalFlow">
<el-radio
v-for="item in dict.approvalFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
<div class="tips mt-10">
<p>
三级审核 在问题提交办结时,需经过“所队—>二级机构—>市局”三级审核,通过后方可办结;
</p>
<p>
二级审核 在问题提交办结时,仅需经过“所队—>二级机构”两级审核,通过后即可办结;
</p>
</div>
</div>
</el-form-item>
<el-form-item label="附件说明" prop="thingFiles">
<file-upload v-model:files="formData.thingFiles" />
</el-form-item>
</el-form>
</template>
<template v-if="activeStep === 3">
<el-result icon="success" title="下发成功">
<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 && activeStep !== 0"
>上一步</el-button
>
<el-button
type="primary"
size="large"
@click="handleNext"
:disabled="loading"
>{{ activeStep === 3 ? "确定" : "下一步" }}</el-button
>
</footer>
</el-dialog>
<negative-dialog
v-model="negativeDetailShow"
:id="activeNegativeId"
@close="negativeDetailShow = 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.onlyId }}</span>
</div>
<div class="col col-12">
<label>投诉渠道</label>
<span>{{
activeRow.letterSource || "/"
}}</span>
</div>
<div class="col col-12">
<label>登记时间</label>
<span>{{ activeRow.discoverTime }}</span>
</div>
<div class="col col-12">
<label>投诉人</label>
<span>{{ activeRow.name }}</span>
</div>
<div class="col col-12">
<label>投诉人联系方式</label>
<span>{{ activeRow.phone }}</span>
</div>
<div class="col col-12">
<label>被投诉机构</label>
<span
><span>{{ activeRow.secondDepartName }}</span>
<span>{{ activeRow.thirdDepartName }}</span></span
>
</div>
<div class="col col-24">
<label>具体内容</label>
<span class="content">{{ activeRow.wjwfProject }}</span>
</div>
</div>
</div>
</el-dialog>
</template>
<script setup>
import { delPetitionComplaint } from "@/api/data/petitionComplaint";
import { getIdByOriginId } from "@/api/work/negative";
import { ProblemSources, DistributionState } from "@/enums/dictEnums";
import feedback from "@/utils/feedback";
import { getDictLable ,getYearTime} from "@/utils/util";
import useCatchStore from "@/stores/modules/catch";
import {
delPetitionComplaint12337,
listPetitionComplaint12337,
importPetitionComplaint12337,
distributePetitionComplaint12337,
} from "@/api/data/petition12337.ts";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"distributionState",
"inspectCase",
"approvalFlow",
"distributionFlow",
"businessType",
]);
const route = useRoute();
const query = ref({
size: 10,
current: 1,
responderKey: "name",
});
const list = ref([]);
const total = ref(0);
//检测跳转来源界面是否为大屏
watch(()=>route.query.toString(),
()=>{
if(route.query.open){
query.value.createTime=getYearTime()
}
getList()
},{immediate:true,deep:true})
function getList() {
listPetitionComplaint12337(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
size: 10,
current: 1,
responderName: "name",
};
getList();
}
getList();
const show = ref(false);
// 删除操作
async function handleDel(row) {
await feedback.confirm("确定要删除该数据?");
await delPetitionComplaint12337(row.onlyId);
getList();
}
const activeStep = ref(0);
const importShow = ref(false);
const fileList = ref([]);
const loading = ref(false);
const importTableData = ref([]);
const formData = ref({});
const formRef = ref();
function handlePrev() {
activeStep.value = activeStep.value - 1;
}
const errMsg = ref("");
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 importPetitionComplaint12337(
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;
}
});
errMsg.value = "";
const error = [];
for (let i = 0; i < importTableData.value.length; i++) {
const item = importTableData.value[i];
let message = "";
if (!item.departId) {
message += "核查办理单位为空;";
}
if (!item.discoverTime) {
message += "信息受理登记时间为空;";
}
if (!item.wjwfProject) {
message += "涉嫌违纪违法事项为空;";
}
if (message) {
error.push(`${i + 1}条数据:` + message);
}
}
if (error.length > 0) {
feedback.msgWarning("数据不符合规范!");
errMsg.value = error.join("\n");
throw new Error("数据不符合规范!");
}
activeStep.value = 2;
formData.value.taskName =
fileList.value[fileList.value.length - 1].name;
return;
}
if (activeStep.value === 2) {
await formRef.value.validate();
loading.value = true;
formData.value.data = importTableData.value;
try {
await distributePetitionComplaint12337(formData.value);
} catch (e) {
loading.value = false;
throw e;
}
activeStep.value = 3;
loading.value = false;
getList();
return;
}
if (activeStep.value === 3) {
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 = [];
}
});
const activeNegativeId = ref('')
const negativeDetailShow = ref(false)
async function handleAction(row) {
activeNegativeId.value = await getIdByOriginId(row.onlyId);
negativeDetailShow.value = true;
}
const detailShow = ref(false);
const activeRow = ref({});
function handleDetail(row) {
activeRow.value = row;
detailShow.value = true;
}
</script>