package com.ruoyi.common.core.service.dto; import java.io.Serializable; /** * 一条「循环任务组计划」的滚动结果({@link com.ruoyi.common.core.service.ScheduleRollPort#rollOneSchedule} 的返回)。 * *

为什么需要它(第 9 步的关键设计说明)

* 任务组轮次滚动的核心 {@code rollOneSchedule} 要做一次 * ServiceSubtask 的全字段深拷贝: *
 * ServiceSubtask copy = JSON.parseObject(JSON.toJSONString(src), ServiceSubtask.class);
 * copy.setId(null); copy.setSenduuid(null); ... // 清 6 个字段
 * 
* 而 {@code ServiceSubtask} 有 116 个字段。 * 如果在两个模块之间传"116 字段的 DTO"来做这件事,字段映射本身就是巨大风险面 —— * 而且这个风险换不来任何收益(全字段拷贝的语义由 JSON 序列化保证,不需要我们逐字段搬运)。 * *

所以第 9 步的切分方式是: *

* *

本 DTO 只承载"用于日志与计数"的信息:原实现在滚动成功后打印 *

 * log.info("[任务组-滚动] scheduleId={} 推进到第 {} 轮, 新建 {} 条 subtask", scheduleId, nextLoop, produced);
 * 
* 但那个方法返回的是 {@code boolean},调度侧拿不到 nextLoop / produced。 * 搬迁后用本 DTO 把这两个值带出来,让 inhospvisit 能打出与原实现完全相同的日志。 */ public class VisitScheduleRollResultDto implements Serializable { private static final long serialVersionUID = 1L; /** 计划ID */ private Long scheduleId; /** 滚动后推进到的轮次号(原实现里的 {@code nextLoop = currentLoop + 1}) */ private Long nextLoop; /** 本轮新建的 subtask 条数(原实现里的 {@code produced}) */ private Integer produced; /** 是否真的推进了(原方法返回的 boolean) */ private boolean rolled; /** 未推进的原因(仅用于日志排查;推进成功时为 null) */ private String skipReason; public static VisitScheduleRollResultDto skipped(Long scheduleId, String reason) { VisitScheduleRollResultDto d = new VisitScheduleRollResultDto(); d.setScheduleId(scheduleId); d.setRolled(false); d.setSkipReason(reason); return d; } public static VisitScheduleRollResultDto rolled(Long scheduleId, long nextLoop, int produced) { VisitScheduleRollResultDto d = new VisitScheduleRollResultDto(); d.setScheduleId(scheduleId); d.setNextLoop(nextLoop); d.setProduced(produced); d.setRolled(true); return d; } public Long getScheduleId() { return scheduleId; } public void setScheduleId(Long scheduleId) { this.scheduleId = scheduleId; } public Long getNextLoop() { return nextLoop; } public void setNextLoop(Long nextLoop) { this.nextLoop = nextLoop; } public Integer getProduced() { return produced; } public void setProduced(Integer produced) { this.produced = produced; } public boolean isRolled() { return rolled; } public void setRolled(boolean rolled) { this.rolled = rolled; } public String getSkipReason() { return skipReason; } public void setSkipReason(String skipReason) { this.skipReason = skipReason; } }