This commit is contained in:
2026-01-21 10:44:02 +08:00
parent c5ec2137e2
commit 7eac8b00b5
24 changed files with 2213 additions and 265 deletions
@@ -1,25 +1,26 @@
<template>
<div style="padding: 20px 50px">
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" style="width: 200px" @click="$downLoad(temp_url)" 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="请选择更新模式" v-if="is_show_radio">
<el-radio-group v-model="importData.isFlag">
<el-radio-button label="true">清空更新</el-radio-button>
<el-radio-button label="false">追加</el-radio-button>
</el-radio-group>
</el-form-item>
<div style="padding: 20px 50px">
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" style="width: 200px" @click="$downLoad(temp_url)" 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="请选择更新模式" v-if="is_show_radio">
<el-radio-group v-model="importData.isFlag">
<el-radio-button label="true">清空更新</el-radio-button>
<el-radio-button label="false">追加</el-radio-button>
</el-radio-group>
</el-form-item>
<el-upload
name="file"
ref="upload"
:on-remove="
<el-upload
name="file"
ref="upload"
:on-remove="
(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
importResult = {
@@ -30,186 +31,190 @@
}
}
"
:on-change="
:on-change="
(file, fileList) => {
importData.fileList = fileHandleChange(file, fileList, { type: ['xls', 'xlsx'] })
}
"
:auto-upload="false"
action
: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-item placement="top" timestamp="导入结果">
<el-card shadow="never">
<p>总记录数:{{ errorInfoData.totalCount }}</p>
<p>
成功数:
<span class="text-success">{{ errorInfoData.successCount }}</span>
</p>
<p>
错误数:
<span class="text-danger">{{ errorInfoData.errorCount }}</span>
</p>
<el-link @click="exportErrors" type="primary" v-if="errorInfoData.errorCount > 0">下载错误记录</el-link>
</el-card>
</el-timeline-item>
</el-timeline>
<div style="text-align: right">
:auto-upload="false"
action
: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-item placement="top" timestamp="导入结果">
<el-card shadow="never">
<p>总记录数:{{ errorInfoData.totalCount }}</p>
<p>
成功数:
<span class="text-success">{{ errorInfoData.successCount }}</span>
</p>
<p>
错误数:
<span class="text-danger">{{ errorInfoData.errorCount }}</span>
</p>
<el-link @click="exportErrors" type="primary" v-if="errorInfoData.errorCount > 0">下载错误记录</el-link>
</el-card>
</el-timeline-item>
</el-timeline>
<div style="text-align: right">
<span slot="footer" class="dialog-footer">
<!-- <el-button @click="importVisible = false" :disabled="importLoading">取 消</el-button>-->
<el-button type="primary" @click="doImport">确 定</el-button>
</span>
</div>
</div>
</div>
</template>
<script>
module.exports = {
props: {
temp_url: { type: String },
post_url: { type: String },
business_id: { type: String },
is_show_radio: { type: Boolean, default: false }
},
mounted() {
const s = document.createElement("script")
s.type = "text/javascript"
s.src = "/assets/platform/plugins/xlsx/xlsx.full.min.js"
document.body.appendChild(s)
},
data() {
return {
importData: {
fileList: [],
isFlag: false
},
errorInfoData: {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0
}
}
},
methods: {
resetImportData() {
this.importData = {
fileList: [],
isFlag: false
}
this.errorInfoData = {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0
}
},
doImport() {
if (this.importData.fileList.length === 0) {
this.$message.error({
title: "错误",
message: "请选择文件!"
})
return
}
const data = new FormData()
data.append("isFlag", this.importData.isFlag)
data.append("businessId", this.business_id)
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name)
})
const loading = this.$loading({
lock: true,
text: "正在导入中请稍后...",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)"
})
this.$axios.post(this.post_url, data).then((res) => {
loading.close()
if (res.code === 0) {
if (res.data) {
this.$message.warning("导入失败")
this.errorInfoData = res.data
this.$emit("flush")
} else {
this.$message.success("导入成功")
this.$emit("flush")
this.resetImportData()
}
} else {
this.$message.warning("导入失败")
}
})
},
exportErrors() {
const data = this.errorInfoData.errorList
// 创建工作簿
const workbook = XLSX.utils.book_new()
// 创建工作表
const worksheet = XLSX.utils.json_to_sheet(data)
// 将工作表添加到工作簿
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1")
// 将工作簿转换为二进制对象
const excelBuffer = XLSX.write(workbook, { bookType: "xlsx", type: "array" })
// 将二进制对象转换为Blob对象
const blob = new Blob([excelBuffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" })
// 创建下载链接并设置相关属性
const url = window.URL.createObjectURL(blob)
const link = document.createElement("a")
link.href = url
link.download = "错误记录.xlsx"
// 模拟点击下载链接
document.body.appendChild(link)
link.click()
// 清理下载链接
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
},
fileHandleRemove(file, fileList) {
return fileList
},
fileHandleChange(file, fileList, { type, size }) {
const removeFile = () => {
fileList.splice(fileList.findIndex((v) => v === file))
}
if (!file.size) {
this.$message.warning("您选择的是空文件")
removeFile()
}
if (type && type.length && !type.includes(file.name.split(".").pop().toLowerCase())) {
this.$message.warning(`文件只能是 ${type.map((v) => v.toUpperCase()).join("/")} 格式`)
removeFile()
}
if (size && !file.size < size) {
this.$message.warning(`文件大小不能超过 ${size / 1024 / 1024}MB`)
removeFile()
}
return fileList
}
props: {
temp_url: {type: String},
post_url: {type: String},
business_id: {type: String},
is_show_radio: {type: Boolean, default: false}
},
mounted() {
const s = document.createElement("script")
s.type = "text/javascript"
s.src = "/assets/platform/plugins/xlsx/xlsx.full.min.js"
document.body.appendChild(s)
},
data() {
return {
importData: {
fileList: [],
isFlag: false
},
errorInfoData: {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0
}
}
},
methods: {
resetImportData() {
this.importData = {
fileList: [],
isFlag: false
}
this.errorInfoData = {
totalCount: 0,
successCount: 0,
errorCount: 0,
errorList: 0
}
},
doImport() {
if (this.importData.fileList.length === 0) {
this.$message.error({
title: "错误",
message: "请选择文件!"
})
return
}
const data = new FormData()
for (const key in this.importData) {
if (this.importData.hasOwnProperty(key) && key !== 'fileList') {
data.append(key, this.importData[key]);
}
}
data.append("businessId", this.business_id)
this.importData.fileList.forEach((val) => {
data.append("file", val.raw, val.raw.name)
})
const loading = this.$loading({
lock: true,
text: "正在导入中请稍后...",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)"
})
this.$axios.post(this.post_url, data).then((res) => {
loading.close()
if (res.code === 0) {
if (res.data) {
this.$message.warning("导入失败")
this.errorInfoData = res.data
this.$emit("flush")
} else {
this.$message.success("导入成功")
this.$emit("flush")
this.resetImportData()
}
} else {
this.$message.warning("导入失败")
}
})
},
exportErrors() {
const data = this.errorInfoData.errorList
// 创建工作簿
const workbook = XLSX.utils.book_new()
// 创建工作表
const worksheet = XLSX.utils.json_to_sheet(data)
// 将工作表添加到工作簿
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1")
// 将工作簿转换为二进制对象
const excelBuffer = XLSX.write(workbook, {bookType: "xlsx", type: "array"})
// 将二进制对象转换为Blob对象
const blob = new Blob([excelBuffer], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})
// 创建下载链接并设置相关属性
const url = window.URL.createObjectURL(blob)
const link = document.createElement("a")
link.href = url
link.download = "错误记录.xlsx"
// 模拟点击下载链接
document.body.appendChild(link)
link.click()
// 清理下载链接
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
},
fileHandleRemove(file, fileList) {
return fileList
},
fileHandleChange(file, fileList, {type, size}) {
const removeFile = () => {
fileList.splice(fileList.findIndex((v) => v === file))
}
if (!file.size) {
this.$message.warning("您选择的是空文件")
removeFile()
}
if (type && type.length && !type.includes(file.name.split(".").pop().toLowerCase())) {
this.$message.warning(`文件只能是 ${type.map((v) => v.toUpperCase()).join("/")} 格式`)
removeFile()
}
if (size && !file.size < size) {
this.$message.warning(`文件大小不能超过 ${size / 1024 / 1024}MB`)
removeFile()
}
return fileList
}
}
}
</script>
<style>
.el-card__body {
padding: 25px;
padding: 25px;
}
</style>
@@ -0,0 +1,157 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="变更类型">
<dict-select v-model="pageForm.changeType" code="AIDFUND_MEMBER_CHANGE_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='changeType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_CHANGE_TYPE"
:value="row.changeType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop=='applyTime'">
<template v-if="row.applyTime">
{{$moment(row.applyTime).format('YYYY-MM-DD')}}
</template>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/applyInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
unitId: '',
unionId: '',
year: this.$moment().format("YYYY"),
},
tableColumns: [
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "changeType", label: "变更类型"},
{prop: "applyTime", label: "变更时间"},
],
unionList: [],
unitList: [],
}
},
components: {
'info': APPLY_INFO,
},
methods: {
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,92 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="会员分析">
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
</el-table-column>
</el-table>
</el-card>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {
unionId: '',
year: this.$moment().format("YYYY"),
},
unionList: [],
tableColumns: [
{prop: "unionName", label: "分工会"},
{prop: "YEAR_BEGIN", label: "年初数量"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_EIGTH", label: "会员退休(不变号)"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_ONE", label: "新增会员"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_FOUR", label: "自愿退出"},
{prop: "AIDFUND_MEMBER_CHANGE_TYPE_FIVE", label: "会员去世"},
{prop: "currentAidFundMember", label: "当前数量"},
]
}
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,144 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
:clearable="false"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
<el-button @click="exportHistoryRecord"
size="small"
icon="el-icon-download"
type="primary">导出名单
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop=='aidFundMemberJoinTime'">
<template v-if="row.aidFundMemberJoinTime">
{{$moment(row.aidFundMemberJoinTime).format("YYYY-MM-DD")}}
</template>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
unitId: '',
unionId: '',
year: this.$moment().format("YYYY"),
isPayed: null
},
tableColumns: [
{prop: "year", label: "年度"},
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "aidFundMemberJoinTime", label: "加入时间"},
],
unionList: [],
unitList: [],
}
},
methods: {
exportHistoryRecord(){
this.$downLoad('/platform/medicalMutualAid/aidFund/historyRecord/exportHistoryRecord', this.pageForm)
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -17,22 +17,87 @@ layout("/layouts/platform.html"){
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
<el-tag :effect="pageForm.notPayedCurrentYear?'dark':'plain'"
@click="pageForm.notPayedCurrentYear=!pageForm.notPayedCurrentYear;doSearch();"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')" class="mr10">
当年未缴费【基金会员】名单
</el-tag>
<el-button @click="batchExit" size="small"
type="danger" v-if="pageForm.notPayedCurrentYear"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')">
批量设置为退会
</el-button>
<el-button @click="exportNewMember" icon="el-icon-download" size="small" type="primary"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.exportNewMember')" class="mr10">
导出{{new
Date().getFullYear()}}年新会员名单
</el-button>
<el-dropdown @command="dropdownCommand"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')" class="mr10">
<el-button size="small" type="primary">
备份会员名单<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{action:backupMember,value:year}"
v-for="year in yearOptions"
:key="year">
{{year}}年
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-dropdown @command="dropdownCommand"
v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')">
<el-button size="small" type="primary"
>
生成缴费名单<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{action:createPayList,value:year}"
v-for="year in payYearOptions"
:key="year">
{{year}}年
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
@@ -40,18 +105,23 @@ layout("/layouts/platform.html"){
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='aidFundMemberUserType'">
<template v-slot="{row}" v-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template v-slot="{row}" v-if="column.prop=='aidFundMemberJoinTime'">
<template v-if="row.aidFundMemberJoinTime">
{{$moment(row.aidFundMemberJoinTime).format('YYYY-MM-DD')}}
</template>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<el-table-column label="操作" fixed="right" width="300">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
<el-button @click="onEditMemberType(row)" size="mini" type="primary">修改基金会员类型
</el-button>
<el-button v-if="row.canRevoke" size="mini" type="danger" @click="onRevoke(row)">撤回
<el-button @click="onEditChangeType(row)" size="mini" type="primary">变更
</el-button>
</template>
</el-table-column>
@@ -64,13 +134,76 @@ layout("/layouts/platform.html"){
</info>
</template>
</guava>
<el-dialog
:visible.sync="aidFundMemberUserTypeVisible"
title="修改基金会员"
width="40%">
<el-form :model="formData" :rules="formRules" label-width="120px"
ref="form">
<el-form-item label="工号" prop="loginname">
<el-input
disabled
v-model="formData.loginname">
</el-input>
</el-form-item>
<el-form-item label="姓名" prop="username">
<el-input
disabled
v-model="formData.username">
</el-input>
</el-form-item>
<el-form-item label="基金会员类型" prop="aidFundMemberUserType">
<dict-select v-model="formData.aidFundMemberUserType" clearable code="AIDFUND_MEMBER_USER_TYPE"
placeholder="请选择基金会员类型"
style="width: 100%"></dict-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="aidFundMemberUserTypeVisible = false">取 消</el-button>
<el-button @click="doEditAidFundMemberUserType" type="primary">提 交</el-button>
</span>
</el-dialog>
<el-dialog
:visible.sync="changeTypeVisible"
title="会员变更"
width="40%">
<el-form :model="formData" :rules="formRules" label-width="100px"
ref="form">
<el-form-item label="工号" prop="loginname">
<el-input
disabled
v-model="formData.loginname">
</el-input>
</el-form-item>
<el-form-item label="姓名" prop="username">
<el-input
disabled
v-model="formData.username">
</el-input>
</el-form-item>
<el-form-item label="变更类型" prop="changeType">
<dict-select v-model="formData.changeType" clearable code="AIDFUND_MEMBER_CHANGE_TYPE"
placeholder="请选择变更类型"
style="width: 100%"></dict-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="changeTypeVisible = false">取 消</el-button>
<el-button @click="doEditChangeType" type="primary">提 交</el-button>
</span>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/aidFundInfo.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
@@ -79,12 +212,13 @@ layout("/layouts/platform.html"){
data() {
return {
pageForm: {
year: this.$moment().format("YYYY"),
approval: false
unitId: '',
unionId: '',
notPayedCurrentYear: false
},
tableColumns: [
{prop: "loginName", label: "工号"},
{prop: "userName", label: "姓名"},
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "arrivalAtSchoolDate", label: "入校时间"},
{prop: "unitName", label: "所属单位"},
@@ -92,67 +226,169 @@ layout("/layouts/platform.html"){
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "aidFundMemberJoinTime", label: "加入时间"},
],
showApprovalForm: false
showApprovalForm: false,
unionList: [],
unitList: [],
payYearOptions: [],
yearOptions: [],
aidFundMemberUserTypeVisible: false,
changeTypeVisible: false,
formRules: {
aidFundMemberUserType: [
{required: true, message: '请选择基金会员类型', trigger: 'change'}
],
changeType: [
{required: true, message: '请选择变更类型', trigger: 'change'}
]
}
}
},
components: {
'info': AID_FUND_INFO,
},
methods: {
onEditChangeType(row) {
this.formData = clone(row)
this.changeTypeVisible = true
},
doEditChangeType() {
this.$confirm('确定要变更【' + this.formData.username + '】吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/doEditChangeType", {
userId: this.formData.id,
changeType: this.formData.changeType
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.changeTypeVisible = false
}
})
})
},
doEditAidFundMemberUserType() {
this.$confirm('确定要修改【' + this.formData.username + '】的基金会员类型吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/doEditAidFundMemberUserType", {
userId: this.formData.id,
aidFundMemberUserType: this.formData.aidFundMemberUserType
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.$refs.table.clearSelection()
this.aidFundMemberUserTypeVisible = false
}
})
})
},
onEditMemberType(row) {
this.formData = clone(row)
this.aidFundMemberUserTypeVisible = true
},
batchExit() {
const selection = this.$refs.table.selection
if (selection.length === 0) {
this.$message.warning('请勾选需要设置为退会的人员')
return
}
const ids = selection.map(v => v.id)
this.$confirm('请核实勾选人员的退会原因,您确定要将勾选的人员设置为未缴费吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/batchExit", {ids: JSON.stringify(ids)}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.$refs.table.clearSelection()
}
})
})
},
backupMember(year) {
this.$confirm('您确定要备份' + year + '年的数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true
this.$axios.post(loc() + "/backupMember", {year}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
}
}).finally(() => {
this.tableLoading = false
})
})
},
createPayList(year) {
let msg = "请确认是否生成缴费名单?"
if (year === new Date().getFullYear()) {
msg = "您生成的" + year + "年度的缴费名单,将有可能覆盖已缴费人员的信息!请确认是否生成?"
}
this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true;
this.$axios.post(loc() + "/createPayList", {year}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
}
}).finally(() => {
this.tableLoading = false
})
})
},
exportNewMember() {
this.$downLoad(loc() + "/exportNewMember")
},
getYearOptions() {
let year = new Date().getFullYear();
let arr = []
for (let i = year; i >= year - 3; i--) {
arr.push(i)
}
this.yearOptions = arr
},
getPayYearOptions() {
let year = new Date().getFullYear() + 1;
let arr = []
for (let i = year; i >= year - 1; i--) {
arr.push(i)
}
this.payYearOptions = arr
},
onView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.infoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.infoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
created() {
async created() {
this.getPayYearOptions()
this.getYearOptions()
this.pageData()
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
}
})
</script>
@@ -0,0 +1,240 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
:clearable="false"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="会员类型">
<dict-select v-model="pageForm.aidFundMemberUserType" code="AIDFUND_MEMBER_USER_TYPE"
style="width: 100%"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会" filterable clearable
style="width: 100%" @change="unionChange">
<el-option v-for="item in unionList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属单位">
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable
style="width: 100%">
<el-option v-for="item in unitList" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="基金会员">
<el-radio-group @change="doSearch" size="small"
v-model="pageForm.isPayed">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button :label="1">已缴费</el-radio-button>
<el-radio-button :label="0">未缴费</el-radio-button>
</el-radio-group>
<el-button @click="openImport"
size="small"
icon="el-icon-upload2"
type="primary">导入缴费记录
</el-button>
<el-button @click="exportPayRecord"
size="small"
icon="el-icon-download"
type="primary">导出名单
</el-button>
<el-button :disabled="tableData.length==0" :loading="tableLoading" @click="clearPayRecord"
icon="el-icon-delete"
size="small"
type="danger">清空{{pageForm.year}}年缴费名单
</el-button>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-slot="{row}" v-if="column.prop=='aidFundMemberUserType'">
<dict-tag :options="dict.type.AIDFUND_MEMBER_USER_TYPE"
:value="row.aidFundMemberUserType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop=='isPayed'">
<template>
<el-tag type="success" v-if="row.isPayed">已缴费</el-tag>
<el-tag type="info" v-else>未缴费</el-tag>
</template>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onPayed(row,1)" size="mini" type="primary" v-if="!row.isPayed">设置为已缴费
</el-button>
<el-button @click="onPayed(row,0)" size="mini" type="danger" v-if="row.isPayed">设置为未缴费
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<file-import
ref="viewImport"
temp_url="/platform/medicalMutualAid/aidFund/payRecord/downloadImportTemp"
post_url="/platform/medicalMutualAid/aidFund/payRecord/doImport"
@flush="pageData"
></file-import>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["AIDFUND_MEMBER_USER_TYPE", "AIDFUND_MEMBER_CHANGE_TYPE"],
data() {
return {
pageForm: {
unitId: '',
unionId: '',
year: this.$moment().format("YYYY"),
isPayed: null
},
tableColumns: [
{prop: "year", label: "年度"},
{prop: "loginname", label: "工号"},
{prop: "username", label: "姓名"},
{prop: "sex", label: "性别"},
{prop: "aidFundMemberUserType", label: "基金会员类型"},
{prop: "unitName", label: "所属单位"},
{prop: "unionName", label: "所属工会"},
{prop: "money", label: "缴费金额"},
{prop: "isPayed", label: "是否缴费"},
],
unionList: [],
unitList: [],
}
},
components: {
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue"),
},
methods: {
openImport() {
this.$refs.guava.edit()
this.$nextTick(() => {
setTimeout(() => {
this.$refs.viewImport.resetImportData()
this.$refs.viewImport.importData.year = this.pageForm.year
}, 500)
})
},
exportPayRecord() {
this.$downLoad('/platform/medicalMutualAid/aidFund/payRecord/exportPayRecord', this.pageForm)
},
clearPayRecord() {
if (this.pageForm.year < (new Date().getFullYear()).toString()) {
this.notifyWarning("历史数据不能删除!")
return;
}
this.$confirm("确定将【" + this.pageForm.year + "】年基金会员的缴费名单清空吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true
this.$axios.post(loc() + "/clearPayRecord", {
year: this.pageForm.year
}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
this.tableLoading = false
})
})
},
onPayed(row, isPayed) {
this.$confirm("确定将【" + row.username + "】设置为" + (isPayed ? "已缴费" : "未缴费") + "吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.tableLoading = true
this.$axios.post(loc() + "/onPayed", {id: row.id, isPayed: isPayed}).then(resp => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
this.tableLoading = false
})
})
},
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
async unionChange(val) {
this.pageForm.unitId = null
this.unitList = await this.$businessTool.listUnit(val)
this.doSearch()
},
},
async created() {
this.unionList = await this.$businessTool.listUnion()
this.unitList = await this.$businessTool.listUnit()
this.pageData()
}
})
</script>
<!--#
}
#-->