增加操作记录管理功能和导出功能

main
岩仔88 2 weeks ago
parent dc3813a1e8
commit 71316026da

@ -0,0 +1,100 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ConflictRecordController extends Controller
{
public function GetList(Request $request)
{
$page = request('page');
$pageSize = request('pageSize');
$searchInfo = request('searchInfo');
$query = DB::table('conflict_record');
if (!empty($searchInfo['name'])) {
$query->where('name', 'like', '%' . $searchInfo['name'] . '%');
}
if (!empty($searchInfo['id_card_num'])) {
$encrypt = \App\Lib\HSM::HsmEncrypt($searchInfo['id_card_num']);
if ($encrypt['status']) {
$query->where('id_card_num', $encrypt['data']);
}
}
if (!empty($searchInfo['current_org_name'])) {
$query->where('current_org_name', 'like', '%' . $searchInfo['current_org_name'] . '%');
}
if (!empty($searchInfo['type'])) {
$query->where('type', $searchInfo['type']);
}
if (!empty($searchInfo['source'])) {
$query->where('source', $searchInfo['source']);
}
if (!empty($searchInfo['dateRange'])) {
$query->whereBetween('created_at', [$searchInfo['dateRange'][0] . ' 00:00:00', $searchInfo['dateRange'][1] . ' 23:59:59']);
}
$count = $query->count();
$list = $query->orderBy('id', 'desc')
->offset(($page - 1) * $pageSize)
->limit($pageSize)
->get();
foreach ($list as $item) {
if (!empty($item->id_card_num)) {
$decrypt = \App\Lib\HSM::HsmDecrypt($item->id_card_num);
if ($decrypt['status']) {
$item->id_card_num = $decrypt['data'];
}
}
}
return \Yz::Return(true, '查询成功', ['list' => $list, 'count' => $count]);
}
public function ExportList(Request $request)
{
$searchInfo = request('searchInfo');
$query = DB::table('conflict_record');
if (!empty($searchInfo['name'])) {
$query->where('name', 'like', '%' . $searchInfo['name'] . '%');
}
if (!empty($searchInfo['id_card_num'])) {
$encrypt = \App\Lib\HSM::HsmEncrypt($searchInfo['id_card_num']);
if ($encrypt['status']) {
$query->where('id_card_num', $encrypt['data']);
}
}
if (!empty($searchInfo['current_org_name'])) {
$query->where('current_org_name', 'like', '%' . $searchInfo['current_org_name'] . '%');
}
if (!empty($searchInfo['type'])) {
$query->where('type', $searchInfo['type']);
}
if (!empty($searchInfo['source'])) {
$query->where('source', $searchInfo['source']);
}
if (!empty($searchInfo['dateRange'])) {
$query->whereBetween('created_at', [$searchInfo['dateRange'][0] . ' 00:00:00', $searchInfo['dateRange'][1] . ' 23:59:59']);
}
$list = $query->orderBy('id', 'desc')->get();
foreach ($list as $item) {
if (!empty($item->id_card_num)) {
$decrypt = \App\Lib\HSM::HsmDecrypt($item->id_card_num);
if ($decrypt['status']) {
$item->id_card_num = $decrypt['data'];
}
}
}
return \Yz::Return(true, '查询成功', ['list' => $list]);
}
}

