26 lines
1.6 KiB
Markdown
26 lines
1.6 KiB
Markdown
# 子卷下线送待检区任务设计
|
||
|
||
## 目标
|
||
|
||
定时扫描未锁定的子卷下线点,为每个点位分配一个未锁定的待检区点位,并在后续创建运输任务前锁定起点和目的点。
|
||
|
||
## 点位筛选
|
||
|
||
- 起点:`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`。
|