feat:子卷质检合格
This commit is contained in:
@@ -54,6 +54,11 @@ public interface ErrorCodeConstants {
|
||||
ErrorCode PACKAGE_POINT_NOT_EXISTS = new ErrorCode(200001, "装箱区点位库存不存在");
|
||||
ErrorCode PACKAGE_POINT_TASK_QUERY_FAILED = new ErrorCode(200002, "查询点位关联任务失败,请稍后重试");
|
||||
ErrorCode PACKAGE_POINT_HAS_UNFINISHED_TASK = new ErrorCode(200003, "选中点位存在未完成任务,无法解锁");
|
||||
ErrorCode PACKAGE_POINT_TYPE_NOT_SUPPORTED = new ErrorCode(200004, "当前点位不支持质检合格操作");
|
||||
ErrorCode PACKAGE_POINT_LOCK_FAILED = new ErrorCode(200005, "当前点位已被占用,请稍后重试");
|
||||
ErrorCode PACKAGE_POINT_INSPECTION_PENDING_EMPTY_NOT_EXISTS = new ErrorCode(200006, "没有可用的待检空位");
|
||||
ErrorCode PACKAGE_POINT_QUALITY_TASK_CREATE_FAILED = new ErrorCode(200007, "创建质检合格AGV任务失败");
|
||||
ErrorCode POINT_EXECUTE_REFUGE = new ErrorCode(200008, "{}的点位不允许操作{}");
|
||||
|
||||
// ========== 子卷包装关系 ==========
|
||||
ErrorCode SUB_PACKAGE_RELATION_NOT_EXISTS = new ErrorCode(300001, "子卷包装关系不存在");
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package cn.code.nl.module.lms.enums;
|
||||
|
||||
/**
|
||||
* 全局锁的key 或 前缀
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/8/18 17:33
|
||||
*/
|
||||
public interface LockKeyConstants {
|
||||
|
||||
/** 人工质检锁 */
|
||||
String MANUAL_QUALITY_CHECK_LOCK_KEY = "lock:pda:manual-quality-check";
|
||||
}
|
||||
@@ -13,6 +13,7 @@ public enum PackageTaskTypeEnum {
|
||||
SUB_ROLL_CALL_EMPTY_AGV("010602", "子卷下线补空架AGV任务"),
|
||||
PACKAGE_AGV("010603", "装箱AGV任务"),
|
||||
PACKAGE_BOX_TRUSS("010604", "子卷装箱桁架任务"),
|
||||
RE_CHECK_QUALIFIED_AGV("010605", "复检合格AGV任务"),
|
||||
;
|
||||
/**
|
||||
* 字典键值
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package cn.code.nl.module.lms.controller.pda;
|
||||
|
||||
import cn.code.nl.framework.common.pojo.CommonResult;
|
||||
import cn.code.nl.module.lms.controller.admin.packagepoint.vo.PackagePointRespVO;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.ManaQualityCheckReqVO;
|
||||
import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.ManaQualityCheckPdaReqVO;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.PackagePointPdaRespVO;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.QueryPackagePointInfoReqVO;
|
||||
import cn.code.nl.module.lms.service.packagepoint.PackagePdaService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -36,20 +36,16 @@ public class PackagePdaController {
|
||||
/**
|
||||
* 根据点位编码查询装箱区点位信息
|
||||
*
|
||||
* @param manaQualityCheckReqVO 查询参数
|
||||
* @param manaQualityCheckPdaReqVO 查询参数
|
||||
* @return 点位编码、子卷号和载具号
|
||||
*/
|
||||
@PostMapping("/query-point-info")
|
||||
@Operation(summary = "查询点位信息")
|
||||
@PermitAll
|
||||
public CommonResult<PackagePointRespVO> queryPointInfo(
|
||||
@Valid @RequestBody ManaQualityCheckReqVO manaQualityCheckReqVO) {
|
||||
PackagePointDO packagePoint = packagePdaService.queryPointInfo(manaQualityCheckReqVO.getPointCode());
|
||||
PackagePointRespVO response = new PackagePointRespVO();
|
||||
response.setPointCode(packagePoint.getPointCode());
|
||||
response.setContainerName(packagePoint.getContainerName());
|
||||
response.setVehicleCode(packagePoint.getVehicleCode());
|
||||
return success(response);
|
||||
public CommonResult<PackagePointPdaRespVO> queryPointInfo(
|
||||
@Valid @RequestBody QueryPackagePointInfoReqVO queryPackagePointInfoReqVO) {
|
||||
PackagePointPdaRespVO packagePoint = packagePdaService.queryPointInfo(queryPackagePointInfoReqVO.getPointCode());
|
||||
return success(packagePoint);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,8 +53,8 @@ public class PackagePdaController {
|
||||
@PostMapping("/quality-check")
|
||||
@Operation(summary = "人工质检")
|
||||
@PermitAll
|
||||
public CommonResult<String> executeManualQualityCheck(@Valid @RequestBody ManaQualityCheckReqVO manaQualityCheckReqVO) {
|
||||
// packagePdaService.executeManualQualityCheck(manaQualityCheckReqVO)
|
||||
public CommonResult<String> executeManualQualityCheck(@Valid @RequestBody ManaQualityCheckPdaReqVO manaQualityCheckPdaReqVO) {
|
||||
packagePdaService.executeManualQualityCheck(manaQualityCheckPdaReqVO);
|
||||
return success("操作成功!");
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package cn.code.nl.module.lms.controller.pda.vo;
|
||||
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
@@ -9,18 +10,19 @@ import lombok.Data;
|
||||
* @Date: 2026/8/13 19:06
|
||||
*/
|
||||
@Data
|
||||
public class ManaQualityCheckReqVO {
|
||||
public class ManaQualityCheckPdaReqVO {
|
||||
|
||||
/** 点位编码 */
|
||||
@NotEmpty(message = "点位编码不能为空")
|
||||
private String pointCode;
|
||||
|
||||
/** 子卷号 */
|
||||
/** 子卷号:可能是ERP子卷号 */
|
||||
private String containerName;
|
||||
|
||||
/** 架子号 */
|
||||
private String vehicleCode;
|
||||
|
||||
/** 是否合格 */
|
||||
@NotNull(message = "质检结果不能为空")
|
||||
private Boolean isQualified;
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package cn.code.nl.module.lms.controller.pda.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* pda装箱点位信息实体
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/8/18 17:10
|
||||
*/
|
||||
@Data
|
||||
public class PackagePointPdaRespVO {
|
||||
/**
|
||||
* 子卷号
|
||||
*/
|
||||
private String containerName;
|
||||
/**
|
||||
* erp卷号
|
||||
*/
|
||||
private String erpContainerName;
|
||||
/**
|
||||
* 锁定状态
|
||||
*/
|
||||
private String lockStatus;
|
||||
/**
|
||||
* 点位编码
|
||||
*/
|
||||
private String pointCode;
|
||||
/**
|
||||
* 点位状态
|
||||
*/
|
||||
private String pointStatus;
|
||||
/**
|
||||
* 点位类型
|
||||
*/
|
||||
private String pointType;
|
||||
/**
|
||||
* 子卷重量
|
||||
*/
|
||||
private String subWeight;
|
||||
/**
|
||||
* 任务号
|
||||
*/
|
||||
private String taskCode;
|
||||
/**
|
||||
* 管芯重量
|
||||
*/
|
||||
private String tubeWeight;
|
||||
/**
|
||||
* 架子号
|
||||
*/
|
||||
private String vehicleCode;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package cn.code.nl.module.lms.controller.pda.vo;
|
||||
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
*
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/8/18 17:41
|
||||
*/
|
||||
@Data
|
||||
public class QueryPackagePointInfoReqVO {
|
||||
/** 点位编码 */
|
||||
@NotEmpty(message = "点位编码不能为空")
|
||||
private String pointCode;
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import cn.code.nl.module.lms.controller.pda.slittingproduction.dto.SlittingDownD
|
||||
import cn.code.nl.module.lms.dal.dataobject.slittingproductionplan.SlittingproductionplanDO;
|
||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import cn.code.nl.module.lms.controller.admin.slittingproductionplan.vo.*;
|
||||
|
||||
/**
|
||||
@@ -38,5 +39,13 @@ public interface SlittingproductionplanMapper extends BaseMapperX<Slittingproduc
|
||||
return selectList(SlittingproductionplanDO::getExtContainerName, extContainerNames);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据子卷号或 ERP 子卷号查询分切生产计划
|
||||
*
|
||||
* @param containerName 子卷号
|
||||
* @return 分切生产计划
|
||||
*/
|
||||
SlittingproductionplanDO selectByContainerName(@Param("containerName") String containerName);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package cn.code.nl.module.lms.service.packagepoint;
|
||||
|
||||
import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.ManaQualityCheckPdaReqVO;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.PackagePointPdaRespVO;
|
||||
import jakarta.validation.Valid;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -15,5 +17,11 @@ public interface PackagePdaService {
|
||||
* @param pointCode 点位编码
|
||||
* @return 装箱区点位信息
|
||||
*/
|
||||
PackagePointDO queryPointInfo(String pointCode);
|
||||
PackagePointPdaRespVO queryPointInfo(String pointCode);
|
||||
|
||||
/**
|
||||
* 人工质检
|
||||
* @param manaQualityCheckPdaReqVO
|
||||
*/
|
||||
void executeManualQualityCheck(@Valid ManaQualityCheckPdaReqVO manaQualityCheckPdaReqVO);
|
||||
}
|
||||
|
||||
@@ -1,24 +1,88 @@
|
||||
package cn.code.nl.module.lms.service.packagepoint;
|
||||
|
||||
import cn.code.nl.framework.common.exception.ServiceException;
|
||||
import cn.code.nl.framework.common.pojo.CommonResult;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.ManaQualityCheckPdaReqVO;
|
||||
import cn.code.nl.module.lms.controller.pda.vo.PackagePointPdaRespVO;
|
||||
import cn.code.nl.module.lms.dal.dataobject.packagepoint.PackagePointDO;
|
||||
import cn.code.nl.module.lms.dal.dataobject.slittingproductionplan.SlittingproductionplanDO;
|
||||
import cn.code.nl.module.lms.dal.mysql.packagepoint.PackagePointMapper;
|
||||
import cn.code.nl.module.lms.dal.mysql.slittingproductionplan.SlittingproductionplanMapper;
|
||||
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.TransportTaskCreateReqDTO;
|
||||
import cn.code.nl.module.task.enums.TaskOwnerServiceEnum;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.code.nl.module.lms.enums.ErrorCodeConstants.PACKAGE_POINT_NOT_EXISTS;
|
||||
import static cn.code.nl.module.lms.enums.ErrorCodeConstants.*;
|
||||
import static cn.code.nl.module.lms.enums.LockKeyConstants.MANUAL_QUALITY_CHECK_LOCK_KEY;
|
||||
|
||||
/**
|
||||
*
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/8/13 18:56
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class PackagePdaServiceImpl implements PackagePdaService {
|
||||
|
||||
/** 无任务 */
|
||||
private static final String NO_TASK = "无任务";
|
||||
|
||||
/** 无重量信息 */
|
||||
private static final String NO_WEIGHT_INFO = "无信息";
|
||||
|
||||
/** 未绑定子卷信息 */
|
||||
private static final String UNBOUND_CONTAINER_INFO = "未绑定子卷信息";
|
||||
|
||||
/** 无子卷信息 */
|
||||
private static final String NO_CONTAINER_INFO = "无子卷信息";
|
||||
|
||||
/** 复检合格业务类型 */
|
||||
private static final String RE_CHECK_QUALIFIED_BIZ_TYPE = "RE_CHECK_QUALIFIED";
|
||||
|
||||
/** 复检合格任务回调处理器编码 */
|
||||
private static final String RE_CHECK_QUALIFIED_HANDLE_CODE = "reCheckQualifiedAgvTask";
|
||||
|
||||
/** ACS 搬运任务类型 */
|
||||
private static final String ACS_MOVE_TASK_TYPE = "7";
|
||||
|
||||
/** AGV 系统类型 */
|
||||
private static final String AGV_SYSTEM_TYPE = "1";
|
||||
|
||||
@Resource
|
||||
private RedissonClient redissonClient;
|
||||
|
||||
/** 装箱区点位服务 */
|
||||
@Resource
|
||||
private PackagePointService packagePointService;
|
||||
|
||||
/** 装箱区点位 Mapper */
|
||||
@Resource
|
||||
private PackagePointMapper packagePointMapper;
|
||||
|
||||
/** 搬运任务接口 */
|
||||
@Resource
|
||||
private TransportTaskApi transportTaskApi;
|
||||
|
||||
/** 分切生产计划 Mapper */
|
||||
@Resource
|
||||
private SlittingproductionplanMapper slittingproductionplanMapper;
|
||||
|
||||
/**
|
||||
* 根据点位编码查询装箱区点位信息
|
||||
*
|
||||
@@ -26,11 +90,155 @@ public class PackagePdaServiceImpl implements PackagePdaService {
|
||||
* @return 装箱区点位信息
|
||||
*/
|
||||
@Override
|
||||
public PackagePointDO queryPointInfo(String pointCode) {
|
||||
public PackagePointPdaRespVO queryPointInfo(String pointCode) {
|
||||
// 获取点位信息
|
||||
PackagePointDO packagePoint = packagePointService.getPackagePointByCode(pointCode, false);
|
||||
if (packagePoint == null) {
|
||||
throw exception(PACKAGE_POINT_NOT_EXISTS);
|
||||
}
|
||||
return packagePoint;
|
||||
|
||||
// 查询任务信息
|
||||
CommonResult<TaskInfoDTO> taskResult = transportTaskApi.getFirstUnfinishedTaskByPointCode(pointCode);
|
||||
if (taskResult.isError()) {
|
||||
log.error("查询点位未完成任务失败,pointCode={},返回={}", pointCode, taskResult);
|
||||
throw exception(PACKAGE_POINT_TASK_QUERY_FAILED);
|
||||
}
|
||||
|
||||
// 组装点位和任务信息
|
||||
PackagePointPdaRespVO response = new PackagePointPdaRespVO();
|
||||
response.setPointCode(packagePoint.getPointCode());
|
||||
response.setPointStatus(packagePoint.getPointStatus());
|
||||
response.setPointType(packagePoint.getPointType());
|
||||
response.setLockStatus(packagePoint.getLockStatus());
|
||||
response.setVehicleCode(packagePoint.getVehicleCode());
|
||||
response.setTaskCode(taskResult.getData() == null ? NO_TASK : taskResult.getData().getTaskCode());
|
||||
response.setSubWeight(NO_WEIGHT_INFO);
|
||||
response.setTubeWeight(NO_WEIGHT_INFO);
|
||||
|
||||
// 点位没有子卷号时直接返回无子卷信息
|
||||
if (StrUtil.isBlank(packagePoint.getContainerName())) {
|
||||
response.setContainerName(NO_CONTAINER_INFO);
|
||||
response.setErpContainerName(NO_CONTAINER_INFO);
|
||||
return response;
|
||||
}
|
||||
|
||||
// 根据子卷号或 ERP 子卷号查询分切生产计划
|
||||
SlittingproductionplanDO slittingPlan = slittingproductionplanMapper
|
||||
.selectByContainerName(packagePoint.getContainerName());
|
||||
if (slittingPlan == null) {
|
||||
response.setContainerName(packagePoint.getContainerName());
|
||||
response.setErpContainerName(UNBOUND_CONTAINER_INFO);
|
||||
return response;
|
||||
}
|
||||
|
||||
response.setContainerName(StrUtil.isBlank(slittingPlan.getContainerName())
|
||||
? NO_CONTAINER_INFO : slittingPlan.getContainerName());
|
||||
response.setErpContainerName(StrUtil.isBlank(slittingPlan.getExtContainerName())
|
||||
? UNBOUND_CONTAINER_INFO : slittingPlan.getExtContainerName());
|
||||
response.setSubWeight(StrUtil.isBlank(slittingPlan.getWeight())
|
||||
? NO_WEIGHT_INFO : slittingPlan.getWeight());
|
||||
response.setTubeWeight(StrUtil.isBlank(slittingPlan.getPaperWeight())
|
||||
? NO_WEIGHT_INFO : slittingPlan.getPaperWeight());
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void executeManualQualityCheck(ManaQualityCheckPdaReqVO manaQualityCheckPdaReqVO) {
|
||||
log.info("手持操作质检......");
|
||||
RLock lock = redissonClient.getLock(MANUAL_QUALITY_CHECK_LOCK_KEY);
|
||||
if (lock.tryLock()) {
|
||||
try {
|
||||
if (manaQualityCheckPdaReqVO.getIsQualified()) {
|
||||
doCheckedQualified(manaQualityCheckPdaReqVO);
|
||||
} else {
|
||||
// todo: 做不合格的操作
|
||||
}
|
||||
} catch (ServiceException ex) {
|
||||
throw ex;
|
||||
} catch (Exception ex) {
|
||||
log.error("人工质检执行异常,lockKey={}", MANUAL_QUALITY_CHECK_LOCK_KEY, ex);
|
||||
throw new ServiceException(500, ex.getMessage());
|
||||
} finally {
|
||||
if (lock.isHeldByCurrentThread()) {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
throw new ServiceException(500, "操作频繁,请稍后再试!");
|
||||
}
|
||||
}
|
||||
|
||||
public void doCheckedQualified(ManaQualityCheckPdaReqVO manaQualityCheckPdaReqVO) {
|
||||
PackagePointDO currentPoint = packagePointService.getPackagePointByCode(
|
||||
manaQualityCheckPdaReqVO.getPointCode(), false);
|
||||
if (currentPoint == null) {
|
||||
throw exception(PACKAGE_POINT_NOT_EXISTS);
|
||||
}
|
||||
if (currentPoint.getPointType().equals(BoxPointTypeEnum.PACKING_POINT.getCode())
|
||||
|| currentPoint.getPointType().equals(BoxPointTypeEnum.PACKING_DOCK_POINT.getCode())
|
||||
|| currentPoint.getPointType().equals(BoxPointTypeEnum.OFFLINE_POINT.getCode())) {
|
||||
throw exception(POINT_EXECUTE_REFUGE,
|
||||
Objects.requireNonNull(BoxPointTypeEnum.getByCode(currentPoint.getPointType())).getDesc(),
|
||||
"质检合格");
|
||||
}
|
||||
if (BoxPointTypeEnum.INSPECTION_PENDING_POINT.getCode().equals(currentPoint.getPointType())) {
|
||||
PackagePointDO updatePoint = new PackagePointDO();
|
||||
updatePoint.setPointId(currentPoint.getPointId());
|
||||
updatePoint.setPointStatus(BoxPointStatusEnum.QUALIFIED.getCode());
|
||||
packagePointMapper.updateById(updatePoint);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!BoxPointTypeEnum.UNQUALIFIED_POINT.getCode().equals(currentPoint.getPointType())) {
|
||||
throw exception(PACKAGE_POINT_TYPE_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
if (packagePointMapper.tryLockPoint(
|
||||
currentPoint.getPointId(), currentPoint.getPointStatus()) == 0) {
|
||||
throw exception(PACKAGE_POINT_LOCK_FAILED);
|
||||
}
|
||||
|
||||
List<PackagePointDO> inspectionPointList = packagePointMapper.selectAvailablePointList(
|
||||
BoxPointTypeEnum.INSPECTION_PENDING_POINT.getCode(), BoxPointStatusEnum.EMPTY.getCode());
|
||||
if (CollectionUtils.isEmpty(inspectionPointList)) {
|
||||
throw exception(PACKAGE_POINT_INSPECTION_PENDING_EMPTY_NOT_EXISTS);
|
||||
}
|
||||
|
||||
PackagePointDO destinationPoint = null;
|
||||
for (PackagePointDO inspectionPoint : inspectionPointList) {
|
||||
if (packagePointMapper.tryLockPoint(
|
||||
inspectionPoint.getPointId(), inspectionPoint.getPointStatus()) > 0) {
|
||||
destinationPoint = inspectionPoint;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (destinationPoint == null) {
|
||||
throw exception(PACKAGE_POINT_INSPECTION_PENDING_EMPTY_NOT_EXISTS);
|
||||
}
|
||||
|
||||
TransportTaskCreateReqDTO task = new TransportTaskCreateReqDTO();
|
||||
task.setTaskName("复检合格AGV任务");
|
||||
task.setOwnerService(TaskOwnerServiceEnum.LMS.name());
|
||||
task.setBizType(RE_CHECK_QUALIFIED_BIZ_TYPE);
|
||||
task.setBizId(currentPoint.getContainerName());
|
||||
task.setTaskType(PackageTaskTypeEnum.RE_CHECK_QUALIFIED_AGV.getCode());
|
||||
task.setHandleCode(RE_CHECK_QUALIFIED_HANDLE_CODE);
|
||||
task.setAcsTaskType(ACS_MOVE_TASK_TYPE);
|
||||
task.setAgvSystemType(AGV_SYSTEM_TYPE);
|
||||
task.setPointCode1(currentPoint.getPointCode());
|
||||
task.setPointCode2(destinationPoint.getPointCode());
|
||||
task.setVehicleCode(currentPoint.getVehicleCode());
|
||||
task.setMaterialCode(currentPoint.getContainerName());
|
||||
task.setProductArea(currentPoint.getProductArea());
|
||||
task.setIsAutoIssue("1");
|
||||
task.setIsCreateFinish(true);
|
||||
CommonResult<Long> taskResult = transportTaskApi.createTransportTask(task);
|
||||
if (taskResult.isError()) {
|
||||
log.error("创建复检合格AGV任务失败,task={},返回={}", task, taskResult);
|
||||
throw exception(PACKAGE_POINT_QUALITY_TASK_CREATE_FAILED);
|
||||
}
|
||||
log.info("复检合格AGV任务创建成功,任务标识={},起点编码={},目的点编码={}",
|
||||
taskResult.getData(), currentPoint.getPointCode(), destinationPoint.getPointCode());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
package cn.code.nl.module.lms.tasks.box;
|
||||
|
||||
import cn.code.nl.framework.execute.core.AbstractTask;
|
||||
import cn.code.nl.framework.execute.core.dto.TaskExecuteDTO;
|
||||
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.task.api.TransportTaskApi;
|
||||
import cn.code.nl.module.task.dto.TaskInfoDTO;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 复检合格 AGV 任务
|
||||
*
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/8/18
|
||||
*/
|
||||
@Slf4j
|
||||
@Component("reCheckQualifiedAgvTask")
|
||||
public class ReCheckQualifiedAgvTask extends AbstractTask {
|
||||
|
||||
/** 运输任务接口 */
|
||||
@Resource
|
||||
private TransportTaskApi transportTaskApi;
|
||||
|
||||
/** 装箱区点位 Mapper */
|
||||
@Resource
|
||||
private PackagePointMapper packagePointMapper;
|
||||
|
||||
/**
|
||||
* 任务完成后将目的点更新为合格品
|
||||
*
|
||||
* @param taskExecuteDTO 任务执行信息
|
||||
*/
|
||||
@Override
|
||||
public void doHandleFinish(TaskExecuteDTO taskExecuteDTO) {
|
||||
TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData();
|
||||
PackagePointDO endPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode2(), false);
|
||||
PackagePointDO updatePoint = new PackagePointDO();
|
||||
updatePoint.setPointId(endPoint.getPointId());
|
||||
updatePoint.setVehicleCode(taskInfoDTO.getVehicleCode());
|
||||
updatePoint.setContainerName(taskInfoDTO.getMaterialCode());
|
||||
updatePoint.setPointStatus(BoxPointStatusEnum.QUALIFIED.getCode());
|
||||
updatePoint.setLockStatus("0");
|
||||
packagePointMapper.updateById(updatePoint);
|
||||
log.info("复检合格任务{}执行完成,子卷已存入待检点{}",
|
||||
taskExecuteDTO.getTaskId(), taskInfoDTO.getPointCode2());
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务取消后解锁起点和目的点
|
||||
*
|
||||
* @param taskExecuteDTO 任务执行信息
|
||||
*/
|
||||
@Override
|
||||
public void doHandleCancel(TaskExecuteDTO taskExecuteDTO) {
|
||||
TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData();
|
||||
PackagePointDO startPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode1(), false);
|
||||
PackagePointDO endPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode2(), false);
|
||||
PackagePointDO updateStartPoint = new PackagePointDO();
|
||||
updateStartPoint.setPointId(startPoint.getPointId());
|
||||
updateStartPoint.setLockStatus("0");
|
||||
PackagePointDO updateEndPoint = new PackagePointDO();
|
||||
updateEndPoint.setPointId(endPoint.getPointId());
|
||||
updateEndPoint.setLockStatus("0");
|
||||
packagePointMapper.updateBatch(List.of(updateStartPoint, updateEndPoint));
|
||||
log.info("复检合格任务{}已取消,起点{}和目的点{}已解锁", taskExecuteDTO.getTaskId(),
|
||||
taskInfoDTO.getPointCode1(), taskInfoDTO.getPointCode2());
|
||||
}
|
||||
|
||||
/**
|
||||
* 取货完成后释放不合格点
|
||||
*
|
||||
* @param taskExecuteDTO 任务执行信息
|
||||
*/
|
||||
@Override
|
||||
public void doHandlePicked(TaskExecuteDTO taskExecuteDTO) {
|
||||
TaskInfoDTO taskInfoDTO = transportTaskApi.getTaskById(taskExecuteDTO.getTaskId()).getCheckedData();
|
||||
PackagePointDO startPoint = packagePointMapper.selectByPointCode(taskInfoDTO.getPointCode1(), false);
|
||||
PackagePointDO updatePoint = new PackagePointDO();
|
||||
updatePoint.setPointId(startPoint.getPointId());
|
||||
updatePoint.setLockStatus("0");
|
||||
updatePoint.setPointStatus(BoxPointStatusEnum.EMPTY.getCode());
|
||||
updatePoint.setVehicleCode("");
|
||||
updatePoint.setContainerName("");
|
||||
packagePointMapper.updateById(updatePoint);
|
||||
log.info("复检合格任务{}取货完成,不合格点{}已释放",
|
||||
taskExecuteDTO.getTaskId(), taskInfoDTO.getPointCode1());
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,17 @@
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.code.nl.module.lms.dal.mysql.slittingproductionplan.SlittingproductionplanMapper">
|
||||
|
||||
<!--
|
||||
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
|
||||
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
|
||||
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
|
||||
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
|
||||
-->
|
||||
<select id="selectByContainerName"
|
||||
resultType="cn.code.nl.module.lms.dal.dataobject.slittingproductionplan.SlittingproductionplanDO">
|
||||
SELECT *
|
||||
FROM lms_slittingproductionplan
|
||||
WHERE deleted = b'0'
|
||||
AND (
|
||||
container_name = #{containerName}
|
||||
OR ext_container_name = #{containerName}
|
||||
)
|
||||
ORDER BY workorder_id DESC
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user