统计速度和时间

This commit is contained in:
cbs 2025-07-08 11:06:00 +08:00
parent 7a11ac04bd
commit 68cd2578b5
41 changed files with 1650 additions and 21 deletions

View File

@ -54,15 +54,13 @@ logging:
remote:
cockpit: # 远遥控制车辆IP和端口
- controllerPort: 9002
controllerIp: 127.0.0.2
ipcIp: 127.0.0.1
- controllerPort: 9001
controllerIp: 127.0.0.3
ipcIp: 127.0.0.1
- controllerPort: 9006
controllerIp: 10.10.5.26
ipcIp: 10.10.5.26
msg: AA 55 13 04 01 88 88 # 驾舱socket头信息
cockpit-time-out: 120 # 驾舱超时报警时间
industrial-control-time-out: 120 # 工控通信超时报警时间
robot-communication-time-out: 120 # 车辆通信超时报警时间
robot-max-speed: 5 # 远遥控制车辆最大速度 m/s
# AA 55 13 04 01 88 88 01 0a 0a 64 13 28 23 01 78 01 78 01 78 3F 7D

View File

@ -332,4 +332,10 @@ public interface ErrorCodeConstants {
// ========== 库位类型 1_002_059_001 ==========
ErrorCode HOUSE_LOCATION_TYPE_NOT_EXISTS = new ErrorCode(1_002_059_001, "库位类型不存在");
//========== 车辆任务行程耗时表 1_002_060_001 ==========
ErrorCode ROBOT_TASK_TIME_CONSUMING_NOT_EXISTS = new ErrorCode(1_002_060_001, "车辆任务行程耗时不存在");
//========== 车辆行走路线耗时记录 1_002_061_001 ==========
ErrorCode TASK_LINE_TIME_CONSUMING_NOT_EXISTS = new ErrorCode(1_002_061_001, "车辆行走路线耗时记录不存在");
}

View File

@ -38,6 +38,9 @@ import cn.iocoder.yudao.module.system.enums.robot.actionlog.ActionStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeTaskStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotStatusCodeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.event.RobotTaskEventTypeEnum;
import cn.iocoder.yudao.module.system.mq.message.task.TaskDistributionMessage;
import cn.iocoder.yudao.module.system.mq.producer.task.TaskDistributionProducer;
import cn.iocoder.yudao.module.system.service.information.DeviceInformationService;
import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService;
import cn.iocoder.yudao.module.system.service.path.PathPlanningService;
@ -125,6 +128,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
@Resource
private DeviceInformationService deviceInformationService;
@Resource
private TaskDistributionProducer taskDistributionProducer;
@Autowired
private ZnConfigConstant znConfigConstant;
@ -278,6 +284,10 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
taskDetailActionLogMapper.updateActionStatus(robotCompleteTaskDTO.getOrderId(), ActionStatusEnum.DONE.getType(), LocalDateTime.now());
addTaskDetailActionDoneLog(robotCompleteTaskDTO, robotTaskDetail);
TaskDistributionMessage mess = new TaskDistributionMessage(this, robotCompleteTaskDTO.getOrderId() + "",
RobotTaskEventTypeEnum.DONE.getType());
taskDistributionProducer.sendSmsSendMessage(mess);
}
private void addTaskDetailActionDoneLog(RobotCompleteTaskDTO robotCompleteTaskDTO, RobotTaskDetailDO robotTaskDetail) {
@ -453,7 +463,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
// robotTaskDetailMapper.updateById(robotTaskDetailDO);
robotTaskDetailMapper.updateRobotDetailById(detailDO);
String taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId());
msg = robotNo + "_" + "车辆发生异常,重新分配其他车辆执行此任务" + taskNo + " - " + robotCompleteTaskDTO.getOrderId();
msg = robotNo + "_" + "车辆发生异常,重新分配其他车辆执行此任务" + taskNo + " - " + robotTaskDetailDO.getFromLocationNo();
}
}
@ -493,6 +503,8 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId());
solve = " 并且到任务列表关闭任务 " + taskNo;
taskDetailService.setTaskDetailError(robotCompleteTaskDTO.getOrderId());
} else {
robotInformationService.lockRobot(robotNo);
}
msg = ObjectUtil.isEmpty(msg) ? robotNo + "_" + robotCompleteTaskDTO.getMessage() : msg;
@ -579,6 +591,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType());
}
robotInformationMapper.updateById(robotInformationDO);
//同步任务完成给PP
pathPlanningService.updateBehavior(String.valueOf(robotCompleteTaskDTO.getOrderId()), robotTaskDetailDO.getRobotNo()
, "", PathIsReachEnum.END_WORK.getType());

View File

