From 4df9780044033070de8c8d786016a3c865d08394 Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Thu, 21 May 2026 17:21:20 +0800 Subject: [PATCH] commit --- dependency-reduced-pom.xml | 13 +- .../sys/controller/SysLoginController.java | 2 - ...mbursementDeputySchoolUnionController.java | 23 ++ .../service/ActivityReimbursementService.java | 30 +++ .../ActivityReimbursementServiceImpl.java | 219 ++++++++++++++++++ src/main/resources/logback.xml | 98 +++++++- .../deputySchoolUnion/index.html | 144 +++++++++++- 7 files changed, 514 insertions(+), 15 deletions(-) diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index d83f4c9..862c522 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.budwk - v4 + zhgh_jshvc 5.6.0-plus @@ -130,6 +130,13 @@ + + com.wisedu.casp + casp-sdk + latest + system + ${project.basedir}/lib/casp-sdk-java_20260114.jar + @@ -159,11 +166,11 @@ 2.0.8 1.12.2 4.1.2 - 3.8.1 + 3.18.0 UTF-8 2.5.1 2.6.0-SNAPSHOT - 1.5.8 + 1.5.13 1.r.70-SNAPSHOT 4.0.11 diff --git a/src/main/java/com/budwk/app/sys/controller/SysLoginController.java b/src/main/java/com/budwk/app/sys/controller/SysLoginController.java index 9e1f822..1a95de1 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysLoginController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysLoginController.java @@ -63,7 +63,6 @@ public class SysLoginController { @Inject protected PropertiesProxy conf; -/* @At("") @Ok("re") @ApiOperation("用户本地登录页面") @@ -71,7 +70,6 @@ public class SysLoginController { public String login(HttpServletRequest req, HttpSession session) { return "beetl:/platform/sys/login.html"; } -*/ @At @Ok("re") diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java index ec73c7f..35095b4 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/controller/ActivityReimbursementDeputySchoolUnionController.java @@ -15,6 +15,7 @@ import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo; import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService; +import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityReimbursementBudgetSummaryVO; import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam; import com.budwk.app.zhgh.dayofficework.outlay.activityBudget.models.ActivityBudget; import io.swagger.annotations.ApiOperation; @@ -67,6 +68,7 @@ public class ActivityReimbursementDeputySchoolUnionController { info.userName, info.mobile, info.loginName, + info.year, info.applyTime, info.activityName, info.activityAddress, @@ -78,6 +80,8 @@ public class ActivityReimbursementDeputySchoolUnionController { info.activityNumber, info.activityReimbursementMode, info.outlayManageSource, + info.unionId, + info.clubId, info.deductionBudgetId, info.actualMoney, outlay.budgetReimburseType, @@ -142,6 +146,25 @@ public class ActivityReimbursementDeputySchoolUnionController { return Result.success().addData(pagination); } + @At + @ApiOperation("预算/报销汇总表") + @SaCheckPermission("activityReimbursement.deputySchoolUnion") + public Result budgetSummaryData(CommonPageParam pageParam) { + if (pageParam.getYear() == null) { + return Result.error("请选择年度"); + } + if (!List.of("ACTIVITY_BUDGET_TYPE_TWO", "ACTIVITY_BUDGET_TYPE_THREE").contains(pageParam.getOutlayManageSource())) { + return Result.error("请选择分工会或协会"); + } + List list = activityReimbursementService.getBudgetSummary( + pageParam.getYear(), + pageParam.getUnionId(), + pageParam.getClubId(), + pageParam.getOutlayManageSource() + ); + return Result.success(list); + } + @At @SLog(tag = "报销", msg = "校工会副主席审核了一条记录") diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/ActivityReimbursementService.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/ActivityReimbursementService.java index 44f0527..ee5a59d 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/ActivityReimbursementService.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/ActivityReimbursementService.java @@ -2,7 +2,11 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.page.Pagination; import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo; +import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityReimbursementRecordVO; +import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityReimbursementBudgetSummaryVO; +import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam; import org.nutz.dao.sql.Sql; import org.nutz.lang.util.NutMap; @@ -34,4 +38,30 @@ public interface ActivityReimbursementService extends BaseService getBudgetSummary(Integer year, String unionId, String clubId, String outlayManageSource); + + /** + * 分页查询所有已完成的费用报销记录。 + * + * @param pageParam 查询参数,包含年度、申报人关键字、报销模式、经费类型、预算条目、分工会和协会筛选条件 + * @return 分页 VO,列表字段用于前端展示申报人、项目名称、报销模式、经费类型、预算条目、报销金额、申报单位/协会和申报时间 + */ + Pagination queryReimbursementRecordPage(CommonPageParam pageParam); + + /** + * 按费用报销记录列表的同一套查询条件统计报销金额合计。 + * + * @param pageParam 查询参数,包含年度、申报人关键字、报销模式、经费类型、预算条目、分工会和协会筛选条件 + * @return 当前查询条件下所有已完成报销记录的金额合计 + */ + BigDecimal queryReimbursementRecordSummaryMoney(CommonPageParam pageParam); + } diff --git a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/impl/ActivityReimbursementServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/impl/ActivityReimbursementServiceImpl.java index fa2560d..2d9dd76 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/impl/ActivityReimbursementServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/activity/declarereimbursement/reimbursement/service/impl/ActivityReimbursementServiceImpl.java @@ -3,18 +3,24 @@ package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.i import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.base.utils.PageUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo; 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.ActivityReimbursementBudgetSummaryVO; +import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam; import com.budwk.app.zhgh.dayofficework.outlay.activityBudget.models.ActivityBudget; import io.swagger.annotations.ApiOperation; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Lang; import org.nutz.lang.util.NutMap; @@ -155,4 +161,217 @@ public class ActivityReimbursementServiceImpl extends BaseServiceImpl getBudgetSummary(Integer year, String unionId, String clubId, String outlayManageSource) { + if (Objects.equals("ACTIVITY_BUDGET_TYPE_TWO", outlayManageSource)) { + return getUnionBudgetSummary(year, unionId); + } + if (Objects.equals("ACTIVITY_BUDGET_TYPE_THREE", outlayManageSource)) { + return getClubBudgetSummary(year, clubId); + } + return List.of(); + } + + @Override + public Pagination queryReimbursementRecordPage(CommonPageParam pageParam) { + Sql sql = Sqls.create(""" + SELECT + info.id, + info.userName, + info.loginName, + info.activityName, + info.activityReimbursementMode, + info.outlayManageSource, + outlay.budgetReimburseType, + info.actualMoney, + info.declareUnitName, + info.applyTime, + ins.id AS instanceId, + ins.state AS instanceState, + ins.processDefineId AS instanceProcessDefineId + FROM + activity_reimbursement_info info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN activity_budget outlay ON outlay.id = info.deductionBudgetId + $condition + """); + Cnd cnd = buildReimbursementRecordCondition(pageParam); + String orderName = getReimbursementRecordOrderName(pageParam.getPageOrderName()); + if (StrUtil.isAllBlank(orderName, pageParam.getPageOrderBy())) { + cnd.desc("info.applyTime"); + } else { + cnd.orderBy(orderName, PageUtil.getOrder(pageParam.getPageOrderBy())); + } + sql.setCondition(cnd); + return listPageVO(pageParam, sql, ActivityReimbursementRecordVO.class); + } + + @Override + public BigDecimal queryReimbursementRecordSummaryMoney(CommonPageParam pageParam) { + Sql sql = Sqls.create(""" + SELECT + COALESCE(SUM(info.actualMoney), 0) AS summaryMoney + FROM + activity_reimbursement_info info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + LEFT JOIN activity_budget outlay ON outlay.id = info.deductionBudgetId + $condition + """); + sql.setCondition(buildReimbursementRecordCondition(pageParam)); + NutMap map = fetchMap(sql); + Object summaryMoney = map.get("summaryMoney"); + return summaryMoney == null ? BigDecimal.ZERO : new BigDecimal(summaryMoney.toString()); + } + + /** + * 前端表格排序字段白名单,避免任意字段拼接到 SQL。 + */ + private String getReimbursementRecordOrderName(String pageOrderName) { + if (StrUtil.isBlank(pageOrderName)) { + return ""; + } + if (Objects.equals("loginName", pageOrderName)) { + return "info.loginName"; + } + if (Objects.equals("declareUnitName", pageOrderName)) { + return "info.declareUnitName"; + } + if (Objects.equals("applyTime", pageOrderName)) { + return "info.applyTime"; + } + if (Objects.equals("actualMoney", pageOrderName)) { + return "info.actualMoney"; + } + return ""; + } + + /** + * 费用报销记录查询条件,列表和汇总金额共用,保证两处统计口径一致。 + */ + private Cnd buildReimbursementRecordCondition(CommonPageParam pageParam) { + Cnd cnd = Cnd.NEW(); + cnd.and("ins.state", "=", 20); + cnd.andEX("YEAR(info.applyTime)", "=", pageParam.getYear()); + cnd.andEX("info.activityReimbursementMode", "=", pageParam.getActivityReimbursementMode()); + cnd.andEX("info.outlayManageSource", "=", pageParam.getOutlayManageSource()); + cnd.andEX("outlay.budgetReimburseType", "=", pageParam.getBudgetReimburseType()); + cnd.andEX("info.unionId", "=", pageParam.getUnionId()); + cnd.andEX("info.clubId", "=", pageParam.getClubId()); + if (StrUtil.isNotBlank(pageParam.getSearchKeyword())) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.orLike("info.userName", pageParam.getSearchKeyword()); + seg.orLike("info.loginName", pageParam.getSearchKeyword()); + cnd.and(seg); + } + return cnd; + } + + /** + * 分工会维度汇总。 + * 预算金额取指定年度审核通过的分工会活动预算,费用报销汇总取指定年度已完成流程的报销实际金额。 + */ + private List getUnionBudgetSummary(Integer year, String unionId) { + Sql sql = Sqls.create(""" + SELECT + @year AS year, + su.name AS name, + COALESCE(budget.totalBudgetMoney, 0) AS budgetMoney, + COALESCE(reimburse.actualMoney, 0) AS reimbursementMoney + FROM + sys_union su + LEFT JOIN ( + SELECT + ab.unionId, + SUM(ab.totalBudgetMoney) AS totalBudgetMoney + FROM + activity_budget ab + LEFT JOIN wf_process_instance ins ON ins.businessNo = ab.id + WHERE + ins.state = 20 + AND ab.isSchoolBudget = 0 + AND ab.outlayManageSource = 'ACTIVITY_BUDGET_TYPE_TWO' + AND YEAR(ab.applyDate) = @year + GROUP BY + ab.unionId + ) budget ON budget.unionId = su.id + LEFT JOIN ( + SELECT + info.unionId, + SUM(info.actualMoney) AS actualMoney + FROM + activity_reimbursement_info info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE + ins.state = 20 + AND info.outlayManageSource = 'ACTIVITY_BUDGET_TYPE_TWO' + AND info.`year` = @year + GROUP BY + info.unionId + ) reimburse ON reimburse.unionId = su.id + $condition + """).setParam("year", year); + Cnd cnd = Cnd.NEW(); + cnd.andEX("su.id", "=", unionId); + cnd.and(new SqlExpressionGroup() + .or("budget.totalBudgetMoney", "is not", null) + .or("reimburse.actualMoney", "is not", null)); + cnd.asc("su.unionCode"); + sql.setCondition(cnd); + return listVO(sql, ActivityReimbursementBudgetSummaryVO.class); + } + + /** + * 协会维度汇总。 + * 预算金额取指定年度审核通过的协会活动预算,费用报销汇总取指定年度已完成流程的报销实际金额。 + */ + private List getClubBudgetSummary(Integer year, String clubId) { + Sql sql = Sqls.create(""" + SELECT + @year AS year, + sc.clubName AS name, + COALESCE(budget.totalBudgetMoney, 0) AS budgetMoney, + COALESCE(reimburse.actualMoney, 0) AS reimbursementMoney + FROM + sys_club sc + LEFT JOIN ( + SELECT + ab.clubId, + SUM(ab.totalBudgetMoney) AS totalBudgetMoney + FROM + activity_budget ab + LEFT JOIN wf_process_instance ins ON ins.businessNo = ab.id + WHERE + ins.state = 20 + AND ab.isSchoolBudget = 0 + AND ab.outlayManageSource = 'ACTIVITY_BUDGET_TYPE_THREE' + AND YEAR(ab.applyDate) = @year + GROUP BY + ab.clubId + ) budget ON budget.clubId = sc.id + LEFT JOIN ( + SELECT + info.clubId, + SUM(info.actualMoney) AS actualMoney + FROM + activity_reimbursement_info info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE + ins.state = 20 + AND info.outlayManageSource = 'ACTIVITY_BUDGET_TYPE_THREE' + AND info.`year` = @year + GROUP BY + info.clubId + ) reimburse ON reimburse.clubId = sc.id + $condition + """).setParam("year", year); + Cnd cnd = Cnd.NEW(); + cnd.andEX("sc.id", "=", clubId); + cnd.and(new SqlExpressionGroup() + .or("budget.totalBudgetMoney", "is not", null) + .or("reimburse.actualMoney", "is not", null)); + cnd.asc("sc.clubCode"); + sql.setCondition(cnd); + return listVO(sql, ActivityReimbursementBudgetSummaryVO.class); + } } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 4a00be9..87e2ef2 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,17 +1,85 @@ - + - + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + + + + + + ${LOG_HOME}/app.log + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + ${LOG_HOME}/app-%d{yyyy-MM-dd}.log + 300 + + + + + + + + + + + + + + + + + + + + + + + + <!– ERROR级别日志文件配置 –> ${LOG_HOME}/error.log @@ -41,19 +109,31 @@ ${LOG_HOME}/error-%d{yyyy-MM-dd}.log - 30 + 300 - + <!– 框架日志级别 –> + <!– –> - + <!– 日志级别和appender的关联 –> + - + --> + + + + diff --git a/src/main/resources/views/platform/zhgh/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html b/src/main/resources/views/platform/zhgh/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html index d7a1091..7286a93 100644 --- a/src/main/resources/views/platform/zhgh/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html +++ b/src/main/resources/views/platform/zhgh/activity/declarereimbursement/reimbursement/deputySchoolUnion/index.html @@ -64,6 +64,7 @@ layout("/layouts/platform.html"){ 已审核 未审核 + 预算/报销汇总表 {{ row.activityReimbursementMode==='activity'?'活动报销' : '日常报销' }} +