13 changed files with 2470 additions and 34 deletions
@ -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; |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
|
|||
@ -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(); |
|||
} |
|||
@ -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(); |
|||
} |
|||
File diff suppressed because it is too large
@ -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; |
|||
} |
|||
|
|||
|
|||
} |
|||
Loading…
Reference in new issue