@ -0,0 +1,100 @@
<?php
namespace App\Http\Controllers\API\Admin\YeWu;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DeleteOperationLogController extends Controller
{
public function GetList(Request $request)
{
$page = request('page');
$pageSize = request('pageSize');
$searchInfo = request('searchInfo');
$query = DB::table('delete_operation_log');
if (!empty($searchInfo['name'])) {
$query->where('name', 'like', '%' . $searchInfo['name'] . '%');
}
if (!empty($searchInfo['id_card_num'])) {
$encrypt = \App\Lib\HSM::HsmEncrypt($searchInfo['id_card_num']);
if ($encrypt['status']) {
$query->where('id_card_num', $encrypt['data']);
}
}
if (!empty($searchInfo['operator_name'])) {
$query->where('operator_name', 'like', '%' . $searchInfo['operator_name'] . '%');
}
if (!empty($searchInfo['table_name'])) {
$query->where('table_name', $searchInfo['table_name']);
}
if (!empty($searchInfo['type'])) {
$query->where('type', $searchInfo['type']);
}
if (!empty($searchInfo['dateRange'])) {
$query->whereBetween('created_at', [$searchInfo['dateRange'][0] . ' 00:00:00', $searchInfo['dateRange'][1] . ' 23:59:59']);
}
$count = $query->count();
$list = $query->orderBy('id', 'desc')
->offset(($page - 1) * $pageSize)
->limit($pageSize)
->get();
foreach ($list as $item) {
if (!empty($item->id_card_num)) {
$decrypt = \App\Lib\HSM::HsmDecrypt($item->id_card_num);
if ($decrypt['status']) {
$item->id_card_num = $decrypt['data'];
}
}
}
return \Yz::Return(true, '查询成功', ['list' => $list, 'count' => $count]);
}
public function ExportList(Request $request)
{
$searchInfo = request('searchInfo');
$query = DB::table('delete_operation_log');
if (!empty($searchInfo['name'])) {
$query->where('name', 'like', '%' . $searchInfo['name'] . '%');
}
if (!empty($searchInfo['id_card_num'])) {
$encrypt = \App\Lib\HSM::HsmEncrypt($searchInfo['id_card_num']);
if ($encrypt['status']) {
$query->where('id_card_num', $encrypt['data']);
}
}
if (!empty($searchInfo['operator_name'])) {
$query->where('operator_name', 'like', '%' . $searchInfo['operator_name'] . '%');
}
if (!empty($searchInfo['table_name'])) {
$query->where('table_name', $searchInfo['table_name']);
}
if (!empty($searchInfo['type'])) {
$query->where('type', $searchInfo['type']);
}
if (!empty($searchInfo['dateRange'])) {
$query->whereBetween('created_at', [$searchInfo['dateRange'][0] . ' 00:00:00', $searchInfo['dateRange'][1] . ' 23:59:59']);
}
$list = $query->orderBy('id', 'desc')->get();
foreach ($list as $item) {
if (!empty($item->id_card_num)) {
$decrypt = \App\Lib\HSM::HsmDecrypt($item->id_card_num);
if ($decrypt['status']) {
$item->id_card_num = $decrypt['data'];
}
}
}
return \Yz::Return(true, '查询成功', ['list' => $list]);
}
}

@ -70,6 +70,13 @@
Route::post('admin/PingTaiPushGetDetail','App\Http\Controllers\API\Admin\YeWu\PingTaiPushController@GetDetail');
Route::post('admin/GetPingTaiOrgList','App\Http\Controllers\API\Admin\YeWu\PingTaiPushController@GetPingTaiOrgList');
//冲突记录
Route::post('admin/ConflictRecordGetList','App\Http\Controllers\API\Admin\YeWu\ConflictRecordController@GetList');
Route::post('admin/ConflictRecordExport','App\Http\Controllers\API\Admin\YeWu\ConflictRecordController@ExportList');
//取消操作日志
Route::post('admin/DeleteOperationLogGetList','App\Http\Controllers\API\Admin\YeWu\DeleteOperationLogController@GetList');
Route::post('admin/DeleteOperationLogExport','App\Http\Controllers\API\Admin\YeWu\DeleteOperationLogController@ExportList');
});

@ -1,6 +1,6 @@
ENV = 'production'
VITE_APP_API = 'http://192.168.50.123:33583/common/la/public/api/'
VITE_APP_FILE = 'http://192.168.50.123:33583/common/la/public'
VITE_APP_API_6666666666 = 'http://192.168.50.123:33583/common/la/public/api/'
VITE_APP_FILE_6666666666 = 'http://192.168.50.123:33583/common/la/public'
VITE_APP_API_66666666 = 'http://172.31.68.39:33583/common/la/public/api/'
VITE_APP_FILE_66666666 = 'http://172.31.68.39:33583/common/la/public'
VITE_APP_API = 'http://172.31.68.39:33583/common/la/public/api/'
VITE_APP_FILE = 'http://172.31.68.39:33583/common/la/public'

