feat(pl): 实现合同产品用证与额度结转以支持购买证和运输证全流程管理。

This commit is contained in:
wuzilong committed 2026-11-01 18:56:05 +08:00
1 parent cb0344498a
commit fb866c7fa7
104 files changed
+10187 -3833

No files matched your search

@@ -0,0 +1,288 @@
-- 购买证/运输证额度新表迁移;执行前完成历史对账与备份。不得从旧齐备值推算额度。
SET NAMES utf8mb4;
CREATE TABLE `pl_purchase_cert` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`cert_no` varchar(100) NOT NULL COMMENT '证件编号,租户内按证种唯一;删除后不得重建另一额度池',
`issue_date` date DEFAULT NULL COMMENT '核发日期',
`product_name_on_cert` varchar(200) NOT NULL COMMENT '证面物品名称原文,不随产品主数据更名',
`total_qty` decimal(18,6) NOT NULL COMMENT '证面核定总量,单位为quantity_unit',
`quantity_unit` varchar(32) NOT NULL COMMENT '数量单位代码;同证全部余额使用此单位,异单位不自动换算',
`valid_from` date DEFAULT NULL COMMENT '有效期起始日期',
`valid_to` date DEFAULT NULL COMMENT '有效期截止日期',
`valid_use_text` varchar(32) NOT NULL COMMENT '有效次数:一次有效或多次有效;不增加数值次数表单',
`entry_mode` varchar(20) NOT NULL DEFAULT 'manual' COMMENT '首次建档方式:manual手工录入/image_parse图片解析后确认;补图不改变来源',
`attachment_urls` text COMMENT 'MinIO原件附件地址,可空,多附件逗号分隔;无图片也可手工建档',
`status` varchar(20) NOT NULL DEFAULT 'draft' COMMENT 'draft草稿/active可用/suspended停用/void作废;到期由日期判断',
`verified_by` varchar(64) DEFAULT NULL COMMENT '证件信息复核人',
`verified_time` datetime DEFAULT NULL COMMENT '证件信息复核时间',
`reserved_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '已安排未结转预占量;余额缓存,禁止手工直接编辑',
`used_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '已发生量;余额缓存,包含有凭据的期初及调整流水',
`opening_single_use_consumed` smallint NOT NULL DEFAULT 0 COMMENT '期初明确核实的一次有效证已使用标记,不能由已用数量推算',
`revision` int NOT NULL DEFAULT 1 COMMENT '证面信息修订版本;使用时保留快照',
`buyer_name` varchar(255) NOT NULL COMMENT '购买单位或个人名称',
`buyer_address` varchar(1000) DEFAULT NULL COMMENT '购买方住所或地址',
`buyer_legal_representative` varchar(100) DEFAULT NULL COMMENT '购买方法定代表人',
`buyer_phone` varchar(100) DEFAULT NULL COMMENT '购买方电话',
`seller_name` varchar(255) NOT NULL COMMENT '销售单位名称',
`seller_address` varchar(1000) DEFAULT NULL COMMENT '销售单位住所',
`seller_legal_representative` varchar(100) DEFAULT NULL COMMENT '销售方法定代表人',
`seller_phone` varchar(100) DEFAULT NULL COMMENT '销售方电话',
`purchase_purpose` varchar(1000) DEFAULT NULL COMMENT '用途',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_purchase_cert_no` (`tenant_no`,`cert_no`),
KEY `idx_purchase_cert_select` (`tenant_no`,`status`,`del_flag`,`valid_to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='购买证档案';
CREATE TABLE `pl_transport_cert` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`cert_no` varchar(100) NOT NULL COMMENT '证件编号,租户内按证种唯一;删除后不得重建另一额度池',
`issue_date` date DEFAULT NULL COMMENT '核发日期',
`product_name_on_cert` varchar(200) NOT NULL COMMENT '证面物品名称原文,不随产品主数据更名',
`total_qty` decimal(18,6) NOT NULL COMMENT '证面核定总量,单位为quantity_unit',
`quantity_unit` varchar(32) NOT NULL COMMENT '数量单位代码;同证全部余额使用此单位,异单位不自动换算',
`valid_from` date DEFAULT NULL COMMENT '有效期起始日期',
`valid_to` date DEFAULT NULL COMMENT '有效期截止日期',
`valid_use_text` varchar(32) NOT NULL COMMENT '有效次数:一次有效或多次有效;不增加数值次数表单',
`entry_mode` varchar(20) NOT NULL DEFAULT 'manual' COMMENT '首次建档方式:manual手工录入/image_parse图片解析后确认;补图不改变来源',
`attachment_urls` text COMMENT 'MinIO原件附件地址,可空,多附件逗号分隔;无图片也可手工建档',
`status` varchar(20) NOT NULL DEFAULT 'draft' COMMENT 'draft草稿/active可用/suspended停用/void作废;到期由日期判断',
`verified_by` varchar(64) DEFAULT NULL COMMENT '证件信息复核人',
`verified_time` datetime DEFAULT NULL COMMENT '证件信息复核时间',
`reserved_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '已安排未结转预占量;余额缓存,禁止手工直接编辑',
`used_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '已发生量;余额缓存,包含有凭据的期初及调整流水',
`opening_single_use_consumed` smallint NOT NULL DEFAULT 0 COMMENT '期初明确核实的一次有效证已使用标记,不能由已用数量推算',
`revision` int NOT NULL DEFAULT 1 COMMENT '证面信息修订版本;使用时保留快照',
`shipper_name` varchar(255) NOT NULL COMMENT '货主名称或姓名',
`shipper_address` varchar(1000) DEFAULT NULL COMMENT '货主住所或地址',
`shipper_legal_representative` varchar(100) DEFAULT NULL COMMENT '货主法定代表人',
`shipper_phone` varchar(100) DEFAULT NULL COMMENT '货主电话',
`packaging_text` varchar(255) DEFAULT NULL COMMENT '包装,例如槽罐',
`carrier_name` varchar(255) DEFAULT NULL COMMENT '运输单位名称',
`carrier_address_phone` varchar(1200) DEFAULT NULL COMMENT '运输单位住所/电话,按用户指定证面合并栏保存',
`transport_mode` varchar(100) DEFAULT NULL COMMENT '运输方式,例如汽车',
`vehicle_numbers_json` json NOT NULL COMMENT '车号列表,例如[皖HA3190,皖H10291],所有车共用该证额度',
`route_text` text COMMENT '运输路线完整原文',
`consignee_name` varchar(255) DEFAULT NULL COMMENT '收货单位名称或姓名',
`applicant_name` varchar(255) DEFAULT NULL COMMENT '申请单位名称或姓名',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_transport_cert_no` (`tenant_no`,`cert_no`),
KEY `idx_transport_cert_select` (`tenant_no`,`status`,`del_flag`,`valid_to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='运输证档案';
CREATE TABLE `pl_transport_cert_purchase_ref` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`transport_cert_id` varchar(64) NOT NULL COMMENT '运输证ID',
`reference_type` varchar(24) NOT NULL COMMENT 'purchase_permit/purchase_filing/export_permit/unknown',
`reference_no` varchar(100) NOT NULL COMMENT '被引用的证号,保留未建档号码',
`purchase_cert_id` varchar(64) DEFAULT NULL COMMENT '如为山峡所管理购买证,关联其ID;外部未知证号可空',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_transport_ref` (`tenant_no`,`transport_cert_id`,`reference_no`),
KEY `idx_ref_purchase` (`tenant_no`,`purchase_cert_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='运输证证面引用的许可备案证号,不建立客户下游交易台账';
CREATE TABLE `pl_contract_cert_link` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`contract_id` varchar(64) NOT NULL COMMENT '山峡自身CRM合同ID,不录入客户下游合同',
`contract_no_snapshot` varchar(100) NOT NULL COMMENT '系统关联合同编号快照,不等于证件编号',
`cert_type` varchar(16) NOT NULL COMMENT 'purchase或transport',
`cert_id` varchar(64) NOT NULL COMMENT '按cert_type指向对应证件表;服务层校验同租户',
`link_status` varchar(16) NOT NULL DEFAULT 'active' COMMENT 'active可选/inactive停止新增使用;历史使用不迁移',
`scope_revision` int NOT NULL DEFAULT 1 COMMENT '适用产品范围版本,增删或停用产品时递增,使未执行用证确认失效',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_contract_cert` (`tenant_no`,`contract_id`,`cert_type`,`cert_id`),
KEY `idx_contract_cert` (`tenant_no`,`contract_id`,`del_flag`),
KEY `idx_link_cert` (`tenant_no`,`cert_type`,`cert_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='山峡合同绑定购买证或运输证,一个合同可绑定多张证';
CREATE TABLE `pl_contract_cert_product` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`contract_cert_link_id` varchar(64) NOT NULL COMMENT 'pl_contract_cert_link.id,继承合同、证种及证件身份',
`contract_product_id` varchar(64) NOT NULL COMMENT '该合同中的产品明细ID;多条产品行可属于同一合同证件绑定',
`scope_status` varchar(16) NOT NULL DEFAULT 'active' COMMENT 'active允许新增使用/inactive停止新增使用;保留历史',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_contract_cert_product` (`tenant_no`,`contract_cert_link_id`,`contract_product_id`),
KEY `idx_scope_product` (`tenant_no`,`contract_product_id`,`scope_status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='合同产品与证件多对多,同产品可属于多个证件范围;各证独立额度';
CREATE TABLE `pl_plan_cert_usage` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`plan_id` varchar(64) NOT NULL COMMENT '运输计划ID',
`plan_no_snapshot` varchar(100) NOT NULL COMMENT '计划编号快照',
`transport_id` varchar(64) DEFAULT NULL COMMENT '运输单ID',
`cert_type` varchar(16) NOT NULL COMMENT 'purchase或transport',
`cert_id` varchar(64) NOT NULL COMMENT '购买证或运输证ID',
`cert_no_snapshot` varchar(100) NOT NULL COMMENT '本次使用证号快照',
`cert_revision` int NOT NULL COMMENT '本次确认的证件版本',
`quantity_unit` varchar(32) NOT NULL COMMENT '数量单位代码;同证全部余额使用此单位,异单位不自动换算',
`reserved_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '本计划对该证当前未结转的占用',
`used_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '本计划对该证已发生量',
`usage_status` varchar(20) NOT NULL DEFAULT 'draft' COMMENT 'draft/reserved/in_transit/settled/released/exception',
`confirmed_by` varchar(64) DEFAULT NULL COMMENT '最近一次用证确认人',
`confirmed_time` datetime DEFAULT NULL COMMENT '最近一次用证确认时间',
`settled_time` datetime DEFAULT NULL COMMENT '最近一次实际量结转时间',
`row_version` int NOT NULL DEFAULT 1 COMMENT '用量记录版本,防止使用旧版本重复修改',
`confirmation_snapshot` json DEFAULT NULL COMMENT '证面、计划量、车号、实际装送主体/地址及核验结果快照',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_plan_cert_usage` (`tenant_no`,`plan_id`,`cert_type`,`cert_id`),
KEY `idx_usage_cert` (`tenant_no`,`cert_type`,`cert_id`,`usage_status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='一趟计划对一张证的用量汇总,采购与运输证独立记账';
CREATE TABLE `pl_plan_cert_usage_item` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`usage_id` varchar(64) NOT NULL COMMENT 'pl_plan_cert_usage.id',
`contract_cert_link_id` varchar(64) NOT NULL COMMENT '合同与证件绑定ID,须与usage的证件相同',
`contract_cert_product_id` varchar(64) NOT NULL COMMENT '本产品的适用范围明细ID:pl_contract_cert_product.id',
`contract_scope_revision` int NOT NULL COMMENT '本次确认的合同证件适用范围版本',
`contract_id` varchar(64) NOT NULL COMMENT '本次履行的山峡合同ID',
`contract_product_id` varchar(64) NOT NULL COMMENT '对应合同产品行ID',
`plan_product_id` varchar(64) NOT NULL COMMENT '计划产品行ID',
`source_stop_type` varchar(16) NOT NULL COMMENT '唯一计量侧:load或delivery',
`source_stop_id` varchar(64) NOT NULL COMMENT '计量来源装货或送货段ID',
`source_stop_product_id` varchar(64) NOT NULL COMMENT '计量来源段次产品行ID',
`related_stop_products` json DEFAULT NULL COMMENT '关联另一侧段产品ID列表,仅用于追溯,不另行扣量',
`allocation_seq` int NOT NULL COMMENT '同计划同合同来源同证种的分配顺序,正数且不重复;归档按此顺序结转',
`source_unit` varchar(32) NOT NULL COMMENT '来源段产品单位',
`planned_source_qty` decimal(18,6) NOT NULL COMMENT '安排时来源段产品完整计划数量快照,来源单位;跨证重复快照不得求和',
`allocated_source_qty` decimal(18,6) DEFAULT NULL COMMENT '本证分配的来源计划数量,来源单位;同产品同证种各证合计须等于完整计划量',
`actual_source_qty` decimal(18,6) DEFAULT NULL COMMENT '归档时来源段产品完整实际数量快照,来源单位;未知为NULL',
`actual_allocated_source_qty` decimal(18,6) DEFAULT NULL COMMENT '归档时本证分配的来源实际数量;同产品同证种各证合计须等于完整实际量;异单位重新确认',
`planned_cert_qty` decimal(18,6) DEFAULT NULL COMMENT '自动分配或人工确认的安排用证量,证件单位;草稿可空,预占前必填',
`reserve_input_mode` varchar(16) DEFAULT NULL COMMENT 'same_unit同单位带入/manual异单位人工填写',
`reserve_conversion_note` varchar(1000) DEFAULT NULL COMMENT '异单位安排折算说明,manual时必填;不存自动换算系数',
`reserve_confirmed_by` varchar(64) DEFAULT NULL COMMENT '安排折算量确认人,服务端取当前用户',
`reserve_confirmed_time` datetime DEFAULT NULL COMMENT '安排折算量确认时间',
`actual_cert_qty` decimal(18,6) DEFAULT NULL COMMENT '按实际来源量自动分配或人工确认的实际用证量,证件单位;不可用预占量替代',
`settle_input_mode` varchar(16) DEFAULT NULL COMMENT 'same_unit同单位带入/manual异单位重新人工填写',
`settle_conversion_note` varchar(1000) DEFAULT NULL COMMENT '异单位归档折算说明,manual时必填',
`settle_confirmed_by` varchar(64) DEFAULT NULL COMMENT '归档实际用证量确认人,服务端取当前用户',
`settle_confirmed_time` datetime DEFAULT NULL COMMENT '归档实际用证量确认时间',
`source_fingerprint` char(64) DEFAULT NULL COMMENT '源数据版本摘要;数量/单位/合同/产品/车辆/装送范围变化使确认失效',
`reserved_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '本分配当前预占量,证件单位',
`used_qty` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '本分配已发生量,证件单位',
`item_status` varchar(20) NOT NULL DEFAULT 'draft' COMMENT 'draft/reserved/in_transit/settled/released/exception',
`source_snapshot` json DEFAULT NULL COMMENT '合同、产品、原始计划/归档量与分配依据快照',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_usage_source` (`tenant_no`,`usage_id`,`source_stop_type`,`source_stop_product_id`),
KEY `idx_usage_item_contract` (`tenant_no`,`contract_product_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='用量来源分配,指定一侧为计量来源,避免装送重复相加';
CREATE TABLE `pl_cert_qty_log` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`operation_id` varchar(64) NOT NULL COMMENT '业务幂等操作号;同一次双证操作共用一个号',
`request_hash` char(64) NOT NULL COMMENT '规范化业务请求SHA256,同幂等号不同请求应拒绝',
`cert_type` varchar(16) NOT NULL COMMENT 'purchase或transport',
`cert_id` varchar(64) NOT NULL COMMENT '证件ID',
`usage_id` varchar(64) DEFAULT NULL COMMENT '计划用量ID;有凭据的期初导入可空',
`plan_id` varchar(64) DEFAULT NULL COMMENT '计划ID;期初导入可空',
`event_type` varchar(24) NOT NULL COMMENT 'opening/reserve/resize/release/settle/adjust/total_adjust',
`quantity_unit` varchar(32) NOT NULL COMMENT '数量单位代码;同证全部余额使用此单位,异单位不自动换算',
`total_delta` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '核定总量变动,须附修订依据',
`reserved_delta` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '预占增量,释放或结转为负数',
`used_delta` decimal(18,6) NOT NULL DEFAULT 0 COMMENT '实际使用增量,有依据的纠错可以为负数',
`before_total_qty` decimal(18,6) NOT NULL COMMENT '操作前核定总量',
`after_total_qty` decimal(18,6) NOT NULL COMMENT '操作后核定总量',
`before_reserved_qty` decimal(18,6) NOT NULL COMMENT '操作前预占',
`after_reserved_qty` decimal(18,6) NOT NULL COMMENT '操作后预占',
`before_used_qty` decimal(18,6) NOT NULL COMMENT '操作前已发生',
`after_used_qty` decimal(18,6) NOT NULL COMMENT '操作后已发生',
`reason` varchar(1000) NOT NULL COMMENT '操作原因或业务动作说明',
`evidence_urls` text COMMENT '期初、核定量修订或实际量调整凭据,多个URL逗号分隔',
`event_snapshot` json DEFAULT NULL COMMENT '来源分配、证面版本、校验及变更前后明细',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_cert_operation` (`tenant_no`,`operation_id`,`cert_type`,`cert_id`),
KEY `idx_qty_log_cert` (`tenant_no`,`cert_type`,`cert_id`,`create_time`),
KEY `idx_qty_log_usage` (`tenant_no`,`usage_id`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='证件额度及核销次数流水,追加留痕,不覆盖历史';
CREATE TABLE `pl_cert_operation` (
`id` varchar(64) NOT NULL COMMENT '主键UUID',
`operation_id` varchar(64) NOT NULL COMMENT '客户端请求操作号',
`action` varchar(32) NOT NULL COMMENT '请求动作',
`plan_id` varchar(64) DEFAULT NULL COMMENT '关联计划',
`request_hash` char(64) NOT NULL COMMENT '规范请求SHA256',
`result_json` json DEFAULT NULL COMMENT '原请求结果',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号,由服务端当前用户上下文设置',
`order_num` int DEFAULT NULL COMMENT '公共排序号',
`remark` varchar(1000) DEFAULT NULL COMMENT '系统备注,与证面备注分开',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建部门',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` smallint NOT NULL DEFAULT 0 COMMENT '软删除标记:0正常,1删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_cert_request` (`tenant_no`,`operation_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='证件请求级幂等操作记录';
@@ -1,8 +1,8 @@
-- 购买证、运输证与用量核算模型(2026-10-30修订设计草案)
-- 购买证、运输证与用量核算模型(2026-11-01修订设计草案)
-- 仅供评审,不是上线迁移;本次不执行DDL,不更改既有业务表。
-- 取代本文件2026-10-25版:证面仅保留用户分别确认的9项;删除自动换算系数。
-- 建档补充设计与开发步骤:docs/superpowers/specs/2026-10-30-pl-cert-entry-modes-design.md
-- 原2026-10-26设计及开发文档当前工作区未找到,此补充不代表完整业务实现。
-- 完整方案与实施清单:openspec/changes/pl-contract-cert-quota-control/;取消证书齐备人工/附件放行。
-- MySQL 5.7.8+ / InnoDB / utf8mb4 / UUID varchar(64) / 公共字段尾置。
-- JSON仅用于车牌列表与业务快照;支持图片解析预填既有证面字段,不增加二维码、印章、核发机关字段。
-- manual手工录入可无图片;image_parse为图片解析后人工确认建档,两者共用档案及用量规则。
@@ -14,7 +14,8 @@
-- total_qty、reserved_qty、used_qty全部使用本证quantity_unit;剩余量不单独存储。
-- 异单位只接受用户填写的证件数量;即便吨和千克不同也不自动乘除,不复用历史系数。
-- 合同产品与购买证多对多;同一产品可选择多张购买证并分配本次来源量,每张证仅扣其分配量。
-- 本次运输证仍每个业务产品项选择一张,按完整来源量计量;购买证分配不得使运输证重复扣量。
-- 购买证、运输证均可跨多张分配;各证种分别覆盖来源需求,运输证多车共享同一额度。
-- 预览不占用;安排事务自动预占;同单位归档按原分配顺序结转,未用部分释放。
-- 同一实际运输的同一张证不能装送两侧重复扣;item指定计量来源,另一侧只追溯。
-- 相同证件/关联/usage的唯一键不含del_flag;停用后恢复原记录,不重建额度。
-- 首次启用必须写opening流水并核实历史已用量,不能默认为剩余全额。
@@ -214,17 +215,18 @@ CREATE TABLE `pl_plan_cert_usage_item` (
`source_stop_id` varchar(64) NOT NULL COMMENT '计量来源装货或送货段ID',
`source_stop_product_id` varchar(64) NOT NULL COMMENT '计量来源段次产品行ID',
`related_stop_products` json DEFAULT NULL COMMENT '关联另一侧段产品ID列表,仅用于追溯,不另行扣量',
`allocation_seq` int NOT NULL COMMENT '同计划同合同来源同证种的分配顺序,正数且不重复;归档按此顺序结转',
`source_unit` varchar(32) NOT NULL COMMENT '来源段产品单位',
`planned_source_qty` decimal(18,6) NOT NULL COMMENT '安排时来源段产品完整计划数量快照,来源单位;跨证重复快照不得求和',
`allocated_source_qty` decimal(18,6) DEFAULT NULL COMMENT '本证分配的来源计划数量,来源单位;同产品各购买证合计须等于完整计划量',
`allocated_source_qty` decimal(18,6) DEFAULT NULL COMMENT '本证分配的来源计划数量,来源单位;同产品同证种各证合计须等于完整计划量',
`actual_source_qty` decimal(18,6) DEFAULT NULL COMMENT '归档时来源段产品完整实际数量快照,来源单位;未知为NULL',
`actual_allocated_source_qty` decimal(18,6) DEFAULT NULL COMMENT '归档时本证分配的来源实际数量;各购买证合计须等于完整实际量,重新确认',
`planned_cert_qty` decimal(18,6) DEFAULT NULL COMMENT '用户确认的安排用证量,证件单位;草稿可空,预占前必填',
`actual_allocated_source_qty` decimal(18,6) DEFAULT NULL COMMENT '归档时本证分配的来源实际数量;同产品同证种各证合计须等于完整实际量;异单位重新确认',
`planned_cert_qty` decimal(18,6) DEFAULT NULL COMMENT '自动分配或人工确认的安排用证量,证件单位;草稿可空,预占前必填',
`reserve_input_mode` varchar(16) DEFAULT NULL COMMENT 'same_unit同单位带入/manual异单位人工填写',
`reserve_conversion_note` varchar(1000) DEFAULT NULL COMMENT '异单位安排折算说明,manual时必填;不存自动换算系数',
`reserve_confirmed_by` varchar(64) DEFAULT NULL COMMENT '安排折算量确认人,服务端取当前用户',
`reserve_confirmed_time` datetime DEFAULT NULL COMMENT '安排折算量确认时间',
`actual_cert_qty` decimal(18,6) DEFAULT NULL COMMENT '用户确认的实际用证量,证件单位;不可用预占量替代',
`actual_cert_qty` decimal(18,6) DEFAULT NULL COMMENT '按实际来源量自动分配或人工确认的实际用证量,证件单位;不可用预占量替代',
`settle_input_mode` varchar(16) DEFAULT NULL COMMENT 'same_unit同单位带入/manual异单位重新人工填写',
`settle_conversion_note` varchar(1000) DEFAULT NULL COMMENT '异单位归档折算说明,manual时必填',
`settle_confirmed_by` varchar(64) DEFAULT NULL COMMENT '归档实际用证量确认人,服务端取当前用户',
@@ -0,0 +1,54 @@
-- 工单 #4:共享证件档案与合法使用证明独立菜单。MySQL 5.7。
-- 仅新增菜单,不执行角色授权、不恢复已删除配置;部署前由管理员配置新业务权限。
SET NAMES utf8mb4;
START TRANSACTION;
INSERT INTO sys_menu (
id,menu_name,parent_id,menu_type,path,component,perms,is_frame,visible,status,
tenant_no,order_num,remark,create_by,create_dept_id,create_time,update_time,del_flag
)
SELECT target.id,target.name,folder.id,'C',target.path,target.component,target.perms,1,'1','1',
folder.tenant_no,target.sort_no,'工单#4:共享证件及独立资料','system','',NOW(),NOW(),0
FROM sys_menu folder
JOIN sys_menu parent ON parent.id=folder.parent_id AND parent.tenant_no=folder.tenant_no AND parent.del_flag=0
JOIN sys_menu root ON root.id=parent.parent_id AND root.tenant_no=folder.tenant_no AND root.del_flag=0
CROSS JOIN (
SELECT 'PL_QUOTA_CERT' id,'购买证与运输证' name,'quota-cert' path,'pl/quota-cert/index' component,'pl:quota-cert:list' perms,2 sort_no
UNION ALL SELECT 'PL_LEGAL_USE_DOCUMENT','合法使用证明','legal-use-document','pl/legal-use-document/index','pl:legal-use-document:list',3
) target
WHERE folder.id='PL_GROUP_CERT' AND folder.del_flag=0 AND folder.tenant_no='shanxia2.0'
AND parent.id='PL_MENU_ROOT' AND root.path='/web' AND root.parent_id='0'
AND NOT EXISTS (SELECT 1 FROM sys_menu existing WHERE existing.id=target.id
OR (existing.tenant_no=folder.tenant_no AND existing.perms=target.perms));
INSERT INTO sys_menu (
id,menu_name,parent_id,menu_type,path,component,perms,is_frame,visible,status,
tenant_no,order_num,remark,create_by,create_dept_id,create_time,update_time,del_flag
)
SELECT 'PL_QUOTA_CERT_EDIT','维护证件及适用范围',leaf.id,'F',NULL,NULL,'pl:quota-cert:edit',1,'1','1',
leaf.tenant_no,1,'含建档、复核、合同产品范围维护;不自动授予角色','system','',NOW(),NOW(),0
FROM sys_menu leaf
WHERE leaf.id='PL_QUOTA_CERT' AND leaf.tenant_no='shanxia2.0' AND leaf.del_flag=0
AND NOT EXISTS (SELECT 1 FROM sys_menu existing WHERE existing.id='PL_QUOTA_CERT_EDIT'
OR (existing.tenant_no=leaf.tenant_no AND existing.perms='pl:quota-cert:edit'));
-- 旧计划资料入口改为用证配置;退役的齐备按钮仅隐藏,保留历史配置与角色关系。
UPDATE sys_menu SET menu_name='计划用证',update_time=NOW()
WHERE tenant_no='shanxia2.0' AND del_flag=0 AND perms IN ('pl:plan-cert:list','mini:pl:plan-cert:list');
UPDATE sys_menu SET visible='0',status='0',update_time=NOW()
WHERE tenant_no='shanxia2.0' AND del_flag=0 AND perms='pl:plan-cert:ready';
INSERT INTO sys_menu (
id,menu_name,parent_id,menu_type,path,component,perms,is_frame,visible,status,
tenant_no,order_num,remark,create_by,create_dept_id,create_time,update_time,del_flag
)
SELECT 'MINI_PL_LEGAL_USE_DOCUMENT','合法使用证明',parent.id,'C','mp-webview',NULL,
'mini:pl:legal-use-document:list',1,'1','1',parent.tenant_no,6,
'小程序WebView合法使用证明;需另授业务查看和上传权限','system','',NOW(),NOW(),0
FROM sys_menu parent JOIN sys_menu root ON root.id=parent.parent_id
AND root.tenant_no=parent.tenant_no AND root.del_flag=0
WHERE parent.id='MINI_PL_ROOT' AND parent.path='/mini/pl' AND parent.del_flag=0
AND parent.tenant_no='shanxia2.0' AND root.path='/mini' AND root.parent_id='0'
AND NOT EXISTS(SELECT 1 FROM sys_menu existing WHERE existing.id='MINI_PL_LEGAL_USE_DOCUMENT'
OR (existing.tenant_no=parent.tenant_no AND existing.perms='mini:pl:legal-use-document:list'));
COMMIT;
@@ -0,0 +1,5 @@
-- 工单#4:计划用证配置。与九表额度迁移配套;执行前确认目标schema并备份。
-- 不迁移旧hazard_cert_ready到新配置,不从历史附件虚构额度或来源配对。
ALTER TABLE pl_plan
ADD COLUMN cert_configuration JSON NULL COMMENT '用证来源配对、候选选择与逐证条件确认;非放行状态'
AFTER hazard_cert_ready;