This commit is contained in:
lonewolfyx 2025-01-06 09:11:08 +08:00
parent 6628970dde
commit d703bd2a4a
15 changed files with 1133 additions and 722 deletions

View File

@ -1,51 +1,87 @@
import request from '@/utils/request' import request from '@/utils/request'
import { parseStrEmpty } from "@/utils/ruoyi";
// 查询 列表 // 获取列表数据
export function BAApplyList(data,query) { export const getVisitList = (data, params) => {
return request({ return request({
url: '/bussiness/Apply/list', url: '/visiting/visit/list',
method: 'post', method: 'post',
params: query, params,
data: data, data,
isEncrypt: false isEncrypt: false
}) })
}
// 查询详情
export function getBAApplyInfo(query) {
return request({
url: '/bussiness/Apply/info?id=' + query,
method: 'get',
// params: query
})
} }
// 新增 // 新增访问记录
export const addVisit = (data) => {
export function createBAApply(data) { return request({
return request({ url: '/visiting/visit/add',
url: '/bussiness/Apply/add', method: 'post',
method: 'post', data,
data: data, isEncrypt: false
isEncrypt: false })
})
} }
// 修改 // 获取访问详情
export function editBAApply(data) { export const getVisitInfo = (id) => {
return request({ return request({
url: '/bussiness/Apply/edit', method: 'get',
method: 'post', url: '/visiting/visit/info',
data: data, params: {
isEncrypt: false id: id
}) }
})
} }
// 删除 // 更新访问内容
export function deleteBAApply(id) { export const updateVisit = (data) => {
return request({ return request({
url: '/bussiness/Apply/remove?ids=' + id, method: 'post',
method: 'post', url: '/visiting/visit/edit',
isEncrypt: false data: data,
}) isEncrypt: false
})
} }
// 取消访问记录
export const deleteVisit = (id) => {
return request({
method: 'post',
url: '/visiting/visit/remove',
params: {
ids: id
}
})
}
// 获取来访登记列表
export const getRegisterList = () => {
return request({
url: '/visiting/visit/list_register_visitors',
method: 'get',
params: {
// since: dayjs().format('YYYY-MM-DD')
since: '2024-12-24'
},
isEncrypt: false
})
}
// 获取历史上访列表
export const getHistoryList = (code) => {
return request({
method: 'get',
url: '/visiting/visit/list_visitor_history',
params: {
id_card: code
},
isEncrypt: false
})
}
// 导出访问记录
export const exportVisit = () => {
return request({
method: 'post',
url: '/visiting/visit/export'
})
}

View File

@ -38,7 +38,8 @@ export function addMenu(data) {
return request({ return request({
url: '/system/menu', url: '/system/menu',
method: 'post', method: 'post',
data: data data: data,
isEncrypt:false
}) })
} }

View File

@ -7,6 +7,9 @@
</template> </template>
<script setup> <script setup>
defineOptions({
name:'DividerHeader'
})
const {title} = defineProps(['title']) const {title} = defineProps(['title'])
</script> </script>

View File

