人员管理

This commit is contained in:
Paidax
2025-04-18 11:48:59 +08:00
parent 236f32a741
commit 300286fa58
20 changed files with 426 additions and 231 deletions
@@ -285,6 +285,7 @@ layout("/layouts/platform.html"){
const resp = await $.post(loc() + '/pull')
this.pullLoading = false
if(resp.code===0){
await this.getLatelyUpdateTimes()
this.pageData()
}else{
this.notifyWarning(resp.msg)
@@ -100,6 +100,7 @@ layout("/layouts/platform.html"){
style="width: 200px"
v-model="pageForm.changeDate"
type="date"
@change="doSearch"
value-format="yyyy-MM-dd"
placeholder="更新日期">
</el-date-picker>
@@ -134,26 +134,43 @@ const MEMBER_CHANGE = {
:disabled="allowFields('userState')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.userState == '退休'">
<el-descriptions-item label="退休日期">
<el-form-item prop="retireDate">
<el-date-picker v-model="formData.retireDate"
type="date"
placeholder="请选择出生日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="人员类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personType" code="PERSON_TYPE"
:disabled="allowFields('personType')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item v-if="formData.userState == null || formData.userState != '退休'"></el-descriptions-item>
<el-descriptions-item label="费用类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personalStatus" code="USER_PERSONAL_STATUS"
:disabled="allowFields('personalStatus')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.userState == '退休' && $auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')">
<el-descriptions-item label="退休日期">
<el-form-item prop="retireDate">
<el-date-picker v-model="formData.retireDate"
type="date"
placeholder="请选择退休日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">
<el-form-item prop="welfareStopDate">
<el-date-picker v-model="formData.welfareStopDate"
type="date"
placeholder="请选择福利享受截止日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">
<el-form-item prop="member">
<el-radio-group v-model="formData.member" size="small">
@@ -88,7 +88,7 @@ layout("/layouts/platform.html"){
</div>
<div class="search-item">
<div class="search-item-label">人员类型</div>
<div class="search-item-label">人员性质</div>
<div class="search-item-option">
<dict-select v-model="pageForm.preparedBy"
style="width: 100%"
@@ -97,14 +97,24 @@ layout("/layouts/platform.html"){
code="PREPARED_BY"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">费用类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personalStatus"
style="width: 100%"
clearable
placeholder="费用类型"
code="USER_PERSONAL_STATUS"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">变更类型:</div>
<div class="search-item-option">
<enum-select v-model="pageForm.changeTypes"
enum="MemberChangeType"
label="changeTypeName"
multiple
value="type"
style="width: 100%"
clearable
@@ -53,6 +53,13 @@ layout("/layouts/platform.html"){
display: none;
}
}
.monthStyle{
.el-date-picker__header--bordered {
display: none !important;
}
}
</style>
<div id="app" v-cloak>
@@ -181,30 +188,30 @@ layout("/layouts/platform.html"){
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">会员状态:</el-col>
<el-col class="query-row-content">
<el-tag
style="margin-right: 10px;cursor: pointer"
v-for="item in memberStatusOptions"
:key="item.code"
:type="item.name"
:effect="pageForm.memberStatus.includes(item.code)?'dark':'plain'"
@click="checkMemberStatusType(item.code)">
{{ item.name }}
</el-tag>
<!-- <el-row type="flex" align="middle" class="query-row">-->
<!-- <el-col class="query-row-title">会员状态:</el-col>-->
<!-- <el-col class="query-row-content">-->
<!-- <el-tag-->
<!-- style="margin-right: 10px;cursor: pointer"-->
<!-- v-for="item in memberStatusOptions"-->
<!-- :key="item.code"-->
<!-- :type="item.name"-->
<!-- :effect="pageForm.memberStatus.includes(item.code)?'dark':'plain'"-->
<!-- @click="checkMemberStatusType(item.code)">-->
<!-- {{ item.name }}-->
<!-- </el-tag>-->
<el-link type="danger"
v-if="memberStatusOptions.length&&pageForm.memberStatus.length"
:underline="false"
@click="pageForm.memberStatus=[];doSearch()">清空
</el-link>
<el-link :underline="false"
@click="pageForm.memberStatus=memberStatusOptions.map(p=>p.code);doSearch()"
type="success">全部
</el-link>
</el-col>
</el-row>
<!-- <el-link type="danger"-->
<!-- v-if="memberStatusOptions.length&&pageForm.memberStatus.length"-->
<!-- :underline="false"-->
<!-- @click="pageForm.memberStatus=[];doSearch()">清空-->
<!-- </el-link>-->
<!-- <el-link :underline="false"-->
<!-- @click="pageForm.memberStatus=memberStatusOptions.map(p=>p.code);doSearch()"-->
<!-- type="success">全部-->
<!-- </el-link>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">人员类型:</el-col>
<el-col class="query-row-content">
@@ -280,7 +287,33 @@ layout("/layouts/platform.html"){
</el-link>
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">费用类型:</el-col>
<el-col class="query-row-content">
<el-tag
style="margin-right: 10px;cursor: pointer"
v-for="item in personalStatusOptions"
:key="item.code"
:type="item.name"
:effect="pageForm.personalStatus.includes(item.name)?'dark':'plain'"
@click="tagClick('personalStatus',item.name)">
{{ item.name }}
</el-tag>
<el-link type="danger"
v-if="personalStatusOptions.length&&pageForm.personalStatus.length"
:underline="false"
@click="pageForm.personalStatus=[];doSearch()">清空
</el-link>
<el-link :underline="false"
@click="pageForm.personalStatus=personalStatusOptions.map(p=>p.code);doSearch()"
type="success">全部
</el-link>
</el-col>
</el-row>
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">系统角色:</el-col>
<el-col class="query-row-content">
@@ -334,14 +367,23 @@ layout("/layouts/platform.html"){
v-model="pageForm.startDate"
type="date"
@change="determineStartDate"
placeholder="选择开始日期">
placeholder="选择出生开始日期">
</el-date-picker>
<el-date-picker
v-model="pageForm.endDate"
type="date"
@change="determineEndDate"
placeholder="选择结束日期">
placeholder="选择出生结束日期">
</el-date-picker>
<el-date-picker
v-model="pageForm.birthMonth"
popper-class="monthStyle"
value-format="MM"
format="MM"
@change="doSearch"
type="month"
placeholder="请选择月度">
</el-date-picker>
</el-col>
</el-row>
@@ -560,6 +602,7 @@ layout("/layouts/platform.html"){
personTypes: [],
userStates: [],
preparedBys: [],
personalStatus: [],
memberStatus: [],
year: moment().format('YYYY'),
roleIds: [],
@@ -573,9 +616,11 @@ layout("/layouts/platform.html"){
startDate: '',
endDate: '',
memberType:2,
birthMonth: '',
},
personTypeOptions: [],
personalStatusOptions: [],
userStateOptions: [],
preparedByOptions: [],
memberStatusOptions: [],
@@ -645,6 +690,7 @@ layout("/layouts/platform.html"){
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.preparedBys = JSON.stringify(pageForm.preparedBys)
pageForm.personalStatus = JSON.stringify(pageForm.personalStatus)
pageForm.memberStatus = JSON.stringify(pageForm.memberStatus)
pageForm.memberTypes = JSON.stringify(pageForm.memberTypes)
@@ -667,18 +713,22 @@ layout("/layouts/platform.html"){
const personTypes = JSON.stringify(this.pageForm.personTypes)
const userStates = JSON.stringify(this.pageForm.userStates)
const preparedBys = JSON.stringify(this.pageForm.preparedBys)
const personalStatus = JSON.stringify(this.pageForm.personalStatus)
window.location.href = loc() + "/doExport?unionId=" + this.pageForm.unionId + "&unitId=" + this.pageForm.unitId
+ "&year=" + this.pageForm.year
+ "&birthMonth=" + this.pageForm.birthMonth
+ "&memberStatus=" + memberStatus
+ "&personTypes=" + personTypes
+ "&userStates=" + userStates
+ "&preparedBys=" + preparedBys
+ "&personalStatus=" + personalStatus
},
doExportByUnion() {
const memberStatus = JSON.stringify(this.pageForm.memberStatus)
const personTypes = JSON.stringify(this.pageForm.personTypes)
const userStates = JSON.stringify(this.pageForm.userStates)
const preparedBys = JSON.stringify(this.pageForm.preparedBys)
const personalStatus = JSON.stringify(this.pageForm.personalStatus)
const unionId = JSON.stringify(this.pageForm.unionId)
const unitId = JSON.stringify(this.pageForm.unitId)
const unionGroupId = JSON.stringify(this.pageForm.unionGroupId)
@@ -695,6 +745,7 @@ layout("/layouts/platform.html"){
const {
startDate,
endDate,
birthMonth,
campus,
memberType,
reverseSelection,
@@ -705,11 +756,11 @@ layout("/layouts/platform.html"){
window.location.href = loc() + "/doExportByUnion?=searchName=" + this.pageForm.searchName
+ "&searchKeyword=" + this.pageForm.searchKeyword + "&unitId=" + unitId + "&unionId=" + unionId
+ "&unionGroupId=" + unionGroupId + "&threeUnitId=" + threeUnitId + "&sexTypes=" + sexTypes + "&memberType=" + memberType
+ "&roleIds=" + roleIds + "&age=" + age + "&year=" + this.pageForm.year + "&memberStatus=" + memberStatus
+ "&roleIds=" + roleIds + "&age=" + age + "&year=" + this.pageForm.year + "&memberStatus=" + memberStatus + "&birthMonth=" + birthMonth
+ "&startDate=" + (startDate ? this.getDate(startDate) : '') + "&endDate=" + (endDate ? this.getDate(endDate) : '') + "&campus=" + (campus ? campus : '')
+ "&reverseSelection=" + (reverseSelection ? reverseSelection : '') + "&memberSearchName=" + (memberSearchName ? memberSearchName : '')
+ "&memberSearchKeyWord=" + (memberSearchKeyWord ? memberSearchKeyWord : '') + "&personTypes=" + personTypes
+ "&userStates=" + userStates + "&preparedBys=" + preparedBys + "&props=" + JSON.stringify(props)
+ "&userStates=" + userStates + "&preparedBys=" + preparedBys + "&personalStatus=" + personalStatus + "&props=" + JSON.stringify(props)
},
getDate(date) {
let year = date.getFullYear();
@@ -796,6 +847,7 @@ layout("/layouts/platform.html"){
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.preparedBys = JSON.stringify(pageForm.preparedBys)
pageForm.personalStatus = JSON.stringify(pageForm.personalStatus)
pageForm.memberStatus = JSON.stringify(pageForm.memberStatus)
pageForm.memberTypes = JSON.stringify(pageForm.memberTypes)
@@ -844,6 +896,7 @@ layout("/layouts/platform.html"){
this.pageForm.personTypes = []
this.pageForm.userStates = []
this.pageForm.preparedBys = []
this.pageForm.personalStatus = []
this.pageForm.unionId = []
this.pageForm.unitId = []
this.pageForm.activityGroupId = []
@@ -858,6 +911,7 @@ layout("/layouts/platform.html"){
this.pageForm.reverseSelection = false
this.pageForm.startDate = ''
this.pageForm.endDate = ''
this.pageForm.birthMonth = ''
this.doSearch()
},
tagClick(key, val) {
@@ -897,6 +951,7 @@ layout("/layouts/platform.html"){
this.flushUnits()
}
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.personalStatusOptions = await getDictOptions("USER_PERSONAL_STATUS")
this.userStateOptions = await getDictOptions("USER_STATE")
this.preparedByOptions = await getDictOptions("PREPARED_BY")
this.memberStatusOptions = await getDictOptions("memberStatusText")
@@ -43,10 +43,10 @@ const COMMON_QUERY = {
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型</div>
<div class="search-item-label">人员性质</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
<dict-select v-model="pageForm.preparedBy" style="width: 100%" placeholder="人员性质" @change="doSearch"
code="PREPARED_BY"></dict-select>
</div>
</div>
<div class="search-item">
@@ -153,25 +153,26 @@ layout("/layouts/platform.html"){
type: 'warning'
}).then(async () => {
const url = "/platform/sourcechange/manage/doBatchChange"
let isSendMsg = false
const isHasNewTeacher = this.checkUsers.some(v=> v.changeInfosStr === '新入职')
const ids = this.checkUsers.map(item => item.id)
if (isHasNewTeacher) {
this.$confirm('勾选用户中有新入职教工,是否对新入职教职工发送入会邀请?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
isSendMsg = true
this.doOperate(url, ids, isSendMsg)
}).catch(() => {
isSendMsg = false
this.doOperate(url, ids, isSendMsg)
})
} else {
await this.doOperate(url, ids, isSendMsg)
}
await this.doOperate(url, ids, false)
// let isSendMsg = false
// const isHasNewTeacher = this.checkUsers.some(v=> v.changeInfosStr === '新入职')
//
// const ids = this.checkUsers.map(item => item.id)
// if (isHasNewTeacher) {
// this.$confirm('勾选用户中有新入职教工,是否对新入职教职工发送入会邀请?', '提示', {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(() => {
// isSendMsg = true
// this.doOperate(url, ids, isSendMsg)
// }).catch(() => {
// isSendMsg = false
// this.doOperate(url, ids, isSendMsg)
// })
// } else {
// await this.doOperate(url, ids, isSendMsg)
// }
})
},
tableHandleSelectionChange(val){
@@ -179,22 +180,23 @@ layout("/layouts/platform.html"){
},
async doSubmit(formData){
const url = "/platform/sourcechange/manage/doSubmit"
let isSendMsg = false;
if (formData.changeInfosStr === '新入职') {
this.$confirm('该职工是新入职职工,是否发送入会邀请?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
isSendMsg = true
await this.doOperate(url, formData, isSendMsg)
}).catch(async () => {
isSendMsg = false
await this.doOperate(url, formData, isSendMsg)
})
} else {
await this.doOperate(url, formData, isSendMsg)
}
await this.doOperate(url, formData, false)
// let isSendMsg = false;
// if (formData.changeInfosStr === '新入职') {
// this.$confirm('该职工是新入职职工,是否发送入会邀请?', '提示', {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(async () => {
// isSendMsg = true
// await this.doOperate(url, formData, isSendMsg)
// }).catch(async () => {
// isSendMsg = false
// await this.doOperate(url, formData, isSendMsg)
// })
// } else {
// await this.doOperate(url, formData, isSendMsg)
// }
},
async doOperate(url, data, isSendMsg) {
const loading = this.$loading({
@@ -26,8 +26,14 @@ const USER_CHANGE_INFO = {
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="进校时间">{{ viewData.schoolTime }}</el-descriptions-item>
<template v-if="viewData.userState == '退休'">
<el-descriptions-item label="退休日期">{{ viewData.retireDate ? moment(viewData.retireDate).format("YYYY-MM-DD") : '暂无' }}</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">{{ moment(viewData.welfareStopDate).format("YYYY-MM-DD") }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
@@ -189,26 +195,18 @@ const USER_CHANGE_INFO = {
:disabled="allowFields('userState')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.userState == '退休'">
<el-descriptions-item label="退休日期">
<el-form-item prop="retireDate">
<el-date-picker v-model="formData.retireDate"
type="date"
:disabled="isView"
placeholder="请选择出生日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="人员类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personType" code="PERSON_TYPE"
:disabled="allowFields('personType')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item v-if="formData.userState == null || formData.userState != '退休'"></el-descriptions-item>
<el-descriptions-item label="费用类型">
<el-form-item prop="personalStatus">
<dict-select v-model="formData.personalStatus" code="USER_PERSONAL_STATUS"
:disabled="allowFields('personalStatus')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="会员状态">
<el-form-item prop="member">
@@ -229,8 +227,34 @@ const USER_CHANGE_INFO = {
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<template v-if="formData.userState == '退休'">
<el-descriptions-item label="退休日期">
<el-form-item prop="retireDate">
<el-date-picker v-model="formData.retireDate"
type="date"
:disabled="isView"
placeholder="请选择退休日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">
<el-form-item prop="welfareStopDate">
<el-date-picker v-model="formData.welfareStopDate"
type="date"
:disabled="isView"
placeholder="请选择福利享受截止日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<template v-if="formData.member == 1 && !isView">
<el-descriptions-item label="是否加入会员组别">
<el-form-item prop="member">