1、提交报工相关接口

This commit is contained in:
2026-01-07 15:15:35 +08:00
parent f7264c845e
commit b71c4d90ee
5 changed files with 122 additions and 6 deletions

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -16,6 +16,8 @@ import com.sdm.project.model.req.SpdmWorkReq;
public interface ISimulationWorkService extends IService<SimulationWork> {
SdmResponse add(SpdmWorkReq req);
SdmResponse addWork(SpdmWorkReq req);
SdmResponse updateWork(SpdmWorkReq req);
}

View File

@@ -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;
/**
* <p>
* 服务实现类
@@ -18,16 +27,62 @@ import org.springframework.stereotype.Service;
* @since 2025-11-03
*/
@Service
@Slf4j
public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper, SimulationWork> 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<SimulationWork> 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("更新报工信息失败");
}
}