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 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentYear }}年{{ currentMonth }}月
+
+
+
+
+
+
+
+
+
+
+
+ {{ cell.day }}
+ {{ cell.lunar }}
+
+
+
+
+
+
+
+ 今天共 {{ taskList.length }} 个任务
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ getTimeStart(item) }}
+
{{ getTimeEnd(item) }}
+
+
+
+ {{ item.enforceContent }}
+ 联
+
+
+
+ {{ item.enterpriseName }}
+
+
+
+ {{ formatPlanDate(item) }} {{ getTimeRange(item) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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)