RecordListDetailDialog.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. <template>
  2. <!-- 出入境记录列表对话框 -->
  3. <el-dialog :title="recordListTitle" v-model="recordListOpen" width="1200px" append-to-body>
  4. <el-table :data="recordList" v-loading="recordListLoading" @row-click="handleRecordRowClick">
  5. <el-table-column label="姓名" align="center" prop="fullName" width="200"/>
  6. <el-table-column label="证件号码" align="center" prop="idNumber"/>
  7. <el-table-column label="性别" align="center" prop="genderCn"/>
  8. <el-table-column label="出生日期" align="center" prop="birthDate" width="100">
  9. <template #default="scope">
  10. <span>{{ parseTime(scope.row.birthDate, '{y}-{m}-{d}') }}</span>
  11. </template>
  12. </el-table-column>
  13. <el-table-column label="国家/地区" align="center" prop="countryName"/>
  14. <el-table-column label="民族" align="center" prop="ethnicityName"/>
  15. <el-table-column label="出入标识" align="center" prop="inOutFlag"/>
  16. <el-table-column label="出入时间" align="center" prop="inOutTime" width="180">
  17. <template #default="scope">
  18. <span>{{ parseTime(scope.row.inOutTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  19. </template>
  20. </el-table-column>
  21. <el-table-column label="出入口岸" align="center" prop="portCode">
  22. <template #default="scope">
  23. <span>{{ scope.row.portCode }}-{{ scope.row.portName }}</span>
  24. </template>
  25. </el-table-column>
  26. <el-table-column label="前往地/出发地" align="center" prop="destinationName"/>
  27. <!-- <el-table-column label="导入时间" align="center" prop="createTime" width="150">-->
  28. <!-- <template #default="scope">-->
  29. <!-- <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
  30. <!-- </template>-->
  31. <!-- </el-table-column>-->
  32. </el-table>
  33. <!-- 出入境记录明细对话框 -->
  34. <el-dialog :title="detailTitle" v-model="recordDetailOpen" width="900px" append-to-body>
  35. <el-form :model="detailForm" label-width="120px" disabled>
  36. <!-- 个人信息 -->
  37. <div
  38. style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">
  39. 个人信息
  40. </div>
  41. <el-row>
  42. <el-col :span="8">
  43. <el-form-item label="人员类别:">
  44. <span>{{ detailForm.personnelCategoryName }}</span>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item label="姓名:">
  49. <span>{{ detailForm.fullName }}</span>
  50. </el-form-item>
  51. </el-col>
  52. <el-col :span="8">
  53. <el-form-item label="性别:">
  54. <span>{{ detailForm.genderCn }}</span>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="8">
  58. <el-form-item label="出生日期:">
  59. <span>{{ parseTime(detailForm.birthDate, '{y}-{m}-{d}') }}</span>
  60. </el-form-item>
  61. </el-col>
  62. <el-col :span="8">
  63. <el-form-item label="国家/地区:">
  64. <span>{{ detailForm.countryCode }}-{{ detailForm.countryName }}</span>
  65. </el-form-item>
  66. </el-col>
  67. <el-col :span="8">
  68. <el-form-item label="民族:">
  69. <span>{{ detailForm.ethnicityName }}</span>
  70. </el-form-item>
  71. </el-col>
  72. </el-row>
  73. <!-- 证件信息 -->
  74. <div
  75. style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">
  76. 证件信息
  77. </div>
  78. <el-row>
  79. <el-col :span="8">
  80. <el-form-item label="证件类别:">
  81. <span>{{ detailForm.idTypeName }}</span>
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="8">
  85. <el-form-item label="证件号码:">
  86. <span>{{ detailForm.idNumber }}</span>
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="8">
  90. <el-form-item label="签证类型:">
  91. <span>{{ detailForm.visaTypeName }}</span>
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="8">
  95. <el-form-item label="签证号码:">
  96. <span>{{ detailForm.visaNumber }}</span>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="8">
  100. <el-form-item label="停留期:">
  101. <span>{{ detailForm.stayDuration }}</span>
  102. </el-form-item>
  103. </el-col>
  104. </el-row>
  105. <!-- 出入境信息 -->
  106. <div
  107. style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">
  108. 出入境信息
  109. </div>
  110. <el-row>
  111. <el-col :span="8">
  112. <el-form-item label="出入标识:">
  113. <span>{{ detailForm.inOutFlag }}</span>
  114. </el-form-item>
  115. </el-col>
  116. <el-col :span="8">
  117. <el-form-item label="出入时间:">
  118. <span>{{ parseTime(detailForm.inOutTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="8">
  122. <el-form-item label="出入口岸:">
  123. <span>{{ detailForm.portCode }}-{{ detailForm.portName }}</span>
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="8">
  127. <el-form-item label="交通方式:">
  128. <span>{{ detailForm.transportMode }}</span>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="8">
  132. <el-form-item label="交通工具:">
  133. <span>{{ detailForm.transportVehicle }}</span>
  134. </el-form-item>
  135. </el-col>
  136. <el-col :span="8">
  137. <el-form-item label="前往地/出发地:">
  138. <span>{{ detailForm.destinationCode }}-{{ detailForm.destinationName }}</span>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="8">
  142. <el-form-item label="出入境事由:">
  143. <span>{{ detailForm.reasonName }}</span>
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="8">
  147. <el-form-item label="发证机关:">
  148. <span>{{ detailForm.issuingAuthorityCode }}-{{ detailForm.issuingAuthorityName }}</span>
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. <!-- 其他信息 -->
  153. <div
  154. style="font-weight: bold; margin: 10px 0 15px 0; border-left: 4px solid #409eff; padding-left: 8px; color: #409eff;">
  155. 其他信息
  156. </div>
  157. <el-row>
  158. <el-col :span="8">
  159. <el-form-item label="自助通道标记:">
  160. <span>{{ detailForm.selfServiceFlag }}</span>
  161. </el-form-item>
  162. </el-col>
  163. <el-col :span="8">
  164. <el-form-item label="后台补录标记:">
  165. <span>{{ detailForm.backfillFlag }}</span>
  166. </el-form-item>
  167. </el-col>
  168. <el-col :span="8">
  169. <el-form-item label="创建时间:">
  170. <span>{{ parseTime(detailForm.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  171. </el-form-item>
  172. </el-col>
  173. <el-col :span="8">
  174. <el-form-item label="疑难字说明:">
  175. <span>{{ detailForm.remark }}</span>
  176. </el-form-item>
  177. </el-col>
  178. </el-row>
  179. </el-form>
  180. <template #footer>
  181. <div class="dialog-footer">
  182. <el-button @click="recordDetailOpen = false">关 闭</el-button>
  183. </div>
  184. </template>
  185. </el-dialog>
  186. </el-dialog>
  187. </template>
  188. <script setup>
  189. import {ref, watch} from 'vue';
  190. import {getRecords} from "@/api/biz/anal";
  191. import {parseTime} from "@/utils/ruoyi";
  192. // 定义组件属性
  193. const props = defineProps({
  194. visible: {
  195. type: Boolean,
  196. default: false
  197. },
  198. personInfo: {
  199. type: Object,
  200. default: () => ({})
  201. },
  202. dateRange: {
  203. type: Array,
  204. default: () => []
  205. }
  206. });
  207. // 定义事件
  208. const emit = defineEmits(['update:visible', 'close']);
  209. // 响应式数据
  210. const recordListOpen = ref(false);
  211. const recordListLoading = ref(false);
  212. const recordListTitle = ref("出入境记录列表");
  213. const recordList = ref([]);
  214. const recordDetailOpen = ref(false);
  215. const detailTitle = ref("详细信息");
  216. const detailForm = ref({});
  217. // 监听 visible 属性变化
  218. watch(() => props.visible, (newVal) => {
  219. recordListOpen.value = newVal;
  220. if (newVal && props.personInfo) {
  221. loadRecordList();
  222. }
  223. });
  224. // 监听对话框关闭
  225. watch(() => recordListOpen.value, (newVal) => {
  226. if (!newVal) {
  227. emit('update:visible', false);
  228. emit('close');
  229. }
  230. });
  231. // 加载记录列表
  232. function loadRecordList() {
  233. if (!props.personInfo || !props.personInfo.idNumber) {
  234. console.error('缺少人员信息');
  235. return;
  236. }
  237. recordListLoading.value = true;
  238. // 准备查询参数
  239. const params = {};
  240. if (props.dateRange && props.dateRange.length === 2) {
  241. params.startDate = props.dateRange[0];
  242. params.endDate = props.dateRange[1];
  243. }
  244. // 添加证件号码参数
  245. params.idNumber = props.personInfo.idNumber;
  246. getRecords(params).then(response => {
  247. const records = response.rows || response.data || [];
  248. recordList.value = records;
  249. recordListTitle.value = `${props.personInfo.fullName}的出入境记录列表 (${records.length}条记录)`;
  250. }).catch(error => {
  251. console.error('获取出入境记录失败:', error);
  252. recordList.value = [];
  253. recordListTitle.value = `${props.personInfo.fullName}的出入境记录列表 (0条记录)`;
  254. }).finally(() => {
  255. recordListLoading.value = false;
  256. });
  257. }
  258. // 处理记录列表行点击事件
  259. function handleRecordRowClick(recordRow) {
  260. detailForm.value = {...recordRow};
  261. detailTitle.value = `详细信息 - ${recordRow.fullName}`;
  262. recordDetailOpen.value = true;
  263. }
  264. </script>