Compare commits
1 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
1ef3b6b2cf | 2 months ago |
15 changed files with 569 additions and 658 deletions
@ -1,3 +1,3 @@ |
|||||||
|
|
||||||
VITE_BASE=/admin |
VITE_BASE=./ |
||||||
VITE_API_URL=/admin-api |
VITE_API_URL=/admin-api |
||||||
Binary file not shown.
@ -0,0 +1,19 @@ |
|||||||
|
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 |
||||||
|
}) |
||||||
|
} |
||||||
@ -0,0 +1,189 @@ |
|||||||
|
<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> |
||||||
@ -1,325 +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.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> |
|
||||||
@ -1,268 +0,0 @@ |
|||||||
<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-input |
|
||||||
v-model="form.success" |
|
||||||
placeholder="" |
|
||||||
></el-input> |
|
||||||
</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="90px" 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="120" label="操作"> |
|
||||||
<template #default="{ row }"> |
|
||||||
<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> |
|
||||||
</template> |
|
||||||
|
|
||||||
<script setup> |
|
||||||
import { request } from "@/util/axios_config"; |
|
||||||
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") { |
|
||||||
console.log("aaaa"); |
|
||||||
tableData.value = response.data.mails; |
|
||||||
} else { |
|
||||||
console.log("bbbb"); |
|
||||||
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() |
|
||||||
} |
|
||||||
</script> |
|
||||||
@ -0,0 +1,323 @@ |
|||||||
|
<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