This commit is contained in:
Paidax
2025-07-31 15:48:46 +08:00
parent ac02be1aec
commit 1510e28ab0
294 changed files with 36042 additions and 4361 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,266 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名工号">
<el-input placeholder="请输入关键字查询" v-model="pageForm.keyWord"></el-input>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" clearable filterable placeholder="请选择院级工会"
style="width: 100%">
<el-option
v-for="item in unionList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="绑定列表">
<el-dropdown @command="dropdownCommand">
<el-button size="medium" type="danger">
批量删除&emsp;
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'delete2'}">
删除已选
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete3'}">
全部删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="_id" @sort-change="pageOrder"
v-loading="tabLoading" @selection-change="handleSelectionChange">
<el-table-column :reserve-selection="true"
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" width="60" type="index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="工号" prop="loginname" header-align="center"
align="center"></el-table-column>
<el-table-column label="姓名" prop="username" header-align="center"
align="center"></el-table-column>
<el-table-column label="openid" prop="openid" header-align="center"
align="center"></el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="240px">
<template scope="{row}">
<el-button type="danger" @click="doDelete(row._id)" size="mini"
icon="el-icon-delete"></el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
v: "index",
stepActive: 0,
tabLoading: false,
subDis: false,
formData: {},
tableData: [],
pageForm: {
searchName: "name",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
multipleSelection: [],
unionList: []
}
},
methods: {
dropdownCommand: function (command) {
const {type, data} = command
if (type == 'delete2') {
this.doDelete2()
} else if (type == 'delete3') {
this.doDelete3()
}
},
async doDelete(id) {
this.$confirm('是否确定删除!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const {
code,
data,
msg
} = await this.$axios.post(loc() + "/delete", {ids: JSON.stringify([id])})
if (code === 0) {
this.$message({message: msg, type: 'success'});
this.pageData()
} else {
this.$message({message: data.msg, type: 'error'});
}
}
}
})
},
async doDelete2() {
if (!this.multipleSelection.length) {
this.$notify({
title: '提示',
message: '请先勾选需要删除的人员!',
type: 'warning'
});
return
}
this.$confirm('是否确定删除!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const arr = this.multipleSelection.map(v => {
return v._id
})
const {code, data, msg} = await this.$axios.post(loc() + "/delete", {ids: JSON.stringify(arr)})
if (code === 0) {
this.multipleSelection = []
this.$message({
message: msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}
}
})
},
async doDelete3() {
this.$confirm('是否确定删除全部登录记录!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const {code, data, msg} = await this.$axios.post(loc() + "/deleteAll")
if (code === 0) {
this.multipleSelection = []
this.$message({
message: msg,
type: 'success'
});
this.pageData()
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}
}
})
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
doSearch() {
this.tabKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {//按字段排序
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
pageNumberChange(val) {//页码更新操作
this.pageForm.pageNumber = val;
this.pageData();
},
pageSizeChange(val) {//分页大小更新操作
this.pageForm.pageSize = val;
this.pageData();
},
pageData() {//加载分页数据
this.tabLoading = true
this.$axios.post(loc() + "/pageData", this.pageForm)
.then(res => {
this.tabLoading = false
if (res.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
})
},
},
async created() {
this.pageData();
const hasAdminRole = this.$auth.hasRoleOr("SYSADMIN, SCHOOL_UNION_ADMIN")
if (hasAdminRole) {
this.unionList = await this.$businessTool.listUnion()
} else {
this.unionList = await this.$businessTool.listUnion(this.$store.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,264 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年份">
<el-date-picker
:clearable="false"
placeholder="选择年"
style="width: 100%"
@change="getCascadersActivity"
type="year" v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="活动">
<el-cascader
style="width: 100%"
@change="doSearch"
v-model="pageForm.activityId"
:options="activityOptions"
:props="{ checkStrictly: true,emitPath:false}"
clearable></el-cascader>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="参与列表">
<el-button @click="$downLoad(loc() + '/exportUnionRegCheckInNum', {activityId : pageForm.activityId})"
class="ml10"
size="small"
type="primary"
icon="el-icon-download">
导出报名及打卡人数
</el-button>
<el-button @click="$downLoad(loc() + '/exportNotGetGiftVoucherUsers', {activityId : pageForm.activityId})"
class="ml10"
size="small"
type="primary"
icon="el-icon-download">
导出未取得礼品券人员
</el-button>
<el-button @click="$downLoad(loc() + '/exportNotGetGiftVoucherUsers', {activityId : pageForm.activityId})"
class="ml10"
size="small"
type="primary"
icon="el-icon-download">
导出未使用礼品券用户
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" show-summary>
<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"
:key="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column label="操作" width="300px">
<template scope="{row}">
<el-button @click="viewReg(row)" size="mini" type="primary">查看报名情况</el-button>
<el-button @click="viewCheckIn(row)" size="mini" type="primary">查看打卡情况</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
<template #view>
<el-card shadow="never" v-if="viewIndex==='regTableShow'">
<template #header>
<div style="display: flex;justify-content: space-between;align-items: center">
<h4 style="color: rgb(24, 103, 176);">
{{viewUnion.unionname}}
</h4>
<el-button type="primary" size="mini" icon="el-icon-download"
@click="exportRegUsers">
导出名单
</el-button>
</div>
</template>
<el-table :data="regTableData" style="width: 100%" row-key="_id" max-height="600px">
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="单位" prop="unitname" show-overflow-tooltip></el-table-column>
<el-table-column label="电话" prop="mobile"></el-table-column>
<el-table-column label="报名时间" prop="register_time_str"></el-table-column>
</el-table>
</el-card>
<el-card shadow="never" v-else-if="viewIndex==='checkInTableShow'">
<template #header>
<div style="display: flex;justify-content: space-between;align-items: center">
<h4 style="color: rgb(24, 103, 176);">
{{viewUnion.unionname}}
</h4>
<el-button type="primary" size="mini" icon="el-icon-download"
@click="exportCheckInUsers">
导出名单
</el-button>
</div>
</template>
<el-table :data="regTableData" style="width: 100%" row-key="_id" max-height="600px">
<el-table-column label="工号" prop="loginname"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="单位" prop="unitname" show-overflow-tooltip></el-table-column>
<el-table-column label="电话" prop="mobile"></el-table-column>
<el-table-column label="点位总数" prop="pts_size"></el-table-column>
<el-table-column label="已打卡点位数" prop="sign_size"></el-table-column>
<el-table-column label="礼品券" prop="used">
<template scope="{row}">
<span v-if="row.used==null" class="text-danger">未取得</span>
<span v-else-if="row.used" class="text-success">已使用</span>
<span v-else-if="!row.used" class="text-warning">未使用</span>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
</guava>
</div>
<script>
let vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{label: '分工会', prop: 'unionname'},
{label: '报名人数', prop: 'regCount'},
{label: '打卡人数', prop: 'checkInCount'},
],
unionOptions: [],
unitOptions: [],
pageForm: {
unionId: '',
unitId: '',
activityDate: [],
year: new Date().getFullYear() + '',
},
activityOptions: [],
regTableData: [],
checkInTableData: [],
viewIndex: '',
viewUnion: {}
}
},
methods: {
viewReg({id, unionname}) {
this.viewUnion.unionId = id
this.viewUnion.unionname = unionname
this.$refs.guava.view(() => {
this.viewIndex = 'regTableShow'
this.$axios.post(loc() + '/unionRegistrationData', {
unionId: id,
activityId: this.pageForm.activityId
}).then(res => {
if (res.code === 0) {
this.regTableData = res.data
} else {
this.$message.error(res.msg)
}
})
})
},
viewCheckIn({id, unionname}) {
this.viewUnion.unionId = id
this.viewUnion.unionname = unionname
this.$refs.guava.view(() => {
this.viewIndex = 'checkInTableShow'
this.$axios.post(loc() + '/unionCheckInData', {
unionId: id,
activityId: this.pageForm.activityId
}).then(res => {
if (res.code === 0) {
this.regTableData = res.data
} else {
this.$message.error(res.msg)
}
})
})
},
exportExcel() {
const {hdid, unionId, unitId, activityDate} = this.pageForm
let activityDate1 = []
if (activityDate && activityDate.length > 0) {
activityDate1 = JSON.stringify(activityDate)
}
this.$downLoad(loc() + "/exportExcel", {
hdid: hdid,
unionId: unionId,
unitId: unitId,
activityDate: activityDate1
})
},
activityDateChange() {
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await this.$businessTool.listUnit(val)
this.doSearch()
},
pageData() {
this.$axios.post(loc() + '/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = res.data
} else {
this.$message.error(res.msg)
}
})
},
async getCascadersActivity() {
const {code, data} = await this.$axios.post(loc() + '/getCascadersActivity', {year: this.pageForm.year})
this.activityOptions = data
if (this.activityOptions && this.activityOptions.length > 0) {
this.pageForm.activityId = this.activityOptions[0].value
this.pageData()
} else {
this.tableData = []
}
},
exportCheckInUsers() {
this.$downLoad(loc() + '/exportCheckInUsers', {
unionId: this.viewUnion.unionId,
activityId: this.pageForm.activityId
})
},
exportRegUsers(){
this.$downLoad(loc() + '/exportRegUsers', {
unionId: this.viewUnion.unionId,
activityId: this.pageForm.activityId
})
}
},
async created() {
this.unionOptions = await this.$businessTool.listUnion()
this.unitOptions = await this.$businessTool.listUnit()
await this.getCascadersActivity()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,383 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年份">
<el-date-picker style="width: 100%"
class="mr5"
:picker-options="pickerOptions"
v-model="pageForm.year" :clearable="false"
type="year"
value-format="yyyy" @change="getCascadersActivity"
placeholder="选择年">
</el-date-picker>
</search-item>
<search-item label="活动">
<el-cascader
style="width: 100%"
@change="doSearch()"
v-model="pageForm.activityId"
:options="activityOptions"
:props="{ checkStrictly: true,emitPath:false}"
:clearable="false"></el-cascader>
</search-item>
<search-item label="姓名工号">
<el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"
style="width: 100%" @keyup.enter.native="doSearch">
</el-input>
</search-item>
<template v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')">
<search-item label="所属工会">
<el-select @change="unionChange" clearable filterable style="width: 100%"
placeholder="请选择所属工会" v-model="pageForm.unionId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unionOptions">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch" clearable filterable style="width: 100%"
placeholder="请选择所属单位" v-model="pageForm.unitId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</search-item>
</template>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="达标人员列表">
<el-button @click="setRaffle" class="ml10" size="small" type="primary">设置抽奖条件</el-button>
<el-button @click="viewLotteryUsers" class="ml10" size="small" type="primary">查看中奖人员</el-button>
<el-button @click="exportExcel" class="ml10" size="small" type="primary">导出达标人员</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<el-card shadow="never">
<h2 style="color: #0a84ff">抽奖规则</h2>
<span>排名位次指:一等奖,二等奖,三等奖;如您填写【1】,会按照达标总步数降序,取最高位次;填写【2】则排除【1】的中奖人数后再取抽奖人数的最高位次</span>
<el-form :model="formData" ref="formRef" label-width="100px">
<el-form-item>
<el-table tooltip-effect="dark" style="width: 100%" :data="formData.manualLotteryRules">
<el-table-column label="奖项名称" align="center">
<template scope="scope">
<el-input v-model="scope.row.awardName" placeholder="请输入奖项名称" max="50" clearable></el-input>
</template>
</el-table-column>
<el-table-column label="奖项积分" align="center">
<template scope="scope">
<el-input-number v-model="scope.row.points" placeholder="请输入奖项积分" style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="抽奖人数" align="center">
<template scope="scope">
<el-input-number v-model="scope.row.lotteryUserNum"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="抽奖类型" align="center">
<template scope="scope">
<el-select v-model="scope.row.raffleType">
<el-option
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in raffleTypeOptions">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="排名位次" align="center">
<template scope="scope">
<el-input-number v-if="scope.row.raffleType == '排名'"
v-model="scope.row.rankingPosition"
style="width: 100%"></el-input-number>
</template>
</el-table-column>
<el-table-column label="是否兼得" align="center">
<template scope="scope">
<el-radio-group v-if="scope.row.raffleType == '达标'"
v-model="scope.row.isSimultaneously" size="small">
<el-radio label="true" border></el-radio>
<el-radio label="false" border></el-radio>
</el-radio-group>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot="header" slot-scope="scope">
<el-button @click="formData.manualLotteryRules.push({})"
icon="el-icon-plus" size="mini" type="primary"></el-button>
</template>
<template scope="scope">
<el-button @click="formData.manualLotteryRules.splice(scope.$index,1)"
icon="el-icon-delete" size="mini" type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<div style="text-align: right">
<el-button @click="$refs.guava.index()" class="ml10">返回</el-button>
<el-button @click="saveRaffle" class="ml10" type="primary">提交</el-button>
</div>
</el-card>
</template>
<template #view>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">姓名工号</div>
<div class="search-item-option">
<el-input v-model="awardPageForm.searchKeyword" placeholder="请输入姓名或工号" clearable></el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">奖项名称</div>
<div class="search-item-option">
<el-select v-model="awardPageForm.lotteryTime" style="width: 100%" clearable>
<el-option
:key="item.value"
:label="item.value"
:value="item.value"
v-for="item in awardNameOptions">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="awardPageData" icon="el-icon-search" type="primary"></el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="中奖人员列表">
<template #func>
<el-button @click="exportAwardExcel" icon="el-icon-download" type="primary" size="small">导出中奖人员</el-button>
</template>
</table-tool>
<el-table :data="awardTableData">
<el-table-column :index="indexMethod" align="center" header-align="center" label="排名" type="index"
width="80px"></el-table-column>
<el-table-column align="center" header-align="center" label="工号" prop="loginName"></el-table-column>
<el-table-column align="center" header-align="center" label="姓名" prop="username"></el-table-column>
<el-table-column align="center" header-align="center" label="分工会" prop="unionName"></el-table-column>
<el-table-column align="center" header-align="center" label="单位" prop="unitName"></el-table-column>
<el-table-column align="center" header-align="center" label="奖项名称" prop="awardName"></el-table-column>
</el-table>
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins:[initTableMixins],
data() {
return {
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
pageForm: {
year: moment().format('YYYY'),
unionId:'',
unitId:''
},
unionOptions: [],
unitOptions: [],
activityOptions: [],
tableColumns: [
{label: '姓名', prop: 'username'},
{label: '工号', prop: 'loginname'},
{label: '分工会', prop: 'unionname', sortable: true},
{label: '单位', prop: 'unitname'},
{label: '步数', prop: 'total_steps', sortable: true},
{label: '达标天数', prop: 'standardsDays', sortable: true},
],
raffleTypeOptions: [
{ value: '排名', label: '排名' },
{ value: '达标', label: '达标' },
],
formData: {
manualLotteryRules: []
},
awardNameOptions: [],
awardPageForm: {
searchKeyword: '',
activityId: '',
lotteryTime: ''
},
awardTableData: []
}
},
methods: {
/**
* 设置抽奖条件
*/
async setRaffle(){
this.$refs.guava.edit(async () => {
// 获取该活动的抽奖条件
const resp = await this.$axios.post('/platform/fitnessWalk/stepRaffle/getRaffle', {
activityId: this.pageForm.activityId
})
if (resp.code === 0) {
if (resp.data) {
this.formData = resp.data
}
} else {
this.formData = {
manualLotteryRules: []
}
}
})
},
/**
* 查看中奖人员
*/
viewLotteryUsers(){
this.$refs.guava.view(() => {
this.awardPageData()
})
},
async awardPageData() {
this.awardPageForm.activityId = this.pageForm.activityId
const resp = await this.$axios.post('/platform/fitnessWalk/stepWining/prizeUsers', this.awardPageForm)
if (resp.code === 0) {
this.awardTableData = resp.data
}
},
exportAwardExcel(){
const {searchKeyword,activityId,lotteryTime} = this.awardPageForm
this.$downLoad(loc() + '/exportAwardExcel', {
searchKeyword: searchKeyword,
activityId: activityId,
lotteryTime: lotteryTime
})
},
async saveRaffle() {
const formData = this.formData
formData.activityId = this.pageForm.activityId
formData.manualLotteryRules = JSON.stringify(this.formData.manualLotteryRules)
const resp = await this.$axios.post('/platform/fitnessWalk/stepRaffle/saveRaffle', this.formData)
if (resp.code === 0) {
this.$message.success('保存成功')
this.$refs.guava.index()
} else {
this.$message.warning(resp.msg)
}
},
exportExcel(){
const {searchKeyword,activityId,unionId,unitId} = this.pageForm
this.$downLoad(loc() + '/exportExcel', {
searchKeyword: searchKeyword,
activityId: activityId,
unionId: unionId,
unitId: unitId
})
},
async getAllActivity() {
this.pageForm.activityId = ''
this.activityOptions = []
const {data} = await this.$axios.post('/platform/fitnessWalk/activityManage/getAllActivity', this.pageForm)
if (data == null || data.length === 0) {
this.tableData = []
return
} else {
this.activityOptions = data.filter(item => item.activityModel === 'stepCount')
}
if (this.activityOptions) {
this.pageForm.activityId = this.activityOptions[0]._id
}
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await this.$businessTool.listUnit(val)
this.doSearch()
},
async getCascadersActivity() {
const {code, data} = await this.$axios.post(loc() + '/getCascadersActivity', {year: this.pageForm.year})
this.activityOptions = data
if (this.activityOptions && this.activityOptions.length > 0) {
this.pageForm.activityId = this.activityOptions[0].value
this.doSearch()
} else {
this.tableData = []
}
},
async getAwardUserNum(){
const resp = await this.$axios.post('/platform/fitnessWalk/stepRaffle/getAwardUserNum')
if (resp.code === 0) {
}
},
async getAwardNameOptions(){
const resp = await this.$axios.post('/platform/fitnessWalk/stepWining/prizeOption', {
activityId: this.pageForm.activityId
})
if (resp.code === 0) {
this.awardNameOptions = resp.data
}
},
},
async created() {
this.unionOptions = await this.$businessTool.listUnion()
this.unitOptions = await this.$businessTool.listUnit()
await this.getCascadersActivity()
await this.getAwardNameOptions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,177 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年份">
<el-date-picker style="width: 100%"
class="mr5"
:picker-options="pickerOptions"
v-model="pageForm.year" :clearable="false"
type="year"
value-format="yyyy" @change="getAllActivity"
placeholder="选择年">
</el-date-picker>
</search-item>
<search-item label="活动">
<el-cascader
style="width: 100%"
@change="doSearch()"
v-model="pageForm.activityId"
:options="activityOptions"
:props="{ checkStrictly: true,emitPath:false}"
:clearable="false"></el-cascader>
</search-item>
<search-item label="姓名工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch"></el-input>
</search-item>
<template v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')">
<search-item label="所属工会">
<el-select @change="unionChange" clearable filterable style="width: 100%"
placeholder="请选择所属工会" v-model="pageForm.unionId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unionOptions">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch" clearable filterable style="width: 100%"
placeholder="请选择所属单位" v-model="pageForm.unitId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</search-item>
</template>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="排行榜">
<el-radio-group v-model="pageForm.mode" size="small" @change="doSearch" class="mr10">
<el-radio-button label="today">今日排行榜</el-radio-button>
<el-radio-button label="all">总排行榜</el-radio-button>
</el-radio-group>
<el-button @click="exportExcel" size="small" type="primary">导出{{pageForm.mode == 'today' ? '今日排行榜' : '总排行榜'}}</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins:[initTableMixins],
data() {
return {
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
pageForm: {
year: new Date().getFullYear() + '',
mode:'today',
searchName:'u.username',
unionId:'',
unitId:''
},
unionOptions: [],
unitOptions: [],
activityOptions: [],
tableColumns: [
{label: '姓名', prop: 'username'},
{label: '工号', prop: 'loginname'},
{label: '分工会', prop: 'unionname', sortable: true},
{label: '单位', prop: 'unitname'},
{label: '步数', prop: 'total_steps', sortable: true},
],
}
},
methods: {
exportExcel(){
const {searchName,searchKeyword,activityId,unionId,unitId,mode} = this.pageForm
this.$downLoad(loc() + '/exportExcel', {
searchName: searchName,
searchKeyword: searchKeyword,
activityId: activityId,
unionId: unionId,
unitId: unitId,
mode: mode
})
},
async getAllActivity() {
this.pageForm.activityId = ''
this.activityOptions = []
const {data} = await this.$axios.post('/platform/fitnessWalk/activityManage/getAllActivity', this.pageForm)
if (data == null || data.length === 0) {
this.tableData = []
return
} else {
this.activityOptions = data.filter(item => item.activityModel === 'stepCount')
}
if (this.activityOptions) {
this.pageForm.activityId = this.activityOptions[0]._id
}
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await this.$businessTool.listUnit(val)
this.doSearch()
},
async getCascadersActivity() {
const {code, data} = await this.$axios.post(loc() + '/getCascadersActivity', {year: this.pageForm.year})
this.activityOptions = data
if (this.activityOptions && this.activityOptions.length > 0) {
this.pageForm.activityId = this.activityOptions[0].value
this.doSearch()
} else {
this.tableData = []
}
}
},
async created() {
this.unionOptions = await this.$businessTool.listUnion()
this.unitOptions = await this.$businessTool.listUnit()
await this.getCascadersActivity()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,202 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年份">
<el-date-picker
:clearable="false"
placeholder="选择年"
style="width: 100%"
@change="getCascadersActivity"
type="year" v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="活动">
<el-cascader
style="width: 100%"
@change="doSearch();getActivityById()"
v-model="pageForm.activityId"
:options="activityOptions"
:props="{ checkStrictly: true,emitPath:false}"
:clearable="false"></el-cascader>
</search-item>
<search-item label="日期范围">
<el-date-picker
end-placeholder="结束日期"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
style="width: 100%"
@change="activityDateChange"
value-format="yyyy-MM-dd"
v-model="pageForm.activityDate">
</el-date-picker>
</search-item>
<search-item label="姓名工号">
<el-input v-model="pageForm.searchKeyword" max="20" placeholder="请输入工号或者姓名查询" clearable></el-input>
</search-item>
<template v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')">
<search-item label="所属工会">
<el-select @change="unionChange" clearable filterable style="width: 100%"
placeholder="请选择所属工会" v-model="pageForm.unionId">
<el-option
:key="item.id"
:label="item.unionname"
:value="item.id"
v-for="item in unionOptions">
</el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select @change="doSearch" clearable filterable style="width: 100%"
placeholder="请选择所属单位" v-model="pageForm.unitId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in unitOptions">
</el-option>
</el-select>
</search-item>
</template>
</search>
</el-card>
<el-card class="mt20" shadow="never">
<table-tool label="步数列表">
<el-button @click="exportExcel" class="ml10" size="small" type="primary">导出</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='registerNum'">
<el-link @click="openView(row.id)" type="primary">
{{row.registerNum}}
</el-link>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
let vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{label: '姓名', prop: 'username'},
{label: '工号', prop: 'loginname'},
{label: '单位', prop: 'unitname'},
{label: '分工会', prop: 'unionname', sortable: true},
{label: '当前步数', prop: 'step', sortable: true},
{label: '日期', prop: 'prizeData', sortable: true}
],
unionOptions: [],
unitOptions: [],
pageForm: {
unionId: '',
unitId: '',
activityDate: [],
activityId: null,
year: new Date().getFullYear() + '',
},
activityOptions: [],
activityDatePickerOptions: {
disabledDate: time => {
return (
time <= moment(this.activityInfo.endTime) || time >= moment(this.activityInfo.startTime)
);
}
},
activityInfo:{},
}
},
methods: {
exportExcel() {
const {activityId, unionId, unitId, activityDate} = this.pageForm
let activityDate1 = []
if (activityDate && activityDate.length > 0) {
activityDate1 = JSON.stringify(activityDate)
}
this.$downLoad(loc() + '/exportExcel', {
activityId: activityId,
unionId: unionId,
unitId: unitId,
activityDate: activityDate1
})
},
activityDateChange() {
// this.$set(this.pageForm, "activityDate", [])
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await this.$businessTool.listUnit(val)
this.doSearch()
},
async getCascadersActivity() {
const {code, data} = await this.$axios.post(loc() + '/getCascadersActivity', {year: this.pageForm.year})
this.activityOptions = data
if (this.activityOptions && this.activityOptions.length > 0) {
this.pageForm.activityId = this.activityOptions[0].value
this.doSearch()
} else {
this.tableData = []
}
},
pageData() {
let pageForm = clone(this.pageForm)
if (pageForm.activityDate && pageForm.activityDate.length > 0) {
pageForm.activityDate = JSON.stringify(pageForm.activityDate)
}
this.$axios.post(loc() + "/pageData", pageForm, (data) => {
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
async getActivityById(){
const resp = await this.$axios.post('/platform/fitnessWalk/activityManage/findOne',{id:this.pageForm.activityId})
if (resp.code === 0){
this.activityInfo = resp.data
}
}
},
async created() {
this.unionOptions = await this.$businessTool.listUnion()
this.unitOptions = await this.$businessTool.listUnit()
await this.getCascadersActivity()
await this.getActivityById();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,187 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 50px;
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>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年份">
<el-date-picker style="width: 100%"
class="mr5"
:picker-options="pickerOptions"
v-model="pageForm.year" :clearable="false"
type="year"
value-format="yyyy" @change="getAllActivity"
placeholder="选择年">
</el-date-picker>
</search-item>
<search-item label="活动">
<el-cascader
style="width: 100%"
@change="doSearch()"
v-model="pageForm.activityId"
:options="activityOptions"
:props="{ checkStrictly: true,emitPath:false}"
:clearable="false"></el-cascader>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never" style="height: 100px">
<el-row type="flex" align="middle" class="query-row">
<el-col class="query-row-title">奖项名称:</el-col>
<el-col class="query-row-content">
<el-radio-group v-model="changKeyItem" @change="subsectionChange(changKeyItem)" size="small">
<el-radio
style="margin-right: 10px;margin-top:5px;cursor: pointer"
border
v-for="item in subsectionList"
:key="item.value"
:label="item.name">
{{ item.name }}
</el-radio>
</el-radio-group>
</el-col>
</el-row>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="中奖榜">
<el-button @click="exportUserStepWining" class="ml10" size="small" type="primary">导出中奖名单</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns">
</el-table-column>
</el-table>
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins:[initTableMixins],
data() {
return {
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
pageForm: {
year: new Date().getFullYear() + '',
mode:'today',
searchName:'u.username',
activityId:null
},
unionOptions: [],
unitOptions: [],
activityOptions: [],
tableColumns: [
{label: '姓名', prop: 'username'},
// {label: '工号', prop: 'loginname'},
{label: '分工会', prop: 'unionName', sortable: true},
{label: '单位', prop: 'unitName'},
{label: '奖项名称', prop: 'awardName'},
],
allDataList:[],
subsectionList:[],
subsectionIndex: 0,
changKeyItem:'',
}
},
methods: {
exportUserStepWining(){
this.$downLoad(loc() + '/exportUserStepWining', {
activityId: this.pageForm.activityId
})
},
async getAllActivity() {
this.pageForm.activityId = ''
this.activityOptions = []
const {data} = await this.$axios.post('/platform/fitnessWalk/activityManage/getAllActivity', this.pageForm)
if (data == null || data.length === 0) {
this.tableData = []
return
} else {
this.activityOptions = data.filter(item => item.activityModel === 'stepCount')
}
if (this.activityOptions) {
this.pageForm.activityId = this.activityOptions[0]._id
}
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitOptions = await this.$businessTool.listUnit(val)
this.doSearch()
},
subsectionChange(key) {
const data = this.allDataList.find(item => item.title === key)
this.tableData = data.awardList
},
async pageData(){
const resp = await this.$axios.post(loc() + '/getUserStepWining',this.pageForm)
if (resp.code === 0){
this.allDataList = resp.data
this.subsectionList = resp.data.map(v => {
return {
name: v.title,
key: v.title
}
})
this.tableData = this.allDataList[0].awardList
this.changKeyItem = this.allDataList[0].title
}
},
async getCascadersActivity() {
const {code, data} = await this.$axios.post(loc() + '/getCascadersActivity', {year: this.pageForm.year})
this.activityOptions = data
if (this.activityOptions && this.activityOptions.length > 0) {
this.pageForm.activityId = this.activityOptions[0].value
this.doSearch()
} else {
this.tableData = []
}
},
},
async created() {
this.unionOptions = await this.$businessTool.listUnion()
this.unitOptions = await this.$businessTool.listUnit()
await this.getCascadersActivity()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,460 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__cell {
text-align: center !important;
}
</style>
<div id="app" v-cloak>
<guava>
<tree-layout style="height: calc(100vh - 70px)">
<template #tree>
<div style="padding: 20px;">
<el-input
placeholder="输入关键字进行查找"
v-model="filterText">
</el-input>
</div>
<el-tree ref="tree" :data="treeData" class="v-tree" node-key="id"
:props="defaultProps"
default-expand-all :expand-on-click-node="false"
@node-click="handleNodeClick" accordion
highlight-current :filter-node-method="filterNode">
<div class="custom-tree-node" slot-scope="{ node, data }">
<div v-if="node.level==1" style="font-size: 16px;" class="v-node"><i
class="el-icon-s-home"></i>&nbsp;
{{ data.unionname }}
</div>
<div v-if="node.level==2"
style="font-size: 15px" :title="data.name" class="v-node">
<i class="el-icon-star-on" v-if="checkData.name==data.name"></i>
<i class="el-icon-star-off" v-else></i>
&nbsp; {{ data.unionname }}
<span style="color: #f76c6c">{{ '' + data.revelCount + ''}}</span>
</div>
</div>
</el-tree>
</template>
<template>
<el-card shadow="never" style="margin: 0 10px">
<div class="btn-group tool-button">
<el-date-picker
placeholder="选择年度" style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
<div class="btn-group tool-button">
<el-input style="width: 250px;" placeholder="请输入类型名称查询" v-model="pageForm.revelName"></el-input>
</div>
<div class="btn-group tool-button">
<el-select clearable v-model="pageForm.typeId" filterable placeholder="请选择资料类型">
<el-option
v-for="item in typeList"
:key="item.id"
:label="item.typeName"
:value="item.id">
</el-option>
</el-select>
</div>
<div class="btn-group tool-button">
<el-button type="primary" @click="doSearch" icon="el-icon-search"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button type="primary" size="medium" @click="openAdd"><i
class="ti-plus"></i> 添加资料
</el-button>
</div>
</el-card>
<el-card shadow="never" style="margin:10px 10px 0 10px">
<table-tool :label="( checkData.unionname ? checkData.unionname : '全部分工会' ) + '资料列表'" :app="this">
<template #func>
<el-button v-if="checkData.id" type="primary" size="small" @click="exportAllFileByUnionId">导出全部资料</el-button>
</template>
</table-tool>
<el-table :data="tableData" @sort-change='pageOrder' height="626">
<el-table-column label="序号" type="index" header-align="center" align="center">
<template scope="scope"><span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span></template>
</el-table-column>
<el-table-column prop="revelName" label="资料名称"></el-table-column>
<el-table-column sortable prop="typeName" label="资料类型"></el-table-column>
<el-table-column sortable prop="username" label="上传人"></el-table-column>
<el-table-column sortable prop="unionName" label="上传人工会"></el-table-column>
<el-table-column sortable prop="belongToUnionName" label="资料归属工会"></el-table-column>
<el-table-column sortable prop="time" label="上传时间"></el-table-column>
<el-table-column prop="userOnline" label="操作" width="100px">
<template slot-scope="scope">
<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 :command="{type:'view',data:scope.row}">
预览资料
</el-dropdown-item>
<el-dropdown-item
v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')"
:command="{type:'edit',data:scope.row}">
编辑
</el-dropdown-item>
<el-dropdown-item
:command="{type:'download',data:scope.row}">
导出附件
</el-dropdown-item>
<el-dropdown-item
v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')"
:command="{type:'delete',data:scope.row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination
@size-change="pageSizeChange"
@current-change="pageNumberChange"
:current-page="pageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</template>
</tree-layout>
</guava>
<el-dialog title="新建资料" :visible.sync="addDialogVisible">
<el-form :model="formData" ref="addForm" :rules="rules" label-width="100px">
<el-form-item label="上传人">
<el-input readonly value="$store.state.user.username"></el-input>
</el-form-item>
<el-form-item label="资料归属工会">
<el-input readonly :value="checkData.id ? checkData.unionname : '$store.state.user.union.name'"></el-input>
</el-form-item>
<el-form-item prop="revelName" label="资料名称">
<el-input placeholder="请填写工作资料名称" v-model="formData.revelName"></el-input>
</el-form-item>
<el-form-item prop="typeId" label="资料类型">
<el-select v-model="formData.typeId" placeholder="选择资料类型" style="width: 100%">
<el-option
v-for="item in typeList"
:key="item.id"
:label="item.typeName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="files" label="附件上传">
<file-upload :value.sync="formData.files" accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-form>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="编辑资料" :visible.sync="editDialogVisible">
<el-form :model="formData" ref="editForm" :rules="rules" label-width="100px">
<el-form-item label="上传人">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
<el-form-item label="资料归属工会">
<el-input readonly v-model="formData.belongToUnionName"></el-input>
</el-form-item>
<el-form-item prop="revelName" label="资料名称">
<el-input placeholder="请填写工作资料名称" v-model="formData.revelName"></el-input>
</el-form-item>
<el-form-item prop="typeId" label="资料类型">
<el-select v-model="formData.typeId" placeholder="选择资料类型" style="width: 100%">
<el-option
v-for="item in typeList"
:key="item.id"
:label="item.typeName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="files" label="附件上传">
<file-upload :value.sync="formData.files" accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="资料阅览" :visible.sync="viewDialogVisible" :modal-append-to-body="false">
<el-descriptions class="margin-top" title="" :column="2" border>
<el-descriptions-item span="2">
<template slot="label">资料名称</template>
<div v-html="formData.revelName"></div>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">上传人</template>
<div v-html="formData.username"></div>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">上传时间</template>
<div v-html="formData.time"></div>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">所属工会</template>
<div v-html="formData.unionName"></div>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">资料类型</template>
<div v-html="formData.typeName"></div>
</el-descriptions-item>
<el-descriptions-item span="2">
<template slot="label">附件</template>
<div>
<file-upload :files.sync="formData.files" view></file-upload>
</div>
</el-descriptions-item>
</el-descriptions>
<span slot="footer" class="dialog-footer">
<el-button @click="viewDialogVisible = false">关 闭</el-button>
</span>
</el-dialog>
</div>
<script>
let vue = new Vue({
el: "#app",
components: {
'tree-layout': httpVueLoader('/components/plugins/TreeLayout.vue'),
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
},
},
data() {
return {
filterText: '',
treeData: [],
defaultProps: {
children: 'child',
label: 'unionname',
},
addDialogVisible: false,
editDialogVisible: false,
viewDialogVisible: false,
tableData: [],
jdhList: [],
typeList: [],
fileList: [],
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
},
formData: {},
rules: {
revelName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
typeId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
delFiles: [],
unionOptions: [],
checkData: {},
checkNode: {},
}
},
methods: {
exportAllFileByUnionId() {
const unionId = this.checkData.id
const unionName = this.checkData.unionname
const url = '/platform/workershome/data/revel/exportAllFileByUnionId?unionId=' + unionId + '&unionName=' + unionName
window.open(url)
},
exportAllFileById(data) {
window.open('/platform/workershome/data/revel/exportAllFileById?id=' + data.id)
},
async handleNodeClick(data, node) {
this.checkData = data
this.checkNode = node
await this.pageData()
},
filterNode(value, data, node) {
if (!value) return true;
return data.unionname.indexOf(value) !== -1
},
openView(row) {
const formData = clone(row)
formData.files = JSON.parse(formData.files || "[]")
this.formData = formData
this.viewDialogVisible = true
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'edit') {
this.openEdit(data)
} else if (type === 'delete') {
this.doDelete(data.id)
} else if (type === 'download') {
this.exportAllFileById(data)
}
},
doDelete(id) {
this.$confirm('确定要删除吗', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(async () => {
const resp = await this.$axios.get(loc() + '/doDelete', {id: id})
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg)
} else {
this.$message.warning('操作失败')
}
})
},
doEdit() {
this.$refs.editForm.validate(async (valid) => {
if (valid) {
const formData = clone(this.formData)
formData.files = JSON.stringify(formData.files)
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
});
const resp = await this.$axios.post('/platform/workershome/data/revel/doEdit', formData)
loading.close()
if (resp.code === 0) {
this.editDialogVisible = false
this.doSearch()
this.$message.success(resp.msg)
} else {
this.$message.warning('操作失败')
}
}
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.loadTree()
},
pageOrder(column) {
this.pageForm.pageOrderName = column.prop
this.pageForm.pageOrderBy = column.order
this.pageData()
},
pageNumberChange(val) {
this.pageForm.pageNumber = val;
this.pageData()
},
pageSizeChange(val) {
this.pageForm.pageSize = val;
this.pageData()
},
async pageData() {
this.pageForm.unionId = this.checkData.id
const resp = await this.$axios.post('/platform/workershome/data/revel/pageData', this.pageForm)
if (resp.code === 0) {
this.tableData = resp.data.list
this.pageForm.totalCount = resp.data.totalCount
}
},
openEdit(obj) {
if (this.$refs["editForm"])
this.$refs["editForm"].resetFields()
const formData = clone(obj)
formData.files = JSON.parse(formData.files || "[]")
formData.ispass = formData.ispass === 1
this.formData = formData
this.editDialogVisible = true
},
openAdd() {
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields()
this.formData = {files: []}
this.addDialogVisible = true
},
doAdd() {
this.$refs.addForm.validate(async (valid) => {
if (valid) {
const formData = clone(this.formData)
formData.files = JSON.stringify(formData.files)
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
if (this.checkData.id) {
this.formData.belongToUnionId = this.checkData.id
}
const resp = await this.$axios.post('/platform/workershome/data/revel/doAdd', formData)
loading.close()
if (resp.code === 0) {
this.addDialogVisible = false
this.doSearch()
this.$message.success(resp.msg)
} else {
this.$message.warning('操作失败')
}
}
})
},
async loadTree() {
const res = await this.$axios.post('/platform/workershome/data/revel/getTreeData', this.pageForm)
if (res.code === 0) {
this.treeData = res.data
const isAdmin = this.$auth.hasRoleOr("SYSADMIN, SCHOOL_UNION_ADMIN")
if (isAdmin) {
const data = res.data[0].children && res.data[0].children.length > 0 ? {id: res.data[0].children[0].id} : {id: ''}
await this.handleNodeClick({data}, {level: 2})
} else {
const data = res.data[0].children && res.data[0].children.length > 0 ? {id: res.data[0].children[0].id} : {id: ''}
await this.handleNodeClick(data, {level: 2})
}
}
},
async getAllWakesHomeDataType() {
const resp = await this.$axios.post('/platform/workershome/data/type/getAllWakesHomeDataType')
if (resp.code === 0) {
this.typeList = resp.data
}
},
},
async created() {
await this.getAllWakesHomeDataType()
await this.loadTree()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,207 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="类型名称">
<el-input v-model="pageForm.typeName" placeholder="请输入类型名称" clearable></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="类型列表">
<el-button type="primary" size="small" @click="openAdd"><i class="ti-plus"></i> 新增工作资料类型</el-button>
</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">
<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" label="资料类型编码" prop="code"></el-table-column>
<el-table-column align="center" header-align="center" label="资料类型名称" prop="typeName"></el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="150px">
<template scope="scope">
<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 :command="{type:'top',data:scope.row}"
v-if="scope.row.serialNum!==1">
上移
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',data:scope.row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:scope.row}">
删除
</el-dropdown-item>
<el-dropdown-item :command="{type:'bottom',data:scope.row}"
v-if="scope.row.serialNum!==pageForm.totalCount">
下移
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<el-dialog title="新增工作资料类型" :visible.sync="addDialogVisible" width="40%">
<el-form :model="formData" ref="addForm" :rules="rules">
<el-form-item prop="code" label="类型编码">
<el-input v-model="formData.code" placeholder="请输入工作资料类型编码"></el-input>
</el-form-item>
<el-form-item prop="typeName" label="类型名称">
<el-input v-model="formData.typeName" placeholder="请输入工作资料类型名称"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAdd">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="编辑工作资料类型" :visible.sync="editDialogVisible" width="40%">
<el-form :model="formData" ref="editForm" :rules="rules">
<el-form-item prop="code" label="类型编码">
<el-input v-model="formData.code" placeholder="请输入工作资料类型编码"></el-input>
</el-form-item>
<el-form-item prop="typeName" label="类型名称">
<el-input v-model="formData.typeName" placeholder="请输入工作资料类型名称"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data: {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
typeName: ''
},
addDialogVisible: false,
editDialogVisible: false,
formData: {},
rules: {
typeName: [{required: true, message: '请输入工作资料类型名称', trigger: ['change', 'blur']}],
code: [{required: true, message: '请输入工作资料类型编码', trigger: ['change', 'blur']}]
},
tableData: []
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'top') {
this.rowChange(data, false)
} else if (type === 'edit') {
this.openEdit(data)
} else if (type === 'delete') {
this.doDelete(data.id)
} else if (type === 'bottom') {
this.rowChange(data, true)
}
},
async rowChange(row, toDown) {
const resp = await this.$axios.post('/platform/workershome/data/type/serialNumChange', {
id: row.id,
serialNum: row.serialNum,
toDown
})
if (resp.code === 0) {
this.doSearch()
}
},
openAdd() {
this.formData = {}
this.addDialogVisible = true
if (this.$refs["addForm"])
this.$refs["addForm"].resetFields()
},
doAdd() {
this.$refs['addForm'].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 this.$axios.post('/platform/workershome/data/type/doAdd', this.formData)
loading.close()
if (resp.code === 0) {
this.addDialogVisible = false
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
}
})
},
openEdit(obj) {
this.formData = JSON.parse(JSON.stringify(obj))
this.editDialogVisible = true
},
doEdit() {
this.$refs['editForm'].validate(async valid => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await this.$axios.post('/platform/workershome/data/type/doEdit', this.formData)
loading.close()
if (resp.code === 0) {
this.editDialogVisible = false
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
}
})
},
doDelete(id) {
this.$confirm('此操作将删除工作资料类型,确认删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await this.$axios.post('/platform/workershome/data/type/doDelete', {id: id})
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
})
}
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,222 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-form .el-select, .el-form .el-date-editor {
width: 100%;
}
.el-divider {
background-color: #1867b0;
}
.el-divider__text {
color: #1867b0;
}
.w-e-text-container {
height: 250px !important;
}
</style>
<div id="app" v-clock>
<guava ref="guava">
<template>
<el-card shadow="never">
<template #header>
<el-row justify="space-between" type="flex">
<h3 style="color: rgb(24, 103, 176);">
{{id?'信息编辑':'信息填写'}}
</h3>
</el-row>
</template>
<el-form :model="formData" :rules="formRules" label-width="150px" ref="form">
<div class="process-title">教工小家申报信息</div>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="填报人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="填报人工号" prop="loginName">
<el-input readonly v-model="formData.loginName"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系方式" prop="mobile">
<el-input maxlength="11" v-model="formData.mobile"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="填报单位" prop="unionName">
<el-input readonly v-model="formData.unionName"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="创办时间" prop="foundTime">
<el-date-picker
v-model="formData.foundTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择创办日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="填报时间" prop="applyTime">
<el-input readonly v-model="formData.applyDate"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位位置" prop="position">
<el-input placeholder="请填写单位位置" v-model="formData.position"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位面积" prop="area">
<el-input placeholder="请填写单位面积" v-model="formData.area"></el-input>
</el-form-item>
</el-col>
<el-col :lg="24" :sm="24">
<el-form-item label="单位信息" prop="details">
<el-input type="textarea" :rows="4"
placeholder="请填写单位信息"
v-model="formData.details"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item class="is-required" label="基层工会简况"
prop="basicInformation">
<text-editor v-model="formData.basicInformation"></text-editor>
<div style="text-align: right">
<span style="color: #0a84ff">当前字数:{{ formData.basicInformation ? (dd3s.html2txt(formData.basicInformation).length) : 0 }}</span>
<span>{{ ';最多500字' }}</span>
</div>
<!-- <el-input type="textarea" v-model="formData.basicInformation" maxlength="500" show-word-limit :rows="10"></el-input>-->
</el-form-item>
</el-col>
</el-row>
<el-form-item label="教工小家建设方案" prop="constructionPlan">
<text-editor v-model="formData.constructionPlan"></text-editor>
</el-form-item>
</el-form>
<el-row class="mt10" justify="center" type="flex">
<el-button @click="doSave()" style="width: 200px" type="primary">保 存</el-button>
<el-button @click="doSubmit()" style="width: 200px" type="primary">提 交
</el-button>
</el-row>
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
const validBasicInformation = (rule, value, callback) => {
if (!this.formData.basicInformation || !dd3s.html2txt(this.formData.basicInformation)) {
callback(new Error('请填写基层工会简况'));
} else if (dd3s.html2txt(this.formData.basicInformation).length > 500) {
console.log(11)
callback(new Error('基层工会简况最多500字'));
} else {
callback();
}
};
return {
id: '',
formData: {},
formRules: {
mobile: [{required: true, message: '手机号不能为空', trigger: 'blur'},
{pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur'}],
basicInformation: [{
required: true,
message: '必填',
trigger: ['blur', 'change']
}],
constructionPlan: [{
required: true,
message: '必填',
trigger: ['blur', 'change']
}],
basicInformation: [{
validator: validBasicInformation,
trigger: ['blur', 'change']
}],
},
}
},
methods: {
async doSave() {
const resp = await this.$axios.post('/platform/workershome/declaration/apply/doSave', this.formData)
if (resp.code === 0) {
this.$message.success('保存成功')
setTimeout(() => {
sublime.jumpPagePjax('/platform/workershome/declaration/mine')
}, 500)
} else {
this.$message.warning('操作失败')
}
},
async doSubmit() {
try {
const valid = await this.$refs.form.validate()
if (valid) {
const resp = await this.$axios.post('/platform/workershome/declaration/apply/doSubmit', this.formData)
if (resp.code === 0) {
this.$message.success('提交成功')
setTimeout(() => {
sublime.jumpPagePjax('/platform/workershome/declaration/mine')
}, 500)
} else {
this.$message.warning('操作失败')
}
}
} catch (e) {
// this.$message.warning('请查看是否按要求填写')
}
},
async initFormData() {
if (!this.id) {
const user = this.$store.state.user
this.$set(this.formData, 'username', user.username)
this.$set(this.formData, 'loginName', user.loginname)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'applyDate', moment().format('YYYY-MM-DD'))
this.$set(this.formData, 'unionName', user.union.name)
} else {
const resp = await this.$axios.get('/platform/workershome/declaration/apply/getInfoById', {id: this.id})
if (resp.code === 0) {
this.formData = resp.data
}
}
},
},
async created() {
this.id = GetQueryString("id")
this.initFormData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,66 @@
const INFO = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeName" tab-position="top">
<el-tab-pane label="基本信息" name="1">
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="填报人">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="工号">{{ viewData.loginName }}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="填报单位">{{ viewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="填报时间" :span="2">{{ viewData.applyTime }}</el-descriptions-item>
<el-descriptions-item label="基本情况简介" :span="3">
<div v-if="viewData.basicInformation" class="text-left" v-html="viewData.basicInformation"></div>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
<el-descriptions-item label="建设方案" :span="3">
<div v-if="viewData.constructionPlan" class="text-left" v-html="viewData.constructionPlan"></div>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
<el-descriptions-item label="党组织盖章文档" :span="3">
<file-upload v-if="viewInfo.files && viewInfo.files.length > 0" :files.sync="viewInfo.files" view></file-upload>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="基层党组织审核信息" v-if="organizationAudit" name="2">
<el-descriptions :column="2" border class="descriptions-form">
</el-descriptions>
</el-tab-pane>
</el-tabs>
</div>
`,
props: {
activeName: {
type: String,
default: '1'
}
},
data() {
return {
activeName: '1',
viewData: {},
organizationAudit: {},
schoolAudit: {},
}
},
methods: {
async openView(id) {
const resp = await $.get('/platform/workershome/declaration/apply/getInfoById', {id: id})
if (resp.code === 0) {
this.viewData = resp.data
this.organizationAudit = resp.data.organizationAudit
this.schoolAudit = resp.data.schoolAudit
} else {
this.viewData = {}
this.organizationAudit = {}
this.schoolAudit = {}
}
}
}
}
@@ -0,0 +1,175 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
formData="yyyy"
placeholder="请选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select @change="doSearch" clearable="true"
filterable="true"
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="申报列表"></table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
class="vi-table"
ref="table"
row-key="id" style="width: 100%" v-loading="tableLoading">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop === 'applyDate'">
<span>{{ moment(row.applyDate).format('YYYY年MM月DD日') }}</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="280px">
<template scope="{row}">
<el-button @click="openView(row)"
size="mini"
type="primary"
v-if="!['10000'].includes(row.state) && row.state">查看
</el-button>
<el-button @click="openExport(row.id)"
size="mini"
type="primary"
v-if="row.state">申报表导出
</el-button>
<el-button @click="openEdit(row)"
size="mini"
type="primary"
v-if="['10000','10015','10025'].includes(row.state) || !row.state">
编辑
</el-button>
<el-button @click="doDelete(row)"
size="mini"
type="danger"
v-if="['10000'].includes(row.state) || !row.state">删除
</el-button>
<el-button @click="doDelete(row)"
size="mini"
type="danger"
v-if="!['10000'].includes(row.state) && row.state && $auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<wakes-info-apply ref="viewInfo"></wakes-info-apply>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unions: [],
pageForm: {
isAudit: false,
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'unionName', label: '申报工会', sortable: true},
{prop: 'username', label: '申报人', sortable: true},
{prop: 'loginName', label: '申报人工号', sortable: true},
{prop: 'mobile', label: '联系方式', sortable: true},
// {prop: 'basicInformation', label: '基本情况简介', sortable: true},
{prop: 'applyDate', label: '申报日期', sortable: true},
{prop: 'stateName', label: '审核状态', sortable: true},
],
}
},
components: {
'wakes-info-apply': httpVueLoader('/components/workershome/declaration/WakesHomeInfoApply.vue')
},
methods: {
openExport(id) {
this.$downLoad(loc() + "/openExport", {id: id})
},
openView(row) {
this.$refs.guava.view()
this.$refs.viewInfo.openView(row.id)
},
async doDelete(row) {
this.$confirm('确定删除该申报记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await this.$axios.get(loc() + '/doDelete', {id: row.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.pageData();
} else {
this.$message.warning(resp.msg)
}
})
},
openEdit(row) {
window.location.href = '/platform/workershome/declaration/apply?id=' + row.id;
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
},
async created() {
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,230 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-clock>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
formData="yyyy"
placeholder="请选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select @change="doSearch" clearable="true"
filterable="true"
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表">
<el-radio-group @change="doSearch" class="mr10" size="small" v-model="pageForm.isAudit">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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">
<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 scope="{row}" v-if="column.prop === 'applyDate'">
<span>{{ moment(row.applyDate).format('YYYY年MM月DD日') }}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openAudit(row)" v-if="['10010'].includes(row.state) || !row.state"
size="mini" type="primary">审核
</el-button>
<el-button @click="doRollBack(row.id)"
v-if="['10015','10020'].includes(row.state) || !row.state" size="mini" type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<wakes-info-apply ref="viewInfo"></wakes-info-apply>
</template>
<template #edit>
<wakes-info-apply ref="auditInfo">
<template #handle>
<el-tab-pane label="基层党组织审核" name="organizationAudit">
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input value="${@shiro.getPrincipalProperty('username')}"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.auditTime" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="auditOpinion" label="审核意见">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<el-form-item prop="auditSign" label="审核签字">
<sign :qz.sync="formData.auditSign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="danger" @click="doReview(false)">拒绝</el-button>
<el-button type="primary" @click="doReview(true)">通过</el-button>
</div>
</el-tab-pane>
</template>
</wakes-info-apply>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data: {
id:'',
unions:[],
pageForm:{
isAudit:false,
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'unionName', label: '申报工会', sortable: true},
{prop: 'username', label: '申报人', sortable: true},
{prop: 'loginName', label: '申报人工号', sortable: true},
{prop: 'mobile', label: '联系方式', sortable: true},
// {prop: 'basicInformation', label: '基本情况简介', sortable: true},
{prop: 'applyDate', label: '申报日期', sortable: true},
{prop: 'stateName', label: '审核状态', sortable: true},
],
formRules: {
auditSign: [{required: true, message: '必填', trigger: ['blur', 'change']}],
auditOpinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
},
components: {
'wakes-info-apply': httpVueLoader('/components/workershome/declaration/WakesHomeInfoApply.vue')
},
methods: {
doReview(row){
this.$refs['form'].validate(valid => {
if (valid) {
this.$confirm('您确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.auditPass = row
const {code, msg} = await this.$axios.post(loc() + '/doAudit', {
audit: JSON.stringify(this.formData),
id: this.id,
isPass: row,
})
if (code === 0) {
this.pageData()
this.$message.success(msg)
this.$refs.guava.index()
} else {
this.$message.warning(msg)
}
})
}
})
},
openView(row){
this.$refs.guava.view()
this.$refs.viewInfo.openView(row.id)
},
openAudit(row){
this.formData={}
this.id = row.id
this.$set(this.formData, 'auditTime', moment().format('YYYY-MM-DD'))
this.$refs.guava.edit()
this.$refs.auditInfo.activeName = 'organizationAudit'
this.$refs.auditInfo.openView(row.id)
},
async doRollBack(id){
const confirm = await this.$confirm('确定要撤回该记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ("confirm" === confirm) {
const resp = await this.$axios.get(loc() + '/doRollBack',{id:id})
if (resp.code === 0){
this.pageData();
this.$message.success(resp.msg)
}else {
this.$message.warning(resp.msg)
}
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
},
async created(){
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,286 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-clock>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
formData="yyyy"
placeholder="请选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select @change="doSearch" clearable="true"
filterable="true"
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="审核列表">
<el-radio-group @change="doSearch" class="mr10" size="small"
v-model="pageForm.isAudit">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
class="vi-table"
ref="table"
row-key="id" style="width: 100%" v-loading="tableLoading">
<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"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop === 'applyDate'">
<span>{{ moment(row.applyDate).format('YYYY年MM月DD日') }}</span>
</template>
<template scope="{row}" v-else-if="column.prop === 'files'">
<span>{{ row.files?"已上传":"未上传" }}</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="300">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看
</el-button>
<el-button @click="openAudit(row)"
size="mini"
type="primary"
v-if="['10020'].includes(row.state) || !row.state">审核
</el-button>
<el-button @click="doRollBack(row.id)"
size="mini"
type="danger"
v-if="['10025','10030'].includes(row.state) || !row.state">
撤回
</el-button>
<el-button @click="openFile(row)" size="mini" type="primary">上传党组织盖章文档</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<wakes-info-apply ref="viewInfo"></wakes-info-apply>
</template>
<template #edit>
<wakes-info-apply ref="auditInfo">
<template #handle>
<el-tab-pane label="校工会审核" name="schoolAudit">
<el-form :model="formData" :rules="formRules" label-position="right"
label-width="120px"
ref="form"
style="padding: 20px 0">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员" prop="username">
<el-input disabled
value="${@shiro.getPrincipalProperty('username')}"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="time">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
<el-form-item label="审核签字" prop="auditSign">
<sign :qz.sync="formData.auditSign"></sign>
</el-form-item>
</el-form>
<div style="float: right;margin: 20px 0">
<el-button @click="doReview(false)" type="danger">拒绝</el-button>
<el-button @click="doReview(true)" type="primary">通过</el-button>
</div>
</el-tab-pane>
</template>
</wakes-info-apply>
</template>
</guava>
<el-dialog
:visible.sync="filesDialogVisible"
title="上传党组织盖章文档"
width="30%">
<file-upload :value.sync="formData.files" accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
<span class="dialog-footer" slot="footer">
<el-button @click="filesDialogVisible = false">关 闭</el-button>
<el-button @click="doFiles" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data: {
id: '',
unions: [],
pageForm: {
isAudit: false,
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'unionName', label: '申报工会', sortable: true},
{prop: 'username', label: '申报人', sortable: true, width: "100px"},
{prop: 'loginName', label: '申报人工号', sortable: true, width: "150px"},
{prop: 'mobile', label: '联系方式', sortable: true, width: "150px"},
// {prop: 'basicInformation', label: '基本情况简介', sortable: true},
{prop: 'applyDate', label: '申报日期', sortable: true},
{prop: 'files', label: '是否上传党组织盖章文档', sortable: true},
{prop: 'stateName', label: '审核状态', sortable: true},
],
formRules: {
auditSign: [{required: true, message: '必填', trigger: ['blur', 'change']}],
auditOpinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
filesDialogVisible: false,
},
components: {
'wakes-info-apply': httpVueLoader('/components/workershome/declaration/WakesHomeInfoApply.vue')
},
methods: {
async doFiles() {
if (this.formData.files && this.formData.files.length === 0) {
this.notifyWarning("请上传党组织盖章文档")
return
}
const {code, msg} = await this.$axios.post(loc() + '/doFiles', {
id: this.formData.id,
files: JSON.stringify(this.formData.files),
})
if (code === 0) {
this.pageData()
this.notifySuccess(msg)
this.filesDialogVisible = false
} else {
this.notifyWarning(msg)
}
},
openFile(row) {
const formData = clone(row)
this.formData.id = formData.id
this.formData.files = formData.files ? JSON.parse(formData.files) : []
this.filesDialogVisible = true
},
doReview(row) {
this.$refs['form'].validate(valid => {
if (valid) {
this.$confirm('您确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.auditPass = row
const {code, msg} = await this.$axios.post(loc() + '/doAudit', {
audit: JSON.stringify(this.formData),
id: this.id
})
if (code === 0) {
this.pageData()
this.$message.success(msg)
this.$refs.guava.index()
} else {
this.$message.warning(msg)
}
})
}
})
},
openView(row) {
this.$refs.guava.view()
this.$refs.viewInfo.openView(row.id)
},
openAudit(row) {
this.formData = {}
this.id = row.id
this.$set(this.formData, 'auditTime', moment().format('YYYY-MM-DD'))
this.$refs.guava.edit()
this.$refs.auditInfo.activeName = 'schoolAudit'
this.$refs.auditInfo.openView(row.id)
},
async doRollBack(id) {
const confirm = await this.$confirm('确定要撤回该记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ("confirm" === confirm) {
const resp = await this.$axios.get(loc() + '/doRollBack', {id: id})
if (resp.code === 0) {
this.pageData();
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
},
async created() {
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,177 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-clock>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
formData="yyyy"
placeholder="请选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select @change="doSearch" clearable="true"
filterable="true"
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申报列表"></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">
<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"
:width="column.width"
:sortable="column.sortable"
>
<template scope="{row}" v-if="column.prop === 'applyDate'">
<span>{{ moment(row.applyDate).format('YYYY年MM月DD日') }}</span>
</template>
<template scope="{row}" v-else-if="column.prop === 'files'">
<span>{{ row.files?"已上传":"未上传" }}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="350">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openExport(row.id)" size="mini" type="primary">导出申报表</el-button>
<el-button @click="openFile(row)" size="mini" type="primary">上传党组织盖章文档
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<wakes-info-apply ref="viewInfo"></wakes-info-apply>
</template>
</guava>
<el-dialog
:visible.sync="filesDialogVisible"
title="上传党组织盖章文档"
width="30%">
<file-upload :value.sync="formData.files" accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
<span class="dialog-footer" slot="footer">
<el-button @click="filesDialogVisible = false">关 闭</el-button>
<el-button @click="doFiles" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data: {
id:'',
unions:[],
pageForm:{
isAudit:false,
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'unionName', label: '申报工会', sortable: true,width: "150px"},
{prop: 'username', label: '申报人', sortable: true, width: "100px"},
{prop: 'loginName', label: '申报人工号', sortable: true, width: "150px"},
{prop: 'mobile', label: '联系方式', sortable: true, width: "150px"},
// {prop: 'basicInformation', label: '基本情况简介', sortable: true},
{prop: 'applyDate', label: '申报日期', sortable: true},
{prop: 'files', label: '是否上传党组织盖章文档', sortable: true},
{prop: 'stateName', label: '审核状态', sortable: true},
],
formRules: {
auditSign: [{required: true, message: '必填', trigger: ['blur', 'change']}],
auditOpinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
filesDialogVisible: false,
},
components: {
'wakes-info-apply': httpVueLoader('/components/workershome/declaration/WakesHomeInfoApply.vue')
},
methods: {
async doFiles() {
if (this.formData.files && this.formData.files.length === 0) {
this.notifyWarning("请上传党组织盖章文档")
return
}
const {code, msg} = await this.$axios.post('/platform/workershome/declaration/school/doFiles', {
id: this.formData.id,
files: JSON.stringify(this.formData.files),
})
if (code === 0) {
this.pageData()
this.notifySuccess(msg)
this.filesDialogVisible=false
} else {
this.notifyWarning(msg)
}
},
openFile(row) {
const formData = clone(row)
this.formData.id = formData.id
this.formData.files = formData.files ? JSON.parse(formData.files) : []
this.filesDialogVisible = true
},
openExport(id) {
window.open("/platform/workershome/declaration/mine/openExport?id=" + id)
},
openView(row){
this.$refs.guava.view()
this.$refs.viewInfo.openView(row.id)
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
},
async created(){
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,347 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-form .el-select, .el-form .el-date-editor {
width: 100%;
}
.el-divider {
background-color: #1867b0;
}
.el-divider__text {
color: #1867b0;
}
.w-e-text-container {
height: 250px !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<template #header>
<el-row justify="space-between" type="flex">
<h3 style="color: rgb(24, 103, 176);">
{{id?'信息编辑':'信息填写'}}
</h3>
</el-row>
</template>
<el-form :model="formData" :rules="formRules" label-width="100px" ref="AddForm">
<div class="process-title">教工小家申请信息</div>
<el-row :gutter="20">
<el-col :lg="8" :sm="24">
<el-form-item label="填报人" prop="username">
<el-input readonly v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :lg="8" :sm="24">
<el-form-item label="联系方式" prop="mobile">
<el-input v-model="formData.mobile" placeholder="请填写联系方式" maxlength="18"></el-input>
</el-form-item>
</el-col>
<el-col :lg="8" :sm="24">
<el-form-item label="填报时间" prop="applyTime">
<el-input readonly v-model="formData.applyTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="8" :sm="24">
<el-form-item label="填报类别" prop="category">
<el-radio-group v-model="formData.category" size="small" @change="doChangeCategory">
<el-radio label="校工会" border></el-radio>
<el-radio label="分工会" border></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="8" :sm="24">
<el-form-item label="填报单位" prop="unionName">
<el-input readonly v-model="formData.unionName"></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="process-title">教工小家详细信息</div>
<el-row :gutter="20">
<el-col :lg="8" :sm="24">
<el-form-item label="创办时间" prop="foundTime">
<el-date-picker
v-model="formData.foundTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择创办日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="8" :sm="24">
<el-form-item label="单位位置" prop="position">
<el-input placeholder="请填写单位位置" v-model="formData.position"></el-input>
</el-form-item>
</el-col>
<el-col :lg="8" :sm="24">
<el-form-item label="单位面积" prop="area">
<el-input placeholder="请填写单位面积" v-model="formData.area"></el-input>
</el-form-item>
</el-col>
<el-col :lg="24" :sm="24">
<el-form-item label="单位信息" prop="details">
<el-input type="textarea" :rows="4"
placeholder="请填写单位信息"
v-model="formData.details"></el-input>
</el-form-item>
</el-col>
</el-row>
<div class="process-title">教工小家荣誉信息</div>
<el-row :gutter="20">
<el-col :lg="24" :sm="24">
<el-form-item class="is-required" label="获奖情况" prop="payStandard">
<el-button
@click="formData.awardInfo.push({awardTime:'',awardUnit:'',awardName:'',awardPic:''})"
icon="el-icon-plus" size="mini"
style="float: right;margin-bottom: 10px">
添加
</el-button>
<span style="color: red">说明:各奖项图片只能上传一张。</span>
<el-table
:data="formData.awardInfo"
border
v-fit-columns
size="mini"
style="width: 100%">
<el-table-column label="获奖日期" prop="awardTime">
<template scope="{row,$index}">
<el-form-item :prop="'awardInfo.'+$index+'.awardTime'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-date-picker
v-model="row.awardTime"
type="datetime"
value-format="yyyy-MM-dd"
placeholder="请选择获奖日期">
</el-date-picker>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="获奖单位" prop="awardUnit">
<template scope="{row,$index}">
<el-form-item :prop="'awardInfo.'+$index+'.awardUnit'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-input clearable maxlength="100" placeholder="请输入获奖单位"
v-model="row.awardUnit"></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="奖项名称" prop="awardName">
<template slot-scope="{row,$index}">
<el-input clearable maxlength="100" placeholder="请输入奖项名称"
v-model="row.awardName"></el-input>
</template>
</el-table-column>
<el-table-column label="奖项照片" prop="awardPic">
<template scope="{row,$index}">
<file-upload :value.sync="formData.awardPic" accept=".jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="1" upload_result_category="array"
complete_result></file-upload>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="80">
<template slot-scope="scope">
<el-button :disabled="formData.awardInfo.length<=1"
@click="formData.awardInfo.splice(scope.$index,1)" circle
icon="el-icon-delete"
size="mini"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
<div class="process-title">教工小家材料上传</div>
<el-row gutter="20">
<el-col :lg="24" :sm="24">
<el-form-item required label="图片上传" prop="picFiles">
<file-upload :value.sync="formData.picFiles" accept=".jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-col>
<el-col :lg="24" :sm="24">
<el-form-item required label="附件上传" prop="files">
<file-upload :value.sync="formData.files" accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row class="mt10" v-if="disabled" justify="center" type="flex">
<el-button @click="doSave()" style="width: 300px" type="primary">保 存
</el-button>
<el-button @click="doSubmit()" style="width: 300px" type="primary">提 交
</el-button>
</el-row>
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
id: '',
formRules: {
position: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
picFiles: [{required: true, message: '必填', trigger: ['blur', 'change']}],
files: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
formData: {
category: '分工会',
awardInfo: [{awardTime: '', awardUnit: '', awardName: '', awardPic: ''}]
},
disabled: false,
}
},
methods: {
async doSave() {
let postUrl = ''
if (this.formData.id) {
postUrl = loc() + '/doEdit'
} else {
postUrl = loc() + '/doAdd'
}
const formData = this.doJsonStr(this.formData)
formData.isSubmit = false;
const resp = await this.$axios.post(postUrl, formData)
if (resp.code === 0) {
this.notifySuccess(resp.msg)
setTimeout(() => {
location.href = '/platform/workershome/info/mine'
}, 500)
} else {
this.notifyWarning(resp.msg)
}
},
async doSubmit() {
try {
const valid = await this.$refs['AddForm'].validate()
if (valid) {
let postUrl = ''
if (this.formData.id) {
postUrl = loc() + '/doEdit'
} else {
postUrl = loc() + '/doAdd'
}
const formData = this.doJsonStr(this.formData)
formData.isSubmit = true
const resp = await this.$axios.post(postUrl, formData)
if (resp.code === 0) {
this.notifySuccess(resp.msg)
setTimeout(() => {
location.href = '/platform/workershome/info/mine'
}, 500)
} else {
this.notifyWarning(resp.msg)
}
}
} catch (e) {
console.log(e)
}
},
doChangeCategory() {
if (this.formData.category === '校工会') {
this.formData.unionName = '校工会'
this.formData.unionId = null
} else {
this.formData.unionName = this.$store.state.union.name
this.formData.unionId = this.$store.state.union.id
}
},
async initFormData() {
if (!this.id) {
const user = this.$store.state.user
this.$set(this.formData, 'username', user.username)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'applyTime', moment().format('YYYY-MM-DD'))
this.$set(this.formData, 'unionName', user.union.name)
} else {
const resp = await this.$axios.get('/platform/workershome/info/mine/getInfoById', {id: this.id})
if (resp.code === 0) {
this.formData = {...resp.data}
}
}
},
doJsonStr(data) {
const formData = clone(data)
formData.awardInfo = JSON.stringify(this.formData.awardInfo)
formData.picFiles = JSON.stringify(this.formData.picFiles)
formData.files = JSON.stringify(this.formData.files)
return formData;
},
async validateApply() {
const resp = await this.$axios.get(loc() + '/validateApply')
if (resp.code === 0) {
this.disabled = true
await this.getWakesHomeUnitInfo()
} else {
this.disabled = false
this.$confirm('未获取到单位的建家申报记录,是否前往申报?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
setTimeout(() => {
location.href = '/platform/workershome/declaration/apply'
}, 500)
})
}
},
async getWakesHomeUnitInfo() {
const resp = await this.$axios.get('/platform/workershome/declaration/apply/getWakesHomeUnitInfo')
if (resp.code === 0 && resp.data) {
this.$set(this.formData, 'foundTime', resp.data.foundTime)
this.$set(this.formData, 'position', resp.data.position)
this.$set(this.formData, 'area', resp.data.area)
this.$set(this.formData, 'details', resp.data.details)
}
}
},
async created() {
this.id = GetQueryString("id")
this.initFormData()
await this.validateApply()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,223 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-row {
display: flex;
flex-wrap: wrap;
align-items: center;
}
.el-row .el-card {
min-width: 100%;
height: 100%;
margin-right: 20px;
transition: all .5s;
}
.el-form-item {
margin-bottom: 0 !important;
}
.pagination-container {
margin-top: -3px;
margin-bottom: 30px;
}
.box-card {
.header {
min-height: 20px;
position: relative;
.label {
padding: 1px 6px;
background-color: #fdf0da;
font-size: 15px;
color: #f19901;
}
.header-label {
padding: 1px 6px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 200px;
}
.card-header-tag-blue {
position: absolute;
width: 68px;
height: 30px;
top: -14px;
right: -15px;
/*background-image: url("~@/assets/images/img_dpj_t.png");*/
display: inline-block;
}
.card-header-tag-green {
position: absolute;
width: 68px;
height: 30px;
top: -14px;
right: -15px;
/*background-image: url("~@/assets/images/img_ypj_t.png");*/
display: inline-block;
}
}
.footer {
font-size: 18px !important;
background-color: rgb(245, 247, 251);
display: flex;
height: 50px;
justify-content: space-evenly;
}
.card-label {
color: rgb(197, 197, 197);
margin-right: 8px;
width: 70px;
display: inline-block;
margin-bottom: 5px;
}
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
formData="yyyy"
placeholder="请选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select @change="doSearch" clearable="true"
filterable="true"
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="展示列表">
<!--<el-button type="primary" size="small">添加信息</el-button>-->
</table-tool>
<el-row :gutter="20" style="margin-right: 15px;margin-left: -5px" type="flex" v-loading="loading">
<el-col v-for="(item, index) in tableData" :key="index" :span="6" style="margin-top: 10px">
<el-card class="box-card" shadow="always" :body-style="{ padding: '0px' }">
<div slot="header" class="header" style="display: flex">
<span class="label">{{item.unionName}}</span>
<div style="display:flex; align-items: center;color: #cccccc;margin-left: 20px">|</div>
<el-tooltip class="item" effect="dark" :content="item.position" placement="top-start">
<el-button type="text" class="header-label">查看位置</el-button>
</el-tooltip>
<!--<span class="header-label"></span>-->
</div>
<div style="margin: 15px">
<div>
<el-carousel height="150px">
<el-carousel-item v-for="o in item.picFiles" :key="item">
<el-image @click="PREVIEW_IMAGE(o.filepath)"
:src="CREATE_PREVIEW_URL(o.filepath)"
style="width: 100%;height: 100%"></el-image>
</el-carousel-item>
</el-carousel>
</div>
</div>
<div class="footer">
<div style="display: flex;align-items: center">
<span style="color: #18c8bd;font-size: 14px">面积:{{item.area}}(㎡)</span>
<div style="display:flex; align-items: center;color: #cccccc;margin: 0 10px">|</div>
<span style="color: #18c8bd;font-size: 14px">申报日期:{{item.applyTime}}</span>
</div>
<div style="display:flex; align-items: center;color: #cccccc">|</div>
<div style="display: flex;align-items: center">
<el-button type="text"
:style="item.status === '2' ? 'color: #18c8bd' : 'color: rgb(34, 125, 251)'"
style="color: #18c8bd"></el-button>
<el-button type="text" style="color: #18c8bd;" @click="openView(item.id)">查看
</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
</el-card>
</template>
<template #view>
<wakes-info ref="viewInfo"></wakes-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
loading: false,
unions: [],
tableData: [],
pageForm: {
year: moment().format('YYYY'),
}
}
},
methods: {
openView(row) {
this.$refs.guava.view()
this.$refs.viewInfo.openView(row)
},
async pageData() {
const resp = await this.$axios.post(loc() + '/pageData', this.pageForm)
if (resp.code === 0) {
this.tableData = resp.data
this.tableData.forEach(item => {
item.picFiles = JSON.parse(item.picFiles)
})
}
},
flushUnits() {
},
},
components: {
'wakes-info': httpVueLoader('/components/workershome/info/WakesHomeInfo.vue')
},
async created() {
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.unions.unshift({id: '校工会', unionname: '校工会'})
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,162 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
formData="yyyy"
placeholder="请选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select @change="doSearch" clearable="true"
filterable="true"
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="申报列表">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" class="vi-table"
ref="table"
row-key="id" style="width: 100%" v-loading="tableLoading">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="150px">
<template scope="{row}">
<el-button @click="openView(row)"
size="mini" type="primary"
v-if="![8100].includes(row.state) && row.state">查看
</el-button>
<el-button @click="openEdit(row)"
size="mini" type="primary"
v-if="[8100,8125].includes(row.state) || !row.state">编辑
</el-button>
<el-button @click="doDelete(row)"
size="mini" type="danger"
v-if="[8100].includes(row.state) || !row.state">删除
</el-button>
<el-button @click="doDelete(row)"
size="mini"
type="danger" v-if="![8100].includes(row.state) && row.state && $auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')">删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<wakes-info ref="viewInfo"></wakes-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unions: [],
pageForm: {
isAudit: false,
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'unionName', label: '申报工会', sortable: true},
{prop: 'username', label: '申报人', sortable: true},
{prop: 'mobile', label: '联系方式', sortable: true},
{prop: 'position', label: '地址', sortable: true},
{prop: 'area', label: '面积', sortable: true},
{prop: 'foundTime', label: '创立时间', sortable: true},
{prop: 'applyTime', label: '申报日期', sortable: true},
{prop: 'stateName', label: '状态', sortable: true},
],
}
},
components: {
'wakes-info': httpVueLoader('/components/workershome/info/WakesHomeInfo.vue')
},
methods: {
openView(row) {
this.$refs.guava.view()
this.$refs.viewInfo.openView(row.id)
},
async doDelete(row) {
const confirm = await this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm==="confirm"){
const resp = await this.$axios.get(loc() + '/doRemove', {id: row.id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData();
} else {
this.notifyWarning(resp.msg)
}
}
},
openEdit(row) {
location.href = '/platform/workershome/info/apply?id=' + row.id
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
},
async created() {
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
this.unions.unshift({id: '校工会', unionname: '校工会'})
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,229 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
formData="yyyy"
placeholder="请选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select @change="doSearch" clearable="true"
filterable="true"
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表">
<el-radio-group @change="doSearch" class="mr10" size="small" v-model="pageForm.isAudit">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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">
<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"
>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right" width="150px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="openAudit(row)" v-if="[8120].includes(row.state) || !row.state" size="mini" type="primary">审核</el-button>
<el-button @click="doRollBack(row.id)" v-if="[8125,8130].includes(row.state) || !row.state" size="mini" type="danger">撤回</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<wakes-info ref="viewInfo"></wakes-info>
</template>
<template #edit>
<wakes-info ref="auditInfo">
<template #handle>
<el-tab-pane label="校工会审核" name="schoolAudit">
<el-form :model="formData" ref="form" :rules="formRules" label-position="right"
style="padding: 20px 0"
label-width="120px">
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input value="${@shiro.getPrincipalProperty('username')}"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="time" label="审核时间">
<el-input v-model="formData.auditTime" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="auditOpinion" label="审核意见">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<!-- <el-form-item prop="auditSign" label="审核签字">-->
<!-- <sign :qz.sync="formData.auditSign"></sign>-->
<!-- </el-form-item>-->
</el-form>
<div style="float: right;margin: 20px 0">
<el-button type="danger" @click="doReview(0)">
拒绝
</el-button>
<el-button type="primary" @click="doReview(1)">
通过
</el-button>
</div>
</el-tab-pane>
</template>
</wakes-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el:'#app',
mixins:[initTableMixins],
data(){
return{
id:'',
unions:[],
pageForm:{
isAudit:false,
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'unionName', label: '申报工会', sortable: true},
{prop: 'username', label: '申报人', sortable: true},
{prop: 'mobile', label: '联系方式', sortable: true},
{prop: 'position', label: '地址', sortable: true},
{prop: 'area', label: '面积', sortable: true},
{prop: 'foundTime', label: '创立时间', sortable: true},
{prop: 'applyTime', label: '申报日期', sortable: true},
{prop: 'stateName', label: '状态', sortable: true},
],
formRules: {
// auditSign: [{required: true, message: '必填', trigger: ['blur', 'change']}],
auditOpinion: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
}
},
components: {
'wakes-info': httpVueLoader('/components/workershome/info/WakesHomeInfo.vue')
},
methods:{
doReview(row){
this.$refs['form'].validate(valid => {
if (valid) {
this.$confirm('您确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const {code, msg} = await this.$axios.post(loc() + '/doAudit', {
audit: JSON.stringify(this.formData),
id: this.id,
isPass: row,
})
if (code === 0) {
this.pageData()
this.notifySuccess(msg)
this.$refs.guava.index()
} else {
this.notifyWarning(msg)
}
})
}
})
},
openView(row){
this.$refs.guava.view()
this.$refs.viewInfo.openView(row.id)
},
openAudit(row){
this.formData={}
this.id = row.id
this.$set(this.formData, 'auditTime', moment().format('YYYY-MM-DD'))
this.$refs.guava.edit()
this.$refs.auditInfo.activeName = 'schoolAudit'
this.$refs.auditInfo.openView(row.id)
},
async doRollBack(id){
const confirm = await this.$confirm('确定要撤回该记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ("confirm" === confirm) {
const resp = await this.$axios.get(loc() + '/doRollBack',{id:id})
if (resp.code === 0){
this.pageData();
this.notifySuccess(resp.msg)
}else {
this.notifyError(resp.msg)
}
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
},
async created(){
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, 'unionId', this.unions ? this.unions[0].id : null)
this.flushUnits()
}
this.unions.unshift({id:'校工会',unionname:'校工会'})
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,385 @@
const ADD_REVIEW_PROXY = {
template: /*language=HTML*/ `
<div>
<el-form class="el_form" :model="data" ref="addForm" :rules="formRules" label-width="120px">
<vi-title title="指标信息"></vi-title>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="annual" label="年&emsp;&emsp;度" class="is-required">
<el-date-picker
style="width: 100%"
:disabled="is_view"
:picker-options="pickerOptions"
v-model="data.annual"
type="year"
value-format="yyyy"
placeholder="选择年度">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="assessment" label="评测名称" class="is-required">
<el-input maxlength="30" :disabled="is_view" v-model="data.assessment"
placeholder="请填写评测名称"
type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="zbId" label="以往评议指标" v-if="data.isEvaluationIndex">
<el-select v-model="data.zbId" placeholder="请选择" filterable clearable
style="width: 100%" @change="getByZbData">
<el-option
v-for="item in zbList"
:key="item.id"
:label="item.annual+item.assessment"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8">
<el-form-item prop="assessmentMode" label="评议选项" class="is-required">
<el-radio-group v-model="data.assessmentMode" :disabled="is_view">
<el-radio-button :label="1">工会评议</el-radio-button>
<el-radio-button :label="2">主席/副主席评议</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="reviewMode" label="评议模式" class="is-required">
<el-radio-group v-model="data.reviewMode" :disabled="is_view">
<el-tooltip content="由校工会/分工会管理员自我测评"
placement="top">
<el-radio-button :label="1">自我评议</el-radio-button>
</el-tooltip>
<el-tooltip content="由教职工对选择的工会/主席进行评议"
placement="top">
<el-radio-button :label="2">教工评议</el-radio-button>
</el-tooltip>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="scoringMode" label="打分模式" class="is-required">
<el-radio-group v-model="data.scoringMode" :disabled="is_view">
<el-radio-button :label="1">评分模式</el-radio-button>
<el-radio-button :label="2">满意度模式</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row gutter="20">
<el-col :span="8" v-if="data.assessmentMode">
<el-form-item prop="scoringMode" label="评议范围" class="is-required">
<el-radio-group v-model="data.commentTarget" :disabled="is_view">
<el-tooltip :content="schoolContent" placement="top">
<el-radio-button :disabled="!$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')" :label="1">校工会</el-radio-button>
</el-tooltip>
<el-tooltip :content="allUnionContent" placement="top">
<el-radio-button :disabled="!$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')" :label="2">全部分工会
</el-radio-button>
</el-tooltip>
<el-tooltip :content="selectUnionContent" placement="top">
<el-radio-button :label="3">自选分工会</el-radio-button>
</el-tooltip>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="data.commentTarget && data.reviewMode == 2 && data.commentTarget == 1">
<el-col :span="8">
<el-form-item prop="activityGroupId" label="可评议人员" class="is-required">
<div style="display: flex; justify-content: space-between">
<div style="width: 99%">
<el-select clearable filterable placeholder="请选择可评议人员"
style="width: 99%" v-model="data.activityGroupId"
:disabled="is_view">
<el-option :key="item.groupId"
:label="item.groupName"
:value="item.groupId"
v-for="item in activityGroupList"></el-option>
</el-select>
</div>
<div>
<el-button
@click="$refs.drawerUserScope.userScopeDialog = true"
:disabled="is_view"
type="primary">设置
</el-button>
</div>
</div>
</el-form-item>
</el-col>
</template>
<template v-if="data.commentTarget && data.commentTarget == 3">
<el-col :span="8">
<el-form-item prop="unionIds" label="自选分工会" class="is-required">
<el-select v-model="data.unionIds" style="width: 100%"
:disabled="is_view"
multiple clearable filterable
placeholder="请选择分工会">
<el-option
v-for="item in reviewUnions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
</template>
<el-col :span="8">
<el-form-item prop="applyTime" label="评议时间" class="is-required">
<el-date-picker
end-placeholder="结束时间"
range-separator="-"
start-placeholder="开始时间"
style="width: 100%"
:disabled="is_view"
type="datetimerange"
v-model="data.applyTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<vi-title2 title="测评内容"></vi-title2>
<el-form-item label="" label-width="0" v-for="(nr,idx) in data.nrs">
<el-row type="flex" align="middle" justify="space-between">
<el-input v-model="nr.content" :disabled="is_view" maxlength="30" style="width: 50%"
placeholder="请填写测评内容">
<template slot="prepend">
<span>{{ nr.contentNumber = idx + 1 }}</span>
</template>
</el-input>
<el-button v-if="!is_view" size="medium" :disabled="data.nrs.length<=1" type="danger"
@click="data.nrs.splice(idx,1)"
icon="el-icon-delete"></el-button>
</el-row>
<el-row style="margin-top: 20px">
<el-table :data="nr.bzs" style="width: 100%" border show-summary
:summary-method="getSummaries" size="small">
<el-table-column align="center" header-align="center" label="序号" type="index"
width="100px">
<template scope="{$index,row}">
{{ row.contentNumber = $index + 1 }}
</template>
</el-table-column>
<el-table-column label="测评标准" prop="inspection">
<template scope="{row}">
<el-input v-if="!is_view" v-model="row.inspection" placeholder="请填写测评标准"
type="textarea"
rows="2"></el-input>
<div v-else style="white-space:break-spaces">{{ row.inspection }}</div>
</template>
</el-table-column>
<el-table-column label="标准分" prop="score" header-align="center" align="center"
width="100px" v-if="data.scoringMode===1">
<template scope="{row}">
<el-input v-if="!is_view" v-model.number="row.score" maxlength="4"
placeholder="请填写标准分"></el-input>
<span v-else>{{ row.score }}</span>
</template>
</el-table-column>
<el-table-column v-if="!is_view" label="操作" header-align="center" align="center"
width="200px">
<template scope="{row,$index}">
<el-button size="mini" :disabled="nr.bzs.length<=1 || (!row.canDelete && row.id)"
type="danger" icon="el-icon-delete"
@click="nr.bzs.splice($index,1)"></el-button>
<el-button size="mini"
type="primary" icon="el-icon-plus"
@click="nr.bzs.splice($index+1,0,{inspection:null,score:null,isEvidence:true})"></el-button>
</template>
</el-table-column>
</el-table>
</el-row>
<el-row class="mt10 mb10" style="border-top: 1px dashed rgb(229, 225, 225)"></el-row>
</el-form-item>
<el-row type="flex" justify="center">
<el-button v-if="!is_view"
type="primary"
@click="data.nrs.push({bzs:[{inspection:null,score:null,isEvidence:true}]})">
添加测评内容
</el-button>
</el-row>
<div>
<drawer-user-scope
@group_change="getActivityGroup"
ref="drawerUserScope"
:group_id.sync="data.activityGroupId"
></drawer-user-scope>
</div>
</el-form>
</div>
`,
props: {
is_view: {type: Boolean, default: false},
data: {
type: Object,
default: {
nrs: [{
bzs: [{}]
}],
unionIds: []
}
}
},
data() {
return {
activityGroupList: [],
isEvaluationIndex: false,
zbList: [],
formRules: {
xxx: [{required: true, message: '请填写年度', trigger: ['blur', 'change']}],
},
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
relationData: [
{moduleName: '提案系统模块', id: 'proposal'},
{moduleName: '二级教代会', id: 'secteameet'},
{moduleName: '慰问/补助', id: 'ConandDif'},
],
roleDataReview: {},
reviewUnions: [],
}
},
components: {
'drawer-user-scope': httpVueLoader('/components/module/activity/DrawerUserScope.vue'),
},
methods: {
async getActivityGroup() {
const {data} = await this.$axios.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = data
},
async getByZbData() {
const {
code,
data,
msg
} = await this.$axios.get('/platform/wakeshome/review/viewZb/edit', {id: this.data.zbId})
if (data) {
this.$set(this.data, "nrs", data.nrs)
} else {
this.$set(this.data, "nrs", [{bzs: [{}]}])
}
},
async getZbList() {
const res = await this.$axios.get("/platform/wakeshome/review/Xjkhzb/getZbList")
this.zbList = res.data
},
getSummaries(param) {
const {columns, data} = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0 && this.data.scoringMode === 1) {
sums[index] = '小计';
return;
} else if ([1, 3, 4].includes(index) && this.data.scoringMode === 1) {
sums[index] = '';
return;
} else if ([1, 2, 3].includes(index) && this.data.scoringMode === 2) {
sums[index] = '';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
sums[index] += ' 分';
} else {
sums[index] = '';
}
});
return sums;
},
},
async created() {
await this.getActivityGroup()
await this.getZbList()
if (!this.data || !Object.keys(this.data).length) {
this.data = {
nrs: [{
bzs: [{inspection: null, score: null, isEvidence: true}]
}],
}
}
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.reviewUnions = await this.$businessTool.listUnion()
} else {
this.reviewUnions = await this.$businessTool.listUnion(this.unionId)
this.$set(this.data, "unionIds", this.reviewUnions[0].id)
}
},
watch: {
data: {
deep: true,
handler(val) {
this.$emit('change', val)
}
}
},
computed: {
schoolContent() {
if (this.data.reviewMode == 1) {
return '勾选后,仅校工会管理员可参加测评'
} else if (this.data.reviewMode == 2) {
return '勾选后,全校所有人员可评议校工会,也可根据右侧选框【可评议人员】指定评议人员范围'
} else {
return '请选择评议模式'
}
},
allUnionContent() {
if (this.data.reviewMode == 1) {
return '勾选后,仅各工会管理员可对本分工会进行自我评议'
} else if (this.data.reviewMode == 2) {
return '勾选后,所有分工会人员对本分工会进行评议,不可跨工会评议'
} else {
return '请选择评议模式'
}
},
selectUnionContent() {
if (this.data.reviewMode == 1) {
return '勾选后,仅右侧选择的分工会管理员可对本分工会进行自我评议'
} else if (this.data.reviewMode == 2) {
return '勾选后,可根据右侧选框【自选分工会】指定分工会评议范围'
} else {
return '请选择评议模式'
}
}
}
}
@@ -0,0 +1,113 @@
const REVIEW_RESULT = {
template: /*language=HTML*/ `
<div>
<el-form label-width="120px">
<template v-if="viewInfo.zbxx.assessmentMode === 2">
<div class="process-title">评议对象选择</div>
<el-row :gutter="20">
<el-col :span="12" v-if="viewInfo.zbxx.assessmentMode===2">
<el-form-item prop="evaluatedPersonName" label="被测评人姓名">
{{viewInfo.commentPeo.evaluatedPersonName}}
</el-form-item>
</el-col>
<el-col :span="12" v-if="viewInfo.zbxx.assessmentMode===2">
<el-form-item prop="evaluatedPersonName" label="现任职务">
{{viewInfo.commentPeo.evaluatedPersonName}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="evaluatedPersonName" label="测评结果">
{{viewInfo.commentPeo.reviewResult}}
</el-form-item>
</el-col>
<el-col :span="24" v-if="viewInfo.zbxx.assessmentMode===2">
<el-form-item prop="presidentOpinions" label="意见建议">
{{viewInfo.commentPeo.presidentOpinions}}
</el-form-item>
</el-col>
</el-row>
</template>
<vi-title2 title="评议内容"></vi-title2>
<el-form-item label="" label-width="0" v-for="(nr,idx) in viewInfo.zbxx.nrs" :key="nr.id">
<el-row type="flex" align="middle" justify="space-between">
<el-input v-model="nr.content" readonly maxlength="30" style="width: 50%">
<template slot="prepend"><span>{{ idx + 1 }}</span></template>
</el-input>
</el-row>
<el-row style="margin-top: 20px">
<el-table :data="nr.bzs" style="width: 100%" border :show-summary = "viewInfo.zbxx.scoringMode !== 2 ? 'always' : false">
<el-table-column align="center" header-align="center" label="序号"
type="index"
width="100px">
<template scope="{$index,row}">
{{ row.contentNumber = $index + 1 }}
</template>
</el-table-column>
<el-table-column label="主要评比内容" disabled prop="inspection" header-align="center" align="center"></el-table-column>
<template v-if="viewInfo.zbxx.scoringMode === 1">
<el-table-column label="标准分" prop="score" header-align="center" align="center" width="250px"></el-table-column>
<el-table-column label="评议分" prop="resultScore" header-align="center" align="center" width="250px"></el-table-column>
</template>
<template v-if="viewInfo.zbxx.scoringMode === 2">
<el-table-column label="满意度" prop="resultScore" header-align="center" align="center" width="350px">
<template slot-scope="{row}">
<el-radio-group v-model="row.resultScore" size="small">
<el-radio disabled label="非常满意">非常满意</el-radio>
<el-radio disabled label="满意">满意</el-radio>
<el-radio disabled label="良好">良好</el-radio>
<el-radio disabled label="一般">一般</el-radio>
</el-radio-group>
</template>
</el-table-column>
</template>
</el-table>
</el-row>
<div v-if="viewInfo.zbxx.scoringMode===1">
<el-divider content-position="left">简述工作情况</el-divider>
<el-row>
<el-col :span="24">
<el-input type="textarea" :rows="2" maxlength="300" show-word-limit readonly
v-model="nr.bzs[0].options" placeholder="请简述工作情况"></el-input>
</el-col>
</el-row>
</div>
</el-form-item>
<template v-if="viewInfo.zbxx.scoringMode === 2">
<div class="process-title">简述工作情况</div>
<el-input type="textarea" :rows="2" maxlength="300" show-word-limit disabled
v-model="viewInfo.commentPeo.presidentOpinions" placeholder="请简述工作情况"></el-input>
</template>
<template v-if="viewInfo.zbxx.scoringMode === 1 && viewInfo.zbxx.reviewMode === 1">
<div class="process-title">职工评家总结</div>
<file-upload v-if="viewInfo.commentPeo.files && viewInfo.commentPeo.files.length > 0" :files.sync="viewInfo.commentPeo.files" view></file-upload>
<el-empty v-else :image-size="100" description="未上传总结"></el-empty>
</template>
</el-form>
</div>
`,
props: {
id: {type: String, default: ''}
},
data() {
return {
viewInfo: {
commentPeo: {},
zbxx: []
}
}
},
methods:{
async findOne(peoId){
const resp = await this.$axios.get('/platform/wakeshome/review/statistics/getBzById',{peoId:peoId})
if (resp.code === 0) {
this.viewInfo = resp.data
}
}
}
}
@@ -0,0 +1,444 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#app {
height: 100%;
overflow-y: unset !important;
}
.el-form {
height: calc(100vh - 100px) !important;
}
.el-divider {
background-color: #1867b0;
}
.el-divider__text {
color: #1867b0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
:picker-options="pickerOptions"
v-model="pageForm.annual"
type="year"
style="width: 100%"
value-format="yyyy"
placeholder="选择年度">
</el-date-picker>
</search-item>
<search-item label="评议名称">
<el-input v-model="pageForm.assessment" placeholder="根据测评名称查询"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="项目列表">
<!--<el-button type="primary" size="small">添加信息</el-button>-->
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" width="100px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="年度" prop="annual" header-align="center" width="300px"
sortable align="center">
</el-table-column>
<el-table-column label="考核名称" prop="assessment" header-align="center"
show-overflow-tooltipalign="center"></el-table-column>
<el-table-column label="评测模式" prop="assessmentMode" header-align="center"
show-overflow-tooltipalign="center">
<template scope="{row}">
{{row.assessmentMode===1?'工会评家':'主席/副主席评家'}}
</template>
</el-table-column>
<el-table-column label="打分模式" prop="scoringMode" header-align="center"
show-overflow-tooltipalign="center">
<template scope="{row}">
{{row.scoringMode===1?'评分模式':'选择模式'}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right"
width="250px">
<template scope="scope">
<el-button size="mini" type="primary" @click="openView(scope.row.id)">
查看
</el-button>
<template v-if="!scope.row.isReview">
<el-tooltip content="评议页面的提交按钮在右上角哦" placement="top">
<el-button size="mini" type="primary" @click="doReview(scope.row)">
自评
</el-button>
</el-tooltip>
</template>
<template v-else>
<el-button size="mini" type="primary" @click="openReview(scope.row)">评议结果</el-button>
</template>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit_func>
<el-button type="primary" style="float: right;margin-top: 5px;margin-left: 10px;"
@click="doSubmit()">提交
</el-button>
<!-- <el-button type="primary" plain style="float: right;margin-top: 5px" @click="doSaveOrSubmit('save')">保存</el-button>-->
</template>
<template #edit>
<el-form :model="formData" ref="form" label-width="100px"
style="height: calc(100vh - 50px);overflow-y: scroll;padding: 10px 15px">
<template v-if="formData.assessmentMode==2">
<div class="process-title">评议对象选择</div>
<el-row>
<el-col :span="12">
<el-form-item prop="president" label-width="0px">
<el-select v-model="formData.president" placeholder="请选择主席/副主席进行评议"
style="width: 100%">
<el-option v-for="o in userList" :key="o.id" :label="o.presidents" :value="o.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<div style="margin: 8px 10px">
<span style="color: #ac2925">如已完成该对象的评议,请您手动更换评议对象</span>
</div>
</el-col>
</el-row>
</template>
<div class="process-title">评议内容</div>
<el-form-item label="" label-width="0" v-for="o,idx in formData.nrs" :key="o.id">
<el-row type="flex" align="middle" justify="space-between">
<el-input v-model="o.content" readonly maxlength="30" style="width: 50%">
<template slot="prepend"><span>{{ idx + 1 }}</span></template>
</el-input>
</el-row>
<el-row style="margin-top: 20px">
<el-table :data="o.bzs" style="width: 100%" border :show-summary = "formData.scoringMode !== 2 ? 'always' : false">
<el-table-column align="center" header-align="center" label="序号" type="index"
width="100px">
</el-table-column>
<el-table-column label="主要评比内容" disabled prop="inspection" header-align="center"
align="center">
<template scope="{row}">
<el-input v-model="row.inspection"
readonly type="textarea" rows="2"></el-input>
</template>
</el-table-column>
<template v-if="formData.scoringMode===1">
<el-table-column label="标准分" prop="score" header-align="center" align="center"
width="250px">
<template scope="{row}">
<el-input v-model.number="row.score" readonly></el-input>
</template>
</el-table-column>
<el-table-column label="评议分" prop="resultScore" header-align="center"
align="center" width="250px">
<template slot-scope="{row}">
<el-input v-model="row.resultScore" maxlength="4" @blur="changeScore(row)"
placeholder="请填写评议分"></el-input>
</template>
</el-table-column>
</template>
<template v-if="formData.scoringMode===2">
<el-table-column label="满意度" prop="resultScore" header-align="center"
align="center" width="350px">
<template slot-scope="{row}">
<el-radio-group v-model="row.resultScore" size="small">
<el-radio label="非常满意">非常满意</el-radio>
<el-radio label="满意">满意</el-radio>
<el-radio label="良好">良好</el-radio>
<el-radio label="一般">一般</el-radio>
</el-radio-group>
</template>
</el-table-column>
</template>
</el-table>
</el-row>
<div v-if="formData.scoringMode===1">
<el-divider content-position="left">简述工作情况</el-divider>
<el-row>
<el-col :span="24">
<el-input type="textarea" :rows="2" maxlength="300" show-word-limit
v-model="o.remark" placeholder="请简述工作情况"></el-input>
</el-col>
</el-row>
</div>
</el-form-item>
<template v-if="formData.scoringMode===2">
<div class="process-title">简述工作情况</div>
<el-form-item prop="options" label-width="0px">
<el-input type="textarea" :rows="2" maxlength="300" show-word-limit
v-model="presidentOpinions" placeholder="请简述工作情况"></el-input>
</el-form-item>
</template>
<template v-if="formData.reviewMode===1 && formData.scoringMode===1">
<div class="process-title">职工评家总结</div>
<el-form-item prop="files" label-width="0px">
<file-upload :value.sync="formData.files" accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png"
upload_mode="drag"
:upload_number="3" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</template>
</el-form>
</template>
<template #view>
<review-proxy :data="viewData" :is_view="true"></review-proxy>
</template>
<template #public>
<review-result ref="reviewResultRef"></review-result>
</template>
</guava>
</div>
<script>
<!--#include("../components/addReviewProxy.js"){}#-->
<!--#include("../components/reviewResult.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabLoading: false,
loading: true,
activeName: '1',
tableData: [],
formData: {},
viewData: {
nrs: [{
bzs: [{}]
}],
},
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
},
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
id:'',
presidentOpinions: '',
isShowSubmit: true,
isReadOnly: true,
userList: [],
}
},
components: {
'review-proxy': ADD_REVIEW_PROXY,
'review-result': REVIEW_RESULT
},
methods: {
async openReview(row){
const resp = await this.$axios.get(loc() + "/getPeoId",{id:row.id})
if (resp.code === 0) {
this.$refs.guava.public()
this.$refs.reviewResultRef.findOne(resp.data)
}
},
changeScore(row) {
if (Number(row.score) < Number(row.resultScore)) {
row.resultScore = null;
this.$message.warning('评议分不能超过标准分');
}
},
async doReview(o) {
//自评模式
if (o.reviewMode == 1 && !o.canJoin) {
this.$message.warning('您不在自评人员范围中');
return
}
const isExist = await getScopeUser(o.activityGroupId)
if ((o.commentTarget == 1 && !isExist) || (o.commentTarget == 3 && !o.canJoin)) {
this.$message.warning('您不在自评人员范围中');
return
}
const res = await this.$axios.get('/mobile/workershome/review/appraisal/isAssess',{id:o.id})
if (res.data > 0){
this.$message.warning('您已经填写过该评议,请点击评议结果可查看评议详情')
return
}
const resp = await this.$axios.get('/mobile/workershome/review/appraisal/getById', {id: o.id})
if (resp.code === 0) {
this.id = o.id
this.formData = resp.data
if (this.formData.assessmentMode === 2) {
this.formData.nrs.forEach(v => {
v.bzs.forEach(o => {
o.resultScore = '满意'
})
})
await this.getPresidents()
}
this.$refs.guava.edit()
}
},
async getPresidents() {
const resp = await this.$axios.get('/mobile/workershome/review/appraisal/getPresidents')
if (resp.code === 0) {
this.userList = resp.data
}
if (this.userList && this.userList.length > 0) {
this.president = this.userList[0].id
await this.presidentChange();
}
},
async presidentChange() {
const resp = await this.$axios.get('/mobile/workershome/review/appraisal/isAssess', {
id: this.id,
evaluatedPersonId: this.president,
})
if (resp.data > 0) {
this.$message.warning('您已经评测过该主席(副主席),请在点击评议结果可查看评议信息,或更换主席(副主席)进行测评')
this.isShowSubmit = true;
this.isReadOnly = true
}
},
async openView(id) {
this.$refs.guava.view()
this.loading = true;
const {code, data, msg} = await this.$axios.get('/platform/workershome/review/khzb/edit', {id})
if (code === 0) {
this.viewData = data
this.viewData.applyTime = [this.viewData.startTime,this.viewData.endTime]
}
this.loading = false;
},
async assignment(){
const self = this;
const bzList = [];
this.formData.nrs.forEach(v => {
v.bzs.forEach(o => {
if (self.formData.assessmentMode === 1 && v.remark){
o.options = v.remark
}
bzList.push(o)
})
})
this.formData.bzList = bzList
this.formData.id = this.id
this.formData.president = this.president
this.formData.files = JSON.stringify(this.formData.files)
},
async doSubmit(){
const validate = await this.$refs.form.validate()
if (!validate) {
return
}
this.$confirm('确定要提交该测评结果吗?提交后不可修改,请仔细检查后提交', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
await this.assignment()
if (!this.formData.reviewResult) {
await this.createdReviewResult()
}
this.formData.bzList = JSON.stringify(this.formData.bzList)
const resp = await this.$axios.post('/mobile/workershome/review/appraisal/doSubmit',this.formData)
if (resp.code === 0) {
this.$message.success('提交成功')
this.$refs.guava.index()
this.formData = {}
this.pageData()
} else {
this.$message.warning(resp.msg)
}
})
},
async createdReviewResult(){
if (this.formData.assessmentMode === 1) {
let source = 0; // 标准分
let resultScore = 0; // 评议分
this.formData.bzList.forEach(v => {
source += Number(v.score)
resultScore += Number(v.resultScore)
})
const result = (resultScore / source) * 100
if (result > 95) {
this.formData.reviewResult = '非常满意'
} else if (result > 80 && result <= 94) {
this.formData.reviewResult = '满意'
} else if (result > 60 && result <= 79) {
this.formData.reviewResult = '良好'
} else {
this.formData.reviewResult = '一般'
}
} else if (this.formData.assessmentMode === 2) {
const result = this.formData.bzList.filter(v => v.resultScore === '满意' || v.resultScore === '基本满意')
const satisfactionPercentage = (result.length / this.formData.bzList.length) * 100;
if (satisfactionPercentage > 95) {
this.formData.reviewResult = '非常满意'
} else if (satisfactionPercentage > 80 && satisfactionPercentage <= 94) {
this.formData.reviewResult = '满意'
} else if (satisfactionPercentage > 60 && satisfactionPercentage <= 79) {
this.formData.reviewResult = '良好'
} else {
this.formData.reviewResult = '一般'
}
const user = this.userList.find(v=> v.id === this.president)
this.formData.evaluatedPersonName = user.username
this.formData.evaluatedPersonType = user.evaluatedPersonType
}
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,211 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
#app {
overflow-y: unset !important;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
:picker-options="pickerOptions"
v-model="pageForm.annual"
type="year"
value-format="yyyy"
placeholder="选择年度">
</el-date-picker>
</search-item>
<search-item label="测评名称">
<el-input v-model="pageForm.assessment" placeholder="根据测评名称查询"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" width="100px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column label="年度" prop="annual" header-align="center" width="300px"
sortable align="center">
</el-table-column>
<el-table-column label="考核名称" prop="assessment" header-align="center"
show-overflow-tooltipalign="center"></el-table-column>
<el-table-column label="评测模式" prop="assessmentMode" header-align="center"
show-overflow-tooltipalign="center">
<template scope="{row}">
{{row.assessmentMode===1?'工会评家':'主席/副主席评家'}}
</template>
</el-table-column>
<el-table-column label="打分模式" prop="scoringMode" header-align="center"
show-overflow-tooltipalign="center">
<template scope="{row}">
{{row.scoringMode===1?'评分模式':'选择模式'}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" fixed="right"
width="250px">
<template scope="scope">
<el-button size="mini" type="primary" @click="openView(scope.row.id)">
查看
</el-button>
<el-button size="mini" type="primary" @click="openEdit(scope.row.id)">
编辑
</el-button>
<el-button size="mini" type="danger" @click="doDelete(scope.row.id)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit_func>
<el-button type="primary" style="float: right;margin-top: 5px"
@click="doEdit()">提交
</el-button>
</template>
<template #edit>
<review-proxy :data="formData" @change="v=>{this.formData=v}"></review-proxy>
</template>
<template #view>
<review-proxy :data="viewData" :is_view="true"></review-proxy>
</template>
</guava>
</div>
<script>
<!--#include("../components/addReviewProxy.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
tabLoading: false,
loading: true,
activeName: '1',
tableData: [],
formData: {
applyTime: []
},
viewData: {
nrs: [{
bzs: [{}]
}],
},
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
},
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
}
},
components: {
'review-proxy': ADD_REVIEW_PROXY
},
methods: {
async openEdit(id) {
const {code, data, msg} = await this.$axios.get(loc() + '/edit', {id})
if (code === 0) {
this.formData = data
if (data.startTime && data.endTime) {
this.$set(this.formData, 'applyTime', [data.startTime, data.endTime])
// this.formData.applyTime = [this.formData.startTime, this.formData.endTime]
}
this.$refs.guava.edit()
}
},
doEdit() {
if (this.formData.applyTime && this.formData.applyTime.length > 0) {
this.formData.startTime = this.formData.applyTime[0]
this.formData.endTime = this.formData.applyTime[1]
}
this.$axios.post(loc() + "/doEdit", {kh_zb: JSON.stringify(this.formData)}, (res) => {
const {code, data, msg} = res
if (code == 0) {
this.$message({
message: msg,
type: 'success'
});
} else {
this.$message({
message: msg,
type: 'error'
});
}
this.$refs.guava.index()
this.pageData()
},
)
},
doDelete(id) {
this.$confirm('您确定要删除吗!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: (a, b) => {
if ("confirm" == a) {//确认后再执行
this.$axios.post(loc() + "/delete", {id: id}, (data) => {
if (data.code === 0) {
this.$message({
message: data.msg,
type: 'success'
});
this.pageData();
} else {
this.$message({
message: data.msg,
type: 'error'
});
}
}, "json");
}
}
});
},
async openView(id) {
this.$refs.guava.view()
this.loading = true;
const {code, data, msg} = await this.$axios.get(loc() + '/edit', {id})
if (code === 0) {
this.viewData = data
if (data.startTime && data.endTime) {
this.$set(this.viewData, 'applyTime', [data.startTime, data.endTime])
// this.formData.applyTime = [this.formData.startTime, this.formData.endTime]
}
}
this.loading = false;
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,421 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search search="doSearch">
<search-item label="年度">
<el-date-picker
:picker-options="pickerOptions"
@change="getZbList"
style="width: 100%"
v-model="pageForm.annual"
type="year"
value-format="yyyy"
placeholder="选择年度">
</el-date-picker>
</search-item>
<search-item label="评测名称">
<el-select v-model="pageForm.zbId" placeholder="请选择评测名称" filterable
clearable
@change="doSearch();zbData = zbList.find(v => v.id === pageForm.zbId)"
style="width: 100%">
<el-option
v-for="item in zbList"
:key="item.id"
:label="item.annual+item.assessment"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="所属工会" v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')">
<el-select placeholder="所属工会" v-model="pageForm.unionId"
style="width: 100%;"
clearable
@change="doSearch"
filterable>
<el-option v-for="item in unions" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt20">
<table-tool label="工会列表">
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder"
:size="tableSize"
v-loading="tableLoading" ref="table" 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
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop=='isGrading'" scope="{row}">
<el-tag v-if="row.isGrading" type="success"></el-tag>
<el-tag v-else type="danger"></el-tag>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="380px" fixed="right">
<template scope="{row}">
<el-button size="mini" @click="openView(row)">查看</el-button>
<el-button
v-if="!row.isGrading && row.num > 0 && ${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}"
size="mini" type="primary"
@click="openGrading(row)">定级
</el-button>
<el-button
v-if="row.isGrading && row.num > 0 && ${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}"
size="mini" type="primary"
@click="editGrading(row)">修改定级
</el-button>
<el-tooltip
:content="canDownload ? ('导出【'+ row.unionName +'】管理员自我评议的评议结果') : ('导出【'+ row.unionName +'】下所有评议结果的压缩包') "
placement="top">
<el-button v-if="canDownload && row.num > 0" size="mini" type="primary"
@click="doDownLoad(row,canDownload)">导出
</el-button>
</el-tooltip>
<el-button size="mini" type="primary" @click="downloadFilesByUnion(row)">导出附件</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<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="请输入工号/姓名" v-model="userPageForm.searchKeyword">
</el-input>
</div>
</div>
<div class="search-item" style="width: 480px !important;">
<div class="search-item-option">
<el-radio-group v-model="userPageForm.reviewResult"
@change="doUserSearch">
<el-radio-button label="">
全部
<span class="ml2">
{{reviewResultData.fcmy + reviewResultData.my + reviewResultData.lh + reviewResultData.yb}}
</span>
</el-radio-button>
<el-radio-button label="非常满意">非常满意
<span class="ml2">{{reviewResultData.fcmy || 0}}</span>
</el-radio-button>
<el-radio-button label="满意">满意
<span class="ml2">{{reviewResultData.my || 0}}</span>
</el-radio-button>
<el-radio-button label="良好">良好
<span class="ml2">{{reviewResultData.lh || 0}}</span>
</el-radio-button>
<el-radio-button label="一般">一般
<span class="ml2">{{reviewResultData.yb || 0}}</span>
</el-radio-button>
</el-radio-group>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doUserSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt20">
<el-table :data="userTableData" style="width: 100%" row-key="id"
:size="tableSize" v-loading="tableLoading" ref="table" 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 userTableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
</el-table-column>
<el-table-column prop="evaluatedPersonName" align="center" show-overflow-tooltip
label="被测评人" v-if="zbData.assessmentMode==2"></el-table-column>
<el-table-column prop="presidentOpinions" align="center" show-overflow-tooltip
label="意见建议" v-if="zbData.assessmentMode==2"></el-table-column>
<el-table-column prop="reviewTime" align="center"
label="测评时间"></el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作" width="240px" fixed="right">
<template scope="{row}">
<el-button size="mini" @click="openUserView(row)">查看</el-button>
<el-button v-if="canDownload" size="mini" type="primary" @click="downloadByPeoId(row)">导出</el-button>
<el-button v-if="canDownload" size="mini" type="primary" @click="downloadFilesByPeoId(row)">导出附件</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="userPageSizeChange"
@current-change="userPageNumberChange"
:current-page="userPageForm.pageNumber"
:page-sizes="[5,10, 20, 30, 50]"
:page-size="userPageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="userPageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</template>
</guava>
<el-dialog title="评议结果" :visible.sync="userDrawer" close-on-press-escape>
<review-result ref="reviewResultRef"></review-result>
</el-dialog>
<el-dialog :title="gradingTitle" :visible.sync="gradingDialog" width="40%" :close-on-press-escape="false">
<el-form :model="gradingData" ref="gradingForm" :rules="gradingRules" label-width="120px">
<el-form-item prop="zbName" label="评测名称">
<el-input readonly v-model="gradingData.zbName"></el-input>
</el-form-item>
<el-form-item prop="unionName" label="定级分工会">
<el-input readonly v-model="gradingData.unionName"></el-input>
</el-form-item>
<el-form-item prop="gradingName" label="定级结果">
<dict-select v-model="gradingData.gradingName" code="GRADING_TYPE" clearable
placeholder="请选择定级结果" style="width: 100%"></dict-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="gradingDialog = false">取 消</el-button>
<el-button type="primary" @click="doGrading">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
<!--#include("../components/reviewResult.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
userDrawer: false,
zbData: {},
zpxx: {
commentPeo: {},
zbxx: []
},
unions: [],
zbList: [],
pageForm: {
annual: new Date().getFullYear() + ''
},
pickerOptions: {
disabledDate(time) {
return (
time.getFullYear() > new Date().getFullYear()
);
}
},
tableColumns: [
{prop: 'unionName', label: '分工会名称'},
{prop: 'num', label: '测评人数'},
{prop: 'isGrading', label: '是否定级'},
{prop: 'gradingName', label: '定级结果'},
],
tableData: [],
userTableData: [],
userTableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'unitName', label: '单位'},
{prop: 'reviewResult', label: '测评结果'},
],
userPageForm: {
reviewResult: "",
searchName: "",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
reviewResultData: {},
gradingDialog: false,
gradingTitle: '',
gradingData: {
unionName: '',
unionId: '',
zbId: '',
zbName: '',
},
gradingRules: {
gradingName: [ {required: true, message: '请选择定级结果', trigger: 'blur'} ]
}
}
},
components: {
'review-result': REVIEW_RESULT
},
methods: {
editGrading(row) {
this.gradingData = {...row}
this.$set(this.gradingData, 'zbId', this.pageForm.zbId)
this.$set(this.gradingData, 'zbName', this.zbList.find(v => v.id === this.pageForm.zbId).assessment)
this.gradingDialog = true
},
doGrading() {
this.$refs['gradingForm'].validate(async (valid) => {
if (valid) {
const resp = await this.$axios.post(loc() + '/doGrading', this.gradingData)
if (resp.code === 0) {
this.gradingDialog = false
this.pageData()
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
}
})
},
openGrading(row) {
this.$set(this.gradingData, 'unionId', row.id)
this.$set(this.gradingData, 'unionName', row.unionName)
this.$set(this.gradingData, 'zbId', this.pageForm.zbId)
this.$set(this.gradingData, 'zbName', this.zbList.find(v => v.id === this.pageForm.zbId).assessment)
this.gradingDialog = true
},
doDownLoad(row, flag) {
if (flag) {
// 为true,自我评议
window.open(loc() + '/doDownLoadSingleByUnionId?zbId=' + this.pageForm.zbId + '&unionId=' + row.id)
} else {
// false, 会员评议,导出压缩包
window.open(loc() + '/doDownLoadZipByUnionId?zbId=' + this.pageForm.zbId + '&unionId=' + row.id)
}
},
async downloadFilesByUnion(row) {
const result = await this.validateHasFiles({unionId: row.id, zbId: this.pageForm.zbId})
if (result) {
window.open(loc() + '/exportFilesByUnionId?zbId=' + this.pageForm.zbId + '&unionId=' + row.id)
}
},
downloadByPeoId(row) {
window.open(loc() + '/exportByPeoId?peoId=' + row.id)
},
async downloadFilesByPeoId(row) {
const result = await this.validateHasFiles({peoId: row.id})
if (result) {
window.open(loc() + '/exportFilesByPeoId?peoId=' + row.id)
}
},
async validateHasFiles(data) {
const res = await this.$axios.post('/platform/workershome/review/statistics/validateHasFiles', {
peoId: data.peoId ? data.peoId : '',
zbId: data.zbId ? data.zbId : '',
unionId: data.unionId ? data.unionId : ''
})
if (res.code === 0) {
return true
} else {
this.$message.warning("未上传附件,无法导出")
return false
}
},
async getReviewResultNum(row) {
const res = await this.$axios.post(loc() + "/getReviewResultNum", {
zbId: this.userPageForm.zbId,
unionId: row.id
})
this.reviewResultData = res.data
},
async openUserView(row) {
this.userDrawer = true
this.$nextTick(() => {
this.$refs.reviewResultRef.findOne(row.id)
})
},
doUserSearch() {
this.tableKey = new Date().getTime()
this.userPageForm.pageNumber = 1
this.userPageData()
},
userPageNumberChange(val) {
this.userPageForm.pageNumber = val;
this.userPageData();
},
userPageSizeChange(val) {
this.userPageForm.pageSize = val;
this.userPageData();
},
userPageData() {
sublime.showLoadingbar();
this.tableLoading = true
this.$axios.post(loc() + "/getUserPeoByZbIdOrUnionId", this.userPageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.userTableData = data.data.list;
this.userPageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
async openView(row) {
this.userPageForm.searchKeyword = ''
this.userPageForm.unionId = row.id
this.userPageForm.zbId = this.pageForm.zbId
this.userPageData()
await this.getReviewResultNum(row)
this.$refs.guava.view()
},
async getZbList() {
const res = await this.$axios.get("/platform/workershome/review/Xjkhzb/getZbList", {year: this.pageForm.annual})
this.zbList = res.data
if (res.data && res.data.length > 0) {
this.$set(this.pageForm, "zbId", res.data[0].id)
} else {
this.$set(this.pageForm, "zbId", null)
}
this.doSearch()
},
},
computed: {
canDownload() {
const data = this.zbList.find(v => v.id === this.pageForm.zbId)
return data.scoringMode == 1
}
},
async created() {
await this.getZbList()
this.unions = await this.$businessTool.listUnion()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,137 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-card__header {
display: flex;
align-items: center;
justify-content: space-between;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<template #header>
<div>
<h3 style="color: #1867b0">新建考核指标</h3>
</div>
<div>
<el-button type="primary" @click="doAdd()">
提交
</el-button>
</div>
</template>
<template>
<review-proxy ref="unionZb" :data="formData" @change="v=>{this.formData=v}"></review-proxy>
</template>
</el-card>
</guava>
</div>
<script>
<!--#include("../components/addReviewProxy.js"){}#-->
const vue = new Vue({
el: '#app',
data() {
return {
v: 'index',
formData: {},
}
},
components: {
'review-proxy': ADD_REVIEW_PROXY
},
methods: {
async doAdd() {
const {
annual,
assessment,
assessmentMode,
scoringMode,
commentTarget,
activityGroupId
} = this.formData
let flag = true
if (!annual) {
this.$message.warning("年度不能为空")
return
}
if (!assessment) {
this.$message.warning("测评名称不能为空")
return
}
if (!scoringMode) {
this.$message.warning("打分模式不能为空")
return
}
if (!assessmentMode) {
this.$message.warning("评测模式不能为空")
return
}
if (!commentTarget) {
this.$message.warning("测评对象不能为空")
return
}
if (commentTarget == 1 && !activityGroupId) {
this.$message.warning("发送人员范围不能为空")
return
}
this.formData.nrs.forEach(nr => {
nr.bzs.forEach(bz => {
if (!nr.content) {
this.$message.error("测评内容不能为空")
flag = false;
throw Error()
} else if (!bz.inspection) {
this.$message.error("测评标准不能为空")
flag = false;
throw Error()
}
})
})
if (!(this.formData.applyTime && this.formData.applyTime.length > 0)) {
this.$message.warning('评议时间不能为空')
return
}
if (this.formData.commentTarget == 3 && !(this.formData.unionIds && this.formData.unionIds.length > 0)) {
this.$message.warning('请选择评议分工会')
return
}
if (flag) {
if (this.formData.applyTime && this.formData.applyTime.length > 0) {
this.formData.startTime = this.formData.applyTime[0]
this.formData.endTime = this.formData.applyTime[1]
}
const res = await this.$axios.post(loc() + "/doAdd", {kh_zb: JSON.stringify(this.formData)})
if (res.code === 0) {
this.$set(this.formData, "nrs", [{bzs: [{}]}])
this.$set(this.formData, "annual", null)
this.$set(this.formData, "assessment", null)
this.$set(this.formData, "assessmentMode", null)
this.$set(this.formData, "workersNum", null)
this.$set(this.formData, "scoringMode", null)
this.$set(this.formData, "activityGroupId", null)
this.$set(this.formData, "commentTarget", null)
this.$set(this.formData, "zbId", null)
this.$set(this.formData, "applyTime", undefined)
this.$message.success(res.msg);
} else {
this.$message.error(res.msg);
}
}
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,541 @@
<div id="difficult_help_apply">
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="" class="flow-task-form">
<el-descriptions :column="3" border>
<el-descriptions-item label="填写人姓名">
<el-form-item prop="proxyUserName">
<el-input readonly v-model="formData.proxyUserName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="填写人工号">
<el-form-item prop="proxyLoginName">
<el-input readonly v-model="formData.proxyLoginName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请模式">
<el-form-item prop="mode">
<el-select v-model="formData.mode" placeholder="申请模式"
@change="modeChange"
:disabled="formData.id" style="width: 100%">
<el-option label="本人申请" value="1"></el-option>
<el-option v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN, BRANCH_UNION_CHAIRMAN, BRANCH_UNION_OPERATOR')"
label="替他人申请" value="2"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="受补助人">
<template v-if="formData.mode == 2">
<el-select :remote-method="queryRecipients"
@change="userChange" clearable filterable
placeholder="输入工号或者姓名查找" remote
style="width: 100%" v-model="formData.userId">
<el-option :key="o.id"
:label="o.username+'('+o.loginname+')'"
:value="o.id"
v-for="o in subsidizedList"></el-option>
</el-select>
</template>
<template v-else>
<el-input readonly maxlength="100" type="text"
v-model="formData.userName"></el-input>
</template>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-select v-model="formData.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option v-for="item in ['男性','女性']" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生年月">
<el-form-item prop="birthday">
<el-date-picker
clearable
style="width: 100%"
v-model="formData.birthday"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择出生年月">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属单位">
<el-form-item prop="unitName">
<el-input maxlength="50" clearable placeholder="所在单位"
readonly v-model="formData.unitName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input maxlength="50" clearable placeholder="所属工会"
readonly v-model="formData.unionName"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务职称">
<el-form-item prop="officialCapacity">
<el-input maxlength="20" clearable placeholder="请填写职务职称"
v-model="formData.officialCapacity"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="手机号码">
<el-form-item prop="mobile">
<el-input maxlength="11" clearable placeholder="请填写手机号码"
v-model="formData.mobile" maxlength="11"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="身份证号" :span="2">
<el-form-item prop="idCard">
<el-input maxlength="20" clearable placeholder="请填写身份证号"
v-model="formData.idCard" maxlength="18"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="本人月收入">
<el-form-item prop="monthlyIncome">
<el-input-number clearable
style="width: 100%"
v-model="formData.monthlyIncome"
:min="0"
:max="9999999"
placeholder="请填写本人月收入">
</el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="收款账户" :span="2">
<el-form-item prop="bankCardNum">
<el-input maxlength="20" clearable placeholder="请填写华夏银行工资卡号"
v-model="formData.bankCardNum"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="困难类型" :span="3">
<el-form-item prop="subsidyStandards">
<el-select v-model="formData.subsidyStandards" style="width: 100%">
<el-option v-for="(item,index) in subsidyStandards" :key="index" :label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请原因" :span="3">
<el-form-item prop="reason">
<el-input maxlength="500" :autosize="{ minRows: 5, maxRows: 10}"
placeholder="请简述申请原因"
clearable
show-word-limit
v-model="formData.reason"
type="textarea"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="家庭成员经济收入" :span="3">
<el-form-item prop="familyList">
<el-table :data="formData.familyList" border max-height="500" size="mini" style="width: 100%">
<el-table-column type="index" label="序号" width="50" align="center"></el-table-column>
<el-table-column prop="name" label="姓名">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.name'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.name" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="relation" label="年龄(岁)">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.age'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number v-model="row.age" placeholder="请输入年龄" :min="1"
:max="100" :step="1" style="width: 100%" clearable></el-input-number>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="relation" label="关系">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.relation'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.relation" placeholder="请输入关系" clearable></el-input>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="monthlyIncome" label="月收入(元)">
<template slot-scope="{row,$index}">
<el-form-item label-width="0"
:prop="'familyList.'+$index+'.monthlyIncome'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number v-model="row.monthlyIncome" placeholder="请输入月收入"
:min="1" :step="1" style="width: 100%" clearable></el-input-number>
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="150px">
<template slot="header" slot-scope="scope">
<el-button @click="formData.familyList.push({})" icon="el-icon-plus" type="primary"
size="mini">添加
</el-button>
</template>
<template slot-scope="scope">
<el-button :disabled="formData.familyList.length==1"
@click="formData.familyList.splice(scope.$index,1)"
size="mini"
icon="el-icon-delete"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<el-form-item prop="files">
<file-upload :value.sync="formData.files"
upload_mode="drag"
:upload_number="10" upload_result_category="array"
complete_result></file-upload>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-form-item prop="signature">
<pc-signature v-model="formData.sign"></pc-signature>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @save-draft="handleSaveDraft"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: '#difficult_help_apply',
store,
data() {
return {
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
formData: {
id: GetQueryString("businessId"),
mode: '1'
},
subsidyStandards: [
'患重大疾病(癌症)',
'本人家庭(仅指代本人及其配偶、子女共同组成的家庭)人均月收入低于1300元或本人配偶、子女患有重大疾病且自付医疗费用超过家庭年收入的80%',
'患精神类疾病',
'长期病休',
'其他特殊情况'
],
formRules: {
proxyUserName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
proxyLoginName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
sex: [{required: true, message: '必填', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
monthlyIncome: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
idCard: [{required: true, message: '必填', trigger: ['blur', 'change']}],
bankCardNum: [{required: true, message: '必填', trigger: ['blur', 'change']}],
officialCapacity: [{required: true, message: '必填', trigger: ['blur', 'change']}],
subsidyStandards: [{required: true, message: '必填', trigger: ['blur', 'change']}],
reason: [{required: true, message: '必填', trigger: ['blur', 'change']}],
sign: [{required: true, message: '必填', trigger: ['blur', 'change']}]
},
// 替他人申请相关
subsidizedList: []
}
},
methods: {
// 查询受助人
queryRecipients(key) {
this.$axios.get("/platform/difficultHelp/apply/queryRecipients", {
key
}).then(res => {
if (res.code === 0) {
this.subsidizedList = res.data
}
})
},
// 提交
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
const result = this.isValidIdCard(this.formData.idCard)
if (result.status === 0) {
this.$message.warning(result.msg)
return
}
const bankRes = this.validateCard(this.formData.bankCardNum)
if (bankRes.status === 0) {
this.$message.warning(bankRes.msg)
return
}
if (!this.instanceId) {
this.handleApply(val)
} else {
this.handleReApply(val)
}
}
})
},
// 提交申请
handleApply(val) {
this.$confirm("您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios
.post("/flow/common/startInstanceAndExecute", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete"
})
}
})
}
})
})
},
// 重新提交申请
handleReApply(val) {
this.$confirm("您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post("/flow/common/executeTask", {
data: JSON.stringify({
processTaskId: val.taskId,
processInstanceId: val.instanceId,
submitType: val.submitType,
f_data: JSON.stringify(this.formData)
})
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
window.GlobalBroadcastChannel.postMessage({
type: "task-complete"
})
}
})
})
},
// 保存
handleSaveDraft(val) {
this.$confirm("您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post("/flow/common/startInstance", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.parent.postMessage(
{
type: "task-complete"
},
"*"
)
}
})
})
},
// 取消
handleCancel() {
},
findOne(id) {
this.$axios.post('/platform/difficultyHelp/view/findOne', { id }).then(res => {
if (res.code === 0) {
this.formData = res.data
}
})
},
async userChange() {
const user = this.subsidizedList.find(item => item.id === this.formData.userId)
if (user) {
this.$set(this.formData, 'userId', user.id)
this.$set(this.formData, 'userName', user.username)
this.$set(this.formData, 'loginName', user.loginname)
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'unitId', user.unitId)
this.$set(this.formData, 'unitName', user.unitName)
this.$set(this.formData, 'unionId', user.unionId)
this.$set(this.formData, 'unionName', user.unionName)
this.$set(this.formData, 'birthday', user.birthday)
this.$set(this.formData, 'mobile', user.mobile)
} else {
this.$set(this.formData, 'userId', null)
this.$set(this.formData, 'userName', null)
this.$set(this.formData, 'loginName', null)
this.$set(this.formData, 'sex', null)
this.$set(this.formData, 'unitId', null)
this.$set(this.formData, 'unitName', null)
this.$set(this.formData, 'unionId', null)
this.$set(this.formData, 'unionName', null)
this.$set(this.formData, 'birthday', null)
this.$set(this.formData, 'mobile', null)
}
},
// 申请模式
modeChange(val) {
const user = this.$store.state.user
if (val === "1") {
this.$set(this.formData, 'userId', user.id)
this.$set(this.formData, 'userName', user.username)
this.$set(this.formData, 'loginName', user.loginname)
this.$set(this.formData, 'proxyUserId', user.id)
this.$set(this.formData, 'proxyUserName', user.username)
this.$set(this.formData, 'proxyLoginName', user.loginname)
this.$set(this.formData, 'mode', "1")
this.$set(this.formData, 'sex', user.sex)
this.$set(this.formData, 'unitId', user.unit.id)
this.$set(this.formData, 'unitName', user.unit.name)
this.$set(this.formData, 'unionId', user.union.id)
this.$set(this.formData, 'unionName', user.union.name)
this.$set(this.formData, 'monthlyIncome', null)
this.$set(this.formData, 'birthday', user.birthday)
this.$set(this.formData, 'mobile', user.mobile)
this.$set(this.formData, 'homeAddress', user.homeAddress)
this.$set(this.formData, 'subsidyStandards', null)
this.$set(this.formData, 'reason', null)
this.$set(this.formData, 'remarks', null)
this.$set(this.formData, 'familyList', [])
this.$set(this.formData, 'files', [])
this.queryRecipients(user.loginname)
} else {
this.formData = {}
this.$set(this.formData, 'proxyUserId', user.id)
this.$set(this.formData, 'proxyUserName', user.username)
this.$set(this.formData, 'proxyLoginName', user.loginname)
this.$set(this.formData, 'mode', "2")
this.$set(this.formData, 'familyList', [])
this.$set(this.formData, 'files', [])
}
},
/**
* 检验身份证号
* @param idCard
* @returns {{status: number, msg: string}}
*/
isValidIdCard(idCard) {
// 校验18位身份证号
const format18 = /^(((([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4})|(([9](([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2])))\d{3}))(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;
// 校验15位身份证号
const format15 = /^\d{15}$/;
// 校验外国人永久居留身份证号
const format15Foreign = /^[a-zA-Z]{3}[0-9]{4}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{2}$/;
// 校验格式
if (!(format18.test(idCard) || format15.test(idCard) || format15Foreign.test(idCard))) {
return { status: 0, msg: '身份证号码格式不正确' };
}
// 校验出生日期
let year, month, day;
if (idCard.length === 18) {
year = idCard.substr(6, 4);
month = idCard.substr(10, 2);
day = idCard.substr(12, 2);
} else if (idCard.length === 15) {
year = '19' + idCard.substr(6, 2);
month = idCard.substr(8, 2);
day = idCard.substr(10, 2);
} else {
return { status: 0, msg: '身份证号码格式不正确' };
}
const date = new Date(year, month - 1, day);
if (date.getFullYear() !== parseInt(year, 10) || date.getMonth() + 1 !== parseInt(month, 10) || date.getDate() !== parseInt(day, 10)) {
return { status: 0, msg: '身份证出生日期不正确' };
}
// 校验18位身份证号的校验码
if (idCard.length === 18) {
const coefficients = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const checkCodeMap = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
for (let i = 0; i < 17; i++) {
sum += parseInt(idCard.charAt(i), 10) * coefficients[i];
}
const checkCode = checkCodeMap[sum % 11];
if (checkCode.toUpperCase() !== idCard.charAt(17).toUpperCase()) {
return { status: 0, msg: '身份证校验码不正确' };
}
}
return { status: 1, msg: '校验通过' };
},
/**
* 校验银行卡号
* @param bankCardNum
* @returns {{status: number, msg: string}}
*/
validateCard(bankCardNum) {
// 移除所有空格
bankCardNum = bankCardNum.replace(/\s+/g, '');
// 检查格式
const cardRegex = /^\d{13,19}$/;
if (!cardRegex.test(bankCardNum)) {
return { status: 0, msg: "银行卡号格式不正确,请输入13到19位数字。" };
}
// 检查Luhn算法
if (!/^\d+$/.test(bankCardNum)) {
return { status: 0, msg: "无效的卡号,请检查后再试。" };
}
let sum = 0;
let shouldDouble = false;
for (let i = bankCardNum.length - 1; i >= 0; i--) {
let digit = parseInt(bankCardNum.charAt(i));
if (shouldDouble) {
digit *= 2;
if (digit > 9) {
digit -= 9;
}
}
sum += digit;
shouldDouble = !shouldDouble;
}
if ((sum % 10) !== 0) {
return { status: 0, msg: "无效的卡号,请检查后再试。" };
}
return { status: 200, msg: "卡号有效。" };
}
},
async created() {
if (this.businessId) {
this.findOne(this.businessId)
} else {
this.modeChange("1")
}
}
})
</script>
@@ -0,0 +1,177 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable
filterable
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="所属单位"
style="width: 100%;" v-model="pageForm.unitId">
<el-option :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="申请记录">
<el-button size="small" type="primary" @click="onApply">帮扶申请</el-button>
</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="60px"></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=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="220" fixed="right">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button v-if="row.taskKey === 'startTask'" @click="onEdit(row)" size="mini" type="primary">
编辑
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">
撤回
</el-button>
<el-button @click="onDelete(row.id)" size="mini" type="danger">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY")
},
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "taskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
unions: [],
units: []
}
},
methods: {
onApply() {
window.open("/flow/common/approval/form?defineKey=KNBF")
},
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + (row.instanceId || "") + "&businessId=" + row.id + "&defineKey=KNBF")
},
onEdit(row) {
window.open(
"/flow/common/approval/form?taskId=" +
(row.taskId || "") +
"&instanceId=" +
(row.instanceId || "") +
"&businessId=" +
row.id +
"&defineKey=HYRH"
)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", { taskId: row.startTaskId }).then((resp) => {
this.$message.success(resp.msg)
this.pageData()
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/difficultHelp/apply/onDelete", { id }).then((res) => {
if (res.code === 0) {
this.doSearch()
this.$message.success(res.msg)
}
})
})
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,45 @@
<div id="difficult_help_branch_union_approval_form">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: "#difficult_help_branch_union_approval_form",
data() {
return {
businessId: GetQueryString("businessId"),
formData: {
tf_opinion: ""
},
}
},
methods: {
handleTaskAction(val) {
console.log(val)
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...val,
...this.formData
})
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete",
payload: val
})
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,141 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable
filterable
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="所属单位"
style="width: 100%;" v-model="pageForm.unitId">
<el-option :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审批列表">
<el-radio-group @change="doSearch" 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>
</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="60px"></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=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button v-if="row.canRevoke" @click="openRevoke(row)" size="mini" type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
audit: false
},
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "taskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
unions: [],
units: []
}
},
methods: {
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + (row.instanceId || "") + "&businessId=" + row.id + "&defineKey=KNBF")
},
openApproval(row) {
window.open("/flow/common/approval/form?taskId=" + row.taskId + "&instanceId=" + row.instanceId + "&businessId=" + row.businessNo)
},
openRevoke(row) {
console.log(row)
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,49 @@
<div id="difficult_help_school_union_approval_form">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审核金额" prop="tf_money" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number placeholder="请输入金额" v-model="formData.tf_money"></el-input-number>
</el-form-item>
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: "#difficult_help_school_union_approval_form",
data() {
return {
businessId: GetQueryString("businessId"),
formData: {
tf_money: 0,
tf_opinion: "",
},
}
},
methods: {
handleTaskAction(val) {
console.log(val)
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...val,
...this.formData
})
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete",
payload: val
})
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,141 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="受助人">
<el-input placeholder="请输入受助人工号或姓名" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable
filterable
placeholder="所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select clearable filterable placeholder="所属单位"
style="width: 100%;" v-model="pageForm.unitId">
<el-option :label="item.name" :value="item.id"
v-for="item in units"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool :app="this" label="审批列表">
<el-radio-group @change="doSearch" 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>
</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="60px"></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=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button v-if="row.canRevoke" @click="openRevoke(row)" size="mini" type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
audit: false
},
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "subsidyStandards", label: "困难类型", sortable: true },
{ prop: "applyTime", label: "申请时间", sortable: true },
{ prop: "taskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
unions: [],
units: []
}
},
methods: {
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + (row.instanceId || "") + "&businessId=" + row.id + "&defineKey=KNBF")
},
openApproval(row) {
window.open("/flow/common/approval/form?taskId=" + row.taskId + "&instanceId=" + row.instanceId + "&businessId=" + row.businessNo)
},
openRevoke(row) {
console.log(row)
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
} else {
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
},
async created() {
this.pageData()
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,126 @@
<div id="difficult_help_view">
<el-descriptions :column="3" border>
<el-descriptions-item label="填写人姓名">{{ viewData.proxyUserName }}</el-descriptions-item>
<el-descriptions-item label="填写人工号">{{ viewData.proxyLoginName }}</el-descriptions-item>
<el-descriptions-item label="申请模式">{{ viewData.mode == 1 ? '本人申请' : '替他人申请' }}</el-descriptions-item>
<el-descriptions-item label="受助人">{{ viewData.userName + '(' + viewData.loginName + ')' }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{ viewData.birthday }}</el-descriptions-item>
<el-descriptions-item label="所属工会">{{ viewData.unionName }}</el-descriptions-item>
<el-descriptions-item label="所属单位">{{ viewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="职务职称">{{ viewData.officialCapacity }}</el-descriptions-item>
<el-descriptions-item label="手机号码">{{ viewData.mobile }}</el-descriptions-item>
<el-descriptions-item label="身份证号" :span="2">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="月收入">{{ viewData.monthlyIncome }}</el-descriptions-item>
<el-descriptions-item label="收款账户" :span="2">{{ viewData.bankCardNum }}</el-descriptions-item>
<el-descriptions-item label="困难类型" :span="3">{{ viewData.subsidyStandards }}</el-descriptions-item>
<el-descriptions-item label="申请原因" :span="3">{{ viewData.reason }}</el-descriptions-item>
<el-descriptions-item label="家庭成员经济收入" :span="3">
<el-table :data="viewData.familyList" border style="width: 92%">
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="姓名" prop="name"></el-table-column>
<el-table-column prop="relation" label="年龄(岁)"></el-table-column>
<el-table-column prop="relation" label="关系"></el-table-column>
<el-table-column prop="monthlyIncome" label="月收入(元)"></el-table-column>
</el-table>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<file-preview v-if="viewData.files && viewData.files.length > 0" :files="viewData.files" complete_result></file-preview>
<span v-else>暂无</span>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image v-if="viewData.sign"
:src="viewData.sign"
class="signature-image"></el-image>
<span v-else>暂无</span>
</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName }}({{task.ext.initiatorAccount}})</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<template v-if="task.taskFormData.tf_money">
<el-descriptions-item label="审批金额">{{ task.tf_money }}</el-descriptions-item>
</template>
<el-descriptions-item label="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">{{ task.taskFormData.opinion }}</el-descriptions-item>
</el-descriptions>
</div>
</template>
</div>
<script>
new Vue({
el: "#difficult_help_view",
data() {
return {
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
viewData: {},
doneTasks: []
}
},
methods: {
info() {
this.$axios.post("/platform/difficultHelp/view/findOne", { id: this.businessId }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", { instanceId: this.instance})
}
},
created() {
this.info()
this.getDoneTasks()
}
})
</script>
<style>
.task-panel {
background: white;
border-radius: 4px;
overflow: hidden;
}
.task-panel-header {
background: rgb(250, 250, 250);
border: 1px solid rgb(228, 231, 237);
border-bottom: none;
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
.el-descriptions-item__label.is-bordered-label {
width: 15%;
}
</style>
@@ -0,0 +1,45 @@
<div id="member_apply_branch_union_approval_form">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: "#member_apply_branch_union_approval_form",
data() {
return {
businessId: GetQueryString("businessId"),
formData: {
tf_opinion: ""
},
}
},
methods: {
handleTaskAction(val) {
console.log(val)
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...val,
...this.formData
})
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete",
payload: val
})
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,126 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" 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>
</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=='sign'">
<el-image v-if="row.sign" :src="row.sign" style="height: 60px"></el-image>
<el-tag type="warning" v-else>暂无</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button v-if="row.canRevoke" @click="openRevoke(row)" size="mini" type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "sign", label: "签字" },
{ prop: "taskName", label: "当前节点" },
{ prop: "instanceState", label: "流程状态" }
],
}
},
components: {
'common-query': COMMON_QUERY,
},
methods: {
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + (row.instanceId || "") + "&businessId=" + row.id + "&defineKey=HYRH")
},
openApproval(row) {
window.open("/flow/common/approval/form?taskId=" + row.taskId + "&instanceId=" + row.instanceId + "&businessId=" + row.businessNo)
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
// this.$axios.post("/platform/member/apply/branchUnionAudit/revoke", { taskId }).then((res) => {
// if (res.code === 0) {
// this.$message.success(res.msg)
// this.doSearch()
// } else {
// this.$message.warning(res.msg)
// }
// })
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -1,233 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<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>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" 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>
</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="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openChangeView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</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-audit-change-info ref="memberAuditChangeInfoRef"></member-audit-change-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新申请</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝申请</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意申请</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
units: [],
showApprovalForm: false
}
},
components: {
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openChangeView(row) {
this.$refs.guava.public(() => {
this.showApprovalForm = false
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
created() {
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,85 @@
const COMMON_QUERY = {
template: /*language=HTML*/ `
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<template v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])">
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<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>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</template>
</search>
`,
store,
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", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else if (this.$auth.hasRole("BRANCH_UNION_CHAIRMAN")) {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
}
},
async created() {
this.initData()
}
}
@@ -0,0 +1,127 @@
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="家庭主要成员" :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">
<div v-if="viewData.vita" class="text-left" v-html="viewData.vita"></div>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
<el-descriptions-item label="签字信息" :span="3">
<el-image v-if="viewData.sign" :src="viewData.sign"
class="signature-image"></el-image>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="viewData.nodeTasks && viewData.nodeTasks.length > 0" label="审核信息" name="audit">
<div>
<div v-for="nodeTask in viewData.nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id"
style="margin-bottom: 10px">
<el-descriptions-item label="审核人">
{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName}}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝
</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">
{{ task.extVariable.approvalOpinion }}
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('SYSADMIN') && task.extVariable.approvalRemark">
<el-descriptions-item label="审核说明" :span="3">
{{ task.extVariable.approvalRemark }}
</el-descriptions-item>
</template>
<el-descriptions-item label="签字" :span="3">
<el-image :src="task.extVariable.approvalSignature"
v-if="task.extVariable && task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
`,
data() {
return{
activeName: "basicInfo",
viewData: {
nodeTasks: {}
}
}
},
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 = []
}
}
}
}
}
@@ -5,40 +5,7 @@ layout("/layouts/platform.html"){
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<template v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])">
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<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>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</template>
</search>
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
@@ -67,6 +34,11 @@ layout("/layouts/platform.html"){
<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=='sign'">
<el-image v-if="row.sign" :src="row.sign"
class="signature-image"></el-image>
<el-tag type="warning" v-else>暂无</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template slot-scope="{row}">
@@ -98,18 +70,14 @@ layout("/layouts/platform.html"){
</template>
<template #view>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-audit-change-info ref="memberAuditChangeInfoRef"></member-audit-change-info>
<member-apply-audit-info ref="memberApplyAuditInfoRef"></member-apply-audit-info>
</template>
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
<!--#include("../common/commonQuery.js"){}#-->
<!--#include("../common/memberApplyAuditInfo.js"){}#-->
new Vue({
el: "#app",
@@ -125,6 +93,7 @@ layout("/layouts/platform.html"){
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "sign", label: "签字" },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
@@ -132,75 +101,53 @@ layout("/layouts/platform.html"){
}
},
components: {
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
'common-query': COMMON_QUERY,
'member-apply-audit-info': MEMBER_APPLY_AUDIT_INFO
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.memberApplyAuditInfoRef.onOpen(row.userId)
})
},
openRevoke(row) {
this.$confirm("您确定要撤销申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/member/apply/mine/revokeApply", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
doDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/delete", { id: row.id }).then((resp) => {
this.$axios.post("/platform/member/apply/mine/delete", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openRevoke(row) {
this.$confirm("您确定要撤销申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/revokeApply", { id: row.id }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openChangeView(row) {
this.$refs.guava.public(() => {
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else if (this.$auth.hasRole("BRANCH_UNION_CHAIRMAN")) {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
debugger
this.initData()
this.pageData()
}
})
</script>
@@ -0,0 +1,84 @@
<div id="member_apply_school_union_approval_form">
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="110px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="分配工会关系" prop="tf_allocation_unionId"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-select clearable filterable placeholder="请选择工会" style="width: 100%;"
@change="assignmentUnionName"
v-model="formData.tf_allocation_unionId">
<el-option :key="item.id" :label="item.name" :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="tf_self_unionName">
<el-input v-model="formData.tf_self_unionName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<!-- <el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">-->
<!-- <pc-signature v-model="formData.approvalSignature"></pc-signature>-->
<!-- </el-form-item>-->
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction"
@cancel="handleCancel">
</snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: "#member_apply_school_union_approval_form",
store,
data() {
return {
businessId: GetQueryString("businessId"),
formData: {
tf_opinion: "",
tf_self_unionName: this.$store.state.user.union.name
},
unions: []
}
},
methods: {
handleTaskAction(val) {
console.log(val)
const data = {
...val,
...this.formData
}
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify(data)
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete",
payload: val
})
}
})
},
handleCancel(val) {
console.log(val)
},
// 分配工会名称
assignmentUnionName(val) {
const union = this.unions.find(item => item.id === val)
this.$set(this.formData, "tf_allocation_unionName", union.name)
},
},
created() {
this.$businessTool.listUnion().then(data => {
this.unions = data
})
}
})
</script>
@@ -0,0 +1,125 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" 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>
</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=='sign'">
<el-image v-if="row.sign" :src="row.sign" style="height: 60px"></el-image>
<el-tag type="warning" v-else>暂无</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button v-if="row.canRevoke" @click="openRevoke(row)" size="mini" type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "sign", label: "签字" },
{ prop: "taskName", label: "当前节点" },
{ prop: "instanceState", label: "流程状态" }
],
}
},
components: {
'common-query': COMMON_QUERY,
},
methods: {
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + (row.instanceId || "") + "&businessId=" + row.id + "&defineKey=HYRH")
},
openApproval(row) {
window.open("/flow/common/approval/form?taskId=" + row.taskId + "&instanceId=" + row.instanceId + "&businessId=" + row.businessNo)
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/platform/member/apply/schoolUnionAudit/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -1,236 +0,0 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select
@change="flushUnits"
@clear="flushUnits"
clearable
filterable
placeholder="所属工会"
style="width: 100%"
v-model="pageForm.unionId"
>
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<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>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch" code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch" code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch" code="PERSON_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-radio-group @change="doSearch" 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>
</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="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openChangeView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<!--<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>-->
</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-audit-change-info ref="memberAuditChangeInfoRef"></member-audit-change-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="审核说明" prop="approvalRemark">
<el-input v-model="formData.approvalRemark" type="textarea" :rows="4" placeholder="请输入审核说明"></el-input>
</el-form-item>
<el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.approvalSignature"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回重新申请</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝申请</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意申请</el-button>
</el-row>
</div>
</template>
</guava>
</div>
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/audit/memberAuditChangeInfo.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
units: [],
showApprovalForm: false
}
},
components: {
"member-info": MEMBER_INFO,
"member-audit-change-info": MEMBER_AUDIT_CHANGE_INFO
},
methods: {
openView(row) {
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openChangeView(row) {
this.$refs.guava.public(() => {
this.showApprovalForm = false
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
openApproval(row) {
this.$refs.guava.public(() => {
this.showApprovalForm = true
this.formData = row.approvalParam
this.$refs.memberAuditChangeInfoRef.onOpen({ recordId: row.id, userId: row.userId })
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
}
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
created() {
this.initData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,466 @@
<div id="member_apply">
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="" class="flow-task-form">
<el-descriptions :column="3" border>
<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="POLITICAL_STATUS"></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"
disabled 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 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" disabled 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 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="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="入会意愿" :span="3">
<el-form-item prop="isVoluntary">
<el-checkbox
size="medium"
style="width: 95%; color: #F56C6C; display: flex; align-items: center;"
v-model="formData.isVoluntary">
<div>
<span style="flex: 1; word-wrap: break-word; word-break: break-all; white-space: normal;">
我自愿申请加入学校工会,并委托学校按规定代为扣缴工会会员会费。
</span>
</div>
<div>
<span style="flex: 1; word-wrap: break-word; word-break: break-all; white-space: normal;">
我将严格遵守工会章程,认真执行工会决议,积极参与工会活动,主动融入“学校健康幸福家”建设,为营造温暖、和谐、奋进的校园氛围贡献力量,以实际行动助力学校各项事业发展。
</span>
</div>
</el-checkbox>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-form-item prop="sign">
<pc-signature v-model="formData.sign"></pc-signature>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @save-draft="handleSaveDraft"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: "#member_apply",
store,
data() {
return {
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
units: [],
formData: {
families: []
},
formRules: {
username: [{required: false, message: "必填", trigger: ["change", "blur"]}],
sex: [{required: false, message: "必填", trigger: ["change", "blur"]}],
isVoluntary: [{required: true, message: "必填", trigger: ["change", "blur"]}],
sign: [{required: true, 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"]
}
]
},
}
},
methods: {
// 提交
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
if (!this.instanceId) {
this.handleApply(val)
} else {
this.handleReApply(val)
}
}
})
},
// 提交申请
handleApply(val) {
this.$confirm("您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios
.post("/flow/common/startInstanceAndExecute", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.GlobalBroadcastChannel.postMessage({
type: "task-complete"
})
}
})
}
})
})
},
// 重新提交申请
handleReApply(val) {
this.$confirm("您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post("/flow/common/executeTask", {
data: JSON.stringify({
processTaskId: val.taskId,
processInstanceId: val.instanceId,
submitType: val.submitType,
f_data: JSON.stringify(this.formData)
})
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
window.GlobalBroadcastChannel.postMessage({
type: "task-complete"
})
}
})
})
},
// 保存
handleSaveDraft(val) {
this.$confirm("您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post("/flow/common/startInstance", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.parent.postMessage(
{
type: "task-complete"
},
"*"
)
}
})
})
},
// 取消
handleCancel() {
},
async validateApply() {
if (this.formData.id) {
return
}
// const resp = await $.post('/platform/member/apply/submit/validateApply')
// if (resp.code === 0 && resp.data > 0) {
// this.$confirm("您有其他入会流程正在进行中,请勿重复申请,如需查看详情,可前往我的申请界面,是否前往?", "提示", { type: "warning" })
// .then(() => {
// this.member = true
// this.$store.dispatch("pjaxRoute", "/platform/member/apply/mine")
// })
// .catch(() => {
// this.member = true
// })
// }
},
async init() {
let user
const resp = await $.post('/platform/member/apply/submit/getSelfUserInfo')
if (resp.code === 0) {
if (!resp.data) {
user = this.$store.state.user
} else {
user = resp.data
}
} else {
user = this.$store.state.user
}
this.member = user.member
if (this.id) {
this.$axios.post("/platform/member/apply/submit/findApplyById", { id: this.id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
}
})
} else {
const {
id,
username,
loginname,
sex,
nation,
birthday,
political,
education,
academicDegree,
position,
unitId,
unitName,
unit,
unionId,
unionName,
union,
campus,
userState,
personType,
idCard,
mobile,
email,
families,
personalData
} = 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 : unitName)
this.$set(this.formData, "unitId", unit ? unit.id : unitId)
this.$set(this.formData, "unionName", union ? union.name : unionName)
this.$set(this.formData, "unionId", union ? union.id : unionId)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "personalData", personalData)
}
},
},
async created() {
this.init()
this.units = await this.$businessTool.listUnit()
await this.validateApply()
}
})
</script>
@@ -1,271 +1,151 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">入会申请</h3>
<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="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="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="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="political">
<dict-select
style="width: 100%"
placeholder="请选择政治面貌"
v-model="formData.political"
code="POLITICAL_STATUS"
></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="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" readonly placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务">
<el-form-item prop="governmentPosition">
<el-input v-model="formData.governmentPosition" 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" style="width: 100%"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="聘用方式">
<el-form-item prop="preparedBy">
<dict-select v-model="formData.preparedBy" code="PREPARED_BY" 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 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></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="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row v-if="!this.$store.state.user.member" justify="end" type="flex" class="mt10">
<!-- <el-row justify="end" type="flex" class="mt10">-->
<el-button v-if="formData.id" @click="$store.dispatch('pjaxRoute', '/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 id="app" v-cloak>
<el-card shadow="never">
<common-query ref="commonQueryRef" @search="search"></common-query>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表">
<el-button size="small" type="primary" @click="onApply">申请入会</el-button>
</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=='sign'">
<el-image v-if="row.sign" :src="row.sign" style="height: 60px"></el-image>
<el-tag type="warning" v-else>暂无</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="220" fixed="right">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button v-if="row.taskKey === 'startTask'" @click="onEdit(row)" size="mini" type="primary">
编辑
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">
撤回
</el-button>
<el-button @click="onDelete(row.id)" size="mini" type="danger">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<script>
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
id: GetQueryString("id"),
formDisabled: false,
units: [],
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: {
init() {
if (this.id) {
this.$axios.post(loc() + "/findApplyById", { id: this.id }).then((res) => {
if (res.code === 0) {
this.formData = res.data
}
})
} else {
const {
id,
username,
loginname,
sex,
idCard,
nation,
political,
education,
governmentPosition,
mobile,
email,
wantJoinLoveMutualAidAssociation,
families,
personalData,
unit,
union
} = this.$store.state.user
this.$set(this.formData, "userId", id)
this.$set(this.formData, "username", username)
this.$set(this.formData, "loginname", loginname)
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, "education", education)
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.name : null)
this.$set(this.formData, "unionId", union ? union.id : null)
this.$set(this.formData, "governmentPosition", governmentPosition)
this.$set(this.formData, "mobile", mobile)
this.$set(this.formData, "email", email)
this.$set(this.formData, "wantJoinLoveMutualAidAssociation", wantJoinLoveMutualAidAssociation)
this.$set(this.formData, "families", families ? families : [])
this.$set(this.formData, "personalData", personalData)
}
},
doSave() {
this.$confirm("保存后可在我的申请里面再次编辑,您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
this.$axios.post(loc() + "/doSave", this.formData).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$store.dispatch("pjaxRoute", "/platform/member/apply/mine")
}
})
})
.catch()
},
doSubmit() {
this.$confirm("您确定要提交申请吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post(loc() + "/doSubmit", {
...this.formData
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$store.dispatch("pjaxRoute", "/platform/member/apply/mine")
}
})
})
.catch()
}
},
async created() {
this.init()
this.units = await this.$businessTool.listUnit()
}
})
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "sign", label: "签字" },
{ prop: "taskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
unions: [],
units: []
}
},
components: {
'common-query': COMMON_QUERY,
},
methods: {
onApply() {
window.open("/flow/common/approval/form?defineKey=HYRH")
},
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + (row.instanceId || "") + "&businessId=" + row.id + "&defineKey=HYRH")
},
onEdit(row) {
window.open(
"/flow/common/approval/form?taskId=" +
(row.taskId || "") +
"&instanceId=" +
(row.instanceId || "") +
"&businessId=" +
row.id +
"&defineKey=HYRH"
)
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", { taskId: row.startTaskId }).then((resp) => {
this.$message.success(resp.msg)
this.pageData()
})
})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/member/apply/submit/onDelete", { id }).then((res) => {
if (res.code === 0) {
this.doSearch()
this.$message.success(res.msg)
}
})
})
},
search(pageForm){
if (pageForm) {
this.pageForm = {...this.pageForm, ...pageForm}
}
this.doSearch()
},
},
created() {
this.pageData()
}
})
</script>
<!--#
@@ -0,0 +1,144 @@
<div id="member_apply_view">
<el-descriptions :column="3" border>
<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="家庭主要成员" :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">
<div v-if="viewData.personalData" class="text-left" v-html="viewData.personalData"></div>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
<el-descriptions-item label="签字信息" :span="3">
<el-image v-if="viewData.sign" :src="viewData.sign"
class="signature-image"></el-image>
<el-tag type="warning" v-else>暂无</el-tag>
</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName }}({{task.ext.initiatorAccount}})</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<template v-if="task.taskFormData.tf_allocation_unionId">
<el-descriptions-item label="分配工会" :span="1.5">
{{ task.taskFormData.tf_allocation_unionName }}
</el-descriptions-item>
<el-descriptions-item label="分配前工会" :span="1.5">
{{ task.taskFormData.tf_self_unionName }}
</el-descriptions-item>
</template>
<el-descriptions-item label="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">{{ task.taskFormData.opinion }}</el-descriptions-item>
</el-descriptions>
</div>
</template>
</div>
<script>
new Vue({
el: "#member_apply_view",
store,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
viewData: {},
doneTasks: []
}
},
methods: {
info() {
this.$axios.post("/platform/member/apply/view/findMemberApplyRecord", { id: this.businessId }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", { instanceId: this.instanceId }).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
}
},
created() {
this.info()
this.getDoneTasks()
}
})
</script>
<style>
.task-panel {
background: white;
border-radius: 4px;
overflow: hidden;
}
.task-panel-header {
background: rgb(250, 250, 250);
border: 1px solid rgb(228, 231, 237);
border-bottom: none;
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
.el-descriptions-item__label.is-bordered-label {
width: 15%;
}
</style>
@@ -0,0 +1,44 @@
<div id="member_change_branch_union_approval">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: "#member_change_branch_union_approval",
store,
data() {
return {
formData: {
tf_opinion: ""
},
}
},
methods: {
handleTaskAction(val) {
const data = {
...val,
...this.formData
}
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify(data)
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.parent.postMessage({
type: "task-complete"
}, "*")
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,214 @@
<!--#
layout("/layouts/platform.html"){
#-->
<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">
<table-tool label="审核列表">
<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>
</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>
<template scope="{row}" v-else-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger">
撤回
</el-button>
</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-change-audit-info ref="memberChangeAuditInfoRef"></member-change-audit-info>-->
<!-- <div v-if="showApprovalForm">-->
<!-- <el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">-->
<!-- <el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">-->
<!-- <user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">-->
<!-- <pc-signature v-model="formData.approvalSignature"></pc-signature>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<!-- <el-row type="flex" justify="end">-->
<!-- <el-button plain @click="$refs.guava.index()">取消</el-button>-->
<!-- <el-button type="danger" @click="doApproval('BACK')">退回重新填写</el-button>-->
<!-- <el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>-->
<!-- <el-button type="primary" @click="doApproval('PASS')">同意</el-button>-->
<!-- </el-row>-->
<!-- </div>-->
<!-- </template>-->
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
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: "taskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
changeTypeData: [],
}
},
components: {
'common-query': COMMON_QUERY,
},
methods: {
openView(row){
this.$refs.guava.public(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openUserView(row){
this.$refs.guava.view(() => {
this.$refs.memberChangeAuditInfoRef.onOpen(row.userId)
})
},
openApproval(row) {
window.open("/flow/common/approval/form?taskId=" + row.taskId + "&instanceId=" + row.instanceId + "&businessId=" + row.businessNo)
// this.$refs.guava.public(() => {
// this.showApprovalForm = true
// this.formData = row.approvalParam
// this.$refs.memberChangeAuditInfoRef.onOpen(data.id)
// })
},
doApproval(approvalType) {
let msg = '确定要同意此条申请吗?'
if (approvalType === 'REJECT') {
msg = '确定要拒绝此教工的入会申请吗?'
} else if (approvalType === 'BACK') {
msg = '确定要退回此条申请吗?'
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/platform/member/change/branchUnion/audit/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
} else {
this.$message.error(res.msg)
}
})
}
})
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/member/change/branchUnion/audit/revoke", { taskId }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
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.name === v).changeTypeName
})
.join(",")
}
return null
},
},
async created() {
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
this.pageData()
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,87 @@
const COMMON_QUERY = {
template: /*language=HTML*/ `
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<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>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="人事编制">
<dict-select v-model="pageForm.preparedBy" placeholder="人事编制" @change="doSearch"
code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" placeholder="人员类型" @change="doSearch"
code="MEMBER_CHANGE_TYPE"></dict-select>
</search-item>
</search>
`,
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, SCHOOL_UNION_ADMIN, SCHOOL_UNION_MEMBER_ADMIN")) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
},
async flushUnits(){
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
async created() {
this.initData()
}
}
@@ -0,0 +1,109 @@
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 label="进校时间">{{ viewData.schoolTime }}</el-descriptions-item>
<template v-if="viewData.userState == '退休'">
<el-descriptions-item label="退休日期">{{ viewData.retireDate ? moment(viewData.retireDate).format("YYYY-MM-DD") : '暂无' }}</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">{{ moment(viewData.welfareStopDate).format("YYYY-MM-DD") }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<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,519 @@
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, SCHOOL_UNION_ADMIN, SCHOOL_UNION_MEMBER_ADMIN')">
<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.name" :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"
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></el-descriptions-item>
<template v-if="formData.userState == '退休'">
<el-descriptions-item label="退休日期">
<el-form-item prop="retireDate">
<el-date-picker v-model="formData.retireDate"
type="date"
placeholder="请选择出生日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">
<el-form-item prop="welfareStopDate">
<el-date-picker v-model="formData.welfareStopDate"
type="date"
:disabled="isView"
placeholder="请选择福利享受截止日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<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>-->
<template v-if="formData.loginname == $store.state.user.loginname">
<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="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
</template>
</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],
store,
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: {
getUnionName(val){
const data = this.units.find(v => v.id === val)
this.$set(this.formData, 'unionName', data ? data.unionname : '')
},
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 = this.$store.state.user
}
this.getFormDataValue(this.id)
this.allowChangeFields = await this.$businessTool.getDictOptions("ALLOW_CHANGE_FIELDS")
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_MEMBER_ADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit()
this.unions = await this.$businessTool.listUnion()
} else {
this.units = await this.$businessTool.listUnit(this.user.union.id)
}
},
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,
personalData
} = 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.name : 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, "personalData", personalData)
}
}
},
created(){
this.init()
}
}
@@ -0,0 +1,144 @@
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.schoolTime }}</el-descriptions-item>
<template v-if="viewData.userState == '退休'">
<el-descriptions-item label="退休日期">{{ viewData.retireDate ? moment(viewData.retireDate).format("YYYY-MM-DD") : '暂无' }}</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">{{ moment(viewData.welfareStopDate).format("YYYY-MM-DD") }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<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 v-if="viewData.nodeTasks && viewData.nodeTasks.length > 0" label="审核信息" name="audit">
<div>
<div v-for="nodeTask in viewData.nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id"
style="margin-bottom: 10px">
<el-descriptions-item label="审核人">
{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName}}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝
</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">
{{ task.extVariable.approvalOpinion }}
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('SYSADMIN') && task.extVariable.approvalRemark">
<el-descriptions-item label="审核说明" :span="3">
{{ task.extVariable.approvalRemark }}
</el-descriptions-item>
</template>
<el-descriptions-item label="签字" :span="3">
<el-image :src="task.extVariable.approvalSignature"
v-if="task.extVariable && task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
`,
mixins: [initTableMixins],
data(){
return{
activeName: "basicInfo",
viewData: {
changeInfos: [],
nodeTasks: {},
}
}
},
methods: {
async onOpen(id){
const resp = await $.post('/platform/member/change/mine/findMemberChangeRecord', {id})
if (resp.code === 0) {
this.viewData = resp.data
}
}
}
}
@@ -68,7 +68,6 @@ layout("/layouts/platform.html"){
code="UserType"></dict-select>
</div>-->
<el-button @click="addMember" type="primary" size="small">新增会员</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
@@ -150,15 +149,11 @@ layout("/layouts/platform.html"){
</template>
<template #view>
<member-info :id="id"></member-info>
</template>
<template #edit>
<member-apply :admin-operate="true"></member-apply>
<member-info ref="memberInfoRef"></member-info>
</template>
<template #public>
<member-change :id="id" :url="url" ref="memberChangeRef"></member-change>
<member-change ref="memberChangeRef" @do-back="$refs.guava.index()" @do-submit="doSubmit"></member-change>
</template>
</guava>
</div>
@@ -166,8 +161,7 @@ layout("/layouts/platform.html"){
<script>
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../../common/apply/memberApply.js"){}#-->
<!--#include("../../common/change/memberChange.js"){}#-->
<!--#include("../common/memberChange.js"){}#-->
new Vue({
el: "#app",
@@ -203,10 +197,10 @@ layout("/layouts/platform.html"){
}]
},
pageForm: {
unionId: null,
unitId: null,
sex: null,
searchKeyword: null,
unionId: "",
unitId: "",
sex: "",
searchKeyword: "",
changed: 2,
isMember: 1,
changeTypes: [],
@@ -229,7 +223,6 @@ layout("/layouts/platform.html"){
},
components: {
"member-info": MEMBER_INFO,
"member-apply": MEMBER_APPLY,
"member-change": MEMBER_CHANGE,
},
methods: {
@@ -242,17 +235,17 @@ layout("/layouts/platform.html"){
}
},
openChange(id) {
this.id = null
this.id = id
this.$refs.guava.public()
this.$nextTick(() => {
this.$refs.memberChangeRef.findOne(id)
this.$refs.guava.public(() => {
this.$refs.memberChangeRef.init(id)
})
},
doSubmit(){
},
openView(id) {
this.id = null
this.id = id
this.$refs.guava.view()
this.$refs.guava.view(() => {
this.$refs.memberInfoRef.onOpen(id)
})
},
addMember() {
this.$refs.guava.edit()
@@ -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 this.$businessTool.getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
}
#-->
@@ -37,74 +37,85 @@ layout("/layouts/platform.html"){
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="变更列表"></table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
class="vi-table" 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"
align="center" 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.id)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="异动信息">
<el-table-column align="center" header-align="center" label="更新时间"
min-width="145px" prop="changeTime"
show-overflow-tooltip sortable>
</el-table-column>
<el-table-column align="center" header-align="center" label="异动类型"
prop="changeType" show-overflow-tooltip sortable>
<template scope="{row}">
<!--<span style="color: #0e78c5;cursor: pointer" @click="openUserChangeInfo(row)">
{{getChangeTypes(row.changeTypes)}}
</span>-->
</template>
</el-table-column>
</el-table-column>
<!--<el-table-column align="center" header-align="center" label="操作"
prop="userOnline"
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 :command="{type:'view',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 :id="userId"></member-info>
<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/info/memberInfo.js"){}#-->
<!--#include("../../common/info/memberInfo.js"){}#-->
<!--#include("../common/memberChangeAuditInfo.js"){}#-->
new Vue({
el:'#app',
store,
mixins: [initTableMixins],
components: {
"member-info": MEMBER_INFO,
},
data(){
return{
userId:'',
@@ -119,46 +130,76 @@ layout("/layouts/platform.html"){
{prop: 'unitName', label: '所属单位', sortable: true},
],
unions: [],
units: []
units: [],
changeTypeData: [],
}
},
methods:{
getChangeTypes(changeTypes) {
if (changeTypes) {
const c = JSON.parse(changeTypes)
return this.userChangeTypeOptions.filter(v => c.includes(v.code)).map(v => v.description).join()
}
return null
},
openView(userId) {
this.id = userId
this.$refs.guava.view()
},
async initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion().then(data => {
this.unions = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then(data => {
this.unions = data
})
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then(data => {
this.units = data
})
}
}
},
created(){
this.pageData()
this.initData()
}
components: {
'member-info': MEMBER_INFO,
'member-change-audit-info': MEMBER_CHANGE_AUDIT_INFO,
},
methods: {
openUserView(row){
this.$refs.guava.edit(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openView(row){
this.$refs.guava.view(() => {
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.name === v).changeTypeName
})
.join(",")
}
return null
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
pageData() {
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)
this.$axios.post(loc() + '/pageData', pageForm)
.then(res => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
} else {
this.$message.error(res.msg)
}
})
},
},
async created() {
this.pageData();
if (this.$auth.hasRoleOr("SYSADMIN, SCHOOL_UNION_ADMIN")) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
}
})
</script>
<!--#
@@ -0,0 +1,44 @@
<div id="member_change_school_union_approval">
<el-form :model="formData" ref="formRef" label-width="0" label-suffix="" class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: "#member_change_school_union_approval",
store,
data() {
return {
formData: {
tf_opinion: ""
},
}
},
methods: {
handleTaskAction(val) {
const data = {
...val,
...this.formData
}
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify(data)
}).then(res => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.parent.postMessage({
type: "task-complete"
}, "*")
}
})
},
handleCancel(val) {
console.log(val)
},
}
})
</script>
@@ -0,0 +1,209 @@
<!--#
layout("/layouts/platform.html"){
#-->
<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">
<table-tool label="审核列表">
<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>
</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>
<template scope="{row}" v-else-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="220">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openView(row)">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openApproval(row)" size="mini" type="primary">
审核
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger">
撤回
</el-button>
</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-change-audit-info ref="memberChangeAuditInfoRef"></member-change-audit-info>-->
<!-- <div v-if="showApprovalForm">-->
<!-- <el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">-->
<!-- <el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">-->
<!-- <user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="电子签名" prop="approvalSignature" :rules="[{required:false,message:'必填',trigger:['change','blur']}]">-->
<!-- <pc-signature v-model="formData.approvalSignature"></pc-signature>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<!-- <el-row type="flex" justify="end">-->
<!-- <el-button plain @click="$refs.guava.index()">取消</el-button>-->
<!-- <el-button type="danger" @click="doApproval('BACK')">退回重新填写</el-button>-->
<!-- <el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>-->
<!-- <el-button type="primary" @click="doApproval('PASS')">同意</el-button>-->
<!-- </el-row>-->
<!-- </div>-->
<!-- </template>-->
</guava>
</div>
<script>
<!--#include("../common/commonQuery.js"){}#-->
new Vue({
el: "#app",
store,
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: "taskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
changeTypeData: [],
}
},
components: {
'common-query': COMMON_QUERY,
},
methods: {
openView(row){
this.$refs.guava.public(() => {
this.$refs.memberInfoRef.onOpen(row.userId)
})
},
openUserView(row){
this.$refs.guava.view(() => {
this.$refs.memberChangeAuditInfoRef.onOpen(row.userId)
})
},
openApproval(row) {
window.open("/flow/common/approval/form?taskId=" + row.taskId + "&instanceId=" + row.instanceId + "&businessId=" + row.businessNo)
},
doApproval(approvalType) {
let msg = '确定要同意此条申请吗?'
if (approvalType === 'REJECT') {
msg = '确定要拒绝此教工的入会申请吗?'
} else if (approvalType === 'BACK') {
msg = '确定要退回此条申请吗?'
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/platform/member/change/schoolUnion/audit/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
} else {
this.$message.error(res.msg)
}
})
}
})
})
},
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/member/change/schoolUnion/audit/revoke", { taskId }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
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.name === v).changeTypeName
})
.join(",")
}
return null
},
},
async created() {
this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType")
this.pageData()
}
});
</script>
<!--#
}
#-->
@@ -0,0 +1,532 @@
<div id="member_change">
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="" class="flow-task-form">
<el-descriptions :column="3" border>
<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, SCHOOL_UNION_ADMIN, SCHOOL_UNION_MEMBER_ADMIN')">
<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.name" :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"
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></el-descriptions-item>
<template v-if="formData.userState == '退休'">
<el-descriptions-item label="退休日期">
<el-form-item prop="retireDate">
<el-date-picker v-model="formData.retireDate"
type="date"
placeholder="请选择出生日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">
<el-form-item prop="welfareStopDate">
<el-date-picker v-model="formData.welfareStopDate"
type="date"
:disabled="isView"
placeholder="请选择福利享受截止日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态" :span="1.5">
<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="福利会员状态" :span="1.5">
<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>
<!--<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>-->
<template v-if="">
<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="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
</template>
</el-descriptions>
</el-form>
<snaker-flow-task-form-action @task-action="handleTaskAction" @save-draft="handleSaveDraft" @cancel="handleCancel"></snaker-flow-task-form-action>
</div>
<script>
new Vue({
el: '#member_change',
store,
data() {
return {
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"]
}
]
},
}
},
methods: {
// 提交
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", { type: "warning" })
.then(() => {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$axios
.post("/flow/common/startInstanceAndExecute", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.parent.postMessage(
{
type: "task-complete"
},
"*"
)
}
})
}
})
})
},
// 保存
handleSaveDraft(val) {
this.$confirm("您确定要保存吗?", "提示", { type: "warning" })
.then(() => {
this.$axios
.post("/flow/common/startInstance", {
...val,
bizData: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$message.success("操作成功")
// 发送完成消息
window.parent.postMessage(
{
type: "task-complete"
},
"*"
)
}
})
})
},
// 取消
handleCancel() {
},
getUnionName(val){
const data = this.units.find(v => v.id === val)
this.$set(this.formData, 'unionName', data ? data.unionname : '')
},
allowFields(prop) {
return !this.allowChangeFields.map(v => v.code).includes(prop)
},
async init(userId){
if (userId) {
this.isShow = false
await this.getUserById(userId)
} else {
this.isShow = true
this.user = this.$store.state.user
}
this.getFormDataValue(this.id)
this.allowChangeFields = await this.$businessTool.getDictOptions("ALLOW_CHANGE_FIELDS")
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_MEMBER_ADMIN, SCHOOL_UNION_ADMIN')) {
this.units = await this.$businessTool.listUnit()
this.unions = await this.$businessTool.listUnion()
} else {
this.units = await this.$businessTool.listUnit(this.user.union.id)
}
},
async getUserById(userId){
const resp = await this.$axios.post("/platform/member/change/apply/getUserByIdForMemberChange", { userId })
if (resp.code === 0) {
this.user = resp.data
}
},
getFormDataValue(id){
if (id) {
this.$axios.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,
personalData
} = 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.name : 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, "personalData", personalData)
}
}
},
created(){
this.init()
}
})
</script>
@@ -0,0 +1,155 @@
<!--#
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>
<template scope="{row}" v-else-if="column.prop=='instanceState'">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-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="row.applyStateId === 10010"
@click="sublime.jumpPagePjax('/platform/member/change/apply?id=' + row.id)"
size="mini" type="primary">编辑</el-button>
<el-button v-if="row.taskKey === 'apply'" size="mini"
@click="onDelete(row)" 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: "taskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
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 onDelete(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.name === v).changeTypeName
})
.join(",")
}
return null
}
},
async created(){
this.pageData()
this.changeTypeData = await this.$businessTool.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)
this.$store.dispatch("pjaxRoute", "/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)
this.$store.dispatch("pjaxRoute", "/platform/member/change/mine")
} else {
this.$message.error(resp.msg)
}
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,165 @@
<div id="member_change_view">
<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.schoolTime }}</el-descriptions-item>
<template v-if="viewData.userState == '退休'">
<el-descriptions-item label="退休日期">{{ viewData.retireDate ? $moment(viewData.retireDate).format("YYYY-MM-DD") : '暂无' }}</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">{{ $moment(viewData.welfareStopDate).format("YYYY-MM-DD") }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<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-tabs>
<template v-for="task in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName }}({{task.ext.initiatorAccount}})</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="办理意见" :span="3" v-if="!task.ext.isFirstTaskNode">{{ task.taskFormData.opinion }}</el-descriptions-item>
</el-descriptions>
</div>
</template>
</div>
<script>
new Vue({
el: "#member_change_view",
mixins: [initTableMixins],
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
activeName: "basicInfo",
businessId: GetQueryString("businessId"),
instanceId: GetQueryString("instanceId"),
viewData: {
changeInfos: [],
},
doneTasks: []
}
},
methods: {
info() {
this.$axios.post("/platform/member/change/view/findMemberChangeRecord", { id: this.businessId }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", { instanceId: this.instanceId }).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
}
},
created() {
this.info()
this.getDoneTasks()
}
})
</script>
<style>
.task-panel {
background: white;
border-radius: 4px;
overflow: hidden;
}
.task-panel-header {
background: rgb(250, 250, 250);
border: 1px solid rgb(228, 231, 237);
border-bottom: none;
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
.el-descriptions-item__label.is-bordered-label {
width: 15%;
}
</style>
@@ -1,252 +0,0 @@
const MEMBER_APPLY = {
template: `
<!-- <flow-start @task_id="(val)=>{this.TASK_ID = val}" @business_id="(val)=>{this.id = val}">-->
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">入会申请</h3>
<el-form :model="formData" ref="formRef" label-width="0" :rules="formRules" size="small">
<el-descriptions :column="3" border>
<el-descriptions-item label="姓名">
<template v-if="adminOperate">
<el-form-item prop="userId">
<user-select v-model="formData.userId"
api="/platform/member/apply/submit/getApplyUserByUnionOperate"
api_input_key_name="keyWord"
placeholder="请输入工号或姓名进行查询"
:option_label_func="(item)=>{return item.userName + item.loginName + '(' + item.unitName + ')'}"
@change="findOne(formData.userId)"
style="width: 100%"></user-select>
</el-form-item>
</template>
<template v-else>
<el-form-item prop="userName">
<el-input :value="formData.userName" readonly size="small"></el-input>
</el-form-item>
</template>
</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="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="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="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" v-model="formData.political" code="POLITICAL_STATUS"></dict-select>
<!-- <el-input v-model="formData.political" maxlength="100"></el-input>-->
</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="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%" :disabled="isAdmin"
@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-input v-model="formData.unitName" placeholder="请输入工作单位" readonly maxlength="100"></el-input>-->
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" readonly placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务">
<el-form-item prop="governmentPosition">
<el-input v-model="formData.governmentPosition" placeholder="请输入职务" maxlength="50"></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></el-descriptions-item>
<el-descriptions-item label="是否愿意加入重大疾病爱心互助会" :span="3">
<el-form-item prop="wantJoinLoveMutualAidAssociation">
<el-radio-group v-model="formData.wantJoinLoveMutualAidAssociation" size="small">
<el-radio :label="true" border>是</el-radio>
<el-radio :label="false" border>否</el-radio>
</el-radio-group>
</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="personalData">
<el-input type="textarea" placeholder="请输入个人简况(简历、获奖情况、有何特长)" v-model="formData.personalData" clearable></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
</el-card>
`,
props: {
adminOperate: { type: Boolean, default: false },
id: { type: String },
url: { type: String, default: "/platform/member/apply/submit/doSubmit" }
},
data() {
return {
formDisabled: false,
formData: {
families: []
},
formRules: {
userId: [{ required: true, message: "必填", trigger: "change" }],
userName: [{ required: true, message: "必填", trigger: "change" }],
sex: [{ required: true, message: "必填", trigger: "change" }],
idCard: [
{ required: true, 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"
}
],
nation: [{ required: true, message: "必填", trigger: "change" }],
political: [{ required: true, message: "必填", trigger: "change" }],
education: [{ required: true, message: "必填", trigger: "change" }],
// unitName: [{ required: true, message: "必填", trigger: "change" }],
governmentPosition: [{ required: true, message: "必填", trigger: "change" }],
mobile: [
{ required: true, message: "手机号不能为空", trigger: "blur" },
{ pattern: /^1[3-9]\d{9}$/, message: "手机号格式不正确", trigger: "blur" }
],
email: [{ required: true, message: "必填", trigger: "change" }],
wantJoinLoveMutualAidAssociation: [{ required: true, message: "必填", trigger: "change" }],
personalData: [{ required: true, message: "必填", trigger: "change" }]
},
units: [],
isAdmin: false
// id: GetQueryString("id"),
// TASK_ID: parseInt(GetQueryString("TASK_ID"))
}
},
methods: {
getUnionName() {
const data = this.units.find((v) => v.id === unitId)
this.$set(this.formData, "unionName", data.unionName)
},
init() {
if (this.id) {
this.findOne(this.id)
} else {
this.assignmentFormData()
}
this.$businessTool.listUnit().then((data) => {
debugger
this.units = data
})
this.isAdmin = this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN", "BRANCH_UNION_CHAIRMAN"])
},
findOne(id) {
this.$axios.post("/platform/member/apply/submit/findOne", { id: id }).then((res) => {
if (res.code === 0) {
this.assignmentFormData(res.data)
}
})
},
doSubmit(sequenceFlowName) {
this.$axios
.post(this.url, {
...this.formData,
TASK_ID: this.TASK_ID,
sequenceFlowName
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
// location.href = "/platform/member/apply/mine"
}
})
},
assignmentFormData(data) {
const source = data
// 特定字段的默认值映射
const defaultValues = {
families: []
}
const setField = (key) => {
// 检查字段是否在 defaultValues 映射中,如果在,则使用其默认值,否则从 source 获取值
const value = defaultValues.hasOwnProperty(key) ? defaultValues[key] : source[key]
this.$set(this.formData, key, value)
}
// 遍历表单项并设置值
this.$refs.formRef.fields.forEach((formItem) => {
setField(formItem.prop)
})
this.$set(this.formData, "loginname", data.loginname)
this.$set(this.formData, "userId", data.id)
}
},
created() {
// this.init()
}
}
@@ -1,158 +0,0 @@
const MEMBER_AUDIT_CHANGE_INFO = {
template:
/*language=HTML*/
`
<el-card shadow="never">
<el-tabs v-model="activeName">
<el-tab-pane label="基础信息及变更信息" name="basicInfo">
<div>
<div class="process-title">
当前信息
</div>
<el-descriptions :column="3" border class="descriptions-form">
<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.userState }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休时间">{{ $moment(viewData.retireDate).format('YYYY-MM-DD') }}</el-descriptions-item>
</template>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="婚姻状况">{{ viewData.marriage || '' }}</el-descriptions-item>
<el-descriptions-item label="证件号码" span="2">{{ 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.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">
<template slot="label">工作部门(学院)及岗位</template>
<div class="text-left">
{{ viewData.unionName + '-' + viewData.unitName + ( viewData.governmentPosition ? ( '('
+ viewData.governmentPosition + ')' ) : '' ) }}
</div>
</el-descriptions-item>
</el-descriptions>
</div>
<div v-if="changeList && changeList.length > 0">
<div class="process-title">
{{ '变更记录' + (remark ? ('(变更/审核说明:' + remark + ')') : '') }}
</div>
<el-table ref="changeTable" :data="changeList" row-key="id" style="width: 100%" border>
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="变更字段" prop="name"></el-table-column>
<el-table-column label="原数据" prop="value">
<template slot-scope="scope">
<div v-html="scope.row.value"></div>
</template>
</el-table-column>
<el-table-column label="新数据" prop="newValue">
<template slot-scope="scope">
<div v-html="scope.row.newValue"></div>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane v-if="nodeTasks && nodeTasks.length > 0" label="审核信息" name="audit">
<div>
<div v-for="nodeTask in nodeTasks" :key="nodeTask.id">
<div class="process-title">
{{nodeTask.nodeName}}
</div>
<el-descriptions :column="3" border v-for="task in nodeTask.tasks" :key="task.id"
style="margin-bottom: 10px">
<el-descriptions-item label="审核人">
{{ task.actualOwnerLoginName + '-' + task.actualOwnerUserName}}
</el-descriptions-item>
<el-descriptions-item label="审核时间">{{ task.endOn}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
<div v-if="task.extVariable">
<el-tag type="success" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'PASS'">同意
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'BACK'">退回
</el-tag>
<el-tag type="danger" size="mini"
v-if="task.extVariable.bpmTaskApprovalType === 'REJECT'">拒绝
</el-tag>
</div>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">
{{ task.extVariable.approvalOpinion }}
</el-descriptions-item>
<template v-if="$auth.hasRoleOr('SYSADMIN') && task.extVariable.approvalRemark">
<el-descriptions-item label="审核说明" :span="3">
{{ task.extVariable.approvalRemark }}
</el-descriptions-item>
</template>
<el-descriptions-item label="签字" :span="3">
<el-image :src="task.extVariable.approvalSignature"
v-if="task.extVariable && task.extVariable.approvalSignature"
class="signature-image"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-card>
`,
props: {
is_default_url: {
type: Boolean,
default: false
}
},
data() {
return {
activeName: "basicInfo",
changeList: [],
nodeTasks: [],
viewData: {},
remark: ""
}
},
methods: {
findAuditChangeInfo(recordId) {
if (!recordId) {
return
}
let url = loc() + "/findAuditChangeInfo"
if (this.is_default_url) {
url = "/platform/sourcechange/manage/findAuditChangeInfo"
}
this.$axios.post(url, { recordId: recordId }).then((res) => {
if (res.code === 0) {
this.changeList = res.data.changeList
this.nodeTasks = res.data.nodeTasks
this.remark = res.data.remark
}
})
},
findUserInfo(userId) {
if (!userId) {
return
}
this.$axios.post("/platform/member/apply/common/findOne", { id: userId }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
onOpen(data) {
this.findAuditChangeInfo(data.recordId)
this.$nextTick(() => {
this.findUserInfo(data.userId)
})
}
}
}
@@ -1,71 +0,0 @@
const MEMBER_AUDIT_RECORD = {
template: `
<div class="process-task-record">
<template v-if="approvalRecord.length > 0" v-for="item in approvalRecord">
<div v-if="item.taskName === '2a9632c6-710f-4d3b-89e4-86566238ce8e'" class="mb25">
<div class="process-title">
{{item.displayName}}
</div>
<el-descriptions :column="3" border :key="item.displayName + item.taskParentId">
<template v-for="task in item.processTaskVOList">
<el-descriptions-item label="姓名">{{task.taskActor?.actorUserName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{task.taskActor?.actorId}}</el-descriptions-item>
<el-descriptions-item label="填写时间">{{$moment(task.createdAt).format('YYYY-MM-DD HH:mm:ss')}}</el-descriptions-item>
</template>
</el-descriptions>
</div>
<div v-else>
<div class="process-title">
{{item.displayName}}
</div>
<el-descriptions :column="3" border :key="item.displayName + item.taskParentId">
<template v-for="task in item.processTaskVOList">
<el-descriptions-item label="姓名">{{task.taskActor?.actorUserName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{task.taskActor?.actorId}}</el-descriptions-item>
<el-descriptions-item label="审核时间">{{task.finishTime ? task.finishTime : '暂无'}}</el-descriptions-item>
<el-descriptions-item label="审核结果">
{{Object.keys(task.ext.submitTypeText).length !== 0 ? task.ext.submitTypeText : '暂无'}}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="3">{{task.ext.comment ? task.ext.comment : '暂无'}}</el-descriptions-item>
</template>
</el-descriptions>
</div>
</template>
<el-empty v-else description="暂无审核记录"></el-empty>
</div>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
props: {
id: {
type: String,
required: true
}
},
watch: {
id: {
handler: function (val) {
if (val) {
this.findOne()
}
},
immediate: true
}
},
data() {
return {
approvalRecord: []
}
},
methods: {
findOne() {
if (!this.id) {
return
}
this.$axios.post("/platform/wf/processCommon/approvalRecord", { businessNo: this.id }).then((res) => {
if (res.code === 0) {
this.approvalRecord = res.data
}
})
}
}
}
@@ -1,201 +0,0 @@
const MEMBER_AUDIT_TABLE = {
template: `
<div>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<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>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch"
code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" placeholder="人员类型" @change="doSearch"
code="MEMBER_CHANGE_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="审核列表">
<el-radio-group @change="doSearch" 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>
</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"
align="center" 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.userId)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="变更类型" prop="changeType" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: #0e78c5;cursor: pointer" @click="openChangeView(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
<el-table-column header-align="center" label="变更时间" prop="applyDateTime" show-overflow-tooltip sortable>
<template scope="{row}">
<span>{{ row.applyDateTime }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openChangeView(row)">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'
&& !(row.processInstanceNodeCode == 10 && row.changeOrigin == 'BRANCH_UNION')"
@click="openApproval(row)"
size="mini"
type="primary">
审核
</el-button>
<el-button v-if="(row.processInstanceTaskStatus==='ACTIVE' || row.processInstanceStatus==='RUNNING')
&& [10,40].includes(row.processInstanceNodeCode) && $auth.hasRole('BRANCH_UNION_CHAIRMAN')"
@click="openEdit(row)"
size="mini"
type="primary">
编辑
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete && row.processInstanceNodeCode != 50"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger">
撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
`,
mixins: [initTableMixins],
data() {
return {
pageForm: {
audit: false
},
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "preparedBy", label: "聘用方式", sortable: true },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "processInstanceNodeName", label: "当前节点", sortable: true }
],
unions: [],
units: [],
changeTypeData: [],
auditChangeVisible: false,
userId: "",
recordId: ""
}
},
methods: {
// 审核
openApproval(row) {
this.$emit("open-approval", row)
},
// 退回
openRevoke(taskId) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((resp) => {
this.$message.success(resp.msg)
this.doSearch()
})
})
},
openEdit(row) {
this.$emit("open-edit", row)
},
openUserChangeInfo(row) {
this.$emit("open-change-view", row)
},
getChangeTypes(changeTypes) {
if (changeTypes) {
if (!changeTypes || changeTypes.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return changeTypes
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).name
})
.join(",")
}
return null
},
openView(userId) {
this.$emit("open-view", userId)
},
openChangeView(row) {
this.$emit("open-change-view", row)
},
pageData() {
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
})
},
initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnion(this.pageForm.unionId).then((data) => {
this.unions = data
})
} else {
this.$businessTool.listUnion(this.$store.state.user.union.id).then((data) => {
this.unions = data
})
}
this.doSearch()
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
async created() {
this.initData()
this.changeTypeData = await this.$businessTool.getAllDictOptions("MEMBER_CHANGE_TYPE")
}
}
@@ -1,368 +0,0 @@
const MEMBER_CHANGE = {
template: /*language=HTML*/ `
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">信息变更</h3>
<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="username">
<el-input :value="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="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="nation">
<dict-select style="width: 100%" placeholder="请选择民族" :disabled="allowFields('nation')" v-model="formData.nation" code="USER_NATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="政治面貌">
<el-form-item prop="political">
<dict-select style="width: 100%" placeholder="请选择政治面貌" :disabled="allowFields('political')" v-model="formData.political" code="POLITICAL_STATUS"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="学历">
<el-form-item prop="education">
<dict-select style="width: 100%" placeholder="请选择学历" :disabled="allowFields('education')" v-model="formData.education" code="USER_EDUCATION"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工作单位">
<el-form-item prop="unitId">
<el-select clearable filterable placeholder="请选择工作单位" style="width: 100%"
@change="getUnionName(formData.unitId)"
:disabled="allowFields('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" readonly placeholder="请输入所属工会"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="职务">
<el-form-item prop="governmentPosition">
<el-input v-model="formData.governmentPosition" :disabled="allowFields('governmentPosition')" 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"
style="width: 100%"
:disabled="allowFields('userState')"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="聘用方式">
<el-form-item prop="preparedBy">
<dict-select v-model="formData.preparedBy" code="PREPARED_BY" style="width: 100%"
:disabled="allowFields('preparedBy')"></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%"
:disabled="allowFields('personType')"></dict-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="进站时间" v-show="formData.preparedBy === '博士后'">
<el-form-item prop="postDoctoralJoinDate">
<el-date-picker
v-model="formData.postDoctoralJoinDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期">
</el-date-picker>
</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="32"></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="member">
<span style="color: #0e9558" v-if="formData.member">是</span>
<span style="color: #ac2925" v-else>否</span>
</el-form-item>
</el-descriptions-item>
<!-- <el-descriptions-item label="是否福利会员">-->
<!-- <el-form-item prop="welfareMember">-->
<!-- <span style="color: #0e9558" v-if="formData.welfareMember">是</span>-->
<!-- <span style="color: #ac2925" v-else>否</span>-->
<!-- </el-form-item>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<!--<el-descriptions-item label="是否重大疾病爱心互助会会员">
<el-form-item prop="wantJoinLoveMutualAidAssociation">
<span style="color: #0e9558" v-if="formData.wantJoinLoveMutualAidAssociation">是</span>
<span style="color: #ac2925" v-else>否</span>
</el-form-item>
</el-descriptions-item>-->
<el-descriptions-item label="变更类型" :span="3">
<el-form-item prop="changeType">
<el-radio-group v-model="formData.changeType">
<el-radio v-for="item in changeTypeOptions" border size="small"
@click.native.prevent="clickDataType(item.code)"
:key="item.id" :label="item.code">{{item.name}}</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<template v-if="formData.changeType">
<el-descriptions-item label="会员状态" :span="1.5">
<el-form-item prop="changeMember">
<el-radio-group v-model="formData.changeMember" size="mini">
<el-radio :label="true" border>{{ formData.member ? '保留' : '成为' }}会员</el-radio>
<el-radio :label="false" border>取消会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="福利会员状态" :span="1.5">
<el-form-item prop="changeWelfareMember">
<el-radio-group v-model="formData.changeWelfareMember" size="mini">
<el-radio :label="true" border>{{ formData.welfareMember ? '保留' : '成为' }}会员</el-radio>
<el-radio :label="false" border>取消会员</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
</template>
<template v-if="formData.loginname == $store.state.user.loginname">
<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="personalData">
<text-editor v-model="formData.personalData"></text-editor>
</el-form-item>
</el-descriptions-item>
</template>
<el-descriptions-item label="变更说明" :span="3">
<el-form-item prop="approvalRemark">
<el-input v-model="formData.approvalRemark" type="textarea" :rows="4" placeholder="请输入变更说明"></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row justify="end" type="flex" class="mt10">
<el-button v-if="showClose" @click="$emit('close')">关 闭</el-button>
<el-button @click="doSubmit" type="primary">提 交</el-button>
</el-row>
</el-card>
`,
props: {
id: { type: String, required: true },
url: { type: String, required: true },
edit: { type: Boolean, default: false },
showClose: { type: Boolean, default: false }
},
store,
data() {
return {
formDisabled: false,
formData: {
families: [],
changeMember: null,
changeWelfareMember: null,
changeWantJoinLoveMutualAidAssociation: null,
verificationProjectId: ""
},
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"
}
],
nation: [{ required: false, message: "必填", trigger: "change" }],
political: [{ required: false, message: "必填", trigger: "change" }],
education: [{ required: false, message: "必填", trigger: "change" }],
unitName: [{ required: false, message: "必填", trigger: "change" }],
governmentPosition: [{ required: false, message: "必填", trigger: "change" }],
mobile: [
{ required: true, message: "手机号不能为空", trigger: "blur" },
{ pattern: /^1[3-9]\d{9}$/, message: "手机号格式不正确", trigger: "blur" }
],
email: [{ required: false, message: "必填", trigger: "change" }],
changeWantJoinLoveMutualAidAssociation: [{ required: false, message: "必填", trigger: "change" }],
personalData: [{ required: false, message: "必填", trigger: "change" }]
},
allowChangeFields: [],
units: [],
changeTypeOptions: []
}
},
methods: {
clickDataType(e) {
e === this.formData.changeType ? (this.formData.changeType = "") : (this.formData.changeType = e)
this.doSetMemberStatus(e)
},
doSetMemberStatus(name) {
this.$set(this.formData, "changeMember", name ? name === "RESTORE" : "")
this.$set(this.formData, "changeWelfareMember", name ? name === "RESTORE" : "")
this.$set(this.formData, "changeWantJoinLoveMutualAidAssociation", name ? name === "RESTORE" : "")
},
init() {
if (this.id) {
this.findOne(this.id, this.edit)
}
if (!this.allowChangeFields || this.allowChangeFields.length === 0) {
this.$businessTool.getDictOptions("MEMBER_ALLOW_CHANGES_FIELD").then((data) => {
this.allowChangeFields = data.map((v) => v.code)
})
}
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.$businessTool.listUnit().then((data) => {
this.units = data
})
} else {
this.$businessTool.listUnit(this.$store.state.user.union.id).then((data) => {
this.units = data
})
}
this.$businessTool.getDictOptions("MEMBER_CHANGE_TYPE").then((data) => {
this.changeTypeOptions = data
})
},
assignmentFormData(data) {
const source = data
// 特定字段的默认值映射
const defaultValues = {
families: []
}
const setField = (key) => {
// 检查字段是否在 defaultValues 映射中,如果在,则使用其默认值,否则从 source 获取值
const value = defaultValues.hasOwnProperty(key) ? defaultValues[key] : source[key]
this.$set(this.formData, key, value)
}
// 遍历表单项并设置值
this.$refs.formRef.fields.forEach((formItem) => {
setField(formItem.prop)
})
this.$set(this.formData, "loginname", data.loginname)
this.$set(this.formData, "userId", data.id)
},
findOne(id, isEdit) {
this.$axios.post("/platform/member/apply/submit/findOne", { id: id, isEdit: isEdit }).then((res) => {
if (res.code === 0) {
this.assignmentFormData(res.data)
}
})
},
allowFields(prop) {
return !this.allowChangeFields.includes(prop)
},
getUnionName(unitId) {
const data = this.units.find((v) => v.id === unitId)
this.$set(this.formData, "unionName", data.unionName)
},
doSubmit() {
//是否确认提交?
this.$confirm("是否确认提交?提交后将进入审核流程,请仔细核对变更数据是否准确!", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.setSubmitUserMemberStatus()
if (this.edit) {
this.formData.edit = this.edit
this.formData.id = this.id
}
this.$axios
.post(this.url, {
record: JSON.stringify(this.formData),
approvalRemark: this.formData.approvalRemark
})
.then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$emit("submit-ready", null)
}
})
})
},
setSubmitUserMemberStatus() {
if (this.formData.changeType) {
this.formData.member = this.formData.changeMember
this.formData.welfareMember = this.formData.changeWelfareMember
}
},
verificationInit(data) {
this.allowChangeFields = data.renewFields
this.$set(this.formData, "changeOrigin", data.changeOrigin)
this.$set(this.formData, "verificationProjectId", data.verificationProjectId)
this.init()
}
},
created() {}
}
@@ -1,108 +0,0 @@
const MEMBER_CHANGE_INFO = {
template: /*language=html*/ `
<el-card shadow="never">
<div>
<div class="process-title">
当前信息
</div>
<el-descriptions :column="3" border class="descriptions-form">
<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.userState }}</el-descriptions-item>
<template v-if="viewData.retireDate">
<el-descriptions-item label="退休时间">{{ $moment(viewData.retireDate).format('YYYY-MM-DD') }}</el-descriptions-item>
</template>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="婚姻状况">{{ viewData.marriage || '' }}</el-descriptions-item>
<el-descriptions-item label="证件号码" span="2">{{ 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.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">
<template slot="label">工作部门(学院)及岗位</template>
<div class="text-left">
{{ viewData.unionName + '-' + viewData.unitName + ( viewData.governmentPosition ? ( '(' + viewData.governmentPosition + ')' ) : '' ) }}
</div>
</el-descriptions-item>
</el-descriptions>
</div>
<div style="margin-top: 20px">
<div class="process-title">
变更信息
</div>
<el-tabs tab-position="left" style="height: 300px;" v-model="activeName">
<el-tab-pane :key="item.changeTime" v-for="(item, index) in viewList"
:name="item.changeTime">
<span slot="label" style="display: flex; align-items: center;" v-html="formattedTitle(item.title)">
<i class="el-icon-date"></i>
</span>
<div style="padding: 0 30px;display: flex;justify-content: flex-start;align-content: center" v-if="item.remark">
<div>
<h5 style="color: var(--color-primary);font-weight: bolder">变更/审核说明:</h5>
</div>
<div style="margin-top: 5px">
<span>{{ item.remark }}</span>
</div>
</div>
<el-table v-if="item.changeList && item.changeList.length > 0" ref="changeTable" :data="item.changeList" row-key="id"
style="width: 95%;margin-left: 20px" border>
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="变更字段" prop="name"></el-table-column>
<el-table-column label="原数据" prop="newValue">
<template slot-scope="scope">
<div v-html="scope.row.newValue"></div>
</template>
</el-table-column>
<el-table-column label="新数据" prop="value">
<template slot-scope="scope">
<div v-html="scope.row.value"></div>
</template>
</el-table-column>
</el-table>
<el-empty v-else :image-size="50" description="未获取到变更信息"></el-empty>
</el-tab-pane>
</el-tabs>
</div>
</el-card>
`,
data() {
return {
viewList: [],
activeName: "",
viewData: {}
}
},
methods: {
formattedTitle(title) {
const datePattern = /\(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\)/
return title.replace(datePattern, '<span style="display: block;">$&</span>')
},
onOpen(id, changeTime) {
if (!id) {
return
}
this.$axios.post(loc() + "/getChangeInfoByUserId", { userId: id }).then((res) => {
if (res.code === 0) {
this.viewList = res.data.sort((a, b) => new Date(b.title) - new Date(a.title))
this.activeName = changeTime || (this.viewList && this.viewList.length > 0 ? this.viewList[0].changeTime : "")
this.findUserInfo(id)
}
})
},
findUserInfo(id) {
this.$axios.post("/platform/member/apply/common/findOne", { id }).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
}
}
}
@@ -5,60 +5,62 @@
<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.username }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ viewData.birthday ? $moment(viewData.birthday).format('YYYY-MM-DD') : null }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ viewData.nation }}</el-descriptions-item>
<el-descriptions-item label="籍贯">{{ viewData.nativePlace }}</el-descriptions-item>
<el-descriptions-item label="国籍">{{ viewData.nationality }}</el-descriptions-item>
<el-descriptions-item label="证件类别">{{ viewData.idCardType }}</el-descriptions-item>
<el-descriptions-item label="证件号码">{{ viewData.idCard }}</el-descriptions-item>
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
<el-descriptions-item label="入党时间">{{ viewData.joinPartyDate ? $moment(viewData.joinPartyDate).format('YYYY-MM-DD') : null }}</el-descriptions-item>
<el-descriptions-item label="来校时间">{{ viewData.arrivalAtSchoolDate ? $moment(viewData.arrivalAtSchoolDate).format('YYYY-MM-DD') : null}}</el-descriptions-item>
<el-descriptions-item label="身份类别">{{ viewData.identityType }}</el-descriptions-item>
<el-descriptions-item label="聘用方式">{{ viewData.preparedBy }}</el-descriptions-item>
<el-descriptions-item label="教职工类别">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="在职状态">{{ viewData.userState }}</el-descriptions-item>
<el-descriptions-item label="预计离退休时间">{{ viewData.retireDate ?
$moment(viewData.retireDate).format('YYYY-MM-DD') : null }}
</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.nation }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ viewData.birthday ? $moment(viewData.birthday).format('YYYY-MM-DD') : null }}</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.arrivalAtSchoolDate ? $moment(viewData.arrivalAtSchoolDate).format('YYYY-MM-DD') : null}}</el-descriptions-item>
<template v-if="viewData.userState == '退休'">
<el-descriptions-item label="退休日期">{{ viewData.retireDate ? moment(viewData.retireDate).format("YYYY-MM-DD") : '暂无' }}</el-descriptions-item>
<el-descriptions-item label="福利享受截止日期">{{ moment(viewData.welfareStopDate).format("YYYY-MM-DD") }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
</template>
<el-descriptions-item label="会员状态">{{ viewData.member ? '会员' : '非会员' }}</el-descriptions-item>
<el-descriptions-item label="福利会员状态">{{ viewData.welfareMember ? '福利会员' : '非福利会员' }}</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<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.personalData" class="text-left" v-html="viewData.personalData"></div>
<span v-else>无数据</span>
</el-descriptions-item>
</el-descriptions>
<div class="process-title">会员信息</div>
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="是否会员">
<el-tag v-if="viewData.member===1" size="mini" type="success">是</el-tag>
<el-tag v-else type="info" size="mini">否</el-tag>
</el-descriptions-item>
<el-descriptions-item label="所属单位">{{ viewData.unitName }}</el-descriptions-item>
<el-descriptions-item label="所属分工会">{{ viewData.unionName }}</el-descriptions-item>
</el-descriptions>
<div class="process-title">学历信息</div>
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="最高学历">{{ viewData.education }}</el-descriptions-item>
<el-descriptions-item label="最高学位">{{ viewData.academicDegree }}</el-descriptions-item>
<el-descriptions-item label=""></el-descriptions-item>
</el-descriptions>
<div class="process-title">职称信息</div>
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="职称">{{ viewData.technicalTitle }}</el-descriptions-item>
<el-descriptions-item label="职称级别">{{ viewData.technicalTitleLevel }}</el-descriptions-item>
<el-descriptions-item label=""></el-descriptions-item>
</el-descriptions>
<div class="process-title">职务信息</div>
<el-descriptions :column="3" border class="descriptions-form">
<el-descriptions-item label="现聘职务">{{ viewData.position }}</el-descriptions-item>
<el-descriptions-item label="现聘职级">{{ viewData.positionLevel }}</el-descriptions-item>
<el-descriptions-item label="职员等级">{{ viewData.employeeLevel }}</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
@@ -1,143 +0,0 @@
const MEMBER_RECORD = {
template: `
<div>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="所属工会">
<el-select @change="flushUnits" @clear="flushUnits" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.unionId">
<el-option :key="item.id" :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<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>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" placeholder="在职状态" @change="doSearch"
code="USER_STATE"></dict-select>
</search-item>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" placeholder="人员类型" @change="doSearch"
code="PERSON_TYPE"></dict-select>
</search-item>
<search-item label="聘用方式">
<dict-select v-model="pageForm.preparedBy" placeholder="聘用方式" @change="doSearch"
code="PREPARED_BY"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" placeholder="变更类型" @change="doSearch"
code="MEMBER_CHANGE_TYPE"></dict-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="变更列表"></table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
class="vi-table" 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"
align="center" 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.userId)" type="primary">{{row.loginname}}</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="异动信息">
<el-table-column align="center" header-align="center" label="更新时间"
min-width="145px" prop="changeTime"
show-overflow-tooltip sortable>
</el-table-column>
<el-table-column align="center" header-align="center" label="异动类型"
prop="changeType" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: var(--color-primary);cursor: pointer" @click="openUserChangeInfo(row)">
{{getChangeTypes(row.changeTypes)}}
</span>
</template>
</el-table-column>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
`,
mixins: [initTableMixins],
data() {
return {
userId: "",
recordId: "",
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: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "remark", label: "变更说明", sortable: true }
],
unions: [],
units: [],
changeTypeData: [],
changeInfoVisible: false,
changeTime: ""
}
},
methods: {
openUserChangeInfo(row) {
this.$emit("open-change-info", row)
},
getChangeTypes(changeTypes) {
if (changeTypes) {
const c = JSON.parse(changeTypes)
if (!c || c.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
return c
.map((v) => {
return this.changeTypeData.find((item) => item.code === v).name
})
.join(",")
}
return null
},
openView(userId) {
this.$emit("open-view", userId)
},
async initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.unions = await this.$businessTool.listUnion(this.pageForm.unionId)
this.units = await this.$businessTool.listUnit()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
this.pageData()
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
}
},
created() {
this.pageData()
this.$businessTool.getAllDictOptions("MEMBER_CHANGE_TYPE").then((res) => {
this.changeTypeData = res
})
}
}
@@ -0,0 +1,376 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.top_block {
width: 100%;
padding: 20px 80px;
border-bottom: 10px solid rgb(240, 240, 240);
}
.top_title {
font-size: 14px;
color: #808492;
height: 30px;
line-height: 30px;
margin-bottom: 5px;
}
.top_num {
font-size: 26px;
}
.cut-off-line {
width: 1px;
height: 70%;
position: absolute;
right: 0;
top: 0;
bottom: 0;
margin: auto;
background-color: rgb(230, 230, 230);
}
.chartTitle {
font-size: 14px;
color: #808492;
margin-bottom: 20px;
}
</style>
<div id="app" v-cloak>
<div class="p10">
<el-card shadow="never">
<div class="top_block" v-loading="top_block_loading">
<el-row gutter="60">
<div style="position: absolute; top: -35px; right: -8px">
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="numForm.startYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(numForm.endYear){getNumData();}"
placeholder="选择年"
></el-date-picker>
-
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="numForm.endYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(numForm.startYear){getNumData();}"
placeholder="选择年"
></el-date-picker>
</div>
<el-col :span="6" style="position: relative">
<div class="top_title">总缴费金额</div>
<div class="top_num">{{numData.payMoney?numData.payMoney:'0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="6" style="position: relative">
<div class="top_title">退款金额</div>
<div class="top_num">{{numData.refundMoney?numData.refundMoney:'0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="6" style="position: relative">
<div class="top_title">退款订单数</div>
<div class="top_num">{{numData.refundSize?numData.refundSize:'0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="6" style="position: relative">
<div class="top_title">总缴费人数</div>
<div class="top_num">{{numData.paySize?numData.paySize:'0'}}</div>
</el-col>
</el-row>
</div>
<el-row style="padding: 30px 0; border-bottom: 10px solid rgb(240, 240, 240)">
<div style="position: absolute; top: 25px; right: 40px; z-index: 200">
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="oneForm.startYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(oneForm.endYear){getPayProjectChart();getPayMoneyChart();}"
placeholder="选择年"
></el-date-picker>
-
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="oneForm.endYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(oneForm.startYear){getPayProjectChart();getPayMoneyChart();}"
placeholder="选择年"
></el-date-picker>
</div>
<el-col :span="12" style="padding: 0 20px" v-loading="payProjectLoading">
<div class="chartTitle">已缴人数</div>
<div id="payProjectChart" style="width: 100%; height: 330px"></div>
</el-col>
<el-col :span="12" style="padding: 0 20px" v-loading="payMoneyLoading">
<div class="chartTitle">已缴金额</div>
<div id="payMoneyChart" style="width: 100%; height: 330px"></div>
</el-col>
</el-row>
<el-row style="padding: 30px 0; border-bottom: 10px solid rgb(240, 240, 240)">
<div style="position: absolute; top: 25px; right: 250px; z-index: 999">
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="unionForm.year"
type="year"
:clearable="false"
value-format="yyyy"
@change="getProjectList"
placeholder="选择年"
></el-date-picker>
</div>
<div style="position: absolute; top: 25px; right: 40px; z-index: 999">
<el-select
placeholder="请选择项目"
v-model="unionForm.paymentProjectId"
style="width: 100%"
size="mini"
:clearable="false"
@change="doSearch"
@clear="doSearch"
filterable="true"
>
<el-option v-for="item in paymentProjectList"
:label="item.projectName" :value="item.id"></el-option>
</el-select>
</div>
<el-col :span="24" style="padding: 0 20px" v-loading="all_union_loading">
<div class="chartTitle" style="margin-bottom: 50px">
</div>
<div id="allUnionChart" style="width: 100%; height: 300px"></div>
</el-col>
</el-row>
</el-card>
</div>
</div>
<script>
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
oneForm: {
startYear: new Date().getFullYear() - 2 + "",
endYear: new Date().getFullYear() + ""
},
twoForm: {
startYear: new Date().getFullYear() - 2 + "",
endYear: new Date().getFullYear() + ""
},
numForm: {
startYear: new Date().getFullYear() - 2 + "",
endYear: new Date().getFullYear() + ""
},
payProjectLoading: false,
refundProjectLoading: false,
payMoneyLoading: false,
top_block_loading: false,
numData: {},
all_union_loading: false,
unionForm: {
year: new Date().getFullYear() + ""
},
paymentProjectList: []
}
},
methods: {
async getNumData() {
this.top_block_loading = true
const resp = await this.$axios.post("/platform/member/payment/chartSummary/getNumData", this.numForm)
if (resp.code === 0) {
this.numData = resp.data
}
this.top_block_loading = false
},
async getPayProjectChart() {
this.payProjectLoading = true
const resp = await this.$axios.post("/platform/member/payment/chartSummary/getPayProjectChart", this.oneForm)
if (resp.code === 0) {
let { data } = resp
document.getElementById("payProjectChart").innerHTML = ""
const config = {
xField: "projectName",
yField: "num",
label: {
position: "middle", // 'top', 'bottom', 'middle',
style: {
fill: "#FFFFFF",
opacity: 0.6
}
},
xAxis: {
label: {
autoHide: true,
autoRotate: false
}
},
meta: {
projectName: {
alias: "项目"
},
num: {
alias: "缴费人数"
}
}
}
const plot = new G2Plot.Column(document.getElementById("payProjectChart"), {
data,
...config
})
plot.render()
}
this.payProjectLoading = false
},
async getPayMoneyChart() {
this.payMoneyLoading = true
const resp = await this.$axios.post("/platform/member/payment/chartSummary/getPayMoneyChart", this.oneForm)
if (resp.code === 0) {
let { data } = resp
document.getElementById("payMoneyChart").innerHTML = ""
const config = {
xField: "projectName",
yField: "money",
label: {
position: "middle", // 'top', 'bottom', 'middle',
style: {
fill: "#FFFFFF",
opacity: 0.6
}
},
xAxis: {
label: {
autoHide: true,
autoRotate: false
}
},
meta: {
projectName: {
alias: "项目"
},
money: {
alias: "金额(元)"
}
}
}
const plot = new G2Plot.Column(document.getElementById("payMoneyChart"), {
data,
...config
})
plot.render()
}
this.payMoneyLoading = false
},
async allUnionMoney() {
this.all_union_loading = true
const resp = await this.$axios.post("/platform/member/payment/chartSummary/allUnionMoney", {
paymentProjectId: this.unionForm.paymentProjectId
})
if (resp.code === 0) {
let { data } = resp
document.getElementById("allUnionChart").innerHTML = ""
const config = {
isStack: true,
legend: {
position: "top-right",
flipPage: false
},
autoFit: true,
title: {
visible: true,
text: ""
},
description: {
visible: true,
text: "单位(元)"
},
xField: "unionname",
yField: "money",
stackField: "type",
color: ["#5B8FF9", "#5AD8A6"],
xAxis: {
label: {
formatter: (v) => {
if (data.length > 30 && v.length > 3) {
return v.substr(0, 2) + "..."
} else if (data.length > 20 && v.length > 4) {
return v.substr(0, 3) + "..."
} else if (data.length > 10 && v.length > 6) {
return v.substr(0, 5) + "..."
}
return v
}
}
},
yAxis: {},
meta: {
unionname: {
alias: "工会"
},
money: {
alias: "金额"
}
},
connectedArea: {
visible: true,
triggerOn: false
}
}
const plot = new G2Plot.Column(document.getElementById("allUnionChart"), {
data,
...config
})
plot.render()
}
this.all_union_loading = false
},
async getProjectList() {
const resp = await this.$axios.post("/platform/member/payment/project/getAllProject", { year: this.unionForm.year })
if (resp.code === 0) {
this.paymentProjectList = resp.data
this.$set(this.unionForm, "paymentProjectId", (this.paymentProjectList && this.paymentProjectList.length > 0) ? this.paymentProjectList[0].id : null)
await this.allUnionMoney()
}
}
},
async created() {
await this.getPayProjectChart()
await this.getPayMoneyChart()
await this.getNumData()
await this.getProjectList()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,370 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-input-group__append {
border-left: 0;
padding: 0 13px;
height: 40px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch" ref="search">
<search-item label="缴费配置">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.name">
</el-input>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="缴费配置列表">
<el-button @click="openAdd" size="small" type="primary">
新增缴费配置
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize"
@sort-change="pageOrder"
class="vi-table"
ref="table" row-key="id" style="width: 100%"
v-loading="tableLoading">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isDisabled'">
<el-switch
:active-value="false"
:inactive-value="true"
@change="(val)=>{configStatusChange(row.id)}"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="row.isDisabled">
</el-switch>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="100px">
<template scope="scope">
<el-dropdown @command="dropdownCommand">
<el-button :loading="submitLoading" plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'edit',data:scope.row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'remove',data:scope.row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<el-form :model="formData" ref="addForm" :rules="rules"
label-width="120px"
style="margin: 10px 0 0 0">
<div class="process-title">缴费配置</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="配置名称" prop="name">
<el-input v-model="formData.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="缴费月份" prop="paymentMonth" size="medium">
<el-date-picker
v-model="formData.paymentMonth"
type="monthrange"
range-separator="至"
style="width: 100%"
value-format="yyyy-MM"
start-placeholder="开始月份"
end-placeholder="结束月份">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<div class="process-title">缴纳标准</div>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item class="is-required" label="会费缴纳情况" prop="payStandard">
<el-button @click="formData.payStandards.push({payPersonnel: null, payMode: '1', personTypes: null, payModeValue: null,payModeValueList:[{name:'',value:''}]})" icon="el-icon-plus" size="mini"
style="float: right;margin-bottom: 10px">
添加
</el-button>
<span style="color: red">说明:不同人员类型可根据不同缴费模式设置缴费标准。</span>
<el-table
:data="formData.payStandards"
border
v-fit-columns
size="mini"
style="width: 100%">
<el-table-column label="缴费人员" prop="payPersonnel" width="200">
<template scope="{row,$index}">
<el-form-item :prop="'payStandards.'+$index+'.payPersonnel'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-select placeholder="请选择在职状态" v-model="row.payPersonnel"
style="width: 100%" clearable>
<el-option v-for="item in userStateList" :label="item.name" :value="item.code"></el-option>
</el-select>
<!-- <el-input clearable maxlength="100" placeholder="请输入缴费人员"
v-model="row.payPersonnel"></el-input>-->
<!--<el-select placeholder="请选择人员类型" v-model="row.payPersonnel"
style="width: 100%" clearable>
<el-option v-for="item in memberTypeList" :label="item.name" :value="item.code"></el-option>
</el-select>-->
</el-form-item>
</template>
</el-table-column>
<el-table-column label="人员类型" prop="personType" >
<template slot-scope="{row,$index}">
<el-select @change="row.payMode=null" placeholder="请选择人员类型" v-model="row.personType"
style="width: 100%" clearable>
<el-option v-for="item in personTypeList" :label="item.name" :value="item.code"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="缴费模式" prop="payMode" >
<template scope="{row,$index}">
<el-form-item :prop="'payStandards.'+$index+'.payMode'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<el-select placeholder="请选择缴费模式" v-model="row.payMode"
style="width: 100%">
<el-option label="固定金额缴纳" value="1"></el-option>
<el-option label="按比例缴纳" value="2"></el-option>
<el-option label="导入" value="3"></el-option>
</el-select>
</el-form-item>
</template>
</el-table-column>
<!-- <el-table-column label="在职状态" prop="userState" >
<template slot-scope="{row,$index}">
<el-select placeholder="请选择在职状态" v-model="row.userState"
style="width: 100%" clearable>
<el-option v-for="item in userStateList" :label="item.name" :value="item.code"></el-option>
</el-select>
</template>
</el-table-column>-->
<el-table-column label="缴费标准" prop="payModeValue" width="650">
<template scope="{row,$index}">
<div v-if="row.payMode=='2'">
<el-form-item :prop="'payStandards.'+$index+'.payModeValueList'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<div style="display:flex;justify-content: space-between;margin-left: 30px">
(
<template v-for="(o,i) in row.payModeValueList" >
<el-input placeholder="" style="width: 100px;"
v-model="o.name">
<el-button @click="row.payModeValueList.splice(i, 1)" slot="append" style="padding: 0 7px;"
icon="el-icon-circle-close"></el-button>
</el-input>
<span v-if="i !== row.payModeValueList.length - 1">+</span>
</template>
) * 0.5%
<div>
<el-button @click="row.payModeValueList.push({name: '',value:''})" size="mini">新增</el-button>
</div>
</div>
</el-form-item>
</div>
<div v-else-if="row.payMode == '1' || row.payMode == '3'">
<el-form-item :prop="'payStandards.'+$index+'.payModeValue'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
label-width="0">
<div v-if="row.payMode == '1'">
<el-input clearable maxlength="5" type="number" placeholder="请输入缴费金额"
v-model="row.payModeValue"></el-input>
</div>
<div v-if="row.payMode == '3'" style="text-align: center">
<span>导入名单</span>
</div>
<!-- <el-input clearable maxlength="100" placeholder="请填写缴费标准"-->
<!-- v-model="row.payModeValue"></el-input>-->
</el-form-item>
</div>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="80">
<template slot-scope="scope">
<el-button :disabled="formData.payStandards.length<=1"
@click="formData.payStandards.splice(scope.$index,1)" circle
icon="el-icon-delete"
size="mini"
type="danger"></el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div>
<el-button @click="doSubmit" v-if="isSubmit" v-loading="submitLoading" style="float: right"
type="primary">
提交
</el-button>
</div>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
payModeList:[{code:'1',value:'固定金额缴纳'},{code:'2',value:'按比例缴纳'},{code:'3',value:'导入'}],
formData: {
payStandards: [{payPersonnel: null, payMode: null, personTypes: null, payModeValue: null,payModeValueList:[{name:'',value:''}]}]
},
rules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
paymentMonth: [{required: true, message: '必填', trigger: ['blur', 'change']}],
exit: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
personTypeList:[],
userStateList:[],
memberTypeList:[],
pageForm:{},
tableData:[],
tableColumns:[
{prop: 'name', label: '配置名称'},
{prop: 'paymentStartMonth', label: '缴费起始月份'},
{prop: 'paymentEndMonth', label: '缴费截止月份'},
{prop: 'isDisabled', label: '开启状态'},
],
isSubmit: true,
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'edit') {
this.openEdit(data)
} else if (type === 'remove') {
this.doRemove(data.id)
}
},
openAdd(){
this.$refs.guava.view()
},
async doRemove(id) {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await this.$axios.post(loc() + '/doRemove', {id: id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
},
async configStatusChange(id) {
const resp = await this.$axios.post(loc() + '/openClosedConfig', { id: id })
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
},
openEdit(data) {
this.formData = {}
this.formData = {
...data,
paymentMonth:[data.paymentStartMonth, data.paymentEndMonth],
}
this.formData.payStandards= JSON.parse(this.formData.payStandards)
this.isSubmit = true
this.$refs.guava.view()
},
async doSubmit(){
this.formData.paymentStartMonth = this.formData.paymentMonth[0]
this.formData.paymentEndMonth = this.formData.paymentMonth[1]
const formData = clone(this.formData)
formData.payStandards = JSON.stringify(this.formData.payStandards)
const resp = await this.$axios.post(loc() + '/doAddOrModify',formData)
if (resp.code === 0){
this.$refs.guava.index()
await this.getPaymentConfig()
this.pageData()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
},
async getPaymentConfig(){
const resp = await this.$axios.post(loc() + '/getPaymentConfig')
if (resp.code === 0){
this.formData = {...resp.data}
if (!this.formData.payStandards){
this.formData = {
payStandards: [{payPersonnel: null, payMode: '1', personTypes: null, payModeValue: null,payModeValueList:[{name:'',value:''}]}]
}
}
}
}
},
async created() {
this.pageData()
this.personTypeList = await this.$businessTool.getDictOptions('PERSON_TYPE')
//在职状态
this.userStateList = await this.$businessTool.getDictOptions('USER_STATE')
//会员类型
// this.memberTypeList = await getDictOptions('memberType')
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,368 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.payForm .el-form-item__label {
font-weight: bold;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
:clearable="false"
@change="doSearch"
placeholder="选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="缴费列表">
<el-radio-group @change="doSearch" class="mr10" size="small"
v-model="pageForm.isPay">
<el-radio-button :label="true">已缴</el-radio-button>
<el-radio-button :label="false">未缴</el-radio-button>
</el-radio-group>
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
class="vi-table"
ref="table"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
>
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isPayment'">
<template v-if="row.isPayment">
<el-tag v-if="row.isPayment && !row.isRefund" type="success">已缴费</el-tag>
<el-tag v-else type="danger">
{{ getRefundStates(row.refundState) }}
</el-tag>
</template>
<el-tag v-else type="danger">未缴费</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop==='paymentStartMonth'">
{{row.paymentStartMonth}}至{{row.paymentEndMonth}}
</template>
<template scope="{row}" v-else-if="column.prop==='paymentMoney'">
{{ row.payMoney ? (Number(row.paymentMoney) / 100) : 0 }}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
prop="userOnline" width="200px">
<template scope="{row}">
<el-button @click="showPayInfo(row)" size="mini" type="primary">查看详情</el-button>
<el-button v-if="!row.isPayment" @click="openPay(row)" size="mini" type="primary">缴费</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<pay-info :trading-states="tradingStates" :refund-states="refundStates"
:trading-channels="tradingChannels" ref="payInfoRef"></pay-info>
</template>
</guava>
<el-diaLog :close-on-click-modal="false" :visible.sync="payVisible" title="缴费" width="50%"
:before-close="clickClose">
<el-form ref="form" :model="formData" :rules="formRules" label-width="170px"
label-suffix="" class="payForm">
<el-steps :active="payActive" finish-status="success">
<el-step title="计算缴费金额"></el-step>
<el-step title="生成缴费二维码"></el-step>
<el-step title="完成"></el-step>
</el-steps>
<div v-if="payActive===0" class="mt25">
<el-form-item label="缴费所属时间">
<div>{{formData.paymentStartMonth}}至{{formData.paymentEndMonth}}</div>
</el-form-item>
<el-form-item label="缴费标准">
<div style="color: red"
v-if="formData.payModeValueList&&formData.payModeValueList.length>0">
(
<template v-for="(o,i) in formData.payModeValueList">
{{o.name}}
<template v-if="i !=formData.payModeValueList.length-1">+</template>
</template>
) * 0.5% * {{formData.paymentMonth}}个月
</div>
<div v-else>固定金额缴费</div>
</el-form-item>
<!--如果是根据比例算的-->
<div v-if="formData.payModeValueList&&formData.payModeValueList.length>0">
<div v-for="(o,i) in formData.payModeValueList" :key="o.id">
<el-form-item :label="o.name">
<el-input-number v-model="o.value" :min="0" :max="1000000"
:precision="2"
placeholder="请输入缴费金额"
@change="changePayModeValue(o)"></el-input-number>
</el-form-item>
</div>
</div>
<el-form-item label="支付金额">
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}</div>
</el-form-item>
</div>
<div v-if="payActive===1" class="mt25">
<el-form-item label="商品订单">
{{formData.transactionId}}
</el-form-item>
<el-form-item label="支付金额">
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}</div>
</el-form-item>
<div style="width: 100%;">
<el-row :gutter="20">
<el-col :span="12" v-loading="qrcodeLoading">
<div style="text-align: center">
<image :src="paySrc" style="width: 60%;left: 0;right: 0;margin: auto"></image>
<div style="display: flex;justify-content: center">
<span
style="font-weight: bold;
font-size: 15px;
color: #fbfbfb;
background-color: rgb(44, 208, 0);
height: 30px;
width: 60%;
display: flex;
justify-content: center;
align-items: center;">
请打开手机微信,扫一扫完成支付</span>
</div>
</div>
</el-col>
<el-col :span="12">
<div>
<el-image src="/assets/mobile/svg/memberPay/wx_img.png"></el-image>
</div>
</el-col>
</el-row>
</div>
</div>
<div v-if="payActive===3">
<div v-loading="submitLoading">
<div style="margin-top: 35px;background-color: RGB(245, 254, 243);">
<div
style="display: flex;align-items: center;height: 100px;margin-left: 10%">
<div>
<el-image
src="/assets/mobile/svg/memberPay/pcPaySuccess.svg"></el-image>
</div>
<div style="font-weight: bold;font-size: 25px;margin-left: 10px;">
支付成功!
</div>
</div>
</div>
<el-form-item label="商品订单">
{{formData.transactionId}}
</el-form-item>
<el-form-item label="支付金额">
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}
</div>
</el-form-item>
</div>
</div>
</el-form>
<div style="text-align: right">
<span>
<el-button @click="clickClose">关 闭</el-button>
<el-button @click="next" v-if="payActive===0&&formData.paymentMoney>0"
type="primary">下一步</el-button>
</span>
</div>
</el-diaLog>
</div>
<script src="${base!}/assets/platform/plugins/jr-qrcode/jr-qrcode.js"></script>
<script>
<!--#include("minePayInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
components: {
'pay-info': MINE_PAY_INFO,
},
data() {
return {
tableColumns: [
{ prop: "year", label: "年度", sortable: true },
{ prop: "projectName", label: "项目名称", sortable: true },
{ prop: "startTime", label: "缴费开始时间", sortable: true },
{ prop: "endTime", label: "缴费截止时间", sortable: true },
{ prop: "paymentStartMonth", label: "缴费所属时间", sortable: true },
{ prop: "paymentMoney", label: "缴费金额(元)", sortable: true },
{ prop: "isPayment", label: "缴费状态", sortable: true }
],
pageForm: {
isPay: false,
year: moment().format("YYYY")
},
payVisible: false,
payActive: 0,
intervalTimer: null,
qrcodeLoading: false,
payInfo: {},
tradingStates: [],
refundStates: [],
tradingChannels: [],
paySrc: ''
}
},
methods: {
async showPayInfo(row) {
this.$refs.guava.view(() => {
this.$refs.payInfoRef.onOpen(row.id)
})
},
clickClose() {
if (this.payActive === 3) {
this.payVisible = false
} else {
this.$confirm("您确定要关闭当前缴费吗?关闭后将不会保存当前数据", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.payVisible = false
})
}
clearInterval(this.intervalTimer)
},
next() {
this.$confirm("您确定要生成缴费二维码吗?当前需缴费【" + this.formData.paymentMoney + "】元", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
this.qrcodeLoading = true
const paymentMoney = Math.floor(this.formData.paymentMoney * 100)
this.payActive = this.payActive + 1
const resp = await $.post("/platform/member/payment/mine/pcOrderPay", {
paymentMoney: paymentMoney,
paymentInfoId: this.formData.paymentInfoId
})
if (resp.code === 0) {
const data = JSON.parse(resp.data)
this.$nextTick(() => {
// $("#qrcode").html("")
// $("#qrcode").qrcode({
// render: "canvas",
// width: $("#qrcode").width(),
// height: $("#qrcode").width(),
// text: data.code_url,
// correctLevel: 3
// })
this.paySrc = jrQrcode.getQrBase64(data.code_url, {
padding: 10, // 内边距
width: 200, // 图片宽度
height: 200, // 图片高度
correctLevel: 2, // 容错级别 0-3
foreground: '#000', // 前景色
background: '#fff' // 背景色
})
})
this.formData.transactionId = data.transactionId
await this.getIsPay()
}
this.qrcodeLoading = false
})
},
async getIsPay() {
this.intervalTimer = setInterval(async () => {
const resp = await this.$axios.post(loc() + "/getIsPay", { paymentInfoId: this.formData.paymentInfoId })
if (resp.code === 0) {
if (resp.data) {
this.payActive = 3
this.submitLoading = true
clearInterval(this.intervalTimer)
setTimeout(() => {
this.submitLoading = false
this.pageData()
}, 1500)
}
}
}, 4000)
},
changePayModeValue() {
let paymentMoney = this.formData.payModeValueList.reduce((a, b) => {
return a + b.value
}, 0)
this.$set(this.formData, "paymentMoney", parseFloat((paymentMoney * 0.005 * this.formData.paymentMonth).toFixed(2)))
},
openPay(row) {
debugger
this.payActive = 0
const payStandards = JSON.parse(row.payStandards)
const payStandard = payStandards.find(p => p.payPersonnel === row.userState && p.personType === row.personType)
this.$set(this.formData, "paymentMonth", row.paymentMonth)
this.$set(this.formData, "paymentStartMonth", row.paymentStartMonth)
this.$set(this.formData, "paymentEndMonth", row.paymentEndMonth)
this.$set(this.formData, "paymentInfoId", row.id)
if (payStandard && payStandard.payModeValue) {
this.$set(this.formData, "payModeValueList", [])
this.$set(this.formData, "paymentMoney", payStandard.payModeValue)
} else {
this.$set(this.formData, "payModeValueList", payStandard.payModeValueList)
this.$set(this.formData, "paymentMoney", 0)
}
this.payVisible = true
},
getRefundStates(data) {
if (!data) {
return
}
return this.refundStates.find(item => item.name === data).refundStateName
},
async getPaymentEnums() {
this.tradingStates = await this.$businessTool.getEnumOptions("TradingStateEnum")
this.refundStates = await this.$businessTool.getEnumOptions("RefundStateEnum")
this.tradingChannels = await this.$businessTool.getEnumOptions("TradingChannelEnum")
}
},
created() {
this.pageData()
this.getPaymentEnums()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,125 @@
const MINE_PAY_INFO = {
template: /*language=html*/ `
<div>
<el-descriptions title="缴费信息" :column="3" border>
<el-descriptions-item label="工号">{{ viewData.loginname }}</el-descriptions-item>
<el-descriptions-item label="姓名">{{ viewData.username }}</el-descriptions-item>
<el-descriptions-item label="缴费项目">{{ viewData.projectName }}</el-descriptions-item>
<el-descriptions-item label="所在工会">{{ viewData.unionname }}</el-descriptions-item>
<el-descriptions-item label="所在单位">{{ viewData.unitname }}</el-descriptions-item>
<el-descriptions-item label="人员类型">{{ viewData.personType }}</el-descriptions-item>
<el-descriptions-item label="缴费情况">
<el-tag v-if="viewData.personType">已缴费</el-tag>
<el-tag v-else type="warning">未缴费</el-tag>
</el-descriptions-item>
<el-descriptions-item label="缴费金额">{{ viewData.paymentMoney }}</el-descriptions-item>
<el-descriptions-item label="缴费月份时长">{{ viewData.paymentMonth }}</el-descriptions-item>
<template v-if="viewData.transList">
<el-descriptions-item label="缴费订单详情" :span="3">
<el-table :data="viewData.transList" class="vi-table" ref="table" row-key="id"
style="width: 100%" border>
<el-table-column label="系统单号" prop="outTradeNo"></el-table-column>
<el-table-column label="商户订单号" prop="transactionId"></el-table-column>
<el-table-column label="付款方式" prop="tradingChannel">
<template scope="{row}">
{{ getTradingChannel(row.tradingChannel) }}
</template>
</el-table-column>
<el-table-column label="订单金额(¥)" prop="tradingAmount">
<template scope="{row}">
{{ row.tradingAmount ? (Number(row.tradingAmount) / 100 ) : 0 }}
</template>
</el-table-column>
<el-table-column label="下单时间" prop="createdAt">
<template scope="{row}">
{{ moment(row.createdAt).format("YYYY-MM-DD HH:mm:ss") }}
</template>
</el-table-column>
<el-table-column label="订单状态" prop="tradingState">
<template scope="{row}">
{{ getTradingStates(row.tradingState) }}
</template>
</el-table-column>
<el-table-column label="退款详情" prop="isRefund" width="200">
<template scope="{row}">
<el-tag v-if="!row.isRefund">未退款</el-tag>
<el-tag v-else type="danger" style="cursor: pointer;"
@click="showRefundInfo(row)">此订单有退款,点我查看详情</el-tag>
</template>
</el-table-column>
</el-table>
</el-descriptions-item>
</template>
</el-descriptions>
<el-dialog title="退款详情" :visible.sync="refundDialogVisible" width="50%" append-to-body>
<el-descriptions :column="1" border>
<el-descriptions-item label="退款单号">{{ refundData.outRefundTradeNo }}</el-descriptions-item>
<el-descriptions-item label="退款商户号">{{ refundData.refundNo }}</el-descriptions-item>
<el-descriptions-item label="退款金额(¥)">
{{ refundData.total ? (Number(refundData.total) / 100) : 0 }}
</el-descriptions-item>
<el-descriptions-item label="退款时间">{{ moment(refundData.updatedAt).format("YYYY-MM-DD HH:mm:ss") }}</el-descriptions-item>
<el-descriptions-item label="退款状态">
{{ getRefundStates(refundData.refundState) }}
</el-descriptions-item>
</el-descriptions>
<span slot="footer" class="dialog-footer">
<el-button @click="refundDialogVisible = false;refundData = {}">关 闭</el-button>
</span>
</el-dialog>
</div>
`,
props: {
tradingStates: { type: Array, default: () => [] },
refundStates: { type: Array, default: () => [] },
tradingChannels: { type: Array, default: () => [] },
},
data() {
return{
viewData: {},
refundData: {},
refundDialogVisible: false
}
},
methods: {
showRefundInfo(row) {
this.refundData = {}
this.refundData = this.viewData.refundRecordList.find(item => item.paymentTransactionId === row.id)
if (this.refundData) {
this.refundDialogVisible = true
} else {
this.$message.error("此订单无退款记录")
}
},
async onOpen(id) {
const resp = await $.post('/platform/member/payment/mine/getPaymentInfoById', {id})
if (resp.code === 0) {
this.viewData = resp.data
} else {
this.$message.error("操作失败")
}
},
getTradingStates(data) {
if (!data) {
return
}
return this.tradingStates.find(item => item.name === data).tradingStateName
},
getRefundStates(data) {
if (!data) {
return
}
debugger
return this.refundStates.find(item => item.name === data).refundStateName
},
getTradingChannel(data) {
if (!data) {
return
}
return this.tradingChannels.find(item => item.name === data).tradingChannelName
},
}
}
@@ -0,0 +1,410 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-input-group__append {
border-left: 0;
padding: 0 7px;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch" ref="searchRef">
<search-item label="年度">
<el-date-picker
:clearable="false"
clearable
@change="doSearch"
placeholder="选择年度"
type="year" style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="缴费项目">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.projectName">
</el-input>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="缴费项目列表">
<el-button @click="openAdd" size="small" type="primary">
新增缴费项目
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize"
@sort-change="pageOrder"
class="vi-table"
ref="table" row-key="id" style="width: 100%"
v-loading="tableLoading">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isDisabled'">
<el-switch
:active-value="false"
:inactive-value="true"
@change="(val)=>{projectStatusChange(row.id)}"
active-color="#13ce66"
inactive-color="#ff4949"
v-model="row.isDisabled">
</el-switch>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="100px">
<template scope="scope">
<el-dropdown @command="dropdownCommand">
<el-button :loading="submitLoading" plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'openCode',data:scope.row}">
二维码
</el-dropdown-item>
<el-dropdown-item :command="{type:'view',data:scope.row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',data:scope.row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'doRenew',data:scope.row}"
v-if="scope.row.created">
更新缴费人员
</el-dropdown-item>
<el-dropdown-item :command="{type:'doSet',data:scope.row}">
{{scope.row.created?'重置缴费人员':'生成缴费人员'}}
</el-dropdown-item>
<el-dropdown-item :command="{type:'remove',data:scope.row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<el-form :model="formData" :rules="formRules" label-width="100px" ref="form">
<div class="process-title">缴费项目信息</div>
<el-form-item label="项目名称" prop="projectName">
<el-input maxlength="100" placeholder="项目名称" v-model="formData.projectName"></el-input>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="缴费年度" prop="year">
<el-date-picker
:clearable="false"
placeholder="选择年度"
type="year" style="width: 100%"
v-model="formData.year"
value-format="yyyy">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建日期" prop="createTime">
<el-date-picker
placeholder="创建日期"
readonly
style="width: 100%"
type="date"
v-model="formData.createTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="缴费配置" prop="configId" size="medium">
<el-select placeholder="请选择缴费配置" v-model="formData.configId"
style="width: 100%" clearable>
<el-option
v-for="item in configList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="缴费时间" prop="paymentTime" size="medium">
<el-date-picker
v-model="formData.paymentTime"
type="daterange"
value-format="yyyy-MM-dd"
range-separator="至"
style="width: 100%"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div>
<el-button @click="doSave" v-if="isSubmit" v-loading="submitLoading" style="float: right"
type="primary">
提交
</el-button>
</div>
</template>
<!-- <open-qr-code ref="openQRCode"></open-qr-code>-->
</guava>
<el-dialog title="二维码" width="30%" :visible.sync="dialogVisible" style="text-align: center">
<img :src="qrSrc" alt="二维码" />
</el-dialog>
</div>
<script src="${base!}/assets/platform/plugins/jr-qrcode/jr-qrcode.js"></script>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
isSubmit: true,
pageForm: {
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'year', label: '年度', sortable: true},
{prop: 'projectName', label: '项目名称', sortable: true},
{prop: 'startTime', label: '缴费开始时间', sortable: true},
{prop: 'endTime', label: '缴费截止时间', sortable: true},
{prop: 'createTime', label: '创建时间', sortable: true},
{prop: 'isDisabled', label: '开启状态'},
],
formData: {
year: moment().format('YYYY'),
},
formRules: {
projectName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
year: [{required: true, message: '必填', trigger: ['blur', 'change']}],
paymentMonth: [{required: true, message: '必填', trigger: ['blur', 'change']}],
paymentTime: [{required: true, message: '必填', trigger: ['blur', 'change']}],
configId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
paymentConfig: {},
monthSelect: [],
configList:[],
// 二维码展示
dialogVisible: false,
qrSrc: '',
}
},
components: {
// 'open-qr-code': httpVueLoader('/components/plugins/OpenQRCode.vue'),
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'openCode') {
this.openCode(data)
} else if (type === 'view') {
this.openView(data)
} else if (type === 'edit') {
this.openEdit(data)
} else if (type === 'doRenew') {
this.doRenewPayment(data.id)
} else if (type === 'doSet') {
this.doSetPayment(data)
} else if (type === 'remove') {
this.doRemove(data.id)
}
},
openCode(row) {
// this.$refs.openQRCode.openCode('/mobile/memberCost/list')
this.qrSrc = jrQrcode.getQrBase64("/mobile/memberCost/list", {
padding: 10, // 内边距
width: 400, // 图片宽度
height: 400, // 图片高度
correctLevel: 2, // 容错级别 0-3
foreground: '#000', // 前景色
background: '#fff' // 背景色
})
this.dialogVisible = true
},
openView(data) {
this.formData = {}
this.formData = {
...data,
paymentTime:[data.startTime, data.endTime],
}
this.isSubmit = false
this.$refs.guava.view()
},
openEdit(data) {
this.formData = {}
this.formData = {
...data,
paymentTime:[data.startTime, data.endTime],
}
this.isSubmit = true
this.$refs.guava.view()
},
async doRenewPayment(id) {
this.$confirm('系统根据现有的会员,更新当前缴费名单,对已经缴费人员没有影响,请确认是否更新?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const loading = this.$loading({
lock: true,
text: '数据保存中请稍后',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.submitLoading = true
const resp = await this.$axios.post(loc() + '/doSetPayment', {id: id, isRenew: true})
this.submitLoading = false
loading.close()
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
}
}
})
},
async doSetPayment(row) {
let msg = row.created ? "请确认是否重新生成缴费名单,如果确认,系统将清空已缴费的人员信息!" : "确定要生成缴费名单吗?"
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const loading = this.$loading({
lock: true,
text: '数据保存中请稍后',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.submitLoading = true
const resp = await this.$axios.post(loc() + '/doSetPayment', {id: row.id, isRenew: false})
this.submitLoading = false
loading.close()
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
}
}
})
},
async doRemove(id) {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === 'confirm') {
const resp = await this.$axios.post(loc() + '/doRemove', {id: id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
},
openAdd() {
this.formData = {
createTime: moment().format('YYYY-MM-DD HH:mm:ss'),
year: moment().format('YYYY'),
}
this.$refs.guava.view()
},
async doSave() {
const formValid = await this.$refs["form"].validate()
if (formValid) {
this.submitLoading = true
const loading = this.$loading({
lock: true,
text: '数据保存中请稍后',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.formData.startTime=this.formData.paymentTime[0]
this.formData.endTime=this.formData.paymentTime[1]
const formData = clone(this.formData)
const resp = await this.$axios.post(loc() + '/doSave', formData)
loading.close()
this.submitLoading = false
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.$refs.guava.index()
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
},
async projectStatusChange(id) {
const resp = await this.$axios.post(loc() + '/openClosedProject', {id: id})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
},
async getPaymentConfigList(id) {
const resp = await this.$axios.post('/platform/member/payment/config/getPaymentConfigList')
if (resp.code === 0) {
this.configList = resp.data
}
},
},
async created() {
await this.getPaymentConfigList()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,185 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
:clearable="false"
@change="doSearch();getProjectList()"
placeholder="选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="缴费项目">
<el-select
placeholder="请选择项目"
v-model="pageForm.paymentProjectId"
style="width: 100%"
:clearable="false"
@change="doSearch"
@clear="doSearch"
filterable="true"
>
<el-option v-for="item in paymentProjectList"
:label="item.projectName" :value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="工号/姓名">
<el-input placeholder="请输入工号/姓名" v-model="pageForm.searchKeyword" clearable></el-input>
</search-item>
<search-item label="交易单号">
<el-input placeholder="请输入交易单号"
v-model="pageForm.transactionId" clearable>
</el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="缴费列表">
<el-radio-group @change="doSearch" class="mr10" size="small"
v-model="pageForm.isRefund">
<el-radio-button :label="3">全部</el-radio-button>
<el-radio-button :label="0">未退款</el-radio-button>
<el-radio-button :label="1">已退款</el-radio-button>
</el-radio-group>
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
class="vi-table"
ref="table"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
>
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isRefund'">
<span v-if="row.isRefund" style="color: red">已全额退款</span>
<span v-else style="color: #2cd000">支付成功</span>
</template>
<template scope="{row}" v-else-if="column.prop==='tradingAmount'">
{{row.tradingAmount*0.01}}
</template>
<template scope="{row}" v-else-if="column.prop==='refundTime'">
<span v-if="!row.refundTime"></span>
<span
v-else>{{moment(row.refundTime).format("YYYY-MM-DD HH:mm:ss")}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
prop="userOnline" width="200px">
<template scope="{row}">
<el-button :disabled="row.isRefund" @click="doRefund(row)"
size="mini" type="danger" :loading="submitLoading">退款
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
paymentProjectList: [],
pageForm: {
isRefund: 3,
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "unitName", label: "单位", sortable: true },
{ prop: "unionName", label: "工会", sortable: true },
{ prop: "projectName", label: "项目名称", sortable: true },
{ prop: "tradingAmount", label: "缴费金额(元)", sortable: true },
{ prop: "paymentTime", label: "支付时间", sortable: true },
{ prop: "transactionId", label: "交易单号", sortable: true },
{ prop: "isRefund", label: "是否退款", sortable: true },
{ prop: "refundTime", label: "退款到账时间", sortable: true }
]
}
},
methods: {
doRefund(row) {
this.$confirm("退款将在24小时内到账,退款后将不能撤回!您确定要退款吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
this.submitLoading = true
const resp = await this.$axios.post("/platform/member/payment/refund/doRefund", {
id: row.id
})
this.submitLoading = false
if (resp.code === 0) {
this.doSearch()
this.$message({
type: "success",
message: resp.msg
})
} else {
this.$message({
type: "error",
message: resp.msg
})
}
})
},
async getProjectList() {
const resp = await this.$axios.post("/platform/member/payment/project/getAllProject", { year: this.pageForm.year })
if (resp.code === 0) {
this.paymentProjectList = resp.data
this.$set(this.pageForm, "paymentProjectId", this.paymentProjectList ? this.paymentProjectList[0].id : null)
}
}
},
async created() {
await this.getProjectList()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,483 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
:clearable="false"
@change="doSearch();getProjectList()"
placeholder="选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="缴费项目">
<el-select
placeholder="请选择项目"
v-model="pageForm.paymentProjectId"
style="width: 100%"
clearable
@change="doSearch"
@clear="doSearch"
filterable
>
<el-option v-for="item in paymentProjectList" :label="item.projectName" :value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="职工信息">
<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>
</search-item>
<template v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')">
<search-item label="所属工会">
<el-select
placeholder="所属工会"
v-model="pageForm.unionId"
style="width: 100%"
clearable
@change="flushUnits"
@clear="flushUnits"
filterable
>
<el-option v-for="item in unions" :label="item.name" :value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select
placeholder="所属单位"
v-model="pageForm.unitId"
style="width: 100%"
clearable
filterable
>
<el-option v-for="item in units" :label="item.name" :value="item.id"></el-option>
</el-select>
</search-item>
</template>
<search-item label="人员类型">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型" code="PERSON_TYPE"></dict-select>
</search-item>
<search-item label="在职状态">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态" code="UserState"></dict-select>
</search-item>
<search-item label="入职时间">
<el-date-picker
@change="schoolDateChange"
end-placeholder="结束日期"
format="yyyy-MM-dd"
range-separator="-"
start-placeholder="开始日期"
style="width: 100%"
type="datetimerange"
v-model="pageForm.schoolTimeRange"
value-format="yyyy-MM-dd">
</el-date-picker>
</search-item>
<search-item label="退休时间">
<el-date-picker
@change="retireDateChange"
placeholder="请选择退休时间范围"
end-placeholder="结束日期"
format="yyyy-MM-dd"
range-separator="-"
start-placeholder="开始日期"
style="width: 100%"
type="datetimerange"
v-model="pageForm.retireDateRange"
value-format="yyyy-MM-dd">
</el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="缴费列表">
<el-radio-group @change="doSearch" class="mr10" size="small" v-model="pageForm.isPay">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="true">已缴</el-radio-button>
<el-radio-button :label="false">未缴</el-radio-button>
</el-radio-group>
<el-button @click="sendPaymentMsgAll" size="small" type="primary">一键催缴</el-button>
<el-button @click="openModify(false)" size="small" type="primary">批量设为已缴</el-button>
<el-button @click="doPaidToUnPaid(false)" size="small" type="primary">批量设为未缴</el-button>
<el-button v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')" icon="el-icon-s-promotion" type="primary" size="small" :loading="submitLoading" @click="openImport">
导入
</el-button>
<el-button icon="el-icon-document-add" type="primary" size="small" :loading="submitLoading" @click="doExport(false)">
导出
</el-button>
<el-button v-if="$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')" icon="el-icon-document-add" type="primary" size="small" :loading="submitLoading" @click="doExport(true)">
按基层工会导出
</el-button>
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
class="vi-table"
@selection-change="tableHandleSelectionChange"
ref="table"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
>
<el-table-column :reserve-selection="true" type="selection"></el-table-column>
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isPayment'">
<span style="color: #00aa3a" v-if="row.isPayment">已缴</span>
<span style="color: red" v-else>未缴</span>
</template>
<template scope="{row}" v-else-if="column.prop==='paymentMoney'">
<span> {{ Number(row.paymentMoney) / 100 }}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" prop="userOnline" width="250px">
<template scope="{row}">
<el-button v-if="row.isPayment" @click="doPaidToUnPaid(row.id,true)" size="mini" type="primary">设为未缴</el-button>
<el-button v-if="!row.isPayment" @click="sendPaymentMsg(row)" size="mini" type="primary">催缴</el-button>
<el-button v-if="!row.isPayment" @click="openModify(row.id,true)" size="mini" type="primary">设为已缴</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<file-import
ref="viewImport"
temp_url="/platform/member/payment/summary/downloadImportTemp"
post_url="/platform/member/payment/summary/doImport"
:project_id="pageForm.paymentProjectId"
@flush="successImport"
></file-import>
</template>
</guava>
<el-diaLog :close-on-click-modal="false" :visible.sync="modifyVisible" title="已缴设置" width="35%">
<el-form ref="form" :model="formData" :rules="formRules" label-width="80px">
<el-form-item label="缴费金额" prop="paymentMoney">
<el-input placeholder="请输入要缴费的金额" type="number" v-model="formData.paymentMoney"></el-input>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input placeholder="请输入备注" type="text" v-model="formData.remark"></el-input>
</el-form-item>
</el-form>
<div style="text-align: right">
<span>
<el-button @click="modifyVisible = false">取 消</el-button>
<el-button @click="doSubmit" type="primary">确 定</el-button>
</span>
</div>
</el-diaLog>
</div>
<script>
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
paymentProjectList: [],
units: [],
unions: [],
tableColumns: [
{ prop: "loginname", label: "工号", sortable: true },
{ prop: "username", label: "姓名" },
{ prop: "mobile", label: "联系电话" },
{ prop: "schoolTime", label: "入职时间" },
{ prop: "retireDate", label: "退休时间" },
{ prop: "personType", label: "人员类型", sortable: true },
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "unionname", label: "所属工会", sortable: true },
{ prop: "unitname", label: "所属单位", sortable: true },
{ prop: "isPayment", label: "是否缴费", sortable: true },
{ prop: "paymentMoney", label: "缴费金额", sortable: true }
],
pageForm: {
year: moment().format("YYYY"),
searchName: "u.username",
isPay: false,
searchKeyword: "",
unionId: "",
unitId: "",
threeUnitId: "",
unionGroupId: "",
personType: "",
userState: "",
paymentProjectId: "",
schoolTimeRange: [],
schoolTimeStart: "",
schoolTimeEnd: "",
retireDateRange: [],
retireDateStart: "",
retireDateEnd: "",
},
checkUsers: [],
modifyVisible: false,
formData: {
ids: []
},
formRules: {
paymentMoney: [{ required: true, message: "必填", trigger: ["blur", "change"] }]
}
}
},
components: {
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue"),
},
methods: {
schoolDateChange(val) {
if (val) {
this.pageForm.schoolTimeStart = val[0]
this.pageForm.schoolTimeEnd = val[1]
} else {
this.pageForm.schoolTimeStart = ""
this.pageForm.schoolTimeEnd = ""
}
},
retireDateChange(val) {
if (val) {
this.pageForm.retireDateStart = val[0]
this.pageForm.retireDateEnd = val[1]
} else {
this.pageForm.retireDateStart = ""
this.pageForm.retireDateEnd = ""
}
},
sendPaymentMsgAll() {},
async sendPaymentMsg(row) {
const confirm = await this.$confirm("您确定对【" + row.username + "】会员进行催缴吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm !== "confirm") return
const resp = await this.$axios.post(loc() + "/sendPaymentMsg", { id: row.id })
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
},
/**
* 单个将未缴费设为已缴费
* @param id
* @param flag
*/
openModify(id, flag) {
this.formData = {
paymentMoney: "",
remark: ""
}
if (flag) {
this.checkUsers = []
this.checkUsers.push(id)
this.formData.ids = JSON.stringify(this.checkUsers)
} else {
const ids = this.checkUsers.map((obj) => obj.id)
this.formData.ids = JSON.stringify(ids)
}
if (!this.checkUsers.length) {
this.notifyWarning("请在左侧勾选需要进行操作的数据!")
return
}
this.modifyVisible = true
this.formData.isPay = true
},
async doPaidToUnPaid(id, flag) {
this.formData = {
paymentMoney: "",
remark: ""
}
if (flag) {
this.checkUsers = []
this.checkUsers.push(id)
this.formData.ids = JSON.stringify(this.checkUsers)
} else {
const ids = this.checkUsers.map((obj) => obj.id)
this.formData.ids = JSON.stringify(ids)
}
if (!this.checkUsers.length) {
this.notifyWarning("请在左侧勾选需要进行操作的数据!")
return
}
const confirm = await this.$confirm("您确定要设为【未缴】吗,此操作不可撤销!", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post(loc() + "/modify", this.formData)
if (resp.code === 0) {
this.$refs.table.clearSelection()
this.checkUsers = []
this.notifySuccess(resp.msg)
this.modifyVisible = false
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
},
async doSubmit() {
if (!this.checkUsers.length) {
this.notifyWarning("请在左侧勾选需要进行操作的数据!")
return
}
const formValid = await this.$refs["form"].validate()
if (formValid) {
const confirm = await this.$confirm("您确定要更改缴费信息吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post(loc() + "/modify", this.formData)
if (resp.code === 0) {
this.$refs.table.clearSelection()
this.checkUsers = []
this.notifySuccess(resp.msg)
this.modifyVisible = false
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
}
},
async doDelete(id) {
const confirm = await this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const resp = await this.$axios.post(loc() + "/doRemoveById", { id: id })
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
},
openImport() {
this.$refs.guava.edit(() => {
this.$refs.viewImport.resetImportData()
})
},
successImport() {
this.$refs.guava.index()
this.pageData()
},
doExport(isZip) {
const {year, paymentProjectId, searchName, searchKeyword, unionId, unitId, personType,
userState, isPay, schoolTimeStart, schoolTimeEnd, retireDateStart, retireDateEnd} = this.pageForm
this.$downLoad(loc() + '/doExport', {
searchName: searchName,
searchKeyword: searchKeyword,
unionId: unionId,
unitId: unitId,
isPay: isPay,
year: year,
isZip: isZip,
paymentProjectId: paymentProjectId,
personType: personType,
userState: userState,
schoolTimeStart: schoolTimeStart,
schoolTimeEnd: schoolTimeEnd,
retireDateStart: retireDateStart,
retireDateEnd: retireDateEnd
})
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await this.$businessTool.listUnit(this.pageForm.unionId)
}
},
tableHandleSelectionChange(val) {
this.checkUsers = val
},
async getProjectList() {
const resp = await this.$axios.post("/platform/member/payment/project/getAllProject", { year: this.pageForm.year })
if (resp.code === 0) {
this.paymentProjectList = resp.data
this.$set(this.pageForm, "paymentProjectId", this.paymentProjectList ? this.paymentProjectList[0].id : null)
}
},
async doSearch() {
this.pageData()
}
},
async created() {
if (this.$auth.hasRoleOr("SYSADMIN, SCHOOL_UNION_ADMIN")) {
this.unions = await this.$businessTool.listUnion()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.$set(this.pageForm, "unionId", this.unions ? this.unions[0].id : null)
this.flushUnits()
}
await this.getProjectList()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,337 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="search">
<search-item label="年度">
<el-date-picker
:clearable="false"
clearable
@change="doSearch"
placeholder="选择年度"
type="year" style="width: 100%"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="缴费项目">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.projectName">
</el-input>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="个人缴费列表">
</table-tool>
<el-table :data="tableData" :size="tableSize"
@sort-change="pageOrder"
class="vi-table"
ref="table" row-key="id" style="width: 100%"
v-loading="tableLoading">
<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"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isPayment'">
<span style="color: #00aa3a" v-if="row.isPayment">已缴</span>
<span style="color: red" v-else>未缴</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="是否确认金额">
<template scope="{row}">
<span style="color: #00aa3a" v-if="row.paymentMoney!=null">已确定</span>
<span style="color: red" v-else>未确定</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="100px">
<template scope="scope">
<el-dropdown @command="dropdownCommand">
<el-button :loading="submitLoading" plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:scope.row}">
查看
</el-dropdown-item>
<el-dropdown-item v-if="!scope.row.isPayment" :command="{type:'edit',data:scope.row}">
设为已缴
</el-dropdown-item>
<el-dropdown-item v-if="scope.row.paymentMoney==null" :command="{type:'pay',data:scope.row}">
确定缴费金额
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #pay>
<el-form :model="formData" :rules="formRules" label-width="100px" ref="form">
<div class="process-title">缴费信息</div>
<el-form-item label="缴费项目" prop="projectName">
<span>{{formData.projectName}}</span>
</el-form-item>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="人员类型" size="medium">
<span>{{formData.personType}}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="会员类型" size="medium">
<span>{{formData.payPersonnel}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="需缴费用" size="medium">
<div v-for="item in payStandard" style="display:flex;justify-content: space-between;margin-left: 30px">
<template v-if="item.payModeValueList.length>0" >
(
<template v-for="(o,i) in item.payModeValueList">
<el-input @change="getMoney(item)" placeholder="" style="width: 200px;" v-model="o.value">
<template slot="prepend">{{o.name}}</template>
</el-input>
<span v-if="(i+1)!=item.payModeValueList.length">+</span>
</template>
) * 0.5% *{{formData.paymentMonth}}个月
</template>
<template v-else>
<span>{{item.payModeValue}}</span>*{{formData.paymentMonth}}个月
</template>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="缴费金额" prop="paymentMoney" size="medium">
<el-input disabled="true" placeholder="" style="width: 200px;" v-model="formData.paymentMoney">
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div>
<el-button @click="doSave" v-loading="submitLoading" style="float: right"
type="primary">
提交
</el-button>
</div>
</template>
<template #view>
<el-form :model="formData" label-width="100px" ref="form">
<div class="process-title">缴费信息</div>
<el-form-item label="缴费项目" prop="projectName">
<span>{{formData.projectName}}</span>
</el-form-item>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="人员类型" size="medium">
<span>{{formData.personType}}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="会员类型" size="medium">
<span>{{formData.payPersonnel}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="缴纳标准" size="medium">
<div v-for="item in payStandard" style="display:flex;justify-content: space-between;margin-left: 30px">
<span v-if="item.payModeValueList.length>0" >
(
<span v-for="(o,i) in item.payModeValueList">
<span>{{o.name}}</span>
<span v-if="(i+1)!=item.payModeValueList.length">+</span>
</span>
) * 0.5% *{{formData.paymentMonth}}个月
</span>
<template v-else>
<span>{{item.payModeValue}}</span>*{{formData.paymentMonth}}个月
</template>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="缴费金额" size="medium">
<span>{{formData.paymentMoney}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="缴费月份" size="medium">
<span>{{formData.paymentStartMonth}} - {{formData.paymentEndMonth}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="缴费开始时间" size="medium">
<span>{{formData.startTime}} - {{formData.endTime}}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
pageForm: {
year: moment().format('YYYY'),
},
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'projectName', label: '缴费项目名称'},
{prop: 'paymentStartMonth', label: '缴费开始月份'},
{prop: 'paymentEndMonth', label: '缴费截止月份'},
{prop: 'paymentMonth', label: '需要缴费月数'},
{prop: 'startTime', label: '缴费开始时间'},
{prop: 'endTime', label: '缴费截止时间'},
{prop: 'paymentMoney', label: '缴费金额'},
{prop: "isPayment", label: "是否缴费", sortable: true},
],
payStandard:{},
formRules: {
paymentMoney: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'edit') {
this.doPay(data)
} else if (type === 'pay'){
this.openPay(data)
} else if (type === 'view'){
this.openView(data)
}
},
openPay(data){
const payStandards=JSON.parse(data.payStandards)
this.payStandard=payStandards.filter(item => item.personType===data.personType&&item.payPersonnel===data.payPersonnel)
if (this.payStandard.length>0&&this.payStandard[0].payModeValueList===null){
this.formData.paymentMoney=+this.payStandard[0].payModeValue*+this.formData.paymentMonth
}
this.formData=data
this.$refs.guava.pay()
},
async doPay(data) {
const confirm = await this.$confirm("您确定要更改缴费信息吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
if (confirm === "confirm") {
const formData={
ids:JSON.stringify([data.id]),
paymentMoney:data.paymentMoney,
isPay:data.isPay,
remark:"缴费"
}
const resp = await this.$axios.post("/platform/member/payment/summary/modify", formData)
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
},
openView(data) {
const payStandards=JSON.parse(data.payStandards)
this.payStandard=payStandards.filter(item => item.personType===data.personType&&item.payPersonnel===data.payPersonnel)
if (this.payStandard.length>0&&this.payStandard[0].payModeValueList===null){
this.formData.paymentMoney=+this.payStandard[0].payModeValue*+this.formData.paymentMonth
}
this.formData=data
this.$refs.guava.view()
},
async doSave() {
const formValid = await this.$refs["form"].validate()
if (formValid) {
this.submitLoading = true
const loading = this.$loading({
lock: true,
text: '数据保存中请稍后',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const formData = clone(this.formData)
const resp = await this.$axios.post(loc() + '/doSave', formData)
loading.close()
this.submitLoading = false
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.$refs.guava.index()
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
}
},
getMoney(item){
this.formData.paymentMoney=0
let money=0
item.payModeValueList.forEach(o=>{
money=+o.value+money
})
this.formData.paymentMoney=money*0.005*+this.formData.paymentMonth
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -1,86 +1,155 @@
const ADD_OR_MODIFY_SPECIAL_STAFF = {
template: `
template: /*language=HTML*/ `
<div>
<el-form ref="form" :model="formData" :rules="formRules" label-width="160px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="工号" prop="userId">
<el-select v-model="formData.userId"
:remote-method="queryUser"
filterable
remote
:disabled="isView"
reserve-keyword
placeholder="请输入工号或者姓名查找"
style="width: 100%"
@change="getUserInfo">
<el-option v-for="item in users"
:key="item.id"
:label="item.username+'('+item.loginname+')' + '--' + item.unionName + '('+item.unitName + ')'"
:value="item.id"></el-option>
</el-select>
<!-- <el-input v-model="formData.userName" :disabled="formData.userId!=null" placeholder="工号"></el-input>-->
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名" prop="username">
<el-input v-model="formData.username" placeholder="请输入工号查询,查询后自动读取" readonly :disabled="isView"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span=12>
<el-form-item label="所属单位(人事关系)" prop="personnelRelationUnitName">
<el-input :value="formData.personnelRelationUnitName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly :disabled="isView"></el-input>
</el-form-item>
</el-col>
<el-col :span=12>
<el-form-item label="所属工会(人事关系)" prop="personnelRelationUnionName">
<el-input :value="formData.personnelRelationUnionName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly :disabled="isView"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span=12>
<el-form-item label="特别人员类型" prop="specialStaffType">
<dict-select v-model="formData.specialStaffType" placeholder="特别人员所属类型" @change="changeType"
:disabled="isView" code="SPECIAL_STAFF_TYPE"></dict-select>
</el-form-item>
</el-col>
<el-col :span=12>
<el-form-item label="备注" prop="specialStaffRemark">
<el-input v-model="formData.specialStaffRemark" placeholder="请输入多单位人员备注" maxlength="200" show-word-limit :disabled="isView"></el-input>
</el-form-item>
</el-col>
</el-row>
<template v-if="formData.isManyUnit">
<el-row :gutter="10">
<el-col :span=12>
<el-form-item label="所属单位(工会关系)" prop="unionRelationUnitId">
<el-select
v-model="formData.unionRelationUnitId"
filterable
clearable
:disabled="isView"
placeholder="请选择工会关系单位"
style="width: 100%"
@change="unionRelationUnitChange">
<el-option v-for="unit in units" :key="unit.id"
:label="unit.name" :value="unit.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span=12>
<el-form-item label="所属工会(工会关系)" prop="unionRelationUnionName">
<el-input :value="formData.unionRelationUnionName" placeholder="请选择工会关系单位查询,查询后自动读取" readonly :disabled="isView"></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
</el-form>
<el-row v-if="!isView" :gutter="10" type="flex" justify="center">
<el-button type="primary" class="submit-btn" @click="doSubmit">提交</el-button>
</el-row>
<el-dialog :title="specialStaffTitle" :visible.sync="specialStaffDialog"
:close-on-click-modal="false" width="50%">
<el-form ref="form" :model="formData" :rules="formRules" label-width="145px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="工号" prop="userId">
<el-select v-model="formData.userId"
:remote-method="queryUser"
filterable
remote
:disabled="isView"
reserve-keyword
placeholder="请输入工号或者姓名查找"
style="width: 100%"
@change="getUserInfo">
<el-option v-for="item in users"
:key="item.id"
:label="item.username+'('+item.loginname+')' + '--' + (item.unionName || '无工会') + '('+item.unitName + ')'"
:value="item.id"></el-option>
</el-select>
<!-- <el-input v-model="formData.userName" :disabled="formData.userId!=null" placeholder="工号"></el-input>-->
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名" prop="username">
<el-input v-model="formData.username" placeholder="请输入工号查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="所属单位(人事关系)" prop="personnelRelationUnitName">
<el-input v-model="formData.personnelRelationUnitName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属工会(人事关系)" prop="personnelRelationUnionName">
<el-input v-model="formData.personnelRelationUnionName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<template v-if="isThreeUnit">
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="所属科室(人事关系)" prop="personnelRelationThreeUnitName">
<el-input v-model="formData.personnelRelationThreeUnitName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工会小组(人事关系)" prop="personnelRelationUnionGroupName">
<el-input v-model="formData.personnelRelationUnionGroupName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="特殊人员类型" prop="specialStaffType">
<dict-select v-model="formData.specialStaffType" placeholder="特别人员所属类型" @change="changeType"
style="width: 100%" :disabled="isView" code="SPECIAL_STAFF_TYPE"></dict-select>
</el-form-item>
</el-col>
</el-row>
<template v-if="formData.isManyUnit">
<el-row :gutter="10">
<el-col :span=12>
<el-form-item label="所属单位(工会关系)" prop="unionRelationUnitId">
<el-select
v-model="formData.unionRelationUnitId"
filterable
clearable
:disabled="isView"
placeholder="请选择工会关系单位"
style="width: 100%"
@change="unionRelationUnitChange">
<el-option v-for="unit in units" :key="unit.id"
:label="unit.name" :value="unit.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span=12>
<el-form-item label="所属工会(工会关系)" prop="unionRelationUnionName">
<el-input v-model="formData.unionRelationUnionName" placeholder="请选择工会关系单位查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<template v-if="isThreeUnit">
<el-row :gutter="10">
<el-col :span=12>
<el-form-item label="所属科室(工会关系)" prop="unionRelationThreeUnitId">
<el-select
v-model="formData.unionRelationThreeUnitId"
filterable
clearable
:disabled="isView"
placeholder="请选择工会关系所属科室"
style="width: 100%"
@change="unionRelationThreeUnitChange"
>
<el-option
v-for="unit in threeUnits"
:key="unit.id"
:label="unit.name"
:value="unit.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span=12>
<el-form-item label="工会小组(工会关系)" prop="unionRelationUnionGroupName">
<el-input :value="formData.unionRelationUnionGroupName" placeholder="请选择工会关系所属科室,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
</template>
<!-- 杭州医学院多单位人员 -->
<template v-if="formData.specialStaffType == 'HMC_RELATION'">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="所属工会(工会关系)" prop="unionRelationUnionId">
<el-select v-model="formData.unionRelationUnionId" filterable
:disabled="isView" @change="unionRelationUnionChange"
clearable placeholder="请选择工会关系所属工会" style="width: 100%">
<el-option v-for="item in unionRelationUnionOptions" :key="item.id"
:label="item.unionname" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row :gutter="10">
<el-col :span=24>
<el-form-item label="备注" prop="specialStaffRemark">
<el-input type="textarea" :rows="3" placeholder="请输入人员备注"
v-model="formData.specialStaffRemark" maxlength="200" show-word-limit></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row v-if="!isView" :gutter="10" style="text-align: right">
<el-button class="submit-btn" @click="specialStaffDialog = false">关闭</el-button>
<el-button class="submit-btn" @click="doSubmit" type="primary">提交</el-button>
</el-row>
</el-dialog>
</div>
`,
store,
@@ -89,13 +158,15 @@ const ADD_OR_MODIFY_SPECIAL_STAFF = {
},
data() {
return {
isThreeUnit: false,
formData: {},
units: [],
specialStaffTypeList: [],
users: [],
formRules: {
userId: [{ required: true, message: "请输入工号", trigger: "change" }],
specialStaffType: [{ required: true, message: "请选择多单位人员类型", trigger: "change" }],
specialStaffType: [{ required: true, message: "请选择人员类型", trigger: "change" }],
unionRelationUnionId: [{ required: true, message: "请选择工会关系所属工会", trigger: "change" }],
specialStaffRemark: [{ required: true, message: "请填写多单位人员备注", trigger: "change" }]
}
}
@@ -52,9 +52,17 @@ layout("/layouts/platform.html"){
:sortable="column.sortable"
header-align="center"
show-overflow-tooltip>
<template v-if="column.prop==='specialStaffType'" scope="{row:{specialStaffType}}">
<dict-tag :options="dict.type.SPECIAL_STAFF_TYPE" :value="specialStaffType"></dict-tag>
</template>
<template scope="{row}" v-if="column.prop==='personnelRelationUnionName'">
<el-tag effect="plain">
{{row.personnelRelationUnionName || '无工会'}}
</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop==='unionRelationUnionName'">
<el-tag>
{{row.unionRelationUnionName || '无工会'}}
</el-tag>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作">
@@ -82,104 +90,362 @@ layout("/layouts/platform.html"){
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<add-or-modify-special-staff :is-view="isView" ref="addOrModifySpecialStaffRef" @finish="$refs.guava.index();doSearch()"></add-or-modify-special-staff>
</template>
<el-dialog :title="specialStaffTitle" :visible.sync="specialStaffDialog"
:close-on-click-modal="false" width="50%">
<el-form ref="form" :model="formData" :rules="formRules" label-width="145px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="工号" prop="userId">
<el-select v-model="formData.userId"
:remote-method="queryUser"
filterable
remote
:disabled="isView"
reserve-keyword
placeholder="请输入工号或者姓名查找"
style="width: 100%"
@change="getUserInfo">
<el-option v-for="item in users"
:key="item.id"
:label="item.username+'('+item.loginname+')' + '--' + (item.unionName || '无工会') + '('+item.unitName + ')'"
:value="item.id"></el-option>
</el-select>
<!-- <el-input v-model="formData.userName" :disabled="formData.userId!=null" placeholder="工号"></el-input>-->
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="姓名" prop="username">
<el-input v-model="formData.username" placeholder="请输入工号查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="所属单位(人事关系)" prop="personnelRelationUnitName">
<el-input v-model="formData.personnelRelationUnitName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属工会(人事关系)" prop="personnelRelationUnionName">
<el-input v-model="formData.personnelRelationUnionName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<template v-if="isThreeUnit">
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="所属科室(人事关系)" prop="personnelRelationThreeUnitName">
<el-input v-model="formData.personnelRelationThreeUnitName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工会小组(人事关系)" prop="personnelRelationUnionGroupName">
<el-input v-model="formData.personnelRelationUnionGroupName" placeholder="请输入工号或姓名查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row :gutter="10">
<el-col :span="12">
<el-form-item label="特殊人员类型" prop="specialStaffType">
<dict-select v-model="formData.specialStaffType" placeholder="特别人员所属类型" @change="changeType"
style="width: 100%" :disabled="isView" code="SPECIAL_STAFF_TYPE"></dict-select>
</el-form-item>
</el-col>
</el-row>
<template v-if="formData.isManyUnit">
<el-row :gutter="10">
<el-col :span=12>
<el-form-item label="所属单位(工会关系)" prop="unionRelationUnitId">
<el-select
v-model="formData.unionRelationUnitId"
filterable
clearable
:disabled="isView"
placeholder="请选择工会关系单位"
style="width: 100%"
@change="unionRelationUnitChange">
<el-option v-for="unit in units" :key="unit.id"
:label="unit.name" :value="unit.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span=12>
<el-form-item label="所属工会(工会关系)" prop="unionRelationUnionName">
<el-input v-model="formData.unionRelationUnionName" placeholder="请选择工会关系单位查询,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<template v-if="isThreeUnit">
<el-row :gutter="10">
<el-col :span=12>
<el-form-item label="所属科室(工会关系)" prop="unionRelationThreeUnitId">
<el-select
v-model="formData.unionRelationThreeUnitId"
filterable
clearable
:disabled="isView"
placeholder="请选择工会关系所属科室"
style="width: 100%"
@change="unionRelationThreeUnitChange"
>
<el-option
v-for="unit in threeUnits"
:key="unit.id"
:label="unit.name"
:value="unit.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span=12>
<el-form-item label="工会小组(工会关系)" prop="unionRelationUnionGroupName">
<el-input :value="formData.unionRelationUnionGroupName" placeholder="请选择工会关系所属科室,查询后自动读取" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
</template>
<!-- 杭州医学院多单位人员 -->
<template v-if="formData.specialStaffType == 'HMC_RELATION'">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="所属工会(工会关系)" prop="unionRelationUnionId">
<el-select v-model="formData.unionRelationUnionId" filterable
:disabled="isView" @change="unionRelationUnionChange"
clearable placeholder="请选择工会关系所属工会" style="width: 100%">
<el-option v-for="item in unionRelationUnionOptions" :key="item.id"
:label="item.unionname" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row :gutter="10">
<el-col :span=24>
<el-form-item label="备注" prop="specialStaffRemark">
<el-input type="textarea" :rows="3" placeholder="请输入人员备注"
v-model="formData.specialStaffRemark" maxlength="200" show-word-limit></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-row v-if="!isView" :gutter="10" style="text-align: right">
<el-button class="submit-btn" @click="specialStaffDialog = false">关闭</el-button>
<el-button class="submit-btn" @click="doSubmit" type="primary">提交</el-button>
</el-row>
</el-dialog>
</guava>
</div>
<script>
<!--#include("addOrModifySpecialStaff.js"){}#-->
new Vue({
el: "#app",
store,
dicts: ['SPECIAL_STAFF_TYPE'],
mixins: [initTableMixins],
data: {
isView: true,
tableColumns: [
{ prop: 'loginname', label: '工号' },
{ prop: 'username', label: '姓名' },
{ prop: 'sex', label: '性别' },
{ prop: 'mobile', label: '联系电话' },
{ prop: 'personType', label: '人员类型', sortable: true },
{ prop: 'userState', label: '在职状态', sortable: true },
{ prop: 'personnelRelationUnionName', label: '所属工会', sortable: true },
{ prop: 'personnelRelationUnitName', label: '所属单位', sortable: true },
{ prop: 'specialStaffType', label: '特别人员类型', sortable: true },
// { prop: 'specialStaffRemark', label: '多单位人员备注', sortable: true, checked: 0 }
],
unions: [],
units: []
},
components: {
'add-or-modify-special-staff': ADD_OR_MODIFY_SPECIAL_STAFF
},
methods: {
dropdownCommand(command) {
const { type, data } = command
if (type === 'view') {
this.openView(data.userId)
} else if (type === 'edit') {
this.openEdit(data.userId)
} else if (type === 'delete') {
this.doDelete(data)
}
},
doDelete(obj) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post('/platform/staff/special/manage/removeSpecialStaff', {userId:obj.userId}).then(res => {
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
}
})
})
},
openEdit(userId) {
this.isView = false
this.$refs.guava.edit(() => {
this.$refs.addOrModifySpecialStaffRef.getUserInfo(userId)
})
},
openView(userId) {
this.isView = true
this.$refs.guava.edit(() => {
this.$refs.addOrModifySpecialStaffRef.getUserInfo(userId)
})
},
personnelAdd() {
this.isView = false
this.$refs.guava.edit(() => {
this.$refs.addOrModifySpecialStaffRef.getUserInfo()
})
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.units = data
})
}
},
async initData() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
this.unions = await this.$businessTool.listUnion(this.pageForm.unionId)
this.units = await this.$businessTool.listUnit()
} else {
this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id)
this.units = await this.$businessTool.listUnit(this.$store.state.user.union.id)
}
},
},
created() {
this.initData()
this.pageData()
},
data() {
return{
isView: true,
isThreeUnit: false,
tableColumns: [
{ prop: 'loginname', label: '工号' },
{ prop: 'username', label: '姓名' },
{ prop: 'sex', label: '性别' },
{ prop: 'mobile', label: '联系电话' },
{ prop: 'personType', label: '人员类型', sortable: true },
{ prop: 'userState', label: '在职状态', sortable: true },
{ prop: 'distSpecialStaffType', label: '特别人员类型', sortable: true },
{ prop: 'personnelRelationUnionName', label: '人事关系工会', sortable: true, width: 180 },
{ prop: 'personnelRelationUnitName', label: '人事关系单位', sortable: true },
{ prop: 'unionRelationUnionName', label: '工会关系工会', sortable: true, width: 180 },
// { prop: 'specialStaffRemark', label: '多单位人员备注', sortable: true, checked: 0 }
],
unions: [],
units: [],
threeUnits: [],
formData: {
personnelRelationThreeUnitName: '',
personnelRelationUnionGroupName: '',
},
specialStaffTypeList: [],
users: [],
formRules: {
userId: [{ required: true, message: "请输入工号", trigger: "change" }],
specialStaffType: [{ required: true, message: "请选择人员类型", trigger: "change" }],
unionRelationUnionId: [{ required: true, message: "请选择工会关系所属工会", trigger: "change" }],
specialStaffRemark: [{ required: true, message: "请填写多单位人员备注", trigger: "change" }]
},
specialStaffDialog: false,
specialStaffTitle: '',
// HMC工会关系工会
unionRelationUnionOptions: []
}
},
methods: {
unionRelationUnionChange(val){
const unionInfo = this.unionRelationUnionOptions.find(v=> v.id === val)
this.formData.unionRelationUnionName = unionInfo.unionname
},
dropdownCommand(command) {
const { type, data } = command
if (type === 'view') {
this.openView(data.userId)
} else if (type === 'edit') {
this.openEdit(data.userId)
} else if (type === 'delete') {
this.doDelete(data)
}
},
doDelete(obj) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post('/platform/staff/special/manage/removeSpecialStaff', {userId:obj.userId}).then(res => {
if (res.code === 0) {
this.pageData()
this.$message.success(res.msg)
}
})
})
},
openEdit(userId) {
this.isView = false
this.formData = {}
this.getUserInfo(userId)
// this.$refs.guava.edit()
this.specialStaffDialog = true
this.specialStaffTitle = "修改人员"
},
openView(userId) {
this.isView = true
this.formData = {}
this.getUserInfo(userId)
// this.$refs.guava.edit()
this.specialStaffDialog = true
this.specialStaffTitle = "查看人员信息"
},
personnelAdd() {
this.isView = false
this.formData = {}
// this.$refs.guava.edit()
this.specialStaffDialog = true
this.specialStaffTitle = "新增人员"
},
getUserInfo(id) {
if (!id && !this.formData.userId) {
return
}
const url = !this.formData.userId
? "/platform/staff/special/manage/getSpecialStaffUserInfo"
: "/platform/staff/special/manage/getUserInfo"
const param = id ? id : this.formData.userId
this.$axios.post(url, { userId: param }).then((resp) => {
if (resp.code === 0) {
this.formData = resp.data
if (resp.data && resp.data.unionRelationThreeUnitId) {
this.getThreeUnits(resp.data.unionRelationUnitId)
}
this.queryUser(this.formData.loginname, false)
}
})
},
changeType() {
const data = this.specialStaffTypeList.find((v) => v.code === this.formData.specialStaffType)
if (data && data.code === "MANY_UNIT") {
this.formData.isManyUnit = true
}
},
unionRelationUnitChange(v) {
this.$set(this.formData, 'unionRelationThreeUnitId', null)
this.$set(this.formData, 'unionRelationUnionGroupName', null)
this.threeUnits = []
if (v) {
this.getThreeUnits(v)
}
const unit = this.units.find((item) => item.id === v)
if (unit) {
this.$set(this.formData, "unionRelationUnitId", unit.id)
this.$set(this.formData, "unionRelationUnitName", unit.name)
this.$set(this.formData, "unionRelationUnionId", unit.unionid)
this.$set(this.formData, "unionRelationUnionName", unit.unionname)
} else {
this.$set(this.formData, "unionRelationUnionId", null)
this.$set(this.formData, "unionRelationUnionName", null)
}
},
unionRelationThreeUnitChange(val) {
if (val) {
const threeUnit = this.threeUnits.find(v => v.id === val)
const groupName = threeUnit.groupname ? threeUnit.groupname : null
this.$set(this.formData, 'unionRelationThreeUnitId', threeUnit.id)
this.$set(this.formData, 'unionRelationThreeUnitName', threeUnit.name)
this.$set(this.formData, 'unionRelationUnionGroupId', threeUnit.uniongroupid)
this.$set(this.formData, 'unionRelationUnionGroupName', groupName)
} else {
this.$set(this.formData, 'unionRelationUnionGroupName', null)
}
},
async getThreeUnits(val) {
this.threeUnits = await threeUnitsByUnionGroupOrUnitId(val)
},
queryUser(keyWord, flag = true) {
if (!keyWord) {
return
}
this.$axios.post("/platform/staff/special/manage/queryUser", { keyWord, flag }).then((res) => {
this.users = res.data
})
},
doSubmit() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.$axios.post("/platform/staff/special/manage/addSpecialStaff", {
data: JSON.stringify(this.formData)
})
.then((resp) => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.formData = {}
this.specialStaffDialog = false
this.pageData()
// this.$refs.guava.index()
}
})
}
})
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.unions = await getUnions()
}
},
async initData() {
this.$businessTool.getDictOptions("SPECIAL_STAFF_TYPE").then((data) => {
this.specialStaffTypeList = data
})
this.unionRelationUnionOptions = await this.$businessTool.listUnion()
this.$businessTool.listUnit().then((data) => {
this.units = data
})
},
},
async created() {
// this.isThreeUnit = await getConfigKey('isThreeUnit') === 'true'
this.initData()
this.pageData()
},
});
</script>
<!--#
@@ -0,0 +1,416 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style>
.parent-card {
margin: 14px;
padding: 12px 12px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 8px 12px #ebedf0;
line-height: 22px;
font-size: 13px;
position: relative;
}
.content-card {
display: flex;
align-items: center;
}
.left-child-card {
display: table;
margin-right: 8px;
}
.left-child-card img {
display: table-cell;
width: 40px;
}
.footer-card {
text-align: right;
}
.footer-card .van-button {
border-radius: 6px;
height: 28px;
}
.pay-content {
}
.pay-content .van-cell {
align-items: center;
justify-content: space-between;
}
.pay-content .van-cell__title {
color: #646566;
}
.pay_img {
display: table;
}
.pay_img img {
display: table-cell;
}
.costFormula {
}
.costFormula .van-cell__title {
max-width: 100px;
}
.van-action-sheet__content {
padding-bottom: 50px;
}
.van-dropdown-menu__bar {
box-shadow: none;
}
.van-empty {
position: relative;
transform: none;
left: 0;
}
</style>
<div id="app" v-cloak>
<van-sticky>
<van-nav-bar @click-left="pjaxReplace('/mobile/index')" left-arrow title="会费支付"></van-nav-bar>
</van-sticky>
<van-dropdown-menu active-color="#1989fa">
<van-dropdown-item v-model="pageForm.year" @change="doSearch" :options="yearList"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.isPay" @change="doSearch" :options="payList"></van-dropdown-item>
</van-dropdown-menu>
<div class="parent-card">
<div v-for="item in tableData">
<div class="content-card">
<div class="left-child-card">
<img src="/assets/mobile/svg/memberPay/icon_xsgj.svg"/>
</div>
<div class="right-child-card">
<div>
<span>项目名称:</span>
<span>{{item.projectName}}</span>
</div>
<div>
<span>所属时间:</span>
<span>{{item.paymentStartMonth}} 至 {{item.paymentEndMonth}}</span>
</div>
<div>
<span>缴费时间:</span>
<span>{{moment(item.startTime).format('MM-DD') + ' 至 ' + moment(item.endTime).format('MM-DD')}}</span>
</div>
</div>
</div>
<div class="footer-card">
<van-button v-if="!item.isPayment" @click.stop="openPay(item)" color="#1867b0" size="small" type="primary">
我要缴费
</van-button>
<template v-else>
<van-button v-if="item.isPayment && !item.isRefund" size="small" type="primary" :disabled="true">
您已缴费
</van-button>
<van-button v-else size="small" type="danger" :disabled="true">
{{ getRefundStates(item.refundState) }}
</van-button>
<!-- <van-button size="small" type="primary" @click.stop="showPayInfo(item)">-->
<!-- 查看详情-->
<!-- </van-button>-->
</template>
</div>
</div>
<van-empty
class="custom-image"
description="暂无缴费记录"
image="https://img01.yzcdn.cn/vant/custom-empty-image.png"
v-if="tableData && tableData.length===0"
></van-empty>
</div>
<van-action-sheet :close-on-click-overlay="false" :title="payInfo.projectName" style="height: 60%" v-model="payVisible" @close="payVisibleClose">
<div class="pay-content">
<template>
<van-cell class="costFormula" title="缴费所属时间">
<template #right-icon>
{{formData.paymentStartMonth}} 至 {{formData.paymentEndMonth}}
</template>
</van-cell>
<van-cell class="costFormula" title="缴费标准">
<template #right-icon>
<div style="color: red"
v-if="formData.payModeValueList&&formData.payModeValueList.length>0">
(
<template v-for="(o,i) in formData.payModeValueList">
{{o.name}}
<template v-if="i != formData.payModeValueList.length - 1">+</template>
</template>
) * 0.5% * {{formData.paymentMonth}}个月
</div>
<div v-else>固定金额缴费</div>
</template>
</van-cell>
<van-field
:label="o.name"
:placeholder="'请输入' + o.name"
@input="moneyInput"
input-align="right"
type="number"
v-for="(o,index) in formData.payModeValueList"
v-model="o.value"
>
<template #left-icon>
<div class="pay_img">
<img src="/assets/mobile/svg/memberPay/money.svg"/>
</div>
</template>
</van-field>
</template>
<van-radio-group checked-color="#1867b0" v-model="moneyModel">
<van-cell @click="moneyModel = 1" clickable title="支付宝">
<template #icon>
<div class="pay_img" style="margin-right: 4px">
<img src="/assets/mobile/svg/memberPay/zfb.svg"/>
</div>
</template>
<template #right-icon>
<van-radio :name="1"></van-radio>
</template>
</van-cell>
<van-cell @click="moneyModel = 2" clickable title="微信">
<template #icon>
<div class="pay_img" style="margin-right: 4px">
<img src="/assets/mobile/svg/memberPay/wx.svg"/>
</div>
</template>
<template #right-icon>
<van-radio :name="2"></van-radio>
</template>
</van-cell>
</van-radio-group>
<van-submit-bar :loading="loading" :price="formData.paymentMoney" @submit="doPay" button-color="#1867b0" button-text="支付"></van-submit-bar>
</div>
</van-action-sheet>
<van-popup :style="{ height: '100%', width: '100%'}" @close="imgClose" closeable position="right" v-model="payToOtherPage">
<van-image src="/assets/mobile/svg/memberPay/zf_img.png" style="margin-top: 40px; height: 95%; width: 100%"></van-image>
</van-popup>
</div>
<script src="https://res2.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
<script>
function onBridgeReady(json) {
// const data = JSON.parse(json)
WeixinJSBridge.invoke("getBrandWCPayRequest", JSON.parse(json), function (res) {
if (res.err_msg === "get_brand_wcpay_request:ok") {
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
})
}
const vue = new Vue({
el: "#app",
mixins: [mobileMixins],
data() {
return {
payToOtherPage: false,
costFormula: "",
payVisible: false,
loading: false,
viewData: {},
tableData: [],
payList: [
{text: '全部', value: null},
{text: '已缴费', value: true},
{text: '未缴费', value: false},
],
pageForm: {
year: new Date().getFullYear(),
isPay: false
},
payInfo: {},
formData: {},
moneyModel: 2,
intervalTimer: null,
hasPayed: false,
tradingStates: [],
refundStates: [],
tradingChannels: []
}
},
methods: {
// showPayInfo(data) {
//
// },
async payVisibleClose() {
clearInterval(this.intervalTimer)
},
doSearch() {
this.pageForm.pageNumber = 1
this.tableData = []
this.finished = false
this.pageData()
},
imgClose() {
this.loading = false
this.payToOtherPage = false
},
moneyInput() {
let paymentMoney = this.formData.payModeValueList.reduce((a, b) => {
return Number(a) + Number(b.value)
}, 0)
console.log(paymentMoney)
const pr = parseFloat((Number(paymentMoney) * 0.005 * this.formData.paymentMonth).toFixed(2))
this.$set(this.formData, "paymentMoney", pr * 100)
},
async doPay() {
if (!this.formData.paymentMoney) {
this.$toast('请计算会费金额')
return
}
if (!this.moneyModel) {
this.$toast('请选择支付方式')
return
}
if(this.moneyModel === 1) {
this.$toast('暂未开通,敬请期待')
return
}
const u = navigator.userAgent
const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) //ios终端
let userAgent = window.navigator.userAgent.toLowerCase()
if (this.moneyModel === 1) {
//是否微信浏览器
if (userAgent.match(/MicroMessenger/i) && userAgent.match(/MicroMessenger/i)[0] === "micromessenger") {
this.payToOtherPage = true
} else {
const resp = await $.get("/mobile/memberCost/AlipayClient/tradePagePay", {
money: paymentMoney,
paymentProjectId: this.payInfo.id
})
const div = document.createElement("div")
div.innerHTML = resp // data就是接口返回的form 表单字符串
document.body.appendChild(div)
//如果是ios,不新开页面直接跳转
if (isiOS) {
document.forms[0].submit()
} else {
document.forms[0].setAttribute("target", "_blank") // 新开窗口跳转
document.forms[0].submit()
}
}
} else if(this.moneyModel === 2) {
if (userAgent.match(/MicroMessenger/i) && userAgent.match(/MicroMessenger/i)[0] === "micromessenger") {
const confirm = await this.$dialog.confirm({
title: '温馨提示',
message: '您确定要支付吗?',
})
if (confirm === 'confirm') {
const loading = this.$toast.loading({
message: '支付中...',
forbidClick: true,
})
this.hasPayed = false
await this.pullWeChatPay()
await this.getIsPay(loading)
}
} else {
this.$toast('微信支付只能在微信APP中使用,请切换支付方式')
}
}
},
//拉起微信支付
async pullWeChatPay() {
const resp = await $.post("/mobile/memberCost/list/pullWeChatPay", {
money: this.formData.paymentMoney,
busId: this.payInfo.id
})
if (resp.code === 0) {
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", onBridgeReady(resp.data))
} else if (document.attachEvent) {
document.attachEvent("WeixinJSBridgeReady", onBridgeReady(resp.data))
document.attachEvent("onWeixinJSBridgeReady", onBridgeReady(resp.data))
}
} else {
onBridgeReady(resp.data)
}
}
},
async getIsPay(loading) {
this.intervalTimer = setInterval(async () => {
const resp = await $.get("/platform/member/payment/mine/getIsPay", { paymentInfoId: this.payInfo.id })
if (resp.code === 0) {
loading.close()
if(resp.data > 0) {
this.hasPayed = true
}
}
}, 2000)
},
async openPay(row) {
this.payInfo = row
const payStandards = JSON.parse(row.payStandards)
const payStandard = payStandards.find(p => p.payPersonnel === row.payPersonnel && p.personType === row.personType)
this.$set(this.formData, "paymentMonth", row.paymentMonth)
this.$set(this.formData, "paymentStartMonth", row.paymentStartMonth)
this.$set(this.formData, "paymentEndMonth", row.paymentEndMonth)
this.$set(this.formData, "paymentInfoId", row.id)
if (payStandard.payModeValue) {
this.$set(this.formData, "payModeValueList", [])
this.$set(this.formData, "paymentMoney", payStandard.payModeValue)
} else {
this.$set(this.formData, "payModeValueList", payStandard.payModeValueList)
this.$set(this.formData, "paymentMoney", 0)
}
this.payVisible = true
},
async pageData() {
const res = await $.post("/platform/member/payment/mine/pageData", this.pageForm)
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++
}
}
},
getRefundStates(data) {
if (!data) {
return
}
return this.refundStates.find(item => item.name === data).refundStateName
},
async getPaymentEnums() {
this.tradingStates = await getEnumOptions("TradingStateEnum")
this.refundStates = await getEnumOptions("RefundStateEnum")
this.tradingChannels = await getEnumOptions("TradingChannelEnum")
}
},
async created() {
let nowYear = new Date().getFullYear()
for (let i = nowYear; i >= nowYear - 9; i--) {
this.yearList.push({ text: i, value: i })
}
await this.pageData()
await this.getPaymentEnums()
},
watch: {
"hasPayed"(val) {
if(val === true) {
clearInterval(this.intervalTimer)
this.$dialog.alert({title: '温馨提示', message: '支付成功'})
this.doSearch()
this.payVisible = false
}
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,134 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style>
.head {
position: relative;
height: 300px;
background-color: #02be6e;
}
.head_img {
position: absolute;
top: 35%;
left: 54%;
transform: translate(-50%, -50%);
}
.head_zfcg {
position: absolute;
top: 63%;
left: 52%;
transform: translate(-50%, -50%);
font-size: 20px;
font-weight: 700;
color: #ffffff;
}
.head_xq {
position: absolute;
top: 70%;
left: 15%;
color: #ffffff;
}
.middle_zfxx {
background: radial-gradient(circle, transparent, transparent 8px, #FFFFFF 8px, #FFFFFF) 170px;
height: 20vh;
position: relative;
top: -25px;
margin-left: 25px;
margin-right: 25px;
}
.middle_x {
margin-right: 20px;
position: relative;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.middle_jine {
position: absolute;
top: 25%;
left: 50%;
transform: translate(-50%, -50%);
font-weight: 700;
font-size: 20px;
color: #02be6e;
}
.middle_zxxx {
position: absolute;
top: 55%;
line-height: 25px;
font-size: 13px;
width: 100%;
}
.app {
background-color: #f7f7f7;
}
</style>
<div id="app" v-cloak>
<div class="head">
<div>
<van-image class="head_img"
src="/assets/mobile/svg/memberPay/paySuccess.svg"></van-image>
<span class="head_zfcg">支付成功</span>
<span class="head_xq">您已付款成功,请返回查看会费情况</span>
</div>
</div>
<div class="middle_zfxx">
<div class="middle_jine">¥{{total_amount}}</div>
<div class="middle_x">
<van-divider dashed></van-divider>
</div>
<div class="middle_zxxx">
<van-row>
<van-col span="8" style="text-align: left;padding-left: 10px;">订单编号</van-col>
<van-col span="16" style="text-align: right;padding-right: 10px;">
{{out_trade_no}}
</van-col>
</van-row>
<van-row>
<van-col span="8" style="text-align: left;padding-left: 10px;">支付时间</van-col>
<van-col span="16" style="text-align: right;padding-right: 10px;">
{{timestamp}}
</van-col>
</van-row>
</div>
</div>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
out_trade_no: 0,
total_amount: 0,
timestamp: 0,
}
},
methods: {},
async created() {
this.out_trade_no = GetQueryString("out_trade_no")
this.total_amount = GetQueryString("total_amount")
this.timestamp = GetQueryString("timestamp").replace("+", " ")
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,198 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-sticky>
<van-nav-bar @click-left="pjaxReplace('/mobile/index')" left-arrow title="缴费汇总"></van-nav-bar>
</van-sticky>
<div>
<van-search v-model="pageForm.search" placeholder="请输入搜索关键词" @search="doSearch">
</van-search>
</div>
<div>
<van-tabs @change="doSearch" v-model="pageForm.isPay">
<van-tab title="未缴费" :name="false"></van-tab>
<van-tab title="已缴费" :name="true"></van-tab>
</van-tabs>
<van-list
v-model="loading"
:finished="finished"
finished-text="没有更多了"
@load="pageData"
>
<van-cell-group>
<van-swipe-cell v-for="item in tableData">
<template #left>
<van-button @click="sendPaymentMsg(item)" style="height: 100%" square type="info" text="催缴" />
</template>
<van-cell >
<template #title>
<span class="custom-title">{{item.username}}</span>({{item.loginname}})
<van-tag :type="item.isPayment?'primary':'danger'">{{item.isPayment?'已缴':'未缴'}}</van-tag>
</template>
<template #label>
<div class="custom-title">人员类型:{{item.personType}}</div>
<div class="custom-title">在职状态:{{item.userState}}</div>
<div class="custom-title">所属工会:{{item.unionname}}</div>
<div class="custom-title">所属单位:{{item.unitname}}</div>
<div class="custom-title">缴费金额:{{item.paymentMoney}}</div>
</template>
<template #right-icon>
<van-button @click="openPay(item)" v-if="!item.isPayment" size="mini" plain type="info">设为已缴</van-button>
</template>
</van-cell>
<template #right>
<van-button style="height: 100%" @click="doDelete(item.id)" square type="danger" text="删除" />
</template>
</van-swipe-cell>
</van-cell-group>
</van-list>
<van-empty
class="custom-image"
description="暂无缴费记录"
image="https://img01.yzcdn.cn/vant/custom-empty-image.png"
v-if="tableData&&tableData.length===0"
></van-empty>
<van-action-sheet v-model="show" title="标题">
<div class="content">
<van-form @submit="onSubmit">
<van-field
v-model="formData.paymentMoney"
name="缴费金额"
label="缴费金额"
type="digit"
placeholder="缴费金额"
:rules="[{ required: true, message: '请填写缴费金额' }]"
></van-field>
<van-field
v-model="formData.remark"
name="备注"
label="备注"
placeholder="备注"
></van-field>
<div style="margin: 16px;">
<van-button round block type="info" native-type="submit">提交</van-button>
</div>
</van-form>
</div>
</van-action-sheet>
</div>
</div>
<script>
const vue = new Vue({
el: "#app",
data() {
return {
tableData: [],
memberActive: 0,
loading: false,
finished: false,
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
username: "",
isPay:false,
search:''
},
option1: [
{ text: '姓名', value: 'u.username' },
{ text: '工号', value: 'u.loginname' },
],
show:false,
formData: {}
}
},
methods: {
async pageData() {
const resp = await $.post("/platform/member/payment/summary/pageData", this.pageForm)
if (resp.code === 0) {
this.tableData = this.tableData.concat(resp.data.list)
this.pageForm.totalCount = resp.data.totalCount
if (this.tableData.length >= this.pageForm.totalCount) {
this.finished = true
} else {
this.pageForm.pageNumber++
}
this.loading = false
}
},
doSearch(){
this.pageForm.pageNumber = 1
if(this.tableData.length==this.pageForm.totalCount){
this.finished = true
}else{
this.finished = false
}
this.tableData = []
this.pageData()
},
async doDelete(id) {
const loading = this.$toast.loading({
message: "加载中...",
forbidClick: true,
overlay: true,
duration: 0
})
const resp = await $.get("/platform/member/payment/summary/doRemoveById", { id: id })
if (resp.code === 0) {
this.$toast.success(resp.msg)
await this.doSearch()
loading.close()
} else {
this.$toast.fail(resp.msg)
}
},
async sendPaymentMsg(row) {
this.$dialog.confirm({
title: '提示',
message: "您确定对【" + row.username + "】会员进行催缴吗?",
}).then(async () => {
const resp = await $.get("/platform/member/payment/summary/sendPaymentMsg", { id: row.id })
if (resp.code === 0) {
this.$toast.success(resp.msg)
await this.doSearch()
} else {
this.$toast.fail(resp.msg)
}
})
},
openPay(item){
this.show=true
this.formData=item
},
onSubmit(){
this.$dialog.confirm({
title: '提示',
message: "您确定要更改缴费信息吗?",
}).then(async () => {
const data={
ids:JSON.stringify([this.formData.id]),
paymentMoney:this.formData.paymentMoney,
remark:this.formData.remark,
isPay:this.formData.isPayment
}
const resp = await $.get("/platform/member/payment/summary/modify", data)
if (resp.code === 0) {
this.$toast.success(resp.msg)
await this.doSearch()
this.show=false
} else {
this.$toast.fail(resp.msg)
}
})
}
},
async created() {
await this.pageData()
}
})
</script>
<!--#
}
#-->