From b71c4d90ee7025d8d3c1cad6a2b1f1e6621fe68a Mon Sep 17 00:00:00 2001 From: lidongyang <506508008@qq.com> Date: Wed, 7 Jan 2026 15:15:35 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=8F=90=E4=BA=A4=E6=8A=A5=E5=B7=A5?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sdm/common/utils/TimeCalculator.java | 39 ++++++++++++ .../controller/SimulationWorkController.java | 15 ++++- .../sdm/project/model/req/SpdmWorkReq.java | 11 ++++ .../service/ISimulationWorkService.java | 4 +- .../impl/SimulationWorkServiceImpl.java | 59 ++++++++++++++++++- 5 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 common/src/main/java/com/sdm/common/utils/TimeCalculator.java diff --git a/common/src/main/java/com/sdm/common/utils/TimeCalculator.java b/common/src/main/java/com/sdm/common/utils/TimeCalculator.java new file mode 100644 index 00000000..8cf292fe --- /dev/null +++ b/common/src/main/java/com/sdm/common/utils/TimeCalculator.java @@ -0,0 +1,39 @@ +package com.sdm.common.utils; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +public class TimeCalculator { + // 定义时间格式器 + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + /** + * 计算两个时间的差值,返回以小时为单位的工时(四舍五入保留整数,Integer类型) + * + * @param beginTime 开始时间字符串 (yyyy-MM-dd HH:mm:ss) + * @param finishTime 结束时间字符串 (yyyy-MM-dd HH:mm:ss) + * @return 工时(小时),四舍五入保留整数,Integer包装类类型 + * @throws DateTimeParseException 时间格式解析失败时抛出 + */ + public static Integer calculateWorkHours(String beginTime, String finishTime) { + try { + // 1. 将字符串转换为LocalDateTime对象 + LocalDateTime start = LocalDateTime.parse(beginTime, FORMATTER); + LocalDateTime end = LocalDateTime.parse(finishTime, FORMATTER); + + // 2. 计算时间差,获取总秒数 + Duration duration = Duration.between(start, end); + long seconds = duration.getSeconds(); + + // 3. 转换为小时(秒数 / 3600),四舍五入保留整数 + double hours = seconds / 3600.0; + // 四舍五入后转为Integer包装类(自动装箱) + return Math.toIntExact(Math.round(hours)); + } catch (DateTimeParseException e) { + System.err.println("时间格式解析失败,请确保时间格式为 yyyy-MM-dd HH:mm:ss"); + throw e; + } + } +} \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/controller/SimulationWorkController.java b/project/src/main/java/com/sdm/project/controller/SimulationWorkController.java index 28f1f4bf..4b940c72 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationWorkController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationWorkController.java @@ -1,6 +1,7 @@ package com.sdm.project.controller; import com.sdm.common.common.SdmResponse; +import com.sdm.common.log.annotation.SysLog; import com.sdm.project.model.req.SpdmWorkReq; import com.sdm.project.service.ISimulationWorkService; import io.swagger.v3.oas.annotations.Operation; @@ -19,10 +20,18 @@ public class SimulationWorkController { @Autowired private ISimulationWorkService simulationWorkService; - @PostMapping("/add") + @SysLog("新增报工") + @PostMapping("/addWork") @Operation(summary = "新增报工", description = "新增报工") - public SdmResponse add(@RequestBody SpdmWorkReq req) { - return simulationWorkService.add(req); + public SdmResponse addWork(@RequestBody SpdmWorkReq req) { + return simulationWorkService.addWork(req); + } + + @SysLog("更新报工") + @PostMapping("/updateWork") + @Operation(summary = "更新报工", description = "更新报工") + public SdmResponse updateWork(@RequestBody SpdmWorkReq req) { + return simulationWorkService.updateWork(req); } } diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmWorkReq.java b/project/src/main/java/com/sdm/project/model/req/SpdmWorkReq.java index 84448047..1b9a037c 100644 --- a/project/src/main/java/com/sdm/project/model/req/SpdmWorkReq.java +++ b/project/src/main/java/com/sdm/project/model/req/SpdmWorkReq.java @@ -10,6 +10,8 @@ import java.util.List; @Data public class SpdmWorkReq { + private Long id; + private String planFinishTask; private String actualFinishTask; @@ -24,4 +26,13 @@ public class SpdmWorkReq { private String description; + private String beginTime; + + private String finishTime; + + /** + * 更新类型,0:启动,1:关闭,2:其他信息 + */ + private Integer type; + } diff --git a/project/src/main/java/com/sdm/project/service/ISimulationWorkService.java b/project/src/main/java/com/sdm/project/service/ISimulationWorkService.java index aa4361cd..9e815e79 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationWorkService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationWorkService.java @@ -16,6 +16,8 @@ import com.sdm.project.model.req.SpdmWorkReq; public interface ISimulationWorkService extends IService { - SdmResponse add(SpdmWorkReq req); + SdmResponse addWork(SpdmWorkReq req); + + SdmResponse updateWork(SpdmWorkReq req); } diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationWorkServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationWorkServiceImpl.java index 7f72bddf..c177dee3 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationWorkServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationWorkServiceImpl.java @@ -1,14 +1,23 @@ package com.sdm.project.service.impl; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sdm.common.common.SdmResponse; +import com.sdm.common.utils.TimeCalculator; import com.sdm.project.dao.SimulationWorkMapper; import com.sdm.project.model.entity.SimulationWork; import com.sdm.project.model.req.SpdmWorkReq; import com.sdm.project.service.ISimulationWorkService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + /** *

* 服务实现类 @@ -18,16 +27,62 @@ import org.springframework.stereotype.Service; * @since 2025-11-03 */ @Service +@Slf4j public class SimulationWorkServiceImpl extends ServiceImpl implements ISimulationWorkService { @Override - public SdmResponse add(SpdmWorkReq req) { + public SdmResponse addWork(SpdmWorkReq req) { SimulationWork simulationWork = new SimulationWork(); - BeanUtils.copyProperties(req,simulationWork); + BeanUtils.copyProperties(req, simulationWork); if (!this.save(simulationWork)) { return SdmResponse.failed("新增报工失败"); } return SdmResponse.success("新增报工成功"); } + @Override + public SdmResponse updateWork(SpdmWorkReq req) { + Long id = req.getId(); + if (ObjectUtils.isEmpty(id)) { + return SdmResponse.failed("id不能为空"); + } + Integer type = req.getType(); + if (type != 0 && type != 1 && type != 2) { + return SdmResponse.failed("type必须为0或1或2"); + } + String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + boolean updateFlag; + if (type == 0) { + updateFlag = this.lambdaUpdate().set(SimulationWork::getBeginTime, curDateStr) + .eq(SimulationWork::getId, id) + .update(); + } else if (type == 1) { + updateFlag =this.lambdaUpdate().set(SimulationWork::getFinishTime, curDateStr) + .eq(SimulationWork::getId, id) + .update(); + } else { + LambdaUpdateChainWrapper simulationWorkWrapper = this.lambdaUpdate(); + // 校验填写的实际工时是否小于最大工时 + String beginTime = req.getBeginTime(); + String finishTime = req.getFinishTime(); + Integer actualWorkHour = req.getActualWorkHour(); + if (ObjectUtils.isNotEmpty(actualWorkHour)) { + if (StringUtils.isBlank(beginTime) || StringUtils.isBlank(finishTime)) { + return SdmResponse.failed("开始和完成时间都不为空时,才能填写实际工时"); + } + Integer maxWorkHour = TimeCalculator.calculateWorkHours(beginTime, finishTime); + log.info("actualWorkHour:{},maxWorkHour:{}",actualWorkHour,maxWorkHour); + if (actualWorkHour > maxWorkHour) { + return SdmResponse.failed("您填写的工时:" + actualWorkHour + "已超出最大可填写的工时:" + maxWorkHour); + } + simulationWorkWrapper.set(SimulationWork::getActualFinishTask, req.getActualFinishTask()); + } + updateFlag = simulationWorkWrapper + .set(ObjectUtils.isNotEmpty(req.getActualWorkHour()), SimulationWork::getActualWorkHour, req.getActualWorkHour()) + .eq(SimulationWork::getId, req.getId()) + .update(); + } + return updateFlag ? SdmResponse.success() : SdmResponse.failed("更新报工信息失败"); + } + }