@ -17,7 +17,8 @@
"pinia": "^2.1.6",
"qrcode": "^1.5.3",
"vue": "^3.3.4",
"vue-router": "^4.2.4"
"vue-router": "^4.2.4",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.3.3",
@ -860,6 +861,15 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/adler-32": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.8"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@ -1011,6 +1021,19 @@
"node": ">=6"
}
},
"node_modules/cfb": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
"integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
"license": "Apache-2.0",
"dependencies": {
"adler-32": "~1.3.0",
"crc-32": "~1.2.0"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -1037,6 +1060,15 @@
"wrap-ansi": "^6.2.0"
}
},
"node_modules/codepage": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.8"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -1070,6 +1102,18 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
"node_modules/crc-32": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
"license": "Apache-2.0",
"bin": {
"crc32": "bin/crc32.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -1788,6 +1832,15 @@
"node": ">= 6"
}
},
"node_modules/frac": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.8"
}
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@ -2921,6 +2974,18 @@
"node": ">=0.10.0"
}
},
"node_modules/ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"license": "Apache-2.0",
"dependencies": {
"frac": "~1.1.2"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@ -3206,6 +3271,24 @@
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
},
"node_modules/wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.8"
}
},
"node_modules/word": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.8"
}
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@ -3225,6 +3308,27 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
"node_modules/xlsx": {
"version": "0.18.5",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
"integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
"license": "Apache-2.0",
"dependencies": {
"adler-32": "~1.3.0",
"cfb": "~1.2.1",
"codepage": "~1.15.0",
"crc-32": "~1.2.1",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"
},
"bin": {
"xlsx": "bin/xlsx.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/xml-name-validator": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",

@ -19,7 +19,8 @@
"pinia": "^2.1.6",
"qrcode": "^1.5.3",
"vue": "^3.3.4",
"vue-router": "^4.2.4"
"vue-router": "^4.2.4",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.3.3",

@ -189,4 +189,20 @@ export const PingTaiPushGetDetail = (data={}) => {
}
export const GetPingTaiOrgList = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/GetPingTaiOrgList',data:data})
}
export const ConflictRecordGetList = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/ConflictRecordGetList',data:data})
}
export const ConflictRecordExport = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/ConflictRecordExport',data:data})
}
export const DeleteOperationLogGetList = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/DeleteOperationLogGetList',data:data})
}
export const DeleteOperationLogExport = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/DeleteOperationLogExport',data:data})
}

