|
|
@@ -99,182 +99,14 @@
|
|
|
<el-table-column label="出入境次数" prop="count" align="center" />
|
|
|
</el-table>
|
|
|
|
|
|
- <!-- 出入境记录列表对话框 -->
|
|
|
- <el-dialog :title="recordListTitle" v-model="recordListOpen" width="1200px" append-to-body>
|
|
|
- <el-table :data="recordList" v-loading="recordListLoading" @row-click="handleRecordRowClick">
|
|
|
- <el-table-column label="姓名" align="center" prop="fullName" width="300"/>
|
|
|
- <el-table-column label="性别" align="center" prop="genderCn"/>
|
|
|
- <el-table-column label="出生日期" align="center" prop="birthDate" width="100">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ parseTime(scope.row.birthDate, '{y}-{m}-{d}') }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="国家/地区" align="center" prop="countryName"/>
|
|
|
- <el-table-column label="民族" align="center" prop="ethnicityName"/>
|
|
|
- <el-table-column label="出入标识" align="center" prop="inOutFlag"/>
|
|
|
- <el-table-column label="出入时间" align="center" prop="inOutTime" width="180">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ parseTime(scope.row.inOutTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="出入口岸" align="center" prop="portCode">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ scope.row.portCode}}-{{scope.row.portName}}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="前往地/出发地" align="center" prop="destinationName"/>
|
|
|
- <el-table-column label="导入时间" align="center" prop="createTime" width="150">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 出入境记录明细对话框 -->
|
|
|
- <el-dialog :title="detailTitle" v-model="recordDetailOpen" width="900px" append-to-body>
|
|
|
- <el-form :model="detailForm" label-width="120px" disabled>
|
|
|
- <!-- 个人信息 -->
|
|
|
- <div style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">个人信息</div>
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="人员类别:">
|
|
|
- <span>{{ detailForm.personnelCategoryName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="姓名:">
|
|
|
- <span>{{ detailForm.fullName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="性别:">
|
|
|
- <span>{{ detailForm.genderCn }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="出生日期:">
|
|
|
- <span>{{ parseTime(detailForm.birthDate, '{y}-{m}-{d}') }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="国家/地区:">
|
|
|
- <span>{{ detailForm.countryCode }}-{{ detailForm.countryName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="民族:">
|
|
|
- <span>{{ detailForm.ethnicityName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <!-- 证件信息 -->
|
|
|
- <div style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">证件信息</div>
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="证件类别:">
|
|
|
- <span>{{ detailForm.idTypeName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="证件号码:">
|
|
|
- <span>{{ detailForm.idNumber }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="签证类型:">
|
|
|
- <span>{{ detailForm.visaTypeName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="签证号码:">
|
|
|
- <span>{{ detailForm.visaNumber }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="停留期:">
|
|
|
- <span>{{ detailForm.stayDuration }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <!-- 出入境信息 -->
|
|
|
- <div style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">出入境信息</div>
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="出入标识:">
|
|
|
- <span>{{ detailForm.inOutFlag }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="出入时间:">
|
|
|
- <span>{{ parseTime(detailForm.inOutTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="出入口岸:">
|
|
|
- <span>{{ detailForm.portCode }}-{{ detailForm.portName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="交通方式:">
|
|
|
- <span>{{ detailForm.transportMode }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="交通工具:">
|
|
|
- <span>{{ detailForm.transportVehicle }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="前往地/出发地:">
|
|
|
- <span>{{ detailForm.destinationCode }}-{{ detailForm.destinationName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="出入境事由:">
|
|
|
- <span>{{ detailForm.reasonName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="发证机关:">
|
|
|
- <span>{{ detailForm.issuingAuthorityCode }}-{{ detailForm.issuingAuthorityName }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <!-- 其他信息 -->
|
|
|
- <div style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">其他信息</div>
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="自助通道标记:">
|
|
|
- <span>{{ detailForm.selfServiceFlag }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="后台补录标记:">
|
|
|
- <span>{{ detailForm.backfillFlag }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="创建时间:">
|
|
|
- <span>{{ parseTime(detailForm.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="疑难字说明:">
|
|
|
- <span>{{ detailForm.remark }}</span>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer">
|
|
|
- <el-button @click="recordDetailOpen = false">关 闭</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
+ <!-- 使用公共组件 -->
|
|
|
+ <RecordListDetailDialog
|
|
|
+ :visible="recordListOpen"
|
|
|
+ :person-info="selectedPersonInfo"
|
|
|
+ :date-range="getDateRangeForQuery()"
|
|
|
+ @update:visible="recordListOpen = $event"
|
|
|
+ @close="recordListOpen = false"
|
|
|
+ />
|
|
|
|
|
|
<pagination
|
|
|
v-show="total>0"
|
|
|
@@ -289,6 +121,7 @@
|
|
|
<script setup name="High">
|
|
|
import * as echarts from 'echarts'
|
|
|
import { listHighFrequencyInOut, getInOutStats, getRecords } from "@/api/biz/anal";
|
|
|
+import RecordListDetailDialog from '@/components/RecordListDetailDialog.vue';
|
|
|
|
|
|
const { proxy } = getCurrentInstance();
|
|
|
|
|
|
@@ -319,6 +152,7 @@ const recordListOpen = ref(false);
|
|
|
const recordListLoading = ref(false);
|
|
|
const recordListTitle = ref("出入境记录列表");
|
|
|
const recordList = ref([]);
|
|
|
+const selectedPersonInfo = ref({});
|
|
|
|
|
|
const data = reactive({
|
|
|
queryParams: {
|
|
|
@@ -994,45 +828,34 @@ function resetQuery() {
|
|
|
|
|
|
/** 处理表格行点击事件 */
|
|
|
function handleRowClick(row) {
|
|
|
- // 根据证件号码查询出入境记录列表
|
|
|
- recordListLoading.value = true;
|
|
|
+ // 设置选中人员信息
|
|
|
+ selectedPersonInfo.value = { ...row };
|
|
|
+ // 打开记录列表对话框
|
|
|
recordListOpen.value = true;
|
|
|
-
|
|
|
- // 准备查询参数,使用当前页面的日期范围参数
|
|
|
- const params = {};
|
|
|
+}
|
|
|
+
|
|
|
+/** 获取用于查询的日期范围 */
|
|
|
+function getDateRangeForQuery() {
|
|
|
if (queryParams.value.queryType === 'year') {
|
|
|
- params.year = queryParams.value.year;
|
|
|
+ // 按年查询,返回该年的开始和结束日期
|
|
|
+ const year = queryParams.value.year;
|
|
|
+ return [`${year}-01-01`, `${year}-12-31`];
|
|
|
} else if (queryParams.value.queryType === 'month') {
|
|
|
- params.month = queryParams.value.month;
|
|
|
- } else if (queryParams.value.queryType === 'range') {
|
|
|
- if (queryParams.value.dateRange && queryParams.value.dateRange.length === 2) {
|
|
|
- params.startDate = queryParams.value.dateRange[0];
|
|
|
- params.endDate = queryParams.value.dateRange[1];
|
|
|
- }
|
|
|
+ // 按月查询,返回该月的开始和结束日期
|
|
|
+ const month = queryParams.value.month;
|
|
|
+ const date = new Date(`${month}-01`);
|
|
|
+ const lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
|
|
|
+ return [`${month}-01`, `${month}-${String(lastDay).padStart(2, '0')}`];
|
|
|
+ } else if (queryParams.value.queryType === 'range' &&
|
|
|
+ queryParams.value.dateRange &&
|
|
|
+ queryParams.value.dateRange.length === 2) {
|
|
|
+ // 按时段查询,直接返回选择的日期范围
|
|
|
+ return queryParams.value.dateRange;
|
|
|
}
|
|
|
-
|
|
|
- // 添加证件号码参数
|
|
|
- params.idNumber = row.idNumber;
|
|
|
-
|
|
|
- getRecords(params).then(response => {
|
|
|
- const records = response.rows || response.data || [];
|
|
|
- recordList.value = records;
|
|
|
- recordListTitle.value = `${row.fullName}的出入境记录列表 (${records.length}条记录)`;
|
|
|
- }).catch(error => {
|
|
|
- console.error('获取出入境记录失败:', error);
|
|
|
- recordList.value = [];
|
|
|
- recordListTitle.value = `${row.fullName}的出入境记录列表 (0条记录)`;
|
|
|
- }).finally(() => {
|
|
|
- recordListLoading.value = false;
|
|
|
- });
|
|
|
+ return [];
|
|
|
}
|
|
|
|
|
|
-/** 处理记录列表行点击事件 */
|
|
|
-function handleRecordRowClick(recordRow) {
|
|
|
- detailForm.value = { ...recordRow };
|
|
|
- detailTitle.value = `详细信息 - ${recordRow.fullName}`;
|
|
|
- recordDetailOpen.value = true;
|
|
|
-}
|
|
|
+
|
|
|
|
|
|
// 页面加载时获取数据
|
|
|
onMounted(() => {
|