diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/RegistrationStatisticsController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/RegistrationStatisticsController.java new file mode 100644 index 00000000..d77b6971 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/RegistrationStatisticsController.java @@ -0,0 +1,71 @@ +package com.zdxt.enforcementcode.controller.web.supervision.report; + +import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationBo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationAnalysisVo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsAnalysisDetailVo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsAnalysisExportVo; +import com.zdxt.enforcementcode.report.IEnforcementRegistrationStatisticsService; +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.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 执法分析(独立菜单页,按企业维度聚合统计执法次数) + * + * @author zdxt + */ +@Slf4j +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/web/supervision/report/registration-statistics") +public class RegistrationStatisticsController { + + private final IEnforcementRegistrationStatisticsService statisticsService; + + /** + * 执法分析列表(分页,V2排序) + */ + @GetMapping("/list") + public TableDataInfo list(EnforcementRegistrationBo bo, PageQuery pageQuery) { + return statisticsService.list(bo, pageQuery); + } + + /** + * 执法分析详情(指定企业的执法明细聚合) + */ + @GetMapping("/detail") + public R> detail(EnforcementRegistrationBo bo) { + return R.ok(statisticsService.detail(bo)); + } + + /** + * 执法分析导出 + */ + @PostMapping("/exportList") + public void exportList(EnforcementRegistrationBo bo, HttpServletResponse response) { + try { + List list = statisticsService.exportList(bo); + ExcelUtil.exportExcel(list, "执法分析", RegistrationStatisticsAnalysisExportVo.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/vo/report/RegistrationAnalysisVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationAnalysisVo.java index 070b90d1..b0cd49c2 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationAnalysisVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationAnalysisVo.java @@ -35,6 +35,11 @@ public class RegistrationAnalysisVo implements Serializable { @ExcelProperty(value = "企业名称") private String enterpriseName; + /** + * 企业统一信用代码(用于详情查询,不导出) + */ + private String enterpriseNumber; + /** * 执法单位 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationStatisticsAnalysisDetailVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationStatisticsAnalysisDetailVo.java new file mode 100644 index 00000000..c2bd6694 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationStatisticsAnalysisDetailVo.java @@ -0,0 +1,38 @@ +package com.zdxt.enforcementcode.domain.vo.report; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 执法分析-详情弹窗VO(指定企业的执法明细聚合) + * + * @author zdxt + */ +@Data +public class RegistrationStatisticsAnalysisDetailVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 执法单位 + */ + private String bureauDeptName; + + /** + * 执法人员 + */ + private String lawEnforcer; + + /** + * 执法事项 + */ + private String lawEnforcementItemText; + + /** + * 数量(同一执法单位+人员+事项的次数) + */ + private Integer total; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationStatisticsAnalysisExportVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationStatisticsAnalysisExportVo.java new file mode 100644 index 00000000..50238744 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/report/RegistrationStatisticsAnalysisExportVo.java @@ -0,0 +1,57 @@ +package com.zdxt.enforcementcode.domain.vo.report; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 执法分析-导出Excel VO(12列,对齐旧系统导出格式) + * + * @author zdxt + */ +@Data +@ExcelIgnoreUnannotated +public class RegistrationStatisticsAnalysisExportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "区域") + private String district; + + @ExcelProperty(value = "街道") + private String street; + + @ExcelProperty(value = "企业名称") + private String enterpriseName; + + @ExcelProperty(value = "执法单位") + private String bureauDeptName; + + @ExcelProperty(value = "执法人员") + private String lawEnforcer; + + @ExcelProperty(value = "执法事项") + private String lawEnforcementItemText; + + @ExcelProperty(value = "执法时间") + private String enforcementTime; + + @ExcelProperty(value = "执法次数") + private Integer totalCount; + + @ExcelProperty(value = "2次及以下") + private String level2; + + @ExcelProperty(value = "3至4次(黄色)") + private String level34; + + @ExcelProperty(value = "5至6次(橙色)") + private String level56; + + @ExcelProperty(value = "7次及以上(红色)") + private String level7plus; +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java index 1d8eb254..bd03722e 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EnforcementRegistrationMapper.java @@ -11,6 +11,7 @@ import com.zdxt.enforcementcode.domain.vo.EnforcementRegistrationVo; import com.zdxt.enforcementcode.domain.vo.enterprise.EnforcementRegistrationListVo; import com.zdxt.enforcementcode.domain.vo.report.ChartDataVo; import com.zdxt.enforcementcode.domain.vo.report.RegistrationAnalysisVo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsAnalysisDetailVo; import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsVo; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -142,4 +143,21 @@ public interface EnforcementRegistrationMapper extends BaseMapperPlus selectReportAnalysisList(@Param("bo") EnforcementRegistrationBo bo, @Param("dataFilter") String dataFilter); + // ======================== 执法分析V2(独立菜单页,SQL JOIN排序) ======================== + + /** + * 执法分析-分页列表V2(按企业聚合统计,SQL JOIN字典表排序) + */ + @EfcodeDataFilter + IPage selectAnalysisPageV2(@Param("page") Page page, + @Param("bo") EnforcementRegistrationBo bo, + @Param("dataFilter") String dataFilter); + + /** + * 执法分析-详情(指定企业的执法明细聚合) + */ + @EfcodeDataFilter + List selectAnalysisDetail(@Param("bo") EnforcementRegistrationBo bo, + @Param("dataFilter") String dataFilter); + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/IEnforcementRegistrationStatisticsService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/IEnforcementRegistrationStatisticsService.java new file mode 100644 index 00000000..d902f756 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/IEnforcementRegistrationStatisticsService.java @@ -0,0 +1,33 @@ +package com.zdxt.enforcementcode.report; + +import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationBo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationAnalysisVo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsAnalysisDetailVo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsAnalysisExportVo; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +import java.util.List; + +/** + * 执法分析服务接口(独立菜单页,按企业维度聚合统计执法次数) + * + * @author zdxt + */ +public interface IEnforcementRegistrationStatisticsService { + + /** + * 执法分析列表(分页,V2排序) + */ + TableDataInfo list(EnforcementRegistrationBo bo, PageQuery pageQuery); + + /** + * 执法分析详情(指定企业的逐条执法记录聚合) + */ + List detail(EnforcementRegistrationBo bo); + + /** + * 执法分析导出(全量,V2排序) + */ + List exportList(EnforcementRegistrationBo bo); +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/EnforcementRegistrationStatisticsServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/EnforcementRegistrationStatisticsServiceImpl.java new file mode 100644 index 00000000..513fc1e3 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/EnforcementRegistrationStatisticsServiceImpl.java @@ -0,0 +1,73 @@ +package com.zdxt.enforcementcode.report.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationBo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationAnalysisVo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsAnalysisDetailVo; +import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsAnalysisExportVo; +import com.zdxt.enforcementcode.mapper.EnforcementRegistrationMapper; +import com.zdxt.enforcementcode.report.IEnforcementRegistrationStatisticsService; +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.List; +import java.util.stream.Collectors; + +/** + * 执法分析服务实现(独立菜单页,按企业维度聚合统计执法次数,V2排序) + * + * @author zdxt + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class EnforcementRegistrationStatisticsServiceImpl implements IEnforcementRegistrationStatisticsService { + + private final EnforcementRegistrationMapper registrationMapper; + + @Override + public TableDataInfo list(EnforcementRegistrationBo bo, PageQuery pageQuery) { + Page page = pageQuery.build(); + IPage result = registrationMapper.selectAnalysisPageV2(page, bo, null); + return TableDataInfo.build(result); + } + + @Override + public List detail(EnforcementRegistrationBo bo) { + return registrationMapper.selectAnalysisDetail(bo, null); + } + + @Override + public List exportList(EnforcementRegistrationBo bo) { + // 全量加载(不分页) + Page page = new Page<>(1, Integer.MAX_VALUE, false); + IPage result = registrationMapper.selectAnalysisPageV2(page, bo, null); + List records = result.getRecords(); + + // 转换为导出VO(含颜色分级列) + return records.stream().map(vo -> { + RegistrationStatisticsAnalysisExportVo exportVo = new RegistrationStatisticsAnalysisExportVo(); + exportVo.setDistrict(vo.getDistrict()); + exportVo.setStreet(vo.getStreet()); + exportVo.setEnterpriseName(vo.getEnterpriseName()); + exportVo.setBureauDeptName(vo.getBureauDeptName()); + exportVo.setLawEnforcer(vo.getLawEnforcer()); + exportVo.setLawEnforcementItemText(vo.getLawEnforcementItemText()); + exportVo.setEnforcementTime(vo.getEnforcementTime()); + exportVo.setTotalCount(vo.getTotalCount()); + + // 颜色分级列 + int count = vo.getTotalCount() != null ? vo.getTotalCount() : 0; + exportVo.setLevel2(count <= 2 ? String.valueOf(count) : "-"); + exportVo.setLevel34(count >= 3 && count <= 4 ? String.valueOf(count) : "-"); + exportVo.setLevel56(count >= 5 && count <= 6 ? String.valueOf(count) : "-"); + exportVo.setLevel7plus(count >= 7 ? String.valueOf(count) : "-"); + + return exportVo; + }).collect(Collectors.toList()); + } +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationReportMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationReportMapper.xml index 568062b1..0e6cb7fc 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationReportMapper.xml +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EnforcementRegistrationReportMapper.xml @@ -364,4 +364,159 @@ ORDER BY t.num DESC + + + + + + diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/registration-statistics.ts b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/registration-statistics.ts new file mode 100644 index 00000000..83c9f8d5 --- /dev/null +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/registration-statistics.ts @@ -0,0 +1,80 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; + +const BASE_URL = '/web/supervision/report/registration-statistics'; + +/** 查询参数 */ +export interface AnalysisQuery { + pageNum?: number; + pageSize?: number; + bureauDeptName?: string; + lawEnforcer?: string; + enterpriseName?: string; + lawEnforcementItemText?: string; + district?: string; + street?: string; + dateType?: number; + dateSearch?: string; + beginTime?: string; + endTime?: string; + numLeft?: string; + numRight?: string; + num?: string; + enterpriseNumber?: string; +} + +/** 执法分析行VO */ +export interface RegistrationAnalysisVo { + district: string; + street: string; + enterpriseName: string; + enterpriseNumber: string; + bureauDeptName: string; + lawEnforcer: string; + lawEnforcementItemText: string; + enforcementTime: string; + totalCount: number; + colorLevel: string; +} + +/** 详情VO */ +export interface AnalysisDetailVo { + bureauDeptName: string; + lawEnforcer: string; + lawEnforcementItemText: string; + total: number; +} + +/** + * 执法分析列表(分页) + */ +export const getAnalysisList = (params: AnalysisQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/list`, + method: 'get', + params + }); +}; + +/** + * 执法分析详情(指定企业执法明细) + */ +export const getAnalysisDetail = (params: AnalysisQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/detail`, + method: 'get', + params + }); +}; + +/** + * 执法分析导出 + */ +export const exportAnalysisList = (params: AnalysisQuery): AxiosPromise => { + return request({ + url: `${BASE_URL}/exportList`, + method: 'post', + params, + responseType: 'blob' + }); +}; diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/registration_statistics/index.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/registration_statistics/index.vue new file mode 100644 index 00000000..f04c05e8 --- /dev/null +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/registration_statistics/index.vue @@ -0,0 +1,367 @@ + + + + +