易制毒、易制爆产品 购买证、运输证的方案改造 #4

Closed
opened 2026-11-01 02:09:14 +00:00 by cykj · 0 comments
Owner

请完善并实施山峡系统“购买证、运输证与合同额度控制”改造。

先阅读当前 AGENTS.md、个人开发入口、工程规则、子数据保存规则,以及受影响应用的目录规则。核对现有代码与以下方案,发现方案和本提示词冲突时,以本提示词及用户最新确认为准:

  • openspec/changes/pl-contract-cert-quota-control/proposal.md
  • openspec/changes/pl-contract-cert-quota-control/design.md
  • openspec/changes/pl-contract-cert-quota-control/tasks.md
  • openspec/changes/pl-contract-cert-quota-control/specs/contract-cert-quota/spec.md
  • docs/sql/designs/2026-10-25-purchase-transport-cert-draft.sql

上述内容目前是设计草案,不代表功能已经实现,也不能直接当作生产迁移执行。请先核实当前实现与数据结构,补齐设计和实施清单,再按照项目流程开发、测试。

一、改造目标

彻底取消“证书齐备”概念及人工放行机制,改为:

证件建档 → 合同绑定 → 指定适用产品 → 自动匹配与分配 → 安排成功时预占 → 归档时按实际量核销。

移除确认齐备、取消齐备、批量齐备、附件上传完整自动放行等逻辑。旧 hazard_cert_ready 标记不能再影响运输安排或绕过额度校验。

合法使用证明针对易制爆产品,提供独立资料界面,允许用户后续上传,未上传不影响运输安排。

二、证件档案与录入

保留 pl_purchase_cert、pl_transport_cert 两类档案,均支持:

  1. 手工录入:没有原件图片,也可以填写证件信息并保存;附件允许为空,后续可补。
  2. 图片解析:上传图片,大模型解析后回填可编辑表单,用户核对修改后保存。

图片解析结果不是最终数据。全部证面字段可编辑,最终以用户确认保存的内容为准。
识别失败可手工填写,未识别字段留空,不猜测数量、单位、证号或有效期。
解析不能自动启用证件、绑定合同、预占额度或核销。
重新解析不得直接覆盖人工修改,补传图片不得新建另一份额度或改变历史用量。

购买证保存以下9组元素及全部子字段:

  1. 购买单位或个人:名称或姓名、法定代表人、住所/地址、电话。
  2. 销售单位:名称、法定代表人、住所、电话。
  3. 购买物品。
  4. 用途。
  5. 数量。
  6. 有效次数。
  7. 有效期限。
  8. 编号。
  9. 核发日期。

运输证保存以下9组元素及全部子字段:

  1. 货主:名称或姓名、法定代表人、住所或地址、电话。
  2. 运输物品:品名、数量、包装、购买许可/备案/出口许可证号。
  3. 运输单位:名称、运输方式、住所/电话、车号(次)、运输路线。
  4. 收货单位:名称/姓名。
  5. 有效期限。
  6. 有效次数。
  7. 申请单位:名称/姓名。
  8. 编号。
  9. 核发日期。

数量与单位必须分开存储。
运输证支持多个车牌、多个引用证号。
证件已有用量后,修改单位、核定量等关键字段必须保护历史账目,不能通过普通编辑重置额度。

三、合同与产品关系

证件绑定山峡自己的采购或销售合同,再明确选择适用的合同产品行。

合同签约方与实际装货方、收货方不能强制相同。例如:

  • 山峡与A签销售合同,直接送货给A的客户B。
  • 山峡与供应商签采购合同,供应商直接送到山峡客户处。

系统管理山峡自身交易的合同和证件,不要求录入A与B的下游交易资料。

合同产品与购买证、运输证均支持多对多:

  • 多个产品共用一张证。
  • 多个产品共用多张证。
  • 同一产品本次运输可跨多张同类证件分配。

例如50%硫酸、98%硫酸,可以共用证面品名为“硫酸”的证。
通过人工勾选合同产品确定适用范围,不要求证件绑定单一SKU,不自动按品名相似匹配,不按浓度折纯。

绑定只是适用范围,不扣量、不为每个产品复制额度。
每张证无论关联多少产品、车辆,都只有一份总额度。

四、自动匹配与预占

可安排余量 = 证面总量 - 已发生量 - 已预占量。

系统根据合同、产品、数量、执行日期、车辆等匹配适用证件,检查有效期、有效次数、使用条件、运输证引用关系及可用额度。

