|
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.dromara.common.core.exception.ServiceException;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
@@ -17,6 +18,7 @@ import org.dromara.risk.mapper.RiskWorkReportMapper;
|
|
|
import org.dromara.risk.service.IRiskWorkReportService;
|
|
import org.dromara.risk.service.IRiskWorkReportService;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
|
@@ -96,9 +98,11 @@ public class RiskWorkReportServiceImpl implements IRiskWorkReportService {
|
|
|
}
|
|
}
|
|
|
// 上报时间前端不传时取当前时间
|
|
// 上报时间前端不传时取当前时间
|
|
|
if (bo.getReportTime() == null) {
|
|
if (bo.getReportTime() == null) {
|
|
|
- bo.setReportTime(new java.util.Date());
|
|
|
|
|
|
|
+ bo.setReportTime(new Date());
|
|
|
}
|
|
}
|
|
|
RiskWorkReport add = MapstructUtils.convert(bo, RiskWorkReport.class);
|
|
RiskWorkReport add = MapstructUtils.convert(bo, RiskWorkReport.class);
|
|
|
|
|
+ // 联动计算:工期 + 开始时间 → 结束时间 / 开始时间 + 结束时间 → 工期
|
|
|
|
|
+ syncWorkPeriod(add);
|
|
|
int row = baseMapper.insert(add);
|
|
int row = baseMapper.insert(add);
|
|
|
bo.setId(add.getId());
|
|
bo.setId(add.getId());
|
|
|
return row;
|
|
return row;
|
|
@@ -119,9 +123,57 @@ public class RiskWorkReportServiceImpl implements IRiskWorkReportService {
|
|
|
@Override
|
|
@Override
|
|
|
public int updateByBo(RiskWorkReportBo bo) {
|
|
public int updateByBo(RiskWorkReportBo bo) {
|
|
|
RiskWorkReport update = MapstructUtils.convert(bo, RiskWorkReport.class);
|
|
RiskWorkReport update = MapstructUtils.convert(bo, RiskWorkReport.class);
|
|
|
|
|
+ // 联动计算:同上
|
|
|
|
|
+ syncWorkPeriod(update);
|
|
|
return baseMapper.updateById(update);
|
|
return baseMapper.updateById(update);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 工期 ↔ 开始/结束时间 联动计算
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 优先级(三个字段可能部分为 null):
|
|
|
|
|
+ * <ol>
|
|
|
|
|
+ * <li>开始时间 + 工期 → 自动重算结束时间(覆盖原有 workEndTime)</li>
|
|
|
|
|
+ * <li>开始时间 + 结束时间 → 自动反算工期(覆盖原有 durationDays)</li>
|
|
|
|
|
+ * <li>工期 + 结束时间 → 自动反算开始时间(覆盖原有 workStartTime)</li>
|
|
|
|
|
+ * <li>三者均不完整 → 抛异常</li>
|
|
|
|
|
+ * </ol>
|
|
|
|
|
+ * 工期计算口径:向上取整天(1天 = 24h,差额不足1天按1天计,避免工期为0)
|
|
|
|
|
+ */
|
|
|
|
|
+ private void syncWorkPeriod(RiskWorkReport report) {
|
|
|
|
|
+ Date start = report.getWorkStartTime();
|
|
|
|
|
+ Date end = report.getWorkEndTime();
|
|
|
|
|
+ Integer days = report.getDurationDays();
|
|
|
|
|
+ long oneDayMs = 24L * 60L * 60L * 1000L;
|
|
|
|
|
+
|
|
|
|
|
+ // 优先级1:开始时间 + 工期 → 重算结束时间
|
|
|
|
|
+ if (start != null && days != null && days > 0) {
|
|
|
|
|
+ report.setWorkEndTime(new Date(start.getTime() + (long) days * oneDayMs));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 优先级2:开始时间 + 结束时间 → 反算工期
|
|
|
|
|
+ if (start != null && end != null) {
|
|
|
|
|
+ long diffMs = end.getTime() - start.getTime();
|
|
|
|
|
+ if (diffMs <= 0) {
|
|
|
|
|
+ throw new ServiceException("施工结束时间必须晚于开始时间");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 向上取整天: 1ms-1天 都算1天
|
|
|
|
|
+ int computed = (int) ((diffMs + oneDayMs - 1) / oneDayMs);
|
|
|
|
|
+ report.setDurationDays(computed);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 优先级3:工期 + 结束时间 → 反算开始时间
|
|
|
|
|
+ if (days != null && days > 0 && end != null) {
|
|
|
|
|
+ report.setWorkStartTime(new Date(end.getTime() - (long) days * oneDayMs));
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 三者均不完整(完全没填):提示用户补齐
|
|
|
|
|
+ if (start == null && end == null && days == null) {
|
|
|
|
|
+ throw new ServiceException("施工开始时间、施工结束时间、工期至少需要填写其中两个");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 仅有一个字段:无法联动,容忍(交给数据库 NOT NULL 约束兜底 workStartTime/workEndTime)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 校验并批量删除作业上报
|
|
* 校验并批量删除作业上报
|
|
|
*/
|
|
*/
|