@ -1,249 +0,0 @@
<template>
<div class="app-container">
<!-- 表单区域 -->
<el-form ref="queryParamsRef" :inline="true" :model="queryParams">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="相关领域">
<el-select v-model="queryParams.casetype" style="width: 15vw;" @change="getLists" clearable>
<el-option
v-for="item in nj_anjian_type"
: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-select v-model="queryParams.casetype" style="width: 15vw;" @change="getLists" clearable>
<el-option
v-for="item in nj_anjian_type"
: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-select v-model="queryParams.casetype" style="width: 15vw;" @change="getLists" clearable>
<el-option
v-for="item in nj_anjian_type"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-button type="primary" @click="getLists">
<el-icon class="me-1">
<Search />
</el-icon>
查询
</el-button>
</el-form-item>
<el-form-item>
<el-button @click="handleRest(queryParamsRef)">
<el-icon class="me-1">
<Refresh />
</el-icon>
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-divider class="mt-0" />
<el-row class="mb-3" :gutter="10">
<el-col :span="1.5">
<el-space>
<el-button plain type="primary" @click="AddEditRegistVisitRef.showAddCase()">
<el-icon class="me-2">
<Plus />
</el-icon>
新增
</el-button>
</el-space>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="Upload" @click="uploadRef.showupload()">导入</el-button>
<Upload ref="uploadRef" @getList="getLists" />
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<!-- 表格区域 -->
<el-table
ref="CaseTableRef"
v-loading="loading"
:data="CaseTables"
@row-dblclick="handleRowDblClick"
show-overflow-tooltip
>
<el-table-column label="日期" prop="name" />
<el-table-column label="上访人" prop="name" />
<el-table-column label="电话" prop="casetype" />
<el-table-column label="身份证号码" prop="unitname" />
<el-table-column label="反映事项" prop="state">
<template #default="scope">
<dict-tag :options="nj_anjian_status" :value="scope.row.state" />
</template>
</el-table-column>
<el-table-column label="是否重点对象" prop="state">
<template #default="scope">
<dict-tag :options="nj_anjian_status" :value="scope.row.state" />
</template>
</el-table-column>
<el-table-column label="级别" prop="state" width="80">
<template #default="scope">
<dict-tag :options="nj_anjian_status" :value="scope.row.state" />
</template>
</el-table-column>
<el-table-column label="处理情况" prop="depname"/>
<el-table-column fixed="right" align="center" label="操作" width="240">
<template #default="scope">
<!-- <el-button link size="small" type="warning">
<el-icon class="me-1">
<UserFilled />
</el-icon>
上访人管理
</el-button> -->
<el-button link size="small" type="primary" @click="AddEditRegistVisitRef.showEditCase(scope.row)">
<el-icon class="me-1">
<Edit />
</el-icon>
编辑
</el-button>
<el-button link size="small" type="warning" @click="AddEditRegistVisitRef.showEditCase(scope.row)">
<el-icon class="me-1">
<Edit />
</el-icon>
详情
</el-button>
<el-button link size="small" type="danger" @click="deleteCase(scope.row)">
<el-icon class="me-1">
<Delete />
</el-icon>
取消
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
v-model:page="paging.pageNum"
v-model:limit="paging.pageSize"
@pagination="getLists"
/>
<AddEditRegistVisit ref="AddEditRegistVisitRef" @getList="getLists" />
</div>
</template>
<script setup>
import { ElMessageBox } from "element-plus";
import AddEditRegistVisit from "./components/AddEditRegistVisit.vue";
import Upload from "./components/upload.vue"; //
import { getCurrentInstance } from "vue";
import PageEnum from "@/enum/PageEnum.js";
const { proxy } = getCurrentInstance();
const { nj_anjian_type, nj_anjian_status } = proxy.useDict("nj_anjian_type", "nj_anjian_status");
const isShow = ref(true);
const queryParamsRef = ref();
const deleteStatus = ref(true);
const AddEditRegistVisitRef = ref();
const uploadRef = ref();
const upload = ref({});
const loading = ref(false);
const paging = ref({
pageNum: 1,
pageSize: PageEnum.SIZE,
});
const queryParams = ref({
name: "",
casecode: "",
brief: "",
state: "1,2",
});
const total = ref(0);
const CaseTables = ref([
{
name: "1",
},
{
name: "2",
},
]);
onMounted(() => {
getLists();
});
//
const getLists = async () => {
// loading.value = true
// await getCaseInfoList(queryParams.value, paging.value).then(res => {
// CaseTables.value = res.rows
// total.value = res.total
// loading.value = false
// })
};
//
const handleRowDblClick = (row) => {
console.log("双击的行数据:", row);
AddEditRegistVisitRef.value.showAddCase(row)
//
};
const deleteCase = async (row) => {
ElMessageBox.confirm("确定删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
// deleteCaseInfo(row.caseCaseinfoId).then((res) => {
// getLists();
// });
})
.catch(() => {});
};
/** 导出按钮操作 */
function handleExport() {
// proxy.download("system/user/export", {
// ...queryParams.value,
// }, `user_${new Date().getTime()}.xlsx`);
}
//
const handleRest = (formEl) => {
queryParams.value = {
name: "",
casecode: "",
brief: "",
state: "1,2",
};
getLists();
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,384 @@
<template>
<el-drawer
v-model="isShow"
title="来访登记"
:destroy-on-close="true"
size="50%"
:close-on-press-escape="false"
:close-on-click-modal="false"
:show-close="false"
>
<template
v-if="showRegistrationList"
>
<el-button type="primary" @click="showFormHandle">新增来访登记</el-button>
<div class="el-collapse">
<div class="items" v-for="item in registerList" :key="item.jwCheckinloginId">
<span>{{ item.name }} - {{ item.sfzId }}</span>
<div>
<el-button :icon="ArrowRight" circle @click="carryHandle(item)"/>
</div>
</div>
</div>
</template>
<el-form
ref="queryParamsRef"
:model="queryParams"
label-width="auto"
label-position="left"
require-asterisk-position="right"
:rules="rules"
:disabled="isView"
v-if="showRegistration"
>
<DividerHeader title="基本信息"/>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="姓名" required prop="visitorName">
<el-input placeholder="请填写上访人姓名" v-model="queryParams.visitorName"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上访时间">
<el-date-picker
v-model="queryParams.visitTime"
type="datetime"
placeholder="请选择上访时间"
value-format="YYYY-MM-DD hh:mm:ss"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电话">
<el-input placeholder="请填写上访人电话号码" v-model="queryParams.visitorMobile"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作单位或住址">
<el-input placeholder="请填写上访人工作单位或住址" v-model="queryParams.visitorContact"/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-row :gutter="24">
<el-col :span="19">
<el-form-item label="身份证号码">
<el-input
placeholder="请填写上访人身份证号码"
v-model="queryParams.visitorCode"
type="number"
@change="idCardChangeHandle"
/>
</el-form-item>
</el-col>
<el-col :span="3">
<!-- @click="visitHistoryRef.showVisitHistory(queryForm.sfzId)" -->
<el-button
type="primary"
:disabled="viewHistoryDisable"
@click="visitHistoryRef.showVisitHistory(queryParams.visitorCode)"
>
历史信访记录
</el-button>
</el-col>
</el-row>
</el-col>
</el-row>
<DividerHeader title="上访情况"/>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="来访类型" required prop="type">
<el-select
v-model="queryParams.type"
placeholder="请选择来访类型"
>
<el-option
v-for="item in visit_type"
:label="item.label"
:value="item.value"
:key="item.label"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12"></el-col>
<el-col :span="12">
<el-form-item label="反映事项" required label-position="top" prop="demand">
<el-input
placeholder="请填写反映事项"
type="textarea"
v-model="queryParams.demand"
:autosize="{ minRows: 3, maxRows: 9999 }"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="答复口径" required label-position="top" prop="reply">
<el-input
placeholder="请填写答复口径"
type="textarea"
v-model="queryParams.reply"
:autosize="{ minRows: 3, maxRows: 9999 }"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="相关领域" label-position="top">
<el-select
v-model="queryParams.field"
placeholder="请选择领域"
>
<el-option
v-for="item in visit_field"
:label="item.label"
:value="item.value"
:key="item.label"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="答复形式" label-position="top">
<el-select
v-model="queryParams.replyType"
placeholder="请选择答复形式"
>
<el-option
v-for="item in visit_reply_type"
:label="item.label"
:value="item.value"
:key="item.label"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否重点人员" label-position="top">
<el-radio-group v-model="queryParams.isKeyPerson">
<el-radio-button
v-for="item in boolean_yes_no"
:value="item.value"
:key="item.label"
:label="item.label"
/>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="级别" label-position="top">
<el-select
v-model="queryParams.level"
placeholder="请选择来访级别"
>
<el-option
v-for="item in visit_level"
:label="item.label"
:value="item.value"
:key="item.label"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button type="primary" @click="updateHandle(queryParamsRef)" v-if="isEdit">提交</el-button>
<el-button type="primary" @click="createHandle(queryParamsRef)" v-if="isCreate">提交</el-button>
<el-button @click="changeShowStatus">关闭</el-button>
</template>
</el-drawer>
<VisitHistory ref="visitHistoryRef"/>
</template>
<script setup>
import {getCurrentInstance, useTemplateRef} from 'vue';
import {addVisit, getRegisterList, getVisitInfo, updateVisit} from '@/api/RegistVisitApi/RegistVisitApi.js';
import dayjs from 'dayjs';
import DividerHeader from '@/components/DividerHeader/DividerHeader.vue';
import {ArrowRight} from '@element-plus/icons-vue';
import VisitHistory from '@/views/PoliceWork/RegisterVisit/components/VisitHistory.vue';
defineOptions({
name: 'AddEditRegisterVisit'
})
const {proxy} = getCurrentInstance();
const {
boolean_yes_no,
visit_level,
visit_reply_type,
visit_field,
visit_type,
} = proxy.useDict('boolean_yes_no', 'visit_level', 'visit_field', 'visit_type', 'visit_reply_type')
const emit = defineEmits(['refresh'])
const queryParamsRef = useTemplateRef('queryParamsRef')
const visitHistoryRef = useTemplateRef('visitHistoryRef')
const isShow = ref(false)
const isEdit = ref(false)
const isView = ref(false)
const isCreate = ref(false)
const showRegistrationList = ref(true)
const showRegistration = ref(false)
//
const viewHistoryDisable = ref(true)
const defaultParams = {
//
visitorName: '',
// 访
visitTime: '',
//
visitorMobile: '',
//
visitorContact: '',
//
visitorCode: '',
//
demand: '',
// 访
type: '',
//
field: '',
//
reply: '',
//
replyType: '',
//
isKeyPerson: '1',
//
level: ''
}
const queryParams = ref({...defaultParams})
const registerList = ref([])
const rules = reactive({
visitorName: [{required: true, message: '请填写来访人姓名', trigger: 'blur'}],
type: [{required: true, message: '请填写电话', trigger: 'blur'}],
demand: {required: true, message: '请填写反映事项', trigger: 'blur'},
reply: {required: true, message: '请填写答复口径', trigger: 'blur'}
})
//
const changeShowStatus = () => {
isShow.value = !isShow.value
if (!isShow.value) {
queryParams.value = {...defaultParams}
isEdit.value = false;
isView.value = false;
isCreate.value = false;
showRegistrationList.value = true;
showRegistration.value = false;
}
}
// 访
const showAddRegisterVisit = async () => {
changeShowStatus()
await getRegisterVisitList()
}
// 访
const showEditRegisterVisit = async (row) => {
changeShowStatus()
showRegistrationList.value = false;
showRegistration.value = true;
isEdit.value = true;
await getDetail(row)
}
//
const showDetail = async (row) => {
changeShowStatus()
showRegistrationList.value = false;
showRegistration.value = true;
isView.value = true;
await getDetail(row)
}
defineExpose({showAddRegisterVisit, showEditRegisterVisit, showDetail})
const showFormHandle = () => {
isCreate.value = true;
showRegistrationList.value = false;
showRegistration.value = true;
}
const carryHandle = (row) => {
isCreate.value = true;
showRegistrationList.value = false;
showRegistration.value = true;
queryParams.value = {
...queryParams.value,
visitorName: row.name,
visitorCode: row.sfzId,
visitTime: dayjs().format('YYYY-MM-DD hh:mm:ss'),
visitorContact: row.address
}
idCardChangeHandle(row.sfzId)
}
// 访
const getRegisterVisitList = async () => {
const res = await getRegisterList()
registerList.value = res.data
console.log(res.data)
}
//
const getDetail = async (row) => {
const res = await getVisitInfo(row.visitId)
queryParams.value = res.data;
queryParams.value.visitTime = dayjs(res.data.visitTime).format('YYYY-MM-DD hh:mm:ss')
idCardChangeHandle(res.data.visitorCode)
console.log(res)
}
// 访
const createHandle = async (elForm) => {
if (!elForm) return
await elForm.validate(async (valid, fields) => {
if (valid) {
await addVisit(queryParams.value)
changeShowStatus()
emit('refresh')
console.log(queryParams.value)
}
})
}
// 访
const updateHandle = async (elForm) => {
if (!elForm) return
await elForm.validate(async (valid, fields) => {
if (valid) {
await updateVisit(queryParams.value)
changeShowStatus()
emit('refresh')
console.log(queryParams.value)
}
})
}
//
const idCardChangeHandle = (value) => {
viewHistoryDisable.value = !value;
}
</script>
<style scoped lang="scss">
.el-collapse {
.items {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
border-bottom: 1px solid var(--el-collapse-border-color);
}
}
</style>

View File

@ -0,0 +1,63 @@
<template>
<el-drawer
v-model="isShow"
title="历史上访记录"
:destroy-on-close="true"
size="50%"
:close-on-press-escape="false"
:close-on-click-modal="false"
:show-close="false"
>
<el-table
:data="tableData"
v-loading="loading"
>
<el-table-column label="接待场所" prop="policeareaId" width="180"/>
<el-table-column label="执勤法警" prop="adduserId" width="180"/>
<el-table-column label="来访人" prop="name" width="180"/>
<el-table-column label="来访日期" prop="checkintime" width="180"/>
<el-table-column label="信访情况" prop="checkininfo" width="180"/>
</el-table>
<template #footer>
<el-button @click="changeShowStatus">关闭</el-button>
</template>
</el-drawer>
</template>
<script setup>
import {getHistoryList} from '@/api/RegistVisitApi/RegistVisitApi.js';
defineOptions({
name: 'VisitHistory'
})
const isShow = ref(false);
const loading = ref(false)
const visitorCode = ref('')
const tableData = ref([])
//
const changeShowStatus = () => {
isShow.value = !isShow.value
if (!isShow.value) {
visitorCode.value = '';
tableData.value = [];
}
}
const showVisitHistory = async (code) => {
changeShowStatus()
visitorCode.value = code;
const res = await getHistoryList(code)
console.log(res)
tableData.value = res.data
}
defineExpose({showVisitHistory});
</script>
<style scoped lang="scss">
</style>

View File

@ -1,6 +1,7 @@
<template> <template>
<el-dialog :title="upload.title" v-model="isShow" width="400px" append-to-body> <el-dialog :title="upload.title" v-model="isShow" width="400px" append-to-body>
<el-upload <el-upload
ref="uploadRef"
:limit="1" :limit="1"
accept=".xlsx, .xls" accept=".xlsx, .xls"
:headers="upload.headers" :headers="upload.headers"
@ -9,21 +10,22 @@
:on-progress="handleFileUploadProgress" :on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess" :on-success="handleFileSuccess"
:auto-upload="false" :auto-upload="false"
name="importFile"
drag drag
> >
<el-icon class="el-icon--upload"> <el-icon class="el-icon--upload">
<upload-filled /> <upload-filled/>
</el-icon> </el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div> <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip> <template #tip>
<div class="el-upload__tip text-center"> <div class="el-upload__tip text-center">
<div class="el-upload__tip"> <!-- <div class="el-upload__tip">-->
<el-checkbox v-model="upload.updateSupport" /> <!-- <el-checkbox v-model="upload.updateSupport"/>-->
是否更新已经存在的用户数据 <!-- 是否更新已经存在的用户数据-->
</div> <!-- </div>-->
<span>仅允许导入xlsxlsx格式文件</span> <span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
@click="importTemplate">下载模板 @click="importTemplate">下载模板
</el-link> </el-link>
</div> </div>
</template> </template>
@ -38,14 +40,20 @@
</template> </template>
<script setup> <script setup>
import {ref, defineProps} from 'vue'; import {getCurrentInstance, ref} from 'vue';
import {getToken} from '@/utils/auth.js';
const {proxy} = getCurrentInstance();
const emit = defineEmits(['refresh'])
const uploadRef = ref('')
const isShow = ref(false); // / const isShow = ref(false); // /
const fileList = ref([])
const upload = ref({ const upload = ref({
title: '用户导入', title: '用户导入',
url: 'upload_url_here', // API url: import.meta.env.VITE_APP_BASE_API + '/visiting/visit/import', // API
isUploading: false, isUploading: false,
headers: {}, // headers headers: {Authorization: 'Bearer ' + getToken()}, // headers
updateSupport: false, // updateSupport: false, //
}); });
const TemplateDownUrl = ref('/导入模版.xlsx'); // / const TemplateDownUrl = ref('/导入模版.xlsx'); // /
@ -59,23 +67,27 @@ const showupload = () => {
defineExpose({showupload}) defineExpose({showupload})
// //
const submitFileForm = () => { const submitFileForm = () => {
console.log("提交文件..."); console.log('提交文件...');
// //
proxy.$refs['uploadRef'].submit();
isShow.value = false; // isShow.value = false; //
}; };
/** 下载模板操作 */
function importTemplate() { /** 下载模板操作 */
function importTemplate() {
window.open(TemplateDownUrl.value, '_blank'); window.open(TemplateDownUrl.value, '_blank');
} }
// //
const handleFileUploadProgress = (progressEvent) => { const handleFileUploadProgress = (progressEvent) => {
console.log("上传进度:", progressEvent); console.log('上传进度:', progressEvent);
}; };
// //
const handleFileSuccess = (response, file, fileList) => { const handleFileSuccess = (response, file, fileList) => {
console.log("上传成功:", response); console.log('上传成功:', response);
// //
emit('getList'); proxy.$refs['uploadRef'].handleRemove(file);
emit('refresh');
}; };
</script> </script>

View File

@ -0,0 +1,164 @@
<template>
<div class="app-container">
<el-row class="mb-3">
<el-col :span="24">
<el-space>
<el-button type="primary" plain @click="AddEditRegisterVisitRef.showAddRegisterVisit()">
<el-icon class="me-2">
<Plus/>
</el-icon>
新增
</el-button>
<el-button type="warning" plain @click="handleExport()">
<el-icon class="me-2">
<Download/>
</el-icon>
导出
</el-button>
<el-button type="info" plain @click="uploadRef.showupload()">
<el-icon class="me-2">
<Upload/>
</el-icon>
导入
</el-button>
<upload ref="uploadRef" @refresh="getLists" />
</el-space>
</el-col>
</el-row>
<!-- 表格区域 -->
<el-table
ref="tableDataRef"
v-loading="loading"
:data="tableData"
show-overflow-tooltip
>
<el-table-column label="日期" prop="visitTime" width="230">
<template #default="scope">
{{ dayjs(scope.row.visitTime).format('YYYY-MM-DD hh:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="上访人" prop="visitorName" width="150"/>
<el-table-column label="电话" prop="visitorMobile" width="200"/>
<el-table-column label="工作单位或住址" prop="visitorContact" width="230"/>
<el-table-column label="身份证号码" prop="visitorCode" width="230"/>
<el-table-column label="反映事项" prop="demand" width="230"/>
<el-table-column label="历史信访" prop="state" width="230"/>
<el-table-column label="处理情况" prop="reply" width="230"/>
<el-table-column label="答复形式" prop="replyType" width="230">
<template #default="scope">
<dict-tag :options="visit_reply_type" :value="scope.row.replyType"/>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" width="230"/>
<el-table-column fixed="right" align="center" label="操作" width="240">
<template #default="scope">
<el-button link size="small" type="primary"
@click="AddEditRegisterVisitRef.showEditRegisterVisit(scope.row)">
<el-icon class="me-1">
<Edit/>
</el-icon>
编辑
</el-button>
<el-button link size="small" type="warning"
@click="AddEditRegisterVisitRef.showDetail(scope.row)">
<el-icon class="me-1">
<View/>
</el-icon>
详情
</el-button>
<el-button link size="small" type="danger" @click="deleteHandle(scope.row)">
<el-icon class="me-1">
<Delete/>
</el-icon>
取消
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
v-model:page="paging.pageNum"
v-model:limit="paging.pageSize"
@pagination="getLists"
/>
</div>
<AddEditRegisterVisit ref="AddEditRegisterVisitRef" @refresh="getLists"/>
</template>
<script setup>
import {getCurrentInstance, useTemplateRef} from 'vue';
import PageEnum from '@/enum/PageEnum.js';
import {ElMessageBox} from 'element-plus';
import AddEditRegisterVisit from '@/views/PoliceWork/RegisterVisit/components/AddEditRegisterVisit.vue';
import {deleteVisit, exportVisit, getVisitList} from '@/api/RegistVisitApi/RegistVisitApi.js';
import DictTag from '@/components/DictTag/index.vue';
import dayjs from 'dayjs';
import Upload from '@/views/PoliceWork/RegisterVisit/components/upload.vue';
const {proxy} = getCurrentInstance();
const {visit_reply_type} = proxy.useDict('visit_reply_type');
const loading = ref(false);
const paging = ref({
pageNum: 1,
pageSize: PageEnum.SIZE,
});
const queryParams = ref({
name: '',
});
const tableDataRef = useTemplateRef('tableDataRef')
const AddEditRegisterVisitRef = useTemplateRef('AddEditRegisterVisitRef')
const uploadRef = useTemplateRef('uploadRef')
const total = ref(0);
const tableData = ref([
{
name: '1'
}
])
onMounted(() => {
getLists();
});
//
const getLists = async () => {
const res = await getVisitList(queryParams.value, paging.value)
tableData.value = res.rows;
total.value = res.total
};
const deleteHandle = (row) => {
ElMessageBox.confirm('确定取消?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
await deleteVisit(row.visitId)
await getLists()
})
.catch(() => {
});
};
const handleExport = async () => {
// await exportVisit()
proxy.download('visiting/visit/export', {
...queryParams.value,
}, `user_${new Date().getTime()}.xlsx`);
}
</script>
<style lang="scss" scoped></style>

View File

@ -1,16 +1,9 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 使用修改密码弹框组件 -->
<ChangePasswordDialog
ref="showDialogBtnRef"
/>
</div> </div>
</template> </template>
<script setup> <script setup>
import ChangePasswordDialog from '@/components/ChangePassword/ChangePasswordDialog.vue';
import {PasswordIsOverTime} from "@/api/system/user";
const {proxy} = getCurrentInstance(); const {proxy} = getCurrentInstance();
@ -18,11 +11,6 @@ const showDialogBtnRef = ref()
const form = ref({}) const form = ref({})
onMounted(() => { onMounted(() => {
PasswordIsOverTime().then(res => {
if(res.data){
showDialogBtnRef.value.showDialog()
}
})
}) })
</script> </script>

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,7 @@ export default defineConfig(({mode, command}) => {
'/dev-api': { '/dev-api': {
// target: 'http://192.168.3.10:18066', //耗子本地 // target: 'http://192.168.3.10:18066', //耗子本地
target: 'http://106.15.139.36:18066', //36 VPN 转发到 3 上 target: 'http://106.15.139.36:18067', //36 VPN 转发到 3 上
changeOrigin: true, changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, ''), rewrite: (p) => p.replace(/^\/dev-api/, ''),