p-honggang.li
2025-09-03 703ca1c4ac199d13f0345bb913c320845f77f2ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
-- 交易模块数据库表创建脚本 (PostgreSQL 版本)
-- 创建时间: 2024-08-07
 
-- 创建顺序调整: 先创建基础表 (unit, users, product),再创建依赖它们的表
 
-- 15. 单位表 (unit)
CREATE TABLE unit (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    unit_name TEXT NOT NULL,
    unit_code TEXT UNIQUE,
    unit_type TEXT,
    industry TEXT,
    address TEXT,
    contact_person TEXT,
    contact_phone TEXT,
    contact_email TEXT,
    business_license TEXT,
    legal_person TEXT,
    registered_capital NUMERIC(15,2),
    establishment_date DATE,
    status TEXT DEFAULT '正常' CHECK (status IN ('正常', '冻结', '注销')),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE unit IS '单位表';
 
-- 14. 用户表 (users) - 避免关键字冲突
CREATE TABLE users (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    username TEXT NOT NULL UNIQUE,
    real_name TEXT,
    email TEXT,
    phone TEXT,
    avatar TEXT,
    user_type TEXT DEFAULT '个人用户' CHECK (user_type IN ('个人用户', '单位用户')),
    unit_id BIGINT REFERENCES unit(id),
    unit_name TEXT,
    status TEXT DEFAULT '正常' CHECK (status IN ('正常', '冻结', '注销')),
    last_login_time TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE users IS '用户表';
 
-- 13. 产品表 (product)
CREATE TABLE product (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    product_name TEXT NOT NULL,
    product_code TEXT NOT NULL UNIQUE,
    product_type TEXT,
    category TEXT,
    description TEXT,
    provider_id BIGINT NOT NULL REFERENCES users(id),
    provider_name TEXT NOT NULL,
    provider_type TEXT CHECK (provider_type IN ('企业', '个人')),
    status TEXT DEFAULT '上架' CHECK (status IN ('上架', '下架', '审核中', '已下架')),
    audit_status TEXT DEFAULT '待审核' CHECK (audit_status IN ('待审核', '审核通过', '审核驳回')),
    tags TEXT,
    cover_image TEXT,
    demo_url TEXT,
    doc_url TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    created_by BIGINT REFERENCES users(id),
    updated_by BIGINT REFERENCES users(id),
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE product IS '产品表';
 
-- 1. 产品定价表 (product_pricing)
CREATE TABLE product_pricing (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    suite_name TEXT NOT NULL,
    sales_form TEXT NOT NULL CHECK (sales_form IN ('买断', '租赁', '私有增包量', '公有增包量', 'OTA服务', '资源包', '个人')),
    customer_type TEXT NOT NULL CHECK (customer_type IN ('企业', '个人', '项目部')),
    account_limit TEXT DEFAULT '不限',
    concurrent_nodes TEXT DEFAULT '不限',
    price_type TEXT NOT NULL CHECK (price_type IN ('积分', '协议', '货币', '免费')),
    price_unit TEXT NOT NULL CHECK (price_unit IN ('套', '套/年', '年', '个', '次')),
    price NUMERIC(15,2) NOT NULL,
    is_active BOOLEAN DEFAULT TRUE,
    product_id BIGINT NOT NULL REFERENCES product(id),
    product_name TEXT,
    provider_id BIGINT REFERENCES users(id),
    provider_name TEXT,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    created_by BIGINT REFERENCES users(id),
    updated_by BIGINT REFERENCES users(id),
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE product_pricing IS '产品定价表';
 
-- 积分表 (points) - 需在积分规则前创建
-- 积分表 (points) - 主表
CREATE TABLE points (
                        id BIGSERIAL PRIMARY KEY,
                        points_name TEXT NOT NULL,
                        effective_start DATE NOT NULL,
                        modifier_id BIGINT NOT NULL,
                        modifier_name TEXT NOT NULL,
                        version TEXT NOT NULL,
                        description TEXT,
                        status TEXT DEFAULT '启用',
                        created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                        updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                        deleted SMALLINT DEFAULT 0
);
 
COMMENT ON TABLE points IS '积分主表';
COMMENT ON COLUMN points.points_name IS '积分名称';
COMMENT ON COLUMN points.effective_start IS '生效开始时间';
COMMENT ON COLUMN points.modifier_id IS '修改人ID';
COMMENT ON COLUMN points.modifier_name IS '修改人姓名';
COMMENT ON COLUMN points.version IS '版本号';
COMMENT ON COLUMN points.description IS '积分描述';
COMMENT ON COLUMN points.status IS '状态';
COMMENT ON COLUMN points.created_at IS '创建时间';
COMMENT ON COLUMN points.updated_at IS '更新时间';
COMMENT ON COLUMN points.deleted IS '逻辑删除';
ALTER TABLE points ADD CONSTRAINT chk_status CHECK (status IN ('启用', '禁用'));
ALTER TABLE points ADD CONSTRAINT chk_deleted CHECK (deleted IN (0,1));
 
-- 积分规则表 (points_rule)
CREATE TABLE points_rule (
                             id BIGSERIAL PRIMARY KEY,
                             points_id BIGINT NOT NULL,
                             rule_type TEXT NOT NULL,
                             category TEXT NOT NULL,
                             rule_name TEXT NOT NULL,
                             rule_description TEXT,
                             status TEXT DEFAULT '启用',
                             created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                             updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                             deleted SMALLINT DEFAULT 0
);
 
COMMENT ON TABLE points_rule IS '积分规则表';
COMMENT ON COLUMN points_rule.points_id IS '关联积分ID';
COMMENT ON COLUMN points_rule.rule_type IS '积分规则类型';
COMMENT ON COLUMN points_rule.category IS '积分类别';
COMMENT ON COLUMN points_rule.rule_name IS '规则名称';
COMMENT ON COLUMN points_rule.rule_description IS '规则描述';
COMMENT ON COLUMN points_rule.status IS '规则状态';
COMMENT ON COLUMN points_rule.created_at IS '创建时间';
COMMENT ON COLUMN points_rule.updated_at IS '更新时间';
COMMENT ON COLUMN points_rule.deleted IS '逻辑删除';
ALTER TABLE points_rule ADD CONSTRAINT fk_points FOREIGN KEY (points_id) REFERENCES points(id);
ALTER TABLE points_rule ADD CONSTRAINT chk_rule_type CHECK (rule_type IN ('获取', '消耗'));
ALTER TABLE points_rule ADD CONSTRAINT chk_category CHECK (category IN ('资源贡献', '资源传播', '资源交易', '交流社区互动'));
ALTER TABLE points_rule ADD CONSTRAINT chk_rule_status CHECK (status IN ('启用', '禁用'));
ALTER TABLE points_rule ADD CONSTRAINT chk_rule_deleted CHECK (deleted IN (0,1));
 
-- 积分规则详情表 (points_rule_detail)
CREATE TABLE points_rule_detail (
                                    id BIGSERIAL PRIMARY KEY,
                                    rule_id BIGINT NOT NULL,
                                    points_id BIGINT NOT NULL,
                                    points_value INTEGER NOT NULL,
                                    daily_limit INTEGER,
                                    monthly_limit INTEGER,
                                    yearly_limit INTEGER,
                                    min_value INTEGER DEFAULT 0,
                                    max_value INTEGER,
                                    conversion_rate NUMERIC(10,4) DEFAULT 1.0,
                                    effective_start DATE,
                                    effective_end DATE,
                                    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                                    updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                                    deleted SMALLINT DEFAULT 0
);
 
COMMENT ON TABLE points_rule_detail IS '积分规则详情表';
COMMENT ON COLUMN points_rule_detail.rule_id IS '关联积分规则ID';
COMMENT ON COLUMN points_rule_detail.points_id IS '关联积分ID';
COMMENT ON COLUMN points_rule_detail.points_value IS '积分值';
COMMENT ON COLUMN points_rule_detail.daily_limit IS '每日积分上限值';
COMMENT ON COLUMN points_rule_detail.monthly_limit IS '每月积分上限值';
COMMENT ON COLUMN points_rule_detail.yearly_limit IS '每年积分上限值';
COMMENT ON COLUMN points_rule_detail.min_value IS '最小值';
COMMENT ON COLUMN points_rule_detail.max_value IS '最大值';
COMMENT ON COLUMN points_rule_detail.conversion_rate IS '转换比率';
COMMENT ON COLUMN points_rule_detail.effective_start IS '生效开始时间';
COMMENT ON COLUMN points_rule_detail.effective_end IS '生效结束时间';
COMMENT ON COLUMN points_rule_detail.created_at IS '创建时间';
COMMENT ON COLUMN points_rule_detail.updated_at IS '更新时间';
COMMENT ON COLUMN points_rule_detail.deleted IS '逻辑删除';
ALTER TABLE points_rule_detail ADD CONSTRAINT fk_rule FOREIGN KEY (rule_id) REFERENCES points_rule(id);
ALTER TABLE points_rule_detail ADD CONSTRAINT fk_detail_points FOREIGN KEY (points_id) REFERENCES points(id);
ALTER TABLE points_rule_detail ADD CONSTRAINT chk_detail_deleted CHECK (deleted IN (0,1));
 
-- 积分流水表 (points_transaction)
CREATE TABLE points_transaction (
                                    id BIGSERIAL PRIMARY KEY,
                                    data_category TEXT NOT NULL,
                                    transaction_name TEXT NOT NULL,
                                    transaction_time TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                                    points_change INTEGER NOT NULL,
                                    rule_type TEXT NOT NULL,
                                    user_id BIGINT,
                                    unit_id BIGINT,
                                    user_type TEXT NOT NULL,
                                    rule_id BIGINT,
                                    detail_id BIGINT,
                                    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                                    deleted SMALLINT DEFAULT 0
);
 
COMMENT ON TABLE points_transaction IS '积分流水表';
COMMENT ON COLUMN points_transaction.data_category IS '数据类目';
COMMENT ON COLUMN points_transaction.transaction_name IS '名称';
COMMENT ON COLUMN points_transaction.transaction_time IS '时间';
COMMENT ON COLUMN points_transaction.points_change IS '积分变动值';
COMMENT ON COLUMN points_transaction.rule_type IS '积分规则类型';
COMMENT ON COLUMN points_transaction.user_id IS '用户ID';
COMMENT ON COLUMN points_transaction.unit_id IS '企业ID';
COMMENT ON COLUMN points_transaction.user_type IS '用户类型';
COMMENT ON COLUMN points_transaction.rule_id IS '关联规则ID';
COMMENT ON COLUMN points_transaction.detail_id IS '关联规则详情ID';
COMMENT ON COLUMN points_transaction.created_at IS '创建时间';
COMMENT ON COLUMN points_transaction.deleted IS '逻辑删除';
ALTER TABLE points_transaction ADD CONSTRAINT chk_data_category CHECK (data_category IN ('用户参与', '其他'));
ALTER TABLE points_transaction ADD CONSTRAINT chk_trans_rule_type CHECK (rule_type IN ('获取', '消耗'));
ALTER TABLE points_transaction ADD CONSTRAINT chk_user_type CHECK (user_type IN ('单位用户', '个人用户'));
ALTER TABLE points_transaction ADD CONSTRAINT fk_rule_id FOREIGN KEY (rule_id) REFERENCES points_rule(id);
ALTER TABLE points_transaction ADD CONSTRAINT fk_detail_id FOREIGN KEY (detail_id) REFERENCES points_rule_detail(id);
ALTER TABLE points_transaction ADD CONSTRAINT chk_trans_deleted CHECK (deleted IN (0,1));
 
-- 积分账户表 (points_account)
CREATE TABLE points_account (
                                id BIGSERIAL PRIMARY KEY,
                                user_id BIGINT NOT NULL,
                                points_balance INTEGER NOT NULL DEFAULT 0,
                                total_earned INTEGER NOT NULL DEFAULT 0,
                                total_consumed INTEGER NOT NULL DEFAULT 0,
                                account_type TEXT NOT NULL,
                                account_status TEXT DEFAULT '正常',
                                last_transaction_time TIMESTAMPTZ,
                                created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                                updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
                                deleted SMALLINT DEFAULT 0
);
 
COMMENT ON TABLE points_account IS '积分账户表';
COMMENT ON COLUMN points_account.user_id IS '用户ID';
COMMENT ON COLUMN points_account.points_balance IS '积分余额';
COMMENT ON COLUMN points_account.total_earned IS '累计获取积分';
COMMENT ON COLUMN points_account.total_consumed IS '累计消耗积分';
COMMENT ON COLUMN points_account.account_type IS '账户类型';
COMMENT ON COLUMN points_account.account_status IS '账户状态';
COMMENT ON COLUMN points_account.last_transaction_time IS '最后交易时间';
COMMENT ON COLUMN points_account.created_at IS '创建时间';
COMMENT ON COLUMN points_account.updated_at IS '更新时间';
COMMENT ON COLUMN points_account.deleted IS '逻辑删除';
ALTER TABLE points_account ADD CONSTRAINT chk_account_type CHECK (account_type IN ('个人积分', '单位积分'));
ALTER TABLE points_account ADD CONSTRAINT chk_account_status CHECK (account_status IN ('正常', '冻结', '注销'));
ALTER TABLE points_account ADD CONSTRAINT chk_account_deleted CHECK (deleted IN (0,1));
 
-- 创建索引
CREATE INDEX idx_points_rule_points ON points_rule(points_id);
CREATE INDEX idx_points_rule_type ON points_rule(rule_type);
CREATE INDEX idx_points_detail_rule ON points_rule_detail(rule_id);
CREATE INDEX idx_transaction_user ON points_transaction(user_id);
CREATE INDEX idx_transaction_time ON points_transaction(transaction_time);
CREATE INDEX idx_account_user ON points_account(user_id);
 
-- 2. 购物车表 (shopping_cart)
-- CREATE TABLE shopping_cart (
--     id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
--     user_id BIGINT NOT NULL REFERENCES users(id),
--     unit_id BIGINT REFERENCES unit(id),
--     suite_name TEXT NOT NULL,
--     sales_form TEXT NOT NULL CHECK (sales_form IN ('买断', '租赁', '私有增包量', '公有增包量', 'OTA服务', '资源包', '个人')),
--     customer_type TEXT NOT NULL CHECK (customer_type IN ('企业', '个人', '项目部')),
--     account_limit TEXT DEFAULT '不限',
--     concurrent_nodes TEXT DEFAULT '不限',
--     price_type TEXT NOT NULL CHECK (price_type IN ('积分', '协议', '货币', '免费')),
--     price_unit TEXT NOT NULL CHECK (price_unit IN ('套', '套/年', '年', '个', '次')),
--     unit_price NUMERIC(15,2) NOT NULL,
--     quantity INTEGER NOT NULL DEFAULT 1,
--     duration INTEGER,
--     product_id BIGINT NOT NULL REFERENCES product(id),
--     product_name TEXT,
--     provider_id BIGINT REFERENCES users(id),
--     provider_name TEXT,
--     total_amount NUMERIC(15,2),
--     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
--     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
--     deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
-- );
--
-- COMMENT ON TABLE shopping_cart IS '购物车表';
 
-- 购物车表 (cart)
CREATE TABLE cart (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    user_id BIGINT NOT NULL REFERENCES users(id),
    unit_id BIGINT NOT NULL REFERENCES unit(id),
    pricing_id BIGINT NOT NULL REFERENCES product_pricing(id),
    product_id BIGINT NOT NULL REFERENCES product(id),
    product_name TEXT,
    suite_name TEXT,
    sales_form TEXT,
    customer_type TEXT,
    account_limit TEXT,
    concurrent_nodes TEXT,
    price_type TEXT,
    price_unit TEXT,
    unit_price DECIMAL(15,2) NOT NULL,
    quantity INTEGER NOT NULL DEFAULT 1,
    duration INTEGER,
    total_price DECIMAL(15,2),
    provider_id BIGINT REFERENCES users(id),
    provider_name TEXT,
    remarks TEXT,
    add_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1)),
    UNIQUE (user_id, unit_id, pricing_id, deleted)
);
 
COMMENT ON TABLE cart IS '购物车表';
 
-- 3. 订单表 (order_info)
CREATE TABLE order_info (
    order_id TEXT PRIMARY KEY,
    product_id BIGINT NOT NULL REFERENCES product(id),
    user_id BIGINT NOT NULL REFERENCES users(id),
    unit_id BIGINT REFERENCES unit(id),
    product_name TEXT NOT NULL,
    provider_name TEXT NOT NULL,
    provider_id BIGINT NOT NULL REFERENCES users(id),
    apply_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    order_status TEXT NOT NULL DEFAULT '待审批' CHECK (order_status IN ('待审批', '待审批授权', '待授权', '待上传文件', '待交易确认', '已完成', '已取消', '已驳回')),
    total_amount NUMERIC(15,2) NOT NULL,
    payment_type TEXT CHECK (payment_type IN ('积分', '货币', '协议')),
    payment_status TEXT DEFAULT '未支付' CHECK (payment_status IN ('未支付', '已支付', '支付失败', '已退款')),
    workflow_id TEXT,
    current_step TEXT,
    approval_flow TEXT,
    buyer_remarks TEXT,
    seller_remarks TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE order_info IS '订单表';
 
-- 4. 订单详情表 (order_detail)
CREATE TABLE order_detail (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    order_id TEXT NOT NULL REFERENCES order_info(order_id),
    pricing_id BIGINT NOT NULL REFERENCES product_pricing(id),
    product_id BIGINT NOT NULL REFERENCES product(id),
    suite_name TEXT NOT NULL,
    sales_form TEXT NOT NULL,
    customer_type TEXT NOT NULL,
    account_limit TEXT,
    concurrent_nodes TEXT,
    price_type TEXT NOT NULL,
    price_unit TEXT NOT NULL,
    unit_price NUMERIC(15,2) NOT NULL,
    quantity INTEGER NOT NULL,
    duration INTEGER,
    total_price NUMERIC(15,2) NOT NULL,
    provider_id BIGINT NOT NULL REFERENCES users(id),
    provider_name TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    remarks TEXT,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE order_detail IS '订单详情表';
 
-- 5. 订单附件表 (order_attachment)
CREATE TABLE order_attachment (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    order_id TEXT NOT NULL REFERENCES order_info(order_id),
    file_name TEXT NOT NULL,
    original_name TEXT,
    file_type TEXT NOT NULL,
    file_size BIGINT NOT NULL,
    file_url TEXT NOT NULL,
    file_path TEXT,
    bucket_name TEXT,
    object_name TEXT,
    upload_user_id BIGINT REFERENCES users(id),
    upload_user_name TEXT,
    attachment_type TEXT CHECK (attachment_type IN ('合同', '发票', '其他')),
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE order_attachment IS '订单附件表';
 
-- 6. 订单审核表 (order_approval)
CREATE TABLE order_approval (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    order_id TEXT NOT NULL REFERENCES order_info(order_id),
    approval_step TEXT NOT NULL,
    approval_type TEXT NOT NULL CHECK (approval_type IN ('审批', '授权')),
    approval_opinion TEXT,
    approval_result TEXT NOT NULL CHECK (approval_result IN ('通过', '驳回', '待处理')),
    approver_id BIGINT NOT NULL REFERENCES users(id),
    approver_name TEXT NOT NULL,
    approver_role TEXT,
    approval_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    next_approver_id BIGINT REFERENCES users(id),
    next_approver_name TEXT,
    workflow_status TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE order_approval IS '订单审核表';
 
-- 7. 订单评价表 (order_evaluation)
CREATE TABLE order_evaluation (
    id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    order_id TEXT NOT NULL REFERENCES order_info(order_id),
    evaluator_id BIGINT NOT NULL REFERENCES users(id),
    evaluator_name TEXT NOT NULL,
    evaluator_type TEXT NOT NULL CHECK (evaluator_type IN ('买家', '卖家')),
    content TEXT NOT NULL,
    rating INTEGER NOT NULL CHECK (rating >= 1 AND rating <= 5),
    service_rating INTEGER CHECK (service_rating >= 1 AND service_rating <= 5),
    quality_rating INTEGER CHECK (quality_rating >= 1 AND quality_rating <= 5),
    delivery_rating INTEGER CHECK (delivery_rating >= 1 AND delivery_rating <= 5),
    is_anonymous BOOLEAN DEFAULT FALSE,
    reply_content TEXT,
    reply_user_id BIGINT REFERENCES users(id),
    reply_time TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted INTEGER DEFAULT 0 CHECK (deleted IN (0,1))
);
 
COMMENT ON TABLE order_evaluation IS '订单评价表';
 
-- 创建索引 (PostgreSQL 语法)
CREATE INDEX idx_product_pricing_product_id ON product_pricing(product_id);
CREATE INDEX idx_product_pricing_status ON product_pricing(is_active);
CREATE INDEX idx_order_info_user_id ON order_info(user_id);
CREATE INDEX idx_order_info_provider_id ON order_info(provider_id);
CREATE INDEX idx_order_info_status ON order_info(order_status);
CREATE INDEX idx_order_info_apply_time ON order_info(apply_time);
CREATE INDEX idx_order_detail_order_id ON order_detail(order_id);
CREATE INDEX idx_order_attachment_order_id ON order_attachment(order_id);
CREATE INDEX idx_order_approval_order_id ON order_approval(order_id);
CREATE INDEX idx_order_approval_approver_id ON order_approval(approver_id);
CREATE INDEX idx_order_evaluation_order_id ON order_evaluation(order_id);
CREATE INDEX idx_order_evaluation_evaluator_id ON order_evaluation(evaluator_id);
CREATE INDEX idx_points_rule_points_id ON points_rule(points_id);
CREATE INDEX idx_points_rule_detail_rule_id ON points_rule_detail(rule_id);
CREATE INDEX idx_product_provider_id ON product(provider_id);
CREATE INDEX idx_product_status ON product(status);
CREATE INDEX idx_users_unit_id ON users(unit_id);
CREATE INDEX idx_users_status ON users(status);
 
-- 购物车表索引
CREATE INDEX idx_cart_user_unit ON cart(user_id, unit_id, deleted);
CREATE INDEX idx_cart_pricing ON cart(pricing_id, deleted);
CREATE INDEX idx_cart_product ON cart(product_id, deleted);
CREATE INDEX idx_cart_provider ON cart(provider_id, deleted);
CREATE INDEX idx_cart_add_time ON cart(add_time, deleted);
 
-- 添加列注释 (PostgreSQL 方式)
COMMENT ON COLUMN product_pricing.suite_name IS '产品套件名称';
COMMENT ON COLUMN product_pricing.sales_form IS '销售形式';
-- 其他列注释按相同格式补充...
 
 
INSERT INTO unit (unit_name, unit_code, unit_type, industry, status) VALUES
('测试企业', 'TEST_ENTERPRISE', '企业', '信息技术', '正常'),
('测试单位', 'TEST_UNIT', '事业单位', '教育', '正常');
 
INSERT INTO users (username, real_name, user_type, unit_id, status) VALUES
('admin', '系统管理员', '个人用户', NULL, '正常'),
('test_user', '测试用户', '个人用户', 1, '正常'),
('test_provider', '测试提供者', '单位用户', 1, '正常');
 
INSERT INTO product (product_name, product_code, product_type, category, description, provider_id, provider_name, status, audit_status) VALUES
('测试产品1', 'TEST_PRODUCT_001', '软件产品', '企业管理', '这是一个测试产品', 3, '测试提供者', '上架', '审核通过'),
('测试产品2', 'TEST_PRODUCT_002', '服务产品', '技术服务', '这是另一个测试产品', 3, '测试提供者', '上架', '审核通过');
 
INSERT INTO product_pricing (suite_name, sales_form, customer_type, price_type, price_unit, price, product_id, product_name, provider_id, provider_name, is_active) VALUES
('基础版', '买断', '企业', '积分', '套', 1000, 1, '测试产品1', 3, '测试提供者', true),
('专业版', '租赁', '企业', '积分', '套/年', 500, 1, '测试产品1', 3, '测试提供者', true),
('企业版', '买断', '企业', '货币', '套', 10000, 2, '测试产品2', 3, '测试提供者', true);