两类证均支持自动跨证分配:
第一张证剩20吨,本次需要30吨,则第一张预占20吨,第二张预占10吨;仍不足时继续寻找下一张符合条件的证。

购买证与运输证分别分配、分别核算,不要求两类证张数一致。
运输证分配必须与其引用的购买证及对应货物范围匹配。

默认优先使用较早到期的证件;同到期日、同单位下优先使用剩余量较少的证,最后按稳定顺序选择。
必须考虑整个计划的可行组合,优先保障可选证较少的产品,不能简单逐行贪心导致错误报缺口。

预览、打开页面时不预占;安排提交成功时才预占。
提交时服务端重新检查余额与版本,事务内完成计划安排、所有证件占用和流水。
任一证件不满足条件,全部回滚,不产生部分安排或部分扣量。
支持并发锁和幂等,重复点击、网络重试不得重复占用。

单位一致时自动分配。
单位不一致时,由用户分别填写来源分配量和证件单位下的数量;系统不自动换算,即使吨和千克也不自动换算,不推算密度、浓度或历史系数。

无法可靠自动判断的条件,应明确提示人工确认,不能假装已经自动核验。

五、运输证多车辆共享

运输证上的多个车牌表示这些车辆可以共同使用该证总量,不是每辆车各有一份额度。

示例:
运输证总量100吨,车辆A已用20吨,车辆B预占30吨,车辆C预占10吨,则全证可安排余量为40吨。

所有登记车辆共享这40吨,未登记车辆不能使用该证。
不同车辆同时安排时,也必须控制同一份证件余额。

六、归档、释放与调整

保存每个来源产品的证件分配顺序和数量。
同单位归档按实际发生量及原分配顺序结转,不按比例平均摊分。

核心验收例子:

  • 本次计划30吨。
  • 第一张购买证预占20吨,第二张预占10吨。
  • 实际运输29吨。
  • 第一张实际使用20吨,第二张实际使用9吨。
  • 本次所有预占结清,第二张未使用的1吨恢复可用。
    运输证执行完全相同的规则。

实际18吨时,第一张使用18吨、第二张使用0吨,释放未用的2吨和10吨。
实际超过预占时,超出部分重新校验并补充分配;不足时保留真实数据进入异常处理,不伪造实际量、不直接超额扣减。

多个产品共用证件时,先按各产品实际量和原分配明细处理,再按证汇总。
异单位归档须重新确认实际折算量,不自动沿用计划比例。

取消未执行计划释放占用;已有执行证据不能直接当作未用释放。
改派、改车辆、改合同、改产品或数量时,统一处理新旧占用,失败保留原占用。
重复归档不得重复核销,归档后调整按差额留痕。

同一批货装货段、送货段都有记录时,同张证不能重复累计两次。明确唯一计量来源,另一侧只用于追溯。
合同履行统计与证件用量统计分别保持正确口径。

七、彻底退出“证书齐备”

检查并替换所有相关入口,包括:

  • 后端安排运输、直接创建运输、归档及其他实际放行入口。
  • 人工齐备和上传完整自动齐备服务。
  • Web、移动H5、小程序按钮及接口。
  • 列表筛选、导出、菜单权限、待办角标和通知。
  • 旧客户端调用及旧字段兼容处理。

新界面展示动态结果,例如:
待绑定证件、待人工折算、额度不足、条件不匹配、可安排、已预占、已核销。

结果由后端计算,不允许用户直接修改为“通过”。
查询已安排计划时,要识别其自身已持有的占用,不能把自己的占用误报为余额不足。
旧字段可暂留用于历史审计,但不得作为新业务判断依据。
旧齐备写接口不能继续成功放行,应明确提示升级或迁移。

八、合法使用证明独立后补

用户已明确确认:
合法使用证明针对易制爆产品,独立提供界面,允许后续上传,未上传不影响运输安排。

独立界面支持:

  • 按计划及易制爆产品明细查看。
  • 待上传、已上传筛选。
  • 上传、预览、下载及按权限维护附件。

沿用并保护现有 legal_use_cert_url 历史数据,业务名称统一为“合法使用证明”。
补传资料保留计划、产品明细ID和结算数据,不触发重新安排、额度变化或库存变化。

