Browse Source

监督端-查询统计

dev-v1.0.2
庄锐波 3 months ago
parent
commit
80c2baeb9b
  1. 19
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java
  2. 56
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/EnforcementRegistrationReportImpl.java
  3. 38
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/EnforcementRegistrationStatisticsServiceImpl.java
  4. 12
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationReportMapper.xml
  5. 2
      zdxt-web-client/zdxt-admin-plus-ui/.env.development
  6. 2
      zdxt-web-client/zdxt-admin-plus-ui/.env.development-zrb-cust
  7. 2
      zdxt-web-client/zdxt-admin-plus-ui/.env.production
  8. BIN
      zdxt-web-client/zdxt-admin-plus-ui/src/assets/logo/logo.png

19
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java

@ -3,7 +3,6 @@ package com.zdxt.enforcementcode.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zdxt.enforcementcode.common.annotation.EfcodeDataFilter;
import com.zdxt.enforcementcode.domain.EnforcementRegistration;
import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationBo;
import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationQueryBo;
@ -86,53 +85,53 @@ public interface EnforcementRegistrationMapper extends BaseMapperPlus<Enforcemen
/**
* 报表-统计指标查询COUNT聚合
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列(bureau_dept_id OR entrust_dept_id)过滤条件传入
*/
@EfcodeDataFilter
RegistrationStatisticsVo selectReportStatistics(@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter,
@Param("checkCategoryCode") String checkCategoryCode);
/**
* 报表-分页列表查询
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入
*/
@EfcodeDataFilter
IPage<EnforcementRegistrationVo> selectReportPage(@Param("page") Page<EnforcementRegistrationVo> page,
@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);
/**
* 报表-分页列表查询V2JOIN字典表按dict_sort排序依赖district/street已回填
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入带表别名 er
*/
@EfcodeDataFilter
IPage<EnforcementRegistrationVo> selectReportPageV2(@Param("page") Page<EnforcementRegistrationVo> page,
@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);
/**
* 报表-全量列表查询用于统计/导出
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入
*/
@EfcodeDataFilter
List<EnforcementRegistration> selectReportAll(@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);
/**
* 报表-执法类别图表GROUP BY law_enforce_category
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入
*/
@EfcodeDataFilter
List<ChartDataVo> selectReportCategoryChart(@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);
/**
* 报表-部门排行图表GROUP BY bureau_dept_id前10
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入
*/
@EfcodeDataFilter
List<ChartDataVo> selectReportDeptRankChart(@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);
/**
* 报表-被检查企业次数排行图表GROUP BY enterprise_number前10
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入
*/
@EfcodeDataFilter
List<ChartDataVo> selectReportEnterpriseRankChart(@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);
@ -158,15 +157,15 @@ public interface EnforcementRegistrationMapper extends BaseMapperPlus<Enforcemen
/**
* 执法分析-导出专用返回个体记录不GROUP BY与旧系统一致
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入带表别名 er
*/
@EfcodeDataFilter
List<RegistrationAnalysisVo> selectAnalysisExportV2(@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);
/**
* 执法分析-详情指定企业的执法明细聚合
* <p>不使用 @EfcodeDataFilter 注解 Service 层手动构建双列过滤条件传入
*/
@EfcodeDataFilter
List<RegistrationStatisticsAnalysisDetailVo> selectAnalysisDetail(@Param("bo") EnforcementRegistrationBo bo,
@Param("dataFilter") String dataFilter);

56
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/EnforcementRegistrationReportImpl.java

