From 5c646ff039edcd3370dfcbf1c01caf0f4399207a Mon Sep 17 00:00:00 2001 From: zhangrui Date: Thu, 30 Apr 2026 09:22:53 +0800 Subject: [PATCH] 1 --- .../statistics/MemberAnalysisController.java | 18 +- .../service/MemberStatisticsService.java | 18 +- .../impl/MemberStatisticsServiceImpl.java | 187 ++++++++++++++++-- .../welfare/param/WelfareListPageForm.java | 6 + .../WelfareSelectionSituationPageForm.java | 6 + .../service/impl/WelfareListServiceImpl.java | 2 + .../WelfareSelectionSituationServiceImpl.java | 2 + .../member/statistics/analysis/index.html | 126 +++++++++++- .../member/statistics/summary/index.html | 112 ++++++++--- .../welfare/selectionSituation/index.html | 8 + .../zhgh/welfare/welfareUser/index.html | 8 + 11 files changed, 435 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/statistics/MemberAnalysisController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/statistics/MemberAnalysisController.java index 5dbbfbfb..69190ccb 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/statistics/MemberAnalysisController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/statistics/MemberAnalysisController.java @@ -2,6 +2,7 @@ package com.budwk.app.zhgh.staffmanage.member.controller.statistics; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberStatisticsPageForm; import com.budwk.app.zhgh.staffmanage.member.service.MemberStatisticsService; import org.apache.poi.ss.usermodel.Workbook; import org.nutz.ioc.loader.annotation.Inject; @@ -39,14 +40,12 @@ public class MemberAnalysisController { @At @SaCheckPermission("member.statistics.analysis") - public Result pageData(@Param(value = "queryId") String queryId, - @Param(value = "queryType") String queryType, - @Param(value = "currentYear") Integer currentYear) { + public Result pageData(@Param("..") MemberStatisticsPageForm pageForm) { List list = new ArrayList<>(); - if ("fgh".equals(queryType)) { - list = memberStatisticsService.getUnionAnalysisData(queryId, currentYear); + if ("fgh".equals(pageForm.getQueryType())) { + list = memberStatisticsService.getUnionAnalysisData(pageForm); } else { - list = memberStatisticsService.getUnitAnalysisData(queryId, currentYear); + list = memberStatisticsService.getUnitAnalysisData(pageForm); } return Result.success(list); } @@ -58,10 +57,13 @@ public class MemberAnalysisController { public void doExport(@Param("queryType") String queryType, @Param("currentYear") String currentYear, @Param("queryId") String queryId, HttpServletResponse response) { List list = new ArrayList<>(); + MemberStatisticsPageForm pageForm = new MemberStatisticsPageForm(); + pageForm.setQueryId(queryId); + pageForm.setCurrentYear(Integer.valueOf(currentYear)); if ("union".equals(queryType)) { - list = memberStatisticsService.getUnionAnalysisData(queryId, Integer.valueOf(currentYear)); + list = memberStatisticsService.getUnionAnalysisData(pageForm); } else { - list = memberStatisticsService.getUnitAnalysisData(queryId, Integer.valueOf(currentYear)); + list = memberStatisticsService.getUnitAnalysisData(pageForm); } NutMap sumMap = NutMap.NEW(); sumMap.put("union".equals(queryType) ? "unionName" : "unitName", "合计"); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java index 5e097e30..9acb34db 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberStatisticsService.java @@ -40,7 +40,14 @@ public interface MemberStatisticsService extends BaseService { * @param currentYear 所属年度 * @return */ - List getUnionAnalysisData(String unionId, Integer currentYear); + /** + * 获取工会分析数据。 + * pageForm 中除了机构和年份外,还会带上人员分类、人员属性等附加筛选条件。 + * + * @param pageForm 统计查询参数 + * @return 工会分析结果 + */ + List getUnionAnalysisData(MemberStatisticsPageForm pageForm); /** @@ -49,7 +56,14 @@ public interface MemberStatisticsService extends BaseService { * @param currentYear 所属年度 * @return */ - List getUnitAnalysisData(String unitId, Integer currentYear); + /** + * 获取单位分析数据。 + * pageForm 中除了机构和年份外,还会带上人员分类、人员属性等附加筛选条件。 + * + * @param pageForm 统计查询参数 + * @return 单位分析结果 + */ + List getUnitAnalysisData(MemberStatisticsPageForm pageForm); /** * 导出分析数据 diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java index 82d5ab49..a6b65e1c 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberStatisticsServiceImpl.java @@ -29,6 +29,7 @@ import org.nutz.lang.util.NutMap; import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import java.util.stream.Collectors; /** * @version 1.0 @@ -212,32 +213,79 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple @Override - public List getUnionAnalysisData(String queryId, Integer currentYear) { + public List getUnionAnalysisData(MemberStatisticsPageForm pageForm) { + String queryId = pageForm.getQueryId(); + Integer currentYear = pageForm.getCurrentYear(); + String lastYearPersonFilter = getAnalysisPersonFilterSql(pageForm, "his"); + String currentPersonFilter = getAnalysisPersonFilterSql(pageForm, "u"); + boolean useCurrentUserView = ((Integer) DateUtil.thisYear()).equals(currentYear); Sql sql = Sqls.create(""" SELECT gh.id, gh.unionCode, gh.`name` as unionName, - ( SELECT count( 1 ) FROM member_history his LEFT JOIN vw_user u on u.id = his.userId WHERE his.`year` = @lastYear AND u.unionId = gh.id ) AS lastYearMemberNum, - ( SELECT count( 1 ) FROM member_apply_record WHERE changeUnionId is not null AND unionId = gh.id AND unionId != changeUnionId AND YEAR ( applyDateTime ) = @currentYear ) AS memberUnitChangeNumIn, - ( SELECT count( 1 ) FROM member_apply_record WHERE changeUnionId is not null AND changeUnionId = gh.id AND unionId != changeUnionId AND YEAR ( applyDateTime ) = @currentYear ) AS memberUnitChangeNumOut, - ( SELECT count( 1 ) FROM sys_user_history his LEFT JOIN `vw_user` u ON u.loginname = his.loginname WHERE JSON_CONTAINS(his.changeTypes, '["NEW", "RESTORE"]', '$') AND u.unionId = gh.id AND YEAR ( his.changeTime ) = @currentYear ) AS newResetMemberNum, - ( SELECT count( 1 ) FROM sys_user_history his LEFT JOIN `vw_user` u ON u.loginname = his.loginname WHERE JSON_CONTAINS(his.changeTypes, '["WITHDRAWAL"]', '$') AND u.unionId = gh.id AND YEAR ( his.changeTime ) = @currentYear ) AS reduceOtherNum, - ( SELECT count( 1 ) FROM $table where member = 1 and unionId = gh.id) as currentYearMemberNum + IFNULL(lastYear.lastYearMemberNum, 0) AS lastYearMemberNum, + IFNULL(changeIn.memberUnitChangeNumIn, 0) AS memberUnitChangeNumIn, + IFNULL(changeOut.memberUnitChangeNumOut, 0) AS memberUnitChangeNumOut, + IFNULL(newReset.newResetMemberNum, 0) AS newResetMemberNum, + IFNULL(reduceOther.reduceOtherNum, 0) AS reduceOtherNum, + IFNULL(currentMember.currentYearMemberNum, 0) AS currentYearMemberNum FROM sys_union gh + LEFT JOIN ( + SELECT his.unionId, COUNT(1) AS lastYearMemberNum + FROM member_history his + WHERE his.`year` = @lastYear $lastYearPersonFilter + GROUP BY his.unionId + ) lastYear ON lastYear.unionId = gh.id + LEFT JOIN ( + SELECT unionId, COUNT(1) AS memberUnitChangeNumIn + FROM member_apply_record + WHERE changeUnionId is not null AND unionId != changeUnionId AND YEAR(applyDateTime) = @currentYear + GROUP BY unionId + ) changeIn ON changeIn.unionId = gh.id + LEFT JOIN ( + SELECT changeUnionId AS unionId, COUNT(1) AS memberUnitChangeNumOut + FROM member_apply_record + WHERE changeUnionId is not null AND unionId != changeUnionId AND YEAR(applyDateTime) = @currentYear + GROUP BY changeUnionId + ) changeOut ON changeOut.unionId = gh.id + LEFT JOIN ( + SELECT u.unionId, COUNT(1) AS newResetMemberNum + FROM sys_user_history his + JOIN vw_user u ON u.loginname = his.loginname + WHERE JSON_CONTAINS(his.changeTypes, '["NEW", "RESTORE"]', '$') + AND YEAR(his.changeTime) = @currentYear $currentPersonFilter + GROUP BY u.unionId + ) newReset ON newReset.unionId = gh.id + LEFT JOIN ( + SELECT u.unionId, COUNT(1) AS reduceOtherNum + FROM sys_user_history his + JOIN vw_user u ON u.loginname = his.loginname + WHERE JSON_CONTAINS(his.changeTypes, '["WITHDRAWAL"]', '$') + AND YEAR(his.changeTime) = @currentYear $currentPersonFilter + GROUP BY u.unionId + ) reduceOther ON reduceOther.unionId = gh.id + LEFT JOIN ( + SELECT u.unionId, COUNT(1) AS currentYearMemberNum + FROM $table u + WHERE u.member = 1 $currentPersonFilter $currentYearFilter + GROUP BY u.unionId + ) currentMember ON currentMember.unionId = gh.id $condition """); sql.setParam("lastYear", currentYear - 1); sql.setParam("currentYear", currentYear); - sql.setVar("table", ((Integer) DateUtil.thisYear()).equals(currentYear) ? "`vw_user`" : "member_history"); + sql.setVar("table", useCurrentUserView ? "`vw_user`" : "member_history"); + sql.setVar("lastYearPersonFilter", new Static(lastYearPersonFilter)); + sql.setVar("currentPersonFilter", new Static(currentPersonFilter)); + sql.setVar("currentYearFilter", new Static(getAnalysisYearFilterSql("u", useCurrentUserView, currentYear))); Cnd cnd = Cnd.NEW(); if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { cnd.and("gh.id", "=", SecurityUtil.getUnionId()); } else { cnd.andEX("gh.id", "=", queryId); } - cnd.groupBy("gh.id, gh.unionCode, gh.name"); cnd.asc("gh.unionCode"); sql.setCondition(cnd); List list = listMap(sql); @@ -250,24 +298,73 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple @Override - public List getUnitAnalysisData(String queryId, Integer currentYear) { + public List getUnitAnalysisData(MemberStatisticsPageForm pageForm) { + String queryId = pageForm.getQueryId(); + Integer currentYear = pageForm.getCurrentYear(); + String lastYearPersonFilter = getAnalysisPersonFilterSql(pageForm, "his"); + String currentPersonFilter = getAnalysisPersonFilterSql(pageForm, "u"); + boolean useCurrentUserView = ((Integer) DateUtil.thisYear()).equals(currentYear); Sql sql = Sqls.create(""" SELECT dw.id, dw.unitcode as unitCode, dw.`name` as unitName, - ( SELECT count( 1 ) FROM member_history WHERE `year` = @lastYear AND unitId = dw.id ) AS lastYearMemberNum, - ( SELECT count( 1 ) FROM member_apply_record WHERE changeUnitId is not null AND unitId = dw.id AND unitId != changeUnitId AND YEAR ( applyDateTime ) = @currentYear ) AS memberUnitChangeNumIn, - ( SELECT count( 1 ) FROM member_apply_record WHERE changeUnitId is not null AND changeUnitId = dw.id AND unitId != changeUnitId AND YEAR ( applyDateTime ) = @currentYear ) AS memberUnitChangeNumOut, - ( SELECT count( 1 ) FROM sys_user_history his LEFT JOIN vw_user u ON u.loginname = his.loginname WHERE JSON_CONTAINS(his.changeTypes, '["NEW", "RESTORE"]', '$') AND u.unitId = dw.id AND YEAR ( his.changeTime ) = @currentYear ) AS newResetMemberNum, - ( SELECT count( 1 ) FROM sys_user_history his LEFT JOIN vw_user u ON u.loginname = his.loginname WHERE JSON_CONTAINS(his.changeTypes, '["WITHDRAWAL"]', '$') AND u.unitId = dw.id AND YEAR ( his.changeTime ) = @currentYear ) AS reduceOtherNum, - ( SELECT count( 1 ) from vw_user where member = 1 and unitId = dw.id) as currentYearMemberNum + IFNULL(lastYear.lastYearMemberNum, 0) AS lastYearMemberNum, + IFNULL(changeIn.memberUnitChangeNumIn, 0) AS memberUnitChangeNumIn, + IFNULL(changeOut.memberUnitChangeNumOut, 0) AS memberUnitChangeNumOut, + IFNULL(newReset.newResetMemberNum, 0) AS newResetMemberNum, + IFNULL(reduceOther.reduceOtherNum, 0) AS reduceOtherNum, + IFNULL(currentMember.currentYearMemberNum, 0) AS currentYearMemberNum FROM sys_unit dw + LEFT JOIN ( + SELECT his.unitId, COUNT(1) AS lastYearMemberNum + FROM member_history his + WHERE his.`year` = @lastYear $lastYearPersonFilter + GROUP BY his.unitId + ) lastYear ON lastYear.unitId = dw.id + LEFT JOIN ( + SELECT unitId, COUNT(1) AS memberUnitChangeNumIn + FROM member_apply_record + WHERE changeUnitId is not null AND unitId != changeUnitId AND YEAR(applyDateTime) = @currentYear + GROUP BY unitId + ) changeIn ON changeIn.unitId = dw.id + LEFT JOIN ( + SELECT changeUnitId AS unitId, COUNT(1) AS memberUnitChangeNumOut + FROM member_apply_record + WHERE changeUnitId is not null AND unitId != changeUnitId AND YEAR(applyDateTime) = @currentYear + GROUP BY changeUnitId + ) changeOut ON changeOut.unitId = dw.id + LEFT JOIN ( + SELECT u.unitId, COUNT(1) AS newResetMemberNum + FROM sys_user_history his + JOIN vw_user u ON u.loginname = his.loginname + WHERE JSON_CONTAINS(his.changeTypes, '["NEW", "RESTORE"]', '$') + AND YEAR(his.changeTime) = @currentYear $currentPersonFilter + GROUP BY u.unitId + ) newReset ON newReset.unitId = dw.id + LEFT JOIN ( + SELECT u.unitId, COUNT(1) AS reduceOtherNum + FROM sys_user_history his + JOIN vw_user u ON u.loginname = his.loginname + WHERE JSON_CONTAINS(his.changeTypes, '["WITHDRAWAL"]', '$') + AND YEAR(his.changeTime) = @currentYear $currentPersonFilter + GROUP BY u.unitId + ) reduceOther ON reduceOther.unitId = dw.id + LEFT JOIN ( + SELECT u.unitId, COUNT(1) AS currentYearMemberNum + FROM $table u + WHERE u.member = 1 $currentPersonFilter $currentYearFilter + GROUP BY u.unitId + ) currentMember ON currentMember.unitId = dw.id $condition """); sql.setParam("lastYear", currentYear - 1); sql.setParam("currentYear", currentYear); + sql.setVar("lastYearPersonFilter", new Static(lastYearPersonFilter)); + sql.setVar("currentPersonFilter", new Static(currentPersonFilter)); + sql.setVar("table", useCurrentUserView ? "`vw_user`" : "member_history"); + sql.setVar("currentYearFilter", new Static(getAnalysisYearFilterSql("u", useCurrentUserView, currentYear))); Cnd cnd = Cnd.NEW(); cnd.and("dw.unitLevel", "=", 3); if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { @@ -275,7 +372,6 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple } else { cnd.andEX("dw.id", "=", queryId); } - cnd.groupBy("dw.id", "dw.unitcode", "dw.name"); cnd.asc("dw.unitcode"); sql.setCondition(cnd); List list = listMap(sql); @@ -286,6 +382,61 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple return list; } + /** + * 分析统计的 SQL 由多个子查询组成,外层机构条件不会自动作用到人员子查询。 + * 这里统一拼出人员分类、人员属性的过滤片段,分别注入到各个统计子查询里, + * 保证 analysis 页面和前端标签筛选口径一致。 + * + * @param pageForm 查询参数 + * @param alias 子查询里的人员表别名 + * @return 可直接拼接到子查询 WHERE 末尾的 SQL 片段 + */ + private String getAnalysisPersonFilterSql(MemberStatisticsPageForm pageForm, String alias) { + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append(getAnalysisInSql(alias, "aidFundMemberUserType", pageForm.getAidFundMemberUserTypes())); + sqlBuilder.append(getAnalysisInSql(alias, "userAttribute", pageForm.getUserAttributes())); + return sqlBuilder.toString(); + } + + /** + * analysis 的当前数量在查历史年度时会切到 member_history, + * 这里统一补年度条件,避免历史年度把整张历史表都统计进去。 + * + * @param alias 子查询别名 + * @param useCurrentUserView 是否使用当前人员视图 + * @param currentYear 查询年度 + * @return 年度过滤 SQL 片段 + */ + private String getAnalysisYearFilterSql(String alias, boolean useCurrentUserView, Integer currentYear) { + if (useCurrentUserView) { + return ""; + } + return " AND " + alias + ".`year` = " + currentYear; + } + + /** + * 这里仅用于拼接 analysis 模块固定字段的 IN 条件, + * 会过滤空值并转义单引号,避免直接把前端原始值拼回 SQL。 + * + * @param alias 子查询别名 + * @param columnName 字段名 + * @param values 筛选值列表 + * @return IN 条件 SQL 片段 + */ + private String getAnalysisInSql(String alias, String columnName, List values) { + if (Lang.isEmpty(values)) { + return ""; + } + List validValues = values.stream().filter(Strings::isNotBlank).collect(Collectors.toList()); + if (Lang.isEmpty(validValues)) { + return ""; + } + String inValueSql = validValues.stream() + .map(value -> "'" + value.replace("'", "''") + "'") + .collect(Collectors.joining(", ")); + return " AND " + alias + "." + columnName + " IN (" + inValueSql + ")"; + } + @Override public Workbook exportAnalysisExcel(List list, String queryType) { @@ -348,6 +499,7 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple // sql.setVar("abbr", new Static("his")); } cnd.andEX("u.userAttribute", "in", pageForm.getUserAttributes()); + cnd.andEX("u.aidFundMemberUserType", "in", pageForm.getAidFundMemberUserTypes()); cnd.groupBy("un.id", "un.unionCode", "un.name"); cnd.asc("un.unionCode"); sql.setCondition(cnd); @@ -388,6 +540,7 @@ public class MemberStatisticsServiceImpl extends BaseServiceImpl imple sql.setVar("yearCnd", new Static(" AND u.`year` = %d".formatted(currentYear))); } cnd.andEX("u.userAttribute", "in", pageForm.getUserAttributes()); + cnd.andEX("u.aidFundMemberUserType", "in", pageForm.getAidFundMemberUserTypes()); cnd.and("un.unitLevel", "=", 2); cnd.groupBy("un.id", "un.unitcode", "un.name"); cnd.asc("un.unitcode"); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java index f16777e7..1ba712dc 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareListPageForm.java @@ -55,4 +55,10 @@ public class WelfareListPageForm extends PageForm { @ApiModelProperty("在职状态") private String[] userStates; + @ApiModelProperty("人员分类") + private String aidFundMemberUserType; + + @ApiModelProperty("人员属性") + private String userAttribute; + } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java index 531a417a..6d17fbdf 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java @@ -31,4 +31,10 @@ public class WelfareSelectionSituationPageForm extends PageForm { @ApiModelProperty("是否已选择") private Boolean isSelect; + + @ApiModelProperty("人员分类") + private String aidFundMemberUserType; + + @ApiModelProperty("人员属性") + private String userAttribute; } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java index 6bbce8a1..95f04c04 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java @@ -417,6 +417,8 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme cnd.andEX("t1.personType", "in", pageForm.getPersonTypes()); cnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); cnd.andEX("t1.userState", "in", pageForm.getUserStates()); + cnd.andEX("t2.aidFundMemberUserType", "=", pageForm.getAidFundMemberUserType()); + cnd.andEX("t2.userAttribute", "=", pageForm.getUserAttribute()); if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { cnd.asc("t1.welfareUnionName"); cnd.asc("t1.welfareUnitName"); diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java index d1a4d944..1c5e0a2b 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java @@ -83,6 +83,8 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl +