From 8683ef126b06a0c48901bbe4fef739acd5cfb5a4 Mon Sep 17 00:00:00 2001 From: Agent Date: Tue, 24 Mar 2026 14:07:24 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0SQL=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=96=87=E4=BB=B6=E5=92=8C=E8=87=AA=E5=8A=A8=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E5=A4=84=E7=90=86=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/init.sql | 149 ++++++++++++++++++ .../config/MybatisPlusMetaObjectHandler.java | 25 +++ 2 files changed, 174 insertions(+) create mode 100644 sql/init.sql create mode 100644 src/main/java/com/example/building/config/MybatisPlusMetaObjectHandler.java diff --git a/sql/init.sql b/sql/init.sql new file mode 100644 index 0000000..f274047 --- /dev/null +++ b/sql/init.sql @@ -0,0 +1,149 @@ +-- 建材销售管家数据库表结构 +-- 创建数据库: create database building_materials; + +-- 用户表 +CREATE TABLE users ( + user_id VARCHAR(36) PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + phone VARCHAR(20), + password VARCHAR(255) NOT NULL, + wechat_openid VARCHAR(128), + wechat_unionid VARCHAR(128), + alipay_openid VARCHAR(128), + role VARCHAR(20) NOT NULL DEFAULT 'sales', -- admin, sales, customer + status INTEGER NOT NULL DEFAULT 1, -- 0:禁用, 1:启用 + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- 客户表 +CREATE TABLE customers ( + customer_id VARCHAR(36) PRIMARY KEY, + name VARCHAR(100) NOT NULL, + phone VARCHAR(20), + wechat_openid VARCHAR(128), + wechat_nickname VARCHAR(100), + wechat_avatar VARCHAR(500), + address VARCHAR(500), + remark TEXT, + total_amount DECIMAL(12,2) DEFAULT 0, + created_by VARCHAR(36), + last_login_at TIMESTAMP, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- 商品分类表 +CREATE TABLE categories ( + category_id VARCHAR(36) PRIMARY KEY, + name VARCHAR(50) NOT NULL, + parent_id VARCHAR(36), + sort_order INTEGER DEFAULT 0, + icon VARCHAR(255), + status INTEGER DEFAULT 1, -- 0:禁用, 1:启用 + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- 商品表 +CREATE TABLE products ( + product_id VARCHAR(36) PRIMARY KEY, + category_id VARCHAR(36), + name VARCHAR(100) NOT NULL, + spec VARCHAR(100), + unit VARCHAR(20) DEFAULT '个', + price DECIMAL(10,2) NOT NULL, + cost_price DECIMAL(10,2), + image_url VARCHAR(500), + barcode VARCHAR(50), + stock_alert INTEGER DEFAULT 10, + description TEXT, + status INTEGER DEFAULT 1, -- 0:下架, 1:上架 + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (category_id) REFERENCES categories(category_id) +); + +-- 订单表 +CREATE TABLE orders ( + order_id VARCHAR(36) PRIMARY KEY, + order_no VARCHAR(32) NOT NULL UNIQUE, + customer_id VARCHAR(36), + customer_name VARCHAR(100), + customer_phone VARCHAR(20), + customer_wechat VARCHAR(128), + total_amount DECIMAL(12,2) NOT NULL, -- 原价 + discount_amount DECIMAL(12,2) DEFAULT 0, -- 优惠金额 + actual_amount DECIMAL(12,2) NOT NULL, -- 实付金额 + discount_rate DECIMAL(5,2) DEFAULT 100, -- 折扣率 + status INTEGER NOT NULL DEFAULT 1, -- 1:已完成, 2:待付款, 3:已取消 + payment_method VARCHAR(20), -- cash, wechat, alipay + remark TEXT, + operator_id VARCHAR(36), + operator_name VARCHAR(50), + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (customer_id) REFERENCES customers(customer_id) +); + +-- 订单明细表 +CREATE TABLE order_items ( + item_id VARCHAR(36) PRIMARY KEY, + order_id VARCHAR(36) NOT NULL, + product_id VARCHAR(36) NOT NULL, + product_name VARCHAR(100), + product_spec VARCHAR(100), + unit VARCHAR(20), + price DECIMAL(10,2) NOT NULL, + quantity INTEGER NOT NULL, + subtotal DECIMAL(12,2) NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (order_id) REFERENCES orders(order_id), + FOREIGN KEY (product_id) REFERENCES products(product_id) +); + +-- 库存表 +CREATE TABLE stock ( + stock_id VARCHAR(36) PRIMARY KEY, + product_id VARCHAR(36) NOT NULL UNIQUE, + warehouse_id VARCHAR(36), + quantity INTEGER NOT NULL DEFAULT 0, + locked_quantity INTEGER DEFAULT 0, -- 锁定数量(待发货) + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (product_id) REFERENCES products(product_id) +); + +-- 库存流水表 +CREATE TABLE stock_flow ( + flow_id VARCHAR(36) PRIMARY KEY, + product_id VARCHAR(36) NOT NULL, + type INTEGER NOT NULL, -- 1:入库, 2:出库, 3:调整 + quantity INTEGER NOT NULL, + before_quantity INTEGER, + after_quantity INTEGER, + related_id VARCHAR(36), -- 关联单据ID + related_type VARCHAR(20), -- order, manual + operator_id VARCHAR(36), + remark TEXT, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (product_id) REFERENCES products(product_id) +); + +-- 系统配置表 +CREATE TABLE system_config ( + config_id VARCHAR(36) PRIMARY KEY, + config_key VARCHAR(50) NOT NULL UNIQUE, + config_value TEXT, + remark VARCHAR(200), + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- 初始化管理员账号 (密码: admin123) +INSERT INTO users (user_id, username, phone, password, role, status) +VALUES ('admin-001', 'admin', '13800138000', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', 'admin', 1); + +-- 初始化系统配置 +INSERT INTO system_config (config_id, config_key, config_value, remark) VALUES +('config-001', 'order_view_days', '180', '顾客可查看订单天数'), +('config-002', 'default_discount_rate', '100', '默认折扣率'); diff --git a/src/main/java/com/example/building/config/MybatisPlusMetaObjectHandler.java b/src/main/java/com/example/building/config/MybatisPlusMetaObjectHandler.java new file mode 100644 index 0000000..e08dfb1 --- /dev/null +++ b/src/main/java/com/example/building/config/MybatisPlusMetaObjectHandler.java @@ -0,0 +1,25 @@ +package com.example.building.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * MyBatis Plus 自动填充处理器 + */ +@Component +public class MybatisPlusMetaObjectHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + this.strictInsertFill(metaObject, "createdAt", LocalDateTime.class, LocalDateTime.now()); + this.strictInsertFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now()); + } + + @Override + public void updateFill(MetaObject metaObject) { + this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now()); + } +}