1
This commit is contained in:
@ -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
|
||||
});
|
||||
}
|
||||
|
||||
@ -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查询用户
|
||||
|
||||
@ -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--;
|
||||
|
||||
@ -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();
|
||||
});
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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: '请假申请-排他并行会签'
|
||||
}
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user