@ -13,6 +13,8 @@ import AppointmentList from '../views/AppointmentMngr/AppointmentList.vue'
import healthCheckList from '../views/MedicalCenter/HealthCheckList.vue'
import Dashboard from '../views/MedicalCenter/Dashboard.vue'
import AppointmentCount from '../views/Report/AppointmentCount.vue'
import ConflictRecord from '../views/Report/ConflictRecord.vue'
import DeleteOperationLog from '../views/Report/DeleteOperationLog.vue'
const router = createRouter({
history: createWebHashHistory(import.meta.env.BASE_URL),
@ -96,6 +98,16 @@ const router = createRouter({
name: 'ReportHealthCard',
component: () => import('../views/Report/HealthCard.vue'),
meta: { title: '体检统计' }
},{
path: '/report/conflictRecord',
name: 'ReportConflictRecord',
component: ConflictRecord,
meta: { title: '冲突记录' }
},{
path: '/report/deleteOperationLog',
name: 'ReportDeleteOperationLog',
component: DeleteOperationLog,
meta: { title: '取消操作日志' }
},{
path: '/systemMngr/Configs',
name: 'SystemConfigs',

@ -0,0 +1,151 @@
<template>
<div>
<div class="head">
<el-row :gutter="10">
<el-form-item>
<el-input v-model="searchInfo.name" placeholder="姓名" clearable />
</el-form-item>
<el-form-item>
<el-input v-model="searchInfo.id_card_num" placeholder="身份证号" clearable />
</el-form-item>
<el-form-item>
<el-input v-model="searchInfo.current_org_name" placeholder="当前机构" clearable />
</el-form-item>
<el-form-item>
<el-select v-model="searchInfo.type" placeholder="类型" clearable>
<el-option label="健康证体检" value="1" />
<el-option label="老年人体检" value="2" />
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="searchInfo.source" placeholder="来源" clearable>
<el-option label="预约检查" value="CheckAppointment" />
</el-select>
</el-form-item>
<el-form-item>
<el-date-picker v-model="searchInfo.dateRange" value-format="YYYY-MM-DD" type="daterange"
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="Search"></el-button>
<el-button type="success" @click="ExportExcel" :loading="exportLoading">导出Excel</el-button>
</el-form-item>
</el-row>
</div>
<el-table border :data="tableData" style="width: 100%;" row-key="id" v-loading="loading">
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="name" label="姓名" width="100" />
<el-table-column prop="id_card_num" label="身份证号" width="180" />
<el-table-column prop="current_org_name" label="当前机构" />
<el-table-column prop="doctor_name" label="医生姓名" width="100" />
<el-table-column prop="last_org_name" label="上次机构" />
<el-table-column prop="last_checkup_time" label="上次体检时间" width="180" />
<el-table-column prop="type" label="类型" width="100">
<template #default="scope">{{ typeMap[scope.row.type] || scope.row.type }}</template>
</el-table-column>
<el-table-column prop="source" label="来源" width="100">
<template #default="scope">{{ sourceMap[scope.row.source] || scope.row.source }}</template>
</el-table-column>
<el-table-column prop="created_at" label="创建时间" width="180" />
</el-table>
<div class="page">
<el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize"
:page-sizes="[15, 50, 100, 200]" layout="total,sizes, prev, pager, next" :total="total"
@size-change="PageSizeChange" @current-change="PageCurrentChange" />
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { ConflictRecordGetList, ConflictRecordExport } from '@/api/api.js'
import * as XLSX from 'xlsx'
let typeMap = { '1': '健康证体检', '2': '老年人体检' }
let sourceMap = { 'CheckAppointment': '预约检查' }
let loading = ref(false)
let exportLoading = ref(false)
let tableData = ref([])
let currentPage = ref(1)
let pageSize = ref(15)
let total = ref(0)
let searchInfo = ref({
name: '',
id_card_num: '',
current_org_name: '',
type: '',
source: '',
dateRange: [],
})
const PageSizeChange = (e) => {
pageSize.value = e
GetList()
}
const PageCurrentChange = (e) => {
currentPage.value = e
GetList()
}
const Search = () => {
currentPage.value = 1
GetList()
}
const GetList = () => {
loading.value = true
ConflictRecordGetList({
page: currentPage.value,
pageSize: pageSize.value,
searchInfo: searchInfo.value,
}).then(res => {
loading.value = false
if (res.status) {
tableData.value = res.data.list
total.value = res.data.count
} else {
ElMessage.error(res.msg)
}
})
}
const ExportExcel = () => {
exportLoading.value = true
ConflictRecordExport({
searchInfo: searchInfo.value,
}).then(res => {
exportLoading.value = false
if (res.status) {
const exportData = res.data.list.map(item => ({
'ID': item.id,
'姓名': item.name,
'身份证号': item.id_card_num,
'当前机构': item.current_org_name,
'医生姓名': item.doctor_name,
'上次机构': item.last_org_name,
'上次体检时间': item.last_checkup_time,
'类型': typeMap[item.type] || item.type,
'来源': sourceMap[item.source] || item.source,
'创建时间': item.created_at,
}))
const ws = XLSX.utils.json_to_sheet(exportData)
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, '冲突记录')
XLSX.writeFile(wb, '冲突记录_' + new Date().getTime() + '.xlsx')
ElMessage.success('导出成功')
} else {
ElMessage.error(res.msg)
}
})
}
onMounted(() => {
GetList()
})
</script>
<style scoped>
.page {
display: flex;
justify-content: flex-end;
margin-top: 10px;
}
</style>

@ -0,0 +1,152 @@
<template>
<div>
<div class="head">
<el-row :gutter="10">
<el-form-item>
<el-input v-model="searchInfo.name" placeholder="姓名" clearable />
</el-form-item>
<el-form-item>
<el-input v-model="searchInfo.id_card_num" placeholder="身份证号" clearable />
</el-form-item>
<el-form-item>
<el-input v-model="searchInfo.operator_name" placeholder="操作人" clearable />
</el-form-item>
<el-form-item>
<el-select v-model="searchInfo.table_name" placeholder="表名" clearable>
<el-option label="预约记录" value="appointment_record" />
<el-option label="体检记录" value="examination_records" />
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="searchInfo.type" placeholder="类型" clearable>
<el-option label="健康证体检" value="1" />
<el-option label="老年人体检" value="2" />
</el-select>
</el-form-item>
<el-form-item>
<el-date-picker v-model="searchInfo.dateRange" value-format="YYYY-MM-DD" type="daterange"
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="Search"></el-button>
<el-button type="success" @click="ExportExcel" :loading="exportLoading">导出Excel</el-button>
</el-form-item>
</el-row>
</div>
<el-table border :data="tableData" style="width: 100%;" row-key="id" v-loading="loading">
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="table_name" label="表名" width="120">
<template #default="scope">{{ tableNameMap[scope.row.table_name] || scope.row.table_name }}</template>
</el-table-column>
<el-table-column prop="record_id" label="记录ID" width="80" />
<el-table-column prop="name" label="姓名" width="100" />
<el-table-column prop="id_card_num" label="身份证号" width="180" />
<el-table-column prop="operator_name" label="操作人" width="100" />
<el-table-column prop="reason" label="原因" />
<el-table-column prop="current_org_name" label="机构名称" />
<el-table-column prop="type" label="类型" width="100">
<template #default="scope">{{ typeMap[scope.row.type] || scope.row.type }}</template>
</el-table-column>
<el-table-column prop="created_at" label="创建时间" width="180" />
</el-table>
<div class="page">
<el-pagination v-model:current-page="currentPage" v-model:page-size="pageSize"
:page-sizes="[15, 50, 100, 200]" layout="total,sizes, prev, pager, next" :total="total"
@size-change="PageSizeChange" @current-change="PageCurrentChange" />
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { DeleteOperationLogGetList, DeleteOperationLogExport } from '@/api/api.js'
import * as XLSX from 'xlsx'
let typeMap = { '1': '健康证体检', '2': '老年人体检' }
let tableNameMap = { 'appointment_record': '预约记录', 'examination_records': '体检记录' }
let loading = ref(false)
let exportLoading = ref(false)
let tableData = ref([])
let currentPage = ref(1)
let pageSize = ref(15)
let total = ref(0)
let searchInfo = ref({
name: '',
id_card_num: '',
operator_name: '',
table_name: '',
type: '',
dateRange: [],
})
const PageSizeChange = (e) => {
pageSize.value = e
GetList()
}
const PageCurrentChange = (e) => {
currentPage.value = e
GetList()
}
const Search = () => {
currentPage.value = 1
GetList()
}
const GetList = () => {
loading.value = true
DeleteOperationLogGetList({
page: currentPage.value,
pageSize: pageSize.value,
searchInfo: searchInfo.value,
}).then(res => {
loading.value = false
if (res.status) {
tableData.value = res.data.list
total.value = res.data.count
} else {
ElMessage.error(res.msg)
}
})
}
const ExportExcel = () => {
exportLoading.value = true
DeleteOperationLogExport({
searchInfo: searchInfo.value,
}).then(res => {
exportLoading.value = false
if (res.status) {
const exportData = res.data.list.map(item => ({
'ID': item.id,
'表名': tableNameMap[item.table_name] || item.table_name,
'记录ID': item.record_id,
'姓名': item.name,
'身份证号': item.id_card_num,
'操作人': item.operator_name,
'原因': item.reason,
'机构名称': item.current_org_name,
'类型': typeMap[item.type] || item.type,
'创建时间': item.created_at,
}))
const ws = XLSX.utils.json_to_sheet(exportData)
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, '取消操作日志')
XLSX.writeFile(wb, '取消操作日志_' + new Date().getTime() + '.xlsx')
ElMessage.success('导出成功')
} else {
ElMessage.error(res.msg)
}
})
}
onMounted(() => {
GetList()
})
</script>
<style scoped>
.page {
display: flex;
justify-content: flex-end;
margin-top: 10px;
}
</style>
Loading…
Cancel
Save