This commit is contained in:
2026-02-06 09:18:33 +08:00
parent a71e169656
commit 5340b78204
19 changed files with 1804 additions and 44 deletions
@@ -0,0 +1,127 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div class="platform" id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年度"
style="width: 100%" type="year"
v-model="pageForm.year"
:clearable="false"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input v-model="pageForm.searchKeyword" placeholder="请输入姓名或工号"
clearable></el-input>
</search-item>
<search-item label="所属协会">
<el-select clearable filterable placeholder="所属协会"
style="width: 100%;" v-model="pageForm.clubId">
<el-option :label="item.clubName" :value="item.id"
v-for="item in clubs"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="历史拨付列表">
<el-button @click="doExcel" size="mini" type="primary" icon="el-icon-s-promotion">
导出Excel
</el-button>
<el-radio-group v-model="pageForm.isGiveMoney" size="small" @change="doSearch"
class="ml5">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="1">已拨付</el-radio-button>
<el-radio-button label="0">未拨付</el-radio-button>
</el-radio-group>
<el-radio-group v-model="pageForm.payed" size="small" @change="doSearch"
class="ml5">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="1">已缴费</el-radio-button>
<el-radio-button label="0">未缴费</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData"
@sort-change='pageOrder'
row-key="id" :loading="tableLoading">
<el-table-column type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop==='isGiveMoney'">
<span class="text-success"
v-if="row.isGiveMoney"></span>
<span class="text-danger" v-else></span>
</template>
<template scope="{row}" v-else-if="column.prop==='payed'">
<span class="text-success" v-if="row.payed">已缴</span>
<span class="text-danger" v-else>未缴</span>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#app',
store,
mixins: [initTableMixins],
data() {
return {
pageForm: {
searchName: "u.username",
year: new Date().getFullYear() + "",
isGiveMoney: "",
payed: "",
},
tableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'applyDate2', label: '加入时间'},
{prop: 'userState', label: '在职状态'},
{prop: 'isGiveMoney', label: '是否拨付'},
{prop: 'payed', label: '是否缴费'},
{prop: 'clubName', label: '所在协会'},
{prop: 'roleName', label: '身份'},
],
}
},
methods: {
doExcel() {
const {isGiveMoney, clubId, year} = this.pageForm
this.$downLoad("/platform/outlay/outlayManage/backHistory/doExcel", {
clubId: clubId,
year: year,
isGiveMoney: isGiveMoney
})
},
},
async created() {
this.clubs = await this.$businessTool.listClubByRole()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -20,15 +20,25 @@ layout("/layouts/platform.html"){
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属协会">
<el-select clearable filterable placeholder="所属协会"
style="width: 100%;" v-model="pageForm.clubId">
<el-option :label="item.clubName" :value="item.id"
v-for="item in clubs"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="预算分配">
<el-button :loading="subLoading" @click="doMsg" type="primary"size="small">短信通知会长
</el-button>
<template v-if="pageForm.year===$moment().format('YYYY')">
<el-button @click="issuedOutlay" size="small" type="primary" v-if="!isAllocation">年度分配
<el-button @click="issuedOutlay" size="small" type="primary" v-if="!isAllocation">{{new
Date().getFullYear()}}年度分配
</el-button>
<el-button type="danger" size="small" @click="resetOutlay" v-else>
分配重置
清空{{new Date().getFullYear()}}年度已分配数据
</el-button>
</template>
</table-tool>
@@ -88,7 +98,7 @@ layout("/layouts/platform.html"){
</div>
<script nonce="${cspNonce!}">
const vue = new Vue({
new Vue({
el: '#app',
store,
mixins: [initTableMixins],
@@ -97,16 +107,33 @@ layout("/layouts/platform.html"){
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'clubName', label: '协会名称'},
{prop: 'historyUserNum', label: '上年度社团人数'},
{prop: 'historyGiveMoneyNum', label: '上年度拨付人数'},
{prop: 'historyNotGiveMoneyNum', label: '上年度未拨付人数'},
{prop: 'totalQuota', label: '预算费用'},
],
pageForm: {
year: this.$moment().format("YYYY")
},
isAllocation: false
isAllocation: false,
clubs: []
}
},
components: {},
methods: {
doMsg() {
this.$confirm('确定要给会长发短信让会长进系统核对拨付金额吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/clubManage/doMsg",).then((resp) => {
if (resp.code === 0) {
this.$message.success(resp.msg);
}
})
})
},
doSubmit(row) {
this.$confirm('您确定要提交此条记录吗?', '提示', {
confirmButtonText: '确定',
@@ -170,6 +197,7 @@ layout("/layouts/platform.html"){
}
},
async created() {
this.clubs = await this.$businessTool.listClubByRole()
this.getIsAllocation()
this.pageData()
}
@@ -0,0 +1,71 @@
const clubHistoryBackUser = {
/*language=HTML*/
template: `
<div>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="姓名/工号">
<el-input v-model="pageForm.searchKeyword" placeholder="请输入姓名或工号"
clearable></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<el-table :data="tableData"
@sort-change='pageOrder'
row-key="id" :loading="tableLoading">
<el-table-column type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop==='isGiveMoney'">
<span class="text-success"
v-if="row.isGiveMoney">是</span>
<span class="text-danger" v-else>否</span>
</template>
<template scope="{row}" v-else-if="column.prop==='payed'">
<span class="text-success" v-if="row.payed">已缴</span>
<span class="text-danger" v-else>未缴</span>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
`,
mixins: [initTableMixins],
data() {
return {
pageForm: {
searchName: "u.username",
},
tableColumns: [
{prop: 'loginname', label: '工号', sortable: true},
{prop: 'username', label: '姓名'},
{prop: 'sex', label: '性别'},
{prop: 'applyDate', label: '加入时间'},
{prop: 'userState', label: '在职状态'},
{prop: 'isGiveMoney', label: '是否拨付'},
{prop: 'payed', label: '是否缴费'},
{prop: 'clubName', label: '所在协会'},
{prop: 'roleName', label: '身份'},
],
pageDataUrl:"/platform/outlay/outlayManage/query/backUserPageData"
}
},
methods: {
onOpen(row, type) {
this.pageForm.searchKeyword = ""
this.pageForm.clubId = row.clubId
this.pageForm.type = type
this.pageForm.year = row.year
this.pageData()
},
}
}
@@ -0,0 +1,237 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div class="platform" id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年度"
style="width: 100%" type="year"
v-model="pageForm.year"
:clearable="false"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属协会">
<el-select clearable filterable placeholder="所属协会"
style="width: 100%;" v-model="pageForm.clubId">
<el-option :label="item.clubName" :value="item.id"
v-for="item in clubs"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="温馨提示:请先更新拨付金额后再点击核对按钮">
<el-button @click="closeAudit(false)" size="mini" type="primary">
开启核对入口
</el-button>
<el-button @click="closeAudit(true)" size="mini" type="danger">
取消核对入口
</el-button>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
show-overflow-tooltip
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
min-width="50"
>
<template v-slot="{row}" v-if="column.prop==='historyUserNum'">
<el-link type="primary" @click="openBackUser(row,'historyUserNum')">
{{row.historyUserNum}}
</el-link>
</template>
<template v-slot="{row}" v-else-if="column.prop==='historyGiveMoneyNum'">
<el-link type="primary" @click="openBackUser(row,'historyGiveMoneyNum')">
{{row.historyGiveMoneyNum}}
</el-link>
</template>
<template v-slot="{row}" v-else-if="column.prop==='historyNotGiveMoneyNum'">
<el-link type="primary" @click="openBackUser(row,'historyNotGiveMoneyNum')">
{{row.historyNotGiveMoneyNum}}
</el-link>
</template>
<template v-slot="{row}" v-else-if="column.prop==='isCheck'">
<span>{{row.isCheck?'已核对':'未核对'}}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="400">
<template slot-scope="{row}">
<el-button
:disabled="row.isCheck||row.isDisable"
@click="doMoney(row)"
size="mini"
type="primary">
更新拨付金额
</el-button>
<el-button
:disabled="row.isCheck||row.isDisable"
@click="doAudit(row)"
size="mini"
type="primary">
核对
</el-button>
<el-button v-if="row.isCheck&&!row.isDisable"
@click="cancelAudit(row)"
size="mini"
type="danger">
取消核对
</el-button>
<el-button
v-if="row.isCheck"
@click="doExcel(row)"
size="mini"
type="primary">
导出
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<club-history-back-user ref="clubHistoryBackUserRef"></club-history-back-user>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include('clubHistoryBackUser.js'){}#-->
new Vue({
el: '#app',
store,
mixins: [initTableMixins],
components: {
"club-history-back-user": clubHistoryBackUser,
},
data() {
return {
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'clubName', label: '协会名称'},
{prop: 'historyUserNum', label: '上年度社团人数'},
{prop: 'historyGiveMoneyNum', label: '上年度拨付人数'},
{prop: 'historyNotGiveMoneyNum', label: '上年度未拨付人数'},
{prop: 'totalQuota', label: '预算费用'},
{prop: 'isCheck', label: '预算费用'},
],
pageForm: {
year: this.$moment().format("YYYY")
},
clubs:[]
}
},
methods: {
openBackUser(row, type) {
this.$refs.guava.view(() => {
this.$refs.clubHistoryBackUserRef.onOpen(row, type)
})
},
closeAudit(flag) {
this.$confirm('确定要' + (flag ? '关闭' : '开启') + '拨付核对入口吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/query/closeAudit", {
flag: flag,
}).then(resp => {
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg);
}
})
})
},
doMoney(row) {
this.$confirm('更新前请前往【缴费管理】菜单,核对是否缴费。核对准确后,再点击更新拨付金额,确定要更新吗?', '提示', {
confirmButtonText: '更新',
cancelButtonText: '前往【缴费管理】菜单',
distinguishCancelAndClose: true,
beforeClose: (action, instance, done) => {
if (action === 'confirm') {
done();
} else if (action === 'cancel') {
window.open("/platform/club/pay")
done();
} else if (action === 'close') {
done();
}
},
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/query/doMoney", {clubId: row.clubId}).then(resp => {
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg);
}
})
})
},
doAudit(row) {
this.$confirm('提交前请先更新拨付金额,提交后不能修改拨付金额,您确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/query/doAudit", {id: row.id}).then(resp => {
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg);
}
})
})
},
cancelAudit(row) {
this.$confirm('确定要取消核对吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post("/platform/outlay/outlayManage/query/cancelAudit", {id: row.id,}).then(resp => {
if (resp.code === 0) {
this.doSearch()
this.$message.success(resp.msg);
}
})
})
},
doExcel(row) {
this.$downLoad("/platform/outlay/outlayManage/query/doExcel", {clubId: row.clubId, year: row.year})
},
},
async created() {
this.clubs = await this.$businessTool.listClubByRole()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,197 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年度"
style="width: 100%"
type="year"
v-model="pageForm.year"
:clearable="false"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="所属季度">
<dict-select clearable code="OUTLAY_QUARTERLY"
placeholder="请选择所属季度"
v-model="pageForm.quarterly"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select placeholder="请选择所属工会" v-model="pageForm.unionId"
style="width: 100%;"
clearable
@change="doSearch"
filterable>
<el-option v-for="item in unionList"
:label="item.name"
:key="item.id"
:value="item.id"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="预算分配">
<el-button @click="doAllocateRecord" size="small" type="primary" :loading="formLoading">季度记录生成
</el-button>
<el-button @click="deleteAllocateRecord" size="small" type="danger" :loading="formLoading">重置季度记录
</el-button>
</table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id"
v-loading="tableLoading" :size="tableSize" class="vi-table">
<el-table-column type="index" :index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
show-overflow-tooltip
v-for="column in tableColumns"
:label="column.label"
:prop="column.prop"
:key="column.prop"
:sortable="column.sortable"
:width="column.width"
min-width="50"
>
<template v-slot="{row}" v-if="column.prop==='quarterly'">
<dict-tag :options="dict.type.OUTLAY_QUARTERLY"
:value="row.quarterly"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop==='allocateMoney'">
<el-input-number v-if="row.edit" :min="0"
style="width: 100%"
size="small"
v-model="row.newAllocateMoney" placeholder="填写总额度">
</el-input-number>
<div v-else>
{{row.allocateMoney}}
</div>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template slot-scope="{row}">
<div v-if="row.edit">
<el-button type="success" icon="el-icon-check" size="mini"
@click="doEdit(row)"
circle></el-button>
<el-button type="danger" icon="el-icon-close" size="mini"
@click="$set(row,'edit',false)"
circle></el-button>
</div>
<el-button v-else size="mini" type="primary"
@click="$set(row,'edit',true);$set(row,'newAllocateMoney',row.allocateMoney);">
编辑
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#app',
store,
mixins: [initTableMixins],
dicts: ["OUTLAY_QUARTERLY"],
data() {
return {
pageForm: {
year: this.$moment().format("YYYY")
},
unionList: [],
tableColumns: [
{prop: 'year', label: '年度'},
{prop: 'quarterly', label: '季度'},
{prop: 'unionName', label: '工会名称'},
{prop: 'allocateHeadMoney', label: '分配前额度'},
{prop: 'allocateMoney', label: '分配额度'},
],
quarterlyList: [],
}
},
methods: {
doEdit(row) {
this.$confirm('确定要给【' + row.unionName + '】分配预算吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.formLoading = true
this.$axios.post("/platform/outlay/outlayManage/unionAllocate/doEdit", {
id: row.id,
allocateMoney: row.newAllocateMoney
}).then((resp) => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
this.formLoading = false
})
})
},
deleteAllocateRecord() {
this.$confirm('确定要重置【第' + this.$moment().quarter() + '季度】的预算记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.formLoading = true
this.$axios.post("/platform/outlay/outlayManage/unionAllocate/deleteAllocateRecord").then((resp) => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
this.formLoading = false
})
})
},
doAllocateRecord() {
this.$confirm('确定要生成【第' + this.$moment().quarter() + '季度】的预算记录吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.formLoading = true
this.$axios.post("/platform/outlay/outlayManage/unionAllocate/doAllocateRecord").then((resp) => {
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
}
}).finally(() => {
this.formLoading = false
})
})
},
},
created() {
this.$businessTool.listUnion().then((data) => {
this.unionList = data
})
this.$businessTool.getDictOptions("OUTLAY_QUARTERLY").then((data) => {
let quarter = this.$moment().quarter();
this.$set(this.pageForm, "quarterly", data[quarter - 1].code)
this.pageData()
})
}
})
</script>
<!--#
}
#-->
@@ -63,8 +63,10 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
fixed="right" width="150">
fixed="right" width="250">
<template slot-scope="{row}">
<el-button size="mini" type="primary" @click="openAllocateView(row)">经费分配详情
</el-button>
<el-button size="mini" type="primary" @click="openView(row)">使用详情</el-button>
</template>
</el-table-column>
@@ -74,13 +76,19 @@ layout("/layouts/platform.html"){
</template>
<template #view>
<outlay-manage-union-use-detail-info ref="detailInfo" @search="doSearch"></outlay-manage-union-use-detail-info>
<outlay-manage-union-use-detail-info ref="detailInfo"
@search="doSearch"></outlay-manage-union-use-detail-info>
</template>
<template #edit>
<outlay-manage-union-quarterly-allocate ref="quarterlyAllocate"></outlay-manage-union-quarterly-allocate>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("detailInfo.js"){}#-->
<!--#include("quarterlyOutlayAllocate.js"){}#-->
const vue = new Vue({
el: '#app',
store,
@@ -102,9 +110,15 @@ layout("/layouts/platform.html"){
}
},
components: {
"outlay-manage-union-use-detail-info": OUTLAY_MANAGE_UNION_USE_DETAIL_INFO
"outlay-manage-union-use-detail-info": OUTLAY_MANAGE_UNION_USE_DETAIL_INFO,
"outlay-manage-union-quarterly-allocate": OUTLAY_MANAGE_UNION_QUARTERLY_ALLOCATE
},
methods: {
openAllocateView(row) {
this.$refs.guava.edit(() => {
this.$refs.quarterlyAllocate.open(row)
})
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.detailInfo.open(row)
@@ -0,0 +1,42 @@
let OUTLAY_MANAGE_UNION_QUARTERLY_ALLOCATE = {
/*language=HTML*/
template:
`
<div>
<template>
<table-tool label="季度分配记录"></table-tool>
<el-table :data="tableData" style="width: 100%" row-key="id" class="vi-table">
<el-table-column type="index" label="序号" width="80px"></el-table-column>
<el-table-column label="季度" prop="quarterly">
<template v-slot="{row}">
<dict-tag :options="dict.type.OUTLAY_QUARTERLY"
:value="row.quarterly"></dict-tag>
</template>
</el-table-column>
<el-table-column label="分配前额度" prop="allocateHeadMoney"></el-table-column>
<el-table-column label="分配额度" prop="allocateMoney"></el-table-column>
</el-table>
</template>
</div>
`,
dicts: ["OUTLAY_QUARTERLY"],
data() {
return {
rowData: {},
tableData: []
}
},
methods: {
open(row) {
this.rowData = row
this.$axios.post("/platform/outlay/outlayManage/unionUseDetail/queryQuarterlyList", {
year: row.year,
unionId: row.unionId
}).then(resp => {
if (resp.code === 0) {
this.tableData = resp.data
}
})
}
}
}