201 lines
11 KiB
SQL
201 lines
11 KiB
SQL
-- ============================================================
|
|
-- PSI 订单/出库与业务表建表 —— 服装厂成衣标准
|
|
-- ============================================================
|
|
-- 包含:销售订单、采购订单、出库单 共 6 张表
|
|
-- + 修复 psi_purchases 缺少列
|
|
-- 各表均已补齐品牌/款号/色号/尺码明细/箱重/体积等成衣行业必备字段
|
|
-- ============================================================
|
|
|
|
-- -------------------------------------------
|
|
-- 1. 销售订单主表
|
|
-- -------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS `psi_sales_orders` (
|
|
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
|
`order_no` VARCHAR(40) NOT NULL COMMENT '订单编号 SO+年月日+流水',
|
|
`customer` VARCHAR(100) NOT NULL COMMENT '客户名称',
|
|
`customer_po` VARCHAR(80) DEFAULT '' COMMENT '客户采购单号(国际成衣贸易必备)',
|
|
`brand` VARCHAR(100) DEFAULT '' COMMENT '品牌',
|
|
`salesman` VARCHAR(50) DEFAULT '' COMMENT '业务员',
|
|
`channel` VARCHAR(20) DEFAULT 'domestic' COMMENT '销售渠道 domestic/export',
|
|
`region` VARCHAR(60) DEFAULT '' COMMENT '销售区域',
|
|
`currency` VARCHAR(10) DEFAULT 'CNY' COMMENT '币种 CNY/USD/EUR',
|
|
`payment_terms` VARCHAR(50) DEFAULT '' COMMENT '付款条件 T/T,L/C,D/P,OA',
|
|
`incoterm` VARCHAR(10) DEFAULT '' COMMENT '贸易术语 FOB/CIF/EXW/CFR/DDP',
|
|
`shipping_mark` VARCHAR(200) DEFAULT '' COMMENT '唛头',
|
|
`style_count` INT DEFAULT 0 COMMENT '款数',
|
|
`total_qty` INT DEFAULT 0 COMMENT '总数量',
|
|
`total_amount` DECIMAL(12,2) DEFAULT 0 COMMENT '总金额',
|
|
`delivery_date` VARCHAR(20) DEFAULT '' COMMENT '预计交付日期',
|
|
`remark` TEXT COMMENT '备注',
|
|
`status` VARCHAR(20) DEFAULT 'pending' COMMENT '状态 pending/partial/delivered/closed',
|
|
`created_at` VARCHAR(20) DEFAULT '' COMMENT '创建时间',
|
|
`updated_at` VARCHAR(20) DEFAULT '' COMMENT '最后修改时间',
|
|
INDEX `idx_so_customer` (`customer`),
|
|
INDEX `idx_so_salesman` (`salesman`),
|
|
INDEX `idx_so_status` (`status`),
|
|
INDEX `idx_so_created` (`created_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='销售订单主表';
|
|
|
|
-- -------------------------------------------
|
|
-- 2. 销售订单明细表
|
|
-- -------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS `psi_sales_order_items` (
|
|
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
|
`so_id` INT NOT NULL COMMENT '关联销售订单ID',
|
|
`product_id` INT DEFAULT 0 COMMENT '关联成品ID',
|
|
`style_no` VARCHAR(60) DEFAULT '' COMMENT '款号/货号',
|
|
`name` VARCHAR(120) NOT NULL COMMENT '商品名称',
|
|
`spec` VARCHAR(100) DEFAULT '' COMMENT '规格',
|
|
`color_code` VARCHAR(30) DEFAULT '' COMMENT '色号',
|
|
`size_detail` TEXT COMMENT '尺码明细 JSON [{size:\"S\",qty:100},...]',
|
|
`unit` VARCHAR(20) DEFAULT '件' COMMENT '单位',
|
|
`qty` INT DEFAULT 0 COMMENT '数量',
|
|
`price` DECIMAL(10,2) DEFAULT 0 COMMENT '单价',
|
|
`amount` DECIMAL(12,2) DEFAULT 0 COMMENT '金额',
|
|
`unit_price_cny` DECIMAL(10,2) DEFAULT 0 COMMENT '人民币单价(外单换算用)',
|
|
`packing` VARCHAR(60) DEFAULT '' COMMENT '包装方式(独色独码/混色混码)',
|
|
`delivered_qty` INT DEFAULT 0 COMMENT '已交付数量',
|
|
INDEX `idx_soi_so_id` (`so_id`),
|
|
INDEX `idx_soi_product_id` (`product_id`),
|
|
INDEX `idx_soi_style_no` (`style_no`),
|
|
FOREIGN KEY (`so_id`) REFERENCES `psi_sales_orders`(`id`) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='销售订单明细';
|
|
|
|
-- -------------------------------------------
|
|
-- 3. 采购订单主表
|
|
-- -------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS `psi_purchase_orders` (
|
|
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
|
`order_no` VARCHAR(40) NOT NULL COMMENT '订单编号 PO+年月日+流水',
|
|
`contract_no` VARCHAR(80) DEFAULT '' COMMENT '合同号',
|
|
`supplier_id` INT DEFAULT 0 COMMENT '供应商ID',
|
|
`supplier_name` VARCHAR(100) DEFAULT '' COMMENT '供应商名称',
|
|
`brand` VARCHAR(100) DEFAULT '' COMMENT '品牌',
|
|
`salesman` VARCHAR(50) DEFAULT '' COMMENT '采购员',
|
|
`currency` VARCHAR(10) DEFAULT 'CNY' COMMENT '币种',
|
|
`payment_terms` VARCHAR(50) DEFAULT '' COMMENT '付款条件',
|
|
`total_qty` INT DEFAULT 0 COMMENT '总数量',
|
|
`total_amount` DECIMAL(12,2) DEFAULT 0 COMMENT '总金额',
|
|
`expected_at` VARCHAR(20) DEFAULT '' COMMENT '预计到货日期',
|
|
`remark` TEXT COMMENT '备注',
|
|
`status` VARCHAR(20) DEFAULT 'pending' COMMENT '状态 pending/received/closed',
|
|
`created_at` VARCHAR(20) DEFAULT '' COMMENT '创建时间',
|
|
`updated_at` VARCHAR(20) DEFAULT '' COMMENT '最后修改时间',
|
|
INDEX `idx_po_supplier` (`supplier_id`),
|
|
INDEX `idx_po_status` (`status`),
|
|
INDEX `idx_po_created` (`created_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购订单主表';
|
|
|
|
-- -------------------------------------------
|
|
-- 4. 采购订单明细表
|
|
-- -------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS `psi_purchase_order_items` (
|
|
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
|
`po_id` INT NOT NULL COMMENT '关联采购订单ID',
|
|
`item_type` VARCHAR(10) DEFAULT 'product' COMMENT '类型 product/material',
|
|
`item_id` INT DEFAULT 0 COMMENT '关联物料/成品ID',
|
|
`style_no` VARCHAR(60) DEFAULT '' COMMENT '款号/货号',
|
|
`name` VARCHAR(120) NOT NULL COMMENT '商品名称',
|
|
`spec` VARCHAR(100) DEFAULT '' COMMENT '规格',
|
|
`color_code` VARCHAR(30) DEFAULT '' COMMENT '色号',
|
|
`size_detail` TEXT COMMENT '尺码明细 JSON',
|
|
`material_code` VARCHAR(60) DEFAULT '' COMMENT '物料编码',
|
|
`unit` VARCHAR(20) DEFAULT '件' COMMENT '单位',
|
|
`qty` INT DEFAULT 0 COMMENT '数量',
|
|
`price` DECIMAL(10,2) DEFAULT 0 COMMENT '单价',
|
|
`amount` DECIMAL(12,2) DEFAULT 0 COMMENT '金额',
|
|
`delivery_date` VARCHAR(20) DEFAULT '' COMMENT '预计交期',
|
|
`received_qty` INT DEFAULT 0 COMMENT '已收货数量',
|
|
INDEX `idx_poi_po_id` (`po_id`),
|
|
INDEX `idx_poi_item_type` (`item_type`),
|
|
INDEX `idx_poi_style_no` (`style_no`),
|
|
FOREIGN KEY (`po_id`) REFERENCES `psi_purchase_orders`(`id`) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购订单明细';
|
|
|
|
-- -------------------------------------------
|
|
-- 5. 出库单主表
|
|
-- -------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS `psi_outbounds` (
|
|
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
|
`order_no` VARCHAR(40) NOT NULL COMMENT '出库单号 OUT+年月日+流水',
|
|
`so_no` VARCHAR(40) DEFAULT '' COMMENT '关联销售订单号',
|
|
`customer` VARCHAR(100) DEFAULT '' COMMENT '客户',
|
|
`customer_po` VARCHAR(80) DEFAULT '' COMMENT '客户采购单号',
|
|
`brand` VARCHAR(100) DEFAULT '' COMMENT '品牌',
|
|
`salesman` VARCHAR(50) DEFAULT '' COMMENT '业务员',
|
|
`warehouse` VARCHAR(60) DEFAULT '' COMMENT '出库仓库',
|
|
`carton_count` INT DEFAULT 0 COMMENT '箱数',
|
|
`container_no` VARCHAR(100) DEFAULT '' COMMENT '柜号/箱号范围',
|
|
`seal_no` VARCHAR(60) DEFAULT '' COMMENT '封条号',
|
|
`packing_list_no` VARCHAR(60) DEFAULT '' COMMENT '装箱单号',
|
|
`shipping_line` VARCHAR(80) DEFAULT '' COMMENT '船公司/快递',
|
|
`voyage` VARCHAR(60) DEFAULT '' COMMENT '航次/航班',
|
|
`port_of_loading` VARCHAR(60) DEFAULT '' COMMENT '装运港',
|
|
`port_of_discharge` VARCHAR(60) DEFAULT '' COMMENT '卸货港',
|
|
`etd` VARCHAR(20) DEFAULT '' COMMENT '预计离港日',
|
|
`eta` VARCHAR(20) DEFAULT '' COMMENT '预计到港日',
|
|
`gross_weight` DECIMAL(10,2) DEFAULT 0 COMMENT '毛重 KG',
|
|
`net_weight` DECIMAL(10,2) DEFAULT 0 COMMENT '净重 KG',
|
|
`volume` DECIMAL(10,3) DEFAULT 0 COMMENT '体积 CBM',
|
|
`status` VARCHAR(20) DEFAULT 'delivered' COMMENT '状态 delivered/partial',
|
|
`delivery_date` VARCHAR(20) DEFAULT '' COMMENT '实际交付日期',
|
|
`remark` TEXT COMMENT '备注',
|
|
`created_at` VARCHAR(20) DEFAULT '' COMMENT '创建时间',
|
|
`updated_at` VARCHAR(20) DEFAULT '' COMMENT '最后修改时间',
|
|
INDEX `idx_ob_so_no` (`so_no`),
|
|
INDEX `idx_ob_customer` (`customer`),
|
|
INDEX `idx_ob_status` (`status`),
|
|
INDEX `idx_ob_created` (`created_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库单主表';
|
|
|
|
-- -------------------------------------------
|
|
-- 6. 出库单明细表
|
|
-- -------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS `psi_outbound_items` (
|
|
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
|
`ob_id` INT NOT NULL COMMENT '关联出库单ID',
|
|
`so_item_id` INT DEFAULT 0 COMMENT '关联销售订单明细ID',
|
|
`product_id` INT DEFAULT 0 COMMENT '成品ID',
|
|
`style_no` VARCHAR(60) DEFAULT '' COMMENT '款号/货号',
|
|
`name` VARCHAR(120) NOT NULL COMMENT '商品名称',
|
|
`spec` VARCHAR(100) DEFAULT '' COMMENT '规格',
|
|
`color_code` VARCHAR(30) DEFAULT '' COMMENT '色号',
|
|
`size_detail` TEXT COMMENT '尺码明细 JSON',
|
|
`carton_no` VARCHAR(40) DEFAULT '' COMMENT '箱号',
|
|
`unit` VARCHAR(20) DEFAULT '件' COMMENT '单位',
|
|
`qty` INT DEFAULT 0 COMMENT '数量',
|
|
`price` DECIMAL(10,2) DEFAULT 0 COMMENT '单价',
|
|
`amount` DECIMAL(12,2) DEFAULT 0 COMMENT '金额',
|
|
`unit_weight` DECIMAL(10,2) DEFAULT 0 COMMENT '单件重量 g/KG',
|
|
INDEX `idx_obi_ob_id` (`ob_id`),
|
|
INDEX `idx_obi_product_id` (`product_id`),
|
|
INDEX `idx_obi_so_item_id` (`so_item_id`),
|
|
INDEX `idx_obi_style_no` (`style_no`),
|
|
FOREIGN KEY (`ob_id`) REFERENCES `psi_outbounds`(`id`) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库单明细';
|
|
|
|
-- -------------------------------------------
|
|
-- 7. 修复 psi_purchases —— 补齐 PurchaseOrdersController::receive() 所需的列
|
|
-- -------------------------------------------
|
|
-- 使用 INFORMATION_SCHEMA 动态检测是否存在列,兼容 MySQL 5.7+ / MariaDB 10.2+
|
|
DROP PROCEDURE IF EXISTS tmp_psi_purchases_alter;
|
|
DELIMITER $$
|
|
CREATE PROCEDURE tmp_psi_purchases_alter()
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'psi_purchases' AND COLUMN_NAME = 'product_id') THEN
|
|
ALTER TABLE `psi_purchases` ADD COLUMN `product_id` INT DEFAULT 0 COMMENT '成品ID(采购订单收货时使用)' AFTER `item_id`;
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'psi_purchases' AND COLUMN_NAME = 'supplier') THEN
|
|
ALTER TABLE `psi_purchases` ADD COLUMN `supplier` VARCHAR(100) DEFAULT '' COMMENT '供应商名称' AFTER `supplier_id`;
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'psi_purchases' AND COLUMN_NAME = 'brand') THEN
|
|
ALTER TABLE `psi_purchases` ADD COLUMN `brand` VARCHAR(100) DEFAULT '' COMMENT '品牌' AFTER `supplier`;
|
|
END IF;
|
|
END$$
|
|
DELIMITER ;
|
|
CALL tmp_psi_purchases_alter();
|
|
DROP PROCEDURE IF EXISTS tmp_psi_purchases_alter;
|