纯易制爆且无需两证控制的产品,不得因证明缺失或易制爆标志本身强制要求购买证、运输证额度。
混合计划中,需证产品继续执行购买证、运输证额度控制,但合法使用证明缺失不构成运输阻断。
资料待补数量与运输额度缺口分别展示,不恢复任何“齐备”开关。

九、SQL与数据一致性

以现有8表草案为基础核实完善:

  • pl_purchase_cert
  • pl_transport_cert
  • pl_transport_cert_purchase_ref
  • pl_contract_cert_link
  • pl_contract_cert_product
  • pl_plan_cert_usage
  • pl_plan_cert_usage_item
  • pl_cert_qty_log

保持证件总账、计划按证汇总、产品分配明细和变更流水一致。
保留来源数量与单位、证件数量与单位、分配顺序、版本、操作人及折算记录。
原始完整来源量在跨证明细中只是快照,不能重复求和。

遵循MySQL5.7、UUID主键、公共字段顺序、租户隔离、数据权限和软删除规则。
所有数量使用Decimal。
子数据差量更新,保留有效明细ID、创建信息和未提交字段;遗漏集合不变,显式清空须先校验引用。
主单、子单和关系在同一事务保存,禁止全删全增。

十、迁移与交付

历史齐备标记和图片不能推定真实额度。
切换前核实证件总量、历史已用量、在途预占及期初截止点,避免历史重复扣量。
缺少资料的记录明确进入补齐流程,不创建无限额度、不虚构使用量。

先完成有针对性的回归和隔离数据库验证,再提出切换步骤。
重点验证:

  1. 无图手工建档和解析后编辑。
  2. 多产品、多证共享与自动分配。
  3. 两类证20+10预占、20+9核销。
  4. 多车共享同一运输证额度。
  5. 并发、幂等、失败整体回滚。
  6. 取消、改派、超额实际量和归档调整。
  7. 单位不一致必须人工确认。
  8. 装送两侧不重复扣量。
  9. 旧齐备标记和上传完整均不能绕过额度。
  10. 合法使用证明缺失不阻断安排,补传不改变用量。
  11. 租户隔离、权限、子数据ID保留及历史迁移。

完成后说明实际修改、验证结果和未完成项。
未经验证不得声称功能已完成;不擅自执行生产迁移、部署、push或合并。
graphify已停用,不执行旧计划中的图谱更新。