@ -14,9 +14,13 @@ import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.WorkProgressEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.event.RobotTaskEventTypeEnum;
import cn.iocoder.yudao.module.system.mq.message.task.TaskDistributionMessage;
import cn.iocoder.yudao.module.system.mq.producer.task.TaskDistributionProducer;
import cn.iocoder.yudao.module.system.service.log.RobotOperationLogService;
import cn.iocoder.yudao.module.system.service.path.PathPlanningService;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -42,6 +46,9 @@ public class RobotWorkStatusApiImpl implements RobotWorkStatusApi {
@Autowired
private RobotTaskDetailMapper robotTaskDetailMapper;
@Resource
private TaskDistributionProducer taskDistributionProducer;
@Override
public void robotWorkStatus(String message) {
log.info("111111作业实时行为上报: {}", message);
@ -63,6 +70,10 @@ public class RobotWorkStatusApiImpl implements RobotWorkStatusApi {
.build();
operationLogService.createOperationLog(createReqVO);
TaskDistributionMessage mess = new TaskDistributionMessage(this,message,
RobotTaskEventTypeEnum.TIME.getType());
taskDistributionProducer.sendSmsSendMessage(mess);
if ((CommandTypeEnum.WORK_PICK_UP_GOODS_MOVE_TO_CHECK.getType().equals(data.getCommandType())
|| CommandTypeEnum.WORK_DROP_OFF_GOODS_MOVE_TO_CHECK.getType().equals(data.getCommandType()))
&& RobotExecutionStateConstant.DOING.equals(Integer.valueOf(data.getExecutionState()))) {

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.config.mqtt;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.service.mqtt.MqttService;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttAsyncClient;
@ -43,7 +44,7 @@ public class MqttCallBack implements MqttCallback {
fixedThreadPool.execute(() -> {
String msg = new String(mqttMessage.getPayload(), StandardCharsets.UTF_8);
// log.info("[MQTT]接收当前消息为 :{}", msg);
TenantContextHolder.setTenantId(1L);
try {
MqttService mqttService = MqttFactory.getMqttFactory(topic);
mqttService.analysisMessage(msg);

View File

@ -11,6 +11,8 @@ import cn.iocoder.yudao.module.system.service.mqtt.PathPlanningMoveServiceImpl;
import cn.iocoder.yudao.module.system.service.mqtt.PathRouteDisplayPlanningServiceImpl;
import cn.iocoder.yudao.module.system.service.mqtt.PlanningGraphMatchDataServiceImpl;
import cn.iocoder.yudao.module.system.service.mqtt.PlanningRemoteRobotMovePosePlanningImpl;
import cn.iocoder.yudao.module.system.service.mqtt.PlanningRobotLineDistanceServiceImpl;
import cn.iocoder.yudao.module.system.service.mqtt.PlanningRobotWalkingDistanceServiceImpl;
import cn.iocoder.yudao.module.system.service.mqtt.PlanningSimulationRobotPoseRequestServiceImpl;
import cn.iocoder.yudao.module.system.service.mqtt.RobotGenericsStatusServiceImpl;
import cn.iocoder.yudao.module.system.service.mqtt.RobotObstaclesStatusServiceImpl;
@ -180,6 +182,10 @@ public class MqttFactory {
return BeanUtils.getBean(PathRouteDisplayPlanningServiceImpl.class);
case PLANNING_GRAPH_MATCH_DATA:
return BeanUtils.getBean(PlanningGraphMatchDataServiceImpl.class);
case PLANNING_ROBOT_WALKING_DISTANCE:
return BeanUtils.getBean(PlanningRobotWalkingDistanceServiceImpl.class);
case PLANNING_ROBOT_LINE_DISTANCE:
return BeanUtils.getBean(PlanningRobotLineDistanceServiceImpl.class);
case PLANNING_REMOTE_ROBOT_MOVE_POSE_PLANNING:
return BeanUtils.getBean(PlanningRemoteRobotMovePosePlanningImpl.class);
default :

View File

@ -30,6 +30,8 @@ public enum DefineSubTopicEnum {
PLANNING_MOVE("UPDATE_ROUTE_DISPLAY_PLANNING", 2,"车辆即将走的点位"),
PLANNING_ROUTE_DISPLAY("ROBOT_MOVE_POSE_PLANNING", 2,"路径规划上报实时路径"),
PLANNING_GRAPH_MATCH_DATA("GRAPH_MATCH_DATA", 2,"路网匹配实时数据"),
PLANNING_ROBOT_WALKING_DISTANCE("ROBOT_WALKING_DISTANCE", 2,"车辆行走路程"),
PLANNING_ROBOT_LINE_DISTANCE("ROBOT_LINE_DISTANCE", 2,"车辆行走路线上报"),
PLANNING_REMOTE_ROBOT_MOVE_POSE_PLANNING("REMOTE_ROBOT_MOVE_POSE_PLANNING", 2,"远遥车辆行走导航");

View File

@ -52,4 +52,16 @@ public class RobotTaskChcheConstant {
//所有的车辆信息 获得到一个map key是 macvalue是具体信息
public static String ROBOT_ALL_INFORMATION = "robot:all:information";
//取货开始时间+任务id
public static String ROBOT_TASK_START_PICK = "robot:task:start:pick";
//取货结束时间+任务id
public static String ROBOT_TASK_END_PICK = "robot:task:end:pick";
//放货开始时间+任务id
public static String ROBOT_TASK_START_DROP = "robot:task:start:drop";
//任务结束时间+任务id
public static String ROBOT_TASK_END = "robot:task:end";
}

View File

@ -0,0 +1,97 @@
package cn.iocoder.yudao.module.system.controller.admin.log;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingRespVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskLineTimeConsumingDO;
import cn.iocoder.yudao.module.system.service.log.RobotTaskLineTimeConsumingService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 车辆行走路线耗时记录")
@RestController
@RequestMapping("/system/robot/task-line-time-consuming")
@Validated
public class RobotTaskLineTimeConsumingController {
@Resource
private RobotTaskLineTimeConsumingService taskLineTimeConsumingService;
@PostMapping("/create")
@Operation(summary = "创建车辆行走路线耗时记录")
@PreAuthorize("@ss.hasPermission('robot:task-line-time-consuming:create')")
public CommonResult<Long> createTaskLineTimeConsuming(@Valid @RequestBody RobotTaskLineTimeConsumingSaveReqVO createReqVO) {
return success(taskLineTimeConsumingService.createTaskLineTimeConsuming(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新车辆行走路线耗时记录")
@PreAuthorize("@ss.hasPermission('robot:task-line-time-consuming:update')")
public CommonResult<Boolean> updateTaskLineTimeConsuming(@Valid @RequestBody RobotTaskLineTimeConsumingSaveReqVO updateReqVO) {
taskLineTimeConsumingService.updateTaskLineTimeConsuming(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除车辆行走路线耗时记录")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('robot:task-line-time-consuming:delete')")
public CommonResult<Boolean> deleteTaskLineTimeConsuming(@RequestParam("id") Long id) {
taskLineTimeConsumingService.deleteTaskLineTimeConsuming(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得车辆行走路线耗时记录")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('robot:task-line-time-consuming:query')")
public CommonResult<RobotTaskLineTimeConsumingRespVO> getTaskLineTimeConsuming(@RequestParam("id") Long id) {
RobotTaskLineTimeConsumingDO taskLineTimeConsuming = taskLineTimeConsumingService.getTaskLineTimeConsuming(id);
return success(BeanUtils.toBean(taskLineTimeConsuming, RobotTaskLineTimeConsumingRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得车辆行走路线耗时记录分页")
@PreAuthorize("@ss.hasPermission('robot:task-line-time-consuming:query')")
public CommonResult<PageResult<RobotTaskLineTimeConsumingRespVO>> getTaskLineTimeConsumingPage(@Valid RobotTaskLineTimeConsumingPageReqVO pageReqVO) {
PageResult<RobotTaskLineTimeConsumingDO> pageResult = taskLineTimeConsumingService.getTaskLineTimeConsumingPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, RobotTaskLineTimeConsumingRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出车辆行走路线耗时记录 Excel")
@PreAuthorize("@ss.hasPermission('robot:task-line-time-consuming:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportTaskLineTimeConsumingExcel(@Valid RobotTaskLineTimeConsumingPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<RobotTaskLineTimeConsumingDO> list = taskLineTimeConsumingService.getTaskLineTimeConsumingPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "车辆行走路线耗时记录.xls", "数据", RobotTaskLineTimeConsumingRespVO.class,
BeanUtils.toBean(list, RobotTaskLineTimeConsumingRespVO.class));
}
}

View File

@ -0,0 +1,97 @@
package cn.iocoder.yudao.module.system.controller.admin.log;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingRespVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskTimeConsumingDO;
import cn.iocoder.yudao.module.system.service.log.RobotTaskTimeConsumingService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 车辆任务行程耗时")
@RestController
@RequestMapping("/system/consuming/robot-task-time-consuming")
@Validated
public class RobotTaskTimeConsumingController {
@Resource
private RobotTaskTimeConsumingService robotTaskTimeConsumingService;
@PostMapping("/create")
@Operation(summary = "创建车辆任务行程耗时")
@PreAuthorize("@ss.hasPermission('consuming:robot-task-time-consuming:create')")
public CommonResult<Long> createRobotTaskTimeConsuming(@Valid @RequestBody RobotTaskTimeConsumingSaveReqVO createReqVO) {
return success(robotTaskTimeConsumingService.createRobotTaskTimeConsuming(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新车辆任务行程耗时")
@PreAuthorize("@ss.hasPermission('consuming:robot-task-time-consuming:update')")
public CommonResult<Boolean> updateRobotTaskTimeConsuming(@Valid @RequestBody RobotTaskTimeConsumingSaveReqVO updateReqVO) {
robotTaskTimeConsumingService.updateRobotTaskTimeConsuming(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除车辆任务行程耗时")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('consuming:robot-task-time-consuming:delete')")
public CommonResult<Boolean> deleteRobotTaskTimeConsuming(@RequestParam("id") Long id) {
robotTaskTimeConsumingService.deleteRobotTaskTimeConsuming(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得车辆任务行程耗时")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('consuming:robot-task-time-consuming:query')")
public CommonResult<RobotTaskTimeConsumingRespVO> getRobotTaskTimeConsuming(@RequestParam("id") Long id) {
RobotTaskTimeConsumingDO robotTaskTimeConsuming = robotTaskTimeConsumingService.getRobotTaskTimeConsuming(id);
return success(BeanUtils.toBean(robotTaskTimeConsuming, RobotTaskTimeConsumingRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得车辆任务行程耗时分页")
@PreAuthorize("@ss.hasPermission('consuming:robot-task-time-consuming:query')")
public CommonResult<PageResult<RobotTaskTimeConsumingRespVO>> getRobotTaskTimeConsumingPage(@Valid RobotTaskTimeConsumingPageReqVO pageReqVO) {
PageResult<RobotTaskTimeConsumingDO> pageResult = robotTaskTimeConsumingService.getRobotTaskTimeConsumingPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, RobotTaskTimeConsumingRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出车辆任务行程耗时 Excel")
@PreAuthorize("@ss.hasPermission('consuming:robot-task-time-consuming:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportRobotTaskTimeConsumingExcel(@Valid RobotTaskTimeConsumingPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<RobotTaskTimeConsumingDO> list = robotTaskTimeConsumingService.getRobotTaskTimeConsumingPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "车辆任务行程耗时.xls", "数据", RobotTaskTimeConsumingRespVO.class,
BeanUtils.toBean(list, RobotTaskTimeConsumingRespVO.class));
}
}

View File

@ -0,0 +1,11 @@
package cn.iocoder.yudao.module.system.controller.admin.log.dto;
import lombok.Data;
import java.util.List;
@Data
public class RobotTaskLineTimeConsumingDTO {
private String orderId;
private List<RobotTaskLineTimeConsumingDetailDTO> list;
}

View File

@ -0,0 +1,28 @@
package cn.iocoder.yudao.module.system.controller.admin.log.dto;
import lombok.Data;
@Data
public class RobotTaskLineTimeConsumingDetailDTO {
/**
* 0:直线, 1:曲线
*/
private Integer lineType;
/**
* 行走路程()
*/
private String totalDistance;
/**
* 开始点
*/
private String fromSortNum;
/**
* 结束点
*/
private String toSortNum;
/**
* 行走总耗时()
*/
private String timeConsuming;
}

View File

@ -0,0 +1,10 @@
package cn.iocoder.yudao.module.system.controller.admin.log.dto;
import lombok.Data;
@Data
public class RobotWalkingDistanceDTO {
private String orderId;
private String totalDistance;
private String checkDistance;
}

View File

@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.system.controller.admin.log.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 车辆行走路线耗时记录分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class RobotTaskLineTimeConsumingPageReqVO extends PageParam {
@Schema(description = "任务号")
private String taskNo;
@Schema(description = "robot_task_detail的id", example = "13949")
private Long taskDetailId;
@Schema(description = "行走路程(米)")
private String totalDistance;
@Schema(description = "0:直线, 1:曲线", example = "2")
private Integer lineType;
@Schema(description = "开始点")
private String fromSortNum;
@Schema(description = "结束点")
private String toSortNum;
@Schema(description = "行走总耗时(秒)")
private String totalTimeConsuming;
@Schema(description = "平均速度(米/秒)")
private String averageSpeed;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "AGV编号")
private String robotNo;
}

View File

@ -0,0 +1,59 @@
package cn.iocoder.yudao.module.system.controller.admin.log.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 车辆行走路线耗时记录 Response VO")
@Data
@ExcelIgnoreUnannotated
public class RobotTaskLineTimeConsumingRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8419")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "任务号")
@ExcelProperty("任务号")
private String taskNo;
@Schema(description = "robot_task_detail的id", example = "13949")
@ExcelProperty("robot_task_detail的id")
private Long taskDetailId;
@Schema(description = "行走路程(米)")
@ExcelProperty("行走路程(米)")
private String totalDistance;
@Schema(description = "0:直线, 1:曲线", example = "2")
@ExcelProperty("0:直线, 1:曲线")
private Integer lineType;
@Schema(description = "开始点")
@ExcelProperty("开始点")
private String fromSortNum;
@Schema(description = "结束点")
@ExcelProperty("结束点")
private String toSortNum;
@Schema(description = "行走总耗时(秒)")
@ExcelProperty("行走总耗时(秒)")
private String totalTimeConsuming;
@Schema(description = "平均速度(米/秒)")
@ExcelProperty("平均速度(米/秒)")
private String averageSpeed;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "AGV编号")
@ExcelProperty("AGV编号")
private String robotNo;
}

View File

@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.system.controller.admin.log.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 车辆行走路线耗时记录新增/修改 Request VO")
@Data
public class RobotTaskLineTimeConsumingSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8419")
private Long id;
@Schema(description = "任务号")
private String taskNo;
@Schema(description = "robot_task_detail的id", example = "13949")
private Long taskDetailId;
@Schema(description = "行走路程(米)")
private String totalDistance;
@Schema(description = "0:直线, 1:曲线", example = "2")
private Integer lineType;
@Schema(description = "开始点")
private String fromSortNum;
@Schema(description = "结束点")
private String toSortNum;
@Schema(description = "行走总耗时(秒)")
private String totalTimeConsuming;
@Schema(description = "平均速度(米/秒)")
private String averageSpeed;
@Schema(description = "AGV编号")
private String robotNo;
}

View File

@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.system.controller.admin.log.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 车辆任务行程耗时分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class RobotTaskTimeConsumingPageReqVO extends PageParam {
@Schema(description = "任务号")
private String taskNo;
@Schema(description = "robot_task_detail的id", example = "3069")
private Long taskDetailId;
@Schema(description = "取货层数")
private Integer fromLocationStorey;
@Schema(description = "放货层数")
private Integer toLocationStorey;
@Schema(description = "计算后的来源库位编号")
private String fromLocationNo;
@Schema(description = "计算后的目标库位编号")
private String toLocationNo;
@Schema(description = "行走的总路程(米)")
private String totalDistance;
@Schema(description = "总耗时(秒)")
private String totalTimeConsuming;
@Schema(description = "取货检测点到放货检测点的总路程(米)")
private String checkDistance;
@Schema(description = "取货检测点到放货检测点的总总耗时(秒)")
private String checkTimeConsuming;
@Schema(description = "取货耗时(秒)")
private String pickTimeConsuming;
@Schema(description = "放货耗时(秒)")
private String dropTimeConsuming;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "AGV编号")
private String robotNo;
}

View File

@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.system.controller.admin.log.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 车辆任务行程耗时 Response VO")
@Data
@ExcelIgnoreUnannotated
public class RobotTaskTimeConsumingRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14459")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "任务号")
@ExcelProperty("任务号")
private String taskNo;
@Schema(description = "robot_task_detail的id", example = "3069")
@ExcelProperty("robot_task_detail的id")
private Long taskDetailId;
@Schema(description = "取货层数")
@ExcelProperty("取货层数")
private Integer fromLocationStorey;
@Schema(description = "放货层数")
@ExcelProperty("放货层数")
private Integer toLocationStorey;
@Schema(description = "计算后的来源库位编号")
@ExcelProperty("计算后的来源库位编号")
private String fromLocationNo;
@Schema(description = "计算后的目标库位编号")
@ExcelProperty("计算后的目标库位编号")
private String toLocationNo;
@Schema(description = "行走的总路程(米)")
@ExcelProperty("行走的总路程(米)")
private String totalDistance;
@Schema(description = "总耗时(秒)")
@ExcelProperty("总耗时(秒)")
private String totalTimeConsuming;
@Schema(description = "取货检测点到放货检测点的总路程(米)")
@ExcelProperty("取货检测点到放货检测点的总路程(米)")
private String checkDistance;
@Schema(description = "取货检测点到放货检测点的总总耗时(秒)")
@ExcelProperty("取货检测点到放货检测点的总总耗时(秒)")
private String checkTimeConsuming;
@Schema(description = "取货耗时(秒)")
@ExcelProperty("取货耗时(秒)")
private String pickTimeConsuming;
@Schema(description = "放货耗时(秒)")
@ExcelProperty("放货耗时(秒)")
private String dropTimeConsuming;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "AGV编号")
@ExcelProperty("AGV编号")
private String robotNo;
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.system.controller.admin.log.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 车辆任务行程耗时新增/修改 Request VO")
@Data
public class RobotTaskTimeConsumingSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14459")
private Long id;
@Schema(description = "任务号")
private String taskNo;
@Schema(description = "robot_task_detail的id", example = "3069")
private Long taskDetailId;
@Schema(description = "取货层数")
private Integer fromLocationStorey;
@Schema(description = "放货层数")
private Integer toLocationStorey;
@Schema(description = "计算后的来源库位编号")
private String fromLocationNo;
@Schema(description = "计算后的目标库位编号")
private String toLocationNo;
@Schema(description = "行走的总路程(米)")
private String totalDistance;
@Schema(description = "总耗时(秒)")
private String totalTimeConsuming;
@Schema(description = "取货检测点到放货检测点的总路程(米)")
private String checkDistance;
@Schema(description = "取货检测点到放货检测点的总总耗时(秒)")
private String checkTimeConsuming;
@Schema(description = "取货耗时(秒)")
private String pickTimeConsuming;
@Schema(description = "放货耗时(秒)")
private String dropTimeConsuming;
@Schema(description = "AGV编号")
private String robotNo;
}

View File

@ -0,0 +1,67 @@
package cn.iocoder.yudao.module.system.dal.dataobject.log;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 车辆行走路线耗时记录 DO
*
* @author 陈宾顺
*/
@TableName("robot_task_line_time_consuming")
@KeySequence("robot_task_line_time_consuming_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RobotTaskLineTimeConsumingDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 任务号
*/
private String taskNo;
/**
* robot_task_detail的id
*/
private Long taskDetailId;
/**
* 行走路程()
*/
private String totalDistance;
/**
* 0:直线, 1:曲线
*/
private Integer lineType;
/**
* 开始点
*/
private String fromSortNum;
/**
* 结束点
*/
private String toSortNum;
/**
* 行走总耗时()
*/
private String totalTimeConsuming;
/**
* 平均速度(/)
*/
private String averageSpeed;
/**
* AGV编号
*/
private String robotNo;
}

View File

@ -0,0 +1,83 @@
package cn.iocoder.yudao.module.system.dal.dataobject.log;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 车辆任务行程耗时 DO
*
* @author 陈宾顺
*/
@TableName("robot_task_time_consuming")
@KeySequence("robot_task_time_consuming_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RobotTaskTimeConsumingDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 任务号
*/
private String taskNo;
/**
* robot_task_detail的id
*/
private Long taskDetailId;
/**
* 取货层数
*/
private Integer fromLocationStorey;
/**
* 放货层数
*/
private Integer toLocationStorey;
/**
* 计算后的来源库位编号
*/
private String fromLocationNo;
/**
* 计算后的目标库位编号
*/
private String toLocationNo;
/**
* 行走的总路程()
*/
private String totalDistance;
/**
* 总耗时()
*/
private String totalTimeConsuming;
/**
* 取货检测点到放货检测点的总路程()
*/
private String checkDistance;
/**
* 取货检测点到放货检测点的总总耗时()
*/
private String checkTimeConsuming;
/**
* 取货耗时()
*/
private String pickTimeConsuming;
/**
* 放货耗时()
*/
private String dropTimeConsuming;
/**
* AGV编号
*/
private String robotNo;
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.system.dal.mysql.log;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskLineTimeConsumingDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 车辆行走路线耗时记录 Mapper
*
* @author 陈宾顺
*/
@Mapper
public interface RobotTaskLineTimeConsumingMapper extends BaseMapperX<RobotTaskLineTimeConsumingDO> {
default PageResult<RobotTaskLineTimeConsumingDO> selectPage(RobotTaskLineTimeConsumingPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<RobotTaskLineTimeConsumingDO>()
.eqIfPresent(RobotTaskLineTimeConsumingDO::getTaskNo, reqVO.getTaskNo())
.eqIfPresent(RobotTaskLineTimeConsumingDO::getTaskDetailId, reqVO.getTaskDetailId())
.eqIfPresent(RobotTaskLineTimeConsumingDO::getTotalDistance, reqVO.getTotalDistance())
.eqIfPresent(RobotTaskLineTimeConsumingDO::getLineType, reqVO.getLineType())
.eqIfPresent(RobotTaskLineTimeConsumingDO::getFromSortNum, reqVO.getFromSortNum())
.eqIfPresent(RobotTaskLineTimeConsumingDO::getToSortNum, reqVO.getToSortNum())
.eqIfPresent(RobotTaskLineTimeConsumingDO::getTotalTimeConsuming, reqVO.getTotalTimeConsuming())
.eqIfPresent(RobotTaskLineTimeConsumingDO::getAverageSpeed, reqVO.getAverageSpeed())
.betweenIfPresent(RobotTaskLineTimeConsumingDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(RobotTaskLineTimeConsumingDO::getId));
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.system.dal.mysql.log;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.controller.admin.log.dto.RobotWalkingDistanceDTO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskTimeConsumingDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 车辆任务行程耗时 Mapper
*
* @author 陈宾顺
*/
@Mapper
public interface RobotTaskTimeConsumingMapper extends BaseMapperX<RobotTaskTimeConsumingDO> {
default PageResult<RobotTaskTimeConsumingDO> selectPage(RobotTaskTimeConsumingPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<RobotTaskTimeConsumingDO>()
.eqIfPresent(RobotTaskTimeConsumingDO::getTaskNo, reqVO.getTaskNo())
.eqIfPresent(RobotTaskTimeConsumingDO::getTaskDetailId, reqVO.getTaskDetailId())
.eqIfPresent(RobotTaskTimeConsumingDO::getFromLocationStorey, reqVO.getFromLocationStorey())
.eqIfPresent(RobotTaskTimeConsumingDO::getToLocationStorey, reqVO.getToLocationStorey())
.eqIfPresent(RobotTaskTimeConsumingDO::getFromLocationNo, reqVO.getFromLocationNo())
.eqIfPresent(RobotTaskTimeConsumingDO::getToLocationNo, reqVO.getToLocationNo())
.eqIfPresent(RobotTaskTimeConsumingDO::getTotalDistance, reqVO.getTotalDistance())
.eqIfPresent(RobotTaskTimeConsumingDO::getTotalTimeConsuming, reqVO.getTotalTimeConsuming())
.eqIfPresent(RobotTaskTimeConsumingDO::getCheckDistance, reqVO.getCheckDistance())
.eqIfPresent(RobotTaskTimeConsumingDO::getCheckTimeConsuming, reqVO.getCheckTimeConsuming())
.eqIfPresent(RobotTaskTimeConsumingDO::getPickTimeConsuming, reqVO.getPickTimeConsuming())
.eqIfPresent(RobotTaskTimeConsumingDO::getDropTimeConsuming, reqVO.getDropTimeConsuming())
.betweenIfPresent(RobotTaskTimeConsumingDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(RobotTaskTimeConsumingDO::getId));
}
void updateEntity(RobotTaskTimeConsumingDO data);
}

View File

@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.system.enums.robot.task.event;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RobotTaskEventTypeEnum {
DISTRIBUTION("DISTRIBUTION","任务分配"),
DONE("DONE","任务完成"),
TIME("TIME","统计时间");
/**
* 类型
*/
private final String type;
private final String msg;
}

View File

@ -0,0 +1,219 @@
package cn.iocoder.yudao.module.system.mq.consumer.task;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotWorkStatusDTO;
import cn.iocoder.yudao.module.system.constant.robot.RobotExecutionStateConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskTimeConsumingDO;
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.enums.robot.CommandTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.event.RobotTaskEventTypeEnum;
import cn.iocoder.yudao.module.system.mq.message.task.TaskDistributionMessage;
import cn.iocoder.yudao.module.system.service.log.RobotTaskTimeConsumingService;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskService;
import cn.iocoder.yudao.module.system.service.statistics.RobotWorkingHoursStatisticsService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Component
@Slf4j
public class TaskDistributionConsumer {
@Resource
private RedisUtil redisUtil;
@Resource
private RobotTaskService taskService;
@Resource
private RobotTaskDetailService robotTaskDetailService;
@Resource
private RobotTaskTimeConsumingService robotTaskTimeConsumingService;
@Resource
private RobotWorkingHoursStatisticsService robotWorkingHoursStatisticsService;
@EventListener
@Async
public void onMessage(TaskDistributionMessage message) {
log.info("111111, 任务id : {}", JSON.toJSONString(message));
TenantContextHolder.setTenantId(1L);
if (RobotTaskEventTypeEnum.DISTRIBUTION.getType().equals(message.getEventType())) {
RobotTaskDetailDO taskDetail = robotTaskDetailService.getTaskDetail(Long.valueOf(message.getMessage()));
robotWorkingHoursStatisticsService.createFreeTime(taskDetail.getRobotNo());
RobotTaskDO task = taskService.getTask(taskDetail.getRobotTaskId());
RobotTaskTimeConsumingSaveReqVO data = new RobotTaskTimeConsumingSaveReqVO()
.setTaskNo(task.getTaskNo())
.setTaskDetailId(taskDetail.getId())
.setFromLocationStorey(taskDetail.getFromLocationStorey())
.setFromLocationNo(taskDetail.getFromLocationNo())
.setToLocationStorey(taskDetail.getToLocationStorey())
.setToLocationNo(taskDetail.getToLocationNo())
.setRobotNo(taskDetail.getRobotNo());
robotTaskTimeConsumingService.createRobotTaskTimeConsuming(data);
} else if (RobotTaskEventTypeEnum.TIME.getType().equals(message.getEventType())) {
RobotWorkStatusDTO data = JSON.parseObject(message.getMessage(), RobotWorkStatusDTO.class);
addTaskTimeLog(data);
} else if (RobotTaskEventTypeEnum.DONE.getType().equals(message.getEventType())) {
String orderId = message.getMessage();
String endTime = DateUtils.getYearMonthDayHourMinuteSecon();
RobotTaskDetailDO taskDetail = robotTaskDetailService.getTaskDetail(Long.valueOf(orderId));
if (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(taskDetail.getTaskType())) {
takeRelease(taskDetail, endTime, orderId);
} else if (RobotTaskTypeEnum.MOVE.getType().equals(taskDetail.getTaskType())) {
moveTask(taskDetail, endTime, orderId);
} else if (RobotTaskTypeEnum.TAKE.getType().equals(taskDetail.getTaskType())) {
takeTask(taskDetail, endTime, orderId);
} else if (RobotTaskTypeEnum.RELEASE.getType().equals(taskDetail.getTaskType())) {
releaseTask(taskDetail, endTime, orderId);
}
}
}
private void releaseTask(RobotTaskDetailDO taskDetail, String endTime, String orderId) {
Duration duration = Duration.between(taskDetail.getStartTime(), taskDetail.getEndTime());
//总时间
Long totalTimeConsuming = duration.getSeconds();
String startDropKey = RobotTaskChcheConstant.ROBOT_TASK_START_DROP + orderId;
Object startDropObj = redisUtil.get(startDropKey);
Long dropTimeConsuming = getSeconds(startDropObj, endTime);
RobotTaskTimeConsumingDO data = new RobotTaskTimeConsumingDO()
.setTaskDetailId(Long.valueOf(orderId))
.setTotalTimeConsuming(totalTimeConsuming + "")
.setDropTimeConsuming(dropTimeConsuming + "");
robotTaskTimeConsumingService.updateConsuming(data);
}
private void takeTask(RobotTaskDetailDO taskDetail, String endTime, String orderId) {
Duration duration = Duration.between(taskDetail.getStartTime(), taskDetail.getEndTime());
//总时间
Long totalTimeConsuming = duration.getSeconds();
String startPickKey = RobotTaskChcheConstant.ROBOT_TASK_START_PICK + orderId;
Object startPickObj = redisUtil.get(startPickKey);
String endPickKey = RobotTaskChcheConstant.ROBOT_TASK_END_PICK + orderId;
Object endPickObj = redisUtil.get(endPickKey);
Long pickTimeConsuming = getSeconds(startPickObj, endPickObj);
RobotTaskTimeConsumingDO data = new RobotTaskTimeConsumingDO()
.setTaskDetailId(Long.valueOf(orderId))
.setTotalTimeConsuming(totalTimeConsuming + "")
.setPickTimeConsuming(pickTimeConsuming + "");
robotTaskTimeConsumingService.updateConsuming(data);
}
private void moveTask(RobotTaskDetailDO taskDetail, String endTime, String orderId) {
Duration duration = Duration.between(taskDetail.getStartTime(), taskDetail.getEndTime());
//总时间
Long totalTimeConsuming = duration.getSeconds();
RobotTaskTimeConsumingDO data = new RobotTaskTimeConsumingDO()
.setTaskDetailId(Long.valueOf(orderId))
.setTotalTimeConsuming(totalTimeConsuming + "");
robotTaskTimeConsumingService.updateConsuming(data);
}
private void takeRelease(RobotTaskDetailDO taskDetail, String endTime, String orderId) {
Duration duration = Duration.between(taskDetail.getStartTime(), taskDetail.getEndTime());
//总时间
Long totalTimeConsuming = duration.getSeconds();
String startPickKey = RobotTaskChcheConstant.ROBOT_TASK_START_PICK + orderId;
Object startPickObj = redisUtil.get(startPickKey);
String endPickKey = RobotTaskChcheConstant.ROBOT_TASK_END_PICK + orderId;
Object endPickObj = redisUtil.get(endPickKey);
Long pickTimeConsuming = getSeconds(startPickObj, endPickObj);
String startDropKey = RobotTaskChcheConstant.ROBOT_TASK_START_DROP + orderId;
Object startDropObj = redisUtil.get(startDropKey);
Long dropTimeConsuming = getSeconds(startDropObj, taskDetail.getEndTime());
Long checkTimeConsuming = getSeconds(startPickObj, taskDetail.getEndTime());
RobotTaskTimeConsumingDO data = new RobotTaskTimeConsumingDO()
.setTaskDetailId(Long.valueOf(orderId))
.setTotalTimeConsuming(totalTimeConsuming + "")
.setPickTimeConsuming(pickTimeConsuming + "")
.setDropTimeConsuming(dropTimeConsuming + "")
.setCheckTimeConsuming(checkTimeConsuming + "");
robotTaskTimeConsumingService.updateConsuming(data);
}
public Long getSeconds(Object startObj, Object endObj) {
String startObjStr = startObj.toString();
String endObjStr = endObj.toString();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
LocalDateTime startTime = LocalDateTime.parse(startObjStr, formatter);
LocalDateTime endTime = LocalDateTime.parse(endObjStr, formatter);
Duration duration = Duration.between(startTime, endTime);
return duration.getSeconds();
}
/**
* 统计工作时间
*
* @param data
*/
private void addTaskTimeLog(RobotWorkStatusDTO data) {
if (CommandTypeEnum.WORK_PICK_UP_GOODS_MOVE_TO_CHECK.getType().equals(data.getCommandType())
&& RobotExecutionStateConstant.DONE.equals(Integer.valueOf(data.getExecutionState()))) {
startPickUp(data);
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS_MOVE_TO_CHECK.getType().equals(data.getCommandType())
&& RobotExecutionStateConstant.DOING.equals(Integer.valueOf(data.getExecutionState()))) {
endPickUp(data);
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS_MOVE_TO_CHECK.getType().equals(data.getCommandType())
&& RobotExecutionStateConstant.DONE.equals(Integer.valueOf(data.getExecutionState()))) {
startDrop(data);
}
}
private void startDrop(RobotWorkStatusDTO data) {
String key = RobotTaskChcheConstant.ROBOT_TASK_START_DROP + data.getOrderId();
String yearMonthDayHourMinuteSecon = DateUtils.getYearMonthDayHourMinuteSecon();
redisUtil.set(key, yearMonthDayHourMinuteSecon, 86400);
log.info("111111任务:{}, 开始放货:{}", data.getOrderId(), yearMonthDayHourMinuteSecon);
}
private void endPickUp(RobotWorkStatusDTO data) {
String key = RobotTaskChcheConstant.ROBOT_TASK_END_PICK + data.getOrderId();
String yearMonthDayHourMinuteSecon = DateUtils.getYearMonthDayHourMinuteSecon();
redisUtil.set(key, yearMonthDayHourMinuteSecon, 86400);
log.info("111111任务:{}, 取货完成:{}", data.getOrderId(), yearMonthDayHourMinuteSecon);
}
private void startPickUp(RobotWorkStatusDTO data) {
String key = RobotTaskChcheConstant.ROBOT_TASK_START_PICK + data.getOrderId();
String yearMonthDayHourMinuteSecon = DateUtils.getYearMonthDayHourMinuteSecon();
redisUtil.set(key, yearMonthDayHourMinuteSecon, 86400);
log.info("111111任务:{}, 开始取货:{}", data.getOrderId(), yearMonthDayHourMinuteSecon);
}
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.system.mq.message.task;
import org.springframework.context.ApplicationEvent;
public class TaskDistributionMessage extends ApplicationEvent {
private String msg;
private String eventType;
public TaskDistributionMessage(Object source, String msg,String eventType) {
super(source);
this.msg = msg;
this.eventType = eventType;
}
public String getMessage() {
return msg;
}
public String getEventType() {
return eventType;
}
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.system.mq.producer.task;
import cn.iocoder.yudao.module.system.mq.message.RemoteSendMessage;
import cn.iocoder.yudao.module.system.mq.message.task.TaskDistributionMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component
public class TaskDistributionProducer {
@Resource
private ApplicationContext applicationContext;
public void sendSmsSendMessage(TaskDistributionMessage message) {
applicationContext.publishEvent(message);
}
}

View File

@ -0,0 +1,59 @@
package cn.iocoder.yudao.module.system.service.log;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskLineTimeConsumingDO;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 车辆行走路线耗时记录 Service 接口
*
* @author 陈宾顺
*/
public interface RobotTaskLineTimeConsumingService extends IService<RobotTaskLineTimeConsumingDO> {
/**
* 创建车辆行走路线耗时记录
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createTaskLineTimeConsuming(@Valid RobotTaskLineTimeConsumingSaveReqVO createReqVO);
/**
* 更新车辆行走路线耗时记录
*
* @param updateReqVO 更新信息
*/
void updateTaskLineTimeConsuming(@Valid RobotTaskLineTimeConsumingSaveReqVO updateReqVO);
/**
* 删除车辆行走路线耗时记录
*
* @param id 编号
*/
void deleteTaskLineTimeConsuming(Long id);
/**
* 获得车辆行走路线耗时记录
*
* @param id 编号
* @return 车辆行走路线耗时记录
*/
RobotTaskLineTimeConsumingDO getTaskLineTimeConsuming(Long id);
/**
* 获得车辆行走路线耗时记录分页
*
* @param pageReqVO 分页查询
* @return 车辆行走路线耗时记录分页
*/
PageResult<RobotTaskLineTimeConsumingDO> getTaskLineTimeConsumingPage(RobotTaskLineTimeConsumingPageReqVO pageReqVO);
void addTaskLineTimeConsuming(String message);
}

View File

@ -0,0 +1,144 @@
package cn.iocoder.yudao.module.system.service.log;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.system.controller.admin.log.dto.RobotTaskLineTimeConsumingDTO;
import cn.iocoder.yudao.module.system.controller.admin.log.dto.RobotTaskLineTimeConsumingDetailDTO;
import cn.iocoder.yudao.module.system.controller.admin.log.dto.RobotWalkingDistanceDTO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskLineTimeConsumingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskLineTimeConsumingDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import cn.iocoder.yudao.module.system.dal.mysql.log.RobotTaskLineTimeConsumingMapper;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_LINE_TIME_CONSUMING_NOT_EXISTS;
/**
* 车辆行走路线耗时记录 Service 实现类
*
* @author 陈宾顺
*/
@Service
@Validated
public class RobotTaskLineTimeConsumingServiceImpl extends ServiceImpl<RobotTaskLineTimeConsumingMapper, RobotTaskLineTimeConsumingDO> implements RobotTaskLineTimeConsumingService {
@Resource
private RobotTaskLineTimeConsumingMapper taskLineTimeConsumingMapper;
@Resource
private RobotTaskDetailService robotTaskDetailService;
@Override
public Long createTaskLineTimeConsuming(RobotTaskLineTimeConsumingSaveReqVO createReqVO) {
// 插入
RobotTaskLineTimeConsumingDO taskLineTimeConsuming = BeanUtils.toBean(createReqVO, RobotTaskLineTimeConsumingDO.class);
taskLineTimeConsumingMapper.insert(taskLineTimeConsuming);
// 返回
return taskLineTimeConsuming.getId();
}
@Override
public void updateTaskLineTimeConsuming(RobotTaskLineTimeConsumingSaveReqVO updateReqVO) {
// 校验存在
validateTaskLineTimeConsumingExists(updateReqVO.getId());
// 更新
RobotTaskLineTimeConsumingDO updateObj = BeanUtils.toBean(updateReqVO, RobotTaskLineTimeConsumingDO.class);
taskLineTimeConsumingMapper.updateById(updateObj);
}
@Override
public void deleteTaskLineTimeConsuming(Long id) {
// 校验存在
validateTaskLineTimeConsumingExists(id);
// 删除
taskLineTimeConsumingMapper.deleteById(id);
}
private void validateTaskLineTimeConsumingExists(Long id) {
if (taskLineTimeConsumingMapper.selectById(id) == null) {
throw exception(TASK_LINE_TIME_CONSUMING_NOT_EXISTS);
}
}
@Override
public RobotTaskLineTimeConsumingDO getTaskLineTimeConsuming(Long id) {
return taskLineTimeConsumingMapper.selectById(id);
}
@Override
public PageResult<RobotTaskLineTimeConsumingDO> getTaskLineTimeConsumingPage(RobotTaskLineTimeConsumingPageReqVO pageReqVO) {
return taskLineTimeConsumingMapper.selectPage(pageReqVO);
}
@Override
public void addTaskLineTimeConsuming(String message) {
RobotTaskLineTimeConsumingDTO data = JSON.parseObject(message , RobotTaskLineTimeConsumingDTO.class);
Long orderId = Long.valueOf(data.getOrderId());
String taskNo = robotTaskDetailService.getTaskNoByDetailId(orderId);
RobotTaskDetailDO taskDetail = robotTaskDetailService.getTaskDetail(orderId);
List<RobotTaskLineTimeConsumingDetailDTO> list = data.getList();
List<RobotTaskLineTimeConsumingDO> addList = new ArrayList<>();
for (RobotTaskLineTimeConsumingDetailDTO v : list) {
RobotTaskLineTimeConsumingDO line = BeanUtils.toBean(v, RobotTaskLineTimeConsumingDO.class);
line.setTaskNo(taskNo);
line.setTaskDetailId(orderId);
line.setRobotNo(taskDetail.getRobotNo());
line.setTotalTimeConsuming(v.getTimeConsuming());
if (ObjectUtil.isNotEmpty(v.getTimeConsuming()) && ObjectUtil.isNotEmpty(v.getTotalDistance())) {
BigDecimal distance = new BigDecimal(v.getTotalDistance());
BigDecimal timeConsuming = new BigDecimal(v.getTimeConsuming());
BigDecimal divide = distance.divide(timeConsuming,1, RoundingMode.HALF_UP);
line.setAverageSpeed(divide.toString());
}
addList.add(line);
}
taskLineTimeConsumingMapper.insertBatch(addList);
}
}

View File

@ -0,0 +1,62 @@
package cn.iocoder.yudao.module.system.service.log;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.log.dto.RobotWalkingDistanceDTO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskTimeConsumingDO;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 车辆任务行程耗时 Service 接口
*
* @author 陈宾顺
*/
public interface RobotTaskTimeConsumingService extends IService<RobotTaskTimeConsumingDO> {
/**
* 创建车辆任务行程耗时
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createRobotTaskTimeConsuming(@Valid RobotTaskTimeConsumingSaveReqVO createReqVO);
/**
* 更新车辆任务行程耗时
*
* @param updateReqVO 更新信息
*/
void updateRobotTaskTimeConsuming(@Valid RobotTaskTimeConsumingSaveReqVO updateReqVO);
/**
* 删除车辆任务行程耗时
*
* @param id 编号
*/
void deleteRobotTaskTimeConsuming(Long id);
/**
* 获得车辆任务行程耗时
*
* @param id 编号
* @return 车辆任务行程耗时
*/
RobotTaskTimeConsumingDO getRobotTaskTimeConsuming(Long id);
/**
* 获得车辆任务行程耗时分页
*
* @param pageReqVO 分页查询
* @return 车辆任务行程耗时分页
*/
PageResult<RobotTaskTimeConsumingDO> getRobotTaskTimeConsumingPage(RobotTaskTimeConsumingPageReqVO pageReqVO);
void updateTime(RobotWalkingDistanceDTO data);
void updateConsuming(RobotTaskTimeConsumingDO data);
}

View File

@ -0,0 +1,90 @@
package cn.iocoder.yudao.module.system.service.log;
import cn.iocoder.yudao.module.system.controller.admin.log.dto.RobotWalkingDistanceDTO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.RobotTaskTimeConsumingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskTimeConsumingDO;
import cn.iocoder.yudao.module.system.dal.mysql.log.RobotTaskTimeConsumingMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.ROBOT_TASK_TIME_CONSUMING_NOT_EXISTS;
/**
* 车辆任务行程耗时 Service 实现类
*
* @author 陈宾顺
*/
@Service
@Validated
public class RobotTaskTimeConsumingServiceImpl extends ServiceImpl<RobotTaskTimeConsumingMapper, RobotTaskTimeConsumingDO> implements RobotTaskTimeConsumingService {
@Resource
private RobotTaskTimeConsumingMapper robotTaskTimeConsumingMapper;
@Override
public Long createRobotTaskTimeConsuming(RobotTaskTimeConsumingSaveReqVO createReqVO) {
// 插入
RobotTaskTimeConsumingDO robotTaskTimeConsuming = BeanUtils.toBean(createReqVO, RobotTaskTimeConsumingDO.class);
robotTaskTimeConsumingMapper.insert(robotTaskTimeConsuming);
// 返回
return robotTaskTimeConsuming.getId();
}
@Override
public void updateRobotTaskTimeConsuming(RobotTaskTimeConsumingSaveReqVO updateReqVO) {
// 校验存在
validateRobotTaskTimeConsumingExists(updateReqVO.getId());
// 更新
RobotTaskTimeConsumingDO updateObj = BeanUtils.toBean(updateReqVO, RobotTaskTimeConsumingDO.class);
robotTaskTimeConsumingMapper.updateById(updateObj);
}
@Override
public void deleteRobotTaskTimeConsuming(Long id) {
// 校验存在
validateRobotTaskTimeConsumingExists(id);
// 删除
robotTaskTimeConsumingMapper.deleteById(id);
}
private void validateRobotTaskTimeConsumingExists(Long id) {
if (robotTaskTimeConsumingMapper.selectById(id) == null) {
throw exception(ROBOT_TASK_TIME_CONSUMING_NOT_EXISTS);
}
}
@Override
public RobotTaskTimeConsumingDO getRobotTaskTimeConsuming(Long id) {
return robotTaskTimeConsumingMapper.selectById(id);
}
@Override
public PageResult<RobotTaskTimeConsumingDO> getRobotTaskTimeConsumingPage(RobotTaskTimeConsumingPageReqVO pageReqVO) {
return robotTaskTimeConsumingMapper.selectPage(pageReqVO);
}
@Override
public void updateTime(RobotWalkingDistanceDTO data) {
RobotTaskTimeConsumingDO updateObj = BeanUtils.toBean(data, RobotTaskTimeConsumingDO.class);
updateObj.setTaskDetailId(Long.valueOf(data.getOrderId()));
updateConsuming(updateObj);
}
@Override
public void updateConsuming(RobotTaskTimeConsumingDO data) {
RobotTaskTimeConsumingDO entity = BeanUtils.toBean(data, RobotTaskTimeConsumingDO.class);
robotTaskTimeConsumingMapper.updateEntity(entity);
}
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.system.service.mqtt;
import cn.iocoder.yudao.module.system.service.log.RobotTaskLineTimeConsumingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
@Slf4j
public class PlanningRobotLineDistanceServiceImpl implements MqttService{
@Resource
private RobotTaskLineTimeConsumingService taskLineTimeConsumingService;
@Override
public void analysisMessage(String message) {
taskLineTimeConsumingService.addTaskLineTimeConsuming(message);
}
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.system.service.mqtt;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotGenericsDataDTO;
import cn.iocoder.yudao.module.system.controller.admin.log.dto.RobotWalkingDistanceDTO;
import cn.iocoder.yudao.module.system.service.log.RobotTaskTimeConsumingService;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
@Slf4j
public class PlanningRobotWalkingDistanceServiceImpl implements MqttService{
@Resource
private RobotTaskTimeConsumingService robotTaskTimeConsumingService;
@Override
public void analysisMessage(String message) {
RobotWalkingDistanceDTO data = JSON.parseObject(message , RobotWalkingDistanceDTO.class);
robotTaskTimeConsumingService.updateTime(data);
}
}

View File

@ -265,4 +265,9 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
void initRobotInformation();
/**
* 锁车
* @param robotNo
*/
void lockRobot(String robotNo);
}

View File

@ -389,6 +389,11 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
informationMapper.initRobotInformation();
}
@Override
public void lockRobot(String robotNo) {
informationMapper.updateRobotTaskModel(robotNo,ZeroOneEnum.ZERO.getType());
}
/**
* 校验IP地址是否合法
@ -424,12 +429,12 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
}
}
RemoteControllerInformationDO remoteControllerInformation = controllerInformationMapper.selectOne(new LambdaQueryWrapper<RemoteControllerInformationDO>()
/*RemoteControllerInformationDO remoteControllerInformation = controllerInformationMapper.selectOne(new LambdaQueryWrapper<RemoteControllerInformationDO>()
.eq(RemoteControllerInformationDO::getRobotNo, robotInformationDO.getRobotNo())
.last("limit 1"));
if (ObjectUtil.isNotEmpty(remoteControllerInformation)) {
throw exception(ROBOT_DOING_REMOTE);
}
}*/
if (!updateReqVO.getRobotNo().equals(robotInformationDO.getRobotNo())
|| !updateReqVO.getMacAddress().equals(robotInformationDO.getMacAddress())) {

View File

@ -60,6 +60,10 @@ import cn.iocoder.yudao.module.system.enums.robot.task.RobotCommandTypeEnum;
//import cn.iocoder.yudao.module.system.service.robot.job.RobotCommonTaskService;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskManualInterventionEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.event.RobotTaskEventTypeEnum;
import cn.iocoder.yudao.module.system.mq.message.task.TaskDistributionMessage;
import cn.iocoder.yudao.module.system.mq.producer.remote.RemoteControllerProducer;
import cn.iocoder.yudao.module.system.mq.producer.task.TaskDistributionProducer;
import cn.iocoder.yudao.module.system.service.information.DeviceInformationService;
import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService;
import cn.iocoder.yudao.module.system.service.log.UserOperationLogService;
@ -172,10 +176,10 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
private RobotTaskDetailActionLogService taskDetailActionLogService;
@Resource
private RobotWorkingHoursStatisticsService robotWorkingHoursStatisticsService;
private RobotSimulationService robotSimulationService;
@Resource
private RobotSimulationService robotSimulationService;
private TaskDistributionProducer taskDistributionProducer;
@Override
@Transactional(rollbackFor = Exception.class)
@ -534,7 +538,7 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType());
}*/
// robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType());
// robotInformationDO.setRobotStatus(RobotStatusEnum.STAND_BY.getType());
robotInformationDO.setRobotStatus(RobotStatusEnum.STAND_BY.getType());
}
informationMapper.updateById(robotInformationDOS);
@ -644,7 +648,13 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
}
taskDetailActionLogService.createTaskDetailActionLog(logOne);
robotWorkingHoursStatisticsService.createFreeTime(taskAssignDTO.getRobotNo());
try {
TaskDistributionMessage mess = new TaskDistributionMessage(this,taskAssignDTO.getOrderId()+"",
RobotTaskEventTypeEnum.DISTRIBUTION.getType());
taskDistributionProducer.sendSmsSendMessage(mess);
} catch (Exception e) {
log.info(e.getMessage());
}
}

View File

@ -211,7 +211,7 @@ public class CycleServiceImpl implements CycleService {
* @return
*/
public RobotTaskDO getTaskData(String incrementByKey, RobotTaskDO v ) {
String taskNoStr = znConfigConstant.getMoveNo() + DateUtils.getYearMonthDay() + incrementByKey;
String taskNoStr = znConfigConstant.getTaskNo() + DateUtils.getYearMonthDay() + incrementByKey;
RobotTaskDO task = new RobotTaskDO();
BeanUtils.copyProperties(v, task);
task.setRemainingCycleNumber(v.getRemainingCycleNumber() - 1);

View File

@ -558,14 +558,14 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
return;
}
/*WareHouseLocationDO nextLocation = locationMapper.selectOne(new LambdaQueryWrapperX<WareHouseLocationDO>()
WareHouseLocationDO nextLocation = locationMapper.selectOne(new LambdaQueryWrapperX<WareHouseLocationDO>()
.eq(WareHouseLocationDO::getId, toLocation.getMapItemId())
.eq(WareHouseLocationDO::getLocationStorey, toLocation.getLocationStorey() - 1)
.last("limit 1"));
if (ObjectUtil.isNotEmpty(nextLocation) && ObjectUtil.isNotEmpty(nextLocation.getLocationTotalHeight())) {
pathPlanning.setReleaseHeight(Double.valueOf(nextLocation.getLocationTotalHeight() + ""));
return;
}*/
}
Integer locationStorey = toLocation.getLocationStorey() - 1;
double height = locationStorey * znConfigConstant.getRobotConfig().getDefaultTrayHeight();
@ -580,10 +580,10 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
* @param fromLocation
*/
private void pathPlanningSetTakeHeight(TaskToPathPlanningDTO pathPlanning, WareHouseLocationDO fromLocation) {
/*if (ObjectUtil.isNotEmpty(fromLocation.getLocationTotalHeight())) {
if (ObjectUtil.isNotEmpty(fromLocation.getLocationTotalHeight())) {
pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTotalHeight() + ""));
return;
}*/
}
Integer locationStorey = fromLocation.getLocationStorey();
double height = locationStorey * znConfigConstant.getRobotConfig().getDefaultTrayHeight();
log.info("取货设置默认取货高度 :{}", height);

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.actionlog.RobotOperationLogMapper">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.log.RobotOperationLogMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.log.RobotTaskTimeConsumingMapper">
<!--通过主键修改数据-->
<update id="updateEntity">
update robot_task_time_consuming
<set>
<if test="taskNo != null and taskNo != ''">
task_no = #{taskNo},
</if>
<if test="taskDetailId != null">
task_detail_id = #{taskDetailId},
</if>
<if test="fromLocationStorey != null">
from_location_storey = #{fromLocationStorey},
</if>
<if test="toLocationStorey != null">
to_location_storey = #{toLocationStorey},
</if>
<if test="fromLocationNo != null and fromLocationNo != ''">
from_location_no = #{fromLocationNo},
</if>
<if test="toLocationNo != null and toLocationNo != ''">
to_location_no = #{toLocationNo},
</if>
<if test="totalDistance != null and totalDistance != ''">
total_distance = #{totalDistance},
</if>
<if test="totalTimeConsuming != null and totalTimeConsuming != ''">
total_time_consuming = #{totalTimeConsuming},
</if>
<if test="checkDistance != null and checkDistance != ''">
check_distance = #{checkDistance},
</if>
<if test="checkTimeConsuming != null and checkTimeConsuming != ''">
check_time_consuming = #{checkTimeConsuming},
</if>
<if test="pickTimeConsuming != null and pickTimeConsuming != ''">
pick_time_consuming = #{pickTimeConsuming},
</if>
<if test="dropTimeConsuming != null and dropTimeConsuming != ''">
drop_time_consuming = #{dropTimeConsuming},
</if>
<if test="creator != null and creator != ''">
creator = #{creator},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
<if test="updater != null and updater != ''">
updater = #{updater},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="deleted != null">
deleted = #{deleted},
</if>
<if test="tenantId != null">
tenant_id = #{tenantId},
</if>
<if test="robotNo != null and robotNo != ''">
robot_no = #{robotNo},
</if>
</set>
where task_detail_id = #{taskDetailId}
</update>
</mapper>

View File

@ -131,9 +131,10 @@
update
robot_information
set
robot_status = '3',
robot_task_model = #{robotTaskModel}
where
robot_no = = #{robotNo}
robot_no = #{robotNo}
</update>