This commit is contained in:
=
2026-05-26 16:09:53 +08:00
5 changed files with 323 additions and 1 deletions
@@ -0,0 +1,50 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityReimbursementRecordVO;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.math.BigDecimal;
/**
* 费用报销记录查询。
*/
@IocBean
@Ok("json")
@ApiOperation("费用报销记录查询")
@At("/platform/activityReimbursement/query")
public class ActivityReimbursementQueryController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.query")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/query/index.html")
public void index() {
}
@At
@ApiOperation("分页查询所有已完成费用报销记录")
@SaCheckPermission("activityReimbursement.query")
public Result pageData(CommonPageParam pageParam) {
Pagination<ActivityReimbursementRecordVO> pagination = activityReimbursementService.queryReimbursementRecordPage(pageParam);
return Result.success().addData(pagination);
}
@At
@ApiOperation("按当前查询条件统计费用报销汇总金额")
@SaCheckPermission("activityReimbursement.query")
public Result summaryMoney(CommonPageParam pageParam) {
BigDecimal summaryMoney = activityReimbursementService.queryReimbursementRecordSummaryMoney(pageParam);
return Result.success(summaryMoney);
}
}
@@ -0,0 +1,28 @@
package com.budwk.app.zhgh.activity.declarereimbursement.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 预算/报销汇总表行数据。
* 用于展示指定年度下分工会或协会的预算金额与已完成报销金额。
*/
@Data
@ApiModel("预算/报销汇总表")
public class ActivityReimbursementBudgetSummaryVO {
@ApiModelProperty("年度")
private Integer year;
@ApiModelProperty("分工会或协会名称")
private String name;
@ApiModelProperty("预算金额")
private BigDecimal budgetMoney;
@ApiModelProperty("费用报销汇总")
private BigDecimal reimbursementMoney;
}
@@ -0,0 +1,55 @@
package com.budwk.app.zhgh.activity.declarereimbursement.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 费用报销记录列表 VO。
*/
@Data
@ApiModel("费用报销记录列表")
public class ActivityReimbursementRecordVO {
@ApiModelProperty("报销记录ID")
private String id;
@ApiModelProperty("申报人姓名")
private String userName;
@ApiModelProperty("申报人工号")
private String loginName;
@ApiModelProperty("项目名称")
private String activityName;
@ApiModelProperty("报销模式,activity 表示活动报销,daily 表示日常报销")
private String activityReimbursementMode;
@ApiModelProperty("经费类型字典值,对应 ACTIVITY_BUDGET_TYPE")
private String outlayManageSource;
@ApiModelProperty("预算条目字典值,对应 ACTIVITY_BUDGET_REIMBURSE_TYPE")
private String budgetReimburseType;
@ApiModelProperty("报销金额")
private BigDecimal actualMoney;
@ApiModelProperty("申报单位或协会名称")
private String declareUnitName;
@ApiModelProperty("申报时间")
private Date applyTime;
@ApiModelProperty("流程实例ID,查看详情和流程信息时使用")
private Long instanceId;
@ApiModelProperty("流程实例状态")
private Integer instanceState;
@ApiModelProperty("流程定义ID")
private Long instanceProcessDefineId;
}
@@ -0,0 +1,189 @@
<!--#
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">
</el-date-picker>
</search-item>
<search-item label="申请人">
<el-input placeholder="请输入申请人工号或姓名" clearable
v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="报销模式">
<el-select clearable filterable placeholder="请选择报销模式"
style="width: 100%;" v-model="pageForm.activityReimbursementMode">
<el-option label="活动报销" value="activity"></el-option>
<el-option label="日常报销" value="daily"></el-option>
</el-select>
</search-item>
<search-item label="经费类型">
<dict-select code="ACTIVITY_BUDGET_TYPE" v-model="pageForm.outlayManageSource"
placeholder="请选择经费类型"></dict-select>
</search-item>
<search-item label="预算条目">
<dict-select code="ACTIVITY_BUDGET_REIMBURSE_TYPE" v-model="pageForm.budgetReimburseType"
placeholder="请选择预算条目"></dict-select>
</search-item>
<search-item label="所属工会">
<el-select clearable
filterable
placeholder="请选择所属工会"
style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.name" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</search-item>
<search-item label="所属协会">
<el-select clearable filterable placeholder="所属协会"
style="width: 100%;" v-model="pageForm.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 :app="this" label="报销记录">
<span class="ml10">汇总金额:{{summaryMoney}} 元</span>
</table-tool>
<el-table :data="tableData" :default-sort="{prop: 'applyTime', order: 'descending'}" :size="tableSize" @sort-change="pageOrder"
ref="table" row-key="id" style="width: 100%">
<el-table-column :index="indexMethod" header-align="center" label="序号"
type="index" width="60px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
header-align="center"
min-width="120px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='loginName'">
<span>{{row.userName + '(' + row.loginName + ')' }}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='outlayManageSource'">
<dict-tag :options="dict.type.ACTIVITY_BUDGET_TYPE" :value="row.outlayManageSource"></dict-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='budgetReimburseType'">
<dict-tag :options="dict.type.ACTIVITY_BUDGET_REIMBURSE_TYPE"
:value="row.budgetReimburseType"></dict-tag>
</template>
<template scope="{row}" v-else-if="column.prop=='activityReimbursementMode'">
<span>{{ row.activityReimbursementMode === 'activity' ? '活动报销' : '日常报销' }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="100px">
<template slot-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 #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
store,
dicts: ["ACTIVITY_BUDGET_TYPE", "ACTIVITY_BUDGET_REIMBURSE_TYPE"],
data() {
return {
pageDataUrl: "/platform/activityReimbursement/query/pageData",
pageForm: {
year: this.$moment().format("YYYY"),
pageOrderName: "applyTime",
pageOrderBy: "descending"
},
tableColumns: [
{prop: "loginName", label: "申报人", sortable: true, width: "180"},
{prop: "activityName", label: "项目名称", width: "240"},
{prop: "activityReimbursementMode", label: "报销模式"},
{prop: "outlayManageSource", label: "经费类型"},
{prop: "budgetReimburseType", label: "预算条目"},
{prop: "actualMoney", label: "报销金额(元)", sortable: true, width: "150"},
{prop: "declareUnitName", label: "申报单位/协会", sortable: true, width: "170"},
{prop: "applyTime", label: "申报时间", sortable: true, width: "170"}
],
unions: [],
clubs: [],
summaryMoney: "0.00",
summaryLoading: false
}
},
components: {
"info": INFO
},
methods: {
pageData(data = null) {
const address = this.pageDataUrl ? this.pageDataUrl : loc() + "/pageData"
const params = data ? data : this.pageForm
this.tableLoading = true
this.$axios.post(address, params).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
}
}).finally(() => {
this.tableLoading = false
})
this.getSummaryMoney(params)
},
getSummaryMoney(params) {
this.summaryLoading = true
this.$axios.post("/platform/activityReimbursement/query/summaryMoney", params).then((res) => {
if (res.code === 0) {
this.summaryMoney = res.data || "0.00"
}
}).finally(() => {
this.summaryLoading = false
})
},
openView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
}
},
created() {
this.pageData()
Promise.all([
this.$businessTool.listUnion(),
this.$businessTool.listClub()
]).then((res) => {
this.unions = res[0]
this.clubs = res[1]
})
}
})
</script>
<!--#
}
#-->
+1 -1
View File
@@ -78,7 +78,7 @@ public class JugTest {
@Test
public void sendMsg() {
smsService.send("20182040", "这是一条由智慧工会系统发出的测试消息。");
// smsService.send("20182040", "这是一条由智慧工会系统发出的测试消息。");
}
@Test