# 市场进栏登记 — 功能需求 ## 1. 文档说明 | 项 | 说明 | | --- | --- | | 模块名称 | 市场进栏登记(交易市场平台) | | 目标 | 登记牲畜**进入市场栏位**的时间、栏位、供应商、耳标与头数,形成可查询、可维护的进栏台账 | | 依据 | 同目录 `市场进栏登记-草稿.md`、界面原型 `Snipaste_2026-05-22_10-29-24.jpg` | | 范围 | **仅功能与业务规则**;不含库表、接口、报文、技术栈 | ### 1.1 谁在什么场景使用 | 角色 | 场景 | | --- | --- | | 交易市场运营人员 | 日常登记进栏、查询历史、修正错误、删除无效记录 | | 系统管理员 | 配置菜单与操作权限 | 进入 **「市场进栏登记」** 后,默认打开**进栏记录列表**。 ### 1.2 与上下游的关系(业务视角) ```text 供应商管理、市场栏位管理 ──► 主数据(选供应商、选栏位) 入场隔离登记 ──────────────► 提供「该供应商曾登记过哪些耳标」 隔离巡查登记 ──────────────► 提供「哪些耳标已按病死/病害处理,须剔除」 市场进栏登记(本模块) ────► 记录「哪些耳标已进入哪个市场栏位」 ``` --- ## 2. 核心业务概念 ### 2.1 一条进栏记录表示什么 一次**进栏事件**:在**进栏时间**,**某供应商**的一批牲畜(用多个**耳标号**标识)进入**某个市场栏位**。 | 信息项 | 说明 | | --- | --- | | 进栏时间 | 何时进栏 | | 栏位编号 | 进哪个市场栏位(如 `01`) | | 供应商 | 哪一家供货 | | 耳标号 | 本批每一头牲畜的标识,至少 1 个 | | 数量(头) | 本批共几头,**必须等于耳标个数** | ### 2.2 记录状态 | 状态 | 用户可见 | 业务含义 | | --- | --- | --- | | 有效 | 列表中展示 | 参与「耳标是否已被进栏占用」判断 | | 已删除 | 列表中不展示 | 数据保留备查;占用的耳标**释放**,可再次被选用 | 删除指业务上的**作废**,非物理抹除;**本期无回收站**。 --- ## 3. 字段与录入规则 ### 3.1 进栏时间 - **必填**;`YYYY-MM-DD HH:mm:ss`。 - **新增**默认**当前时间**,可改。 - **不得晚于**当前时间;可填当前或更早时间(允许补录)。 - 列表按「进栏日期」筛选时,取本字段的**日期部分**。 ### 3.2 栏位编号 - **必填**;下拉**单选**,**不可手输**。 - 仅能选 **市场栏位管理** 中仍有效的栏位。 - 栏位作废后:历史进栏仍可查;**新登记、修改**不能再选该栏位。 ### 3.3 供应商 - **必填**;登记表单中可**按名称模糊搜索**后选定一条。 - 仅能选 **供应商管理** 中仍有效的供应商。 - **列表筛选**为下拉**精确**匹配(选中某供应商则只查该家的进栏记录)。 ### 3.4 耳标号 - **必填**;**多选**(下拉或标签形式),至少 **1** 个。 - **须先选供应商**再选耳标;未选供应商时耳标不可选或为空。 - **更换供应商**时,已选耳标**全部清空**,按新供应商重新加载可选项。 - 同一条记录内**不得重复**选择同一耳标。 - 耳标号书写规则与 **入场隔离登记** 一致(单段 1~32 字符等)。 ### 3.5 数量(头) - **必填**;正整数;单位「头」。 - **只读或自动带出**:**数量 = 当前勾选的耳标个数**。 - 用户**不能**把数量改成与耳标数不一致。 - 增删耳标时,数量**即时联动**。 --- ## 4. 可选耳标如何产生(草稿核心规则) 原型要求:「该供应商下**未病死、未病害**的耳标号」。由**入场隔离**(按供应商)与**隔离巡查**(全表病死病害)两步得出候选耳标;用户选定供应商后按下述规则计算(入场隔离须满足 **§4.1**;巡查、进栏记录须为**未删除的有效**记录): | 场景 | 计算结果 | | --- | --- | | **下拉可选耳标**(选供应商后加载) | **A − B**(§4.1、§4.2) | | **保存时最终可选** | **(A − B)− C**(§4.3 占用校验,含编辑释放本条) | ### 4.1 第一步:按供应商汇总入场隔离耳标 在 **入场隔离登记** 中按口径筛选记录,汇总**主表总耳标**并**去重**,得到集合 **A**。若 **A** 为空,可选列表为空,提示用户确认该供应商是否存在**已隔离结束**的入场隔离登记。 #### 业务口径(已确认) | 序号 | 口径 | 说明 | | --- | --- | --- | | ① | **只取主表总耳标** | 仅使用入场隔离登记**主表**的**总耳标号集合**(多个耳标以逗号等方式存放的须拆分汇总);**不包含**分圈明细中的耳标 | | ② | **按供应商、未删除** | 以当前所选**供应商**为条件;仅纳入**未删除**的入场隔离登记(已作废/已删除的单据不参与) | | ③ | **隔离已结束** | 仅纳入**隔离期已满、可以进入市场环节**的单据;以入场隔离登记中的**预计解除日期**与当前日期判定:**当前日期不早于预计解除日期**(即已达到或超过预计解除日)的记录才纳入;**仍在隔离期内**的单据**不纳入** | #### 计算步骤 1. 按供应商查找**未删除**且**隔离已结束**的入场隔离登记。 2. 对每条记录取**主表总耳标**并拆分、汇总。 3. **去重**得集合 **A**。 ### 4.2 第二步:剔除隔离巡查中的病死、病害耳标 在 **隔离巡查登记** 中筛选**全部**符合条件的巡查记录(**不按供应商过滤**),汇总病死、病害耳标,**去重**得集合 **B**;**下拉可选耳标** = **A - B**。已在巡查中登记为病死、病害的耳标,**不允许再进市场栏位**。 #### 业务口径(已确认) | 序号 | 口径 | 说明 | | --- | --- | --- | | ① | **未删除** | 仅纳入**未删除**的隔离巡查登记 | | ② | **病死、病害** | 仅纳入 **病死病害数量大于 0**,且**填写了耳标号**的巡查记录 | | ③ | **耳标汇总** | 主表 `耳标号` 字段以逗号等方式存放多个耳标时须**拆分**后汇总、**去重** | #### 计算步骤 1. 查询隔离巡查登记表:`del_flag` 为有效、病死病害数量 **> 0**、耳标号**非空**。 2. 取出全部符合条件的**耳标号**(拆分、去重)得集合 **B**。 3. **A - B** 为剔除病死、病害后的下拉候选(保存时再经 §4.3 剔除占用)。 ### 4.3 第三步:保存时剔除已被其他进栏记录占用的耳标 1. 在**有效**的**市场进栏登记**中,汇总**除当前正在编辑的记录外**已登记的全部耳标,得集合 **C**。 2. **保存校验**时,每个耳标须属于 **(A-B)- C**;**下拉加载**仅返回 **A-B**(不含 C,已占用的耳标仍可能出现在下拉中,保存时由服务端拦截)。 3. **修改**某条进栏记录时:该记录**原先已选的耳标**视同未占用(便于保留或调整)。 > **§4.3** 为避免同一耳标被重复进栏而补充;草稿正文仅写明 **§4.1、§4.2**。 ### 4.4 耳标池与界面联动(小结) | 时机 | 行为 | | --- | --- | | 选定供应商 | 调用可选耳标接口,按 §4.1、§4.2 返回 **A−B** | | 更换供应商 | 清空已选耳标,重新计算 **A−B** | | 勾选耳标 | 更新数量(头) | | 保存 | 按 **(A−B)−C** 再次校验 §5(含占用) | --- ## 5. 保存时必须满足的规则 新增、修改点击**确定**时,全部满足方可保存;否则提示原因且不保存: | 编号 | 规则 | 内容 | | --- | --- | --- | | **R1** | 必填完整 | 进栏时间、栏位、供应商、至少 1 个耳标 | | **R2** | 时间合法 | 进栏时间不晚于当前时间 | | **R3** | 主数据有效 | 栏位、供应商在各自管理中仍为可选状态 | | **R4** | 耳标在可选池内 | 每个耳标均属于 **(A−B)−C**(§4.1~§4.3);病死、病害及他单占用均不可保存 | | **R5** | 耳标不重复 | 本条记录内耳标互不重复 | | **R6** | 数量一致 | 数量(头)= 本条已选耳标个数 | --- ## 6. 功能清单 ### 6.1 新增进栏记录 | 项 | 要求 | | --- | --- | | 入口 | 列表「新增」 | | 表单 | §3 各字段;§4 耳标池;§5 保存校验 | | 确定 | 保存为**有效**记录,关闭表单,刷新列表 | | 取消 | 不保存 | **推荐操作顺序**:打开新增 → 确认进栏时间 → 选栏位 → 选供应商 → 多选耳标 → 核对数量 → 确定。 ### 6.2 查询进栏记录列表 | 项 | 要求 | | --- | --- | | 筛选 | 进栏日期(起~止,闭区间);栏位编号**模糊**;供应商**精确**;耳标号**模糊**;条件**同时**生效 | | 日期校验 | 开始日期晚于结束日期时提示修正,不执行查询 | | 默认排序 | 进栏时间**从新到旧** | | 分页 | 默认每页 **20** 条 | | 范围 | 仅**有效**记录 | | 工具栏 | 搜索、重置、新增 | | 列 | 进栏时间、栏位编号、供应商、耳标号、数量(头)、操作 | | 操作 | 查看、编辑、删除 | ### 6.3 修改进栏记录 - 草稿要求:**所有业务字段均可修改**(进栏时间、栏位、供应商、耳标及联动数量)。 - 规则同新增(§4、§5);更换供应商须清空耳标重选。 ### 6.4 查看进栏记录 - **只读**展示 §3 全部业务字段;耳标**完整**展示;宜展示创建/修改人及时间。 - 可提供「编辑」「删除」(受权限控制)。 ### 6.5 删除进栏记录 | 项 | 要求 | | --- | --- | | 方式 | 列表单条删除;**二次确认**(确认语宜含供应商、栏位、时间或头数) | | 结果 | 记录变为**已删除**;列表不再显示 | | 约束 | 若已被结算、开单等**下游业务引用**,**不允许删除**并提示 | | 耳标 | 删除后,该记录占用的耳标回到可选范围(§4.3) | ### 6.6 本期不做 检疫证上传、栏位占用看板、批量导入导出、与结算/称重自动联动、栏位超容预警等(见原范围评审)。 --- ## 7. 业务流程图 ### 7.1 模块主流程 ```mermaid flowchart TD A[进栏记录列表] --> B{操作} B --> C[新增] B --> D[查看] B --> E[修改] B --> F[删除] C --> G[填写时间/栏位/供应商] G --> H[计算可选耳标 A-B-C] H --> I[勾选耳标/自动数量] I --> J{R1-R6 通过?} J -->|否| I J -->|是| K[保存] K --> A E --> G F --> L{下游引用?} L -->|是| M[提示不可删] L -->|否| N[确认后删除] N --> A ``` ### 7.2 可选耳标计算 ```mermaid flowchart LR A[选供应商] --> B[入场隔离汇总耳标 A] B --> C[减去巡查病死病害 B] C --> D[减去他单已进栏 C] D --> E[用户多选] E --> F[数量=勾选数] ``` --- ## 8. 权限(业务层) | 能力 | 说明 | | --- | --- | | 查列表 | 进入模块、筛选浏览 | | 看详情 | 只读 | | 新增 | 创建记录 | | 修改 | 变更记录 | | 删除 | 作废记录 | 无权限则不显示对应按钮。具体权限项由实施配置,本文档不命名编码。 --- ## 9. 关联模块约定 | 模块 | 本模块如何使用 | | --- | --- | | 市场栏位管理 | 提供可选栏位 | | 供应商管理 | 提供可选供应商;列表筛选 | | 入场隔离登记 | §4.1 耳标来源(主表总耳标;按供应商、未删除、**隔离已结束**) | | 隔离巡查登记 | §4.2 全表未删除、病死病害数量>0 且填耳标的巡查记录汇总耳标(逗号拆分)后从 A 中剔除 | | 供应商结算等 | 可引用进栏数据;删除前检查是否被引用 | **说明**:入场隔离(隔离圈位)与市场进栏(市场栏位)为不同业务;**默认不规定**同一耳标不能同时出现在两类登记中,若产品要求互斥须另行立项。 --- ## 10. 提示语(示例) | 情况 | 示例文案 | | --- | --- | | 缺栏位/供应商/耳标 | 请选择栏位编号 / 请选择供应商 / 请至少选择一个耳标号 | | 未先选供应商 | 请先选择供应商 | | 无可选耳标 | 该供应商暂无可进栏耳标,请确认是否存在已隔离结束的入场隔离登记 | | 耳标重复 | 存在重复耳标:{耳标号} | | 耳标已被其他进栏占用 | 耳标 {耳标号} 已被其他进栏记录占用 | | 耳标不可进栏 | 耳标 {耳标号} 不可进栏或不在可选范围 | | 进栏时间超前 | 进栏时间不能晚于当前时间 | | 筛选日期颠倒 | 开始日期不能晚于结束日期 | | 主数据失效 | 市场栏位不存在或已删除 / 供应商不存在或已删除 | | 删除被引用 | 存在关联业务,无法删除 | --- ## 11. 非功能建议 | 项 | 建议 | | --- | --- | | 权限 | 查询、新增、修改、删除分权 | | 审计 | 增删改留痕 | | 易用性 | 删除二次确认;列表耳标过长可省略、详情看全文 | | 正确性 | 保存时**系统**须按 §5 再次校验,不能仅依赖页面上的数量与勾选 | --- ## 12. 草稿对照 | 草稿条目 | 对应章节 | | --- | --- | | 1 新增与字段、数量=勾选耳标数 | §3、§6.1 | | 2 入场隔离汇总耳标,减去巡查病死病害 | **§4.1、§4.2** | | 3 列表筛选 | §6.2 | | 4 修改均可改 | §6.3 | | 5 删除 | §6.5(业务作废) | | 6 查看 | §6.4 | | 7~8 异常格式、技术栈 | **不纳入本文档** | --- ## 13. 修订记录 | 版本 | 说明 | | --- | --- | | 1.2 | 按草稿 §2 明确耳标池两步算法;流程与 R1~R6 规则 | | 1.3 | 纯需求优化:不参照实现方案;精简结构;R 规则替代 M 编号;明确 §4.3 为进栏互斥补充;去除「服务端」等实现用语 | | 1.4 | §4.1:仅主表总耳标;按供应商查**未删除、隔离已结束**的入场隔离单(当前日期 ≥ 预计解除日期) | | 1.5 | §4.2:按供应商相关的**未删除**巡查记录;病死病害数量>0 且填耳标;明确供应商关联判定 | | 1.6 | §4.2:巡查**不按供应商**过滤,全表病死病害耳标汇总为 B;下拉 **A−B**;保存 **(A−B)−C**;`supplierEarTags` 仅 `supplierId` |