@ -44,8 +44,9 @@ public class EnforcementRegistrationReportImpl implements IEnforcementRegistrati
public RegistrationStatisticsVo statistics(EnforcementRegistrationBo bo) {
String checkCategoryCode = StringUtils.isNotBlank(bo.getCheckCategory()) ? bo.getCheckCategory() : "01";
// 单条SQL聚合查询,数据权限由 @EfcodeDataFilter 拦截器自动处理
RegistrationStatisticsVo vo = registrationMapper.selectReportStatistics(bo, null, checkCategoryCode);
// 单条SQL聚合查询,手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id)
String dataFilter = buildDualColumnFilter("");
RegistrationStatisticsVo vo = registrationMapper.selectReportStatistics(bo, dataFilter, checkCategoryCode);
if (vo == null) {
vo = new RegistrationStatisticsVo();
}
@ -84,8 +85,10 @@ public class EnforcementRegistrationReportImpl implements IEnforcementRegistrati
@Override
public TableDataInfo<EnforcementRegistrationVo> listForV2(EnforcementRegistrationBo bo, PageQuery pageQuery) {
// V2:SQL层JOIN字典表排序 + 服务端分页(依赖district/street已回填)
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id),表别名 er
Page<EnforcementRegistrationVo> page = pageQuery.build();
IPage<EnforcementRegistrationVo> result = registrationMapper.selectReportPageV2(page, bo, null);
String dataFilter = buildDualColumnFilter("er");
IPage<EnforcementRegistrationVo> result = registrationMapper.selectReportPageV2(page, bo, dataFilter);
return TableDataInfo.build(result);
}
@ -100,7 +103,9 @@ public class EnforcementRegistrationReportImpl implements IEnforcementRegistrati
*/
private List<EnforcementRegistrationVo> loadAndSortAll(EnforcementRegistrationBo bo) {
Page<EnforcementRegistrationVo> page = new Page<>(1, Integer.MAX_VALUE, false);
IPage<EnforcementRegistrationVo> result = registrationMapper.selectReportPage(page, bo, null);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id),无表别名
String dataFilter = buildDualColumnFilter("");
IPage<EnforcementRegistrationVo> result = registrationMapper.selectReportPage(page, bo, dataFilter);
List<EnforcementRegistrationVo> records = result.getRecords();
// 从企业地址中解析区域/街道并按字典顺序排序
return enrichAndSortByDictOrder(records);
@ -238,8 +243,10 @@ public class EnforcementRegistrationReportImpl implements IEnforcementRegistrati
@Override
public List<RegistrationExportV2Vo> exportListV2(EnforcementRegistrationBo bo) {
// 使用V2排序:Sql JOIN字典表排序,全量加载
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id),表别名 er
Page<EnforcementRegistrationVo> page = new Page<>(1, Integer.MAX_VALUE, false);
IPage<EnforcementRegistrationVo> result = registrationMapper.selectReportPageV2(page, bo, null);
String dataFilter = buildDualColumnFilter("er");
IPage<EnforcementRegistrationVo> result = registrationMapper.selectReportPageV2(page, bo, dataFilter);
List<EnforcementRegistrationVo> dataList = result.getRecords();
// 字典翻译
@ -291,8 +298,9 @@ public class EnforcementRegistrationReportImpl implements IEnforcementRegistrati
@Override
public List<ChartDataVo> categoryChart(EnforcementRegistrationBo bo) {
// 数据权限由 @EfcodeDataFilter 拦截器自动处理
List<ChartDataVo> list = registrationMapper.selectReportCategoryChart(bo, null);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id)
String dataFilter = buildDualColumnFilter("");
List<ChartDataVo> list = registrationMapper.selectReportCategoryChart(bo, dataFilter);
// 字典翻译
Map<String, String> dictMap = dictTypeService.selectDictDataByType("law_enforce_category").stream()
@ -310,19 +318,22 @@ public class EnforcementRegistrationReportImpl implements IEnforcementRegistrati
@Override
public List<ChartDataVo> deptRankChart(EnforcementRegistrationBo bo) {
// 数据权限由 @EfcodeDataFilter 拦截器自动处理
return registrationMapper.selectReportDeptRankChart(bo, null);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id)
String dataFilter = buildDualColumnFilter("");
return registrationMapper.selectReportDeptRankChart(bo, dataFilter);
}
@Override
public List<ChartDataVo> enterpriseRankChart(EnforcementRegistrationBo bo) {
// 数据权限由 @EfcodeDataFilter 拦截器自动处理
return registrationMapper.selectReportEnterpriseRankChart(bo, null);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id)
String dataFilter = buildDualColumnFilter("");
return registrationMapper.selectReportEnterpriseRankChart(bo, dataFilter);
}
@Override
public TableDataInfo<RegistrationAnalysisVo> analysisRank(EnforcementRegistrationBo bo, PageQuery pageQuery) {
String dataFilter = DataFilterUtil.buildFilterSql(true, true);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id)
String dataFilter = buildDualColumnFilter("");
List<RegistrationAnalysisVo> analysisList = registrationMapper.selectReportAnalysisList(bo, dataFilter);
// 手动分页
@ -338,7 +349,26 @@ public class EnforcementRegistrationReportImpl implements IEnforcementRegistrati
@Override
public List<RegistrationAnalysisVo> analysisAll(EnforcementRegistrationBo bo) {
String dataFilter = DataFilterUtil.buildFilterSql(true, true);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id)
String dataFilter = buildDualColumnFilter("");
return registrationMapper.selectReportAnalysisList(bo, dataFilter);
}
/**
* 构建双列数据权限过滤条件bureau_dept_id执法单位 entrust_dept_id委托执法部门
* <p>任一列在权限范围内即可保留记录 "AND " 前缀可直接拼在现有 WHERE 条件后
* <p>超管或 ViewAllDataRole 返回 null不过滤
*
* @param tableAlias 表别名不带点无别名传 ""
* @return 拼接后的 "AND (...)" SQL片段超管/全数据角色返回 null
*/
private String buildDualColumnFilter(String tableAlias) {
String bureauFilter = DataFilterUtil.buildFilterSql(tableAlias, "bureau_dept_id", true, true);
if (bureauFilter == null) {
// 超管或 ViewAllDataRole,全部放行
return null;
}
String entrustFilter = DataFilterUtil.buildFilterSql(tableAlias, "entrust_dept_id", true, true);
return "AND (" + bureauFilter + " OR " + entrustFilter + ")";
}
}

