@ -14,11 +14,15 @@ import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDet
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotTaskDetailLogVO ;
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskPPDistribution ;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.* ;
import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.houselane.WareHouseLaneDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO ;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO ;
import cn.iocoder.yudao.module.system.dal.mysql.housearea.HouseAreaMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.houselane.WareHouseLaneMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotChargeLogMapper ;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper ;
@ -30,6 +34,7 @@ import cn.iocoder.yudao.module.system.service.robot.job.RobotCommonTaskService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil ;
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils ;
import com.alibaba.fastjson.JSON ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.baomidou.mybatisplus.core.metadata.IPage ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl ;
import com.google.common.collect.Lists ;
@ -100,9 +105,19 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
@Value ( " ${zn.task-no:ZN} " )
private String taskNo ;
@Value ( " ${zn.do_cycle:true} " )
private Boolean doCycle ;
@Value ( " ${zn.task.check_sku_info:true} " )
private Boolean checkSkuInfo ;
@Resource
private WareHouseLaneMapper houseLaneMapper ;
@Resource
private HouseAreaMapper houseAreaMapper ;
@Override
@Transactional ( rollbackFor = Exception . class )
public Long createTask ( RobotTaskSaveReqVO createReqVO ) throws InterruptedException {
@ -229,8 +244,10 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
List < RobotTaskDetailAddVO > taskDetailList = createReqVO . getTaskDetailList ( ) ;
List < RobotTaskDetailAddVO > newTaskDetailList = new ArrayList < > ( ) ;
List < Long > toLocationIds = new ArrayList < > ( ) ; / / 被此次任务锁定的空库位id
List < Long > fromLocationIds = new ArrayList < > ( ) ; / / 被此次任务锁定的有货库位id
/ / 被此次任务锁定的空库位id
List < Long > toLocationIds = new ArrayList < > ( ) ;
/ / 被此次任务锁定的有货库位id
List < Long > fromLocationIds = new ArrayList < > ( ) ;
for ( RobotTaskDetailAddVO robotTaskVo : taskDetailList ) {
Set < Long > mapIds = new HashSet < > ( ) ;
if ( ObjectUtil . isNotEmpty ( robotTaskVo . getRobotNo ( ) ) ) {
@ -356,36 +373,64 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @return
* /
@Transactional ( rollbackFor = Exception . class )
public List < Long > setSingleLocationIdNo ( List < RobotTaskDetailAddVO > taskDetailList , RobotTaskDO task ) {
public List < Long > setSingleLocationIdNo ( List < RobotTaskDetailAddVO > taskDetailList , RobotTaskDO task ) {
/ / 取货中的map_item_id , 此集合不能执行放货的任务
List < Long > takeMapItemIds = taskDetailMapper . selectTakeMapItemIds ( ) ;
if ( ObjectUtil . isEmpty ( takeMapItemIds ) ) {
takeMapItemIds = new ArrayList < > ( ) ;
}
/ / 放货中的map_item_id , 此集合不能执行取货的任务
List < Long > releaseMapItemIds = taskDetailMapper . selectReleaseMapItemIds ( ) ;
if ( ObjectUtil . isEmpty ( releaseMapItemIds ) ) {
releaseMapItemIds = new ArrayList < > ( ) ;
}
List < Long > locationIds = new ArrayList < > ( ) ;
List < Long > laneIds = new ArrayList < > ( ) ;
List < Long > areaIds = new ArrayList < > ( ) ;
if ( ObjectUtil . isNotEmpty ( task . getSkuInfo ( ) ) & & checkSkuInfo ) {
List < WareHouseLaneDO > wareHouseLaneDOS = houseLaneMapper . selectList ( new LambdaQueryWrapper < WareHouseLaneDO > ( )
. eq ( WareHouseLaneDO : : getLaneMsg , task . getSkuInfo ( ) ) ) ;
if ( ObjectUtil . isNotEmpty ( wareHouseLaneDOS ) ) {
laneIds = wareHouseLaneDOS . stream ( ) . map ( WareHouseLaneDO : : getId ) . collect ( Collectors . toList ( ) ) ;
}
List < HouseAreaDO > houseAreaDOS = houseAreaMapper . selectList ( new LambdaQueryWrapper < HouseAreaDO > ( )
. eq ( HouseAreaDO : : getSkuInfo , task . getSkuInfo ( ) ) ) ;
if ( ObjectUtil . isNotEmpty ( wareHouseLaneDOS ) ) {
areaIds = houseAreaDOS . stream ( ) . map ( HouseAreaDO : : getId ) . collect ( Collectors . toList ( ) ) ;
}
}
for ( RobotTaskDetailAddVO robotTaskVo : taskDetailList ) {
robotTaskVo . setRobotTaskId ( task . getId ( ) ) ;
robotTaskVo . setPriority ( task . getPriority ( ) ) ;
RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum . getRobotTaskType ( robotTaskVo . getTaskType ( ) ) ;
switch ( robotTaskType ) {
case TAKE_RELEASE :
doTakeRelease ( robotTaskVo , locationIds ) ;
doTakeRelease ( robotTaskVo , locationIds ,takeMapItemIds , releaseMapItemIds , laneIds , areaIds );
break ;
case PARK :
doPark ( robotTaskVo , locationIds ) ;
doPark ( robotTaskVo , locationIds ,takeMapItemIds , releaseMapItemIds );
break ;
case CHARGE :
doCharge ( robotTaskVo ) ;
doCharge ( robotTaskVo ,takeMapItemIds , releaseMapItemIds );
break ;
case MOVE :
doMove ( robotTaskVo , locationIds ) ;
doMove ( robotTaskVo , locationIds ,takeMapItemIds , releaseMapItemIds );
break ;
case TAKE :
doTake ( robotTaskVo , locationIds );
doTake ( robotTaskVo , locationIds ,takeMapItemIds , releaseMapItemIds );
break ;
case RELEASE :
doRelease ( robotTaskVo , locationIds );
doRelease ( robotTaskVo , locationIds ,takeMapItemIds , releaseMapItemIds );
break ;
case SCAN :
doScan ( robotTaskVo , locationIds ) ;
/ / 暂无此功能
doScan ( robotTaskVo , locationIds , takeMapItemIds , releaseMapItemIds ) ;
break ;
case DETECTING_TRAYS :
doDetectingTrays ( robotTaskVo , locationIds ) ;
/ / 暂无此功能
doDetectingTrays ( robotTaskVo , locationIds , takeMapItemIds , releaseMapItemIds ) ;
break ;
default :
log . error ( " 任务类型不存在 " ) ;
@ -400,9 +445,10 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doDetectingTrays ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ) {
setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , new ArrayList < > ( ) ) ;
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ;
public void doDetectingTrays ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds , List < Long > takeMapItemIds ,
List < Long > releaseMapItemIds ) {
/ * setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , new ArrayList < > ( ) ) ;
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ; * /
}
/ * *
@ -410,9 +456,10 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doScan ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ) {
setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , new ArrayList < > ( ) ) ;
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ;
public void doScan ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds , List < Long > takeMapItemIds ,
List < Long > releaseMapItemIds ) {
/ * setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , new ArrayList < > ( ) ) ;
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ; * /
}
/ * *
@ -420,8 +467,9 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doRelease ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ) {
setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , locationIds ) ;
public void doRelease ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds , List < Long > takeMapItemIds ,
List < Long > releaseMapItemIds ) {
setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , locationIds , takeMapItemIds , releaseMapItemIds ) ;
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ;
}
@ -430,12 +478,13 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doTake ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ) {
public void doTake ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds , List < Long > takeMapItemIds ,
List < Long > releaseMapItemIds ) {
Set < Long > mapIds = new HashSet < > ( ) ;
if ( ObjectUtil . isNotEmpty ( robotTaskVo . getRobotNo ( ) ) ) {
mapIds = getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) ;
}
setFromLocation ( robotTaskVo , mapIds , locationIds );
setFromLocation ( robotTaskVo , mapIds , locationIds ,takeMapItemIds , releaseMapItemIds );
locationIds . add ( robotTaskVo . getFromLocationId ( ) ) ;
}
@ -444,8 +493,9 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doMove ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ) {
setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , locationIds ) ;
public void doMove ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds , List < Long > takeMapItemIds ,
List < Long > releaseMapItemIds ) {
setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , locationIds , takeMapItemIds , releaseMapItemIds ) ;
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ;
}
@ -454,7 +504,8 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doCharge ( RobotTaskDetailAddVO robotTaskVo ) {
public void doCharge ( RobotTaskDetailAddVO robotTaskVo , List < Long > takeMapItemIds ,
List < Long > releaseMapItemIds ) {
}
@ -463,7 +514,8 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doPark ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ) {
public void doPark ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds , List < Long > takeMapItemIds ,
List < Long > releaseMapItemIds ) {
/ / todo 停车后续停到等待点
/ * setToLocation ( robotTaskVo , getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) , locationIds ) ;
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ; * /
@ -491,7 +543,8 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* 设置停车 / 目标库位 / 扫描库位
* /
@Transactional ( rollbackFor = Exception . class )
public void setToLocation ( RobotTaskDetailAddVO robotTaskVo , Set < Long > mapIds , List < Long > locationIds ) {
public void setToLocation ( RobotTaskDetailAddVO robotTaskVo , Set < Long > mapIds , List < Long > locationIds ,
List < Long > takeMapItemIds , List < Long > releaseMapItemIds ) {
if ( ReleaseTakeEnum . TO_LOCATION . getType ( ) . equals ( robotTaskVo . getReleaseType ( ) ) ) {
WareHouseLocationDO query = WareHouseLocationDO . builder ( ) . id ( robotTaskVo . getReleaseId ( ) ) . build ( ) ;
WareHouseLocationDO locationDO = locationMapper . queryAllByLimit ( query ) ;
@ -505,10 +558,15 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
log . error ( " 机器人不能在此放货库位放货 :{}, 机器人编号 :{} " , locationDO . getLocationNo ( ) , robotTaskVo . getRobotNo ( ) ) ;
throw new RuntimeException ( " 机器人不能在此放货库位放货 " + robotTaskVo . getReleaseId ( ) ) ;
}
if ( ObjectUtil . isNotEmpty ( takeMapItemIds ) & & takeMapItemIds . contains ( locationDO . getMapItemId ( ) ) ) {
log . error ( " 此点位存在取货任务 :{} " , locationDO . getLocationNo ( ) ) ;
throw new RuntimeException ( " 此库位存在取货任务 " + locationDO . getLocationNo ( ) ) ;
}
releaseMapItemIds . add ( locationDO . getMapItemId ( ) ) ;
} else {
WareHouseLocationDO wareHouseLocationDO =
locationMapper . selectByTypeAndId ( LocationUseStatusEnum . NO . getType ( ) , robotTaskVo . getReleaseType ( )
, robotTaskVo . getReleaseId ( ) , locationIds , mapIds ) ;
, robotTaskVo . getReleaseId ( ) , locationIds , mapIds ,takeMapItemIds );
if ( ObjectUtil . isEmpty ( wareHouseLocationDO ) ) {
log . error ( " 放货库位为空或者已锁定或者机器人取放货区域受限制 :{} " , robotTaskVo . getReleaseId ( ) ) ;
throw new RuntimeException ( " 放货库位为空或者已锁定或者机器人取放货区域受限制 " + robotTaskVo . getReleaseId ( ) ) ;
@ -519,6 +577,7 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
robotTaskVo . setToLaneId ( wareHouseLocationDO . getLaneId ( ) ) ;
robotTaskVo . setToLocationNumber ( wareHouseLocationDO . getLocationNumber ( ) ) ;
robotTaskVo . setToMapId ( wareHouseLocationDO . getMapId ( ) ) ;
releaseMapItemIds . add ( wareHouseLocationDO . getMapItemId ( ) ) ;
}
}
@ -529,7 +588,8 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param locationIds
* /
@Transactional ( rollbackFor = Exception . class )
public void setFromLocation ( RobotTaskDetailAddVO robotTaskVo , Set < Long > mapIds , List < Long > locationIds ) {
public void setFromLocation ( RobotTaskDetailAddVO robotTaskVo , Set < Long > mapIds , List < Long > locationIds ,
List < Long > takeMapItemIds , List < Long > releaseMapItemIds ) {
if ( ReleaseTakeEnum . TO_LOCATION . getType ( ) . equals ( robotTaskVo . getTakeType ( ) ) ) {
WareHouseLocationDO query = WareHouseLocationDO . builder ( ) . id ( robotTaskVo . getTakeId ( ) ) . build ( ) ;
WareHouseLocationDO locationDO = locationMapper . queryAllByLimit ( query ) ;
@ -543,10 +603,15 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
log . error ( " 机器人不能在此取货库位取货 :{}, 机器人编号 :{} " , locationDO . getLocationNo ( ) , robotTaskVo . getRobotNo ( ) ) ;
throw new RuntimeException ( " 机器人不能在此取货库位取货 " + robotTaskVo . getTakeId ( ) ) ;
}
if ( ObjectUtil . isNotEmpty ( releaseMapItemIds ) & & releaseMapItemIds . contains ( locationDO . getMapItemId ( ) ) ) {
log . error ( " 此取货库位存在放货任务 :{} " , locationDO . getLocationNo ( ) ) ;
throw new RuntimeException ( " 此取货库位存在放货任务 " + locationDO . getLocationNo ( ) ) ;
}
takeMapItemIds . add ( locationDO . getMapItemId ( ) ) ;
} else {
WareHouseLocationDO wareHouseLocationDO =
locationMapper . selectByTypeAndId ( LocationUseStatusEnum . YES . getType ( ) , robotTaskVo . getTakeType ( ) ,
robotTaskVo . getTakeId ( ) , locationIds , mapIds ) ;
robotTaskVo . getTakeId ( ) , locationIds , mapIds ,releaseMapItemIds );
if ( ObjectUtil . isEmpty ( wareHouseLocationDO ) ) {
log . error ( " 取货库位为空或者已锁定或者机器人取放货区域受限制 :{} " , robotTaskVo . getTakeId ( ) ) ;
throw new RuntimeException ( " 取货库位为空或者已锁定或者机器人取放货区域受限制 " + robotTaskVo . getTakeId ( ) ) ;
@ -557,6 +622,7 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
robotTaskVo . setFromLaneId ( wareHouseLocationDO . getLaneId ( ) ) ;
robotTaskVo . setFromLocationNumber ( wareHouseLocationDO . getLocationNumber ( ) ) ;
robotTaskVo . setFromMapId ( wareHouseLocationDO . getMapId ( ) ) ;
takeMapItemIds . add ( wareHouseLocationDO . getMapItemId ( ) ) ;
}
}
@ -565,18 +631,20 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
* @param robotTaskVo
* /
@Transactional ( rollbackFor = Exception . class )
public void doTakeRelease ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ) {
public void doTakeRelease ( RobotTaskDetailAddVO robotTaskVo , List < Long > locationIds ,
List < Long > takeMapItemIds , List < Long > releaseMapItemIds ,
List < Long > laneIds , List < Long > areaIds ) {
Set < Long > mapIds = new HashSet < > ( ) ;
if ( ObjectUtil . isNotEmpty ( robotTaskVo . getRobotNo ( ) ) ) {
mapIds = getMapIdsByRobotNo ( robotTaskVo . getRobotNo ( ) ) ;
}
/ / 校验放货库位
setToLocation ( robotTaskVo , mapIds , locationIds );
setToLocation ( robotTaskVo , mapIds , locationIds ,takeMapItemIds , releaseMapItemIds );
locationIds . add ( robotTaskVo . getToLocationId ( ) ) ;
/ / 校验取货库位
setFromLocation ( robotTaskVo , mapIds , locationIds );
setFromLocation ( robotTaskVo , mapIds , locationIds ,takeMapItemIds , releaseMapItemIds );
locationIds . add ( robotTaskVo . getFromLocationId ( ) ) ;
/ / 验证取货库位是否存在未完成的任务