更新
This commit is contained in:
1 parent
5718a00e31
commit
1850ac640e
226 files changed
+37772
-12071
No files matched your search
@@ -0,0 +1,32 @@
|
||||
-- =============================================================
|
||||
-- 角色「平台下发 + 租户只读」显式锁定 - 增量迁移
|
||||
--
|
||||
-- 场景:平台端可建 cid=2 且 tenant_id=0 的全局角色下发到租户后台。
|
||||
-- 此前"租户不可改/不可删"的判定绑死在 tenant_id==0 上,
|
||||
-- 一是无法表达"落到具体租户头上但仍只读",
|
||||
-- 二是后端看 tenant_id、前端看 is_custom,两处口径不一致会漂移。
|
||||
-- 本迁移把锁定语义收敛为独立列 is_locked。
|
||||
--
|
||||
-- 执行顺序:
|
||||
-- 1) 加 is_locked / source_role_id 两列
|
||||
-- 2) 回填:现存全局租户角色(cid=2 且 tenant_id=0)标记为锁定,
|
||||
-- 保证代码改用 is_locked 判定后,这两个角色不会突然变得可被租户改写。
|
||||
--
|
||||
-- 注意:MySQL 不支持 ADD COLUMN IF NOT EXISTS,本脚本重复执行会在第 1 步
|
||||
-- 报 Duplicate column name 并停止,属预期,不会破坏已回填的数据。
|
||||
-- =============================================================
|
||||
|
||||
-- 1. 角色表补锁定列
|
||||
ALTER TABLE `yz_system_admin_role`
|
||||
ADD COLUMN `is_locked` TINYINT UNSIGNED NOT NULL DEFAULT 0
|
||||
COMMENT '1=平台下发,租户端只读(不可改名/改权限/删除)' AFTER `is_custom`,
|
||||
ADD COLUMN `source_role_id` BIGINT UNSIGNED NOT NULL DEFAULT 0
|
||||
COMMENT '来源角色ID(平台下发时记录,0=非下发)' AFTER `is_locked`;
|
||||
|
||||
-- 2. 回填存量全局租户角色
|
||||
UPDATE `yz_system_admin_role`
|
||||
SET `is_locked` = 1
|
||||
WHERE `cid` = 2
|
||||
AND `tenant_id` = 0
|
||||
AND `delete_time` IS NULL
|
||||
AND `is_locked` = 0;
|
||||
@@ -0,0 +1,289 @@
|
||||
-- =============================================================
|
||||
-- 进销存(ERP)—— 交易层数据表
|
||||
--
|
||||
-- 对应模型:go/models/erp_inventory.go
|
||||
--
|
||||
-- 设计要点:
|
||||
-- 1. 库存流水表 yz_backend_erp_stock_ledger 是核心:所有出入库动作
|
||||
-- 审核生效时写入一条不可篡改的流水,由流水驱动库存结存
|
||||
-- yz_backend_erp_stock(qty + 移动加权成本),不直接改库存数字。
|
||||
-- 2. 单据统一建模:yz_backend_erp_document(主表)+ _item(明细),
|
||||
-- doc_type 覆盖 采购订单/入库/退货、销售订单/出库/退货、
|
||||
-- 其他出入库、调拨、盘点 十类单据,一套单据引擎驱动全部流转。
|
||||
-- 单据特有字段:book_qty(盘点账面)、to_warehouse_id(调拨)、
|
||||
-- ref_doc_id/ref_item_id(退货溯源、入库关联订单)。
|
||||
-- 3. 业财一体:出库/入库单生效时生成往来账 yz_backend_erp_partner_bill
|
||||
-- (应收/应付),收付款单 yz_backend_erp_fund_bill 通过
|
||||
-- yz_backend_erp_fund_settle 按单核销。
|
||||
-- 4. 状态机:0草稿 1审批中 2已生效 3已驳回 4已作废;
|
||||
-- 仅「已生效」产生库存流水与往来账;草稿/驳回/审批中可作废。
|
||||
--
|
||||
-- 注意:不显式指定 COLLATE,沿用数据库默认排序规则,避免与既有表
|
||||
-- (utf8mb4_0900_ai_ci)在 JOIN 比较字符串时报 Illegal mix of collations。
|
||||
-- =============================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ---------------- 1. 商品分类(树形) ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_product_category` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`category_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '分类名称',
|
||||
`parent_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父分类ID,0=根',
|
||||
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
|
||||
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` DATETIME DEFAULT NULL COMMENT '软删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant` (`tenant_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-商品分类';
|
||||
|
||||
-- ---------------- 2. 商品档案 ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_product` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`product_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '商品编号(租户内唯一)',
|
||||
`product_name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '商品名称',
|
||||
`category_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类ID',
|
||||
`brand` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '品牌',
|
||||
`spec` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '规格',
|
||||
`model` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '型号',
|
||||
`base_unit` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '基本单位(库存计量单位)',
|
||||
`aux_unit` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '辅助单位(如箱)',
|
||||
`aux_ratio` DECIMAL(18,4) NOT NULL DEFAULT 1 COMMENT '换算系数:1辅助单位=aux_ratio基本单位',
|
||||
`barcode` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '主条码',
|
||||
`extra_barcodes` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '多条码 CSV',
|
||||
`purchase_price` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '参考采购价',
|
||||
`sale_price` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '零售价',
|
||||
`wholesale_price` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '批发价',
|
||||
`member_price` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '会员价',
|
||||
`min_price` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '最低售价(开单低于此价拦截)',
|
||||
`tax_rate` DECIMAL(9,4) NOT NULL DEFAULT 0 COMMENT '税率(%)',
|
||||
`safety_qty` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '安全库存下限(低于预警)',
|
||||
`max_qty` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '库存上限(高于积压预警,0=不限)',
|
||||
`shelf_life_days` INT NOT NULL DEFAULT 0 COMMENT '保质期天数(0=不管效期)',
|
||||
`enable_batch` TINYINT NOT NULL DEFAULT 0 COMMENT '是否批次管理:1是 0否',
|
||||
`image_url` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '商品图片',
|
||||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
|
||||
`is_draft` TINYINT NOT NULL DEFAULT 0 COMMENT '1草稿 0正式',
|
||||
`remark` VARCHAR(1000) NOT NULL DEFAULT '',
|
||||
`create_user_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` DATETIME DEFAULT NULL COMMENT '软删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_tenant_code` (`tenant_id`,`product_code`),
|
||||
KEY `idx_tenant_name` (`tenant_id`,`product_name`),
|
||||
KEY `idx_barcode` (`barcode`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-商品档案';
|
||||
|
||||
-- ---------------- 3. 仓库 ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_warehouse` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`warehouse_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '仓库编号',
|
||||
`warehouse_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '仓库名称',
|
||||
`address` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '地址',
|
||||
`manager` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '负责人',
|
||||
`phone` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '联系电话',
|
||||
`is_default` TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认仓库:1是 0否',
|
||||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
|
||||
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` DATETIME DEFAULT NULL COMMENT '软删除',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant` (`tenant_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-仓库档案';
|
||||
|
||||
-- ---------------- 4. 库存结存(由流水驱动) ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_stock` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`product_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品ID',
|
||||
`warehouse_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '仓库ID',
|
||||
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号,空=非批次库存',
|
||||
`quantity` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '当前库存数量(基本单位)',
|
||||
`cost_price` DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '移动加权平均成本',
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_stock` (`tenant_id`,`product_id`,`warehouse_id`,`batch_no`),
|
||||
KEY `idx_tenant_product` (`tenant_id`,`product_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-库存结存';
|
||||
|
||||
-- ---------------- 5. 库存流水(核心·只增不改不删) ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_stock_ledger` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`product_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品ID',
|
||||
`warehouse_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '仓库ID',
|
||||
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号',
|
||||
`direction` TINYINT NOT NULL DEFAULT 1 COMMENT '方向:1入 -1出',
|
||||
`quantity` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '变动数量(正数)',
|
||||
`before_qty` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '变动前结存',
|
||||
`after_qty` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '变动后结存',
|
||||
`unit_cost` DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '本次变动单位成本(入库=进价,出库=出库时加权成本)',
|
||||
`total_cost` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '本次变动成本金额',
|
||||
`doc_type` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '来源单据类型',
|
||||
`doc_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '来源单据ID',
|
||||
`doc_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源单据号',
|
||||
`doc_item_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '来源单据明细ID',
|
||||
`production_date` DATE DEFAULT NULL COMMENT '生产日期',
|
||||
`expire_date` DATE DEFAULT NULL COMMENT '到期日期',
|
||||
`operator_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '操作人ID',
|
||||
`operator_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '操作人姓名',
|
||||
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_stock` (`tenant_id`,`product_id`,`warehouse_id`),
|
||||
KEY `idx_doc` (`tenant_id`,`doc_type`,`doc_id`),
|
||||
KEY `idx_create_time` (`tenant_id`,`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-库存流水(不可篡改)';
|
||||
|
||||
-- ---------------- 6. 单据主表(十类单据统一建模) ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_document` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`doc_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '单据号(前缀取基础设置)',
|
||||
`doc_type` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '单据类型:purchase_order/purchase_in/purchase_return/sales_order/sales_out/sales_return/other_in/other_out/transfer/stock_take',
|
||||
`biz_date` DATE NOT NULL COMMENT '业务日期',
|
||||
`warehouse_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '主仓库(入库仓/出库仓/调出仓)',
|
||||
`to_warehouse_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '调入仓库(仅调拨)',
|
||||
`partner_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '往来单位类型:customer/supplier',
|
||||
`partner_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '往来单位ID(客户表/供应商表)',
|
||||
`partner_name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '往来单位名称快照',
|
||||
`source_doc_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '来源单据ID(入库单←采购订单,退货单←入库/出库单)',
|
||||
`total_qty` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '合计数量(基本单位)',
|
||||
`total_amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '合计金额(折前)',
|
||||
`discount_amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '整单优惠金额',
|
||||
`actual_amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '合计金额(折后,往来账按此计)',
|
||||
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '0草稿 1审批中 2已生效 3已驳回 4已作废',
|
||||
`instance_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '审批实例ID',
|
||||
`auditor_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '审核人ID',
|
||||
`auditor_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '审核人姓名',
|
||||
`audit_time` DATETIME DEFAULT NULL COMMENT '审核生效时间',
|
||||
`remark` VARCHAR(1000) NOT NULL DEFAULT '',
|
||||
`create_user_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人ID',
|
||||
`create_user_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人姓名',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` DATETIME DEFAULT NULL COMMENT '软删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_tenant_docno` (`tenant_id`,`doc_no`),
|
||||
KEY `idx_tenant_type_status` (`tenant_id`,`doc_type`,`status`),
|
||||
KEY `idx_partner` (`tenant_id`,`partner_type`,`partner_id`),
|
||||
KEY `idx_biz_date` (`tenant_id`,`biz_date`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-业务单据主表';
|
||||
|
||||
-- ---------------- 7. 单据明细 ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_document_item` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`doc_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '主表ID',
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`product_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品ID',
|
||||
`product_name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '商品名称快照',
|
||||
`spec` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '规格快照',
|
||||
`unit` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '计量单位(基本单位)',
|
||||
`warehouse_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '明细行仓库(盘点用;单据级默认可0)',
|
||||
`batch_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '批次号',
|
||||
`quantity` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '数量(基本单位)',
|
||||
`book_qty` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '账面数量(仅盘点)',
|
||||
`executed_qty` DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '已执行数量(订单被入库/出库累计)',
|
||||
`ref_item_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '来源明细行ID(入库行←订单行/退货行←原单行)',
|
||||
`unit_price` DECIMAL(18,6) NOT NULL DEFAULT 0 COMMENT '单价(成本/进价/售价)',
|
||||
`amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '行金额',
|
||||
`production_date` DATE DEFAULT NULL COMMENT '生产日期',
|
||||
`expire_date` DATE DEFAULT NULL COMMENT '到期日期',
|
||||
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`sort_order` INT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_doc` (`doc_id`),
|
||||
KEY `idx_tenant_product` (`tenant_id`,`product_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-业务单据明细';
|
||||
|
||||
-- ---------------- 8. 往来账(应收/应付) ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_partner_bill` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`bill_type` TINYINT NOT NULL DEFAULT 1 COMMENT '1应收 2应付',
|
||||
`partner_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT 'customer/supplier',
|
||||
`partner_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '往来单位ID',
|
||||
`partner_name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '往来单位名称快照',
|
||||
`source_doc_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '来源单据ID',
|
||||
`source_doc_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源单据号',
|
||||
`bill_date` DATE NOT NULL COMMENT '账期开始日',
|
||||
`due_date` DATE DEFAULT NULL COMMENT '到期日(账期)',
|
||||
`amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '发生额(红字为负)',
|
||||
`settled_amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '已核销额',
|
||||
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '0未核销 1部分核销 2已核销',
|
||||
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_type` (`tenant_id`,`bill_type`,`status`),
|
||||
KEY `idx_partner` (`tenant_id`,`partner_type`,`partner_id`),
|
||||
KEY `idx_doc` (`tenant_id`,`source_doc_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-往来账(应收/应付)';
|
||||
|
||||
-- ---------------- 9. 收付款单 ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_fund_bill` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`fund_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '收付款单号',
|
||||
`fund_type` TINYINT NOT NULL DEFAULT 1 COMMENT '1收款(冲应收) 2付款(冲应付) 3其他收入 4费用支出',
|
||||
`partner_type` VARCHAR(20) NOT NULL DEFAULT '' COMMENT 'customer/supplier/空(其他收支)',
|
||||
`partner_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '往来单位ID',
|
||||
`partner_name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '往来单位名称快照',
|
||||
`amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '收付金额(正数)',
|
||||
`settled_amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '已核销往来账金额(按单核销累计)',
|
||||
`pay_method` VARCHAR(30) NOT NULL DEFAULT 'cash' COMMENT 'cash现金/bank银行/wechat微信/alipay支付宝/check支票/online在线',
|
||||
`pay_account` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '收款账户备注',
|
||||
`biz_date` DATE NOT NULL COMMENT '收付日期',
|
||||
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '0草稿 1已确认 4已作废',
|
||||
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
||||
`create_user_id` VARCHAR(64) NOT NULL DEFAULT '',
|
||||
`create_user_name` VARCHAR(64) NOT NULL DEFAULT '',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
`delete_time` DATETIME DEFAULT NULL COMMENT '软删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_tenant_fundno` (`tenant_id`,`fund_no`),
|
||||
KEY `idx_tenant_type` (`tenant_id`,`fund_type`,`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-收付款单';
|
||||
|
||||
-- ---------------- 10. 收付款核销明细 ----------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_erp_fund_settle` (
|
||||
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` VARCHAR(64) NOT NULL DEFAULT '',
|
||||
`fund_bill_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '收付款单ID',
|
||||
`partner_bill_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '往来账ID',
|
||||
`partner_bill_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '往来单据号快照',
|
||||
`amount` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT '本次核销额',
|
||||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_fund` (`fund_bill_id`),
|
||||
KEY `idx_bill` (`partner_bill_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP-收付款核销明细';
|
||||
|
||||
-- ---------------- 11. 客户/供应商信用字段(幂等增列) ----------------
|
||||
-- MySQL 不支持 ADD COLUMN IF NOT EXISTS,用 INFORMATION_SCHEMA 判重 + PREPARE 动态执行。
|
||||
|
||||
SET @has_credit := (SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema=DATABASE() AND table_name='yz_backend_erp_customer' AND column_name='credit_limit');
|
||||
SET @sql := IF(@has_credit=0,
|
||||
'ALTER TABLE `yz_backend_erp_customer` ADD COLUMN `credit_limit` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT ''信用额度,0=不限'', ADD COLUMN `payment_days` INT NOT NULL DEFAULT 0 COMMENT ''账期天数''',
|
||||
'SELECT ''yz_backend_erp_customer.credit_limit already exists''');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @has_spay := (SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema=DATABASE() AND table_name='yz_backend_erp_supplier' AND column_name='payment_days');
|
||||
SET @sql := IF(@has_spay=0,
|
||||
'ALTER TABLE `yz_backend_erp_supplier` ADD COLUMN `payment_days` INT NOT NULL DEFAULT 0 COMMENT ''账期天数''',
|
||||
'SELECT ''yz_backend_erp_supplier.payment_days already exists''');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- ---------------- 结果校验 ----------------
|
||||
SELECT TABLE_NAME, TABLE_COMMENT FROM information_schema.tables
|
||||
WHERE table_schema=DATABASE() AND TABLE_NAME LIKE 'yz_backend_erp_%' ORDER BY TABLE_NAME;
|
||||
@@ -9,7 +9,7 @@
|
||||
-- 基础资料 -> 商品 / 供应商 / 客户 / 仓库
|
||||
-- 采购管理 -> 采购订单 / 采购入库 / 采购退货
|
||||
-- 销售管理 -> 销售订单 / 销售出库 / 销售退货
|
||||
-- 库存管理 -> 入库 / 出库 / 调拨 / 盘点 / 库存查询
|
||||
-- 库存管理 -> 入库 / 出库 / 调拨 / 盘点 / 库存查询 / 库存预警
|
||||
-- 财务管理 -> 应收 / 应付 / 收付款
|
||||
-- 报表中心 -> 报表中心
|
||||
-- 系统管理 -> 系统管理 / 账套管理(账套列表)/ 基础设置
|
||||
@@ -18,7 +18,8 @@
|
||||
-- type 1=目录(大类),2=页面(小类)
|
||||
-- views '[2]' 租户端:Web 租户后台与移动端共用同一份菜单
|
||||
-- platforms 留 NULL:展示端继承 erp 模块配置
|
||||
-- 未实现的页面 component_path 留空:Web 端为空白页,移动端落到「功能开发中」占位页
|
||||
-- component_path 由「3.1 页面文件登记」统一写入;未登记的菜单 Web 端为空白页,
|
||||
-- 移动端落到「功能开发中」占位页
|
||||
-- icon 完整 Font Awesome 类名;移动端必须落在 uniapp/utils/fa-icons.js 白名单内才显示
|
||||
|
||||
SET @erp_id := (
|
||||
@@ -139,6 +140,7 @@ INSERT INTO tmp_erp_leaf (parent_path, title, path, icon, sort, remark) VALUES
|
||||
('/apps/erp/stock', '调拨', '/apps/erp/stock/transfer', 'fa-solid fa-right-left', 3, '仓库调拨'),
|
||||
('/apps/erp/stock', '盘点', '/apps/erp/stock/taking', 'fa-solid fa-clipboard-check', 4, '库存盘点'),
|
||||
('/apps/erp/stock', '库存查询', '/apps/erp/stock/query', 'fa-solid fa-magnifying-glass', 5, '库存查询'),
|
||||
('/apps/erp/stock', '库存预警', '/apps/erp/stock/warning', 'fa-solid fa-triangle-exclamation', 6, '缺货预警与智能补货'),
|
||||
('/apps/erp/finance', '应收', '/apps/erp/finance/receivable', 'fa-solid fa-file-invoice-dollar', 1, '应收账款'),
|
||||
('/apps/erp/finance', '应付', '/apps/erp/finance/payable', 'fa-solid fa-money-check-dollar', 2, '应付账款'),
|
||||
('/apps/erp/finance', '收付款', '/apps/erp/finance/payment', 'fa-solid fa-cash-register', 3, '收付款单'),
|
||||
@@ -155,6 +157,54 @@ WHERE e.id IS NULL;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_erp_leaf;
|
||||
|
||||
-- ---------- 3.1 页面文件登记 ----------
|
||||
-- 前端 pathResolver 先按 component_path 精确匹配,命中不到才按文件名模糊兜底,
|
||||
-- 模糊兜底会把菜单渲染成另一个同名 index.vue,所以这里一律写从 src/views 起的完整路径。
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_erp_page;
|
||||
CREATE TEMPORARY TABLE tmp_erp_page (
|
||||
path VARCHAR(200) NOT NULL,
|
||||
component_path VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (path)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
|
||||
|
||||
INSERT INTO tmp_erp_page (path, component_path) VALUES
|
||||
('/apps/erp/basic/product', '/apps/erp/basic/product.vue'),
|
||||
('/apps/erp/basic/warehouse', '/apps/erp/basic/warehouse.vue'),
|
||||
('/apps/erp/purchase/order', '/apps/erp/purchase/order.vue'),
|
||||
('/apps/erp/purchase/inbound', '/apps/erp/purchase/inbound.vue'),
|
||||
('/apps/erp/purchase/return', '/apps/erp/purchase/return.vue'),
|
||||
('/apps/erp/sales/order', '/apps/erp/sales/order.vue'),
|
||||
('/apps/erp/sales/outbound', '/apps/erp/sales/outbound.vue'),
|
||||
('/apps/erp/sales/return', '/apps/erp/sales/return.vue'),
|
||||
('/apps/erp/stock/inbound', '/apps/erp/stock/inbound.vue'),
|
||||
('/apps/erp/stock/outbound', '/apps/erp/stock/outbound.vue'),
|
||||
('/apps/erp/stock/transfer', '/apps/erp/stock/transfer.vue'),
|
||||
('/apps/erp/stock/taking', '/apps/erp/stock/taking.vue'),
|
||||
('/apps/erp/stock/query', '/apps/erp/stock/query.vue'),
|
||||
('/apps/erp/stock/warning', '/apps/erp/stock/warning.vue'),
|
||||
('/apps/erp/finance/receivable', '/apps/erp/finance/receivable.vue'),
|
||||
('/apps/erp/finance/payable', '/apps/erp/finance/payable.vue'),
|
||||
('/apps/erp/finance/payment', '/apps/erp/finance/payment.vue'),
|
||||
('/apps/erp/report/index', '/apps/erp/report/index.vue'),
|
||||
('/apps/erp/system/index', '/apps/erp/system/index.vue'),
|
||||
('/apps/erp/ProgramManagement', '/apps/erp/ProgramManagement/index.vue');
|
||||
|
||||
UPDATE yz_system_menu m
|
||||
JOIN tmp_erp_page t ON t.path = m.path
|
||||
SET m.component_path = t.component_path, m.update_time = NOW()
|
||||
WHERE m.delete_time IS NULL AND (m.component_path IS NULL OR m.component_path <> t.component_path);
|
||||
|
||||
-- 基础设置 历史上挂成目录(type=1)又没有子菜单,登记页面后按叶子菜单处理
|
||||
UPDATE yz_system_menu SET type = 2, update_time = NOW()
|
||||
WHERE delete_time IS NULL AND path = '/apps/erp/ProgramManagement' AND type = 1;
|
||||
|
||||
-- 菜单行还没建(上一节未生效)时这里会列出来,执行后应重新跑一次本脚本
|
||||
SELECT t.path AS 未登记菜单 FROM tmp_erp_page t
|
||||
LEFT JOIN yz_system_menu m ON m.path = t.path AND m.delete_time IS NULL
|
||||
WHERE m.id IS NULL;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp_erp_page;
|
||||
|
||||
-- 补图标:迁移过来的菜单原本没有图标,移动端会退化成兜底图标,这里只填空值、不覆盖已有配置
|
||||
UPDATE yz_system_menu SET icon = 'fa-solid fa-store', update_time = NOW()
|
||||
WHERE delete_time IS NULL AND path = '/apps/erp/suppliers' AND (icon IS NULL OR icon = '');
|
||||
|
||||
Reference in new issue
Block a user