From 305f2191ea8ba59043d4cdd29df55670ae2aa73e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=84=E9=94=90=E6=B3=A2?= <10549902+zhuangruibo@user.noreply.gitee.com> Date: Sun, 14 Jun 2026 10:17:34 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=91=E7=9D=A3=E7=AB=AF-=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StatisticsInspectionPlanController.java | 84 +++ .../bo/EnforcementInspectionProgramBo.java | 14 + .../vo/report/InspectionPlanDetailVo.java | 37 ++ .../vo/report/InspectionPlanExportVo.java | 26 + .../vo/report/InspectionPlanGroupVo.java | 28 + .../vo/report/InspectionPlanOverviewVo.java | 22 + .../vo/report/InspectionPlanRankVo.java | 50 ++ .../mapper/ComplaintStatisticsMapper.java | 18 +- .../EnforcementInspectionProgramMapper.java | 29 ++ .../IStatisticsInspectionPlanReport.java | 39 ++ .../impl/StatisticsComplaintReportImpl.java | 59 ++- .../StatisticsInspectionPlanReportImpl.java | 200 +++++++ .../ComplaintStatisticsReportMapper.xml | 6 + ...forcementInspectionProgramReportMapper.xml | 174 +++++++ .../report/statistics-inspection-plan.ts | 141 +++++ .../index.vue | 488 +++++++++++++++++- .../statistics_inspection_plan/index.vue | 458 +++++++++++++++- 17 files changed, 1856 insertions(+), 17 deletions(-) create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/StatisticsInspectionPlanController.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanDetailVo.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanExportVo.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanGroupVo.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanOverviewVo.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanRankVo.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/IStatisticsInspectionPlanReport.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsInspectionPlanReportImpl.java create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementInspectionProgramReportMapper.xml create mode 100644 zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-inspection-plan.ts diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/StatisticsInspectionPlanController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/StatisticsInspectionPlanController.java new file mode 100644 index 00000000..d9e28f22 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/StatisticsInspectionPlanController.java @@ -0,0 +1,84 @@ +package com.zdxt.enforcementcode.controller.web.supervision.report; + +import com.zdxt.enforcementcode.domain.bo.EnforcementInspectionProgramBo; +import com.zdxt.enforcementcode.domain.vo.report.*; +import com.zdxt.enforcementcode.report.IStatisticsInspectionPlanReport; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 检查计划统计报表 Controller + * + * @author zdxt + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/web/supervision/report/statistics-inspection-plan") +public class StatisticsInspectionPlanController { + + private final IStatisticsInspectionPlanReport reportService; + + /** Tab1概览 */ + @GetMapping("/overview") + public R overview(EnforcementInspectionProgramBo bo) { + return R.ok(reportService.overview(bo)); + } + + /** Tab1主表格:按部门分组 */ + @GetMapping("/groupList") + public TableDataInfo groupList(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { + return reportService.groupList(bo, pageQuery); + } + + /** Tab1明细列表 */ + @GetMapping("/detailList") + public TableDataInfo detailList(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { + return reportService.detailList(bo, pageQuery); + } + + /** Tab2-年度排行TOP10 */ + @GetMapping("/rankByYear") + public R> rankByYear(EnforcementInspectionProgramBo bo) { + return R.ok(reportService.rankByYear(bo)); + } + + /** Tab2-季度排行TOP10 */ + @GetMapping("/rankByQuarter") + public R> rankByQuarter(EnforcementInspectionProgramBo bo) { + return R.ok(reportService.rankByQuarter(bo)); + } + + /** Tab2-月度排行TOP10 */ + @GetMapping("/rankByMonth") + public R> rankByMonth(EnforcementInspectionProgramBo bo) { + return R.ok(reportService.rankByMonth(bo)); + } + + /** Tab1导出 */ + @PostMapping("/exportGroupList") + public void exportGroupList(EnforcementInspectionProgramBo bo, HttpServletResponse response) { + try { + List list = reportService.exportGroupList(bo); + ExcelUtil.exportExcel(list, "检查计划统计", InspectionPlanExportVo.class, response); + } catch (Exception e) { + log.error("导出检查计划统计Excel异常", e); + response.reset(); + response.setContentType("application/json; charset=utf-8"); + try { + response.getWriter().write("{\"code\":500,\"msg\":\"导出失败: " + e.getMessage() + "\"}"); + } catch (Exception ignored) { + } + } + } +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementInspectionProgramBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementInspectionProgramBo.java index 28dbd773..67d3ae93 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementInspectionProgramBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementInspectionProgramBo.java @@ -134,6 +134,20 @@ public class EnforcementInspectionProgramBo extends BaseEntity { */ private String dataScopeId; + // ===== 报表查询条件字段 ===== + /** 年(报表搜索) */ + private String year; + /** 月(报表搜索) */ + private String month; + /** 自定义开始时间 */ + private String beginTime; + /** 自定义结束时间 */ + private String endTime; + /** 明细弹窗时的计划类型(year/quarter/month),避免与实体 timeType 冲突 */ + private String reportTimeType; + /** 报表搜索用季度(String类型,区别于实体的Long quarter) */ + private String reportQuarter; + /** * 文件对象 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanDetailVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanDetailVo.java new file mode 100644 index 00000000..054ea4f0 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanDetailVo.java @@ -0,0 +1,37 @@ +package com.zdxt.enforcementcode.domain.vo.report; + +import lombok.Data; + +/** + * 检查计划统计 - Tab1明细VO + */ +@Data +public class InspectionPlanDetailVo { + + /** 主键 */ + private String id; + + /** 计划名称(拼接后) */ + private String planName; + + /** 执法单位 */ + private String bureauDeptName; + + /** 执法区域 */ + private String enforcementArea; + + /** 发布时间(格式化后的字符串) */ + private String enforcementTime; + + /** 计划类型(year/quarter/month),用于Java层拼接名称 */ + private String timeType; + + /** 月份 */ + private Long mouth; + + /** 计划年度 */ + private String planYear; + + /** 季度 */ + private Long quarter; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanExportVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanExportVo.java new file mode 100644 index 00000000..530778ec --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanExportVo.java @@ -0,0 +1,26 @@ +package com.zdxt.enforcementcode.domain.vo.report; + +import cn.idev.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 检查计划统计 - Tab1导出VO + */ +@Data +public class InspectionPlanExportVo { + + @ExcelProperty("执法单位") + private String bureauDeptName; + + @ExcelProperty("总数") + private Integer total; + + @ExcelProperty("年度计划") + private Integer yearTotal; + + @ExcelProperty("季度计划") + private Integer quarterTotal; + + @ExcelProperty("月度计划") + private Integer monthTotal; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanGroupVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanGroupVo.java new file mode 100644 index 00000000..a63aa6ce --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanGroupVo.java @@ -0,0 +1,28 @@ +package com.zdxt.enforcementcode.domain.vo.report; + +import lombok.Data; + +/** + * 检查计划统计 - Tab1分组统计VO + */ +@Data +public class InspectionPlanGroupVo { + + /** 执法单位名称 */ + private String bureauDeptName; + + /** 局级部门ID */ + private String bureauDeptId; + + /** 总数 */ + private Integer total; + + /** 年度计划数 */ + private Integer yearTotal; + + /** 季度计划数 */ + private Integer quarterTotal; + + /** 月度计划数 */ + private Integer monthTotal; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanOverviewVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanOverviewVo.java new file mode 100644 index 00000000..a82b7ef5 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanOverviewVo.java @@ -0,0 +1,22 @@ +package com.zdxt.enforcementcode.domain.vo.report; + +import lombok.Data; + +/** + * 检查计划统计 - Tab1概览VO + */ +@Data +public class InspectionPlanOverviewVo { + + /** 计划总数(yearTotal + quarterTotal + monthTotal) */ + private Integer total; + + /** 年度计划数 */ + private Integer yearTotal; + + /** 季度计划数 */ + private Integer quarterTotal; + + /** 月度计划数 */ + private Integer monthTotal; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanRankVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanRankVo.java new file mode 100644 index 00000000..0e266b6d --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/InspectionPlanRankVo.java @@ -0,0 +1,50 @@ +package com.zdxt.enforcementcode.domain.vo.report; + +import lombok.Data; + +/** + * 检查计划统计 - Tab2排行VO(含各季度/月份明细) + */ +@Data +public class InspectionPlanRankVo { + + /** 执法单位名称 */ + private String bureauDeptName; + + /** 合计 */ + private Integer total; + + /** 第1季度 */ + private Integer quarterTotal1; + /** 第2季度 */ + private Integer quarterTotal2; + /** 第3季度 */ + private Integer quarterTotal3; + /** 第4季度 */ + private Integer quarterTotal4; + + /** 1月 */ + private Integer monthTotal1; + /** 2月 */ + private Integer monthTotal2; + /** 3月 */ + private Integer monthTotal3; + /** 4月 */ + private Integer monthTotal4; + /** 5月 */ + private Integer monthTotal5; + /** 6月 */ + private Integer monthTotal6; + /** 7月 */ + private Integer monthTotal7; + /** 8月 */ + private Integer monthTotal8; + /** 9月 */ + private Integer monthTotal9; + /** 10月 */ + private Integer monthTotal10; + /** 11月 */ + private Integer monthTotal11; + /** 12月 */ + private Integer monthTotal12; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/ComplaintStatisticsMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/ComplaintStatisticsMapper.java index 17787011..22552412 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/ComplaintStatisticsMapper.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/ComplaintStatisticsMapper.java @@ -18,21 +18,27 @@ import java.util.List; public interface ComplaintStatisticsMapper extends BaseMapperPlus { /** Tab1:按部门分组统计 */ - List selectComplaintGroupByDept(@Param("bo") ComplaintStatisticsBo bo); + List selectComplaintGroupByDept(@Param("bo") ComplaintStatisticsBo bo, + @Param("dataFilter") String dataFilter); /** Tab1:投诉明细列表 */ - List selectComplaintDetailList(@Param("bo") ComplaintStatisticsBo bo); + List selectComplaintDetailList(@Param("bo") ComplaintStatisticsBo bo, + @Param("dataFilter") String dataFilter); /** Tab1概览:投诉总数 */ - int selectComplaintCount(@Param("bo") ComplaintStatisticsBo bo); + int selectComplaintCount(@Param("bo") ComplaintStatisticsBo bo, + @Param("dataFilter") String dataFilter); /** Tab1概览:被投诉对象数 */ - int selectComplaintDeptCount(@Param("bo") ComplaintStatisticsBo bo); + int selectComplaintDeptCount(@Param("bo") ComplaintStatisticsBo bo, + @Param("dataFilter") String dataFilter); /** Tab2:查全量投诉列表(含enforce_type)用于Java层投诉类型分组 */ - List selectComplaintListForTypeStat(@Param("bo") ComplaintStatisticsBo bo); + List selectComplaintListForTypeStat(@Param("bo") ComplaintStatisticsBo bo, + @Param("dataFilter") String dataFilter); /** Tab2:查全量投诉列表(含enterprise_address)用于Java层区域/街道分组 */ - List selectComplaintListForAreaStat(@Param("bo") ComplaintStatisticsBo bo); + List selectComplaintListForAreaStat(@Param("bo") ComplaintStatisticsBo bo, + @Param("dataFilter") String dataFilter); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementInspectionProgramMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementInspectionProgramMapper.java index 1bb6e71d..2a6a45c5 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementInspectionProgramMapper.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementInspectionProgramMapper.java @@ -4,6 +4,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zdxt.enforcementcode.domain.EnforcementInspectionProgram; import com.zdxt.enforcementcode.domain.bo.EnforcementInspectionProgramBo; import com.zdxt.enforcementcode.domain.vo.EnforcementInspectionProgramVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanDetailVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanGroupVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanOverviewVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanRankVo; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -71,4 +75,29 @@ public interface EnforcementInspectionProgramMapper extends BaseMapperPlus selectAccessibleDeptIds(@Param("currentDeptId") String currentDeptId); + // ===== 报表查询方法 ===== + + /** Tab1: 分组统计 */ + List selectPlanGroupByDept(@Param("bo") EnforcementInspectionProgramBo bo, + @Param("dataFilter") String dataFilter); + + /** Tab1: 概览汇总 */ + InspectionPlanOverviewVo selectPlanOverview(@Param("bo") EnforcementInspectionProgramBo bo, + @Param("dataFilter") String dataFilter); + + /** Tab1: 明细列表 */ + List selectPlanDetailList(@Param("bo") EnforcementInspectionProgramBo bo, + @Param("dataFilter") String dataFilter); + + /** Tab2: 年度排行TOP10 */ + List selectPlanRankByYear(@Param("bo") EnforcementInspectionProgramBo bo, + @Param("dataFilter") String dataFilter); + + /** Tab2: 季度排行TOP10 */ + List selectPlanRankByQuarter(@Param("bo") EnforcementInspectionProgramBo bo, + @Param("dataFilter") String dataFilter); + + /** Tab2: 月度排行TOP10 */ + List selectPlanRankByMonth(@Param("bo") EnforcementInspectionProgramBo bo, + @Param("dataFilter") String dataFilter); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/IStatisticsInspectionPlanReport.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/IStatisticsInspectionPlanReport.java new file mode 100644 index 00000000..9b484291 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/IStatisticsInspectionPlanReport.java @@ -0,0 +1,39 @@ +package com.zdxt.enforcementcode.report; + +import com.zdxt.enforcementcode.domain.bo.EnforcementInspectionProgramBo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanDetailVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanExportVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanGroupVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanOverviewVo; +import com.zdxt.enforcementcode.domain.vo.report.InspectionPlanRankVo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +import java.util.List; + +/** + * 检查计划统计报表服务接口 + */ +public interface IStatisticsInspectionPlanReport { + + /** Tab1概览:计划总数 + 年度/季度/月度 */ + InspectionPlanOverviewVo overview(EnforcementInspectionProgramBo bo); + + /** Tab1主表格:按部门分组统计(含手动分页) */ + TableDataInfo groupList(EnforcementInspectionProgramBo bo, PageQuery pageQuery); + + /** Tab1明细列表:某部门某类型的计划明细(含手动分页) */ + TableDataInfo detailList(EnforcementInspectionProgramBo bo, PageQuery pageQuery); + + /** Tab2-年度排行TOP10 */ + List rankByYear(EnforcementInspectionProgramBo bo); + + /** Tab2-季度排行TOP10 */ + List rankByQuarter(EnforcementInspectionProgramBo bo); + + /** Tab2-月度排行TOP10 */ + List rankByMonth(EnforcementInspectionProgramBo bo); + + /** Tab1导出 */ + List exportGroupList(EnforcementInspectionProgramBo bo); +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsComplaintReportImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsComplaintReportImpl.java index 46e50696..d331ed1e 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsComplaintReportImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsComplaintReportImpl.java @@ -17,6 +17,11 @@ import org.dromara.system.service.ISysDeptService; import org.dromara.system.domain.vo.SysDeptVo; import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.satoken.utils.LoginHelper; + import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; @@ -29,7 +34,7 @@ import java.util.stream.Collectors; * - Tab1: 按 complaint_department_id 分组统计 + JOIN sys_dept 翻译名称 * - Tab2: Java层按 enforceType/enterprise_address 分组,字典翻译 *

- * 不使用 DataFilterUtil 进行数据过滤 + * 数据权限:非超级用户使用 sys_role_dept 过滤 complaint_department_id * * @author zdxt */ @@ -46,10 +51,11 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport public ComplaintReportOverviewVo overview(ComplaintStatisticsBo bo) { // 处理被投诉对象模糊搜索 fillDeptIdListByName(bo); + String dataFilter = buildComplaintDataFilter(); ComplaintReportOverviewVo vo = new ComplaintReportOverviewVo(); - vo.setComplaintCount(complaintStatisticsMapper.selectComplaintCount(bo)); - vo.setComplaintDeptCount(complaintStatisticsMapper.selectComplaintDeptCount(bo)); + vo.setComplaintCount(complaintStatisticsMapper.selectComplaintCount(bo, dataFilter)); + vo.setComplaintDeptCount(complaintStatisticsMapper.selectComplaintDeptCount(bo, dataFilter)); return vo; } @@ -57,9 +63,10 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport public TableDataInfo groupList(ComplaintStatisticsBo bo, PageQuery pageQuery) { // 处理被投诉对象模糊搜索 fillDeptIdListByName(bo); + String dataFilter = buildComplaintDataFilter(); // 全量查询分组数据 - List allList = complaintStatisticsMapper.selectComplaintGroupByDept(bo); + List allList = complaintStatisticsMapper.selectComplaintGroupByDept(bo, dataFilter); // 手动分页 int pageNum = pageQuery.getPageNum(); @@ -76,8 +83,9 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport @Override public TableDataInfo detailList(ComplaintStatisticsBo bo, PageQuery pageQuery) { + String dataFilter = buildComplaintDataFilter(); // 全量查询明细 - List allList = complaintStatisticsMapper.selectComplaintDetailList(bo); + List allList = complaintStatisticsMapper.selectComplaintDetailList(bo, dataFilter); // 字典翻译 enforceType -> enforceTypeText Map caseTypeDict = dictService.getAllDictByDictType("caseType"); @@ -104,7 +112,8 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport @Override public List typeStatList(ComplaintStatisticsBo bo) { // 复刻旧系统 type() 逻辑 - List list = complaintStatisticsMapper.selectComplaintListForTypeStat(bo); + String dataFilter = buildComplaintDataFilter(); + List list = complaintStatisticsMapper.selectComplaintListForTypeStat(bo, dataFilter); Map caseTypeDict = dictService.getAllDictByDictType("caseType"); int totalCount = list.size(); @@ -130,7 +139,8 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport @Override public List areaStatList(ComplaintStatisticsBo bo) { // 复刻旧系统 qyComplaintList() 逻辑 - List list = complaintStatisticsMapper.selectComplaintListForAreaStat(bo); + String dataFilter = buildComplaintDataFilter(); + List list = complaintStatisticsMapper.selectComplaintListForAreaStat(bo, dataFilter); int totalCount = list.size(); // 获取区域字典 address_type @@ -183,7 +193,8 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport String areaPrefix = buildAreaPrefix(areaLabel); // 获取全量投诉数据(含地址) - List allList = complaintStatisticsMapper.selectComplaintListForAreaStat(bo); + String dataFilter = buildComplaintDataFilter(); + List allList = complaintStatisticsMapper.selectComplaintListForAreaStat(bo, dataFilter); // 先过滤出该区的记录 List areaList = allList.stream() @@ -230,7 +241,8 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport @Override public List exportGroupList(ComplaintStatisticsBo bo) { fillDeptIdListByName(bo); - List allList = complaintStatisticsMapper.selectComplaintGroupByDept(bo); + String dataFilter = buildComplaintDataFilter(); + List allList = complaintStatisticsMapper.selectComplaintGroupByDept(bo, dataFilter); return allList.stream().map(item -> { ComplaintReportExportVo exportVo = new ComplaintReportExportVo(); exportVo.setComplaintDepartment(item.getComplaintDepartment()); @@ -260,6 +272,35 @@ public class StatisticsComplaintReportImpl implements IStatisticsComplaintReport // ===== 私有方法 ===== + /** + * 构建投诉数据权限过滤SQL。 + *

超级管理员不过滤,非超级用户按 sys_role_dept 过滤 complaint_department_id。 + * + * @return "AND (...)" SQL片段 或 空串 + */ + private String buildComplaintDataFilter() { + if (LoginHelper.isSuperAdmin()) { + return ""; + } + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser == null || CollUtil.isEmpty(loginUser.getRoles())) { + // 无角色用户,返回不可能条件 + return "AND 1 = 0"; + } + List roles = loginUser.getRoles(); + StringBuilder sb = new StringBuilder("AND ("); + for (int i = 0; i < roles.size(); i++) { + if (i > 0) { + sb.append(" OR "); + } + sb.append("complaint_department_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = ") + .append(roles.get(i).getRoleId()) + .append(" )"); + } + sb.append(")"); + return sb.toString(); + } + /** * 处理被投诉对象模糊搜索:通过 complaintDepartment 查询 sys_dept 获取 deptIdList */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsInspectionPlanReportImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsInspectionPlanReportImpl.java new file mode 100644 index 00000000..8f6ce40a --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/StatisticsInspectionPlanReportImpl.java @@ -0,0 +1,200 @@ +package com.zdxt.enforcementcode.report.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zdxt.enforcementcode.common.util.DataFilterUtil; +import com.zdxt.enforcementcode.domain.bo.EnforcementInspectionProgramBo; +import com.zdxt.enforcementcode.domain.vo.report.*; +import com.zdxt.enforcementcode.mapper.EnforcementInspectionProgramMapper; +import com.zdxt.enforcementcode.report.IStatisticsInspectionPlanReport; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 检查计划统计报表 Service实现 + *

+ * 复刻旧系统 EnforcementInspectionProgramServiceImpl 逻辑: + * - Tab1(统计+概览+明细):数据权限 + 已发布(is_publish=1)对所有人可见 + * - Tab2(排行TOP10):仅数据权限过滤(不含is_publish扩展) + * + * @author zdxt + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class StatisticsInspectionPlanReportImpl implements IStatisticsInspectionPlanReport { + + private final EnforcementInspectionProgramMapper programMapper; + + @Override + public InspectionPlanOverviewVo overview(EnforcementInspectionProgramBo bo) { + String dataFilter = buildDataFilterWithPublish(); + InspectionPlanOverviewVo vo = programMapper.selectPlanOverview(bo, dataFilter); + if (vo == null) { + vo = new InspectionPlanOverviewVo(); + vo.setYearTotal(0); + vo.setQuarterTotal(0); + vo.setMonthTotal(0); + } + // total = yearTotal + quarterTotal + monthTotal + vo.setTotal(vo.getYearTotal() + vo.getQuarterTotal() + vo.getMonthTotal()); + return vo; + } + + @Override + public TableDataInfo groupList(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { + String dataFilter = buildDataFilterWithPublish(); + // 全量查询 + List allList = programMapper.selectPlanGroupByDept(bo, dataFilter); + + // 手动分页 + int pageNum = pageQuery.getPageNum(); + int pageSize = pageQuery.getPageSize(); + int total = allList.size(); + int fromIndex = Math.min((pageNum - 1) * pageSize, total); + int toIndex = Math.min(fromIndex + pageSize, total); + List pageRecords = allList.subList(fromIndex, toIndex); + + Page page = new Page<>(pageNum, pageSize, total); + page.setRecords(pageRecords); + return TableDataInfo.build(page); + } + + @Override + public TableDataInfo detailList(EnforcementInspectionProgramBo bo, PageQuery pageQuery) { + String dataFilter = buildDataFilterWithPublish(); + // 全量查询 + List allList = programMapper.selectPlanDetailList(bo, dataFilter); + + // Java层拼接计划名称(复刻旧系统格式:局名+年+类型描述+计划名称) + for (InspectionPlanDetailVo detail : allList) { + detail.setPlanName(buildPlanDisplayName(detail)); + } + + // 手动分页 + int pageNum = pageQuery.getPageNum(); + int pageSize = pageQuery.getPageSize(); + int total = allList.size(); + int fromIndex = Math.min((pageNum - 1) * pageSize, total); + int toIndex = Math.min(fromIndex + pageSize, total); + List pageRecords = allList.subList(fromIndex, toIndex); + + Page page = new Page<>(pageNum, pageSize, total); + page.setRecords(pageRecords); + return TableDataInfo.build(page); + } + + @Override + public List rankByYear(EnforcementInspectionProgramBo bo) { + // Tab2排行不加 is_publish 特殊逻辑(对齐旧系统行为) + String dataFilter = buildDataFilter(); + return programMapper.selectPlanRankByYear(bo, dataFilter); + } + + @Override + public List rankByQuarter(EnforcementInspectionProgramBo bo) { + String dataFilter = buildDataFilter(); + return programMapper.selectPlanRankByQuarter(bo, dataFilter); + } + + @Override + public List rankByMonth(EnforcementInspectionProgramBo bo) { + String dataFilter = buildDataFilter(); + return programMapper.selectPlanRankByMonth(bo, dataFilter); + } + + @Override + public List exportGroupList(EnforcementInspectionProgramBo bo) { + String dataFilter = buildDataFilterWithPublish(); + List allList = programMapper.selectPlanGroupByDept(bo, dataFilter); + + return allList.stream().map(g -> { + InspectionPlanExportVo export = new InspectionPlanExportVo(); + export.setBureauDeptName(g.getBureauDeptName()); + export.setTotal(g.getTotal()); + export.setYearTotal(g.getYearTotal()); + export.setQuarterTotal(g.getQuarterTotal()); + export.setMonthTotal(g.getMonthTotal()); + return export; + }).collect(Collectors.toList()); + } + + // ===== 私有方法 ===== + + /** + * 构建数据权限过滤条件(含 is_publish=1 扩展)。 + *

用于Tab1(统计+概览+明细),已发布计划对所有人可见。 + *

超管/全数据角色返回空串(不过滤)。 + * + * @return "AND (...)" SQL片段 或 空串 + */ + private String buildDataFilterWithPublish() { + String filter = DataFilterUtil.buildFilterSql("p", "enforcement_department_id", true, true); + if (filter == null) { + // 超管/全数据角色 → 不过滤 + return ""; + } + // 非超管:将原始过滤条件扩展为 (原条件 OR is_publish=1) + // filter 格式类似: (p.enforcement_department_id IN (SELECT ...)) + return "AND (" + filter + " OR p.is_publish = 1)"; + } + + /** + * 构建数据权限过滤条件(不含 is_publish 扩展)。 + *

用于Tab2排行,仅展示权限范围内的数据。 + * + * @return "AND ..." SQL片段 或 空串 + */ + private String buildDataFilter() { + String filter = DataFilterUtil.buildFilterSql("p", "enforcement_department_id", true, true); + if (filter == null) { + return ""; + } + return "AND " + filter; + } + + /** + * 拼接计划显示名称(复刻旧系统格式)。 + *

格式:局名+年+季度/月份+计划名称 + */ + private String buildPlanDisplayName(InspectionPlanDetailVo detail) { + StringBuilder sb = new StringBuilder(); + if (StrUtil.isNotBlank(detail.getBureauDeptName())) { + sb.append(detail.getBureauDeptName()); + } + if (StrUtil.isNotBlank(detail.getPlanYear())) { + sb.append(detail.getPlanYear()).append("年"); + } + String timeType = detail.getTimeType(); + if ("quarter".equals(timeType) && detail.getQuarter() != null) { + sb.append(getQuarterText(detail.getQuarter())); + } else if ("month".equals(timeType) && detail.getMouth() != null) { + sb.append(detail.getMouth()).append("月"); + } + if (StrUtil.isNotBlank(detail.getPlanName())) { + sb.append(detail.getPlanName()); + } + return sb.toString(); + } + + /** + * 季度数字转文本 + */ + private String getQuarterText(Long quarter) { + if (quarter == null) return ""; + switch (quarter.intValue()) { + case 1: return "第一季度"; + case 2: return "第二季度"; + case 3: return "第三季度"; + case 4: return "第四季度"; + default: return ""; + } + } +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/ComplaintStatisticsReportMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/ComplaintStatisticsReportMapper.xml index 8dfd29ae..fd02b3fb 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/ComplaintStatisticsReportMapper.xml +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/ComplaintStatisticsReportMapper.xml @@ -46,6 +46,7 @@ AND c.enterprise_address LIKE CONCAT('%', #{bo.enterpriseAddress}, '%') + ${dataFilter} GROUP BY c.complaint_department_id ORDER BY total DESC @@ -69,6 +70,7 @@ AND c.enterprise_address LIKE CONCAT('%', #{bo.enterpriseAddress}, '%') + ${dataFilter} ORDER BY c.complaint_time DESC @@ -91,6 +93,7 @@ AND enterprise_address LIKE CONCAT('%', #{bo.enterpriseAddress}, '%') + ${dataFilter} @@ -112,6 +115,7 @@ AND enterprise_address LIKE CONCAT('%', #{bo.enterpriseAddress}, '%') + ${dataFilter} @@ -122,6 +126,7 @@ AND complaint_department IS NOT NULL AND enforce_type IS NOT NULL + ${dataFilter} @@ -137,6 +142,7 @@ AND c.complaint_department IS NOT NULL AND c.enforce_type IS NOT NULL + ${dataFilter} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementInspectionProgramReportMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementInspectionProgramReportMapper.xml new file mode 100644 index 00000000..82354cb7 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/report/EnforcementInspectionProgramReportMapper.xml @@ -0,0 +1,174 @@ + + + + + + + AND p.bureau_dept_id IS NOT NULL + AND p.time_type IS NOT NULL AND p.time_type != '0' + AND (p.plan_year IS NOT NULL OR p.quarter IS NOT NULL OR p.mouth IS NOT NULL) + + + + + + AND YEAR(p.enforcement_time) = #{bo.year} + + + AND YEAR(p.enforcement_time) = #{bo.year} AND QUARTER(p.enforcement_time) = #{bo.reportQuarter} + + + AND YEAR(p.enforcement_time) = #{bo.year} AND MONTH(p.enforcement_time) = #{bo.month} + + + AND DATE_FORMAT(p.enforcement_time,'%Y-%m-%d') >= STR_TO_DATE(#{bo.beginTime},'%Y-%m-%d') + + + AND DATE_FORMAT(p.enforcement_time,'%Y-%m-%d') <= STR_TO_DATE(#{bo.endTime},'%Y-%m-%d') + + + + + + + AND p.bureau_dept_name LIKE CONCAT('%', #{bo.bureauDeptName}, '%') + + + + + + ${dataFilter} + + + + + + + + + + + + + + + + + + + + + diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-inspection-plan.ts b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-inspection-plan.ts new file mode 100644 index 00000000..aa12ae3b --- /dev/null +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-inspection-plan.ts @@ -0,0 +1,141 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; + +const BASE_URL = '/web/supervision/report/statistics-inspection-plan'; + +/** 查询参数 */ +export interface InspectionPlanQuery { + pageNum?: number; + pageSize?: number; + /** 执法单位(模糊搜索) */ + bureauDeptName?: string; + /** 局级部门ID(明细查询用) */ + bureauDeptId?: string; + /** 时段类型:year/quarter/month/day */ + dateSearch?: string; + /** 年 */ + year?: string; + /** 报表搜索用季度 */ + reportQuarter?: string; + /** 月 */ + month?: string; + /** 自定义开始时间 */ + beginTime?: string; + /** 自定义结束时间 */ + endTime?: string; + /** 明细弹窗时的计划类型(year/quarter/month) */ + reportTimeType?: string; +} + +/** 概览VO */ +export interface InspectionPlanOverviewVo { + total: number; + yearTotal: number; + quarterTotal: number; + monthTotal: number; +} + +/** 分组统计VO */ +export interface InspectionPlanGroupVo { + bureauDeptName: string; + bureauDeptId: string; + total: number; + yearTotal: number; + quarterTotal: number; + monthTotal: number; +} + +/** 明细VO */ +export interface InspectionPlanDetailVo { + id: string; + planName: string; + bureauDeptName: string; + enforcementArea: string; + enforcementTime: string; +} + +/** 排行VO */ +export interface InspectionPlanRankVo { + bureauDeptName: string; + total: number; + quarterTotal1?: number; + quarterTotal2?: number; + quarterTotal3?: number; + quarterTotal4?: number; + monthTotal1?: number; + monthTotal2?: number; + monthTotal3?: number; + monthTotal4?: number; + monthTotal5?: number; + monthTotal6?: number; + monthTotal7?: number; + monthTotal8?: number; + monthTotal9?: number; + monthTotal10?: number; + monthTotal11?: number; + monthTotal12?: number; +} + +/** Tab1概览 */ +export const getOverview = (params: InspectionPlanQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/overview`, + method: 'get', + params + }); +}; + +/** Tab1分组列表 */ +export const getGroupList = (params: InspectionPlanQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/groupList`, + method: 'get', + params + }); +}; + +/** Tab1明细列表 */ +export const getDetailList = (params: InspectionPlanQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/detailList`, + method: 'get', + params + }); +}; + +/** Tab2-年度排行TOP10 */ +export const getRankByYear = (params: InspectionPlanQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/rankByYear`, + method: 'get', + params + }); +}; + +/** Tab2-季度排行TOP10 */ +export const getRankByQuarter = (params: InspectionPlanQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/rankByQuarter`, + method: 'get', + params + }); +}; + +/** Tab2-月度排行TOP10 */ +export const getRankByMonth = (params: InspectionPlanQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/rankByMonth`, + method: 'get', + params + }); +}; + +/** Tab1导出 */ +export const exportGroupList = (data: InspectionPlanQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/exportGroupList`, + method: 'post', + data, + responseType: 'blob' + }); +}; diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_enforcement_complaint/index.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_enforcement_complaint/index.vue index 63cf316b..86a43fec 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_enforcement_complaint/index.vue +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_enforcement_complaint/index.vue @@ -1,11 +1,497 @@ diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_inspection_plan/index.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_inspection_plan/index.vue index 63cf316b..6507b75c 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_inspection_plan/index.vue +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_inspection_plan/index.vue @@ -1,11 +1,467 @@