From 39fe1da800aa41f8e545f50ed8d1c2339597d515 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Tue, 7 Apr 2026 23:02:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(db):=20=E5=B0=86=E7=A7=8D=E5=AD=90?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=94=B9=E4=B8=BA=20SQL=20=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 backend/seeds/H001.sql,通过 sh scripts/dev.sh seed H001 经由 docker exec 执行,无需本地 mysql 客户端。 Co-Authored-By: Claude Sonnet 4.6 --- backend/seeds/H001.sql | 252 +++++++++++++++++++++++++++++++++++++++++ scripts/dev.sh | 77 ++++++++++--- 2 files changed, 313 insertions(+), 16 deletions(-) create mode 100644 backend/seeds/H001.sql diff --git a/backend/seeds/H001.sql b/backend/seeds/H001.sql new file mode 100644 index 0000000..24d3be4 --- /dev/null +++ b/backend/seeds/H001.sql @@ -0,0 +1,252 @@ +-- ============================================================= +-- 测试门店 H001 种子数据 +-- 用法: sh scripts/dev.sh seed H001 +-- 前置条件: 数据库表结构已创建(启动一次后端即可) +-- 说明: 每次执行会清空并重新写入所有业务数据 +-- ============================================================= + +SET FOREIGN_KEY_CHECKS = 0; + +-- ── 清空(子表先清)──────────────────────────────────────── +TRUNCATE TABLE inventory_check_items; +TRUNCATE TABLE inventory_checks; +TRUNCATE TABLE inventory_logs; +TRUNCATE TABLE inventories; +TRUNCATE TABLE stock_out_items; +TRUNCATE TABLE stock_out_orders; +TRUNCATE TABLE stock_in_items; +TRUNCATE TABLE stock_in_orders; +TRUNCATE TABLE finance_records; +TRUNCATE TABLE number_rules; +TRUNCATE TABLE partners; +TRUNCATE TABLE warehouses; +TRUNCATE TABLE products; +TRUNCATE TABLE product_categories; +TRUNCATE TABLE users; +TRUNCATE TABLE shops; + +SET FOREIGN_KEY_CHECKS = 1; + +-- ── 门店 ──────────────────────────────────────────────────── +-- id=1 +INSERT INTO shops (id, name, code, address, phone, manager_name, created_at, updated_at) +VALUES (1, '测试酒库门店', 'H001', '北京市朝阳区建国路88号', '010-12345678', '张总', NOW(), NOW()); + +-- ── 用户(密码均为 password123)──────────────────────────── +-- bcrypt(password123, cost=10) +SET @pwd = '$2a$10$BNHhJoKHryCCEyKqM.11TeLOnSCV8rNtOqvKHUqaczETXLtH/YE1m'; + +-- id=1 admin, id=2 operator, id=3 readonly +INSERT INTO users (id, shop_id, username, password_hash, real_name, phone, role, is_active, created_at, updated_at) VALUES +(1, 1, 'admin', @pwd, '张三(管理员)', '13800000001', 'admin', 1, NOW(), NOW()), +(2, 1, 'operator', @pwd, '李四(操作员)', '13800000002', 'operator', 1, NOW(), NOW()), +(3, 1, 'test', @pwd, '王五(只读)', '13800000003', 'readonly', 1, NOW(), NOW()); + +-- ── 仓库 ──────────────────────────────────────────────────── +-- id=1 主仓库, id=2 进口酒专库 +INSERT INTO warehouses (id, shop_id, name, location, is_default, created_at, updated_at) VALUES +(1, 1, '主仓库', 'A栋1层东侧', 1, NOW(), NOW()), +(2, 1, '进口酒专库', 'B栋2层恒温区', 0, NOW(), NOW()); + +-- ── 商品分类 ──────────────────────────────────────────────── +-- id=1 白酒, id=2 进口烈酒 +INSERT INTO product_categories (id, shop_id, name, sort_order, created_at, updated_at) VALUES +(1, 1, '白酒', 1, NOW(), NOW()), +(2, 1, '进口烈酒', 2, NOW(), NOW()); + +-- ── 商品 ──────────────────────────────────────────────────── +-- id=1~6 白酒, id=7~8 进口烈酒 +INSERT INTO products (id, shop_id, code, barcode, name, series, spec, unit, category_id, brand, + purchase_price, sale_price, min_stock, remark, created_at, updated_at) VALUES +(1, 1, 'MT-001', '6901234567890', '飞天茅台 53度 500ml', '茅台', '500ml/瓶', '瓶', 1, '贵州茅台', 2350, 2800, 10, '酱香型白酒,53度,飞天系列', NOW(), NOW()), +(2, 1, 'WLY-001', '6902345678901', '五粮液 52度 500ml', '五粮液', '500ml/瓶', '瓶', 1, '宜宾五粮液', 950, 1200, 6, '浓香型白酒,52度,普五系列', NOW(), NOW()), +(3, 1, 'YH-001', '6903456789012', '洋河梦之蓝 M6 500ml', '洋河', '500ml/瓶', '瓶', 1, '江苏洋河', 560, 680, 6, '浓香型,绵柔苏酒代表', NOW(), NOW()), +(4, 1, 'LZ-001', '6904567890123', '泸州老窖 特曲 500ml', '泸州老窖', '500ml/瓶', '瓶', 1, '泸州老窖', 420, 520, 6, '浓香鼻祖,特曲系列', NOW(), NOW()), +(5, 1, 'JNC-001', '6905678901234', '剑南春 水晶剑 500ml', '剑南春', '500ml/瓶', '瓶', 1, '剑南春', 390, 480, 6, '浓香型,绵竹名酒', NOW(), NOW()), +(6, 1, 'LJ-001', '6906789012345', '郎酒 红花郎10 500ml', '郎酒', '500ml/瓶', '瓶', 1, '古蔺郎酒', 320, 420, 6, '酱香型,赤水河畔酿造', NOW(), NOW()), +(7, 1, 'LF-001', '3760093550058', '拉菲古堡 2018 750ml', '波尔多', '750ml/瓶', '瓶', 2, 'Château Lafite', 3800, 5200, 3, '波尔多一级名庄,2018年份', NOW(), NOW()), +(8, 1, 'RTM-001', '3021691010008', '人头马 VSOP 700ml', '人头马', '700ml/瓶', '瓶', 2, 'Rémy Martin', 480, 680, 3, '法国干邑,VSOP级别', NOW(), NOW()); + +-- ── 往来单位 ──────────────────────────────────────────────── +-- id=1~4 供应商, id=5~7 客户 +INSERT INTO partners (id, shop_id, code, name, type, contact, phone, address, bank_account, + credit_limit, balance, remark, created_at, updated_at) VALUES +(1, 1, 'SUP001', '贵州茅台酒股份有限公司', 'supplier', '张经理', '0851-22222001', '贵州省仁怀市茅台镇', '工商银行仁怀支行 6222 0000 0001 0001', 5000000, 0, '茅台系列直供,账期30天', NOW(), NOW()), +(2, 1, 'SUP002', '四川五粮液股份有限公司', 'supplier', '王总监', '0831-33333001', '四川省宜宾市翠屏区', '建设银行宜宾支行 6227 0000 0001 0002', 3000000, 0, '五粮液系列授权经销', NOW(), NOW()), +(3, 1, 'SUP003', '江苏洋河酒厂股份有限公司', 'supplier', '赵主任', '0527-44444001', '江苏省宿迁市洋河新区', '农业银行宿迁支行 6228 0000 0001 0003', 2000000, 0, '洋河梦之蓝系列直供', NOW(), NOW()), +(4, 1, 'SUP004', '四川郎酒股份有限公司', 'supplier', '刘经理', '0830-55555001', '四川省古蔺县二郎镇', '中国银行古蔺支行 6013 0000 0001 0004', 1500000, 0, '郎酒红花郎系列', NOW(), NOW()), +(5, 1, 'CUS001', '北京君悦大酒店', 'customer', '李采购', '010-65888001', '北京市朝阳区建国门外大街2号', '中信银行北京朝阳支行 6217 0000 0002 0001', 500000, 0, '五星级酒店,月结', NOW(), NOW()), +(6, 1, 'CUS002', '上海外滩华尔道夫酒店', 'customer', '陈主任', '021-62308001', '上海市黄浦区中山东一路2号', '浦发银行上海黄浦支行 6210 0000 0002 0002', 800000, 0, '豪华酒店,按季结算', NOW(), NOW()), +(7, 1, 'CUS003', '广州白天鹅宾馆', 'customer', '吴采购', '020-81886001', '广州市荔湾区沙面南街1号', '招商银行广州荔湾支行 6225 0000 0002 0003', 300000, 0, '高端宾馆,月结30天', NOW(), NOW()); + +-- ── 编号规则 ──────────────────────────────────────────────── +INSERT INTO number_rules (id, shop_id, type, prefix, current_no, date_format, updated_at) VALUES +(1, 1, 'stock_in', 'RK', 5, 'YYYYMMDD', NOW()), +(2, 1, 'stock_out', 'CK', 4, 'YYYYMMDD', NOW()), +(3, 1, 'inventory_check', 'PD', 1, 'YYYYMMDD', NOW()); + +-- ── 入库单 ────────────────────────────────────────────────── +-- #1 已审核: 飞天茅台+五粮液,主仓库,茅台供应商 | 总额=339000 +INSERT INTO stock_in_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + reviewer_id, status, order_date, total_amount, reviewed_at, remark, created_at, updated_at) VALUES +(1, 1, 'RK20260401001', 'purchase', 1, 1, 1, + 1, 'approved', DATE_SUB(CURDATE(), INTERVAL 6 DAY), 339000, + DATE_SUB(NOW(), INTERVAL 5 DAY), '茅台系列首批入库,含飞天茅台及五粮液', NOW(), NOW()); + +INSERT INTO stock_in_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + batch_no, remark, created_at, updated_at) VALUES +(1, 1, 1, 1, 120, 2350, 282000, 'BATCH-MT-2024001', '飞天茅台 2024年第一批次', NOW(), NOW()), +(2, 1, 1, 2, 60, 950, 57000, 'BATCH-WLY-2024001', '五粮液普五 2024年批次', NOW(), NOW()); + +-- #2 已审核: 洋河+泸州+剑南春,主仓库,五粮液供应商 | 总额=51360 +INSERT INTO stock_in_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + reviewer_id, status, order_date, total_amount, reviewed_at, remark, created_at, updated_at) VALUES +(2, 1, 'RK20260403001', 'purchase', 1, 2, 2, + 1, 'approved', DATE_SUB(CURDATE(), INTERVAL 4 DAY), 51360, + DATE_SUB(NOW(), INTERVAL 3 DAY), '浓香型白酒补货入库', NOW(), NOW()); + +INSERT INTO stock_in_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + batch_no, remark, created_at, updated_at) VALUES +(3, 2, 1, 3, 48, 560, 26880, 'BATCH-YH-2024003', '洋河梦之蓝 M6 3月批次', NOW(), NOW()), +(4, 2, 1, 4, 36, 420, 15120, 'BATCH-LZ-2024002', '泸州老窖特曲 春季批次', NOW(), NOW()), +(5, 2, 1, 5, 24, 390, 9360, 'BATCH-JNC-2024001', '剑南春水晶剑 首批', NOW(), NOW()); + +-- #3 已审核: 拉菲+人头马,进口酒专库,郎酒供应商(代理进口)| 总额=108480 +INSERT INTO stock_in_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + reviewer_id, status, order_date, total_amount, reviewed_at, remark, created_at, updated_at) VALUES +(3, 1, 'RK20260404001', 'purchase', 2, 4, 2, + 1, 'approved', DATE_SUB(CURDATE(), INTERVAL 3 DAY), 108480, + DATE_SUB(NOW(), INTERVAL 2 DAY), '进口烈酒专库入库,含拉菲及人头马', NOW(), NOW()); + +INSERT INTO stock_in_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + batch_no, remark, created_at, updated_at) VALUES +(6, 3, 1, 7, 24, 3800, 91200, 'BATCH-LF-2018001', '拉菲古堡2018,原箱', NOW(), NOW()), +(7, 3, 1, 8, 36, 480, 17280, 'BATCH-RTM-2024001', '人头马VSOP,2024年进口', NOW(), NOW()); + +-- #4 待审核: 郎酒补货,主仓库 | 总额=19200 +INSERT INTO stock_in_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + status, order_date, total_amount, remark, created_at, updated_at) VALUES +(4, 1, 'RK20260406001', 'purchase', 1, 4, 2, + 'pending', DATE_SUB(CURDATE(), INTERVAL 1 DAY), 19200, + '郎酒红花郎补货,待仓库管理员审核', NOW(), NOW()); + +INSERT INTO stock_in_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + batch_no, remark, created_at, updated_at) VALUES +(8, 4, 1, 6, 60, 320, 19200, 'BATCH-LJ-2024002', '郎酒红花郎10 第二批次', NOW(), NOW()); + +-- #5 草稿: 追加茅台,主仓库 | 总额=142800 +INSERT INTO stock_in_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + status, order_date, total_amount, remark, created_at, updated_at) VALUES +(5, 1, 'RK20260407001', 'purchase', 1, 1, 2, + 'draft', CURDATE(), 142800, + '茅台追加订货,草稿中', NOW(), NOW()); + +INSERT INTO stock_in_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + batch_no, remark, created_at, updated_at) VALUES +(9, 5, 1, 1, 60, 2380, 142800, 'BATCH-MT-2024002', '飞天茅台 第二批次', NOW(), NOW()); + +-- ── 出库单 ────────────────────────────────────────────────── +-- #1 已审核: 君悦大酒店,主仓库 | 总额=48960 +INSERT INTO stock_out_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + reviewer_id, status, order_date, total_amount, reviewed_at, remark, created_at, updated_at) VALUES +(1, 1, 'CK20260404001', 'sale', 1, 5, 2, + 1, 'approved', DATE_SUB(CURDATE(), INTERVAL 3 DAY), 48960, + DATE_SUB(NOW(), INTERVAL 2 DAY), '北京君悦大酒店 4月份定期供货', NOW(), NOW()); + +INSERT INTO stock_out_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + remark, created_at, updated_at) VALUES +(1, 1, 1, 1, 12, 2800, 33600, '飞天茅台 12瓶,整箱出库', NOW(), NOW()), +(2, 1, 1, 2, 6, 1200, 7200, '五粮液普五 6瓶', NOW(), NOW()), +(3, 1, 1, 3, 12, 680, 8160, '洋河梦之蓝 M6 12瓶', NOW(), NOW()); + +-- #2 已审核: 外滩华尔道夫,进口酒专库 | 总额=39360 +INSERT INTO stock_out_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + reviewer_id, status, order_date, total_amount, reviewed_at, remark, created_at, updated_at) VALUES +(2, 1, 'CK20260405001', 'sale', 2, 6, 2, + 1, 'approved', DATE_SUB(CURDATE(), INTERVAL 2 DAY), 39360, + DATE_SUB(NOW(), INTERVAL 1 DAY), '上海外滩华尔道夫 进口酒专属采购', NOW(), NOW()); + +INSERT INTO stock_out_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + remark, created_at, updated_at) VALUES +(4, 2, 1, 7, 6, 5200, 31200, '拉菲古堡2018 6瓶', NOW(), NOW()), +(5, 2, 1, 8, 12, 680, 8160, '人头马VSOP 12瓶', NOW(), NOW()); + +-- #3 待审核: 广州白天鹅宾馆,主仓库 | 总额=23280 +INSERT INTO stock_out_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + status, order_date, total_amount, remark, created_at, updated_at) VALUES +(3, 1, 'CK20260406001', 'sale', 1, 7, 2, + 'pending', DATE_SUB(CURDATE(), INTERVAL 1 DAY), 23280, + '广州白天鹅宾馆 月度供货申请', NOW(), NOW()); + +INSERT INTO stock_out_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + remark, created_at, updated_at) VALUES +(6, 3, 1, 4, 24, 520, 12480, '泸州老窖特曲 24瓶', NOW(), NOW()), +(7, 3, 1, 5, 12, 480, 5760, '剑南春水晶剑 12瓶', NOW(), NOW()), +(8, 3, 1, 6, 12, 420, 5040, '郎酒红花郎10 12瓶', NOW(), NOW()); + +-- #4 草稿: 君悦追加,主仓库 | 总额=16800 +INSERT INTO stock_out_orders (id, shop_id, order_no, type, warehouse_id, partner_id, operator_id, + status, order_date, total_amount, remark, created_at, updated_at) VALUES +(4, 1, 'CK20260407001', 'sale', 1, 5, 2, + 'draft', CURDATE(), 16800, + '北京君悦追加订单,草稿中', NOW(), NOW()); + +INSERT INTO stock_out_items (id, order_id, shop_id, product_id, quantity, unit_price, total_price, + remark, created_at, updated_at) VALUES +(9, 4, 1, 1, 6, 2800, 16800, '飞天茅台 追加 6瓶', NOW(), NOW()); + +-- ── 库存(已审核单据计算后的实时库存)──────────────────── +-- wh1: 飞天茅台 120-12=108, 五粮液 60-6=54, 洋河 48-12=36, 泸州 36, 剑南春 24 +-- wh2: 拉菲 24-6=18, 人头马 36-12=24 +INSERT INTO inventories (id, shop_id, warehouse_id, product_id, quantity, updated_at) VALUES +(1, 1, 1, 1, 108, NOW()), +(2, 1, 1, 2, 54, NOW()), +(3, 1, 1, 3, 36, NOW()), +(4, 1, 1, 4, 36, NOW()), +(5, 1, 1, 5, 24, NOW()), +(6, 1, 2, 7, 18, NOW()), +(7, 1, 2, 8, 24, NOW()); + +-- ── 库存流水 ──────────────────────────────────────────────── +-- 入库单 #1 (ref_id=1): 飞天茅台+五粮液 → wh1 +INSERT INTO inventory_logs (id, shop_id, warehouse_id, product_id, direction, quantity, qty_before, qty_after, + ref_type, ref_id, operator_id, created_at) VALUES +( 1, 1, 1, 1, 'in', 120, 0, 120, 'stock_in', 1, 1, NOW()), +( 2, 1, 1, 2, 'in', 60, 0, 60, 'stock_in', 1, 1, NOW()); + +-- 入库单 #2 (ref_id=2): 洋河+泸州+剑南春 → wh1 +INSERT INTO inventory_logs (id, shop_id, warehouse_id, product_id, direction, quantity, qty_before, qty_after, + ref_type, ref_id, operator_id, created_at) VALUES +( 3, 1, 1, 3, 'in', 48, 0, 48, 'stock_in', 2, 1, NOW()), +( 4, 1, 1, 4, 'in', 36, 0, 36, 'stock_in', 2, 1, NOW()), +( 5, 1, 1, 5, 'in', 24, 0, 24, 'stock_in', 2, 1, NOW()); + +-- 入库单 #3 (ref_id=3): 拉菲+人头马 → wh2 +INSERT INTO inventory_logs (id, shop_id, warehouse_id, product_id, direction, quantity, qty_before, qty_after, + ref_type, ref_id, operator_id, created_at) VALUES +( 6, 1, 2, 7, 'in', 24, 0, 24, 'stock_in', 3, 1, NOW()), +( 7, 1, 2, 8, 'in', 36, 0, 36, 'stock_in', 3, 1, NOW()); + +-- 出库单 #1 (ref_id=1): 飞天茅台+五粮液+洋河 ← wh1 +INSERT INTO inventory_logs (id, shop_id, warehouse_id, product_id, direction, quantity, qty_before, qty_after, + ref_type, ref_id, operator_id, created_at) VALUES +( 8, 1, 1, 1, 'out', 12, 120, 108, 'stock_out', 1, 1, NOW()), +( 9, 1, 1, 2, 'out', 6, 60, 54, 'stock_out', 1, 1, NOW()), +(10, 1, 1, 3, 'out', 12, 48, 36, 'stock_out', 1, 1, NOW()); + +-- 出库单 #2 (ref_id=2): 拉菲+人头马 ← wh2 +INSERT INTO inventory_logs (id, shop_id, warehouse_id, product_id, direction, quantity, qty_before, qty_after, + ref_type, ref_id, operator_id, created_at) VALUES +(11, 1, 2, 7, 'out', 6, 24, 18, 'stock_out', 2, 1, NOW()), +(12, 1, 2, 8, 'out', 12, 36, 24, 'stock_out', 2, 1, NOW()); + +-- ── 财务记录 ──────────────────────────────────────────────── +-- 出库单 #1 对应应收款 + 已回款 +INSERT INTO finance_records (id, shop_id, partner_id, type, amount, balance, ref_type, ref_id, + operator_id, record_date, remark, created_at, updated_at) VALUES +(1, 1, 5, 'receivable', 48960, 48960, 'stock_out', 1, 1, + DATE_SUB(CURDATE(), INTERVAL 3 DAY), '君悦大酒店4月供货应收款', NOW(), NOW()), +(2, 1, 6, 'receivable', 39360, 39360, 'stock_out', 2, 1, + DATE_SUB(CURDATE(), INTERVAL 2 DAY), '外滩华尔道夫进口酒应收款', NOW(), NOW()), +(3, 1, 5, 'receipt', 48960, 0, 'stock_out', 1, 1, + DATE_SUB(CURDATE(), INTERVAL 1 DAY), '君悦大酒店回款,结清', NOW(), NOW()); diff --git a/scripts/dev.sh b/scripts/dev.sh index 6dd9e75..2b8b6c1 100755 --- a/scripts/dev.sh +++ b/scripts/dev.sh @@ -6,15 +6,15 @@ fi # dev.sh — 本地开发环境管理 # # 启动: -# bash scripts/dev.sh run # 启动前后端(后端无改动则跳过重启) -# bash scripts/dev.sh run --force # 强制重启后端 -# bash scripts/dev.sh --backend-only # 仅启动后端 -# bash scripts/dev.sh --frontend-only # 仅启动前端 +# sh scripts/dev.sh run # 启动前后端(后端无改动则跳过重启) +# sh scripts/dev.sh run --force # 强制重启后端 +# sh scripts/dev.sh --backend-only # 仅启动后端 +# sh scripts/dev.sh --frontend-only # 仅启动前端 # # 数据库: -# bash scripts/dev.sh reset # 删表重建 + 写入测试数据 -# bash scripts/dev.sh seed # 写入测试数据(已存在则跳过) -# bash scripts/dev.sh clear # 清空所有数据(不写入) +# sh scripts/dev.sh seed H001 # 清空并写入 H001 测试数据(SQL 文件) +# sh scripts/dev.sh reset # 删表重建(AutoMigrate) +# sh scripts/dev.sh clear # 清空所有业务数据 set -e @@ -30,6 +30,46 @@ BACKEND_HASH_FILE="$LOG_DIR/backend.hash" mkdir -p "$LOG_DIR" +# ── seed 命令 ──────────────────────────────────────────────── +# 用法: cmd_seed +# 从 backend/config/config.yaml 读取 DSN,执行 backend/seeds/.sql +cmd_seed() { + local shop="${1:-}" + if [ -z "$shop" ]; then + error "用法: sh scripts/dev.sh seed 示例: sh scripts/dev.sh seed H001" + exit 1 + fi + + local sql_file="$ROOT/backend/seeds/${shop}.sql" + if [ ! -f "$sql_file" ]; then + error "种子文件不存在: $sql_file" + exit 1 + fi + + # 从 docker-compose.yml 读取容器名和数据库信息 + local compose_file="$ROOT/deploy/docker-compose.yml" + local container db_pass db_name + container=$(grep 'container_name:' "$compose_file" | grep -i mysql | head -1 | sed 's/.*container_name: *//') + db_pass=$(grep 'MYSQL_ROOT_PASSWORD:' "$compose_file" | head -1 | sed 's/.*MYSQL_ROOT_PASSWORD: *//') + db_name=$(grep 'MYSQL_DATABASE:' "$compose_file" | head -1 | sed 's/.*MYSQL_DATABASE: *//') + + # 检查容器是否运行 + if ! docker ps --format '{{.Names}}' | grep -q "^${container}$"; then + error "MySQL 容器 '${container}' 未运行,请先执行: docker compose -f deploy/docker-compose.yml up -d" + exit 1 + fi + + info "写入 ${shop} 种子数据 → 容器 ${container} / ${db_name}" + docker exec -i "$container" mysql -uroot -p"$db_pass" "$db_name" < "$sql_file" + success "✅ ${shop} 种子数据写入完成" + echo "" + echo " 登录信息:" + echo " 门店编号: ${shop}" + echo " admin / password123" + echo " operator / password123" + echo " test / password123" +} + # ── 颜色输出 ────────────────────────────────────────────── GREEN='\033[0;32m' YELLOW='\033[1;33m' @@ -52,15 +92,20 @@ case "$COMMAND" in run) [ "${2:-}" = "--force" ] && FORCE=true ;; - seed|reset|clear) - # seed / reset / clear 三个命令 - SEED_ARG="" - [ "$COMMAND" = "reset" ] && SEED_ARG="--reset" - [ "$COMMAND" = "clear" ] && SEED_ARG="--clear" - [ -n "${2:-}" ] && SEED_ARG="$2" - info "写入初始测试数据..." + seed) + cmd_seed "${2:-}" + exit 0 + ;; + reset) + info "删表重建(AutoMigrate)..." cd "$BACKEND_DIR" - go run cmd/seed/main.go $SEED_ARG + go run cmd/seed/main.go --reset + exit 0 + ;; + clear) + info "清空所有业务数据..." + cd "$BACKEND_DIR" + go run cmd/seed/main.go --clear exit 0 ;; --backend-only) @@ -74,7 +119,7 @@ case "$COMMAND" in ;; *) error "未知命令: $COMMAND" - echo "用法: bash scripts/dev.sh [run [--force] | reset | clear | seed | --backend-only | --frontend-only]" + echo "用法: sh scripts/dev.sh [run [--force] | seed | reset | clear | --backend-only | --frontend-only]" exit 1 ;; esac