人工完成

This commit is contained in:
cbs 2025-03-27 17:05:21 +08:00
parent cb558f7977
commit 061f08164b
16 changed files with 99 additions and 25 deletions

View File

@ -45,12 +45,12 @@ public class ApiAccessLogInterceptor implements HandlerInterceptor {
if (!SpringUtils.isProd()) { if (!SpringUtils.isProd()) {
Map<String, String> queryString = ServletUtils.getParamMap(request); Map<String, String> queryString = ServletUtils.getParamMap(request);
String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null; String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null;
if (CollUtil.isEmpty(queryString) && StrUtil.isEmpty(requestBody)) { /*if (CollUtil.isEmpty(queryString) && StrUtil.isEmpty(requestBody)) {
log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI()); log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI());
} else { } else {
log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(), log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(),
StrUtil.blankToDefault(requestBody, queryString.toString())); StrUtil.blankToDefault(requestBody, queryString.toString()));
} }*/
// 计时 // 计时
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
stopWatch.start(); stopWatch.start();
@ -67,8 +67,8 @@ public class ApiAccessLogInterceptor implements HandlerInterceptor {
if (!SpringUtils.isProd()) { if (!SpringUtils.isProd()) {
StopWatch stopWatch = (StopWatch) request.getAttribute(ATTRIBUTE_STOP_WATCH); StopWatch stopWatch = (StopWatch) request.getAttribute(ATTRIBUTE_STOP_WATCH);
stopWatch.stop(); stopWatch.stop();
log.info("[afterCompletion][完成请求 URL({}) 耗时({} ms)]", /* log.info("[afterCompletion][完成请求 URL({}) 耗时({} ms)]",
request.getRequestURI(), stopWatch.getTotalTimeMillis()); request.getRequestURI(), stopWatch.getTotalTimeMillis());*/
} }
} }

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.api.robot;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -24,7 +25,7 @@ public class RequestProcessor {
public RequestProcessor() { public RequestProcessor() {
// 每秒执行一次 - 处理并发送数据 - 避免数据丢失 // 每秒执行一次 - 处理并发送数据 - 避免数据丢失
scheduler.scheduleAtFixedRate(this::processAndSend, 300, 300, TimeUnit.MILLISECONDS); scheduler.scheduleAtFixedRate(this::processAndSend, 1000, 1000, TimeUnit.MILLISECONDS);
} }
public void handleRequest(String map, String mac, String data) { public void handleRequest(String map, String mac, String data) {
@ -45,7 +46,7 @@ public class RequestProcessor {
private void sendData(String map, Map<String, String> data) { private void sendData(String map, Map<String, String> data) {
// -- 发送给对应的websocket // -- 发送给对应的websocket
// System.out.println("key:" + map + "发送数据:" + data); // System.out.println("key:" + map + "发送数据:" + data);
log.info("key:" + map + "发送数据:" + data); log.info("key:" + map + "发送数据:" + JSON.toJSONString(data));
webSocketSenderApi.sendObject(map, "map_push", data); webSocketSenderApi.sendObject(map, "map_push", data);
} }

View File

@ -62,7 +62,7 @@ public class RobotStatusApiImpl implements RobotStatusApi {
* @return * @return
*/ */
@Override @Override
@SystemRateLimiter(time = 1, count = 150, keyArg = "robotStatusUpdate",message = "机器人上报点位超过限流") @SystemRateLimiter(time = 1, count = 1, keyArg = "robotStatusUpdate",message = "机器人上报点位超过限流")
public void robotStatusUpdate(RobotPoseStatusDTO robotStatusDataDTO) { public void robotStatusUpdate(RobotPoseStatusDTO robotStatusDataDTO) {
updateRobotPosed(robotStatusDataDTO); updateRobotPosed(robotStatusDataDTO);
} }

View File

@ -92,4 +92,12 @@ public class RobotTaskDetailController {
BeanUtils.toBean(list, RobotTaskDetailRespVO.class)); BeanUtils.toBean(list, RobotTaskDetailRespVO.class));
} }
@PostMapping("/manuallyCompleted")
@Operation(summary = "人工完成")
@PreAuthorize("@ss.hasPermission('robot:task-detail:manuallyCompleted')")
public CommonResult manuallyCompleted(@RequestParam("id") Long id) {
taskDetailService.manuallyCompleted(id);
return success(true);
}
} }

View File

@ -56,7 +56,7 @@ public class RobotTaskDetailPageReqVO extends PageParam {
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1") @Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus; private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)") @Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电、8:取消、9:人工完成、10:异常)")
private Long taskStage; private Long taskStage;
@Schema(description = "开始时间") @Schema(description = "开始时间")

View File

@ -62,8 +62,8 @@ public class RobotTaskDetailRespVO {
@ExcelProperty("任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)") @ExcelProperty("任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)")
private Integer taskStatus; private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)") @Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电、8:取消、9:人工完成、10:异常)")
@ExcelProperty("任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)") @ExcelProperty("任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电、8:取消、9:人工完成、10:异常)")
private Long taskStage; private Long taskStage;
@Schema(description = "开始时间") @Schema(description = "开始时间")

View File

@ -62,7 +62,7 @@ public class RobotTaskDetailSaveReqVO {
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1") @Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus; private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)") @Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电、8:取消、9:人工完成、10:异常)")
private Long taskStage; private Long taskStage;
@Schema(description = "开始时间") @Schema(description = "开始时间")

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.dal.dataobject.log; package cn.iocoder.yudao.module.system.dal.dataobject.log;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
@ -53,4 +54,9 @@ public class RobotTaskDetailActionLogDO extends BaseDO {
*/ */
private Long taskDetailId; private Long taskDetailId;
/**
* 任务阶段(0:待执行1前往取货2取货中3前往放货4放货中5结束6移动中7:正在充电8:取消9:人工完成10:异常)
*/
private Long taskStage;
} }