38
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/EnforcementRegistrationStatisticsServiceImpl.java

@ -44,30 +44,24 @@ public class EnforcementRegistrationStatisticsServiceImpl implements IEnforcemen
Page<RegistrationAnalysisVo> page = pageQuery.build();
// 手动计算数据权限过滤条件,注入到内层子查询 WHERE(GROUP BY 之前)
// 不能使用 @EfcodeDataFilter 注解,因为拦截器会追加到外层 WHERE(GROUP BY 之后)
// 同时匹配 bureau_dept_id(执法单位)和 entrust_dept_id(委托执法部门),
// 任一列在权限范围内即可保留记录
String bureauFilter = DataFilterUtil.buildFilterSql("er", "bureau_dept_id", true, true);
String filterSql;
if (bureauFilter == null) {
// 超管或 ViewAllDataRole,全部放行
filterSql = null;
} else {
String entrustFilter = DataFilterUtil.buildFilterSql("er", "entrust_dept_id", true, true);
filterSql = "AND (" + bureauFilter + " OR " + entrustFilter + ")";
}
String filterSql = buildDualColumnFilter("er");
IPage<RegistrationAnalysisVo> result = registrationMapper.selectAnalysisPageV2(page, bo, filterSql);
return TableDataInfo.build(result);
}
@Override
public List<RegistrationStatisticsAnalysisDetailVo> detail(EnforcementRegistrationBo bo) {
return registrationMapper.selectAnalysisDetail(bo, null);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id),无表别名
String dataFilter = buildDualColumnFilter("");
return registrationMapper.selectAnalysisDetail(bo, dataFilter);
}
@Override
public void exportExcel(EnforcementRegistrationBo bo, HttpServletResponse response) {
// 1. 加载全部个体记录(SQL按enterprise_name排序)
List<RegistrationAnalysisVo> allRecords = registrationMapper.selectAnalysisExportV2(bo, null);
// 手动构建双列权限过滤(bureau_dept_id OR entrust_dept_id),表别名 er
String dataFilter = buildDualColumnFilter("er");
List<RegistrationAnalysisVo> allRecords = registrationMapper.selectAnalysisExportV2(bo, dataFilter);
// 2. 按旧系统方式分组:先按区域分组,区域顺序用字典dict_sort
// SQL已联查dict_sort但未返回,这里用LinkedHashMap保持第一次出现的顺序即可
@ -322,6 +316,24 @@ public class EnforcementRegistrationStatisticsServiceImpl implements IEnforcemen
}
}
/**
* 构建双列数据权限过滤条件bureau_dept_id执法单位 entrust_dept_id委托执法部门
* <p>任一列在权限范围内即可保留记录 "AND " 前缀可直接拼在现有 WHERE 条件后
* <p>超管或 ViewAllDataRole 返回 null不过滤
*
* @param tableAlias 表别名不带点无别名传 ""
* @return 拼接后的 "AND (...)" SQL片段超管/全数据角色返回 null
*/
private String buildDualColumnFilter(String tableAlias) {
String bureauFilter = DataFilterUtil.buildFilterSql(tableAlias, "bureau_dept_id", true, true);
if (bureauFilter == null) {
// 超管或 ViewAllDataRole,全部放行
return null;
}
String entrustFilter = DataFilterUtil.buildFilterSql(tableAlias, "entrust_dept_id", true, true);
return "AND (" + bureauFilter + " OR " + entrustFilter + ")";
}
/**
* 获取区域字典排序列表按dict_sort升序
*/