请完善并实施山峡系统“购买证、运输证与合同额度控制”改造。 先阅读当前 AGENTS.md、个人开发入口、工程规则、子数据保存规则,以及受影响应用的目录规则。核对现有代码与以下方案,发现方案和本提示词冲突时,以本提示词及用户最新确认为准: - openspec/changes/pl-contract-cert-quota-control/proposal.md - openspec/changes/pl-contract-cert-quota-control/design.md - openspec/changes/pl-contract-cert-quota-control/tasks.md - openspec/changes/pl-contract-cert-quota-control/specs/contract-cert-quota/spec.md - docs/sql/designs/2026-10-25-purchase-transport-cert-draft.sql 上述内容目前是设计草案,不代表功能已经实现,也不能直接当作生产迁移执行。请先核实当前实现与数据结构,补齐设计和实施清单,再按照项目流程开发、测试。 一、改造目标 彻底取消“证书齐备”概念及人工放行机制,改为: 证件建档 → 合同绑定 → 指定适用产品 → 自动匹配与分配 → 安排成功时预占 → 归档时按实际量核销。 移除确认齐备、取消齐备、批量齐备、附件上传完整自动放行等逻辑。旧 hazard_cert_ready 标记不能再影响运输安排或绕过额度校验。 合法使用证明针对易制爆产品,提供独立资料界面,允许用户后续上传,未上传不影响运输安排。 二、证件档案与录入 保留 pl_purchase_cert、pl_transport_cert 两类档案,均支持: 1. 手工录入:没有原件图片,也可以填写证件信息并保存;附件允许为空,后续可补。 2. 图片解析:上传图片,大模型解析后回填可编辑表单,用户核对修改后保存。 图片解析结果不是最终数据。全部证面字段可编辑,最终以用户确认保存的内容为准。 识别失败可手工填写,未识别字段留空,不猜测数量、单位、证号或有效期。 解析不能自动启用证件、绑定合同、预占额度或核销。 重新解析不得直接覆盖人工修改,补传图片不得新建另一份额度或改变历史用量。 购买证保存以下9组元素及全部子字段: 1. 购买单位或个人:名称或姓名、法定代表人、住所/地址、电话。 2. 销售单位:名称、法定代表人、住所、电话。 3. 购买物品。 4. 用途。 5. 数量。 6. 有效次数。 7. 有效期限。 8. 编号。 9. 核发日期。 运输证保存以下9组元素及全部子字段: 1. 货主:名称或姓名、法定代表人、住所或地址、电话。 2. 运输物品:品名、数量、包装、购买许可/备案/出口许可证号。 3. 运输单位:名称、运输方式、住所/电话、车号(次)、运输路线。 4. 收货单位:名称/姓名。 5. 有效期限。 6. 有效次数。 7. 申请单位:名称/姓名。 8. 编号。 9. 核发日期。 数量与单位必须分开存储。 运输证支持多个车牌、多个引用证号。 证件已有用量后,修改单位、核定量等关键字段必须保护历史账目,不能通过普通编辑重置额度。 三、合同与产品关系 证件绑定山峡自己的采购或销售合同,再明确选择适用的合同产品行。 合同签约方与实际装货方、收货方不能强制相同。例如: - 山峡与A签销售合同,直接送货给A的客户B。 - 山峡与供应商签采购合同,供应商直接送到山峡客户处。 系统管理山峡自身交易的合同和证件,不要求录入A与B的下游交易资料。 合同产品与购买证、运输证均支持多对多: - 多个产品共用一张证。 - 多个产品共用多张证。 - 同一产品本次运输可跨多张同类证件分配。 例如50%硫酸、98%硫酸,可以共用证面品名为“硫酸”的证。 通过人工勾选合同产品确定适用范围,不要求证件绑定单一SKU,不自动按品名相似匹配,不按浓度折纯。 绑定只是适用范围,不扣量、不为每个产品复制额度。 每张证无论关联多少产品、车辆,都只有一份总额度。 四、自动匹配与预占 可安排余量 = 证面总量 - 已发生量 - 已预占量。 系统根据合同、产品、数量、执行日期、车辆等匹配适用证件,检查有效期、有效次数、使用条件、运输证引用关系及可用额度。 两类证均支持自动跨证分配: 第一张证剩20吨,本次需要30吨,则第一张预占20吨,第二张预占10吨;仍不足时继续寻找下一张符合条件的证。 购买证与运输证分别分配、分别核算,不要求两类证张数一致。 运输证分配必须与其引用的购买证及对应货物范围匹配。 默认优先使用较早到期的证件;同到期日、同单位下优先使用剩余量较少的证,最后按稳定顺序选择。 必须考虑整个计划的可行组合,优先保障可选证较少的产品,不能简单逐行贪心导致错误报缺口。 预览、打开页面时不预占;安排提交成功时才预占。 提交时服务端重新检查余额与版本,事务内完成计划安排、所有证件占用和流水。 任一证件不满足条件,全部回滚,不产生部分安排或部分扣量。 支持并发锁和幂等,重复点击、网络重试不得重复占用。 单位一致时自动分配。 单位不一致时,由用户分别填写来源分配量和证件单位下的数量;系统不自动换算,即使吨和千克也不自动换算,不推算密度、浓度或历史系数。 无法可靠自动判断的条件,应明确提示人工确认,不能假装已经自动核验。 五、运输证多车辆共享 运输证上的多个车牌表示这些车辆可以共同使用该证总量,不是每辆车各有一份额度。 示例: 运输证总量100吨,车辆A已用20吨,车辆B预占30吨,车辆C预占10吨,则全证可安排余量为40吨。 所有登记车辆共享这40吨,未登记车辆不能使用该证。 不同车辆同时安排时,也必须控制同一份证件余额。 六、归档、释放与调整 保存每个来源产品的证件分配顺序和数量。 同单位归档按实际发生量及原分配顺序结转,不按比例平均摊分。 核心验收例子: - 本次计划30吨。 - 第一张购买证预占20吨,第二张预占10吨。 - 实际运输29吨。 - 第一张实际使用20吨,第二张实际使用9吨。 - 本次所有预占结清,第二张未使用的1吨恢复可用。 运输证执行完全相同的规则。 实际18吨时,第一张使用18吨、第二张使用0吨,释放未用的2吨和10吨。 实际超过预占时,超出部分重新校验并补充分配;不足时保留真实数据进入异常处理,不伪造实际量、不直接超额扣减。 多个产品共用证件时,先按各产品实际量和原分配明细处理,再按证汇总。 异单位归档须重新确认实际折算量,不自动沿用计划比例。 取消未执行计划释放占用;已有执行证据不能直接当作未用释放。 改派、改车辆、改合同、改产品或数量时,统一处理新旧占用,失败保留原占用。 重复归档不得重复核销,归档后调整按差额留痕。 同一批货装货段、送货段都有记录时,同张证不能重复累计两次。明确唯一计量来源,另一侧只用于追溯。 合同履行统计与证件用量统计分别保持正确口径。 七、彻底退出“证书齐备” 检查并替换所有相关入口,包括: - 后端安排运输、直接创建运输、归档及其他实际放行入口。 - 人工齐备和上传完整自动齐备服务。 - Web、移动H5、小程序按钮及接口。 - 列表筛选、导出、菜单权限、待办角标和通知。 - 旧客户端调用及旧字段兼容处理。 新界面展示动态结果,例如: 待绑定证件、待人工折算、额度不足、条件不匹配、可安排、已预占、已核销。 结果由后端计算,不允许用户直接修改为“通过”。 查询已安排计划时,要识别其自身已持有的占用,不能把自己的占用误报为余额不足。 旧字段可暂留用于历史审计,但不得作为新业务判断依据。 旧齐备写接口不能继续成功放行,应明确提示升级或迁移。 八、合法使用证明独立后补 用户已明确确认: 合法使用证明针对易制爆产品,独立提供界面,允许后续上传,未上传不影响运输安排。 独立界面支持: - 按计划及易制爆产品明细查看。 - 待上传、已上传筛选。 - 上传、预览、下载及按权限维护附件。 沿用并保护现有 legal_use_cert_url 历史数据,业务名称统一为“合法使用证明”。 补传资料保留计划、产品明细ID和结算数据,不触发重新安排、额度变化或库存变化。 纯易制爆且无需两证控制的产品,不得因证明缺失或易制爆标志本身强制要求购买证、运输证额度。 混合计划中,需证产品继续执行购买证、运输证额度控制,但合法使用证明缺失不构成运输阻断。 资料待补数量与运输额度缺口分别展示,不恢复任何“齐备”开关。 九、SQL与数据一致性 以现有8表草案为基础核实完善: - pl_purchase_cert - pl_transport_cert - pl_transport_cert_purchase_ref - pl_contract_cert_link - pl_contract_cert_product - pl_plan_cert_usage - pl_plan_cert_usage_item - pl_cert_qty_log 保持证件总账、计划按证汇总、产品分配明细和变更流水一致。 保留来源数量与单位、证件数量与单位、分配顺序、版本、操作人及折算记录。 原始完整来源量在跨证明细中只是快照,不能重复求和。 遵循MySQL5.7、UUID主键、公共字段顺序、租户隔离、数据权限和软删除规则。 所有数量使用Decimal。 子数据差量更新,保留有效明细ID、创建信息和未提交字段;遗漏集合不变,显式清空须先校验引用。 主单、子单和关系在同一事务保存,禁止全删全增。 十、迁移与交付 历史齐备标记和图片不能推定真实额度。 切换前核实证件总量、历史已用量、在途预占及期初截止点,避免历史重复扣量。 缺少资料的记录明确进入补齐流程,不创建无限额度、不虚构使用量。 先完成有针对性的回归和隔离数据库验证,再提出切换步骤。 重点验证: 1. 无图手工建档和解析后编辑。 2. 多产品、多证共享与自动分配。 3. 两类证20+10预占、20+9核销。 4. 多车共享同一运输证额度。 5. 并发、幂等、失败整体回滚。 6. 取消、改派、超额实际量和归档调整。 7. 单位不一致必须人工确认。 8. 装送两侧不重复扣量。 9. 旧齐备标记和上传完整均不能绕过额度。 10. 合法使用证明缺失不阻断安排,补传不改变用量。 11. 租户隔离、权限、子数据ID保留及历史迁移。 完成后说明实际修改、验证结果和未完成项。 未经验证不得声称功能已完成;不擅自执行生产迁移、部署、push或合并。 graphify已停用,不执行旧计划中的图谱更新。 <!-- ticket-system:fd39d64d-0ff4-4e66-aa7d-d815d57b3986 -->
cykj added the ai-ready label 2026-11-01 02:09:14 +00:00
cykj closed this issue 2026-11-02 04:32:44 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cykj/shanxia2.0#4