From f5a55cc6dc0be592c790a4a1857528309ec4dba6 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: Tue, 26 May 2026 12:55:37 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../013-计划任务表设计.sql | 8 +- .../enforcementcode/domain/EfcodeCpPlan.java | 5 + .../domain/bo/EfcodeCpPlanBo.java | 5 + .../domain/vo/EfcodeCpPlanVo.java | 6 + .../quartz/job/CpPlanAutoMatchJob.java | 11 +- .../service/IEfcodeCpPlanService.java | 9 +- .../service/impl/EfcodeCpPlanServiceImpl.java | 170 ++++++++- .../service/impl/EfcodeCpTaskServiceImpl.java | 12 + .../rest/test/cp/AutoMatchReserveTest.java | 354 ++++++++++++++++++ 9 files changed, 571 insertions(+), 9 deletions(-) create mode 100644 zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AutoMatchReserveTest.java diff --git a/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql b/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql index a1b299a8..ead67c23 100644 --- a/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql +++ b/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql @@ -25,6 +25,8 @@ CREATE TABLE `efcode_cp_plan` `union_bureau_dept_names` varchar(500) DEFAULT NULL COMMENT '联合执法单位(多个逗号分隔)', `reserve_status` tinyint NOT NULL DEFAULT 0 COMMENT '预约状态:0=草稿,1=待预约(未发起联合),2=预约中,3=预约完成,4=重新预约中,5=待预约(还有位置可以加入)', + `task_id` varchar(50) NULL DEFAULT '' COMMENT '任务id:空串表示还没生成任务', + `system_reserved` tinyint NOT NULL DEFAULT 0 COMMENT '是否已经经过系统推荐预约:1=是,0=否', `manual_reserved` tinyint NOT NULL DEFAULT 0 COMMENT '是否已经经过手动预约:1=是,0=否', `bureau_dept_id` varchar(50) NOT NULL COMMENT '执法单位ID', @@ -181,14 +183,14 @@ CREATE TABLE `efcode_cp_setting` CREATE TABLE `efcode_cp_log` ( - `id` varchar(50) NOT NULL COMMENT '主键ID' PRIMARY KEY, + `id` varchar(50) NOT NULL COMMENT '主键ID' PRIMARY KEY, `record_id` varchar(50) NULL COMMENT '关联记录', `table_name` varchar(50) NULL COMMENT '关联表', `log_type` varchar(50) NULL COMMENT '日志类型', `op_slog` varchar(2000) NULL COMMENT '短日志', `op_llog` text NULL COMMENT '长日志', - `op_user_id` varchar(50) NOT NULL COMMENT '操作人ID', - `op_user_name` varchar(50) NOT NULL COMMENT '操作人姓名', + `op_user_id` varchar(50) NOT NULL COMMENT '操作人ID', + `op_user_name` varchar(50) NOT NULL COMMENT '操作人姓名', `remark` varchar(500) NULL COMMENT '备注', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java index cbeab286..15f319a4 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java @@ -114,6 +114,11 @@ public class EfcodeCpPlan extends BaseEntity { */ private Long reserveStatus; + /** + * 任务id:空串表示还没生成任务 + */ + private String taskId; + /** * 是否已经经过系统推荐预约:1=是,0=否 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java index 6b0774ac..f6aa8d53 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java @@ -128,6 +128,11 @@ public class EfcodeCpPlanBo extends BaseEntity { @NotNull(message = "预约状态:0=草稿,1=待预约,2=预约中,3=预约完成不能为空", groups = { AddGroup.class, EditGroup.class }) private Long reserveStatus; + /** + * 任务id:空串表示还没生成任务 + */ + private String taskId; + /** * 是否已经经过系统推荐预约:1=是,0=否 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java index a3c916ca..3d0e8bb3 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java @@ -145,6 +145,12 @@ public class EfcodeCpPlanVo implements Serializable { @ExcelProperty(value = "预约状态:0=草稿,1=待预约,2=预约中,3=预约完成") private Long reserveStatus; + /** + * 任务id:空串表示还没生成任务 + */ + @ExcelProperty(value = "任务ID") + private String taskId; + /** * 是否已经经过系统推荐预约:1=是,0=否 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CpPlanAutoMatchJob.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CpPlanAutoMatchJob.java index c2bc3f99..f5c7d217 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CpPlanAutoMatchJob.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CpPlanAutoMatchJob.java @@ -20,9 +20,18 @@ public class CpPlanAutoMatchJob { /** * 任务执行入口(public,供 JobInvokeUtil 通过反射调用) + *

默认非强制模式:受 CP_SETTING_AUTO_MATCH_START 日期控制

*/ public void execute() { log.info("[CpPlanAutoMatchJob] 定时任务触发:计划自动匹配预约"); - cpPlanService.autoMatchReserve(); + cpPlanService.autoMatchReserve(false, true, true); + } + + /** + * 强制执行入口(忽略日期校验,立即执行匹配) + */ + public void executeForce() { + log.info("[CpPlanAutoMatchJob] 强制触发:计划自动匹配预约"); + cpPlanService.autoMatchReserve(true, true, true); } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpPlanService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpPlanService.java index 7aae9304..a34c3680 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpPlanService.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpPlanService.java @@ -7,6 +7,8 @@ import org.dromara.common.mybatis.core.page.PageQuery; import java.util.Collection; import java.util.List; +import java.util.Map; +import com.zdxt.enforcementcode.domain.EfcodeCpReserve; /** * 行政执法检查计划-计划Service接口 @@ -79,6 +81,11 @@ public interface IEfcodeCpPlanService { /** * 计划自动匹配预约(定时任务调用) *

扫描待预约状态的计划,按规则自动匹配并生成预约记录

+ * + * @param forceMatch 是否强制匹配(忽略 CP_SETTING_AUTO_MATCH_START 日期校验) + * @param updatePlan 是否更新计划记录(system_reserved、reserve_status) + * @param insertReserve 是否将预约记录插入数据库;为false时仅计算匹配结果不落库 + * @return 按 planGroupId 分组的预约记录列表(key=planGroupId, value=该组预约记录) */ - void autoMatchReserve(); + Map> autoMatchReserve(boolean forceMatch, boolean updatePlan, boolean insertReserve); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java index 054a418d..d2458359 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java @@ -19,14 +19,24 @@ import com.zdxt.enforcementcode.mapper.EfcodeCpPlanMapper; import com.zdxt.enforcementcode.mapper.EfcodeCpPlanUsersMapper; import com.zdxt.enforcementcode.service.IEfcodeCpPlanService; +import java.time.LocalDate; +import java.time.ZoneId; import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.Collection; import java.util.stream.Collectors; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.satoken.utils.LoginHelper; +import com.zdxt.enforcementcode.domain.EfcodeCpReserve; +import com.zdxt.enforcementcode.domain.EfcodeCpSetting; +import com.zdxt.enforcementcode.mapper.EfcodeCpReserveMapper; +import com.zdxt.enforcementcode.mapper.EfcodeCpSettingMapper; /** * 行政执法检查计划-计划Service业务层处理 @@ -41,6 +51,8 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { private final EfcodeCpPlanMapper baseMapper; private final EfcodeCpPlanUsersMapper efcodeCpPlanUsersMapper; + private final EfcodeCpReserveMapper efcodeCpReserveMapper; + private final EfcodeCpSettingMapper efcodeCpSettingMapper; /** * 查询行政执法检查计划-计划 @@ -348,11 +360,161 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { /** * 计划自动匹配预约(定时任务调用) *

扫描待预约状态的计划,按规则自动匹配并生成预约记录

+ * + * @param forceMatch 是否强制匹配(忽略 CP_SETTING_AUTO_MATCH_START 日期校验) + * @param updatePlan 是否更新计划记录(system_reserved、reserve_status) + * @param insertReserve 是否将预约记录插入数据库;为false时仅计算匹配结果不落库 + * @return 按 planGroupId 分组的预约记录列表 */ + @Transactional(rollbackFor = Exception.class) @Override - public void autoMatchReserve() { - log.info("[CpPlan] 开始执行计划自动匹配预约..."); - // TODO 后续实现:扫描待预约计划 → 按企业+日期+时段匹配 → 自动生成预约记录 - log.info("[CpPlan] 计划自动匹配预约执行完毕"); + public Map> autoMatchReserve(boolean forceMatch, boolean updatePlan, boolean insertReserve) { + log.info("[CpPlan] 开始执行计划自动匹配预约, forceMatch={}, updatePlan={}, insertReserve={}", forceMatch, updatePlan, insertReserve); + Map> resultMap = new HashMap<>(); + + // 1. 日期校验:如果不是强制匹配,则判断当前天数是否等于 CP_SETTING_AUTO_MATCH_START + if (!forceMatch) { + String autoMatchStartDay = getSettingValue("CP_SETTING_AUTO_MATCH_START"); + int today = LocalDate.now().getDayOfMonth(); + if (StringUtils.isNotBlank(autoMatchStartDay)) { + int settingDay = Integer.parseInt(autoMatchStartDay.trim()); + if (today != settingDay) { + log.info("[CpPlan] 当前日期{}号,不等于设定的自动匹配日期{}号,跳过执行", today, settingDay); + return resultMap; + } + } + } + + // 2. 获取最大联合单位数量 + int maxUnionUnit = 3; // 默认值 + String maxUnionStr = getSettingValue("CP_MAX_UNION_UNIT"); + if (StringUtils.isNotBlank(maxUnionStr)) { + maxUnionUnit = Integer.parseInt(maxUnionStr.trim()); + } + + // 3. 查询待匹配的计划:plan_date > 当前时间 且 system_reserved=0, reserve_status=1, is_public=1, is_union=1 + Date now = new Date(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.gt(EfcodeCpPlan::getPlanDate, now); + lqw.eq(EfcodeCpPlan::getSystemReserved, 0L); + lqw.eq(EfcodeCpPlan::getReserveStatus, 1L); + lqw.eq(EfcodeCpPlan::getIsPublic, 1L); + lqw.eq(EfcodeCpPlan::getIsUnion, 1L); + lqw.eq(EfcodeCpPlan::getIsDelete, 0L); + lqw.orderByAsc(EfcodeCpPlan::getPlanDate); + List pendingPlans = baseMapper.selectList(lqw); + + if (pendingPlans.isEmpty()) { + log.info("[CpPlan] 没有找到待匹配的计划记录,执行结束"); + return resultMap; + } + log.info("[CpPlan] 共查询到{}条待匹配计划", pendingPlans.size()); + + // 4. 已处理过的企业信用代码集合(同一轮中已匹配过的不再重复处理) + Set processedEnterprises = new HashSet<>(); + int matchedCount = 0; + + for (EfcodeCpPlan plan : pendingPlans) { + String enterpriseNumber = plan.getEnterpriseNumber(); + if (StringUtils.isBlank(enterpriseNumber)) { + continue; + } + // 跳过本轮已处理的企业 + if (processedEnterprises.contains(enterpriseNumber)) { + continue; + } + + // 5. 查找一周内同企业、不同执法单位的其他待匹配计划 + LocalDate planLocalDate = plan.getPlanDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + Date weekStart = Date.from(planLocalDate.minusDays(3).atStartOfDay(ZoneId.systemDefault()).toInstant()); + Date weekEnd = Date.from(planLocalDate.plusDays(4).atStartOfDay(ZoneId.systemDefault()).toInstant()); + + LambdaQueryWrapper weekLqw = Wrappers.lambdaQuery(); + weekLqw.ge(EfcodeCpPlan::getPlanDate, weekStart); + weekLqw.le(EfcodeCpPlan::getPlanDate, weekEnd); + weekLqw.eq(EfcodeCpPlan::getEnterpriseNumber, enterpriseNumber); + weekLqw.eq(EfcodeCpPlan::getSystemReserved, 0L); + weekLqw.eq(EfcodeCpPlan::getReserveStatus, 1L); + weekLqw.eq(EfcodeCpPlan::getIsPublic, 1L); + weekLqw.eq(EfcodeCpPlan::getIsUnion, 1L); + weekLqw.eq(EfcodeCpPlan::getIsDelete, 0L); + weekLqw.orderByAsc(EfcodeCpPlan::getPlanDate); + List samePlans = baseMapper.selectList(weekLqw); + + // 6. 按不同执法单位去重,取不同 bureau_dept_id 的计划 + List distinctUnitPlans = new ArrayList<>(); + Set seenBureauDeptIds = new HashSet<>(); + for (EfcodeCpPlan sp : samePlans) { + if (!seenBureauDeptIds.contains(sp.getBureauDeptId())) { + seenBureauDeptIds.add(sp.getBureauDeptId()); + distinctUnitPlans.add(sp); + } + // 限制最大联合数量 + if (distinctUnitPlans.size() >= maxUnionUnit) { + break; + } + } + + // 7. 如果只有一个单位的计划,说明没有可联合的,跳过 + if (distinctUnitPlans.size() <= 1) { + log.debug("[CpPlan] 企业[{}]一周内只有1个单位的计划,跳过", enterpriseNumber); + continue; + } + + // 8. 生成预约记录 - 使用同一个 plan_group_id + String planGroupId = "Temp"+"_"+UUID.randomUUID().toString().replace("-", ""); + Date reserveTime = new Date(); + List groupReserves = new ArrayList<>(); + + for (int i = 0; i < distinctUnitPlans.size(); i++) { + EfcodeCpPlan matchedPlan = distinctUnitPlans.get(i); + EfcodeCpReserve reserve = new EfcodeCpReserve(); + reserve.setPlanId(matchedPlan.getId()); + reserve.setPlanGroupId(planGroupId); + reserve.setReserveTime(reserveTime); + reserve.setOpStatus(3L); // 待确认 + reserve.setOpOrder((long) (i + 1)); + reserve.setOpMessage(""); + reserve.setOpSetDate(matchedPlan.getPlanDate()); + reserve.setOpSetTime(matchedPlan.getPlanTime()); + reserve.setResFrom(1L); // 系统匹配 + + if (insertReserve) { + efcodeCpReserveMapper.insert(reserve); + } + groupReserves.add(reserve); + + // 9. 更新计划: system_reserved=1, reserve_status=2 + if (updatePlan) { + EfcodeCpPlan planUpdate = new EfcodeCpPlan(); + planUpdate.setId(matchedPlan.getId()); + planUpdate.setSystemReserved(1L); + planUpdate.setReserveStatus(2L); + baseMapper.updateById(planUpdate); + } + } + + resultMap.put(planGroupId, groupReserves); + + // 标记该企业已处理 + processedEnterprises.add(enterpriseNumber); + matchedCount++; + log.info("[CpPlan] 企业[{}]匹配成功,联合{}个单位,planGroupId={}", + enterpriseNumber, distinctUnitPlans.size(), planGroupId); + } + + log.info("[CpPlan] 计划自动匹配预约执行完毕,共匹配{}组联合预约", matchedCount); + return resultMap; + } + + /** + * 获取 efcode_cp_setting 配置值 + * + * @param settingId 设置ID + * @return 设置值 + */ + private String getSettingValue(String settingId) { + EfcodeCpSetting setting = efcodeCpSettingMapper.selectById(settingId); + return setting != null ? setting.getSettingValue() : null; } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java index fd620697..fd5c5d91 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java @@ -116,6 +116,18 @@ public class EfcodeCpTaskServiceImpl implements IEfcodeCpTaskService { //TODO 做一些数据校验,如唯一约束 } + /** + * 验证是否符合生成任务的条件 + *

校验预约分组内所有记录是否满足生成执法任务的前置条件

+ * + * @param planGroupId 计划分组ID + * @return true=符合生成条件, false=不符合 + */ + public boolean checkCanGenerateTask(String planGroupId) { + // TODO 后续实现:校验分组内预约状态、时间窗口、人员配置等前置条件 + return true; + } + /** * 校验并批量删除行政执法检查计划-任务信息 * diff --git a/zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AutoMatchReserveTest.java b/zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AutoMatchReserveTest.java new file mode 100644 index 00000000..bab27b94 --- /dev/null +++ b/zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AutoMatchReserveTest.java @@ -0,0 +1,354 @@ +package com.zdxt.rest.test.cp; + +import cn.dev33.satoken.context.mock.SaTokenContextMockUtil; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.zdxt.enforcementcode.domain.EfcodeCpPlan; +import com.zdxt.enforcementcode.domain.EfcodeCpReserve; +import com.zdxt.enforcementcode.mapper.EfcodeCpPlanMapper; +import com.zdxt.enforcementcode.mapper.EfcodeCpReserveMapper; +import com.zdxt.enforcementcode.service.IEfcodeCpPlanService; +import org.dromara.ZdxtAdminApplication; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 计划自动匹配预约 autoMatchReserve 方法测试 + *

+ * 测试场景: + * 1. 强制模式下执行自动匹配(绕过日期校验) + * 2. 验证匹配结果:同企业不同单位的计划被联合 + * 3. 验证计划状态更新:system_reserved=1, reserve_status=2 + * 4. 验证预约记录生成:相同 plan_group_id 关联多条记录 + *

+ */ +@SpringBootTest(classes = ZdxtAdminApplication.class) +@AutoConfigureMockMvc +@ActiveProfiles({"dev", "dev-cust-zrb"}) +@DisplayName("autoMatchReserve 自动匹配预约测试") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@Tag("dev") +public class AutoMatchReserveTest { + + @Autowired + private IEfcodeCpPlanService cpPlanService; + + @Autowired + private EfcodeCpPlanMapper cpPlanMapper; + + @Autowired + private EfcodeCpReserveMapper cpReserveMapper; + + @BeforeEach + public void setUp() { + SaTokenContextMockUtil.setMockContext(); + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockRequest)); + } + + @AfterEach + public void tearDown() { + try { + StpUtil.logout(); + } catch (Exception ignored) { + } + RequestContextHolder.resetRequestAttributes(); + SaTokenContextMockUtil.clearContext(); + } + + @DisplayName("0. 插入1000条适合匹配的计划数据") + @Test + @Order(0) + public void testInsert1000MatchablePlans() { + // 模拟登录(避免自动填充 createBy 报空) + StpUtil.login(1); + + // 准备数据:200个企业 × 每企业5个不同执法单位 = 1000条计划 + int enterpriseCount = 200; + int unitsPerEnterprise = 5; + Random random = new Random(); + + // 模拟执法单位ID池(确保不同单位) + String[] bureauDeptIds = { + "BUREAU_TEST_A", "BUREAU_TEST_B", "BUREAU_TEST_C", + "BUREAU_TEST_D", "BUREAU_TEST_E", "BUREAU_TEST_F", + "BUREAU_TEST_G", "BUREAU_TEST_H" + }; + String[] bureauDeptNames = { + "测试执法局A", "测试执法局B", "测试执法局C", + "测试执法局D", "测试执法局E", "测试执法局F", + "测试执法局G", "测试执法局H" + }; + + // 基准日期:从明天开始 + LocalDate baseDate = LocalDate.now().plusDays(1); + int insertedCount = 0; + + for (int e = 0; e < enterpriseCount; e++) { + String enterpriseNumber = String.format("91440300TEST%06d", e); + String enterpriseName = "测试企业" + e + "号"; + String enterpriseId = "ENT_TEST_" + e; + + // 同一企业的计划日期在基准日期附3天内(确保一周内可匹配) + Date planDate = Date.from( + baseDate.plusDays(random.nextInt(3)) + .atStartOfDay(ZoneId.systemDefault()).toInstant() + ); + + for (int u = 0; u < unitsPerEnterprise; u++) { + int bureauIdx = (e + u) % bureauDeptIds.length; + + EfcodeCpPlan plan = new EfcodeCpPlan(); + plan.setId(UUID.randomUUID().toString().replace("-", "")); + plan.setPlanType(random.nextBoolean() ? 1L : 2L); + plan.setPlanDate(planDate); + plan.setPlanTime((long) (random.nextInt(3) + 1)); // 1=上午,2=下午,3=其他 + plan.setPlanActualDate(plan.getPlanDate()); + plan.setPlanActualTime(plan.getPlanTime()); // 1=上午,2=下午,3=其他 + plan.setEnforceContent("自动匹配测试-执法事项" + e + "-" + u); + plan.setEnterpriseName(enterpriseName); + plan.setEnterpriseNumber(enterpriseNumber); + plan.setEnterpriseId(enterpriseId); + plan.setEnforceUserNames("测试人员" + u); + plan.setEnforceUserIds(String.valueOf(1000 + u)); + plan.setEnforceUserCodes("CODE" + u); + plan.setEnforceUserTels("1380000" + String.format("%04d", u)); + plan.setIsPublic(1L); + plan.setIsUnion(1L); + plan.setReserveStatus(1L); // 待预约 + plan.setSystemReserved(0L); // 未经系统匹配 + plan.setManualReserved(0L); + plan.setBureauDeptId(bureauDeptIds[bureauIdx]); + plan.setBureauDeptName(bureauDeptNames[bureauIdx]); + plan.setOrganId(plan.getBureauDeptId()); + plan.setOrganName(plan.getBureauDeptName()); + plan.setDeptId(plan.getBureauDeptId()); + plan.setDeptName(plan.getBureauDeptName()); + plan.setIsDelete(0L); + plan.setCreateBy(1L); + plan.setCreateTime(new Date()); + plan.setUpdateBy(1L); + plan.setUpdateTime(new Date()); + + cpPlanMapper.insert(plan); + insertedCount++; + } + } + + System.out.println("========== 插入匹配测试数据完成 =========="); + System.out.println("共插入计划数: " + insertedCount); + System.out.println("涉及企业数: " + enterpriseCount); + System.out.println("每企业不同单位数: " + unitsPerEnterprise); + System.out.println("预期可匹配企业组数: " + enterpriseCount + " (每企业都有>=2个单位)"); + System.out.println("==========================================="); + + Assertions.assertEquals(1000, insertedCount, "应插入恰好1000条计划"); + } + + @DisplayName("1. 查看当前待匹配计划数据概况") + @Test + @Order(1) + public void testCheckPendingPlans() { + // 查询符合自动匹配条件的计划 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.gt(EfcodeCpPlan::getPlanDate, new Date()); + lqw.eq(EfcodeCpPlan::getSystemReserved, 0L); + lqw.eq(EfcodeCpPlan::getReserveStatus, 1L); + lqw.eq(EfcodeCpPlan::getIsPublic, 1L); + lqw.eq(EfcodeCpPlan::getIsUnion, 1L); + lqw.eq(EfcodeCpPlan::getIsDelete, 0L); + List pendingPlans = cpPlanMapper.selectList(lqw); + + System.out.println("========== 待匹配计划数据概况 =========="); + System.out.println("符合条件的计划总数: " + pendingPlans.size()); + + // 按企业信用代码分组统计 + Map> groupByEnterprise = pendingPlans.stream() + .filter(p -> p.getEnterpriseNumber() != null) + .collect(Collectors.groupingBy(EfcodeCpPlan::getEnterpriseNumber)); + + int potentialMatchCount = 0; + for (Map.Entry> entry : groupByEnterprise.entrySet()) { + // 统计不同执法单位数量 + long distinctUnits = entry.getValue().stream() + .map(EfcodeCpPlan::getBureauDeptId) + .distinct() + .count(); + if (distinctUnits >= 2) { + potentialMatchCount++; + System.out.println(" 企业[" + entry.getKey() + "] - 有" + distinctUnits + "个不同单位的计划,可匹配"); + } + } + + System.out.println("潜在可匹配的企业数: " + potentialMatchCount); + System.out.println("======================================="); + } + + @DisplayName("2. 强制执行 autoMatchReserve 并验证结果") + @Test + @Order(2) + public void testAutoMatchReserveForceMode() { + // 执行前:统计当前系统匹配预约记录数 + long beforeReserveCount = cpReserveMapper.selectCount( + Wrappers.lambdaQuery().eq(EfcodeCpReserve::getResFrom, 1L) + ); + System.out.println("执行前系统匹配预约记录数: " + beforeReserveCount); + + // 执行前:统计已被系统预约的计划数 + long beforeMatchedPlanCount = cpPlanMapper.selectCount( + Wrappers.lambdaQuery() + .eq(EfcodeCpPlan::getSystemReserved, 1L) + .eq(EfcodeCpPlan::getIsDelete, 0L) + ); + System.out.println("执行前已系统匹配计划数: " + beforeMatchedPlanCount); + + // 执行自动匹配(强制模式,忽略日期校验) + System.out.println("\n========== 开始执行 autoMatchReserve(true) =========="); + cpPlanService.autoMatchReserve(true, true, true); + System.out.println("========== 执行完毕 ==========\n"); + + // 执行后:统计系统匹配预约记录数 + long afterReserveCount = cpReserveMapper.selectCount( + Wrappers.lambdaQuery().eq(EfcodeCpReserve::getResFrom, 1L) + ); + System.out.println("执行后系统匹配预约记录数: " + afterReserveCount); + System.out.println("本次新增预约记录数: " + (afterReserveCount - beforeReserveCount)); + + // 执行后:统计已被系统预约的计划数 + long afterMatchedPlanCount = cpPlanMapper.selectCount( + Wrappers.lambdaQuery() + .eq(EfcodeCpPlan::getSystemReserved, 1L) + .eq(EfcodeCpPlan::getIsDelete, 0L) + ); + System.out.println("执行后已系统匹配计划数: " + afterMatchedPlanCount); + System.out.println("本次新增匹配计划数: " + (afterMatchedPlanCount - beforeMatchedPlanCount)); + + // 验证:如果有符合条件的数据,则应产生匹配结果 + if (afterReserveCount > beforeReserveCount) { + System.out.println("\n[验证通过] 自动匹配产生了新的预约记录"); + } else { + System.out.println("\n[提示] 未产生新预约记录(可能没有符合条件的跨单位同企业计划)"); + } + } + + @DisplayName("3. 验证匹配后的 plan_group_id 分组一致性") + @Test + @Order(3) + public void testVerifyPlanGroupConsistency() { + // 查询所有系统匹配生成的预约记录 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(EfcodeCpReserve::getResFrom, 1L); + lqw.eq(EfcodeCpReserve::getOpStatus, 3L); // 待确认 + lqw.orderByDesc(EfcodeCpReserve::getCreateTime); + List reserves = cpReserveMapper.selectList(lqw); + + if (reserves.isEmpty()) { + System.out.println("[跳过] 无系统匹配的预约记录,无法验证分组一致性"); + return; + } + + // 按 plan_group_id 分组 + Map> groupMap = reserves.stream() + .collect(Collectors.groupingBy(EfcodeCpReserve::getPlanGroupId)); + + System.out.println("========== plan_group_id 分组验证 =========="); + System.out.println("共有 " + groupMap.size() + " 组联合预约"); + + int validGroups = 0; + for (Map.Entry> entry : groupMap.entrySet()) { + List group = entry.getValue(); + // 每组至少2条记录(2个不同单位) + if (group.size() >= 2) { + validGroups++; + + // 验证同组内关联的计划属于不同执法单位 + Set planIds = group.stream() + .map(EfcodeCpReserve::getPlanId) + .collect(Collectors.toSet()); + List plans = cpPlanMapper.selectByIds(planIds); + Set bureauDeptIds = plans.stream() + .map(EfcodeCpPlan::getBureauDeptId) + .collect(Collectors.toSet()); + + System.out.println(" groupId=" + entry.getKey() + + " | 记录数=" + group.size() + + " | 涉及单位数=" + bureauDeptIds.size()); + + // 断言:同组关联的计划应来自不同单位 + Assertions.assertTrue(bureauDeptIds.size() >= 2, + "同一planGroupId下应关联至少2个不同执法单位的计划"); + } + } + System.out.println("有效分组数(>=2条记录): " + validGroups); + System.out.println("============================================="); + } + + @DisplayName("4. 验证匹配后计划状态已更新") + @Test + @Order(4) + public void testVerifyPlanStatusUpdated() { + // 查询已被系统匹配的计划 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(EfcodeCpPlan::getSystemReserved, 1L); + lqw.eq(EfcodeCpPlan::getReserveStatus, 2L); // 预约中 + lqw.eq(EfcodeCpPlan::getIsDelete, 0L); + List matchedPlans = cpPlanMapper.selectList(lqw); + + System.out.println("========== 计划状态验证 =========="); + System.out.println("system_reserved=1 且 reserve_status=2 的计划数: " + matchedPlans.size()); + + if (!matchedPlans.isEmpty()) { + // 验证每条计划都满足状态要求 + for (EfcodeCpPlan plan : matchedPlans) { + Assertions.assertEquals(1L, plan.getSystemReserved(), + "计划[" + plan.getId() + "]的system_reserved应为1"); + Assertions.assertEquals(2L, plan.getReserveStatus(), + "计划[" + plan.getId() + "]的reserve_status应为2(预约中)"); + } + System.out.println("[验证通过] 所有已匹配计划状态正确"); + } else { + System.out.println("[提示] 无已匹配计划数据"); + } + System.out.println("=================================="); + } + + @DisplayName("5. 再次执行 autoMatchReserve 验证幂等性(不重复匹配)") + @Test + @Order(5) + public void testAutoMatchReserveIdempotent() { + // 先统计当前预约记录数 + long beforeCount = cpReserveMapper.selectCount( + Wrappers.lambdaQuery().eq(EfcodeCpReserve::getResFrom, 1L) + ); + + // 再次执行 + System.out.println("========== 二次执行 autoMatchReserve(true) 验证幂等性 =========="); + cpPlanService.autoMatchReserve(true, true, true); + + long afterCount = cpReserveMapper.selectCount( + Wrappers.lambdaQuery().eq(EfcodeCpReserve::getResFrom, 1L) + ); + + long newRecords = afterCount - beforeCount; + System.out.println("二次执行新增预约记录数: " + newRecords); + + // 已匹配过的计划不应再次匹配(system_reserved已设为1) + // 但如果有新的符合条件的数据也可能产生新记录 + System.out.println("[说明] 已匹配的计划(system_reserved=1)不会被重复匹配"); + System.out.println("================================================================"); + } +} From a3a6d033f31021885c60eb2f74317f1827de813b 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: Tue, 26 May 2026 13:49:05 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/enforcement/index.js | 2 +- .../router/enforcement-app/enf-main-router.js | 8 + .../src/views/enforcement/loginByPassword.vue | 163 ++++++++++++++++++ .../vite-config/index.js | 6 +- .../vite-env/.env.enforcement-dev | 3 +- .../vite-env/.env.enforcement-prod | 1 + .../vite-env/.env.enforcement-test | 1 + 7 files changed, 178 insertions(+), 6 deletions(-) create mode 100644 zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/loginByPassword.vue diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js b/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js index bba08826..dd6f5097 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/index.js @@ -5,7 +5,7 @@ const baseUrl = "/app-enf"; // region 认证模块 export const enforcementLogin = (params, success, error) => _post(baseUrl + "/login/szyptLogin", params, success, error); -// export const enforcementLogin = (params, success, error) => _post(baseUrl + "/login/do", params, success, error); +export const enforcementLoginByPassword = (params, success, error) => _post(baseUrl + "/login/do", params, success, error); // endregion // region 企业模块 diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js b/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js index 5e945cc4..54c21aeb 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js @@ -9,6 +9,14 @@ const routes = [ isKeepAlive: false, }, }, + { + path: "/enforcement/loginByPassword", + name: "enforcementLoginByPassword", + component: () => import("@/views/enforcement/loginByPassword.vue"), + meta: { + isKeepAlive: false, + }, + }, // 执法端首页 { path: "/enforcement/enforcementHome", diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/loginByPassword.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/loginByPassword.vue new file mode 100644 index 00000000..b625ab65 --- /dev/null +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/loginByPassword.vue @@ -0,0 +1,163 @@ + + + + diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-config/index.js b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-config/index.js index 0a68ac40..2f56d848 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-config/index.js +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-config/index.js @@ -25,7 +25,7 @@ const loadPluginModules = async () => { // 基本配置 const baseCfg = (viteEnv = {}) => { - const { VITE_BASE_URL, VITE_PORT } = viteEnv; + const { VITE_BASE_URL, VITE_PORT, VITE_PROXY_TARGET } = viteEnv; return { base: './', envDir: "vite-env", @@ -43,12 +43,10 @@ const baseCfg = (viteEnv = {}) => { cors: true, proxy: { '/api': { - // target: 'http://localhost:17000', - target: 'http://139.186.148.21:8080', + target: VITE_PROXY_TARGET || 'http://localhost:17000', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') }, - } }, build: { diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-dev b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-dev index 3ff75452..730a32d8 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-dev +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-dev @@ -1,5 +1,6 @@ # 执法端开发环境 VITE_PORT = 12002 VITE_BASE_URL = '/api/enf-ep' -VITE_DEFAULT_LOGIN = '/enforcement/login' +VITE_PROXY_TARGET = 'http://localhost:17000' +VITE_DEFAULT_LOGIN = '/enforcement/loginByPassword' VITE_APP_ENV = 'dev' diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-prod b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-prod index ff4cbce9..2e8965f7 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-prod +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-prod @@ -1,5 +1,6 @@ # 执法端生产环境 VITE_PORT = 12002 VITE_BASE_URL = 'http://localhost:17000/enf-ep' +VITE_PROXY_TARGET = 'http://localhost:17000' VITE_DEFAULT_LOGIN = '/enforce/login' VITE_APP_ENV = 'prod' diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-test b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-test index c5cb41ba..954962aa 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-test +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/vite-env/.env.enforcement-test @@ -1,5 +1,6 @@ # 执法端测试环境 VITE_PORT = 12002 VITE_BASE_URL = '/api' +VITE_PROXY_TARGET = 'http://139.186.148.21:8080' VITE_DEFAULT_LOGIN = '/enforcement/login' VITE_APP_ENV = 'test' From 21fb6a9d8733cf1bbda3ff2f216e94d8a8613122 Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 15:03:12 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E7=9B=91=E7=9D=A3=E7=AB=AF-=E6=99=AE?= =?UTF-8?q?=E6=B3=95=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pNonEnforcementRegistrationController.java | 4 +- ...nforcementEducationServicesController.java | 106 ++++++++++++++ .../bo/EnforcementEducationServicesBo.java | 25 +++- .../vo/EnforcementEducationServicesVo.java | 19 ++- .../IEnforcementEducationServicesService.java | 19 ++- ...forcementEducationServicesServiceImpl.java | 138 +++++++++++++++++- 6 files changed, 297 insertions(+), 14 deletions(-) create mode 100644 zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java index a7315386..01ed79a2 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java @@ -1,5 +1,6 @@ package com.zdxt.enforcementcode.controller.app.enforcement; +import cn.dev33.satoken.annotation.SaIgnore; import com.zdxt.enforcementcode.domain.bo.NonEnforcementRegistrationBo; import com.zdxt.enforcementcode.domain.vo.NonEnforcementRegistrationVo; import com.zdxt.enforcementcode.service.INonEnforcementRegistrationService; @@ -34,8 +35,9 @@ public class AppNonEnforcementRegistrationController extends BaseController { } /** - * 执法端-非行政查询执法登记列表 + * 执法端-非行政查询执法登记列表(历史活动) */ + @SaIgnore @GetMapping("/queryList") public TableDataInfo queryList(NonEnforcementRegistrationBo bo) { diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java new file mode 100644 index 00000000..ef041ac5 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java @@ -0,0 +1,106 @@ +package com.zdxt.enforcementcode.controller.web.supervision; + +import java.util.List; + +import cn.dev33.satoken.annotation.SaIgnore; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import com.zdxt.enforcementcode.domain.vo.EnforcementEducationServicesVo; +import com.zdxt.enforcementcode.domain.bo.EnforcementEducationServicesBo; +import com.zdxt.enforcementcode.service.IEnforcementEducationServicesService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 普法服务主表 + * + * @author niujiyi + * @date 2026-05-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/web/enforcementcode/educationServices") +public class EnforcementEducationServicesController extends BaseController { + + private final IEnforcementEducationServicesService enforcementEducationServicesService; + + /** + * 查询普法服务主表列表 + */ + //@SaCheckPermission("enforcementcode:educationServices:list") + @SaIgnore + @GetMapping("/list") + public TableDataInfo list(EnforcementEducationServicesBo bo, PageQuery pageQuery) { + return enforcementEducationServicesService.queryPageList(bo, pageQuery); + } + + /** + * 导出普法服务主表列表 + */ + @SaCheckPermission("enforcementcode:educationServices:export") + @Log(title = "普法服务主表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(EnforcementEducationServicesBo bo, HttpServletResponse response) { + List list = enforcementEducationServicesService.queryList(bo); + ExcelUtil.exportExcel(list, "普法服务主表", EnforcementEducationServicesVo.class, response); + } + + /** + * 获取普法服务主表详细信息 + * + * @param id 主键 + */ + //@SaCheckPermission("enforcementcode:educationServices:query") + @SaIgnore + @GetMapping("/details") + public R details(String id) { + return R.ok(enforcementEducationServicesService.queryEducationServicesById(id)); + } + + /** + * 新增普法服务主表 + */ + //@SaCheckPermission("enforcementcode:educationServices:add") + @SaIgnore + @Log(title = "普法服务主表", businessType = BusinessType.INSERT) + @PostMapping("/add") + public R add(@Validated(AddGroup.class) @RequestBody EnforcementEducationServicesBo bo) { + return toAjax(enforcementEducationServicesService.insertEducationServices(bo)); + } + + /** + * 修改普法服务主表 + */ + //@SaCheckPermission("enforcementcode:educationServices:edit") + @Log(title = "普法服务主表", businessType = BusinessType.UPDATE) + @SaIgnore + @PostMapping("/edit") + public R edit(@RequestBody EnforcementEducationServicesBo bo) { + return toAjax(enforcementEducationServicesService.updateByBo(bo)); + } + + /** + * 删除普法服务主表 + * + * @param ids 主键串 + */ + //@SaCheckPermission("enforcementcode:educationServices:remove") + @SaIgnore + @GetMapping("/remove") + public R remove(String[] ids) { + return toAjax(enforcementEducationServicesService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementEducationServicesBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementEducationServicesBo.java index 300c9308..80845129 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementEducationServicesBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementEducationServicesBo.java @@ -9,6 +9,9 @@ import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; +import java.util.Date; +import java.util.List; + /** * 执法信息发布主业务对象 enforcement_education_services * @@ -23,31 +26,26 @@ public class EnforcementEducationServicesBo extends BaseEntity { /** * 主键ID */ - @NotBlank(message = "主键ID不能为空", groups = { EditGroup.class }) private String id; /** * 标题 */ - @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class }) private String title; /** * 发布部门ID(多个用逗号分隔) */ - @NotBlank(message = "发布部门ID(多个用逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) private String publishDeptIds; /** * 发布部门名称(冗余存储) */ - @NotBlank(message = "发布部门名称(冗余存储)不能为空", groups = { AddGroup.class, EditGroup.class }) private String publishDeptNames; /** * 发布平台 0-全部 1-监督端 2-执法端 3-企业端 */ - @NotNull(message = "发布平台 0-全部 1-监督端 2-执法端 3-企业端不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer targetPlatform; /** @@ -58,7 +56,6 @@ public class EnforcementEducationServicesBo extends BaseEntity { /** * 来源类型 1|原生 2|转载 */ - @NotNull(message = "来源类型 1|原生 2|转载不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer sourceType; /** @@ -79,7 +76,6 @@ public class EnforcementEducationServicesBo extends BaseEntity { /** * 浏览次数 */ - @NotNull(message = "浏览次数不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer viewCount; /** @@ -105,7 +101,6 @@ public class EnforcementEducationServicesBo extends BaseEntity { /** * 是否删除 0=否 1=是 */ - @NotNull(message = "是否删除 0=否 1=是不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer isDelete; /** @@ -113,5 +108,19 @@ public class EnforcementEducationServicesBo extends BaseEntity { */ private String remark; + /** + * 附件列表 + */ + private List fileList; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 结束时间 + */ + private Date endTime; } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EnforcementEducationServicesVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EnforcementEducationServicesVo.java index 01c74e93..9ae7c411 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EnforcementEducationServicesVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EnforcementEducationServicesVo.java @@ -7,7 +7,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; - +import java.util.List; /** @@ -60,12 +60,24 @@ public class EnforcementEducationServicesVo implements Serializable { @ExcelProperty(value = "内容分类") private Integer contentType; + /** + * 内容分类标签(字典翻译) + */ + @ExcelProperty(value = "内容分类名称") + private String contentTypeLabel; + /** * 来源类型 1|原生 2|转载 */ @ExcelProperty(value = "来源类型 1|原生 2|转载") private Integer sourceType; + /** + * 发布平台标签(字典翻译) + */ + @ExcelProperty(value = "发布平台名称") + private String targetPlatformLabel; + /** * 服务信息(富文本内容) */ @@ -132,4 +144,9 @@ public class EnforcementEducationServicesVo implements Serializable { private Integer isRead; + /** + * 附件信息 + */ + @ExcelProperty(value = "附件信息") + private List fileList; } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEnforcementEducationServicesService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEnforcementEducationServicesService.java index 9dd0de69..d3c97cb3 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEnforcementEducationServicesService.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEnforcementEducationServicesService.java @@ -23,7 +23,13 @@ public interface IEnforcementEducationServicesService { * @return 执法信息发布主 */ EnforcementEducationServicesVo queryById(String id); - + /** + * 查询普法信息详情 + * + * @param id 主键 + * @return 详情 + */ + EnforcementEducationServicesVo queryEducationServicesById(String id); /** * 分页查询执法信息发布主列表 * @@ -49,6 +55,14 @@ public interface IEnforcementEducationServicesService { */ Boolean insertByBo(EnforcementEducationServicesBo bo); + /** + * 监督端-新增执法信息发布主 + * + * @param bo 执法信息发布主 + * @return 是否新增成功 + */ + Boolean insertEducationServices(EnforcementEducationServicesBo bo); + /** * 修改执法信息发布主 * @@ -72,4 +86,7 @@ public interface IEnforcementEducationServicesService { * @return 未读普法消息数量 */ Long countUnreadEducationServices(); + + + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java index 81a2a4a9..24512374 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EnforcementEducationServicesServiceImpl.java @@ -3,7 +3,11 @@ package com.zdxt.enforcementcode.service.impl; import com.zdxt.enforcementcode.common.commonenum.MsgSourceTypeEnum; import com.zdxt.enforcementcode.common.commonenum.PlatformTypeEnums; import com.zdxt.enforcementcode.domain.bean.EnforcementEducationServices; +import com.zdxt.enforcementcode.domain.vo.ZdxtFileVo; import com.zdxt.enforcementcode.service.ISysMessageViewLogService; +import com.zdxt.enforcementcode.domain.bo.ZdxtFileBo; +import com.zdxt.enforcementcode.service.IZdxtFileService; +import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -43,6 +47,34 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc private final ISysMessageViewLogService sysMessageViewLogService; + private final IZdxtFileService zdxtFileService; + + private final DictService dictService; + + /** + * 查询执法信息发布主 + * + * @param id 主键 + * @return 执法信息发布主 + */ + @Override + public EnforcementEducationServicesVo queryEducationServicesById(String id){ + EnforcementEducationServicesVo vo = baseMapper.selectVoById(id); + + if (vo != null) { + // 回显附件信息 + ZdxtFileBo fileBo = new ZdxtFileBo(); + fileBo.setBusinessId(id); + List fileList = zdxtFileService.queryList(fileBo); + vo.setFileList(fileList); + + // 设置字典标签 + setDictLabels(vo); + } + + return vo; + } + /** * 查询执法信息发布主 * @@ -73,8 +105,10 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - // 为每条记录设置是否已读状态 + + // 为每条记录设置字典标签和已读状态 if (result.getRecords() != null && !result.getRecords().isEmpty()) { + setDictLabels(result.getRecords()); setReadStatus(result.getRecords()); } @@ -90,7 +124,50 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc @Override public List queryList(EnforcementEducationServicesBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + + // 设置字典标签 + if (list != null && !list.isEmpty()) { + setDictLabels(list); + } + + return list; + } + + /** + * 为单条记录设置字典标签 + * + * @param vo 记录对象 + */ + private void setDictLabels(EnforcementEducationServicesVo vo) { + if (vo == null) { + return; + } + + // 内容分类标签 + if (vo.getContentType() != null) { + String contentTypeLabel = dictService.getDictLabel("web_content_classification", vo.getContentType().toString()); + vo.setContentTypeLabel(contentTypeLabel); + } + + // 发布平台标签 + if (vo.getTargetPlatform() != null) { + String targetPlatformLabel = dictService.getDictLabel("web_publishing_platform", vo.getTargetPlatform().toString()); + vo.setTargetPlatformLabel(targetPlatformLabel); + } + } + + /** + * 为列表设置字典标签 + * + * @param records 记录列表 + */ + private void setDictLabels(List records) { + if (records == null || records.isEmpty()) { + return; + } + + records.forEach(this::setDictLabels); } /** @@ -162,7 +239,7 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc lqw.orderByAsc(EnforcementEducationServices::getId); lqw.eq(StringUtils.isNotBlank(bo.getTitle()), EnforcementEducationServices::getTitle, bo.getTitle()); lqw.eq(StringUtils.isNotBlank(bo.getPublishDeptIds()), EnforcementEducationServices::getPublishDeptIds, bo.getPublishDeptIds()); - lqw.eq(StringUtils.isNotBlank(bo.getPublishDeptNames()), EnforcementEducationServices::getPublishDeptNames, bo.getPublishDeptNames()); + lqw.like(StringUtils.isNotBlank(bo.getPublishDeptNames()), EnforcementEducationServices::getPublishDeptNames, bo.getPublishDeptNames()); lqw.eq(bo.getTargetPlatform() != null, EnforcementEducationServices::getTargetPlatform, bo.getTargetPlatform()); lqw.eq(bo.getContentType() != null, EnforcementEducationServices::getContentType, bo.getContentType()); lqw.eq(bo.getSourceType() != null, EnforcementEducationServices::getSourceType, bo.getSourceType()); @@ -175,6 +252,16 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc lqw.like(StringUtils.isNotBlank(bo.getCreateByName()), EnforcementEducationServices::getCreateByName, bo.getCreateByName()); lqw.like(StringUtils.isNotBlank(bo.getUpdateByName()), EnforcementEducationServices::getUpdateByName, bo.getUpdateByName()); lqw.eq(bo.getIsDelete() != null, EnforcementEducationServices::getIsDelete, bo.getIsDelete()); + + // 创建时间范围筛选 + if (bo.getStartTime() != null && bo.getEndTime() != null) { + lqw.between(EnforcementEducationServices::getCreateTime, bo.getStartTime(), bo.getEndTime()); + } else if (bo.getStartTime() != null) { + lqw.ge(EnforcementEducationServices::getCreateTime, bo.getStartTime()); + } else if (bo.getEndTime() != null) { + lqw.le(EnforcementEducationServices::getCreateTime, bo.getEndTime()); + } + return lqw; } @@ -195,6 +282,51 @@ public class EnforcementEducationServicesServiceImpl implements IEnforcementEduc return flag; } + /** + * 监督端-新增执法信息发布主 + * + * @param bo 执法信息发布主 + * @return 是否新增成功 + */ + @Override + public Boolean insertEducationServices(EnforcementEducationServicesBo bo) { + EnforcementEducationServices add = MapstructUtils.convert(bo, EnforcementEducationServices.class); + boolean flag = baseMapper.insert(add) > 0; + + if (flag) { + bo.setId(add.getId()); + + // 保存附件信息 + if (bo.getFileList() != null && !bo.getFileList().isEmpty()) { + saveAttachmentFiles(bo.getFileList(), add.getId()); + } + } + + return flag; + } + + /** + * 批量保存附件信息 + * + * @param fileList 附件列表 + * @param businessId 业务ID(普法服务主表ID) + */ + private void saveAttachmentFiles(List fileList, String businessId) { + for (ZdxtFileBo fileBo : fileList) { + // 设置业务ID关联 + fileBo.setBusinessId(businessId); + + // 保存附件 + try { + zdxtFileService.insertByBo(fileBo); + log.info("成功保存附件: businessId={}, fileName={}", businessId, fileBo.getFileName()); + } catch (Exception e) { + log.error("保存附件失败: businessId={}, fileName={}, error={}", + businessId, fileBo.getFileName(), e.getMessage(), e); + } + } + } + /** * 修改执法信息发布主 * From 5996fd93b17f2d5783875b2118024dcd74e50bb4 Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 15:25:26 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=B4=BB=E5=8A=A8=E6=9F=A5=E8=AF=A2=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pNonEnforcementRegistrationController.java | 13 +- .../NonEnforcementRegistrationMapper.java | 4 +- .../INonEnforcementRegistrationService.java | 11 ++ ...NonEnforcementRegistrationServiceImpl.java | 135 +++++++++++++----- 4 files changed, 117 insertions(+), 46 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java index 01ed79a2..636387a7 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java @@ -5,13 +5,12 @@ import com.zdxt.enforcementcode.domain.bo.NonEnforcementRegistrationBo; import com.zdxt.enforcementcode.domain.vo.NonEnforcementRegistrationVo; import com.zdxt.enforcementcode.service.INonEnforcementRegistrationService; import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.List; - /** * 执法端-非行政执法登记Controller * @@ -35,17 +34,13 @@ public class AppNonEnforcementRegistrationController extends BaseController { } /** - * 执法端-非行政查询执法登记列表(历史活动) + * 执法端-非行政查询执法登记列表(历史活动) - 分页 */ @SaIgnore @GetMapping("/queryList") - public TableDataInfo queryList(NonEnforcementRegistrationBo bo) + public TableDataInfo queryList(NonEnforcementRegistrationBo bo, PageQuery pageQuery) { - int total = enforcementRegistrationService.getListTotal(bo); - List list = enforcementRegistrationService.selectNonEnforcementRegistrationList(bo); - TableDataInfo rspData = new TableDataInfo<>(list, total); - rspData.setCode(0); - return rspData; + return enforcementRegistrationService.queryPageList(bo, pageQuery); } /** diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/NonEnforcementRegistrationMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/NonEnforcementRegistrationMapper.java index 61d88a2f..0fa024f6 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/NonEnforcementRegistrationMapper.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/NonEnforcementRegistrationMapper.java @@ -1,7 +1,9 @@ package com.zdxt.enforcementcode.mapper; +import com.zdxt.enforcementcode.domain.NonEnforcementRegistration; import com.zdxt.enforcementcode.domain.bo.NonEnforcementRegistrationBo; import com.zdxt.enforcementcode.domain.vo.NonEnforcementRegistrationVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.springframework.stereotype.Repository; import java.util.List; @@ -13,7 +15,7 @@ import java.util.List; * @date 2025-06-19 */ @Repository -public interface NonEnforcementRegistrationMapper +public interface NonEnforcementRegistrationMapper extends BaseMapperPlus { /** * 查询非行政执法登记 diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/INonEnforcementRegistrationService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/INonEnforcementRegistrationService.java index 3f90a00d..08b816fc 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/INonEnforcementRegistrationService.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/INonEnforcementRegistrationService.java @@ -3,6 +3,8 @@ package com.zdxt.enforcementcode.service; import com.zdxt.enforcementcode.domain.bo.NonEnforcementRegistrationBo; import com.zdxt.enforcementcode.domain.vo.NonEnforcementRegistrationVo; import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import java.util.List; @@ -22,6 +24,15 @@ public interface INonEnforcementRegistrationService */ public NonEnforcementRegistrationVo selectNonEnforcementRegistrationById(String id); + /** + * 分页查询非行政执法登记列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 非行政执法登记分页列表 + */ + TableDataInfo queryPageList(NonEnforcementRegistrationBo bo, PageQuery pageQuery); + /** * 查询非行政执法登记列表 * diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java index 643ae1b4..c23e4670 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java @@ -3,8 +3,10 @@ package com.zdxt.enforcementcode.service.impl; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zdxt.enforcementcode.common.annotation.DataScope; import com.zdxt.enforcementcode.common.util.CommonUtil; +import com.zdxt.enforcementcode.domain.NonEnforcementRegistration; import com.zdxt.enforcementcode.domain.ZdxtFile; import com.zdxt.enforcementcode.domain.bo.NonEnforcementRegistrationBo; import com.zdxt.enforcementcode.domain.vo.NonEnforcementRegistrationVo; @@ -19,6 +21,8 @@ import org.dromara.common.core.enums.FormatsType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.vo.SysDictDataVo; import org.dromara.system.domain.vo.SysUserVo; @@ -57,8 +61,8 @@ public class NonEnforcementRegistrationServiceImpl implements INonEnforcementReg @Override public NonEnforcementRegistrationVo selectNonEnforcementRegistrationById(String id) { - NonEnforcementRegistrationVo nonReg = nonEnforcementRegistrationMapper.selectNonEnforcementRegistrationById(id); - if (nonReg.getId() != null) { + NonEnforcementRegistrationVo nonReg = nonEnforcementRegistrationMapper.selectVoById(id); + if (nonReg != null && nonReg.getId() != null) { SysUserVo user = sysUserMapper.selectUserById(Long.valueOf(nonReg.getLawEnforcerId())); String temp=user.getLawCertificateNum(); if(StringUtils.isEmpty(temp)){ @@ -95,6 +99,95 @@ public class NonEnforcementRegistrationServiceImpl implements INonEnforcementReg return nonReg; } + /** + * 分页查询非行政执法登记列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 非行政执法登记分页列表 + */ + @Override + public TableDataInfo queryPageList(NonEnforcementRegistrationBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = nonEnforcementRegistrationMapper.selectVoPage(pageQuery.build(), lqw); + + // 处理执法人员信息等附加数据 + if (result.getRecords() != null && !result.getRecords().isEmpty()) { + enrichLawEnforcerInfo(result.getRecords()); + } + + return TableDataInfo.build(result); + } + + /** + * 构建查询条件 + * + * @param bo 查询条件 + * @return LambdaQueryWrapper + */ + private LambdaQueryWrapper buildQueryWrapper(NonEnforcementRegistrationBo bo) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + // 根据实际业务需要添加查询条件 + if (bo != null) { + lqw.like(StringUtils.isNotBlank(bo.getEnterpriseName()), NonEnforcementRegistration::getEnterpriseName, bo.getEnterpriseName()); + lqw.eq(StringUtils.isNotBlank(bo.getEnterpriseNumber()), NonEnforcementRegistration::getEnterpriseNumber, bo.getEnterpriseNumber()); + lqw.eq(bo.getReslut() != null, NonEnforcementRegistration::getReslut, bo.getReslut()); + lqw.eq(bo.getStatus() != null, NonEnforcementRegistration::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getBureauDeptId()), NonEnforcementRegistration::getBureauDeptId, bo.getBureauDeptId()); + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcerId()), NonEnforcementRegistration::getLawEnforcerId, bo.getLawEnforcerId()); + lqw.orderByDesc(NonEnforcementRegistration::getEnforcementTime); + } + + return lqw; + } + + /** + * 补充执法人员信息 + * + * @param list 记录列表 + */ + private void enrichLawEnforcerInfo(List list) { + if (list == null || list.isEmpty()) { + return; + } + + // 执法人员 没有执法证件号展示加密手机号 + list.forEach(li -> { + // 处理主执法人员信息 + if (StringUtils.isNotEmpty(li.getLawEnforcerId())) { + SysUserVo sysUserVo = sysUserMapper.selectUserById(Long.valueOf(li.getLawEnforcerId())); + if (sysUserVo != null) { + String lawCN = sysUserVo.getLawCertificateNum(); + if (StringUtils.isEmpty(lawCN)) { + lawCN = CommonUtil.encryptPhone(sysUserVo.getPhonenumber()); + } + li.setLawEnforcer(sysUserVo.getUserName() + " " + lawCN); + } else { + li.setLawEnforcer(li.getLawEnforcer()); + } + } + + // 处理其他执法人员信息 + List lawTwoList = new ArrayList<>(); + if (StringUtils.isNotEmpty(li.getLawEnforcerOther()) && StringUtils.isNotEmpty(li.getLawEnforcerIdOther())) { + List userBeans = sysUserMapper.selectUserByIds(Convert.toStrArray(li.getLawEnforcerIdOther())); + if (userBeans != null && !userBeans.isEmpty()) { + userBeans.forEach(u -> { + if (u != null) { + String temp = u.getLawCertificateNum(); + if (StringUtils.isEmpty(temp)) { + temp = CommonUtil.encryptPhone(u.getPhonenumber()); + } + lawTwoList.add(u.getUserName() + " " + temp); + } + }); + li.setLawEnforcerOtherList(lawTwoList); + } + } + }); + } + /** * 查询非行政执法登记列表 * @@ -104,41 +197,11 @@ public class NonEnforcementRegistrationServiceImpl implements INonEnforcementReg @Override public List selectNonEnforcementRegistrationList(NonEnforcementRegistrationBo bo) { - List list=nonEnforcementRegistrationMapper.selectNonEnforcementRegistrationList(bo); - if(list.size()!=0){ - // 执法人员 没有执法证件号展示加密手机号 - list.forEach(li->{ - if (StringUtils.isNotEmpty(li.getLawEnforcerId())) { - SysUserVo sysUserVo = sysUserMapper.selectUserById(Long.valueOf(li.getLawEnforcerId())); - if (sysUserVo != null) { - String lawCN = sysUserVo.getLawCertificateNum(); - if(StringUtils.isEmpty(lawCN)){ - lawCN = CommonUtil.encryptPhone(sysUserVo.getPhonenumber()); - } - li.setLawEnforcer(sysUserVo.getUserName() + " " + lawCN); - } else { - li.setLawEnforcer(li.getLawEnforcer()); - } - } + List list = nonEnforcementRegistrationMapper.selectNonEnforcementRegistrationList(bo); + + // 使用公共方法处理执法人员信息 + enrichLawEnforcerInfo(list); - List lawTwoList = new ArrayList<>(); - if (StringUtils.isNotEmpty(li.getLawEnforcerOther()) && StringUtils.isNotEmpty(li.getLawEnforcerIdOther())) { - List userBeans = sysUserMapper.selectUserByIds(Convert.toStrArray(li.getLawEnforcerIdOther())); - if (userBeans != null && !userBeans.isEmpty()) { - userBeans.forEach(u->{ - if (u != null) { - String temp = u.getLawCertificateNum(); - if(StringUtils.isEmpty(temp)){ - temp = CommonUtil.encryptPhone(u.getPhonenumber()); - } - lawTwoList.add(u.getUserName() + " " + temp); - } - }); - li.setLawEnforcerOtherList(lawTwoList); - } - } - }); - } return list; } From 4cc43d1cacbb22e499c432d31c7df22193db2a2f Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 16:05:00 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=B4=BB=E6=9F=A5=E8=AF=A2=E6=9D=A1=E4=BB=B6=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...NonEnforcementRegistrationServiceImpl.java | 92 ++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java index c23e4670..617b31c9 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java @@ -128,14 +128,102 @@ public class NonEnforcementRegistrationServiceImpl implements INonEnforcementReg private LambdaQueryWrapper buildQueryWrapper(NonEnforcementRegistrationBo bo) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - // 根据实际业务需要添加查询条件 + // 根据XML文件中的查询条件添加查询条件 if (bo != null) { + // 企业名称 - 模糊查询 lqw.like(StringUtils.isNotBlank(bo.getEnterpriseName()), NonEnforcementRegistration::getEnterpriseName, bo.getEnterpriseName()); + // 企业编号 - 精确查询 lqw.eq(StringUtils.isNotBlank(bo.getEnterpriseNumber()), NonEnforcementRegistration::getEnterpriseNumber, bo.getEnterpriseNumber()); + // 执法时间 - 精确查询 + lqw.eq(bo.getEnforcementTime() != null, NonEnforcementRegistration::getEnforcementTime, bo.getEnforcementTime()); + // 执法人员姓名 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcer()), NonEnforcementRegistration::getLawEnforcer, bo.getLawEnforcer()); + // 执法人员ID - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcerId()), NonEnforcementRegistration::getLawEnforcerId, bo.getLawEnforcerId()); + // 其他执法人员姓名 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcerOther()), NonEnforcementRegistration::getLawEnforcerOther, bo.getLawEnforcerOther()); + // 其他执法人员ID - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcerIdOther()), NonEnforcementRegistration::getLawEnforcerIdOther, bo.getLawEnforcerIdOther()); + // 执法类别 - 精确查询 + lqw.eq(bo.getLawEnforcementType() != null, NonEnforcementRegistration::getLawEnforcementType, bo.getLawEnforcementType()); + // 执法类别文本 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcementTypeText()), NonEnforcementRegistration::getLawEnforcementTypeText, bo.getLawEnforcementTypeText()); + // 执法事项 - 精确查询 + lqw.eq(bo.getLawEnforcementItem() != null, NonEnforcementRegistration::getLawEnforcementItem, bo.getLawEnforcementItem()); + // 执法事项文本 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcementItemText()), NonEnforcementRegistration::getLawEnforcementItemText, bo.getLawEnforcementItemText()); + // 执法依据 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcementBasis()), NonEnforcementRegistration::getLawEnforcementBasis, bo.getLawEnforcementBasis()); + // 执法依据文本 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcementBasisText()), NonEnforcementRegistration::getLawEnforcementBasisText, bo.getLawEnforcementBasisText()); + // 执法结果 - 精确查询 (Long类型) lqw.eq(bo.getReslut() != null, NonEnforcementRegistration::getReslut, bo.getReslut()); + // 状态 - 精确查询 (Long类型) lqw.eq(bo.getStatus() != null, NonEnforcementRegistration::getStatus, bo.getStatus()); + // 是否删除 - 精确查询 (Long类型) + lqw.eq(bo.getHasDelete() != null, NonEnforcementRegistration::getHasDelete, bo.getHasDelete()); + // 是否投诉 - 精确查询 (Long类型) + lqw.eq(bo.getHasComplaint() != null, NonEnforcementRegistration::getHasComplaint, bo.getHasComplaint()); + // 是否提交 - 精确查询 (Long类型) + lqw.eq(bo.getHasSubmit() != null, NonEnforcementRegistration::getHasSubmit, bo.getHasSubmit()); + // 是否评价 - 精确查询 (Long类型) + lqw.eq(bo.getHasEvaluate() != null, NonEnforcementRegistration::getHasEvaluate, bo.getHasEvaluate()); + // 预告ID - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawId()), NonEnforcementRegistration::getLawId, bo.getLawId()); + // 预告文本 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getLawText()), NonEnforcementRegistration::getLawText, bo.getLawText()); + // 执法主体部门ID - 精确查询 lqw.eq(StringUtils.isNotBlank(bo.getBureauDeptId()), NonEnforcementRegistration::getBureauDeptId, bo.getBureauDeptId()); - lqw.eq(StringUtils.isNotBlank(bo.getLawEnforcerId()), NonEnforcementRegistration::getLawEnforcerId, bo.getLawEnforcerId()); + // 执法主体部门名称 - 模糊查询 + lqw.like(StringUtils.isNotBlank(bo.getBureauDeptName()), NonEnforcementRegistration::getBureauDeptName, bo.getBureauDeptName()); + // 统一信用代码 - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getCreditcode()), NonEnforcementRegistration::getCreditcode, bo.getCreditcode()); + // 用户ID - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getUserId()), NonEnforcementRegistration::getUserId, bo.getUserId()); + // 部门ID - 精确查询 + lqw.eq(StringUtils.isNotBlank(bo.getDeptId()), NonEnforcementRegistration::getDeptId, bo.getDeptId()); + + // searchValue - 多字段模糊查询 + if (StringUtils.isNotBlank(bo.getSearchValue())) { + lqw.and(wrapper -> wrapper + .like(NonEnforcementRegistration::getLawEnforcementItemText, bo.getSearchValue()) + .or().like(NonEnforcementRegistration::getBureauDeptName, bo.getSearchValue()) + .or().like(NonEnforcementRegistration::getLawEnforcer, bo.getSearchValue()) + .or().like(NonEnforcementRegistration::getLawEnforcerOther, bo.getSearchValue()) + ); + } + + // dateType - 时间范围查询 + if (bo.getDateType() != null) { + if (bo.getDateType() == 1) { + // 本月 + lqw.apply("DATE_FORMAT(enforcement_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')"); + } else if (bo.getDateType() == 2) { + // 本季度 + lqw.apply("DATE_FORMAT(enforcement_time, '%Y-%m') >= CONCAT(YEAR(CURDATE()), '-', " + + "CASE WHEN QUARTER(CURDATE()) IN (1) THEN '01' " + + "WHEN QUARTER(CURDATE()) IN (2) THEN '04' " + + "WHEN QUARTER(CURDATE()) IN (3) THEN '07' " + + "ELSE '10' END) " + + "and DATE_FORMAT(enforcement_time, '%Y-%m') <= CONCAT(YEAR(CURDATE()), '-', " + + "CASE " + + "WHEN QUARTER(CURDATE()) IN (1) THEN '03' " + + "WHEN QUARTER(CURDATE()) IN (2) THEN '06' " + + "WHEN QUARTER(CURDATE()) IN (3) THEN '09' " + + "ELSE '12' " + + "END)"); + } else if (bo.getDateType() == 3) { + // 本年 + lqw.apply("DATE_FORMAT(enforcement_time, '%Y') = DATE_FORMAT(CURDATE(), '%Y')"); + } + } + + // dateSearch - 时间范围查询 + if (StringUtils.isNotBlank(bo.getDateSearch())) { + lqw.apply("DATE_FORMAT(enforcement_time, '%Y-%m') = {0}", bo.getDateSearch()); + } + + // 按执法时间倒序排序 lqw.orderByDesc(NonEnforcementRegistration::getEnforcementTime); } From e898aba6f4b28a3808d44332b982c21863a8d8cf Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 16:35:20 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=B4=BB=E6=9F=A5=E8=AF=A2=E6=98=8E=E7=BB=86=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E7=A9=BA=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pNonEnforcementRegistrationController.java | 1 + ...NonEnforcementRegistrationServiceImpl.java | 32 ++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java index 636387a7..a2ced8b4 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppNonEnforcementRegistrationController.java @@ -46,6 +46,7 @@ public class AppNonEnforcementRegistrationController extends BaseController { /** * 执法端-非行政查询执法登记列表 */ + @SaIgnore @GetMapping("/queryById") public R queryById(String id) { diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java index 617b31c9..29ab6ed7 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/NonEnforcementRegistrationServiceImpl.java @@ -63,25 +63,33 @@ public class NonEnforcementRegistrationServiceImpl implements INonEnforcementReg { NonEnforcementRegistrationVo nonReg = nonEnforcementRegistrationMapper.selectVoById(id); if (nonReg != null && nonReg.getId() != null) { - SysUserVo user = sysUserMapper.selectUserById(Long.valueOf(nonReg.getLawEnforcerId())); - String temp=user.getLawCertificateNum(); - if(StringUtils.isEmpty(temp)){ - temp= CommonUtil.encryptPhone(user.getPhonenumber()); + // 处理主执法人员信息 + if (StringUtils.isNotEmpty(nonReg.getLawEnforcerId())) { + SysUserVo user = sysUserMapper.selectUserById(Long.valueOf(nonReg.getLawEnforcerId())); + if (user != null) { + String temp = user.getLawCertificateNum(); + if (StringUtils.isEmpty(temp)) { + temp = CommonUtil.encryptPhone(user.getPhonenumber()); + } + nonReg.setLawEnforcer(user.getUserName() + " " + temp); + } } - nonReg.setLawEnforcer(user.getUserName()+" "+temp); + if(StringUtils.isNotEmpty(nonReg.getLawEnforcerOther())){ List list = sysUserMapper.selectUserByIds(Convert.toStrArray(nonReg.getLawEnforcerIdOther())); - if(list.size()!=0){ + if(list != null && list.size() != 0){ String tmpUserShow = ""; for (SysUserVo ub : list) { - String t = ub.getLawCertificateNum(); - if(StringUtils.isEmpty(t)){ - t=CommonUtil.encryptPhone(ub.getPhonenumber()); + if (ub != null) { + String t = ub.getLawCertificateNum(); + if(StringUtils.isEmpty(t)){ + t = CommonUtil.encryptPhone(ub.getPhonenumber()); + } + tmpUserShow += ub.getUserName() + " " + t + ","; } - tmpUserShow += ub.getUserName() +" "+ t + ","; } if (tmpUserShow.length() > 0) { - tmpUserShow = tmpUserShow.substring(0, tmpUserShow.length()-1); + tmpUserShow = tmpUserShow.substring(0, tmpUserShow.length() - 1); } nonReg.setLawEnforcerOther(tmpUserShow); } @@ -89,7 +97,7 @@ public class NonEnforcementRegistrationServiceImpl implements INonEnforcementReg LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ZdxtFile::getBusinessId, nonReg.getId()); - List zdxtFileCommons=zdxtFileMapper.selectList(queryWrapper); + List zdxtFileCommons = zdxtFileMapper.selectList(queryWrapper); if (zdxtFileCommons.size() > 0) { Map params = new HashMap(); params.put("fileList", zdxtFileCommons); From 8554f5e2d44d57b2cb2f7dbefe4aaa5b1927cec0 Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 19:04:25 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=B4=BB=E6=9F=A5=E8=AF=A2=E6=98=8E=E7=BB=86=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E7=A9=BA=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnforcementEducationServicesController.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java index ef041ac5..047a5fa7 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/EnforcementEducationServicesController.java @@ -24,7 +24,7 @@ import com.zdxt.enforcementcode.service.IEnforcementEducationServicesService; import org.dromara.common.mybatis.core.page.TableDataInfo; /** - * 普法服务主表 + * 监督端-普法服务主表 * * @author niujiyi * @date 2026-05-26 @@ -38,7 +38,7 @@ public class EnforcementEducationServicesController extends BaseController { private final IEnforcementEducationServicesService enforcementEducationServicesService; /** - * 查询普法服务主表列表 + * 监督端-查询普法服务主表列表 */ //@SaCheckPermission("enforcementcode:educationServices:list") @SaIgnore @@ -48,7 +48,7 @@ public class EnforcementEducationServicesController extends BaseController { } /** - * 导出普法服务主表列表 + * 监督端-导出普法服务主表列表 */ @SaCheckPermission("enforcementcode:educationServices:export") @Log(title = "普法服务主表", businessType = BusinessType.EXPORT) @@ -59,7 +59,7 @@ public class EnforcementEducationServicesController extends BaseController { } /** - * 获取普法服务主表详细信息 + * 监督端-获取普法服务主表详细信息 * * @param id 主键 */ @@ -71,7 +71,7 @@ public class EnforcementEducationServicesController extends BaseController { } /** - * 新增普法服务主表 + * 监督端-新增普法服务主表 */ //@SaCheckPermission("enforcementcode:educationServices:add") @SaIgnore @@ -82,7 +82,7 @@ public class EnforcementEducationServicesController extends BaseController { } /** - * 修改普法服务主表 + * 监督端-修改普法服务主表 */ //@SaCheckPermission("enforcementcode:educationServices:edit") @Log(title = "普法服务主表", businessType = BusinessType.UPDATE) @@ -93,7 +93,7 @@ public class EnforcementEducationServicesController extends BaseController { } /** - * 删除普法服务主表 + * 监督端-删除普法服务主表 * * @param ids 主键串 */ From dbfeaca33730631b89fca2c5d0c3844c85ca8c06 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: Tue, 26 May 2026 19:45:02 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enforcement/AppEnfCpTaskController.java | 51 ++ .../domain/vo/EfcodeCpPlanVo.java | 7 + .../domain/vo/EfcodeCpTaskVo.java | 92 +++ .../mapper/EfcodeCpTaskMapper.java | 30 + .../service/IEfcodeCpTaskService.java | 37 ++ .../service/impl/EfcodeCpPlanServiceImpl.java | 88 ++- .../impl/EfcodeCpReserveServiceImpl.java | 50 +- .../service/impl/EfcodeCpTaskServiceImpl.java | 53 ++ .../enforcementcode/EfcodeCpTaskMapper.xml | 81 +++ .../src/api/enforcement/plan.js | 7 +- .../router/enforcement-app/enf-main-router.js | 18 + .../views/enforcement/my/enforcementMy.vue | 4 +- .../enforcement/my/plan/cp_plan_edit.vue | 63 +- .../enforcement/my/plan/cp_plan_mine.vue | 14 +- .../enforcement/my/plan/cp_plan_other.vue | 10 +- .../enforcement/my/task/cp_task_detail.vue | 392 ++++++++++++ .../enforcement/my/task/cp_task_mine.vue | 578 ++++++++++++++++++ 17 files changed, 1551 insertions(+), 24 deletions(-) create mode 100644 zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_detail.vue create mode 100644 zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpTaskController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpTaskController.java index d65227a6..4d1af96e 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpTaskController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpTaskController.java @@ -1,10 +1,18 @@ package com.zdxt.enforcementcode.controller.app.enforcement; import com.zdxt.enforcementcode.controller.web.supervision.EfcodeCpTaskController; +import com.zdxt.enforcementcode.domain.vo.EfcodeCpTaskVo; import com.zdxt.enforcementcode.service.IEfcodeCpTaskService; +import org.dromara.common.core.domain.R; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Date; +import java.util.List; + /** * 行政执法检查计划-任务 * @@ -16,7 +24,50 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/app-enf/cpTask") public class AppEnfCpTaskController extends EfcodeCpTaskController { + @Autowired + private IEfcodeCpTaskService cpTaskService; + public AppEnfCpTaskController(IEfcodeCpTaskService efcodeCpTaskService) { super(efcodeCpTaskService); + this.cpTaskService = efcodeCpTaskService; + } + + /** + * 查询我的任务列表(指定日期) + * + * @param planDate 计划执行日期(可选,格式 yyyy-MM-dd) + * @return 任务列表 + */ + @GetMapping("/myList") + public R> myList( + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date planDate) { + Long userId = LoginHelper.getUserId(); + List list = cpTaskService.queryMyTaskList(userId, planDate); + return R.ok(list); + } + + /** + * 查询指定月份中有任务的日期列表(用于日历打点) + * + * @param yearMonth 年月,格式如 "2026-03" + * @return 日期字符串列表 + */ + @GetMapping("/myTaskDates") + public R> myTaskDates(@RequestParam String yearMonth) { + Long userId = LoginHelper.getUserId(); + List dates = cpTaskService.queryMyTaskDates(userId, yearMonth); + return R.ok(dates); + } + + /** + * 查询我的任务详情(通过 planId 查询任务+计划完整信息) + * + * @param planId 计划ID + * @return 任务详情 + */ + @GetMapping("/myDetail") + public R myDetail(@RequestParam String planId) { + EfcodeCpTaskVo detail = cpTaskService.queryMyTaskDetail(planId); + return R.ok(detail); } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java index 3d0e8bb3..b8006d4a 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java @@ -169,6 +169,13 @@ public class EfcodeCpPlanVo implements Serializable { @com.baomidou.mybatisplus.annotation.TableField(exist = false) private Long editEnable; + /** + * 是否可以删除:1=是,0=否(非数据库字段,后置计算) + *

规则:可编辑时可删除;不联合执法且执行时间未到时也可删除

+ */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Long deleteEnable; + /** * 执法单位ID */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpTaskVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpTaskVo.java index 936a26f2..d4bb9cab 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpTaskVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpTaskVo.java @@ -46,5 +46,97 @@ public class EfcodeCpTaskVo implements Serializable { @ExcelProperty(value = "执法单位ID") private String bureauDeptId; + // ========== 以下为关联计划表字段,通过 SQL JOIN 填充,非数据库字段 ========== + + /** + * 关联计划ID + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String planId; + + /** + * 计划执行日期 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Date planDate; + + /** + * 执行时段:1=上午,2=下午,3=其他 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Long planTime; + + /** + * 经过预约后最终的计划执行日期 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Date planActualDate; + + /** + * 经过预约后最终的执行时段:1=上午,2=下午,3=其他 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Long planActualTime; + + /** + * 执法事项 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String enforceContent; + + /** + * 被检查企业/机构名称 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String enterpriseName; + + /** + * 是否联合执法:1=是,0=否 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Long isUnion; + + /** + * 执法单位名称 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String bureauDeptName; + + /** + * 计划类别:1=日常计划,2=专项计划 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Long planType; + + /** + * 执法人员姓名(多个逗号分隔) + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String enforceUserNames; + + /** + * 被检查企业/机构信用代码 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String enterpriseNumber; + + /** + * 联合执法单位(多个逗号分隔) + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String unionBureauDeptNames; + + /** + * 预约状态:0=草稿,1=待预约,2=预约中,3=预约完成 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private Long reserveStatus; + + /** + * 备注 + */ + @com.baomidou.mybatisplus.annotation.TableField(exist = false) + private String remark; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpTaskMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpTaskMapper.java index bdea1a75..cc7e2e88 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpTaskMapper.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpTaskMapper.java @@ -2,8 +2,12 @@ package com.zdxt.enforcementcode.mapper; import com.zdxt.enforcementcode.domain.EfcodeCpTask; import com.zdxt.enforcementcode.domain.vo.EfcodeCpTaskVo; +import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import java.util.Date; +import java.util.List; + /** * 行政执法检查计划-任务Mapper接口 * @@ -12,4 +16,30 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; */ public interface EfcodeCpTaskMapper extends BaseMapperPlus { + /** + * 查询我的任务列表(通过计划表关联,筛选当前用户参与的任务) + * + * @param userId 当前用户ID + * @param planDate 计划执行日期(可为null) + * @return 任务列表 + */ + List selectMyTaskList(@Param("userId") Long userId, @Param("planDate") Date planDate); + + /** + * 查询指定月份中有任务的日期列表(用于日历打点) + * + * @param userId 当前用户ID + * @param yearMonth 年月,格式如 "2026-03" + * @return 日期字符串列表,格式如 ["2026-03-02", "2026-03-10"] + */ + List selectMyTaskDates(@Param("userId") Long userId, @Param("yearMonth") String yearMonth); + + /** + * 查询我的任务详情(通过 planId 查询任务+计划完整信息) + * + * @param planId 计划ID + * @return 任务详情 + */ + EfcodeCpTaskVo selectMyTaskDetail(@Param("planId") String planId); + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpTaskService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpTaskService.java index 9c432b16..0b6d7909 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpTaskService.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpTaskService.java @@ -5,7 +5,10 @@ import com.zdxt.enforcementcode.domain.bo.EfcodeCpTaskBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import com.zdxt.enforcementcode.domain.EfcodeCpPlan; + import java.util.Collection; +import java.util.Date; import java.util.List; /** @@ -65,4 +68,38 @@ public interface IEfcodeCpTaskService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询我的任务列表(通过计划表关联,筛选当前用户参与的任务) + * + * @param userId 当前用户ID + * @param planDate 计划执行日期(可为null) + * @return 任务列表 + */ + List queryMyTaskList(Long userId, Date planDate); + + /** + * 查询指定月份中有任务的日期列表(用于日历打点) + * + * @param userId 当前用户ID + * @param yearMonth 年月,格式如 "2026-03" + * @return 日期字符串列表 + */ + List queryMyTaskDates(Long userId, String yearMonth); + + /** + * 查询我的任务详情(通过 planId 查询任务+计划完整信息) + * + * @param planId 计划ID + * @return 任务详情 + */ + EfcodeCpTaskVo queryMyTaskDetail(String planId); + + /** + * 强制创建任务(忽略其他条件),根据计划信息直接生成任务记录并回写 plan.task_id + * + * @param plan 来源计划 + * @return 新建任务ID + */ + String forceGenerateTask(EfcodeCpPlan plan); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java index d2458359..64cbc8be 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java @@ -21,6 +21,7 @@ import com.zdxt.enforcementcode.service.IEfcodeCpPlanService; import java.time.LocalDate; import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -37,6 +38,7 @@ import com.zdxt.enforcementcode.domain.EfcodeCpReserve; import com.zdxt.enforcementcode.domain.EfcodeCpSetting; import com.zdxt.enforcementcode.mapper.EfcodeCpReserveMapper; import com.zdxt.enforcementcode.mapper.EfcodeCpSettingMapper; +import com.zdxt.enforcementcode.service.IEfcodeCpTaskService; /** * 行政执法检查计划-计划Service业务层处理 @@ -53,6 +55,7 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { private final EfcodeCpPlanUsersMapper efcodeCpPlanUsersMapper; private final EfcodeCpReserveMapper efcodeCpReserveMapper; private final EfcodeCpSettingMapper efcodeCpSettingMapper; + private final IEfcodeCpTaskService cpTaskService; /** * 查询行政执法检查计划-计划 @@ -130,8 +133,9 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { } /** - * 后置计算 editEnable:判断记录是否可编辑 - *

规则:预约状态为草稿(0)或待预约(1)时可编辑,其他状态不可编辑

+ * 后置计算 editEnable / deleteEnable:判断记录是否可编辑、可删除 + *

editEnable 规则:预约状态为草稿(0)或待预约(1)时可编辑,其他状态不可编辑

+ *

deleteEnable 规则:可编辑时可删除;或者不联合执法(isUnion=0)且计划执行时间还未到时也可删除

* * @param records 查询结果列表 */ @@ -139,10 +143,22 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { if (records == null || records.isEmpty()) { return; } + LocalDate today = LocalDate.now(); for (EfcodeCpPlanVo vo : records) { Long status = vo.getReserveStatus(); // 草稿(0)或待预约(1)可编辑,其他状态不可编辑 - vo.setEditEnable(status != null && status <= 1L ? 1L : 0L); + boolean canEdit = status != null && status <= 1L; + vo.setEditEnable(canEdit ? 1L : 0L); + + // 删除条件:可编辑 OR (不联合执法 AND 执行时间未到) + boolean canDelete = canEdit; + if (!canDelete && vo.getIsUnion() != null && vo.getIsUnion() == 0L && vo.getPlanDate() != null) { + LocalDate planLocalDate = vo.getPlanDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + if (planLocalDate.isAfter(today)) { + canDelete = true; + } + } + vo.setDeleteEnable(canDelete ? 1L : 0L); } } @@ -234,7 +250,27 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { * @param entity 已持久化的实体 */ private void afterInsert(EfcodeCpPlanBo bo, EfcodeCpPlan entity) { - // TODO 后续扩展:如发送通知、记录日志等 + // 条件1:不联合的计划,直接生成任务 + if (entity.getIsUnion() != null && entity.getIsUnion() == 0L) { + log.info("[计划提交] 不联合计划,直接生成任务, planId={}", entity.getId()); + cpTaskService.forceGenerateTask(entity); + return; + } + // 条件2:执行时间距今天 <= CP_SETTING_MANUAL_MATCH_DAYS,直接生成任务 + if (entity.getPlanDate() != null) { + String manualMatchDaysStr = getSettingValue("CP_SETTING_MANUAL_MATCH_DAYS"); + int manualMatchDays = 3; // 默认值 + if (StringUtils.isNotBlank(manualMatchDaysStr)) { + try { manualMatchDays = Integer.parseInt(manualMatchDaysStr.trim()); } catch (NumberFormatException ignored) {} + } + LocalDate planLocalDate = entity.getPlanDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + long daysUntilPlan = ChronoUnit.DAYS.between(LocalDate.now(), planLocalDate); + if (daysUntilPlan <= manualMatchDays) { + log.info("[计划提交] 执行时间距今{}<={}(CP_SETTING_MANUAL_MATCH_DAYS),直接生成任务, planId={}", + daysUntilPlan, manualMatchDays, entity.getId()); + cpTaskService.forceGenerateTask(entity); + } + } } /** @@ -345,15 +381,45 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { @Transactional(rollbackFor = Exception.class) @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 + if (ids == null || ids.isEmpty()) { + return false; } - // 先级联删除计划参与人员表关联记录 - if (ids != null && !ids.isEmpty()) { - efcodeCpPlanUsersMapper.delete( - Wrappers.lambdaQuery().in(EfcodeCpPlanUsers::getPlanId, ids) - ); + // 查询待删除的计划记录 + List plans = baseMapper.selectByIds(ids); + if (isValid) { + LocalDate today = LocalDate.now(); + for (EfcodeCpPlan plan : plans) { + Long status = plan.getReserveStatus(); + boolean canEdit = status != null && status <= 1L; + boolean canDelete = canEdit; + // 不联合执法且执行时间未到,也允许删除 + if (!canDelete && plan.getIsUnion() != null && plan.getIsUnion() == 0L && plan.getPlanDate() != null) { + LocalDate planLocalDate = plan.getPlanDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + if (planLocalDate.isAfter(today)) { + canDelete = true; + } + } + if (!canDelete) { + throw new ServiceException("计划[" + + (plan.getEnterpriseName() != null ? plan.getEnterpriseName() : plan.getId()) + + "]当前状态不允许删除"); + } + } } + // 级联删除关联的任务记录 + List taskIds = plans.stream() + .map(EfcodeCpPlan::getTaskId) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + if (!taskIds.isEmpty()) { + log.info("[删除计划] 级联删除任务记录, taskIds={}", taskIds); + cpTaskService.deleteWithValidByIds(taskIds, false); + } + // 级联删除计划参与人员表关联记录 + efcodeCpPlanUsersMapper.delete( + Wrappers.lambdaQuery().in(EfcodeCpPlanUsers::getPlanId, ids) + ); return baseMapper.deleteByIds(ids) > 0; } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java index 1c05ea7c..6a25dc1b 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java @@ -21,6 +21,7 @@ import com.zdxt.enforcementcode.mapper.EfcodeCpReserveMapper; import com.zdxt.enforcementcode.mapper.EfcodeCpPlanMapper; import com.zdxt.enforcementcode.service.IEfcodeCpReserveService; import com.zdxt.enforcementcode.service.IEfcodeCpSettingService; +import com.zdxt.enforcementcode.service.IEfcodeCpTaskService; import java.util.*; import java.util.stream.Collectors; @@ -39,6 +40,7 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService { private final EfcodeCpReserveMapper baseMapper; private final EfcodeCpPlanMapper cpPlanMapper; private final IEfcodeCpSettingService cpSettingService; + private final IEfcodeCpTaskService cpTaskService; /** * 查询行政执法检查计划-预约 @@ -242,6 +244,28 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService { // 插入1条记录 insertReserveRecord(myPlan.getId(), planGroupId, opMessage, targetPlan.getPlanDate(), targetPlan.getPlanTime(), 0L); } + + // ===== 插入预约记录后:更新两个计划的 reserve_status ===== + + // 1. 我的计划 → 2=预约中 + EfcodeCpPlan myPlanUpdate = new EfcodeCpPlan(); + myPlanUpdate.setId(myPlan.getId()); + myPlanUpdate.setReserveStatus(2L); + cpPlanMapper.updateById(myPlanUpdate); + + // 2. 对方计划 → 根据当前活跃预约数决定状态 + // 活跃数 < maxUnionUnit → 5=待预约(还有位置可以加入) + // 活跃数 = maxUnionUnit → 6=待预约(人数已满) + long currentActiveCount = countActiveReserves(planGroupId); + long newTargetStatus = (currentActiveCount >= maxUnionUnit) ? 6L : 5L; + EfcodeCpPlan targetPlanUpdate = new EfcodeCpPlan(); + targetPlanUpdate.setId(targetPlanId); + targetPlanUpdate.setReserveStatus(newTargetStatus); + cpPlanMapper.updateById(targetPlanUpdate); + + log.info("[doReserve] 我的计划[{}]→reserve_status=2, 对方计划[{}]→reserve_status={}, 活跃数={}, 最大联合数={}", + myPlan.getId(), targetPlanId, newTargetStatus, currentActiveCount, maxUnionUnit); + return R.ok(); } @@ -356,7 +380,31 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService { * @param action 操作类型: "approve" 或 "reject" */ private void afterOperate(EfcodeCpReserve reserve, String action) { - // TODO: 可在此处扩展后置逻辑,如通知、状态同步等 log.info("预约记录[{}]执行{}操作后置处理, planGroupId={}", reserve.getId(), action, reserve.getPlanGroupId()); + // 同意操作后:检查同一 planGroupId 已同意数量是否达到最大联合单位数 + if ("approve".equals(action) && StringUtils.isNotBlank(reserve.getPlanGroupId())) { + int maxUnionUnit = cpSettingService.getMaxUnionUnit(); + long approvedCount = baseMapper.selectCount( + Wrappers.lambdaQuery() + .eq(EfcodeCpReserve::getPlanGroupId, reserve.getPlanGroupId()) + .eq(EfcodeCpReserve::getOpStatus, 1L) // 1=已同意 + ); + log.info("[预约后置] planGroupId={}, 已同意数量={}, 最大联合数={}", reserve.getPlanGroupId(), approvedCount, maxUnionUnit); + if (approvedCount >= maxUnionUnit) { + // 达标:为该分组所有计划生成任务 + List groupReserves = baseMapper.selectList( + Wrappers.lambdaQuery() + .eq(EfcodeCpReserve::getPlanGroupId, reserve.getPlanGroupId()) + .eq(EfcodeCpReserve::getOpStatus, 1L) + ); + for (EfcodeCpReserve r : groupReserves) { + EfcodeCpPlan plan = cpPlanMapper.selectById(r.getPlanId()); + if (plan != null && StringUtils.isBlank(plan.getTaskId())) { + cpTaskService.forceGenerateTask(plan); + } + } + log.info("[预约后置] planGroupId={} 联合数量达标,已为{}条计划生成任务", reserve.getPlanGroupId(), groupReserves.size()); + } + } } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java index fd5c5d91..7605c9ed 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java @@ -13,9 +13,12 @@ import org.springframework.stereotype.Service; import com.zdxt.enforcementcode.domain.bo.EfcodeCpTaskBo; import com.zdxt.enforcementcode.domain.vo.EfcodeCpTaskVo; import com.zdxt.enforcementcode.domain.EfcodeCpTask; +import com.zdxt.enforcementcode.domain.EfcodeCpPlan; import com.zdxt.enforcementcode.mapper.EfcodeCpTaskMapper; +import com.zdxt.enforcementcode.mapper.EfcodeCpPlanMapper; import com.zdxt.enforcementcode.service.IEfcodeCpTaskService; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Collection; @@ -32,6 +35,7 @@ import java.util.Collection; public class EfcodeCpTaskServiceImpl implements IEfcodeCpTaskService { private final EfcodeCpTaskMapper baseMapper; + private final EfcodeCpPlanMapper cpPlanMapper; /** * 查询行政执法检查计划-任务 @@ -128,6 +132,55 @@ public class EfcodeCpTaskServiceImpl implements IEfcodeCpTaskService { return true; } + /** + * 查询我的任务列表 + */ + @Override + public List queryMyTaskList(Long userId, Date planDate) { + return baseMapper.selectMyTaskList(userId, planDate); + } + + /** + * 查询指定月份中有任务的日期列表 + */ + @Override + public List queryMyTaskDates(Long userId, String yearMonth) { + return baseMapper.selectMyTaskDates(userId, yearMonth); + } + + /** + * 查询我的任务详情 + */ + @Override + public EfcodeCpTaskVo queryMyTaskDetail(String planId) { + return baseMapper.selectMyTaskDetail(planId); + } + + /** + * 强制创建任务(忽略其他条件),根据计划信息直接生成任务记录并回写 plan.task_id + * + * @param plan 来源计划 + * @return 新建任务ID + */ + @Override + public String forceGenerateTask(EfcodeCpPlan plan) { + // 1. 创建任务记录 + EfcodeCpTask task = new EfcodeCpTask(); + task.setTaskName(plan.getEnterpriseName() + " - 执法检查任务"); + task.setBureauDeptId(plan.getBureauDeptId()); + baseMapper.insert(task); + log.info("[强制创建任务] 新建任务 taskId={}, planId={}, 企业={}", task.getId(), plan.getId(), plan.getEnterpriseName()); + + // 2. 回写计划的 task_id,同时将 reserve_status 设为 3(预约完成/形成任务) + EfcodeCpPlan planUpdate = new EfcodeCpPlan(); + planUpdate.setId(plan.getId()); + planUpdate.setTaskId(task.getId()); + planUpdate.setReserveStatus(3L); + cpPlanMapper.updateById(planUpdate); + + return task.getId(); + } + /** * 校验并批量删除行政执法检查计划-任务信息 * diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml index 657786c0..cfb5288d 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml @@ -3,4 +3,85 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js b/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js index 0d5c16df..824a8ecd 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js @@ -32,7 +32,7 @@ export const doReservePlan = (params, success, error) => _post(planBaseUrl + "/r // region 计划-设置接口 -const settingBaseUrl = "/api/app-enf/cpSetting"; +const settingBaseUrl = "/app-enf/cpSetting"; // 下阶段计划提交最晚时间(每月几号前需提交下阶段计划<=) export const getSubmitDeadline = (success, error) => _get(settingBaseUrl + "/submitDeadline", {}, success, error); @@ -40,11 +40,14 @@ export const getSubmitDeadline = (success, error) => _get(settingBaseUrl + "/sub // 单位内部单次计划最多参与人数(>=3) export const getMaxInnerUnitAcPersonNum = (success, error) => _get(settingBaseUrl + "/maxInnerUnitAcPersonNum", {}, success, error); +// 手工匹配距计划开始天数 +export const getManualMatchDays = (success, error) => _get(settingBaseUrl + "/manualMatchDays", {}, success, error); + // endregion // region 企业检索接口 -const enterpriseSearchBaseUrl = "/api/enforcementcode/enterpriseSearch"; +const enterpriseSearchBaseUrl = "/enforcementcode/enterpriseSearch"; // 按企业名称联合检索(>=3字符) export const searchUnionByEnterpriseName = (enterpriseName, success, error) => diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js b/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js index 54c21aeb..8ee94406 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js @@ -98,6 +98,24 @@ const routes = [ isKeepAlive: false, }, }, + // 执法端-我的任务列表 + { + path: "/enforcement/task", + name: "cpTaskMine", + component: () => import("@/views/enforcement/my/task/cp_task_mine.vue"), + meta: { + isKeepAlive: false, + }, + }, + // 执法端-任务详情 + { + path: "/enforcement/task/detail", + name: "cpTaskDetail", + component: () => import("@/views/enforcement/my/task/cp_task_detail.vue"), + meta: { + isKeepAlive: false, + }, + }, // 执法端-预约处理列表 { path: "/enforcement/reserve", diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue index 4e5b58b1..92dc5992 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue @@ -119,13 +119,15 @@ const settingItem = { const onMenuClick = (item) => { switch (item.key) { case 'notice': - case 'task': // 跳至消息中心待办 tab,并带类型过滤参数 router.push({ path: '/enforcement/message', query: { tab: 'todo', type: item.key }, }); break; + case 'task': + router.push({ path: '/enforcement/task' }); + break; case 'appointment': router.push({ path: '/enforcement/reserve' }); break; diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue index 284a96de..83f638c0 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue @@ -228,8 +228,8 @@ + + diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue new file mode 100644 index 00000000..2ec96ce5 --- /dev/null +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue @@ -0,0 +1,578 @@ + + + + + From 976aed33ce8b44404b1d7cb4570909b42b681fd0 Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 19:45:57 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=B4=BB=E6=9F=A5=E8=AF=A2=E6=98=8E=E7=BB=86=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E7=A9=BA=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enforcement/AppEnfEnterpriseLawEnforcementController.java | 1 - .../enforcementcode/domain/bo/EnforcementRegistrationBo.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java index cbee3017..d816f5c4 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java @@ -37,7 +37,6 @@ public class AppEnfEnterpriseLawEnforcementController { /** * 执法端-执法预告列表 */ - @SaIgnore @PostMapping("/queryList") @ResponseBody public TableDataInfo queryList(@RequestBody EnterpriseLawEnforcementBo bo, PageQuery pageQuery) { diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java index 3014ca37..b3de5aab 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java @@ -208,7 +208,7 @@ public class EnforcementRegistrationBo extends BaseEntity { private String bureauDeptName; /** - * + *执法依据 */ private String lawEnforcementBasisText; From f9001ff7cd9fb8ab48ba2da20559e9d4a9ba8434 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: Tue, 26 May 2026 19:47:05 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zfjd-refactoring-v1/013-计划任务表设计.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql b/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql index ead67c23..4e2e434b 100644 --- a/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql +++ b/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql @@ -24,7 +24,7 @@ CREATE TABLE `efcode_cp_plan` `is_union` tinyint NOT NULL DEFAULT 1 COMMENT '是否联合执法:1=是,0=否', `union_bureau_dept_names` varchar(500) DEFAULT NULL COMMENT '联合执法单位(多个逗号分隔)', - `reserve_status` tinyint NOT NULL DEFAULT 0 COMMENT '预约状态:0=草稿,1=待预约(未发起联合),2=预约中,3=预约完成,4=重新预约中,5=待预约(还有位置可以加入)', + `reserve_status` tinyint NOT NULL DEFAULT 0 COMMENT '预约状态:0=草稿,1=待预约(未发起联合),2=预约中,3=预约完成,4=重新预约中,5=待预约(还有位置可以加入),6=待预约(人数已满)', `task_id` varchar(50) NULL DEFAULT '' COMMENT '任务id:空串表示还没生成任务', `system_reserved` tinyint NOT NULL DEFAULT 0 COMMENT '是否已经经过系统推荐预约:1=是,0=否', @@ -201,7 +201,7 @@ CREATE TABLE `efcode_cp_log` /*初始化数据*/ -INSERT INTO `efcode_cp_setting` (`id`, `setting_name`, `setting_value`, `remark`, `create_by`, `create_dept`) +/*INSERT INTO `efcode_cp_setting` (`id`, `setting_name`, `setting_value`, `remark`, `create_by`, `create_dept`) VALUES ('CP_SETTING_SUBMIT_DEADLINE', '下阶段计划提交最晚时间', '26', '每月几号前需提交下阶段计划<=', '0', '0'), ('CP_SETTING_AUTO_MATCH_START', '系统自动推荐匹配开始时间', '27', '系统自动推荐匹配的开始时间(号)=', '0', '0'), ('CP_SETTING_RESERVE_CANCEL_DURATION', '预约自动取消时长', '7', '发起预约后,如果多长时间没有处理,则自动取消', @@ -209,10 +209,10 @@ VALUES ('CP_SETTING_SUBMIT_DEADLINE', '下阶段计划提交最晚时间', '26', ('CP_SETTING_MANUAL_MATCH_DAYS', '手工匹配距计划开始天数', '3', '手工匹配距离计划开始的天数>=', '0', '0'), ('CP_MAX_UNION_UNIT', '单次联合单位最大数量', '3', '单次联合单位最大数量<=3', '0', '0'), ('CP_MAX_INNER_UNIT_AC_PERSON_NUM', '单位内部单次计划最多参与人数', '3', '单位内部单次计划最多参与人数<=3', '0', - '0'); + '0');*/ /*创建计划任务*/ -INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, +/*INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark) VALUES ('计划自动匹配预约', 'DEFAULT', @@ -223,4 +223,4 @@ VALUES ('计划自动匹配预约', '0', 'admin', NOW(), - '每天凌晨2点扫描待预约计划并自动匹配生成预约记录'); + '每天凌晨2点扫描待预约计划并自动匹配生成预约记录');*/ From 12be152162efceb46aa6c83b7afea46b48980808 Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 19:55:51 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E9=A2=84?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppEnfAccordingController.java | 3 +- ...EnfEnterpriseLawEnforcementController.java | 50 ++++++++++++++----- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfAccordingController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfAccordingController.java index 0b64c01c..4a30b2bc 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfAccordingController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfAccordingController.java @@ -41,7 +41,8 @@ public class AppEnfAccordingController extends BaseController { /** * 查询执依据告列表 */ - @SaCheckPermission("enforcementcode:zqyjjdm137344:list") + @SaIgnore + //@SaCheckPermission("enforcementcode:zqyjjdm137344:list") @GetMapping("/list") public TableDataInfo list(Zqyjjdm137344Bo bo, PageQuery pageQuery) { return zqyjjdm137344Service.queryPageList(bo, pageQuery); diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java index d816f5c4..6bd03375 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysUserService; import org.springframework.web.bind.annotation.*; @@ -37,29 +38,54 @@ public class AppEnfEnterpriseLawEnforcementController { /** * 执法端-执法预告列表 */ + @SaIgnore @PostMapping("/queryList") @ResponseBody public TableDataInfo queryList(@RequestBody EnterpriseLawEnforcementBo bo, PageQuery pageQuery) { - TableDataInfo rspData = enterpriseLawEnforcementService.selectEnterpriseLawEnforcementVoPageByBo(bo, pageQuery); + // 使用 DataPermissionHelper.ignore() 跳过数据权限检查,避免未登录时获取 LoginUser 报错 + TableDataInfo rspData = DataPermissionHelper.ignore(() -> + enterpriseLawEnforcementService.selectEnterpriseLawEnforcementVoPageByBo(bo, pageQuery) + ); List list = rspData.getRows(); + if (list == null || list.isEmpty()) { + return rspData; + } + for (EnterpriseLawEnforcementVo vo : list) { List userBeans = new ArrayList<>(); if (StringUtils.isNotEmpty(vo.getLawEnforcerTwoId())) { - Long[] userIds = Convert.toLongArray(vo.getLawEnforcerTwoId()); - List userIdList = java.util.Arrays.asList(userIds); - userBeans = sysUserService.selectUserByIds(userIdList, null); + try { + String[] userIdStrs = Convert.toStrArray(vo.getLawEnforcerTwoId()); + List userIdList = new ArrayList<>(); + for (String id : userIdStrs) { + try { + userIdList.add(Long.parseLong(id.trim())); + } catch (NumberFormatException e) { + log.warn("无效的用户ID格式: {}", id); + } + } + if (!userIdList.isEmpty()) { + userBeans = sysUserService.selectUserByIds(userIdList, null); + } + } catch (Exception e) { + log.error("解析执法人员ID失败: {}", vo.getLawEnforcerTwoId(), e); + } } String tmpUserShow = ""; - for (SysUserVo ub : userBeans) { - String temp = ub.getLawCertificateNum(); - if(StringUtils.isEmpty(temp)) { - temp = CommonUtil.encryptPhone(ub.getPhonenumber()); + if (userBeans != null && !userBeans.isEmpty()) { + for (SysUserVo ub : userBeans) { + if (ub != null) { + String temp = ub.getLawCertificateNum(); + if(StringUtils.isEmpty(temp)) { + temp = CommonUtil.encryptPhone(ub.getPhonenumber()); + } + tmpUserShow += ub.getUserName() +" "+ temp + ","; + } + } + if (tmpUserShow.length() > 0) { + tmpUserShow = tmpUserShow.substring(0, tmpUserShow.length()-1); } - tmpUserShow += ub.getUserName() +" "+ temp + ","; - } - if (tmpUserShow.length() > 0) { - tmpUserShow = tmpUserShow.substring(0, tmpUserShow.length()-1); } vo.setLawEnforcer2Show(tmpUserShow); From dae612e9a9c86201b4017f8e9ecb401ae9e7c2d4 Mon Sep 17 00:00:00 2001 From: niujiyi <18272501226@163.com> Date: Tue, 26 May 2026 20:41:07 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E6=89=A7=E6=B3=95=E7=AB=AF-=E9=A2=84?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enforcement/AppEnfEnterpriseLawEnforcementController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java index 6bd03375..2228de8e 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfEnterpriseLawEnforcementController.java @@ -41,7 +41,7 @@ public class AppEnfEnterpriseLawEnforcementController { @SaIgnore @PostMapping("/queryList") @ResponseBody - public TableDataInfo queryList(@RequestBody EnterpriseLawEnforcementBo bo, PageQuery pageQuery) { + public TableDataInfo queryList(@RequestBody EnterpriseLawEnforcementBo bo, @RequestBody PageQuery pageQuery) { // 使用 DataPermissionHelper.ignore() 跳过数据权限检查,避免未登录时获取 LoginUser 报错 TableDataInfo rspData = DataPermissionHelper.ignore(() -> enterpriseLawEnforcementService.selectEnterpriseLawEnforcementVoPageByBo(bo, pageQuery)