12
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationReportMapper.xml

@ -53,10 +53,12 @@
AND check_css = #{bo.checkCss}
</if>
<if test="bo.district != null and bo.district != ''">
AND district = #{bo.district}
AND (enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '区%')
OR enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '新区%'))
</if>
<if test="bo.street != null and bo.street != ''">
AND street = #{bo.street}
AND (enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '区', #{bo.street}, '%')
OR enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '新区', #{bo.street}, '%'))
</if>
<if test="bo.checkCategory != null and bo.checkCategory != ''">
AND check_category = #{bo.checkCategory}
@ -208,10 +210,12 @@
AND er.check_css = #{bo.checkCss}
</if>
<if test="bo.district != null and bo.district != ''">
AND er.district = #{bo.district}
AND (er.enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '区%')
OR er.enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '新区%'))
</if>
<if test="bo.street != null and bo.street != ''">
AND er.street = #{bo.street}
AND (er.enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '区', #{bo.street}, '%')
OR er.enterprise_address LIKE CONCAT('深圳市', SUBSTRING_INDEX(#{bo.district}, '区', 1), '新区', #{bo.street}, '%'))
</if>
<if test="bo.checkCategory != null and bo.checkCategory != ''">
AND er.check_category = #{bo.checkCategory}

2
zdxt-web-client/zdxt-admin-plus-ui/.env.development

@ -1,6 +1,6 @@
# 页面标题
VITE_APP_TITLE = zdxt-Vue-Plus多租户管理系统
VITE_APP_LOGO_TITLE = 行政执法监督码
VITE_APP_LOGO_TITLE = 执法监督码•执法监督
# 开发环境配置
VITE_APP_ENV = 'development'

2
zdxt-web-client/zdxt-admin-plus-ui/.env.development-zrb-cust

@ -1,7 +1,7 @@
VITE_APP_PROXY_TARGET = 'http://localhost:17000/sup-ep'
# 页面标题
VITE_APP_TITLE = zdxt-Vue-Plus多租户管理系统
VITE_APP_LOGO_TITLE = 行政执法监督码
VITE_APP_LOGO_TITLE = 执法监督码•执法监督
# 开发环境配置
VITE_APP_ENV = 'development'

2
zdxt-web-client/zdxt-admin-plus-ui/.env.production

@ -1,6 +1,6 @@
# 页面标题
VITE_APP_TITLE = zdxt-Vue-Plus多租户管理系统
VITE_APP_LOGO_TITLE = zdxt-Vue-Plus
VITE_APP_LOGO_TITLE = 执法监督码•执法监督
# 生产环境配置
VITE_APP_ENV = 'production'

BIN
zdxt-web-client/zdxt-admin-plus-ui/src/assets/logo/logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 594 KiB

Loading…
Cancel
Save