CareHomely · Staff guides
← All guides

ShopV2 / Woodnalist — Owner 配置与运维清单(中文)

适用环境:ECS ssh shopv2/var/www/html/shopv2
密钥与密码 只放在服务器,不要提交到 Git。


一、总览:你需要处理的事项

| 类别 | 是否必做 | 说明 | |------|----------|------| | A. 基础 | ✅ 必做 | APP_KEY、数据库、域名 HTTPS、员工账号与角色 | | B. Telegram 机器人 | ✅ 强烈建议 | Token 已加 → 还要登记群/个人的 chat_id | | C. Google Drive | 建议 | 培训文档 + 商品主图同步 | | D. 前台分店 | 建议 | 宿务/达沃电话、是否开放在线结账 | | E. 展厅 WiFi 桌牌 | 建议 | 访客 WiFi 密码、Messenger 链接 | | F. Legacy 每日导入 | ✅ 已跑通 | SSH 密钥 + 远程 MySQL 密码 + cron | | G. 邮件 / SMS | 可选 | 目前顾客登录无 OTP;邮件多为 log | | H. Partner / 佣金 | 运营配置 | Partner 用户、分店 cutover |


二、A. 基础环境(ECS)

1. 应用 .env(服务器上编辑)

路径:/var/www/html/shopv2/.env

| 变量 | 作用 | 建议值 | |------|------|--------| | APP_ENV | 环境 | production | | APP_DEBUG | 调试 | false | | APP_URL | 主站 URL | https://carehomely.com | | APP_TIMEZONE | 时区 | Asia/Manila | | APP_KEY | 加密密钥 | php artisan key:generate(仅一次) | | DB_* | MariaDB | 与 docker-compose 一致 | | SESSION_DOMAIN | 登录 Cookie 域 | 三店不同主域时留空 | | STOREFRONT_*_URL | 三分店网址 | 见 .env.example |

改完后:

cd /var/www/html/shopv2
sudo docker compose exec -T app php artisan config:clear
sudo docker compose exec -T app php artisan cache:clear

2. 创建员工账号

  1. Super Admin 登录 /workspace/login(或数据库种子里的 admin@shopv2.local,上线后请改密码)。
  2. 每个员工需要:
    • 邮箱 + 密码
    • 分店 branch_id(MNL / CEB / DVO)
    • 角色(见下文角色表)
    • 可选:employee_code(销售推广 ?ref= 用)

| 角色 code | 中文名 | 典型人员 | |-----------|--------|----------| | sales | 销售 | 展厅销售 | | csr | 客服 | 接单、售后收件 | | store_manager | 店长 | 分店负责人 | | gov_ops | 政务 | 跨店运营、对账、迁移 | | finance | 财务 | 录款、对账、支出 | | warehouse | 仓库 | 收货、库存 | | purchasing | 采购 | 在途批次、货运 | | delivery_installer | 送货安装 | 师傅(另用 mobile 端) | | reseller | 合伙人 | 仅 Partner 门户 | | super_admin | 超级管理员 | 你 / IT |

当前系统 没有 单独的「OA」角色菜单;OA 相关权限挂在 gov_ops / finance / store_manager 上。


三、B. Telegram 通知(你已加 Token,还差「发给谁」)

1. .env 开关

TELEGRAM_NOTIFICATIONS_ENABLED=true
TELEGRAM_BOT_TOKEN=你的机器人Token
TELEGRAM_DRY_RUN=false
OPS_NOTIFICATION_DIGEST_ENABLED=true
  • TELEGRAM_DRY_RUN=true:只排队不真发(测试用)。
  • 调度:每 5 分钟 notifications:send-telegram;每小时 notifications:ops-digest

2. 原理(重要)

  • Token 只证明「机器人能发消息」。
  • 收件人在数据库表 telegram_notification_targets 里配置:每个目标 = chat_id + 允许的通知 category + 可选分店/角色。
  • 没有登记 chat_id → 站内通知仍有,Telegram 不会发

3. 获取群 / 个人的 chat_id(推荐步骤)

  1. 在 Telegram 创建机器人(@BotFather)→ 得到 Token(你已完成)。
  2. 把机器人 拉进目标群,并给机器人发消息权限。
  3. 在群里发一条消息(例如 ping)。
  4. 浏览器打开(把 TOKEN 换成你的):
    https://api.telegram.org/botTOKEN/getUpdates
    
  5. 在 JSON 里找 "chat":{"id":-100xxxxxxxxxx} → 群一般是 负数;私聊是正数。

