Compare commits
2 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
cb7bda5dbb | 2 months ago |
|
|
5fd691bf91 | 3 months ago |
16 changed files with 794 additions and 569 deletions
@ -1,3 +1,3 @@ |
|||||||
|
|
||||||
VITE_BASE=./ |
VITE_BASE=/admin |
||||||
VITE_API_URL=/admin-api |
VITE_API_URL=/admin-api |
||||||
Binary file not shown.
@ -1,19 +0,0 @@ |
|||||||
import { get, post, del} from "@/util/request" |
|
||||||
|
|
||||||
export function listBlackuser(query) { |
|
||||||
return get({ |
|
||||||
url: '/blackuser', query |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
export function addBlackuser(body) { |
|
||||||
return post({ |
|
||||||
url: '/blackuser', body |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
export function delBlackuser(id) { |
|
||||||
return del({ |
|
||||||
url: '/blackuser/' + id |
|
||||||
}) |
|
||||||
} |
|
||||||
@ -1,189 +0,0 @@ |
|||||||
<template> |
|
||||||
<div class="container"> |
|
||||||
<header class="mb-24"> |
|
||||||
<el-form :label-width="120"> |
|
||||||
<el-row> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="姓名"> |
|
||||||
<el-input |
|
||||||
placeholder="请输入" |
|
||||||
v-model="query.contactName" |
|
||||||
/> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="身份证"> |
|
||||||
<el-input |
|
||||||
placeholder="请输入" |
|
||||||
v-model="query.contactIdCard" |
|
||||||
/> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
</el-row> |
|
||||||
</el-form> |
|
||||||
<div class="flex between"> |
|
||||||
<el-button type="primary" @click="handleAdd">新增</el-button> |
|
||||||
<div> |
|
||||||
<el-button type="primary" @click="getList">查询</el-button> |
|
||||||
<el-button @click="reset">重置</el-button> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</header> |
|
||||||
<div> |
|
||||||
<el-table :data="list"> |
|
||||||
<el-table-column |
|
||||||
prop="name" |
|
||||||
label="姓名" |
|
||||||
width="120" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
prop="idCard" |
|
||||||
label="身份证" |
|
||||||
width="180" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
prop="cause" |
|
||||||
label="拉黑原因" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
label="操作" |
|
||||||
width="150" |
|
||||||
> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-button |
|
||||||
type="danger" |
|
||||||
link |
|
||||||
@click="handleDel(row)" |
|
||||||
size="small" |
|
||||||
>删除</el-button |
|
||||||
> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
</el-table> |
|
||||||
<div class="flex mt-4 end"> |
|
||||||
<el-pagination |
|
||||||
@size-change="getList" |
|
||||||
@current-change="getList" |
|
||||||
:current-page="query.current" |
|
||||||
:page-sizes="[10, 20, 50]" |
|
||||||
:page-size="query.size" |
|
||||||
v-model:current-page="query.current" |
|
||||||
:total="totalSize.total" |
|
||||||
layout="total, sizes, prev, pager, next" |
|
||||||
> |
|
||||||
</el-pagination> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
<el-dialog title="新增黑名单" v-model="show" width="600"> |
|
||||||
<el-form :model="form" label-width="120px"> |
|
||||||
<el-form-item label="姓名"> |
|
||||||
<el-input v-model="form.name" /> |
|
||||||
</el-form-item> |
|
||||||
<el-form-item label="身份证"> |
|
||||||
<el-input v-model="form.idCard" /> |
|
||||||
</el-form-item> |
|
||||||
<el-form-item label="拉黑原因"> |
|
||||||
<el-input v-model="form.cause" type="textarea" /> |
|
||||||
</el-form-item> |
|
||||||
</el-form> |
|
||||||
<div class="footer flex end"> |
|
||||||
<el-button type="primary" @click="submit">确定</el-button> |
|
||||||
<el-button @click="show = false">取消</el-button> |
|
||||||
</div> |
|
||||||
</el-dialog> |
|
||||||
</template> |
|
||||||
<script setup> |
|
||||||
import { |
|
||||||
ElMessage, |
|
||||||
ElMessageBox |
|
||||||
} from 'element-plus' |
|
||||||
import { listBlackuser, addBlackuser, delBlackuser } from "@/api/blackuser"; |
|
||||||
const query = ref({ |
|
||||||
current: 1, |
|
||||||
size: 10, |
|
||||||
}); |
|
||||||
const totalSize = ref({ |
|
||||||
total: 0, |
|
||||||
}); |
|
||||||
const list = ref([]); |
|
||||||
|
|
||||||
function getList() { |
|
||||||
listBlackuser(query.value).then((data) => { |
|
||||||
list.value = data.records; |
|
||||||
totalSize.value.total = data.total; |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
function reset() { |
|
||||||
query.value = { |
|
||||||
current: 1, |
|
||||||
size: 10, |
|
||||||
}; |
|
||||||
getList(); |
|
||||||
} |
|
||||||
|
|
||||||
getList(); |
|
||||||
|
|
||||||
const show = ref(false); |
|
||||||
const form = ref({ |
|
||||||
|
|
||||||
}) |
|
||||||
function handleAdd() { |
|
||||||
show.value = true; |
|
||||||
} |
|
||||||
|
|
||||||
function submit() { |
|
||||||
addBlackuser(form.value).then(() => { |
|
||||||
getList(); |
|
||||||
show.value = false; |
|
||||||
form.value = {} |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
function handleDel(row) { |
|
||||||
ElMessageBox.confirm('确定要删除吗?', '提示', { |
|
||||||
confirmButtonText: '确定', |
|
||||||
cancelButtonText: '取消', |
|
||||||
type: 'warning' |
|
||||||
}).then(() => { |
|
||||||
delBlackuser(row.idCard).then(() => { |
|
||||||
ElMessage.success('删除成功'); |
|
||||||
getList(); |
|
||||||
}) |
|
||||||
}) |
|
||||||
} |
|
||||||
</script> |
|
||||||
<style lang="scss" scoped> |
|
||||||
.row { |
|
||||||
display: flex; |
|
||||||
padding: 10px 0; |
|
||||||
.col { |
|
||||||
width: 50%; |
|
||||||
display: flex; |
|
||||||
gap: 10px; |
|
||||||
label { |
|
||||||
width: 160px; |
|
||||||
text-align: right; |
|
||||||
color: #666; |
|
||||||
+ * { |
|
||||||
width: calc(100% - 170px); |
|
||||||
} |
|
||||||
} |
|
||||||
span { |
|
||||||
color: #333; |
|
||||||
} |
|
||||||
.content { |
|
||||||
background: #EFF0F5; |
|
||||||
padding: 8px 20px; |
|
||||||
white-space: pre-wrap; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
footer { |
|
||||||
min-height: 20px; |
|
||||||
} |
|
||||||
</style> |
|
||||||
@ -0,0 +1,325 @@ |
|||||||
|
<template> |
||||||
|
<div class="container"> |
||||||
|
<header class="mb-24"> |
||||||
|
<el-form :label-width="120"> |
||||||
|
<el-row> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="编号"> |
||||||
|
<el-input placeholder="请输入" v-model="query.id" /> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="来源"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.source" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="来电时间"> |
||||||
|
<el-date-picker |
||||||
|
type="datetimerange" |
||||||
|
start-placeholder="开始时间" |
||||||
|
end-placeholder="结束时间" |
||||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||||
|
time-format="A hh:mm:ss" |
||||||
|
v-model="query.phoneTime" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="市民姓名"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.contactName" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<el-row> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="来电电话"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.contactPhone" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="证件号码"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.contactIdCard" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="话务类型"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.contactType" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="案件类型"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.caseType" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
</el-form> |
||||||
|
<div class="flex between"> |
||||||
|
<div> |
||||||
|
<el-button type="primary" @click="addMailShow = true" |
||||||
|
>新增12345投诉</el-button |
||||||
|
> |
||||||
|
<el-button type="primary" @click="importShow = true" |
||||||
|
>信件导入</el-button |
||||||
|
> |
||||||
|
</div> |
||||||
|
<div> |
||||||
|
<el-button type="primary" @click="getList">查询</el-button> |
||||||
|
<el-button @click="reset">重置</el-button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</header> |
||||||
|
<div> |
||||||
|
<el-table :data="list"> |
||||||
|
<el-table-column prop="id" label="编号" width="220" /> |
||||||
|
<el-table-column prop="contactName" label="市民姓名" width="120" /> |
||||||
|
<el-table-column prop="contactPhone" label="来电电话" width="120" /> |
||||||
|
<el-table-column prop="contactIdCard" label="证件号码" width="180" /> |
||||||
|
<el-table-column |
||||||
|
prop="content" |
||||||
|
label="来话内容" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column prop="contactType" label="话务类型" width="120" /> |
||||||
|
|
||||||
|
<el-table-column prop="source" label="来源" width="150" /> |
||||||
|
<el-table-column prop="caseType" label="案件类型" width="120" /> |
||||||
|
<el-table-column label="操作" width="120"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button |
||||||
|
type="primary" |
||||||
|
link |
||||||
|
@click="handleMail(row)" |
||||||
|
size="small" |
||||||
|
>详情</el-button |
||||||
|
> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<div class="flex mt-4 end"> |
||||||
|
<el-pagination |
||||||
|
@size-change="getList" |
||||||
|
@current-change="getList" |
||||||
|
:current-page="query.current" |
||||||
|
:page-sizes="[10, 20, 50]" |
||||||
|
:page-size="query.size" |
||||||
|
v-model:current-page="query.current" |
||||||
|
:total="totalSize.total" |
||||||
|
layout="total, sizes, prev, pager, next" |
||||||
|
> |
||||||
|
</el-pagination> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<AddMail |
||||||
|
v-model="addMailShow" |
||||||
|
@close="addMailShow = false" |
||||||
|
@success="getList" |
||||||
|
/> |
||||||
|
|
||||||
|
<el-dialog width="1000px" title="12345投诉导入" v-model="importShow"> |
||||||
|
<header class="mb-20 flex gap"> |
||||||
|
<el-upload |
||||||
|
:action="`${VITE_API_URL}/mail12345/analyzeExcel`" |
||||||
|
:headers="{ Authorization: getToken() }" |
||||||
|
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" |
||||||
|
:on-success="onAnalyzeExcelSuccess" |
||||||
|
:show-file-list="false" |
||||||
|
> |
||||||
|
<template #trigger> |
||||||
|
<el-button type="primary" plain>选择文件</el-button> |
||||||
|
</template> |
||||||
|
</el-upload> |
||||||
|
|
||||||
|
<el-button type="primary" @click="downloadTemplate" plain |
||||||
|
>下载模版</el-button |
||||||
|
> |
||||||
|
</header> |
||||||
|
<el-table :data="importList" ref="importTable"> |
||||||
|
<el-table-column type="selection" width="55" /> |
||||||
|
<el-table-column prop="contactName" label="市民姓名" width="100" /> |
||||||
|
<el-table-column prop="contactPhone" label="来电电话" width="120" /> |
||||||
|
<el-table-column |
||||||
|
prop="contactIdCard" |
||||||
|
label="证件号码" |
||||||
|
width="180" |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
prop="content" |
||||||
|
label="来话内容" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column prop="phoneTime" label="来电时间" /> |
||||||
|
<el-table-column label="数据是否正确" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<span v-if="row.flag">正确</span> |
||||||
|
|
||||||
|
<el-tooltip |
||||||
|
class="box-item" |
||||||
|
effect="dark" |
||||||
|
:content="row.errMsg" |
||||||
|
placement="top" |
||||||
|
:raw-content="true" |
||||||
|
v-else |
||||||
|
> |
||||||
|
<span class="text-danger">错误</span> |
||||||
|
</el-tooltip> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
<footer class="flex end mt-20"> |
||||||
|
<el-button |
||||||
|
type="primary" |
||||||
|
@click="handleImport" |
||||||
|
size="large" |
||||||
|
:disabled="disabled" |
||||||
|
>确认导入</el-button |
||||||
|
> |
||||||
|
</footer> |
||||||
|
</el-dialog> |
||||||
|
|
||||||
|
<el-dialog title="信件详情" v-model="showDetail"> |
||||||
|
<el-scrollbar max-height="600px" class="dialog-content"> |
||||||
|
<div class="row"> |
||||||
|
<div class="col-12 form-item"> |
||||||
|
<label>姓名</label> |
||||||
|
<div>{{ activeRow.contactName }}</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row"> |
||||||
|
<div class="col-12 form-item"> |
||||||
|
<label>手机号</label> |
||||||
|
<div>{{ activeRow.contactPhone }}</div> |
||||||
|
</div> |
||||||
|
<div class="col-12 form-item"> |
||||||
|
<label>身份证号码</label> |
||||||
|
<div>{{ activeRow.contactIdCard }}</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="form-item"> |
||||||
|
<label>内容</label> |
||||||
|
<div class="content text-wrap">{{ activeRow.content }}</div> |
||||||
|
</div> |
||||||
|
</el-scrollbar> |
||||||
|
<footer class="flex end mt-20"> |
||||||
|
<el-button @click="showDetail = false">关闭窗口</el-button> |
||||||
|
</footer> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
<script setup> |
||||||
|
import AddMail from "@/components/AddMail.vue"; |
||||||
|
import { mail12345List, mail12345Import } from "@/api/mail12345"; |
||||||
|
import { getToken } from "@/util/token"; |
||||||
|
import { ElMessage } from "element-plus"; |
||||||
|
const { VITE_API_URL } = process.env; |
||||||
|
|
||||||
|
const query = ref({ |
||||||
|
current: 1, |
||||||
|
size: 10, |
||||||
|
}); |
||||||
|
const totalSize = ref({ |
||||||
|
total: 0, |
||||||
|
}); |
||||||
|
const list = ref([]); |
||||||
|
const addMailShow = ref(false); |
||||||
|
const importShow = ref(false); |
||||||
|
|
||||||
|
function getList() { |
||||||
|
if (query.value.phoneTime && query.value.phoneTime.length === 2) { |
||||||
|
query.value.phoneTimeBegin = query.value.phoneTime[0]; |
||||||
|
query.value.phoneTimeEnd = query.value.phoneTime[1]; |
||||||
|
} else { |
||||||
|
query.value.phoneTimeBegin = ""; |
||||||
|
query.value.phoneTimeEnd = ""; |
||||||
|
} |
||||||
|
mail12345List(query.value).then((data) => { |
||||||
|
list.value = data.records; |
||||||
|
totalSize.value.total = data.total; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function reset() { |
||||||
|
query.value = { |
||||||
|
current: 1, |
||||||
|
size: 10, |
||||||
|
}; |
||||||
|
getList(); |
||||||
|
} |
||||||
|
|
||||||
|
getList(); |
||||||
|
|
||||||
|
const importList = ref([]); |
||||||
|
const importTable = ref(); |
||||||
|
function onAnalyzeExcelSuccess(response) { |
||||||
|
console.log(response); |
||||||
|
importList.value = response.data; |
||||||
|
} |
||||||
|
|
||||||
|
function downloadTemplate() { |
||||||
|
location.href = `${VITE_API_URL}/file/download/template/12345投诉模版.xlsx`; |
||||||
|
} |
||||||
|
|
||||||
|
const disabled = ref(false); |
||||||
|
function handleImport() { |
||||||
|
const rows = importTable.value.getSelectionRows(); |
||||||
|
console.log(rows); |
||||||
|
if (!rows.length) { |
||||||
|
ElMessage.warning("请选择至少一条数据"); |
||||||
|
return; |
||||||
|
} |
||||||
|
disabled.value = true; |
||||||
|
mail12345Import(rows).then(() => { |
||||||
|
disabled.value = false; |
||||||
|
ElMessage.success("导入成功"); |
||||||
|
getList(); |
||||||
|
importList.value = []; |
||||||
|
importShow.value = false; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
const showDetail = ref(false); |
||||||
|
const activeRow = ref({}) |
||||||
|
function handleMail(row) { |
||||||
|
showDetail.value = true; |
||||||
|
activeRow.value = row |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
.form-item { |
||||||
|
display: flex; |
||||||
|
line-height: 22px; |
||||||
|
margin: 10px 0; |
||||||
|
gap: 20px; |
||||||
|
label { |
||||||
|
width: 137px; |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
div { |
||||||
|
color: #333; |
||||||
|
max-width: calc(100% - 137px); |
||||||
|
} |
||||||
|
.content { |
||||||
|
background: #EFF0F5; |
||||||
|
padding: 0 20px; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,382 @@ |
|||||||
|
<template> |
||||||
|
<div class="container"> |
||||||
|
<el-form :model="form" label-width="150px"> |
||||||
|
<el-row> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="数据库名"> |
||||||
|
<el-select |
||||||
|
v-model="MailTab" |
||||||
|
placeholder="Select" |
||||||
|
size="small" |
||||||
|
style="width: 240px" |
||||||
|
> |
||||||
|
<el-option |
||||||
|
v-for="item in options" |
||||||
|
:key="item.value" |
||||||
|
:label="item.label" |
||||||
|
:value="item.value" |
||||||
|
/> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="编号"> |
||||||
|
<el-input |
||||||
|
v-model="form.id" |
||||||
|
placeholder="请输入编号" |
||||||
|
max-length="200px" |
||||||
|
></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="信件编号"> |
||||||
|
<el-input |
||||||
|
v-model="form.mailId" |
||||||
|
placeholder="请输入信件编号" |
||||||
|
></el-input> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="是否成功"> |
||||||
|
<el-select v-model="form.success" clearable> |
||||||
|
<el-option label="成功" :value="true"></el-option> |
||||||
|
<el-option label="失败" :value="false"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
<div class="flex end mb-24"> |
||||||
|
<el-button type="primary" @click="search" class="under-btn" |
||||||
|
>搜索</el-button |
||||||
|
> |
||||||
|
<el-button type="default" @click="reset" class="under-btn" |
||||||
|
>重置</el-button |
||||||
|
> |
||||||
|
</div> |
||||||
|
</el-form> |
||||||
|
|
||||||
|
<div class="table-box" ref="tableBoxHeight" v-loading="loading"> |
||||||
|
<el-table |
||||||
|
:data="tableData" |
||||||
|
border |
||||||
|
:height="tableHeight" |
||||||
|
table-layout="fixed" |
||||||
|
:header-cell-style="{ |
||||||
|
'background-color': '#EBEEFC', |
||||||
|
color: '#1D2C86', |
||||||
|
}" |
||||||
|
> |
||||||
|
<el-table-column |
||||||
|
prop="id" |
||||||
|
label="编号" |
||||||
|
width="80" |
||||||
|
align="center" |
||||||
|
> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column |
||||||
|
prop="mailId" |
||||||
|
label="信件编号" |
||||||
|
width="230" |
||||||
|
show-overflow-tooltip |
||||||
|
> |
||||||
|
</el-table-column> |
||||||
|
|
||||||
|
<el-table-column |
||||||
|
prop="createTime" |
||||||
|
label="创建日期" |
||||||
|
width="120px" |
||||||
|
/> |
||||||
|
<el-table-column label="是否成功" width="120px" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-tag type="success" v-if="row.success">成功</el-tag> |
||||||
|
<el-tag type="danger" v-else>失败</el-tag> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column |
||||||
|
prop="errMsg" |
||||||
|
label="错误信息" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column width="160" label="操作"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button |
||||||
|
type="primary" |
||||||
|
link |
||||||
|
size="small" |
||||||
|
@click="handleShowDetail(row.mailId)" |
||||||
|
>详情</el-button |
||||||
|
> |
||||||
|
<el-popconfirm |
||||||
|
title="确认删除?" |
||||||
|
@confirm="handleDel(row.id)" |
||||||
|
v-if="!row.success" |
||||||
|
> |
||||||
|
<template #reference> |
||||||
|
<el-button |
||||||
|
type="danger" |
||||||
|
link |
||||||
|
size="small" |
||||||
|
|
||||||
|
>删除</el-button |
||||||
|
> |
||||||
|
</template> |
||||||
|
</el-popconfirm> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
</el-table> |
||||||
|
</div> |
||||||
|
<div class="flex end mt-10"> |
||||||
|
<el-pagination |
||||||
|
background |
||||||
|
@size-change="handleSizeChange" |
||||||
|
@current-change="handlePageChange" |
||||||
|
:current-page="pageData.currentPage" |
||||||
|
:page-sizes="[10, 20, 40, 50]" |
||||||
|
:page-size="pageData.pageSize" |
||||||
|
layout="total,sizes, prev, pager, next, jumper" |
||||||
|
:total="pageData.totalSize" |
||||||
|
> |
||||||
|
</el-pagination> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<el-dialog title="信件详情" v-model="show"> |
||||||
|
<div class="row"> |
||||||
|
<div class="col"> |
||||||
|
<label>信件编号</label> |
||||||
|
<span>{{ activeRow.id }}</span> |
||||||
|
</div> |
||||||
|
<div class="col"> |
||||||
|
<label>来信时间</label> |
||||||
|
<span>{{ activeRow.createTime }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row"> |
||||||
|
<div class="col"> |
||||||
|
<label>来信人姓名</label> |
||||||
|
<span>{{ activeRow.contactName }}</span> |
||||||
|
</div> |
||||||
|
<div class="col"> |
||||||
|
<label>来信人电话</label> |
||||||
|
<span>{{ activeRow.contactPhone }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row"> |
||||||
|
<div class="col"> |
||||||
|
<label>证件号码</label> |
||||||
|
<span>{{ activeRow.contactIdCard }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row"> |
||||||
|
<div class="col" style="width: 100%"> |
||||||
|
<label>信件内容</label> |
||||||
|
<div class="content">{{ activeRow.content }}</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row"> |
||||||
|
<div class="col"> |
||||||
|
<label>案件编号</label> |
||||||
|
<span>{{ activeRow.caseNumber }}</span> |
||||||
|
</div> |
||||||
|
<div class="col"> |
||||||
|
<label>被投诉/举报单位</label> |
||||||
|
<span>{{ activeRow.involvedDeptName }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="row" v-if="activeRow.attachments"> |
||||||
|
<div class="col" style="width: 100%"> |
||||||
|
<label>附件</label> |
||||||
|
<div class="flex gap wrap attachments" v-if="JSON.parse(activeRow.attachments).length"> |
||||||
|
<img v-for="(item, index) in JSON.parse(activeRow.attachments)" :key="index" :src="`https://jzxx.hncsga.cn/api/file/stream/${item.filepath}`" alt="" @click="open(`https://jzxx.hncsga.cn/api/file/stream/${item.filepath}`)"> |
||||||
|
</div> |
||||||
|
<el-empty description="无附件" v-else /> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<footer></footer> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup> |
||||||
|
import { request } from "@/util/axios_config"; |
||||||
|
import { mailDetail } from "@/api/mail"; |
||||||
|
import { getToken } from "@/util/token"; |
||||||
|
import { delMailEtl } from "@/api/mailEtl"; |
||||||
|
|
||||||
|
const MailTab = ref("mail_etl"); |
||||||
|
const { VITE_API_URL } = process.env; |
||||||
|
const options = [ |
||||||
|
{ |
||||||
|
value: "mail_etl", |
||||||
|
label: "mail_etl", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "mail_evaluate_etl", |
||||||
|
label: "mail_evaluate_etl", |
||||||
|
}, |
||||||
|
]; |
||||||
|
const loading = ref(true); |
||||||
|
|
||||||
|
const form = ref({ |
||||||
|
id: "", |
||||||
|
mailId: "", |
||||||
|
success: "", |
||||||
|
}); |
||||||
|
|
||||||
|
// 定义可变的tableData变量,并用axios请求数据 |
||||||
|
const tableData = ref([]); |
||||||
|
|
||||||
|
const pageData = ref({ |
||||||
|
currentPage: 1, |
||||||
|
pageSize: 12, |
||||||
|
totalSize: 0, |
||||||
|
}); |
||||||
|
|
||||||
|
const tableBoxHeight = ref(null); |
||||||
|
const tableHeight = ref("100%"); |
||||||
|
const flexColumnWidth = (label, prop) => { |
||||||
|
const width = Math.max(label.length * 12, 120); |
||||||
|
return `${width}px`; |
||||||
|
}; |
||||||
|
|
||||||
|
const handleResponse = (response) => { |
||||||
|
tableData.value = []; |
||||||
|
if (MailTab.value == "mail_etl") { |
||||||
|
tableData.value = response.data.mails; |
||||||
|
} else { |
||||||
|
tableData.value = response.data.evaMails; |
||||||
|
} |
||||||
|
tableData.value.forEach((item) => { |
||||||
|
item.createTime = item.createTime.split("T")[0]; |
||||||
|
}); |
||||||
|
pageData.value.totalSize = response.data.pageSet.totalSize; |
||||||
|
loading.value = false; |
||||||
|
}; |
||||||
|
|
||||||
|
const makeRequest = (requestData, callback) => { |
||||||
|
const data = JSON.stringify(requestData); |
||||||
|
const url = VITE_API_URL + "/mailetl/list-submit"; |
||||||
|
request({ |
||||||
|
url: url, |
||||||
|
method: "POST", |
||||||
|
data: data, |
||||||
|
headers: { |
||||||
|
"Content-Type": "application/json", |
||||||
|
authorization: getToken(), |
||||||
|
}, |
||||||
|
}) |
||||||
|
.then(callback) |
||||||
|
.catch(function (error) { |
||||||
|
console.log(error); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
const updateData = (requestData) => { |
||||||
|
makeRequest(requestData, function (response) { |
||||||
|
handleResponse(response); |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
onMounted(() => { |
||||||
|
const requestData = { |
||||||
|
formData: form.value, |
||||||
|
selectData: MailTab.value, |
||||||
|
pageData: pageData.value, |
||||||
|
}; |
||||||
|
updateData(requestData); |
||||||
|
}); |
||||||
|
|
||||||
|
const handleSizeChange = (size) => { |
||||||
|
const requestData = { |
||||||
|
formData: form.value, |
||||||
|
selectData: MailTab.value, |
||||||
|
pageData: pageData.value, |
||||||
|
}; |
||||||
|
pageData.value.pageSize = size; |
||||||
|
updateData(requestData); |
||||||
|
}; |
||||||
|
|
||||||
|
const handlePageChange = (currentPage) => { |
||||||
|
const requestData = { |
||||||
|
formData: form.value, |
||||||
|
selectData: MailTab.value, |
||||||
|
pageData: pageData.value, |
||||||
|
}; |
||||||
|
pageData.value.currentPage = currentPage; |
||||||
|
updateData(requestData); |
||||||
|
}; |
||||||
|
|
||||||
|
const search = () => { |
||||||
|
const requestData = { |
||||||
|
formData: form.value, |
||||||
|
selectData: MailTab.value, |
||||||
|
pageData: pageData.value, |
||||||
|
}; |
||||||
|
updateData(requestData); |
||||||
|
}; |
||||||
|
|
||||||
|
const reset = () => { |
||||||
|
form.value = { |
||||||
|
id: "", |
||||||
|
mailId: "", |
||||||
|
success: "", |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
async function handleDel(id) { |
||||||
|
await delMailEtl(id) |
||||||
|
search() |
||||||
|
} |
||||||
|
|
||||||
|
const show = ref(false) |
||||||
|
const activeRow = ref({}) |
||||||
|
|
||||||
|
function handleShowDetail(id) { |
||||||
|
mailDetail(id).then(data => { |
||||||
|
activeRow.value = data; |
||||||
|
show.value = true |
||||||
|
}) |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
.row { |
||||||
|
display: flex; |
||||||
|
padding: 10px 0; |
||||||
|
.col { |
||||||
|
width: 50%; |
||||||
|
display: flex; |
||||||
|
gap: 10px; |
||||||
|
label { |
||||||
|
width: 160px; |
||||||
|
text-align: right; |
||||||
|
color: #666; |
||||||
|
+ * { |
||||||
|
width: calc(100% - 170px); |
||||||
|
} |
||||||
|
} |
||||||
|
span { |
||||||
|
color: #333; |
||||||
|
} |
||||||
|
.content { |
||||||
|
background: #EFF0F5; |
||||||
|
padding: 8px 20px; |
||||||
|
white-space: pre-wrap; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
.attachments { |
||||||
|
img { |
||||||
|
max-width: 160px; |
||||||
|
max-height: 300px; |
||||||
|
border: 1px solid transparent; |
||||||
|
|
||||||
|
&:hover { |
||||||
|
cursor: pointer; |
||||||
|
border-color: red; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
footer { |
||||||
|
min-height: 20px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -1,323 +0,0 @@ |
|||||||
<template> |
|
||||||
<div class="container"> |
|
||||||
<header class="mb-24"> |
|
||||||
<el-form :label-width="120"> |
|
||||||
<el-row> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="来信时间"> |
|
||||||
<el-date-picker |
|
||||||
type="datetimerange" |
|
||||||
start-placeholder="开始时间" |
|
||||||
end-placeholder="结束时间" |
|
||||||
value-format="YYYY-MM-DD HH:mm:ss" |
|
||||||
time-format="A hh:mm:ss" |
|
||||||
v-model="query.createTime" |
|
||||||
/> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="来信人姓名"> |
|
||||||
<el-input |
|
||||||
placeholder="请输入" |
|
||||||
v-model="query.contactName" |
|
||||||
/> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="来信人电话"> |
|
||||||
<el-input |
|
||||||
placeholder="请输入" |
|
||||||
v-model="query.contactPhone" |
|
||||||
/> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="来信人证件号码"> |
|
||||||
<el-input |
|
||||||
placeholder="请输入" |
|
||||||
v-model="query.contactIdCard" |
|
||||||
/> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
</el-row> |
|
||||||
<el-row> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="信件内容"> |
|
||||||
<el-input |
|
||||||
placeholder="请输入" |
|
||||||
v-model="query.content" |
|
||||||
/> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
<el-col :span="6"> |
|
||||||
<el-form-item label="评价结果"> |
|
||||||
<el-select v-model="query.satisfactionSms"> |
|
||||||
<el-option value="satisfied" label="非常满意" /> |
|
||||||
<el-option |
|
||||||
value="basically_satisfied" |
|
||||||
label="基本满意" |
|
||||||
/> |
|
||||||
<el-option |
|
||||||
value="not_satisfied" |
|
||||||
label="不满意" |
|
||||||
/> |
|
||||||
</el-select> |
|
||||||
</el-form-item> |
|
||||||
</el-col> |
|
||||||
</el-row> |
|
||||||
</el-form> |
|
||||||
<div class="flex end"> |
|
||||||
<div> |
|
||||||
<el-button type="primary" @click="getList">查询</el-button> |
|
||||||
<el-button @click="reset">重置</el-button> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</header> |
|
||||||
<div> |
|
||||||
<el-table :data="list"> |
|
||||||
<el-table-column prop="id" label="编号" width="220" /> |
|
||||||
<el-table-column |
|
||||||
prop="createTime" |
|
||||||
label="来信时间" |
|
||||||
width="180" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
prop="contactName" |
|
||||||
label="来信人姓名" |
|
||||||
width="120" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
prop="contactPhone" |
|
||||||
label="来信人电话" |
|
||||||
width="120" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
prop="contactIdCard" |
|
||||||
label="来信人证件号码" |
|
||||||
width="180" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
prop="content" |
|
||||||
label="信件内容" |
|
||||||
show-overflow-tooltip |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
prop="caseNumber" |
|
||||||
label="案件编号" |
|
||||||
width="120" |
|
||||||
/> |
|
||||||
|
|
||||||
<el-table-column |
|
||||||
prop="involvedDeptName" |
|
||||||
label="被投诉/涉及单位" |
|
||||||
width="150" |
|
||||||
/> |
|
||||||
<el-table-column |
|
||||||
label="评价结果" |
|
||||||
width="150" |
|
||||||
> |
|
||||||
<template #default="{ row }"> |
|
||||||
<span>{{ getSatisfactionLabel(row.satisfactionSms) }}</span> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
<el-table-column |
|
||||||
label="操作" |
|
||||||
width="150" |
|
||||||
> |
|
||||||
<template #default="{ row }"> |
|
||||||
<el-button |
|
||||||
type="primary" |
|
||||||
link |
|
||||||
@click="handleMail(row)" |
|
||||||
size="small" |
|
||||||
>详情</el-button |
|
||||||
> |
|
||||||
<el-button |
|
||||||
type="primary" |
|
||||||
link |
|
||||||
@click="handlePushMail(row)" |
|
||||||
size="small" |
|
||||||
>推送信件</el-button |
|
||||||
> |
|
||||||
</template> |
|
||||||
</el-table-column> |
|
||||||
</el-table> |
|
||||||
<div class="flex mt-4 end"> |
|
||||||
<el-pagination |
|
||||||
@size-change="getList" |
|
||||||
@current-change="getList" |
|
||||||
:current-page="query.current" |
|
||||||
:page-sizes="[10, 20, 50]" |
|
||||||
:page-size="query.size" |
|
||||||
v-model:current-page="query.current" |
|
||||||
:total="totalSize.total" |
|
||||||
layout="total, sizes, prev, pager, next" |
|
||||||
> |
|
||||||
</el-pagination> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
<el-dialog title="信件详情" v-model="show"> |
|
||||||
<div class="row"> |
|
||||||
<div class="col"> |
|
||||||
<label>信件编号</label> |
|
||||||
<span>{{ activeRow.id }}</span> |
|
||||||
</div> |
|
||||||
<div class="col"> |
|
||||||
<label>来信时间</label> |
|
||||||
<span>{{ activeRow.createTime }}</span> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<div class="row"> |
|
||||||
<div class="col"> |
|
||||||
<label>来信人姓名</label> |
|
||||||
<span>{{ activeRow.contactName }}</span> |
|
||||||
</div> |
|
||||||
<div class="col"> |
|
||||||
<label>来信人电话</label> |
|
||||||
<span>{{ activeRow.contactPhone }}</span> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<div class="row"> |
|
||||||
<div class="col"> |
|
||||||
<label>证件号码</label> |
|
||||||
<span>{{ activeRow.contactIdCard }}</span> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<div class="row"> |
|
||||||
<div class="col" style="width: 100%"> |
|
||||||
<label>信件内容</label> |
|
||||||
<div class="content">{{ activeRow.content }}</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<div class="row"> |
|
||||||
<div class="col"> |
|
||||||
<label>案件编号</label> |
|
||||||
<span>{{ activeRow.caseNumber }}</span> |
|
||||||
</div> |
|
||||||
<div class="col"> |
|
||||||
<label>被投诉/举报单位</label> |
|
||||||
<span>{{ activeRow.involvedDeptName }}</span> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<div class="row" v-if="activeRow.attachments"> |
|
||||||
<div class="col" style="width: 100%"> |
|
||||||
<label>附件</label> |
|
||||||
<div class="flex gap wrap attachments" v-if="JSON.parse(activeRow.attachments).length"> |
|
||||||
<img v-for="(item, index) in JSON.parse(activeRow.attachments)" :key="index" :src="`./admin-api/file/stream/${item.filepath}`" alt="" @click="open(`./admin-api/file/stream/${item.filepath}`)"> |
|
||||||
</div> |
|
||||||
<el-empty description="无附件" v-else /> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<footer></footer> |
|
||||||
</el-dialog> |
|
||||||
</template> |
|
||||||
<script setup> |
|
||||||
import { |
|
||||||
ElMessage, |
|
||||||
ElMessageBox |
|
||||||
} from 'element-plus' |
|
||||||
import { listMailPush, pushMail } from "@/api/mail"; |
|
||||||
const query = ref({ |
|
||||||
current: 1, |
|
||||||
size: 10, |
|
||||||
}); |
|
||||||
const totalSize = ref({ |
|
||||||
total: 0, |
|
||||||
}); |
|
||||||
const list = ref([]); |
|
||||||
|
|
||||||
function getList() { |
|
||||||
listMailPush(query.value).then((data) => { |
|
||||||
list.value = data.records; |
|
||||||
totalSize.value.total = data.total; |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
function reset() { |
|
||||||
query.value = { |
|
||||||
current: 1, |
|
||||||
size: 10, |
|
||||||
}; |
|
||||||
getList(); |
|
||||||
} |
|
||||||
|
|
||||||
getList(); |
|
||||||
|
|
||||||
function getSatisfactionLabel(satisfaction) { |
|
||||||
if (satisfaction === "satisfied") { |
|
||||||
return "非常满意"; |
|
||||||
} else if (satisfaction === "not_satisfied") { |
|
||||||
return "不满意"; |
|
||||||
} else if (satisfaction === "basically_satisfied") { |
|
||||||
return "基本满意"; |
|
||||||
} else { |
|
||||||
return "暂无评价"; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
const show = ref(false) |
|
||||||
const activeRow = ref({}) |
|
||||||
function handleMail(row) { |
|
||||||
activeRow.value = row |
|
||||||
show.value = true |
|
||||||
} |
|
||||||
|
|
||||||
function open(url) { |
|
||||||
window.open(url) |
|
||||||
} |
|
||||||
|
|
||||||
function handlePushMail(row) { |
|
||||||
ElMessageBox.confirm('确定要推送信件?', '温馨提示').then(() => { |
|
||||||
pushMail(row.id).then(() => { |
|
||||||
getList() |
|
||||||
}); |
|
||||||
}).catch(() => { |
|
||||||
|
|
||||||
}); |
|
||||||
} |
|
||||||
</script> |
|
||||||
<style lang="scss" scoped> |
|
||||||
.row { |
|
||||||
display: flex; |
|
||||||
padding: 10px 0; |
|
||||||
.col { |
|
||||||
width: 50%; |
|
||||||
display: flex; |
|
||||||
gap: 10px; |
|
||||||
label { |
|
||||||
width: 160px; |
|
||||||
text-align: right; |
|
||||||
color: #666; |
|
||||||
+ * { |
|
||||||
width: calc(100% - 170px); |
|
||||||
} |
|
||||||
} |
|
||||||
span { |
|
||||||
color: #333; |
|
||||||
} |
|
||||||
.content { |
|
||||||
background: #EFF0F5; |
|
||||||
padding: 8px 20px; |
|
||||||
white-space: pre-wrap; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
} |
|
||||||
.attachments { |
|
||||||
img { |
|
||||||
max-width: 160px; |
|
||||||
max-height: 300px; |
|
||||||
border: 1px solid transparent; |
|
||||||
|
|
||||||
&:hover { |
|
||||||
cursor: pointer; |
|
||||||
border-color: red; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
footer { |
|
||||||
min-height: 20px; |
|
||||||
} |
|
||||||
</style> |
|
||||||
Loading…
Reference in new issue