# LMS 日计划管理与作业设计 ## 目标 在 LMS 的“管芯库管理”下新增“日计划管理”和“日计划作业”两个页面,接收 ERP 当日日计划并支持人工建单。日计划开始后,现场人员可维护备货、套管、取消、恢复和结束状态;后续定时器根据进行中的日计划生成实际任务。本期只维护日计划及调度状态,不下发桁架、出入库或套管任务。 ## 范围 - ERP 幂等推送日计划。 - 人工新增、编辑和查询日计划。 - 开始、结束、取消和恢复订单。 - 开始、取消和恢复备货或套管。 - 追加管芯数量。 - 人工调整日计划顺序和权重。 - 备货、套管分别维护全局调度策略,并支持即时切换。 - 查询操作记录和状态时间节点。 - 为后续定时器提供待备货、待套管计划查询及完成数量更新能力。 - 不实现实际任务生成、任务下发、库存扣减和桁架交互。 - 不拆分管芯明细表。一张日计划只对应一种管芯,不同订单即使管芯相同也独立流转。 ## 菜单与页面边界 在 `LMS管理 → 管芯库管理` 下新增两个同级菜单。 ### 日计划管理 该页面负责全量查询和基础维护: - 查询所有日期、所有状态的日计划。 - 查看基本信息、数量进度、状态时间和操作记录。 - 人工新增日计划。 - 编辑未开始的人工日计划。 - 对未开始订单执行“开始订单”。 - 对未开始订单执行“取消订单”,填写原因后可从作业页恢复。 - 已结束订单只在本页面查询,不进入作业页面。 查询条件在桌面端一行多项展示,包括日计划编号或 ERP 订单号、计划日期范围、管芯编码或名称、来源和订单状态。 ### 日计划作业 该页面负责现场操作,不以计划日期作为限制: - 默认查询已经开始、尚未结束且订单状态为“进行中”的日计划,跨天计划继续显示。 - 单独提供“已取消”页签,显示允许恢复的取消订单。 - 展示并维护顺序、权重、备货进度和套管进度。 - 提供追加数量、开始/取消/恢复备货、开始/取消/恢复套管、取消/恢复/结束订单等操作。 - 提供备货策略和套管策略的独立切换入口。 - 不提供人工新增和未开始计划编辑。 ## 数据模型 ### 日计划主表 `lms_daily_plan` 主表保存当前业务事实和调度状态: - 标识:日计划 ID、日计划编号。 - 来源:来源类型(ERP、人工)、ERP 订单号。 - 计划:计划日期、装箱信息多行文本。 - 管芯:管芯物料 ID、物料编码、物料名称、规格。 - 数量:计划数量、追加数量、已备货数量、已套管数量。 - 调度:顺序号、权重。 - 状态:订单状态、备货状态、套管状态。 - 状态时间:订单开始/结束时间、备货开始/完成时间、套管开始/完成时间。 - 恢复信息:取消前订单状态、取消前备货状态、取消前套管状态,用于准确恢复。 - 并发控制:版本号。 - 通用审计字段:创建人、创建时间、修改人、修改时间、删除标记、租户 ID。 需求总量不单独存储,统一按“计划数量 + 追加数量”计算。已备货数量和已套管数量不能超过需求总量。 人工日计划编号由编码规则生成,格式为 `DPyyyyMMdd0001`。ERP 订单号仅对 ERP 来源必填,并在租户范围内唯一,用于幂等处理。 ### 策略配置表 `lms_daily_plan_strategy` 每个租户固定两条业务配置: - 备货策略。 - 套管策略。 每条配置保存业务类型、当前模式、修改人、修改时间和版本号。当前模式包括“顺序模式”和“权重轮转模式”。数据库唯一约束保证同一租户、同一业务类型只有一条有效配置。 ### 操作记录表 `lms_daily_plan_operation_log` 操作记录只追加、不修改,保存: - 日计划 ID;策略切换记录允许日计划 ID 为空。 - 操作类型和操作对象(订单、备货、套管、策略、数量、排序、权重)。 - 操作前值、操作后值。 - 数量变化。 - 操作原因。 - 操作人和操作时间。 - 租户 ID。 开始、结束、取消、恢复、追加、调整顺序、调整权重和策略切换均写入记录。取消和恢复必须填写原因。 ## 状态模型 订单、备货和套管分别保存状态,避免备货与套管并行时丢失业务事实。 ### 订单状态 - 未开始:ERP 推送或人工新增后的初始状态。 - 进行中:人工执行“开始订单”后进入。 - 已结束:人工执行“结束订单”后进入,不允许恢复。 - 已取消:人工可从任意未结束状态取消,允许恢复。 结束订单允许随时执行。结束时将尚未完成的备货和套管停止并标记为已取消,保留实际完成数量;订单结束后不可再备货、套管、追加或恢复。 取消订单时,将尚未完成的备货和套管同步标记为已取消,并分别记录操作历史。恢复订单后,订单恢复为取消前状态;备货和套管仍保持已取消,由人工按需分别恢复,避免恢复订单时自动重启作业。 ### 备货状态与套管状态 两类作业使用相同状态集合: - 未开始。 - 进行中。 - 已完成。 - 已取消。 “开始备货”和“开始套管”只改变状态,不直接生成或下发任务。定时器或后续业务更新完成数量;完成数量达到需求总量时,对应状态自动变为已完成并记录完成时间。 单独取消备货或套管只停止对应流程,不影响另一流程和订单。恢复时回到取消前状态。已完成流程不允许取消或恢复。 ## ERP 推送规则 ERP 推送字段包括 ERP 订单号、计划日期、管芯物料信息、计划数量和装箱信息。接口通过 ERP 订单号与租户 ID 幂等识别订单: - 首次推送:创建 ERP 来源日计划,自动生成 LMS 日计划编号,三个状态均为未开始。 - 相同订单未开始:覆盖管芯信息、计划数量、计划日期和装箱信息,不覆盖 LMS 审计信息。 - 相同订单进行中,ERP 数量增加:计划数量保持原值,增加的差额累计到追加数量,并记录操作历史。 - 相同订单进行中,ERP 数量不变:视为幂等成功,不产生重复记录。 - 相同订单进行中,ERP 数量减少:拒绝推送并返回明确原因。 - 相同订单已结束或已取消:拒绝推送。 ERP 推送不允许直接修改顺序、权重、当前完成数量或作业状态。 ## 人工创建和维护 人工创建字段包括计划日期、人工订单号、管芯物料、计划数量、装箱信息、顺序和权重。人工订单号允许手填;未填写时使用 LMS 日计划编号作为订单号。 只有未开始的人工来源日计划允许编辑基本信息。ERP 来源计划通过 ERP 幂等推送维护,管理页面只读。开始订单时 ERP 和人工来源均允许再次确认计划数量,并可填写追加数量;计划数量、累计追加数量和开始状态在同一事务中原子更新,开始成功后进入日计划作业页面。 追加数量仅允许订单进行中时执行,必须大于零,按累计值保存并记录每次追加明细。 ## 调度策略 备货和套管分别维护一套租户级全局策略。策略切换后,所有进行中的日计划从定时器下一轮查询开始使用新策略;已经生成或下发的任务不撤销。 ### 顺序模式 按人工顺序号从小到大处理。前一个日计划对应流程完成或取消后,再选择下一个日计划。 页面只展示和维护顺序字段,不展示权重字段。 ### 权重轮转模式 先按顺序号从小到大确定订单轮转先后,再按每张订单的权重决定该轮处理数量。例如 A 的顺序为 1、权重为 2,B 的顺序为 2、权重为 3,则调度次序为 A 处理 2 根、B 处理 3 根,再回到 A 处理 2 根,循环至完成或取消。 页面同时展示顺序和权重。权重必须为正整数。若某张计划剩余数量小于权重,本轮只处理剩余数量。完成或取消的计划立即退出轮转,下一轮按剩余计划的顺序继续。 备货策略与套管策略独立,因此同一张计划可在备货调度中采用一种模式,在套管调度中采用另一种模式。 ## 定时器衔接 本期不实现任务下发定时器,但 Service 和 Mapper 提供明确的数据能力: - 查询订单进行中、备货进行中且已备货数量小于需求总量的计划。 - 查询订单进行中、套管进行中且已套管数量小于需求总量的计划。 - 按当前备货或套管策略返回下一批候选计划及本轮建议数量。 - 原子增加已备货数量或已套管数量。 - 数量达到需求总量时自动完成对应流程。 轮转游标由策略配置保存,记录下一轮应从哪个日计划继续,避免定时器每次都从顺序第一张开始。调整顺序、取消、完成或切换策略后,下一轮重新校验游标;游标对应计划不再可调度时,按当前顺序选择下一张。 ## 后端接口边界 ### ERP 接口 - 推送日计划:提供给 ERP 的幂等写入接口。 ### 管理端接口 - 日计划管理分页。 - 日计划作业分页。 - 日计划详情和操作记录。 - 人工新增、编辑未开始计划。 - 开始订单。 - 追加数量。 - 开始、取消、恢复备货。 - 开始、取消、恢复套管。 - 取消、恢复、结束订单。 - 批量调整顺序。 - 修改权重。 - 查询和切换备货、套管策略。 每个状态操作使用独立请求对象和接口,不使用通用“修改状态”接口,防止客户端绕过状态机。查询 SQL 统一写入 MyBatis XML。 ## 前端交互 - 管理页面搜索条件同行排列,空间不足时响应式换行。 - 管理列表展示计划与 ERP 订单号、日期、管芯、需求总量、进度、三个状态、来源、修改人和修改时间。 - 作业页面默认进入“进行中”页签,另有“已取消”页签用于恢复。 - 作业列表始终展示顺序;当当前业务策略为权重轮转时额外展示权重。 - 备货与套管策略在页面顶部独立展示和切换。 - 操作按钮根据三个状态动态显示,不可执行的操作不展示。 - 新增和编辑使用抽屉;详情抽屉包含基本信息、状态时间和操作记录。 - 开始、结束、取消、恢复、追加和策略切换均二次确认;取消和恢复弹窗要求填写原因。 ## 权限 权限按职责拆分: - 日计划查询。 - 日计划人工新增。 - 日计划编辑。 - 开始订单。 - 日计划作业操作。 - 顺序和权重维护。 - 策略切换。 - ERP 推送接口使用独立的接口鉴权,不复用管理端登录权限。 菜单 SQL 以幂等方式将两个页面挂载到“管芯库管理”下,并同步已授权角色所需的父目录权限。 ## 并发与事务 - 页面状态及资料操作使用日计划版本号进行乐观锁校验;调度数量确认不绑定整张日计划版本。 - 状态变更、数量变更和对应操作记录在同一事务中提交。 - 批量调整顺序在一个事务内完成;任一计划版本冲突时整体回滚。 - 策略切换和轮转游标更新使用版本号,避免两个调度线程重复选择同一轮计划。 - 每次调度先持久化排他 Claim,Claim 令牌、作业类型、预占数量、领取时作业进度和 Claim 自身版本共同构成确认并发边界。备货与套管 Claim 相互独立。 - 进度确认先原子消费 Claim,再以领取时对应作业进度为条件累计数量;重复确认同一已完成 Claim 幂等成功,不重复计数。 - 排序、权重、ERP 追加和另一作业进度不会阻断有效 Claim 确认。取消、结束后不再产生新 Claim,但已下发的有效 Claim 仍可确认;确认只累计数量,保留用户选择的取消或结束状态。 - Claim 支持续租、主动释放和过期回收;过期或已释放 Claim 不得确认。 ## 错误处理 - 日计划不存在时返回业务异常。 - ERP 数量减少、更新已结束或已取消计划时返回明确原因。 - 未开始订单不能执行备货、套管、追加和结束作业操作。 - 已结束订单不能取消、恢复、追加或重新开始。 - 完成数量不能为负数,也不能超过需求总量。 - 顺序号和权重必须为正整数。 - 取消和恢复未填写原因时由参数校验直接拒绝。 - 非法状态流转返回业务异常,不做静默幂等成功。 - 请求失败沿用全局错误提示,不在前端吞掉异常。 ## 验证 遵循项目“未经明确要求不新增测试”的规则,本次不创建自动化测试文件,使用以下方式验收: - 后端 Maven 编译,验证 Java、Mapper XML 和模块依赖。 - 前端 TypeScript 类型检查和相关文件 ESLint。 - SQL 脚本语法、幂等重复执行和菜单层级校验。 - 本地接口联调 ERP 首次推送、重复推送、数量增加、数量减少和终态拒绝。 - 人工核对订单、备货、套管的开始、取消、恢复、完成和结束状态流转。 - 人工核对跨天进行中订单持续出现在作业页面。 - 人工核对顺序模式与权重轮转模式的列展示和候选计划顺序。 - 模拟页面操作与定时器同时更新,确认版本冲突不会覆盖完成数量。