初始提交:MCP Server Demo(ERP/CRM/Bexell 三模组,动态 Bearer Token 鉴权)

This commit is contained in:
2026-09-02 17:08:10 +08:00
commit 71c3d86ccf
28 changed files with 3983 additions and 0 deletions
+243
View File
@@ -0,0 +1,243 @@
-- ============================================================
-- 试产排程评估及优化系统 - 数据库初始化脚本
-- Database: bexell_schedule_ai (PostgreSQL)
-- ============================================================
-- 1. 系统参数表
CREATE TABLE IF NOT EXISTS sys_parameter (
id SERIAL PRIMARY KEY,
param_code VARCHAR(50) NOT NULL UNIQUE,
param_name VARCHAR(100) NOT NULL,
param_value VARCHAR(200) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. 设备产能表
CREATE TABLE IF NOT EXISTS equipment_capacity (
id SERIAL PRIMARY KEY,
equipment_code VARCHAR(20) NOT NULL UNIQUE,
equipment_name VARCHAR(100) NOT NULL,
equipment_type VARCHAR(50) NOT NULL,
max_capacity NUMERIC(10,2) NOT NULL,
standard_capacity NUMERIC(10,2) NOT NULL,
min_startup NUMERIC(10,2) NOT NULL,
line_change_cost NUMERIC(10,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 3. 品号信息表
CREATE TABLE IF NOT EXISTS product_info (
id SERIAL PRIMARY KEY,
product_code VARCHAR(50) NOT NULL UNIQUE,
product_name VARCHAR(100) NOT NULL,
specification VARCHAR(200) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 4. 品号设备产能负荷表
CREATE TABLE IF NOT EXISTS product_equipment_load (
id SERIAL PRIMARY KEY,
product_code VARCHAR(50) NOT NULL REFERENCES product_info(product_code),
product_name VARCHAR(100) NOT NULL,
specification VARCHAR(200) NOT NULL,
equipment_code VARCHAR(20) NOT NULL REFERENCES equipment_capacity(equipment_code),
equipment_name VARCHAR(100) NOT NULL,
standard_capacity NUMERIC(10,4) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(product_code, equipment_code)
);
-- 5. 品号设备排产明细表
CREATE TABLE IF NOT EXISTS product_equipment_schedule (
id SERIAL PRIMARY KEY,
schedule_id VARCHAR(20) NOT NULL UNIQUE,
equipment_code VARCHAR(20) NOT NULL REFERENCES equipment_capacity(equipment_code),
equipment_name VARCHAR(100) NOT NULL,
equipment_type VARCHAR(50) NOT NULL,
product_code VARCHAR(50) NOT NULL REFERENCES product_info(product_code),
product_name VARCHAR(100) NOT NULL,
specification VARCHAR(200) NOT NULL,
quantity INTEGER NOT NULL,
occupied_capacity NUMERIC(10,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 6. 设备实时产能实时数据视图
CREATE OR REPLACE VIEW v_equipment_realtime_capacity AS
SELECT
e.equipment_type,
e.equipment_code,
e.equipment_name,
e.max_capacity AS max_capacity_h,
e.standard_capacity AS standard_capacity_h,
COALESCE(SUM(s.occupied_capacity), 0) AS current_load_h
FROM equipment_capacity e
LEFT JOIN product_equipment_schedule s
ON e.equipment_code = s.equipment_code
GROUP BY e.id, e.equipment_type, e.equipment_code, e.equipment_name,
e.max_capacity, e.standard_capacity;
-- ============================================================
-- 种子数据
-- ============================================================
-- 系统参数
INSERT INTO sys_parameter (param_code, param_name, param_value) VALUES
('sys_s_parameter', '影响系数', '0.1');
-- 设备产能
INSERT INTO equipment_capacity (equipment_code, equipment_name, equipment_type, max_capacity, standard_capacity, min_startup, line_change_cost) VALUES
('CY001','冲压机1','冲压',15,12,4,1),
('CY002','冲压机2','冲压',15,12,4,1),
('CY003','冲压机3','冲压',15,12,4,1),
('CY004','冲压机4','冲压',15,12,4,1),
('CY005','冲压机5','冲压',15,12,4,1),
('CY006','冲压机6','冲压',15,12,4,1),
('CY007','冲压机7','冲压',15,12,4,1),
('CY008','冲压机8','冲压',15,12,4,1),
('CY009','冲压机9','冲压',15,12,4,1),
('CY010','冲压机10','冲压',15,12,4,1),
('DN001','镀镍机1','表面',12,8,6,1.5),
('DN002','镀镍机2','表面',12,8,6,1.5),
('DN003','镀镍机3','表面',12,8,6,1.5),
('DN004','镀镍机4','表面',12,8,6,1.5),
('DN005','镀镍机5','表面',12,8,6,1.5),
('DN006','镀镍机6','表面',12,8,6,1.5),
('DN007','镀镍机7','表面',12,8,6,1.5),
('DN008','镀镍机8','表面',12,8,6,1.5),
('DN009','镀镍机9','表面',12,8,6,1.5),
('DN010','镀镍机10','表面',12,8,6,1.5),
('DN011','镀镍机11','表面',12,8,6,1.5),
('DN012','镀镍机12','表面',12,8,6,1.5),
('VJ001','AI视觉检测机1','检测',24,12,1,0.5),
('VJ002','AI视觉检测机2','检测',24,12,1,0.5),
('VJ003','AI视觉检测机3','检测',24,12,1,0.5),
('VJ004','AI视觉检测机4','检测',24,12,1,0.5),
('VJ005','AI视觉检测机5','检测',24,12,1,0.5);
-- 品号信息
INSERT INTO product_info (product_code, product_name, specification) VALUES
('A0001','电池钢壳','电池钢壳'),
('A0002','电池底盖','电池底盖'),
('A0003','圆柱电池钢壳','圆柱电池钢壳');
-- 品号设备产能负荷 (81 rows)
INSERT INTO product_equipment_load (product_code, product_name, specification, equipment_code, equipment_name, standard_capacity) VALUES
('A0001','电池钢壳','电池钢壳','CY001','冲压机1',0.2),
('A0001','电池钢壳','电池钢壳','CY002','冲压机2',0.2),
('A0001','电池钢壳','电池钢壳','CY003','冲压机3',0.2),
('A0001','电池钢壳','电池钢壳','CY004','冲压机4',0.2),
('A0001','电池钢壳','电池钢壳','CY005','冲压机5',0.2),
('A0001','电池钢壳','电池钢壳','CY006','冲压机6',0.2),
('A0001','电池钢壳','电池钢壳','CY007','冲压机7',0.2),
('A0001','电池钢壳','电池钢壳','CY008','冲压机8',0.2),
('A0001','电池钢壳','电池钢壳','CY009','冲压机9',0.2),
('A0001','电池钢壳','电池钢壳','CY010','冲压机10',0.2),
('A0001','电池钢壳','电池钢壳','DN001','镀镍机1',0.1),
('A0001','电池钢壳','电池钢壳','DN002','镀镍机2',0.1),
('A0001','电池钢壳','电池钢壳','DN003','镀镍机3',0.1),
('A0001','电池钢壳','电池钢壳','DN004','镀镍机4',0.1),
('A0001','电池钢壳','电池钢壳','DN005','镀镍机5',0.1),
('A0001','电池钢壳','电池钢壳','DN006','镀镍机6',0.1),
('A0001','电池钢壳','电池钢壳','DN007','镀镍机7',0.1),
('A0001','电池钢壳','电池钢壳','DN008','镀镍机8',0.1),
('A0001','电池钢壳','电池钢壳','DN009','镀镍机9',0.1),
('A0001','电池钢壳','电池钢壳','DN010','镀镍机10',0.1),
('A0001','电池钢壳','电池钢壳','DN011','镀镍机11',0.1),
('A0001','电池钢壳','电池钢壳','DN012','镀镍机12',0.1),
('A0001','电池钢壳','电池钢壳','VJ001','AI视觉检测机1',0.01),
('A0001','电池钢壳','电池钢壳','VJ002','AI视觉检测机2',0.01),
('A0001','电池钢壳','电池钢壳','VJ003','AI视觉检测机3',0.01),
('A0001','电池钢壳','电池钢壳','VJ004','AI视觉检测机4',0.01),
('A0001','电池钢壳','电池钢壳','VJ005','AI视觉检测机5',0.01),
('A0002','电池底盖','电池底盖','CY001','冲压机1',0.2),
('A0002','电池底盖','电池底盖','CY002','冲压机2',0.2),
('A0002','电池底盖','电池底盖','CY003','冲压机3',0.2),
('A0002','电池底盖','电池底盖','CY004','冲压机4',0.2),
('A0002','电池底盖','电池底盖','CY005','冲压机5',0.2),
('A0002','电池底盖','电池底盖','CY006','冲压机6',0.2),
('A0002','电池底盖','电池底盖','CY007','冲压机7',0.2),
('A0002','电池底盖','电池底盖','CY008','冲压机8',0.2),
('A0002','电池底盖','电池底盖','CY009','冲压机9',0.2),
('A0002','电池底盖','电池底盖','CY010','冲压机10',0.2),
('A0002','电池底盖','电池底盖','DN001','镀镍机1',0.1),
('A0002','电池底盖','电池底盖','DN002','镀镍机2',0.1),
('A0002','电池底盖','电池底盖','DN003','镀镍机3',0.1),
('A0002','电池底盖','电池底盖','DN004','镀镍机4',0.1),
('A0002','电池底盖','电池底盖','DN005','镀镍机5',0.1),
('A0002','电池底盖','电池底盖','DN006','镀镍机6',0.1),
('A0002','电池底盖','电池底盖','DN007','镀镍机7',0.1),
('A0002','电池底盖','电池底盖','DN008','镀镍机8',0.1),
('A0002','电池底盖','电池底盖','DN009','镀镍机9',0.1),
('A0002','电池底盖','电池底盖','DN010','镀镍机10',0.1),
('A0002','电池底盖','电池底盖','DN011','镀镍机11',0.1),
('A0002','电池底盖','电池底盖','DN012','镀镍机12',0.1),
('A0002','电池底盖','电池底盖','VJ001','AI视觉检测机1',0.01),
('A0002','电池底盖','电池底盖','VJ002','AI视觉检测机2',0.01),
('A0002','电池底盖','电池底盖','VJ003','AI视觉检测机3',0.01),
('A0002','电池底盖','电池底盖','VJ004','AI视觉检测机4',0.01),
('A0002','电池底盖','电池底盖','VJ005','AI视觉检测机5',0.01),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY001','冲压机1',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY002','冲压机2',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY003','冲压机3',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY004','冲压机4',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY005','冲压机5',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY006','冲压机6',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY007','冲压机7',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY008','冲压机8',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY009','冲压机9',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','CY010','冲压机10',0.2),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN001','镀镍机1',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN002','镀镍机2',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN003','镀镍机3',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN004','镀镍机4',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN005','镀镍机5',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN006','镀镍机6',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN007','镀镍机7',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN008','镀镍机8',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN009','镀镍机9',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN010','镀镍机10',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN011','镀镍机11',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','DN012','镀镍机12',0.1),
('A0003','圆柱电池钢壳','圆柱电池钢壳','VJ001','AI视觉检测机1',0.01),
('A0003','圆柱电池钢壳','圆柱电池钢壳','VJ002','AI视觉检测机2',0.01),
('A0003','圆柱电池钢壳','圆柱电池钢壳','VJ003','AI视觉检测机3',0.01),
('A0003','圆柱电池钢壳','圆柱电池钢壳','VJ004','AI视觉检测机4',0.01),
('A0003','圆柱电池钢壳','圆柱电池钢壳','VJ005','AI视觉检测机5',0.01);
-- 品号设备排产明细
INSERT INTO product_equipment_schedule (schedule_id, equipment_code, equipment_name, equipment_type, product_code, product_name, specification, quantity, occupied_capacity) VALUES
('2026080001','CY001','冲压机1','冲压','A0001','电池钢壳','电池钢壳',50,10),
('2026080002','CY001','冲压机1','冲压','A0002','电池底盖','电池底盖',25,5),
('2026080003','CY002','冲压机2','冲压','A0001','电池钢壳','电池钢壳',50,10),
('2026080004','CY002','冲压机2','冲压','A0003','圆柱电池钢壳','圆柱电池钢壳',10,2),
('2026080005','CY003','冲压机3','冲压','A0001','电池钢壳','电池钢壳',40,8),
('2026080006','CY004','冲压机4','冲压','A0002','电池底盖','电池底盖',50,10),
('2026080007','CY005','冲压机5','冲压','A0001','电池钢壳','电池钢壳',75,15),
('2026080008','CY006','冲压机6','冲压','A0003','圆柱电池钢壳','圆柱电池钢壳',60,12),
('2026080009','CY007','冲压机7','冲压','A0001','电池钢壳','电池钢壳',45,9),
('2026080010','CY008','冲压机8','冲压','A0002','电池底盖','电池底盖',50,10),
('2026080011','CY009','冲压机9','冲压','A0002','电池底盖','电池底盖',50,10),
('2026080012','CY010','冲压机10','冲压','A0003','圆柱电池钢壳','圆柱电池钢壳',55,11),
('2026080013','DN001','镀镍机1','表面','A0001','电池钢壳','电池钢壳',100,10),
('2026080014','DN002','镀镍机2','表面','A0003','圆柱电池钢壳','圆柱电池钢壳',90,9),
('2026080015','DN003','镀镍机3','表面','A0001','电池钢壳','电池钢壳',110,11),
('2026080016','DN004','镀镍机4','表面','A0002','电池底盖','电池底盖',80,8),
('2026080017','DN005','镀镍机5','表面','A0002','电池底盖','电池底盖',60,6),
('2026080018','DN006','镀镍机6','表面','A0003','圆柱电池钢壳','圆柱电池钢壳',100,10),
('2026080019','DN007','镀镍机7','表面','A0001','电池钢壳','电池钢壳',80,8),
('2026080020','DN008','镀镍机8','表面','A0003','圆柱电池钢壳','圆柱电池钢壳',100,10),
('2026080021','DN009','镀镍机9','表面','A0001','电池钢壳','电池钢壳',60,6),
('2026080022','DN010','镀镍机10','表面','A0002','电池底盖','电池底盖',70,7),
('2026080023','DN011','镀镍机11','表面','A0002','电池底盖','电池底盖',70,7),
('2026080024','DN012','镀镍机12','表面','A0003','圆柱电池钢壳','圆柱电池钢壳',70,7),
('2026080025','VJ001','AI视觉检测机1','检测','A0001','电池钢壳','电池钢壳',800,8),
('2026080026','VJ002','AI视觉检测机2','检测','A0002','电池底盖','电池底盖',800,8),
('2026080027','VJ003','AI视觉检测机3','检测','A0002','电池底盖','电池底盖',800,8),
('2026080028','VJ004','AI视觉检测机4','检测','A0003','圆柱电池钢壳','圆柱电池钢壳',900,9),
('2026080029','VJ005','AI视觉检测机5','检测','A0003','圆柱电池钢壳','圆柱电池钢壳',1000,10);
+271
View File
@@ -0,0 +1,271 @@
-- ============================================================
-- MCP for CRM — 汽车零部件智能报价 CRM 数据服务
-- 数据库:smart_quotation_auto
-- v3: 幂等可重跑(唯一约束+去重);扩充至 20 客户 + 历史询价/报价/商机全谱系
-- ============================================================
-- 1. 客户
CREATE TABLE IF NOT EXISTS customer (
customer_code VARCHAR(50) PRIMARY KEY,
name VARCHAR(200) NOT NULL,
oem_tier VARCHAR(20) NOT NULL,
credit_level VARCHAR(5) DEFAULT 'B',
discount_rate DECIMAL(4,3) DEFAULT 0,
payment_days INTEGER DEFAULT 30,
contact_person VARCHAR(50),
phone VARCHAR(30),
email VARCHAR(100),
industry VARCHAR(50),
region VARCHAR(50),
total_orders INTEGER DEFAULT 0,
total_amount DECIMAL(14,2) DEFAULT 0,
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. 询价记录
CREATE TABLE IF NOT EXISTS inquiry (
inquiry_id VARCHAR(50) PRIMARY KEY,
customer_code VARCHAR(50) NOT NULL REFERENCES customer(customer_code),
inquiry_date DATE NOT NULL DEFAULT CURRENT_DATE,
drawing_number VARCHAR(100),
part_number VARCHAR(100),
annual_volume INTEGER,
target_price DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'pending',
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 3. 询价明细行
CREATE TABLE IF NOT EXISTS inquiry_item (
id SERIAL PRIMARY KEY,
inquiry_id VARCHAR(50) NOT NULL REFERENCES inquiry(inquiry_id),
line_no INTEGER NOT NULL,
part_name VARCHAR(200),
part_number VARCHAR(100),
material_grade VARCHAR(50),
volume_cc DECIMAL(10,2),
annual_qty INTEGER,
unit VARCHAR(10) DEFAULT '件',
remarks TEXT
);
-- 4. 报价单
CREATE TABLE IF NOT EXISTS quotation (
quotation_id VARCHAR(50) PRIMARY KEY,
inquiry_id VARCHAR(50) REFERENCES inquiry(inquiry_id),
customer_code VARCHAR(50) NOT NULL REFERENCES customer(customer_code),
quotation_date DATE NOT NULL DEFAULT CURRENT_DATE,
valid_until DATE,
version INTEGER DEFAULT 1,
status VARCHAR(20) DEFAULT 'draft',
mold_cost DECIMAL(12,2) DEFAULT 0,
unit_price DECIMAL(10,2),
annual_volume INTEGER,
total_annual DECIMAL(14,2),
subtotal DECIMAL(14,2),
tax_rate DECIMAL(4,3) DEFAULT 0.130,
tax_amount DECIMAL(14,2),
total_amount DECIMAL(14,2),
currency VARCHAR(10) DEFAULT 'CNY',
payment_terms VARCHAR(200) DEFAULT '月结30天',
delivery_terms VARCHAR(200) DEFAULT '含税含运',
created_by VARCHAR(50) DEFAULT 'AI智能报价',
approved_by VARCHAR(50),
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 5. 报价成本明细
CREATE TABLE IF NOT EXISTS quotation_cost_detail (
id SERIAL PRIMARY KEY,
quotation_id VARCHAR(50) NOT NULL REFERENCES quotation(quotation_id),
material_cost DECIMAL(10,4),
casting_cost DECIMAL(10,4),
machining_cost DECIMAL(10,4),
post_process_cost DECIMAL(10,4),
overhead_rate DECIMAL(4,3),
profit_rate DECIMAL(4,3),
total_cost DECIMAL(10,4),
unit_price DECIMAL(10,4)
);
-- 6. 商机
CREATE TABLE IF NOT EXISTS opportunity (
opportunity_id VARCHAR(50) PRIMARY KEY,
customer_code VARCHAR(50) NOT NULL REFERENCES customer(customer_code),
title VARCHAR(200) NOT NULL,
stage VARCHAR(20) DEFAULT 'lead',
expected_amount DECIMAL(14,2) DEFAULT 0,
probability INTEGER DEFAULT 20,
oem_program VARCHAR(200),
expected_close_date DATE,
source VARCHAR(100),
created_by VARCHAR(50),
created_at DATE DEFAULT CURRENT_DATE,
updated_at DATE DEFAULT CURRENT_DATE
);
-- ============================================================
-- 幂等性:去重 + 唯一约束(可重复执行)
-- ============================================================
DELETE FROM inquiry_item a USING inquiry_item b
WHERE a.id > b.id AND a.inquiry_id = b.inquiry_id AND a.line_no = b.line_no;
DELETE FROM quotation_cost_detail a USING quotation_cost_detail b
WHERE a.id > b.id AND a.quotation_id = b.quotation_id;
DO $$ BEGIN
ALTER TABLE inquiry_item ADD CONSTRAINT uq_inquiry_item UNIQUE (inquiry_id, line_no);
EXCEPTION WHEN duplicate_table THEN NULL; END $$;
DO $$ BEGIN
ALTER TABLE quotation_cost_detail ADD CONSTRAINT uq_quotation_cost UNIQUE (quotation_id);
EXCEPTION WHEN duplicate_table THEN NULL; END $$;
-- 多版本报价支持:同一询价单不限报价次数
-- 1) 规范化历史版本号:同一询价单下按时间序重写为 1..n(幂等,已是 1..n 的行不变)
WITH ranked AS (
SELECT quotation_id,
ROW_NUMBER() OVER (PARTITION BY inquiry_id ORDER BY created_at, quotation_id) AS rn
FROM quotation
WHERE inquiry_id IS NOT NULL
)
UPDATE quotation q
SET version = r.rn
FROM ranked r
WHERE q.quotation_id = r.quotation_id AND q.version <> r.rn;
-- 2) 同一询价单内版本号唯一(并发防重)
DO $$ BEGIN
ALTER TABLE quotation ADD CONSTRAINT uq_quotation_version UNIQUE (inquiry_id, version);
EXCEPTION WHEN duplicate_table THEN NULL; END $$;
-- 3) 版本链查询索引
CREATE INDEX IF NOT EXISTS idx_quotation_inquiry ON quotation(inquiry_id);
-- ============================================================
-- 种子数据
-- ============================================================
-- 客户(20 家:OEM×7 / Tier1×7 / Tier2×6;信用 A×8 / B×6 / C×2 / D×1 / 无评级×3)
INSERT INTO customer (customer_code, name, oem_tier, credit_level, discount_rate, payment_days, contact_person, phone, email, industry, region, total_orders, total_amount, notes) VALUES
('OEM-2024-001', '某日系主机厂', 'OEM', 'A', 0.050, 60, '张工', '021-5555-0001', 'zhang@oem-jp.example.com', '汽车', '上海', 45, 28000000, '长期合作,主要采购铝合金阀体壳'),
('OEM-2024-002', '某德系主机厂', 'OEM', 'A', 0.030, 45, '李总', '010-8888-0002', 'li@oem-de.example.com', '汽车', '北京', 30, 15000000, '质量要求高,偏好铸铁件'),
('OEM-2024-003', '某新能源主机厂', 'OEM', 'A', 0.040, 60, '刘工', '0551-2222-0005', 'liu@oem-nev.example.com', '汽车', '合肥', 22, 9800000, '新能源三电系统配套,增长快'),
('OEM-2024-004', '某美系主机厂', 'OEM', 'A', 0.030, 45, '孙总', '027-3333-0006', 'sun@oem-us.example.com', '汽车', '武汉', 26, 11200000, '混合动力变速箱项目'),
('OEM-2025-001', '某商用车主机厂', 'OEM', 'B', 0.020, 90, '赵工', '0431-4444-0007', 'zhao@oem-cv.example.com', '商用车', '长春', 12, 4600000, '长账期客户,注意现金流'),
('OEM-2025-002', '某乘商两用主机厂', 'OEM', 'B', 0.025, 60, '周工', '0772-5555-0008', 'zhou@oem-mpv.example.com', '汽车', '柳州', 9, 3200000, '乘用车+商用车双线采购'),
('OEM-2026-001', '某智能电动新势力', 'OEM', 'A', 0.050, 45, '吴总', '021-6666-0009', 'wu@oem-ev.example.com', '新能源', '上海', 3, 850000, '高折扣新OEM,战略培育客户'),
('T1-2025-001', '某博世供应商', 'Tier1', 'B', 0.020, 30, '王经理','0512-6666-0003', 'wang@tier1-bs.example.com', '汽车零部件', '江苏苏州', 18, 5600000, '变速箱配套阀体'),
('T1-2025-002', '某大陆供应商', 'Tier1', 'B', 0.000, 30, '陈工', '020-7777-0004', 'chen@tier1-cr.example.com', '汽车零部件', '广东广州', 8, 1200000, '制动系统配套,新开发客户'),
('T1-2025-003', '某采埃孚供应商', 'Tier1', 'A', 0.020, 45, '郑总', '021-7777-0010', 'zheng@tier1-zf.example.com', '汽车零部件', '上海', 15, 4800000, 'ZF悬架系统配套'),
('T1-2025-004', '某电装系供应商', 'Tier1', 'A', 0.025, 45, '林总', '020-8888-0011', 'lin@tier1-ds.example.com', '汽车零部件', '广州', 20, 6300000, '日系热管理系统配套'),
('T1-2025-005', '某日立安斯泰莫供应商', 'Tier1', 'A', 0.020, 45, '徐总', '0411-9999-0012', 'xu@tier1-ha.example.com', '汽车零部件', '大连', 14, 4100000, '日系制动/转向配套'),
('T1-2026-001', '某制动系统供应商', 'Tier1', 'B', 0.015, 30, '何工', '023-1111-0013', 'he@tier1-bk.example.com', '汽车零部件', '重庆', 6, 1500000, '国产线控制动项目'),
('T1-2026-002', '某液压系统供应商', 'Tier1', 'B', 0.010, 60, '高工', '0731-2222-0014', 'gao@tier1-hy.example.com', '工程机械', '长沙', 5, 980000, '液压阀体,账期较长'),
('T2-2025-001', '某售后市场贸易商', 'Tier2', 'C', 0.000, 0, '罗经理','0571-3333-0015', 'luo@am-trade.example.com', '售后市场', '杭州', 3, 210000, '货到付款,信用C级,注意风险'),
('T2-2025-002', '某智能底盘初创公司', 'Tier2', '无评级', 0.000, 30, '宋工', '0512-4444-0016', 'song@chassis.example.com', '智能底盘', '苏州', 0, 0, '零订单历史新客户,需信用评审'),
('T2-2025-003', '某非道路机械贸易商', 'Tier2', 'D', 0.000, 0, '蒋经理','0537-5555-0017', 'jiang@offroad.example.com', '非道路机械', '济宁', 1, 45000, '信用D级,仅接受预付款订单'),
('T2-2025-004', '某改装件连锁商', 'Tier2', 'C', 0.000, 0, '邓总', '028-5555-0018', 'deng@mod-chain.example.com', '售后市场', '成都', 5, 320000, '改装市场连锁,货到付款'),
('T2-2026-001', '某机器人关节初创公司', 'Tier2', '无评级', 0.000, 30, '冯工', '0755-6666-0019', 'feng@robot-joint.example.com','机器人', '深圳', 0, 0, '零历史,人形机器人关节部件'),
('T2-2026-002', '某低空经济无人机公司', 'Tier2', '无评级', 0.000, 30, '曹工', '0755-7777-0020', 'cao@uav.example.com', '低空经济', '深圳', 0, 0, '新兴行业,eVTOL液压部件询价')
ON CONFLICT (customer_code) DO NOTHING;
-- 历史询价(2024-2025 闭环 + 2026 在途)
INSERT INTO inquiry (inquiry_id, customer_code, inquiry_date, drawing_number, part_number, annual_volume, target_price, status, notes) VALUES
('INQ-2024-9005', 'OEM-2024-001', '2024-10-20', 'DWG-VHB-EG-Rev1', 'P-VHB-004', 200000, 55.00, 'completed', '2024年发动机油路阀体壳询价,已成交'),
('INQ-2025-9001', 'OEM-2024-001', '2025-09-25', 'DWG-VBH-AT-Rev2', 'P-VBH-001', 300000, 96.00, 'completed', '2025年变速箱阀体外壳年价谈判'),
('INQ-2025-9002', 'OEM-2024-002', '2025-08-10', 'DWG-VHB-BK-Rev2', 'P-VHB-002', 150000, 155.00, 'completed', '2025年制动阀体壳询价,已中标'),
('INQ-2025-9003', 'T1-2025-001', '2025-05-28', 'DWG-VHB-SP-Rev1', 'P-VHB-003', 150000, 25.00, 'lost', '转向器阀体壳,因报价偏高丢单'),
('INQ-2025-9006', 'OEM-2024-002', '2025-11-05', 'DWG-VBH-AT-Rev2', 'P-VBH-001', 100000, 100.00, 'completed', '德系小批量采购变速箱阀体外壳'),
('INQ-2026-0006', 'OEM-2024-004', '2026-08-05', 'DWG-VHB-TC-Rev1', 'P-VHB-011', 120000, 48.00, 'pending', '涡轮增压控制阀体壳新询价'),
('INQ-2026-0007', 'OEM-2025-001', '2026-08-06', 'DWG-VHB-HD-Rev1', 'P-VHB-016', 60000, 260.00, 'processing', '重卡制动阀体壳,1000T大件')
ON CONFLICT (inquiry_id) DO NOTHING;
-- 询价明细行(与询价单一一对应)
INSERT INTO inquiry_item (inquiry_id, line_no, part_name, part_number, material_grade, volume_cc, annual_qty, remarks) VALUES
('INQ-2024-9005', 1, '发动机油路阀体壳', 'P-VHB-004', 'EN AC-4600', 555.56, 200000, '400T压铸,阳极氧化'),
('INQ-2025-9001', 1, '变速箱阀体外壳', 'P-VBH-001', 'ADC12', 444.44, 300000, '400T压铸,阳极氧化'),
('INQ-2025-9002', 1, '制动阀体壳', 'P-VHB-002', 'HT250', 388.89, 150000, '630T压铸,电泳涂装'),
('INQ-2025-9003', 1, '转向器阀体壳', 'P-VHB-003', 'A356-T6', 296.30, 150000, '280T压铸,钝化'),
('INQ-2025-9006', 1, '变速箱阀体外壳', 'P-VBH-001', 'ADC12', 444.44, 100000, '小批量'),
('INQ-2026-0006', 1, '涡轮增压控制阀体壳', 'P-VHB-011', 'ADC12', 320.00, 120000, '350T压铸,钝化'),
('INQ-2026-0007', 1, '重卡制动阀体壳', 'P-VHB-016', 'HT300', 850.00, 60000, '1000T压铸,达克罗')
ON CONFLICT (inquiry_id, line_no) DO NOTHING;
-- 基础询价(保留原种子)
INSERT INTO inquiry (inquiry_id, customer_code, inquiry_date, drawing_number, part_number, annual_volume, target_price, status, notes) VALUES
('INQ-2026-0001', 'OEM-2024-001', '2026-08-01', 'DWG-VBH-AT-Rev3', 'P-VBH-001', 300000, 95.00, 'processing', '新车型配套阀体壳,要求阳极氧化'),
('INQ-2026-0002', 'T1-2025-001', '2026-08-03', 'DWG-VHB-SP-Rev1', 'P-VHB-003', 150000, 55.00, 'pending', '转向器阀体壳,钝化处理')
ON CONFLICT (inquiry_id) DO NOTHING;
INSERT INTO inquiry_item (inquiry_id, line_no, part_name, part_number, material_grade, volume_cc, annual_qty, remarks) VALUES
('INQ-2026-0001', 1, '变速箱阀体外壳', 'P-VBH-001', 'ADC12', 444.44, 300000, '体积444.44cm³,400T压铸'),
('INQ-2026-0002', 1, '转向器阀体壳', 'P-VHB-003', 'A356-T6', 296.30, 150000, '体积296.30cm³,280T压铸')
ON CONFLICT (inquiry_id, line_no) DO NOTHING;
-- 历史报价(2024Q4-2025,含 won/lost,用于价格趋势与一致性校验)
INSERT INTO quotation (quotation_id, inquiry_id, customer_code, quotation_date, valid_until, version, status, mold_cost, unit_price, annual_volume, total_annual, subtotal, tax_rate, tax_amount, total_amount, payment_terms, delivery_terms, created_by, approved_by, remarks) VALUES
('QUO-2024-9005', 'INQ-2024-9005', 'OEM-2024-001', '2024-11-08', '2024-12-08', 1, 'approved', 180000, 52.30, 200000, 10460000, 10460000, 0.130, 1359800, 11819800, '月结60天', '含税含运', 'AI智能报价', '销售经理-赵总', '2024年基线价'),
('QUO-2025-9001', 'INQ-2025-9001', 'OEM-2024-001', '2025-10-15', '2025-11-15', 1, 'approved', 0, 42.50, 300000, 12750000, 12750000, 0.130, 1657500, 14407500, '月结60天', '含税含运', 'AI智能报价', '销售经理-赵总', '2025年年价,模具费已摊销'),
('QUO-2025-9002', 'INQ-2025-9001', 'OEM-2024-001', '2025-12-20', '2026-01-20', 2, 'approved', 0, 41.90, 300000, 12570000, 12570000, 0.130, 1634100, 14204100, '月结60天', '含税含运', 'AI智能报价', '销售经理-赵总', '第二轮降价,一致性校验基准'),
('QUO-2025-9003', 'INQ-2025-9002', 'OEM-2024-002', '2025-09-05', '2025-10-05', 1, 'won', 250000, 46.80, 150000, 7020000, 7020000, 0.130, 912600, 7932600, '月结45天', '含税含运,北京交货', 'AI智能报价', '销售总监-钱总', '已中标'),
('QUO-2025-9004', 'INQ-2025-9003', 'T1-2025-001', '2025-06-18', '2025-07-18', 1, 'lost', 120000, 28.40, 150000, 4260000, 4260000, 0.130, 553800, 4813800, '月结30天', '含税含运', 'AI智能报价', NULL, '报价偏高丢单,客户目标价25元'),
('QUO-2025-9006', 'INQ-2025-9006', 'OEM-2024-002', '2025-11-30', '2025-12-30', 1, 'sent', 0, 43.20, 100000, 4320000, 4320000, 0.130, 561600, 4881600, '月结45天', '含税含运', 'AI智能报价', '销售经理-赵总', '跨客户价差校验样本')
ON CONFLICT (quotation_id) DO NOTHING;
-- 历史报价成本明细
INSERT INTO quotation_cost_detail (quotation_id, material_cost, casting_cost, machining_cost, post_process_cost, overhead_rate, profit_rate, total_cost, unit_price) VALUES
('QUO-2024-9005', 28.50, 2.17, 2.45, 7.50, 0.120, 0.150, 40.62, 52.30),
('QUO-2025-9001', 23.90, 2.17, 0.87, 6.00, 0.120, 0.150, 32.94, 42.50),
('QUO-2025-9002', 23.50, 2.17, 0.87, 6.00, 0.120, 0.150, 32.54, 41.90),
('QUO-2025-9003', 20.20, 4.43, 1.91, 9.80, 0.120, 0.150, 36.34, 46.80),
('QUO-2025-9004', 16.50, 1.10, 2.88, 1.57, 0.120, 0.280, 22.05, 28.40),
('QUO-2025-9006', 24.50, 2.17, 0.87, 6.00, 0.120, 0.150, 33.54, 43.20)
ON CONFLICT (quotation_id) DO NOTHING;
-- 基础报价(保留原种子)
INSERT INTO quotation (quotation_id, inquiry_id, customer_code, quotation_date, valid_until, version, status, mold_cost, unit_price, annual_volume, total_annual, subtotal, tax_rate, tax_amount, total_amount, payment_terms, delivery_terms, created_by, approved_by, remarks) VALUES
('QUO-2026-0001', 'INQ-2026-0001', 'OEM-2024-001', '2026-07-15', '2026-08-15', 1, 'sent',
180000, 92.50, 300000, 27750000, 27750000, 0.130, 3607500, 31357500,
'月结60天', '含税含运,上海交货', 'AI智能报价', '销售经理-赵总', '老客户优惠价,含模具费18万')
ON CONFLICT (quotation_id) DO NOTHING;
INSERT INTO quotation_cost_detail (quotation_id, material_cost, casting_cost, machining_cost, post_process_cost, overhead_rate, profit_rate, total_cost, unit_price) VALUES
('QUO-2026-0001', 24.50, 8.20, 35.60, 6.00, 0.120, 0.150, 74.30, 92.50)
ON CONFLICT (quotation_id) DO NOTHING;
-- 商机(完整阶段谱系:lead/qualified/proposal/negotiation/quoted/won/lost)
INSERT INTO opportunity (opportunity_id, customer_code, title, stage, expected_amount, probability, oem_program, expected_close_date, source, created_by) VALUES
('OPP-2025-0005', 'OEM-2024-002', '2025年制动阀体壳定点', 'won', 8200000, 100, '德系新制动系统平台', '2025-09-30', '客户主动询价', '销售团队'),
('OPP-2025-0006', 'T1-2025-001', '转向器阀体壳年度供应', 'lost', 4500000, 0, 'EPS转向系统', '2025-07-31', '展会获客', '销售团队'),
('OPP-2026-0003', 'T1-2025-003', '采埃孚悬架阀体项目', 'lead', 5000000, 20, '主动悬架系统配套', '2026-12-31', '客户推荐', 'AI智能报价'),
('OPP-2026-0004', 'OEM-2024-003', '新能源平台阀体定点', 'negotiation', 9000000, 60, '纯电平台热管理+制动', '2026-11-30', '战略客户开发', '销售团队'),
('OPP-2026-0005', 'OEM-2024-004', '美系OEM新项目询价', 'qualified', 12000000, 40, '下一代混动变速箱', '2027-03-31', '客户主动询价', 'AI智能报价'),
('OPP-2026-0006', 'OEM-2025-001', '商用车平台重卡阀体', 'lead', 6000000, 15, '重卡制动系统升级', '2026-12-31', '展会获客', '销售团队'),
('OPP-2026-0001', 'OEM-2024-001', '2026年新车型阀体壳定点', 'proposal', 27750000, 60, '某日系新车型CVT配套', '2026-10-31', '客户主动询价', 'AI智能报价'),
('OPP-2026-0002', 'T1-2025-001', '转向器阀体壳年度采购', 'lead', 8250000, 30, 'EPS转向系统配套', '2026-12-31', '展会获客', 'AI智能报价')
ON CONFLICT (opportunity_id) DO NOTHING;
-- ============================================================
-- 7. 报价写入 CRM Mock 表(独立模拟场景,无外键、与其他工具无关)
-- ============================================================
CREATE TABLE IF NOT EXISTS quotation_mock (
quotation_id VARCHAR(50) PRIMARY KEY,
customer_name VARCHAR(200),
part_name VARCHAR(200),
part_number VARCHAR(50),
material_grade VARCHAR(50),
mold_cost DECIMAL(12,2) DEFAULT 0,
unit_price DECIMAL(10,2),
annual_volume INTEGER,
total_annual DECIMAL(14,2),
currency VARCHAR(10) DEFAULT 'CNY',
quotation_date DATE NOT NULL DEFAULT CURRENT_DATE,
status VARCHAR(20) DEFAULT 'draft',
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
+234
View File
@@ -0,0 +1,234 @@
-- ============================================================
-- MCP for ERP — 汽车零部件智能报价 ERP 数据服务
-- 数据库:smart_quotation_auto
-- v3: 幂等可重跑(唯一约束+去重);扩充至 16 物料/13 牌号/9 吨位/26 节拍/10 后处理
-- 新增 O1 material_price_history、O2 machining_rate
-- ============================================================
-- 1. 物料主数据(含体积,用于算铝水重量)
CREATE TABLE IF NOT EXISTS material_master (
material_code VARCHAR(50) PRIMARY KEY,
part_name VARCHAR(200) NOT NULL,
part_category VARCHAR(50) NOT NULL,
material_grade VARCHAR(50) NOT NULL,
density DECIMAL(6,3) NOT NULL DEFAULT 2.700,
volume_cc DECIMAL(10,2) NOT NULL,
net_weight_kg DECIMAL(8,3) NOT NULL,
die_casting_ton INTEGER NOT NULL,
surface_treatment VARCHAR(50),
unit VARCHAR(10) DEFAULT '件',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. 材质牌号对照表
CREATE TABLE IF NOT EXISTS material_grade_mapping (
id SERIAL PRIMARY KEY,
grade_group VARCHAR(50) NOT NULL,
gb_code VARCHAR(80),
astm_code VARCHAR(80),
jis_code VARCHAR(80),
en_code VARCHAR(80),
iso_code VARCHAR(80),
internal_code VARCHAR(50) NOT NULL,
density DECIMAL(6,3) NOT NULL,
price_per_kg DECIMAL(10,2) NOT NULL
);
-- 3. 压铸参数表(吨位 → 固定节拍)
CREATE TABLE IF NOT EXISTS die_casting_params (
tonnage INTEGER PRIMARY KEY,
shot_weight_kg DECIMAL(8,3) NOT NULL,
cycle_time_sec DECIMAL(8,2) NOT NULL,
machine_rate DECIMAL(10,2) NOT NULL,
mold_cavities INTEGER DEFAULT 1
);
-- 4. 机加工节拍表(固化工装节拍)
CREATE TABLE IF NOT EXISTS machining_cycle (
id SERIAL PRIMARY KEY,
operation_type VARCHAR(30) NOT NULL,
spec VARCHAR(50) NOT NULL,
cycle_time_sec DECIMAL(8,2) NOT NULL,
tool_rate DECIMAL(8,4) DEFAULT 0,
notes VARCHAR(200)
);
-- 5. 后处理费率表(按重量计价)
CREATE TABLE IF NOT EXISTS post_process_rate (
id SERIAL PRIMARY KEY,
process_type VARCHAR(50) NOT NULL,
unit VARCHAR(10) DEFAULT 'kg',
rate DECIMAL(10,2) NOT NULL,
currency VARCHAR(10) DEFAULT 'CNY'
);
-- 6. O1 材料价格历史表(月度参考价,核价取最新月份)
CREATE TABLE IF NOT EXISTS material_price_history (
id SERIAL PRIMARY KEY,
internal_code VARCHAR(50) NOT NULL,
price_date DATE NOT NULL,
price_per_kg DECIMAL(10,2) NOT NULL,
source VARCHAR(100) DEFAULT '市场参考价',
UNIQUE (internal_code, price_date)
);
-- 7. O2 机加工费率表(按材质族,替换硬编码 60 元/h)
CREATE TABLE IF NOT EXISTS machining_rate (
grade_group VARCHAR(50) PRIMARY KEY,
rate_per_hour DECIMAL(10,2) NOT NULL,
notes VARCHAR(200)
);
-- ============================================================
-- 幂等性:去重 + 唯一约束(可重复执行)
-- ============================================================
DELETE FROM machining_cycle a USING machining_cycle b
WHERE a.id > b.id AND a.operation_type = b.operation_type AND a.spec = b.spec;
DELETE FROM material_grade_mapping a USING material_grade_mapping b
WHERE a.id > b.id AND a.internal_code = b.internal_code;
DELETE FROM post_process_rate a USING post_process_rate b
WHERE a.id > b.id AND a.process_type = b.process_type;
DO $$ BEGIN
ALTER TABLE machining_cycle ADD CONSTRAINT uq_machining_cycle UNIQUE (operation_type, spec);
EXCEPTION WHEN duplicate_table THEN NULL; END $$;
DO $$ BEGIN
ALTER TABLE material_grade_mapping ADD CONSTRAINT uq_grade_mapping UNIQUE (internal_code);
EXCEPTION WHEN duplicate_table THEN NULL; END $$;
DO $$ BEGIN
ALTER TABLE post_process_rate ADD CONSTRAINT uq_post_process UNIQUE (process_type);
EXCEPTION WHEN duplicate_table THEN NULL; END $$;
-- ============================================================
-- 种子数据
-- ============================================================
-- 物料主数据(16 种阀体外壳:铝12/灰铁3/球铁1,吨位 160~1000T 全覆盖)
INSERT INTO material_master (material_code, part_name, part_category, material_grade, density, volume_cc, net_weight_kg, die_casting_ton, surface_treatment) VALUES
('VHB-AT-001', '变速箱阀体外壳', '阀体外壳', 'ADC12', 2.700, 444.44, 1.200, 400, '阳极氧化'),
('VHB-BK-002', '制动阀体壳', '阀体外壳', 'HT250', 7.200, 388.89, 2.800, 630, '电泳涂装'),
('VHB-SP-003', '转向器阀体壳', '阀体外壳', 'A356-T6', 2.650, 296.30, 0.785, 280, '钝化'),
('VHB-EG-004', '发动机油路阀体壳', '阀体外壳', 'EN AC-4600', 2.700, 555.56, 1.500, 400, '阳极氧化'),
('VHB-CL-005', '离合器控制阀体壳', '阀体外壳', 'ADC10', 2.700, 480.00, 1.300, 400, '阳极氧化'),
('VHB-TR-006', '变速箱液压控制阀体', '阀体外壳', 'AlSi9Cu3', 2.700, 620.00, 1.670, 630, '电泳涂装'),
('VHB-EB-007', '电子制动阀体壳', '阀体外壳', 'AlSi10MnMg', 2.650, 350.00, 0.930, 400, '钝化'),
('VHB-QT-008', '悬架阻尼阀体壳', '阀体外壳', 'QT500-7', 7.100, 520.00, 3.690, 630, '喷涂'),
('VHB-MN-009', '微型泵阀体壳', '阀体外壳', 'ADC12', 2.700, 96.30, 0.260, 160, '钝化'),
('VHB-LG-010', '大型主阀体壳', '阀体外壳', 'ADC12', 2.700, 1037.00, 2.800, 800, '电泳涂装'),
('VHB-TC-011', '涡轮增压控制阀体壳', '阀体外壳', 'ADC12', 2.700, 320.00, 0.860, 350, '钝化'),
('VHB-EG-012', 'EGR阀体壳', '阀体外壳', 'ADC10', 2.700, 265.00, 0.720, 280, '钝化'),
('VHB-WP-013', '水泵阀体壳', '阀体外壳', 'AlSi12', 2.650, 380.00, 1.010, 400, '阳极氧化'),
('VHB-TM-014', '热管理阀体壳(新能源)', '阀体外壳', 'AlSi10MnMg', 2.650, 505.00, 1.340, 500, '钝化'),
('VHB-OP-015', '机油泵阀体壳', '阀体外壳', 'ZL101', 2.650, 210.00, 0.560, 200, '钝化'),
('VHB-HD-016', '重卡制动阀体壳', '阀体外壳', 'HT300', 7.250, 850.00, 6.160, 1000, '达克罗')
ON CONFLICT (material_code) DO NOTHING;
-- 材质牌号对照表(13 条:铝合金/铸铝/灰铸铁/球墨铸铁)
INSERT INTO material_grade_mapping (grade_group, gb_code, astm_code, jis_code, en_code, iso_code, internal_code, density, price_per_kg) VALUES
('铝合金', 'ZAlSi10Cu(ADC12)', 'A380', 'ADC12', 'EN AC-4600', 'AlSi9Cu3', 'AL-ADC12', 2.700, 18.50),
('铝合金', 'ZAlSi7Mg(A356)', 'A356', 'AC4C-T6', 'EN AC-4210', 'AlSi7Mg', 'AL-A356', 2.650, 20.00),
('铝合金', 'ZAlSi9Cu(AlSi9Cu)', 'B443', 'AC4B', 'EN AC-4600', 'AlSi9Cu', 'AL-4600', 2.700, 18.00),
('铸铝', 'ZL101', '356.0', 'AC4C', 'EN AC-4200', 'AlSi7', 'AL-ZL101', 2.650, 19.00),
('铸铁', 'HT250', 'G2500', 'FC250', 'EN-GJL-250', 'GJL-250', 'IR-HT250', 7.200, 6.50),
('球墨铸铁', 'QT500-7', 'D5007', 'FCD500', 'EN-GJS-500', 'GJS-500', 'IR-QT500', 7.100, 7.20),
('铝合金', 'ZAlSi8Cu(ADC10)', 'A384', 'ADC10', 'EN AC-4650', 'AlSi8Cu', 'AL-ADC10', 2.700, 18.20),
('铝合金', 'ZAlSi10MnMg', '—', '—', 'AlSi10MnMg', 'AlSi10MnMg', 'AL-S10MM', 2.650, 22.00),
('铝合金', 'ZAlSi12', '413.0', 'AC3A', 'EN AC-4420', 'AlSi12', 'AL-S12', 2.650, 17.80),
('铸铁', 'HT200', 'G3000', 'FC200', 'EN-GJL-200', 'GJL-200', 'IR-HT200', 7.200, 6.00),
('铸铁', 'HT300', 'G3500', 'FC300', 'EN-GJL-300', 'GJL-300', 'IR-HT300', 7.250, 6.80),
('球墨铸铁', 'QT450-10', 'D4510', 'FCD450', 'EN-GJS-450', 'GJS-450', 'IR-QT450', 7.100, 7.00),
('球墨铸铁', 'QT600-3', 'D6003', 'FCD600', 'EN-GJS-600', 'GJS-600', 'IR-QT600', 7.100, 7.50)
ON CONFLICT (internal_code) DO NOTHING;
-- 球铁牌号组别归位(历史数据曾归入"铸铁"组)
UPDATE material_grade_mapping SET grade_group = '球墨铸铁' WHERE internal_code LIKE 'IR-QT%';
-- 压铸参数表(9 档吨位:160~1000T;故意不含 1250T 用于回退测试)
INSERT INTO die_casting_params (tonnage, shot_weight_kg, cycle_time_sec, machine_rate, mold_cavities) VALUES
( 160, 0.50, 15.00, 120.00, 2),
( 200, 0.80, 18.00, 140.00, 2),
( 280, 1.20, 22.00, 180.00, 1),
( 350, 1.80, 26.00, 220.00, 1),
( 400, 2.50, 30.00, 260.00, 1),
( 500, 3.20, 36.00, 320.00, 1),
( 630, 4.00, 42.00, 380.00, 1),
( 800, 6.50, 55.00, 520.00, 1),
(1000, 8.50, 65.00, 650.00, 1)
ON CONFLICT (tonnage) DO NOTHING;
-- 机加工节拍表(26 条全规格谱系;故意不含 Φ25钻/M18攻 用于回退测试)
INSERT INTO machining_cycle (operation_type, spec, cycle_time_sec, tool_rate, notes) VALUES
('drill', 'Φ3', 2.00, 0.10, '通孔'),
('drill', 'Φ4', 2.20, 0.12, '通孔'),
('drill', 'Φ5', 2.50, 0.13, '通孔'),
('drill', 'Φ6', 3.00, 0.15, '通孔'),
('drill', 'Φ8', 4.00, 0.20, '通孔'),
('drill', 'Φ10', 5.00, 0.25, '通孔'),
('drill', 'Φ12', 6.00, 0.30, '通孔'),
('drill', 'Φ14', 7.00, 0.35, '通孔'),
('drill', 'Φ16', 8.00, 0.40, '通孔'),
('drill', 'Φ20', 10.00, 0.50, '通孔'),
('drill', 'Φ24', 12.00, 0.60, '通孔'),
('tap', 'M4×0.7', 3.00, 0.15, '盲孔'),
('tap', 'M5×0.8', 3.50, 0.18, '盲孔'),
('tap', 'M6×1.0', 4.00, 0.20, '盲孔'),
('tap', 'M8×1.25', 5.00, 0.25, '盲孔'),
('tap', 'M10×1.5', 6.00, 0.30, '盲孔'),
('tap', 'M12×1.75', 7.00, 0.35, '盲孔'),
('tap', 'M14×2.0', 8.00, 0.40, '盲孔'),
('tap', 'M16×2.0', 9.00, 0.45, '盲孔'),
('ream', 'Φ6H7', 5.00, 0.45, '铰孔'),
('ream', 'Φ8H7', 6.00, 0.50, '铰孔'),
('ream', 'Φ10H7', 7.00, 0.60, '铰孔'),
('ream', 'Φ12H7', 8.00, 0.70, '铰孔'),
('ream', 'Φ16H7', 10.00, 0.90, '铰孔'),
('ream', 'Φ20H7', 12.00, 1.10, '铰孔'),
('mill', 'face', 12.00, 0.80, '铣面(单面)')
ON CONFLICT (operation_type, spec) DO NOTHING;
-- 后处理费率表(10 种;故意不含"镀铬"用于回退测试)
INSERT INTO post_process_rate (process_type, unit, rate) VALUES
('喷砂', 'kg', 1.50),
('钝化', 'kg', 2.00),
('阳极氧化', 'kg', 5.00),
('电泳涂装', 'kg', 3.50),
('喷涂', 'kg', 2.50),
('粉末喷涂', 'kg', 3.00),
('磷化', 'kg', 1.80),
('达克罗', 'kg', 4.00),
('硬质阳极氧化', 'kg', 8.00),
('化学镀镍', 'kg', 9.00)
ON CONFLICT (process_type) DO NOTHING;
-- O2 机加工费率表(按材质族)
INSERT INTO machining_rate (grade_group, rate_per_hour, notes) VALUES
('铝合金', 60.00, '铝合金常规机加工费率'),
('铸铝', 60.00, '铸铝同铝合金费率'),
('铸铁', 75.00, '灰铸铁刀具损耗高,费率上浮'),
('球墨铸铁', 80.00, '球铁强度高,机加工费率最高')
ON CONFLICT (grade_group) DO NOTHING;
-- O1 材料价格历史表(2025-01 ~ 2026-08 共 20 个月 × 13 牌号,最新月系数=1.00 与对照表价格一致)
WITH factors(price_date, al_factor, ir_factor) AS (VALUES
('2025-01-01'::date, 0.92, 0.95), ('2025-02-01'::date, 0.93, 0.96),
('2025-03-01'::date, 0.95, 0.96), ('2025-04-01'::date, 0.94, 0.97),
('2025-05-01'::date, 0.96, 0.98), ('2025-06-01'::date, 0.98, 0.99),
('2025-07-01'::date, 0.97, 0.98), ('2025-08-01'::date, 0.99, 1.00),
('2025-09-01'::date, 1.01, 1.01), ('2025-10-01'::date, 1.00, 1.00),
('2025-11-01'::date, 0.98, 0.99), ('2025-12-01'::date, 0.97, 0.98),
('2026-01-01'::date, 0.99, 0.99), ('2026-02-01'::date, 1.02, 1.00),
('2026-03-01'::date, 1.01, 1.01), ('2026-04-01'::date, 1.00, 1.00),
('2026-05-01'::date, 0.99, 0.99), ('2026-06-01'::date, 1.01, 1.00),
('2026-07-01'::date, 1.00, 1.00), ('2026-08-01'::date, 1.00, 1.00)
)
INSERT INTO material_price_history (internal_code, price_date, price_per_kg, source)
SELECT m.internal_code, f.price_date,
ROUND(m.price_per_kg * CASE WHEN m.grade_group IN ('铸铁', '球墨铸铁') THEN f.ir_factor ELSE f.al_factor END, 2),
'市场参考价'
FROM material_grade_mapping m CROSS JOIN factors f
ON CONFLICT (internal_code, price_date) DO NOTHING;