44 changed files with 3202 additions and 1004 deletions
@ -0,0 +1,8 @@
|
||||
import request from "@/api/request"; |
||||
|
||||
export function listModelClueTask(query) { |
||||
return request.get({ |
||||
url: `/model/clue/tasks`, |
||||
query |
||||
}); |
||||
} |
||||
@ -0,0 +1,441 @@
|
||||
<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="discoveryTime" |
||||
|
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="问题发生时间" |
||||
prop="happenTime" |
||||
width="160" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="问题来源" |
||||
prop="problemSources" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="投诉人" |
||||
prop="responderName" |
||||
width="90" |
||||
/> |
||||
<el-table-column |
||||
label="投诉人电话" |
||||
prop="contactPhone" |
||||
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" |
||||
> |
||||
<template #default="{ row }"> |
||||
<span>{{ involveSecondDepartName }}</span> |
||||
<span>{{ involveThirdDepartName }}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="具体内容" |
||||
prop="thingDesc" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="数据校验" |
||||
width="120" |
||||
> |
||||
<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="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-tab-pane name="fail"> |
||||
<template #label> |
||||
<el-badge |
||||
:value="importTableFailData.length" |
||||
> |
||||
<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="discoveryTime" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="问题发生时间" |
||||
prop="happenTime" |
||||
/> |
||||
<el-table-column |
||||
label="问题来源" |
||||
prop="problemSources" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="投诉人" |
||||
prop="responderName" |
||||
width="90" |
||||
/> |
||||
<el-table-column |
||||
label="投诉人电话" |
||||
prop="contactPhone" |
||||
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="complainedDepartName" |
||||
/> |
||||
<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-date-picker type="datetime" v-model="form.discoveryTime" /> |
||||
</el-form-item> |
||||
<el-form-item label="问题发生时间"> |
||||
<el-date-picker type="datetime" v-model="form.happenTime" /> |
||||
</el-form-item> |
||||
<el-form-item label="问题来源"> |
||||
<el-input placeholder="请输入" v-model="form.problemSources" /> |
||||
</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="业务类别"> |
||||
<el-input placeholder="请输入" v-model="form.businessTypeName" /> |
||||
</el-form-item> |
||||
<el-form-item label="涉嫌问题"> |
||||
<el-input placeholder="请输入" v-model="form.involveProblem" /> |
||||
</el-form-item> |
||||
<el-form-item label="涉及警种"> |
||||
<el-input placeholder="请输入" v-model="form.policeTypeName" /> |
||||
</el-form-item> |
||||
<el-form-item |
||||
label="涉及单位" |
||||
prop="involveThirdDepartId" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请选择', |
||||
trigger: ['blur'], |
||||
}" |
||||
> |
||||
<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 { importCaseVerif, addCaseVerif } from "@/api/data/caseVerif"; |
||||
import feedback from "@/utils/feedback"; |
||||
|
||||
const props = defineProps({ |
||||
modelValue: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
title: { |
||||
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; |
||||
try { |
||||
importTableData.value = await importCaseVerif(formData); |
||||
} catch(e) { |
||||
loading.value = false; |
||||
return |
||||
} |
||||
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 addCaseVerif(dataUpdateMethod.value, [...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> |
||||
@ -0,0 +1,585 @@
|
||||
<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" |
||||
/> |
||||
<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="被投诉机构" show-overflow-tooltip> |
||||
<template #default="{ row }"> |
||||
<span>{{ |
||||
row.involveSecondDepartName |
||||
}}</span> |
||||
<span>{{ |
||||
row.involveThirdDepartName |
||||
}}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
label="具体内容" |
||||
prop="thingDesc" |
||||
show-overflow-tooltip |
||||
/> |
||||
<el-table-column |
||||
label="数据校验" |
||||
width="120" |
||||
> |
||||
<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="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-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="被投诉机构" show-overflow-tooltip> |
||||
<template #default="{ row }"> |
||||
<span>{{ |
||||
row.involveSecondDepartName |
||||
}}</span> |
||||
<span>{{ |
||||
row.involveThirdDepartName |
||||
}}</span> |
||||
</template> |
||||
</el-table-column> |
||||
<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" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请选择', |
||||
trigger: ['blur'], |
||||
}" |
||||
> |
||||
<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> |
||||
@ -0,0 +1,27 @@
|
||||
<template> |
||||
<div class="datav-col"> |
||||
<label for="">统计周期:</label> |
||||
<el-date-picker |
||||
v-model="value" |
||||
type="daterange" |
||||
range-separator="-" |
||||
start-placeholder="开始日期" |
||||
end-placeholder="结束日期" |
||||
format="YYYY年MM月DD日" |
||||
style="--el-input-bg-color: transparent; box-shadow: none; --el-text-color-regular: #fff; --el-text-color-primary: #fff" |
||||
/> |
||||
</div> |
||||
</template> |
||||
<script setup> |
||||
const value = ref([]) |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.datav-col { |
||||
font-size: 14px; |
||||
text-align: center; |
||||
margin-bottom: 16px; |
||||
label { |
||||
color: #859DEC; |
||||
} |
||||
} |
||||
</style> |
||||
@ -0,0 +1,19 @@
|
||||
<template> |
||||
<div v-if="name === activeTab"> |
||||
<slot /> |
||||
</div> |
||||
</template> |
||||
<script setup> |
||||
defineProps({ |
||||
label: { |
||||
type: String, |
||||
}, |
||||
name: { |
||||
type: String, |
||||
}, |
||||
}); |
||||
const activeTab = inject("activeTab"); |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
||||
@ -0,0 +1,91 @@
|
||||
<template> |
||||
<div class="tabs"> |
||||
<div class="tab-header flex gap-20 mb-40" v-if="type === ''"> |
||||
<div |
||||
class="tab-title-item" |
||||
v-for="item in slots" |
||||
:key="item.props.name" |
||||
:active="item.props.name === activeTab" |
||||
@click="handleChangeActiveTab(item.props.name)" |
||||
> |
||||
{{ item.props.label }} |
||||
</div> |
||||
</div> |
||||
<div class="tabs-content"> |
||||
<slot></slot> |
||||
</div> |
||||
<div |
||||
class="flex tab-title flex center mt-20 mb-20" |
||||
v-if="type === 'bottom-button'" |
||||
> |
||||
<div |
||||
class="tab-title-item" |
||||
v-for="item in slots" |
||||
:key="item.props.name" |
||||
:active="item.props.name === activeTab" |
||||
@click="handleChangeActiveTab(item.props.name)" |
||||
> |
||||
{{ item.props.label }} |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script setup> |
||||
const props = defineProps({ |
||||
modelValue: { |
||||
type: String, |
||||
}, |
||||
// bottom-button |
||||
type: { |
||||
type: String, |
||||
default: "", |
||||
}, |
||||
}); |
||||
const emit = defineEmits(["update:modelValue"]); |
||||
const activeTab = ref(props.modelValue); |
||||
provide("activeTab", activeTab); |
||||
|
||||
const slots = useSlots().default(); |
||||
|
||||
function handleChangeActiveTab(name) { |
||||
activeTab.value = name; |
||||
emit("update:modelValue", name); |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.tab-header { |
||||
.tab-title-item { |
||||
font-size: 22px; |
||||
line-height: 34px; |
||||
color: #597ae9; |
||||
border-bottom: 5px solid transparent; |
||||
cursor: pointer; |
||||
&[active="true"] { |
||||
color: #fff; |
||||
border-color: #28E6FF; |
||||
} |
||||
} |
||||
} |
||||
.tab-title { |
||||
margin-bottom: 4px; |
||||
cursor: pointer; |
||||
.tab-title-item { |
||||
width: 119px; |
||||
height: 32px; |
||||
line-height: 32px; |
||||
border: 1px solid #24d2ee; |
||||
text-align: center; |
||||
|
||||
&[active="true"] { |
||||
background: #24d2ee; |
||||
color: #0724b2; |
||||
} |
||||
&:first-child { |
||||
border-radius: 103px 0px 0px 103px; |
||||
} |
||||
&:last-child { |
||||
border-radius: 0 103px 103px 0; |
||||
} |
||||
} |
||||
} |
||||
</style> |
||||
@ -0,0 +1,125 @@
|
||||
<template> |
||||
<el-radio-group v-model="value" class="block"> |
||||
<el-radio |
||||
v-for="item in dict.timeLimit" |
||||
:key="item.dictCode" |
||||
:value="item.dictValue" |
||||
>{{ item.dictLabel |
||||
}}{{ item.remark ? `(${item.remark})` : "" }}</el-radio |
||||
> |
||||
</el-radio-group> |
||||
<template v-if="value === TimeLimit.OTHER"> |
||||
<el-row> |
||||
<el-col :span="8"> |
||||
<el-form-item |
||||
label="签收" |
||||
prop="maxSignDuration" |
||||
label-width="80" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请输入最大签收时长' |
||||
}" |
||||
> |
||||
<div class="flex gap"> |
||||
<el-input |
||||
v-model="maxSignDurationValue" |
||||
type="number" |
||||
style="width: 70px" |
||||
:min="1" |
||||
:max="99" |
||||
/> |
||||
<span style="width: 60px">工作日</span> |
||||
</div> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="8"> |
||||
<el-form-item |
||||
label="办理" |
||||
prop="maxHandleDuration" |
||||
label-width="80" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请输入最大办理时长' |
||||
}" |
||||
> |
||||
<div class="flex gap"> |
||||
<el-input |
||||
v-model="maxHandleDurationValue" |
||||
type="number" |
||||
style="width: 70px" |
||||
:min="1" |
||||
:max="99" |
||||
/> |
||||
<span style="width: 60px">工作日</span> |
||||
</div> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="8"> |
||||
<el-form-item |
||||
label="延期" |
||||
prop="maxExtensionDuration" |
||||
:rules="{ |
||||
required: true, |
||||
message: '请输入最大延期天数' |
||||
}" |
||||
> |
||||
<div class="flex gap"> |
||||
<el-input |
||||
v-model="maxExtensionDurationValue" |
||||
type="number" |
||||
style="width: 70px" |
||||
:min="1" |
||||
:max="99" |
||||
/> |
||||
<span>天</span> |
||||
</div> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
</template> |
||||
</template> |
||||
<script setup> |
||||
import { |
||||
TimeLimit |
||||
} from "@/enums/dictEnums"; |
||||
import useCatchStore from "@/stores/modules/catch"; |
||||
import { watch } from "vue"; |
||||
|
||||
const catchStore = useCatchStore(); |
||||
const dict = catchStore.getDicts([ |
||||
"timeLimit" |
||||
]); |
||||
const props = defineProps({ |
||||
modelValue: { |
||||
type: String |
||||
}, |
||||
maxSignDuration: { |
||||
type: String |
||||
}, |
||||
maxHandleDuration: { |
||||
type: String |
||||
}, |
||||
maxExtensionDuration: { |
||||
type: String |
||||
}, |
||||
}) |
||||
const emit = defineEmits(['update:modelValue', 'update:maxSignDuration', 'update:maxHandleDuration', 'update:maxExtensionDuration']) |
||||
const value = ref(props.modelValue) |
||||
const maxSignDurationValue = ref(props.maxSignDuration) |
||||
const maxHandleDurationValue = ref(props.maxHandleDuration) |
||||
const maxExtensionDurationValue = ref(props.maxExtensionDuration) |
||||
watch(value, () => { |
||||
emit('update:modelValue', value.value) |
||||
}) |
||||
watch(maxSignDurationValue, () => { |
||||
emit('update:maxSignDuration', maxSignDurationValue.value) |
||||
}) |
||||
watch(maxHandleDurationValue, () => { |
||||
emit('update:maxHandleDuration', maxHandleDurationValue.value) |
||||
}) |
||||
watch(maxExtensionDurationValue, () => { |
||||
emit('update:maxExtensionDuration', maxExtensionDurationValue.value) |
||||
}) |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
</style> |
||||
@ -1,9 +0,0 @@
|
||||
<template> |
||||
<img src="/imgs/lmgz/3.png" alt=""> |
||||
</template> |
||||
<script setup> |
||||
|
||||
</script> |
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
||||
@ -1,9 +0,0 @@
|
||||
<template> |
||||
<img src="/imgs/lmgz/2.png" alt=""> |
||||
</template> |
||||
<script setup> |
||||
|
||||
</script> |
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
||||
@ -1,9 +0,0 @@
|
||||
<template> |
||||
<img src="/imgs/lmgz/4.png" alt=""> |
||||
</template> |
||||
<script setup> |
||||
|
||||
</script> |
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
||||
Loading…
Reference in new issue