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. 创建员工账号
- 用 Super Admin 登录
/workspace/login(或数据库种子里的admin@shopv2.local,上线后请改密码)。 - 每个员工需要:
- 邮箱 + 密码
- 分店
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(推荐步骤)
- 在 Telegram 创建机器人(@BotFather)→ 得到 Token(你已完成)。
- 把机器人 拉进目标群,并给机器人发消息权限。
- 在群里发一条消息(例如
ping)。 - 浏览器打开(把
TOKEN换成你的):https://api.telegram.org/botTOKEN/getUpdates - 在 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
- Google Cloud Console → 创建 Service Account → 下载 JSON 密钥。
- 放到 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.com(config/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.pem → aliManila / 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_id且notifications:send-telegram成功 - [ ] Google Drive 培训/商品图同步成功(或接受暂用手写培训)
- [ ] Legacy reconcile 订单数与预期接近
- [ ] 销售能 Host visitor、Assisted 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 ·