Browse Source

人员导入完成

qin_24
herenshan112 3 months ago
parent
commit
833cf9f655
  1. 21
      src/api/hr/paiban/index.ts
  2. 129
      src/views/hr/company/companyduty.vue
  3. 2
      src/views/hr/company/orgPeopleNew.vue
  4. 366
      src/views/hr/company/uploadDownloadPage.vue

21
src/api/hr/paiban/index.ts

@ -95,3 +95,24 @@ export function getOrgPeopleList(data?:any){
data:data
})
}
/**
*
*/
export function delMonthOneus(data?:any){
return request({
url:'/systemapi/app/delMonthOneus',
method:'post',
data:data
})
}
/**
*
*/
export function analysisDutyData(data?:any){
return request({
url:'/systemapi/app/analysisDutyData',
method:'post',
data:data
})
}

129
src/views/hr/company/companyduty.vue

@ -8,10 +8,13 @@ import {
companyDutyInit,
getYearMonthWorkMan,
delOneDayDuty,
delMonthOneus,
} from "@/api/hr/paiban/index";
import { get_org } from "@/api/opk/zxy/news/api";
import SavePage from "@/views/hr/company/savePageNew.vue";
import UploadDownloadPage from "@/views/hr/company/uploadDownloadPage.vue";
const currentTime = ref(0);
const currOrgManList = ref([]);
const currOrgCont = ref(309);
const currOrgContName = ref("山东恒信高科能源有限公司");
@ -47,6 +50,7 @@ const initInfo = () => {
initConter.value = res.data;
currOrgCont.value = res.data.currentOrg;
currOrgContName.value = res.data.currentOrgName;
currentTime.value = res.data.currentTime;
getOrgList(res.data.currentOrg, res.data.year, res.data.month);
// get_org({
// id: res.data.currentOrg.toString(),
@ -78,8 +82,93 @@ onMounted(() => {
initInfo();
});
//
const delTag = () => {
console.log("删除一设定人员");
const delTag = (val: any, allVal: any, typeClass: number) => {
console.log("删除一设定人员", typeClass, val);
console.log("删除一设定人员allVal", allVal);
switch (typeClass) {
case 1:
if (allVal.baiTian && Array.isArray(allVal.baiTian) && allVal.baiTian.length > 0) {
let usAry = [];
let usKeyAry = [];
allVal.baiTian.forEach((item: any) => {
if (val.userKey != item.userKey) {
usAry.push(item);
usKeyAry.push(item.userKey);
}
});
allVal.baiTian = usAry;
delMonthOneus({ id: allVal.id, types: typeClass, userAry: usKeyAry });
}
break;
case 2:
if (allVal.night && Array.isArray(allVal.night) && allVal.night.length > 0) {
let usAry = [];
let usKeyAry = [];
allVal.night.forEach((item: any) => {
if (val.userKey != item.userKey) {
usAry.push(item);
usKeyAry.push(item.userKey);
}
});
allVal.night = usAry;
delMonthOneus({ id: allVal.id, types: typeClass, userAry: usKeyAry });
}
break;
case 3:
if (allVal.allDay && Array.isArray(allVal.allDay) && allVal.allDay.length > 0) {
let usAry = [];
let usKeyAry = [];
allVal.allDay.forEach((item: any) => {
if (val.userKey != item.userKey) {
usAry.push(item);
usKeyAry.push(item.userKey);
}
});
allVal.allDay = usAry;
delMonthOneus({ id: allVal.id, types: typeClass, userAry: usKeyAry });
}
break;
case 4:
if (allVal.morning && Array.isArray(allVal.morning) && allVal.morning.length > 0) {
let usAry = [];
let usKeyAry = [];
allVal.morning.forEach((item: any) => {
if (val.userKey != item.userKey) {
usAry.push(item);
usKeyAry.push(item.userKey);
}
});
allVal.morning = usAry;
delMonthOneus({ id: allVal.id, types: typeClass, userAry: usKeyAry });
}
break;
case 5:
if (
allVal.afternoon &&
Array.isArray(allVal.afternoon) &&
allVal.afternoon.length > 0
) {
let usAry = [];
let usKeyAry = [];
allVal.afternoon.forEach((item: any) => {
if (val.userKey != item.userKey) {
usAry.push(item);
usKeyAry.push(item.userKey);
}
});
allVal.afternoon = usAry;
delMonthOneus({ id: allVal.id, types: typeClass, userAry: usKeyAry });
}
break;
default:
break;
}
console.log("删除一设定人员--123->", allVal);
};
//
const pickOrg = (val: any) => {
@ -166,6 +255,11 @@ const isShowOrg = (item: any) => {
// deep: true,
// }
// );
//
const upDwOpen = ref(false);
const upLoadOrDowan = () => {
upDwOpen.value = true;
};
</script>
<template>
<div class="comBox">
@ -199,6 +293,10 @@ const isShowOrg = (item: any) => {
<div>
<!-- <el-button type="primary">添加值班信息</el-button> -->
<el-date-picker v-model="pickMonth" type="month" placeholder="请选择月份" />
<el-button type="warning" class="upDnBox" @click="upLoadOrDowan"
>上传 <i class="fa fa-upload" />
</el-button>
</div>
</div>
</template>
@ -232,7 +330,7 @@ const isShowOrg = (item: any) => {
<el-tag
v-for="(mItem, mi) in us.baiTian"
closable
@close="delTag()"
@close="delTag(mItem, us, 1)"
>{{ mItem.name }}</el-tag
>
</el-space>
@ -241,7 +339,7 @@ const isShowOrg = (item: any) => {
<el-tag
v-for="(mItem, mi) in us.night"
closable
@close="delTag()"
@close="delTag(mItem, us, 2)"
>{{ mItem.name }}</el-tag
>
</el-space>
@ -250,7 +348,7 @@ const isShowOrg = (item: any) => {
<el-tag
v-for="(mItem, mi) in us.allDay"
closable
@close="delTag()"
@close="delTag(mItem, us, 3)"
>{{ mItem.name }}</el-tag
>
</el-space>
@ -261,7 +359,7 @@ const isShowOrg = (item: any) => {
<el-tag
v-for="(mItem, mi) in us.allDay"
closable
@close="delTag()"
@close="delTag(mItem, us, 3)"
>{{ mItem.name }}</el-tag
>
</el-space>
@ -272,7 +370,7 @@ const isShowOrg = (item: any) => {
<el-tag
v-for="(mItem, mi) in us.morning"
closable
@close="delTag()"
@close="delTag(mItem, us, 4)"
>{{ mItem.name }}</el-tag
>
</el-space>
@ -282,7 +380,7 @@ const isShowOrg = (item: any) => {
<el-tag
v-for="(mItem, mi) in us.afternoon"
closable
@close="delTag()"
@close="delTag(mItem, us, 5)"
>{{ mItem.name }}</el-tag
>
</el-space>
@ -320,6 +418,15 @@ const isShowOrg = (item: any) => {
:curr-org-cont-name="currOrgContName"
@pickRefresh="pickRefresh"
/>
<UploadDownloadPage
v-if="upDwOpen"
v-model:is-open="upDwOpen"
:curr-org-cont="currOrgCont"
:curr-org-cont-name="currOrgContName"
:current-time="currentTime"
:org-list="initConter.orgList"
@pickRefresh="pickRefresh"
/>
</div>
</template>
<style lang="scss" scoped>
@ -394,4 +501,10 @@ const isShowOrg = (item: any) => {
background-color: #f4f4f5;
padding: 0 5px;
}
.upDnBox {
margin-left: 5px;
i {
margin-left: 5px;
}
}
</style>

2
src/views/hr/company/orgPeopleNew.vue

@ -203,7 +203,7 @@ onMounted(() => {
<template>
<el-dialog
v-model="openPage"
title="选择人员"
:title="'选择《' + props.currOrgContName + '》人员'"
width="900"
draggable
:before-close="closeOrgUserPAge"

366
src/views/hr/company/uploadDownloadPage.vue

@ -0,0 +1,366 @@
<!--
@ 作者: 秦东
@ 时间: 2025-08-18 13:05:13
@ 备注: 上传下载页面
-->
<script lang="ts" setup>
import { analysisDutyData } from "@/api/hr/paiban/index";
import { useUserStore } from "@/store/modules/user";
import { ElScrollbar as ElScrollbarType } from "element-plus";
const downloadUrl =
import.meta.env.VITE_APP_BASE_API + "/systemapi/public/downLoadDutyPage"; //
const uploadFFurl = import.meta.env.VITE_APP_BASE_API + "/systemapi/app/uploadFilesRedis"; //
const props = defineProps({
isOpen: {
type: Boolean,
default: false,
},
currOrgCont: {
type: Number,
default: 309,
},
currOrgContName: {
type: String,
default: "",
},
currentTime: {
type: Number,
default: 0,
},
orgList: {
type: Object,
default() {
return {};
},
},
});
const excelUpload = ref<any>();
const ruleFormRefUpDown = ref(null);
const loading = ref(false);
const emits = defineEmits(["update:isOpen"]);
const upLoadText = ref("文档上传中,请稍候...");
const isShow = computed({
get() {
// console.log("",props.isOpen);
return props.isOpen;
},
set(val: boolean) {
// console.log("",props.isOpen);
emits("update:isOpen", val);
},
});
const userStore = useUserStore();
const uploadMsg = ref<string[]>([]);
const callBackMsg = ref<any>([]);
const pageInfo = reactive({
orgId: props.currOrgCont ? props.currOrgCont : 309,
types: 1,
dateTime: props.currentTime ? props.currentTime : 0,
});
const scrollbarRef = ref<InstanceType<typeof ElScrollbarType>>();
const innerRef = ref<HTMLDivElement>();
let jiBuQiVal = 0;
const progressSize = ref(0);
//
const closeupDoPage = () => {
emits("update:isOpen", false);
ruleFormRefUpDown.value.resetFields();
progressSize.value = 0;
jiBuQiVal = 0;
};
/**
* 表单验证规则
*/
const rulesPageInfo = reactive({
orgId: [{ required: true, message: "请选择行政组织", trigger: "blur" }],
types: [{ required: true, message: "请选择导入类型", trigger: "blur" }],
});
//
const handleExcelChangeTemp = async (file: UploadFile) => {
loading.value = true;
const valid = await ruleFormRefUpDown.value.validate();
if (!valid) {
subLoad.value = false;
return;
}
if (!/\.(xlsx|xls|XLSX|XLS|csv|CSV)$/.test(file.name)) {
ElMessage.warning("上传Excel只能为xlsx、xls、svg格式");
loading.value = false;
return false;
}
uploadMsg.value.push("开始上传文件,请稍后!");
callBackMsg.value.push({
attr: 1,
msg: "开始上传文件,请稍后!",
});
return true;
};
//
const uploadError = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
loading.value = true;
// console.log("1response",response);
// console.log("1uploadFile",uploadFile);
// console.log("1uploadFiles",uploadFiles);
let msgAry = new Array();
msgAry.push(
"响应时间过长,系统自动转为后台静默处理,可先关闭窗口!完成时间大约90分钟。请于90分钟后刷新信息"
);
callBackMsg.value.push({
attr: 4,
msg:
"响应时间过长,系统自动转为后台静默处理,可先关闭窗口!完成时间大约90分钟。请于90分钟后刷新信息",
});
// errorMsg = ["9090"]
uploadMsg.value = msgAry;
};
const handleRemove: UploadProps["onRemove"] = (file, uploadFiles) => {
console.log(file, uploadFiles);
};
const upLoadArg = reactive({
redisKey: "",
total: 0,
});
/**
@ 作者: 秦东
@ 时间: 2024-02-03 14:04:48
@ 功能: 上传成功
*/
const uploadTrueStaff = (
response: any,
uploadFile: UploadFile,
uploadFiles: UploadFiles
) => {
loading.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) {
uploadMsg.value.push("文件上传成功!开始解析数据并写入数据库!");
callBackMsg.value.push({
attr: 3,
msg: "文件上传成功!开始解析数据并写入数据库!",
});
jiBuQiVal = 0;
progressSize.value = 0;
loading.value = true;
upLoadArg.redisKey = response.data.redisKey;
upLoadArg.total = response.data.total;
// 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();
analysisData();
} else {
uploadMsg.value.push(response.msg);
callBackMsg.value.push({
attr: 5,
msg: response.msg,
});
}
};
//
const analysisData = () => {
console.log("解析上传数据", jiBuQiVal, upLoadArg.total);
if (jiBuQiVal < upLoadArg.total) {
analysisDutyData({
orgId: pageInfo.orgId,
types: pageInfo.types,
dateTime: pageInfo.dateTime,
redisKey: upLoadArg.redisKey,
number: jiBuQiVal,
}).then((data: any) => {
console.log("启动数据写入11111数据库", data);
console.log("启动数据写入11111数据库", data.data);
uploadMsg.value.push(data.data.msg);
if (data.code == 0) {
callBackMsg.value.push({
attr: 2,
msg: data.data.msg,
});
} else {
callBackMsg.value.push({
attr: 5,
msg: data.data.msg,
});
}
jiBuQiVal++;
progressSize.value = Math.round((jiBuQiVal / upLoadArg.total) * 10000) / 100;
nextTick(() => {
analysisData();
});
});
} else {
loading.value = false;
progressSize.value = 100;
excelUpload.value.clearFiles();
}
};
watch(
() => uploadMsg.value,
() => {
nextTick(() => {
if (innerRef.value!.clientHeight > 200) {
scrollbarRef.value!.setScrollTop(innerRef.value!.clientHeight);
}
});
},
{
deep: true,
}
);
</script>
<template>
<el-dialog
v-model="isShow"
:title="currOrgContName + '上传值班(加班)信息'"
width="600"
:before-close="closeupDoPage"
>
<el-form
ref="ruleFormRefUpDown"
style="width: 100%"
:model="pageInfo"
:rules="rulesPageInfo"
label-width="80"
>
<el-form-item label="行政组织" prop="orgId">
<el-select v-model="pageInfo.orgId" placeholder="请选择行政组织">
<el-option
v-for="item in props.orgList"
:key="item.id"
:label="item.name + '(' + item.id + ')'"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="导入类型" prop="types">
<el-radio-group v-model="pageInfo.types">
<el-radio :value="1">按月导入</el-radio>
<el-radio :value="2">指定日期导入</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="选择时间" prop="dateTime">
<el-date-picker
v-if="pageInfo.types == 1"
v-model="pageInfo.dateTime"
type="month"
placeholder="请选择月份"
value-format="x"
/>
<el-date-picker
v-else
v-model="pageInfo.dateTime"
type="date"
placeholder="请选择日期"
value-format="x"
/>
</el-form-item>
<el-form-item label="操作">
<el-link
type="primary"
:underline="false"
:href="
downloadUrl +
'?orgid=' +
pageInfo.orgId +
'&types=' +
pageInfo.types +
'&timeval=' +
pageInfo.dateTime
"
target="_blank"
>
<el-button type="warning" class="upDnBox"
>下载当前导入模板<i class="fa fa-download"
/></el-button>
</el-link>
</el-form-item>
<el-form-item label="">
<el-upload
ref="excelUpload"
v-loading="loading"
:action="uploadFFurl"
:headers="{ 'User-Key': userStore.userKey, 'User-Token': userStore.userToken }"
:data="{
orgId: pageInfo.orgId,
types: pageInfo.types,
dateTime: pageInfo.dateTime,
}"
:element-loading-text="upLoadText"
:before-upload="handleExcelChangeTemp"
:on-error="uploadError"
:on-success="uploadTrueStaff"
:on-remove="handleRemove"
:limit="1"
>
<el-button type="primary" class="upDnBox"
>上传导入数据<i class="fa fa-upload"
/></el-button>
</el-upload>
</el-form-item>
</el-form>
<el-divider content-position="left">导入反馈信息</el-divider>
<div style="width: 100%">
<el-progress
:text-inside="true"
:percentage="progressSize"
:stroke-width="20"
striped
striped-flow
:duration="10"
>
<span>已完成{{ progressSize }}%</span>
</el-progress>
</div>
<el-scrollbar height="400px" class="endMsg" ref="scrollbarRef" always>
<div ref="innerRef">
<p v-for="(item, index) in callBackMsg" :key="index" class="endMsg lineBox">
<el-text v-if="item.attr == 1" class="endMsg mx-1" type="primary">{{
item.msg
}}</el-text>
<el-text v-if="item.attr == 2" class="endMsg mx-1" type="success">{{
item.msg
}}</el-text>
<el-text v-if="item.attr == 3" class="endMsg mx-1" type="info">{{
item.msg
}}</el-text>
<el-text v-if="item.attr == 4" class="endMsg mx-1" type="warning">{{
item.msg
}}</el-text>
<el-text v-if="item.attr == 5" class="endMsg mx-1" type="danger">{{
item.msg
}}</el-text>
</p>
</div>
</el-scrollbar>
</el-dialog>
</template>
<style lang="scss" scoped>
.upDnBox {
margin-right: 5px;
i {
margin-left: 10px;
}
}
.endMsg {
width: 100%;
}
.lineBox {
border-bottom: 1px dashed rgba(200, 201, 204, 0.5);
}
</style>
Loading…
Cancel
Save