diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml index 66c68fb66..b60e03d85 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml @@ -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 \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index e48f9ec05..476bf5cd6 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -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, "车辆行走路线耗时记录不存在"); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java index 669a9de7e..3ed805f86 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java @@ -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()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotWorkStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotWorkStatusApiImpl.java index 4229b0780..f4ac31311 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotWorkStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotWorkStatusApiImpl.java @@ -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()))) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttCallBack.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttCallBack.java index d0d22a9cf..163fdfe15 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttCallBack.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttCallBack.java @@ -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); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttFactory.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttFactory.java index 9b547a2e3..f48efadae 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttFactory.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/MqttFactory.java @@ -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 : diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/enums/DefineSubTopicEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/enums/DefineSubTopicEnum.java index c75ab8e86..b99243233 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/enums/DefineSubTopicEnum.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/config/mqtt/enums/DefineSubTopicEnum.java @@ -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,"远遥车辆行走导航"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java index 99a15f076..229ea95d3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java @@ -52,4 +52,16 @@ public class RobotTaskChcheConstant { //所有的车辆信息 获得到一个map, key是 mac,value是具体信息 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"; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/RobotTaskLineTimeConsumingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/RobotTaskLineTimeConsumingController.java new file mode 100644 index 000000000..3342b7231 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/RobotTaskLineTimeConsumingController.java @@ -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 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 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 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 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> getTaskLineTimeConsumingPage(@Valid RobotTaskLineTimeConsumingPageReqVO pageReqVO) { + PageResult 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 list = taskLineTimeConsumingService.getTaskLineTimeConsumingPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "车辆行走路线耗时记录.xls", "数据", RobotTaskLineTimeConsumingRespVO.class, + BeanUtils.toBean(list, RobotTaskLineTimeConsumingRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/RobotTaskTimeConsumingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/RobotTaskTimeConsumingController.java new file mode 100644 index 000000000..be9c245a1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/RobotTaskTimeConsumingController.java @@ -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 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 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 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 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> getRobotTaskTimeConsumingPage(@Valid RobotTaskTimeConsumingPageReqVO pageReqVO) { + PageResult 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 list = robotTaskTimeConsumingService.getRobotTaskTimeConsumingPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "车辆任务行程耗时.xls", "数据", RobotTaskTimeConsumingRespVO.class, + BeanUtils.toBean(list, RobotTaskTimeConsumingRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotTaskLineTimeConsumingDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotTaskLineTimeConsumingDTO.java new file mode 100644 index 000000000..7c4d40ef4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotTaskLineTimeConsumingDTO.java @@ -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 list; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotTaskLineTimeConsumingDetailDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotTaskLineTimeConsumingDetailDTO.java new file mode 100644 index 000000000..2b0f9dc74 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotTaskLineTimeConsumingDetailDTO.java @@ -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; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotWalkingDistanceDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotWalkingDistanceDTO.java new file mode 100644 index 000000000..23c5f727d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/dto/RobotWalkingDistanceDTO.java @@ -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; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingPageReqVO.java new file mode 100644 index 000000000..d408d3d86 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingPageReqVO.java @@ -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; +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingRespVO.java new file mode 100644 index 000000000..2b5f11ded --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingRespVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingSaveReqVO.java new file mode 100644 index 000000000..2c70f8e72 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskLineTimeConsumingSaveReqVO.java @@ -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; +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingPageReqVO.java new file mode 100644 index 000000000..54ffab65c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingPageReqVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingRespVO.java new file mode 100644 index 000000000..43c551f9a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingRespVO.java @@ -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; +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingSaveReqVO.java new file mode 100644 index 000000000..72c4a91ff --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/log/vo/RobotTaskTimeConsumingSaveReqVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/RobotTaskLineTimeConsumingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/RobotTaskLineTimeConsumingDO.java new file mode 100644 index 000000000..c670d85a9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/RobotTaskLineTimeConsumingDO.java @@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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; +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/RobotTaskTimeConsumingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/RobotTaskTimeConsumingDO.java new file mode 100644 index 000000000..ee8f1d389 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/RobotTaskTimeConsumingDO.java @@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskLineTimeConsumingMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskLineTimeConsumingMapper.java new file mode 100644 index 000000000..fd8c5b394 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskLineTimeConsumingMapper.java @@ -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 { + + default PageResult selectPage(RobotTaskLineTimeConsumingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .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)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskTimeConsumingMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskTimeConsumingMapper.java new file mode 100644 index 000000000..adc1e86b7 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/log/RobotTaskTimeConsumingMapper.java @@ -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 { + + default PageResult selectPage(RobotTaskTimeConsumingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .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); +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/task/event/RobotTaskEventTypeEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/task/event/RobotTaskEventTypeEnum.java new file mode 100644 index 000000000..15d27fd44 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/robot/task/event/RobotTaskEventTypeEnum.java @@ -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; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/task/TaskDistributionConsumer.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/task/TaskDistributionConsumer.java new file mode 100644 index 000000000..121099250 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/task/TaskDistributionConsumer.java @@ -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); + } + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/message/task/TaskDistributionMessage.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/message/task/TaskDistributionMessage.java new file mode 100644 index 000000000..9d3e1a960 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/message/task/TaskDistributionMessage.java @@ -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; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/producer/task/TaskDistributionProducer.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/producer/task/TaskDistributionProducer.java new file mode 100644 index 000000000..e9323b4d2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/producer/task/TaskDistributionProducer.java @@ -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); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingService.java new file mode 100644 index 000000000..b9a8cef79 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingService.java @@ -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 { + + /** + * 创建车辆行走路线耗时记录 + * + * @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 getTaskLineTimeConsumingPage(RobotTaskLineTimeConsumingPageReqVO pageReqVO); + + void addTaskLineTimeConsuming(String message); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingServiceImpl.java new file mode 100644 index 000000000..d33e63017 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskLineTimeConsumingServiceImpl.java @@ -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 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 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 list = data.getList(); + List 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); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskTimeConsumingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskTimeConsumingService.java new file mode 100644 index 000000000..33d943213 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskTimeConsumingService.java @@ -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 { + + /** + * 创建车辆任务行程耗时 + * + * @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 getRobotTaskTimeConsumingPage(RobotTaskTimeConsumingPageReqVO pageReqVO); + + void updateTime(RobotWalkingDistanceDTO data); + + void updateConsuming(RobotTaskTimeConsumingDO data); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskTimeConsumingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskTimeConsumingServiceImpl.java new file mode 100644 index 000000000..9ca012ed5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/log/RobotTaskTimeConsumingServiceImpl.java @@ -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 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 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); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mqtt/PlanningRobotLineDistanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mqtt/PlanningRobotLineDistanceServiceImpl.java new file mode 100644 index 000000000..8f333fe10 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mqtt/PlanningRobotLineDistanceServiceImpl.java @@ -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); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mqtt/PlanningRobotWalkingDistanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mqtt/PlanningRobotWalkingDistanceServiceImpl.java new file mode 100644 index 000000000..6ebb4ad31 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mqtt/PlanningRobotWalkingDistanceServiceImpl.java @@ -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); + } +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java index dbcb616fb..18fbbe4a6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java @@ -265,4 +265,9 @@ public interface RobotInformationService extends IService { void initRobotInformation(); + /** + * 锁车 + * @param robotNo + */ + void lockRobot(String robotNo); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java index e71097ddc..e08c0ddb0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java @@ -389,6 +389,11 @@ public class RobotInformationServiceImpl extends ServiceImpl() + /*RemoteControllerInformationDO remoteControllerInformation = controllerInformationMapper.selectOne(new LambdaQueryWrapper() .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())) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java index 798d49c2b..26ed1552f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java @@ -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() + WareHouseLocationDO nextLocation = locationMapper.selectOne(new LambdaQueryWrapperX() .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); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/log/RobotOperationLogMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/log/RobotOperationLogMapper.xml index eba80c892..621d65a96 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/log/RobotOperationLogMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/log/RobotOperationLogMapper.xml @@ -1,6 +1,6 @@ - + + + update robot_task_time_consuming + + + task_no = #{taskNo}, + + + task_detail_id = #{taskDetailId}, + + + from_location_storey = #{fromLocationStorey}, + + + to_location_storey = #{toLocationStorey}, + + + from_location_no = #{fromLocationNo}, + + + to_location_no = #{toLocationNo}, + + + total_distance = #{totalDistance}, + + + total_time_consuming = #{totalTimeConsuming}, + + + check_distance = #{checkDistance}, + + + check_time_consuming = #{checkTimeConsuming}, + + + pick_time_consuming = #{pickTimeConsuming}, + + + drop_time_consuming = #{dropTimeConsuming}, + + + creator = #{creator}, + + + create_time = #{createTime}, + + + updater = #{updater}, + + + update_time = #{updateTime}, + + + deleted = #{deleted}, + + + tenant_id = #{tenantId}, + + + robot_no = #{robotNo}, + + + where task_detail_id = #{taskDetailId} + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml index fb0c1b225..cf0f16a60 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml @@ -131,9 +131,10 @@ update robot_information set + robot_status = '3', robot_task_model = #{robotTaskModel} where - robot_no = = #{robotNo} + robot_no = #{robotNo}