This commit is contained in:
Paidax
2025-02-20 13:56:04 +08:00
parent 409ff2e0bb
commit bce946e651
189 changed files with 9732 additions and 4037 deletions
@@ -209,4 +209,83 @@
::-webkit-scrollbar-thumb {
background-color: silver;
border-radius: 3px
}
}
.process-task-record .el-descriptions__header {
margin: 0;
/*border: 1px solid var(--border-color-lighter);*/
border-bottom: 0;
padding: 10px 5px;
/*background: var(--table-header-background-color);*/
color: #1867b0;
}
.process-task-record .el-descriptions__header .el-descriptions__title {
font-weight: 600;
letter-spacing: 1px;
font-size: 14px;
}
.process-task-record .el-descriptions {
margin-bottom: 10px;
}
.process-title {
font-size: 20px;
color: #000000;
font-weight: 600;
margin: 10px 0 10px 0;
padding-left: 10px;
position: relative;
line-height: 1.1;
font-family: inherit;
}
.process-title::before {
content: "";
width: 5px;
background: #1867b0;
display: inline-block;
position: absolute;
left: 0;
top: 0;
bottom: 0;
}
.signature-image {
height: 100px;
width: auto;
}
.form-box {
margin: 0 auto;
}
.descriptions-form .el-form-item {
margin-bottom: 0;
}
.descriptions-form th.el-descriptions-item__label:has(+ td.el-descriptions-item__content > div.el-form-item.is-required):before {
content: "*";
color: #f56c6c;
margin-right: 3px;
}
.descriptions-form .el-form-item .el-form-item__label {
display: none;
}
.descriptions-form .el-form-item .el-form-item__content > div {
width: 100%;
}
.descriptions-form .el-form-item input, .descriptions-form .el-form-item textarea {
/*border: none;*/
}
.descriptions-form .el-form-item .el-date-editor {
width: 100%;
}
@@ -0,0 +1,68 @@
const commonUtil = {
//权限认证
authService() {
function authPermission(permission) {
// if (typeof permission !== "string" || !permission.trim()) {
// return false
// }
// const permissions = store.state.user.permissions
// if (!Array.isArray(permissions) || permissions.length === 0) {
// return false
// }
// const permissionsSet = new Set(permissions)
// return permissionsSet.has(permission.trim())
}
function authRole(role) {
if (typeof role !== "string" || !role.trim()) {
return false
}
const user = JSON.parse(window.sessionStorage.getItem('user'))
const roles = user.roles.map((item) => item.code)
if (!Array.isArray(roles) || roles.length === 0) {
return false
}
const rolesSet = new Set(roles)
return rolesSet.has(role.trim())
}
return {
// 验证用户是否具备某权限
hasPermission(permission) {
return authPermission(permission)
},
// 验证用户是否含有指定权限,只需包含其中一个
hasPermissionOr(permissionsOrPermissionsStr) {
const permissions = Array.isArray(permissionsOrPermissionsStr) ? permissionsOrPermissionsStr : permissionsOrPermissionsStr.split(",")
return permissions.some((item) => {
return authPermission(item)
})
},
// 验证用户是否含有指定权限,必须全部拥有
hasPermissionAnd(permissionsOrPermissionsStr) {
const permissions = Array.isArray(permissionsOrPermissionsStr) ? permissionsOrPermissionsStr : permissionsOrPermissionsStr.split(",")
return permissions.every((item) => {
return authPermission(item)
})
},
// 判断用户是否拥有某个角色
hasRole(role) {
return authRole(role)
},
// 判断用户是否拥有某些角色中的任意一个
hasRoleOr(rolesOrRoleStr) {
const roles = Array.isArray(rolesOrRoleStr) ? rolesOrRoleStr : rolesOrRoleStr.split(",")
return roles.some((item) => {
return authRole(item.trim())
})
},
// 判断用户是否拥有某些角色中的所有
hasRoleAnd(rolesOrRoleStr) {
const roles = Array.isArray(rolesOrRoleStr) ? rolesOrRoleStr : rolesOrRoleStr.split(",")
return roles.every((item) => {
return authRole(item)
})
}
}
},
}
@@ -154,7 +154,7 @@
<el-form-item prop="updateUserState" label="是否改变在职状态" style="width: 100%">
<dict-select v-model="formData.changeUserState" style="width: 100%" clearable
placeholder="是否改变在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</el-form-item>
</el-col>
</el-row>
@@ -169,7 +169,7 @@
<el-form-item prop="updateUserState" label="是否改变人员类型" style="width: 100%">
<dict-select v-model="formData.changePersonType" style="width: 100%" clearable
placeholder="是否改变人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</el-form-item>
</el-col>
</el-row>
@@ -201,7 +201,7 @@
<el-form-item prop="education" label="新的学历" style="width: 100%">
<dict-select v-model="formData.changeEducation" style="width: 100%" clearable
placeholder="请选择新的学历"
code="Education"></dict-select>
code="USER_EDUCATION"></dict-select>
</el-form-item>
</div>
@@ -76,7 +76,7 @@
<div class="is-flex">
<el-form-item prop="education" label="学&emsp;&emsp;历">
<dict-select v-model="formData.education" style="width: 100%" placeholder="请选择学历" code="Education"></dict-select>
<dict-select v-model="formData.education" style="width: 100%" placeholder="请选择学历" code="USER_EDUCATION"></dict-select>
</el-form-item>
<el-form-item prop="academicDegree" label="学&emsp;&emsp;位">
@@ -84,7 +84,7 @@
v-model="formData.academicDegree"
style="width: 100%"
placeholder="请选择学位"
code="academicDegree"
code="USER_ACADEMIC_DEGREE"
></dict-select>
</el-form-item>
</div>
@@ -100,7 +100,7 @@
v-model="formData.political"
style="width: 100%"
placeholder="请选择政治面貌"
code="political"
code="USER_POLITICAL"
></dict-select>
</el-form-item>
</div>
@@ -110,7 +110,7 @@
v-model="formData.personType"
style="width: 100%"
placeholder="请选择人员类型"
code="UserType"
code="PERSON_TYPE"
></dict-select>
</el-form-item>
@@ -119,7 +119,7 @@
v-model="formData.userState"
style="width: 100%"
placeholder="请选择在职状态"
code="UserState"
code="USER_STATE"
></dict-select>
</el-form-item>
</div>
@@ -95,7 +95,7 @@
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
@change="doSearch"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -105,7 +105,7 @@
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
@change="doSearch"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -665,8 +665,8 @@ module.exports = {
}*/
await this.flushUnits()
await this.getActivityGroup()
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
await this.getMenuOptions()
await this.pageData()
},
@@ -81,8 +81,8 @@ module.exports = {
clearInterval(signatureInterval)
const ts = new Date().getTime() + (Math.floor(Math.random() * (1000 - 1 + 1)) + 1).toString()
console.log(ts)
// this.postAddress = location.protocol + '//' + location.host + '/signature?prefix=' + this.prefix + '&id=' + ts + "&is_value_base64=" + this.is_value_base64
this.postAddress = 'https://zhgh.hmc.edu.cn/signature?prefix=' + this.prefix + '&id=' + ts + "&is_value_base64=" + this.is_value_base64
this.postAddress = location.protocol + '//' + location.host + '/signature?prefix=' + this.prefix + '&id=' + ts + "&is_value_base64=" + this.is_value_base64
// this.postAddress = 'https://zhgh.hmc.edu.cn/signature?prefix=' + this.prefix + '&id=' + ts + "&is_value_base64=" + this.is_value_base64
this.showQrCode = true
@@ -64,7 +64,7 @@
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
@change="doSearch"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -74,7 +74,7 @@
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
@change="doSearch"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -624,8 +624,8 @@ module.exports = {
}
await this.flushUnits()
await this.getActivityGroup()
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
await this.getMenuOptions()
await this.pageData()
},
@@ -103,6 +103,7 @@
<script src="${base!}/components/plugins/sysDict/DictData.js"></script>
<script src="${base!}/assets/platform/js/chengSh.js"></script>
<script src="${base!}/assets/platform/js/util/commonUtil.js"></script>
<script src="${base!}/assets/platform/plugins/xlsx/xlsx.full.min.js"></script>
<!-- <script src="${base!}/assets/platform/js/chengSh.js"></script>-->
@@ -144,7 +145,7 @@
};
window.viewImage = viewImage;
Vue.prototype.$viewImage = viewImage
Vue.prototype.$auth = commonUtil.authService()
</script>
</head>
<body>
@@ -0,0 +1,15 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
</div>
<script>
new Vue({
el: '#app',
})
</script>
<!--#
}
#-->
@@ -296,8 +296,8 @@ layout("/layouts/platform.html"){
}
this.flushUnits()
await this.getActivityGroup()
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
await this.getMenuOptions()
this.pageData()*/
@@ -120,7 +120,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
@change="doSearch"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -130,7 +130,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
@change="doSearch"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -87,7 +87,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -96,7 +96,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -48,12 +48,12 @@ layout("/layouts/platform.html"){
<div class="btn-group tool-button mt5">
<dict-select v-model="pageForm.personType" style="width: 200px" clearable placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
<div class="btn-group tool-button mt5">
<dict-select v-model="pageForm.userState" style="width: 200px" clearable placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
<div class="btn-group tool-button mt5">
@@ -61,13 +61,13 @@ layout("/layouts/platform.html"){
<div class="btn-group tool-button">
<dict-select v-model="pageForm.personType" style="width: 200px"
clearable placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
<div class="btn-group tool-button">
<dict-select v-model="pageForm.userState" style="width: 200px" clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
<div class="btn-group tool-button">
<el-button type="primary" icon="el-icon-search"
@@ -503,8 +503,8 @@ layout("/layouts/platform.html"){
},
},
async created() {
const personType = await getDictOptions("UserType")
const userState = await getDictOptions("userState")
const personType = await getDictOptions("PERSON_TYPE")
const userState = await getDictOptions("USER_STATE")
this.fields = this.fields.concat([{
label: '人员类型',
@@ -531,4 +531,4 @@ layout("/layouts/platform.html"){
<!--#
}
#-->
#-->
@@ -191,7 +191,7 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :span="12">
<el-form-item prop="education" label="学历">
<dict-select v-model="formData.education" code="Education"></dict-select>
<dict-select v-model="formData.education" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-col>
</el-row>
@@ -104,7 +104,7 @@ layout("/layouts/platform.html"){
width="150px"
show-overflow-tooltip>
<template scope="{row}">
<dict-select v-model="row.education" code="Education"
<dict-select v-model="row.education" code="USER_EDUCATION"
v-if="row.stateCode===0"></dict-select>
<span v-else>{{row.education}}</span>
</template>
@@ -0,0 +1,205 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审核列表">
<template #func>
<el-radio-group @change="search" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-if="column.prop=='allocationUnionName'">
<el-tag v-if="row.allocationUnionName">{{ row.allocationUnionName }}</el-tag>
<el-tag v-else type="danger">未分配</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="[50].includes(row.applyStateId)" @click="openAudit(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="[70].includes(row.applyStateId)" @click="doRevoke(row)" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-apply-audit-info ref="memberApplyAuditInfoRef"></member-apply-audit-info>
<div v-if="showApprovalForm">
<div class="process-title" style="margin: 20px 0">分工会审核</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.username" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.auditTime" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="300"
placeholder="请填写审核意见" show-word-limit></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核签字" prop="auditSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<sign :is_value_base64="false" :qz.sync="formData.auditSign" prefix="member_apply_audit" ref="sign"></sign>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval(2)">退回重新申请</el-button>
<el-button type="danger" @click="doApproval(0)">拒绝接收</el-button>
<el-button type="primary" @click="doApproval(1)">同意接收</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
<!--#include("../common/memberApplyAuditInfo.js"){}#-->
<!--#include("../../common/memberInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "allocationUnionName", label: "分配工会", sortable: true },
{ prop: "stateName", label: "当前节点", sortable: true }
],
id: '',
showApprovalForm: false
}
},
components: {
'common-query': COMMON_QUERY,
'member-apply-audit-info': MEMBER_APPLY_AUDIT_INFO,
'member-info': MEMBER_INFO,
},
methods: {
openView(row){
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = false
this.$refs.memberApplyAuditInfoRef.onOpen(row.id)
})
},
openAudit(row){
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.id = row.id
this.formData.username = user.username
this.formData.auditTime = moment().format('YYYY-MM-DD HH:mm:ss')
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = true
this.$refs.memberApplyAuditInfoRef.onOpen(row.id)
})
},
doApproval(approvalType){
let msg = '确定要通过此条申请吗?'
if (approvalType === 0) {
msg = '拒绝后不可撤回,确定要拒绝此条申请吗?'
} else if (approvalType === 2) {
msg = '确定要退回此条申请吗?'
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.auditType = approvalType
this.$refs.approvalFormRef.validate(async (valid) => {
if (valid) {
const resp = await $.post('/platform/member/apply/branchUnion/audit/approval', {
audit: JSON.stringify(this.formData),
id: this.id
})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$refs.guava.index()
this.showApprovalForm = false
this.pageData()
} else {
this.$message.error(resp.msg)
}
}
})
})
},
doRevoke(row){
this.$confirm('确定要撤回该申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.post('/platform/member/apply/branchUnion/audit/doRevoke', {id: row.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.pageData()
} else {
this.$message.error(resp.msg)
}
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created(){
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,90 @@
const COMMON_QUERY = {
template: /*language=HTML*/ `
<div class="search">
<div class="search-item">
<div class="search-item-label">姓名/工号</div>
<div class="search-item-option">
<el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"></el-input>
</div>
</div>
<template v-if="$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, BranchUnionMemberAdmin')">
<div class="search-item">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="请选择所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位</div>
<div class="search-item-option">
<el-select clearable filterable placeholder="请选择所属单位" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</div>
</div>
<div class="search-item">
<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>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
`,
mixins: [initTableMixins],
data() {
return{
unions: [],
units: [],
pageForm: {
searchKeyword: '',
unionId: '',
unitId: '',
userState: '',
personType: ''
}
}
},
methods: {
doSearch(){
this.$emit('search', this.pageForm)
},
async initData(){
if (this.$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')) {
this.unions = await getUnions(this.pageForm.unionId)
this.units = await getUnits()
} else {
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.unions = await getUnions(user.union.id)
this.units = await getUnits(user.union.id)
}
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await getUnits(this.pageForm.unionId)
}
}
},
async created() {
this.initData()
}
}
@@ -0,0 +1,109 @@
const MEMBER_APPLY_AUDIT_INFO = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeName">
<el-tab-pane label="申请信息" name="basicInfo">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ moment(viewData.birthday).format("YYYY年MM月DD日") }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.userUnitName }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.userUnionName }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<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.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<template slot="label">个人简况</template>
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="校工会审核信息" name="school" v-if="viewData.schoolAudit">
<div class="process-title">校工会审核信息</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">{{ viewData.schoolAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ viewData.schoolAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="分配工会" :span="2">
<el-tag>{{ viewData.allocationUnionName }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">{{ viewData.schoolAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="分工会接收信息" name="branch" v-if="viewData.branchAudit">
<div class="process-title">分工会接收信息</div>
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">{{ viewData.branchAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ viewData.branchAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">{{ viewData.branchAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</div>
`,
data() {
return{
activeName: "basicInfo",
viewData: {
schoolAudit: {},
branchAudit: {}
}
}
},
methods: {
async onOpen(id){
const resp = await $.post('/platform/member/apply/mine/findMemberApplyRecord', {id})
if (resp.code === 0) {
this.viewData = resp.data
this.$emit('union-name', this.viewData.userUnionName)
if (this.viewData.families) {
this.viewData.families = JSON.parse(this.viewData.families)
} else {
this.viewData.families = []
}
}
}
}
}
@@ -1,546 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.v-body {
display: flex;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
background-color: #f0f2f5;
}
.v-card {
width: calc(100% - 0px);
height: calc(100% - 0px);
position: relative;
}
.transition-row {
width: 100%;
height: 100%;
}
.transition-item {
width: 100%;
height: 100%;
}
.demo-table-expand {
font-size: 0;
}
.demo-table-expand label {
color: #99a9bf;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<div class="v-body">
<el-card class="v-card" shadow="never">
<el-tabs v-model="activeName">
<el-tab-pane label="申请入会" name="first">
<div style="display: flex;width: 100%;height: 100%;align-items: center;justify-content: center;position: relative;padding: 10px">
<el-card style="width: 500px">
<div slot="header" class="clearfix">
<h4>工会信息</h4>
</div>
<div v-loading="unionInfoLoading">
<el-form label-suffix=":" label-width="120px">
<el-form-item label="工会名称">{{unionInfo.unionname}}
</el-form-item>
<el-form-item label="工会编码">{{unionInfo.unioncode}}
</el-form-item>
<el-form-item label="工会负责人">{{unionInfo.manager}}
</el-form-item>
<el-form-item label="联系电话">{{unionInfo.telephone}}
</el-form-item>
<el-form-item label="加入方式">
<el-radio-group v-model="memberStates">
<el-radio :label="1">新增</el-radio>
<!-- <el-radio :label="2">转入</el-radio>-->
</el-radio-group>
</el-form-item>
</el-form>
<el-button
v-if="unionInfo.member !== 1"
:disabled="!((unionInfo.apply||unionInfo.reApply))"
type="primary"
@click="apply"
style="width: 70%;margin-left: 15%;margin-top: 20px">
<span v-if="unionInfo.apply||unionInfo.reApply">{{unionInfo.reApply?'重新申请':'加入'}}</span>
<span v-else-if="unionInfo.record">{{unionInfo.record.stateName}}</span>
<span v-else>您已是会员</span>
</el-button>
</div>
</el-card>
</div>
</el-tab-pane>
<el-tab-pane label="个人信息" name="second">
<div style="padding: 0 8%;padding-top: 50px">
<member ref="memberInfo"
:id="'${@shiro.getPrincipalProperty('id')}'" view></member>
</div>
</el-tab-pane>
<el-tab-pane label="申请记录" name="third">
<el-table :data="unionInfo.records" style="width: 100%" row-key="id"
@expand-change="onExpand">
<el-table-column type="expand">
<template slot-scope="{row}">
<el-form class="demo-table-expand" v-loading="row.loading"
label-position="right" label-suffix=""
label-width="120px">
<el-form>
<el-form-item label="分工会审核信息&emsp;"
label-width="180px"
class="view-header">
</el-form-item>
</el-form>
<el-row :gutter="20"
v-if="row.info&&row.info.unionAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.unionAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.unionAudit.auditTime }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.unionAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
<el-form>
<el-form-item label="校工会审核信息&emsp;"
label-width="180px"
class="view-header">
</el-form-item>
</el-form>
<el-row :gutter="20"
v-if="row.info&&row.info.schoolAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ row.info.schoolAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ row.info.schoolAudit.auditTime }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ row.info.schoolAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</el-form>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号"
type="index"></el-table-column>
<el-table-column label="申请人" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="申请时间" prop="applyTime" header-align="center"
align="center"></el-table-column>
<el-table-column label="工会" prop="unionname" header-align="center"
align="center"></el-table-column>
<el-table-column label="状态" prop="stateId" header-align="center"
align="center">
<template scope="{row}">
<span :style="'color:'+row.stateColor">{{ row.stateName }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</el-card>
</div>
</template>
<template #edit_func>
<!-- <el-button type="primary" @click="doSubmit">提交</el-button>-->
</template>
<template #edit>
<div style="width: 800px;margin: 0 auto;">
<h3 style="text-align: center">中华全国总工会</h3>
<div style="text-align: center">入会申请书</div>
<p style="text-indent: 2em">
我自愿加入中华全国总工会,遵守工会章程,执行工会决议,积极参加工会活动,为全面建成小康社会、把我国建设成为富强民主文明和谐美丽的社会主义现代化强国、实现中华民族伟大复兴的中国梦而奋斗。
</p>
</div>
<el-form :model="formData" :rules="rules" ref="AddForm" label-width="170px">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="姓名" prop="username">
<el-input disabled placeholder="姓名"
v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工号" prop="loginname">
<el-input disabled placeholder="工号"
v-model="formData.loginname"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性别" prop="sex">
<el-radio v-model="formData.sex" label="男" border size="small">
</el-radio>
<el-radio v-model="formData.sex" label="女" border size="small">
</el-radio>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="nation" label="民族">
<el-select placeholder="民族" style="width: 100%" filterable v-model="formData.nation">
<el-option v-for="nation in nationOptions" :key="nation" :value="nation"
:label="nation"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="education" label="学历">
<dict-select v-model="formData.education" style="width: 100%"
placeholder="请选择学历"
code="Education"></dict-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="academicDegree" label="学位">
<dict-select v-model="formData.academicDegree" style="width: 100%"
placeholder="请选择学位"
code="academicDegree"></dict-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="political" label="政治面貌">
<el-input maxlength="100" placeholder="政治面貌"
v-model="formData.political"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="userState" label="人员类型">
<dict-select v-model="formData.personType" style="width: 100%" placeholder="请选择人员类型"
code="UserType"></dict-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="idcard" label="身份证号">
<el-input v-model="formData.idcard" placeholder="身份证号"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="mobile" label="联系电话">
<el-input maxlength="100" placeholder="联系电话"
v-model="formData.mobile"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="unitid" label="所属单位">
<el-select placeholder="所属单位"
style="width: 100%"
filterable @change="unitChange"
v-model="formData.unitid">
<el-option v-for="unit in unitOptions" :key="unit.id" :value="unit.id"
:label="unit.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="registeredResidence" label="户口所在地">
<el-input maxlength="50" placeholder="请填写户口所在地"
v-model="formData.registeredResidence" type="textarea"
rows="3"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="homeAddress" label="现居住地">
<el-input maxlength="50" placeholder="请填写现居住地"
v-model="formData.homeAddress" type="textarea"
rows="3"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="vita" label="个人工作简历">
<el-input maxlength="500" placeholder="请填写个人工作简历"
v-model="formData.vita" type="textarea"
rows="3"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="specialSkill" label="特长">
<el-input maxlength="50" placeholder="请填写特长"
v-model="formData.specialSkill" type="textarea"
rows="3"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="家庭成员">
<span style="color: red">(已结婚填配偶信息,未结婚填父母信息)</span>
<el-table
:data="formData.family"
border
size="mini"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center"
header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入与本人关系" maxlength="30"
v-model="scope.row.relation"
clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" align="center"
header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入姓名" maxlength="100"
v-model="scope.row.name" clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="unit" label="单位" align="center"
header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入单位" maxlength="100"
v-model="scope.row.unit" clearable></el-input>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" align="center"
header-align="center">
<template slot-scope="scope">
<el-input placeholder="请输入备注" maxlength="100"
v-model="scope.row.remark" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100px" align="center"
header-align="center">
<template slot="header" slot-scope="scope">
<el-button type="primary"
size="mini"
icon="el-icon-plus"
@click="formData.family.push({})">
</el-button>
</template>
<template slot-scope="scope">
<el-button type="danger" icon="el-icon-delete"
size="mini"
:disabled="formData.family.length===0"
@click="formData.family.splice(scope.$index,1)"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()">取消</el-button>
<el-button type="primary" @click="doSubmit">提交</el-button>
</el-row>
</template>
<template #view>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
dicts: ['memberApplyPersonType'],
mixins: [initTableMixins],
data() {
return {
formData: {
family: []
},
reading: false,
activeName: 'first',
unionInfoLoading: true,
unionInfo: {},
memberStates: 1,
rules: {
sex: [{required: true, message: '必填', trigger: ['blur', 'change']}],
education: [{required: true, message: '必填', trigger: ['blur', 'change']}],
academicDegree: [{required: true, message: '必填', trigger: ['blur', 'change']}],
political: [{required: true, message: '必填', trigger: ['blur', 'change']}],
idcard: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
position: [{required: true, message: '必填', trigger: ['blur', 'change']}],
homeAddress: [{required: true, message: '必填', trigger: ['blur', 'change']}],
specialSkill: [{required: true, message: '必填', trigger: ['blur', 'change']}],
registeredResidence: [{
required: true,
message: '必填',
trigger: ['blur', 'change']
}],
},
nationOptions: nation,
unitOptions: [],
}
},
components: {
'member': httpVueLoader('/components/member/MemberInfo.vue?v='+ new Date().getTime()),
},
methods: {
async onExpand(row) {
this.$set(row, "loading", true)
const resp = await $.get("/platform/member/common/findApplyInfo", {id: row.id})
this.$set(row, "loading", false)
if (resp.code === 0) {
this.$set(row, "info", resp.data)
} else {
this.$set(row, "info", {})
this.notifyWarning(resp.msg)
}
},
async doApply(user) {
if (!this.reading) {
this.$notify.warning({title: '提示', message: '请勾选阅读须知'});
return
}
const resp = await $.get(loc() + "/doApply", {memberStates: this.memberStates})
if (resp.code === 0) {
await this.getUnionInfo()
this.$refs.memberInfo.getUserInfo()
this.$refs.guava.index()
} else {
this.notifyWarning(resp.msg)
}
},
doSubmit() {
this.$refs['AddForm'].validate(async (valid) => {
if (valid) {
const formData = clone(this.formData)
formData.family = JSON.stringify(this.formData.family)
await $.post("/platform/member/apply/submit/doEdit", formData)
const resp = await $.get(loc() + "/doApply", {memberStates: this.memberStates})
if (resp.code === 0) {
await this.getUnionInfo()
this.$refs.memberInfo.getUserInfo()
this.$refs.guava.index()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
}
})
},
async apply() {
const values = this.dict.type.memberApplyPersonType.map(v => v.value)
const personType = "${@shiro.getPrincipalProperty('personType')}"
const msg = '您当前的人员类型是<span style="color: red">' + (personType || '空') + '</span>,目前只允许<strong>' + values.join('、') + '</strong>加入会员,如有疑问,请联系校工会进行更改。'
if (!values.includes(personType)) {
this.$alert(msg, '提示', {
confirmButtonText: '确定',
dangerouslyUseHTMLString: true
})
return
}
this.$refs.guava.edit()
},
async getUnionInfo() {
this.unionInfoLoading = true
const resp = await $.get(loc() + "/unionInfo")
this.unionInfoLoading = false
if (resp.code === 0) {
this.unionInfo = resp.data
this.formData = resp.data
this.$set(this.formData, "family", resp.data.family ? JSON.parse(resp.data.family) : [])
this.formData = resp.data
} else {
this.notifyWarning(resp.msg)
}
},
async unitChange(v) {
const unit = this.unitOptions.find(x => x.id == v)
if (unit) {
this.formData.unionid = unit.unionid
this.formData.unionname = unit.unionname
} else {
this.formData.unionid = ''
this.formData.unionname = ''
}
},
},
async created() {
this.getUnionInfo()
this.unitOptions = await getUnionUnits()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,126 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="申请列表">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.applyStateId === 10"
@click="sublime.jumpPagePjax('/platform/member/apply/submit?id=' + row.id)"
size="mini" type="primary">编辑</el-button>
<!-- <el-button v-if="row.applyStateId === 20" @click="doRevoke(row)" size="mini" type="warning">撤销</el-button>-->
<el-button v-if="row.applyStateId === 10" @click="doDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-apply-audit-info ref="memberApplyAuditInfoRef"></member-apply-audit-info>
</template>
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
<!--#include("../common/memberApplyAuditInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "stateName", label: "当前节点", sortable: true }
],
}
},
components: {
'common-query': COMMON_QUERY,
'member-apply-audit-info': MEMBER_APPLY_AUDIT_INFO
},
methods: {
openView(row){
this.$refs.guava.view()
this.$nextTick(() => {
this.$refs.memberApplyAuditInfoRef.onOpen(row.id)
})
},
async doRevoke(row){
const confirm = await this.$confirm('确定要撤销该条申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post("/platform/member/apply/mine/doRevoke", { id: row.id })
if (resp.code === 0) {
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
}
},
async doDelete(row){
const confirm = await this.$confirm('确定要删除该条申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post("/platform/member/apply/mine/doDelete", { id: row.id })
if (resp.code === 0) {
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
}
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created(){
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,237 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审核列表">
<template #func>
<el-radio-group @change="search" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-if="column.prop=='allocationUnionName'">
<el-tag v-if="row.allocationUnionName">{{ row.allocationUnionName }}</el-tag>
<el-tag v-else type="danger">未分配</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="[20, 70].includes(row.applyStateId)" @click="openAudit(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="[30, 50].includes(row.applyStateId)" @click="doRevoke(row)" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-apply-audit-info ref="memberApplyAuditInfoRef" @union-name="getApplyUserUnion"></member-apply-audit-info>
<div v-if="showApprovalForm">
<div class="process-title" style="margin: 20px 0">校工会审核</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="校工会审核人" prop="username" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.username" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.auditTime" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="分配工会关系" prop="unionId" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-select clearable filterable placeholder="请选择工会" style="width: 100%;"
v-model="formData.unionId">
<el-option :key="item.id" :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前所在工会" prop="unionName">
<el-input v-model="unionName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="300"
placeholder="请填写审核意见" show-word-limit></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核签字" prop="auditSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<sign :is_value_base64="false" :qz.sync="formData.auditSign" prefix="member_apply_audit" ref="sign"></sign>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval(2)">退回重新申请</el-button>
<el-button type="danger" @click="doApproval(0)">拒绝申请</el-button>
<el-button type="primary" @click="doApproval(1)">同意申请</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
<!--#include("../common/memberApplyAuditInfo.js"){}#-->
<!--#include("../../common/memberInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
pageForm: {
audit: false
},
unions: [],
unionName: '',
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "allocationUnionName", label: "分配工会", sortable: true },
{ prop: "stateName", label: "当前节点", sortable: true }
],
id: '',
showApprovalForm: false,
}
},
components: {
'common-query': COMMON_QUERY,
'member-apply-audit-info': MEMBER_APPLY_AUDIT_INFO,
'member-info': MEMBER_INFO,
},
methods: {
getApplyUserUnion(unionName){
this.unionName = unionName
},
openView(row){
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = false
this.$refs.memberApplyAuditInfoRef.onOpen(row.id)
})
},
openAudit(row){
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.id = row.id
this.formData = {}
this.formData.username = user.username
this.formData.auditTime = moment().format('YYYY-MM-DD HH:mm:ss')
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = true
this.$refs.memberApplyAuditInfoRef.onOpen(row.id)
})
},
doApproval(approvalType){
let msg = '确定要通过此条申请吗?'
if (approvalType === 0) {
msg = '拒绝后不可撤回,确定要拒绝此条申请吗?'
} else if (approvalType === 2) {
msg = '确定要退回此条申请吗?'
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.auditType = approvalType
this.$refs.approvalFormRef.validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '提交中,请稍后...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const resp = await $.post('/platform/member/apply/schoolUnion/audit/approval', {
audit: JSON.stringify(this.formData),
id: this.id,
unionId: this.formData.unionId
})
loading.close()
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$refs.guava.index()
this.showApprovalForm = false
this.pageData()
} else {
this.$message.error(resp.msg)
}
}
})
})
},
doRevoke(row){
this.$confirm('确定要撤回该申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.post('/platform/member/apply/schoolUnion/audit/doRevoke', {id: row.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.pageData()
} else {
this.$message.error(resp.msg)
}
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
async created(){
this.pageData()
this.unions = await getUnions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,325 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never">
<div class="process-title">入会申请</div>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">
<el-form-item prop="loginname">
<el-input v-model="formData.loginname" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="姓名">
<el-form-item prop="username">
<el-input v-model="formData.username" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label="男"></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation"
code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生日期">
<el-form-item prop="birthday">
<el-date-picker v-model="formData.birthday" type="date"
placeholder="请选择出生日期"
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="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political"
code="USER_POLITICAL"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education"
code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学位">
<el-form-item prop="academicDegree">
<dict-select style="width: 100%" placeholder="请选择学位" v-model="formData.academicDegree"
code="USER_ACADEMIC_DEGREE"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="党政职务">
<el-form-item prop="position">
<el-input v-model="formData.position" placeholder="请输入党政职务"
maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
disabled @change="getUnionName(formData.unitId)"
v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" disabled placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属校区">
<el-form-item prop="campus">
<dict-select style="width: 100%" placeholder="请选择所属校区" v-model="formData.campus"
code="USER_CAMPUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="在职状态">
<el-form-item prop="userState">
<dict-select v-model="formData.userState" code="USER_STATE"
style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="人员类型">
<el-form-item prop="personType">
<dict-select v-model="formData.personType" code="PERSON_TYPE"
style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入联系电话" maxlength="32"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-form-item prop="families">
<el-table :data="formData.families" border size="small">
<el-table-column label="关系" prop="relation">
<template slot-scope="{row}">
<el-input v-model="row.relation" maxlength="50"
placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template slot-scope="{row}">
<el-input v-model="row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="工作单位" prop="unit">
<template slot-scope="{row}">
<el-input v-model="row.unit" maxlength="100"
placeholder="请输入工作单位"></el-input>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template slot-scope="{row}">
<el-input v-model="row.remark" maxlength="100" placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini"
@click="formData.families.push({})">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.families.length===0"
@click="formData.families.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="个人简况(简历、获奖情况、有何特长)" :span="3">
<el-form-item prop="vita">
<text-editor v-model="formData.vita"></text-editor>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row v-if="!member" justify="end" type="flex" class="mt10">
<!-- <el-row justify="end" type="flex" class="mt10">-->
<el-button v-if="formData.id" type="primary" @click="sublime.jumpPagePjax('/platform/member/apply/mine')">返 回</el-button>
<el-button @click="doSave" type="primary">保存申请</el-button>
<el-button @click="doSubmit" type="primary">提交申请</el-button>
</el-row>
</el-card>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
id: GetQueryString("id"),
units: [],
member: false,
formData: {
families: []
},
formRules: {
username: [{required: false, message: "必填", trigger: "change"}],
sex: [{required: false, message: "必填", trigger: "change"}],
idCard: [
{required: false, message: "身份证号不能为空", trigger: "blur"},
{
pattern: /(^\d{6}(18|19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}([0-9xX])$)/,
message: "身份证号格式不正确",
trigger: "blur"
}
],
},
}
},
methods:{
doSave() {
this.$confirm("保存后可在我的申请里面再次编辑,您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
const formData = this.formData
if (formData.families) {
formData.families = JSON.stringify(this.formData.families)
}
$.post("/platform/member/apply/submit/doSave", formData)
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
sublime.jumpPagePjax('/platform/member/apply/mine')
} else {
this.$message.error(res.msg)
}
})
})
.catch()
},
doSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("提交后将进入审核流程,无法再进行编辑,您确定要提交申请吗?", "提示", { type: "warning" })
.then(() => {
const formData = this.formData
if (formData.families) {
formData.families = JSON.stringify(this.formData.families)
}
$.post("/platform/member/apply/submit/doSubmit", formData)
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
sublime.jumpPagePjax('/platform/member/apply/mine')
} else {
this.$message.error(res.msg)
}
})
})
.catch()
}
})
},
init(){
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.member = user.member
if (this.id) {
$.post("/platform/member/apply/submit/findApplyById", { id: this.id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
if (this.formData.families) {
this.formData.families = JSON.parse(this.formData.families)
} else {
this.formData.families = []
}
}
})
} else {
const {
id,
username,
loginname,
sex,
nation,
birthday,
political,
education,
academicDegree,
position,
unit,
union,
campus,
userState,
personType,
idCard,
mobile,
email,
families,
vita
} = user
this.$set(this.formData, "userId", id)
this.$set(this.formData, "username", username)
this.$set(this.formData, "loginname", loginname)
this.$set(this.formData, "birthday", birthday)
this.$set(this.formData, "sex", sex)
this.$set(this.formData, "idCard", idCard)
this.$set(this.formData, "nation", nation)
this.$set(this.formData, "political", political)
this.$set(this.formData, "position", position)
this.$set(this.formData, "education", education)
this.$set(this.formData, "academicDegree", academicDegree)
this.$set(this.formData, "campus", campus)
this.$set(this.formData, "userState", userState)
this.$set(this.formData, "personType", personType)
this.$set(this.formData, "unitName", unit ? unit.name : null)
this.$set(this.formData, "unitId", unit ? unit.id : null)
this.$set(this.formData, "unionName", union ? union.unionname : null)
this.$set(this.formData, "unionId", union ? union.id : null)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "vita", vita)
}
}
},
async created(){
this.init()
this.units = await getUnits()
}
})
</script>
<!--#
}
#-->
@@ -72,7 +72,7 @@ layout("/layouts/platform.html"){
style="width: 100%"
clearable
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -83,7 +83,7 @@ layout("/layouts/platform.html"){
style="width: 100%"
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -102,10 +102,10 @@ layout("/layouts/platform.html"){
<div class="search-item-label">变更类型:</div>
<div class="search-item-option">
<enum-select v-model="pageForm.changeTypes"
enum="UserChangeType"
label="description"
enum="MemberChangeType"
label="changeTypeName"
multiple
value="code"
value="value"
style="width: 100%"
clearable
placeholder="变更类型"
@@ -65,7 +65,7 @@ layout("/layouts/platform.html"){
multiple
clearable
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -77,7 +77,7 @@ layout("/layouts/platform.html"){
multiple
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -33,7 +33,7 @@
multiple
clearable
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -45,7 +45,7 @@
multiple
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -0,0 +1,235 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审核列表">
<template #func>
<el-radio-group @change="search" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openUserView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.applyStateId === 10020" @click="openAudit(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="[10030, 10050].includes(row.applyStateId)" @click="doRevoke(row)" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</el-card>
</template>
<template #view>
<member-change-audit-info ref="memberChangeAuditInfoRef"></member-change-audit-info>
<div v-if="showApprovalForm">
<div class="process-title" style="margin: 20px 0">分工会审核</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.username" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.auditTime" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="300"
placeholder="请填写审核意见" show-word-limit></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核签字" prop="auditSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<sign :is_value_base64="false" :qz.sync="formData.auditSign" prefix="member_apply_audit" ref="sign"></sign>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval(2)">退回重新申请</el-button>
<el-button type="danger" @click="doApproval(0)">拒绝申请</el-button>
<el-button type="primary" @click="doApproval(1)">同意申请</el-button>
</el-row>
</div>
</template>
<template #public>
<member-info ref="memberInfoRef"></member-info>
</template>
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
<!--#include("../../common/memberInfo.js"){}#-->
<!--#include("../common/memberChangeAuditInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "stateName", label: "当前节点", sortable: true }
],
id: '',
showApprovalForm: false,
changeTypeData: [],
}
},
components: {
'member-info': MEMBER_INFO,
'common-query': COMMON_QUERY,
'member-change-audit-info': MEMBER_CHANGE_AUDIT_INFO
},
methods: {
openView(row){
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = false
this.$refs.memberChangeAuditInfoRef.onOpen(row.id)
})
},
openUserView(row){
this.$refs.guava.public()
this.$nextTick(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openAudit(row){
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.id = row.id
this.formData.username = user.username
this.formData.auditTime = moment().format('YYYY-MM-DD HH:mm:ss')
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = true
this.$refs.memberChangeAuditInfoRef.onOpen(row.id)
})
},
doApproval(approvalType){
let msg = '确定要通过此条申请吗?'
if (approvalType === 0) {
msg = '拒绝后不可撤回,确定要拒绝此条申请吗?'
} else if (approvalType === 2) {
msg = '确定要退回此条申请吗?'
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.auditType = approvalType
this.$refs.approvalFormRef.validate(async (valid) => {
if (valid) {
const resp = await $.post('/platform/member/change/branchUnion/audit/approval', {
audit: JSON.stringify(this.formData),
id: this.id
})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$refs.guava.index()
this.showApprovalForm = false
this.pageData()
} else {
this.$message.error(resp.msg)
}
}
})
})
},
doRevoke(row){
this.$confirm('确定要撤回该申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.post('/platform/member/change/branchUnion/audit/doRevoke', {id: row.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.pageData()
} else {
this.$message.error(resp.msg)
}
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
getChangeTypes(changeTypes){
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.type === v).changeTypeName
})
.join(",")
}
return null
}
},
async created() {
this.pageData()
this.changeTypeData = await getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,90 @@
const COMMON_QUERY = {
template: /*language=HTML*/ `
<div class="search">
<div class="search-item">
<div class="search-item-label">姓名/工号</div>
<div class="search-item-option">
<el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"></el-input>
</div>
</div>
<template v-if="$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, BranchUnionMemberAdmin')">
<div class="search-item">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="请选择所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位</div>
<div class="search-item-option">
<el-select clearable filterable placeholder="请选择所属单位" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</div>
</div>
<div class="search-item">
<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>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
`,
mixins: [initTableMixins],
data() {
return{
unions: [],
units: [],
pageForm: {
searchKeyword: '',
unionId: '',
unitId: '',
userState: '',
personType: ''
}
}
},
methods: {
doSearch(){
this.$emit('search', this.pageForm)
},
async initData(){
if (this.$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')) {
this.unions = await getUnions(this.pageForm.unionId)
this.units = await getUnits()
} else {
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.unions = await getUnions(user.union.id)
this.units = await getUnits(user.union.id)
}
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await getUnits(this.pageForm.unionId)
}
}
},
async created() {
this.initData()
}
}
@@ -0,0 +1,103 @@
const MEMBER_ALL_CHANGE_INFO = {
template: /*language=HTML*/ `
<el-tabs v-model="activeName">
<el-tab-pane label="基础信息" name="basicInfo">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ moment(viewData.birthday).format("YYYY年MM月DD日") }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.unitname }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.unionname }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<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.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<template slot="label">个人简况</template>
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="历史变更记录" name="changeInfo" v-if="viewData.allChangeInfo">
<el-timeline>
<el-timeline-item placement="top" v-for="(changeData, index) in viewData.allChangeInfo"
:key="index" :timestamp="changeData.timestamp">
<el-card>
<h4>{{ changeData.changeOriginName }}</h4>
<el-table :data="changeData.changeInfos" size="mini" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column prop="fieldName" label="变更字段" header-align="center"></el-table-column>
<el-table-column prop="sourceValue" label="原数据" header-align="center">
<template slot-scope="{row}">
<div v-html="row.sourceValue"></div>
</template>
</el-table-column>
<el-table-column prop="newValue" label="新数据" header-align="center">
<template slot-scope="{row}">
<div v-html="row.newValue"></div>
</template>
</el-table-column>
</el-table>
</el-card>
</el-timeline-item>
</el-timeline>
</el-tab-pane>
</el-tabs>
`,
mixins: [initTableMixins],
data(){
return{
viewData: {},
activeName: "basicInfo"
}
},
methods:{
onOpen(userId){
$.post('/platform/member/change/mange/getAllChangeMemberInfo', {userId})
.then(resp => {
if (resp.code === 0) {
this.viewData = resp.data
} else {
this.$message.warning(resp.msg)
}
})
}
}
}
@@ -0,0 +1,492 @@
const MEMBER_CHANGE = {
template: /*language=html*/ `
<el-card shadow="never">
<div class="process-title">会员变更</div>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">
<el-form-item prop="loginname">
<el-input v-model="formData.loginname" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="姓名">
<el-form-item prop="username">
<el-input v-model="formData.username" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group :disabled="allowFields('sex')" v-model="formData.sex" size="small">
<el-radio border label="男"></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation"
:disabled="allowFields('nation')" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生日期">
<el-form-item prop="birthday">
<el-date-picker v-model="formData.birthday"
type="date"
:disabled="allowFields('birthday')"
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="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political"
:disabled="allowFields('political')" code="USER_POLITICAL"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education"
:disabled="allowFields('education')" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学位">
<el-form-item prop="academicDegree">
<dict-select style="width: 100%" placeholder="请选择学位" v-model="formData.academicDegree"
:disabled="allowFields('academicDegree')" code="USER_ACADEMIC_DEGREE"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="党政职务">
<el-form-item prop="position">
<el-input v-model="formData.position" placeholder="请输入党政职务"
:disabled="allowFields('position')" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')">
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionId">
<el-select clearable filterable placeholder="请选择所属工会" style="width: 100%"
v-model="formData.unionId">
<el-option :key="item.id" :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
</template>
<template v-else>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
:disabled="allowFields('unitId')" @change="getUnionName(formData.unitId)"
v-model="formData.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" disabled placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="所属校区">
<el-form-item prop="campus">
<dict-select style="width: 100%" placeholder="请选择所属校区" v-model="formData.campus"
:disabled="allowFields('campus')" code="USER_CAMPUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" :disabled="allowFields('idCard')" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" :disabled="allowFields('mobile')" placeholder="请输入联系电话" maxlength="15"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" :disabled="allowFields('email')" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="在职状态">
<el-form-item prop="userState">
<dict-select v-model="formData.userState" code="USER_STATE"
:disabled="allowFields('userState')" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<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 label="人员性质">
<el-form-item prop="preparedBy">
<el-input v-model="formData.preparedBy" disabled placeholder="暂无" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="会员状态">
<el-form-item prop="member">
<el-radio-group v-model="formData.member" size="small">
<el-radio border :label="true">会员</el-radio>
<el-radio border :label="false">非会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利会员状态">
<el-form-item prop="welfareMember">
<el-radio-group v-model="formData.welfareMember" size="small">
<el-radio border :label="true">福利会员</el-radio>
<el-radio border :label="false">非福利会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<template v-if="formData.member == 1">
<el-descriptions-item label="是否加入会员组别">
<el-form-item prop="member">
<el-radio-group v-model="formData.isJoinActivityMemberScope" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
</template>
<template v-if="formData.member == 0">
<el-descriptions-item label="是否退出会员组别">
<el-form-item prop="member">
<el-radio-group v-model="formData.isExitActivityMemberScope" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
</template>
<template v-if="formData.member != null && !formData.welfareMember">
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<template v-if="formData.welfareMember == true">
<el-descriptions-item label="是否加入福利项目">
<el-form-item prop="isJoinWelfareProject">
<el-radio-group v-model="formData.isJoinWelfareProject" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.isJoinWelfareProject">
<el-descriptions-item label="选择福利项目">
<el-form-item prop="welfareProjectId">
<el-select clearable filterable placeholder="请选择福利项目" style="width: 100%"
v-model="formData.welfareProjectId">
<el-option v-for="item in welfareProjectList"
:key="id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
</template>
<template v-else>
<el-descriptions-item></el-descriptions-item>
</template>
</template>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-form-item prop="families">
<el-table :data="formData.families" border size="small">
<el-table-column label="关系" prop="relation">
<template slot-scope="{row}">
<el-input v-model="row.relation" maxlength="50"
placeholder="请输入与本人关系"></el-input>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name">
<template slot-scope="{row}">
<el-input v-model="row.name" maxlength="50" placeholder="请输入姓名"></el-input>
</template>
</el-table-column>
<el-table-column label="工作单位" prop="unit">
<template slot-scope="{row}">
<el-input v-model="row.unit" maxlength="100"
placeholder="请输入工作单位"></el-input>
</template>
</el-table-column>
<el-table-column label="备注" prop="remark">
<template slot-scope="{row}">
<el-input v-model="row.remark" maxlength="100" placeholder="请输入备注"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini" :disabled="allowFields('families')"
@click="formData.families.push({})">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.families.length===0 || allowFields('families')"
@click="formData.families.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="个人简历" :span="3">
<el-form-item prop="vita">
<text-editor v-model="formData.vita"></text-editor>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row justify="end" type="flex" class="mt10">
<el-button @click="$emit('do-back')" v-if="formData.id || !isShow" type="primary"> </el-button>
<template v-if="isShow">
<el-button @click="doSave" type="primary">保存变更</el-button>
</template>
<el-button @click="doSubmit" type="primary">提交变更</el-button>
</el-row>
</el-card>
`,
props: {
id: { type: String, default: '' },
},
mixins: [initTableMixins],
data(){
return{
isShow: true,
user: {},
units: [],
unions: [],
// 允许变更的字段
allowChangeFields: [],
formData: {
families: [],
},
formRules: {
username: [{required: false, message: "必填", trigger: ["change", "blur"]}],
sex: [{required: false, message: "必填", trigger: ["change", "blur"]}],
email: [
{
validator: (rule, value, callback) => {
if (!value) {
callback();
} else if (/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value)) {
callback();
} else {
callback(new Error("邮箱格式错误"));
}
},
trigger: ["change", "blur"]
}
],
idCard: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/.test(value)) {
// 18位身份证号码格式正确
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 15位身份证号码格式正确
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(18位)
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(15位)
callback();
} else {
// 格式错误,返回错误信息
callback(new Error("身份证号码格式错误"));
}
},
trigger: ["change", "blur"]
}
],
mobile: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1][345789][0-9]{9}$/.test(value)) {
// 手机号格式正确
callback();
} else if (/^\d+-\d+$/.test(value) && value.length <= 16) {
// 座机号格式正确
callback();
} else {
// 格式错误,返回错误信息
callback(new Error(value.includes('-') ? '座机号码格式错误' : '手机号码格式错误'));
}
},
trigger: ["change", "blur"]
}
]
},
welfareProjectList: []
}
},
methods: {
allowFields(prop) {
return !this.allowChangeFields.map(v => v.code).includes(prop)
},
doSave(){
this.$confirm("保存后可在我的申请里面再次编辑,您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
const formData = this.formData
if (formData.families) {
formData.families = JSON.stringify(this.formData.families)
}
this.$emit('do-save', formData)
})
.catch()
},
doSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("提交后将进入审核流程,无法再进行编辑,您确定要提交申请吗?", "提示", { type: "warning" })
.then(() => {
const formData = this.formData
if (formData.families) {
formData.families = JSON.stringify(this.formData.families)
}
this.$emit('do-submit', formData)
})
.catch()
}
})
},
async init(userId){
if (userId) {
this.isShow = false
await this.getUserById(userId)
} else {
this.isShow = true
this.user = JSON.parse(window.sessionStorage.getItem('user'))
}
this.getFormDataValue(this.id)
this.allowChangeFields = await getDictOptions("ALLOW_CHANGE_FIELDS")
if (this.$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')) {
this.units = await getUnits()
this.unions = await getUnions()
} else {
this.units = await getUnits(this.user.unionid)
}
},
async getUserById(userId){
const resp = await $.post("/platform/member/change/apply/getUserByIdForMemberChange", { userId })
if (resp.code === 0) {
this.user = resp.data
}
},
getFormDataValue(id){
if (id) {
$.post("/platform/member/change/apply/findChangeById", { id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
this.formData.unionid = this.user.unionid
if (this.formData.families) {
this.formData.families = JSON.parse(this.formData.families)
} else {
this.formData.families = []
}
}
})
} else {
const {
id,
username,
loginname,
sex,
member,
welfareMember,
nation,
birthday,
political,
education,
academicDegree,
position,
unit,
union,
campus,
userState,
personType,
preparedBy,
idCard,
mobile,
email,
families,
vita
} = this.user
this.$set(this.formData, "userId", id)
this.$set(this.formData, "username", username)
this.$set(this.formData, "loginname", loginname)
this.$set(this.formData, "birthday", birthday)
this.$set(this.formData, "sex", sex)
this.$set(this.formData, "member", member === 1)
this.$set(this.formData, "welfareMember", welfareMember === 1)
this.$set(this.formData, "idCard", idCard)
this.$set(this.formData, "nation", nation)
this.$set(this.formData, "political", political)
this.$set(this.formData, "position", position)
this.$set(this.formData, "education", education)
this.$set(this.formData, "academicDegree", academicDegree)
this.$set(this.formData, "campus", campus)
this.$set(this.formData, "userState", userState)
this.$set(this.formData, "personType", personType)
this.$set(this.formData, "preparedBy", preparedBy)
this.$set(this.formData, "unitName", unit ? unit.name : null)
this.$set(this.formData, "unitId", unit ? unit.id : null)
this.$set(this.formData, "unionName", union ? union.unionname : null)
this.$set(this.formData, "unionId", union ? union.id : null)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "vita", vita)
}
}
},
created(){
this.init()
}
}
@@ -0,0 +1,117 @@
const MEMBER_CHANGE_AUDIT_INFO = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeName">
<el-tab-pane label="基础信息" name="basicInfo">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ viewData.birthday ? moment(viewData.birthday).format("YYYY年MM月DD日") : '暂无' }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.unitname }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.unionname }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="人员性质">{{ viewData.preparedBy }}</el-descriptions-item>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<template slot="label">个人简况</template>
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="变更信息" name="changeInfo" v-if="viewData.changeInfos">
<el-table :data="viewData.changeInfos" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column prop="fieldName" label="变更字段" header-align="center"></el-table-column>
<el-table-column prop="sourceValue" label="原数据" header-align="center">
<template slot-scope="{row}">
<div v-html="row.sourceValue"></div>
</template>
</el-table-column>
<el-table-column prop="newValue" label="新数据" header-align="center">
<template slot-scope="{row}">
<div v-html="row.newValue"></div>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="分工会审核信息" name="branch" v-if="viewData.branchAudit">
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">{{ viewData.branchAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ viewData.branchAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">{{ viewData.branchAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="校工会审核信息" name="school" v-if="viewData.schoolAudit">
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人员">{{ viewData.schoolAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ viewData.schoolAudit.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">{{ viewData.schoolAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
</el-tabs>
</div>
`,
mixins: [initTableMixins],
data(){
return{
activeName: "basicInfo",
viewData: {
changeInfos: [],
schoolAudit: {},
branchAudit: {}
}
}
},
methods: {
async onOpen(id){
const resp = await $.post('/platform/member/change/mine/findMemberChangeRecord', {id})
if (resp.code === 0) {
this.viewData = resp.data
}
}
}
}
@@ -0,0 +1,933 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
<el-select v-model="pageForm.searchName" slot="prepend"
style="width: 80px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('SchoolUnionMemberAdmin')||@shiro.hasRole('H03')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId"
style="width: 100%;"
clearable="true"
@change="flushUnits" @clear="flushUnits"
filterable="true">
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">组成单位:</div>
<div class="search-item-option">
<el-select v-model="pageForm.unitId" style="width: 100%" filterable
clearable
@change="getThreeUnits"
placeholder="请选择">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">&emsp;&emsp;别:</div>
<div class="search-item-option">
<el-select v-model="pageForm.sex" style="width: 100%" clearable
placeholder="请选择">
<el-option v-for="sex in sexOptions" :label="sex"
:value="sex"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState"
style="width: 100%"
clearable
placeholder="在职状态"
code="USER_STATE"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType"
style="width: 100%"
clearable
placeholder="人员类型"
code="PERSON_TYPE"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.preparedBy"
style="width: 100%"
clearable
placeholder="人员类型"
code="PREPARED_BY"></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
placeholder="变更类型"
></enum-select>
</div>
</div>
<!-- <div class="search-item">-->
<!-- <div class="search-item-label">更新日期:</div>-->
<!-- <div class="search-item-option">-->
<!-- <el-date-picker-->
<!-- style="width: 100%"-->
<!-- v-model="pageForm.changeDateRange"-->
<!-- @change="changeDateRangeChange"-->
<!-- type="datetimerange"-->
<!-- :picker-options="pickerOptions"-->
<!-- range-separator="-"-->
<!-- start-placeholder="开始日期"-->
<!-- end-placeholder="结束日期"-->
<!-- format="yyyy-MM-dd"-->
<!-- value-format="yyyy-MM-dd"-->
<!-- align="right">-->
<!-- </el-date-picker>-->
<!-- </div>-->
<!-- </div>-->
<!--<div class="search-item">
<div class="search-item-label">是否异动:</div>
<div class="search-item-option">
<el-radio-group v-model="pageForm.changed" @change="doSearch">
<el-radio-button :label="true"></el-radio-button>
<el-radio-button :label="false"></el-radio-button>
</el-radio-group>
</div>
</div>-->
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索
</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="会员列表" :app="this">
<template #label_end>
<!-- <span class="text-danger">(温馨提醒:异动类型为新增的教职工,需要新入职变更操作后才能成为工会会员!)</span>-->
</template>
<template #func>
<el-radio-group v-model="pageForm.myUnionGroupUser" @change="doSearch" class="mr5"
v-if="isThreeUnit === true" size="small">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button :label="1">本小组会员</el-radio-button>
<el-radio-button :label="0">非本小组会员</el-radio-button>
</el-radio-group>
<span class="text-danger">人员信息有无变化:</span>
<el-select v-model="pageForm.isMember" @change="doSearch()"
:clearable="false" size="small"
style="width: 130px;margin-right: 5px">
<el-option label="全部" value=""></el-option>
<el-option label="是会员" value="1"></el-option>
<el-option label="不是会员" value="0"></el-option>
</el-select>
<el-radio-group v-model="pageForm.changed" @change="doSearch" class="mr5"
size="small">
<el-radio-button label="">全部
</el-radio-button>
<el-radio-button :label="1">有变化
</el-radio-button>
<el-radio-button :label="0">无变化
</el-radio-button>
</el-radio-group>
<!-- <span class="text-danger">是否会员:</span>
<el-radio-group v-model="pageForm.isMember" @change="doSearch" class="mr5"
size="small">
<el-radio-button label="">全部({{numData.userSumNum || 0}})
</el-radio-button>
<el-radio-button label="1">是({{numData.memberNum || 0}})
</el-radio-button>
<el-radio-button label="0">否({{numData.notMemberNum || 0}})
</el-radio-button>
</el-radio-group>-->
<!-- <el-dropdown style="margin: 0 10px" @command="pushDropdownCommand">-->
<!-- <el-button type="primary" size="small" icon="el-icon-plus">-->
<!-- 添加-->
<!-- </el-button>-->
<!-- <el-dropdown-menu slot="dropdown">-->
<!-- <el-dropdown-item :command="{type:'select'}">选择加入-->
<!-- </el-dropdown-item>-->
<!-- <el-dropdown-item :command="{type:'add'}">新增用户-->
<!-- </el-dropdown-item>-->
<!-- </el-dropdown-menu>-->
<!-- </el-dropdown>-->
<!-- <el-button :disabled="!checkUsers.length" type="primary" size="small"
icon="el-icon-edit"
@click="openBatchEdit" class="ml5">
设置校区
</el-button>-->
<!-- <el-button :disabled="!checkUsers.length" type="primary" size="small"-->
<!-- icon="el-icon-edit"-->
<!-- @click="openUnitMove" class="ml5">-->
<!-- 单位调整-->
<!-- </el-button>-->
</template>
</table-tool>
<el-table ref="table" :data="tableData" style="width: 100%" row-key="id"
@sort-change="pageOrder"
v-loading="tableLoading" :size="tableSize" class="vi-table"
@selection-change="tableHandleSelectionChange">
<!-- <el-table-column type="selection" :reserve-selection="true"></el-table-column>-->
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop=='loginname'" scope="{row}">
<el-link type="primary">{{row.loginname}}
</el-link>
</template>
<template v-else-if="column.prop==='unitname'" scope="{row}">
{{isDisPlayCode?''+row.unitcode+'':null}}{{row.unitname}}
</template>
<template v-else-if="column.prop==='unionname'" scope="{row}">
{{isDisPlayCode?''+row.unioncode+'':null}}{{row.unionname}}
</template>
</el-table-column>
<el-table-column label="异动信息" header-align="center">
<el-table-column label="更新时间" prop="changeTime" min-width="100px"
header-align="center"
sortable
align="center" show-overflow-tooltip>
</el-table-column>
<el-table-column label="异动类型" prop="changeTypes" header-align="center"
width="150px"
align="center" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: #0e78c5;cursor: pointer" @click="openAllChangeView(row)">
{{ getChangeTypes(row.changeTypes) }}
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="会员" header-align="center" align="center" prop="member"
show-overflow-tooltip sortable>
<template scope="{row}">
<span v-if="row.member==1" class="text-success ">
<i class="fa fa-circle ml5"></i>
</span>
<span v-else class="text-danger">
<i class="fa fa-circle ml5"></i>
</span>
</template>
</el-table-column>
<el-table-column label="审核状态" header-align="center" align="center"
prop="welfareMember"
show-overflow-tooltip sortable>
<template scope="{row}">
<vi-table-state v-if="row.stateId" :state="row"></vi-table-state>
<vi-table-state v-else
:state="{stateColor:'#1890ff',stateName:'暂无'}"></vi-table-state>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="100px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-if="$auth.hasRoleOr('sysadmin,SchoolUnionAdmin,SchoolUnionMemberAdmin,branchUnionMemberAdmin')"
:command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item
v-if="$auth.hasRoleOr('sysadmin,SchoolUnionAdmin,ghxzzz,SchoolUnionMemberAdmin,H04')"
:disabled="row.stateId == 10050"
:command="{type:'change',data:row}">
变更
</el-dropdown-item>
<!--
<el-dropdown-item v-show="row.changeType===2"
:command="{type:'sendSms',data:row}">
通知入会
</el-dropdown-item>-->
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-all-change-info ref="memberAllChangeInfoRef"></member-all-change-info>
</template>
<template #edit>
<member-change ref="memberChangeRef" @do-back="$refs.guava.index()" @do-submit="doSubmit"></member-change>
</template>
</guava>
<el-drawer
title="设置校区"
:visible.sync="batchEditVisible"
:before-close="handleClose" size="1000px">
<el-timeline style="margin-right: 40px">
<el-timeline-item timestamp="" placement="top">
<el-form ref="batchForm" :model="batchFormData" label-width="100px">
<el-row :gutter="60">
<el-col :span="12">
<el-form-item label="所属校区">
<el-select v-model="batchFormData.campus" style="width: 300px"
clearable
size="medium"
placeholder="请选择"
@change="checkUsers.map(v=>$set(v,'campusId',batchFormData.campus))">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-timeline-item>
<el-timeline-item timestamp="" placement="top">
<el-table :data="checkUsers" style="width: 100%" row-key="id" class="vi-table"
height="70vh">
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="loginname"
label="工号"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="username"
label="姓名"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="unitname"
label="所属单位"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="unionname"
label="所属工会"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="campusId"
label="所属校区" width="300px">
<template scope="{row}">
<el-select v-model="row.campusId" style="width: 200px" clearable
size="small"
placeholder="请选择">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="batchEditVisible = false"
:disabled="batchEditLoading">取 消</el-button>
<el-button type="primary" @click="doBatchEdit"
:loading="batchEditLoading">确定</el-button>
</span>
</el-drawer>
<el-drawer
title="单位调整"
:visible.sync="unitMoveVisibile"
:before-close="handleClose" size="70%">
<el-row class="text-primary p20">
选择新单位
</el-row>
<el-row type="flex" :gutter="20" class="pl20 pr20">
<el-col :span="12">
<el-select placeholder="请选择新工会" v-model="unitMoveFormData.unionId"
style="width: 100%;"
clearable="true"
@change="moveUnionsChange"
filterable="true">
<el-option v-for="item in unitMoveUnions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-select v-model="unitMoveFormData.unitId" style="width: 100%" filterable
clearable
@change="moveUnitChange"
placeholder="请选择新单位">
<el-option
v-for="item in unitMoveUnits"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-select v-model="unitMoveFormData.threeUnitId" clearable filterable
placeholder="请选择新科室"
style="width: 100%" @change="threeUnitChange">
<el-option
v-for="item in threeUnits"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-input :value="unitMoveFormData.unionGroupName" disabled
placeholder="新工会小组"></el-input>
</el-col>
</el-row>
<el-row class="mt10">
<el-table :data="checkUsers" style="width: 100%;padding: 20px" class="vi-table"
border
height="70vh">
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="loginname"
width="120"
label="工号"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="username"
width="120"
label="姓名"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="threeUnitName"
label="当前科室" v-if="isThreeUnit"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="unitname"
label="当前单位"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
prop="unionname"
label="当前工会"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
label="新科室" v-if="isThreeUnit">
<template slot-scope="{row}">
<span>{{unitMoveFormData.threeUnitName}}</span>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
label="新单位">
<template slot-scope="{row}">
<span>{{unitMoveFormData.unitName}}</span>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center"
label="新分工会">
<template slot-scope="{row}">
<span>{{unitMoveFormData.unionName}}</span>
</template>
</el-table-column>
</el-table>
</el-row>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="unitMoveVisibile = false">取 消</el-button>
<el-button type="primary" @click="doUnitMove">确定</el-button>
</span>
</el-drawer>
<el-drawer
title="添加会员"
:visible.sync="selectUserVisible"
:before-close="handleClose" size="1200px">
<member-user-select v-model="selectUsers" ref="userSelect" :page_size="10"
:sql_cnd="['(u.member is null or u.member = 0) and (c.taskId is null OR c.stateId=70)']"></member-user-select>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="selectUserVisible = false"
:disabled="selectUserLoading">取 消</el-button>
<el-button type="primary" @click="doBatchJoinMember"
:loading="selectUserLoading">确定</el-button>
</span>
</el-drawer>
</div>
<script>
<!--#include("../common/memberAllChangeInfo.js"){}#-->
<!--#include("../../common/memberInfo.js"){}#-->
<!--#include("../common/memberChange.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', [start, end]);
}
}]
},
checkUsers: [],
batchEditVisible: false,
batchEditLoading: false,
batchFormData: {},
unitMoveVisibile: false,
unitMoveUnions: [],
unitMoveUnits: [],
unitMoveFormData: {
unitId: '',
unionId: '',
unitName: '',
unionName: ''
},
active: 'info',
submitLoading: false,
formRules: {},
info: {},
userId: '',
formData: {},
pageForm: {
searchName: "u.username",
myUnionGroupUser: '',
changed: '',
isMember: '1',
changeTypes: [],
personTypes: [],
changeOrigins: []
},
unions: [],
units: [],
tableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'username', label: '姓名', sortable: true},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'birthday', label: '出生年月', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'preparedBy', label: '人员性质', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'unitname', label: '所属单位', sortable: true},
{prop: 'threeUnitName', label: '所在科室', sortable: true, checked: 0},
{prop: 'unionGroupName', label: '工会小组', sortable: true, checked: 0},
// {prop: 'campusName', label: '所属校区', sortable: true},
],
campusOptions: [],
sexOptions: ['男', '女'],
welfareMemberLoading: false,
numData: {
changeNum: 0,
notChangeNum: 0,
userSumNum: 0,
memberNum: 0,
notMemberNum: 0,
},
threeUnits: [],
selectUserVisible: false,
selectUsers: [],
selectUserLoading: false,
isThreeUnit: false,
changeTypeData: [],
}
},
components: {
'member-user-select': httpVueLoader('/components/plugins/MemberUserTableSelect.vue?v=' + new Date().getTime()),
'member-all-change-info': MEMBER_ALL_CHANGE_INFO,
'member-info': MEMBER_INFO,
'member-change': MEMBER_CHANGE,
},
methods: {
openAllChangeView(row){
this.$refs.guava.public()
this.$nextTick(() => {
this.$refs.memberAllChangeInfoRef.onOpen(row.id)
})
},
async afterEdit(memData) {
if (!this.userId) {
await $.post("/platform/member/info/make/joinMemberFamily", memData)
}
this.userId = ''
this.pageData()
this.$refs.guava.index()
},
async doBatchJoinMember() {
if (!this.selectUsers.length) {
this.notifyWarning("请先勾选需要设置为会员的用户")
return
}
this.selectUserLoading = true
const resp = await $.post(loc() + "/joinWelfareMember", {userIds: JSON.stringify(this.selectUsers)});
this.selectUserLoading = false
if (resp.code === 0) {
this.pageData()
this.$refs.userSelect.init()
this.selectUserVisible = false
} else {
this.notifyWarning(resp.msg)
}
},
pushDropdownCommand({type}) {
if (type == 'select') {
this.selectUsers = []
this.selectUserVisible = true
this.$nextTick(() => {
this.$refs.userSelect.init()
})
} else if (type == 'add') {
this.userId = ""
this.$refs.guava.public()
if (!this.userId) {
this.$refs.member.id = null
this.$refs.member.getUserInfo()
}
}
},
async threeUnitChange(val) {
if (val) {
const threeUnit = this.threeUnits.find(v => v.id === val)
const groupName = threeUnit.groupname
this.$set(this.unitMoveFormData, 'threeUnitName', threeUnit.name)
this.$set(this.unitMoveFormData, 'unionGroupName', groupName)
} else {
this.$set(this.unitMoveFormData, 'unionGroupName', null)
}
},
async getThreeUnits(val) {
this.threeUnits = await threeUnitsByUnionGroupOrUnitId(this.pageForm.unitId, this.pageForm.unionGroupId)
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
this.getNumData()
},
openUnitMove() {
this.unitMoveVisibile = true
this.unitMoveFormData = {
unitId: '',
unionId: '',
unitName: '',
unionName: ''
}
},
async moveUnionsChange(val) {
if (val) {
this.unitMoveUnits = await getUnits(val)
this.$set(this.unitMoveFormData, 'unionName', this.unitMoveUnions.find(v => v.id === val).unionname)
this.$set(this.unitMoveFormData, 'unitId', '')
this.$set(this.unitMoveFormData, 'unitName', '')
} else {
this.$set(this.unitMoveFormData, 'unitId', '')
this.$set(this.unitMoveFormData, 'unitName', '')
this.$set(this.unitMoveFormData, 'unionName', '')
this.unitMoveUnits = []
}
},
async moveUnitChange(val) {
if (val) {
this.$set(this.unitMoveFormData, 'unitName', this.unitMoveUnits.find(v => v.id === val).name)
} else {
this.$set(this.unitMoveFormData, 'unitName', '')
}
if (val) {
this.threeUnits = await threeUnitsByUnionGroupOrUnitId(val, null)
}
},
async doUnitMove() {
if (this.unitMoveFormData.unitId === '') {
this.notifyWarning('请选择新单位!')
return
}
if (this.unitMoveFormData.threeUnitId === '') {
this.notifyWarning('请选择新科室!')
return
}
const params = {
unitId: this.unitMoveFormData.unitId,
threeUnitId: this.unitMoveFormData.threeUnitId,
userId: this.checkUsers.map(v => v.id)
}
const resp = await $.post(loc() + '/userUnitMove', params)
if (resp.code === 0) {
this.pageData()
this.getNumData()
this.$refs.table.clearSelection();
this.unitMoveVisibile = false
} else {
this.notifyWarning(resp.msg)
}
},
changeDateRangeChange(val) {
this.pageForm.changeDateBefore = val[0]
this.pageForm.changeDateEnd = val[1]
},
async doBatchEdit() {
const batch = this.checkUsers.map(v => {
return {id: v.id, campusId: v.campusId}
})
this.batchEditLoading = true
const resp = await $.post("/platform/welfare/member/mange/batchEdit", {users: JSON.stringify(batch)});
this.batchEditLoading = false
if (resp.code === 0) {
this.pageData()
this.getNumData()
this.$refs.table.clearSelection();
this.batchEditVisible = false
} else {
this.notifyWarning(resp.msg)
}
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {
});
},
openBatchEdit() {
this.batchFormData = {}
this.batchEditVisible = true
},
tableHandleSelectionChange(val) {
this.checkUsers = val;
},
async sendSms(userid) {
const resp = await $.post(loc() + '/sendSms', {userid})
if (resp.code === 0) {
this.$notify({title: '成功', message: '发送成功!', type: 'success'});
}
},
async allIsWelfareMember() {
this.welfareMemberLoading = true
const resp = await $.post(loc() + "/allIsWelfareMember")
this.welfareMemberLoading = false
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'change') {
this.openChange(data.id)
} else if (type === 'sendSms') {
this.sendSms(data.id)
}
},
openChange(userId) {
this.$refs.guava.edit()
this.$nextTick(() => {
this.$refs.memberChangeRef.init(userId)
})
},
async doSubmit(formData) {
const loading = this.$loading({
lock: true,
text: '数据保存中,请稍后...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const resp = await $.post('/platform/member/change/mange/doSubmitChange', formData)
loading.close()
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$refs.guava.index()
this.pageData()
} else {
this.$message.error(resp.msg)
}
},
openView(row) {
this.$refs.guava.view()
this.$nextTick(() => {
this.$refs.memberInfoRef.onOpen(row.id)
})
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.$set(this.pageForm, "unionGroupId", null)
this.$set(this.pageForm, "threeUnitId", null)
this.units = []
this.unionGroups = []
this.threeUnits = []
if (this.pageForm.unionId) {
this.units = await getUnits(this.pageForm.unionId)
this.unionGroups = await unionGroupsByUnionId(this.pageForm.unionId)
}
},
async getNumData() {
// const resp = await $.post(loc() + '/getButtonNum', this.pageForm)
// if (resp.code === 0) {
// this.numData = resp.data
// } else {
// this.notifyWarning(resp.msg)
// }
},
getChangeTypes(changeTypes){
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.type === v).changeTypeName
})
.join(",")
}
return null
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.changeTypes = JSON.stringify(pageForm.changeTypes)
pageForm.changeOrigins = JSON.stringify(pageForm.changeOrigins)
$.post(loc() + '/pageData', pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
},
async created() {
// this.isThreeUnit = await getConfigKey('isThreeUnit') === 'true'
if (this.$auth.hasRole("ghxzzz")) {
this.isThreeUnit = true
this.pageForm.myUnionGroupUser = 1
this.tableColumns.forEach(v => {
if (["threeUnitName", "unionGroupName"].includes(v.prop)) {
v.checked = 1
}
})
}
this.pageData();
this.getNumData()
if (this.$auth.hasRoleOr("sysadmin,SchoolUnionMemberAdmin,H03")) {
this.unions = await getUnions(null, false)
} else {
this.unions = await getUnions(null, true)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.unitMoveUnions = clone(this.unions)
this.campusOptions = await getCampus()
this.changeTypeData = await getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,148 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="申请列表">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.applyStateId === 10010"
@click="sublime.jumpPagePjax('/platform/member/change/apply?id=' + row.id)"
size="mini" type="primary">编辑</el-button>
<!-- <el-button v-if="row.applyStateId === 20" @click="doRevoke(row)" size="mini" type="warning">撤销</el-button>-->
<el-button v-if="row.applyStateId === 10010" @click="doDelete(row)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-change-audit-info ref="memberChangeAuditInfoRef"></member-change-audit-info>
</template>
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
<!--#include("../common/memberChangeAuditInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "stateName", label: "当前节点", sortable: true }
],
changeTypeData: [],
}
},
components: {
'common-query': COMMON_QUERY,
'member-change-audit-info': MEMBER_CHANGE_AUDIT_INFO
},
methods: {
openView(row){
this.$refs.guava.view()
this.$nextTick(() => {
this.$refs.memberChangeAuditInfoRef.onOpen(row.id)
})
},
async doRevoke(row){
const confirm = await this.$confirm('确定要撤销该条申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post("/platform/member/change/mine/doRevoke", { id: row.id })
if (resp.code === 0) {
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
}
},
async doDelete(row){
const confirm = await this.$confirm('确定要删除该条申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post("/platform/member/change/mine/doDelete", { id: row.id })
if (resp.code === 0) {
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
}
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
getChangeTypes(changeTypes){
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.type === v).changeTypeName
})
.join(",")
}
return null
}
},
async created(){
this.pageData()
this.changeTypeData = await getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,352 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
style="width: 100%"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend"
placeholder="查询类型"
style="width:80px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select placeholder="所属工会" v-model="pageForm.unionId"
style="width: 100%;"
clearable
@change="flushUnits" @clear="flushUnits"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('SchoolUnionMemberAdmin')||@shiro.hasRole('H03')}"
filterable>
<el-option v-for="item in unions" :label="item.unionname"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select placeholder="所属单位" v-model="pageForm.unitId"
style="width: 100%;"
@change="getThreeUnits"
clearable
filterable>
<el-option v-for="item in units" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-row>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userStates"
style="width: 100%"
multiple
clearable
placeholder="在职状态"
code="USER_STATE"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personTypes"
style="width: 100%"
multiple
clearable
placeholder="人员类型"
code="PERSON_TYPE"></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="value"
style="width: 100%"
clearable
placeholder="变更类型"
></enum-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">变更来源:</div>
<div class="search-item-option">
<enum-select enum="MemberChangeOrigin"
v-model="pageForm.changeOrigins"
multiple
value="code"
label="description"
style="width: 100%" clearable
placeholder="变更来源"></enum-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索
</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="变更列表" :app="this">
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
@sort-change="pageOrder"
resizable
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template v-if="column.prop=='loginname'" scope="{row}">
<el-link type="primary" @click="openUserView(row)">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column label="异动信息" header-align="center">
<el-table-column label="更新时间" prop="applyDateTime" min-width="145px"
header-align="center"
sortable
align="center" show-overflow-tooltip>
</el-table-column>
<el-table-column label="异动类型" prop="changeTypes" header-align="center"
width="150px"
align="center" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{ getChangeTypes(row.changeTypes) }}
</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="审核状态">
<template scope="{row}">
<vi-table-state v-if="row.stateId" :state="row"></vi-table-state>
<vi-table-state v-else :state="{stateColor:'#1890ff',stateName:'暂无'}"></vi-table-state>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="100px" fixed="right">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row.userId)">查看</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member-change-audit-info ref="memberChangeAuditInfoRef"></member-change-audit-info>
</template>
<template #edit>
<member-info ref="memberInfoRef"></member-info>
</template>
</guava>
</div>
<script>
<!--#include("../../common/memberInfo.js"){}#-->
<!--#include("../common/memberChangeAuditInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
active: 'info',
submitLoading: false,
formRules: {},
info: {},
userId: '',
formData: {},
pageForm: {
searchName: "u.username",
changeTypes: [],
personTypes: [],
changeOrigins: []
},
unions: [],
units: [],
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'birthday', label: '出生年月', sortable: true},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'userUnionName', label: '所属工会', sortable: true},
{prop: 'userUnitName', label: '所属单位', sortable: true},
// {prop: 'type', label: '变更类型', sortable: true},
// {prop: 'applyDate', label: '申请时间', sortable: true},
// {prop: 'applyOrigin', label: '申请方式', sortable: true},
// {prop: 'stateId', label: '状态', sortable: true}
],
isThreeUnit: false,
changeTypeData: [],
}
},
components: {
'member-info': MEMBER_INFO,
'member-change-audit-info': MEMBER_CHANGE_AUDIT_INFO,
},
methods: {
openUserView(row){
this.$refs.guava.edit()
this.$nextTick(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openView(row){
this.$refs.guava.view()
this.$nextTick(() => {
this.$refs.memberChangeAuditInfoRef.onOpen(row.id)
})
},
getChangeTypes(changeTypes){
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.type === v).changeTypeName
})
.join(",")
}
return null
},
async onExpand(row, expandedRows) {
if (!expandedRows.includes(row)) {
return
}
this.$set(row, "loading", true)
const resp = await $.get("/platform/member/common/findChangeApplyInfo", {id: row.id})
this.$set(row, "loading", false)
if (resp.code === 0) {
this.$set(row, "info", data)
} else {
this.notifyWarning(resp.msg)
this.$set(row, "info", {})
}
},
openChange(userId) {
this.userId = userId
this.$refs.guava.edit()
},
async doSubmit(formData) {
const resp = await $.post(loc() + "/change", formData)
this.$refs.apply.closeLoading()
if (resp.code === 0) {
this.userId = ""
this.$refs.guava.index()
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.$set(this.pageForm, "unionGroupId", null)
this.$set(this.pageForm, "threeUnitId", null)
this.units = []
this.unionGroups = []
this.threeUnits = []
if (this.pageForm.unionId) {
this.units = await getUnits(this.pageForm.unionId)
this.unionGroups = await unionGroupsByUnionId(this.pageForm.unionId)
}
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.userStates = JSON.stringify(pageForm.userStates)
pageForm.personTypes = JSON.stringify(pageForm.personTypes)
pageForm.changeTypes = JSON.stringify(pageForm.changeTypes)
pageForm.changeOrigins = JSON.stringify(pageForm.changeOrigins)
$.post(loc() + '/pageData', pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
},
async created() {
this.isThreeUnit = await getConfigKey('isThreeUnit') === 'true'
if (this.isThreeUnit) {
this.tableColumns.forEach(v => {
if (["threeUnitName", "unionGroupName"].includes(v.prop)) {
v.checked = 1
}
})
}
this.pageData();
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('SchoolUnionMemberAdmin')||@shiro.hasRole('H03')}" === 'true') {
this.unions = await getUnions(null, false)
} else {
this.unions = await getUnions(null, true)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.changeTypeData = await getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,235 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<template>
<el-card shadow="never">
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审核列表">
<template #func>
<el-radio-group @change="search" class="mr5" size="small" v-model="pageForm.audit">
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='loginname'">
<el-link @click="openUserView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.applyStateId === 10050" @click="openAudit(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="[10060].includes(row.applyStateId)" @click="doRevoke(row)" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</el-card>
</template>
<template #view>
<member-change-audit-info ref="memberChangeAuditInfoRef"></member-change-audit-info>
<div v-if="showApprovalForm">
<div class="process-title" style="margin: 20px 0">校工会审核</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.username" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.auditTime" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="300"
placeholder="请填写审核意见" show-word-limit></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核签字" prop="auditSign" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<sign :is_value_base64="false" :qz.sync="formData.auditSign" prefix="member_apply_audit" ref="sign"></sign>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval(2)">退回重新申请</el-button>
<el-button type="danger" @click="doApproval(0)">拒绝申请</el-button>
<el-button type="primary" @click="doApproval(1)">同意申请</el-button>
</el-row>
</div>
</template>
<template #public>
<member-info ref="memberInfoRef"></member-info>
</template>
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
<!--#include("../../common/memberInfo.js"){}#-->
<!--#include("../common/memberChangeAuditInfo.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "stateName", label: "当前节点", sortable: true }
],
id: '',
showApprovalForm: false,
changeTypeData: [],
}
},
components: {
'member-info': MEMBER_INFO,
'common-query': COMMON_QUERY,
'member-change-audit-info': MEMBER_CHANGE_AUDIT_INFO
},
methods: {
openView(row){
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = false
this.$refs.memberChangeAuditInfoRef.onOpen(row.id)
})
},
openUserView(row){
this.$refs.guava.public()
this.$nextTick(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openAudit(row){
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.id = row.id
this.formData.username = user.username
this.formData.auditTime = moment().format('YYYY-MM-DD HH:mm:ss')
this.$refs.guava.view()
this.$nextTick(() => {
this.showApprovalForm = true
this.$refs.memberChangeAuditInfoRef.onOpen(row.id)
})
},
doApproval(approvalType){
let msg = '确定要通过此条申请吗?'
if (approvalType === 0) {
msg = '拒绝后不可撤回,确定要拒绝此条申请吗?'
} else if (approvalType === 2) {
msg = '确定要退回此条申请吗?'
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.auditType = approvalType
this.$refs.approvalFormRef.validate(async (valid) => {
if (valid) {
const resp = await $.post('/platform/member/change/schoolUnion/audit/approval', {
audit: JSON.stringify(this.formData),
id: this.id
})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$refs.guava.index()
this.showApprovalForm = false
this.pageData()
} else {
this.$message.error(resp.msg)
}
}
})
})
},
doRevoke(row){
this.$confirm('确定要撤回该申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.post('/platform/member/change/schoolUnion/audit/doRevoke', {id: row.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.pageData()
} else {
this.$message.error(resp.msg)
}
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
getChangeTypes(changeTypes){
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.type === v).changeTypeName
})
.join(",")
}
return null
}
},
async created() {
this.pageData()
this.changeTypeData = await getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,60 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<member-change ref="memberChange" :id="id" @do-save="doSave" @do-submit="doSubmit"
@do-back="sublime.jumpPagePjax('/platform/member/change/mine')"></member-change>
</div>
<script>
<!--#include("../common/memberChange.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data(){
return{
id: GetQueryString('id')
}
},
components: {
'member-change': MEMBER_CHANGE,
},
methods: {
async doSave(formData){
const loading = this.$loading({
lock: true,
text: '数据保存中请稍后...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const resp = await $.post('/platform/member/change/apply/doSave', formData)
loading.close()
if (resp.code === 0) {
this.$message.success(resp.msg)
sublime.jumpPagePjax('/platform/member/change/mine')
} else {
this.$message.error(resp.msg)
}
},
async doSubmit(formData){
const loading = this.$loading({
lock: true,
text: '数据保存中请稍后...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const resp = await $.post('/platform/member/change/apply/doSubmit', formData)
loading.close()
if (resp.code === 0) {
this.$message.success(resp.msg)
sublime.jumpPagePjax('/platform/member/change/mine')
} else {
this.$message.error(resp.msg)
}
},
}
})
</script>
<!--#
}
#-->
@@ -92,7 +92,7 @@ layout("/layouts/platform.html"){
multiple
clearable
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -104,7 +104,7 @@ layout("/layouts/platform.html"){
multiple
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -0,0 +1,72 @@
const MEMBER_INFO = {
template: /*language=HTML*/ `
<div>
<div class="process-title">基础信息</div>
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ moment(viewData.birthday).format("YYYY年MM月DD日") }}
</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.unitname }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.unionname }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="人员性质">{{ viewData.preparedBy || '暂无' }}</el-descriptions-item>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<template slot="label">个人简况</template>
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {}
}
},
methods: {
async onOpen(userId) {
const resp = await $.post("/platform/member/common/fetchMemberUserById", {userId})
if (resp.code === 0) {
this.viewData = resp.data
}
}
}
}
@@ -100,7 +100,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.personType" style="width: 100%"
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -110,7 +110,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userState" style="width: 100%"
clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -490,8 +490,8 @@ layout("/layouts/platform.html"){
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
}
})
</script>
@@ -103,7 +103,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.personType" style="width: 100%"
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -113,7 +113,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userState" style="width: 100%"
clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -112,7 +112,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.personType" style="width: 100%"
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -122,7 +122,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userState" style="width: 100%"
clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -132,7 +132,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userState" style="width: 100%"
clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -535,8 +535,8 @@ layout("/layouts/platform.html"){
}
this.pageData();
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
this.preparedByOptions = await getDictOptions("PREPARED_BY")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('SchoolUnionMemberAdmin')||@shiro.hasRole('H03')}" === 'true') {
this.unions = await getUnions(null, false)
@@ -119,7 +119,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.personType" style="width: 100%"
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -129,7 +129,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userState" style="width: 100%"
clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -60,28 +60,24 @@ layout("/layouts/platform.html"){
<template>
<el-card shadow="never">
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">&emsp;&emsp;度:</el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="8">
<el-col :span="12">
<span>所属年度:</span>
<el-date-picker @change="doSearch()"
style="width: 200px"
style="margin-left: 33px;width: 80%"
:picker-options="pickerOptions"
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="选择年" :clearable="false">
</el-date-picker>
<el-link type="primary" style="margin-left: 10px"
:underline="false"
@click="pageForm.year=moment().format('YYYY');doSearch()">
本年
</el-link>
</el-col>
<el-col :span="16">
<el-col :span="12">
<span>姓名工号:</span>
<el-input placeholder="请输入内容" clearable
v-model="pageForm.searchKeyword"
style="width: 600px"
style="margin-left: 33px;width: 80%"
@keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend"
placeholder="查询类型"
@@ -95,9 +91,8 @@ layout("/layouts/platform.html"){
</el-row>
</el-col>
</el-row>
</el-card>
<el-card shadow="never">
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-content">
<el-row>
@@ -901,8 +896,8 @@ layout("/layouts/platform.html"){
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
this.preparedByOptions = await getDictOptions("PREPARED_BY")
this.memberStatusOptions = await getDictOptions("memberStatusText")
await this.getMenuOptions();
@@ -285,7 +285,7 @@ layout("/layouts/platform.html"){
}
},
async created() {
this.personTypeOptions = await getDictOptions("UserType")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.unions = await getUnions(null)
this.units = await getUnits(null)
this.pageData();
@@ -296,4 +296,4 @@ layout("/layouts/platform.html"){
<!--#
}
#-->
#-->
@@ -162,7 +162,7 @@ layout("/layouts/platform.html"){
this.getData()
},
async getUserTypes() {
const data = await getDictOptions("UserType")
const data = await getDictOptions("PERSON_TYPE")
this.userTypeNames = data.map(v => v.name)
}
},
@@ -182,4 +182,4 @@ layout("/layouts/platform.html"){
<!--#
}
#-->
#-->
@@ -114,7 +114,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -123,7 +123,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>-->
<div class="search-item">
@@ -638,8 +638,8 @@ layout("/layouts/platform.html"){
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
@@ -187,7 +187,7 @@ layout("/layouts/platform.html"){
}
},
async created() {
this.personTypeOptions = await getDictOptions("UserType")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.unions = await getUnions(null)
this.units = await getUnits(null)
this.pageData();
@@ -0,0 +1,77 @@
const COMPONENT_FRAME = {
template: /*language=html*/ `
<div>
{{ siftValue }}
<el-input v-if="componentType === 'input'"
v-model="siftValue"
placeholder="请输入内容"
></el-input>
<el-select v-else-if="componentType === 'select'"
v-model="siftValue"
multiple
style="width: 100%"
placeholder="请选择内容">
<el-option
v-for="item in selectOptions"
:key="item.code"
:label="item.name"
:value="item.code"
></el-option>
</el-select>
<el-select v-else-if="componentType === 'remote'"
v-model="siftValue"
reserve-keyword remote
multiple filterable
placeholder="请输入工号或姓名进行查询"
:remote-method="handleRemoteSearch"
:loading="loading" style="width: 100%">
<el-option
v-for="item in remoteOptions"
:key="item.id"
:label="item.username + '(' + item.loginname + ')' + item.unionname + '-' + item.unitname"
:value="item.id"
></el-option>
</el-select>
</div>
`,
props: {
componentType: { type: String, default: '' },
siftValue: { type: [String, Array], default: () => [] },
selectOptions: { type: Array, default: () => [] },
remoteOptions: { type: Array, default: () => [] }
},
data(){
return{
loading: false
}
},
methods:{
handleRemoteSearch(query) {
// 模拟远程搜索逻辑
this.loading = true;
$.post('/platform/sourcechange/config/getRemoteSearchUser', {query})
.then(resp => {
this.loading = false;
if (resp.code === 0) {
this.remoteOptions = resp.data.list
}
})
},
},
watch: {
siftValue(newVal) {
this.$emit('input', newVal);
}
},
computed:{
valueAsString(){
if(Array.isArray(this.value)){
return this.value
}else{
return this.value ? this.value.toString() : ''
}
}
},
}
@@ -0,0 +1,247 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never">
<div class="process-title">更新配置</div>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="更新模式" :span="3">
<el-form-item prop="sourceChangeType">
<el-radio-group v-model="formData.sourceChangeType" size="small">
<el-radio border label="automatic">自动更新</el-radio>
<el-radio border label="artificial">人工变更</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="会员标签配置" :span="3">
<el-form-item prop="memberSiftList">
<el-table :data="formData.memberSiftList" border size="small">
<el-table-column label="选项名称" prop="siftName">
<template slot-scope="{row}">
<el-select v-model="row.siftName" placeholder="请选择"
@change="changeComponentFrame(row)" style="width: 100%">
<el-option
v-for="item in memberSiftOptions"
:key="item.id"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="配置值" prop="siftValue">
<template slot-scope="{row}">
<component-frame
:component-type="row.componentType"
v-model="row.siftValue"
:select-options="row.selectOptions"
:remote-options="row.remoteOptions"
></component-frame>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini"
@click="formData.memberSiftList.push({})">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.memberSiftList.length===0"
@click="formData.memberSiftList.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="新进职工是否加入会员组别" :span="1.5">
<el-form-item prop="isJoinMemberActivityScope">
<el-radio-group v-model="formData.isJoinMemberActivityScope" size="small">
<el-radio border label="true"></el-radio>
<el-radio border label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="非会员是否剔除会员组别" :span="1.5">
<el-form-item prop="isDeleteMemberActivityScope">
<el-radio-group v-model="formData.isDeleteMemberActivityScope" size="small">
<el-radio border label="true"></el-radio>
<el-radio border label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利会员标签配置" :span="3">
<el-form-item prop="welfareMemberSiftList">
<el-table :data="formData.welfareMemberSiftList" border size="small">
<el-table-column label="选项名称" prop="siftName">
<template slot-scope="{row}">
<el-select v-model="row.siftName" placeholder="请选择"
@change="changeComponentFrame(row)" style="width: 100%">
<el-option
v-for="item in welfareMemberSiftOptions"
:key="item.id"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="配置值" prop="siftValue">
<template slot-scope="{row}">
<component-frame
:component-type="row.componentType"
v-model="row.siftValue"
:select-options="row.selectOptions"
:remote-options="row.remoteOptions"
></component-frame>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="scope">
<el-button type="primary" size="mini"
@click="formData.welfareMemberSiftList.push({})">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="formData.welfareMemberSiftList.length===0"
@click="formData.welfareMemberSiftList.splice(scope.$index,1)"
></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="新进职工是否加入进行中福利" :span="1.5">
<el-form-item prop="isJoinWelfareProject">
<el-radio-group v-model="formData.isJoinWelfareProject" size="small">
<el-radio border label="true"></el-radio>
<el-radio border label="false"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row type="flex" justify="end">
<el-button type="primary" @click="doSubmit">提交</el-button>
</el-row>
</el-card>
</div>
<script>
<!--#include("componentFrame.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return{
formData: {
sourceChangeType: '',
memberSiftList: [],
welfareMemberSiftList: []
},
formRules: {
updateMode: [
{ required: true, message: '请选择更新模式', trigger: 'change' }
],
memberSiftList: [
{ required: true, message: '请选择会员标签', trigger: 'change' }
],
welfareMemberSiftList: [
{ required: true, message: '请选择福利会员标签', trigger: 'change' }
]
},
memberSiftOptions: [],
welfareMemberSiftOptions: []
}
},
components: {
'component-frame': COMPONENT_FRAME
},
methods: {
doSubmit() {
this.$confirm('确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.post('/platform/sourcechange/config/doAddOrModify', {
data: JSON.stringify(this.formData)
})
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
})
},
async changeComponentFrame(row){
const item = this.memberSiftOptions.find(item => item.code === row.siftName)
switch (item.remark) {
case 'text':
row.siftValue = "";
row.componentType = 'input';
break;
case 'select':
row.componentType = 'select'
row.siftValue = []
switch (item.code) {
case 'userState':
row.selectOptions = await getDictOptions("USER_STATE")
break;
case 'personType':
row.selectOptions = await getDictOptions("PERSON_TYPE")
break;
case 'retireTime':
row.selectOptions = [
{ name: '保留至上半年、下半年', code: 'halfYear' },
{ name: '保留全年', code: 'annualYear' }
];
break;
}
break;
case 'remote':
row.componentType = 'remote';
row.siftValue = []
break;
default:
row.componentType = '';
row.selectOptions = [];
row.remoteOptions = [];
}
},
async getSourceChangeConfig(){
const resp = await $.get('/platform/sourcechange/config/getSourceChangeConfig')
if (resp.code === 0) {
this.formData = resp.data
}
}
},
async created(){
this.memberSiftOptions = await getDictOptions("MEMBER_LABEL")
this.welfareMemberSiftOptions = await getDictOptions("WELFARE_MEMBER_LABEL")
await this.getSourceChangeConfig()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,148 @@
const COMMON_QUERY = {
template: /*language=HTML*/ `
<div class="search">
<div class="search-item">
<div class="search-item-label">姓名/工号</div>
<div class="search-item-option">
<el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"></el-input>
</div>
</div>
<template v-if="$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, BranchUnionMemberAdmin')">
<div class="search-item">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="请选择所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位</div>
<div class="search-item-option">
<el-select clearable filterable placeholder="请选择所属单位" style="width: 100%"
v-model="pageForm.unitId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</div>
</div>
<div class="search-item">
<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>
</div>
</div>
<div class="search-item">
<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>
</div>
</div>
<div class="search-item">
<div class="search-item-label">变更日期</div>
<div class="search-item-option">
<el-date-picker :picker-options="pickerOptions" @change="changeDateRangeChange"
align="right" end-placeholder="结束日期" format="yyyy-MM-dd"
range-separator="-" start-placeholder="开始日期" style="width: 100%"
type="datetimerange" v-model="pageForm.changeDateRange"
value-format="yyyy-MM-dd"></el-date-picker>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
`,
mixins: [initTableMixins],
data() {
return{
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit("pick", [start, end])
}
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit("pick", [start, end])
}
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit("pick", [start, end])
}
}
]
},
unions: [],
units: [],
pageForm: {
searchKeyword: '',
unionId: '',
unitId: '',
userState: '',
personType: ''
}
}
},
methods: {
changeDateRangeChange(val){
if (val && val.length > 0) {
this.pageForm.changeDateBefore = val[0]
this.pageForm.changeDateEnd = val[1]
} else {
this.pageForm.changeDateBefore = null
this.pageForm.changeDateEnd = null
}
this.doSearch()
},
doSearch(){
this.$emit('search', this.pageForm)
},
async initData(){
if (this.$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')) {
this.unions = await getUnions(this.pageForm.unionId)
this.units = await getUnits()
} else {
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.unions = await getUnions(user.union.id)
this.units = await getUnits(user.union.id)
}
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await getUnits(this.pageForm.unionId)
}
}
},
async created() {
this.initData()
}
}
@@ -0,0 +1,231 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 55px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<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 changeTypeData"
:key="item.code"
:type="item.name"
:effect="pageForm.changeTypes.includes(item.type)?'dark':'plain'"
@click="tagClick('changeTypes',item.type)">
{{ item.changeTypeName }}
</el-tag>
<el-link type="danger"
v-if="changeTypeData.length && pageForm.changeTypes.length"
:underline="false"
@click="pageForm.changeTypes=[];doSearch()">清空
</el-link>
</el-col>
</el-row>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="变更记录(默认查询当天变更记录,如需查询更多变更记录,请选择上方【变更日期】后进行搜索)">
<template #func>
<el-radio-group @change="search" class="mr5" size="small" v-model="pageForm.isOperate">
<el-radio-button label="true">已操作</el-radio-button>
<el-radio-button label="false">未操作</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod"
header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column :label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop == 'loginname'">
<el-link @click="openView(row)" type="primary">{{row.loginname}}</el-link>
</template>
<template scope="{row}" v-else-if="column.prop == 'changeTypes'">
<span style="color: #0e78c5;cursor: pointer" @click="openChangeInfo(row, true)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180px">
<template slot-scope="{row}">
<el-button @click="openChangeInfo(row, true)" size="mini" type="primary">查看</el-button>
<el-button v-if="!row.isOperate" @click="openChangeInfo(row, false)" size="mini" type="primary">变更</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<user-change-info ref="userChangeInfoRef" :is-view="isView" @do-back="$refs.guava.index()" @do-submit="doSubmit"></user-change-info>
</template>
</guava>
</div>
<script>
<!--#include("commonQuery.js"){}#-->
<!--#include("userChangeInfo.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return{
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit("pick", [start, end])
}
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit("pick", [start, end])
}
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit("pick", [start, end])
}
}
]
},
pageForm: {
searchKeyword: "",
unionId: "",
unitId: "",
userState: "",
preparedBy: "",
personType: "",
changeTypes: [],
isOperate: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "sex", label: "性别", sortable: true, width: "100px" },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionname", label: "所属工会", sortable: true },
{ prop: "unitname", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: "160px" },
{ prop: "changeTime", label: "变更时间", sortable: true },
],
unions: [],
units: [],
isView: true,
changeTypeData: []
}
},
components: {
'common-query': COMMON_QUERY,
'user-change-info': USER_CHANGE_INFO
},
methods: {
async doSubmit(formData){
const resp = await $.post('/platform/sourcechange/manage/doSubmit', formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.$refs.guava.index()
await this.pageData()
} else {
this.$message.warning(resp.msg)
}
},
openChangeInfo(row, flag) {
this.isView = flag
this.$refs.guava.view()
this.$nextTick(() => {
this.$refs.userChangeInfoRef.onOpen(row.id)
})
},
tagClick(key, val) {
let idx = this.pageForm[key].indexOf(val)
if (idx !== -1) {
this.pageForm[key].splice(idx, 1)
} else {
this.pageForm[key].push(val)
}
this.pageData()
},
search(pageForm){
this.pageForm = { ...this.pageForm, ...pageForm }
this.pageData()
},
getChangeTypes(changeTypes){
const changeTypesList = JSON.parse(changeTypes)
if (changeTypesList) {
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypesList
.map((v) => {
return this.changeTypeData.find((item) => item.type === v).changeTypeName
})
.join(",")
}
return null
},
async pageData() {
const pageForm = clone(this.pageForm)
pageForm.changeTypes = JSON.stringify(this.pageForm.changeTypes)
const resp = await $.post('/platform/sourcechange/manage/pageData', pageForm)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
} else {
this.$message.warning(resp.msg)
}
}
},
async created() {
this.changeTypeData = await getEnumOptions("MemberChangeType")
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,440 @@
const USER_CHANGE_INFO = {
template: /*language=html*/ `
<div>
<el-tabs v-model="activeName">
<el-tab-pane label="用户基础信息" name="basicInfo">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ moment(viewData.birthday).format("YYYY年MM月DD日") }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label="党政职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="工作单位">{{ viewData.unitname }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.unionname }}</el-descriptions-item>
<el-descriptions-item label="所属校区">{{ viewData.campus }}</el-descriptions-item>
<el-descriptions-item label="身份证号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="电子邮箱">{{ viewData.email }}</el-descriptions-item>
<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.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="家庭主要成员" :span="3">
<el-table v-if="viewData.families&&viewData.families.length"
:data="viewData.families" size="mini" border
:header-cell-style="{background:'#eff3f6'}"
style="width: 100%">
<el-table-column prop="relation" label="与本人关系" align="center" header-align="center">
</el-table-column>
<el-table-column prop="name" label="姓名" align="center" header-align="center">
</el-table-column>
<el-table-column prop="unit" label="单位" align="center" header-align="center">
</el-table-column>
<el-table-column prop="remark" label="备注" align="center" header-align="center">
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="暂无家庭成员信息"></el-empty>
</el-descriptions-item>
<el-descriptions-item label="个人简况" :span="3">
<template slot="label">个人简况</template>
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="变更后用户信息" name="userChangInfo" v-if="!formData.isOperate">
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="工号">
<el-form-item prop="loginname">
<el-input v-model="formData.loginname" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="姓名">
<el-form-item prop="username">
<el-input v-model="formData.username" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-radio-group :disabled="allowFields('sex')" v-model="formData.sex" size="small">
<el-radio border label="男"></el-radio>
<el-radio border label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="民族">
<el-form-item prop="nation">
<dict-select style="width: 100%" placeholder="请选择民族" v-model="formData.nation"
:disabled="allowFields('nation')" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生日期">
<el-form-item prop="birthday">
<el-date-picker v-model="formData.birthday"
type="date"
:disabled="allowFields('birthday')"
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="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political"
:disabled="allowFields('political')" code="USER_POLITICAL"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" v-model="formData.education"
:disabled="allowFields('education')" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学位">
<el-form-item prop="academicDegree">
<dict-select style="width: 100%" placeholder="请选择学位" v-model="formData.academicDegree"
:disabled="allowFields('academicDegree')" code="USER_ACADEMIC_DEGREE"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="党政职务">
<el-form-item prop="position">
<el-input v-model="formData.position" placeholder="请输入党政职务"
:disabled="allowFields('position')" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')">
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
:disabled="isView" v-model="formData.unitid">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionId">
<el-select clearable filterable placeholder="请选择所属工会" style="width: 100%"
:disabled="isView" v-model="formData.unionid">
<el-option :key="item.id" :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
</template>
<template v-else>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
:disabled="allowFields('unitId')" @change="getUnionName(formData.unitId)"
v-model="formData.unitid">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" disabled placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="所属校区">
<el-form-item prop="campus">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.campus"
:disabled="allowFields('campus')" code="USER_CAMPUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号码">
<el-form-item prop="idCard">
<el-input v-model="formData.idCard" :disabled="allowFields('idCard')" placeholder="请输入身份证号码" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系电话">
<el-form-item prop="mobile">
<el-input v-model="formData.mobile" :disabled="allowFields('mobile')" placeholder="请输入联系电话" maxlength="15"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="电子邮箱">
<el-form-item prop="email">
<el-input v-model="formData.email" :disabled="allowFields('email')" placeholder="请输入电子邮箱" maxlength="50"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="在职状态">
<el-form-item prop="userState">
<dict-select v-model="formData.userState" code="USER_STATE"
: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="member">
<el-radio-group v-model="formData.member" :disabled="isView" size="small">
<el-radio border :label="1">会员</el-radio>
<el-radio border :label="0">非会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利会员状态">
<el-form-item prop="welfareMember">
<el-radio-group v-model="formData.welfareMember" :disabled="isView" size="small">
<el-radio border :label="1">福利会员</el-radio>
<el-radio border :label="0">非福利会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<template v-if="formData.member == 1 && !isView">
<el-descriptions-item label="是否加入会员组别">
<el-form-item prop="member">
<el-radio-group v-model="formData.isJoinActivityMemberScope" size="small">
<el-radio border :label="1"></el-radio>
<el-radio border :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
</template>
<template v-if="formData.member == 0 && !isView">
<el-descriptions-item label="是否退出会员组别">
<el-form-item prop="member">
<el-radio-group v-model="formData.isExitActivityMemberScope" size="small">
<el-radio border :label="1"></el-radio>
<el-radio border :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
</template>
<template v-if="formData.member != null && !formData.welfareMember && !isView">
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<template v-if="formData.welfareMember == true && !isView">
<el-descriptions-item label="是否加入福利项目">
<el-form-item prop="isJoinWelfareProject">
<el-radio-group v-model="formData.isJoinWelfareProject" size="small">
<el-radio border :label="1"></el-radio>
<el-radio border :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.isJoinWelfareProject">
<el-descriptions-item label="福利项目">
<el-form-item prop="welfareProjectId">
<el-select clearable filterable placeholder="请选择福利项目" style="width: 100%"
v-model="formData.welfareProjectId">
<el-option v-for="item in welfareProjectList"
:key="id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
</template>
<template v-else>
<el-descriptions-item></el-descriptions-item>
</template>
</template>
</el-descriptions>
</el-form>
<el-row justify="end" v-if="!isView" type="flex" class="mt10">
<el-button @click="$emit('do-back')" type="primary"> </el-button>
<el-button @click="doSubmit" type="primary"> </el-button>
</el-row>
</el-tab-pane>
<el-tab-pane label="详细变更字段" name="changeInfo" v-if="formData.changeInfos">
<el-table :data="formData.changeInfos" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column prop="fieldName" label="变更字段" header-align="center"></el-table-column>
<el-table-column prop="sourceValue" label="原数据" header-align="center">
<template slot-scope="{row}">
<div v-html="row.sourceValue"></div>
</template>
</el-table-column>
<el-table-column prop="newValue" label="新数据" header-align="center">
<template slot-scope="{row}">
<div v-html="row.newValue"></div>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
`,
props: {
isView: { type: Boolean, default: true },
},
mixins: [initTableMixins],
data() {
return{
activeName: "basicInfo",
viewData: {},
units: [],
unions: [],
// 允许变更的字段
allowChangeFields: [],
formData: {
families: [],
},
formRules: {
username: [{required: false, message: "必填", trigger: ["change", "blur"]}],
sex: [{required: false, message: "必填", trigger: ["change", "blur"]}],
email: [
{
validator: (rule, value, callback) => {
if (!value) {
callback();
} else if (/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value)) {
callback();
} else {
callback(new Error("邮箱格式错误"));
}
},
trigger: ["change", "blur"]
}
],
idCard: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/.test(value)) {
// 18位身份证号码格式正确
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 15位身份证号码格式正确
callback();
} else if (/^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(18位)
callback();
} else if (/^[1-9]\d{7}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/.test(value)) {
// 外国人身份证号码格式正确(15位)
callback();
} else {
// 格式错误,返回错误信息
callback(new Error("身份证号码格式错误"));
}
},
trigger: ["change", "blur"]
}
],
mobile: [
{
validator: (rule, value, callback) => {
if (!value) {
// 如果值为空,直接通过校验
callback();
} else if (/^[1][345789][0-9]{9}$/.test(value)) {
// 手机号格式正确
callback();
} else if (/^\d+-\d+$/.test(value) && value.length <= 16) {
// 座机号格式正确
callback();
} else {
// 格式错误,返回错误信息
callback(new Error(value.includes('-') ? '座机号码格式错误' : '手机号码格式错误'));
}
},
trigger: ["change", "blur"]
}
]
},
welfareProjectList: []
}
},
methods: {
onOpen(sourceChangeId){
$.post('/platform/sourcechange/manage/getSourceChangeAndCurrent', {sourceChangeId})
.then(resp => {
if (resp.code === 0) {
this.formData = resp.data.middleTable
this.viewData = resp.data.userData
this.formData.unionid = resp.data.userData.unionid
}
})
},
allowFields(prop) {
if (this.isView) {
return true
}
return !this.allowChangeFields.map(v => v.code).includes(prop)
},
doSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("提交后会改变人员基础数据,您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$emit('do-submit', this.formData)
})
.catch()
}
})
},
async init(){
const user = JSON.parse(window.sessionStorage.getItem('user'))
this.allowChangeFields = await getDictOptions("ALLOW_CHANGE_FIELDS")
if (this.$auth.hasRoleOr('sysadmin, SchoolUnionMemberAdmin, SchoolUnionAdmin')) {
this.units = await getUnits()
this.unions = await getUnions()
} else {
this.units = await getUnits(user.unionid)
}
},
},
created() {
this.init()
}
}
@@ -43,14 +43,14 @@ layout("/layouts/platform.html"){
<div class="search-item-label">在职状态</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
style="width: 100%" code="UserState"></dict-select>
style="width: 100%" code="USER_STATE"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
style="width: 100%" code="UserType"></dict-select>
style="width: 100%" code="PERSON_TYPE"></dict-select>
</div>
</div>
<div class="search-query">
@@ -43,11 +43,11 @@ layout("/layouts/platform.html"){
</el-select>
</div>
<div class="d-search-item btn-group tool-button">
<dict-select clearable code="UserType" placeholder="请选择人员类型"
<dict-select clearable code="PERSON_TYPE" placeholder="请选择人员类型"
v-model="pageForm.personType"></dict-select>
</div>
<div class="d-search-item btn-group tool-button">
<dict-select clearable code="UserState" placeholder="请选择在职状态"
<dict-select clearable code="USER_STATE" placeholder="请选择在职状态"
v-model="pageForm.userState"></dict-select>
</div>
<div class="mt10">
@@ -41,11 +41,11 @@ layout("/layouts/platform.html"){
</el-select>
</div>
<div class="d-search-item btn-group tool-button">
<dict-select clearable code="UserType" placeholder="请选择人员类型"
<dict-select clearable code="PERSON_TYPE" placeholder="请选择人员类型"
v-model="pageForm.personType"></dict-select>
</div>
<div class="d-search-item btn-group tool-button">
<dict-select clearable code="UserState" placeholder="请选择在职状态"
<dict-select clearable code="USER_STATE" placeholder="请选择在职状态"
v-model="pageForm.userState"></dict-select>
</div>
<div class="d-search-item btn-group tool-button">
@@ -43,11 +43,11 @@ layout("/layouts/platform.html"){
</el-select>
</div>
<div class="d-search-item btn-group tool-button">
<dict-select clearable code="UserType" placeholder="请选择人员类型"
<dict-select clearable code="PERSON_TYPE" placeholder="请选择人员类型"
v-model="pageForm.personType"></dict-select>
</div>
<div class="d-search-item btn-group tool-button">
<dict-select clearable code="UserState" placeholder="请选择在职状态"
<dict-select clearable code="USER_STATE" placeholder="请选择在职状态"
v-model="pageForm.userState"></dict-select>
</div>
<div class="d-search-item btn-group tool-button">
@@ -28,7 +28,7 @@ layout("/layouts/platform.html"){
</el-select>
</div>
<div class="btn-group tool-button mt5">
<dict-select clearable code="userState" placeholder="请选择在职状态"
<dict-select clearable code="USER_STATE" placeholder="请选择在职状态"
v-model="pageForm.userState"></dict-select>
</div>
<div class="btn-group tool-button mt5">
@@ -1053,8 +1053,8 @@ layout("/layouts/platform.html"){
async created() {
this.loadTree()
this.typeOptions = await getClubType()
this.personTypeOptions = await getDictOptions("UserType")
this.userStateOptions = await getDictOptions("UserState")
this.personTypeOptions = await getDictOptions("PERSON_TYPE")
this.userStateOptions = await getDictOptions("USER_STATE")
this.pageData()
}
})
@@ -100,6 +100,11 @@ layout("/layouts/platform.html"){
v-model="formData.code"
auto-complete="off" tabindex="5" type="text"></el-input>
</el-form-item>
<el-form-item prop="remark" label="特殊备注">
<el-input maxlength="100" placeholder="特殊备注"
v-model="formData.remark"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
@@ -129,6 +134,11 @@ layout("/layouts/platform.html"){
v-model="formData.code"
auto-complete="off" tabindex="2" type="text"></el-input>
</el-form-item>
<el-form-item prop="remark" label="特殊备注">
<el-input maxlength="100" placeholder="特殊备注"
v-model="formData.remark"
auto-complete="off" tabindex="4" type="text"></el-input>
</el-form-item>
<el-form-item prop="disabled" label="启用状态">
<el-switch
v-model="formData.disabled"
@@ -19,11 +19,11 @@ layout("/layouts/platform.html"){
</el-select>
</el-col>
<el-col :span="4">
<dict-select clearable code="UserType" placeholder="人员类型" style="width: 100%"
<dict-select clearable code="PERSON_TYPE" placeholder="人员类型" style="width: 100%"
v-model="pageForm.personType"></dict-select>
</el-col>
<el-col :span="4">
<dict-select clearable code="UserState" placeholder="在职状态" style="width: 100%"
<dict-select clearable code="USER_STATE" placeholder="在职状态" style="width: 100%"
v-model="pageForm.userState"></dict-select>
</el-col>
<el-col :span="6">
@@ -268,13 +268,13 @@ layout("/layouts/platform.html"){
<el-row>
<el-col :span="12">
<el-form-item label="人员类型" prop="personType">
<dict-select clearable code="UserType" placeholder="人员类型" style="width: 100%"
<dict-select clearable code="PERSON_TYPE" placeholder="人员类型" style="width: 100%"
v-model="formData.personType"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="在职状态" prop="userState">
<dict-select clearable code="UserState" placeholder="在职状态" style="width: 100%"
<dict-select clearable code="USER_STATE" placeholder="在职状态" style="width: 100%"
v-model="formData.userState"></dict-select>
</el-form-item>
@@ -670,4 +670,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -113,7 +113,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.personType" style="width: 100%"
clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
@@ -123,7 +123,7 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userState" style="width: 100%"
clearable
placeholder="在职状态"
code="UserState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -189,7 +189,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select @change="doSearch"
clearable
code="UserType"
code="PERSON_TYPE"
multiple
placeholder="人员类型"
style="width: 100%"
@@ -200,7 +200,7 @@ layout("/layouts/platform.html"){
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select @change="doSearch" clearable
code="userState"
code="USER_STATE"
multiple
placeholder="在职状态"
style="width: 100%"
@@ -178,7 +178,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="listPageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
<div class="search-item">
@@ -186,7 +186,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="listPageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
</template>
@@ -363,4 +363,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -78,7 +78,7 @@ layout("/layouts/platform.html"){
@change="doSearch"
multiple
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
<div class="search-item">
@@ -90,7 +90,7 @@ layout("/layouts/platform.html"){
@change="doSearch"
multiple
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
</template>
@@ -72,7 +72,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
<div class="search-item">
@@ -80,7 +80,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -281,4 +281,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -127,7 +127,7 @@ layout("/layouts/platform.html"){
@change="doSearch"
multiple
placeholder="人员类型"
code="UserType"></dict-select>
code="PERSON_TYPE"></dict-select>
</div>
</div>
<div class="search-item">
@@ -138,7 +138,7 @@ layout("/layouts/platform.html"){
@change="doSearch"
multiple
placeholder="在职状态"
code="userState"></dict-select>
code="USER_STATE"></dict-select>
</div>
</div>
@@ -47,7 +47,7 @@ layout("/layouts/platform.html"){
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select clearable
code="userState"
code="USER_STATE"
multiple
placeholder="在职状态"
style="width: 100%"
@@ -59,7 +59,7 @@ layout("/layouts/platform.html"){
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select clearable
code="UserType"
code="PERSON_TYPE"
multiple
placeholder="人员类型"
style="width: 100%"
@@ -931,8 +931,8 @@ layout("/layouts/platform.html"){
this.selPersonType.push(v.personType)
})
const personType = await getDictOptions("UserType")
const userState = await getDictOptions("userState")
const personType = await getDictOptions("PERSON_TYPE")
const userState = await getDictOptions("USER_STATE")
this.getMemberCheckTaskOptions();
this.fields = this.fields.concat([{
label: '人员类型',
@@ -66,7 +66,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<dict-select @change="doSearch"
clearable
code="UserType"
code="PERSON_TYPE"
placeholder="人员类型"
style="width: 100%"
v-model="pageForm.personType"></dict-select>