|
|
|
@ -59,6 +59,14 @@ |
|
|
|
/> |
|
|
|
/> |
|
|
|
</el-form-item> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
|
|
|
|
<el-form-item label="涉及三级机构" prop="thirdDepartId"> |
|
|
|
|
|
|
|
<depart-tree-select |
|
|
|
|
|
|
|
v-model="query.thirdDepartId" |
|
|
|
|
|
|
|
:check-strictly="true" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
<el-col :span="6"> |
|
|
|
<el-col :span="6"> |
|
|
|
<el-form-item label="办理方式"> |
|
|
|
<el-form-item label="办理方式"> |
|
|
|
<el-select |
|
|
|
<el-select |
|
|
|
@ -73,32 +81,17 @@ |
|
|
|
</el-form-item> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
</el-col> |
|
|
|
<el-col :span="6"> |
|
|
|
<el-col :span="6"> |
|
|
|
<el-form-item label="办理状态"> |
|
|
|
<el-form-item label="信件状态"> |
|
|
|
<el-select |
|
|
|
|
|
|
|
v-model="query.status" |
|
|
|
|
|
|
|
clearable |
|
|
|
|
|
|
|
placeholder="办理状态" |
|
|
|
|
|
|
|
> |
|
|
|
|
|
|
|
<el-option value="0" label="未办理"/> |
|
|
|
|
|
|
|
<el-option value="1" label="已办理"/> |
|
|
|
|
|
|
|
</el-select> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
|
|
|
|
<el-form-item label="标签"> |
|
|
|
|
|
|
|
<el-select |
|
|
|
<el-select |
|
|
|
|
|
|
|
v-model="query.processingStatus" |
|
|
|
placeholder="全部" |
|
|
|
placeholder="全部" |
|
|
|
clearable |
|
|
|
clearable |
|
|
|
v-model="query.tags" |
|
|
|
style="width: 100%" |
|
|
|
multiple |
|
|
|
|
|
|
|
collapse-tags |
|
|
|
|
|
|
|
> |
|
|
|
> |
|
|
|
<el-option |
|
|
|
<el-option value="processing" label="办理中"/> |
|
|
|
v-for="item in dict.sfssTags" |
|
|
|
<el-option value="completion" label="已办结"/> |
|
|
|
:key="item.id" |
|
|
|
<el-option value="delayed" label="已延期"/> |
|
|
|
:value="item.dictValue" |
|
|
|
<el-option value="terminated" label="已终止"/> |
|
|
|
:label="item.dictLabel" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
</el-select> |
|
|
|
</el-select> |
|
|
|
</el-form-item> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
</el-col> |
|
|
|
@ -163,7 +156,6 @@ |
|
|
|
:value="item.dictValue" |
|
|
|
:value="item.dictValue" |
|
|
|
:label="item.dictLabel" |
|
|
|
:label="item.dictLabel" |
|
|
|
> |
|
|
|
> |
|
|
|
<!-- 复选框展示(和你弹窗里一致) --> |
|
|
|
|
|
|
|
<el-checkbox :model-value="(query.involveProblemIdList || []).includes(item.dictValue)"> |
|
|
|
<el-checkbox :model-value="(query.involveProblemIdList || []).includes(item.dictValue)"> |
|
|
|
{{ item.dictLabel }} |
|
|
|
{{ item.dictLabel }} |
|
|
|
</el-checkbox> |
|
|
|
</el-checkbox> |
|
|
|
@ -172,22 +164,39 @@ |
|
|
|
</el-form-item> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
</el-col> |
|
|
|
<el-col :span="6"> |
|
|
|
<el-col :span="6"> |
|
|
|
<el-form-item label="信件状态"> |
|
|
|
<el-form-item label="标签"> |
|
|
|
<el-select |
|
|
|
<el-select |
|
|
|
v-model="query.processingStatus" |
|
|
|
|
|
|
|
placeholder="全部" |
|
|
|
placeholder="全部" |
|
|
|
clearable |
|
|
|
clearable |
|
|
|
style="width: 100%" |
|
|
|
v-model="query.tags" |
|
|
|
|
|
|
|
multiple |
|
|
|
|
|
|
|
collapse-tags |
|
|
|
> |
|
|
|
> |
|
|
|
<el-option value="processing" label="办理中"/> |
|
|
|
<el-option |
|
|
|
<el-option value="completion" label="已办结"/> |
|
|
|
v-for="item in dict.sfssTags" |
|
|
|
<el-option value="delayed" label="已延期"/> |
|
|
|
:key="item.id" |
|
|
|
<el-option value="terminated" label="已终止"/> |
|
|
|
:value="item.dictValue" |
|
|
|
|
|
|
|
:label="item.dictLabel" |
|
|
|
|
|
|
|
/> |
|
|
|
</el-select> |
|
|
|
</el-select> |
|
|
|
</el-form-item> |
|
|
|
</el-form-item> |
|
|
|
</el-col> |
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
|
|
|
|
<el-form-item label="录入时间"> |
|
|
|
|
|
|
|
<date-time-range-picker-ext |
|
|
|
|
|
|
|
v-model="query.createTimeList" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
|
|
|
|
<el-col :span="6"> |
|
|
|
|
|
|
|
<el-form-item label="办理单位" prop="handleDepartId"> |
|
|
|
|
|
|
|
<depart-tree-select |
|
|
|
|
|
|
|
v-model="query.handleDepartId" |
|
|
|
|
|
|
|
placeholder="办理单位" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
</el-form-item> |
|
|
|
|
|
|
|
</el-col> |
|
|
|
</el-row> |
|
|
|
</el-row> |
|
|
|
|
|
|
|
|
|
|
|
</el-form> |
|
|
|
</el-form> |
|
|
|
<div class="mb-25 flex between"> |
|
|
|
<div class="mb-25 flex between"> |
|
|
|
<div> |
|
|
|
<div> |
|
|
|
@ -225,7 +234,17 @@ |
|
|
|
:formatter="row => row.responderIdCode ? row.responderIdCode : '无'" show-overflow-tooltip/> |
|
|
|
:formatter="row => row.responderIdCode ? row.responderIdCode : '无'" show-overflow-tooltip/> |
|
|
|
<el-table-column label="联系电话" width="100" prop="responderPhone" |
|
|
|
<el-table-column label="联系电话" width="100" prop="responderPhone" |
|
|
|
:formatter="row => row.responderPhone ? row.responderPhone : '无'" show-overflow-tooltip/> |
|
|
|
:formatter="row => row.responderPhone ? row.responderPhone : '无'" show-overflow-tooltip/> |
|
|
|
<el-table-column label="被投诉机构" width="130" prop="secondDepartName"/> |
|
|
|
<el-table-column label="被投诉机构" width="130" show-overflow-tooltip> |
|
|
|
|
|
|
|
<template #default="{ row }"> |
|
|
|
|
|
|
|
<span>{{ row.secondDepartName }}</span> |
|
|
|
|
|
|
|
<span v-if="row.thirdDepartName"> {{ row.thirdDepartName }}</span> |
|
|
|
|
|
|
|
</template> |
|
|
|
|
|
|
|
</el-table-column> |
|
|
|
|
|
|
|
<el-table-column label="办理单位" width="160" show-overflow-tooltip> |
|
|
|
|
|
|
|
<template #default="{ row }"> |
|
|
|
|
|
|
|
{{ row.handleSecondDepartName || '' }}{{ row.handleThreeDepartName ? '/' + row.handleThreeDepartName : '' }} |
|
|
|
|
|
|
|
</template> |
|
|
|
|
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="来信内容" width="100" prop="thingDesc" show-overflow-tooltip/> |
|
|
|
<el-table-column label="来信内容" width="100" prop="thingDesc" show-overflow-tooltip/> |
|
|
|
<el-table-column label="涉嫌问题" width="100" prop="involveProblemStr" show-overflow-tooltip/> |
|
|
|
<el-table-column label="涉嫌问题" width="100" prop="involveProblemStr" show-overflow-tooltip/> |
|
|
|
<el-table-column label="是否重复件" width="100"> |
|
|
|
<el-table-column label="是否重复件" width="100"> |
|
|
|
@ -236,16 +255,20 @@ |
|
|
|
|
|
|
|
|
|
|
|
<el-table-column label="初核限时" width="150" align="center"> |
|
|
|
<el-table-column label="初核限时" width="150" align="center"> |
|
|
|
<template #default="{ row }"> |
|
|
|
<template #default="{ row }"> |
|
|
|
<!-- 有状态:显示状态文案 --> |
|
|
|
|
|
|
|
<el-tag v-if="row.gwf3>=1" :type="row.gwf3 === '2' ? 'danger' : 'success'"> |
|
|
|
<el-tag v-if="row.gwf3>=1" :type="row.gwf3 === '2' ? 'danger' : 'success'"> |
|
|
|
{{ row.gwf3 === '2' ? '超时完成初核' : '按时完成初核' }} |
|
|
|
{{ row.gwf3 === '2' ? '超时完成初核' : '按时完成初核' }} |
|
|
|
</el-tag> |
|
|
|
</el-tag> |
|
|
|
|
|
|
|
|
|
|
|
<!-- 无状态:显示倒计时 --> |
|
|
|
|
|
|
|
<countdown v-else :time="Number(row.remainingDuration || 0)"/> |
|
|
|
<countdown v-else :time="Number(row.remainingDuration || 0)"/> |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table-column> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<el-table-column |
|
|
|
|
|
|
|
label="录入时间" |
|
|
|
|
|
|
|
width="170" |
|
|
|
|
|
|
|
prop="createTime" |
|
|
|
|
|
|
|
:formatter="(_, __, v) => v ? timeFormat(v, 'yyyy-mm-dd hh:MM:ss') : '/'" |
|
|
|
|
|
|
|
show-overflow-tooltip |
|
|
|
|
|
|
|
/> |
|
|
|
<el-table-column label="标签" width="100" show-overflow-tooltip> |
|
|
|
<el-table-column label="标签" width="100" show-overflow-tooltip> |
|
|
|
<template #default="{ row }"> |
|
|
|
<template #default="{ row }"> |
|
|
|
{{ getDictLabel(dict.sfssTags, row.tag) }} |
|
|
|
{{ getDictLabel(dict.sfssTags, row.tag) }} |
|
|
|
@ -278,34 +301,29 @@ |
|
|
|
<el-table-column label="业务类别" width="100" prop="businessTypeName"/> |
|
|
|
<el-table-column label="业务类别" width="100" prop="businessTypeName"/> |
|
|
|
<el-table-column label="核查结论" width="140" prop="checkStatus" show-overflow-tooltip> |
|
|
|
<el-table-column label="核查结论" width="140" prop="checkStatus" show-overflow-tooltip> |
|
|
|
<template #default="{ row }"> |
|
|
|
<template #default="{ row }"> |
|
|
|
{{ getDictLabel(dict.checkStatus, row.checkStatus) }} |
|
|
|
{{ getDictLabel(dict.checkStatus, row.checkStatusCode) }} |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="状态" prop="status" width="100"> |
|
|
|
<el-table-column label="信件状态" prop="processingStatus" width="100"> |
|
|
|
<template #default="{ row }"> |
|
|
|
|
|
|
|
<span :style="row.status === '0' ? 'color: red' : ''"> |
|
|
|
|
|
|
|
{{ |
|
|
|
|
|
|
|
row.status === '0' ? '未办理' : |
|
|
|
|
|
|
|
row.status === '1' ? '已办理' : |
|
|
|
|
|
|
|
'-' |
|
|
|
|
|
|
|
}} |
|
|
|
|
|
|
|
</span> |
|
|
|
|
|
|
|
</template> |
|
|
|
|
|
|
|
</el-table-column> |
|
|
|
|
|
|
|
<el-table-column label="信件状态(局)" width="120" prop="processingStatus"> |
|
|
|
|
|
|
|
<template #default="{ row }"> |
|
|
|
<template #default="{ row }"> |
|
|
|
|
|
|
|
<el-tag |
|
|
|
|
|
|
|
:type="row.processingStatus === 'completed' ? 'success' : 'primary'" |
|
|
|
|
|
|
|
v-if="row.processingStatus" |
|
|
|
|
|
|
|
> |
|
|
|
{{ |
|
|
|
{{ |
|
|
|
row.processingStatus === 'completion' ? '已办结' : |
|
|
|
row.processingStatus === 'completion' ? '已办结' : |
|
|
|
row.processingStatus === 'processing' ? '办理中' : |
|
|
|
row.processingStatus === 'processing' ? '办理中' : |
|
|
|
row.processingStatus === 'delayed' ? '已延期' : |
|
|
|
row.processingStatus === 'delayed' ? '已延期' : |
|
|
|
row.processingStatus === 'terminated' ? '已终止' : |
|
|
|
row.processingStatus === 'terminated' ? '已终止' : |
|
|
|
'/' |
|
|
|
getDictLabel(dict.processingStatus, row.processingStatus) |
|
|
|
}} |
|
|
|
}} |
|
|
|
|
|
|
|
</el-tag> |
|
|
|
|
|
|
|
<span v-else>-</span> |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="操作" width="100" fixed="right"> |
|
|
|
<el-table-column label="操作" width="120" fixed="right"> |
|
|
|
<template #default="{ row }"> |
|
|
|
<template #default="{ row }"> |
|
|
|
<el-button type="primary" link @click="handleWatchDetail(row)">查看详情</el-button> |
|
|
|
<el-button type="primary" link @click="handleActionDetail(row)">办理详情</el-button> |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
</el-table> |
|
|
|
@ -324,37 +342,54 @@ |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<negative-dialog |
|
|
|
|
|
|
|
v-model="show" |
|
|
|
|
|
|
|
:id="activeNegativeId" |
|
|
|
|
|
|
|
@close="show = false" |
|
|
|
|
|
|
|
ref="negativeDialogRef" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<negative-mailbox-dialog |
|
|
|
|
|
|
|
v-model="mailboxShow" |
|
|
|
|
|
|
|
:id="activeNegativeId" |
|
|
|
|
|
|
|
@close="mailboxShow = false" |
|
|
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
</template> |
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script setup> |
|
|
|
<script setup> |
|
|
|
import { ref, watch, computed, onMounted } from 'vue'; |
|
|
|
import { ref, computed, onMounted } from 'vue'; |
|
|
|
import {timeFormat} from "@/utils/util"; |
|
|
|
import {timeFormat} from "@/utils/util"; |
|
|
|
import useCatchStore from "@/stores/modules/catch"; |
|
|
|
import useCatchStore from "@/stores/modules/catch"; |
|
|
|
import { |
|
|
|
import { |
|
|
|
exportData, |
|
|
|
exportData, |
|
|
|
getComplaintCollectionPage |
|
|
|
getComplaintCollectionPage |
|
|
|
} from "@/api/data/complaintCollection.ts"; |
|
|
|
} from "@/api/data/complaintCollection.ts"; |
|
|
|
import useCatchStore = useCatchStore(); |
|
|
|
|
|
|
|
|
|
|
|
const show = ref(false); |
|
|
|
|
|
|
|
const mailboxShow = ref(false); |
|
|
|
|
|
|
|
const activeNegativeId = ref(""); |
|
|
|
|
|
|
|
|
|
|
|
const query = ref({ |
|
|
|
const query = ref({ |
|
|
|
size: 10, |
|
|
|
size: 10, |
|
|
|
current: 1, |
|
|
|
current: 1, |
|
|
|
sourceTableList: ['23'], |
|
|
|
sourceTableList: ['23'], |
|
|
|
sourceTableSubOneList: [], |
|
|
|
sourceTableSubOneList: [], |
|
|
|
|
|
|
|
secondDepartId: null, |
|
|
|
|
|
|
|
thirdDepartId: null, |
|
|
|
|
|
|
|
handleDepartId: null, |
|
|
|
initialReviewFileList: [], |
|
|
|
initialReviewFileList: [], |
|
|
|
|
|
|
|
createTimeList: [], |
|
|
|
processingStatus: '', |
|
|
|
processingStatus: '', |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const list = ref([]); |
|
|
|
const list = ref([]); |
|
|
|
const total = ref(0); |
|
|
|
const total = ref(0); |
|
|
|
const loading = ref(false) |
|
|
|
const loading = ref(false) |
|
|
|
const getList = async () => { |
|
|
|
const getList = async () => { |
|
|
|
loading.value = true; |
|
|
|
loading.value = true; |
|
|
|
|
|
|
|
|
|
|
|
// 确保始终包含默认来源 |
|
|
|
|
|
|
|
if (!query.value.sourceTableList.includes('23')) { |
|
|
|
if (!query.value.sourceTableList.includes('23')) { |
|
|
|
query.value.sourceTableList = ['23', ...query.value.sourceTableList]; |
|
|
|
query.value.sourceTableList = ['23', ...query.value.sourceTableList]; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -364,7 +399,7 @@ const getList = async () => { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let res = await getComplaintCollectionPage(params); |
|
|
|
let res = await getComplaintCollectionPage(params); |
|
|
|
list.value = res.complaintCollectionPageDTOS; |
|
|
|
list.value = res.records; |
|
|
|
total.value = res.total; |
|
|
|
total.value = res.total; |
|
|
|
loading.value = false; |
|
|
|
loading.value = false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -375,7 +410,11 @@ function reset() { |
|
|
|
current: 1, |
|
|
|
current: 1, |
|
|
|
sourceTableList: ['23'], |
|
|
|
sourceTableList: ['23'], |
|
|
|
sourceTableSubOneList: [], |
|
|
|
sourceTableSubOneList: [], |
|
|
|
|
|
|
|
secondDepartId: null, |
|
|
|
|
|
|
|
thirdDepartId: null, |
|
|
|
|
|
|
|
handleDepartId: null, |
|
|
|
initialReviewFileList: [], |
|
|
|
initialReviewFileList: [], |
|
|
|
|
|
|
|
createTimeList: [], |
|
|
|
processingStatus: '', |
|
|
|
processingStatus: '', |
|
|
|
}; |
|
|
|
}; |
|
|
|
getList(); |
|
|
|
getList(); |
|
|
|
@ -397,14 +436,15 @@ const storeDict = computed(() => |
|
|
|
"checkStatus", |
|
|
|
"checkStatus", |
|
|
|
"sfssSourceTable", |
|
|
|
"sfssSourceTable", |
|
|
|
"sfssTags", |
|
|
|
"sfssTags", |
|
|
|
"accountabilityTarget" |
|
|
|
"accountabilityTarget", |
|
|
|
|
|
|
|
"processingStatus", |
|
|
|
|
|
|
|
"handleMethodType" |
|
|
|
]) || {} |
|
|
|
]) || {} |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
const jzxxSourceTableSubOneList = computed(() => { |
|
|
|
const jzxxSourceTableSubOneList = computed(() => { |
|
|
|
const list = storeDict.value.sfssSourceTable || [] |
|
|
|
const list = storeDict.value.sfssSourceTable || [] |
|
|
|
|
|
|
|
|
|
|
|
// 二级:remark 等于局长信箱的dictValue |
|
|
|
|
|
|
|
const children = list |
|
|
|
const children = list |
|
|
|
.filter(d => d.remark === '23') |
|
|
|
.filter(d => d.remark === '23') |
|
|
|
.sort((a, b) => (a.dictSort ?? 0) - (b.dictSort ?? 0)) |
|
|
|
.sort((a, b) => (a.dictSort ?? 0) - (b.dictSort ?? 0)) |
|
|
|
@ -459,11 +499,15 @@ function getDictLabel(list, value) { |
|
|
|
return labels.length ? labels.join(',') : '/' |
|
|
|
return labels.length ? labels.join(',') : '/' |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const detailShow = ref(false) |
|
|
|
function handleActionDetail(row) { |
|
|
|
const activeId = ref("") |
|
|
|
console.log('办理详情', row) |
|
|
|
const handleWatchDetail = async (row) => { |
|
|
|
if (row.problemSources === '局长信箱') { |
|
|
|
activeId.value = row.id |
|
|
|
mailboxShow.value = true; |
|
|
|
detailShow.value = true |
|
|
|
activeNegativeId.value = row.originId; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
show.value = true; |
|
|
|
|
|
|
|
activeNegativeId.value = row.negativeId; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const handleExport = async () => { |
|
|
|
const handleExport = async () => { |
|
|
|
@ -498,5 +542,3 @@ p { |
|
|
|
padding: 0 24px 16px; |
|
|
|
padding: 0 24px 16px; |
|
|
|
} |
|
|
|
} |
|
|
|
</style> |
|
|
|
</style> |
|
|
|
|
|
|
|
|
|
|
|
// 这是ai写的页面 |
|
|
|
|