feat:子卷质检合格

This commit is contained in:
2026-08-18 18:27:14 +08:00
parent 3ec762c7a3
commit ed8b688cf8
18 changed files with 501 additions and 28 deletions

View File

@@ -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, "子卷包装关系不存在");

View File

@@ -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";
}

View File

@@ -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任务"),
;
/**
* 字典键值

View File

@@ -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("操作成功!");
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -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>