#油品出库多销售台账绑定 + 销售台账到货记录
|
#对应需求:一次油品出库可绑定多个销售台账(对应多个客户,且各台账须含同一产品规格);
|
# 销售台账新增「到货记录」(到货数量/已出库车辆/附件),发货台账据此改为层级展示
|
#目标库:product-inventory-management-rbhb
|
#说明:纯新增两张表;第 3 段的存量清理是幂等的,本地/线上若无数据则为 no-op
|
|
#1. 出库单 ↔ 销售台账 绑定表(一个出库单可绑多个台账,各带本次分摊数量)
|
# 列类型对齐存量库:stock_out_record.id / sales_ledger.id / sales_ledger_product.id / customer.id 均为 int
|
create table stock_out_record_sales_ledger
|
(
|
id bigint not null auto_increment comment '主键',
|
stock_out_record_id int not null comment '出库记录id(stock_out_record.id)',
|
sales_ledger_id int not null comment '销售台账id(sales_ledger.id)',
|
sales_ledger_product_id int null comment '销售台账销售明细id(sales_ledger_product.id,type=1)',
|
customer_id int null comment '客户id(冗余自台账)',
|
customer_name varchar(100) null comment '客户名称(冗余自台账)',
|
quantity decimal(16, 4) null comment '本台账对应的出库数量(吨)',
|
create_time datetime null comment '创建时间',
|
create_user bigint null comment '创建人',
|
update_time datetime null comment '更新时间',
|
update_user bigint null comment '更新人',
|
tenant_id bigint null comment '租户id',
|
dept_id bigint null comment '部门id',
|
primary key (id),
|
key idx_sosl_record (stock_out_record_id),
|
key idx_sosl_ledger (sales_ledger_id)
|
) engine = InnoDB
|
default charset = utf8mb4
|
row_format = DYNAMIC comment ='出库记录-销售台账绑定表';
|
|
#2. 销售台账到货记录表(发货台账里的子行)
|
# attachments 存 /common/public/upload 返回 previewURL 的 JSON 数组(永久链接,不走 storage_blob 签名体系)
|
# vehicle.id 是 bigint,与上面几张 int 表不同,别搞混
|
create table sales_ledger_arrival
|
(
|
id bigint not null auto_increment comment '主键',
|
sales_ledger_id int not null comment '销售台账id(sales_ledger.id)',
|
sales_ledger_product_id int null comment '销售台账销售明细id(sales_ledger_product.id,type=1)',
|
stock_out_record_id int not null comment '出库记录id(stock_out_record.id),发货台账的父行',
|
vehicle_id bigint null comment '车辆id(vehicle.id)',
|
truck_plate_no varchar(20) null comment '到货车牌号',
|
arrival_quantity decimal(16, 4) null comment '到货数量(吨)',
|
arrival_date date null comment '到货日期',
|
attachments text null comment '附件(JSON数组,URL列表)',
|
remark varchar(255) null comment '备注',
|
create_time datetime null comment '创建时间',
|
create_user bigint null comment '创建人',
|
update_time datetime null comment '更新时间',
|
update_user bigint null comment '更新人',
|
tenant_id bigint null comment '租户id',
|
dept_id bigint null comment '部门id',
|
primary key (id),
|
key idx_sla_ledger (sales_ledger_id),
|
key idx_sla_record (stock_out_record_id)
|
) engine = InnoDB
|
default charset = utf8mb4
|
row_format = DYNAMIC comment ='销售台账到货记录表';
|
|
#3. 存量清理(幂等):上一轮「油品出库审批通过自动生成发货单」留下的数据
|
# 本轮回退该生成逻辑,改为由「到货记录」驱动销售台账状态,故把已生成的发货单删掉、只清 record_id
|
# 油品出库的 record_type 保持原样(「1」),不改成「13」—— 改了会让出库管理列表按出库类型筛选时看不到它
|
delete
|
from shipping_product_detail
|
where shipping_info_id in
|
(select record_id
|
from stock_out_record
|
where record_type = '13' and record_id > 0 and (type is null or type = ''));
|
|
delete
|
from shipping_info
|
where id in
|
(select record_id
|
from stock_out_record
|
where record_type = '13' and record_id > 0 and (type is null or type = ''));
|
|
update stock_out_record
|
set record_id = 0
|
where record_type = '13' and record_id > 0 and (type is null or type = '');
|
|
#4. 存量回填(幂等):上一轮「一个出库单绑一个销售台账」存在 stock_out_record.sales_ledger_id 单值列里,
|
# 本轮改成绑定表,不回填的话这些老数据在财务/开票/收款以及「可到货车辆」里会整批消失。
|
# 数量取 stock_out_num,明细 id 取该台账同规格 type=1 明细中 id 最小的那条;数量<=0 或无匹配明细的老单跳过
|
# stock_out_record 没有 tenant_id 列,故 tenant_id 不填(该表也不是租户维度)
|
insert into stock_out_record_sales_ledger
|
(stock_out_record_id, sales_ledger_id, sales_ledger_product_id, customer_id, customer_name, quantity,
|
create_time, create_user, update_time, update_user, dept_id)
|
select sor.id,
|
sl.id,
|
slp.id,
|
sl.customer_id,
|
sl.customer_name,
|
sor.stock_out_num,
|
ifnull(sor.create_time, now()),
|
ifnull(sor.create_user, 0),
|
now(),
|
ifnull(sor.create_user, 0),
|
sor.dept_id
|
from stock_out_record sor
|
join sales_ledger sl on sl.id = sor.sales_ledger_id and ifnull(sl.ledger_type, '') <> '代储'
|
join sales_ledger_product slp on slp.sales_ledger_id = sl.id
|
and slp.type = 1
|
and slp.id = (select min(x.id)
|
from sales_ledger_product x
|
where x.sales_ledger_id = sl.id
|
and x.type = 1
|
and x.product_model_id = sor.product_model_id)
|
where (sor.type is null or sor.type = '')
|
and ifnull(sor.stock_out_num, 0) > 0
|
and not exists (select 1
|
from stock_out_record_sales_ledger b
|
where b.stock_out_record_id = sor.id);
|
|
#5. 开票申请 / 收款单 增加「关联到货绑定行 id」列。
|
# 背景:一次油品出库可按客户拆成多条绑定行(stock_out_record_sales_ledger),财务候选列表的粒度
|
# 因此从「出库单」下沉到「出库单×客户」。但 stock_out_record_ids 里存的是出库单 id,两种 id
|
# 空间都是从小自增的整数,混在一个列里必然撞号(绑定行 1 与出库单 1 都会被 FIND_IN_SET 命中),
|
# 所以另开一列,stock_out_record_ids 的语义和类型保持不变,存量数据不受影响。
|
# 精度 255 与 stock_out_record_ids 保持一致(够存约 40 个 id)。
|
alter table account_invoice_application
|
add column stock_out_binding_ids varchar(255) null comment '关联出库绑定行id(多选,stock_out_record_sales_ledger.id)' after stock_out_record_ids;
|
|
alter table account_sales_collection
|
add column stock_out_binding_ids varchar(255) null comment '关联出库绑定行id(多选,stock_out_record_sales_ledger.id)' after stock_out_record_ids;
|