# 子卷下线送待检区任务设计 ## 目标 定时扫描未锁定的子卷下线点,为每个点位分配一个未锁定的待检区点位,并在后续创建运输任务前锁定起点和目的点。 ## 点位筛选 - 起点:`point_type = '1'`、`point_status = '3'`、`lock_status = '0'`、`deleted = 0`。 - 目的点:`point_type = '2'`、`point_status = '1'`、`lock_status = '0'`、`deleted = 0`。 - 两类点位均按 `sort_seq`、`point_id` 升序处理,保证分配顺序稳定。 ## 并发与事务 业务方法在一个数据库事务中运行。点位加锁使用带原状态条件的更新:仅当 `lock_status = '0'` 时更新为 `'1'`,并以更新行数判断是否抢锁成功。 每个起点先尝试抢锁,再依次尝试目的点。目的点抢锁失败时继续尝试下一个;没有目的点可用时,将本次已抢到的起点恢复为未锁定并结束本轮扫描。运行期间发生异常时由事务回滚本轮全部数据库修改。 ## 任务创建 起点和目的点都锁定成功后,通过 `TransportTaskApi.createTransportTask` 创建运输任务。任务归属为 LMS,业务类型为 `SUB_ROLL_DOWN`,业务标识及物料编码使用子卷号,取放货点使用起点和目的点编码,回调处理器为 `subRollDownAgvTask`。任务创建失败时抛出异常,使点位锁随当前事务回滚。 ## 调用边界 `BoxAutoJob` 只负责日志和调用 `PackageBoxBusinessService`。点位查询、配对、条件加锁和必要的解锁均由 `PackageBoxBusinessServiceImpl` 组织,数据库语句集中在 `PackagePointMapper.xml`。