feat:定时器补充入装箱区任务
This commit is contained in:
@@ -11,6 +11,7 @@ import lombok.Getter;
|
||||
public enum PackageTaskTypeEnum {
|
||||
SUB_ROLL_DOWN_AGV("010601", "子卷下线到待检AGV任务"),
|
||||
SUB_ROLL_CALL_EMPTY_AGV("010602", "子卷下线补空架AGV任务"),
|
||||
PACKAGE_AGV("010603", "装箱AGV任务"),
|
||||
;
|
||||
/**
|
||||
* 字典键值
|
||||
|
||||
@@ -42,6 +42,18 @@ public interface PackagePointMapper extends BaseMapperX<PackagePointDO> {
|
||||
List<PackagePointDO> selectAvailablePointList(@Param("pointType") String pointType,
|
||||
@Param("pointStatus") String pointStatus);
|
||||
|
||||
/**
|
||||
* 按区块查询可用点位
|
||||
*
|
||||
* @param pointType 点位类型
|
||||
* @param pointStatus 点位状态
|
||||
* @param block 区块
|
||||
* @return 可用点位列表
|
||||
*/
|
||||
List<PackagePointDO> selectAvailablePointListByBlock(@Param("pointType") String pointType,
|
||||
@Param("pointStatus") String pointStatus,
|
||||
@Param("block") String block);
|
||||
|
||||
/**
|
||||
* 尝试锁定点位
|
||||
*
|
||||
|
||||
@@ -54,6 +54,7 @@ public class BoxAutoJob {
|
||||
XxlJobHelper.handleSuccess(msg);
|
||||
log.info(msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* 待检区->装箱区定时器
|
||||
*/
|
||||
@@ -70,4 +71,22 @@ public class BoxAutoJob {
|
||||
XxlJobHelper.handleSuccess(msg);
|
||||
log.info(msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 自动装箱区桁架定时器
|
||||
*/
|
||||
@XxlJob("autoPackageTrussTaskJob")
|
||||
@TenantJob
|
||||
public void autoPackageTrussTaskJob() {
|
||||
log.info("自动装箱区桁架任务创建开始.....");
|
||||
XxlJobHelper.log("自动装箱区桁架任务创建开始");
|
||||
|
||||
packageBoxBusinessService.autoPackageTrussTaskJob();
|
||||
|
||||
String msg = "自动装箱区桁架任务创建结束";
|
||||
XxlJobHelper.log(msg);
|
||||
XxlJobHelper.handleSuccess(msg);
|
||||
log.info(msg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,4 +21,9 @@ public interface PackageBoxBusinessService {
|
||||
* 待检区->装箱区定时器
|
||||
*/
|
||||
void autoSendPackageAgvTaskJob();
|
||||
|
||||
/**
|
||||
* 自动装箱区桁架定时器
|
||||
*/
|
||||
void autoPackageTrussTaskJob();
|
||||
}
|
||||
|
||||
@@ -1,14 +1,20 @@
|
||||
package cn.code.nl.module.lms.service.packagepoint;
|
||||
|
||||
import cn.code.nl.framework.common.util.json.JsonUtils;
|
||||
import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
|
||||
import cn.code.nl.module.lms.dal.mysql.packagepoint.PackagePointMapper;
|
||||
import cn.code.nl.module.lms.enums.BoxPointStatusEnum;
|
||||
import cn.code.nl.module.lms.enums.BoxPointTypeEnum;
|
||||
import cn.code.nl.module.lms.enums.PackageTaskTypeEnum;
|
||||
import cn.code.nl.module.task.api.TransportTaskApi;
|
||||
import cn.code.nl.module.task.dto.TaskInfoDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskDestinationAssignReq;
|
||||
import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskQueryReq;
|
||||
import cn.code.nl.module.task.enums.TaskOwnerServiceEnum;
|
||||
import cn.code.nl.module.task.enums.TransportTaskStatusEnum;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -130,15 +136,54 @@ public class PackageBoxBusinessServiceImpl implements PackageBoxBusinessService
|
||||
createPackingToInspectionTask(packingSourceIterator, inspectionEmptyPointList.iterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动为装箱AGV任务分配装箱点
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void autoSendPackageAgvTaskJob() {
|
||||
// 查找符合的任务:任务状态:10,taskType = 010603,
|
||||
TransportTaskQueryReq queryReq = new TransportTaskQueryReq();
|
||||
queryReq.setTaskType(PackageTaskTypeEnum.PACKAGE_AGV.getCode());
|
||||
queryReq.setTaskStatus(TransportTaskStatusEnum.CREATED.getCode());
|
||||
List<TaskInfoDTO> taskList = transportTaskApi.queryTransportTasks(queryReq).getCheckedData();
|
||||
if (CollectionUtils.isEmpty(taskList)) {
|
||||
log.info("自动分配装箱任务目的点结束:没有待补齐的装箱AGV任务");
|
||||
return;
|
||||
}
|
||||
|
||||
// 查找对应装箱区的空位(表:lms_package_point):没锁、状态是空位、点位类型是装箱点,block = 任务中的request_param:({"block": "1"})的block(1/2代表第一块或者第二块的任务)的值;
|
||||
for (TaskInfoDTO task : taskList) {
|
||||
PackageTaskRequestParam requestParam = JsonUtils.parseObject(
|
||||
task.getRequestParam(), PackageTaskRequestParam.class);
|
||||
List<PackagePointDO> pointList = packagePointMapper.selectAvailablePointListByBlock(
|
||||
BoxPointTypeEnum.PACKING_POINT.getCode(), BoxPointStatusEnum.EMPTY.getCode(),
|
||||
requestParam.getBlock());
|
||||
PackagePointDO destinationPoint = lockNextDestinationPoint(pointList.iterator());
|
||||
if (destinationPoint == null) {
|
||||
log.info("装箱AGV任务暂无可用装箱点,任务标识={},区块={}",
|
||||
task.getTaskId(), requestParam.getBlock());
|
||||
continue;
|
||||
}
|
||||
|
||||
// 补齐任务,将任务的pointCode2设置找到的装箱区的站点,任务状态设置成40
|
||||
TransportTaskDestinationAssignReq assignReq = new TransportTaskDestinationAssignReq();
|
||||
assignReq.setTaskId(task.getTaskId());
|
||||
assignReq.setPointCode2(destinationPoint.getPointCode());
|
||||
assignReq.setExpectedTaskStatus(TransportTaskStatusEnum.CREATED.getCode());
|
||||
assignReq.setTargetTaskStatus(TransportTaskStatusEnum.READY.getCode());
|
||||
boolean assigned = transportTaskApi.assignDestination(assignReq).getCheckedData();
|
||||
if (!assigned) {
|
||||
packagePointMapper.unlockPoint(destinationPoint.getPointId(), destinationPoint.getPointStatus());
|
||||
log.info("装箱AGV任务已被其他调度抢占,释放装箱点,任务标识={},点位编码={}",
|
||||
task.getTaskId(), destinationPoint.getPointCode());
|
||||
continue;
|
||||
}
|
||||
|
||||
// 终点点位上锁
|
||||
log.info("装箱AGV任务目的点分配成功,任务标识={},区块={},目的点编码={}",
|
||||
task.getTaskId(), requestParam.getBlock(), destinationPoint.getPointCode());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void autoPackageTrussTaskJob() {
|
||||
|
||||
}
|
||||
|
||||
@@ -254,4 +299,16 @@ public class PackageBoxBusinessServiceImpl implements PackageBoxBusinessService
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 装箱任务创建请求扩展参数
|
||||
*/
|
||||
@Data
|
||||
private static class PackageTaskRequestParam {
|
||||
|
||||
/**
|
||||
* 区块
|
||||
*/
|
||||
private String block;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,19 @@
|
||||
ORDER BY sort_seq, point_id
|
||||
</select>
|
||||
|
||||
<select id="selectAvailablePointListByBlock"
|
||||
resultType="cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO">
|
||||
SELECT *
|
||||
FROM lms_package_point
|
||||
WHERE point_type = #{pointType}
|
||||
AND point_status = #{pointStatus}
|
||||
AND block = #{block}
|
||||
AND lock_status = '0'
|
||||
AND deleted = b'0'
|
||||
AND is_used = true
|
||||
ORDER BY sort_seq, point_id
|
||||
</select>
|
||||
|
||||
<update id="tryLockPoint">
|
||||
UPDATE lms_package_point
|
||||
SET lock_status = '1',
|
||||
|
||||
@@ -2,7 +2,9 @@ package cn.code.nl.module.task.api;
|
||||
|
||||
import cn.code.nl.framework.common.pojo.CommonResult;
|
||||
import cn.code.nl.module.task.dto.TaskInfoDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskDestinationAssignReq;
|
||||
import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskQueryReq;
|
||||
import cn.code.nl.module.task.dto.UnfinishedTaskPointReqDTO;
|
||||
import cn.code.nl.module.task.dto.TaskCallbackResultReqDTO;
|
||||
import cn.code.nl.module.task.enums.ApiConstants;
|
||||
@@ -75,4 +77,22 @@ public interface TransportTaskApi {
|
||||
*/
|
||||
@PostMapping(PREFIX + "/hasUnfinishedByPointCodes")
|
||||
CommonResult<Boolean> hasUnfinishedByPointCodes(@Valid @RequestBody UnfinishedTaskPointReqDTO reqDTO);
|
||||
|
||||
/**
|
||||
* 根据任务类型和状态查询搬运任务
|
||||
*
|
||||
* @param req 查询请求
|
||||
* @return 搬运任务列表
|
||||
*/
|
||||
@PostMapping(PREFIX + "/queryTransportTasks")
|
||||
CommonResult<List<TaskInfoDTO>> queryTransportTasks(@Valid @RequestBody TransportTaskQueryReq req);
|
||||
|
||||
/**
|
||||
* 条件分配搬运任务目的点并推进任务状态
|
||||
*
|
||||
* @param req 目的点分配请求
|
||||
* @return 是否分配成功
|
||||
*/
|
||||
@PostMapping(PREFIX + "/assignDestination")
|
||||
CommonResult<Boolean> assignDestination(@Valid @RequestBody TransportTaskDestinationAssignReq req);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package cn.code.nl.module.task.dto;
|
||||
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 搬运任务目的点分配请求
|
||||
*/
|
||||
@Data
|
||||
public class TransportTaskDestinationAssignReq implements Serializable {
|
||||
|
||||
/**
|
||||
* 任务标识
|
||||
*/
|
||||
@NotNull(message = "任务标识不能为空")
|
||||
private Long taskId;
|
||||
|
||||
/**
|
||||
* 目的点编码
|
||||
*/
|
||||
@NotEmpty(message = "目的点编码不能为空")
|
||||
private String pointCode2;
|
||||
|
||||
/**
|
||||
* 期望任务状态
|
||||
*/
|
||||
@NotEmpty(message = "期望任务状态不能为空")
|
||||
private String expectedTaskStatus;
|
||||
|
||||
/**
|
||||
* 目标任务状态
|
||||
*/
|
||||
@NotEmpty(message = "目标任务状态不能为空")
|
||||
private String targetTaskStatus;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package cn.code.nl.module.task.dto;
|
||||
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 搬运任务查询请求
|
||||
*/
|
||||
@Data
|
||||
public class TransportTaskQueryReq implements Serializable {
|
||||
|
||||
/**
|
||||
* 任务类型
|
||||
*/
|
||||
@NotEmpty(message = "任务类型不能为空")
|
||||
private String taskType;
|
||||
|
||||
/**
|
||||
* 任务状态
|
||||
*/
|
||||
@NotEmpty(message = "任务状态不能为空")
|
||||
private String taskStatus;
|
||||
}
|
||||
@@ -2,7 +2,9 @@ package cn.code.nl.module.task.api;
|
||||
|
||||
import cn.code.nl.framework.common.pojo.CommonResult;
|
||||
import cn.code.nl.module.task.dto.TaskInfoDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskDestinationAssignReq;
|
||||
import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskQueryReq;
|
||||
import cn.code.nl.module.task.dto.UnfinishedTaskPointReqDTO;
|
||||
import cn.code.nl.module.task.dto.TaskCallbackResultReqDTO;
|
||||
import cn.code.nl.module.task.service.transporttask.TransportTaskCallbackService;
|
||||
@@ -86,4 +88,26 @@ public class TransportTaskApiImpl implements TransportTaskApi {
|
||||
public CommonResult<Boolean> hasUnfinishedByPointCodes(UnfinishedTaskPointReqDTO reqDTO) {
|
||||
return success(transportTaskService.hasUnfinishedByPointCodes(reqDTO.getPointCodes()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据任务类型和状态查询搬运任务
|
||||
*
|
||||
* @param req 查询请求
|
||||
* @return 搬运任务列表
|
||||
*/
|
||||
@Override
|
||||
public CommonResult<List<TaskInfoDTO>> queryTransportTasks(TransportTaskQueryReq req) {
|
||||
return success(transportTaskService.queryTransportTasks(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 条件分配搬运任务目的点并推进任务状态
|
||||
*
|
||||
* @param req 目的点分配请求
|
||||
* @return 是否分配成功
|
||||
*/
|
||||
@Override
|
||||
public CommonResult<Boolean> assignDestination(TransportTaskDestinationAssignReq req) {
|
||||
return success(transportTaskService.assignDestination(req));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,6 +126,37 @@ public interface TransportTaskMapper extends BaseMapperX<TransportTaskDO> {
|
||||
*/
|
||||
long selectUnfinishedCountByPointCodes(@Param("pointCodes") List<String> pointCodes);
|
||||
|
||||
/**
|
||||
* 根据任务类型和状态查询搬运任务
|
||||
*
|
||||
* @param taskType 任务类型
|
||||
* @param taskStatus 任务状态
|
||||
* @return 搬运任务列表
|
||||
*/
|
||||
List<TransportTaskDO> selectListByTypeAndStatus(@Param("taskType") String taskType,
|
||||
@Param("taskStatus") String taskStatus);
|
||||
|
||||
/**
|
||||
* 条件分配任务目的点并推进任务状态
|
||||
*
|
||||
* @param taskId 任务标识
|
||||
* @param pointCode2 目的点编码
|
||||
* @param expectedTaskStatus 期望任务状态
|
||||
* @param targetTaskStatus 目标任务状态
|
||||
* @return 更新行数
|
||||
*/
|
||||
default int assignDestination(Long taskId, String pointCode2,
|
||||
String expectedTaskStatus, String targetTaskStatus) {
|
||||
TransportTaskDO updateObj = new TransportTaskDO();
|
||||
updateObj.setPointCode2(pointCode2);
|
||||
updateObj.setTaskStatus(targetTaskStatus);
|
||||
|
||||
LambdaUpdateWrapper<TransportTaskDO> wrapper = new LambdaUpdateWrapper<>();
|
||||
wrapper.eq(TransportTaskDO::getTaskId, taskId)
|
||||
.eq(TransportTaskDO::getTaskStatus, expectedTaskStatus);
|
||||
return update(updateObj, wrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 条件更新任务状态(CAS 抢占)
|
||||
*/
|
||||
|
||||
@@ -5,7 +5,9 @@ import jakarta.validation.*;
|
||||
import cn.code.nl.module.task.controller.admin.transporttask.vo.*;
|
||||
import cn.code.nl.module.task.dal.dataobject.transporttask.TransportTaskDO;
|
||||
import cn.code.nl.module.task.dto.TaskInfoDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskDestinationAssignReq;
|
||||
import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskQueryReq;
|
||||
import cn.code.nl.framework.common.pojo.PageResult;
|
||||
import cn.code.nl.framework.common.pojo.PageParam;
|
||||
|
||||
@@ -133,6 +135,22 @@ public interface TransportTaskService {
|
||||
*/
|
||||
boolean hasUnfinishedByPointCodes(List<String> pointCodes);
|
||||
|
||||
/**
|
||||
* 根据任务类型和状态查询搬运任务
|
||||
*
|
||||
* @param req 查询请求
|
||||
* @return 搬运任务列表
|
||||
*/
|
||||
List<TaskInfoDTO> queryTransportTasks(TransportTaskQueryReq req);
|
||||
|
||||
/**
|
||||
* 条件分配搬运任务目的点并推进任务状态
|
||||
*
|
||||
* @param req 目的点分配请求
|
||||
* @return 是否分配成功
|
||||
*/
|
||||
boolean assignDestination(TransportTaskDestinationAssignReq req);
|
||||
|
||||
/**
|
||||
* 自动下发待下发任务到 ACS
|
||||
*/
|
||||
|
||||
@@ -15,7 +15,9 @@ import cn.code.nl.module.task.dal.dataobject.transporttask.TransportTaskDO;
|
||||
import cn.code.nl.module.task.dal.mysql.transporttask.TransportTaskMapper;
|
||||
import cn.code.nl.module.task.dto.AcsFeedbackReqDTO;
|
||||
import cn.code.nl.module.task.dto.TaskInfoDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskDestinationAssignReq;
|
||||
import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO;
|
||||
import cn.code.nl.module.task.dto.TransportTaskQueryReq;
|
||||
import cn.code.nl.module.task.enums.CallbackStatusEnum;
|
||||
import cn.code.nl.module.task.enums.FinishedTypeEnum;
|
||||
import cn.code.nl.module.task.enums.TaskOperationTypeEnum;
|
||||
@@ -241,6 +243,31 @@ public class TransportTaskServiceImpl implements TransportTaskService {
|
||||
return transportTaskMapper.selectUnfinishedCountByPointCodes(pointCodes) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据任务类型和状态查询搬运任务
|
||||
*
|
||||
* @param req 查询请求
|
||||
* @return 搬运任务列表
|
||||
*/
|
||||
@Override
|
||||
public List<TaskInfoDTO> queryTransportTasks(TransportTaskQueryReq req) {
|
||||
List<TransportTaskDO> tasks = transportTaskMapper.selectListByTypeAndStatus(
|
||||
req.getTaskType(), req.getTaskStatus());
|
||||
return TransportTaskConvert.INSTANCE.convertList(tasks);
|
||||
}
|
||||
|
||||
/**
|
||||
* 条件分配搬运任务目的点并推进任务状态
|
||||
*
|
||||
* @param req 目的点分配请求
|
||||
* @return 是否分配成功
|
||||
*/
|
||||
@Override
|
||||
public boolean assignDestination(TransportTaskDestinationAssignReq req) {
|
||||
return transportTaskMapper.assignDestination(req.getTaskId(), req.getPointCode2(),
|
||||
req.getExpectedTaskStatus(), req.getTargetTaskStatus()) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询待下发任务,并委托下发管理器按生产区域下发到 ACS
|
||||
*/
|
||||
|
||||
@@ -27,4 +27,14 @@
|
||||
)
|
||||
</select>
|
||||
|
||||
<select id="selectListByTypeAndStatus"
|
||||
resultType="cn.code.nl.module.task.dal.dataobject.transporttask.TransportTaskDO">
|
||||
SELECT *
|
||||
FROM task_transport_job
|
||||
WHERE task_type = #{taskType}
|
||||
AND task_status = #{taskStatus}
|
||||
AND deleted = b'0'
|
||||
ORDER BY task_id ASC
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user