This commit is contained in:
@jyuhsin
2025-02-20 17:11:47 +08:00
parent bce946e651
commit 39c4581bad
5 changed files with 815 additions and 1 deletions
@@ -52,6 +52,11 @@ public class MemberChangeBranchUnionAuditController {
public void index() {
}
@At("/h5")
@Ok("beetl:/mobile/member/change/branchUnionAudit/index.html")
@RequiresPermissions("member.change.branchUnion.audit")
public void h5Index() {
}
@At
@RequiresPermissions("member.change.branchUnion.audit")
@@ -46,13 +46,17 @@ public class MemberChangeSchoolUnionAuditController {
@Inject
private SysLocalProcessService localProcessService;
@At("")
@Ok("beetl:/platform/member/change/schoolUnionAudit/index.html")
@RequiresPermissions("member.change.schoolUnion.audit")
public void index() {
}
@At("/h5")
@Ok("beetl:/mobile/member/change/schoolUnionAudit/index.html")
@RequiresPermissions("member.change.schoolUnion.audit")
public void h5Index() {
}
@At
@RequiresPermissions("member.change.schoolUnion.audit")
@@ -0,0 +1,340 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
.van-doc-card {
margin: 14px;
padding: 12px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 8px 12px #ebedf0;
line-height: 20px;
font-size: 12px;
position: relative;
}
.flex {
display: flex;
justify-content: space-between;
align-items: center;
}
.content {
margin-top: 10px;
line-height: 20px;
}
.label_content{
color: grey;
}
.title_content {
font-size: 14px;
}
.van-doc-card .van-button--small {
min-width: 60px;
height: 26px;
padding: 0 8px;
font-size: 12px;
border-radius: 6px;
}
.footer_content {
text-align: right;
}
.van-popup {
background-color: #F9F9F9;
}
</style>
<div id="app" v-cloak>
<van-nav-bar title="会员变更分工会审核" left-arrow placeholder fixed
@click-left="history.back()"></van-nav-bar>
<div class="search-fixed">
<van-search
v-model="pageForm.searchKeyword"
shape="round"
maxlength="10"
@search="doSearch"
placeholder="请输入姓名或工号进行查询"
>
</van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.audit" :options="auditOptions"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.unitId" :options="unitOptions"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.unionId" :options="unionOptions"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.personType" :options="personTypeOptions"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
</div>
<div style="margin-top: 120px">
<van-list
v-model="loading"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div class="van-doc-card" v-for="o in tableData">
<div class="title_content flex">
<div>{{o.username + '-' + o.loginname}}</div>
<div style="color: #0e5996">{{o.stateName}}</div>
</div>
<div class="content">
<div>
<span class="label_content">人员类型:</span>
<span>{{o.personType}}</span>
</div>
<div>
<span class="label_content">所属单位:</span>
<span>{{o.unitName}}</span>
</div>
<div>
<span class="label_content">所属工会:</span>
<span>{{o.unionName}}</span>
</div>
<div>
<span class="label_content">申请时间:</span>
<span>{{o.applyDateTime}}</span>
</div>
<div>
<span class="label_content">变更类型:</span>
<span @click.stop="openView(o)" style="color: #0e5996">
{{getChangeTypes(o.changeTypes)}}
</span>
</div>
</div>
<div class="footer_content">
<van-button @click.stop="openView(o)" color="#1867b0" size="small" type="primary">
查看
</van-button>
<van-button v-if="o.applyStateId === 10020"
@click.stop="openAudit(o)" color="#1867b0" size="small" type="primary">
审核
</van-button>
<van-button v-if="[10030, 10050].includes(o.applyStateId)"
@click.stop="doRevoke(o)" size="small" type="danger">
撤回
</van-button>
</div>
</div>
</van-list>
<van-empty
v-if="mLoading==false&&tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
<van-popup :style="{ height: '100%',width: '100%'}" position="right" safe-area-inset-bottom
v-model="memberChangeInfoPopup">
<van-nav-bar @click-left="memberChangeInfoPopup=false" left-arrow
title="操作详情"></van-nav-bar>
<member-change-info ref="memberChangeInfoRef" :type="openType">
<template #extra>
<van-tab name="99" title="分工会审核" v-if="openType === 'audit'">
<van-form ref="approvalFormRef" :show-error-message="false">
<van-field
readonly
value="${@shiro.getPrincipalProperty('username')}"
name="username"
label="审核人"
></van-field>
<van-field v-model="formData.auditTime" label="审核时间" readonly></van-field>
<van-field v-model="formData.auditOpinion"
required
rows="1"
autosize
label="审核意见"
type="textarea"
placeholder="请输入审核意见"
:rules="[{ required: true }]"
></van-field>
</van-form>
<div style="display: flex;justify-content: center;" class="audit mt10">
<van-button type="danger" @click="doApproval(2)" size="small">
退回重新申请
</van-button>
<van-button color="#1867b0" @click="doApproval(0)" size="small">
拒绝申请
</van-button>
<van-button color="#1867b0" @click="doApproval(1)" size="small">
同意申请
</van-button>
</div>
</van-tab>
</template>
</member-change-info>
</van-popup>
</div>
<script>
<!--#include("../common/memberChangeInfo.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
openType: 'view',
memberChangeInfoPopup: false,
pageForm: {
audit: false,
unionId: '',
unitId: '',
personType: '',
},
changeTypeData: [],
unitOptions: [],
unionOptions: [],
personTypeOptions: [],
formData: {},
auditOptions: [
{text: '未审核', value: false},
{text: '已审核', value: true},
],
}
},
components: {
'member-change-info': MEMBER_CHANGE_INFO,
},
methods: {
async doRevoke(row) {
const confirm = await vant.Dialog.confirm({
title: '提示',
message: '确定要撤回该申请吗?',
})
if (confirm === 'confirm') {
const resp = await $.post('/platform/member/change/branchUnion/audit/doRevoke', {id: row.id})
if (resp.code === 0) {
vant.Toast(resp.msg)
this.doSearch()
} else {
vant.Toast(resp.msg)
}
}
},
async doApproval(approvalType) {
this.$refs.approvalFormRef.validate().then(async () => {
let msg = '确定要通过此条申请吗?'
if (approvalType === 0) {
msg = '拒绝后不可撤回,确定要拒绝此条申请吗?'
} else if (approvalType === 2) {
msg = '确定要退回此条申请吗?'
}
const confirm = await vant.Dialog.confirm({
title: '提示',
message: msg,
})
if (confirm === 'confirm') {
this.formData.auditType = approvalType
const resp = await $.post('/platform/member/change/branchUnion/audit/approval', {
audit: JSON.stringify(this.formData),
id: this.formData.id
})
if (resp.code === 0) {
vant.Toast(resp.msg)
this.memberChangeInfoPopup = false
this.doSearch()
} else {
vant.Toast(resp.msg)
}
}
})
},
openView(row) {
this.openType = 'view'
this.memberChangeInfoPopup = true
this.$nextTick(() => {
this.$refs.memberChangeInfoRef.onOpen(row.id)
})
},
openAudit(row) {
this.openType = 'audit'
this.formData.id = row.id
this.formData.username = "${@shiro.getPrincipalProperty('username')}"
this.formData.auditTime = moment().format('YYYY-MM-DD HH:mm:ss')
this.memberChangeInfoPopup = true
this.$nextTick(() => {
this.$refs.memberChangeInfoRef.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
},
doSearch() {
this.pageForm.pageNumber = 1
this.tableData = []
this.finished = false
this.onLoad()
},
onLoad() {
this.loading = true
$.post('/platform/member/change/branchUnion/audit/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length === res.data.totalCount) {
this.finished = true
} else {
this.pageForm.pageNumber++
}
}
this.loading = false
})
},
async getUnionList(){
const {data} = await $.get("/platform/vi/common/unions")
data.forEach(v => {
v.text = v.unionname
v.value = v.id
})
data.unshift({text: "全部工会", value: ''})
this.unionOptions = data
},
async getUnitList(unionId) {
const {data} = await $.get("/platform/vi/common/units", {unionId})
data.forEach(v => {
v.text = v.name
v.value = v.id
})
data.unshift({text: "全部单位", value: ''})
this.unitOptions = data
},
async getPersonTypeList() {
const data = await getDictOptions("PERSON_TYPE")
data.forEach(v => {
v.text = v.name
v.value = v.code
})
data.unshift({text: "全部类型", value: ''})
this.personTypeOptions = data
},
},
async created() {
this.changeTypeData = await getEnumOptions("MemberChangeType")
await this.getUnionList()
await this.getUnitList()
await this.getPersonTypeList()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,125 @@
const MEMBER_CHANGE_INFO = {
template: /*language=HTML*/ `
<div class="change_info">
<van-tabs v-model="active" :ellipsis="false">
<van-tab title="基础信息" class="mb10">
<van-cell-group>
<van-cell title="工号" :value="viewData.loginname" />
<van-cell title="姓名" :value="viewData.username" />
<van-cell title="性别" :value="viewData.sex" />
<van-cell title="民族" :value="viewData.nation" />
<van-cell title="出生日期" :value="viewData.birthday ? moment(viewData.birthday).format('YYYY年MM月DD日') : '暂无'" />
<van-cell title="政治面貌" :value="viewData.political" />
<van-cell title="学历" :value="viewData.education" />
<van-cell title="学位" :value="viewData.academicDegree" />
<van-cell title="党政职务" :value="viewData.position" />
<van-cell title="工作单位" :value="viewData.unitname" />
<van-cell title="所属工会" :value="viewData.unionname" />
<van-cell title="所属校区" :value="viewData.campus" />
<van-cell title="身份证号码" :value="viewData.idCard" />
<van-cell title="联系电话" :value="viewData.mobile" />
<van-cell title="电子邮箱" :value="viewData.email" />
<van-cell title="在职状态" :value="viewData.userState" />
<van-cell title="人员类型" :value="viewData.personType" />
<van-cell title="人员性质" :value="viewData.preparedBy" />
<van-cell title="会员状态" :value="viewData.member ? '会员' : '非会员'" />
<van-cell title="福利会员状态" :value="viewData.welfareMember ? '福利会员' : '非福利会员'" />
<van-cell title="个人简况">
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<span v-else>无数据</span>
</van-cell>
</van-cell-group>
</van-tab>
<van-tab title="变更信息" class="mb10">
<div v-if="viewData.changeInfos.length > 0" v-for="(row,index) in viewData.changeInfos">
<div class="van-sidebar-item van-sidebar-item--select" style="font-size: 18px">
{{ index + 1 }}
</div>
<van-cell-group>
<van-cell title="变更字段" :value="row.fieldName" />
<van-cell title="原数据">
<div v-html="row.sourceValue"></div>
</van-cell>
<van-cell title="新数据">
<div v-html="row.newValue"></div>
</van-cell>
</van-cell-group>
</div>
<van-empty
v-if="viewData.changeInfos.length === 0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</van-tab>
<van-tab title="分工会审核信息" v-if="viewData.branchAudit">
<van-cell-group>
<van-cell title="审核人员" :value="viewData.branchAudit.username" />
<van-cell title="审核时间" :value="viewData.branchAudit.auditTime" />
<van-cell title="审核意见" :value="viewData.branchAudit.auditOpinion" />
</van-cell-group>
</van-tab>
<van-tab title="校工会审核信息" v-if="viewData.schoolAudit">
<van-cell-group>
<van-cell title="审核人员" :value="viewData.schoolAudit.username" />
<van-cell title="审核时间" :value="viewData.schoolAudit.auditTime" />
<van-cell title="审核意见" :value="viewData.schoolAudit.auditOpinion" />
</van-cell-group>
</van-tab>
<slot name="extra"></slot>
</van-tabs>
</div>
`,
mixins: [mobileMixins],
props: {
type: {
type: String,
default: 'view'
},
},
data() {
return{
active: 0,
viewData: {
changeInfos: [],
schoolAudit: {},
branchAudit: {}
},
}
},
methods: {
async onOpen(id){
if(this.type === 'audit') {
this.active = '99'
}
const resp = await $.post('/platform/member/change/mine/findMemberChangeRecord', {id})
if (resp.code === 0) {
this.viewData = resp.data
}
},
},
async created() {
},
style: /*language=CSS*/`
.change_info .van-empty {
background-color: transparent !important;
position: relative !important;
width: 100%;
height: 100%;
z-index: 0 !important;
top: 0 !important;
left: 0 !important;
transform: none !important;
}
.audit .van-button--small {
min-width: 60px !important;
height: 30px !important;
padding: 0 8px !important;
font-size: 12px !important;
border-radius: 6px !important;
margin-right: 10px !important;
}
`
}
@@ -0,0 +1,340 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
.van-doc-card {
margin: 14px;
padding: 12px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 8px 12px #ebedf0;
line-height: 20px;
font-size: 12px;
position: relative;
}
.flex {
display: flex;
justify-content: space-between;
align-items: center;
}
.content {
margin-top: 10px;
line-height: 20px;
}
.label_content{
color: grey;
}
.title_content {
font-size: 14px;
}
.van-doc-card .van-button--small {
min-width: 60px;
height: 26px;
padding: 0 8px;
font-size: 12px;
border-radius: 6px;
}
.footer_content {
text-align: right;
}
.van-popup {
background-color: #F9F9F9;
}
</style>
<div id="app" v-cloak>
<van-nav-bar title="会员变更校工会审核" left-arrow placeholder fixed
@click-left="history.back()"></van-nav-bar>
<div class="search-fixed">
<van-search
v-model="pageForm.searchKeyword"
shape="round"
maxlength="10"
@search="doSearch"
placeholder="请输入姓名或工号进行查询"
>
</van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.audit" :options="auditOptions"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.unitId" :options="unitOptions"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.unionId" :options="unionOptions"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.personType" :options="personTypeOptions"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
</div>
<div style="margin-top: 120px">
<van-list
v-model="loading"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div class="van-doc-card" v-for="o in tableData">
<div class="title_content flex">
<div>{{o.username + '-' + o.loginname}}</div>
<div style="color: #0e5996">{{o.stateName}}</div>
</div>
<div class="content">
<div>
<span class="label_content">人员类型:</span>
<span>{{o.personType}}</span>
</div>
<div>
<span class="label_content">所属单位:</span>
<span>{{o.unitName}}</span>
</div>
<div>
<span class="label_content">所属工会:</span>
<span>{{o.unionName}}</span>
</div>
<div>
<span class="label_content">申请时间:</span>
<span>{{o.applyDateTime}}</span>
</div>
<div>
<span class="label_content">变更类型:</span>
<span @click.stop="openView(o)" style="color: #0e5996">
{{getChangeTypes(o.changeTypes)}}
</span>
</div>
</div>
<div class="footer_content">
<van-button @click.stop="openView(o)" color="#1867b0" size="small" type="primary">
查看
</van-button>
<van-button v-if="o.applyStateId === 10050"
@click.stop="openAudit(o)" color="#1867b0" size="small" type="primary">
审核
</van-button>
<van-button v-if="[10060].includes(o.applyStateId)"
@click.stop="doRevoke(o)" size="small" type="danger">
撤回
</van-button>
</div>`1
</div>
</van-list>
<van-empty
v-if="mLoading==false&&tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
<van-popup :style="{ height: '100%',width: '100%'}" position="right" safe-area-inset-bottom
v-model="memberChangeInfoPopup">
<van-nav-bar @click-left="memberChangeInfoPopup=false" left-arrow
title="操作详情"></van-nav-bar>
<member-change-info ref="memberChangeInfoRef" :type="openType">
<template #extra>
<van-tab name="99" title="校工会审核" v-if="openType === 'audit'">
<van-form ref="approvalFormRef" :show-error-message="false">
<van-field
readonly
value="${@shiro.getPrincipalProperty('username')}"
name="username"
label="审核人"
></van-field>
<van-field v-model="formData.auditTime" label="审核时间" readonly></van-field>
<van-field v-model="formData.auditOpinion"
required
rows="1"
autosize
label="审核意见"
type="textarea"
placeholder="请输入审核意见"
:rules="[{ required: true }]"
></van-field>
</van-form>
<div style="display: flex;justify-content: center;" class="audit mt10">
<van-button type="danger" @click="doApproval(2)" size="small">
退回重新申请
</van-button>
<van-button color="#1867b0" @click="doApproval(0)" size="small">
拒绝申请
</van-button>
<van-button color="#1867b0" @click="doApproval(1)" size="small">
同意申请
</van-button>
</div>
</van-tab>
</template>
</member-change-info>
</van-popup>
</div>
<script>
<!--#include("../common/memberChangeInfo.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
openType: 'view',
memberChangeInfoPopup: false,
pageForm: {
audit: false,
unionId: '',
unitId: '',
personType: '',
},
changeTypeData: [],
unitOptions: [],
unionOptions: [],
personTypeOptions: [],
formData: {},
auditOptions: [
{text: '未审核', value: false},
{text: '已审核', value: true},
],
}
},
components: {
'member-change-info': MEMBER_CHANGE_INFO,
},
methods: {
async doRevoke(row) {
const confirm = await vant.Dialog.confirm({
title: '提示',
message: '确定要撤回该申请吗?',
})
if (confirm === 'confirm') {
const resp = await $.post('/platform/member/change/schoolUnion/audit/doRevoke', {id: row.id})
if (resp.code === 0) {
vant.Toast(resp.msg)
this.doSearch()
} else {
vant.Toast(resp.msg)
}
}
},
async doApproval(approvalType) {
this.$refs.approvalFormRef.validate().then(async () => {
let msg = '确定要通过此条申请吗?'
if (approvalType === 0) {
msg = '拒绝后不可撤回,确定要拒绝此条申请吗?'
} else if (approvalType === 2) {
msg = '确定要退回此条申请吗?'
}
const confirm = await vant.Dialog.confirm({
title: '提示',
message: msg,
})
if (confirm === 'confirm') {
this.formData.auditType = approvalType
const resp = await $.post('/platform/member/change/schoolUnion/audit/approval', {
audit: JSON.stringify(this.formData),
id: this.formData.id
})
if (resp.code === 0) {
vant.Toast(resp.msg)
this.memberChangeInfoPopup = false
this.doSearch()
} else {
vant.Toast(resp.msg)
}
}
})
},
openView(row) {
this.openType = 'view'
this.memberChangeInfoPopup = true
this.$nextTick(() => {
this.$refs.memberChangeInfoRef.onOpen(row.id)
})
},
openAudit(row) {
this.openType = 'audit'
this.formData.id = row.id
this.formData.username = "${@shiro.getPrincipalProperty('username')}"
this.formData.auditTime = moment().format('YYYY-MM-DD HH:mm:ss')
this.memberChangeInfoPopup = true
this.$nextTick(() => {
this.$refs.memberChangeInfoRef.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
},
doSearch() {
this.pageForm.pageNumber = 1
this.tableData = []
this.finished = false
this.onLoad()
},
onLoad() {
this.loading = true
$.post('/platform/member/change/schoolUnion/audit/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length === res.data.totalCount) {
this.finished = true
} else {
this.pageForm.pageNumber++
}
}
this.loading = false
})
},
async getUnionList(){
const {data} = await $.get("/platform/vi/common/unions")
data.forEach(v => {
v.text = v.unionname
v.value = v.id
})
data.unshift({text: "全部工会", value: ''})
this.unionOptions = data
},
async getUnitList(unionId) {
const {data} = await $.get("/platform/vi/common/units", {unionId})
data.forEach(v => {
v.text = v.name
v.value = v.id
})
data.unshift({text: "全部单位", value: ''})
this.unitOptions = data
},
async getPersonTypeList() {
const data = await getDictOptions("PERSON_TYPE")
data.forEach(v => {
v.text = v.name
v.value = v.code
})
data.unshift({text: "全部类型", value: ''})
this.personTypeOptions = data
},
},
async created() {
this.changeTypeData = await getEnumOptions("MemberChangeType")
await this.getUnionList()
await this.getUnitList()
await this.getPersonTypeList()
}
})
</script>
<!--#
}
#-->