This commit is contained in:
Teo
2025-09-17 20:14:48 +08:00
parent 9c4cdc5e92
commit 11ea1ee454
6 changed files with 178 additions and 49 deletions

View File

@ -48,3 +48,11 @@ export function recognizeBankCard(data: any) {
data: data
});
}
//识别人脸
export function recognizeFace(data: any) {
return request({
url: '/contractor/constructionUser/face/recognize',
method: 'post',
data: data
});
}

View File

@ -16,6 +16,16 @@ export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => {
params: query
});
};
/**
* 查询用户列表
* @param query
*/
export const appUserType = (userId, appUserType) => {
return request({
url: '/system/user/appUserType/' + userId + '/' + appUserType,
method: 'put'
});
};
/**
* 通过用户ids查询用户

View File

@ -41,7 +41,7 @@
</template>
<script setup lang="ts">
import { listByIds, delOss, recognizeidCard, recognizeBankCard } from '@/api/system/oss';
import { listByIds, delOss, recognizeidCard, recognizeBankCard, recognizeFace } from '@/api/system/oss';
import { OssVO } from '@/api/system/oss/types';
import { propTypes } from '@/utils/propTypes';
import { globalHeaders } from '@/utils/request';
@ -64,6 +64,11 @@ const props = defineProps({
type: Boolean,
default: true
},
// 是否支持压缩,默认否
compressSupport: {
type: Boolean,
default: false
},
isGo: {
type: Boolean,
default: false
@ -73,11 +78,6 @@ const props = defineProps({
type: String,
default: ''
},
// 是否支持压缩,默认否
compressSupport: {
type: Boolean,
default: false
},
// 压缩目标大小单位KB。默认300KB以上文件才压缩并压缩至300KB以内
compressTargetSize: propTypes.number.def(300),
idCardType: {
@ -96,7 +96,6 @@ const dialogVisible = ref(false);
const baseUrl = props.isGo ? import.meta.env.VITE_APP_BASE_API_GO : import.meta.env.VITE_APP_BASE_API;
const uploadImgUrl = ref(baseUrl + (props.action ? props.action : '/resource/oss/upload')); // 上传的图片服务器地址
console.log('🚀 ~ uploadImgUrl:', uploadImgUrl.value, baseUrl, props.action);
const headers = ref(globalHeaders());
const fileList = ref<any[]>([]);
@ -188,7 +187,6 @@ const handleExceed = () => {
const handleUploadSuccess = async (res: any, file: UploadFile) => {
if (res.code === 200) {
uploadList.value.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId });
uploadedSuccessfully();
if (props.idCardType) {
const formData = new FormData();
formData.append('file', file.raw); // 假设后端接收的字段名为file
@ -197,8 +195,11 @@ const handleUploadSuccess = async (res: any, file: UploadFile) => {
if (res.code === 200) {
proxy?.$modal.msgSuccess('身份证识别成功');
emit('success', res.data);
uploadedSuccessfully();
} else {
proxy?.$modal.msgError('身份证识别失败');
proxy?.$modal.closeLoading();
return;
}
}
if (props.idCardType === 'bank') {
@ -206,10 +207,27 @@ const handleUploadSuccess = async (res: any, file: UploadFile) => {
if (res.code === 200) {
proxy?.$modal.msgSuccess('银行卡识别成功');
emit('success', res.data);
uploadedSuccessfully();
} else {
proxy?.$modal.msgError('银行卡识别失败');
proxy?.$modal.closeLoading();
return;
}
}
if (props.idCardType === 'face') {
const res = await recognizeFace(formData);
if (res.code === 200) {
proxy?.$modal.msgSuccess('人脸识别成功');
emit('success', res.data);
uploadedSuccessfully();
} else {
console.log('人脸识别失败', res);
proxy?.$modal.closeLoading();
return;
}
}
} else {
uploadedSuccessfully();
}
} else {
number.value--;

View File

@ -4,9 +4,6 @@
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="110px">
<el-form-item label="道路编号" prop="roadCode">
<el-input v-model="queryParams.roadCode" placeholder="请输入道路编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="道路名称" prop="roadName">
<el-input v-model="queryParams.roadName" placeholder="请输入道路名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
@ -40,7 +37,14 @@
class="upload-demo"
:http-request="handleImport"
:show-file-list="false"
/>
>
<template #trigger>
<el-button plain type="primary" icon="upload">导入excel</el-button>
</template>
</el-upload>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Download" @click="exportFile">导出模版</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@ -49,10 +53,10 @@
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="道路编号" align="center" prop="roadCode" />
<el-table-column label="道路名称" align="center" prop="roadName" />
<el-table-column label="设计新建道路长度" align="center" prop="designCreateLength" />
<el-table-column label="设计改扩建长度" align="center" prop="designUpdateLength" />
<el-table-column label="需流转总长度" align="center" prop="changeLength" />
<el-table-column label="需要流转总面积" align="center" prop="changeArea" />
<el-table-column label="设计新建道路长度(米)" align="center" prop="designCreateLength" />
<el-table-column label="设计改扩建长度(米)" align="center" prop="designUpdateLength" />
<el-table-column label="需流转总长度(米)" align="center" prop="changeLength" />
<el-table-column label="需要流转总面积(亩)" align="center" prop="changeArea" />
<el-table-column label="对应地块" align="center" prop="landName" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
@ -69,24 +73,21 @@
</el-card>
<!-- 添加或修改进场道路信息对话框 -->
<el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="enterRoadFormRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="道路编号" prop="roadCode">
<el-input v-model="form.roadCode" placeholder="请输入道路编号" />
</el-form-item>
<el-form ref="enterRoadFormRef" :model="form" :rules="rules" label-width="150px">
<el-form-item label="道路名称" prop="roadName">
<el-input v-model="form.roadName" placeholder="请输入道路名称" />
</el-form-item>
<el-form-item label="设计新建道路长度" prop="designCreateLength">
<el-input v-model="form.designCreateLength" placeholder="请输入设计新建道路长度" />
<el-form-item label="设计新建道路长度(米)" prop="designCreateLength">
<el-input v-model="form.designCreateLength" type="number" placeholder="请输入设计新建道路长度" />
</el-form-item>
<el-form-item label="设计改扩建长度" prop="designUpdateLength">
<el-input v-model="form.designUpdateLength" placeholder="请输入设计改扩建长度" />
<el-form-item label="设计改扩建长度(米)" prop="designUpdateLength">
<el-input v-model="form.designUpdateLength" type="number" placeholder="请输入设计改扩建长度" />
</el-form-item>
<el-form-item label="需流转总长度" prop="changeLength">
<el-input v-model="form.changeLength" placeholder="请输入需流转总长度" />
<el-form-item label="需流转总长度(米)" prop="changeLength">
<el-input v-model="form.changeLength" type="number" placeholder="请输入需流转总长度" />
</el-form-item>
<el-form-item label="需要流转总面积" prop="changeArea">
<el-input v-model="form.changeArea" placeholder="请输入需要流转总面积" />
<el-form-item label="需要流转总面积(亩)" prop="changeArea">
<el-input v-model="form.changeArea" type="number" placeholder="请输入需要流转总面积" />
</el-form-item>
<el-form-item label="对应地块" prop="landBlockId">
<el-select v-model="form.landBlockId" clearable placeholder="请选择对应地块">
@ -96,7 +97,7 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button :loading="buttonLoading" type="primary" v-hasPermi="['land:enterRoad:add']" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
@ -105,7 +106,7 @@
</template>
<script setup name="EnterRoad" lang="ts">
import { listEnterRoad, getEnterRoad, delEnterRoad, addEnterRoad, updateEnterRoad } from '@/api/system/landTransfer/enterRoad';
import { listEnterRoad, getEnterRoad, delEnterRoad, addEnterRoad, updateEnterRoad, importEnterRoad } from '@/api/system/landTransfer/enterRoad';
import { EnterRoadVO, EnterRoadQuery, EnterRoadForm } from '@/api/system/landTransfer/enterRoad/types';
import { listLandBlock } from '@/api/system/landTransfer/landBlock';
import { useUserStoreHook } from '@/store/modules/user';
@ -133,7 +134,7 @@ const dialog = reactive<DialogOption>({
const initFormData: EnterRoadForm = {
id: undefined,
projectId: currentProject.value.id,
projectId: currentProject.value?.id,
roadCode: undefined,
roadName: undefined,
designCreateLength: undefined,
@ -147,7 +148,7 @@ const data = reactive<PageData<EnterRoadForm, EnterRoadQuery>>({
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: currentProject.value.id,
projectId: currentProject.value?.id,
roadCode: undefined,
roadName: undefined,
designCreateLength: undefined,
@ -180,7 +181,7 @@ const getListLand = async () => {
const res = await listLandBlock({
pageNum: 1,
pageSize: 10000,
projectId: currentProject.value.id
projectId: currentProject.value?.id
});
landBlockList.value = res.rows;
};
@ -207,6 +208,24 @@ const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
const exportFile = () => {
// 导出模版文件
try {
// 创建a标签
const link = document.createElement('a');
// 设置PDF文件路径 - 相对于public目录
link.href = '/daolu.xlsx';
// 设置下载后的文件名
link.download = '道路信息导入模版.xlsx';
// 触发点击
document.body.appendChild(link);
link.click();
// 清理
document.body.removeChild(link);
} catch (error) {
alert('下载失败,请重试');
}
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: EnterRoadVO[]) => {
ids.value = selection.map((item) => item.id);
@ -259,7 +278,7 @@ const handleDelete = async (row?: EnterRoadVO) => {
//监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value.id,
() => currentProject.value?.id,
(nid, oid) => {
queryParams.value.projectId = nid;
getListLand();
@ -267,6 +286,46 @@ const listeningProject = watch(
}
);
// 导入文件
const handleImport = (options: any) => {
loading.value = true;
let formData = new FormData();
formData.append('file', options.file);
importEnterRoad(currentProject.value?.id, formData)
.then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess(res.msg || '导入成功');
getListLand();
getList();
}
})
.catch((err) => {
proxy.$modal.msgError(err.msg || '导入失败');
})
.finally(() => {
loading.value = false;
});
};
// 下载模板
const downloadTemplate = () => {
// 导出模版文件
try {
// 创建a标签
const link = document.createElement('a');
// 设置PDF文件路径 - 相对于public目录
link.href = '/enterRoad.xlsx';
// 设置下载后的文件名
link.download = '道路信息导入模板.xlsx';
// 触发点击
document.body.appendChild(link);
link.click();
// 清理
document.body.removeChild(link);
} catch (error) {
alert('下载失败,请重试');
}
};
onUnmounted(() => {
listeningProject();
});

View File

@ -118,6 +118,9 @@
<el-table-column label="操作" fixed="right" width="230" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip v-if="scope.row.userId !== 1" content="权限" placement="top">
<el-button v-hasPermi="['system:user:edit']" link type="warning" icon="Edit" @click="handleUpdate1(scope.row)"></el-button>
</el-tooltip>
<el-tooltip v-if="scope.row.userId !== 1" content="修改" placement="top">
<el-button v-hasPermi="['system:user:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
</el-tooltip>
@ -234,11 +237,28 @@
</span>
</template>
</el-dialog>
<el-dialog title="修改人员权限" v-model="userTypeShow" width="30%" destroy-on-close>
<el-form ref="userFormRef" :model="form" :rules="rules" label-width="80px" size="large">
<el-form-item label="用户权限">
<el-radio-group v-model="userType">
<el-radio value="2" size="large">分包人员</el-radio>
<el-radio value="1" size="large">管理人员</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<span>
<el-button @click="userTypeShow = false">取消</el-button>
<el-button type="primary" @click="onUserTypeSubmit">确定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup name="User" lang="ts">
import api, { uploadCertList } from '@/api/system/user';
import api, { uploadCertList, appUserType } from '@/api/system/user';
import { UserForm, UserQuery, UserVO } from '@/api/system/user/types';
import { DeptTreeVO, DeptVO } from '@/api/system/dept/types';
import { RoleVO } from '@/api/system/role/types';
@ -271,6 +291,8 @@ const roleOptions = ref<RoleVO[]>([]);
const projectOptions = ref<any[]>([]);
const editInfoRef = ref<InstanceType<typeof editInfo> | null>(null);
const roleInfoRef = ref<InstanceType<typeof roleInfo> | null>(null);
const userTypeShow = ref(false);
const userType = ref('');
/*** 用户导入参数 */
const upload = reactive<ImportOption>({
// 是否显示弹出层(用户导入)
@ -308,7 +330,7 @@ const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const userId = ref();
const initFormData: UserForm = {
userId: undefined,
deptId: undefined,
@ -408,7 +430,20 @@ const getList = async () => {
userList.value = res.rows;
total.value = res.total;
};
const onUserTypeSubmit = async () => {
if (userType.value != '') {
const res = await appUserType(userId.value, userType.value);
if (res.code == 200) {
ElMessage.success('设置成功');
userTypeShow.value = false;
userType.value = '';
} else {
ElMessage.error(res.msg);
}
} else {
userTypeShow.value = false;
}
};
/** 查询部门下拉树结构 */
const getDeptTree = async () => {
const res = await api.deptTreeSelect({ isShow: '1' });
@ -593,7 +628,10 @@ const handleAdd = async () => {
postOptions.value = data.posts;
form.value.password = initPassword.value.toString();
};
const handleUpdate1 = async (row?: UserForm) => {
userTypeShow.value = true;
userId.value = row.userId;
};
/** 修改按钮操作 */
const handleUpdate = async (row?: UserForm) => {
reset();

View File

@ -73,12 +73,8 @@ import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import ApprovalButton from '@/components/Process/approvalButton.vue';
import { AxiosResponse } from 'axios';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
import { useUserStoreHook } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const buttonLoading = ref(false);
const loading = ref(true);
const leaveTime = ref<Array<string>>([]);
@ -104,27 +100,27 @@ const options = [
];
const flowCodeOptions = [
{
value: currentProject.value.id + '_leave1',
value: 'leave1',
label: '请假申请-普通'
},
{
value: currentProject.value.id + '_leave2',
value: 'leave2',
label: '请假申请-排他网关'
},
{
value: currentProject.value.id + '_leave3',
value: 'leave3',
label: '请假申请-并行网关'
},
{
value: currentProject.value.id + '_leave4',
value: 'leave4',
label: '请假申请-会签'
},
{
value: currentProject.value.id + '_leave5',
value: 'leave5',
label: '请假申请-并行会签网关'
},
{
value: currentProject.value.id + '_leave6',
value: 'leave6',
label: '请假申请-排他并行会签'
}
];