4. 登记目标(在 ECS 上执行)

方式 A — Tinker(推荐,可复制改参数):

cd /var/www/html/shopv2
sudo docker compose exec -T app php artisan tinker
$admin = \App\Models\User::where('email', '你的管理员邮箱')->first();
$branch = \App\Models\Branch::where('code', 'MNL')->first();
$role = \App\Models\Role::where('code', 'gov_ops')->first();

app(\App\Services\Notifications\NotificationCenterService::class)->registerTelegramTarget([
    'branch_id' => $branch->id,
    'role_id' => $role->id,           // 可选:按角色路由
    'target_kind' => 'group',        // group | branch | private
    'target_key' => 'mnl-gov-ops',
    'label' => 'MNL Gov Ops Telegram Group',
    'chat_id' => '-100xxxxxxxxxx',   // 你的群 chat_id
    'allowed_categories' => [
        'showroom_visit',
        'payment_reconciliation',
        'shipment',
        'ops_digest',
        'gov_ops',
        'general',
    ],
    'accepts_sensitive' => false,    // 群一般 false;财务敏感私聊可 true
], $admin);

方式 B — 直接写数据库(不推荐,除非你很熟表结构)。

5. 建议登记的群(按分店 × 用途)

| 建议群名 | allowed_categories 至少包含 | 触发场景 | |----------|-------------------------------|----------| | MNL 政务群 | showroom_visit, payment_reconciliation, shipment, ops_digest | 接待访客、对账异常、逾期在途、Ops 摘要 | | MNL 财务群 | payment_reconciliation, deduction | 对账、扣款审批(敏感需 accepts_sensitive) | | CEB / DVO 分店群 | showroom_visit, payment_reconciliation | 同上,改 branch_id | | 店长个人 DM | showroom_visit, task | 可选 |

系统里常见的 category 值:

| category | 含义 | |----------|------| | showroom_visit | 销售开始/结束接待访客 | | payment_reconciliation | 支付对账异常 | | shipment | 在途批次逾期 | | ops_digest | Gov Ops 每日摘要(去重) | | deduction | 扣款/敏感(仅 accepts_sensitive=true 的 target 收全文) | | task / salary_review / contract_review | OA 类提醒 | | scheduled_job_failure | 定时任务失败 |

6. 验证 Telegram

# 干跑:.env 设 TELEGRAM_DRY_RUN=true,触发一条通知后看 notification_deliveries 表

# 真发:处理队列
sudo docker compose exec -T app php artisan notifications:send-telegram --limit=10

# 手动触发 Ops 摘要(Gov Ops 角色 target 需允许 ops_digest / payment_reconciliation / shipment)
sudo docker compose exec -T app php artisan notifications:ops-digest

四、C. Google Drive

1. 准备 Service Account JSON

  1. Google Cloud Console → 创建 Service Account → 下载 JSON 密钥。
  2. 放到 ECS(不要进 Git),例如:
    /var/www/secrets/shopv2-google-drive.json
    chmod 600
    

2. .env

GOOGLE_DRIVE_CREDENTIALS_PATH=/var/www/secrets/shopv2-google-drive.json
GOOGLE_DRIVE_TRAINING_FOLDER=training-doc
GOOGLE_DRIVE_PRODUCTS_FOLDER=furnituresPhotos
# 若已知文件夹 ID 可填(更快):
# GOOGLE_DRIVE_TRAINING_FOLDER_ID=
# GOOGLE_DRIVE_PRODUCTS_FOLDER_ID=

3. 在 Drive 里共享文件夹

对 Service Account 的邮箱(JSON 里 client_email):

| 文件夹 | 权限 | 用途 | |--------|------|------| | training-doc | 查看者 | Workspace → Training | | furnituresPhotos | 查看者 | Workspace → Drive photos → 应用到商品图 |

培训文档可在描述第一行写角色,例如:roles: sales, csr, store_manager(见 config/google_drive.php)。

4. 同步命令(ECS)

