Browse Source

员工权限

power_master
herenshan112 5 days ago
parent
commit
ef4f7e263b
  1. 4
      src/api/DesignForm/index.ts
  2. 24
      src/api/system/roleapi/power.ts
  3. 24
      src/directive/permission/button.ts
  4. 2
      src/store/modules/user.ts
  5. 5
      src/views/hr/archives/archivescont.vue
  6. 924
      src/views/hr/archives/index.vue
  7. 200
      src/views/hr/archives/index_20251202.vue
  8. 274
      src/views/hr/archives/unitpage/addUserPage.vue
  9. 235
      src/views/hr/archives/unitpage/batchImport.vue
  10. 96
      src/views/hr/archives/unitpage/lockInfo.vue
  11. 222
      src/views/hr/archives/unitpage/uploadTemplate.vue
  12. 12
      src/views/nested/.editorconfig
  13. 1
      src/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue

4
src/api/DesignForm/index.ts

@ -63,7 +63,9 @@ export const getRequest = (apiKey: string, data?: any, options: any = {}) => {
return request(obj)
}
// export const uploadUrl = '/api/' + allApi.upload
export const uploadUrl = import.meta.env.VITE_APP_BASE_API+"/api/upordown"
// export const uploadUrl = import.meta.env.VITE_APP_BASE_API+"/api/upordown"
export const uploadUrl = import.meta.env.VITE_APP_BASE_API+"/setupFile/uploads/oneFileUpload"
export const uploadUrlNew = import.meta.env.VITE_APP_BASE_API+"/setupFile/uploads/oneFileUpload"
export function uploadFiledTinymce(data:any, url:any) {
return request({
url: url || '/api/upordown',

24
src/api/system/roleapi/power.ts

@ -23,3 +23,27 @@ export function authorizeOrgTree(data?: getSystemPower){
data:data
});
}
/**
@ 作者: 秦东
@ 时间: 2025-11-28 10:24:09
@ 功能: 根据权限获取数据
*/
export function authorizePeopleList(data?: getSystemPower){
return request({
url: '/systemapi/hr/authorizePeopleList',
method: 'post',
data:data
});
}
/**
@ 作者: 秦东
@ 时间: 2025-11-28 10:24:09
@ 功能: 新增人员
*/
export function addNewPeople(data?: getSystemPower){
return request({
url: '/systemapi/hr/addNewPeople',
method: 'post',
data:data
});
}

24
src/directive/permission/button.ts

@ -7,17 +7,17 @@ import { useUserStore } from "@/store/modules/user";
export const hasButton: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding) {
const userStore = useUserStore();
// const { value,oldValue } = binding;
// console.log("按钮权限",el,"-->",binding,"-->",value,"-->",oldValue,"-->",userStore.myPower);
console.log("按钮权限",el,"-->",binding,"-->","-->",userStore.myPower);
// if (value) {
// const requiredPerms = value; // DOM绑定需要的按钮权限标识
// const hasPerm = userStore.myPower.menuIdAry.some((perm: any) => {
// return requiredPerms.includes(perm);
// });
// if (!hasPerm) {
// el.parentNode?.removeChild(el);
// }
// }
const { value } = binding;
// console.log("按钮权限",el,"-->",binding,"-->",value,"-->",userStore.myPower.menuButIdAry,"-->",userStore.myPower);
if (value) {
const requiredPerms = value; // DOM绑定需要的按钮权限标识
const hasPerm = userStore.myPower.menuButIdAry.some((perm: any) => {
return requiredPerms.includes(perm);
});
if (!hasPerm) {
el.parentNode?.removeChild(el);
}
}
}
}

2
src/store/modules/user.ts

