| | |
| | | LOC_TO_STA: 'LOC_TO_STA', |
| | | STA_TO_LOC: 'STA_TO_LOC', |
| | | STA_TO_STA: 'STA_TO_STA', |
| | | CANCEL_TASK: 'CANCEL_TASK', |
| | | TO_CHARGE: 'TO_CHARGE', |
| | | STOP_CHARGING: 'STOP_CHARGING', |
| | | LIFT_UP: 'LIFT_UP', |
| | | LIFT_DOWN: 'LIFT_DOWN', |
| | | CANCEL_TASK: 'CANCEL_TASK', |
| | | }, |
| | | startCode: 'Source Point', |
| | | endCode: 'Destination Point', |
| | |
| | | LOC_TO_STA: '库位到站点', |
| | | STA_TO_LOC: '站点到库位', |
| | | STA_TO_STA: '站点到站点', |
| | | CANCEL_TASK: '取消任务', |
| | | TO_CHARGE: '去充电', |
| | | STOP_CHARGING: '断开充电', |
| | | LIFT_UP: '原地举升', |
| | | LIFT_DOWN: '原地下放', |
| | | CANCEL_TASK: '取消任务', |
| | | }, |
| | | startCode: '起始定位点', |
| | | endCode: '目标定位点', |
| | |
| | | }) |
| | | } |
| | | |
| | | export const handleLiftUpAgv = async (param, callback) => { |
| | | await request.post('/handler/control/agv/load/lift/up', param, { |
| | | headers: { |
| | | 'appKey': HANDLE_APP_KEY |
| | | } |
| | | }).then((res) => { |
| | | const { code, msg, data } = res.data; |
| | | if (code === 200) { |
| | | notify.success(msg); |
| | | if (callback) { |
| | | callback(data) |
| | | } |
| | | } else { |
| | | notify.error(msg); |
| | | } |
| | | }).catch((error) => { |
| | | notify.error(error.message); |
| | | console.error(error.message); |
| | | }) |
| | | } |
| | | |
| | | export const handleLiftDownAgv = async (param, callback) => { |
| | | await request.post('/handler/control/agv/load/lift/down', param, { |
| | | headers: { |
| | | 'appKey': HANDLE_APP_KEY |
| | | } |
| | | }).then((res) => { |
| | | const { code, msg, data } = res.data; |
| | | if (code === 200) { |
| | | notify.success(msg); |
| | | if (callback) { |
| | | callback(data) |
| | | } |
| | | } else { |
| | | notify.error(msg); |
| | | } |
| | | }).catch((error) => { |
| | | notify.error(error.message); |
| | | console.error(error.message); |
| | | }) |
| | | } |
| | | |
| | | export const handleRestoreAgvAll = async (param, callback) => { |
| | | await request.post('/handler/restore/agv', param, { |
| | | headers: { |
| | |
| | | import CheckOutlinedIcon from '@mui/icons-material/CheckOutlined'; |
| | | import RestartAltIcon from '@mui/icons-material/RestartAlt'; |
| | | import useCoolHook from './useCoolHook'; |
| | | import { handleCancelTaskAgv, handleControlAgv, handleStopChargingAgv } from '../../http'; |
| | | import { handleCancelTaskAgv, handleControlAgv, handleLiftDownAgv, handleLiftUpAgv, handleStopChargingAgv } from '../../http'; |
| | | |
| | | function AgvControl(props) { |
| | | const { curAgvNo, curAgvInfo } = props; |
| | |
| | | value: 'STOP_CHARGING', |
| | | label: translate('page.map.insight.control.type.STOP_CHARGING') |
| | | }, { |
| | | value: 'LIFT_UP', |
| | | label: translate('page.map.insight.control.type.LIFT_UP') |
| | | }, { |
| | | value: 'LIFT_DOWN', |
| | | label: translate('page.map.insight.control.type.LIFT_DOWN') |
| | | }, { |
| | | value: 'CANCEL_TASK', |
| | | label: translate('page.map.insight.control.type.CANCEL_TASK') |
| | | }] : []), |
| | |
| | | |
| | | const onSubmit = (data) => { |
| | | if (curAgvNo) { |
| | | if (data.taskMode === 'LIFT_UP') { |
| | | handleLiftUpAgv({ agvNo: curAgvNo }, () => { |
| | | |
| | | }); |
| | | return; |
| | | } |
| | | if (data.taskMode === 'LIFT_DOWN') { |
| | | handleLiftDownAgv({ agvNo: curAgvNo }, () => { |
| | | |
| | | }); |
| | | return; |
| | | } |
| | | if (data.taskMode === 'CANCEL_TASK') { |
| | | handleCancelTaskAgv({ agvNo: curAgvNo }, () => { |
| | | |
| | |
| | | return R.ok("取消任务指令已发送"); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('manager:agv:update')") |
| | | @PostMapping("/control/agv/load/lift/up") |
| | | public R liftAgvLoadPlatform(@RequestHeader String appKey, |
| | | @RequestBody HandlerPublishParam param) { |
| | | if (Cools.isEmpty(param.getAgvNo(), appKey)) { |
| | | return R.error(); |
| | | } |
| | | if (!APP_KEY.equals(appKey)) { |
| | | return R.error(); |
| | | } |
| | | |
| | | Agv agv = agvService.selectByUuid(param.getAgvNo()); |
| | | if (agv == null) { |
| | | return R.error("AGV不存在"); |
| | | } |
| | | if (!agvService.judgeEnable(agv.getId())) { |
| | | log.info("{}号AGV不可用,举升失败...", agv.getUuid()); |
| | | return R.error(); |
| | | } |
| | | AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); |
| | | if (agvModel == null || !AgvModelType.UNDERDRIVE_AGV.toString().equals(agvModel.getType())) { |
| | | return R.error("当前AGV车型不支持载货台举升"); |
| | | } |
| | | if (!hikInstantActionPublishService.support(agv.getId())) { |
| | | return R.error("当前AGV协议不支持载货台举升"); |
| | | } |
| | | if (agvModel.getLiftHeight() == null) { |
| | | return R.error("当前AGV车型未配置举升高度"); |
| | | } |
| | | |
| | | hikInstantActionPublishService.publishPick(agv.getUuid(), agvModel.getLiftHeight() / 1000D); |
| | | return R.ok("载货台举升指令已发送"); |
| | | } |
| | | |
| | | @PreAuthorize("hasAuthority('manager:agv:update')") |
| | | @PostMapping("/control/agv/load/lift/down") |
| | | public R downAgvLoadPlatform(@RequestHeader String appKey, |
| | | @RequestBody HandlerPublishParam param) { |
| | | if (Cools.isEmpty(param.getAgvNo(), appKey)) { |
| | | return R.error(); |
| | | } |
| | | if (!APP_KEY.equals(appKey)) { |
| | | return R.error(); |
| | | } |
| | | |
| | | Agv agv = agvService.selectByUuid(param.getAgvNo()); |
| | | if (agv == null) { |
| | | return R.error("AGV不存在"); |
| | | } |
| | | if (!agvService.judgeEnable(agv.getId())) { |
| | | log.info("{}号AGV不可用,下放失败...", agv.getUuid()); |
| | | return R.error(); |
| | | } |
| | | AgvModel agvModel = agvModelService.getByAgvId(agv.getId()); |
| | | if (agvModel == null || !AgvModelType.UNDERDRIVE_AGV.toString().equals(agvModel.getType())) { |
| | | return R.error("当前AGV车型不支持载货台下降"); |
| | | } |
| | | if (!hikInstantActionPublishService.support(agv.getId())) { |
| | | return R.error("当前AGV协议不支持载货台下降"); |
| | | } |
| | | |
| | | hikInstantActionPublishService.publishDrop(agv.getUuid()); |
| | | return R.ok("载货台下降指令已发送"); |
| | | } |
| | | |
| | | @RequestMapping(value = "/restore/agv", method = {RequestMethod.GET, RequestMethod.POST}) |
| | | public R restoreAgv(@RequestHeader String appKey, @RequestBody HandlerPublishParam param) { |
| | | if (Cools.isEmpty(appKey)) { |
| | |
| | | private SnowflakeIdWorker snowflakeIdWorker; |
| | | @Autowired |
| | | private AgvModelService agvModelService; |
| | | |
| | | public boolean support(Long agvId) { |
| | | AgvModel agvModel = agvModelService.getByAgvId(agvId); |
| | | if (agvModel == null || Cools.isEmpty(agvModel.getProtocol())) { |
| | |
| | | } |
| | | |
| | | publish(agvNo, buildStopChargingAction(), "stopCharging"); |
| | | } |
| | | |
| | | public void publishPick(String agvNo, Double heightMeters) { |
| | | if (Cools.isEmpty(agvNo) || heightMeters == null) { |
| | | throw new CoolException("pick params can not be blank"); |
| | | } |
| | | publish(agvNo, buildPickAction(heightMeters), "pick"); |
| | | } |
| | | |
| | | public void publishDrop(String agvNo) { |
| | | if (Cools.isEmpty(agvNo)) { |
| | | throw new CoolException("drop params can not be blank"); |
| | | } |
| | | publish(agvNo, buildDropAction(), "drop"); |
| | | } |
| | | |
| | | private HkAction buildCancelOrderAction() { |
| | |
| | | return action; |
| | | } |
| | | |
| | | private HkAction buildPickAction(Double heightMeters) { |
| | | HkAction action = new HkAction(); |
| | | action.setActionId("pick-" + snowflakeIdWorker.nextId()); |
| | | action.setActionType(HkActionType.PICK); |
| | | action.setBlockingType(HkBlockingType.HARD); |
| | | |
| | | List<HkActionParameter> parameters = new ArrayList<>(); |
| | | addParameter(parameters, "loadId", ""); |
| | | addParameter(parameters, "loadType", "0"); |
| | | // addParameter(parameters, "height", heightMeters); |
| | | // addParameter(parameters, "precision", 0.02); |
| | | action.setActionParameters(parameters); |
| | | return action; |
| | | } |
| | | |
| | | private HkAction buildDropAction() { |
| | | HkAction action = new HkAction(); |
| | | action.setActionId("drop-" + snowflakeIdWorker.nextId()); |
| | | action.setActionType(HkActionType.DROP); |
| | | action.setBlockingType(HkBlockingType.HARD); |
| | | |
| | | List<HkActionParameter> parameters = new ArrayList<>(); |
| | | addParameter(parameters, "loadId", ""); |
| | | addParameter(parameters, "loadType", "0"); |
| | | // addParameter(parameters, "precision", 0.02); |
| | | // addParameter(parameters, "tabZero", Boolean.FALSE); |
| | | action.setActionParameters(parameters); |
| | | return action; |
| | | } |
| | | |
| | | private void publish(String agvNo, HkAction action, String actionName) { |
| | | HkInstantActionMessage message = new HkInstantActionMessage(); |
| | | message.setHeaderId(snowflakeIdWorker.nextId()); |
| | |
| | | log.info("push hik {} instant action to redis, agvNo={}, redisKey={}", |
| | | actionName, agvNo, RedisConstant.HK_AGV_INSTANT_ACTION_DOWN_FLAG); |
| | | } |
| | | |
| | | private void addParameter(List<HkActionParameter> parameters, String key, Object value) { |
| | | if (value == null) { |
| | | return; |
| | | } |
| | | HkActionParameter parameter = new HkActionParameter(); |
| | | parameter.setKey(key); |
| | | parameter.setValue(value); |
| | | parameters.add(parameter); |
| | | } |
| | | } |