sudo docker compose exec -T app php artisan drive:sync-training
sudo docker compose exec -T app php artisan drive:sync-product-photos

已注册调度:培训 每日同步、商品图 约 06:15。


五、D. 前台 / 分店

1. 三分店网址与推广 cookie

.env

STOREFRONT_MNL_URL=https://carehomely.com
STOREFRONT_CEB_URL=https://wodyhome.com
STOREFRONT_DVO_URL=https://davao.carehomely.com
STOREFRONT_REF_COOKIE_DOMAIN=
SESSION_DOMAIN=

2. 分店电话(页眉/页脚)

宿务、达沃若与马尼拉不同:

STOREFRONT_CEB_LANDLINE=...
STOREFRONT_CEB_MOBILE=...
STOREFRONT_DVO_LANDLINE=...
STOREFRONT_DVO_MOBILE=...

马尼拉默认在 config/storefront.php((02) 8659-6304 · 0960 464 5981)。

3. 是否开放在线结账(Cutover)

Workspace → Branch cutover(Gov Ops / 采购):

  • 马尼拉通常:storefront_checkout_enabled = on
  • 宿务/达沃可保持 off,仅用 Assisted checkout,直到你准备开放。

4. 顾客登录

  • 无短信 OTP:菲律宾手机号格式 + 须已有订单。
  • 投诉邮箱:woodnalist@gmail.comconfig/storefront.php)。

六、E. 展厅 WiFi 与桌牌

.env(密码仅服务器):

STOREFRONT_GUEST_WIFI_PASSWORD=你的访客WiFi密码
STOREFRONT_GUEST_WIFI_SSID_MNL=carehomely
STOREFRONT_GUEST_WIFI_SSID_CEB=wodyhome
STOREFRONT_GUEST_WIFI_SSID_DVO=wodyhome

Workspace → Showroom → 打印桌卡 QR(WiFi + Messenger)。
销售接待 → Host visitor(会通知 CSR/店长/Gov Ops + 已配置的 Telegram 群)。


七、F. Legacy 每日导入(carehomely → ShopV2)

1. 已配置项(ECS ecs-user

| 项 | 路径 | |----|------| | SSH 密钥 | ~/.ssh/aliKey.pemaliManila / aliCebu / aliDavao | | 远程 MySQL 密码 | ~/.shopv2/legacy-remote-mysql.env(chmod 600) | | Dump 目录 | /var/backups/legacy-thinkdb | | Cron | 03:30 dump + 每分钟 schedule:run(04:00 import) |

2. 手动全量(排错)

bash /var/www/html/shopv2/scripts/legacy-daily-mysqldump-restore.sh
cd /var/www/html/shopv2
sudo docker compose exec -T app php artisan shopv2:import-legacy-daily

3. 对照

Workspace → Legacy reconcile(Gov Ops)。


八、G. 其他可选配置

| 项 | 变量 / 位置 | 说明 | |----|-------------|------| | 车队过路费默认充值 | FLEET_TOLL_DEFAULT_TOPUP_PHP=5000 | Toll RFID 页 | | Gov Ops 看全部分店余额 | GOV_OPS_CAN_VIEW_FULL_BALANCES=true | 财务可见性 | | 邮件 | MAIL_* | 当前多为 log,未接真实 SMTP | | AWS S3 | AWS_* | 若改用云存储上传 |


九、上线后自检清单(打勾)

  • [ ] 三分店 HTTPS 可打开,员工能 /workspace/login
  • [ ] 至少 1 个 Gov Ops Telegram 群已登记 chat_idnotifications:send-telegram 成功
  • [ ] Google Drive 培训/商品图同步成功(或接受暂用手写培训)
  • [ ] Legacy reconcile 订单数与预期接近
  • [ ] 销售能 Host visitorAssisted checkout、复制客人 tracking link
  • [ ] 师傅能 /mobile/delivery 登录并录事件
  • [ ] Partner 测试账号能 /partner/login

十、相关文档

  • 员工英文/他加禄语指南:docs/guides/README.md
  • 迁移数据源:docs/MIGRATION_DATA_SOURCES.md
  • 业务规则:docs/BUSINESS_RULES.md

Permalink: https://davao.carehomely.com/guides/OWNER_CONFIGURATION_GUIDE.zh-CN ·