first commit

This commit is contained in:
2026-09-23 09:38:39 +08:00
commit 98a8b8cace
6257 changed files with 1266718 additions and 0 deletions
@@ -0,0 +1,108 @@
let welfareUnitMode = {
UNIT: {
modeName: '福利单位'
},
UNION: {
modeName: '所属工会'
}
}
let welfare = {
welfareUnitMode: "${getSysConfig('WelfareUnitMode')}",
welfareUnitModeName: welfareUnitMode["${getSysConfig('WelfareUnitMode')}"].modeName
}
let welfarePersonTypeList = []
let welfareCommonUrl = "/platform/welfare/common";
let getWelfareUnit = async () => {
const {code, data} = await $.get(welfareCommonUrl + "/welfareUnit")
if (!code) {
return data
}
return []
}
let getComponentUnit = async (unitId) => {
const {code, data} = await $.get(welfareCommonUrl + "/componentUnit", {unitId})
if (!code) {
return data
}
return []
}
let getWelfareProjects = async () => {
const {code, data} = await $.get(welfareCommonUrl + "/welfareProjects")
if (!code) {
return data
}
return []
}
let exportWelfareList = (projectId, personType) => {
let url = welfareCommonUrl + "/exportWelfareList?projectId=" + projectId
if (personType.length > 0) {
url += "&personType=" + JSON.stringify(personType)
}
location.href = url
// window.open(url)
// location.href = welfareCommonUrl + "/exportWelfareList?projectId=" + projectId + "&personType=" + JSON.stringify(personType)
}
let doExportWelfare = (projectId) => {
location.href = welfareCommonUrl + "/doExportWelfare?projectId=" + projectId
}
let doExportWelfareReceive = (projectId) => {
location.href = welfareCommonUrl + "/exportReceive?projectId=" + projectId
}
let exportWelfareListSummary = (projectId) => {
location.href = welfareCommonUrl + "/exportWelfareListSummary?projectId=" + projectId
}
let getPersonTypeListGroupByWelfare = async () => {
const {code, data} = await $.get(welfareCommonUrl + "/getPersonTypeListGroupByWelfare")
if (!code) {
return data
}
return []
}
const minixs = {
methods: {
async yearChange(val) {
if (val) {
const option = this.projectOptions.find(v => v.label === parseInt(val))
if (option) {
this.projectSelectOptions = this.projectOptions.find(v => v.label === parseInt(val)).children
} else {
this.pageForm.projectId = null
this.projectSelectOptions = []
}
} else {
this.projectSelectOptions = []
this.projectOptions.forEach(v => {
this.projectSelectOptions = this.projectSelectOptions.concat(v.children)
})
}
if (this.projectSelectOptions && this.projectSelectOptions.length > 0) {
this.pageForm.projectId = this.projectSelectOptions[0].value
}
this.doSearch()
}
}
}
const judgmentAuthority = "${@shiro.hasRole('sysadmin')||@shiro.hasRole('flwyh01')||@shiro.hasRole('A06')}" === 'true'
const sexOptions = ['男', '女']
let commonColumns = [{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'isReceive', label: '是否领取', sortable: true}]
// {prop: 'campusName', label: '所属校区', sortable: true},]
@@ -0,0 +1,538 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.flexible-gifts {
display: flex;
flex-direction: column
}
.flexible-gifts-item {
display: flex;
}
.flexible-gifts-item:not(:first-of-type) {
margin-top: 15px;
}
.flexible-gifts-item-input {
width: calc(100% - 144px);
}
.flexible-gifts-item-radio {
width: 100px;
text-align: center;
}
.flexible-gifts-item-delete {
width: 44px;
}
.search-item-option .el-date-editor, .search-item-option .el-select {
width: 100%;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
:clearable="true"
@change="yearChange"
placeholder="选择年"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">福利项目:</div>
<div class="search-item-option">
<el-select @change="doSearch" v-model="pageForm.projectId">
<el-option :key="item.value" :label="item.label" :value="item.value"
v-for="item in projectSelectOptions"></el-option>
</el-select>
<!-- <el-cascader style="width: 100%"-->
<!-- v-model="pageForm.projectOption"-->
<!-- :options="projectOptions" @change="projectOptionChange"></el-cascader>-->
</div>
</div>
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
<el-select v-model="pageForm.searchName" slot="prepend" style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select v-model="pageForm.unit" style="width: 100%" filterable clearable
placeholder="请选择">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">性&emsp;&emsp;别:</div>
<div class="search-item-option">
<el-select v-model="pageForm.sex" style="width: 100%" clearable
placeholder="请选择">
<el-option v-for="sex in sexOptions" :label="sex" :value="sex"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="福利名单" :app="this">
<template #func>
<!-- <el-button :disabled="!pageForm.projectId" type="primary" size="small" icon="el-icon-download"-->
<!-- @click="doExportWelfareReceive(pageForm.projectId)">导出领取名单-->
<!-- </el-button>-->
<el-button @click="sendMsgToNotWriteAddressUsers" icon="el-icon-download" size="small"
type="primary"
v-if="pageFormProjectType===3">
发送消息至未填写地址人员
</el-button>
<el-button :disabled="!pageForm.projectId" @click="doWholeReceive(pageForm.projectId)"
icon="el-icon-download" size="small"
type="primary"
v-if="pageFormSignMode===1&&${@shiro.hasRole('sysadmin')||@shiro.hasRole('H05')}">
一键全部领取
</el-button>
<el-button :disabled="!pageForm.projectId" type="primary" size="small" icon="el-icon-download"
@click="openExportWelFareList(pageForm.projectId)">导出签字表
</el-button>
<el-button :disabled="!pageForm.projectId" type="primary" size="small" icon="el-icon-download"
@click="doExportWelfare(pageForm.projectId)">导出名单
</el-button>
<el-button :disabled="!pageForm.projectId" type="primary" size="small" icon="el-icon-plus"
@click="openAdd">添加
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" @sort-change="pageOrder" :size="tableSize"
@selection-change="handleSelectionChange" class="vi-table" ref="table"
v-loading="tableLoading">
<el-table-column
:reserve-selection="true"
:selectable="(row)=>{return !row.isReceive}"
type="selection"
width="55px">
</el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop=='provideTimeStart'" scope="{row}">
<i class="el-icon-time"></i>&ensp;{{row.provideTimeStart}} - {{row.provideTimeEnd}}
</template>
<template v-else-if="column.prop=='unionname'" scope="{row}">
( {{row.unioncode}}){{row.unionname}}
</template>
<template v-else-if="column.prop=='unitname'" scope="{row}">
( {{row.unitcode}}){{row.unitname}}
</template>
<template scope="{row}" v-else-if="column.prop=='isReceive'">
<el-tag type="success" v-if="row.isReceive">已领取</el-tag>
<el-tag type="warning" v-else>未领取</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='gist_list'">
{{row.gist_list?row.gist_list:'暂无'}}
</template>
<template scope="{row}" v-else-if="column.prop=='userSign'">
<el-image :src="row.userSign"
fit="cover"
style="height: 60px" v-if="row.userSign"></el-image>
<el-tag type="warning" v-else>暂无</el-tag>
</template>
<template v-else-if="column.prop=='realWelfareUnitId'" scope="{row}">
<span v-if="!row.editWelfareUnit">{{row.realWelfareUnitName}}</span>
<div v-else>
<el-select v-model="row.modifiedWelfareUnitId" filterable style="width: 160px" clearable
size="small"
placeholder="请选择">
<el-option
v-for="item in welfareUnits"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
:value="item.welfareUnitId">
</el-option>
</el-select>
</div>
</template>
</el-table-column>
<el-table-column label="配送地址" prop="receiveAddress" v-if="pageFormProjectType===3"
width="200px"></el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" width="170px"
fixed="right">
<template scope="{row}">
<div v-if="row.editWelfareUnit">
<el-button size="mini" :loading="row.editWelfareUnitLoading" type="primary"
@click="doEditWelfareUnit(row)">确定
</el-button>
<el-button size="mini" :disabled="row.editWelfareUnitLoading"
@click="row.editWelfareUnit=!row.editWelfareUnit">取消
</el-button>
</div>
<el-button @click="doReceive(row)" plain size="mini" type="primary"
v-if="pageFormSignMode===1&&!row.isReceive&&${@shiro.hasRole('sysadmin')||@shiro.hasRole('H05')}">
领取
</el-button>
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit_func>
<el-button type="primary" @click="$refs.member.save()">提交</el-button>
</template>
<template #edit>
<member ref="member" :id="userId" @save="afterEdit"></member>
</template>
<template #view>
<member ref="memberInfo" :id="userId" view></member>
</template>
</guava>
<el-dialog title="" :visible.sync="exportWelfareListDialog" width="40%">
<el-row class="pt5 pb5 text-danger">勾选需要导出的人员类型</el-row>
<el-row class="pt10 pb10">
<el-checkbox-group v-model="selPersonType">
<el-checkbox v-for="i in welfarePersonTypeList" :label="i.personType"></el-checkbox>
</el-checkbox-group>
</el-row>
<el-row type="flex" justify="end">
<el-button @click="doExportWelFareList" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins, minixs],
computed: {
pageFormProjectType() {
if (this.pageForm.projectId) {
const projectInfo = this.projectSelectOptions.find(v => v.value === this.pageForm.projectId)
if (projectInfo.v) {
return projectInfo.v.provideMode
}
return null
}
return null
},
pageFormSignMode() {
if (this.pageForm.projectId) {
const projectInfo = this.projectSelectOptions.find(v => v.value === this.pageForm.projectId)
if (projectInfo.v) {
return projectInfo.v.signMode
}
return null
}
return null
},
},
data() {
return {
userId: '',
projectOptions: [],
units: [],
welfareUnits: [],
welfareProvideMode: [],
welfareSignMode: [],
welfareNoticePushMode: [],
pageForm: {
year: moment().format('YYYY'),
searchName: 'username'
},
tableColumns: commonColumns.concat([
// {prop: 'realWelfareUnitId', label: '福利发放单位', sortable: true, width: "200px"},
{prop: 'gist_list', label: '所选福利', width: "200px"},
{prop: 'userSign', label: '签字', width: "200px"},
// {prop: 'receiveAddress', label: '邮寄地址', width: "200px"},
]),
formRules: {},
welfare,
welfareUnitMode,
sexOptions,
exportWelfareListDialog: false,
selPersonType: [],
welfare_id: null,
welfarePersonTypeList: [],
projectSelectOptions: [],
choiceList: []
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
},
methods: {
doReceive(row) {
this.$confirm('请确认【' + row.username + '】是否领取?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
this.choiceList.push(row.id)
const resp = await $.post(loc() + "/doWholeReceive", {
id: this.pageForm.projectId,
choices: JSON.stringify(this.choiceList)
});
requestLaterMsgFun(this, resp, async () => {
this.$refs.table.clearSelection();
this.pageData()
})
}
}
});
},
handleSelectionChange(val) {
this.choiceList = val.map(v => v.id);
},
doWholeReceive(id) {
if (this.choiceList.length === 0) {
this.notifyWarning('请现在左侧勾选')
return
}
this.$confirm('确定要一键全部领取吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const resp = await $.post(loc() + "/doWholeReceive", {
id: id,
choices: JSON.stringify(this.choiceList)
});
requestLaterMsgFun(this, resp, async () => {
this.$refs.table.clearSelection();
this.pageData()
})
}
}
});
},
openExportWelFareList(id) {
this.exportWelfareListDialog = true
this.welfare_id = id
},
doExportWelFareList() {
this.exportWelfareList(this.welfare_id, this.selPersonType)
this.exportWelfareListDialog = false
},
exportWelfareList,
doExportWelfare,
doExportWelfareReceive,
async doEditWelfareUnit(row) {
const {listId, modifiedWelfareUnitId} = row
this.$set(row, "editWelfareUnitLoading", true)
const resp = await $.post(loc() + "/editWelfareUnit", {
listId,
welfareUnitId: modifiedWelfareUnitId,
});
requestLaterMsgFun(this, resp, async () => {
this.$set(row, "editWelfareUnitLoading", false)
this.$set(row, "editWelfareUnit", false)
this.pageData()
})
},
projectOptionChange(val) {
this.pageForm.projectId = val[1]
this.doSearch()
},
async joinWelfareList(user) {
await $.post(loc() + "/joinWelfareList", {
projectId: this.pageForm.projectId,
userIds: JSON.stringify([user.id])
})
},
async afterEdit(memData) {
if (!this.userId) {
await this.joinWelfareList(memData)
}
this.userId = ''
this.pageData()
this.$refs.guava.index()
},
openAdd() {
this.formData = {
defaultFlexibleGifts: 0,
flexible: false,
flexibleGifts: [{}]
}
this.$refs.guava.edit()
if (this.$refs.form)
this.$refs.form.resetFields();
},
doDelete(listId) {
this.$confirm('确定要移除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const resp = await $.post(loc() + "/delete", {listId});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
})
}
}
});
},
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.listId)
} else if (type == 'editWelfareUnit') {
this.$set(data, 'modifiedWelfareUnitId', data.realWelfareUnitId)
this.$set(data, 'editWelfareUnit', true)
}
},
openEdit({id}) {
this.userId = id
this.$refs.guava.edit()
},
openView({id}) {
this.userId = id
this.$refs.guava.view()
},
async sendMsgToNotWriteAddressUsers() {
const project = this.projectSelectOptions.find(v => v.value === this.pageForm.projectId)
const projectName = project.label
const confirm = await this.$confirm('您确定要向' + projectName + '未填写地址的人员发送信息吗?', '提示', {
confirmButtonText: '确定',
cancelButtonTest: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/sendMsgToNotWriteAddressUsers/' + project.value)
if (resp.code === 0) {
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
}
},
async created() {
this.projectOptions = await getWelfareProjects()
if (this.projectOptions.length && this.projectOptions[0].children.length) {
this.projectSelectOptions = this.projectOptions.find(v => v.label === new Date().getFullYear()).children
this.$set(this.pageForm, "projectOption", [this.projectOptions[0].value, this.projectOptions[0].children[0].value])
this.$set(this.pageForm, "projectId", this.projectOptions[0].children[0].value)
this.pageData()
}
this.units = await getComponentUnit()
this.welfareUnits = await getWelfareUnit()
this.welfarePersonTypeList = await getPersonTypeListGroupByWelfare()
this.welfarePersonTypeList.map(v => {
this.selPersonType.push(v.personType)
})
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,358 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.flexible-gifts {
display: flex;
flex-direction: column
}
.flexible-gifts-item {
display: flex;
}
.flexible-gifts-item:not(:first-of-type) {
margin-top: 15px;
}
.flexible-gifts-item-input {
width: calc(100% - 144px);
}
.flexible-gifts-item-radio {
width: 100px;
text-align: center;
}
.flexible-gifts-item-delete {
width: 44px;
}
.welfare-list .el-card {
border: none;
}
.search-item-option .el-date-editor, .search-item-option .el-select {
width: 100%;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
:clearable="false"
@change="yearChange"
placeholder="选择年"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">福利项目:</div>
<div class="search-item-option">
<el-select @change="getData" v-model="pageForm.projectId">
<el-option :key="item.value" :label="item.label" :value="item.value"
v-for="item in projectSelectOptions"></el-option>
</el-select>
<!-- <el-cascader style="width: 100%"-->
<!-- v-model="pageForm.projectOption"-->
<!-- :options="projectOptions" @change="projectOptionChange"></el-cascader>-->
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="发放名单汇总" :app="this">
<template #func>
<el-button :disabled="!pageForm.projectId" type="primary" size="small" icon="el-icon-download"
@click="exportWelfareListSummary(pageForm.projectId)">导出
</el-button>
</template>
</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" show-summary>
<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=='welfareUnitName'" scope="{row}">
({{row.welfareUnitCode}}){{row.welfareUnitName}}
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" width="170px"
fixed="right">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
<template #view class="welfare-list">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">福利项目:</div>
<div class="search-item-option">
<el-cascader style="width: 100%" disabled
v-model="pageForm.projectOption"
:options="projectOptions" @change="projectOptionChange"></el-cascader>
</div>
</div>
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="listPageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
<el-select v-model="listPageForm.searchName" slot="prepend" style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select v-model="listPageForm.unit" style="width: 100%" filterable clearable
placeholder="请选择">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">性&emsp;&emsp;别:</div>
<div class="search-item-option">
<el-select v-model="listPageForm.sex" style="width: 100%" clearable
placeholder="请选择">
<el-option v-for="sex in sexOptions" :label="sex" :value="sex"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="listPageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="listPageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="listDoSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<el-table :data="listTableData" style="width: 100%" row-key="id" @sort-change="listPageOrder"
v-loading="listTableLoading" ref="listTable" class="vi-table">
<el-table-column align="center" header-align="center" type="index" label="序号"
width="80px">
<template scope="{$index}">
{{$index + (listPageForm.pageNumber - 1) * listPageForm.pageSize + 1}}
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in listTableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop=='unionname'" scope="{row}">
({{row.unioncode}}){{row.unionname}}
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="listPageSizeChange"
@current-change="listPageNumberChange"
:current-page="listPageForm.pageNumber"
:page-sizes="[10, 20, 30, 50]"
:page-size="listPageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="listPageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</template>
</guava>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins, minixs],
data() {
return {
exportWelfareListSummary,
listPageForm: {
searchName: 'username',
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: "",
},
listTableData: [],
listTableLoading: false,
listTableColumns: commonColumns,
units: [],
projectOptions: [],
pageForm: {
year: moment().format('YYYY'),
searchName: 'username'
},
tableColumns: [],
formRules: {},
welfare,
welfareUnitMode,
sexOptions,
projectSelectOptions: []
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
},
methods: {
listDoSearch() {
this.listPageForm.pageNumber = 1
this.listPageData()
},
listPageOrder(column) {
this.listPageForm.pageOrderName = column.prop;
this.listPageForm.pageOrderBy = column.order;
this.listPageData();
},
listPageNumberChange(val) {
this.listPageForm.pageNumber = val;
this.listPageData();
},
listPageSizeChange(val) {
this.listPageForm.pageSize = val;
this.listPageData();
},
listPageData() {
sublime.showLoadingbar();
this.listTableLoading = true
$.post("/platform/welfare/list/mange/pageData", this.listPageForm, (data) => {
sublime.closeLoadingbar();
this.listTableLoading = false
if (data.code == 0) {
this.listTableData = data.data.list;
this.listPageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
projectOptionChange(val) {
this.pageForm.projectId = val[1]
this.listPageForm.projectId = val[1]
this.doSearch()
},
async openView({welfareUnitId}) {
this.units = await getComponentUnit(welfareUnitId)
this.listPageForm.welfareUnit = welfareUnitId
this.listDoSearch()
this.$refs.guava.view()
},
doSearch() {
this.pageForm.pageNumber = 1
this.getData()
},
async getData() {
sublime.showLoadingbar()
const resp_data = await $.post(loc() + '/pageData', this.pageForm)
sublime.closeLoadingbar()
this.tableData = resp_data.data.tableList
this.tableColumns = [{
prop: 'welfareUnitName',
label: welfare.welfareUnitModeName
}].concat(resp_data.data.tableColumn)
}
},
async created() {
this.projectOptions = await getWelfareProjects()
if (this.projectOptions.length && this.projectOptions[0].children.length) {
this.projectSelectOptions = this.projectOptions.find(v => v.label === new Date().getFullYear()).children
this.$set(this.pageForm, "projectOption", [this.projectOptions[0].value, this.projectOptions[0].children[0].value])
this.$set(this.pageForm, "projectId", this.projectOptions[0].children[0].value)
this.$set(this.listPageForm, "projectId", this.projectOptions[0].children[0].value)
this.getData()
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,630 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.el-table .auditing-row {
background: oldlace;
}
.el-table .audit-error-row {
background: #fa465926;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch();getChangeData()" style="width: 100%">
<el-select v-model="pageForm.searchName" slot="prepend" style="width: 80px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item" v-if="judgmentAuthority">
<div class="search-item-label">{{welfare.welfareUnitModeName}}:</div>
<div class="search-item-option">
<el-select v-model="pageForm.welfareUnit" style="width: 100%" filterable clearable
placeholder="请选择" @change="changeWelfareUnit">
<el-option
v-for="item in welfareUnits"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
:value="item.welfareUnitId">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">组成单位:</div>
<div class="search-item-option">
<el-select v-model="pageForm.unit" style="width: 100%" filterable clearable
placeholder="请选择">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<!-- <div class="search-item" style="width: 22%;">
<div class="search-item-label">所属校区:</div>
<div class="search-item-option">
<el-select v-model="pageForm.campus" style="width: 100%" clearable
placeholder="请选择">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</div>
</div>-->
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">性&emsp;&emsp;别:</div>
<div class="search-item-option">
<el-select v-model="pageForm.sex" style="width: 100%" clearable
placeholder="请选择">
<el-option v-for="sex in sexOptions" :label="sex" :value="sex"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
</div>
</div>
</template>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">人员组成:</div>
<div class="search-item-option">
<el-select v-model="pageForm.member" style="width: 100%" clearable
placeholder="请选择">
<el-option v-for="member in memberOptions" :label="member.name"
:value="member.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">更新日期:</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
v-model="pageForm.changeDateRange"
@change="changeDateRangeChange"
type="datetimerange"
:picker-options="pickerOptions"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
align="right">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">异动类型:</div>
<div class="search-item-option">
<enum-select v-model="pageForm.changeType" value="code" label="description"
style="width:100%"
clearable placeholder="异动类型" enum="UserChangeType"></enum-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch();getChangeData()">搜索
</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="人员列表" :app="this">
<template #func>
<span class="text-danger">更新时间段内人员信息有无变化:</span>
<el-select v-model="pageForm.welfareMember" @change="doSearch();getChangeData()"
:clearable="false" size="small"
style="width: 200px;margin-right: 15px">
<el-option label="全部教职工范围内" :value="0"></el-option>
<el-option label="可发放福利老师" :value="1"></el-option>
<el-option label="不发放福利老师" :value="2"></el-option>
</el-select>
<el-radio-group v-model="pageForm.changed" @change="doSearch();getChangeData()" class="mr5 mt5"
size="small">
<el-radio-button :label="0">全部({{numberData.all}})</el-radio-button>
<el-radio-button :label="1">有变化({{numberData.have}})</el-radio-button>
<el-radio-button :label="2">无变化({{numberData.no}})</el-radio-button>
</el-radio-group>
<enum-select v-if="pageForm.changed==1" v-model="pageForm.changeType" size="small" value="code"
label="description"
style="width:200px"
clearable placeholder="异动类型" enum="UserChangeType"
@change="doSearch();getChangeData()"></enum-select>
<el-button v-show="checkUsers.length" type="primary" size="small" icon="el-icon-edit"
@click="openBatchEdit">
编辑
</el-button>
<el-button size="small" @click="openEdit('')" type="primary" icon="el-icon-plus">
添加
</el-button>
</template>
</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" :row-class-name="tableRowClassName"
lazy
:load="load"
:tree-props="{hasChildren: 'hasHis'}" @selection-change="tableHandleSelectionChange">
<el-table-column type="selection" :reserve-selection="true"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop==='loginname'" scope="{row}">
<el-link type="primary" @click="openView(row)">{{row.loginname}}</el-link>
</template>
<template v-else-if="column.prop=='unionname'" scope="{row}">
( {{row.unioncode}}){{row.unionname}}
</template>
<template v-else-if="column.prop=='unitname'" scope="{row}">
( {{row.unitcode}}){{row.unitname}}
</template>
</el-table-column>
<el-table-column label="异动信息" header-align="center">
<el-table-column label="更新时间" prop="changeTime" min-width="100px" header-align="center" sortable
align="center" show-overflow-tooltip>
</el-table-column>
<el-table-column label="异动类型" prop="changeType" header-align="center"
align="center" show-overflow-tooltip sortable>
<template scope="{row}">
<span style="color: #0e78c5">{{changeType[row.changeType]}}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="福利会员" header-align="center" align="center" prop="welfareMember"
show-overflow-tooltip sortable>
<template scope="{row}">
<div v-if="row.flag">
<span v-if="row.welfareMember==1" class="text-success ">
<i
class="fa fa-circle ml5"></i> 是
</span>
<span v-else class="text-danger">
<i class="fa fa-circle ml5"></i> 否
</span>
</div>
</template>
</el-table-column>
<el-table-column label="变更状态" header-align="center" align="center" prop="welfareMember"
show-overflow-tooltip sortable>
<template scope="{row}">
<span v-if="row.stateId">
<vi-table-state :state="row"></vi-table-state>
</span>
<span v-else-if="row.mcrStateId"
:style="'color:'+row.mcrStateColor">{{ row.mcrStateName }}</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作" fixed="right">
<template scope="{row}">
<el-dropdown @command="dropdownCommand" v-if="row.flag">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-if="row.apply" :disabled="row.welfareMember==1"
:command="{type:'apply',data:row}">
设为福利会员
</el-dropdown-item>
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'change',data:row}"
:disabled="row.welfareMember!=1||row.changeUnitAuditing">
变更
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}" v-if="row.welfareMember">
移除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit_func>
<el-button type="primary" @click="$refs.member.save()">提交</el-button>
</template>
<template #edit>
<member ref="member" :id="userId" @save="afterEdit"></member>
</template>
<template #view>
<member ref="memberInfo" :id="userId" :source="source" view></member>
</template>
</guava>
<el-drawer
title="批量编辑"
:visible.sync="batchEditVisible"
:before-close="handleClose" size="1000px">
<el-timeline style="margin-right: 40px">
<el-timeline-item timestamp="" placement="top">
<el-form ref="batchForm" :model="batchFormData" label-width="100px">
<el-row :gutter="60">
<el-col :span="12">
<el-form-item label="所属校区">
<el-select v-model="batchFormData.campus" style="width: 300px" clearable
size="medium"
placeholder="请选择"
@change="checkUsers.map(v=>$set(v,'campusId',batchFormData.campus))">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-timeline-item>
<el-timeline-item timestamp="" placement="top">
<el-table :data="checkUsers" style="width: 100%" row-key="id" class="vi-table"
height="70vh">
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="loginname"
label="工号"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="username"
label="姓名"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unitname"
label="所属单位"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unionname"
label="所属工会"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="campusId"
label="所属校区" width="300px">
<template scope="{row}">
<el-select v-model="row.campusId" style="width: 200px" clearable
size="small"
placeholder="请选择">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="batchEditVisible = false" :disabled="batchEditLoading">取 消</el-button>
<el-button type="primary" @click="doBatchEdit" :loading="batchEditLoading">确定</el-button>
</span>
</el-drawer>
<el-drawer
title="变更"
:visible.sync="changeVisible"
:before-close="handleClose" size="1000px">
<div style="padding: 0 20px">
<mem-change-apply ref="apply" :userid="userId" @submit="doSubmit"></mem-change-apply>
</div>
</el-drawer>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', [start, end]);
}
}]
},
changeVisible: false,
judgmentAuthority,
campusOptions: [],
batchEditLoading: false,
batchEditVisible: false,
checkUsers: [],
batchFormData: {},
changeType: {},
pageForm: {
searchName: 'u.username',
welfareMember: 1,
member: 1,
changed: 0,
},
tableColumns: commonColumns,
welfareUnits: [],
units: [],
userId: '',
source: 'sys_user',
welfare,
welfareUnitMode,
sexOptions,
memberOptions: [{id: 1, name: '全部教职工'}, {id: 2, name: '工会会员'}, {id: 3, name: '非工会会员'}],
numberData: {}
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.4'),
'user-select': httpVueLoader('/components/plugins/UserTableSelect.vue?v=1.0.0'),
'enum-select': httpVueLoader('/components/plugins/EnumSelect.vue?v=1.0.0'),
'mem-change-apply': httpVueLoader('/components/member/MemChangeApply.vue?v=1.0.1'),
},
methods: {
async getChangeData() {
const {data} = await $.post(loc() + "/getChangeNumber", this.pageForm)
this.numberData = data
},
changeDateRangeChange(val) {
this.pageForm.changeDateBefore = val[0]
this.pageForm.changeDateEnd = val[1]
},
tableRowClassName({row: {changeUnitAuditing, changeUnitError}, rowIndex}) {
if (changeUnitAuditing) {
return 'auditing-row';
} else if (changeUnitError) {
return 'audit-error-row';
}
return '';
},
async doSubmit(formData) {
const resp = await $.post(loc() + "/change", formData)
requestLaterMsgFun(this, resp, (data) => {
this.userId = ""
this.$refs.guava.index()
this.changeVisible = false
this.pageData()
}, () => {
}, () => {
this.$refs.apply.closeLoading()
})
},
openChange({id}) {
this.userId = id
this.changeVisible = true
},
openBatchEdit() {
this.batchFormData = {}
this.batchEditVisible = true
},
async doBatchEdit() {
const batch = this.checkUsers.map(v => {
return {id: v.id, campusId: v.campusId}
})
this.batchEditLoading = true
const resp = await $.post("/platform/welfare/member/mange/batchEdit", {users: JSON.stringify(batch)});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
this.$refs.table.clearSelection();
this.batchEditVisible = false
}, null, () => {
this.batchEditLoading = false
})
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {
});
},
tableHandleSelectionChange(val) {
this.checkUsers = val;
},
apply({id, username}) {
this.$confirm('确定将' + username + '设为福利会员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const resp = await $.post(loc() + "/joinWelfareMember", {userIds: JSON.stringify([id])});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
})
}
}
});
},
async joinWelfareMember(memData) {
await $.post(loc() + "/joinWelfareMember", {userIds: JSON.stringify([memData.id])})
},
async afterEdit(memData) {
if (!this.userId) {
await this.joinWelfareMember(memData)
}
this.userId = ''
this.pageData()
this.$refs.guava.index()
},
async load(tree, treeNode, resolve) {
const {loginname} = tree
const resp = await $.get(loc() + "/historyUsers", {loginname})
requestLaterFun(resp, (data) => {
resolve(data)
}, () => {
resolve([])
})
},
doDelete(userId) {
this.$confirm('确定要移除福利会员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const resp = await $.post(welfareCommonUrl + "/kickWelfareMember", {userIds: JSON.stringify([userId])});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
})
}
}
});
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'edit') {
this.openEdit(data.id)
} else if (type == 'delete') {
this.doDelete(data.id)
} else if (type == 'apply') {
this.apply(data)
} else if (type == 'change') {
this.openChange(data)
}
},
openEdit(userId) {
this.userId = userId
this.$refs.guava.edit()
},
openView({id, flag}) {
this.userId = id
this.source = flag ? 'sys_user' : 'user_history'
this.$refs.guava.view()
},
async changeWelfareUnit() {
this.$set(this.pageForm, 'unit', '')
this.units = await getComponentUnit(this.pageForm.welfareUnit)
},
async getChangeType() {
const changeType = {}
const changeTypeOptions = await getEnumOptions("UserChangeType")
changeTypeOptions.forEach(v => {
changeType[v.code] = v.description
})
return changeType
},
},
async created() {
await this.getChangeData()
this.pageData();
this.welfareUnits = await getWelfareUnit()
this.campusOptions = await getCampus()
this.units = await getComponentUnit()
this.changeType = await this.getChangeType()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,285 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
<el-select v-model="pageForm.searchName" slot="prepend" style="width: 80px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">{{welfare.welfareUnitModeName}}:</div>
<div class="search-item-option">
<el-select v-model="pageForm.welfareUnit" style="width: 100%" filterable clearable
placeholder="请选择" @change="changeWelfareUnit">
<el-option
v-for="item in welfareUnits"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
:value="item.welfareUnitId">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">组成单位:</div>
<div class="search-item-option">
<el-select v-model="pageForm.unit" style="width: 100%" filterable clearable
placeholder="请选择">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">所属校区:</div>
<div class="search-item-option">
<el-select v-model="pageForm.campus" style="width: 100%" clearable
placeholder="请选择">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="待审核人员" :app="this">
<template #func>
<el-button v-show="selectedApplies.length" type="primary" size="small" icon="el-icon-document-checked"
@click="openAudit">
审核
</el-button>
</template>
</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"
@selection-change="tableHandleSelectionChange">
<el-table-column type="selection" :reserve-selection="true"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop=='loginname'" scope="{row}">
<el-link type="primary" @click="openView(row)">{{row.loginname}}</el-link>
</template>
<template v-if="column.prop=='stateId'" scope="{row}">
<vi-table-state :state="row"></vi-table-state>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作">
<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-item :command="{type:'audit',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 ref="memberInfo" :id="userId" view></member>
</template>
</guava>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
width="30%">
<div style="font-size: 16px">
<i class="el-icon-question text-primary"></i>&ensp;
是否同意将{{selectedApply?' '+selectedApply.username+' ':'已勾选的人员'}}设置为福利会员?
</div>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="dialogVisible=false" :disabled="submitLoading">取 消</el-button>
<el-button size="small" type="danger" @click="doAudit(false)" :loading="submitLoading">驳 回</el-button>
<el-button size="small" type="primary" @click="doAudit(true)" :loading="submitLoading">通 过</el-button>
</span>
</el-dialog>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
selectedApply: undefined,
selectedApplies: [],
dialogVisible: false,
pageForm: {
searchName: 'u.username',
welfareMember: 0,
},
tableColumns: commonColumns.concat([
{prop: "stateId", label: "状态", sortable: true}
]),
welfareUnits: [],
units: [],
userId: '',
welfare,
welfareUnitMode
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'user-select': httpVueLoader('/components/plugins/UserTableSelect.vue?v=1.0.0'),
'enum-select': httpVueLoader('/components/plugins/EnumSelect.vue?v=1.0.0'),
},
methods: {
openAudit() {
this.selectedApply = undefined
this.dialogVisible = true
},
tableHandleSelectionChange(val) {
this.selectedApplies = val;
},
async doAudit(flag) {
this.submitLoading = true
let applyIds
if (this.selectedApply) {
applyIds = [this.selectedApply.applyId]
} else {
applyIds = this.selectedApplies.map(v => v.applyId)
}
const resp = await $.post(loc() + "/audit", {applyIds: JSON.stringify(applyIds), flag: flag});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
this.dialogVisible = false
this.$refs.table.clearSelection();
}, null, () => {
this.submitLoading = false
})
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data)
} else if (type == 'audit') {
this.selectedApply = data
this.dialogVisible = true
}
},
openView({id}) {
this.userId = id
this.$refs.guava.view()
},
async changeWelfareUnit() {
this.$set(this.pageForm, 'unit', '')
this.units = await getComponentUnit(this.pageForm.welfareUnit)
},
async getChangeType() {
const changeType = {}
const changeTypeOptions = await getEnumOptions("UserChangeType")
changeTypeOptions.forEach(v => {
changeType[v.code] = v.description
})
return changeType
},
},
async created() {
this.pageData();
this.welfareUnits = await getWelfareUnit()
this.campusOptions = await getCampus()
this.units = await getComponentUnit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,644 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
<el-select v-model="pageForm.searchName" slot="prepend" style="width: 80px;">
<el-option label="姓名" value="username"></el-option>
<el-option label="工号" value="loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">{{welfare.welfareUnitModeName}}:</div>
<div class="search-item-option">
<el-select v-model="pageForm.welfareUnit" style="width: 100%" filterable clearable
placeholder="请选择" @change="changeWelfareUnit">
<el-option
v-for="item in welfareUnits"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
:value="item.welfareUnitId">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">组成单位:</div>
<div class="search-item-option">
<el-select v-model="pageForm.unit" style="width: 100%" filterable clearable
placeholder="请选择">
<el-option
v-for="item in units"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">所属校区:</div>
<div class="search-item-option">
<el-select v-model="pageForm.campus" style="width: 100%" clearable
placeholder="请选择">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">性&emsp;&emsp;别:</div>
<div class="search-item-option">
<el-select v-model="pageForm.sex" style="width: 100%" clearable
placeholder="请选择">
<el-option v-for="sex in sexOptions" :label="sex" :value="sex"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">人员类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.personType" style="width: 100%" clearable
placeholder="人员类型"
code="UserType"></dict-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">在职状态:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.userState" style="width: 100%" clearable
placeholder="在职状态"
code="userState"></dict-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="福利会员" :app="this">
<template #func>
<el-dropdown style="margin: 0 10px" @command="pushDropdownCommand">
<el-button type="primary" size="small" icon="el-icon-plus">
添加
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'select'}">选择加入</el-dropdown-item>
<el-dropdown-item :command="{type:'add'}">新增用户</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button v-show="checkUsers.length" type="primary" size="small" icon="el-icon-edit"
@click="openBatchEdit">
设置校区
</el-button>
<el-button v-show="checkUsers.length" type="danger" size="small" icon="el-icon-delete"
@click="kickWelfareMembers">
移除
</el-button>
<el-button type="primary" size="small" icon="el-icon-document-add" @click="openImport">导入名单
</el-button>
</template>
</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"
@selection-change="tableHandleSelectionChange">
<el-table-column type="selection" :reserve-selection="true"></el-table-column>
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:sortable="column.sortable"
:label="column.label"
v-if="column.prop !== 'isReceive'"
:prop="column.prop" :width="column.width" min-width="100px">
<template v-if="column.prop=='loginname'" scope="{row}">
<el-link type="primary" @click="openView(row.id)">{{row.loginname}}</el-link>
</template>
<template v-else-if="column.prop=='unionname'" scope="{row}">
( {{row.unioncode}}){{row.unionname}}
</template>
<template v-else-if="column.prop=='unitname'" scope="{row}">
( {{row.unitcode}}){{row.unitname}}
</template>
<template v-else-if="column.prop=='welfareUnitName'" scope="{row}">
<span v-if="!row.editWelfareUnit">{{row.welfareUnitName}}</span>
<div v-else>
<el-select v-model="row.modifiedWelfareUnitId" style="width: 160px" clearable
size="small"
placeholder="请选择">
<el-option
v-for="item in welfareUnits"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
:value="item.welfareUnitId">
</el-option>
</el-select>
</div>
</template>
<template v-else-if="column.prop=='campusName'" scope="{row}">
<span v-if="!row.editCampus">{{row.campusName}}</span>
<div v-else>
<el-select v-model="row.modifiedCampusId" style="width: 160px" clearable
size="small"
placeholder="请选择">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</div>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="180px" fixed="right">
<template scope="{row}">
<div v-if="row.editCampus">
<el-button size="mini" :loading="row.editCampusLoading" type="primary"
@click="doEditCampus(row)">确定
</el-button>
<el-button size="mini" :disabled="row.editCampusLoading"
@click="row.editCampus=!row.editCampus">取消
</el-button>
</div>
<el-dropdown @command="dropdownCommand" v-else>
<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-item :command="{type:'editCampus',data:row}">
修改校区
</el-dropdown-item>-->
<el-dropdown-item :command="{type:'edit',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}">
移除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit_func>
<el-button type="primary" @click="$refs.member.save()">提交</el-button>
</template>
<template #edit>
<member ref="member" :id="userId" @save="afterEdit"></member>
</template>
<template #view>
<member ref="memberInfo" :id="userId" view></member>
</template>
</guava>
<el-dialog
title="福利名单导入"
:visible.sync="importVisible"
:close-on-click-modal="false"
width="50%"
>
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" type=""
@click="location.href='/platform/basics/downloadTemplate?filePath=welfare/WelfareMemberImportTemplate.xls&fileName=模板.xls'"
icon="el-icon-download">下载模板
</el-button>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-form>
<!-- <el-form-item label="年&emsp;&emsp;度">
<el-date-picker
:clearable="false"
v-model="importData.year"
type="year"
size="medium"
style="width: 200px"
value-format="yyyy"
placeholder="年度">
</el-date-picker>
</el-form-item>-->
<el-upload
name="file"
ref="upload"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
:on-change="(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList,{type:['xls','xlsx']})
}"
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload" style="width: 200px">选择文件
</el-button>
<div class="el-upload__tip" slot="tip" style="color: #F56C6C">
只能上传 xls/xlsx 文件
</div>
</el-upload>
</el-form>
</el-card>
</el-timeline-item>
</el-timeline>
<span slot="footer" class="dialog-footer">
<el-button @click="importVisible = false" :disabled="importLoading">取 消</el-button>
<el-button type="primary" @click="doImport" :loading="importLoading">确定</el-button>
</span>
</el-dialog>
<el-drawer
title="设置校区"
:visible.sync="batchEditVisible"
:before-close="handleClose" size="1000px">
<el-timeline style="margin-right: 40px">
<el-timeline-item timestamp="" placement="top">
<el-form ref="batchForm" :model="batchFormData" label-width="100px">
<el-row :gutter="60">
<el-col :span="12">
<el-form-item label="所属校区">
<el-select v-model="batchFormData.campus" style="width: 300px" clearable
size="medium"
placeholder="请选择"
@change="checkUsers.map(v=>$set(v,'campusId',batchFormData.campus))">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-timeline-item>
<el-timeline-item timestamp="" placement="top">
<el-table :data="checkUsers" style="width: 100%" row-key="id" class="vi-table"
height="70vh">
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="loginname"
label="工号"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="username"
label="姓名"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unitname"
label="所属单位"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="unionname"
label="所属工会"></el-table-column>
<el-table-column show-overflow-tooltip align="center" header-align="center" prop="campusId"
label="所属校区" width="300px">
<template scope="{row}">
<el-select v-model="row.campusId" style="width: 200px" clearable
size="small"
placeholder="请选择">
<el-option
v-for="item in campusOptions"
:key="item.campus_id"
:label="item.campus_name"
:value="item.campus_id">
</el-option>
</el-select>
</template>
</el-table-column>
</el-table>
</el-timeline-item>
</el-timeline>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="batchEditVisible = false" :disabled="batchEditLoading">取 消</el-button>
<el-button type="primary" @click="doBatchEdit" :loading="batchEditLoading">确定</el-button>
</span>
</el-drawer>
<el-drawer
title="添加福利会员"
:visible.sync="selectUserVisible"
:before-close="handleClose" size="1200px">
<user-select v-model="selectUsers" ref="userSelect" :page_size="10"
:sql_cnd="['(welfareMember is null or welfareMember = 0)']"></user-select>
<span style="position: absolute;bottom: 20px;right: 20px">
<el-button @click="selectUserVisible = false" :disabled="selectUserLoading">取 消</el-button>
<el-button type="primary" @click="doBatchJoinMember" :loading="selectUserLoading">确定</el-button>
</span>
</el-drawer>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
selectUserLoading: false,
selectUserVisible: false,
selectUsers: [],
checkUsers: [],
batchEditVisible: false,
batchEditLoading: false,
batchFormData: {},
importVisible: false,
importData: {
fileList: [],
year: 0
},
importLoading: false,
campusOptions: [],
pageForm: {
searchName: 'username',
},
tableColumns: commonColumns,
welfareUnits: [],
units: [],
userId: '',
welfare,
welfareUnitMode,
sexOptions
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'user-select': httpVueLoader('/components/plugins/UserTableSelect.vue?v=1.0.0'),
},
methods: {
async doBatchJoinMember() {
if (!this.selectUsers.length) {
this.notifyWarning("请先勾选需要设置为福利会员的用户")
return
}
this.selectUserLoading = true
const resp = await $.post(welfareCommonUrl + "/joinWelfareMember", {userIds: JSON.stringify(this.selectUsers)});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
this.$refs.userSelect.init()
this.selectUserVisible = false
}, null, () => {
this.selectUserLoading = false
})
},
pushDropdownCommand({type}) {
if (type == 'select') {
this.selectUsers = []
this.selectUserVisible = true
this.$nextTick(() => {
this.$refs.userSelect.init()
})
} else if (type == 'add') {
this.openEdit('')
}
},
kickWelfareMembers() {
this.$confirm('确定要移除福利会员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {
const resp = await $.post(welfareCommonUrl + "/kickWelfareMember", {
userIds: JSON.stringify(this.checkUsers.map(v => v.id))
});
requestLaterMsgFun(this, resp, async () => {
this.$refs.table.clearSelection();
this.pageData()
})
}
}
})
},
async doBatchEdit() {
const batch = this.checkUsers.map(v => {
return {id: v.id, campusId: v.campusId}
})
this.batchEditLoading = true
const resp = await $.post(loc() + "/batchEdit", {users: JSON.stringify(batch)});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
this.$refs.table.clearSelection();
this.batchEditVisible = false
}, null, () => {
this.batchEditLoading = false
})
},
openBatchEdit() {
this.batchFormData = {}
this.batchEditVisible = true
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {
});
},
tableHandleSelectionChange(val) {
this.checkUsers = val;
},
async doEditCampus(row) {
const {id, modifiedCampusId} = row
this.$set(row, "editCampusLoading", true)
const resp = await $.post(loc() + "/batchEdit", {
users: JSON.stringify([{
id: id,
campusId: modifiedCampusId,
}])
});
requestLaterMsgFun(this, resp, async () => {
this.$set(row, "editCampusLoading", false)
this.$set(row, "editCampus", false)
this.pageData()
})
},
doImport() {
if (!this.importData.fileList) {
this.notifyWarning("请选择文件!")
return
}
const data = new FormData();
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name);
});
this.importLoading = true
$.ajax({
url: loc() + "/importMember",
type: "post",
data: data,
processData: false,
contentType: false,
success: (data) => {
requestLaterMsgFun(this, data, async () => {
this.pageData();
this.importVisible = false
}, () => {
}, () => {
this.importLoading = false
})
},
error: (data) => {
this.notifyWarning("导入失败")
this.importLoading = false
}
});
},
openImport() {
this.importData = {
fileList: [],
year: moment().format('YYYY')
}
this.importVisible = true;
},
doDelete(userId) {
this.$confirm('确定要移除福利会员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const resp = await $.post(welfareCommonUrl + "/kickWelfareMember", {userIds: JSON.stringify([userId])});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
})
}
}
});
},
dropdownCommand(command) {
const {type, data} = command
if (type == 'view') {
this.openView(data.id)
} else if (type == 'edit') {
this.openEdit(data.id)
} else if (type == 'delete') {
this.doDelete(data.id)
} else if (type == 'editCampus') {
this.$set(data, 'modifiedCampusId', data.campusId)
this.$set(data, 'editCampus', true)
}
},
async joinWelfareMember(memData) {
await $.post(welfareCommonUrl + "/joinWelfareMember", {userIds: JSON.stringify([memData.id])})
},
async afterEdit(memData) {
if (!this.userId) {
await this.joinWelfareMember(memData)
}
this.userId = ''
this.pageData()
this.$refs.guava.index()
},
openEdit(userId) {
this.userId = userId
this.$refs.guava.edit()
},
openView(userId) {
this.active = 'info'
this.userId = userId
this.$refs.guava.view()
},
async changeWelfareUnit() {
this.$set(this.pageForm, 'unit', '')
this.units = await getComponentUnit(this.pageForm.welfareUnit)
},
},
async created() {
this.pageData();
this.welfareUnits = await getWelfareUnit()
this.campusOptions = await getCampus()
this.units = await getComponentUnit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,332 @@
<style>
.el-tabs__content {
padding-top: 20px;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch" style="width: 100%">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型"
style="width: 80px;">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">申请时间:</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
v-model="pageForm.dateRange"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd" @change="pageForm.date=JSON.stringify(pageForm.dateRange)">
</el-date-picker>
</div>
</div>
<div class="search-item" v-if="source==2">
<div class="search-item-label">{{welfare.welfareUnitModeName}}:</div>
<div class="search-item-option">
<el-select v-model="pageForm.welfareUnit" style="width: 100%" filterable clearable
placeholder="请选择">
<el-option
v-for="item in welfareUnits"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
:value="item.welfareUnitId">
</el-option>
</el-select>
</div>
</div>
<template v-if="searchMore">
<div class="search-item">
<div class="search-item-label">变更类型:</div>
<div class="search-item-option">
<dict-select v-model="pageForm.type" style="width: 100%" clearable placeholder="变更类型"
code="MemberChangeType"></dict-select>
</div>
</div>
</template>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
<more v-model="searchMore"></more>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="申请列表" :app="this">
<template #func>
<el-radio-group v-model="pageForm.audit" @change="doSearch" size="small"
style="margin-bottom: -7.5px">
<el-radio-button :label="false">全部</el-radio-button>
<el-radio-button :label="true">待我审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-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 v-if="column.prop=='type'" scope="{row:{type}}">
{{changeType[type]}}
</template>
<template v-else-if="column.prop=='applyOrigin'" scope="{row:{applyOrigin}}">
{{changeOrigin[applyOrigin]}}
</template>
<template v-else-if="column.prop=='stateId'" scope="{row}">
<vi-table-state :state="row"></vi-table-state>
</template>
<template v-else-if="column.prop=='unionname'" scope="{row}">
( {{row.unioncode}}){{row.unionname}}
</template>
<template v-else-if="column.prop=='unitname'" scope="{row}">
( {{row.unitcode}}){{row.unitname}}
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center" label="操作"
width="100px">
<template scope="{row}">
<el-button size="small" :loading="row.loading" v-if="row.audit" type="primary"
@click="openAudit(row,true)">审核
</el-button>
<el-button size="small" :loading="row.loading" v-else @click="openAudit(row,false)">查看
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<el-tabs v-model="active">
<el-tab-pane label="个人信息" name="info">
<member ref="memberInfo" :id="info.userId" view></member>
</el-tab-pane>
<el-tab-pane label="变更记录" name="changInfo">
<mem-change-records :userid="info.userId" :audit_info_union="false"></mem-change-records>
</el-tab-pane>
<el-tab-pane label="校工会审核" name="school"
v-if="info.unionAudit">
<el-form class="demo-table-expand" :model="formData" ref="form" :rules="formRules"
label-width="120px" label-suffix=":">
<vi-title title="审核信息"></vi-title>
<template v-if="!info.schoolAudit&&source==2">
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="username" label="审核人员">
<el-input v-model="formData.username"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="auditTime" label="审核时间">
<el-input v-model="formData.auditTime" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="opinion" label="审核意见">
<el-input type="textarea" v-model="formData.auditOpinion" rows="4" maxlength="500"
placeholder="请填写您的审核意见"></el-input>
</el-form-item>
<div style="float: right;margin: 20px 0">
<el-button @click="doAudit(false)" :loading="submitLoading">拒
绝
</el-button>
<el-button type="primary" @click="doAudit(true)"
:loading="submitLoading">通
过
</el-button>
</div>
</template>
<template v-else>
<el-row :gutter="20" v-if="info&&info.schoolAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ info.schoolAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ info.schoolAudit.auditTime }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ info.schoolAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row v-else type="flex" justify="center">
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
</el-form>
</el-tab-pane>
</el-tabs>
</template>
<template #view>
</template>
</guava>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
active: 'info',
submitLoading: false,
formRules: {},
info: {},
formData: {},
pageForm: {
source,
searchName: "u.username",
audit: false
},
welfareUnits: [],
changeOrigin: {},
changeType: {},
tableColumns: [
{prop: 'loginname', label: '工号'},
{prop: 'username', label: '姓名'},
{prop: 'mobile', label: '联系电话'},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'realWelfareUnitName', label: welfare.welfareUnitModeName, sortable: true},
{prop: 'type', label: '变更类型', sortable: true},
{prop: 'applyDate', label: '申请时间', sortable: true},
// {prop: 'applyOrigin', label: '申请方式', sortable: true},
{prop: 'stateId', label: '状态', sortable: true},
],
welfare,
welfareUnitMode,
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'mem-change-records': httpVueLoader('/components/member/MemChangeRecords.vue?v=1.0.2'),
},
methods: {
async doAudit(pass) {
this.formData.auditPass = pass
this.submitLoading = true
const resp = await $.post(loc() + "/doAudit", this.formData)
requestLaterMsgFun(this, resp, () => {
//更新用户信息
this.info.userId = ""
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.submitLoading = false
})
},
async openAudit(row, audit) {
this.$set(row, "loading", true)
const resp = await $.get("/platform/member/common/findChangeApplyInfo", {id: row.id})
requestLaterFun(resp, (data) => {
data.audit = audit
this.info = data
if (audit) {
if (this.pageForm.source == 1) {
this.active = 'union'
} else if (this.pageForm.source == 2) {
this.active = 'school'
}
} else {
this.active = 'info'
}
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
this.formData = {
recordId: row.id,
username: "${@shiro.getPrincipalProperty('username')}",
auditTime: moment().format('YYYY-MM-DD'),
}
}, () => {
this.info = {}
}, () => {
this.$set(row, "loading", false)
})
},
},
async created() {
this.pageData();
if (source == 2) {
this.welfareUnits = await getWelfareUnit()
}
this.changeType = await member.getChangeType()
this.changeOrigin = await member.getChangeOrigin()
}
})
</script>
@@ -0,0 +1,12 @@
<!--#
layout("/layouts/platform.html"){
#-->
<script>
window.source = 2
</script>
<!--#include("/platform/welfare/member/change/audit/Layout.html"){}#-->
<!--#
}
#-->
@@ -0,0 +1,574 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
v-model="pageForm.year"
placeholder="选择年度"
type="year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">任务:</div>
<div class="search-item-option">
<el-select style="width: 100%" v-model="pageForm.taskId">
<el-option :label="item.taskName"
:value="item.id"
v-for="item in memberCheckTaskOptions"></el-option>
</el-select>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select @change="flushUnits" @clear="flushUnits"
clearable="true"
filterable="true"
placeholder="所属工会" style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select clearable="true" filterable="true" 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>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" 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>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" :summary-method="getSummaries" @sort-change="pageOrder"
class="vi-table"
row-key="id"
@expand-change="tableColumnExpandChange"
show-summary style="width: 100%" v-loading="tableLoading">
<el-table-column type="expand">
<template slot-scope="{row}">
<el-table :data="row.checkUsers" style="width: 100%">
<el-table-column header-align="center" label="姓名"
prop="userName"></el-table-column>
<el-table-column header-align="center" label="工号"
prop="loginName"></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">{{changeType[row.changeType]}}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column align="center" header-align="center" label="会员"
prop="member"
show-overflow-tooltip sortable>
<template scope="{row}">
<span class="text-success " v-if="row.member==1">
<i class="fa fa-circle ml5"></i> 是
</span>
<span class="text-danger" v-else>
<i class="fa fa-circle ml5"></i> 否
</span>
</template>
</el-table-column>
<el-table-column header-align="center" label="操作" width="100px">
<template scope="{row:expandRow}">
<el-button @click="openAudit(expandRow,true,row)" size="mini"
type="primary">
审核
</el-button>
</template>
</el-table-column>
</el-table>
</template>
</el-table-column>
<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"
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
show-overflow-tooltip
>
<template scope="{row}" v-if="column.prop=='isFinish'">
<span :class="row.isFinish?'text-success':'text-danger'">
{{row.isFinishText}}
</span>
</template>
</el-table-column>
<!--<el-table-column header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button size="mini" type="primary" @click="openCheck(row)"
:disabled="!(row.apply||row.reApply)">
核对
</el-button>
</template>
</el-table-column>-->
</el-table>
</el-card>
<template #edit>
<el-tabs v-model="active">
<el-tab-pane label="个人信息" name="info">
<member :id="info.userId" ref="memberInfo" view></member>
</el-tab-pane>
<el-tab-pane label="变更记录" name="changInfo">
<mem-change-records :userid="info.userId"></mem-change-records>
</el-tab-pane>
<el-tab-pane label="部门工会审核" name="union">
<el-form :model="formData" :rules="formRules" label-suffix=":"
label-width="120px" ref="form">
<vi-title title="审核信息"></vi-title>
<template v-if="!info.unionAudit&&source==1">
<template v-if="info.type==1">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="原单位">
<el-input :value="info.originUnit.name"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原工会">
<el-input :value="info.originUnion.unionname"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="新单位">
<el-input :value="info.currentUnit.name"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="新工会">
<el-input :value="info.currentUnion.unionname"
disabled></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员" prop="username">
<el-input disabled
v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
<div style="float: right;margin: 20px 0">
<el-button :loading="submitLoading" @click="doAudit(false)">拒
绝
</el-button>
<el-button :loading="submitLoading" @click="doAudit(true)"
type="primary">通
过
</el-button>
</div>
</template>
<template v-else>
<el-row :gutter="20" v-if="info&&info.unionAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ info.unionAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ info.unionAudit.auditTime }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ info.unionAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row justify="center" type="flex" v-else>
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
</el-form>
</el-tab-pane>
<el-tab-pane label="校工会审核" name="school"
v-if="info.unionAudit">
<el-form :model="formData" :rules="formRules" class="demo-table-expand"
label-suffix=":"
label-width="120px" ref="form">
<vi-title title="审核信息"></vi-title>
<template v-if="!info.schoolAudit&&source==2">
<template v-if="info.type==1">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="原单位">
<el-input :value="info.originUnit.name"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原工会">
<el-input :value="info.originUnion.unionname"
disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="新单位">
<!-- <el-input :value="info.currentUnit.name"></el-input>-->
<el-select @change="unitChange"
clearable filterable
placeholder="请选择单位"
style="width: 100%"
v-model="info.currentUnitId">
<el-option
:value="item.id"
:label="item.name"
v-for="item in unitOptions">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="新工会">
<el-input disabled
v-model="info.currentUnionName"></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人员" prop="username">
<el-input disabled
v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="审核意见" prop="opinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
<div style="float: right;margin: 20px 0">
<el-button :loading="submitLoading" @click="doAudit(false)">拒
绝
</el-button>
<el-button :loading="submitLoading" @click="doAudit(true)"
type="primary">通
过
</el-button>
</div>
</template>
<template v-else>
<el-row :gutter="20" v-if="info&&info.schoolAudit">
<el-col :span="12">
<el-form-item label="审核人员">
<span>{{ info.schoolAudit.username }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间">
<span>{{ info.schoolAudit.auditTime }}</span>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="审核意见">
<span>{{ info.schoolAudit.auditOpinion }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row justify="center" type="flex" v-else>
<el-form-item label="暂无审核信息">
</el-form-item>
</el-row>
</template>
</el-form>
</el-tab-pane>
</el-tabs>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
'mem-change-records': httpVueLoader('/components/member/MemChangeRecords.vue?v=1.0.2'),
},
data() {
return {
unions: [],
units: [],
tableColumns: [
{prop: 'unionname', label: '部门工会名称', sortable: true},
{prop: 'unioncode', label: '部门工会编码', sortable: true},
{prop: 'memberNum', label: '会员人数', sortable: true},
{prop: 'isFinish', label: '是否核对完成', sortable: true},
{prop: 'notCheckNum', label: '待核对人数', sortable: true},
],
pageForm: {
year: new Date().getFullYear() + ''
},
memberCheckTaskOptions: [],
changeType: {},
userId: null,
active: 'school',
info: {},
source: 2,
formData: {},
unitOptions: [],
}
},
methods: {
getSummaries(param) {
const {columns, data} = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if ([1, 2, 3, 5].includes(index)) {
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;
},
openCheck(row) {
this.userId = row.id
this.$refs.guava.edit()
},
async getMemberCheckTaskOptions() {
const resp = await $.get('/platform/welfareMember/check/task/getAllTask', {year: this.pageForm.year})
this.memberCheckTaskOptions = resp.data
if (this.memberCheckTaskOptions.length) {
this.$set(this.pageForm, 'taskId', this.memberCheckTaskOptions[0].id)
}
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
async getChangeType() {
const changeType = {}
const changeTypeOptions = await getEnumOptions("UserChangeType")
changeTypeOptions.forEach(v => {
changeType[v.code] = v.description
})
return changeType
},
async pageData() {
sublime.showLoadingbar()
const resp = await $.post(loc() + '/pageData', this.pageForm)
sublime.closeLoadingbar()
if (resp.code === 0) {
this.tableData = resp.data
} else {
this.notifyWarning(resp.msg)
}
},
async tableColumnExpandChange(row, expandedRows) {
if (expandedRows.length) {
const {taskId} = this.pageForm
const {id: unionId} = row
const resp = await $.post(loc() + '/getNotCheckUsers', {taskId, unionId})
if (resp.code === 0) {
this.$set(row, 'checkUsers', resp.data)
}
}
},
async openAudit(expandRow, audit, row) {
if (!row.isFinish) {
this.notifyWarning('待院工会完成核对后才可审核')
return
}
const resp = await $.get("/platform/member/common/findChangeApplyInfo", {id: expandRow.id})
requestLaterFun(resp, (data) => {
data.audit = audit
data.currentUnionName = data.currentUnion ? data.currentUnion.unionname : null
this.info = data
if (audit) {
this.active = 'school'
} else {
this.active = 'info'
}
this.$refs.guava.edit()
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
this.formData = {
recordId: expandRow.id,
username: "${@shiro.getPrincipalProperty('username')}",
auditTime: moment().format('YYYY-MM-DD'),
}
}, () => {
this.info = {}
}, () => {
})
},
async doAudit(pass) {
this.formData.currentUnitId = this.info.currentUnitId
this.formData.currentUnionId = this.info.currentUnionId
this.formData.auditPass = pass
this.submitLoading = true
const resp = await $.post("/platform/member/change/audit/doAudit", this.formData)
requestLaterMsgFun(this, resp, () => {
//更新用户信息
this.info.userId = null
this.pageData()
this.$refs.guava.index()
}, null, (v) => {
this.submitLoading = false
})
},
unitChange(v) {
const unit = this.unitOptions.find(x => x.id === v)
if (unit) {
this.info.currentUnionId = unit.unionid
this.info.currentUnionName = unit.unionname
} else {
this.info.currentUnionId = ''
this.info.currentUnionName = ''
}
},
},
async created() {
await this.getMemberCheckTaskOptions()
if (this.pageForm.taskId != null) {
this.pageData()
}
this.unions = await getUnions(null)
this.unitOptions = await getUnits(null)
this.flushUnits()
this.changeType = await this.getChangeType()
}
})
</script>
<style>
.el-table__expand-icon {
color: red;
}
</style>
<!--#
}
#-->
@@ -0,0 +1,183 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
v-model="pageForm.year"
placeholder="选择年度"
type="year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" 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="openAdd" icon="el-icon-plus" size="small" type="primary">新增任务</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" class="vi-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
align="center"
header-align="center"
:label="column.label"
show-overflow-tooltip
:prop="column.prop"
:sortable="column.sortable"
v-for="column in tableColumns"
>
</el-table-column>
<el-table-column header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="openEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
<el-dialog :close-on-click-modal="false" :title="dialogTitle" :visible.sync="dialogVisible" width="40%">
<el-form :model="formData" :rules="rules" label-width="80px" ref="form">
<el-form-item label="任务名称" prop="taskName">
<el-input maxlength="20" v-model="formData.taskName"></el-input>
</el-form-item>
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
placeholder="选择开始时间"
type="datetime"
v-model="formData.startTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
placeholder="选择结束时间"
type="datetime"
v-model="formData.endTime"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="任务说明" prop="description">
<el-input maxlength="50"
type="textarea"
v-model="formData.description"></el-input>
</el-form-item>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="dialogVisible=false">取消</el-button>
<el-button @click="doSubmit" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
computed: {
dialogTitle() {
return this.formData.id ? '编辑任务' : '新增任务'
}
},
data() {
return {
tableColumns: [
{prop: 'taskName', label: '任务名称', sortable: true},
{prop: 'year', label: '年度', sortable: true},
{prop: 'startTime', label: '开始时间', sortable: true},
{prop: 'endTime', label: '结束时间', sortable: true},
],
dialogVisible: false,
rules: {
taskName: [{required: true, message: '请输入', trigger: ['change', 'blur']}],
startTime: [{required: true, message: '请选择', trigger: ['change', 'blur']}],
endTime: [{required: true, message: '请选择', trigger: ['change', 'blur']}],
description: [{required: true, message: '请输入', trigger: ['change', 'blur']}]
},
formData: {
startTime: null,
endTime: null,
description: null
},
pageForm: {
year: new Date().getFullYear() + ''
}
}
},
methods: {
openAdd() {
this.dialogVisible = true
this.$refs['form'].resetFields()
},
openEdit(row) {
this.dialogVisible = true
this.$nextTick(() => {
this.formData = {...row}
})
},
async doSubmit() {
const valid = await this.$refs['form'].validate()
if (!valid) return
const methodName = this.formData.id ? '/doEdit' : '/doAdd'
const resp = await $.post(loc() + methodName, this.formData)
if (resp.code === 0) {
this.pageData()
this.notifySuccess(resp.msg)
this.dialogVisible = false
} else {
this.notifyWarning(resp.msg)
}
},
async doDelete(id) {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.post(loc() + '/doDelete', {id})
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
}
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,383 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
v-model="pageForm.year"
placeholder="选择年度"
type="year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">任务:</div>
<div class="search-item-option">
<el-select style="width: 100%" v-model="pageForm.taskId">
<el-option :label="item.taskName"
:value="item.id"
v-for="item in memberCheckTaskOptions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend"
style="width: 80px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="u.username"></el-option>
<el-option label="工号" value="u.loginname"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item" v-if="judgmentAuthority">
<div class="search-item-label">{{welfare.welfareUnitModeName}}:</div>
<div class="search-item-option">
<el-select @change="changeWelfareUnit" clearable filterable
placeholder="请选择"
style="width: 100%" v-model="pageForm.welfareUnit">
<el-option
:value="item.welfareUnitId"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
v-for="item in welfareUnits">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">组成单位:</div>
<div class="search-item-option">
<el-select clearable filterable placeholder="请选择" style="width: 100%"
v-model="pageForm.unit">
<el-option
:value="item.id"
:key="item.id"
:label="item.name"
v-for="item in units">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" 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>
<span class="text-danger">更新时间段内人员信息有无变化:</span>
<el-select :clearable="false" @change="doSearch();getChangeData()"
size="small" style="width: 200px;margin-right: 15px"
v-model="pageForm.welfareMember">
<el-option :value="0" label="全部教职工范围内"></el-option>
<el-option :value="1" label="可发放福利老师"></el-option>
<el-option :value="2" label="不发放福利老师"></el-option>
</el-select>
<el-radio-group @change="doSearch();getChangeData()" class="mr5"
size="small"
v-model="pageForm.changed">
<el-radio-button :label="0">全部({{numberData.all}})</el-radio-button>
<el-radio-button :label="1">有变化({{numberData.have}})</el-radio-button>
<el-radio-button :label="2">无变化({{numberData.no}})</el-radio-button>
</el-radio-group>
<enum-select @change="doSearch();getChangeData()" clearable
enum="UserChangeType" placeholder="异动类型"
label="description"
size="small"
style="width:200px" v-if="pageForm.changed==1" v-model="pageForm.changeType"
value="code"></enum-select>
<span class="text-danger mr10" v-if="!allowOperationTask">
该任务不在核对时间内,无法操作
</span>
<el-button :disabled="unionTaskStatus || !allowOperationTask" @click="submitCheck"
icon="el-icon-success"
size="small"
type="primary">
全部核对完成,提交核对
</el-button>
<el-button @click="checkAgain" size="small" type="primary"
v-if="unionTaskStatus">
重新核对
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" class="vi-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
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
</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">{{changeType[row.changeType]}}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column align="center" header-align="center" label="福利会员"
prop="welfareMember"
show-overflow-tooltip sortable>
<template scope="{row}">
<div v-if="row.flag">
<span class="text-success " v-if="row.welfareMember==1">
<i
class="fa fa-circle ml5"></i> 是
</span>
<span class="text-danger" v-else>
<i class="fa fa-circle ml5"></i> 否
</span>
</div>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="变更状态"
prop="welfareMember"
show-overflow-tooltip sortable>
<template scope="{row}">
<span v-if="row.stateId">
<vi-table-state :state="row"></vi-table-state>
</span>
<span :style="'color:'+row.mcrStateColor"
v-else-if="row.mcrStateId">{{ row.mcrStateName }}</span>
</template>
</el-table-column>
<el-table-column header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button :disabled="row.welfareMember!=1 || row.changeUnitAuditing || unionTaskStatus"
@click="openCheck(row)" size="mini"
type="primary">
核对
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<mem-change-apply :userid="userId" :welfare_member="true" @submit="doSubmitChangeUser"
change_mode="check"
ref="apply"></mem-change-apply>
</template>
</guava>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'mem-change-apply': httpVueLoader('/components/member/MemChangeApply.vue?v=1.0.2'),
},
computed: {
allowOperationTask() {
const {taskId} = this.pageForm
if (taskId) {
const task = this.memberCheckTaskOptions.find(v => v.id === taskId)
const startTime = moment(task.startTime).valueOf()
const endTime = moment(task.endTime).valueOf()
const nowDate = Date.now()
return nowDate > startTime && nowDate < endTime
} else {
return false
}
}
},
data() {
return {
judgmentAuthority,
welfare,
welfareUnitMode,
unions: [],
welfareUnits: [],
units: [],
tableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'username', label: '姓名', sortable: true},
{prop: 'sex', label: '性别', sortable: true, width: '100px'},
{prop: 'birthday', label: '出生年月', sortable: true},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitname', label: '所在单位', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
],
pageForm: {
year: new Date().getFullYear() + '',
searchName: 'u.username',
welfareMember: 1,
changed: 0,
taskId: null
},
memberCheckTaskOptions: [],
changeType: {},
userId: null,
unionTaskStatus: false,
numberData: {}
}
},
methods: {
openCheck(row) {
this.userId = row.id
this.$refs.guava.edit()
},
/**
* 提交异动人员
* @returns {Promise<void>}
*/
async doSubmitChangeUser(formData) {
console.log(formData)
formData.taskId = this.pageForm.taskId
const resp = await $.post(loc() + '/doSubmitChangeUser', formData)
this.$refs.apply.closeLoading()
if (resp.code === 0) {
this.userId = null
this.$refs.guava.index()
this.pageData()
} else {
this.notifyWarning(resp.msg)
}
},
/**
* 提交核对
*/
async submitCheck() {
const confirm = await this.$confirm('此操作会提交至校工会确认,请确认核对完成了吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const {taskId} = this.pageForm
const resp = await $.post(loc() + '/submitCheck', {taskId})
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
this.getUnionTaskStatus()
} else {
this.notifyWarning(resp.msg)
}
},
async getMemberCheckTaskOptions() {
const resp = await $.get('/platform/welfareMember/check/task/getAllTask', {year: this.pageForm.year})
this.memberCheckTaskOptions = resp.data
if (this.memberCheckTaskOptions.length) {
this.$set(this.pageForm, 'taskId', this.memberCheckTaskOptions[0].id)
}
},
async getChangeData() {
const {data} = await $.post("/platform/welfare/member/adjustment/getChangeNumber", this.pageForm)
this.numberData = data
},
async flushUnits() {
this.$set(this.pageForm, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'true') {
this.units = await getUnits(this.pageForm.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
async getChangeType() {
const changeType = {}
const changeTypeOptions = await getEnumOptions("UserChangeType")
changeTypeOptions.forEach(v => {
changeType[v.code] = v.description
})
return changeType
},
async getUnionTaskStatus() {
const {taskId} = this.pageForm
const resp = await $.get(loc() + '/getUnionTaskStatus', {taskId})
if (resp.code === 0) {
this.unionTaskStatus = resp.data
}
},
async checkAgain() {
const confirm = await this.$confirm('您确定要重新核对吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const {taskId} = this.pageForm
const resp = await $.get(loc() + '/checkAgain', {taskId})
if (resp.code === 0) {
this.getUnionTaskStatus()
}
},
async changeWelfareUnit() {
this.$set(this.pageForm, 'unit', '')
this.units = await getComponentUnit(this.pageForm.welfareUnit)
},
},
async created() {
await this.getChangeData()
await this.getMemberCheckTaskOptions()
if (this.pageForm.taskId != null) {
this.pageData()
}
this.flushUnits()
this.changeType = await this.getChangeType()
this.getUnionTaskStatus()
this.welfareUnits = await getWelfareUnit()
this.units = await getComponentUnit()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,224 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.flexible-gifts {
display: flex;
flex-direction: column
}
.flexible-gifts-item {
display: flex;
}
.flexible-gifts-item:not(:first-of-type) {
margin-top: 15px;
}
.flexible-gifts-item-input {
width: calc(100% - 144px);
}
.flexible-gifts-item-radio {
width: 100px;
text-align: center;
}
.flexible-gifts-item-delete {
width: 44px;
}
.search-item-option .el-date-editor, .search-item-option .el-select {
width: 100%;
}
</style>
<div class="platform" id="app" v-cloak>
<guava padding="0 5%" ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
:clearable="true"
@change="yearChange"
placeholder="选择年"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">福利项目:</div>
<div class="search-item-option">
<el-select @change="doSearch" v-model="pageForm.projectId">
<el-option :key="item.value" :label="item.label" :value="item.value"
v-for="item in projectSelectOptions"></el-option>
</el-select>
<!-- <el-cascader style="width: 100%"-->
<!-- v-model="pageForm.projectOption"-->
<!-- :options="projectOptions" @change="projectOptionChange"></el-cascader>-->
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" 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>
</template>
</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
align="center"
header-align="center"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
min-width="100px" show-overflow-tooltip v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='provideTimeStart'">
<i class="el-icon-time"></i>&ensp;{{row.provideTimeStart}} - {{row.provideTimeEnd}}
</template>
<template scope="{row}" v-else-if="column.prop=='unionname'">
( {{row.unioncode}}){{row.unionname}}
</template>
<template scope="{row}" v-else-if="column.prop=='unitname'">
( {{row.unitcode}}){{row.unitname}}
</template>
<template scope="{row}" v-else-if="column.prop=='realWelfareUnitId'">
<span v-if="!row.editWelfareUnit">{{row.realWelfareUnitName}}</span>
<div v-else>
<el-select clearable filterable placeholder="请选择" size="small"
style="width: 160px"
v-model="row.modifiedWelfareUnitId">
<el-option
:value="item.welfareUnitId"
:key="item.welfareUnitId"
:label="item.welfareUnitName"
v-for="item in welfareUnits">
</el-option>
</el-select>
</div>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" prop="userOnline"
width="170px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<member :id="userId" ref="memberInfo" view></member>
</template>
</guava>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins, minixs],
data() {
return {
userId: '',
projectOptions: [],
units: [],
welfareUnits: [],
welfareProvideMode: [],
welfareSignMode: [],
welfareNoticePushMode: [],
pageForm: {
year: moment().format('YYYY'),
searchName: 'username'
},
tableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'personType', label: '人员类型', sortable: true},
{prop: 'userState', label: '在职状态', sortable: true},
{prop: 'unitName', label: '所在单位', sortable: true},
{prop: 'unionName', label: '所属工会', sortable: true},
{prop: 'projectName', label: '福利项目', sortable: true},
{prop: 'gist_list', label: '所选礼品', sortable: true},
{prop: 'receiveAddress', label: '邮寄地址', sortable: true},
{prop: 'courierNumber', label: '快递单号', sortable: true},
],
formRules: {},
welfare,
welfareUnitMode,
sexOptions,
selPersonType: [],
welfare_id: null,
welfarePersonTypeList: [],
projectSelectOptions: []
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'member': httpVueLoader('/components/member/MemberInfo.vue?v=1.0.3'),
'dict-select': httpVueLoader('/components/plugins/DictSelect.vue?v=1.0.0'),
},
methods: {
projectOptionChange(val) {
this.pageForm.projectId = val[1]
this.doSearch()
},
openView({userId}) {
this.userId = userId
this.$refs.guava.view()
},
},
async created() {
this.projectOptions = await getWelfareProjects()
this.pageData()
if (this.projectOptions.length && this.projectOptions[0].children.length) {
this.projectSelectOptions = this.projectOptions.find(v => v.label === new Date().getFullYear()).children
this.$set(this.pageForm, "projectOption", [this.projectOptions[0].value, this.projectOptions[0].children[0].value])
this.pageData()
}
this.units = await getComponentUnit()
this.welfareUnits = await getWelfareUnit()
this.welfarePersonTypeList = await getPersonTypeListGroupByWelfare()
this.welfarePersonTypeList.map(v => {
this.selPersonType.push(v.personType)
})
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,723 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.flexible-gifts {
display: flex;
flex-direction: column
}
.flexible-gifts-item {
display: flex;
}
.flexible-gifts-item:not(:first-of-type) {
margin-top: 15px;
}
.flexible-gifts-item-input {
width: calc(100% - 144px);
}
.flexible-gifts-item-radio {
width: 100px;
text-align: center;
}
.flexible-gifts-item-delete {
width: 44px;
}
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 20%">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年&emsp;&emsp;度:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.year"
type="year"
style="width: 100%"
value-format="yyyy"
placeholder="请选择">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">项目名称:</div>
<div class="search-item-option">
<el-input placeholder="请输入内容" clearable v-model="pageForm.name"
@keyup.enter.native="doSearch" style="width:100%"></el-input>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索
</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="福利项目" :app="this">
<template #func>
<el-button icon="el-icon-plus" size="small" type="primary"
v-if="judgmentAuthority"
@click="openAdd">新建福利项目
</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
row-key="id" style="width: 100%"
v-loading="tableLoading" ref="table" class="vi-table">
<el-table-column type="expand">
<template scope="{row}">
<vi-title title="详细信息"></vi-title>
<el-form label-width="120px" label-suffix=":">
<el-row gutter="20">
<el-col span="8">
<el-form-item label="项目名称">
{{ row.name }}
</el-form-item>
</el-col>
<el-col span="8">
<el-form-item label="发放节日">
{{ row.festival }}
</el-form-item>
</el-col>
</el-row>
<el-form-item label="发放地点">
{{ row.provideAddress }}
</el-form-item>
<el-form-item label="弹性福利" v-if="row.flexible">
<el-row v-for="item,i in row.flexibleGifts">
{{i+1}}. {{item.name}} <span v-if="item.isDefault"
class="text-primary">(默认)</span>
</el-row>
</el-form-item>
<el-row gutter="20">
<el-col span="8">
<el-form-item label="发放形式">
{{welfareProvideMode.find(v=>v.code==row.provideMode).description}}
</el-form-item>
</el-col>
<el-col span="8">
<el-form-item label="签收形式">
{{welfareSignMode.find(v=>v.code==row.signMode).description}}
</el-form-item>
</el-col>
<el-col span="8">
<el-form-item label="通知推送">
{{welfareNoticePushMode.find(v=>v.code==row.noticePushMode).description}}
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
</el-table-column>
<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"
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=='provideTimeStart'" scope="{row}">
<i class="el-icon-time"></i>&ensp;{{row.provideTimeStart}} <span
v-if="row.provideTimeEnd">- {{row.provideTimeEnd}}</span>
</template>
<template v-if="column.prop=='gift'" scope="{row}">
<span v-if="row.flexible">福利套餐</span>
<span v-else>{{row.gift}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
prop="userOnline" width="150px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini" :loading="submitLoading">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :disabled="!row.created"
:command="{type:'export',data:row}">
导出签字表
</el-dropdown-item>
<!-- :disabled="moment().valueOf()>=moment(row.provideTimeStart).valueOf()"
-->
<el-dropdown-item
v-if="judgmentAuthority"
:command="{type:'createList',data:row}">
{{row.created?'重新生成福利名单':'生成福利名单'}}
</el-dropdown-item>
<el-dropdown-item v-if="judgmentAuthority"
:command="{type:'edit',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}"
v-if="judgmentAuthority">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #edit>
<el-form :model="formData" :rules="formRules" label-width="120px" ref="form"
v-loading="formLoading">
<vi-title title="福利项目信息"></vi-title>
<el-form-item prop="name" label="项目名称">
<el-input v-model="formData.name" placeholder="项目名称" maxlength="100"></el-input>
</el-form-item>
<el-row>
<el-col span="12">
<el-form-item prop="festival" label="发放节日">
<el-select placeholder="发放节日"
style="width: 100%"
filterable
v-model="formData.festival">
<el-option v-for="f in festival" :key="f" :value="f"
:label="f"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="provideTime" label="发放时间">
<el-date-picker
style="width: 100%"
v-model="formData.provideTime"
type="datetimerange"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间" @change="provideTimeChange">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="provideAddress" label="发放地点">
<el-input v-model="formData.provideAddress" placeholder="发放地点"
suffix-icon="el-icon-location-information" maxlength="200"></el-input>
</el-form-item>
<el-row>
<el-col span="6">
<el-form-item label="是否福利套餐" prop="flexible">
<el-switch @change="isCheckBoxChange" v-model="formData.flexible">
</el-switch>
</el-form-item>
</el-col>
<el-col span="6">
<el-form-item label="是否常规" prop="isRoutine" v-if="formData.flexible">
<el-switch v-model="formData.isRoutine">
</el-switch>
</el-form-item>
</el-col>
<el-col span="6">
<el-form-item label="是否多选" prop="isCheckBox" v-if="formData.isRoutine">
<el-switch
@change="isCheckBoxChange"
active-value="checkBox"
inactive-value="radio" v-model="formData.isCheckBox">
</el-switch>
</el-form-item>
</el-col>
<el-col span="6">
<el-form-item label="最多选几个" prop="multiSelectNum"
v-if="formData.isCheckBox=='checkBox'">
<el-input-number :max="10" :min="2"
placeholder="最多选几个" v-model="formData.multiSelectNum"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="福利礼品" prop="gift" v-if="!formData.flexible">
<el-input maxlength="100" placeholder="福利礼品" suffix-icon="el-icon-present"
v-model="formData.gift"></el-input>
</el-form-item>
<template v-if="formData.flexible">
<el-form-item label="福利选项" v-if="[2,3,4].includes(formData.provideMode)">
<question-naire :subject="formData.welfareProjectSubjects"
ref="questionNaire"
></question-naire>
</el-form-item>
</template>
<el-row>
<el-col span="12">
<el-form-item label="发放形式" prop="provideMode">
<el-radio-group size="small" v-model="formData.provideMode">
<el-radio :key="item.code" :label="item.code"
border v-for="item in welfareProvideMode">
{{item.description}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col span="12" v-if="formData.provideMode===2||formData.provideMode===3">
<el-form-item label="选择时间" prop="choiceTime">
<el-date-picker
@change="choiceTimeChange"
end-placeholder="结束时间"
range-separator="-"
start-placeholder="开始时间"
style="width: 100%"
type="datetimerange"
v-model="formData.choiceTime" value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="signMode" label="签收形式">
<el-radio-group v-model="formData.signMode" size="small">
<el-radio :key="item.code" :label="item.code"
border v-for="item in welfareSignMode">
{{item.description}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="noticePushMode" label="通知推送">
<el-radio-group v-model="formData.noticePushMode" size="small">
<el-radio :key="item.code" :label="item.code"
border v-for="item in welfareNoticePushMode">
{{item.description}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="conditionStructure" label="发放范围">
<el-button @click="$refs.cnd.open()" icon="el-icon-s-operation" size="small">
打开
</el-button>
</el-form-item>
<el-form-item label="封面图片" prop="cover">
<!-- <file-upload :files.sync=""></file-upload>-->
<el-upload
:action="FILE_UPLOAD_ADDRESS"
:before-upload="beforeAvatarUpload"
:on-success="handleAvatarSuccess"
:show-file-list="false"
class="avatar-uploader">
<img :src="'${AppFileDomain!}'+'/fileStreamPreview?id='+formData.cover"
class="avatar"
v-if="formData.cover">
<i class="el-icon-plus avatar-uploader-icon" v-else></i>
</el-upload>
</el-form-item>
</el-form>
<el-button :loading="submitLoading" @click="save" style="float: right" type="primary">
提交
</el-button>
</template>
<template #view>
</template>
</guava>
<condition ref="cnd" v-model="formData.conditionStructure" :fields="fields"></condition>
<el-dialog title="导出" :visible.sync="exportWelfareListDialog" width="40%">
<el-row class="pt5 pb5 text-danger">勾选需要导出的人员类型</el-row>
<el-row class="pt10 pb10">
<el-checkbox-group v-model="selPersonType">
<el-checkbox v-for="i in welfarePersonTypeList" :label="i.personType"></el-checkbox>
</el-checkbox-group>
</el-row>
<el-row type="flex" justify="end">
<el-button @click="doExportWelFareList" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
judgmentAuthority,
fields: [
{
label: '性别',
value: 'sex',
type: "select",
options: [{label: '男', value: '男'}, {label: '女', value: '女'}]
},
{label: '出生日期', value: 'birthday', type: "date"},
],
welfareProvideMode: [],
welfareSignMode: [],
welfareNoticePushMode: [],
pageForm: {
year: moment().format('YYYY')
},
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'name', label: '项目名称'},
{prop: 'gift', label: '福利礼品'},
{prop: 'provideTimeStart', label: '发放时间'},
],
formRules: {
name: [{required: true, message: '必填', trigger: ['blur', 'change']}],
festival: [{required: true, message: '必选', trigger: ['blur', 'change']}],
provideTime: [{required: true, message: '必选', trigger: ['blur', 'change']}],
choiceTime: [{required: true, message: '必选', trigger: ['blur', 'change']}],
provideAddress: [{required: true, message: '必选', trigger: ['blur', 'change']}],
provideMode: [{required: true, message: '必选', trigger: ['blur', 'change']}],
signMode: [{required: true, message: '必选', trigger: ['blur', 'change']}],
noticePushMode: [{required: true, message: '必选', trigger: ['blur', 'change']}],
gift: [{required: true, message: '必填', trigger: ['blur', 'change']}],
multiSelectNum: [{required: true, message: '必填', trigger: ['blur', 'change']}],
// flexible: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
welfare,
welfareUnitMode,
exportWelfareListDialog: false,
selPersonType: [],
welfare_id: null,
welfarePersonTypeList: []
}
},
components: {
'guava': httpVueLoader('/components/plugins/Guava.vue?v=1.0.0'),
'condition': httpVueLoader('/components/plugins/ConditionStructure.vue?v=1.0.0'),
'question-naire': httpVueLoader('/components/plugins/QuestionNaire.vue'),
},
methods: {
isCheckBoxChange() {
this.formData.welfareProjectSubjects = [{
subjectName: '请输入福利信息',
subjectType: this.formData.isCheckBox ? this.formData.isCheckBox : 'radio',
defaultOption: null,
options: [
{
optionType: "套餐",
optionName: '福利1',
optionNameId: '',
optionSort: '1',
imgUrl: ''
}
]
}]
},
async handleAvatarSuccess(res, file) {
this.$set(this.formData, 'cover', res.data.filepath)
await this.$refs['form'].validate()
},
beforeAvatarUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isLt2M = file.size / 1024 / 1024 / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传头像图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 4MB!');
}
return isJPG && isLt2M;
},
doExportWelFareList() {
this.exportWelfareList(this.welfare_id, this.selPersonType)
this.exportWelfareListDialog = false
},
exportWelfareList,
async save() {
const formValid = await this.$refs["form"].validate()
if (formValid) {
if (this.formData.flexible) {
const questionValid = this.$refs.questionNaire.validate()
if (!questionValid) {
this.$message.warning('题目信息填写不完整!')
return
}
}
this.submitLoading = true
const formData = clone(this.formData)
if (formData.isCheckBox) {
formData.multiSelectNum = 0
}
if (formData.flexible) {
formData.flexibleGifts.map(v => v.isDefault = false)
formData.flexibleGifts[formData.defaultFlexibleGifts].isDefault = true
formData.flexibleGifts = JSON.stringify(formData.flexibleGifts)
} else {
formData.flexibleGifts = null
}
if (formData.conditionStructure)
formData.conditionStructure = JSON.stringify(formData.conditionStructure)
if (this.formData.flexible && [2, 3, 4].includes(formData.provideMode)) {
formData.welfareProjectSubjects = JSON.stringify(this.$refs.questionNaire.subject)
}
if (!this.formData.id) {
const alert = await this.$alert('在发放福利前,请及时生成福利名单,便于教职工选择福利', '提醒', {
confirmButtonText: '确定',
})
}
const resp = await $.post(loc() + "/save", formData)
requestLaterMsgFun(this, resp, (data) => {
this.$refs.guava.index()
this.pageData()
}, () => {
}, () => {
this.submitLoading = false
})
}
},
provideTimeChange() {
if (this.formData.provideTime && this.formData.provideTime.length) {
this.formData.provideTimeStart = this.formData.provideTime[0]
this.formData.provideTimeEnd = this.formData.provideTime[1]
} else {
this.formData.provideTimeStart = ''
this.formData.provideTimeEnd = ''
}
},
choiceTimeChange() {
if (this.formData.choiceTime && this.formData.choiceTime.length) {
this.formData.choiceTimeStart = this.formData.choiceTime[0]
this.formData.choiceTimeEnd = this.formData.choiceTime[1]
} else {
this.formData.choiceTimeStart = ''
this.formData.choiceTimeEnd = ''
}
},
openAdd() {
this.formData = {
isRoutine: true,
isCheckBox: "radio",
defaultFlexibleGifts: 0,
flexible: false,
welfareProjectSubjects: [],
flexibleGifts: [{}]
}
this.$refs.guava.edit()
if (this.$refs.form)
this.$refs.form.resetFields();
},
async createList(id) {
this.$confirm('是否生成福利名单?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
this.submitLoading = true
const resp = await $.post(loc() + "/createList", {id});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
}, null, () => {
this.submitLoading = false
})
}
}
})
},
doDelete(id) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {//确认后再执行
const resp = await $.post(loc() + "/delete", {id});
requestLaterMsgFun(this, resp, async () => {
this.pageData()
})
}
}
});
},
dropdownCommand(command) {
const {type, data} = command
this.welfare_id = data.id
if (type == 'view') {
this.openView(data.id)
} else if (type == 'edit') {
this.openEdit(data)
} else if (type == 'delete') {
this.doDelete(data.id)
} else if (type == 'createList') {
this.createList(data.id)
} else if (type == 'export') {
this.exportWelfareListDialog = true
// this.exportWelfareList(data.id)
}
},
async openEdit(row) {
this.submitLoading = true
const resp = await $.get(loc() + "/findOne", {id: row.id})
requestLaterFun(resp, (data) => {
data.flexibleGifts = data.flexibleGifts || [{}]
const idx = data.flexibleGifts.findIndex(v => v.isDefault)
data.defaultFlexibleGifts = idx < 0 ? 0 : idx
data.provideTime = [data.provideTimeStart, data.provideTimeEnd]
data.choiceTime = [data.choiceTimeStart, data.choiceTimeEnd]
if (data.welfareProjectSubjects.length === 0) {
data.welfareProjectSubjects = [{
subjectName: '请输入福利信息',
subjectType: data.isCheckBox,
defaultOption: null,
options: [
{
optionType: "套餐",
optionName: '福利1',
optionNameId: '',
optionSort: '1',
imgUrl: ''
}
]
}]
}
this.formData = data
this.$refs.guava.edit()
}, null, () => {
this.submitLoading = false
})
},
openView() {
this.$refs.guava.view()
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
$.post(loc() + "/pageData", this.pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code == 0) {
data.data.list.forEach(v => {
v.flexibleGifts = JSON.parse(v.flexibleGifts || "[]")
})
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
},
async created() {
this.pageData();
this.welfareProvideMode = await getEnumOptions("WelfareProvideMode")
this.welfareSignMode = await getEnumOptions("WelfareSignMode")
this.welfareNoticePushMode = await getEnumOptions("WelfareNoticePushMode")
this.welfarePersonTypeList = await getPersonTypeListGroupByWelfare()
this.welfarePersonTypeList.map(v => {
this.selPersonType.push(v.personType)
})
const personType = await getDictOptions("UserType")
const userState = await getDictOptions("userState")
this.fields = this.fields.concat([{
label: '人员类型',
value: 'personType',
type: "select",
options: personType.map(v => {
return {label: v.name, value: v.code}
})
}, {
label: '在职状态',
value: 'userState',
type: "select",
options: userState.map(v => {
return {label: v.name, value: v.code}
})
}])
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,398 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
@change="yearChange"
:clearable="false"
value-format="yyyy"
v-model="pageForm.year"
type="year"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">福利项目:</div>
<div class="search-item-option">
<el-select placeholder="福利项目" v-model="pageForm.projectId" style="width: 100%;"
filterable="true">
<el-option v-for="item in welfareProjectList" :label="item.name"
:value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select @change="pageData" clearable filterable
placeholder="所属工会" style="width: 100%;" v-model="pageForm.welfareUnitCode">
<el-option :label="item.unionname" :value="item.unioncode"
v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="工会列表" :app="this">
<template #func>
<template>
<el-button type="primary" size="small" icon="el-icon-printer" :disabled="provideMode!==3"
@click="openImportExpressExcel">
导入快递单号
</el-button>
<el-button @click="sendMsg" icon="el-icon-s-promotion" size="small" type="primary">
短信通知
</el-button>
<el-button
@click="shopExport()" icon="el-icon-printer"
size="small"
type="primary">按商品导出
</el-button>
<el-button :disabled="!pageForm.projectId" type="primary" size="small"
icon="el-icon-printer"
@click="exportReceiveDetail(true)">导出已选名单
</el-button>
<el-button :disabled="!pageForm.projectId" @click="exportReceiveDetail(false)"
icon="el-icon-printer"
size="small"
type="primary">导出未选名单
</el-button>
<el-button :disabled="!pageForm.projectId" type="primary" size="small"
icon="el-icon-printer"
@click="exportByUnion">导出汇总表
</el-button>
</template>
</template>
</table-tool>
<el-table :data="tableData"
@sort-change="pageOrder"
row-key="id" show-summary style="width: 100%"
v-loading="tableLoading" ref="table" class="vi-table" :size="tableSize">
<el-table-column type="index" width="50"></el-table-column>
<el-table-column
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=='welfareUnitName'">
({{row.welfareUnitCode}}){{row.welfareUnitName}}
</template>
<template scope="{row}" v-else-if="column.prop=='unselectedTeacherSum'">
<el-link @click="openUnclaimed(row.welfareUnitCode)" type="primary">
{{row.unselectedTeacherSum}}
</el-link>
</template>
</el-table-column>
<el-table-column header-align="center" label="操作" v-if="tableColumns.length>0" width="400px">
<template scope="{ row }">
<el-button @click="exportReceiveDetailByUnionIdWord(row.welfareUnitId)" plain size="mini"
type="primary">导出签领表
</el-button>
<el-button @click="openView(row.welfareUnitCode)" size="mini" type="primary">查看已选人员
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</template>
<template #view>
<!-- <el-button type="primary"
class="pull-right"
icon="el-icon-printer"
@click="exportReceiveDetailByUnionId(true)">导出已选名单
</el-button>-->
<el-table :data="receive_tableData" style="width: 100%" row-key="id" max-height="1000"
v-loading="tableLoading" class="vi-table" :size="tableSize">
<el-table-column type="index" width="50"></el-table-column>
<el-table-column
align="center"
v-for="column in receive_tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
</el-table-column>
</el-table>
</template>
</guava>
<el-dialog :visible.sync="unclaimedDialog" title="未领取人员" width="65%">
<el-button @click="exportReceiveDetailByUnionId(false)"
class="pull-right"
icon="el-icon-printer"
type="primary">导出未选名单
</el-button>
<el-table :data="unclaimed_tableData" style="width: 100%" row-key="id" max-height="650"
v-loading="tableLoading" class="vi-table" :size="tableSize">
<el-table-column type="index" width="50"></el-table-column>
<el-table-column
align="center"
v-for="column in unclaimed_tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog :visible.sync="importExpressExcelDialog" title="导入快递单号" width="65%">
<el-row style="justify-content: space-between;align-items: center" type="flex">
<span>只能导入已选人员名单,导入未选人员名单无效。</span>
<el-button @click="downLoadExpressTemplate" size="small" type="primary">下载模板</el-button>
</el-row>
<el-row type="flex" justify="center">
<el-upload
ref="expressExcelUpload"
:auto-upload="false"
:file-list="importExpressExcelFile"
:limit="1"
:data="{projectId:pageForm.projectId}"
drag
:action="loc()+'/importCourierNumber'"
:on-success="expressExcelHandleSuccess"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">只能上传xls,xlsx文件</div>
</el-upload>
</el-row>
<el-row type="flex" justify="end">
<el-button @click="importExpressExcelDialog=false">取消</el-button>
<el-button type="primary" @click="doImportExpressExcel">提交</el-button>
</el-row>
</el-dialog>
</div>
<script>
<!--#include("/platform/welfare/include/common.js"){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
welfareProjectList: [],
pageForm: {
year: null,
welfareUnitCode: null
},
unions: [],
tableColumns: [],
receive_tableColumns: [],
receive_tableData: [],
unclaimedDialog: false,
unclaimed_tableData: [],
unclaimed_tableColumns: [
{label: '姓名', prop: 'userName'},
{label: '工号', prop: 'loginName'},
{label: '单位', prop: 'unitName'},
{label: '工会', prop: 'unionName'},
{label: '联系方式', prop: 'mobile'},
],
welfare,
welfareUnitCode: null,
importExpressExcelDialog: false,
importExpressExcelFile: []
}
},
computed: {
provideMode() {
const project = this.welfareProjectList.find(v => v.id === this.pageForm.projectId)
if (project) {
return project.provideMode
}
return null
}
},
methods: {
exportReceiveDetailByUnionIdWord(welfareUnitId) {
window.open(loc() + '/exportReceiveDetailByUnionIdWord?welfareUnitId=' + welfareUnitId + '&projectId=' + this.pageForm.projectId)
},
downLoadExpressTemplate() {
window.open(loc() + '/downLoadExpressTemplate')
},
openImportExpressExcel() {
this.importExpressExcelDialog = true
if (this.$refs.expressExcelUpload) {
this.$refs.expressExcelUpload.clearFiles()
}
},
expressExcelHandleSuccess(response, file, fileList) {
if (response.code !== 0) {
this.notifyWarning(response.msg)
this.$refs.expressExcelUpload.clearFiles()
} else {
this.notifySuccess(response.msg)
this.$refs.expressExcelUpload.clearFiles()
this.importExpressExcelDialog = false
this.doSearch()
}
},
doImportExpressExcel() {
this.$refs.expressExcelUpload.submit()
},
async init() {
this.unions = await getUnions(null)
this.pageForm.year = new Date().getFullYear().toString()
this.getWelfareProjectList()
},
async getWelfareProjectList() {
const resp = await $.get(loc() + '/welfareProjectList', {year: this.pageForm.year})
this.welfareProjectList = resp.data
if (this.welfareProjectList && this.welfareProjectList.length > 0) {
this.$set(this.pageForm, "projectId", this.welfareProjectList[0].id)
this.pageData()
} else {
this.tableData = []
this.tableColumns = []
}
},
async yearChange() {
this.$set(this.pageForm, "projectId", null)
this.$set(this.pageForm, "welfareUnitCode", null)
await this.getWelfareProjectList()
},
async pageData() {
this.tableLoading = true
sublime.showLoadingbar()
const resp = await $.post(loc() + '/pageData', this.pageForm)
sublime.closeLoadingbar()
this.tableLoading = false
if (resp.code === 0) {
this.tableColumns = [{
prop: 'welfareUnitName',
label: welfare.welfareUnitModeName
}].concat(resp.data.tableColumn)
this.tableData = resp.data.tableList
}
},
async openView(welfareUnitCode) {
this.welfareUnitCode = welfareUnitCode
const resp = await $.post(loc() + '/receivePageData', {
welfareUnitCode,
projectId: this.pageForm.projectId
})
if (resp.code === 0) {
this.$refs.guava.view()
this.receive_tableColumns = resp.data.label
this.receive_tableData = resp.data.list
}
},
async openUnclaimed(welfareUnitCode) {
this.welfareUnitCode = welfareUnitCode
const resp = await $.post(loc() + '/unclaimedData', {
welfareUnitCode,
projectId: this.pageForm.projectId
})
if (resp.code === 0) {
this.unclaimedDialog = true
this.unclaimed_tableData = resp.data
}
},
exportByUnion() {
const {projectId, welfareUnitCode} = this.pageForm
window.open(loc() + '/exportByUnion?projectId=' + projectId + '&welfareUnitCode=' + (welfareUnitCode ? welfareUnitCode : ''))
},
exportReceiveDetail(flag) {
const {projectId, welfareUnitCode} = this.pageForm
window.open(loc() + '/exportReceiveDetail?projectId=' + projectId + '&welfareUnitCode=' + (welfareUnitCode ? welfareUnitCode : '') + '&flag=' + flag)
},
exportReceiveDetailByUnionId(flag) {
const {projectId} = this.pageForm
const welfareUnitCode = this.welfareUnitCode ? this.welfareUnitCode : ''
window.open(loc() + '/exportReceiveDetail?projectId=' + projectId + '&welfareUnitCode=' + welfareUnitCode + '&flag=' + flag)
},
shopExport() {
if (!this.pageForm.projectId) {
this.$notify.warning({title: '警告', message: '请先选择福利项目!'});
return
}
const loading = this.$loading({
lock: true,
text: '正在努力导出中,感谢您的耐心等待!',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
axios.post(loc() + "/shopExport?projectId=" + this.pageForm.projectId, {}, {responseType: 'blob'})
.then((res) => {
const {data, headers} = res
const fileName = headers['content-disposition'].replace(/\w+;filename=(.*)/, '$1')
// 此处当返回json文件时需要先对data进行JSON.stringify处理,其他类型文件不用做处理
//const blob = new Blob([JSON.stringify(data)], ...)
const blob = new Blob([data], {type: headers['content-type']})
let dom = document.createElement('a')
let url = window.URL.createObjectURL(blob)
dom.href = url
dom.download = decodeURI(fileName)
dom.style.display = 'none'
document.body.appendChild(dom)
dom.click()
dom.parentNode.removeChild(dom)
window.URL.revokeObjectURL(url)
loading.close();
}).catch((err) => {
})
},
sendMsg() {
this.$confirm('您确定要向未领取人员发送短信提醒吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await $.post('/sendMsg', {projectId: this.pageForm.projectId})
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.error(resp.msg)
}
}).catch(() => {
});
},
},
created() {
this.init()
}
})
</script>
<!--#
}
#-->