@ -96,7 +96,7 @@ export const useUserStore = defineStore("user", () => {
// });
getUserInfoIng()
.then(({data})=>{
console.log("获取用户信息:角色必须是非null数组!",data);
// console.log("获取用户信息:角色必须是非null数组!",data);
// debugger;
if (!data) {
return reject("验证失败,请重新登录。");

5
src/views/hr/archives/archivescont.vue

@ -57,7 +57,7 @@ const userIcon = ref<string>(); //人员头像
const boxTitle = ref<string>(); //
const userConting = ref<any>(""); //
const rowLoading = ref(false);
const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API + "/api/upordown"; //
const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API+"/setupFile/uploads/oneFileUpload";//
const editMyOrgCont = ref(false); //
const editMyCont = ref(false); //
/**
@ -134,11 +134,14 @@ const handleAvatarSuccess: UploadProps["onSuccess"] = (
uploadFiles
) => {
userIcon.value = URL.createObjectURL(uploadFile.raw!);
// console.log("-------------------->", uploadFile);
// console.log("-------------------->", props.archivesdata.id);
//
editMyInfoIcon({
id: props.archivesdata.id,
iconpath: response.data.url,
}).then((data) => {
fileUploadIng.value = false;
ElMessage.success("编辑成功");
emits("getarchivespageclick");
});

924
src/views/hr/archives/index.vue

@ -1,40 +1,96 @@
<!--
@ 作者: 秦东
@ 时间: 2025-11-28 10:11:16
@ 时间: 2025-12-02 09:47:59
@ 备注: 人员列表
-->
<script lang='ts' setup>
import { emptypeOptions } from "@/api/hr/people/datacont";
import { orgInfo } from "@/api/hr/org/type";
import { authorizeOrgTree } from '@/api/system/roleapi/power'
import { authorizeOrgTree,authorizePeopleList } from '@/api/system/roleapi/power'
import { archivesCont } from "@/api/hr/people/type";
import {
teamcontlist
teamcontlist,
jiechuUserLock,
gainUserInfoDownTemplateList,
} from "@/api/hr/org/index";
import { ElTree, type ComponentSize } from 'element-plus'
import {
anaRedisOrgStaffExc,
} from "@/api/hr/people/index";
import lockInfo from "@/views/hr/archives/unitpage/lockInfo.vue"
import BatchImport from "@/views/hr/archives/unitpage/batchImport.vue"
import UploadTemplate from "@/views/hr/archives/unitpage/uploadTemplate.vue"
import XingGeFengXi from "@/views/hr/archives/downpage/xingGeFengXi.vue";
import ArchivesContPage from "@/views/hr/archives/archivescont.vue";
import AddUserPage from "@/views/hr/archives/unitpage/addUserPage.vue";
const uploadFFurlStaff = import.meta.env.VITE_APP_BASE_API + "/hrapi/staff/upLoadPeopelMerits";
const addUserBox = ref(false); //
const excelJiexi = ref(false)
const orgTreeRef = ref(ElTree); //
const orgTreeLoading = ref(false); //
const orgTreeList = ref<orgInfo[]>(); //
const tiemList = ref([]); //
const tableLoading = ref(false)
const peopleList = ref<archivesCont[]>(); //
const peoplecont = ref<archivesCont>(); //
const excelUploadStaff = ref<any>();
const innerRef = ref<HTMLDivElement>();
const scrollbarRef = ref<InstanceType<typeof ElScrollbarType>>();
//
const piLiangBox = ref(false);
const orgTreeProps = {
children: "child",
label: "name",
}; //
const pageDefaultSize = ref<ComponentSize>('default')
const searchInfo = reactive({
orgId:"",
name:"",
employ:"",
team:"",
joinTime:""
joinTime:"",
page:1,
pagesize:20,
total:0,
})
const search = reactive({
page: 1,
pagesize: 20,
});
const ruleForm = reactive({
id: "",
orgId: "",
fileName: "",
filePath: "",
fileUrl: "",
});
const isNewAddTem = ref(false);
const setupActiveName = ref("1");
const ubLockPage = ref(false);
const openSetup = ref(false);
const direction = ref("rtl");
const downTemplate = ref();
const totalVal = ref(0);
const openTableType = ref(false);
const downTableType = ref("10000003");
const downClassType = ref(1);
const orgListTemp = ref<any>([]);
let peopleListAry = new Array();
const peopleMsg = ref<string[]>([]);
const archivesBox = ref(false); //
let jiBuQiVal = 0;
const progressSize = ref(0);
//
const getOrgPowerTrue = () => {
orgTreeLoading.value = true
let sendInfo = {
menuId:"50"
}
authorizeOrgTree(sendInfo).then((res) => {
console.log(res)
// console.log(res)
orgTreeList.value = res.data
orgTreeLoading.value = false
}).finally(() => {
@ -57,7 +113,10 @@ const gainTimeList = () => {
});
};
const resetChecked = () => {
orgTreeRef.value.setCheckedKeys([])
searchInfo.orgId = 0
orgTreeRef.value.setCheckedKeys([])
handleCurrentChange(1);
}
/**
* 选中行政组织树节点
@ -65,124 +124,743 @@ const resetChecked = () => {
const handleOrgTreeNodeClick = (data: orgInfo) => {
// console.log(data)
searchInfo.orgId = data.id;
// getArchivesPage();
handleCurrentChange(1);
};
const handleSizeChange = (val: number) => {
searchInfo.page = 1
searchInfo.pagesize = val
getArchivesPage();
}
const handleCurrentChange = (val: number) => {
searchInfo.page = val
getArchivesPage();
}
/**
@ 作者: 秦东
@ 时间: 2025-12-02 09:47:59
@ 功能: 获取人员列表
*/
const getArchivesPage = () => {
tableLoading.value = true
let sendInfo = {
menuId:"50",
orgId:searchInfo.orgId,
name:searchInfo.name,
employ:searchInfo.employ,
team:searchInfo.team,
joinTime:searchInfo.joinTime,
page:searchInfo.page,
pagesize:searchInfo.pagesize,
}
authorizePeopleList(sendInfo).then((res) => {
// console.log(res)
peopleList.value = res.data.list
searchInfo.total = res.data.total
tableLoading.value = false
}).finally(() => {
tableLoading.value = false
})
}
//
const unLockUSer = (val: any) => {
// console.log("-jiechuUserLock--", val);
jiechuUserLock({ userId: val.number }).then((res: any) => {
getArchivesPage();
});
};
//
const openUnlico = () => {
ubLockPage.value = true;
};
//
const openPiliangBox = () => {
console.log(piLiangBox.value)
piLiangBox.value = true
};
/**
@ 作者: 秦东
@ 时间: 2024-09-19 09:57:42
@ 功能: 设置相关操作
*/
const setupClick = () => {
openSetup.value = true;
temList();
};
/**
@ 作者: 秦东
@ 时间: 2024-09-19 10:12:29
@ 功能: 关闭设置
*/
const closeSetup = () => {
openSetup.value = false;
};
/**
@ 作者: 秦东
@ 时间: 2024-08-24 13:33:41
@ 功能: 获取导入模版下载列表
*/
const temList = () => {
gainUserInfoDownTemplateList(search).then((data: any) => {
console.log("获取导入模版下载列表---<", data);
downTemplate.value = data.data.list;
totalVal.value = data.data.total;
});
};
/**
@ 作者: 秦东
@ 时间: 2024-08-26 11:45:44
@ 功能: 编辑下载文件
*/
const editUserTemp = (val: any) => {
ruleForm.id = val.id.toString();
ruleForm.orgId = val.orgId;
ruleForm.fileName = val.fileName;
ruleForm.filePath = val.filePath;
ruleForm.fileUrl = val.fileUrl;
console.log("编辑下载文件---->", ruleForm);
isNewAddTem.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2024-08-26 11:08:00
@ 功能: 编辑下载模版状态
*/
const delUserTemp = (val: any, status: number) => {
// console.log("------1------->",val);
// console.log("------2------->",status);
let sendVal = {
id: val.id.toString(),
status: status,
};
editUsefrTempr(sendVal).then((data: any) => {
ElMessage.success(data.msg);
temList();
});
};
/**
@ 作者: 秦东
@ 时间: 2025-12-03 10:53:27
@ 功能: 上传新模版
*/
const setUpNewTemplate = () => {
isNewAddTem.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2025-12-03 13:10:07
@ 功能: 下载九色人格
*/
const selectDownTiaojian = (val: string) => {
downTableType.value = val;
openTableType.value = true;
downClassType.value = 1;
};
/**
@ 作者: 秦东
@ 时间: 2024-09-19 13:23:09
@ 功能: 关闭下载页面
*/
const closeXigePage = () => {
openTableType.value = false;
};
/**
@ 作者: 秦东
@ 时间: 2024-09-19 13:55:09
@ 功能: 性格类型
*/
const characterList = reactive([
{
label: "性格色彩",
code: "10000001",
},
{
label: "DISC性格特质",
code: "10000002",
},
{
label: "九型人格特质",
code: "10000003",
},
]);
const stafftempForm = reactive({
orgId: "",
});
//
const staffChengji = reactive({
orgId: "",
redisListKey: "",
total: "",
years: "",
levels: "",
number: 0,
});
/**
@ 作者: 秦东
@ 时间: 2025-12-03 13:20:27
@ 功能: 下载
*/
const downStatistics = (val: any) => {
console.log("下载数据嗖嗖嗖--->", val);
downTableType.value = val.code;
openTableType.value = true;
downClassType.value = 2;
};
const orgTreePropsBut = {
children: "child",
value: "id",
label: "name",
}; //
/**
@ 作者: 秦东
@ 时间: 2025-12-03 13:51:02
@ 功能: 上传前文件检查 m
*/
function handleExcelChangeTempStaff(file: UploadFile) {
excelLoading.value = true;
if (stafftempForm.orgId == 0 || stafftempForm.orgId == "") {
ElMessage.warning("对不起!你没有选定上传的是哪个行政组织得人员信息!");
excelLoading.value = false;
return false;
}
if (!/\.(xlsx|xls|XLSX|XLS)$/.test(file.name)) {
ElMessage.warning("上传Excel只能为xlsx、xls格式");
excelLoading.value = false;
return false;
}
}
/**
@ 作者: 秦东
@ 时间: 2024-02-03 14:04:48
@ 功能: 上传成功
*/
const uploadTrueStaff = (
response: any,
uploadFile: UploadFile,
uploadFiles: UploadFiles
) => {
excelLoading.value = false;
// console.log("response",response);
// console.log("uploadFile",uploadFile);
// console.log("uploadFiles",uploadFiles);
peopleListAry.push("文件上传成功!开始解析数据并写入数据库!");
peopleMsg.value.push("文件上传成功!开始解析数据并写入数据库!");
// peopleListAry.value.push("")
console.log("上传成功", response.code);
if (response.code == 0) {
jiBuQiVal = 0;
progressSize.value = 0;
excelJiexi.value = true;
staffChengji.orgId = response.data.orgId;
staffChengji.redisListKey = response.data.redisListKey;
staffChengji.total = response.data.total;
staffChengji.years = response.data.years;
staffChengji.levels = response.data.levels;
console.log("上传成功===>", staffChengji);
insetPeopleContStall();
}
};
/**
@ 作者: 秦东
@ 时间: 2025-12-03 13:58:37
@ 功能: 解析数据上传
*/
const insetPeopleContStall = () => {
// console.log("",jiBuQiVal,totalNum.value)
if (jiBuQiVal < staffChengji.total) {
staffChengji.number = jiBuQiVal;
// console.log("",sendData)
anaRedisOrgStaffExc(staffChengji).then((data: any) => {
console.log("启动数据写入11111数据库", data, data.data);
peopleMsg.value.push(data.data.msgStr);
jiBuQiVal++;
// if (jibuq+ 1 >= totalNum.value){
// }
progressSize.value = Math.round((jiBuQiVal / staffChengji.total) * 10000) / 100;
insetPeopleContStall();
nextTick(() => {
// handleClick();
});
});
} else {
excelJiexi.value = false;
progressSize.value = 100;
excelUploadStaff.value.clearFiles();
}
};
/**
* 查看详情
*/
function lookPeopleCont(cont: archivesCont) {
peoplecont.value = cont;
archivesBox.value = true;
}
/**
* 更新个人信息
*/
function updateMyCont(cont: archivesCont) {
peoplecont.value = cont;
}
/**
@ 作者: 秦东
@ 时间: 2025-12-03 14:21:07
@ 功能: 添加人员
*/
const handleAddArchives = () => {
addUserBox.value = true;
}
onMounted(() => {
getOrgPowerTrue();
gainTimeList();
getArchivesPage();
})
</script>
<template>
<div class="app-content">
<el-container>
<el-aside width="300px" style="padding: 10px 10px">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 5px' }">
<el-button
type="primary"
style="width: 100%; margin: 10px 0"
@click="resetChecked"
<el-aside width="300px" style="padding: 10px 10px">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 5px' }">
<el-button
type="primary"
style="width: 100%; margin: 10px 0"
@click="resetChecked"
>
查看全部
</el-button>
<el-tree-v2
ref="orgTreeRef"
style="max-width: 100%"
:data="orgTreeList"
:props="orgTreeProps"
v-loading="orgTreeLoading"
node-key="id"
:expand-on-click-node="false"
:check-on-click-node="true"
:check-strictly="true"
:default-expand-all="false"
:height="1200"
@node-click="handleOrgTreeNodeClick"
/>
</el-card>
</el-aside>
<el-main style="padding: 10px 10px 0 0">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 15px' }">
<el-form ref="searchForm" :model="searchInfo" :inline="true" style="width: 100%; margin-top: 10px;">
<el-form-item label="工号 / 姓名 / 手机号" prop="name">
<el-input
v-model="searchInfo.name"
placeholder="请输入工号/姓名/手机号"
clearable
/>
</el-form-item>
<el-form-item label="用工关系" prop="number">
<el-select
v-model="searchInfo.employ"
multiple
clearable
collapse-tags
placeholder="用工关系"
style="width: 200px"
>
查看全部
</el-button>
<el-tree-v2
style="max-width: 100%"
:data="orgTreeList"
:props="orgTreeProps"
v-loading="orgTreeLoading"
node-key="id"
:expand-on-click-node="false"
:check-on-click-node="true"
:check-strictly="true"
:default-expand-all="false"
:height="1200"
@node-click="handleOrgTreeNodeClick"
<el-option
v-for="item in emptypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="班组" prop="number">
<el-select
v-model="searchInfo.team"
multiple
clearable
collapse-tags
placeholder="员工班组"
style="width: 240px"
>
<el-option
v-for="item in tiemList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-card>
</el-aside>
<el-main style="padding: 10px 10px 0 0">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 15px' }">
<el-form ref="searchForm" :model="searchInfo" :inline="true" style="width: 100%; margin-top: 10px;">
<el-form-item label="工号 / 姓名 / 手机号" prop="keywords">
<el-input
v-model="searchInfo.name"
placeholder="请输入工号/姓名/手机号"
clearable
/>
</el-form-item>
<el-form-item label="用工关系" prop="number">
<el-select
v-model="searchInfo.employ"
multiple
clearable
collapse-tags
placeholder="用工关系"
style="width: 200px"
>
<el-option
v-for="item in emptypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="班组" prop="number">
<el-select
v-model="searchInfo.team"
clearable
collapse-tags
placeholder="员工班组"
style="width: 240px"
>
<el-option
v-for="item in tiemList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="入职日期" prop="number">
<el-date-picker
v-model="searchInfo.joinTime"
type="date"
placeholder="入职日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="" prop="number">
<el-button type="primary" @click="getArchivesPage">
<template #icon><i-ep-search /></template>
搜索
</el-button>
<el-button @click="resetArcFormQuery">
<template #icon><i-ep-refresh /></template>
重置
</el-button>
</el-form-item>
</el-form>
<div class="func-but">
<el-button v-hasButton="(50,[215437071358111744])" type="primary" @click="handleAddArchives">
<template #icon><i-ep-plus /></template>
新增
</el-button>
<el-button
v-hasPerm="['215437153071542272']"
plain
type="primary"
@click="openPiliangBox"
>
<el-icon><MessageBox /></el-icon>
批量导入数据
</el-button>
</div>
</el-card>
</el-main>
</el-select>
</el-form-item>
<el-form-item label="入职日期" prop="number">
<el-date-picker
v-model="searchInfo.joinTime"
type="date"
placeholder="入职日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="" prop="number">
<el-button type="primary" @click="getArchivesPage">
<template #icon><i-ep-search /></template>搜索
</el-button>
<el-button @click="resetArcFormQuery">
<template #icon><i-ep-refresh /></template>重置
</el-button>
</el-form-item>
</el-form>
<div class="func-but">
<el-button v-hasButton="['215437071358111744']" type="primary" @click="handleAddArchives">
<template #icon><i-ep-plus /></template>新增
</el-button>
<el-button
v-hasButton="['215437153071542272']"
plain
type="primary"
@click="openPiliangBox"
>
<el-icon><MessageBox /></el-icon>
</el-button>
<el-button type="success" @click="setupClick">
<el-icon><Setting /></el-icon>
</el-button>
<el-button type="warning" @click="openUnlico">
<el-icon><Unlock /></el-icon>
</el-button>
</div>
<el-table
v-loading="tableLoading"
highlight-current-row
stripe
:data="peopleList"
:header-cell-style="{ background: '#F5F7FA' }"
class="tableBox"
>
<el-table-column fixed label="照片" width="60" align="center">
<template #default="scope">
<el-avatar
v-if="scope.row.icon != ''"
shape="square"
:size="30"
:src="scope.row.icon"
/>
<el-avatar
v-else-if="scope.row.iconphoto != ''"
shape="square"
:size="30"
:src="scope.row.iconphoto"
/>
<el-avatar v-else shape="square" :size="30" :src="UserRole" />
</template>
</el-table-column>
<el-table-column fixed label="姓名" prop="name" width="100">
<template #default="scope">
{{ scope.row.name }}
<el-tag v-if="scope.row.personincharge == 1" type="danger"
>负责人</el-tag
>
</template>
</el-table-column>
<el-table-column
fixed
label="工号"
prop="number"
width="120"
align="center"
/>
<el-table-column
label="归属行政组织"
prop="orgAllName"
width="320"
align="center"
/>
<el-table-column
label="岗位"
prop="positionname"
width="120"
align="center"
/>
<el-table-column label="联系方式" prop="mobilephone" width="120" />
<el-table-column label="居住地" prop="currentresidence" />
<el-table-column fixed="right" align="center" label="操作" width="120">
<template #default="scope">
<el-button
v-hasButton="['275256219474604032']"
type="primary"
link
size="small"
v-if="scope.row.isShowTrue == 1"
@click.stop="unLockUSer(scope.row)"
>
<!-- <i-ep-view /> -->
清除信息锁定
</el-button>
<el-button
v-hasButton="['275256219474604032']"
type="primary"
link
size="small"
@click.stop="lookPeopleCont(scope.row)"
>
<!-- <i-ep-view /> -->
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<div class="paginationBox">
<el-pagination
v-model:current-page="searchInfo.page"
v-model:page-size="searchInfo.pagesize"
:page-sizes="[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]"
:size="pageDefaultSize"
:background="true"
layout="total, sizes, prev, pager, next, jumper"
:total="searchInfo.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</el-card>
</el-main>
</el-container>
<!-- 批量解锁 -->
<lockInfo ref="lockInfoRef" v-model:show="ubLockPage" @updateInfo="getArchivesPage" />
<!-- 批量导入 -->
<BatchImport ref="batchImportRef" v-model:show="piLiangBox" :org-tree="orgTreeList" @updateInfo="getArchivesPage" />
<!--设置-->
<el-drawer
v-model="openSetup"
title="各行政组织员工信息点在档案模板"
:direction="direction"
:before-close="closeSetup"
:size="500"
class="drwBody"
>
<el-tabs v-model="setupActiveName" type="border-card">
<el-tab-pane label="员工档案导入模版" name="1">
<template #label>
<span class="fa fa-upload"></span>
<span>员工档案导入模版</span>
</template>
<div
v-hasButton="['288626950073757696']"
style="flex: auto; text-align: right; margin-bottom: 10px"
>
<el-button type="primary" @click="setUpNewTemplate">上传新模版</el-button>
</div>
<el-table :data="downTemplate" border style="width: 100%">
<el-table-column prop="orgName" label="行政组织" width="200" />
<el-table-column prop="fileName" label="文件名称">
<template #default="scope">
<el-link
type="success"
:underline="false"
:href="scope.row.fileUrl"
target="_blank"
>{{ scope.row.fileName }}</el-link
>
</template>
</el-table-column>
<el-table-column
v-hasButton="['288626867236253696']"
prop="address"
label="操作"
align="center"
width="100"
>
<template #default="scope">
<el-button
link
type="warning"
size="small"
@click="editUserTemp(scope.row)"
>编辑</el-button
>
<el-button
link
type="danger"
size="small"
@click="delUserTemp(scope.row, 3)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="性格分析表" name="2">
<template #label>
<span class="fa fa-list"></span>
<span>性格分析表</span>
</template>
<div class="downLink">
<div>团队角色九型人格测试</div>
<div>
<el-button
type="danger"
text
v-hasButton="['287868103478489088']"
@click="selectDownTiaojian('10000003')"
>
下载
</el-button>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="测试统计" name="3">
<template #label>
<span class="fa fa-bar-chart"></span>
<span>测试统计</span>
</template>
<el-table :data="characterList" border style="width: 100%">
<el-table-column prop="label" label="测试名称" />
<el-table-column label="操作" align="center" width="80">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click="downStatistics(scope.row)"
>下载</el-button
>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="考评人员成绩统计表" name="4">
<template #label>
<span class="fa fa-line-chart"></span>
<span>考评人员成绩统计表</span>
</template>
<el-row
v-hasButton="['288626950073757696']"
v-loading="excelLoading"
element-loading-text="文档上传中,请稍候..."
>
<el-col :span="24">
<el-form
:model="stafftempForm"
label-width="auto"
style="max-width: 100%"
>
<el-form-item label="请选择上传那个公司的人员信息">
<el-tree-select
v-model="stafftempForm.orgId"
:data="orgTreeList"
:props="orgTreePropsBut"
:render-after-expand="false"
:expand-on-click-node="false"
:check-on-click-node="true"
:check-strictly="true"
:default-expand-all="false"
style="width: 240px"
/>
</el-form-item>
</el-form>
</el-col>
<el-col
:span="24"
v-loading="excelJiexi"
element-loading-text="文档解析中,请稍候..."
>
<el-upload
ref="excelUploadStaff"
class="upload-demo"
drag
:action="uploadFFurlStaff"
:data="{ orgId: stafftempForm.orgId.toString() }"
:before-upload="handleExcelChangeTempStaff"
:on-success="uploadTrueStaff"
:on-error="uploadError"
:show-file-list="false"
multiple
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">
将电子表格拖到此处或 <em>单击上载</em>
</div>
</el-upload>
</el-col>
</el-row>
<el-row v-hasButton="['288626950073757696']" style="width: 100%;">
<el-col :span="24">
<el-progress
:text-inside="true"
:stroke-width="20"
:percentage="progressSize"
>
<span>已完成{{ progressSize }}%</span>
</el-progress>
</el-col>
</el-row>
<el-scrollbar height="300px" ref="scrollbarRef" always>
<div ref="innerRef">
<p
v-for="(item, index) in peopleMsg"
:key="index"
class="scrollbar-demo-item"
>
{{ item }}
</p>
</div>
</el-scrollbar>
</el-tab-pane>
</el-tabs>
</el-drawer>
<!-- 上传模版 -->
<UploadTemplate ref="uploadTemplateRef" v-model:show="isNewAddTem" :org-tree="orgTreeList" :rule-form="ruleForm" />
<!-- 性格分析表 -->
<XingGeFengXi
v-if="openTableType"
:down-table-type="downTableType"
:down-class-type="downClassType"
:org-tree="orgTreeList"
@close-xige-page="closeXigePage"
/>
<!-- 档案详情 -->
<ArchivesContPage
v-model:isShow="archivesBox"
:archivesdata="peoplecont"
@updatemyconting="updateMyCont"
@getarchivespageclick="getArchivesPage"
/>
<!-- 添加人员 -->
<AddUserPage
v-model:show="addUserBox"
:org-tree="orgTreeList"
@updateInfo="getArchivesPage"
/>
</div>
</template>
<style lang='scss' scoped>
@ -193,8 +871,22 @@ onMounted(() => {
:deep .el-drawer__body {
padding: 0 10px;
}
.paginationBox {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
margin-top: 10px;
}
.tableBox{
margin-top: 10px;
height: calc(100vh - 390px);
}
}
.common-layout {
.downLink {
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
}
</style>

200
src/views/hr/archives/index_20251202.vue

@ -0,0 +1,200 @@
<!--
@ 作者: 秦东
@ 时间: 2025-11-28 10:11:16
@ 备注: 人员列表
-->
<script lang='ts' setup>
import { emptypeOptions } from "@/api/hr/people/datacont";
import { orgInfo } from "@/api/hr/org/type";
import { authorizeOrgTree } from '@/api/system/roleapi/power'
import {
teamcontlist
} from "@/api/hr/org/index";
const orgTreeRef = ref(ElTree); //
const orgTreeLoading = ref(false); //
const orgTreeList = ref<orgInfo[]>(); //
const tiemList = ref([]); //
const orgTreeProps = {
children: "child",
label: "name",
}; //
const searchInfo = reactive({
orgId:"",
name:"",
employ:"",
team:"",
joinTime:""
})
const getOrgPowerTrue = () => {
orgTreeLoading.value = true
let sendInfo = {
menuId:"50"
}
authorizeOrgTree(sendInfo).then((res) => {
console.log(res)
orgTreeList.value = res.data
orgTreeLoading.value = false
}).finally(() => {
orgTreeLoading.value = false
})
}
/**
@ 作者: 秦东
@ 时间: 2025-01-14 10:27:12
@ 功能: 获取班组列表
*/
const gainTimeList = () => {
let searchMap = {
page: 1,
pagesize: 2000,
name: "",
};
teamcontlist(searchMap).then((data) => {
tiemList.value = data.data.list;
});
};
const resetChecked = () => {
orgTreeRef.value.setCheckedKeys([])
}
/**
* 选中行政组织树节点
*/
const handleOrgTreeNodeClick = (data: orgInfo) => {
// console.log(data)
searchInfo.orgId = data.id;
// getArchivesPage();
};
onMounted(() => {
getOrgPowerTrue();
gainTimeList();
})
</script>
<template>
<div class="app-content">
<el-container>
<el-aside width="300px" style="padding: 10px 10px">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 5px' }">
<el-button
type="primary"
style="width: 100%; margin: 10px 0"
@click="resetChecked"
>
查看全部
</el-button>
<el-tree-v2
style="max-width: 100%"
:data="orgTreeList"
:props="orgTreeProps"
v-loading="orgTreeLoading"
node-key="id"
:expand-on-click-node="false"
:check-on-click-node="true"
:check-strictly="true"
:default-expand-all="false"
:height="1200"
@node-click="handleOrgTreeNodeClick"
/>
</el-card>
</el-aside>
<el-main style="padding: 10px 10px 0 0">
<el-card :body-style="{ height: 'calc(100vh - 190px)', padding: '0px 15px' }">
<el-form ref="searchForm" :model="searchInfo" :inline="true" style="width: 100%; margin-top: 10px;">
<el-form-item label="工号 / 姓名 / 手机号" prop="keywords">
<el-input
v-model="searchInfo.name"
placeholder="请输入工号/姓名/手机号"
clearable
/>
</el-form-item>
<el-form-item label="用工关系" prop="number">
<el-select
v-model="searchInfo.employ"
multiple
clearable
collapse-tags
placeholder="用工关系"
style="width: 200px"
>
<el-option
v-for="item in emptypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="班组" prop="number">
<el-select
v-model="searchInfo.team"
clearable
collapse-tags
placeholder="员工班组"
style="width: 240px"
>
<el-option
v-for="item in tiemList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="入职日期" prop="number">
<el-date-picker
v-model="searchInfo.joinTime"
type="date"
placeholder="入职日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="" prop="number">
<el-button type="primary" @click="getArchivesPage">
<template #icon><i-ep-search /></template>
搜索
</el-button>
<el-button @click="resetArcFormQuery">
<template #icon><i-ep-refresh /></template>
重置
</el-button>
</el-form-item>
</el-form>
<div class="func-but">
<el-button v-hasButton="[215437071358111744]" type="primary" @click="handleAddArchives">
<template #icon><i-ep-plus /></template>
新增
</el-button>
<el-button
v-hasPerm="['215437153071542272']"
plain
type="primary"
@click="openPiliangBox"
>
<el-icon><MessageBox /></el-icon>
批量导入数据
</el-button>
</div>
</el-card>
</el-main>
</el-container>
</div>
</template>
<style lang='scss' scoped>
.app-content {
height: calc(100vh - 170px);
background-color: aqua;
:deep .el-drawer__body {
padding: 0 10px;
}
}
.common-layout {
}
</style>

274
src/views/hr/archives/unitpage/addUserPage.vue

@ -0,0 +1,274 @@
<!--
@ 作者: 秦东
@ 时间: 2025-12-03 14:22:19
@ 备注: 添加人员
-->
<script lang='ts' setup>
import { addNewPeople } from "@/api/system/roleapi/power";
import defaultImg from "@/assets/images/1.png";
const props = defineProps({
show: {
type: Boolean,
default: false
},
orgTree: {
type: Array as PropType<orgInfo[]>,
default: () => []
}
})
const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API+"/setupFile/uploads/oneFileUpload";//
const emit = defineEmits(['update:show','updateInfo'])
const ubLockPage = computed(() => props.show)
const orgTreeList = computed(() => props.orgTree) //
const butLoading = ref(false)
const fileUploadIng = ref(false);
const systemMenuTreeProps = {
children: "child",
label: "name",
value:"id"
} //
const formRef = ref<any>();
const rules = ref<any>({
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
code: [{ required: true, message: '请输入工号', trigger: 'blur' }],
orgId: [{ required: true, message: '请选择行政组织', trigger: 'change' }],
employment: [{ required: true, message: '请输入用工关系', trigger: 'blur' }],
mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
});
const userInfo = ref({
name: "",
code: "",
mobile: "",
nation: "",
sex: "1",
age: "",
oldName: "",
icon: defaultImg,
orgId:"",
employment:"",
address:""
})
/**
@ 作者: 秦东
@ 时间: 2025-12-03 14:26:25
@ 功能: 关闭
*/
const closeLock = () => {
emit('update:show', false)
emit('updateInfo')
userInfo.value.icon = defaultImg
butLoading.value = false
formRef.value.resetFields();
}
/**
@ 作者: 秦东
@ 时间: 2025-12-03 15:40:14
@ 功能: 提交数据
*/
const onSubmit = () => {
butLoading.value = true
formRef.value.validate((valid) => {
if (valid) {
//
addNewPeople(userInfo.value).then((res) => {
if (res.code == 0) {
ElMessage.success("新增成功");
closeLock();
} else {
ElMessage.error(res.msg);
}
butLoading.value = false
})
} else {
butLoading.value = false
}
});
}
/**
@ 作者: 秦东
@ 时间: 2024-08-31 14:35:18
@ 功能: 上传前判断类型
*/
const beforeAvatarUpload: UploadProps["beforeUpload"] = (rawFile) => {
fileUploadIng.value = true;
if (!/\.(png|jpg|gif|jpeg|svg|bmp)$/.test(rawFile.name)) {
ElMessage.warning("您上传的图片不符合要求!");
fileUploadIng.value = false;
return false;
}
};
/**
@ 作者: 秦东
@ 时间: 2024-08-31 14:40:31
@ 功能: 上传成功
*/
const handleAvatarSuccess: UploadProps["onSuccess"] = (
response,
uploadFile,
uploadFiles
) => {
userInfo.value.icon = URL.createObjectURL(uploadFile.raw!);
// console.log("-------------------->", uploadFile);
// console.log("-------------------->", props.archivesdata.id);
fileUploadIng.value = false;
ElMessage.success("上传成功");
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="新增人员信息"
width="650"
draggable
:destroy-on-close="true"
:before-close="closeLock"
>
<el-form :model="userInfo" :rules="rules" ref="formRef" label-width="80px">
<table>
<tr>
<td>
<el-form-item label="姓名" prop="name">
<el-input v-model="userInfo.name" placeholder="请输入姓名" />
</el-form-item>
</td>
<td>
<el-form-item label="曾用名" prop="oldName">
<el-input v-model="userInfo.oldName" placeholder="请输入曾用名" />
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="工号" prop="code">
<el-input v-model="userInfo.code" placeholder="请输入工号" />
</el-form-item>
</td>
<td rowspan="3" align="center">
<el-upload
class="avatar-uploader"
:action="imgUploadApiUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
v-loading="fileUploadIng"
>
<el-avatar shape="square" :size="180" :src="userInfo.icon" class="bianKuang" />
</el-upload>
</td>
</tr>
<tr>
<td>
<el-form-item label="民族" prop="nation">
<el-input v-model="userInfo.nation" placeholder="请输入民族" />
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="userInfo.sex">
<el-radio label="1"></el-radio>
<el-radio label="2"></el-radio>
</el-radio-group>
</el-form-item>
</td>
</tr>
<tr>
<td colspan="2">
<el-form-item label="归属部门" prop="orgId">
<el-tree-select
v-model="userInfo.orgId"
:data="orgTreeList"
check-strictly
:render-after-expand="false"
:props="systemMenuTreeProps"
style="width: 100%"
clearable
/>
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="联系电话" prop="mobile">
<el-input v-model="userInfo.mobile" placeholder="请输入联系电话" />
</el-form-item>
</td>
<td>
<el-form-item label="用工关系" prop="employment">
<el-select v-model="userInfo.employment" placeholder="请选择用工关系" style="width: 100%">
<el-option label="临时工" value="1" />
<el-option label="编外人员" value="2" />
<el-option label="实习&实习生" value="3" />
<el-option label="试用员工" value="4" />
<el-option label="待分配" value="5" />
<el-option label="待岗" value="6" />
<el-option label="临时调入" value="7" />
<el-option label="正式员工" value="8" />
<el-option label="长期病假" value="9" />
<el-option label="停薪留职" value="10" />
<el-option label="退休" value="11" />
<el-option label="辞职" value="12" />
<el-option label="辞退" value="13" />
<el-option label="离职" value="14" />
</el-select>
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="出生日期" prop="age">
<el-date-picker
v-model="userInfo.age"
type="date"
placeholder="请选择出生日期"
format="YYYY/MM/DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</td>
<td>
<el-form-item label="联系地址" prop="address">
<el-input v-model="userInfo.address" placeholder="请输入联系地址" />
</el-form-item>
</td>
</tr>
<tr>
<td>
<el-form-item label="身体状况" prop="bodyStatus">
<el-select v-model="userInfo.bodyStatus" placeholder="请选择身体状况" style="width: 100%">
<el-option label="良好" value="1" />
<el-option label="一般" value="2" />
<el-option label="较弱" value="3" />
<el-option label="有生理缺陷" value="4" />
<el-option label="有生理缺陷" value="4" />
</el-select>
</el-form-item>
</td>
<td>
<el-form-item label="婚姻状况" prop="marriageStatus">
<el-select v-model="userInfo.marriageStatus" placeholder="请选择婚姻状况" style="width: 100%">
<el-option label="未婚" value="1" />
<el-option label="已婚" value="2" />
<el-option label="离异" value="4" />
<el-option label="丧偶" value="3" />
</el-select>
</el-form-item>
</td>
</tr>
</table>
<div class="flex justify-center">
<el-button type="primary" :loading="butLoading" @click="onSubmit">提交</el-button>
<el-button @click="closeLock">取消</el-button>
</div>
</el-form>
</el-dialog>
</template>
<style lang='scss' scoped>
.bianKuang {
border: 1px solid #ccc;
}
</style>

235
src/views/hr/archives/unitpage/batchImport.vue

@ -0,0 +1,235 @@
<!--
@ 作者: 秦东
@ 时间: 2025-12-02 16:17:37
@ 备注: 批量导入
-->
<script lang='ts' setup>
import { orgInfo } from "@/api/hr/org/type";
import {
analysisRedisOrgExelect,
} from "@/api/hr/people/index";
import { ElScrollbar as ElScrollbarType } from "element-plus";
const uploadFFurl = import.meta.env.VITE_APP_BASE_API + "/hrapi/staff/uploadUserFilesRedis";
const props = defineProps({
show: {
type: Boolean,
default: false
},
orgTree: {
type: Array as PropType<orgInfo[]>,
default: () => []
}
})
const ubLockPage = computed(() => props.show)
const emit = defineEmits(['update:show','updateInfo'])
const closeUploadTemp = () => {
emit('update:show', false)
emit('updateInfo')
tempForm.orgId = ""
excelLoading.value = false;
excelJiexi.value = false;
}
const orgTreeList = computed(() => props.orgTree) //
const excelLoading = ref(false);
const excelJiexi = ref(false);
const tempForm = reactive({
orgId: "",
});
const systemMenuTreeProps = {
children: "child",
label: "name",
value:"id"
}
const excelUpload = ref<any>();
let peopleListAry = new Array(); //
const peopleMsg = ref<string[]>([]);
let jiBuQiVal = 0;
const progressSize = ref(0);
const meritsYearIng = ref<any>();
const rewPunYearsIng = ref<any>();
const redisListKey = ref<string>();
const totalNum = ref<number>();
const innerRef = ref<HTMLDivElement>();
const scrollbarRef = ref<InstanceType<typeof ElScrollbarType>>();
/**
@ 作者: 秦东
@ 时间: 2025-12-02 16:53:45
@ 功能: 上传前检查
*/
function handleExcelChangeTemp(file: UploadFile) {
excelLoading.value = true;
if (tempForm.orgId == 0 || tempForm.orgId == "") {
ElMessage.warning("对不起!你没有选定上传的是哪个行政组织得人员信息!");
excelLoading.value = false;
return false;
}
if (!/\.(xlsx|xls|XLSX|XLS)$/.test(file.name)) {
ElMessage.warning("上传Excel只能为xlsx、xls格式");
excelLoading.value = false;
return false;
}
}
/**
@ 作者: 秦东
@ 时间: 2025-12-02 16:55:17
@ 功能: 上传失败
*/
const uploadError = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
excelLoading.value = true;
// console.log("1response",response);
// console.log("1uploadFile",uploadFile);
// console.log("1uploadFiles",uploadFiles);
let msgAry = new Array();
msgAry.push(
"响应时间过长,系统自动转为后台静默处理,可先关闭窗口!完成时间大约90分钟。请于90分钟后刷新信息"
);
// errorMsg = ["9090"]
peopleListAry.value = msgAry;
};
/**
@ 作者: 秦东
@ 时间: 2025-12-02 16:56:39
@ 功能: 上传成功
*/
const uploadTrue = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
excelLoading.value = false;
// console.log("response", response);
// console.log("uploadFile",uploadFile);
// console.log("uploadFiles",uploadFiles);
peopleListAry.push("文件上传成功!开始解析数据并写入数据库!");
peopleMsg.value.push("文件上传成功!开始解析数据并写入数据库!");
// peopleListAry.value.push("")
// console.log("",response.code)
if (response.code == 0) {
jiBuQiVal = 0;
progressSize.value = 0;
excelJiexi.value = true;
meritsYearIng.value = response.data.meritsYearIng;
rewPunYearsIng.value = response.data.rewPunYearsIng;
redisListKey.value = response.data.redisListKey;
totalNum.value = response.data.totalNum;
// console.log("===>", staffChengji);
insetPeopleCont();
}
}
/**
@ 作者: 秦东
@ 时间: 2025-12-02 17:01:05
@ 功能: 写入数据库
*/
const insetPeopleCont = () => {
// console.log("===============", jiBuQiVal, totalNum.value);
if (jiBuQiVal < totalNum.value) {
let sendData = {
meritsYearIng: meritsYearIng.value,
rewPunYearsIng: rewPunYearsIng.value,
redisListKey: redisListKey.value,
number: jiBuQiVal,
orgId: tempForm.orgId.toString(),
};
// console.log("", sendData);
analysisRedisOrgExelect(sendData).then((data: any) => {
// console.log("11111",data,data.data.msgStr)
peopleMsg.value.push(data.data.msgStr);
jiBuQiVal++;
// if (jibuq+ 1 >= totalNum.value){
// }
progressSize.value = Math.round((jiBuQiVal / totalNum.value) * 10000) / 100;
insetPeopleCont();
nextTick(() => {
handleClick();
});
});
} else {
excelJiexi.value = false;
progressSize.value = 100;
excelUpload.value.clearFiles();
}
};
const handleClick = () => {
nextTick(() => {
// console.log("",innerRef.value!.clientHeight)
if (innerRef.value!.clientHeight > 300) {
scrollbarRef.value!.setScrollTop(innerRef.value!.clientHeight);
}
});
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="批量导入人员信息"
width="800"
draggable
:destroy-on-close="true"
:before-close="closeUploadTemp"
>
<el-row v-loading="excelLoading" element-loading-text="文档上传中,请稍候..." style="width: 100%">
<el-col :span="24">
<el-form :model="tempForm" label-width="auto" style="width: 100%">
<el-form-item label="请选择上传那个公司的人员信息">
<el-tree-select
v-model="tempForm.orgId"
:data="orgTreeList"
check-strictly
:render-after-expand="false"
:props="systemMenuTreeProps"
style="width: 100%"
clearable
/>
</el-form-item>
</el-form>
</el-col>
<el-col
:span="24"
v-loading="excelJiexi"
element-loading-text="文档解析中,请稍候..."
>
<el-upload
ref="excelUpload"
class="upload-demo"
drag
:action="uploadFFurl"
:data="{ orgId: tempForm.orgId.toString() }"
:before-upload="handleExcelChangeTemp"
:on-success="uploadTrue"
:on-error="uploadError"
:show-file-list="false"
multiple
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将电子表格拖到此处或 <em>单击上载</em></div>
</el-upload>
</el-col>
</el-row>
<el-row style="width: 100%;">
<el-col :span="24">
<el-progress
:text-inside="true"
:stroke-width="20"
:percentage="progressSize"
>
<span>已完成{{ progressSize }}%</span>
</el-progress>
</el-col>
</el-row>
<el-scrollbar height="300px" ref="scrollbarRef" always style="padding:10px 20px;">
<div ref="innerRef">
<p
v-for="(item, index) in peopleMsg"
:key="index"
class="scrollbar-demo-item"
>
{{ item }}
</p>
</div>
</el-scrollbar>
</el-dialog>
</template>
<style lang='scss' scoped>
.app-content {
}
</style>

96
src/views/hr/archives/unitpage/lockInfo.vue

@ -0,0 +1,96 @@
<!--
@ 作者: 秦东
@ 时间: 2025-12-02 15:50:46
@ 备注: 解除人员信息锁
-->
<script lang='ts' setup>
import {
jiechuUserLock,
} from "@/api/hr/org/index";
const props = defineProps({
show: {
type: Boolean,
default: false
}
})
const ubLockPage = computed(() => props.show)
const emit = defineEmits(['update:show','updateInfo'])
const unLockForm = reactive({
numText: "",
});
/**
@ 作者: 秦东
@ 时间: 2025-12-02 15:53:20
@ 功能: 关闭解锁弹窗
*/
const closeLock = () => {
emit('update:show', false)
emit('updateInfo')
}
const ruleFormRefLock = ref(null);
var butLoad = ref(false);
//
const picksubus = () => {
butLoad.value = true;
ruleFormRefLock.value.validate((isValid: boolean) => {
if (isValid) {
jiechuUserLock({ userId: unLockForm.numText })
.then((res: any) => {
butLoad.value = false;
closeLock()
})
.finally(() => {
butLoad.value = false;
});
} else {
butLoad.value = false;
}
});
};
const resetForm = () => {
closeLock();
ruleFormRefLock.value.resetFields();
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="清除锁定人员信息锁"
width="500"
draggable
:destroy-on-close="true"
:before-close="closeLock"
>
<el-form
ref="ruleFormRefLock"
:model="unLockForm"
:rules="editTitleRules"
label-width="80"
style="width: 100%"
>
<el-form-item label="工号" prop="numText">
<el-text>请输入工号以英文逗号隔开(,)</el-text>
<el-input
v-model="unLockForm.numText"
type="textarea"
placeholder="请输入工号;以英文逗号隔开(,)"
clearable
:autosize="{ minRows: 4, maxRows: 10 }"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" v-loading="butLoad" @click="picksubus">
确定
</el-button>
<el-button @click="resetForm(ruleFormRef)">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
<style lang='scss' scoped>
.app-content {
}
</style>

222
src/views/hr/archives/unitpage/uploadTemplate.vue

@ -0,0 +1,222 @@
<!-- eslint-disable vue/no-side-effects-in-computed-properties -->
<!--
@ 作者: 秦东
@ 时间: 2025-12-03 10:44:56
@ 备注: 上传模版
-->
<script lang='ts' setup>
import { orgInfo } from "@/api/hr/org/type";
import {
uploadUserTemplate
} from "@/api/hr/org/index";
import { uploadUrl } from "@/api/DesignForm";
const props = defineProps({
show: {
type: Boolean,
default: false
},
orgTree: {
type: Array as PropType<orgInfo[]>,
default: () => []
},
ruleForm: {
type: Object as PropType<typeof ruleForm>,
default: () => ({})
}
})
const addTemLoading = ref(false);
let peopleListAry = new Array();
const excelLoading = ref(false);
const excelUploadUs = ref();
const emits = defineEmits(['update:show'])
const ruleFormRef = ref<any>();
const ruleFormIng = ref({
id: "",
orgId: "",
fileName: "",
filePath: "",
fileUrl: "",
});
const orgTreePropsBut = {
children: "child",
value: "id",
label: "name",
}; //
const orgTreeList = computed(() => props.orgTree) //
const ubLockPage = computed({
get: () =>{
if(props.show){
ruleFormIng.value.id = props.ruleForm.id
ruleFormIng.value.orgId = props.ruleForm.orgId
ruleFormIng.value.fileName = props.ruleForm.fileName
ruleFormIng.value.filePath = props.ruleForm.filePath
ruleFormIng.value.fileUrl = props.ruleForm.fileUrl
}
return props.show
},
set: (val) => {
emits("update:show", val);
},
})
/**
@ 作者: 秦东
@ 时间: 2024-04-19 13:13:18
@ 功能: 表单验证规则
*/
const dataFormRules = reactive({
orgId: [{ required: true, message: "请选择行政组织", trigger: "blur" }],
fileName: [{ required: true, message: "请上传模版文件", trigger: "blur" }],
});
//
const tempOpenClose = () => {
emits('update:show', false)
ruleFormIng.value.id = ""
ruleFormIng.value.orgId = 0
ruleFormIng.value.fileName = ""
ruleFormIng.value.filePath = ""
ruleFormIng.value.fileUrl = ""
}
//
const handleExcelChange = (file: UploadFile) => {
excelLoading.value = true;
if (!/\.(xlsx|xls|XLSX|XLS)$/.test(file.name)) {
ElMessage.warning("上传Excel只能为xlsx、xls格式");
excelLoading.value = false;
return false;
}
}
/**
@ 作者: 秦东
@ 时间: 2024-08-24 14:46:32
@ 功能: 文件上传成功
*/
const uploadTrueUs = (
response: any,
uploadFile: UploadFile,
uploadFiles: UploadFiles
) => {
// console.log("response",response);
// console.log("uploadFile",uploadFile);
// console.log("uploadFiles",uploadFiles);
excelLoading.value = false;
ruleFormIng.value.fileName = uploadFile.name;
ruleFormIng.value.filePath = response.data.physicspath;
ruleFormIng.value.fileUrl = response.data.url;
};
/**
@ 作者: 秦东
@ 时间: 2025-12-03 11:02:30
@ 功能: 文件上传失败
*/
const uploadError = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
excelLoading.value = true;
// console.log("1response",response);
// console.log("1uploadFile",uploadFile);
// console.log("1uploadFiles",uploadFiles);
let msgAry = new Array();
msgAry.push(
"响应时间过长,系统自动转为后台静默处理,可先关闭窗口!完成时间大约90分钟。请于90分钟后刷新信息"
);
// errorMsg = ["9090"]
peopleListAry.value = msgAry;
};
/**
@ 作者: 秦东
@ 时间: 2025-12-03 11:05:57
@ 功能: 提交上传数据
*/
const saveTemp = () => {
addTemLoading.value = true;
ruleFormRef.value.validate((valid: any) => {
if (valid) {
ruleFormIng.value.orgId = ruleFormIng.value.orgId.toString();
// console.log("--->", ruleForm);
if (ruleFormIng.value.id == 0 || ruleFormIng.value.id == "") {
uploadUserTemplate(ruleForm)
.then((data: any) => {
console.log("上传传输信息-1-->", data);
tempOpenClose();
})
.finally(() => {
addTemLoading.value = false;
});
} else {
editUserTemplateInfo(ruleForm)
.then((data: any) => {
console.log("上传传输信息-2-->", data);
tempOpenClose();
})
.finally(() => {
addTemLoading.value = false;
});
}
} else {
addTemLoading.value = false;
}
});
};
</script>
<template>
<el-dialog
v-model="ubLockPage"
title="上传导入模版"
width="400"
:before-close="tempOpenClose"
>
<el-form
ref="ruleFormRef"
style="max-width: 600px"
:model="ruleForm"
:rules="dataFormRules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item label="归属行政组织" prop="orgId">
<el-tree-select
v-model="ruleFormIng.orgId"
:data="orgTreeList"
:props="orgTreePropsBut"
:render-after-expand="false"
:expand-on-click-node="false"
:check-on-click-node="true"
:check-strictly="true"
:default-expand-all="false"
style="width: 240px"
/>
</el-form-item>
<el-form-item label="信息模版" prop="fileName">
<el-input v-model="ruleFormIng.fileName" />
<el-upload
ref="excelUploadUs"
class="upload-demo"
drag
v-loading="excelLoading"
:action="uploadUrl"
:limit="1"
:before-upload="handleExcelChange"
:on-success="uploadTrueUs"
:on-error="uploadError"
:show-file-list="false"
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将电子表格拖到此处或 <em>单击上载</em></div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" v-loading="addTemLoading" @click="saveTemp()">
确定上传
</el-button>
<el-button @click="tempOpenClose()">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
<style lang='scss' scoped>
.app-content {
}
</style>

12
src/views/nested/.editorconfig

@ -0,0 +1,12 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = crlf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = false

1
src/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue

@ -85,6 +85,7 @@ const submitForm = () => {
// console.log("",appSetupCont)
appBasicSettings(appSetupCont)
.then(() => {
// eslint-disable-next-line vue/no-mutating-props
props.appCont.appName = appSetupCont.title;
props.appCont.appSvg = appSetupCont.appSvg;
props.appCont.describe = appSetupCont.appdescribe;

Loading…
Cancel
Save