福利名单添加功能:

1、人员名单:添加问题反馈、按工会确认、按工会取消确认、勾选确认、勾选取消确认;及添加按钮权限控制:导入名单、添加人员、备注、删除
2、确认统计
3、事项反馈
This commit is contained in:
2026-05-25 11:55:44 +08:00
parent 9ec843110d
commit 737dfd6587
13 changed files with 1093 additions and 17 deletions
@@ -0,0 +1,179 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="yearChange"></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select v-model="pageForm.projectId"
clearable
filterable
placeholder="请选择福利项目"
style="width: 100%"
@change="doSearch">
<el-option v-for="item in projectOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="分工会" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN', 'SCHOOL_UNION_WELFARE_ADMIN'])">
<el-select v-model="pageForm.unionId"
clearable
filterable
placeholder="请选择分工会"
style="width: 100%"
@change="doSearch">
<el-option v-for="item in unions"
: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 type="danger"
size="small"
:disabled="selectedFeedbackIds.length === 0"
@click="deleteFeedbackBatch">批量删除</el-button>
</table-tool>
<el-table :data="tableData"
style="width: 100%"
row-key="id"
:size="tableSize"
v-loading="tableLoading"
@selection-change="handleSelectionChange"
ref="table"
class="vi-table">
<el-table-column type="selection" width="55" align="center" header-align="center"></el-table-column>
<el-table-column type="index" :index="indexMethod" label="序号" width="80px" align="center" header-align="center"></el-table-column>
<el-table-column prop="year" label="年度" align="center" header-align="center"></el-table-column>
<el-table-column prop="projectName" label="福利项目" min-width="180px" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column prop="unionName" label="分工会" min-width="160px" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column prop="feedbackInfo" label="反馈信息" min-width="240px" align="center" header-align="center" show-overflow-tooltip>
<template slot-scope="{row}">
<div v-html="row.feedbackInfo" style="white-space: pre-line !important;"></div>
</template>
</el-table-column>
<el-table-column prop="createdByName" label="创建人" align="center" header-align="center"></el-table-column>
<el-table-column prop="createdAt" label="创建时间" width="180px" align="center" header-align="center">
<template slot-scope="{row}">
{{ row.createdAt ? $moment(row.createdAt).format("YYYY-MM-DD HH:mm:ss") : "" }}
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {
year: moment().format("YYYY")
},
tableData: [],
selectedFeedbackIds: [],
unions: [],
projectOptions: []
}
},
methods: {
handleSelectionChange(rows) {
this.selectedFeedbackIds = rows.map(function (item) {
return item.id
})
},
yearChange() {
return $.get("/platform/welfare/feedback/listProject", {year: this.pageForm.year}).then((resp) => {
if (resp.code === 0) {
this.projectOptions = resp.data || []
if (this.projectOptions.length > 0) {
const currentProjectId = this.pageForm.projectId
if (!currentProjectId || !this.projectOptions.some(function (item) {
return item.id === currentProjectId
})) {
this.pageForm.projectId = this.projectOptions[0].id
}
} else {
this.pageForm.projectId = ""
}
this.doSearch()
} else {
this.notifyError(resp.msg)
}
})
},
pageData() {
this.tableLoading = true
return $.post("/platform/welfare/feedback/pageData", this.pageForm).then((resp) => {
if (resp.code === 0) {
this.tableData = resp.data.list || []
this.selectedFeedbackIds = []
this.pageForm.totalCount = resp.data.totalCount || 0
} else {
this.notifyError(resp.msg)
}
}).always(() => {
this.tableLoading = false
})
},
doSearch() {
this.pageForm.pageNumber = 1
return this.pageData()
},
deleteFeedbackBatch() {
if (this.selectedFeedbackIds.length === 0) {
this.notifyWarning("请选择需要删除的反馈")
return
}
this.$confirm("确认批量删除选中的反馈吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
$.post("/platform/welfare/feedback/deleteFeedbackBatch", {
ids: this.selectedFeedbackIds.join(",")
}).then((resp) => {
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.pageData()
} else {
this.notifyError(resp.msg)
}
})
})
}
},
created() {
this.$businessTool.listUnion().then((res) => {
this.unions = res
if (!this.pageForm.unionId && this.unions && this.unions.length === 1) {
this.pageForm.unionId = this.unions[0].id
}
})
this.yearChange()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,133 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" class="platform" v-cloak>
<guava ref="guava" padding="0 5%">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="请选择年度"
style="width: 100%"
@change="yearChange"></el-date-picker>
</search-item>
<search-item label="福利项目">
<el-select v-model="pageForm.projectId"
clearable
filterable
placeholder="请选择福利项目"
style="width: 100%"
@change="doSearch">
<el-option v-for="item in projectOptions"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</search-item>
<search-item label="所属工会">
<el-select v-model="pageForm.unionId"
clearable
filterable
placeholder="请选择所属工会"
style="width: 100%"
@change="doSearch">
<el-option v-for="item in unions"
: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"
row-key="unionId"
style="width: 100%"
v-loading="tableLoading"
ref="table"
class="vi-table">
<el-table-column type="index" :index="indexMethod" label="序号" width="80px" align="center" header-align="center"></el-table-column>
<el-table-column prop="unionName" label="工会名称" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column prop="totalCount" label="总人数" align="center" header-align="center"></el-table-column>
<el-table-column prop="confirmedCount" label="已确认人数" align="center" header-align="center"></el-table-column>
<el-table-column prop="unconfirmedCount" label="未确认人数" align="center" header-align="center"></el-table-column>
<el-table-column prop="completeStatus" label="确认完成状态" align="center" header-align="center"></el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
pageForm: {
year: moment().format("YYYY")
},
unions: [],
projectOptions: []
}
},
methods: {
yearChange() {
return $.get("/platform/welfare/personconfirm/listProject", {year: this.pageForm.year}).then((resp) => {
if (resp.code === 0) {
this.projectOptions = resp.data || []
if (this.projectOptions.length > 0) {
this.$set(this.pageForm, "projectId", this.projectOptions[0].id)
} else {
this.$set(this.pageForm, "projectId", "")
}
this.doSearch()
} else {
this.notifyError(resp.msg)
}
})
},
pageData() {
if (!this.pageForm.year || !this.pageForm.projectId) {
this.tableData = []
this.pageForm.totalCount = 0
return Promise.resolve()
}
this.tableLoading = true
return $.post("/platform/welfare/personconfirm/pageData", this.pageForm).then((resp) => {
if (resp.code === 0) {
this.tableData = resp.data.list || []
this.pageForm.totalCount = resp.data.totalCount || 0
} else {
this.notifyError(resp.msg)
}
}).always(() => {
this.tableLoading = false
})
},
doSearch() {
this.pageForm.pageNumber = 1
return this.pageData()
}
},
created() {
this.$businessTool.listUnion().then((res) => {
this.unions = res
if (!this.pageForm.unionId && this.unions && this.unions.length === 1) {
this.pageForm.unionId = this.unions[0].id
}
})
this.yearChange()
}
})
</script>
<!--#
}
#-->
@@ -120,6 +120,13 @@ layout("/layouts/platform.html"){
></dict-select>
</search-item>
<search-item label="确认状态">
<el-select clearable placeholder="请选择确认状态" style="width: 100%" v-model="pageForm.isAudit">
<el-option label="已确认" value="1"></el-option>
<el-option label="未确认" value="0"></el-option>
</el-select>
</search-item>
<!-- <search-item label="所选福利:">-->
<!-- <el-select clearable placeholder="请选择所选福利" style="width: 100%" v-model="pageForm.optionId">-->
<!-- <el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in pageFormProject"></el-option>-->
@@ -133,29 +140,39 @@ layout("/layouts/platform.html"){
<el-button :disabled="!pageForm.projectId" @click="openExport" icon="el-icon-download" size="small" type="primary">
导出名单
</el-button>
<el-button :disabled="!pageForm.projectId" @click="openImport" icon="el-icon-document-add" size="small" type="primary">
<el-button :disabled="!pageForm.projectId"
v-if="$auth.hasPermission('welfare.list.mange.addData')"
@click="openImport" icon="el-icon-document-add" size="small" type="primary">
导入名单
</el-button>
<el-button
:disabled="!pageForm.projectId"
@click="$refs.addUserRef.onOpen(pageForm.projectId)"
v-if="$auth.hasPermission('welfare.list.mange.addData')"
icon="el-icon-document-add"
size="small"
type="primary"
>
添加人员
</el-button>
<el-button type="primary" size="small" :disabled="!pageForm.projectId" @click="openFeedback">问题反馈</el-button>
<el-button type="primary" size="small" :disabled="!pageForm.projectId" @click="doAuditByUnion(true)">按工会确认</el-button>
<el-button type="danger" size="small" :disabled="!pageForm.projectId" @click="doAuditByUnion(false)">按工会取消确认</el-button>
<el-button type="primary" size="small" :disabled="selectedIds.length === 0" @click="doAuditSelected(true)">勾选确认</el-button>
<el-button type="danger" size="small" :disabled="selectedIds.length === 0" @click="doAuditSelected(false)">勾选取消确认</el-button>
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@selection-change="handleSelectionChange"
@sort-change="pageOrder"
ref="tableRef"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
>
<el-table-column align="center" header-align="center" type="selection" width="55"></el-table-column>
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column
@@ -178,11 +195,18 @@ layout("/layouts/platform.html"){
<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 scope="{row}" v-else-if="column.prop=='isAudit'">
<el-tag type="success" v-if="row.isAudit">已确认</el-tag>
<el-tag type="info" v-else>未确认</el-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='auditTime'">
{{ row.auditTime ? $moment(row.auditTime).format("YYYY-MM-DD HH:mm:ss") : "" }}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="200px">
<el-table-column align="center" fixed="right" v-if="$auth.hasPermissionOr(['welfare.list.mange.updateRemark','welfare.list.mange.delete'])" header-align="center" label="操作" width="200px">
<template scope="{row}">
<el-button @click="$refs.updateRemarkRef.onOpen(row)" size="mini" type="primary">备注</el-button>
<el-button @click="doDelete(row)" size="mini" type="danger">删除</el-button>
<el-button @click="$refs.updateRemarkRef.onOpen(row)" v-if="$auth.hasPermission('welfare.list.mange.updateRemark')" size="mini" type="primary">备注</el-button>
<el-button @click="doDelete(row)" v-if="$auth.hasPermission('welfare.list.mange.delete')" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -210,6 +234,26 @@ layout("/layouts/platform.html"){
<!--人员备注-->
<update-remark ref="updateRemarkRef" @refresh="doSearch"></update-remark>
<el-dialog :close-on-click-modal="false" :visible.sync="feedbackDialog" title="问题反馈" width="60%">
<el-form :model="feedbackForm" label-width="100px">
<el-form-item label="反馈信息">
<el-input placeholder="请输入反馈信息" type="textarea" v-model="feedbackForm.feedbackInfo"></el-input>
</el-form-item>
</el-form>
<el-row class="mb10" justify="end" type="flex">
<el-button plain type="primary" @click="feedbackDialog = false">取消</el-button>
<el-button type="primary" v-loading="feedbackLoading" @click="saveFeedback">保存</el-button>
</el-row>
<el-table :data="feedbackList" border>
<el-table-column align="center" label="问题反馈" prop="feedbackInfo" show-overflow-tooltip="false"></el-table-column>
<el-table-column align="center" label="操作" width="100px">
<template slot-scope="{row}">
<el-button size="mini" type="danger" @click="deleteFeedback(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
<!--导入福利名单-->
<excel-import
ref="excelImportRef"
@@ -269,7 +313,9 @@ layout("/layouts/platform.html"){
{ prop: "userState", label: "在职状态", sortable: true },
{ prop: "welfareUnionName", label: "所属工会", sortable: true },
{ prop: "welfareUnitName", label: "所属单位", sortable: true },
{ prop: "remark", label: "备注", sortable: true }
{ prop: "isAudit", label: "确认状态", sortable: true },
{ prop: "auditTime", label: "确认时间", sortable: true },
{ prop: "remark", label: "备注", sortable: true },
],
importData: { fileList: [], isfg: 1 },
@@ -278,10 +324,25 @@ layout("/layouts/platform.html"){
welfareListUserDrawer: false,
showImportDialog: false
showImportDialog: false,
selectedIds: [],
feedbackDialog: false,
feedbackLoading: false,
feedbackList: [],
feedbackForm: {
year: "",
projectId: "",
unionId: "",
feedbackInfo: ""
}
}
},
methods: {
handleSelectionChange(rows) {
this.selectedIds = rows.map(function (item) {
return item.id
})
},
// 导出名单
openExport() {
this.$downLoad("/platform/welfare/list/mange/exportXlsx", {
@@ -307,16 +368,139 @@ layout("/layouts/platform.html"){
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
const resp = await this.$axios.post("/platform/welfare/list/mange/delete", { id: row.id })
}).then(() => {
this.$axios.post("/platform/welfare/list/mange/delete", { id: row.id }).then((resp) => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
} else {
this.$message.error(resp.msg)
}
})
})
},
validateFeedbackCondition() {
if (!this.pageForm.year || !this.pageForm.projectId) {
this.notifyWarning("请先选择年度、福利项目")
return false
}
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN", "SCHOOL_UNION_WELFARE_ADMIN"]) && !this.pageForm.unionId) {
this.notifyWarning("请选择分工会")
return false
}
return true
},
openFeedback() {
if (!this.validateFeedbackCondition()) {
return
}
this.feedbackForm.year = this.pageForm.year
this.feedbackForm.projectId = this.pageForm.projectId
this.feedbackForm.unionId = this.pageForm.unionId
this.feedbackForm.feedbackInfo = ""
this.queryFeedbackList().then(() => {
this.feedbackDialog = true
})
},
queryFeedbackList() {
return this.$axios.post("/platform/welfare/list/mange/feedbackList", {
year: this.pageForm.year,
projectId: this.pageForm.projectId,
unionId: this.pageForm.unionId
}).then((resp) => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
this.feedbackList = resp.data || []
} else {
this.$message.error(resp.msg)
this.notifyError(resp.msg)
}
})
},
saveFeedback() {
if (!this.validateFeedbackCondition()) {
return
}
if (!this.feedbackForm.feedbackInfo) {
this.notifyWarning("请输入反馈信息")
return
}
this.feedbackLoading = true
this.$axios.post("/platform/welfare/list/mange/saveFeedback", this.feedbackForm).then((resp) => {
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.feedbackForm.feedbackInfo = ""
this.queryFeedbackList()
} else {
this.notifyError(resp.msg)
}
}).finally(() => {
this.feedbackLoading = false
})
},
deleteFeedback(row) {
this.$confirm("确认删除这条反馈吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/welfare/list/mange/deleteFeedback", { id: row.id }).then((resp) => {
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.queryFeedbackList()
} else {
this.notifyError(resp.msg)
}
})
})
},
doAuditByUnion(flag) {
if (!this.pageForm.projectId) {
this.notifyWarning("请先选择福利项目")
return
}
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN", "SCHOOL_UNION_WELFARE_ADMIN"]) && !this.pageForm.unionId) {
this.notifyWarning("请选择需要确认的分工会")
return
}
const msg = flag ? "确定按当前福利项目和分工会确认名单吗?" : "确定按当前福利项目和分工会取消确认吗?"
this.$confirm(msg, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/welfare/list/mange/doAuditUser", {
projectId: this.pageForm.projectId,
unionId: this.pageForm.unionId,
flag: flag
}).then((resp) => {
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyError(resp.msg)
}
})
})
},
doAuditSelected(flag) {
const msg = flag ? "确定确认勾选人员吗?" : "确定取消确认勾选人员吗?"
this.$confirm(msg, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/welfare/list/mange/doAuditSelected", {
ids: this.selectedIds.join(","),
flag: flag
}).then((resp) => {
if (resp.code === 0) {
this.notifySuccess(resp.msg)
this.doSearch()
} else {
this.notifyError(resp.msg)
}
})
})
},
getWelfareList() {
this.$axios.post("/platform/welfare/project/mange/getWelfareList", { year: this.pageForm.year }).then((res) => {
this.projectSelectOptions = res.data
@@ -336,6 +520,7 @@ layout("/layouts/platform.html"){
})
.then((res) => {
this.tableData = res.data.list
this.selectedIds = []
this.pageForm.totalCount = res.data.totalCount
})
.finally(() => {