Commit 14b5d639 authored by 王晓旭's avatar 王晓旭

添加人员注册报表

parent a8aaa6ee
...@@ -159,6 +159,19 @@ export function getOrderinfo(params) { ...@@ -159,6 +159,19 @@ export function getOrderinfo(params) {
export function getDeptList(params) { export function getDeptList(params) {
return http.post(`${baseURL}/base/dept/list`, params); return http.post(`${baseURL}/base/dept/list`, params);
} }
/**
* 人员登记报表
*/
// 获取列表
export function getPeopleList(params) {
return http.get(`${BASEURL}/admin/people/list`, params);
}
// 删除人员信息
export function delPeople(params) {
return http.get(`${BASEURL}/admin/people/delete`, params);
}
/** /**
* 取件记录报表 * 取件记录报表
*/ */
......
<template>
<!-- 预约记录报表搜索 -->
<div class="search-form">
<a-space direction="vertical" size="middle">
<a-button block class="export-btn" icon="upload" @click="handleExport">
导出
</a-button>
<a-input
allowClear
placeholder="请输入人员姓名搜索"
v-model="searchForm.name"
/>
<a-input
allowClear
placeholder="请输入身份证号搜索"
v-model="searchForm.idcard"
/>
<a-input
allowClear
placeholder="请输入手机号搜索"
v-model="searchForm.phone"
/>
<a-button block class="search-btn" icon="search" @click="handleSearch">
搜索
</a-button>
</a-space>
</div>
</template>
<script>
import YSelect from "@/components/YSelect.vue";
import YRangePicker from "@/components/YRangePicker.vue";
import storage from "@/utils/js/Storage";
import { mapMutations } from "vuex";
import { getDeptList } from "@/api/dataAdmin";
import { debounce } from "lodash";
let statusItem = {
0: "预约中",
1: "成功取号",
2: "超时未取号",
3: "预约取消",
};
export default {
name: "Registration-search",
components: {
YSelect,
YRangePicker,
},
data() {
return {
statusItem,
depList: [], // 部门列表
siteId: storage.get(2, "siteId"),
// 搜索数据
searchForm: {
name: "",
idcard: "",
phone: "",
},
};
},
created() {
this.getDeptList();
},
methods: {
...mapMutations("search", ["set_searForm", "reset"]),
// 部门列表
async getDeptList() {
let res = await getDeptList({
page: 1,
size: -1,
siteId: this.siteId,
});
if (res.code == 1) {
let { data } = res.data;
this.depList = data;
}
},
// 搜索
handleSearch() {
this.set_searForm(this.searchForm);
},
// 导出
handleExport: debounce(
function () {
this.$bus.$emit("export");
},
2000,
{
leading: true,
trailing: false,
}
),
},
beforeDestroy() {
this.reset();
},
};
</script>
<style lang="less" scoped>
</style>
\ No newline at end of file
...@@ -213,6 +213,30 @@ const routes = [ ...@@ -213,6 +213,30 @@ const routes = [
}, },
], ],
}, },
{
path: "personnelRegistration",
name: "personnelRegistration",
redirect: "/home/dataManagement/personnelRegistration/Registration",
component: () =>
import(
/* webpackChunkName: "personnelRegistration" */ "@/views/dataAdmin/components/personnelRegistration/module.vue"
),
meta: { title: "人员注册报表" },
children: [
{
path: "Registration",
name: "Registration",
component: () =>
import(
/* webpackChunkName: "RecordReport" */ "@/views/dataAdmin/components/personnelRegistration/personnelRegistration.vue"
),
meta: {
title: "人员注册报表",
activeMenu: "/home/dataManagement",
},
},
],
},
{ {
path: "oneYardPass", path: "oneYardPass",
name: "oneYardPass", name: "oneYardPass",
......
<template>
<div>
<a-drawer
title="详细信息"
placement="right"
width="800px"
:visible="Visible"
@close="onClose"
>
<div>
<div class="info">
<div class="color_title">预约信息</div>
<p><span>预约编号:</span>{{ detailsInfo.number || "--" }}</p>
<p>
<span>预约人:</span
>{{
(detailsInfo.people && detailsInfo.people.idcard_Name) || "--"
}}
</p>
<p>
<span>手机号:</span
>{{ (detailsInfo.people && detailsInfo.people.phone) || "--" }}
</p>
<p>
<span>证件号码:</span
>{{
(detailsInfo.people && detailsInfo.people.idcard_IDCardNo) || "--"
}}
</p>
<p>
<span>预约时段:</span>{{ detailsInfo.starttime }}~{{
detailsInfo.endtime
}}
</p>
<p>
<span>预约方式:</span
>{{
detailsInfo.up_type == "phone"
? "小程序"
: detailsInfo.up_type == "app"
? "自助终端"
: detailsInfo.up_type == "tftb"
? "天府通办"
: "--"
}}
</p>
<p><span>预约事项:</span>--</p>
<!-- 当前办理步骤标识 -->
<div
class="transact-tips transact-tips1"
v-if="detailsInfo.status === 0"
>
<span class="tips-text"> 预约中 </span>
</div>
<div
class="transact-tips transact-tips2"
v-if="detailsInfo.status === 1"
>
<span class="tips-text"> 成功取号 </span>
</div>
<div
class="transact-tips transact-tips3"
v-if="detailsInfo.status === 2"
>
<span class="tips-text"> 超时未取号 </span>
</div>
<div
class="transact-tips transact-tips4"
v-if="detailsInfo.status === 3"
>
<span class="tips-text"> 预约取消 </span>
</div>
<div class="qrcode flex flex-col items-center">
<img class="w-[100px]" :src="baseurl + '/' + detailsInfo.qrcode" />
<p>预约信息二维码</p>
</div>
</div>
<a-divider />
<div>
<div class="color_title">预约业务</div>
<div>
{{ detailsInfo.business || "--" }}
</div>
</div>
<a-divider />
<div>
<div class="color_title">办理地点</div>
<p>
<span>办理地点:</span
>{{ detailsInfo.siteinfo && detailsInfo.siteinfo.siteName }}
</p>
<p>
<span>办理窗口:</span
>{{ (detailsInfo.window && detailsInfo.window.join("")) || "--" }}
</p>
<p>
<span>服务热线:</span
>{{ detailsInfo.siteinfo && detailsInfo.siteinfo.siteTel }}
</p>
<p>
<span
>办理时间:{{
detailsInfo.siteinfo &&
Number(detailsInfo.siteinfo.amWorkStartTime * 1000) | times
}}
~
{{
detailsInfo.siteinfo &&
Number(detailsInfo.siteinfo.amWorkEndTime * 1000) | times
}}
<span style="position: relative; top: -2px">--</span>
{{
detailsInfo.siteinfo &&
Number(detailsInfo.siteinfo.pmWorkStartTime * 1000) | times
}}
~
{{
detailsInfo.siteinfo &&
Number(detailsInfo.siteinfo.pmWorkEndTime * 1000) | times
}}</span
>
</p>
<p>
<span
>办理地址:{{
detailsInfo.siteinfo && detailsInfo.siteinfo.detailAddress
}}</span
>
</p>
</div>
<a-divider />
<div>
<div class="color_title">操作信息</div>
<p>
<span>操作时间:{{ detailsInfo.create_time }}</span>
</p>
<p>
<span
>预约方式:{{
detailsInfo.up_type == "phone"
? "小程序"
: detailsInfo.up_type == "app"
? "自助终端"
: detailsInfo.up_type == "tftb"
? "天府通办"
: "--"
}}
</span>
</p>
<p>
<span
>操作站点:{{
detailsInfo.siteinfo ? detailsInfo.siteinfo.siteName : "--"
}}
</span>
</p>
</div>
</div>
</a-drawer>
</div>
</template>
<script>
let orderStatus = {
1: "预约成功",
2: "签到成功",
3: "办理中",
4: "完成",
};
let statusItem = {
0: "预约中",
1: "成功取号",
2: "超时未取号",
3: "预约取消",
};
const style = {
0: "排队中",
1: "办理中",
2: "办理中",
3: "办理中",
4: "办理完成",
};
export default {
props: {
detailsVisible: {
type: Boolean,
required: true,
default: false,
},
detailsInfo: {
type: Object,
required: true,
default: () => {
return {};
},
},
},
data() {
return {
orderStatus,
statusItem,
style,
baseurl: process.env.VUE_APP_API_PHP_URL,
};
},
computed: {
Visible: {
get() {
return this.detailsVisible;
},
set(val) {
this.$emit("update:detailsVisible", val);
},
},
},
methods: {
onClose() {
this.Visible = false;
},
},
};
</script>
<style lang="less" scoped>
:deep(.ant-drawer-body) {
overflow-y: auto;
}
p {
margin-bottom: 10px;
}
.info {
position: relative;
.qrcode {
position: absolute;
right: 0px;
top: 36px;
}
.transact-tips {
width: 100px;
height: 100px;
font-size: 16px;
font-weight: 600;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 36px;
left: 76px;
transform: rotate(45deg);
}
.transact-tips1 {
border: 8px solid rgba(8, 87, 232, 0.1);
color: #0857e8;
}
.transact-tips2 {
border: 8px solid rgba(0, 168, 112, 0.1);
color: #00a870;
}
.transact-tips3 {
border: 8px solid rgba(255, 184, 32, 0.1);
color: #ffb820;
}
.transact-tips4 {
border: 8px solid rgba(245, 63, 63, 0.1);
color: #f53f3f;
}
}
</style>
\ No newline at end of file
<template>
<div class="h-full w-full flex flex-col">
<div class="total-info">
<span class="mr-[30px]">预约次数:{{ total ?? 0 }}</span>
<span>统计时间段:{{ time[0] }} - {{ time[1] }}</span>
</div>
<div class="reportforms-out-box">
<div class="tab-box">
<router-link
v-for="(item, index) of tabsList['children']"
:key="index"
class="tab-item"
:to="'/home/dataManagement/makeRecordReport/' + item.path"
>
{{ item["meta"]["title"] }}
</router-link>
</div>
<div class="reportforms-out">
<router-view @update="changeData" />
</div>
</div>
</div>
</template>
<script>
import { getItemData } from "@/utils/js/common.js";
import common from "@/mixins/common";
export default {
name: "personnelRegistration",
mixins: [common],
data() {
return {
total: 0,
time: [
this.$moment().format("YYYY-MM-DD"),
this.$moment().format("YYYY-MM-DD"),
],
};
},
computed: {
tabsList() {
return getItemData(
this.$router.options.routes,
"name",
"makeRecordReport"
);
},
},
mounted() {},
methods: {
changeRouter(path) {
this.$router.push(path);
},
changeData(data) {
let { total, time } = data;
this.total = total;
this.time = time;
},
},
};
</script>
<style lang="less" scoped>
</style>
<template>
<div>
<a-table
size="middle"
:columns="columns"
:data-source="tableData"
:loading="loading"
:scroll="{
x: 1500,
y: 490,
}"
:row-selection="{
selectedRowKeys: selectedRowKeys,
onChange: onSelectChange,
}"
:rowKey="(record) => record.id"
:pagination="{
showTotal: (total) => `共 ${total} 条`,
current: current,
total: total,
pageSize: size,
showQuickJumper: true,
}"
@change="changeTable"
>
<!-- 操作 -->
<template slot="action" slot-scope="text, record">
<a-space>
<a-tag
class="cursor-pointer"
color="red"
@click="handleDel(record.id)"
>
删除
</a-tag>
</a-space>
</template>
</a-table>
<!-- 详细信息 -->
<Details
:detailsInfo="detailsInfo"
:detailsVisible.sync="visible"
></Details>
</div>
</template>
<script>
import { mapState } from "vuex";
import storage from "@/utils/js/Storage";
import Details from "./components/Details.vue";
import { export2Excel } from "@/utils/js/exportExcel";
import { getPeopleList, delPeople } from "@/api/dataAdmin";
const tHeader = [
"人员姓名",
"性别",
"民族",
"生日日期",
"户籍所在地",
"身份证号码",
"签发机关",
"有效期限",
"手机号码",
]; // 导出的表头名信息
const filterVal = [
"idcard_Name",
"idcard_Sex",
"idcard_Nation",
"idcard_Born",
"idcard_Address",
"idcard_IDCardNo",
"idcard_GrantDept",
"idcard_UserLifeBegin",
"phone",
]; // 导出的表头字段名,需要导出表格字段名
export default {
components: {
Details,
},
data() {
const columns = [
{
title: "序号",
width: 100,
align: "center",
fixed: "left",
customRender: (text, record, index) => {
return (this.current - 1) * this.size + index + 1;
},
},
{
title: "人员姓名",
fixed: "left",
width: 100,
customRender: (text, record) => {
return record.idcard_Name || "--";
},
},
{
title: "性别",
width: 150,
customRender: (text, record) => {
return record.idcard_Sex || "--";
},
},
{
title: "民族",
width: 160,
customRender: (text, record) => {
return record.idcard_Nation || "--";
},
},
{
title: "生日日期",
dataIndex: "idcard_Born",
width: 220,
customRender: (text, record) => {
return record.idcard_Born || "--";
},
},
{
title: "户籍所在地",
dataIndex: "idcard_Address",
width: 150,
customRender: (text, record) => {
return record.idcard_Address || "--";
},
},
{
title: "身份证号码",
dataIndex: "idcard_IDCardNo",
width: 150,
customRender: (text, record) => {
return record.idcard_IDCardNo || "--";
},
},
{
title: "签发机关",
width: 200,
dataIndex: "idcard_GrantDept",
customRender: (text, record) => {
return record.idcard_GrantDept || "--";
},
},
{
title: "有效期限",
width: 150,
customRender: (text, record) => {
return `${record.idcard_UserLifeBegin}-${record.idcard_UserLifeEnd}` || "--";
},
},
{
title: "手机号码",
width: 150,
customRender: (text, record) => {
return record.phone || "--";
},
},
{
title: "创建时间",
width: 150,
dataIndex: "create_time",
},
{
title: "操作",
width: 150,
align: "center",
scopedSlots: {
customRender: "action",
},
},
];
return {
baseurl: process.env.VUE_APP_API_PHP_URL,
siteId: storage.get(2, "siteId"),
columns,
tHeader,
filterVal,
tableData: [],
current: 1,
size: 10,
total: 0,
searchForm: {
name: "",
idcard: "",
phone: "",
},
loading: false,
selectedRowKeys: [], // 表格选中的key
excelData: [], // 导出数据
detailsInfo: {}, // 详情信息
visible: false,
};
},
computed: {
...mapState("search", ["searForm", "isExport"]),
},
watch: {
searForm: {
handler(newForm) {
if (JSON.stringify(newForm) != "{}") {
this.searchForm = newForm;
this.current = 1;
this.getEvaList();
}
},
deep: true,
},
},
created() {
this.getEvaList();
this.$bus.$off("export");
this.$bus.$on("export", () => {
this.exportExcel();
});
},
methods: {
// 获取报表
async getEvaList() {
this.loading = true;
let { total, data } = await this.getDataList();
this.total = total;
this.tableData = data;
// this.$emit("update", { total, time: this.searchForm.time });
this.loading = false;
},
// 获取数据函数
async getDataList(searchForm) {
let list = [];
let listTotal = 0;
let res = await getPeopleList({
page: this.current,
size: this.size,
...this.searchForm,
...searchForm,
});
if (res.code == 1) {
let { data, total } = res.data;
list = data;
listTotal = total;
}
return {
data: list,
total: listTotal,
};
},
// 翻页
changeTable(pagination) {
let { current } = pagination;
this.current = current;
this.getEvaList();
},
// 勾选表格
onSelectChange(keys, rows) {
this.selectedRowKeys = keys;
const res = new Map();
this.excelData = [...this.excelData, ...rows]
.filter((v) => {
return !res.has(v.id) && res.set(v.id, 1);
})
.filter((v) => {
return this.selectedRowKeys.some((val) => v.id == val);
});
},
// 导出表格
async exportExcel() {
if (this.selectedRowKeys.length && this.excelData.length) {
// 深度克隆避免影响页面表格展示
let data = this.$_.cloneDeep(this.excelData);
export2Excel(
this.tHeader,
this.filterVal,
data,
"预约记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
} else {
this.dataSection(this.getDataList, {}, (data) => {
if (!data.length) {
this.$message.warning("暂无数据");
return;
}
let newData = data.map((v) => {
v.people && delete v.people.id;
return { ...v, ...v.people };
});
export2Excel(
this.tHeader,
this.filterVal,
newData,
"预约记录报表" + this.$moment().format("YYYYMMDDHHmmss")
);
});
}
},
// 删除
handleDel(id) {
let _this = this;
_this.$confirm({
title: "系统提示:",
content: "删除不可恢复,是否继续?",
okType: "danger",
cancelText: "取消",
centered: true,
maskClosable: true,
icon: "exclamation-circle",
async onOk() {
console.log(1111);
let res = await delPeople({
id,
});
let { code, msg } = res;
if (code == 1) {
_this.$message.success(msg);
_this.getEvaList();
}
},
onCancel() {},
});
},
// 数据切片
async dataSection(fn, searchForm, callback) {
let dataList = [];
let page = 1;
let size = 1000;
let execute = async () => {
let { data, total } = await fn({ page, size, ...searchForm });
dataList = [...dataList, ...data];
this.$app.progressFile.show = true;
this.$app.progressFile.percent = parseInt(
(dataList.length / total) * 100
);
if (dataList.length >= total || data.length == 0) {
if (callback) callback(dataList);
this.$app.progressFile.show = false;
this.$app.progressFile.percent = 1;
return;
}
setTimeout(() => {
page += 1;
execute();
});
};
execute();
},
// 详情
// async checkInfo({ id }) {
// this.loading = true;
// let res = await getOrderinfo({ id });
// if (res.code == 1) {
// this.detailsInfo = res.data;
// this.visible = true;
// }
// this.loading = false;
// },
},
};
</script>
<style lang="less" scoped></style>
...@@ -10,7 +10,7 @@ module.exports = defineConfig({ ...@@ -10,7 +10,7 @@ module.exports = defineConfig({
devServer: { devServer: {
proxy: { proxy: {
"/zwfw": { "/zwfw": {
target: process.env.VUE_APP_API_BASE_URL, target: 'http://192.168.0.98:11078',
changeOrigin: true, changeOrigin: true,
// pathRewrite: { // pathRewrite: {
// "^/api": "", // "^/api": "",
...@@ -18,7 +18,7 @@ module.exports = defineConfig({ ...@@ -18,7 +18,7 @@ module.exports = defineConfig({
cookieDomainRewrite: "localhost", cookieDomainRewrite: "localhost",
}, },
"/file": { "/file": {
target: process.env.VUE_APP_API_BASE_URL, target: 'http://192.168.0.98:11078',
changeOrigin: true, changeOrigin: true,
}, },
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment