Browse Source

外部接口生成计划

dev-V1.0.7
vincent 2 months ago
parent
commit
8374ed739d
  1. 47
      zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/common/util/DataFilterUtil.java
  2. 93
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/commonenum/ChannelNoEnums.java
  3. 186
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/externalInterface/LongGangInterfaceController.java
  4. 10
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpTask.java
  5. 108
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/externalInterface/LongGangCreateTaskBo.java
  6. 8
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpPlanService.java
  7. 150
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IOutEfcodeCpPlanService.java
  8. 122
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IOutEfcodeCpTaskService.java
  9. 17
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java
  10. 3
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java
  11. 1426
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/OutEfcodeCpPlanServiceImpl.java
  12. 328
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/OutEfcodeCpTaskServiceImpl.java
  13. 4
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpPlanMapper.xml

47
zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/common/util/DataFilterUtil.java

@ -664,6 +664,22 @@ public class DataFilterUtil {
return findOrganDeptByDeptId(srzDeptMapper, deptId, 0);
}
/**
* 根据部门ID(srz_dept.organizationid)递归查找 unitTypeCode=10 的市认证机构。
* <p>
* 从传入的 organizationId 开始,在 srz_dept 表中逐级向上查找父级,
* 直到找到 unitTypeCode="10" 的执法单位机构。
*
* @param organizationId 部门ID(srz_dept.organizationid)
* @return 市认证机构的 organizationId;未找到则返回 null
* @throws IllegalStateException 当 unitTypeCode=99 或递归超过4层时抛出
*/
public static SrzDeptVo getOrganIdByDeptId(String organizationId) {
SrzDeptMapper srzDeptMapper = SpringUtils.getBean(SrzDeptMapper.class);
SrzDeptVo organDept = findOrganDeptByDeptId(srzDeptMapper, organizationId, 0);
return organDept;
}
/**
* 根据 organizationId 递归查找 unitTypeCode=10 的执法单位
*
@ -783,8 +799,30 @@ public class DataFilterUtil {
if (StrUtil.isBlank(deptId)) {
return null;
}
return getBureauDeptByDeptId(deptId);
}
/**
* 根据部门ID查找对应的执法单位。
* <p>
* 逻辑:
* <ol>
* <li>用 deptId 查找 efcode_virtual_unit(按 sys_dept_id 匹配)</li>
* <li>若存在匹配记录,优先返回 vir_show_at_business='是' 的记录对应的 SysDeptVo;
* 若无 business 记录且只有一条匹配也直接返回</li>
* <li>若不存在匹配记录,通过 sys_dept 查找父节点,再用父节点 dept_id 重复上述查找</li>
* <li>递归向上最多查 5 层(自身 + 4 层父节点)</li>
* </ol>
*
* @param deptId 部门ID(sys_dept.dept_id)
* @return 对应的执法单位 SysDeptVo;如果向上 5 层仍未找到则返回 null
* @throws IllegalStateException 当某层匹配到多条 vir_show_at_business='是' 的记录,或多条匹配但无法确定唯一执法单位时抛出
*/
public static SysDeptVo getBureauDeptByDeptId(String deptId) {
if (StrUtil.isBlank(deptId)) {
return null;
}
// 2. 从当前 deptId 开始,向上查找 sys_dept 父链,最多查 5 层(自身 + 4 层父节点)
IEfcodeVirtualUnitService virtualUnitService = SpringUtils.getBean(IEfcodeVirtualUnitService.class);
ISysDeptService sysDeptService = SpringUtils.getBean(ISysDeptService.class);
@ -810,15 +848,13 @@ public class DataFilterUtil {
foundDeptId = businessUnits.get(0).getSysDeptId();
} else if (businessUnits.size() > 1) {
throw new IllegalStateException(
"用户(userId=" + userId + ")的部门(deptId=" + currentDeptId
"部门(deptId=" + currentDeptId
+ ")在虚拟单位表中匹配到多条 vir_show_at_business='是' 的记录,无法确定唯一执法单位");
} else if (allMatched.size() == 1) {
// 没有 business 记录,如果只有一条匹配则返回
foundDeptId = allMatched.get(0).getSysDeptId();
} else {
// 多条匹配但无 business 标记,无法确定唯一执法单位
throw new IllegalStateException(
"用户(userId=" + userId + ")的部门(deptId=" + currentDeptId
"部门(deptId=" + currentDeptId
+ ")在虚拟单位表中匹配到多条记录且无 vir_show_at_business='是',无法确定唯一执法单位");
}
@ -833,7 +869,6 @@ public class DataFilterUtil {
currentDeptId = dept.getParentId();
}
// 向上查找 4 层仍未找到对应的虚拟单位
return null;
}

93
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/commonenum/ChannelNoEnums.java

@ -0,0 +1,93 @@
package com.zdxt.enforcementcode.common.commonenum;
/**
* 渠道编号枚举定义
* <p>对应 efcode_cp_plan / efcode_cp_task 表的 channel_no 字段</p>
*/
public enum ChannelNoEnums {
/**
* 市局
*/
SHENZHEN("shenzhen", "市局"),
/**
* 龙岗
*/
LONGGANG("longgang", "龙岗"),
/**
* 龙华
*/
LONGHUA("longhua", "龙华");
private final String key;
private final String value;
ChannelNoEnums(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
/**
* 根据 key 获取 value
*
* @param key 渠道编号
* @return 渠道描述
*/
public static String getValueByKey(String key) {
if (key == null || key.isEmpty()) {
return "";
}
for (ChannelNoEnums channel : ChannelNoEnums.values()) {
if (channel.getKey().equals(key)) {
return channel.getValue();
}
}
return "";
}
/**
* 根据 value 获取 key
*
* @param value 渠道描述
* @return 渠道编号
*/
public static String getKeyByValue(String value) {
if (value == null || value.isEmpty()) {
return null;
}
for (ChannelNoEnums channel : ChannelNoEnums.values()) {
if (channel.getValue().equals(value)) {
return channel.getKey();
}
}
return null;
}
/**
* 判断 key 是否为合法渠道编号
*
* @param key 渠道编号
* @return true=合法, false=非法
*/
public static boolean isValid(String key) {
if (key == null || key.isEmpty()) {
return false;
}
for (ChannelNoEnums channel : ChannelNoEnums.values()) {
if (channel.getKey().equals(key)) {
return true;
}
}
return false;
}
}

186
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/externalInterface/LongGangInterfaceController.java

@ -2,15 +2,17 @@ package com.zdxt.enforcementcode.controller.externalInterface;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.util.StrUtil;
import com.zdxt.enforcementcode.common.util.DataFilterUtil;
import com.zdxt.enforcementcode.common.util.StringUtils;
import com.zdxt.enforcementcode.domain.EfcodeCpPlan;
import com.zdxt.enforcementcode.domain.SysApiPlatformConfigEntity;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpPlanBo;
import com.zdxt.enforcementcode.domain.bo.externalInterface.LongGangCreateTaskBo;
import com.zdxt.enforcementcode.domain.vo.EfcodeCpPlanVo;
import com.zdxt.enforcementcode.domain.vo.EnterpriseInformationVo;
import com.zdxt.enforcementcode.domain.vo.SrzDeptVo;
import com.zdxt.enforcementcode.domain.vo.externalInterface.LongGangCreateTaskVo;
import com.zdxt.enforcementcode.service.IEfcodeCpPlanService;
import com.zdxt.enforcementcode.service.IEfcodeCpTaskService;
import com.zdxt.enforcementcode.service.ISysApiPlatformConfigService;
import com.zdxt.enforcementcode.service.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
@ -18,9 +20,13 @@ import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.service.ISysDeptService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@SaIgnore
@Validated
@ -31,17 +37,38 @@ public class LongGangInterfaceController {
private static final String HEADER_APP_KEY = "X-App-Key";
private final IEfcodeCpPlanService planService;
private final IEfcodeCpTaskService taskService;
private final IOutEfcodeCpPlanService outEfcodeCpPlanService;
private final IOutEfcodeCpTaskService outEfcodeCpTaskService;
private final ISysApiPlatformConfigService sysApiPlatformConfigService;
private final IEnterpriseInformationService enterpriseInformationService;
private final ISysDeptService sysDeptService;
/**
* 外部接口-新增执法检查任务(龙岗渠道)
* <p>
* 通过 appKey 识别调用渠道,接收执法检查计划参数,完成以下流程:
* <ol>
* <li>渠道认证:校验 appKey 有效性,获取 channelNo</li>
* <li>部门校验:校验 deptId 在 sys_dept 中存在,并通过虚拟单位表查找所属执法单位(bureauDeptId)</li>
* <li>市认证机构映射:通过 deptId 在 srz_dept 中递归查找 unittypecode=10 的顶层机构(organId)</li>
* <li>企业匹配:通过 enterpriseNumber(统一社会信用代码)查询 enterprise_information 表,
* 存在则设置 enterpriseId,不存在则置空</li>
* <li>计划入库:通过 insertPlanOnly 插入执法计划(不触发自动任务生成)</li>
* <li>任务生成:调用 forceGenerateTask 生成检查任务,回写 plan.taskId 和 reserveStatus=3</li>
* </ol>
*
* @param appKey 请求头 X-App-Key,用于识别调用渠道
* @param bo 创建任务请求参数
* @return 包含 planId、taskId、outSerialNo 的响应结果
*/
@SaIgnore
@RepeatSubmit()
@Log(title = "外部接口-新增任务", businessType = BusinessType.INSERT)
@PostMapping("/createTask")
public R<LongGangCreateTaskVo> createTask(
@Log(title = "外部接口-新增计划", businessType = BusinessType.INSERT)
@PostMapping("/createPlan")
public R<LongGangCreateTaskVo> createPlan(
@RequestHeader(value = HEADER_APP_KEY, required = false) String appKey,
@Validated @RequestBody LongGangCreateTaskBo bo) {
// ========== 1. 渠道认证:校验 appKey 并获取 channelNo ==========
if (StrUtil.isBlank(appKey)) {
return R.fail("缺少请求头: " + HEADER_APP_KEY);
}
@ -56,20 +83,75 @@ public class LongGangInterfaceController {
return R.fail("渠道未配置 channelNo");
}
// ========== 流水号唯一校验:同一渠道下 outSerialNo 不可重复 ==========
if (StrUtil.isNotBlank(bo.getOutSerialNo())) {
EfcodeCpPlanBo queryBo = new EfcodeCpPlanBo();
queryBo.setOutSerialNo(bo.getOutSerialNo());
queryBo.setChannelNo(channelNo);
List<EfcodeCpPlanVo> existing = outEfcodeCpPlanService.queryList(queryBo);
if (!existing.isEmpty()) {
return R.fail("外部流水号重复: " + bo.getOutSerialNo());
}
}
// ========== 2. 部门校验:校验 deptId 在 sys_dept 表中存在 ==========
SysDeptVo deptVo = sysDeptService.selectDeptById(bo.getDeptId());
if (deptVo == null) {
return R.fail("部门不存在: " + bo.getDeptId());
}
// ========== 3. 市认证机构映射:通过 deptId(srz_dept.organizationid) 递归查找 unittypecode=10 的执法机构 ==========
SrzDeptVo srzDeptVo = DataFilterUtil.getOrganIdByDeptId(bo.getDeptId());
// ========== 4. 执法单位查找:通过虚拟单位表向上查找所属执法单位(zone!=0 且 zone!=2) ==========
SysDeptVo bureauDeptVo = DataFilterUtil.getBureauDeptByDeptId(bo.getDeptId());
if (bureauDeptVo == null) {
return R.fail("执法单位不存在");
}
// ========== 5. 企业匹配:通过统一社会信用代码查询 enterprise_information 表 ==========
EnterpriseInformationVo enterprise = enterpriseInformationService.queryByEnterpriseNumber(bo.getEnterpriseNumber());
String enterpriseId;
if (enterprise != null) {
enterpriseId = enterprise.getId();
} else {
enterpriseId = "";
}
// ========== 6. 构建计划对象并设置默认值 ==========
EfcodeCpPlanBo planBo = MapstructUtils.convert(bo, EfcodeCpPlanBo.class);
planBo.setChannelNo(channelNo);
if(StringUtils.isEmpty(bo.getTaskId())){
planBo.setTaskId("");
}
planBo.setReserveStatus(0L);
planBo.setSystemReserved(0L);
planBo.setManualReserved(0L);
planBo.setIsDelete(0L);
planBo.setEnforceUserCodes("-");
// 设置执法单位(bureauDeptId 来自 sys_dept,是本地系统的局级执法单位)
planBo.setBureauDeptId(bureauDeptVo.getDeptId());
planBo.setBureauDeptName(bureauDeptVo.getDeptName());
// 设置企业ID(存在则取主键,不存在则置空)
planBo.setEnterpriseId(enterpriseId);
// 设置市认证机构(organId 来自 srz_dept,是市认证系统的顶层执法单位)
if(srzDeptVo != null){
planBo.setOrganId(srzDeptVo.getOrganizationid());
planBo.setOrganName(srzDeptVo.getName());
}else{
planBo.setOrganId("");
planBo.setOrganName("");
}
planService.insertByBo(planBo);
// ========== 7. 计划入库:仅插入计划,不触发 afterInsert 中的自动任务生成 ==========
outEfcodeCpPlanService.insertPlanOnly(planBo);
EfcodeCpPlanVo planVo = planService.queryById(planBo.getId());
// ========== 8. 生成任务:创建 task 记录,回写 plan.taskId 和 plan.reserveStatus=3 ==========
EfcodeCpPlanVo planVo = outEfcodeCpPlanService.queryById(planBo.getId());
EfcodeCpPlan plan = MapstructUtils.convert(planVo, EfcodeCpPlan.class);
String taskId = taskService.forceGenerateTask(plan);
String taskId = outEfcodeCpTaskService.forceGenerateTask(plan);
// ========== 9. 构建返回结果 ==========
LongGangCreateTaskVo vo = new LongGangCreateTaskVo();
vo.setPlanId(planBo.getId());
vo.setTaskId(taskId);
@ -79,4 +161,86 @@ public class LongGangInterfaceController {
appKey, channelNo, planBo.getId(), taskId);
return R.ok(vo);
}
/**
* 外部接口-修改执法检查计划
* <p>
* 通过 planId 定位已有计划,校验状态后更新字段。
* 仅 reserveStatus=0(草稿) 或 1(待预约) 的计划允许修改。
*
* @param appKey 请求头 X-App-Key,用于识别调用渠道
* @param bo 修改计划请求参数(planId 必填)
* @return 修改结果
*/
@SaIgnore
@RepeatSubmit()
@Log(title = "外部接口-修改计划", businessType = BusinessType.UPDATE)
@PostMapping("/updatePlan")
public R<Void> updatePlan(
@RequestHeader(value = HEADER_APP_KEY, required = false) String appKey,
@Validated @RequestBody LongGangCreateTaskBo bo) {
// ========== 1. 渠道认证 ==========
if (StrUtil.isBlank(appKey)) {
return R.fail("缺少请求头: " + HEADER_APP_KEY);
}
SysApiPlatformConfigEntity consumer = sysApiPlatformConfigService.findByAppKey(appKey).orElse(null);
if (consumer == null) {
return R.fail("无效的 appKey");
}
String channelNo = consumer.getChannelNo();
if (StrUtil.isBlank(channelNo)) {
return R.fail("渠道未配置 channelNo");
}
// ========== 2. 校验 planId ==========
if (StrUtil.isBlank(bo.getPlanId())) {
return R.fail("计划ID不能为空");
}
EfcodeCpPlanVo existingPlan = outEfcodeCpPlanService.queryById(bo.getPlanId());
if (existingPlan == null) {
return R.fail("计划不存在: " + bo.getPlanId());
}
// 仅草稿(0)和待预约(1)状态允许修改
// Long reserveStatus = existingPlan.getReserveStatus();
// if (reserveStatus == null || (reserveStatus != 0L && reserveStatus != 1L)) {
// return R.fail("当前计划状态不允许修改");
// }
// ========== 3. 部门校验 ==========
SysDeptVo deptVo = sysDeptService.selectDeptById(bo.getDeptId());
if (deptVo == null) {
return R.fail("部门不存在: " + bo.getDeptId());
}
SrzDeptVo srzDeptVo = DataFilterUtil.getOrganIdByDeptId(bo.getDeptId());
SysDeptVo bureauDeptVo = DataFilterUtil.getBureauDeptByDeptId(bo.getDeptId());
if (bureauDeptVo == null) {
return R.fail("执法单位不存在");
}
// ========== 4. 企业匹配 ==========
EnterpriseInformationVo enterprise = enterpriseInformationService.queryByEnterpriseNumber(bo.getEnterpriseNumber());
String enterpriseId = (enterprise != null) ? enterprise.getId() : "";
// ========== 5. 构建更新对象 ==========
EfcodeCpPlanBo planBo = MapstructUtils.convert(bo, EfcodeCpPlanBo.class);
planBo.setId(bo.getPlanId());
planBo.setChannelNo(channelNo);
planBo.setBureauDeptId(bureauDeptVo.getDeptId());
planBo.setBureauDeptName(bureauDeptVo.getDeptName());
planBo.setEnterpriseId(enterpriseId);
if (srzDeptVo != null) {
planBo.setOrganId(srzDeptVo.getOrganizationid());
planBo.setOrganName(srzDeptVo.getName());
} else {
planBo.setOrganId("");
planBo.setOrganName("");
}
// ========== 6. 执行更新 ==========
outEfcodeCpPlanService.updateByBo(planBo);
log.info("[外部接口] 修改计划, appKey={}, channelNo={}, planId={}",
appKey, channelNo, bo.getPlanId());
return R.ok();
}
}

10
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpTask.java

@ -37,6 +37,16 @@ public class EfcodeCpTask extends BaseEntity {
*/
private String bureauDeptId;
/**
* 渠道编号 shenzhen|市局,longgang|龙岗,longhua|龙华
*/
private String channelNo;
/**
* 外部流水号
*/
private String outSerialNo;
/** 预约是否已读 0:未读 1:已读 */
private int isRead;
}

108
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/externalInterface/LongGangCreateTaskBo.java

@ -1,68 +1,152 @@
package com.zdxt.enforcementcode.domain.bo.externalInterface;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpPlanBo;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.Date;
/**
* 外部接口-新增任务请求参数(龙岗渠道)
*/
@Data
@AutoMapper(target = EfcodeCpPlanBo.class)
public class LongGangCreateTaskBo {
/**
* 计划ID(修改时必传,新增时不传)
*/
private String planId;
/**
* 计划类别:1=日常计划,2=专项计划
*/
@NotNull(message = "计划类别不能为空")
private Long planType;
/**
* 计划执行日期(如 2025-05-08)
*/
@NotNull(message = "计划执行日期不能为空")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date planDate;
/**
* 执行时段:1=上午,2=下午,3=其他
*/
@NotNull(message = "执行时段不能为空")
private Long planTime;
/**
* 执法事项(最多1000字)
*/
@NotBlank(message = "执法事项不能为空")
private String enforceContent;
/**
* 被检查企业/机构名称
*/
@NotBlank(message = "企业名称不能为空")
private String enterpriseName;
/**
* 被检查企业/机构统一社会信用代码
*/
@NotBlank(message = "企业信用代码不能为空")
private String enterpriseNumber;
private String enterpriseId;
// /**
// * 被检查企业/机构ID(系统内主键)
// */
// private String enterpriseId;
/**
* 企业联系人
*/
private String contactPerson;
/**
* 企业联系电话
*/
private String contactPhone;
/**
* 执法人员姓名(多个逗号分隔)
*/
@NotBlank(message = "执法人员姓名不能为空")
private String enforceUserNames;
/**
* 执法人员ID(多个逗号分隔,与 enforceUserNames 顺序对应)
*/
@NotBlank(message = "执法人员ID不能为空")
private String enforceUserIds;
private String enforceUserCodes;
/**
* 执法人员证件号码、电话号码,有执法证件号传证件号,没有证件号传手机号码,手机号码中间4位脱敏(多个逗号分隔,与 enforceUserNames 顺序对应)
*/
private String enforceUserTels;
/**
* 是否公开:1=是,0=否(默认0)
*/
private Long isPublic = 0L;
/**
* 是否联合执法:1=是,0=否(默认0)
*/
private Long isUnion = 0L;
@NotBlank(message = "执法单位ID不能为空")
private String bureauDeptId;
@NotBlank(message = "执法单位名称不能为空")
private String bureauDeptName;
private String organId;
private String organName;
// /**
// * 执法单位ID
// */
// @NotBlank(message = "执法单位ID不能为空")
// private String bureauDeptId;
//
// /**
// * 执法单位名称
// */
// @NotBlank(message = "执法单位名称不能为空")
// private String bureauDeptName;
// /**
// * 市认证机构ID
// */
// private String organId;
//
// /**
// * 市认证机构名称
// */
// private String organName;
/**
* 市认证部门ID
*/
@NotBlank(message = "部门ID不能为空")
private String deptId;
/**
* 市认证部门名称
*/
@NotBlank(message = "部门名称不能为空")
private String deptName;
/**
* 备注
*/
private String remark;
/**
* 外部流水号(调用方自定义,用于幂等/对账)
*/
private String outSerialNo;
/**
* 任务id:空串表示还没生成任务
*/
private String taskId;
}

8
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpPlanService.java

@ -52,6 +52,14 @@ public interface IEfcodeCpPlanService {
*/
Boolean insertByBo(EfcodeCpPlanBo bo);
/**
* 外部接口专用:仅插入计划记录,不触发后置任务生成逻辑
*
* @param bo 行政执法检查计划-计划
* @return 是否新增成功
*/
Boolean insertPlanOnly(EfcodeCpPlanBo bo);
/**
* 修改行政执法检查计划-计划
*

150
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IOutEfcodeCpPlanService.java

@ -0,0 +1,150 @@
package com.zdxt.enforcementcode.service;
import com.zdxt.enforcementcode.domain.EfcodeCpReserve;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpPlanBo;
import com.zdxt.enforcementcode.domain.vo.EfcodeCpPlanVo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 行政执法检查计划-计划Service接口
*
* @author Lion Li
* @date 2026-05-17
*/
public interface IOutEfcodeCpPlanService {
/**
* 查询行政执法检查计划-计划
*
* @param id 主键
* @return 行政执法检查计划-计划
*/
EfcodeCpPlanVo queryById(String id);
/**
* 分页查询行政执法检查计划-计划列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 行政执法检查计划-计划分页列表
*/
TableDataInfo<EfcodeCpPlanVo> queryPageList(EfcodeCpPlanBo bo, PageQuery pageQuery);
/**
* 查询符合条件的行政执法检查计划-计划列表
*
* @param bo 查询条件
* @return 行政执法检查计划-计划列表
*/
List<EfcodeCpPlanVo> queryList(EfcodeCpPlanBo bo);
/**
* 新增行政执法检查计划-计划
*
* @param bo 行政执法检查计划-计划
* @return 是否新增成功
*/
Boolean insertByBo(EfcodeCpPlanBo bo);
/**
* 外部接口专用:仅插入计划记录,不触发后置任务生成逻辑
*
* @param bo 行政执法检查计划-计划
* @return 是否新增成功
*/
Boolean insertPlanOnly(EfcodeCpPlanBo bo);
/**
* 修改行政执法检查计划-计划
*
* @param bo 行政执法检查计划-计划
* @return 是否修改成功
*/
Boolean updateByBo(EfcodeCpPlanBo bo);
/**
* 分页查询其他计划列表(本单位公开+不公开计划 + 其他单位公开计划,仅待预约状态)
*
* @param bo 搜索条件
* @param pageQuery 分页参数
* @param bureauDeptId 当前用户的执法单位ID
* @return 计划分页列表
*/
TableDataInfo<EfcodeCpPlanVo> queryOtherPageList(EfcodeCpPlanBo bo, PageQuery pageQuery, String bureauDeptId);
/**
* 分页查询重叠计划列表:查找与当前用户计划同一时间段、同一企业的其他用户的计划
*
* @param bo 搜索条件
* @param pageQuery 分页参数
* @param bureauDeptId 当前用户的执法单位ID
* @return 计划分页列表
*/
TableDataInfo<EfcodeCpPlanVo> queryOverlapPageList(EfcodeCpPlanBo bo, PageQuery pageQuery, String bureauDeptId);
/**
* 校验并批量删除行政执法检查计划-计划信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
/**
* 计划自动匹配预约(定时任务调用)
* <p>扫描待预约状态的计划,按规则自动匹配并生成预约记录</p>
*
* @param forceMatch 是否强制匹配(忽略 CP_SETTING_AUTO_MATCH_START 日期校验)
* @param updatePlan 是否更新计划记录(system_reserved、reserve_status)
* @param insertReserve 是否将预约记录插入数据库;为false时仅计算匹配结果不落库
* @return 按 planGroupId 分组的预约记录列表(key=planGroupId, value=该组预约记录)
*/
//Map<String, List<EfcodeCpReserve>> autoMatchReserve(boolean forceMatch, boolean updatePlan, boolean insertReserve);
@Transactional(rollbackFor = Exception.class)
Map<String, List<EfcodeCpReserve>> autoMatchReserveV3(boolean forceMatch, boolean updatePlan, boolean insertReserve);
/**
* 计划自动匹配预约V2(定时任务调用)
* <p>扫描待预约状态的计划,按自然周分组匹配,超出最大联合数量时拆分多组</p>
*
* @param forceMatch 是否强制匹配(忽略 CP_SETTING_AUTO_MATCH_START 日期校验)
* @param updatePlan 是否更新计划记录(system_reserved、reserve_status)
* @param insertReserve 是否将预约记录插入数据库;为false时仅计算匹配结果不落库
* @return 按 planGroupId 分组的预约记录列表
*/
//Map<String, List<EfcodeCpReserve>> autoMatchReserveV2(boolean forceMatch, boolean updatePlan, boolean insertReserve);
/**
* 计划到期自动生成任务
* <p>距计划执行日期 <= CP_SETTING_MANUAL_MATCH_DAYS 天时,
* 系统自动取消剩余未处理的预约(含系统匹配与手动预约),并为计划生成任务。</p>
*
* @return 处理的计划数量
*/
int processPlanDeadlineAutoGenTask();
/**
* 计划到期自动生成任务(支持忽略时间)
*
* @param ignoreTime true=忽略时间窗口限制,处理所有未生成任务的计划;false=仅处理到期窗口内的计划
* @return 处理的计划数量
*/
int processPlanDeadlineAutoGenTask(boolean ignoreTime);
/**
* 取消超出自动匹配时间的联合执法计划
* <p>当计划的自动匹配期限(计划所在周起始日 + systemMatchWeeks 周)已过期,
* 且仍处于联合执法状态(isUnion=1),则将 isUnion 置为 0 取消联合。</p>
*
* @return 被取消联合的计划数量
*/
int updateIsUnion();
}

122
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IOutEfcodeCpTaskService.java

@ -0,0 +1,122 @@
package com.zdxt.enforcementcode.service;
import com.zdxt.enforcementcode.domain.EfcodeCpPlan;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpTaskBo;
import com.zdxt.enforcementcode.domain.vo.EfcodeCpTaskVo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 行政执法检查计划-任务Service接口
*
* @author Lion Li
* @date 2026-05-17
*/
public interface IOutEfcodeCpTaskService {
/**
* 查询行政执法检查计划-任务
*
* @param id 主键
* @return 行政执法检查计划-任务
*/
EfcodeCpTaskVo queryById(String id);
/**
* 分页查询行政执法检查计划-任务列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 行政执法检查计划-任务分页列表
*/
TableDataInfo<EfcodeCpTaskVo> queryPageList(EfcodeCpTaskBo bo, PageQuery pageQuery);
/**
* 查询符合条件的行政执法检查计划-任务列表
*
* @param bo 查询条件
* @return 行政执法检查计划-任务列表
*/
List<EfcodeCpTaskVo> queryList(EfcodeCpTaskBo bo);
/**
* 新增行政执法检查计划-任务
*
* @param bo 行政执法检查计划-任务
* @return 是否新增成功
*/
Boolean insertByBo(EfcodeCpTaskBo bo);
/**
* 修改行政执法检查计划-任务
*
* @param bo 行政执法检查计划-任务
* @return 是否修改成功
*/
Boolean updateByBo(EfcodeCpTaskBo bo);
Boolean updateIsRead(String taskId);
/**
* 校验并批量删除行政执法检查计划-任务信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
/**
* 查询我的任务列表(通过计划表关联,筛选当前用户参与的任务)
*
* @param userId 当前用户ID
* @param planDate 计划执行日期(可为null)
* @return 任务列表
*/
List<EfcodeCpTaskVo> queryMyTaskList(Long userId, Date planDate,String searchValue);
/**
* 查询指定月份中有任务的日期列表(用于日历打点)
*
* @param userId 当前用户ID
* @param yearMonth 年月,格式如 "2026-03"
* @return 日期字符串列表
*/
List<String> queryMyTaskDates(Long userId, String yearMonth);
/**
* 查询我的任务详情(通过 planId 查询任务+计划完整信息)
*
* @param planId 计划ID
* @return 任务详情
*/
EfcodeCpTaskVo queryMyTaskDetail(String planId);
/**
* 批量查询关联计划信息(用于列表页第二次请求加载联合执法关联单位信息)
*
* @param planIds 计划ID列表(通常为isUnion=1的任务对应的planId)
* @return Map: key=planId, value=该计划关联的其他单位信息
*/
Map<String, List<EfcodeCpTaskVo.AssociatedPlan>> queryAssociatedPlansBatch(List<String> planIds);
/**
* 强制创建任务(忽略其他条件),根据计划信息直接生成任务记录并回写 plan.task_id
*
* @param plan 来源计划
* @return 新建任务ID
*/
String forceGenerateTask(EfcodeCpPlan plan);
/**
* 统计当前登录用户的执任务未读个数
*
* @return 未读执法任务数量
*/
Long countUnreadTasksForCurrentUser();
}

17
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java

@ -1,5 +1,6 @@
package com.zdxt.enforcementcode.service.impl;
import com.zdxt.enforcementcode.common.commonenum.ChannelNoEnums;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -360,6 +361,20 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService {
return flag;
}
@Transactional(rollbackFor = Exception.class)
@Override
public Boolean insertPlanOnly(EfcodeCpPlanBo bo) {
EfcodeCpPlan add = MapstructUtils.convert(bo, EfcodeCpPlan.class);
fillContactInfo(add);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
syncPlanUsers(add.getId(), bo.getEnforceUserIds(), bo.getEnforceUserNames(), bo.getEnforceUserTels());
}
return flag;
}
/**
* 修改行政执法检查计划-计划
*
@ -792,7 +807,7 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService {
lqw.eq(EfcodeCpPlan::getIsPublic, 1L);
lqw.eq(EfcodeCpPlan::getIsUnion, 1L);
lqw.eq(EfcodeCpPlan::getIsDelete, 0L);
lqw.eq(EfcodeCpPlan::getChannelNo, "0");
lqw.eq(EfcodeCpPlan::getChannelNo, ChannelNoEnums.SHENZHEN.getKey());
lqw.isNotNull(EfcodeCpPlan::getCreateBy);
lqw.orderByAsc(EfcodeCpPlan::getPlanDate);
List<EfcodeCpPlan> pendingPlans = baseMapper.selectList(lqw);

3
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java

@ -1,6 +1,7 @@
package com.zdxt.enforcementcode.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zdxt.enforcementcode.common.commonenum.ChannelNoEnums;
import com.zdxt.enforcementcode.common.commonenum.MsgSourceTypeEnum;
import com.zdxt.enforcementcode.common.commonenum.PlatformTypeEnums;
import com.zdxt.enforcementcode.domain.EfcodeCpTask;
@ -200,7 +201,7 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService {
if (targetPlan == null) {
return R.fail("目标计划不存在");
}
if (!"0".equals(targetPlan.getChannelNo())) {//只有市司法局的计划支持预约
if (!ChannelNoEnums.SHENZHEN.getKey().equals(targetPlan.getChannelNo())) {//只有市司法局的计划支持预约
return R.fail("该渠道的计划不支持预约");
}
// 1.1 校验目标计划状态:只有待预约(1)、已取消(4)、预约中可加入(5)的计划才允许预约

1426
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/OutEfcodeCpPlanServiceImpl.java

File diff suppressed because it is too large

328
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/OutEfcodeCpTaskServiceImpl.java

@ -0,0 +1,328 @@
package com.zdxt.enforcementcode.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zdxt.enforcementcode.common.commonenum.PlatformTypeEnums;
import com.zdxt.enforcementcode.domain.EfcodeCpPlan;
import com.zdxt.enforcementcode.domain.EfcodeCpTask;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpTaskBo;
import com.zdxt.enforcementcode.domain.vo.EfcodeCpTaskVo;
import com.zdxt.enforcementcode.mapper.EfcodeCpPlanMapper;
import com.zdxt.enforcementcode.mapper.EfcodeCpTaskMapper;
import com.zdxt.enforcementcode.service.IEfcodeCpTaskService;
import com.zdxt.enforcementcode.service.IOutEfcodeCpTaskService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MapstructUtils;
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.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* 行政执法检查计划-任务Service业务层处理
*
* @author Lion Li
* @date 2026-05-17
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class OutEfcodeCpTaskServiceImpl implements IOutEfcodeCpTaskService {
private final EfcodeCpTaskMapper baseMapper;
private final EfcodeCpPlanMapper cpPlanMapper;
/**
* 查询行政执法检查计划-任务
*
* @param id 主键
* @return 行政执法检查计划-任务
*/
@Override
public EfcodeCpTaskVo queryById(String id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询行政执法检查计划-任务列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 行政执法检查计划-任务分页列表
*/
@Override
public TableDataInfo<EfcodeCpTaskVo> queryPageList(EfcodeCpTaskBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<EfcodeCpTask> lqw = buildQueryWrapper(bo);
Page<EfcodeCpTaskVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的行政执法检查计划-任务列表
*
* @param bo 查询条件
* @return 行政执法检查计划-任务列表
*/
@Override
public List<EfcodeCpTaskVo> queryList(EfcodeCpTaskBo bo) {
LambdaQueryWrapper<EfcodeCpTask> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<EfcodeCpTask> buildQueryWrapper(EfcodeCpTaskBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<EfcodeCpTask> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(EfcodeCpTask::getId);
lqw.like(StringUtils.isNotBlank(bo.getTaskName()), EfcodeCpTask::getTaskName, bo.getTaskName());
lqw.eq(StringUtils.isNotBlank(bo.getBureauDeptId()), EfcodeCpTask::getBureauDeptId, bo.getBureauDeptId());
return lqw;
}
/**
* 新增行政执法检查计划-任务
*
* @param bo 行政执法检查计划-任务
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(EfcodeCpTaskBo bo) {
EfcodeCpTask add = MapstructUtils.convert(bo, EfcodeCpTask.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改行政执法检查计划-任务
*
* @param bo 行政执法检查计划-任务
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(EfcodeCpTaskBo bo) {
EfcodeCpTask update = MapstructUtils.convert(bo, EfcodeCpTask.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 修改任务已读状态
*
* @param taskId 任务ID
* @return 是否修改成功
*/
@Override
public Boolean updateIsRead(String taskId) {
LambdaUpdateWrapper<EfcodeCpTask> wrapper = Wrappers.lambdaUpdate();
wrapper.eq(EfcodeCpTask::getId, taskId)
.set(EfcodeCpTask::getIsRead, 1)
.set(EfcodeCpTask::getUpdateBy, LoginHelper.getUserId())
.set(EfcodeCpTask::getUpdateTime, new Date());
return baseMapper.update(null, wrapper) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(EfcodeCpTask entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 验证是否符合生成任务的条件
* <p>校验预约分组内所有记录是否满足生成执法任务的前置条件</p>
*
* @param planGroupId 计划分组ID
* @return true=符合生成条件, false=不符合
*/
public boolean checkCanGenerateTask(String planGroupId) {
// TODO 后续实现:校验分组内预约状态、时间窗口、人员配置等前置条件
return true;
}
/**
* 查询我的任务列表
*/
@Override
public List<EfcodeCpTaskVo> queryMyTaskList(Long userId, Date planDate,String searchValue) {
return baseMapper.selectMyTaskList(userId, planDate,searchValue);
}
/**
* 查询指定月份中有任务的日期列表
*/
@Override
public List<String> queryMyTaskDates(Long userId, String yearMonth) {
return baseMapper.selectMyTaskDates(userId, yearMonth);
}
/**
* 查询我的任务详情
*/
@Override
public EfcodeCpTaskVo queryMyTaskDetail(String planId) {
EfcodeCpTaskVo detail = baseMapper.selectMyTaskDetail(planId);
if (detail == null || StringUtils.isBlank(detail.getId())) {
return detail;
}
// 查询同一 task_id 下其他单位的计划(排除当前 planId)
List<EfcodeCpPlan> otherPlans = cpPlanMapper.selectList(
Wrappers.<EfcodeCpPlan>lambdaQuery()
.eq(EfcodeCpPlan::getTaskId, detail.getId())
.ne(EfcodeCpPlan::getId, planId)
.eq(EfcodeCpPlan::getIsDelete, 0L)
);
if (otherPlans != null && !otherPlans.isEmpty()) {
List<EfcodeCpTaskVo.AssociatedPlan> associated = new ArrayList<>();
for (EfcodeCpPlan p : otherPlans) {
EfcodeCpTaskVo.AssociatedPlan ap = new EfcodeCpTaskVo.AssociatedPlan();
ap.setBureauDeptName(p.getBureauDeptName());
ap.setEnforceUserNames(p.getEnforceUserNames());
ap.setEnforceUserTels(p.getEnforceUserTels());
ap.setEnforceContent(p.getEnforceContent());
associated.add(ap);
}
detail.setAssociatedPlans(associated);
}
return detail;
}
/**
* 批量查询关联计划信息(用于列表页第二次请求加载联合执法关联单位信息)
*/
@Override
public Map<String, List<EfcodeCpTaskVo.AssociatedPlan>> queryAssociatedPlansBatch(List<String> planIds) {
Map<String, List<EfcodeCpTaskVo.AssociatedPlan>> result = new HashMap<>();
if (planIds == null || planIds.isEmpty()) {
return result;
}
// 1. 查询这些planId对应的计划,获取各自的taskId
List<EfcodeCpPlan> sourcePlans = cpPlanMapper.selectList(
Wrappers.<EfcodeCpPlan>lambdaQuery()
.in(EfcodeCpPlan::getId, planIds)
.eq(EfcodeCpPlan::getIsDelete, 0L)
.isNotNull(EfcodeCpPlan::getTaskId)
);
if (sourcePlans == null || sourcePlans.isEmpty()) {
return result;
}
// 2. 收集所有taskId,并建立 planId -> taskId 的映射
Map<String, String> planToTask = new HashMap<>();
List<String> taskIds = new ArrayList<>();
for (EfcodeCpPlan p : sourcePlans) {
planToTask.put(p.getId(), p.getTaskId());
if (!taskIds.contains(p.getTaskId())) {
taskIds.add(p.getTaskId());
}
}
// 3. 查询所有相关taskId下的计划(排除当前用户的planId)
List<EfcodeCpPlan> allRelatedPlans = cpPlanMapper.selectList(
Wrappers.<EfcodeCpPlan>lambdaQuery()
.in(EfcodeCpPlan::getTaskId, taskIds)
.notIn(EfcodeCpPlan::getId, planIds)
.eq(EfcodeCpPlan::getIsDelete, 0L)
);
if (allRelatedPlans == null || allRelatedPlans.isEmpty()) {
return result;
}
// 4. 按taskId分组
Map<String, List<EfcodeCpPlan>> groupedByTask = allRelatedPlans.stream()
.collect(Collectors.groupingBy(EfcodeCpPlan::getTaskId));
// 5. 映射回各planId
for (Map.Entry<String, String> entry : planToTask.entrySet()) {
String planId = entry.getKey();
String taskId = entry.getValue();
List<EfcodeCpPlan> otherPlans = groupedByTask.get(taskId);
if (otherPlans != null && !otherPlans.isEmpty()) {
List<EfcodeCpTaskVo.AssociatedPlan> associated = new ArrayList<>();
for (EfcodeCpPlan p : otherPlans) {
EfcodeCpTaskVo.AssociatedPlan ap = new EfcodeCpTaskVo.AssociatedPlan();
ap.setBureauDeptName(p.getBureauDeptName());
ap.setEnforceUserNames(p.getEnforceUserNames());
ap.setEnforceUserTels(p.getEnforceUserTels());
ap.setEnforceContent(p.getEnforceContent());
associated.add(ap);
}
result.put(planId, associated);
}
}
return result;
}
/**
* 强制创建任务(忽略其他条件),根据计划信息直接生成任务记录并回写 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());
task.setChannelNo(plan.getChannelNo());
task.setOutSerialNo(plan.getOutSerialNo());
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();
}
/**
* 校验并批量删除行政执法检查计划-任务信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 统计当前用户未读任务数量
*/
@Override
public Long countUnreadTasksForCurrentUser() {
Integer platformType = LoginHelper.getPlatformType();
Long userId = LoginHelper.getUserId();
// 默认来源类型:执法任务
final Integer sourceType = 4;
// 执法端:根据用户ID统计
if (PlatformTypeEnums.ENFORCEMENT.getKey().equals(platformType)) {
if (userId == null) {
log.warn("当前用户未登录,无法统计未读执法任务消息");
return 0L;
}
return baseMapper.countTasksForCurrentUser(userId,sourceType);
}
return 0L;
}
}

4
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpPlanMapper.xml

@ -20,7 +20,7 @@
<where>
reserve_status in (1,4,5)
AND is_delete = 0
AND channel_no = '0'
AND channel_no = 'shenzhen'
<if test="currentUserId != null">
AND create_by != #{currentUserId}
<!-- 排除当前用户已预约的计划(活跃状态:1=同意, 3=待确认) -->
@ -74,7 +74,7 @@
<where>
cp.is_delete = 0
and cp.reserve_status!=2
AND cp.channel_no = '0'
AND cp.channel_no = 'shenzhen'
<!-- 排除当前用户自己的计划 -->
<if test="currentUserId != null">
AND cp.create_by != #{currentUserId}

Loading…
Cancel
Save