View File

@ -96,7 +96,7 @@ public class RobotTaskDetailDO extends BaseDO {
*/ */
private Integer taskStatus; private Integer taskStatus;
/** /**
* 任务阶段(0:待执行1前往取货2取货中3前往放货4放货中5结束6移动中7:正在充电) * 任务阶段(0:待执行1前往取货2取货中3前往放货4放货中5结束6移动中7:正在充电8:取消9:人工完成10:异常)
*/ */
private Long taskStage; private Long taskStage;
/** /**

View File

@ -14,7 +14,9 @@ public enum RobotTaskStageEnum {
DONE(5L,"结束"), DONE(5L,"结束"),
MOVE(6L,"移动中"), MOVE(6L,"移动中"),
CHARGEING(7L,"待执行正在充电"), CHARGEING(7L,"待执行正在充电"),
CLOSE(8L,"任务已取消"); CLOSE(8L,"任务已取消"),
MANUALLY_COMPLETED(9L,"人工完成"),
EXCEPTION(10L,"异常");
/** /**
* 类型 * 类型
*/ */

View File

@ -17,13 +17,19 @@ import cn.iocoder.yudao.module.system.enums.config.CommandConfigTypeEnum;
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; import cn.iocoder.yudao.module.system.service.log.UserOperationLogService;
import cn.iocoder.yudao.module.system.service.tool.ToolsService; import cn.iocoder.yudao.module.system.service.tool.ToolsService;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.lang.reflect.Type;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.CONFIG_NOT_EXISTS; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.CONFIG_NOT_EXISTS;
@ -99,17 +105,20 @@ public class CommonConfigServiceImpl implements CommonConfigService {
String onceStartTime = s.format(formatter); String onceStartTime = s.format(formatter);
String onceEndTime = e.format(formatter); String onceEndTime = e.format(formatter);
JSONObject jsonObject = new JSONObject(config.getConfigStr()); Gson gson = new Gson();
jsonObject.put("onceStartTime", onceStartTime); Type type = new TypeToken<Map<String, String>>(){}.getType();
jsonObject.put("onceEndTime", onceEndTime); Map<String, String> map = gson.fromJson(config.getConfigStr(), type);
map.put("onceStartTime", onceStartTime);
map.put("onceEndTime", onceEndTime);
String str = JSON.toJSONString(jsonObject); String str = JSON.toJSONString(map);
config.setConfigStr(str); config.setConfigStr(str);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void updateConfig(CommonConfigSaveReqVO updateReqVO) { public void updateConfig(CommonConfigSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateConfigExists(updateReqVO.getId()); validateConfigExists(updateReqVO.getId());

View File

@ -141,13 +141,13 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
public void deleteInformation(Long id) { public void deleteInformation(Long id) {
// 校验存在 // 校验存在
validateInformationExists(id); validateInformationExists(id);
// 删除
informationMapper.deleteById(id);
DeviceInformationDO deviceInformationDO = informationMapper.selectById(id); DeviceInformationDO deviceInformationDO = informationMapper.selectById(id);
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction("删除设备 " + deviceInformationDO.getDeviceNo()) .operateAction("删除设备 " + deviceInformationDO.getDeviceNo())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build(); .nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
// 删除
informationMapper.deleteById(id);
userOperationLogService.createUserOperationLog(operationLog); userOperationLogService.createUserOperationLog(operationLog);
} }

View File

@ -150,4 +150,12 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @param robotNo * @param robotNo
*/ */
void doTaskContinue(String robotNo); void doTaskContinue(String robotNo);
/**
*
* @param id
* @param mac
* @param orderType
*/
void robotCloseTaskDetail(String id, String mac, String orderType);
} }

View File

@ -259,16 +259,15 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
@Override @Override
public void deleteInformation(Long id) { public void deleteInformation(Long id) {
// 校验存在
validateInformationExists(id);
// 删除
informationMapper.deleteById(id);
RobotInformationDO robotInformationDO = informationMapper.selectById(id); RobotInformationDO robotInformationDO = informationMapper.selectById(id);
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction("删除车辆 " + robotInformationDO.getRobotNo()) .operateAction("删除车辆 " + robotInformationDO.getRobotNo())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build(); .nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog); userOperationLogService.createUserOperationLog(operationLog);
// 校验存在
validateInformationExists(id);
// 删除
informationMapper.deleteById(id);
} }
private void validateInformationExists(Long id) { private void validateInformationExists(Long id) {
@ -1030,6 +1029,7 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
* @param mac * @param mac
* @param orderType * @param orderType
*/ */
@Override
public void robotCloseTaskDetail(String id, String mac, String orderType) { public void robotCloseTaskDetail(String id, String mac, String orderType) {
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO(); RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
robotTask.setOrderId(id); robotTask.setOrderId(id);

View File

@ -66,4 +66,11 @@ public interface RobotTaskDetailService {
* @param taskDetailId * @param taskDetailId
*/ */
RobotTaskDetailDO closeTaskDetail(Long taskDetailId); RobotTaskDetailDO closeTaskDetail(Long taskDetailId);
/**
*
* @param id
* @return
*/
void manuallyCompleted(Long id);
} }

View File

@ -6,12 +6,15 @@ import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailA
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailRespVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailRespVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.RobotTaskStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -46,6 +49,12 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
@Resource @Resource
private RobotTaskMapper robotTaskMapper; private RobotTaskMapper robotTaskMapper;
@Resource
private RobotTaskDetailActionLogService taskDetailActionLogService;
@Resource
private RobotInformationService informationService;
@Override @Override
public Long createTaskDetail(RobotTaskDetailSaveReqVO createReqVO) { public Long createTaskDetail(RobotTaskDetailSaveReqVO createReqVO) {
// 插入 // 插入
@ -119,4 +128,28 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
log.info("车机上报异常, 把任务取消 :{}", taskDetailId); log.info("车机上报异常, 把任务取消 :{}", taskDetailId);
return robotTaskDetailDO; return robotTaskDetailDO;
} }
@Override
public void manuallyCompleted(Long taskDetailId) {
RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectById(taskDetailId);
Long taskStage = robotTaskDetailDO.getTaskStage();
robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DONE.getType());
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.MANUALLY_COMPLETED.getType());
taskDetailMapper.updateById(robotTaskDetailDO);
RobotTaskDetailActionLogDO log = taskDetailActionLogService.getLastTaskByRobotNo(robotTaskDetailDO.getRobotNo());
if (ObjectUtil.isEmpty(log) || !log.getTaskDetailId().equals(taskDetailId)) {
return;
}
if (RobotTaskStageEnum.DONE.getType().equals(taskStage)
|| RobotTaskStageEnum.CLOSE.getType().equals(taskStage)
|| RobotTaskStageEnum.MANUALLY_COMPLETED.getType().equals(taskStage)
|| RobotTaskStageEnum.EXCEPTION.getType().equals(taskStage) ) {
return;
}
String mac = informationService.getMacByRobotNo(robotTaskDetailDO.getRobotNo());
informationService.robotCloseTaskDetail(String.valueOf(taskDetailId),mac,"");
}
} }