数字督察一体化平台-前端
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.
 
 
 
 

958 lines
36 KiB

<template>
<div class="container">
<header class="mb-20">
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="任务名称">
<el-input
placeholder="请输入任务名称"
v-model="query.taskName"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="数据来源">
<el-select v-model="query.source" clearable>
<el-option
label="标准模板"
value="标准模板"
></el-option>
<el-option
label="审计监督"
value="审计监督"
></el-option>
<el-option
label="案件核查"
value="案件核查"
></el-option>
<el-option
label="12337"
value="12337"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="下发时间">
<date-time-range-picker-ext
v-model="query.crtTime"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex between">
<div>
<el-button type="primary" @click="handleShowImport">
<template #icon>
<icon name="el-icon-Top" />
</template>
标准问题批量下发</el-button
>
<el-button type="primary" @click="handleShowAuditImport">
<template #icon>
<icon name="el-icon-Top" />
</template>
审计监督问题批量下发</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="taskName" />
<el-table-column label="数据来源" prop="source" width="160" />
<el-table-column label="下发时间" prop="crtTime" width="160" />
<el-table-column
label="问题条数"
prop="importRow"
width="100"
align="center"
/>
<!-- <el-table-column label="办结数量" prop="" width="100" align="center" />
<el-table-column label="查实数量" prop="" width="100" align="center" />
<el-table-column label="涉及单位数" prop="" width="100" align="center" />
<el-table-column label="涉及人数" prop="" width="100" align="center" /> -->
<el-table-column label="操作人" prop="crtUser" width="160" />
<el-table-column label="操作" width="200">
<template #default="{ row }">
<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>
</el-table-column>
</el-table>
</div>
<div class="flex between v-center mt-8">
<div>
说明:批量下发列表,展示问题导入标准模板及其他来源问题导入模板下发的任务情况。
</div>
<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="问题批量下发" width="80vw">
<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">
<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/问题批量导入标准模板.xlsx`"
target="__blank"
>问题批量导入标准模板.xlsx 下载</a
>
</div>
<div class="mt-10">
说明:请上传“问题批量导入标准模板”,上传成功后点击“下一步”进行数据校验。
</div>
</template>
<template v-if="activeStep === 1">
<div class="table-container">
<el-table :data="importTableData">
<el-table-column
label="问题涉及单位"
prop="discoverTime"
width="180"
>
<template #header>
<el-tooltip content="点击单位格,重新选择单位">
<span>问题涉及单位<el-icon><QuestionFilled /></el-icon></span>
</el-tooltip>
</template>
<template #default="{ row ,$index}">
<depart-tree-select
v-if="row.editMode"
size="small"
v-model="row.involveDepartId"
/>
<div style="width: 100%" v-else @click="handleCellClick(row,$index)" >{{getDepartShortName(departs,row.involveDepartId)}}</div>
</template>
</el-table-column>
<el-table-column
label="通报期数"
prop="reportNumber"
width="110"
>
<template #default="{ row }">
<el-select v-model="row.reportId"
filterable
remote
clearable
reserve-keyword
@change="setReportNameFun(row)"
placeholder="请选择通报期数"
:remote-method="getReportListDataFun"
:loading="reportLoading"
>
<el-option
v-for="(item,id) in reportList"
:key="item.id"
:value="item.id"
:label="item.reportName"
/>
</el-select>
</template>
</el-table-column>
<el-table-column
label="案件/警情编号"
prop="caseNumber"
width="130"
/>
<el-table-column
label="业务类别"
prop="businessTypeName"
width="110"
/>
<el-table-column
label="涉嫌问题"
prop="involveProblemStr"
width="120"
show-overflow-tooltip
/>
<el-table-column
label="涉及警种"
prop="policeTypeName"
width="90"
/>
<el-table-column
label="问题发现时间"
prop="discoveryTime"
width="160"
/>
<el-table-column
label="具体问题内容"
prop="thingDesc"
show-overflow-tooltip
/>
<el-table-column
label="专项督察"
prop="specialSupervisionName"
width="110"
/>
<el-table-column
label="问题发生时间"
prop="happenTime"
width="160"
/>
<el-table-column
label="投诉人"
prop="responderName"
width="90"
/>
<el-table-column
label="投诉人联系电话"
prop="contactPhone"
width="130"
/>
</el-table>
</div>
</template>
<template v-if="activeStep === 2">
<el-form :model="formData" ref="formRef" style="margin: 0 80px">
<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="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"
v-loading="loading"
>{{ activeStep === 3 ? "确定" : "下一步" }}</el-button
>
</footer>
</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>
<el-dialog v-model="auditImportShow" title="审计监督问题批量下发" width="80vw">
<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">
<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/审计监督问题批量导入模板.xlsx`"
target="__blank"
>审计监督问题批量导入模板.xlsx 下载</a
>
</div>
<div class="mt-10">
说明:请上传“审计监督问题批量导入模板”,上传成功后点击“下一步”进行数据校验。
</div>
</template>
<template v-if="activeStep === 1">
<div class="table-container">
<el-table :data="importTableData">
<el-table-column
label="问题涉及单位"
prop="discoverTime"
width="180"
>
<template #header>
<el-tooltip content="点击单位格,重新选择单位">
<span>问题涉及单位<el-icon><QuestionFilled /></el-icon></span>
</el-tooltip>
</template>
<template #default="{ row ,$index}">
<depart-tree-select
v-if="row.editMode"
size="small"
v-model="row.involveDepartId"
/>
<div style="width: 100%" v-else @click="handleCellClick(row,$index)" >{{getDepartShortName(departs,row.involveDepartId)}}</div>
</template>
<!-- <template #default="{ row }">-->
<!-- <depart-tree-select-->
<!-- size="small"-->
<!-- v-model="row.involveDepartId"-->
<!-- />-->
<!-- </template>-->
</el-table-column>
<el-table-column
label="项目名称"
prop="projectName"
width="110"
/>
<el-table-column
label="问题金额(元)"
prop="involveMoney"
width="90"
/>
<el-table-column
label="案件名称"
prop="caseName"
width="130"
/>
<el-table-column
label="案件/警情编号"
prop="caseNumber"
width="130"
/>
<el-table-column
label="问题来源"
prop="problemSources"
width="110"
/>
<el-table-column
label="业务类别"
prop="businessTypeName"
width="110"
/>
<el-table-column
label="问题类型"
prop="problemsStr"
width="120"
show-overflow-tooltip
/>
<el-table-column
label="涉及警种"
prop="policeTypeName"
width="90"
/>
<el-table-column
label="问题发现时间"
prop="discoveryTime"
width="160"
/>
<el-table-column
label="具体问题内容"
prop="thingDesc"
show-overflow-tooltip
/>
</el-table>
</div>
</template>
<template v-if="activeStep === 2">
<el-form :model="formData" ref="formRef" style="margin: 0 80px">
<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="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"
v-loading="loading"
>{{ activeStep === 3 ? "确定" : "下一步" }}</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import {
listNegativeTask,
importNegative,
distributeNegative,
listGroupByDepart,
importAuditNegative,
distributeAuditNegative
} from "@/api/work/negativeTask";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
import { BASE_PATH } from "@/api/request";
import {getListData,getReportDetailFun} from "@/api/superviseReport/superviseReport";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"approvalFlow",
"distributionFlow",
"businessType",
]);
const router = useRouter();
const query = ref({
size: 10,
current: 1,
category: "0",
});
const list = ref([]);
const total = ref(0);
function getList() {
listNegativeTask(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
size: 10,
current: 1,
category: "0",
};
getList();
}
onMounted(() => {
getList();
});
const activeStep = ref(0);
const importShow = ref(false);
const fileList = ref([]);
const loading = ref(false);
const loadingText = ref("");
const importTableData = ref([]);
const formData = ref({});
const formRef = ref();
const catchSotre = useCatchStore();
const departs = catchSotre.getDeparts();
function handleCellClick(row,index){
importTableData.value.forEach((value,i)=>{
if(i != index ){
value.editMode=false
}
})
row.editMode=true
}
function handleBlur(row){
row.editMode=false
console.log('row.editMode',row.editMode)
}
//获取单位为简称
function getDepartShortName(departData, id) {
let name = null;
if (departData) {
for (let i = 0; i < departData.length; i++) {
let s = departData[i];
if (s.id === id) {
name= s.shortName;
break;
}
if (s.children) {
name = getDepartShortName(s.children, id)
if(name != null){
break;
}
}
}
}
return name;
}
function handleShowImport() {
importShow.value = true;
}
function handlePrev() {
activeStep.value = activeStep.value - 1;
}
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;
loadingText.value = "数据校验中...";
try {
if (importShow.value) {
importTableData.value = await importNegative(formData);
} else {
importTableData.value = await importAuditNegative(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.involveDepartId) {
feedback.msgWarning("请选择问题涉及单位");
throw e;
}
});
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;
loadingText.value = "数据处理中,请稍后...";
formData.value.data = importTableData.value;
try {
if (importShow.value) {
await distributeNegative(formData.value);
} else {
await distributeAuditNegative(formData.value);
}
} catch (e) {
loading.value = false;
throw e;
}
activeStep.value = 3;
loading.value = false;
getList();
return;
}
if (activeStep.value === 3) {
importShow.value = false;
auditImportShow.value = false
}
}
watch(importShow, (val) => {
if (val) {
activeStep.value = 0;
formData.value = {};
importTableData.value = [];
fileList.value = [];
}
});
const auditImportShow = ref(false)
watch(auditImportShow, (val) => {
if (val) {
activeStep.value = 0;
formData.value = {};
importTableData.value = [];
fileList.value = [];
}
});
const reportQuery = ref({
current: 1,
size: 100,
departBranch:false
})
const reportList = ref([]);
const reportLoading = ref(false);
const getReportListDataFun = async (val=null)=>{
reportLoading.value=true;
try{
if(val){
reportQuery.value.reportName = val;
}else{
reportQuery.value.reportName =null;
}
const res = await getListData(reportQuery.value);
reportList.value=res.records;
reportLoading.value=false;
}catch (e){
reportLoading.value=false;
}
}
const setReportNameFun = async(row)=>{
let res = await getReportDetailFun(row.reportId);
row.reportNumber=res?.reportName;
}
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;
}
function handleShowAuditImport() {
auditImportShow.value = true;
}
</script>