diff --git a/.gitignore b/.gitignore index 45a47d2..366116a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,5 +16,4 @@ application/database.php sync_config.jsonc __MACOSX/ *.code-workspace -plan/chat-backup/**/*.jsonl -plan/chat-backup/subagents/ \ No newline at end of file +/plan/ \ No newline at end of file diff --git a/deploy.sh b/deploy.sh index cf91055..ff51cca 100644 --- a/deploy.sh +++ b/deploy.sh @@ -31,6 +31,12 @@ echo "[${DATE}] 执行 git fetch origin ${TARGET_BRANCH}..." >> "${LOG_FILE}" git fetch origin "${TARGET_BRANCH}" >> "${LOG_FILE}" 2>&1 git reset --hard "origin/${TARGET_BRANCH}" >> "${LOG_FILE}" 2>&1 +# plan/ 仅本地文档,不入库;清理服务器上历史残留 +if [ -d "${DEPLOY_DIR}/plan" ]; then + rm -rf "${DEPLOY_DIR}/plan" + echo "[${DATE}] 已删除 plan/ 目录(不入库)" >> "${LOG_FILE}" +fi + # 恢复敏感配置文件(若被覆盖或缺失) if [ -f "application/database.php.deploy_bak" ]; then cp -p application/database.php.deploy_bak application/database.php diff --git a/plan/README.md b/plan/README.md deleted file mode 100644 index 490843a..0000000 --- a/plan/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# 厨房商城(chufang.gynhc.com)项目计划文档 - -本目录存放**本项目(厨房/宥川商城)**相关 Cursor 计划文档、对话备份与实施进度,便于团队查阅与版本管理。 - -> 源文件来自 Cursor Plans / Agent Transcripts -> 最近更新:2026-09-12 -> **注意:「飞天」系列为另一独立酒类项目,相关计划不在本目录。** - ---- - -## 快速入口 - -| 文档 | 说明 | -|------|------| -| [实施进度汇总.md](./实施进度汇总.md) | **当前实施进度与部署清单(推荐阅读)** | -| [chat-backup/对话摘要-2026-09-12打包.md](./chat-backup/对话摘要-2026-09-12打包.md) | **近期全部会话可读摘要(2026-09-04~12)** | -| [chat-backup/对话摘要-区域代理实施.md](./chat-backup/对话摘要-区域代理实施.md) | 区域代理专项对话摘要 | - ---- - -## 对话备份 - -| 文件/目录 | 说明 | -|-----------|------| -| [chat-backup/](./chat-backup/) | **仅保留 Markdown 摘要**(原始 JSONL 不入库,见 `.gitignore`) | - -会话 ID 与主题对照见 [对话摘要-2026-09-12打包.md](./chat-backup/对话摘要-2026-09-12打包.md) 索引表。 - ---- - -## 支付 / 分账 / 进件 - -| 文档 | 说明 | -|------|------| -| [汇付小程序支付对接_c945b5d0.plan.md](./汇付小程序支付对接_c945b5d0.plan.md) | 汇付微信支付 + 延时分账总体方案 | -| [汇付个人进件对接_e1144173.plan.md](./汇付个人进件对接_e1144173.plan.md) | 推广员/区域代理个人进件 | -| [微信发货信息同步_b8fd57f1.plan.md](./微信发货信息同步_b8fd57f1.plan.md) | 微信购物订单发货同步 | -| [阿里云快递查询插件_b22bbd2a.plan.md](./阿里云快递查询插件_b22bbd2a.plan.md) | 阿里云全国快递查询 | - ---- - -## 分销 / 佣金 / 区域代理(核心业务) - -| 文档 | 说明 | -|------|------| -| [区域代理需求对照_060fc1ce.plan.md](./区域代理需求对照_060fc1ce.plan.md) | 区域代理需求图对照、P0/P1/P2 分阶段完善计划 | -| [分销需求差异核对_53c87321.plan.md](./分销需求差异核对_53c87321.plan.md) | 分销功能与需求差异核对 | -| [需求核对报告_a82c765c.plan.md](./需求核对报告_a82c765c.plan.md) | 整体需求核对报告 | -| [shopro分销重构方案_7c67d97d.plan.md](./shopro分销重构方案_7c67d97d.plan.md) | Shopro 分销重构总体方案 | -| [shopro分销重构细化_260cd6c8.plan.md](./shopro分销重构细化_260cd6c8.plan.md) | 分销重构细化任务 | -| [级差奖管理奖改造_7a3ea896.plan.md](./级差奖管理奖改造_7a3ea896.plan.md) | 级差奖、管理奖改造 | -| [商品分销佣金配置_12a20341.plan.md](./商品分销佣金配置_12a20341.plan.md) | 商品级分销佣金配置 | - ---- - -## 小程序 UI / 体验 - -| 文档 | 说明 | -|------|------| -| [首页布局方案_29cd28e2.plan.md](./首页布局方案_29cd28e2.plan.md) | 首页 E-Final 布局方案 | -| [敏感文案替换_1357718d.plan.md](./敏感文案替换_1357718d.plan.md) | 代理→公司、佣金→差价 | -| [首页精简与化妆品扩展_19f078ec.plan.md](./首页精简与化妆品扩展_19f078ec.plan.md) | 首页精简与品类扩展 | -| [首页公告滚动展示_0032cf34.plan.md](./首页公告滚动展示_0032cf34.plan.md) | 公告滚动 | -| [首页视频与商品视频_23635752.plan.md](./首页视频与商品视频_23635752.plan.md) | 视频展示 | -| [商务蓝白_ui_改版_d9d0903f.plan.md](./商务蓝白_ui_改版_d9d0903f.plan.md) | 商务蓝白 UI 改版 | -| [深蓝酒业主题改造_d0048f3e.plan.md](./深蓝酒业主题改造_d0048f3e.plan.md) | 深蓝主题 | -| [白酒文化ui改造_4e54a93b.plan.md](./白酒文化ui改造_4e54a93b.plan.md) | 白酒文化 UI | -| [酒类小程序_ui_设计_4b7fbcd5.plan.md](./酒类小程序_ui_设计_4b7fbcd5.plan.md) | 酒类小程序 UI 设计 | -| [字体背景风格优化_63a32b86.plan.md](./字体背景风格优化_63a32b86.plan.md) | 字体背景优化 | -| [子页面风格统一_7bee3db6.plan.md](./子页面风格统一_7bee3db6.plan.md) | 子页面风格统一 | -| [taro_小程序对齐方案_b61be661.plan.md](./taro_小程序对齐方案_b61be661.plan.md) | Taro 小程序对齐 | - ---- - -## 测试 / 运维 - -| 文档 | 说明 | -|------|------| -| [本地数据库完整还原_5823409e.plan.md](./本地数据库完整还原_5823409e.plan.md) | 本地数据库还原 | - ---- - -## 相关测试脚本 - -```bash -# 分销测试 -php addons/shopro/tests/commission_setup_test_users.php -php addons/shopro/tests/commission_verify.php scenarios - -# 区域代理测试 -php addons/shopro/tests/regional_agent_setup_test_users.php -php addons/shopro/tests/regional_agent_verify.php list-agents - -# 插件验证 -php think shopro_huifu:verify -php think shopro_wechat_trade:verify -``` - -## 相关 SQL 升级脚本 - -- `addons/shopro/upgrade_distribution_features.sql` — 分销+区域代理表结构 -- `addons/shopro/upgrade_regional_agent_menu.sql` — 区域代理完整菜单 -- `addons/shopro/upgrade_regional_agent_commission.sql` — 单个代理自定义佣金字段 -- `addons/shopro_huifu/upgrade_huifu_pay_type.sql` — 汇付支付类型 -- `addons/shopro_huifu/upgrade_huifu_split.sql` — 汇付分账表 diff --git a/plan/chat-backup/对话摘要-2026-09-12打包.md b/plan/chat-backup/对话摘要-2026-09-12打包.md deleted file mode 100644 index de2ac1d..0000000 --- a/plan/chat-backup/对话摘要-2026-09-12打包.md +++ /dev/null @@ -1,156 +0,0 @@ -# 对话摘要汇总(2026-09-04 ~ 2026-09-12) - -- **项目**:chufang.gynhc.com / xgsc.gynhc.com(厨房/宥川商城) -- **备份时间**:2026-09-12 -- **说明**:「飞天」系列为另一独立酒类项目,与本项目无关 - ---- - -## 会话索引 - -| 日期 | 主题 | 会话 ID | 摘要 | -|------|------|---------|------| -| 09-04 | 区域代理功能实施 | `1fc9746b` | [对话摘要-区域代理实施.md](./对话摘要-区域代理实施.md) | -| 09-08~09 | 汇付支付 + 延时分账插件 | `a5138654` | 见下文 §1 | -| 09-10 | 首页布局改版 E-Final | `45ebfacd` | 见下文 §2 | -| 09-10~11 | 微信发货信息同步 | `553f50fe` | 见下文 §3 | -| 09-10~11 | 阿里云快递查询插件 | `909afd5e` | 见下文 §4 | -| 09-11 | 汇付个人进件(推广员/区域代理) | `1cafd55b` | 见下文 §5 | -| 09-11 | 敏感文案 + 提现进件 + 图片压缩 | `c58fb120` | 见下文 §6 | - -详细内容以本目录 Markdown 摘要为准;原始 JSONL 不再纳入 Git 仓库。 - ---- - -## §1 汇付支付 + 延时分账(a5138654) - -**计划**:[汇付小程序支付对接_c945b5d0.plan.md](../汇付小程序支付对接_c945b5d0.plan.md) - -| 时间 | 用户诉求 | 处理结果 | -|------|----------|----------| -| 09-09 | 判断支付产品线和接入方案 | 分析汇付斗拱聚合支付 + 延时分账 | -| 09-09 | huifu_id 查看、AppID 绑定、sub_openid 链路 | 文档说明 + 后台配置指引 | -| 09-09 | 检查方案遗漏、分账后台可配置 | 补充方案:分账时机可选、插件化 | -| 09-09 | 支付做成可卸载插件 | 设计 `shopro_huifu` 插件架构 | -| 09-09 | 实施汇付对接方案 | 完成插件开发、Hook 接入、后台配置 | -| 09-09 | 插件中心看不到 / 安装验证失败 | 修复 install 流程、verify 脚本、菜单注册 | -| 09-10 | 支付联调、配置参数 | 逐步修复 notify、pay_type、分账配置 | - -**交付物**: -- 插件 `addons/shopro_huifu/`(支付、分账、后台配置、verify/install 命令) -- SQL:`upgrade_huifu_pay_type.sql`、`upgrade_huifu_split.sql` -- 后台:汇付配置、分账接收方、分账记录 - ---- - -## §2 首页布局改版(45ebfacd) - -**计划**:[首页布局方案_29cd28e2.plan.md](../首页布局方案_29cd28e2.plan.md) - -| 时间 | 用户诉求 | 处理结果 | -|------|----------|----------| -| 09-10 | 参考参考图出首页布局方案 + 预览图 | 生成 A~E 多套预览 | -| 09-10 | 选 E 方案,优化红框区域和底部导航 | 生成 E-Final 预览 | -| 09-10 | 按 E-Final 实现 | 改造 `pages/index/index.vue` 及组件 | -| 09-10 | WXML 编译错误 | 修复 `sh-grid-swiper` style 语法 | -| 09-10 | 图标配色优化、立体化 | 优化分类图标、配色统一 | - -**交付物**: -- 小程序首页 E-Final 布局 -- 预览图:`xgsc.gynhc.com_wx/docs/homepage-previews/` -- 组件:`sh-grid-swiper`、分类网格等 - ---- - -## §3 微信发货信息同步(553f50fe) - -**计划**:[微信发货信息同步_b8fd57f1.plan.md](../微信发货信息同步_b8fd57f1.plan.md) - -| 时间 | 用户诉求 | 处理结果 | -|------|----------|----------| -| 09-10 | 接入微信购物订单 / 发货信息同步 | 设计并实现 `shopro_wechat_trade` 插件 | -| 09-10 | 经营类目超出开放范围 | 说明需在微信后台申请接入 | -| 09-10 | install 后订单详情路径配置失败 | 需先签署订单中心授权协议 | -| 09-10 | init-path 无效路径 10060035 | 排查 path 格式、小程序版本要求 | -| 09-10 | 订单中心 path 怎么填 | 配置 `pages/order/detail` | -| 09-10 | 支付成功验证 | 确认支付链路正常 | -| 09-11 | 分析个人进件流程是否接好 | 分析结论:分账执行已接,个人进件未接 | - -**交付物**: -- 插件 `addons/shopro_wechat_trade/`(发货同步、配置、verify 命令) -- 后台:微信交易组件配置 - ---- - -## §4 阿里云快递查询(909afd5e) - -**计划**:[阿里云快递查询插件_b22bbd2a.plan.md](../阿里云快递查询插件_b22bbd2a.plan.md) - -| 时间 | 用户诉求 | 处理结果 | -|------|----------|----------| -| 09-10 | 对接阿里云全国快递查询 API | 设计并实现 `shopro_aliyun_express` 插件 | -| 09-11 | install 命令不存在 | 修复命令注册、InstallFull | -| 09-11 | AppCode vs AppKey 混淆 | 澄清阿里云市场鉴权方式 | -| 09-11 | 选阿里云时隐藏 ExpressBird 配置 | 后台 UI 条件显示 | -| 09-11 | 测试查询 404 / 格式错误 | 修复 API 端点、响应解析 | -| 09-11 | 刷新轨迹非法参数 | 修复单号空格 trim、编码映射 | - -**交付物**: -- 插件 `addons/shopro_aliyun_express/` -- 后台:快递 provider 切换、AppCode 配置 - ---- - -## §5 汇付个人进件(1cafd55b) - -**计划**:[汇付个人进件对接_e1144173.plan.md](../汇付个人进件对接_e1144173.plan.md) - -| 时间 | 用户诉求 | 处理结果 | -|------|----------|----------| -| 09-11 | 分销/代理必须走汇付进件 | 细化实施计划并开始开发 | -| 09-11 | install-full 命令未定义 | 补充 InstallFull 命令 | -| 09-11 | Agent.php 207 引用传参错误 | 修复 Hook 参数传递 | -| 09-11 | Config::isHuifuMode() 未定义 | 补全 SplitConfig 方法 | -| 09-11 | 找不到小程序进件页面 | 定位 `pages/app/commission/apply` | -| 09-11 | 进件页无法填资料、区域代理秒过 | 修复表单交互、审核流程 | -| 09-11 | 审核中但内容空白 | 修复状态展示与数据回填 | -| 09-11 | 「您暂时不能申请」 | 解释门槛条件(分销等级/状态) | - -**交付物**: -- 进件表、API、Hook 对接 -- 小程序:`pages/app/commission/apply` 进件表单 -- 后台:进件审核管理 -- 命令:`shopro_huifu:install-full`、`shopro_huifu:onboard-poll` - ---- - -## §6 敏感文案 + 提现进件 + 包体积(c58fb120) - -**计划**:[敏感文案替换_1357718d.plan.md](../敏感文案替换_1357718d.plan.md) - -| 时间 | 用户诉求 | 处理结果 | -|------|----------|----------| -| 09-11 | 代理→公司、佣金→差价 | 小程序 + 后台敏感文案批量替换 | -| 09-11 | 补充提现页面 | 完善提现 UI 与逻辑 | -| 09-11 | 进件资料绑定到提现页 | 分销商/区域角色才显示 | -| 09-11 | 绑定页应为提现子页面 | 拆分为 `withdraw/bind` 子页 | -| 09-11 | home 图片太大超包限制 | 压缩 static/images/home | -| 09-11 | 删除未引用图片 | 清理无用资源 | - -**交付物**: -- 文案替换(小程序 + 后台视图/JS) -- 提现页 + 进件绑定子页 -- 首页图片压缩与清理 - ---- - -## 关联计划文档(plan 目录) - -完整列表见 [README.md](../README.md),新增计划: - -- 汇付小程序支付对接 -- 汇付个人进件对接 -- 微信发货信息同步 -- 阿里云快递查询插件 -- 敏感文案替换 -- 首页布局方案 diff --git a/plan/chat-backup/对话摘要-区域代理实施.md b/plan/chat-backup/对话摘要-区域代理实施.md deleted file mode 100644 index 525a724..0000000 --- a/plan/chat-backup/对话摘要-区域代理实施.md +++ /dev/null @@ -1,86 +0,0 @@ -# 对话摘要:区域代理功能实施 - -- **项目**:chufang.gynhc.com(厨房/宥川商城) -- **会话 ID**:`1fc9746b-419a-426b-98a2-35182ed827b5` -- **备份时间**:2026-09-04 -- **原始记录**:会话 ID `1fc9746b-…`(JSONL 不入 Git,需在 Cursor 本地 transcripts 查看) - -> 说明:「飞天」系列为另一独立酒类项目,与本会话无关。 - ---- - -## 对话时间线 - -| 时间 | 用户诉求 | 处理结果 | -|------|----------|----------| -| 12:08 | 核对区域代理与需求图出入,拆分细化 | 生成对照计划,确认分佣模式可配置、运营优先 | -| 12:26 | 代理佣金需后台可配置 | 计划补充 P0:代理设置页 + 代理等级 CRUD | -| 13:10 | 开始实施 | 完成 P0:佣金配置、等级管理、菜单、编辑/添加、小程序提现等 | -| 13:31 | 继续 P2 | 完成看板、筛选导出、商品开关、审核通知、动态等级匹配 | -| 13:40 | PDO 2031 报错 | 修复 `(clone $query)` 与 `FROM_UNIXTIME` `%` 占位符问题 | -| 13:47 | 继续未完成 | 补全菜单 SQL、通知注册、Order/Reward 格式整理 | -| 14:01 | 单个代理可设专属佣金,优先于等级通用 | 新增字段 + 表单 + `Commission.php` 优先逻辑 | -| 14:06 | 「跟随等级」是什么意思 | 解释:未自定义时用等级通用配置 | -| 14:09 | 开关文案易误导 | 改为单选:「使用等级通用配置 / 单独设置佣金」 | -| 14:37 | 编写区域代理测试脚本 | 新增 setup/cleanup/verify 脚本 + 910001~910009 测试账号 | -| 14:44 | 计划复制到 plan 目录 | 复制 21 份计划 + README + 实施进度汇总 | -| 14:49 | 飞天是另一项目,不要搞混 | 删除 plan 中 3 份飞天相关计划 | -| 15:33 | 对话备份到 plan | 本备份 | - ---- - -## 已确认业务口径 - -- **固定佣金**:按每单计,不按件 × 数量 -- **分佣模式**:后台可配(叠加 / 独占 / 级差) -- **单个代理佣金**:有专属配置时优先,否则跟随代理等级 -- **比例基数**:订单商品实付金额 `pay_price` - ---- - -## 主要交付物 - -### 后台 - -- 区域代理:设置、等级、代理列表、订单、佣金、业绩看板 -- 代理添加/编辑:用户搜索、省市区级联、佣金设置(等级通用 / 单独设置) -- 菜单 SQL:`upgrade_regional_agent_menu.sql` 等 - -### 引擎 - -- `addons/shopro/library/regional_agent/Commission.php` — 三种分佣模式、按单固定、代理优先 -- `upgrade_regional_agent_commission.sql` — 单代理自定义佣金字段 - -### 小程序 - -- `xgsc.gynhc.com_wx/pages/app/regional-agent/` — stats、筛选、待结算、提现入口 - -### 测试 - -```bash -php addons/shopro/tests/regional_agent_setup_test_users.php -php addons/shopro/tests/regional_agent_verify.php list-agents -php addons/shopro/tests/regional_agent_verify.php verify-order {订单ID} -``` - -**测试密码**:`Test@123456` -**主测买家**:19900000014(910004) - ---- - -## 部署 Checklist - -1. 执行 `upgrade_distribution_features.sql` -2. 执行 `upgrade_regional_agent_menu.sql` -3. 执行 `upgrade_regional_agent_commission.sql` -4. 后台分配区域代理权限 -5. 商品开启 `regional_enable` -6. 运行测试脚本验证 - ---- - -## 相关文档 - -- [实施进度汇总.md](../实施进度汇总.md) -- [区域代理需求对照](../区域代理需求对照_060fc1ce.plan.md) -- [README.md](../README.md) diff --git a/plan/chufang-project-plan-backup-20260912.zip b/plan/chufang-project-plan-backup-20260912.zip deleted file mode 100644 index f03cfaf..0000000 Binary files a/plan/chufang-project-plan-backup-20260912.zip and /dev/null differ diff --git a/plan/shopro分销重构方案_7c67d97d.plan.md b/plan/shopro分销重构方案_7c67d97d.plan.md deleted file mode 100644 index 85f0f3a..0000000 --- a/plan/shopro分销重构方案_7c67d97d.plan.md +++ /dev/null @@ -1,288 +0,0 @@ ---- -name: Shopro分销重构方案 -overview: 卸载飞天插件,以 Shopro 分销为核心重建会员/创客/并行角色体系;创客映射分销商等级,合伙人/酒道馆/区县代理作为分销商上的并行标签;马豆/云豆/兑换券/分红池/兑换商城作为 Shopro 扩展模块保留。 -todos: - - id: p0-backup-freeze - content: "Phase 0: 备份 feitian/commission 表,暂停 cron,禁止提前卸载插件" - status: pending - - id: p1-business-skeleton - content: "Phase 1: 新建 shopro_business 扩展,迁移 Reward/Pool/Asset library,注册 order hooks" - status: pending - - id: p2-agent-ext-schema - content: "Phase 1: 设计 shopro_commission_agent_ext 表 + 并行角色字段" - status: pending - - id: p2-enable-commission - content: "Phase 2: 恢复 commission_level,配置 V1-V6 等级,迁移 maker→agent" - status: pending - - id: p3-admin-migrate - content: "Phase 3: 复用 shopro/commission 后台,迁入分红/收入明细/资产/兑换管理" - status: pending - - id: p4-frontend-switch - content: "Phase 4: 小程序切回 commission 中心,改造资产/兑换 API,更新 decorate 入口" - status: pending - - id: p5-parallel-test - content: "Phase 5: 1398 品酒单全链路验收,对比 feitian 历史结算" - status: pending - - id: p6-uninstall-cleanup - content: "Phase 6: 卸载 feitian,删除 admin/feitian 与前端 feitian 页面,清理冗余字段" - status: pending -isProject: false ---- - -# Shopro 分销重构方案(替代飞天插件) - -## 一、需求纠正:正确角色模型 - -```mermaid -flowchart LR - subgraph entry [入口] - Member["会员 = 品酒师"] - end - subgraph upgrade [唯一升级路径] - Maker["创客 = 分销商 V1-V6"] - end - subgraph parallel [并行标签 可同时拥有] - Partner[合伙人] - JDG[酒道馆] - Agent[区县代理] - end - Member -->|"直推3单或团队4单"| Maker - Maker -.-> Partner - Maker -.-> JDG - Maker -.-> Agent - Member -.-> Partner -``` - - - -**关键原则:** - -- 只有一条升级链:**品酒师 → 创客**(达标自动/手动成为分销商) - -- -- 合伙人 / 酒道馆 / 区县代理是**标签**,不是更高级别;同一用户可同时是创客+合伙人+酒道馆+区县代理 -- 推荐链上的每一层代理,可能是不同标签组合(一级区县代理、二级合伙人、三级酒道馆等) - -**代码现状说明:** 当前 `[RewardEngine.php](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\RewardEngine.php) 已对同一订单并行调用 Referral/Maker/Jdg/Agent 四套结算;`[feitian_user_role](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\install.sql) 表结构也支持 `(user_id, role_type)` 多行并存。**问题主要在方案文档/UI 表述为「五级角色」,以及与 Shopro 分销 UI/数据双轨运行**,而非算法完全不可用。 - ---- - -## 二、卸载飞天会不会造成混乱? - -**会,如果只做「后台卸载插件」而不做配套清理。** - - -| 卸载后状态 | 影响 | -| ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------- | -| `Feitian.php::uninstall()` 仅删菜单 | 21 张 `feitian_`* 表、历史数据全部残留 | -| 订单 Hook 消失 | 品酒单不再结算任何奖励 | -| 小程序 `/addons/feitian/*` | 会员中心、马豆、兑换商城全部 404 | -| `[application/admin/controller/feitian/](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\feitian) | 控制器仍在,访问报类找不到 | -| `[feitian-disable-commission.sql](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-disable-commission.sql) 已执行 | Shopro 分销仍为关闭状态 → **卸载后短期无任何分销能力** | -| 商品/门店补丁字段 | `is_feitian_order`、`store_type` 等字段仍在 Shopro 表上 | -| 装修数据 | 个人中心仍指向 `/pages/app/feitian/`* 死链 | - - -**结论:** 可以卸载,但必须按 **「先建新、再切流、后清理」** 顺序,不能先卸后用。 - ---- - -## 三、Shopro 改造 vs 保留飞天:是否更快更稳? - - -| 维度 | 完全 Shopro 改造(你的选择) | 修正飞天 + 复用 Shopro UI | -| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | -| 后台分销管理 | 原生 `[shopro/commission/](f:\修改的项目\恒链数通(重庆)*`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\commission) 现成 | 需维护 feitian 后台 + Shopro 双轨 | -| 小程序分销中心 | 已有 `[pages/app/commission/*](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\hlst_wx\pages\app\commission) 8 个页面 | 需维护 feitian 9 页 | -| 创客 V1-V6 | 映射 `shopro_commission_agent_level` | 已有 `feitian_role_config` | -| 三单返佣 398/400/600 | **需自定义**(Shopro 默认按层级百分比) | 已实现 `ReferralReward` | -| 创客极差 120 元/单 | **需自定义**(非标准 MLM) | 已实现 `MakerReward` | -| 酒道馆/区县代理区域逻辑 | **需自定义** | 已实现 `JiudaoguanReward`/`AgentReward` | -| 全国池均分 | **需自定义** | 已实现 `PoolService` | -| 马豆/云豆/兑换券/兑换商城 | **仍需独立表+定时任务** | 已实现 | -| 30 天分红周期 | **仍需独立表+cron** | 已实现 | -| 预估工期 | **4~6 周**(含迁移+联调) | **1~2 周**(模型修正+UI对齐) | -| 长期维护 | **更统一**,一套分销体系 | 双系统并存,认知成本高 | - - -**诚实结论:** - -- **更稳定**:长期看 Shopro 统一体系更好(你已选择此路线) -- **更快**:**不是** — 约 70% 业务规则 Shopro 无法开箱即用,无论选哪条路线都要写自定义结算;完全迁移还要加上卸载清理、数据迁移、前端回切成本 - ---- - -## 四、目标架构(Shopro 核心 + 业务扩展层) - -```mermaid -flowchart TD - OrderPay[Shopro订单支付] --> Hook[order_payed_after] - Hook --> CommHook[Shopro CommissionHook] - Hook --> BizHook[shopro/business OrderHook 新扩展] - CommHook --> AgentLevel[分销商等级 V1-V6] - CommHook --> WalletReward[钱包佣金 commission_reward] - BizHook --> ReferralFix[三单返佣 398/400/600] - BizHook --> MakerDiff[创客极差 120元] - BizHook --> JDGReward[酒道馆团队奖] - BizHook --> AgentArea[区县代理区域奖] - BizHook --> Pools[全国池/绿色池] - BizHook --> Assets[马豆/云豆/兑换券] - AgentExt[shopro_commission_agent_ext] --> BizHook - AgentExt --> CommHook -``` - - - -**建议新建轻量扩展:** `addons/shopro_business/`(或 `addons/shopro/library/business/` 内聚),**不要**再叫 feitian,职责清晰: - -- **Shopro 分销负责:** 分销商身份、V1-V6 等级、团队统计、钱包佣金、后台/小程序分销中心 -- **Business 扩展负责:** 并行角色标签、固定金额奖励、区域代理、资产引擎、分红池、兑换商城 - ---- - -## 五、数据模型改造 - -### 5.1 分销商并行标签(替代 `feitian_user_role`) - -在 `[fa_shopro_commission_agent](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\install.sql) 上扩展,或新建 `fa_shopro_commission_agent_ext`: - - -| 字段 | 说明 | -| ----------------------- | -------------- | -| `user_id` | PK,关联 agent | -| `is_partner` | 合伙人(后台手动) | -| `is_jiudaoguan` | 酒道馆 | -| `jiudaoguan_store_id` | 绑定门店 | -| `is_district_agent` | 区县代理 | -| `agent_area_id` | 辖区 area_id | -| `sommelier_order_count` | 品酒师自购单数(升级创客用) | -| `direct_order_count` | 直推品酒单数 | - - -**创客 = 已是分销商**:`shopro_commission_agent.status=normal` + `level` 1~6 - -**品酒师 = 普通会员**:无 agent 记录,或 agent 未激活 - -### 5.2 资产/分红/兑换表(保留,改名可选) - -以下表**无法**并入 Shopro 分销表,建议保留并改名前缀为 `shopro_business_`* 或保持 `feitian_*` 仅作历史: - -- 马豆/云豆/兑换券账户与流水 -- `green_pool` / `dividend_cycle` / `pool_distribute` -- `exchange_goods` / `exchange_order` - -### 5.3 迁移脚本 - -从 `[feitian-migrate-user.sql](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-migrate-user.sql) 逻辑反向编写: - -- `feitian_user_role.role_type=maker` → `shopro_commission_agent` + level -- `partner_flag` → `is_partner` -- `jiudaoguan` / `agent` → ext 表字段 -- 资产账户按 `user_id` 原样迁移(表 rename 或视图) - ---- - -## 六、业务规则映射到 Shopro - - -| 脑图规则 | Shopro 实现方式 | -| -------------------- | ------------------------------------------------------------- | -| 品酒师三单返佣 398/400/600 | Business Hook:`ReferralReward` 逻辑迁入,按 buyer 序号发 `User::money` | -| 创客升级(直推3/团队4单) | 扩展 `CommissionJob` 或 Business:`Agent::becomeAgent` + level=1 | -| 创客 V1-V6 极差 120 元 | Business Hook 在 CommissionHook 之后,遍历 maker 链(读 agent.level) | -| 酒道馆团队 50 元 + 全国池 100 | Business:`is_jiudaoguan=1` 的用户链 + `pool` 表 | -| 区县代理三种场景 | Business:`agent_area_id` + `AreaResolver`(从 feitian 迁入) | -| 全国池 150 均分 | Business cron `pool-distribute` | -| 马豆/云豆/兑换券 | Business 资产服务(从 feitian library 迁入) | -| 30 天分红 | Business cron `dividend-cycle` | -| 兑换商城 | Business API + 保留/改造 exchange 页面 | - - -**Shopro 原生可承接部分:** - -- 分销商申请/审核 UI -- 团队列表、佣金明细、排行榜(`[pages/app/commission](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\hlst_wx\pages\app\commission)) -- 后台等级配置、佣金订单、奖励流水 - ---- - -## 七、实施阶段(推荐顺序) - -### Phase 0:冻结与备份(1 天) - -- 备份全部 `feitian_`* 表 + `shopro_commission_*` 表 -- 暂停 feitian crontab(`[README.md` L49-52](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\README.md)) -- **不要**此时卸载插件 - -### Phase 1:Shopro 扩展骨架(3 天) - -- 新建 `addons/shopro_business/`(Feitian.php 同级模式)或 shopro 子目录 -- 注册 `order_payed_after` / `order_refund_after`(在 CommissionHook **之后**执行) -- 迁移核心 library:`ReferralReward`、`MakerReward`、`JiudaoguanReward`、`AgentReward`、`PoolService`、`MadaoService`、`YundouService`、`VoucherService`、`AreaResolver` -- 新建 agent_ext 表 + install.sql - -### Phase 2:启用 Shopro 分销(2 天) - -- 执行反向脚本:恢复 `commission_level`(建议 3 层或按脑图配置) -- 配置 V1-V6 等级(`[shopro/commission/level](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\commission\Level.php)) -- 品酒单商品开启分销参与(`shopro_commission_goods`) -- 数据迁移:maker → agent - -### Phase 3:后台改造(4 天) - -- **复用** Shopro 分销后台(代理商/等级/佣金/订单) -- 新增 Business 后台页: - - 并行角色管理(合伙人/酒道馆/区县代理标签) - - 分红管理、收入明细(从 feitian admin 迁入逻辑) - - 马豆充值、兑换商品/订单 -- 删除或废弃 `[application/admin/controller/feitian/](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\feitian) - -### Phase 4:小程序改造(4 天) - -- 个人中心入口改回 **分销中心** `[pages/app/commission/index](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\hlst_wx\pages\app\commission\index.vue) -- 并行角色标签显示在 commission 首页(读 agent_ext) -- 马豆/云豆/兑换券/兑换商城:保留 UI,API 改指向 `shopro_business` 或 shopro 扩展 controller -- 删除 `pages/app/feitian/`*、`FEITIAN_API_URL`、`apis.js` feitian 分组 -- 恢复 `[feitian-demo-patch-user.sql](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-demo-patch-user.sql) 中链接为 commission 路径 - -### Phase 5:切流验证(3 天) - -- 测试单:1398 品酒单 → 三单返佣 + 创客极差 + 角色标签奖励 + 资产 -- 退款回滚 -- 与生产 feitian 结算结果对比抽样 - -### Phase 6:卸载飞天 + 清理冗余(2 天) - -- 后台禁用/卸载 feitian 插件 -- 删除 `[addons/feitian/](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian) -- 删除 `application/admin/feitian/`、`public/assets/js/backend/feitian/` -- 移除 `application/command.php` 中 feitian 命令 -- 可选:DROP `feitian_*` 表(确认迁移完成后) -- 清理 Shopro 商品模板中「飞天分销设置」块(`[goods/add.html](f:\修改的项目\恒链数通(重庆)`科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\goods\goods\add.html)) - ---- - -## 八、风险与规避 - - -| 风险 | 规避 | -| --------------- | ----------------------------------------------------------- | -| 卸载后无结算 | Phase 5 验证通过前禁止卸载 | -| 双 Hook 重复发佣 | 切流时关闭 feitian hook,只留 business hook;Shopro 百分比佣金与固定金额奖励分工明确 | -| 历史 feitian 流水断层 | 资产/奖励表 rename 而非 drop;wallet 日志保留 | -| 小程序用户找不到入口 | 切流前更新 decorate + tabbar 一次到位 | -| 工期低估 | 固定金额+极差+区域逻辑仍需从 feitian **搬迁**而非重写,复用现有 library 代码 | - - ---- - -## 九、最终建议 - -你已选择 **完全 Shopro 改造**,方案可行且长期更统一,但请注意: - -1. **不是简单「打开 Shopro 分销开关」** — 脑图里大部分规则仍要自定义 Business 层 -2. **卸载飞天本身不带来能力** — 价值在于消除双轨、复用 Shopro 后台/小程序分销 UI -3. **最高性价比做法**:Business 扩展层 **直接迁移** 现有 feitian/library 代码(约 3000 行已验证逻辑),而非从零写 Shopro 插件 -4. **若 Phase 1-2 超过 1 周未稳定**,可回退:feitian 插件仍保留至 Phase 5 完成 - -**预估总工期:4~6 周**(1 人全职);其中 Shopro UI 复用节省约 1 周,但被迁移+清理+联调抵消。 \ No newline at end of file diff --git a/plan/shopro分销重构细化_260cd6c8.plan.md b/plan/shopro分销重构细化_260cd6c8.plan.md deleted file mode 100644 index 295c605..0000000 --- a/plan/shopro分销重构细化_260cd6c8.plan.md +++ /dev/null @@ -1,624 +0,0 @@ ---- -name: Shopro分销重构细化 -overview: 在原有 Shopro 分销重构方案基础上,补充商品级佣金能力审计(原生 vs 飞天补丁)、双轨合并设计,以及 Phase 6 飞天插件零残留卸载清单与切流验收步骤,确保卸载后 Shopro 分销正常、无重复/漏发佣。 -todos: - - id: p0-audit-goods - content: "Phase 0: 审计现有商品 enable_commission/team/rate 配置 + shopro_commission_goods 现状,输出品酒单/普通商品清单" - status: pending - - id: p0-backup-freeze - content: "Phase 0: 备份 feitian/commission 表,暂停 feitian cron,禁止提前卸载" - status: pending - - id: p1-maker-reward-fix - content: "Phase 1: 修正 MakerReward 平级/超越为 prevAmount×10%/5%;扩展升级统计 team_order_count(伞下品酒单)" - status: pending - - id: p1-business-skeleton - content: "Phase 1: 新建 shopro_business,迁移 GoodsRewardResolver + Reward/Pool/Asset library,注册 order hooks" - status: pending - - id: p2-agent-ext-schema - content: "Phase 1: shopro_commission_agent_ext 表 + 并行角色字段" - status: pending - - id: p2-enable-commission - content: "Phase 2: 恢复 commission_level,V1-V6 配置,品酒单 commission_goods.status=0,maker→agent 迁移" - status: pending - - id: p2-goods-ui-merge - content: "Phase 3: 商品页「业务分销设置」四字段 + 分销商品页 MLM 分工说明,防双发" - status: pending - - id: p3-admin-migrate - content: "Phase 3: shopro/commission 后台 + business 分红/资产/兑换/角色管理" - status: pending - - id: p4-frontend-switch - content: "Phase 4: 小程序切 commission 中心,迁移资产/兑换 API,清除 feitian 引用" - status: pending - - id: p5-parallel-test - content: "Phase 5: 1398 品酒单 + 普通商品 MLM + 退款全链路验收,对比 feitian 历史" - status: pending - - id: p6-uninstall-checklist - content: "Phase 6: 按零残留清单卸载 feitian(代码/cron/command/前端/grep 验收),表 rename 归档,保留 shopro_goods 业务列" - status: pending -isProject: false ---- - -# Shopro 分销重构方案(细化版) - -## 一、商品级分销能力审计(回答你的 3 个问题) - -当前系统存在 **两套商品分销配置**,且 **Shopro 原生分销已被关闭**([`feitian-disable-commission.sql`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-disable-commission.sql) 将 `commission_level=0`),实际结算走飞天 Hook。 - -```mermaid -flowchart LR - subgraph native [Shopro原生 当前关闭] - CG["shopro_commission_goods"] - LevelRules["V1-V6 × 一级/二级/三级 %或固定元"] - end - subgraph feitianPatch [飞天补丁 当前生效] - SG["shopro_goods 四字段"] - Resolver["GoodsRewardResolver"] - end - OrderPay --> FeitianHook - FeitianHook --> Resolver - Resolver --> SG - CommHook["Shopro CommissionHook"] -.->|"commission_level=0 不执行"| CG -``` - -### 1. Shopro 原生「分销商品」能否单独设比例? - -**能。** 入口:后台 → Shopro → 分销 → **分销商品**([`application/admin/view/shopro/commission/goods/edit.html`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\commission\goods\edit.html)) - -| 能力 | 字段/表 | 说明 | -|------|---------|------| -| 是否参与分销 | `shopro_commission_goods.status` | 0=不参与,1=参与 | -| 规则模式 | `self_rules` | 0=跟等级默认,1=独立(按规格),2=批量 | -| 各级佣金 | `commission_rules` JSON | 每个分销商等级 V1-V6 下:`commission_1` / `commission_2` / `commission_3`,支持 **% 或固定元** | -| 商品独立层级 | `commission_config.commission_level` | 可覆盖全局,设 1/2/3 级 | -| 是否计入业绩 | `commission_order_status` | 只分佣不计业绩 vs 计入 | - -逻辑类:[`addons/shopro/library/commission/Goods.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\Goods.php) - -### 2. 原生有没有「团队佣金比例」? - -**没有单独的 `team_commission_rate` 字段。** - -Shopro 用 **多级分销** 表达「团队」: -- **一级(自购)** = `commission_1` -- **二级** = `commission_2`(上级团队) -- **三级** = `commission_3`(上上级) - -这与飞天脑图的 **创客极差 120 元/单、酒道馆团队 50 元** 不是同一模型——后者是固定金额 + 极差,Shopro 默认是按订单金额 × 层级百分比。 - -### 3. 每个商品能否单独开关「分佣 / 团队分销」? - -#### 3.1 飞天补丁(当前生效,写在 `fa_shopro_goods`) - -入口:商品编辑 → **「飞天分销设置」**([`goods/add.html`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\goods\goods\add.html) / [`edit.html`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\goods\goods\edit.html) L594-635) - -| 字段 | UI 标签 | 用途(GoodsRewardResolver) | -|------|---------|----------------------------| -| `enable_commission` | 是否启用分佣 | 关闭则不算推荐奖/百分比佣金 | -| `commission_rate` | 分销佣金比例 % | >0 按实付×比例;=0 且开启则走全局固定 398/400/600 | -| `enable_team` | 是否启用团队分销 | 关闭则不算创客/酒道馆团队基数 | -| `team_commission_rate` | 团队佣金比例 % | >0 按实付×比例;=0 则用全局固定基数(120/50) | - -来源 SQL:[`feitian-patch-goods-reward.sql`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-patch-goods-reward.sql) - -#### 3.2 Shopro 原生实现(写入计划,迁移后需启用) - -Shopro **没有** `enable_team` / `team_commission_rate` 字段;用 **「是否参与」+ 分销层级 + 各级比例** 组合实现类似效果。 - ---- - -##### A. 数据表:`fa_shopro_commission_goods` - -```sql --- addons/shopro/install.sql -goods_id PK 关联 shopro_goods.id -status 0=不参与分销 1=参与分销 ← 【分佣总开关】 -self_rules 0=默认等级规则 1=独立(按规格) 2=批量 -commission_rules JSON 各等级×各层级的 rate/money -commission_config JSON 商品级覆盖全局分销设置 -commission_order_status 0=只分佣不计业绩 1=计入业绩 -``` - -**默认行为:** 商品若未写入该表,或 `status=0`,则 **不参与任何 Shopro 分佣**。 - -##### B. 后台操作路径 - -| 操作 | 入口 | 控制器/API | -|------|------|-----------| -| 分销商品列表 | Shopro → 分销 → **分销商品** | [`shopro/commission/goods/index`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\commission\goods\index.html) | -| 单商品佣金编辑 | 列表 → 编辑 | [`shopro/commission/goods/edit?id={goods_id}`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\commission\goods\edit.html) | -| 批量参与/不参与 | 列表勾选 → 批量设置 | `POST shopro/commission/goods/commission_status`([`Goods.php::commission_status()`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\commission\Goods.php) L170) | -| 全局分销层级 | Shopro → 分销 → **分销设置** | `fa_shopro_commission_config.name=commission_level`(0=关闭,1/2/3=层级) | - -**编辑页 UI 对应关系(edit.html L191-276):** - -``` -是否参与: status 0 不参与 / 1 参与 ← 等同 enable_commission(仅 Shopro MLM) -佣金规则: self_rules 默认 / 独立 / 批量 -分销商业绩: commission_order_status -分销层级: commission_config.commission_level 1级/2级/3级 ← 等同「团队分销深度」 -一级佣金: commission_rules[level][1].rate|money commission_1 -二级佣金: commission_rules[level][2].rate|money commission_2 ← 上级团队 -三级佣金: commission_rules[level][3].rate|money commission_3 ← 上上级团队 -``` - -##### C. 运行时结算链路 - -```mermaid -sequenceDiagram - participant Pay as order_payed_after - participant Hook as CommissionHook - participant Comm as Commission - participant G as Goods_library - participant DB as shopro_commission_goods - - Pay->>Hook: orderPayedAfter - Hook->>Comm: foreach order_item - Comm->>G: new Goods(goods_id, sku_price_id) - G->>DB: WHERE goods_id AND status=1 - alt status=0 或无记录 - G-->>Comm: getCommissionRules=false - Comm-->>Hook: checkAndSetCommission=false 跳过 - else status=1 - G-->>Comm: 加载 commission_rules - Comm->>Comm: commissionLevel=config或商品覆盖 - alt commission_level=0 全局关闭 - Comm-->>Hook: return false - else - Comm->>Comm: runCommissionPlan 递归上级 - Note over Comm: level1→自购/直推
level2→二级上级
level3→三级上级 - end - end -``` - -**关键代码:** - -1. [`CommissionHook.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\listener\commission\CommissionHook.php) L43-54:逐 `order_item` 调用 `Commission::checkAndSetCommission()` -2. [`Commission.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\Commission.php) L47-73: - - L55 加载 `Goods` 规则 - - L58-60 商品 `commission_config` 覆盖全局(含 `commission_level`) - - L66-68 `commission_level=0` → 整站分销关闭,所有商品不分 - - L71-73 `getCommissionRules()` 为空 → **该商品不分佣** -3. [`Goods.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\Goods.php) L37:`where(['goods_id'=>$goodsId, 'status'=>GOODS_COMMISSION_STATUS_ON])` -4. [`Commission.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\Commission.php) L158-217:`runCommissionPlan` 按 `commission_level` 递归 `parent_agent_id`,每层读 `getCommissionLevelRule(agentLevel, currentLevel)` - -##### D. 原生如何实现「分佣开关」 - -| 目标 | 原生做法 | 字段/配置 | -|------|----------|-----------| -| 该商品完全不参与 Shopro 分佣 | 分销商品编辑 → **不参与** | `shopro_commission_goods.status=0` | -| 整站关闭分销 | 分销设置 → 分销层级=0 | `shopro_commission_config.commission_level=0`(当前已被 feitian-disable-commission.sql 设为 0) | -| 批量关闭多商品 | 分销商品列表批量操作 | `commission_status` API 批量 `status=0` | -| 无记录的商品 | 默认不参与 | 需手动加入分销商品并设 status=1 | - -**≠ 飞天 `enable_commission`:** 后者控制的是 Business 层(三单返佣/固定奖),与 Shopro `status` 是 **两个独立开关**(见第二节防双发表)。 - -##### E. 原生如何实现「团队分销开关/比例」 - -Shopro **没有** `enable_team` 布尔开关,用以下组合等效: - -| 目标 | 原生做法 | 说明 | -|------|----------|------| -| 只做直推,不做团队(二级以上) | 商品独立设置 → **分销层级=一级** | `commission_config.commission_level=1`,只跑 level 1 | -| 关闭某商品全部团队奖 | 同上,或 commission_2/3 全填 0 | 二级/三级比例为 0 则不产生上级佣金 | -| 单独设团队比例 | 编辑 **二级/三级佣金比例** | `commission_rules[Vx][2].rate` / `[3].rate`,支持 % 或固定元 | -| 跟全局团队策略 | self_rules=0 + status=1 | 读 `shopro_commission_level.commission_rules` 里的 commission_2/3 | - -**commission_rules JSON 结构示例(批量规则 self_rules=2):** - -```json -{ - "1": { - "1": { "rate": "10" }, - "2": { "rate": "5" }, - "3": { "rate": "2" } - }, - "2": { - "1": { "rate": "12" }, - "2": { "money": "30" }, - "3": { "rate": "0" } - } -} -``` - -- 键 `"1"`~`"6"` = 分销商等级 V1-V6 -- 子键 `"1"`/`"2"`/`"3"` = 一级/二级/三级(团队)分佣层级 -- `rate` = 百分比;`money` = 每件固定元([`Goods::caculateGoodsCommission`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\Goods.php) L94-104) - -**与飞天 `team_commission_rate` 的本质差异:** - -| 维度 | Shopro 原生(commission_2/3) | 飞天补丁(team_commission_rate) | -|------|------------------------------|----------------------------------| -| 模型 | 标准 MLM:按上级层级 × 等级规则 | 固定基数/比例:创客 120、酒道馆 50 | -| 开关 | 无独立字段,靠层级深度 + 比例为 0 | `enable_team` 布尔开关 | -| 结算类 | `Commission::runCommissionPlan` | `GoodsRewardResolver::sumMakerTeamBase` | -| 适用 | 普通商品层级分销 | 1398 品酒单极差/团队奖 | - -##### F. 两套开关对照表(迁移后并存) - -| 业务含义 | Shopro 原生配置 | Business 层配置(原飞天字段) | -|----------|-----------------|------------------------------| -| 是否参与 Shopro MLM | `commission_goods.status` | — | -| 是否参与三单返佣/固定奖 | — | `enable_commission` | -| 商品级 MLM 比例 | `commission_rules[level][n].rate` | — | -| 商品级推荐奖比例 | — | `commission_rate` | -| 是否参与创客/酒道馆团队奖 | — | `enable_team` | -| 商品级团队基数比例 | — | `team_commission_rate` | -| MLM 团队(二级/三级) | `commission_level` + `commission_2/3` | — | - -**结论:** -- 你问的 3 点中,**飞天补丁四字段已全部实现** Business 侧能力 -- **Shopro 原生可实现「分佣开关」**(`status`)和 **「团队分销深度/比例」**(`commission_level` + `commission_2/3`),但 **不能** 直接表达飞天脑图的固定极差团队奖 — 后者必须保留 Business 层 `enable_team` / `team_commission_rate` - ---- - -## 二、创客(团长)逻辑核对(脑图 vs 现有代码) - -对照脑图与 [`MakerReward.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\MakerReward.php)、[`RoleService.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\RoleService.php) 逐项核对。**创客奖励不能交给 Shopro 原生 MLM**,必须在 `shopro_business` 层完整迁移。 - -### 2.1 升级条件(品酒师 → 创客 V1) - -**脑图要求:** -- 直推 **3 单**,或 -- 伞下 **1 单** / 推荐人有下单行为 -- **总计考核 4 单** - -**现有代码(`RoleService::tryUpgradeMaker` L89-93):** - -```php -$canUpgrade = ($direct >= 3) || ($self >= 1 && ($direct + $self) >= 4); -// direct = 直推品酒单数,self = 自购品酒单数 -``` - -| 核对项 | 脑图 | 代码 | 结论 | -|--------|------|------|------| -| 直推 3 单升级 | ✓ | `direct_order_count >= 3` | **一致** | -| 合计 4 单考核 | ✓ | `direct + self >= 4` 且需 `self >= 1` | **部分一致** | -| 伞下 1 单(非直推团队单) | ✓ | **未实现**,只计直推+自购 | **缺口** | -| 推荐人有下单行为 | ✓ | 等价为「自购≥1」或直推累计 | **近似** | -| 自动升到 V2–V6 | 后台灵活配置 | **仅自动 V1**;V2–V6 靠后台手动/测试预置 | **缺口**(见 ACCEPTANCE-SIGNOFF.md L85) | - -**Shopro 迁移方案:** -- 创客 = `shopro_commission_agent` + `level=1`(首次达标) -- 升级计数写入 `shopro_commission_agent_ext`(`direct_order_count` / `self_order_count` / **`team_order_count`**) -- **已确认:** 伞下任意层级品酒单计入 4 单考核(见 §2.4) - -### 2.2 等级体系 V1–V6 - -**脑图:** 6 级,不同权益,**后台灵活设置**。 - -**现有代码:** - -| 配置源 | 内容 | -|--------|------| -| [`default.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\config\default.php) L26-33 | V1=10% … V6=60%(占基数比例) | -| `fa_feitian_role_config` | 后台「创客等级」可改每级 `rate` | -| `feitian_user_role.maker_level` | 用户当前 V1–V6 | - -**Shopro 映射:** `shopro_commission_agent.level` 1–6 对应 V1–V6;等级比例仍在 Business 配置(Shopro 的 `commission_level.commission_rules` 是 MLM 一二三级,**不是**创客极差比例)。 - -### 2.3 团队新增业绩 — 级差奖(基数 120 元/单) - -**脑图:** 每单团队基数 **120 元**,按等级拿 **级差**。 - -**现有代码流程:** - -```mermaid -flowchart TD - Order[品酒单支付] --> Lines[GoodsRewardResolver 解析商品行] - Lines --> Base["基数 base = sumMakerTeamBase()
默认120/行 或 team_commission_rate×实付"] - Base --> Chain["ChainResolver.getMakerChain()
推荐链上仅保留创客"] - Chain --> Loop["逐层遍历 近→远"] - Loop --> First{"链上第一个创客?"} - First -->|是| Full["amount = base × makerRate(level)"] - First -->|否| Cmp{"与上一层级比较"} - Cmp -->|level更高| Diff["amount = base × (rate- prevRate) 级差"] - Cmp -->|level相同| Equal["amount = base × 10% 平级"] - Cmp -->|level更低| Over["amount = base × 5% 超越"] -``` - -**级差计算(与脑图一致,S07/S09 验收通过):** - -- 近端第一个创客:拿 **本级全额比例 × base**(如 V1=12 元) -- 远端更高级创客:拿 **(高级比例 − 已发比例) × base**(极差) -- 默认基数 120,可被商品 `team_commission_rate` 或 `enable_team=0` 覆盖 - -**示例(base=120,链 V1→V3→V5→V6):** - -| 创客 | 计算 | 金额 | -|------|------|------| -| V1(近端) | 120×10% | 12 | -| V3 | 120×(30%−10%) | 24 | -| V5 | 120×(50%−30%) | 24 | -| V6 | 120×(60%−50%) | 12 | - -### 2.4 平级奖 / 超越奖 — 与脑图存在差异(重要) - -**脑图原文:** -- **平级奖:** 下级与上级**同级**时,上级拿下级**佣金的 10%**(例:下级 V5 拿 100 → 上级 10;V6 拿 120 → 上级 12) -- **超越奖:** 下级**超越**上级等级时,上级拿 **5%**(应为下级佣金的比例) - -**现有代码(`MakerReward.php` L79-87):** - -```php -// 平级:base × 10%,不是 下级本单佣金 × 10% -} elseif ($level === $prevLevel) { - $amount = round($base * $equalRate, 2); // 固定 120×10%=12 元 - -// 被超越:base × 5% -} else { - $amount = round($base * $overRate, 2); // 固定 120×5%=6 元 -} -``` - -| 场景 | 脑图算法 | 现有代码 | 差异 | -|------|----------|----------|------| -| 平级两 V3(下级本单 36 元) | 上级 = 36×10% = **3.6** | 上级 = 120×10% = **12** | **不一致** | -| 平级 V5(下级本单 60 元) | 上级 = 60×10% = **6** | 上级 = **12** | **不一致** | -| 被超越(下级等级更高已在级差分支处理;更低等级上级) | 下级佣金×5% | base×5% = **6** | **可能不一致** | - -**结论:** **级差奖已对齐脑图**;**平级奖/超越奖当前按「基数×固定比例」实现,与脑图「下级佣金×比例」不符**。 - -**已确认(迁移采用):** -- **平级奖** = 上一层创客**本单已发金额** × `maker_equal_rate`(10%) -- **超越奖** = 上一层创客**本单已发金额** × `maker_over_rate`(5%) -- 修正后 S08 预期:近端 V3 得 36,远端同级 V3 得 **3.6**(非现码 12) - -**升级条件扩展(已确认):** -- 除「直推 3 单」外,**伞下任意层级品酒单**也计入 4 单考核 -- 新增 `team_order_count`(或递归统计下级有效品酒单),满足:直推≥3 **或** (自购≥1 且 直推+自购+伞下≥4) - -### 2.5 推荐链与并行角色 - -- 创客链:[`ChainResolver::getMakerChain`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\ChainResolver.php) 沿 `user.parent_user_id` 向上,**只保留有 maker 角色的节点**(中间纯品酒师/合伙人跳过) -- 与酒道馆/区县代理 **并行结算**(`RewardEngine` 同单多次调用),互不替代 -- 商品需 `enable_team=1` 才计入创客基数([`GoodsRewardResolver::hasTeamLines`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\GoodsRewardResolver.php)) - -### 2.6 Shopro 重构必须保留的创客模块 - -| 模块 | 文件/表 | 迁移到 shopro_business | -|------|---------|------------------------| -| 升级判定 | `RoleService::tryUpgradeMaker` | `AgentUpgradeService` | -| 级差/平级/超越 | `MakerReward::settle` | 同逻辑,**建议修正平级/超越** | -| 基数解析 | `GoodsRewardResolver::sumMakerTeamBase` | 保留,读 `enable_team` / `team_commission_rate` | -| 等级比例 | `Config::makerRate` + `feitian_role_config` | → `shopro_business_role_config` 或 agent_level 扩展字段 | -| 创客链 | `ChainResolver::getMakerChain` | 改读 `shopro_commission_agent` + level | -| 后台配置 | feitian/role_config | → business 后台或 shopro 等级页扩展 | - -**不可交给 Shopro CommissionHook 的部分:** 级差、平级 10%、超越 5%、120 元固定基数 — Shopro 只有 commission_1/2/3 百分比 MLM,**语义不同**。 - ---- - -## 三、迁移后商品配置统一设计 - -目标:**一套后台 UI,两套引擎分工,不重复发佣**。 - -| 奖励类型 | 负责引擎 | 商品配置来源 | -|----------|----------|--------------| -| 标准 MLM 层级佣金(V1-V6 × 1/2/3 级) | Shopro `CommissionHook` | `shopro_commission_goods` | -| 三单固定返佣 398/400/600 | `shopro_business` ReferralReward | `enable_commission` + `commission_rate=0` | -| 商品级百分比推荐奖 | `shopro_business` 或 Shopro(二选一,见下) | `commission_rate>0` | -| 创客/酒道馆团队基数 | `shopro_business` Maker/JdgReward | `enable_team` + `team_commission_rate` | -| 品酒单识别 | `shopro_business` OrderQualify | `is_feitian_order`(迁移后 rename → `is_business_order`) | - -**防双发策略(关键):** -- 1398 品酒单 + 固定返佣/极差/区域奖 → **Shopro 对该类商品 `commission_goods.status=0` 或 commission_1/2/3 全为 0** -- 仅对需要标准 MLM 的普通商品开启 `shopro_commission_goods` -- `shopro_business` Hook 在 `CommissionHook` **之后**执行,且读取 `SettleContext` 幂等锁 - -**商品 UI 改造(Phase 3):** -- **Shopro 原生入口**(MLM):分销 → 分销商品 → 编辑(`status` / `commission_level` / `commission_1~3`),见 **§1.3.2 B** -- **Business 入口**(固定奖/极差):商品编辑 →「业务分销设置」(`enable_commission` / `enable_team` / 两个 rate),由原「飞天分销设置」改名 -- 后台增加联动说明:品酒单 → Business 四字段 + `commission_goods.status=0`;普通 MLM 商品 → 分销商品页配置 - -**数据迁移脚本(新增):** -- 现有 `enable_commission/enable_team/commission_rate/team_commission_rate` **保留列,仅 rename 注释** -- 为已标记 `is_feitian_order=1` 的商品批量写入 `shopro_commission_goods.status=0`(避免恢复 commission 后双发) - ---- - -## 四、切流顺序(确保 Shopro 分销不受影响) - -```mermaid -sequenceDiagram - participant Admin - participant ShoproComm as Shopro_CommissionHook - participant Business as shopro_business_Hook - participant Feitian as feitian_Hook - - Note over Admin: Phase5前:仅 Feitian 生效 - Admin->>Feitian: order_payed_after - - Note over Admin: Phase5并行:Business+Feitian 二选一 - Admin->>Business: 启用 business hook - Admin->>Feitian: disable 插件(不删文件) - - Note over Admin: Phase5通过后 - Admin->>Admin: 执行 enable-commission.sql - Admin->>ShoproComm: commission_level=3 - Admin->>Business: 仅处理固定/极差/资产 - - Note over Admin: Phase6:卸载飞天 - Admin->>Feitian: 删除代码+清理残留 -``` - -### 切流检查清单 - -1. **恢复 Shopro 分销前**:确认 `shopro_business` Hook 已接好且 feitian Hook 已 disable -2. 执行 `enable-commission.sql`(反向脚本):`commission_level` 恢复为 3(或业务要求值) -3. 配置 V1-V6 等级默认规则([`shopro/commission/level`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\commission\Level.php)) -4. 品酒单商品:`shopro_commission_goods.status=0` -5. 下测试单验证:**commission_order + business_settle_log 各一条,金额不重复** -6. 退款:`order_refund_after` 两边均 rollback - ---- - -## 五、Phase 6 飞天卸载 — 零残留清单 - -**原则:** 先验证 `shopro_business` 全功能 → 再卸载 → 逐项 grep 验收。**禁止** Phase 0-5 完成前卸载。 - -### 4.1 插件与 Hook - -| 步骤 | 路径/操作 | 验证 | -|------|-----------|------| -| 后台禁用插件 | 插件管理 → feitian → 禁用 | `hooks.php` 不再注册 | -| 卸载插件 | 卸载(仅删菜单) | `fa_auth_rule` 无 `feitian%` | -| 删除插件目录 | [`addons/feitian/`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian) 整目录 | — | -| 确认无 Hook 残留 | grep `feitian` in `addons/shopro/hooks.php`、根目录 hooks | 0 匹配 | - -[`Feitian.php::uninstall()`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\Feitian.php) **仅删菜单**,不删表/不删代码 — 必须手动清理下列全部项。 - -### 4.2 后台 PHP / 视图 / JS(整目录删除) - -- [`application/admin/controller/feitian/`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\feitian)(9 控制器) -- [`application/admin/model/feitian/`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\model\feitian) -- [`application/admin/view/feitian/`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\feitian) -- [`public/assets/js/backend/feitian/`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\public\assets\js\backend\feitian) - -### 4.3 CLI / Cron - -[`application/command.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\command.php) 删除 5 行: - -- `AcceptanceTest`, `YundouSettle`, `VoucherRelease`, `DividendCycle`, `PoolDistribute` - -Crontab 删除([`addons/feitian/scripts/cron-daily.sh`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\scripts\cron-daily.sh)): - -- `feitian:yundou_settle` -- `feitian:voucher_release` -- `feitian:dividend_cycle` -- `feitian:pool_distribute` - -**迁移到** `shopro_business:*` 命令后再删旧 cron。 - -### 4.4 数据库(21 张 feitian 表) - -来自 [`addons/feitian/install.sql`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\install.sql): - -`feitian_user_role`, `maker_upgrade_log`, `role_config`, `referral_order`, `madao_account/log`, `yundou_account/log`, `voucher_account/release_plan/log`, `reward_log`, `pool`, `pool_distribute`, `green_pool`, `dividend_cycle`, `settle_log`, `exchange_goods/order`, `cron_log`, `config` - -**处理策略:** -- **Phase 1-5:** 表保留,business 层可读旧数据 -- **Phase 6 确认迁移后:** `RENAME TABLE fa_feitian_* TO fa_shopro_business_*`(保留历史)或归档后 DROP -- **禁止**在 business 未接管前 DROP - -### 4.5 Shopro 表补丁字段(谨慎处理) - -| 字段 | 来源 SQL | Phase 6 处理 | -|------|----------|--------------| -| `shopro_goods.is_feitian_order` | feitian-patch-goods.sql | rename → `is_business_order`(business 继续用) | -| `enable_commission/enable_team/commission_rate/team_commission_rate` | feitian-patch-goods-reward.sql | **保留**,business 继续读;仅 UI 改名 | -| `shopro_store.store_type` 等 | feitian-patch-store.sql | 若 business 用则保留 | - -**不要 DROP 上述列** — 它们是业务规则所需,只是来源是飞天补丁。 - -### 4.6 Wallet 日志类型 - -[`Feitian.php::registerWalletLogTypes()`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\Feitian.php) 注册了 `ft_agent_nat_div` 等 4 种类型 → **迁移到 `shopro_business` 的 appInit**,否则历史流水显示异常。 - -### 4.7 小程序前端(hlst_wx) - -**删除:** -- [`pages/app/feitian/`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\app\feitian) 整目录(9 页 + 7 组件) -- [`common/feitian-constants.js`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\common\feitian-constants.js)、[`feitian-assets.js`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\common\feitian-assets.js) -- `pages.json` 中 feitian 分包路由 -- `env.js` 中 `FEITIAN_API_URL` -- API 定义中 `feitian.*` 分组 - -**改引用(至少 6 处):** -- [`pages/index/user.vue`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\index\user.vue) L102-103 → commission 路径 -- [`pages/index/user/userinfo-card.vue`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\index\user\userinfo-card.vue) → commission 角色 badge -- [`pages/index/components/sh-wallet.vue`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\index\components\sh-wallet.vue) -- [`pages/index/components/sh-grid-swiper.vue`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\index\components\sh-grid-swiper.vue) -- [`pages/index/index/home-head.vue`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\index\index\home-head.vue) -- 装修 JSON / demo SQL 中 `/pages/app/feitian/*` 链接 - -**保留并迁移 UI:** 马豆/云豆/兑换券/兑换商城 → 挂到 `pages/app/commission/` 子页或 business 分包,API 改 `shopro_business.*` - -### 4.8 Seed / 文档 / 杂项 - -- [`database/seed/feitian-*.sql`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed) — 归档到 `database/seed/archive/`,避免误执行 disable-commission -- [`database/seed/install-feitian-menu.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\install-feitian-menu.php) — 删除 -- 商品模板移除「飞天」字样,改为「业务分销设置」 - -### 4.9 卸载后验收 grep(必须 0 结果) - -```bash -# 后端 -rg -i feitian application/ addons/ public/assets/js/backend/ application/command.php - -# 前端 -rg -i feitian pages/ common/ pages.json env.js - -# 运行时 -curl /addons/feitian/index → 404 -php think feitian:dividend_cycle → 命令不存在 -下测试单 → shopro_commission_order 有记录(若商品参与) -下 1398 单 → business settle 有记录,无 feitian settle -``` - -### 4.10 卸载后 Shopro 分销保障 - -| 检查项 | 期望 | -|--------|------| -| `shopro_commission_config.commission_level` | > 0 | -| `CommissionHook` 注册 | shopro hooks 正常 | -| 分销商品 status | 普通商品=1,品酒单=0 | -| 无 feitian Hook | 不重复结算 | -| 钱包流水 | commission_reward + business 类型均正常 | - ---- - -## 六、实施阶段(更新) - -### Phase 0:冻结与备份(1 天) -- 备份全部 `feitian_*` + `shopro_commission_*` + `shopro_goods` 相关列 -- 暂停 feitian crontab -- **禁止卸载** - -### Phase 1:shopro_business 骨架(3 天) -- 新建 `addons/shopro_business/`,迁移 library(含 `GoodsRewardResolver`) -- `shopro_commission_agent_ext` 表 -- order hooks(CommissionHook 之后) -- CLI 命令 `shopro_business:*` - -### Phase 2:启用 Shopro 分销 + 商品策略(2 天) -- `enable-commission.sql` -- V1-V6 等级配置 -- **品酒单** `commission_goods.status=0`;**普通商品**按需开启 -- maker → agent 数据迁移 - -### Phase 3:后台(4 天) -- 复用 shopro/commission 后台 -- 商品页:「业务分销设置」四字段 + 分销商品页 MLM 配置 -- business 管理页(角色标签/分红/资产/兑换) - -### Phase 4:小程序(4 天) -- 切回 [`pages/app/commission/*`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\app\commission) -- 资产/兑换 API → shopro_business -- 清除 feitian 引用 - -### Phase 5:切流验证(3 天) -- 1398 品酒单:三单返佣 + 极差 + 标签奖 + 资产 -- 普通商品:Shopro MLM 佣金 -- 退款双 rollback -- 与 feitian 历史抽样对比 - -### Phase 6:卸载 + 零残留(2 天) -- 按 **第四节清单** 逐项执行 -- grep 验收 + 测试单复验 -- 表 rename 归档(非直接 DROP) - ---- - -## 七、风险补充 - -| 风险 | 规避 | -|------|------| -| 卸载后 Shopro 分销仍关闭 | Phase 2 必须执行 enable-commission,Phase 6 前复验 | -| 品酒单双发(Shopro%+固定奖) | 品酒单 `commission_goods.status=0` | -| 商品四字段被误删 | Phase 6 只删 feitian 代码,**保留 shopro_goods 列** | -| 团队奖丢失 | `enable_team`/`team_commission_rate` 由 business 继承,不走 Shopro commission_2 | -| 创客平级/超越算法与脑图不符 | **已确认按脑图修正**:平级/超越 = 上一层本单佣金 × 10%/5% | -| 创客升级缺伞下统计 | **已确认扩展** `team_order_count`,伞下品酒单计入 4 单考核 | -| cron 断档 | business cron 上线后再删 feitian cron | - -**预估工期不变:4~6 周**(1 人全职) diff --git a/plan/taro_小程序对齐方案_b61be661.plan.md b/plan/taro_小程序对齐方案_b61be661.plan.md deleted file mode 100644 index 113dec4..0000000 --- a/plan/taro_小程序对齐方案_b61be661.plan.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -name: Taro 小程序对齐方案 -overview: 推荐使用 **Taro 4 + React + TypeScript** 重构微信小程序,通过 monorepo 与现有 React H5 共享页面逻辑、API、类型和设计令牌,实现「改一处、两边同步」,界面可达 ~90% 一致。不推荐继续维护当前原生 WXML 小程序或改用 uni-app(需从 React 重写为 Vue)。 -todos: - - id: setup-monorepo - content: 搭建 pnpm/npm workspace monorepo,初始化 Taro 4 + React + TS 项目于 apps/weapp/ - status: completed - - id: extract-shared - content: 抽取 packages/shared(types、api-client、vip 逻辑、storage 抽象、设计令牌) - status: completed - - id: build-ui-icons - content: 建立 packages/icons(Lucide 统一)和 packages/ui(Button/Card/TabBar/TopNavBar 跨端组件) - status: completed - - id: pilot-idiom - content: 迁移成语模块 5 页 + 自定义 BottomTabBar 作为 POC 验收 - status: completed - - id: migrate-plaza-profile - content: 迁移 PlazaPage 与个人中心相关页面 - status: completed - - id: migrate-modules - content: 迁移行测/打印/资料/大神练/分销等剩余业务模块 - status: completed - - id: wechat-native - content: 接入 wx.login、微信支付、分享,API 对接 Express 后端 - status: completed - - id: deprecate-native - content: 废弃 miniprogram/ 原生代码,更新启动教程与部署流程 - status: completed -isProject: false ---- - -# React H5 与微信小程序统一方案(Taro 4) - -## 现状诊断:为什么差别这么大 - -当前仓库是 **两套完全独立的实现**,不存在编译关系: - -| 维度 | React H5 ([`src/`](f:\source_code\new_renmrb\src)) | 原生小程序 ([`miniprogram/`](f:\source_code\new_renmrb\miniprogram)) | -|------|------|------| -| 语言 | TypeScript + React 19 | JavaScript + WXML/WXSS | -| 图标 | `lucide-react` SVG(Home, BookOpen, PenTool…) | Emoji(📖 ✍️ 📝)+ PNG Tab 图标 | -| 样式 | Tailwind v4 + shadcn/ui + CSS 变量 | 手写 WXSS | -| 导航 | 自定义 [`BottomTabBar.tsx`](f:\source_code\new_renmrb\src\components\BottomTabBar.tsx)(成语模块 5 Tab) | 原生 `tabBar`(广场 5 Tab:首页/行测/打印/资料/我的) | -| 数据 | [`src/lib/api.ts`](f:\source_code\new_renmrb\src\lib\api.ts) + Express API | [`mockData.js`](f:\source_code\new_renmrb\miniprogram\utils\mockData.js) 本地 mock | - -**结论**:没有任何语言/工具能「一键编译」现有 React + Tailwind + shadcn + lucide 为 100% 一致的小程序。要实现代码共用,必须引入 **跨端 React 框架**,并做一层 UI 适配。 - ---- - -## 技术选型对比 - -```mermaid -flowchart TD - subgraph options [可选方案] - Taro["Taro 4 + React\n推荐"] - UniApp["uni-app + Vue\n需重写"] - WebView["web-view 嵌 H5\n100% UI 但不共用代码"] - Native["继续原生 WXML\n手工同步"] - Remax["Remax\n维护弱"] - end - - ReactH5["现有 React H5"] --> Taro - ReactH5 -.->|"无法直接编译"| Native - ReactH5 -->|"仅视觉一致"| WebView - ReactH5 -->|"语法不兼容"| UniApp - - Taro --> WeApp["微信小程序"] - Taro --> H5Out["同构 H5 可选"] -``` - -| 方案 | 能否共用 React 代码 | 界面一致度 | 适合你的需求 | -|------|-------------------|-----------|-------------| -| **Taro 4 + React** | 高(页面/逻辑/类型/API 可共享) | ~85–90% | **最佳** | -| uni-app | 低(Vue 语法,需全量重写) | 可达 90% | 不推荐 | -| web-view 嵌 H5 | 无(只是壳) | 100% | 不符合「共用代码」 | -| 继续原生 WXML | 无 | 需手工对齐 | 长期双份维护 | -| Remax | 中 | ~80% | 社区活跃度低于 Taro | - -**推荐:Taro 4 + React + TypeScript + Tailwind(weapp 插件)** - ---- - -## 目标架构 - -```mermaid -flowchart TB - subgraph monorepo [Monorepo 结构] - Shared["packages/shared\n类型 / API / 业务逻辑 / 设计令牌"] - Icons["packages/icons\nLucide SVG 统一图标"] - UI["packages/ui\n跨端基础组件 Button Card TabBar"] - H5App["apps/h5\n现有 Vite React 应用"] - WeApp["apps/weapp\nTaro 微信小程序"] - end - - Shared --> H5App - Shared --> WeApp - Icons --> H5App - Icons --> WeApp - UI --> H5App - UI --> WeApp - - WeApp --> WX["微信开发者工具"] - H5App --> Browser["浏览器 H5"] - Shared --> Server["Express API\nserver/index.ts"] - WeApp --> Server -``` - -### 共享层(改一处两边生效) - -从现有代码抽取到 `packages/shared/`: - -- **类型定义**:`IUserData`、`IFavoriteItem` 等(已在 AGENTS.md 定义) -- **API 客户端**:基于 `Taro.request` / `fetch` 的统一 HTTP 层,对接 [`server/index.ts`](f:\source_code\new_renmrb\server\index.ts) 真实接口(替换 H5 的 `adminDb` mock 和小程序的 `mockData.js`) -- **业务逻辑**:[`src/lib/vip.ts`](f:\source_code\new_renmrb\src\lib\vip.ts) 会员/试看/学习统计 -- **设计令牌**:从 [`src/tailwind-theme.css`](f:\source_code\new_renmrb\src\tailwind-theme.css) 导出 CSS 变量(人民日报红 `#C8102E`、米白 `#F7F3ED`) -- **路由常量**:H5 路径与 Taro 页面路径映射表 - -### 平台适配层(各端少量差异) - -| H5 专用(不迁入小程序) | 小程序专用 | -|------------------------|-----------| -| `PhoneFrame.tsx` 手机外框 | `wx.login` / 微信支付 | -| Admin 后台 40+ 页 | `onShareAppMessage` 分享 | -| `@lark-apaas/client-toolkit-lite` | `Taro.getStorageSync` | -| `framer-motion` 复杂动效 | CSS transition 简化版 | - ---- - -## 关键兼容性与解决策略 - -### 1. 图标统一(解决「图标不匹配」) - -- 建立 [`packages/icons`](f:\source_code\new_renmrb):`lucide-react` 图标导出为 SVG 字符串 -- H5:继续用 `lucide-react` -- 小程序:Taro 内渲染 `` 或 inline SVG 组件 -- TabBar:用 **自定义 TabBar 组件**(与 H5 [`BottomTabBar.tsx`](f:\source_code\new_renmrb\src\components\BottomTabBar.tsx) 同结构),替代原生 PNG `tabBar`,保证 lucide 图标一致 - -### 2. Tailwind 样式 - -- H5:保持 Tailwind v4 -- 小程序:Taro + `weapp-tailwindcss` 或 `@tarojs/plugin-html` + postcss,复用同一套 utility class -- 设计变量从 `tailwind-theme.css` 双端引用 - -### 3. shadcn / Radix 组件 - -- **不能直接使用**(依赖 DOM/Radix Portal) -- 方案:在 `packages/ui/` 重建轻量版 Button、Card、Dialog、Tabs,API 尽量与 shadcn 一致 -- 复杂组件(Dialog/Sheet)可用 **Taroify** 或 **NutUI-Taro** 做底座,外层套项目 design token - -### 4. 路由映射(全平台 26+ 页) - -H5 `react-router` 路由 → Taro `app.config.ts` pages: - -| H5 路由 | Taro 页面 | 说明 | -|---------|----------|------| -| `/` | `pages/plaza/index` | 广场首页 | -| `/idiom` | `pages/idiom/home/index` | 成语首页 | -| `/idiom/sentences` | `pages/idiom/sentences/index` | 每日金句 | -| `/idiom/practice` | `pages/idiom/practice/index` | 精炼练习 | -| `/idiom/dictation` | `pages/idiom/dictation/index` | 成语默写 | -| `/xingce/*` | `pages/xingce/*` | 行测模块 | -| `/print/*` | `pages/print/*` | 打印模块 | -| `/ziliao/*` | `pages/ziliao/*` | 资料模块 | -| `/mingshi/*` | `pages/mingshi/*` | 大神练模块 | -| `/profile/*` | `pages/profile/*` | 个人中心 | -| `/admin/*` | **仅 H5** | 后台不进小程序 | - -成语模块 TabBar 逻辑复刻 H5:首页 / 金句 / 精炼 / 默写 / 我的(非原生 tabBar 的 5 模块 Tab)。 - ---- - -## 分阶段实施计划 - -### 阶段 0:脚手架(1–2 天) - -- 根目录改为 npm/pnpm workspace monorepo -- `npx @tarojs/cli init apps/weapp` 创建 Taro 4 + React + TS 项目 -- 配置 Tailwind、路径别名 `@/`、共享包引用 -- 保留现有 H5 在 `apps/h5/`(或暂留根目录 `src/`,逐步迁移) - -### 阶段 1:共享基础设施(2–3 天) - -- 抽取 `packages/shared`:types、api-client、vip、constants -- 实现 `storage` 抽象:`createStorage({ platform: 'h5' | 'weapp' })` -- 图标包 `packages/icons`:从 lucide 导出 TabBar 所需的 Home/BookOpen/PenTool/Pencil/User 等 -- UI 基座 `packages/ui`:Button、Card、TabBar、TopNavBar(对齐 H5 视觉) - -### 阶段 2:成语模块试点(3–5 天) - -优先迁移与 AGENTS.md 对齐的核心页,验证共用代码可行性: - -- `HomePage` → 成语首页 -- `GoldenSentencesPage` → 金句列表 -- `PracticePage` → 练习 -- `DictationPage` → 默写 -- `MembershipPage` → 会员 -- 自定义 BottomTabBar + IdiomLayout - -**验收标准**:成语模块 H5 与小程序截图对比 ≥90% 一致,图标全部为 lucide 风格。 - -### 阶段 3:广场 + 个人中心(2–3 天) - -- `PlazaPage` → 广场首页(模块网格、学习数据条) -- `ProfilePage` + 子页(收藏、错题、设置等) -- 广场级 TabBar(若 H5 有模块切换逻辑) - -### 阶段 4:其余业务模块(5–7 天) - -- 行测 `/xingce` -- 打印 `/print` -- 资料 `/ziliao` -- 跟着大神练 `/mingshi` -- 分销 `/distribution`、分享页 - -### 阶段 5:微信能力 + 下线旧小程序(2–3 天) - -- 对接 `wx.login`、微信支付、分享卡片 -- API 全部指向 Express 后端([`启动教程.md`](f:\source_code\new_renmrb\启动教程.md) 第四节) -- 废弃 [`miniprogram/`](f:\source_code\new_renmrb\miniprogram) 原生代码,改为 `apps/weapp/dist` 上传 - ---- - -## 预期效果与局限 - -**能做到:** -- 页面结构、文案、配色、图标风格与 H5 高度一致 -- 业务逻辑、API、类型单份维护 -- 新功能开发一次,编译到 H5 + 微信小程序 - -**~10% 差异(可接受):** -- `framer-motion` 弹簧动效 → CSS 简化过渡 -- Radix Dialog 焦点陷阱 → Taroify 弹层行为略有不同 -- H5 的 `PhoneFrame` 外框在真机小程序中不存在 -- 部分 Web 专属 API(如 `@lark-apaas`)仅 H5 可用 - -**Admin 后台**:保持纯 H5,不纳入 Taro 小程序。 - ---- - -## 不推荐的路径(供参考) - -- **uni-app**:语法是 Vue,无法复用现有 React 组件,等于重写整个前端 -- **web-view 壳**:界面 100% 一致,但不共享 React 代码,且支付/登录/审核受限 -- **继续维护原生 WXML**:每改一个图标/布局要改两遍,正是当前「差别很大」的根因 - ---- - -## 工作量估算 - -| 阶段 | 工期 | 产出 | -|------|------|------| -| 0–1 基础设施 | ~1 周 | monorepo + 共享层 + UI/图标基座 | -| 2 成语试点 | ~1 周 | 可演示的对齐版成语模块 | -| 3–4 全平台页面 | ~2 周 | 完整业务覆盖 | -| 5 微信能力 | ~3 天 | 可上线版本 | -| **合计** | **约 4–5 周** | 替换现有原生小程序 | - -建议从 **阶段 2 成语模块** 做 POC:1 周内可验证 Taro 方案是否满足你的「共用代码 + 界面接近」目标,再决定是否全量迁移。 diff --git a/plan/分销需求差异核对_53c87321.plan.md b/plan/分销需求差异核对_53c87321.plan.md deleted file mode 100644 index 00120d4..0000000 --- a/plan/分销需求差异核对_53c87321.plan.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -name: 分销需求差异核对 -overview: 当前系统基于 Shopro v1.3.8 标准多级分销模块,推广分销核心能力基本具备;但「省市区县区域代理」整块缺失,「复购返现」「邀请码」「级差/管理奖」等与需求文档存在明显差异。 -todos: - - id: gap-regional-agent - content: 区域代理模块整块缺失 — 需新建代理等级、区域绑定、地址匹配、区域分佣、后台与小程序 - status: completed - - id: gap-repurchase - content: 复购返现未实现 — 需新增首购/复购识别、复购佣金规则、买家自返配置 - status: completed - - id: gap-differential - content: 团队收益机制不同 — 当前为关系链分佣,需求为级差/管理奖,需改造分润算法 - status: completed - - id: gap-invite-code - content: 邀请码体系缺失 — 当前仅用 spm 用户 ID,需独立邀请码生成与绑定 - status: completed - - id: partial-dashboard - content: 推广看板功能分散 — 可整合 index.vue 为统一数据看板 - status: completed -isProject: false ---- - -# 当前系统分销 vs 需求文档差异核对 - -## 总体结论 - -| 模块 | 匹配度 | 说明 | -|------|--------|------| -| 推广分销(关系绑定、直推、等级、看板、提现) | **约 75%** | 核心链路已有,部分机制与需求描述不一致 | -| 省市区县区域代理 | **0%** | 整块未实现,需全新开发 | - -当前技术栈:后端 [`addons/shopro/library/commission/`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\),小程序 [`pages/app/commission/`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\)。 - ---- - -## 一、推广分销模块对比 - -### 1. 推广关系绑定 — 部分匹配 - -**需求:** 通过邀请码、分享海报、分享链接建立上下级关系。 - -**现状:** -- 分享海报、分享链接:**已实现**(`spm` 参数追踪,[`shopro/share/index.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro\share\index.js) + [`shopro-share.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components\shopro-share\shopro-share.vue)) -- 独立邀请码:**未实现**,绑定依赖分享者 **用户 ID** 嵌入 `spm`,无单独邀请码生成/输入/展示 UI -- 绑定时机可配置:`share`(点击链接)/ `pay`(首次支付)/ `agent`(成为下级分销商) - -```mermaid -flowchart LR - subgraph req [需求] - A1[邀请码] - A2[分享海报] - A3[分享链接] - end - subgraph cur [当前系统] - B1["spm用户ID追踪"] - B2[分享海报] - B3[分享链接] - end - A1 -.->|缺失| B1 - A2 --> B2 - A3 --> B3 -``` - ---- - -### 2. 直推奖励 — 已匹配 - -**需求:** 直推用户下单,推荐人获得佣金,后台可配置比例。 - -**现状:** -- 一级佣金(`commission_1`)即直推奖励 -- 比例/固定金额可在 **分销商等级** 和 **商品独立规则** 中配置 -- 结算基数可选实付价或商品价;结算节点可选支付/确认收货/完成 - -核心逻辑:[`Commission.php` → `runCommissionPlan()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\Commission.php) 递归向上分佣。 - ---- - -### 3. 团队等级体系 — 基本匹配 - -**需求:** 多等级(普通/白银/黄金/钻石),按直推人数 + 团队业绩自动升级。 - -**现状:** -- 分销商等级表 `shopro_commission_agent_level`,支持自定义名称、徽章、佣金规则 -- 自动升级条件丰富:个人消费、团队人数、团队订单金额/数量、下级分销商数量/等级等 -- 支持「满足任一条件」或「满足全部条件」升级 -- 支持跳级升级、升级审核 - -**差异:** -- 前端无独立「等级进度/升级说明」页(`commission.lv` API 已定义但未使用) -- 等级体系是 **分销商个人等级**,不是独立的「团队组织等级」概念 - ---- - -### 4. 团队收益 — 机制不同(重要差异) - -**需求:** 按团队业绩计算 **管理奖/级差奖**,不同等级享受不同佣金比例。 - -**现状:** -- 佣金模型是 **关系链多级分佣**(默认 2 级:直推 + 间推),每级按该分销商 **自身等级** 的 `commission_N` 规则独立计算 -- 有团队统计(一级/二级/团队人数、订单量、金额),但 **不用于额外分润池** -- **没有级差算法**(上级拿「自己与下级比例之差」) -- **没有管理奖/团队业绩分红**(不按团队总业绩额外奖励) - -```mermaid -flowchart TD - Buyer[买家下单] --> L1[一级上级 commission_1] - L1 --> L2[二级上级 commission_2] - L2 --> Stop[停止默认2级] - - subgraph missing [需求有但当前无] - M1[级差奖] - M2[管理奖] - M3[团队业绩池分红] - end -``` - ---- - -### 5. 复购返现 — 未实现(重要差异) - -**需求:** -- 成员复购时,推荐人继续获得佣金 -- 可配置 **用户自身复购** 也获得返现 - -**现状:** -- 代码中 **无「复购」相关逻辑**(全库搜索无匹配) -- 普通订单每次支付都会走标准分佣,推荐人在关系存续期间 **自然能拿到后续订单佣金**,但这与需求中的「复购返现」产品形态不同: - - 无复购专属比例/规则 - - 无「买家自己复购返现」配置(仅有分销商 **自购分佣** `self_buy`,且仅限已是分销商的用户) - - 无复购次数/周期/上限等控制 - ---- - -### 6. 推广数据看板 — 基本匹配 - -**需求:** 展示团队成员数、直推订单、团队总订单、收益明细、佣金统计。 - -**现状(分散在多页,无独立「看板」页名):** - -| 需求项 | 对应页面/功能 | 状态 | -|--------|--------------|------| -| 团队成员数 | [`team.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\team.vue) | 有 | -| 直推订单 | [`order.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\order.vue) | 有 | -| 团队总订单 | `order.vue` 团队统计 | 有 | -| 收益明细 | [`commission-log.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\commission-log.vue) | 有 | -| 佣金统计 | [`index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\index.vue) 总收益/待入账 | 有 | - -**差异:** 数据分散在「分销中心 + 团队 + 订单 + 明细」多个入口,未整合为单一「推广数据看板」页面;缺少更细粒度的图表/趋势分析。 - ---- - -### 7. 提现管理 — 已匹配 - -**需求:** 用户申请提现、后台审核、打款记录、对接第三方支付自动打款。 - -**现状:** -- 小程序:[`withdraw.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\user\wallet\withdraw.vue) / [`withdraw-log.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\user\wallet\withdraw-log.vue) -- 支持微信/支付宝/银行卡;微信/支付宝可开启 **自动打款**(`wechat_alipay_auto`) -- 后台审核、手续费、每日限额等均可配置 -- 佣金结算后进入用户钱包 `user.money`,与推广提现共用同一钱包体系 - ---- - -## 二、省市区县区域代理模块对比 - -### 整块缺失 — 0% 实现 - -需求文档中的 **区域代理** 与现有 **分销商(commission agent)** 是两套完全不同的业务模型。当前系统中: - -- `shopro_area` 仅用于 **收货地址** 省市区选择,不参与分佣 -- `shopro_store` 是 **线下门店/O2O** 模块,不是区域销售代理 -- 无任何「按收货地址匹配区域代理并分佣」的逻辑 - -| 需求功能 | 当前状态 | -|----------|----------| -| 代理等级(省/市/区县,可扩展) | 无 | -| 后台手动添加代理 | 无 | -| 用户在线申请 + 审核 | 无(仅有「申请分销商」,非区域代理) | -| 按订单收货地址自动匹配区域代理 | 无 | -| 区域内订单按比例/固定金额分佣 | 无 | -| 区域业绩统计(订单量、销售额、佣金明细) | 无 | -| 代理管理后台(列表、区域分配、等级调整、结算) | 无 | -| 代理独立提现流程 | 无(共用钱包提现,无代理身份区分) | - -```mermaid -flowchart LR - Order[订单收货地址] -->|需求| AgentMatch[匹配省市区代理] - AgentMatch --> AgentFee[区域代理分佣] - - Order -->|当前| Commission[关系链分销分佣] - Commission --> Parent[上级分销商] -``` - ---- - -## 三、差异汇总表 - -### 已实现 / 基本满足 - -- 分享海报、分享链接推广绑定 -- 直推佣金(可配置比例) -- 分销商多等级 + 自动升级 -- 二级(可配置 N 级)关系链分佣 -- 推广数据统计(团队/订单/佣金) -- 提现申请、审核、自动打款 -- 分销商申请与后台审核 -- 退款扣回佣金/业绩 - -### 部分实现 / 机制不同 - -- **邀请码** → 仅有 spm 用户 ID,无独立邀请码 -- **团队收益** → 有多级分佣 + 等级差异比例,但无级差奖/管理奖/团队业绩分红 -- **推广看板** → 功能分散,非统一看板页 -- **复购** → 关系存续期间普通订单仍分佣,但无专属复购返现规则 -- **自购返现** → 仅有分销商自购分佣(`self_buy`),非普通用户复购返现 - -### 完全缺失(需新开发) - -- **省市区县区域代理** 整套模块(7 项功能全部缺失) -- **复购返现** 独立业务规则(复购比例、买家自返、次数限制等) -- **邀请码** 生成/展示/输入体系 -- **级差/管理奖** 分润算法 - ---- - -## 四、若需补齐需求的开发方向(参考) - -按工作量与业务独立性,建议优先级: - -1. **P0 — 区域代理模块**(全新):代理表、区域绑定、订单地址匹配、区域分佣、代理后台、代理端小程序页 -2. **P1 — 复购返现**:订单标记首购/复购、独立佣金规则、买家自返配置 -3. **P2 — 级差/管理奖**:改造 [`Commission.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\commission\Commission.php) 分润算法,或新增团队业绩结算任务 -4. **P3 — 邀请码体系**:用户邀请码字段、海报/链接携带码、注册/绑定入口 -5. **P4 — 推广看板整合**:新建或改造 `index.vue`,汇总团队/订单/佣金图表 - -区域代理可在现有 `commission` 钱包/提现基础设施上扩展,但 **业务模型、数据表、结算逻辑均需独立设计**,不宜简单复用现有分销商等级体系。 diff --git a/plan/区域代理需求对照_060fc1ce.plan.md b/plan/区域代理需求对照_060fc1ce.plan.md deleted file mode 100644 index 0a2863d..0000000 --- a/plan/区域代理需求对照_060fc1ce.plan.md +++ /dev/null @@ -1,314 +0,0 @@ ---- -name: 区域代理需求对照 -overview: 对照需求图核对当前 Shopro 区域代理实现,列出已满足项与出入点,并按「运营可用性优先 + 分佣模式可配置」给出分阶段完善方案。 -todos: - - id: p0-commission-config - content: "P0: 后台佣金配置 — 代理设置页增加分佣模式;代理等级页配置比例/固定金额(按单)" - status: completed - - id: p0-level-crud - content: "P0: 新增代理等级管理 CRUD(参考分销等级页,含佣金类型切换 UI)" - status: completed - - id: p0-menu - content: "P0: 补全 menu.php 菜单(代理订单、佣金明细、代理等级管理)" - status: completed - - id: p0-agent-edit - content: "P0: 代理编辑页 — 区域变更 + 等级调整 + 状态管理 UI" - status: completed - - id: p0-agent-add-ux - content: "P0: 后台添加页 — 用户搜索 + 省市区级联选择器" - status: completed - - id: p0-mp-withdraw - content: "P0: 小程序代理中心 — 展示 delay_money + 提现入口" - status: completed - - id: p0-wallet-log - content: "P0: UserWalletLog 注册 regional_agent_income/back 中文类型" - status: completed - - id: p0-agent-custom-commission - content: "P0: 单个代理自定义佣金(优先于等级通用配置)" - status: completed - - id: p1-commission-mode - content: "P1: 新增 commission_mode 配置(stack/exclusive/differential)并改造 Commission.php" - status: completed - - id: p1-fixed-amount - content: "P1: 改造 Commission.php 固定佣金为按单计(当前是按件×数量,与需求不符)" - status: completed - - id: p2-stats - content: "P2: 时间筛选、导出、后台业绩看板" - status: completed - - id: p2-notify - content: "P2: 审核结果通知(RegionalAgent + 后台消息配置注册)" - status: completed - - id: p2-goods-toggle - content: "P2: 商品级 regional_enable 开关" - status: completed - - id: p2-dynamic-level - content: "P2: 动态等级匹配(读取等级表)" - status: completed - - id: p2-test-scripts - content: "P2: 区域代理测试脚本(setup/cleanup/verify)" - status: completed -isProject: false ---- - -# 区域代理需求对照与完善计划 - -## 需求图 vs 现状总览 - -```mermaid -flowchart LR - subgraph req [需求图] - A1[代理等级] - A2[申请开通] - A3[地址匹配] - A4[代理收益] - A5[业绩统计] - A6[管理后台] - A7[代理提现] - end - subgraph cur [当前实现] - B1[3级+等级表] - B2[后台添加+用户申请审核] - B3[收货地址省市区匹配] - B4[比例/固定两种类型] - B5[基础计数+明细列表] - B6[列表/审核/订单/佣金] - B7[通用钱包提现] - end - A1 --> B1 - A2 --> B2 - A3 --> B3 - A4 --> B4 - A5 --> B5 - A6 --> B6 - A7 --> B7 -``` - ---- - -## 一、已满足的需求(无出入) - -| 需求项 | 需求描述 | 当前实现 | 关键文件 | -|--------|----------|----------|----------| -| 代理等级 | 省/市/区县三级 | 已实现,`area_level` 1/2/3 对应省/市/区 | [`upgrade_distribution_features.sql`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_distribution_features.sql) | -| 申请/开通 | 后台手动添加 + 用户在线申请 + 平台审核 | 后台 `add/audit` + 小程序 `apply.vue` + 配置 `agent_check` | [`Agent.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\regional_agent\Agent.php)、[`apply.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\apply.vue) | -| 区域归属匹配 | 按订单收货地址自动匹配 | 支付后 hook,用 `province_id/city_id/area_id` 匹配 | [`Commission.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Commission.php) | -| 代理收益(逻辑) | 实付比例 或 固定金额 | `commission_type`: `rate` / `money`,基数为 `pay_price` | [`Commission.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Commission.php) | -| 代理收益(后台配置) | 后台可配比例/固定金额 | **不可配**:等级表有字段但无管理页;设置页无佣金项 | 见下方「后台佣金配置」专节 | -| 业绩统计(基础) | 区域订单量、销售额、佣金明细 | 代理表 `order_count/order_money/total_income` + 订单/佣金列表 | [`index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\index.vue) | -| 代理列表 | 后台代理目录 | 列表 + 状态 Tab + 审核 | [`agent/index.html`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\regional_agent\agent\index.html) | -| 提现流程 | 申请 → 审核 → 打款 | 佣金入账用户余额 → 通用 [`UserWalletApply`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\UserWalletApply.php) 提现 | 链路完整,但非独立模块 | - ---- - -## 二、出入与缺口(按需求模块拆分) - -### 1. 代理等级(可扩展) - -**出入:** -- 需求写「可扩展」,当前**数据库可扩展**(`shopro_regional_agent_level` 表),但**业务逻辑写死 3 级**: - - 匹配逻辑硬编码 `areaMap = [1=>省, 2=>市, 3=>区]`([`Commission.php:62-66`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Commission.php)) - - 前后台 UI 下拉框写死 3 个选项 -- **无后台等级管理页**:比例/固定金额/等级名称只能改 SQL,[`Level.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\model\shopro\regional_agent\Level.php) 模型存在但无 Controller/View - -**需完善:** -- 新增「代理等级管理」后台 CRUD(名称、区域层级、佣金类型、比例/固定金额) -- 匹配逻辑改为读取等级表动态生成,而非硬编码 - ---- - -### 2. 代理申请/开通 - -**出入:** -- 核心流程已对齐 -- 后台手动添加体验差:需手填**用户ID + 区域ID**([`add.html`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\regional_agent\agent\add.html)),无用户搜索、无省市区选择器 -- 缺少审核结果通知(小程序订阅消息/站内通知均未接) - -**需完善(运营优先):** -- 后台添加页:用户搜索选择 + 省市区级联选择(对齐小程序 `apply.vue` 体验) -- 审核通过/驳回通知(可选二期) - ---- - -### 3. 区域归属匹配 - -**出入:** -- 匹配依据正确(收货地址) -- **分佣模式未在需求中明确,当前为「三级叠加」**:同一订单可同时给省、市、区代理分佣 -- 您已确认要**做成可配置**(叠加 / 独占最细级 / 级差) -- 边界情况:无 `province_id` 的订单直接跳过;地址不完整时只匹配有 ID 的层级;无模糊匹配/文本解析兜底 - -**需完善:** -- 在 [`shopro_regional_agent_config`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_distribution_features.sql) 增加 `commission_mode` 配置项: - - `stack` = 叠加(现状) - - `exclusive` = 仅最细一级(有区县只给区县,否则市,否则省) - - `differential` = 级差(高级别拿差额,类似分销级差奖) -- 修改 [`Commission::matchRegionalAgents()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Commission.php) 按模式过滤/计算 -- 后台「代理设置」页增加该选项说明 - ---- - -### 4. 代理收益(重点:后台需可配置) - -**需求图原文:** 区域内订单按**实付金额比例**或**固定金额**给代理分成。 - -**当前实现 vs 需求:** - -| 配置项 | 需求 | 现状 | 差距 | -|--------|------|------|------| -| 佣金类型 | 比例 / 固定金额 | 等级表有 `commission_type` 字段 | **后台无 UI,只能改 SQL** | -| 比例值 | 后台可配 | 默认省3%/市2%/区1% 写死在 seed | **无等级管理页** | -| 固定金额 | 按单固定 | 代码为 `commission_money × goods_num`(按件) | **口径错误 + 不可配** | -| 结算基数 | 实付金额 | 用 `order_item.pay_price` | 符合 | -| 分佣模式 | 可配置 | 固定三级叠加 | 需加 `commission_mode` 配置 | -| 结算时机 | 可配置 | 设置页已有 `commission_event` | 已满足 | - -**后台佣金配置方案(P0 必做):** - -拆成两个后台入口,对齐分销等级页的交互风格(参考 [`commission/level/edit.html`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\commission\level\edit.html)): - -**A. 代理设置页** — [`regional_agent/config/index.html`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\regional_agent\config\index.html) 扩展「佣金规则」区块: - -- `commission_mode`(新增):叠加 / 独占最细级 / 级差 -- `commission_event`(已有):支付后 / 确认收货 / 订单完成 -- 说明文案:比例按实付金额;固定金额按**每单**计(已确认) - -**B. 代理等级管理页** — 新建 `regional_agent/level` CRUD: - -每个等级(省/市/区县)可独立配置: - -- 等级名称 -- 区域层级(1=省 / 2=市 / 3=区) -- 佣金类型:`rate`(比例)/ `money`(固定金额) -- 比例值 `commission_rate`(%),类型为 rate 时生效 -- 固定金额 `commission_money`(元/单),类型为 money 时生效 - -UI 交互:切换佣金类型时显示/隐藏对应输入框(与分销等级页类似的表单切换)。 - -**C. 代码联动改造:** - -- [`Commission.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Commission.php) 固定佣金改为**每单一次**(同一 order_item 只计一次;若多 agent 匹配,各自按等级固定值计) -- [`Config.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Config.php) 增加 `getCommissionMode()` 读取新配置 -- SQL 迁移:向 `shopro_regional_agent_config` 插入 `commission_mode` 默认值 `stack` - -**可选(P2):** 商品级 `regional_enable` 开关 - ---- - -### 5. 代理业绩统计 - -**出入:** -- 基础三项(订单数、销售额、总收益)**已有** -- 佣金明细列表**已有**(小程序 `rewards.vue`、后台 `reward/index.html`) -- **缺口:** - - API 已返回 `delay_money`(待结算),小程序首页**未展示**([`info()` 有返回,`index.vue` 未用](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\index.vue)) - - `stats` 接口已写好但前端**未调用** - - 无时间范围筛选、无导出、无后台汇总看板 - - 后台代理列表有统计列,但无独立「区域业绩报表」 - -**需完善(运营优先,轻量):** -- 小程序首页增加:待结算佣金、提现入口 -- 订单/佣金列表增加日期筛选(二期) -- 后台增加简单汇总(按区域/按时间段)(您选运营优先,统计看板放二期) - ---- - -### 6. 代理管理后台 - -**出入对照:** - -| 需求子项 | 现状 | 缺口 | -|----------|------|------| -| 代理列表 | 有 | — | -| 区域分配 | 申请/添加时指定 | **无编辑**:不能修改已有代理的管辖区域;`update()` 只改 `status/level`,不改 `area_id` | -| 等级调整 | 后端 `update()` 支持改 `level` | **无后台 UI**:列表只有审核/禁用,无编辑弹窗 | -| 结算记录 | 有 `reward` 表 + 后台页 | **菜单未入库**:[`menu.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\config\menu.php) 仅有「代理设置」「区域代理」,缺「代理订单」「佣金明细」;需额外执行 [`upgrade_regional_agent_order_menu.sql`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_regional_agent_order_menu.sql) | - -**需完善(运营优先,P0):** -1. 合并菜单:将 Order/Reward 菜单写入 [`menu.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\config\menu.php),避免部署遗漏 -2. 代理编辑页/弹窗:支持修改**区域**、**等级**、**状态** -3. 后台添加页 UX 优化(用户选择 + 区域选择器) -4. 新增代理等级管理页 - ---- - -### 7. 代理提现 - -**出入:** -- 流程上**功能闭环**:佣金 → 用户余额 → 提现申请 → 后台审核 → 打款 -- 但**不是独立的「代理提现」模块**: - - 区域代理中心**无提现入口**(需去「我的钱包」或分销中心) - - 钱包流水类型 `regional_agent_income` / `regional_agent_back` **未注册**到 [`UserWalletLog::$typeAll`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\model\UserWalletLog.php),流水显示可能为原始 code 而非中文 - - 无法区分「区域代理收入」与「分销佣金」的提现来源(共用余额池) - -**需完善(运营优先,P0):** -- 小程序区域代理中心增加「去提现」按钮 → `/pages/user/wallet/withdraw` -- 注册钱包流水类型中文名 -- 可选:提现页展示「区域代理可提余额」提示(仍走统一提现,不改底层) - ---- - -## 三、部署/运维层面的出入 - -- 区域代理表结构在 [`upgrade_distribution_features.sql`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_distribution_features.sql),**不在** `install.sql`,新环境易漏执行 -- 有 [`upgrade_distribution.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_distribution.php) 校验脚本,建议纳入部署 checklist - ---- - -## 四、分阶段实施建议(按您选择的优先级) - -### 阶段 P0 — 运营可用性 + 佣金后台可配置(优先实施) - -| 序号 | 任务 | 涉及文件 | -|------|------|----------| -| P0-1 | **代理等级管理 CRUD**(比例/固定金额/类型切换) | 新建 `regional_agent/level` controller/view/js;参考分销等级页 | -| P0-2 | **代理设置页扩展佣金规则**(分佣模式 + 说明文案) | [`config/index.html`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\regional_agent\config\index.html)、[`config.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\public\assets\js\backend\shopro\regional_agent\config.js)、SQL 新增 `commission_mode` | -| P0-3 | **固定佣金改按单计** | [`Commission.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Commission.php) | -| P0-4 | 补全后台菜单(代理订单、佣金明细、代理等级) | [`menu.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\config\menu.php) | -| P0-5 | 代理编辑:区域变更 + 等级调整 UI | [`Agent.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\regional_agent\Agent.php)、[`agent.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\public\assets\js\backend\shopro\regional_agent\agent.js) | -| P0-6 | 后台添加页:用户搜索 + 省市区选择 | [`add.html`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\regional_agent\agent\add.html) | -| P0-7 | 小程序代理中心:待结算金额 + 提现入口 | [`index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\index.vue) | -| P0-8 | 钱包流水类型注册 | [`UserWalletLog.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\model\UserWalletLog.php) | - -### 阶段 P1 — 分佣模式引擎改造 - -| 序号 | 任务 | 涉及文件 | -|------|------|----------| -| P1-1 | 实现 `commission_mode` 三种模式的匹配/计算逻辑 | [`Commission.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Commission.php) | -| P1-2 | 级差算法:高级别拿(本档比例/金额 - 下级已拿部分) | 同上 | -| P1-3 | 补充集成测试脚本 | 参考 [`commission_setup_test_users.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\tests\commission_setup_test_users.php) | - -### 阶段 P2 — 增强统计与扩展(后续) - -- 时间范围筛选、数据导出 -- 后台区域业绩看板 -- 审核通知(订阅消息) -- 商品级区域分佣开关 -- 等级体系动态扩展(超过 3 级时的 UI/匹配联动) - ---- - -## 五、已确认 / 待确认的业务口径 - -**已确认:** -- 固定佣金按**每单**计(非按件) -- 分佣模式需后台可配(叠加 / 独占 / 级差) -- 比例基数为实付金额 - -**待确认:** -1. **级差模式**:省 3% / 市 2% / 区 1% 时,区县拿 1%,市级拿 1%(2-1),省级拿 1%(3-2)—— 是否采用此标准级差算法? -2. **区域变更**:已有历史订单是否仍归属旧区域代理,还是仅对新订单生效?(建议仅对新订单) - ---- - -## 六、结论 - -**核心链路已打通**(申请 → 审核 → 地址匹配 → 分佣 → 入账 → 提现),与需求图大方向一致。 - -**主要出入集中在「佣金后台不可配」和「运营后台不完整」**: -- **佣金配置**:等级表有字段但无管理页;设置页缺分佣模式;固定金额口径错误(按件→需改按单) -- 后台缺区域编辑、完整菜单 -- 分佣固定为三级叠加,引擎待按 `commission_mode` 改造 -- 小程序缺待结算与提现入口 -- 商品级开关、统计深度为次要差距 - -按 P0 → P1 → P2 顺序实施,可在不推翻现有架构的前提下补齐需求图差距。 diff --git a/plan/商务蓝白_ui_改版_d9d0903f.plan.md b/plan/商务蓝白_ui_改版_d9d0903f.plan.md deleted file mode 100644 index 4e10f51..0000000 --- a/plan/商务蓝白_ui_改版_d9d0903f.plan.md +++ /dev/null @@ -1,288 +0,0 @@ ---- -name: 商务蓝白 UI 改版 -overview: 将雄戈小酒小程序切换为商务蓝白风格。Logo 用用户提供的「雄戈」徽章(深蓝+金色);首页风格已确认;我的页仅改 4 列宫格布局,功能项沿用项目现有 DEFAULT_TOOLS + 后台 grid-list,不照搬预览图占位项。 -todos: - - id: preview-mockups - content: 生成我的页 + 首页 2 张商务蓝白 Mockup 预览图,用户确认后再编码 - status: completed - - id: logo-asset - content: 压缩并上传新 Logo 至 CDN,home-head 改为远程加载 - status: pending - - id: token-migration - content: 更新 theme.scss / theme.js / pages.json / MASTER.md,全局蓝系 token 替换金色 - status: pending - - id: user-page-redesign - content: 重构 userinfo-card(蓝顶+资产栏)、sh-order-card(5项)、sh-grid 仅改 4 列宫格布局,数据沿用 mergedTools - status: pending - - id: home-page-polish - content: 首页风格已确认 — 优化 home-head(新 Logo)、sh-grid-swiper、shopro-goods-card 等 - status: pending - - id: global-sweep - content: 扫尾 wallet/search/tabbar/navbar 及硬编码金色组件,联调验收 - status: pending -isProject: false ---- - -# 雄戈小酒 · 商务蓝白风格整体改版方案 - -## 现状 vs 目标 - -```mermaid -flowchart LR - subgraph current [当前] - A1["暖白 #FAFAF8"] - A2["香槟金 Tab/CTA #C4A574"] - A3["我的页工具区: 分组列表"] - A4["首页: 轻奢搜索头图"] - end - subgraph target [目标参考图] - B1["浅灰页面底 #F5F7FA"] - B2["商务蓝主色 #1677FF / #0369A1"] - B3["我的页: 蓝顶区 + 白卡片 + 4列宫格"] - B4["首页: 清爽商务头 + 卡片化模块"] - end - current --> target -``` - -| 维度 | 当前 | 参考图目标 | -|------|------|------------| -| 主色 | 香槟金 `#C4A574` | 商务蓝 `#1677FF`(主)/ `#0369A1`(深) | -| 页面底 | `#FAFAF8` 暖白 | `#F5F7FA` 冷灰白 | -| 顶区 | 暖色渐变头 | **蓝底白字** 个人中心头 | -| 我的页服务 | [`sh-grid.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\components\sh-grid.vue) 分组**列表** | **4列图标宫格**(参考图「我的服务」) | -| 订单区 | 4项 + 退换货 | 5项横排(待付款/待发货/待收货/待评价/售后) | -| 资产 | 独立 `sh-wallet` 卡片 | 并入顶区三栏(余额/积分/优惠券) | - ---- - -## UI/UX Pro Max 设计系统(已检索 + 人工校准) - -自动检索「ecommerce business blue」后,**B2B Service** 配色最接近参考图;结合参考图视觉,建议最终 token 如下(覆盖现有 [`static/style/theme.scss`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static/style/theme.scss) 与 [`shopro/config/theme.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro/config/theme.js)): - -| Token | 新值 | 用途 | -|-------|------|------| -| `$brand-primary` | `#1677FF` | Tab 选中、主按钮、图标强调 | -| `$brand-primary-dark` | `#0958D9` | 顶区渐变深色、按下态 | -| `$brand-primary-light` | `#E6F4FF` | 图标底圆、浅蓝块 | -| `$brand-header-gradient` | `linear-gradient(180deg, #1677FF 0%, #4096FF 45%, #F5F7FA 100%)` | 我的页/首页顶区 | -| `$brand-page-bg` | `#F5F7FA` | 全局页面底 | -| `$brand-card-bg` | `#FFFFFF` | 卡片 | -| `$brand-text` | `#1F2937` | 主文字 | -| `$brand-text-muted` | `#6B7280` | 副文字 | -| `$brand-text-on-primary` | `#FFFFFF` | 蓝底白字 | -| `$brand-price` | `#FF4D4F` | 价格/收入(保留红,不用金) | -| `$brand-border` | `#E5E7EB` | 分割线 | - -**风格关键词(UI/UX Pro Max):** Minimalism & Swiss Style + Feature-Rich Showcase -**密度:** Standard(4/10) -**动效:** 200ms 按压反馈,无复杂动画 -**避免:** 大面积金色、emoji 图标、暖色渐变促销块 - -**字体:** 小程序继续用 OPPOSANS;不引入 Web 字体。 - ---- - -## 用户确认项(2026-08-31 更新) - -| 项目 | 状态 | 说明 | -|------|------|------| -| **Logo** | 已指定 | 使用用户提供的「雄戈」徽章(深皇家蓝底 + 金色字/麦穗/五星) | -| **首页风格** | **已确认** | 按预览图:Logo+搜索、轮播、分类宫格、双列商品、蓝色 Tab | -| **我的页布局** | **已确认** | 4 列宫格「我的服务」卡片,蓝顶白字 + 订单 5 项 | -| **我的页功能** | **按项目实际** | **只改布局,不改功能清单**;不显示预览图里的「水袋/银行卡」等占位项 | - -### Logo 实施方案 - -1. 源文件:用户提供的徽章 PNG(深蓝 `#0A2463` 量级 + 金色 `#C4A574`/`#D4AF37`) -2. 压缩后上传:`public/uploads/demo/xiongge/xiongge-brand-emblem.png` -3. 首页 [`home-head.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\index\home-head.vue) 改为 `$IMG_URL + '/uploads/demo/xiongge/xiongge-brand-emblem.png'` -4. 顶区背景色与 Logo 深蓝对齐:`$brand-header-navy: #0A2463`(或从 Logo 取色) -5. UI 交互色仍用商务蓝 `#1677FF`;金色**仅用于 Logo/品牌标识**,不作为全局 CTA 色 - -### 我的页宫格 — 实际功能清单(不改数据,只改展示) - -[`sh-grid.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\components\sh-grid.vue) 继续用 `mergedTools` 逻辑: - -**内置默认项(DEFAULT_TOOLS):** -- 分销中心 → `/pages/app/commission/index` -- 区域代理 → `/pages/app/regional-agent/index` -- 积分商城 → `/pages/app/score/list` -- 浏览足迹 → `/pages/user/view-log` -- 我的收藏 → `/pages/user/favorite` -- 地址管理 → `/pages/user/address/list` -- 常见问题 → `/pages/public/faq` -- 问题反馈 → `/pages/public/feedback` -- 系统设置 → `/pages/user/set` - -**后台 API `grid-list` 追加项**(若装修配置了且未隐藏): -- 在线客服、我的预约 等(按 `EXTRA_ICON_MAP` 映射图标) -- 开启直播(仅 `userInfo.is_live == 1` 时显示) - -**自动隐藏**([`hidden-tools.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro\utils\hidden-tools.js)): -- 我的报修、门店管理、我的拼团、今日必拼 -- 路径含 groupon / merchant / after-sale 的项 - -**布局改造要点:** -- 取消「会员权益 / 我的记录 / …」分组标题 -- `mergedTools` 扁平化为 **4 列 × N 行** 宫格,标题统一「我的服务」 -- 每项仍走 `handleTap(menu)` 原有跳转逻辑 -- 若后台配置了自定义图标 URL,优先显示远程图标;否则用 uView iconfont - ---- - -## 阶段 0:预览图确认 - -| 页面 | 状态 | -|------|------| -| 首页预览 | **已确认** | -| 我的页预览 | 布局确认;宫格内容以实际上方功能清单为准 | - -预览 PNG 路径见 [`PREVIEW-blue-business.md`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\design-system\default\PREVIEW-blue-business.md) - ---- - -## 阶段 1:设计 Token 全局替换(一次改、全站生效) - -**改动文件(核心):** -- [`static/style/theme.scss`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static/style/theme.scss) -- [`shopro/config/theme.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro/config/theme.js) -- [`shopro/utils/theme.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro/utils/theme.js) — `applyThemeToTabbar` / `applyThemeToUserTemplate` 改为蓝系 -- [`uview-ui/theme.scss`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\uview-ui/theme.scss) — primary 对齐 -- [`pages.json`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages.json) — `selectedColor`、`navigationBarBackgroundColor` -- [`design-system/default/MASTER.md`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\design-system/default/MASTER.md) — 文档同步 - -**TabBar 图标:** 替换 [`static/images/tabbar/*1.png`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static/images/tabbar) 选中态为蓝色(可用 SVG 转 PNG 或重新导出)。 - -**批量替换:** 全局检索硬编码 `#C4A574`、`#E8D4A8`、`$brand-gold-gradient` 的组件(约 20+ 处),改为 `$brand-primary` / `$brand-primary-light`。 - ---- - -## 阶段 2:我的页重构(重点) - -**页面入口:** [`pages/index/user.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/user.vue) - -### 2.1 顶区 — 蓝底白字 - -改 [`userinfo-card.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/user/userinfo-card.vue): -- 背景改为蓝色渐变,文字/图标改白 -- 昵称下方增加会员标签行(沿用 `userInfo.group`) -- 右侧保留分享按钮(白描边圆钮) - -**新增资产三栏**(参考图顶部「余额/经营额度/积分」): -- 嵌入 `userinfo-card` 底部或紧接其下的新组件 `user-asset-bar.vue` -- 数据映射:余额 `userInfo.money` / 积分 `userInfo.score` / 优惠券 `userOtherData.coupons_num` -- 点击分别跳转钱包、积分、优惠券页 - -### 2.2 订单卡片 - -改 [`sh-order-card.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/components/sh-order-card.vue): -- 补「待发货」项(`type: 'nosend'`) -- 5 列等分布局,图标统一蓝色线性风格(uView iconfont + 浅蓝圆底) -- 卡片白底圆角,与参考图「商城订单」一致 - -### 2.3 服务宫格(九宫格 → 4列宫格) - -**重写 [`sh-grid.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/components/sh-grid.vue) 布局:** - -``` -┌─────────────────────────────┐ -│ 我的服务 │ -├──────┬──────┬──────┬──────┤ -│ 图标 │ 图标 │ 图标 │ 图标 │ -│ 文字 │ 文字 │ 文字 │ 文字 │ -├──────┼──────┼──────┼──────┤ -│ ... │ ... │ ... │ ... │ -└──────┴──────┴──────┴──────┘ -``` - -- **4 列 × N 行**(参考图标准,比 3×3 更接近参考) -- 取消分组标题(会员权益/我的记录…),合并为单一「我的服务」卡片 -- 保留 `DEFAULT_TOOLS` + API `grid-list` 合并逻辑与 `hidden-tools` 过滤 -- 每项:48rpx 蓝图标 + 24rpx 标签,触控区 ≥88rpx - -### 2.4 模块顺序建议 - -在 decorate 模板不变的前提下,视觉顺序对齐参考图: - -``` -userinfo-card(蓝顶 + 资产栏) -→ sh-order-card(商城订单) -→ sh-banner(营销轮播,可选) -→ sh-grid(我的服务 4列宫格) -→ 其他 decorate 模块(商品推荐等,可后置) -``` - -`sh-wallet` 可隐藏或合并进顶区资产栏,避免重复。 - -### 2.5 页面背景 - -[`user.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/user.vue) 的 `.user-header-bg` 改为蓝色渐变;内容区卡片间距 `$brand-section-gap`。 - ---- - -## 阶段 3:首页优化 - -**入口:** [`pages/index/index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/index.vue) - -| 模块 | 文件 | 改动 | -|------|------|------| -| 顶区 | [`home-head.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/index/home-head.vue) | 搜索框蓝描边/浅蓝底;轮播指示点改蓝;tagline 改商务文案 | -| 分类宫格 | [`sh-grid-swiper.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/components/sh-grid-swiper.vue) | 图标圆底 `#E6F4FF`,文字 `#1F2937` | -| 商品卡 | [`shopro-goods-card.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components/shopro-goods-card/shopro-goods-card.vue) | 加购按钮改蓝渐变 | -| 营销块 | `sh-seckill` / `sh-coupon` / `sh-title-card` | 金色渐变 → 蓝色系 | -| 分类 Tab | [`sh-category-tabs.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/index/components/sh-category-tabs.vue) | 选中态改蓝 | -| 页面底 | `index.vue` `.home-header-bg` | 与我的页统一蓝灰渐变 | - -首页内容顺序仍由后台 `index/template` 驱动,**只改视觉层,不动 API 结构**。 - ---- - -## 阶段 4:子页面与全局组件扫尾 - -优先扫用户高频页(与参考图体验一致): -- [`pages/user/wallet/index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/user/wallet/index.vue) — 余额卡改蓝渐变(刚改的金色需回改) -- [`pages/public/search.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages/public/search.vue) -- [`components/shopro-tabbar/shopro-tabbar.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components/shopro-tabbar/shopro-tabbar.vue) -- [`components/shopro-navbar/shopro-navbar.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components/shopro-navbar/shopro-navbar.vue) - ---- - -## 后台配合(可选) - -- Shopro 装修后台:我的页 decorate 模块顺序调整(订单在上、轮播在中、去掉重复 wallet-card) -- 轮播/菜单图标:建议换蓝色系 PNG(CDN `uploads/demo/xiongge/`) -- 执行后清除 Shopro 缓存 - ---- - -## 实施顺序与工作量 - -| 阶段 | 内容 | 预估 | -|------|------|------| -| 0 | 2 张预览 Mockup | 0.5h | -| 1 | Token + TabBar + 全局色替换 | 2h | -| 2 | 我的页(顶区+订单+4列宫格) | 3h | -| 3 | 首页 + 核心 sh-* 组件 | 2h | -| 4 | 子页面扫尾 + 联调 | 2h | - -**总计约 1 个工作日**(含预览确认一轮)。 - ---- - -## 验收标准 - -- 我的页顶区为蓝底白字,资产三栏、订单 5 项、服务 4 列宫格与参考图结构一致 -- TabBar / 主按钮 / 选中态全部为商务蓝,无残留金色 CTA -- 首页搜索头、分类宫格、商品卡风格统一 -- 375px 宽度无布局溢出;图标触控区 ≥44pt -- 后台 decorate 数据无需改 API 即可正常渲染 - ---- - -## 下一步 - -方案已按你的反馈更新。**回复「开始改代码」并切换到 Agent 模式** 后执行: - -1. 上传/压缩新 Logo → CDN,更新 `home-head.vue` -2. 阶段 1→4 代码改造(我的页宫格只改布局,功能沿用 `mergedTools`) -3. HBuilderX 编译 + 清缓存验证 diff --git a/plan/商品分销佣金配置_12a20341.plan.md b/plan/商品分销佣金配置_12a20341.plan.md deleted file mode 100644 index f60fe57..0000000 --- a/plan/商品分销佣金配置_12a20341.plan.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -name: 商品分销佣金配置 -overview: 在 Feitian 飞天结算体系下,为每个商品增加「是否启用分佣 / 团队分销」开关,以及「分销佣金比例 / 团队佣金比例」(按商品实付金额百分比);后台商品编辑页可配置,结算引擎按订单明细逐商品计算,比例为空时回退现有全局固定金额规则。 -todos: - - id: db-patch - content: 新增 feitian-patch-goods-reward.sql:enable_commission、enable_team、commission_rate、team_commission_rate 四字段 - status: completed - - id: reward-resolver - content: 新增 GoodsRewardResolver.php,统一解析订单明细与商品奖励配置 - status: completed - - id: settle-refactor - content: 改造 ReferralReward / MakerReward / JiudaoguanReward,按商品行与开关/比例结算 - status: completed - - id: admin-ui - content: 商品 edit.html + goods.js 增加飞天分销设置表单(含 is_feitian_order) - status: completed - - id: test-seed - content: 更新测试 seed 与 AcceptanceTest 覆盖比例/开关场景 - status: completed -isProject: false ---- - -# 商品级分销/团队佣金配置(Feitian) - -## 背景与目标 - -当前项目 **线上结算走 Feitian**([`RewardEngine.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\RewardEngine.php)),商品仅有 [`is_feitian_order`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-patch-goods.sql) 标识,奖励金额全部来自全局配置(推荐 398/400/600、创客基数 120 等)。Shopro 分销已关闭,**不在本次范围**。 - -你已确认: -- 体系:**Feitian** -- 比例含义:**按商品实付金额百分比** - -目标字段(每个商品): - -| 字段 | 含义 | -|------|------| -| 是否启用分佣 | 控制直推/分销佣金是否发放 | -| 是否启用团队分销 | 控制创客链、酒道馆链团队奖励是否发放 | -| 分销佣金比例 | 实付 × 比例 → 给直推推荐人 | -| 团队佣金比例 | 实付 × 比例 → 作为团队奖励基数,沿用现有链式分配算法 | - -## 数据模型 - -新增 SQL 补丁 [`database/seed/feitian-patch-goods-reward.sql`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-patch-goods-reward.sql)(风格对齐现有 [`feitian-patch-goods.sql`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-patch-goods.sql)): - -在 `fa_shopro_goods` 增加: - -```sql -enable_commission tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用分佣' -enable_team tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用团队分销' -commission_rate decimal(5,2) NOT NULL DEFAULT 0 COMMENT '分销佣金比例(%),0=走全局固定推荐奖' -team_commission_rate decimal(5,2) NOT NULL DEFAULT 0 COMMENT '团队佣金比例(%),0=走全局固定团队基数' -``` - -**兼容策略(重要)**: -- 老数据默认 `enable_* = 1`、比例为 `0` → **行为与现在完全一致**(仍用 398/400/600 + 120/50 固定金额) -- 仅当 `commission_rate > 0` 时,该商品行改用「实付 × 比例」替代固定推荐奖 -- 仅当 `team_commission_rate > 0` 时,该商品行改用「实付 × 比例」作为 Maker/JDG 的 `base` -- `enable_commission = 0` → 该商品行跳过 [`ReferralReward`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\ReferralReward.php) -- `enable_team = 0` → 该商品行跳过 [`MakerReward`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\MakerReward.php) / [`JiudaoguanReward`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\JiudaoguanReward.php) -- [`AgentReward`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\AgentReward.php)、马豆/云豆/兑换券/分红池:**保持全局逻辑不变**(你未要求按商品控制) - -## 结算逻辑 - -新增 [`addons/feitian/library/GoodsRewardResolver.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\GoodsRewardResolver.php): - -```mermaid -flowchart LR - orderItems[订单明细] --> loadGoods[读取商品配置] - loadGoods --> lines[逐行 RewardLine] - lines --> referral[ReferralReward] - lines --> maker[MakerReward] - lines --> jdg[JiudaoguanReward] -``` - -核心方法: - -- `getOrderItems($order)`:复用 [`OrderQualify`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\OrderQualify.php) 的明细加载方式 -- `resolveLines($order)`:返回每行 `{ goods_id, pay_amount, enable_commission, enable_team, commission_rate, team_commission_rate, is_feitian_order }` - - `pay_amount` = 行实付(优先 `pay_price`,否则 `goods_price × goods_num`) -- `isRewardableLine($line)`:`is_feitian_order=1` 或整单金额命中 `standard_order_amount`(与现有 qualify 一致) - -**ReferralReward 改造**: -- 遍历可奖励明细行 -- `enable_commission=0` → 跳过 -- `commission_rate > 0` → 发放 `pay_amount × rate / 100` 给直推人(仍写 `feitian_referral_order`,`reward_type` 可沿用 `referral_*` 或新增 `referral_percent`) -- `commission_rate = 0` → 对该行仍走现有「前三单 398/400/600」逻辑(仅第一行触发一次,避免多单重复) - -**MakerReward / JiudaoguanReward 改造**: -- 先按明细行汇总各行的 `teamBase = pay_amount × team_commission_rate / 100`(rate=0 时用全局 base 120/50 作为该行贡献) -- 对 `enable_team=0` 的行贡献为 0 -- 将汇总后的 `base` 传入现有链式分配(创客等级差/平级/越级、酒道馆首/中/末级),**不重写链算法,只替换基数来源** -- 一单多商品、比例不同:按行分别算 base 再求和(避免错误合并) - -**混合购物车**:只有 `is_feitian_order=1` 的行(或标准品酒单金额整单)参与奖励;普通商品行贡献 0。 - -## 后台管理 UI - -在商品编辑页增加「飞天分销设置」分组(同时补上缺失的 `is_feitian_order` 开关): - -- 视图:[`application/admin/view/shopro/goods/goods/edit.html`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\goods\goods\edit.html)(放在「商品状态」附近) -- 脚本:[`public/assets/js/backend/shopro/goods/goods.js`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\public\assets\js\backend\shopro\goods\goods.js) - - `goodsDetailInit` 增加默认值 - - 校验:比例 0~100,启用开关与 `is_feitian_order` 联动提示 -- 控制器 [`Goods.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\goods\Goods.php) 已 `allowField(true)`,新字段随表单自动保存,无需大改 - -表单示意: - -- 团队分销商品(`is_feitian_order`)开关 -- 启用分佣 / 启用团队分销(switch) -- 分销佣金比例 % / 团队佣金比例 %(`el-input-number`,留空或 0 表示走全局固定规则) - -可选增强(非必须):商品列表页增加「分佣/团队」状态列,便于批量查看。 - -## 测试与数据 - -- 更新 [`database/seed/feitian-test-data.sql`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\database\seed\feitian-test-data.sql) 演示商品:例如 10% 分销 + 5% 团队 -- 扩展 [`addons/feitian/command/AcceptanceTest.php`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\command\AcceptanceTest.php) 覆盖: - - 比例为 0 → 与旧逻辑金额一致 - - 比例 > 0 → 1398 × 10% = 139.8 等 - - `enable_commission=0` / `enable_team=0` → 对应奖励为 0 - - 退款 [`RefundService`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\library\RefundService.php) 仍按 `order_id` 回滚(现有机制可复用) - -## 小程序端 - -**无需改动**:配置仅在后台维护,结算在后端 [`OrderHook`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\feitian\listener\OrderHook.php) 触发;用户端 [`hlst_wx/pages/app/feitian/reward-log.vue`](f:\修改的项目\恒链数通(重庆)科技有限公司\chufang.gynhc.com\hlst_wx\pages\app\feitian\reward-log.vue) 仍读 `feitian_reward_log`。 - -## 部署步骤 - -1. 执行 `database/seed/feitian-patch-goods-reward.sql` -2. 部署 PHP 代码变更 -3. 后台编辑商品验证保存与结算 -4. 跑 `php think feitian:acceptance_test`(或项目现有验收命令)回归 - -## 风险说明 - -- **一单多飞天商品且比例不同**:采用「逐行计算再汇总」,避免简单平均导致金额错误 -- **推荐奖前三单 vs 百分比**:比例为 0 时保留前三单固定金额;比例 > 0 时按百分比计,不再叠加 398/400/600(需在后台文案中说明) -- **团队比例与代理/分红**:本次仅影响 Maker/JDG 团队链,不影响区县代理等固定奖励 diff --git a/plan/子页面风格统一_7bee3db6.plan.md b/plan/子页面风格统一_7bee3db6.plan.md deleted file mode 100644 index a5edb3d..0000000 --- a/plan/子页面风格统一_7bee3db6.plan.md +++ /dev/null @@ -1,262 +0,0 @@ ---- -name: 子页面风格统一 -overview: 对 xgsc.gynhc.com_wx 小程序全部 76 个注册页面进行 UI 审计与分阶段改造:以首页「轻简奢品」设计体系为基准,通过全局 Token、共享布局组件和分包批量替换,消除红/紫/旧金等遗留配色,并统一子页面布局节奏。 -todos: - - id: phase0-tokens - content: "Phase 0: 扩展 theme.scss + index.scss 全局覆盖 + shopro-page-layout 组件 + shopro-navbar variant" - status: completed - - id: phase1-tabs - content: "Phase 1: 统一 category/cart/user Tab 页配色与布局,修复 CSS typo" - status: completed - - id: phase2-activity - content: "Phase 2A: 改造 pages/activity/* 9 页 — 去除红色促销主题,统一卡片/CTA/价格" - status: completed - - id: phase2-commission - content: "Phase 2B: 改造 pages/app/commission/* 8 页 — 紫色 hero 改品牌渐变" - status: completed - - id: phase2-order - content: "Phase 2C: 改造 pages/order/* 12 页 — 旧金按钮/状态色/三段式布局" - status: completed - - id: phase3-goods-user - content: "Phase 3: 改造 goods/* + user/* + app/* 剩余页面" - status: completed - - id: phase4-public - content: "Phase 4: 改造 public/* 及其他零散页面" - status: completed - - id: verify-qa - content: "全量验证: 微信开发者工具预览 + 遗留色 grep 清零 + 各分包抽查" - status: completed -isProject: false ---- - -# 雄哥小酒小程序 — 全子页面风格统一与布局优化计划 - -## 项目现状 - -- **技术栈:** uni-app + uView UI + Shopro 电商框架(源码为 `.vue`,非直接编辑 `.wxml/.wxss`) -- **页面规模:** [`pages.json`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages.json) 注册 **76 个路由**(6 个子包 + 4 Tab 页) -- **首页基准:** [`pages/index/index.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\index.vue) — 暖白渐变头图 + 24rpx 边距 + 12rpx 卡片圆角 + 香槟金 accent -- **设计规范已存在:** [`static/style/theme.scss`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static\style\theme.scss) + [`design-system/default/MASTER.md`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\design-system\default\MASTER.md) -- **UI/UX ProMax 结论:** 奢侈品电商方向(暖白底 + 金色 accent + Cormorant/Montserrat),与现有 MASTER 一致;**反模式:** 高饱和红橙促销块、紫色调分销页 - -```mermaid -flowchart TD - subgraph baseline [首页设计基准] - Home[index.vue] - Tokens[theme.scss] - NavBar[shopro-navbar] - TabBar[shopro-tabbar] - end - subgraph broken [主要不一致区域] - Activity[activity 9页 红色促销] - Commission[commission 8页 紫色分销] - Order[order 12页 旧金按钮] - Default[54页 默认白导航] - end - subgraph fix [统一策略] - Global[全局 Token 层] - Layout[标准子页布局] - Batch[分包批量替换] - end - baseline --> fix - broken --> fix - fix --> AllPages[76页统一视觉] -``` - ---- - -## 首页风格基准(改造目标) - -| 维度 | 规范 | SCSS Token | -|------|------|------------| -| 页面底色 | `#FAFAF8` 暖白 | `$brand-page-bg` | -| 头图渐变 | `#FAFAF8 → #F5EFE4` | `$brand-header-gradient` | -| 主 accent | 香槟金 `#C4A574` | `$brand-gold` / `$brand-gold-gradient` | -| 辅助色 | 清透天蓝 `#5C9FD4`(小面积) | `$brand-primary` | -| 价格 | 柔和酒红 `#C45C5C` | `$brand-price` | -| 正文 | `#2C2C2C` / 副文 `#999` | `$brand-text` / `$brand-text-muted` | -| 卡片 | 白底、12rpx 圆角、轻阴影 | `$brand-card-radius` / `$brand-shadow` | -| 水平边距 | 24rpx | 统一 gutter | -| 区块间距 | 16/24/32rpx 三级 | 8dp 节奏 | - -**字体策略(UI/UX ProMax + 小程序约束):** MASTER 指定 Cormorant/Montserrat,但小程序不宜依赖 Google Fonts CDN。建议 **保留 OPPOSANS 作为正文字体**(已在 [`static/style/index.scss`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static\style\index.scss) 全局加载),标题/价格可选用已有 `wenyue` 装饰字体;更新 MASTER 注明「小程序实现 = OPPOSANS」。 - ---- - -## 核心问题清单 - -### 1. 全局层不一致(影响所有子页) - -- uView 工具类 `.page_box` 背景为 `#f3f4f6`,与 `$brand-page-bg #FAFAF8` 冲突 -- 仅约 **30/115** 个 page 级 `.vue` 使用了 `$brand-*` Token -- 约 **20+** 文件仍含 `#ff0000`、`#d01325`、`#a36fff` 等遗留色 - -### 2. 分包视觉断裂(优先级最高) - -| 分包 | 页面数 | 主要问题 | -|------|--------|----------| -| `pages/activity/*` | 9 | 红色促销头图、橙红 CTA、`#FF0000` Tab | -| `pages/app/commission/*` | 8 | 紫色渐变 hero `#a36fff→#5336ff`,与品牌完全脱节 | -| `pages/order/*` | 12 | 旧金按钮 `#e9b461→#eecc89`、红色状态 `#e50808` | -| `pages/index/category*` | 4 布局 | 侧栏 `#F6F6F6`、选中态用蓝色 primary 而非金色 | -| `pages/index/cart` | 1 | 头部 `#f7f5f6`、删除按钮橙红渐变 | - -### 3. 导航栏不统一 - -- **22 页** custom nav(`shopro-navbar` 或自写) -- **54 页** 系统默认白导航 -- 子页缺少首页的渐变头图感,层级感弱 - -### 4. 布局格式问题 - -- 混用 `page_box/content_box/head_box/foot_box` 与自由布局,边距 20/24/30rpx 不统一 -- 固定底栏页(购物车、确认订单、商品详情)底部安全区 padding 不一致 -- 个别 CSS 错误:`userinfo-card.vue` 的 `powidth: 100%`;`two-catgory.vue` 的 `#ffff` 无效色值 - -### 5. 特殊页面 - -- `pages/live/list2.nvue`、`pages/user/live.nvue` — nvue 样式体系独立,需单独处理或保持功能优先 -- `pages/index/user-copy.vue`、`pages/user/live-copy.nvue` — 未注册孤儿文件,建议删除或忽略 - ---- - -## 实施方案 - -### Phase 0 — 基础设施(一次改动,全局生效) - -**目标:** 让所有子页自动继承首页 Token,减少逐页硬编码。 - -1. **扩展 [`static/style/theme.scss`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static\style\theme.scss)** - - 新增语义化 mixin/类:`.brand-page`、`.brand-card`、`.brand-btn-primary`、`.brand-btn-gold`、`.brand-price-text`、`.brand-section-gap` - - 新增布局 Token:`$brand-page-gutter: 24rpx`、`$brand-section-gap: 24rpx` - -2. **修正全局样式 [`static/style/index.scss`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static\style\index.scss)** - - 覆盖 uView `.page_box { background: $brand-page-bg !important; }` - - 统一 `.head_box` / `.foot_box` 间距与安全区 `padding-bottom: env(safe-area-inset-bottom)` - -3. **增强 [`components/shopro-navbar/shopro-navbar.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components\shopro-navbar\shopro-navbar.vue)** - - 新增 `variant` prop:`white`(默认)| `gradient`(子页用首页渐变) - - 统一返回图标色 `$brand-text`、标题字重 - -4. **新建子页布局组件 `components/shopro-page-layout/shopro-page-layout.vue`** - - 标准结构:`navbar(optional)` → `scroll-content(24rpx gutter)` → `fixed-footer(optional)` - - 供 order/user/public 等列表/表单页复用,消除各页自写 flex 结构差异 - -5. **同步 JS Token [`shopro/config/theme.js`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro\config\theme.js)** — inline style 场景统一引用 - -6. **更新 MASTER.md** — 补充「小程序字体 = OPPOSANS」及子页布局规范 - ---- - -### Phase 1 — Tab 页对齐首页(4 页 + 组件) - -| 文件 | 改造要点 | -|------|----------| -| [`pages/index/category/*.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\category) | 侧栏改 `$brand-gold-light`;选中态改 `$brand-gold`;修复 `#ffff` typo | -| [`pages/index/cart.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\cart.vue) | 头部/列表区 Token 化;删除按钮改 `$brand-price` 或 `$brand-gold-gradient`;底部结算栏对齐首页 CTA | -| [`pages/index/user.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\user.vue) + [`userinfo-card.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\user\userinfo-card.vue) | 去除 `#c9912c` 旧金;修复 `powidth` typo;版权色改 `$brand-text-muted` | - ---- - -### Phase 2 — 高视觉断裂分包(29 页) - -#### 2A. 活动页 `pages/activity/*`(9 页) - -- 替换 CDN 红色头图为 **渐变 + 品牌标题** 或保留图片但叠加 `$brand-header-gradient` 遮罩 -- CTA:`linear-gradient(90deg, #d01325, #ed3c30)` → `$brand-gold-gradient` -- 价格:`#ff0000` → `$brand-price` -- 进度条:`#ffbbbb` → `$brand-gold-light` + `$brand-gold` 填充 -- [`discounts/list.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\activity\discounts\list.vue) Tab 背景 `#FF0000` → `$brand-gold` -- 统一卡片:白底 + `$brand-card-radius` + `$brand-shadow` - -#### 2B. 分销页 `pages/app/commission/*`(8 页) - -- Hero 紫色渐变 → `$brand-header-gradient` + 金色数据高亮 -- Tab/按钮 inactive `#7430EE` → `$brand-text-muted`;active → `$brand-gold` -- 保留数据可视化结构,只换色板和间距 - -#### 2C. 订单流 `pages/order/*`(12 页) - -- 列表 Tab 指示器、操作按钮统一 `$brand-gold-gradient` -- 状态色:取消/失败用 `$brand-price`;进行中用 `$brand-primary` -- 确认订单 [`confirm.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\order\confirm.vue) 复选框 `#f0c785` → `$brand-gold` -- 引入 `shopro-page-layout` 统一 head/content/foot 三段式 - ---- - -### Phase 3 — 商品与用户分包(18 页) - -| 分组 | 文件 | 要点 | -|------|------|------| -| 商品 | `goods/list.vue`, `goods/detail.vue`, `comment/*` | detail 浮层导航保持;清理 `#fa3534`/`#f00`;list 加 24rpx gutter | -| 用户 | `user/wallet/*`, `user/address/*`, `user/info.vue` 等 | custom nav 页改 `variant="gradient"`;列表 cell 统一白卡片间距 | -| App | `app/coupon/*`, `app/store/*`, `app/score/*`, `app/merchant/*`, `app/video/*` | 已有 partial Token 的保留;其余按标准布局组件包裹 | - ---- - -### Phase 4 — 公共与其他页(15 页) - -- [`pages/public/search.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\public\search.vue) — 搜索框背景改 `$brand-gold-light` -- [`pages/public/chat/index.vue`](F:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\public\chat\index.vue) — navbar gradient -- `faq/feedback/richtext/404` — 最小改动:page bg + 内容区 24rpx padding -- `pages/index/view.vue`, `protocol.vue`, `live/list.vue` — 跟随全局 Token - ---- - -## 子页布局优化标准(UI/UX ProMax 约束) - -所有子页统一遵循: - -``` -┌─────────────────────────┐ -│ shopro-navbar (gradient/white) │ ← 可选,非 Tab 页 -├─────────────────────────┤ -│ scroll-content │ -│ padding: 0 24rpx │ ← $brand-page-gutter -│ ┌─────────────────┐ │ -│ │ brand-card │ │ ← 12rpx radius, shadow -│ │ section gap 24rpx│ │ -│ └─────────────────┘ │ -├─────────────────────────┤ -│ fixed-footer (if any) │ ← safe-area-inset-bottom -└─────────────────────────┘ -``` - -- **触控间距:** 相邻可点击元素 ≥ 16rpx(8dp) -- **列表页:** 卡片间距 24rpx,避免 `#f5f5f5`/`#f6f6f6`/`#f7f5f6` 混用 -- **空状态:** 统一 `shopro-empty` 组件 -- **加载态:** 统一 `shopro-loading` / `page-loading` - ---- - -## 改造范围与工作量估算 - -| 阶段 | 页面/文件数 | 预估改动 | -|------|-------------|----------| -| Phase 0 基础设施 | ~8 文件 | 全局 Token + 2 组件 | -| Phase 1 Tab 页 | 7 文件 | 配色 + 布局 | -| Phase 2 活动/分销/订单 | 29 页 | 配色大改 + 布局 | -| Phase 3 商品/用户/App | 18 页 | 中等 | -| Phase 4 公共/其他 | 15 页 | 轻量 | -| nvue 特殊页 | 2 页 | 单独评估 | - -**建议执行顺序:** Phase 0 → 1 → 2A → 2B → 2C → 3 → 4 - ---- - -## 验证清单 - -- 在微信开发者工具预览 **375px 宽度**(iPhone SE 基准) -- 抽查每分包至少 1 页:活动、订单、分销、商品详情、钱包 -- 对比首页截图:底色、金色 accent、卡片圆角、价格色一致 -- Tab 页切换无闪烁;固定底栏不遮挡内容 -- 搜索遗留色:`rg "#(ff0000|d01325|a36fff|e9b461|f0c785)" pages/` 应为 0 - ---- - -## 风险与说明 - -- **不改业务逻辑:** 仅改样式/布局结构,不动 API 与交互流程 -- **nvue 页面限制:** `list2.nvue`、`live.nvue` 不支持 SCSS mixin,需用内联或独立 wxss 变量 -- **编译产物:** 修改源码 `.vue` 后需 `npm run dev:mp-weixin` 或 `build:mp-weixin` 重新编译 -- **Typography 大改风险高:** 不建议本次全量换 Cormorant/Montserrat,避免包体积和加载问题 diff --git a/plan/字体背景风格优化_63a32b86.plan.md b/plan/字体背景风格优化_63a32b86.plan.md deleted file mode 100644 index 8bad44e..0000000 --- a/plan/字体背景风格优化_63a32b86.plan.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -name: 字体背景风格优化 -overview: 在 gsyuniapp 前端建立统一的字体层级与色彩规范(参考淘宝清爽风格),放大图1-3圈出区域字号,背景统一为白/浅灰,并用红色突出价格、优惠、加入购物车等关键操作,提升中老年用户可读性与操作引导。 -todos: - - id: theme-vars - content: 在 uni.scss / index.scss 新增字号阶梯、促销红色、统一背景变量及工具类 - status: pending - - id: home-page - content: 优化首页:sh-grid-swiper 分类字、shopro-tabbar 字号、商品卡价格红色、背景去绿调 - status: pending - - id: cart-page - content: 购物车页:checkbox/价格/结算按钮改红,字号放大,背景统一 - status: pending - - id: detail-page - content: 商品详情:原价/副标题标签放大改红,底部按钮改红,背景统一 - status: pending - - id: color-cleanup - content: 批量替换硬编码色值为 SCSS 变量,统一 sh-activity 等优惠标签红色 - status: pending - - id: verify - content: 微信/H5 预览验证图1-3圈出区域效果 - status: pending -isProject: false ---- - -# 字体与背景统一优化方案(淘宝风格) - -## 现状分析 - -项目为 `gsyuniapp/`(uni-app + uView + shopro),已有全局字体 **OPPOSANS**,但存在三类问题: - -| 问题 | 表现 | -|------|------| -| 字号偏小 | 底部导航 `20rpx`、金刚区分类 `24rpx`、详情副标题 `25rpx`、原价 `24rpx` | -| 色彩单一 | 购物车 checkbox/价格/结算、详情标签/按钮大量用绿色 `#5EAD82`,与价格红 `#E53935` 混用,缺乏层次 | -| 背景不统一 | 首页带绿调渐变、详情 `#F7F8FA`、购物车 `#f5f7f6`、卡片 `#f7f8fa` 等多套灰绿背景 | - -```mermaid -flowchart LR - subgraph before [当前问题] - A[全局绿主题] --> B[价格/按钮/勾选全绿] - C[字号不统一] --> D[小字难辨认] - end - subgraph after [优化后] - E[品牌绿: 导航/Tab] --> F[红色: 价格/优惠/CTA] - G[统一字号阶梯] --> H[清爽白底卡片] - end -``` - -## 设计原则(对齐图4淘宝风格) - -- **字体**:全站统一 OPPOSANS + 系统回退(PingFang SC),建立字号阶梯,数字加 `font-variant-numeric: tabular-nums` 保证对齐 -- **背景**:页面底 `#F5F5F5`,卡片 `#FFFFFF`,去掉绿调渐变 -- **色彩分工**: - - **品牌绿 `#5EAD82`**:保留在 Tab 选中态、顶部导航、品牌装饰 - - **促销红 `#FF4D4F`**(接近淘宝 `#FF5000`):价格、优惠价标签、checkbox 选中、加入购物车、结算、优惠/服务标签 - -## 第一步:全局主题变量(改一处影响全站) - -**文件:[`gsyuniapp/uni.scss`](gsyuniapp/uni.scss)** - -新增变量: - -```scss -// 促销/行动色(淘宝风格红) -$gsy-price: #FF4D4F; -$gsy-price-light: #FFF1F0; -$gsy-cta: #FF4D4F; -$gsy-cta-dark: #E63E40; - -// 统一背景 -$gsy-bg: #F5F5F5; // 去掉绿调 -$gsy-card: #FFFFFF; - -// 字号阶梯 -$font-size-xs: 22rpx; -$font-size-sm: 26rpx; -$font-size-base: 30rpx; -$font-size-md: 32rpx; -$font-size-lg: 36rpx; -$font-size-xl: 40rpx; -``` - -同步更新 `$u-type-error` 为 `$gsy-price`,便于 uView checkbox 等组件复用。 - -**文件:[`gsyuniapp/static/style/index.scss`](gsyuniapp/static/style/index.scss)** - -- `page` 基础字号 `30rpx` → `32rpx` -- 增加工具类:`.gsy-price`、`.gsy-text-promo`、`.gsy-font-tabular` -- 全局数字/价格使用 tabular-nums - -## 第二步:图1 首页圈出区域 - -### 金刚区分类文字(名酒鉴赏等) - -**文件:[`gsyuniapp/pages/index/components/sh-grid-swiper.vue`](gsyuniapp/pages/index/components/sh-grid-swiper.vue)** - -| 属性 | 当前 | 调整后 | -|------|------|--------| -| `.tab-title` 字号 | `24rpx` | `28rpx` | -| 字重 | `400` | `500` | -| 颜色 | `#6B7B6C` | `#333333` | - -### 底部导航文字 - -**文件:[`gsyuniapp/components/shopro-tabbar/shopro-tabbar.vue`](gsyuniapp/components/shopro-tabbar/shopro-tabbar.vue)** - -| 属性 | 当前 | 调整后 | -|------|------|--------| -| `.tabbar-text` 字号 | `20rpx` | `24rpx` | -| 字重 | `500` | `500`(保持) | -| 选中色 | 绿 `#5EAD82` | 保持绿色(品牌识别) | - -同步更新 [`gsyuniapp/pages.json`](gsyuniapp/pages.json) 中 tabBar `fontSize`(如有配置)。 - -### 首页商品卡价格 - -**文件:** -- [`gsyuniapp/components/shopro-goods-card/shopro-goods-card.vue`](gsyuniapp/components/shopro-goods-card/shopro-goods-card.vue) -- [`gsyuniapp/pages/index/components/sh-goods-card.vue`](gsyuniapp/pages/index/components/sh-goods-card.vue) - -- 现价颜色 `#1A1A1A` / 绿 → `$gsy-price` 红色 -- 现价字号 `36rpx` → `38rpx` -- 副标题/标签字号 `20-22rpx` → `24rpx` -- 购物车图标按钮可加红色描边或红色图标,增强行动引导 - -### 首页背景 - -**文件:[`gsyuniapp/pages/index/index.vue`](gsyuniapp/pages/index/index.vue)** - -- 顶部渐变 `#F0F4F2 → #F5F7F5` 改为中性 `#F5F5F5 → #FFFFFF` - -## 第三步:图2 购物车圈出区域 - -**文件:[`gsyuniapp/pages/index/cart.vue`](gsyuniapp/pages/index/cart.vue)** - -| 元素 | 当前 | 调整后 | -|------|------|--------| -| checkbox `activeColor` | `#5EAD82` | `$gsy-price` 红 | -| 商品单价/合计 | 绿色 | 红色,字号 `36rpx` → `40rpx` | -| 结算按钮 | 绿渐变 | 红渐变 `#FF4D4F → #E63E40` | -| 页面背景 | `#f5f7f6` | `$gsy-bg #F5F5F5` | -| 列表标题区字号 | `24rpx` | `28rpx` | - -## 第四步:图3 商品详情圈出区域 - -### 原价行 - -**文件:[`gsyuniapp/pages/goods/components/sh-price-card.vue`](gsyuniapp/pages/goods/components/sh-price-card.vue)** - -| 属性 | 当前 | 调整后 | -|------|------|--------| -| `.original-price` 字号 | `24rpx` | `28rpx` | -| 颜色 | `#999999` | `#999999`(保持灰色删除线,仅放大) | -| 主价格色 | `#E53935` | 统一为 `$gsy-price #FF4D4F` | -| `.notice-tag`「优惠价」 | 红底浅粉 | 保持红色强调,字号 `22rpx` → `24rpx` | - -### 副标题标签(观物 纯粮固态发酵) - -**文件:[`gsyuniapp/pages/goods/detail.vue`](gsyuniapp/pages/goods/detail.vue)** `.goods-sub-title` - -| 属性 | 当前 | 调整后 | -|------|------|--------| -| 字号 | `25rpx` | `28rpx` | -| 颜色/背景 | 绿字 `#387656` / 绿底 `#F0F7F3` | 红字 `$gsy-price` / 红浅底 `$gsy-price-light` | - -### 底部操作按钮 - -**文件:[`gsyuniapp/pages/goods/detail.vue`](gsyuniapp/pages/goods/detail.vue)** `.secondary-action-btn` / `.primary-action-btn` - -| 按钮 | 当前 | 调整后 | -|------|------|--------| -| 加入购物车 | 浅绿底 + 绿字 | 白底 + 红边红字,或浅红底红字 | -| 立即购买 | 绿渐变 | 红渐变 `#FF4D4F → #E63E40` | -| 字号 | `28rpx` | `30rpx` | - -### 优惠/服务标签 - -**文件:[`gsyuniapp/pages/goods/components/sh-activity.vue`](gsyuniapp/pages/goods/components/sh-activity.vue)** - -- 已用 ColorUI `.bg-red` / `.line-red`,将 [`colorui-mini.css`](gsyuniapp/static/style/colorui-mini.css) 中红色统一为 `$gsy-price`,标签字号加大至 `26rpx` - -### 详情页背景 - -- `detail.vue` 中 `#F7F8FA` → `$gsy-bg #F5F5F5`,卡片保持白底 - -## 第五步:硬编码色值批量替换 - -用 `$gsy-price` / `$gsy-primary` 变量替换以下文件中散落的 `#5EAD82`(仅限价格/CTA 场景)、`#E53935`、`#e04a4a` 等: - -- `cart.vue` -- `detail.vue` -- `sh-price-card.vue` -- `shopro-goods-card.vue` -- `sh-goods-card.vue` -- `shopro-tabbar.vue`(仅保留导航绿,不动角标红) - -可用命令辅助排查:`rg "#5[Ee][Aa][Dd]82|#E53935" gsyuniapp/` - -## 不涉及的范围 - -- 后台装修数据(`fa_shopro_decorate_content` 中标题色 `#2C3E2D`)——前端组件已有 fallback,无需改库 -- 不新增「7天无理由」文案(用户已说明不支持) -- 不更换字体文件(OPPOSANS 已满足「一种字体、大小不同」的需求) - -## 验证清单 - -1. 首页:金刚区 5 个分类名、底部 Tab 文字明显变大变清晰 -2. 首页商品列表:价格显示红色,背景统一白/浅灰 -3. 购物车:勾选框选中红色,价格/合计红色,结算按钮红色 -4. 商品详情:原价行更大,副标题标签红色醒目,「加入购物车」「立即购买」红色系 -5. 全站数字(价格、数量)视觉风格一致,无绿/红/黑混用突兀感 -6. 微信小程序 + H5 编译预览,确认字号在各端正常渲染 diff --git a/plan/实施进度汇总.md b/plan/实施进度汇总.md deleted file mode 100644 index a746053..0000000 --- a/plan/实施进度汇总.md +++ /dev/null @@ -1,158 +0,0 @@ -# 厨房商城项目实施进度汇总 - -更新时间:2026-09-12 - ---- - -## 一、区域代理(已完成 ✅) - -详见 [对话摘要-区域代理实施.md](./chat-backup/对话摘要-区域代理实施.md) - -P0/P1/P2 全部完成:等级 CRUD、分佣模式、看板、筛选导出、单代理自定义佣金、测试脚本等。 - ---- - -## 二、汇付支付 + 延时分账(已完成 ✅) - -| 任务 | 状态 | 关键文件 | -|------|------|----------| -| shopro_huifu 插件化 | ✅ | `addons/shopro_huifu/` | -| 微信小程序支付 | ✅ | `library/HuifuPay.php`、PayCreateHook | -| 延时分账(支付后/确认收货可选) | ✅ | `ProfitSharingService.php`、后台配置 | -| 分账接收方管理 | ✅ | 后台 split/receiver | -| 安装/验证命令 | ✅ | `shopro_huifu:install`、`verify`、`split-retry` | -| 后台配置页 | ✅ | `/admin/shopro_huifu/config` | - -**部署**: -```bash -php think shopro_huifu:install -php think shopro_huifu:verify -``` - ---- - -## 三、汇付个人进件(基本完成 ✅,待运营验证) - -| 任务 | 状态 | 关键文件 | -|------|------|----------| -| 进件数据表 + API | ✅ | `upgrade_huifu_onboard.sql` | -| 分销申请强制进件 | ✅ | `commission/Agent.php` + Hook | -| 区域代理申请强制进件 | ✅ | `regional_agent/RegionalAgent.php` | -| 小程序进件表单 | ✅ | `pages/app/commission/apply` | -| 提现页进件绑定(子页) | ✅ | `pages/user/wallet/withdraw/bind` | -| 后台进件审核 | ✅ | `/admin/shopro_huifu/onboard` | -| 轮询进件状态 | ✅ | `shopro_huifu:onboard-poll` | - -**部署**: -```bash -php think shopro_huifu:install-full -php think shopro_huifu:onboard-poll -``` - -**待验证**: -- [ ] 汇付沙箱/生产进件全流程 -- [ ] 进件通过后分账 receiver 自动同步 - ---- - -## 四、微信发货信息同步(已开发 ✅,待微信侧授权) - -| 任务 | 状态 | 关键文件 | -|------|------|----------| -| shopro_wechat_trade 插件 | ✅ | `addons/shopro_wechat_trade/` | -| 发货信息上报 | ✅ | `WxShippingService.php` | -| 后台配置 | ✅ | `/admin/shopro_wechat_trade/config` | -| 安装/验证命令 | ✅ | `shopro_wechat_trade:install`、`verify` | - -**前置条件**: -- [ ] 小程序后台签署「订单中心」授权协议 -- [ ] 经营类目在开放范围内(或已申请接入) -- [ ] 配置订单详情 path:`pages/order/detail` - ---- - -## 五、阿里云快递查询(已完成 ✅) - -| 任务 | 状态 | 关键文件 | -|------|------|----------| -| shopro_aliyun_express 插件 | ✅ | `addons/shopro_aliyun_express/` | -| Provider 切换 | ✅ | 后台物流配置 | -| 轨迹查询/刷新 | ✅ | `AliyunExpressProvider.php` | - -**部署**: -```bash -php think shopro_aliyun_express:install-full -``` - ---- - -## 六、小程序 UI / 体验 - -| 任务 | 状态 | 说明 | -|------|------|------| -| 首页 E-Final 布局 | ✅ | 分类网格、配色统一 | -| 敏感文案替换(代理→公司、佣金→差价) | ✅ | 小程序 + 后台 | -| 首页图片压缩/清理 | ✅ | 减小包体积 | -| 提现页 + 进件绑定子页 | ✅ | 角色可见控制 | - -**待办**: -- [ ] 小程序重新编译发布(`xgsc.gynhc.com_wx`) -- [ ] 真机全链路验收 - ---- - -## 七、分销功能(参考计划,部分待续) - -详见: -- [shopro分销重构方案](./shopro分销重构方案_7c67d97d.plan.md) -- [级差奖管理奖改造](./级差奖管理奖改造_7a3ea896.plan.md) -- [分销需求差异核对](./分销需求差异核对_53c87321.plan.md) - -```bash -php addons/shopro/tests/commission_setup_test_users.php -php addons/shopro/tests/commission_verify.php scenarios -``` - ---- - -## 八、部署 Checklist(汇总) - -### 数据库(按顺序) - -1. `upgrade_distribution_features.sql` -2. `upgrade_regional_agent_menu.sql` -3. `upgrade_regional_agent_commission.sql` -4. `upgrade_huifu_pay_type.sql` + `upgrade_huifu_split.sql` -5. 汇付进件表(`shopro_huifu:install-full` 自动执行) - -### 插件安装 - -```bash -php think shopro_huifu:install -php think shopro_huifu:install-full -php think shopro_wechat_trade:install -php think shopro_aliyun_express:install-full -``` - -### 验证 - -```bash -php think shopro_huifu:verify -php think shopro_wechat_trade:verify -php addons/shopro/tests/regional_agent_verify.php list-agents -``` - -### 后台 - -- 汇付:配置 huifu_id、密钥、分账时机 -- 微信交易:配置 AppID、订单 path -- 物流:选择阿里云全国快递 + AppCode -- 区域代理:分配权限、确认等级比例 - ---- - -## 九、文档索引 - -- [README.md](./README.md) — 全部计划文档索引 -- [对话摘要-2026-09-12打包.md](./chat-backup/对话摘要-2026-09-12打包.md) — 近期会话汇总 -- [对话摘要-区域代理实施.md](./chat-backup/对话摘要-区域代理实施.md) — 区域代理专项 diff --git a/plan/微信发货信息同步_b8fd57f1.plan.md b/plan/微信发货信息同步_b8fd57f1.plan.md deleted file mode 100644 index f54db47..0000000 --- a/plan/微信发货信息同步_b8fd57f1.plan.md +++ /dev/null @@ -1,315 +0,0 @@ ---- -name: 微信发货信息同步 -overview: 新建独立插件 `addons/shopro_wechat_trade`,在 Shopro 的 `order_send_after` / `order_confirm_after` 钩子上对接微信小程序订单发货管理与购物订单能力;同时修正汇付支付通知中微信 `transaction_id` 的落库,以支持聚合支付场景下的发货同步与历史补传。 -todos: - - id: ops-prereq - content: 小程序后台签署订单中心协议并开通发货信息管理服务 - status: completed - - id: huifu-wx-txn - content: shopro_huifu:HuifuNotifyHandler 解析并落库 wx_transaction_id / sub_mch_id / sub_openid - status: completed - - id: plugin-scaffold - content: 创建 addons/shopro_wechat_trade 插件骨架(install/hooks/appInit/SQL) - status: completed - - id: wx-api-client - content: 实现 WxTradeClient + WxOrderPathService + WxShippingService - status: completed - - id: mp-detail-route - content: 小程序 detail 页与 API 支持 order_sn 参数;配置 update_order_detail_path - status: completed - - id: shipping-hook - content: ShippingHook 挂 order_send_after + Queue 异步 upload_shipping_info - status: completed - - id: confirm-hook - content: ConfirmHook 挂 order_confirm_after 调用 notify_confirm_receive - status: completed - - id: backfill-retry - content: CLI 历史补传与失败重试 + 后台同步日志页 - status: completed - - id: e2e-test - content: 直连/汇付/分拆发货/确认收货全链路联调 - status: completed -isProject: false ---- - -# Shopro 微信发货信息同步接入方案 - -## 背景与目标 - -微信对实物交易类小程序要求接入 [小程序购物订单](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order_center/order_center.html) 与 [发货信息管理服务](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order_center/order_center.html)(含 `upload_shipping_info`、订单详情路径配置等)。当前项目: - -- [`order_send_after`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\hooks.php) 已有,由 [`Send::orderSendAfter`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\listener\order\Send.php) 处理站内通知/自动确认队列 -- 商城内部发货逻辑在 [`OrderOperSendGet::sendItem`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\traits\model\order\OrderOperSendGet.php) 触发钩子 -- **无任何** `upload_shipping_info` / `update_order_detail_path` 实现 -- 汇付通道下 [`HuifuNotifyHandler`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\library\HuifuNotifyHandler.php) 将 `hf_seq_id` 写入 `order.transaction_id`,**不是**微信侧 `420000...` 流水,后续无法正确调用微信发货 API - -```mermaid -sequenceDiagram - participant Admin as 后台发货 - participant Shopro as Shopro_sendItem - participant Hook as order_send_after - participant Plugin as shopro_wechat_trade - participant WX as 微信API - - Admin->>Shopro: expressSendItem / autoSendItem - Shopro->>Hook: order + item - Hook->>Plugin: WxShippingHook - Plugin->>Plugin: 校验平台/支付方式/幂等 - Plugin->>WX: upload_shipping_info - WX-->>Plugin: errcode=0 - Plugin->>Plugin: 记录同步状态 -``` - ---- - -## 模块归属(已确认) - -新建 **`addons/shopro_wechat_trade`** 独立插件,在 `appInit` 动态注册 Hook(与 [`shopro_huifu`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\Shopro_huifu.php) 同模式)。Shopro 核心 **仅增加 0 行**(钩子点已存在)。 - -汇付侧 **小改** [`shopro_huifu`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu):支付通知时额外提取并保存微信 `transaction_id` / `sub_mch_id`(供发货插件读取)。 - ---- - -## 一、微信侧前置(运营手动,开发前先完成) - -在小程序后台(`wx5c95f038d5974a40`)完成: - -1. **签署订单中心授权协议**(否则 `update_order_detail_path` 返回 `10060034`) -2. **开通发货信息管理服务**(支付与交易 → 订单管理 / 购物订单) -3. 确认实物交易类运营规范已满足(对应你通知中心 8/20 的两条接入通知) - -插件安装时自动调用一次 `update_order_detail_path`;失败则后台给出明确提示,不阻塞商城发货本身。 - ---- - -## 二、插件目录结构 - -``` -addons/shopro_wechat_trade/ -├── Shopro_wechat_trade.php # install/enable/disable/appInit -├── info.ini -├── hooks.php # order_send_after, order_confirm_after -├── install.sql -├── config/menu.php # 同步日志 + 配置页(可选) -├── library/ -│ ├── Bridge.php # isEnabled / shouldHandleOrder -│ ├── WxTradeClient.php # access_token + HTTP 封装 -│ ├── WxOrderPathService.php # update/get_order_detail_path -│ ├── WxShippingService.php # upload_shipping_info / notify_confirm_receive -│ ├── WxExpressMapper.php # shopro express_code → 微信运力编码 -│ └── WxShippingPayload.php # 订单→微信 DTO 转换 -├── listener/ -│ ├── ShippingHook.php # order_send_after -│ └── ConfirmHook.php # order_confirm_after -└── command/ - ├── InitOrderPath.php # 初始化订单详情路径 - └── BackfillShipping.php # 历史已发货订单补传 -``` - ---- - -## 三、数据库设计 - -新建表 `shopro_wechat_trade_sync`(插件私有): - -| 字段 | 说明 | -|------|------| -| `order_id` / `order_sn` | 订单标识 | -| `order_item_id` | 子单发货时为 item id;整单发货为 0 | -| `sync_type` | `shipping` / `confirm` | -| `status` | `pending` / `success` / `failed` | -| `delivery_mode` | 1=统一发货 2=分拆发货 | -| `request_payload` / `response_payload` | 脱敏日志 | -| `errcode` / `errmsg` | 微信返回 | -| `retry_count` / `next_retry_time` | 重试调度 | - -**汇付扩展表补字段**([`shopro_huifu_pay_ext.extra`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\install.sql) JSON 或独立列): - -- `wx_transaction_id`:微信 `420000...`(优先 `wx_response.transaction_id`,备选 `out_trans_id`) -- `wx_sub_mch_id`:微信子商户号(`wx_response.sub_mch_id`) -- `wx_sub_openid`:支付用户 openid - -> 直连微信订单:`shopro_order.transaction_id` 已是微信流水,可直接使用。 - ---- - -## 四、关键改造点 - -### 4.1 汇付支付通知:保存微信流水(shopro_huifu 小改) - -文件:[`HuifuNotifyHandler.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\library\HuifuNotifyHandler.php) - -支付成功时从 `resp_data` 解析: - -```php -// 伪代码 -$wxResp = json_decode($data['wx_response'] ?? '{}', true); -$wxTransactionId = $wxResp['transaction_id'] ?? ($data['out_trans_id'] ?? ''); -$wxSubMchId = $wxResp['sub_mch_id'] ?? ''; -``` - -- `order.transaction_id` **改为存** `$wxTransactionId`(微信发货/购物订单依赖此值) -- `hf_seq_id` 仍存 `shopro_huifu_pay_ext.hf_seq_id`(汇付查单/退款不变) -- `extra` 字段保存完整 wx 标识供插件读取 - -> 若生产 notify 中字段名与文档不一致,先用一条真实成功 notify 样本对齐字段路径后再固化解析器(避免猜字段)。 - -### 4.2 订单详情路径(小程序端 + 服务端) - -微信要求 path 含 `${商品订单号}`,且该值为支付时的 `out_trade_no`(Shopro = [`order_sn`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\install.sql))。 - -当前小程序 [`pages/order/detail.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\order\detail.vue) 仅支持 `?id=`(订单主键),**需扩展**: - -- 服务端配置 path:`pages/order/detail?order_sn=${商品订单号}` -- 小程序 `onLoad` / `$Route.query` 增加 `order_sn` 分支:有 `order_sn` 时按订单号拉详情(需 Shopro API 支持 `order_sn` 查询,或在现有 detail 接口增加参数) - -### 4.3 `order_send_after` 监听逻辑 - -文件:新建 [`ShippingHook.php`](addons/shopro_wechat_trade/listener/ShippingHook.php) - -**触发条件(全部满足才同步)**: - -| 条件 | 来源 | -|------|------| -| `order.platform === 'wxMiniProgram'` | [`shopro_order.platform`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\install.sql) | -| `pay_type in ('wechat','huifu_wechat')` | 排除 wallet/score/未支付 | -| 存在有效微信流水 | `transaction_id` 或 pay_ext.wx_transaction_id | -| 插件已启用 | `Bridge::isEnabled()` | - -**配送方式映射**(`item.dispatch_type` → 微信 `logistics_type`): - -| Shopro | 微信 logistics_type | -|--------|---------------------| -| `express` | 1 快递 | -| `store` | 2 同城 | -| `autosend` | 3 虚拟/自动发货 | -| `selfetch` | 4 用户自提 | - -**发货模式**: - -- 订单仅 1 个待发货 item 或一次性全部发完 → `delivery_mode=1` -- 多 item 分批发货 → `delivery_mode=2`,`shipping_list` 按已发货 item 聚合;每次 `order_send_after` 重算已发列表并调用 `upload_shipping_info`(微信允许更新) - -**快递字段映射**: - -- `tracking_no` ← `item.express_no` -- `express_company` ← [`WxExpressMapper`](addons/shopro_wechat_trade/library/WxExpressMapper.php) 将 [`shopro_express.code`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\install.sql)(如 SF/YTO)转为微信运力编码;未映射时记 failed 并提示后台维护映射 - -**order_key 构造**(优先 transaction_id 模式,聚合支付更稳): - -```json -{ - "order_key": { - "order_number_type": 2, - "transaction_id": "420000..." - }, - "logistics_type": 1, - "delivery_mode": 1, - "shipping_list": [{ - "tracking_no": "...", - "express_company": "SF", - "item_desc": "商品标题摘要" - }], - "upload_time": "2026-09-10T12:00:00+08:00", - "payer": { "openid": "用户sub_openid" } -} -``` - -**openid 来源**:支付 notify 的 `sub_openid` / `buyer_email` 字段,或 `UserOauth` 表(platform=wxMiniProgram)。 - -**异步执行**:Hook 内不写同步 HTTP;投递 Queue `WxShippingJob`,避免发货接口阻塞后台操作。 - -### 4.4 `order_confirm_after` 确认收货同步 - -文件:新建 [`ConfirmHook.php`](addons/shopro_wechat_trade/listener/ConfirmHook.php) - -当订单全部 item `dispatch_status=已收货`(复用 [`Confirm::orderConfirmAfter`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\listener\order\Confirm.php) 中 `noConfirm <= 0` 判定): - -- 调用 `POST /wxa/sec/order/notify_confirm_receive` -- 传 `transaction_id` + 收货时间 -- 幂等写入 `shopro_wechat_trade_sync(sync_type=confirm)` - -### 4.5 微信 API 封装 - -复用现有 [`addons/shopro/library/Wechat.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\Wechat.php) 获取小程序 `access_token`(`wxMiniProgram` 配置),在 `WxTradeClient` 中封装: - -| API | 用途 | -|-----|------| -| `POST /wxa/sec/order/update_order_detail_path` | 安装/配置时写入跳转路径 | -| `POST /wxa/sec/order/get_order_detail_path` | 配置页展示 | -| `POST /wxa/sec/order/upload_shipping_info` | 发货同步 | -| `POST /wxa/sec/order/notify_confirm_receive` | 确认收货 | -| `GET /wxa/sec/order/is_trade_managed` | 后台自检是否已纳入管控 | - -参考文档:[小程序购物订单](https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order_center/order_center.html) - ---- - -## 五、与汇付方案的关系 - -| 项 | shopro_huifu(已有) | shopro_wechat_trade(新建) | -|----|----------------------|----------------------------| -| 职责 | 聚合支付下单/通知/分账 | 微信交易合规(订单展示+发货同步) | -| Hook | `shopro_pay_create` 等 | `order_send_after` / `order_confirm_after` | -| 适用范围 | 仅 huifu 通道 | 全部小程序微信支付(含 yansongda 直连) | -| 耦合点 | notify 落库 wx_transaction_id | 读取 order / pay_ext 发起微信 API | - -支付被微信拦截(「小程序违规」)的**解除**依赖:完成接入 + 历史订单补传 + 微信侧审核/解控(需运营确认,非纯代码可保证)。 - ---- - -## 六、后台与运维 - -**配置页**(插件内,精简): - -- 开关:`wechat_trade_enable` -- 订单详情 path(默认 `pages/order/detail?order_sn=${商品订单号}`) -- 一键「检测接入状态」(`is_trade_managed` + `get_order_detail_path`) -- 同步日志列表(失败可手动重试) - -**CLI**: - -```bash -php think shopro_wechat_trade:init-path # 配置订单详情路径 -php think shopro_wechat_trade:backfill # 补传已发货未同步订单 -php think shopro_wechat_trade:retry-failed # 重试失败记录 -``` - ---- - -## 七、实施顺序 - -```mermaid -flowchart TD - P0[运营签署协议+开通服务] --> P1[shopro_huifu保存wx_transaction_id] - P1 --> P2[创建shopro_wechat_trade插件骨架] - P2 --> P3[WxTradeClient+路径配置] - P3 --> P4[小程序detail支持order_sn] - P4 --> P5[ShippingHook+Queue] - P5 --> P6[ConfirmHook] - P6 --> P7[backfill历史订单] - P7 --> P8[联调验证+解控申请] -``` - ---- - -## 八、测试清单 - -1. **直连微信**:小程序下单 → 后台快递发货 → 微信「小程序购物订单」可见物流 -2. **汇付微信**:同上,确认使用的是 `wx_transaction_id` 而非 `hf_seq_id` -3. **分拆发货**:多商品订单分两次发货,两次 upload 均成功 -4. **自动发货/自提**:`autosend`/`selfetch` 映射 logistics_type 3/4 -5. **确认收货**:用户确认后 `notify_confirm_receive` 成功 -6. **幂等**:重复发货/重复通知不重复报错 -7. **失败重试**:故意填错 express_company,队列重试可恢复 -8. **历史补传**:对已发货未同步订单跑 backfill -9. **跳转**:从「我-小店与卡包-小程序购物订单」点击跳转详情页正常 - ---- - -## 九、风险与人工确认项 - -- 汇付 notify 中 `wx_response.transaction_id` 字段需用**生产/沙箱真实样本**确认(不同通道返回结构可能差异) -- 微信解控时间由平台审核决定,代码只能满足合规接入条件 -- 部分快递公司编码可能与微信运力表不一致,需维护 [`WxExpressMapper`](addons/shopro_wechat_trade/library/WxExpressMapper.php) 映射表 -- 拼团/未支付/已退款 item 需跳过同步,避免无效 API 调用 diff --git a/plan/敏感文案替换_1357718d.plan.md b/plan/敏感文案替换_1357718d.plan.md deleted file mode 100644 index 50e9061..0000000 --- a/plan/敏感文案替换_1357718d.plan.md +++ /dev/null @@ -1,200 +0,0 @@ ---- -name: 敏感文案替换 -overview: 将小程序页面与后台管理界面中用户可见的「代理」改为「公司」、「佣金」改为「差价」,不改代码标识/路由/数据库字段;并执行 SQL 更新已有等级名称数据。「区域服务商」宫格名称保持不变。 -todos: - - id: mp-pages - content: 修改小程序 pages.json、regional-agent/*、commission/*、sh-grid.vue 中的用户可见文案 - status: completed - - id: api-models - content: 修改 API 提示、Reward/UserWalletLog/RegionalAgent Reward 等模型中的展示文案 - status: completed - - id: admin-ui - content: 修改 menu.php、regional_agent 与 commission 后台视图/JS/Controller 导出表头 - status: completed - - id: sql-upgrade - content: 新增 upgrade_text_alias.sql 并更新等级名称与钱包 memo 历史数据 - status: completed - - id: verify - content: 清除菜单缓存,编译小程序,按验证清单抽查关键页面 - status: completed -isProject: false ---- - -# 敏感文案替换:代理→公司、佣金→差价 - -## 替换规则 - -| 原文 | 新文 | 范围 | -|------|------|------| -| 代理 | 公司 | 仅用户可见文案 | -| 佣金 | 差价 | 仅用户可见文案 | - -**明确不改:** -- 代码标识、路由、API 路径(如 `regional-agent`、`commission_*`) -- 数据库表名/字段名 -- [`unpackage/`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\unpackage) 编译产物(重新打包后自动生成) -- 测试脚本、plan 文档、SQL 迁移历史文件 -- [`sh-grid.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\components\sh-grid.vue) 中已有的 **「区域服务商」** 名称(按您确认保持不变) - -**复合词示例:** -- 区域代理 → 区域公司 -- 省级代理 → 省级公司 -- 佣金明细 → 差价明细 -- 待入账佣金 → 待入账差价 -- 推广佣金 → 推广差价 -- 区域代理佣金 → 区域公司差价 - -「分佣」单独出现时不改(如「分佣金额」),但若含「佣金」则一并替换。 - ---- - -## 一、小程序端(xgsc.gynhc.com_wx) - -### 1. 页面路由标题 — [`pages.json`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages.json) - -- `佣金明细` → `差价明细` -- `区域代理` → `区域公司` -- `申请区域代理` → `申请区域公司` -- `区域佣金` → `区域差价` - -### 2. 区域公司模块 — `pages/app/regional-agent/` - -| 文件 | 主要改动 | -|------|----------| -| [`index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\index.vue) | 导航栏、空态、菜单、toast;`levelName` 默认 `'代理'` → `'公司'`;待结算佣金→差价 | -| [`apply.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\apply.vue) | 表单标签、等级选项(省级/市级/区县代理→公司)、校验提示 | -| [`rewards.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\rewards.vue) | 导航栏「区域佣金」→「区域差价」、空态文案 | -| [`orders.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\orders.vue) | 注释(可选) | - -### 3. 分销/差价模块 — `pages/app/commission/` - -| 文件 | 主要改动 | -|------|----------| -| [`index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\index.vue) | 待入账佣金、佣金明细菜单、区域代理入口文案 | -| [`commission-log.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\commission-log.vue) | 待入账/可提现佣金、列表默认「推广佣金」 | -| [`goods.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\goods.vue) | 「预计佣金」→「预计差价」 | -| [`order.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\order.vue) | 列头「佣金」→「差价」 | - -### 4. 首页宫格 — [`sh-grid.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\components\sh-grid.vue) - -- 仅改:`desc: '推广赚佣金'` → `'推广赚差价'` -- **不改**「区域服务商」及其 alias 映射 - -### 5. 后端 API 返回文案(小程序 toast/提示) - -[`addons/shopro/controller/regional_agent/Agent.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\regional_agent\Agent.php) 中用户可见 error/success 消息,例如: -- `请选择代理区域` → `请选择公司区域` -- `您已申请或已是该区域代理` → `...区域公司` -- `申请已通过,您已成为该区域代理` → `...区域公司` - -[`RegionalAgent.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\regional_agent\RegionalAgent.php):`区域代理已关闭` → `区域公司已关闭` - -### 6. 小程序数据层文案(接口字段展示名) - -| 文件 | 改动 | -|------|------| -| [`addons/shopro/model/commission/Reward.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\model\commission\Reward.php) | `award_type_name` 映射:`推广佣金` → `推广差价` | -| [`addons/shopro/model/UserWalletLog.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\model\UserWalletLog.php) | `佣金收益/扣除`、`区域代理佣金` 等 type 显示名 | -| [`addons/shopro/library/regional_agent/Reward.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\regional_agent\Reward.php) | 钱包流水 memo:`区域代理佣金` → `区域公司差价` | - ---- - -## 二、后台管理端(chufang.gynhc.com) - -### 1. 侧边栏菜单 — [`addons/shopro/config/menu.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\config\menu.php) - -批量替换 title 字段,例如: -- `区域代理` → `区域公司` -- `代理设置/等级/订单` → `公司设置/等级/订单` -- `佣金明细` → `差价明细` - -改完后需 **清除 FastAdmin 菜单缓存**(后台「常规管理 → 系统配置」或删除 `runtime/cache` 中菜单缓存),否则侧边栏可能仍显示旧文案。 - -### 2. 区域公司后台视图 — `application/admin/view/shopro/regional_agent/` - -涉及 agent、level、config、dashboard、order、reward 共约 10 个 HTML 模板:页面标题、表格列头、表单 label、提示说明、空态文案等。 - -### 3. 分销差价后台视图 — `application/admin/view/shopro/commission/` - -涉及 goods、order、reward、config、level、agent 等模板:「设置佣金」→「设置差价」、「佣金规则/比例/明细」等。 - -### 4. 后台 JS 交互文案 — `public/assets/js/backend/shopro/` - -| 文件 | 典型改动 | -|------|----------| -| `regional_agent/agent.js` | 弹窗标题、确认提示、校验 toast | -| `regional_agent/order.js` / `reward.js` | `确认退回佣金?` → `确认退回差价?` | -| `commission/goods.js` | `设置佣金` → `设置差价` | -| `commission/order.js` | 状态标签(已结算佣金→差价)、`推广佣金` 映射 | -| `commission/agent.js` | 累计/待入账佣金列标题 | -| `split/receiver.js`、`split/rule.js` | `区域代理` → `区域公司` | -| `shopro_huifu/onboard.js` | 角色显示 `区域代理` → `区域公司` | - -### 5. 后台 Model / Controller 展示字段 - -| 文件 | 改动 | -|------|------| -| [`application/admin/model/shopro/commission/Reward.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\model\shopro\commission\Reward.php) | `推广佣金` 默认名 | -| [`application/admin/model/shopro/commission/Log.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\model\shopro\commission\Log.php) | event `'reward' => '佣金'` → `'差价'` | -| [`application/admin/controller/shopro/regional_agent/Reward.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\regional_agent\Reward.php) | 导出 Excel 表头 | -| [`application/admin/controller/shopro/regional_agent/Order.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\regional_agent\Order.php) | 导出表头、success/error 消息 | -| [`addons/shopro/notifications/RegionalAgent.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\notifications\RegionalAgent.php) | 通知模板字段名 | -| [`addons/shopro_huifu/library/onboard/HuifuOnboardAdminView.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\library\onboard\HuifuOnboardAdminView.php) | `type_text` 显示 | - ---- - -## 三、数据库已有数据更新 - -新增一次性 SQL 脚本(建议放在 [`addons/shopro/upgrade_text_alias.sql`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_text_alias.sql)): - -```sql --- 区域等级名称:代理 → 公司 -UPDATE `fa_shopro_regional_agent_level` -SET `name` = REPLACE(`name`, '代理', '公司') -WHERE `name` LIKE '%代理%'; - --- 钱包流水 memo(历史记录展示) -UPDATE `fa_shopro_user_wallet_log` -SET `memo` = REPLACE(REPLACE(`memo`, '区域代理佣金', '区域公司差价'), '佣金', '差价') -WHERE `memo` LIKE '%佣金%' OR `memo` LIKE '%代理%'; -``` - -> 表前缀若非 `fa_`,执行前按实际前缀调整。 - ---- - -## 四、验证清单 - -```mermaid -flowchart LR - subgraph mp [小程序] - A[我的服务宫格] --> B[分销中心/差价明细] - A --> C[区域服务商页] - C --> D[申请/订单/区域差价] - end - subgraph admin [后台] - E[侧边栏菜单] --> F[区域公司模块] - E --> G[分销差价模块] - F --> H[导出Excel表头] - end - subgraph data [数据] - I[等级名称SQL] - J[钱包流水memo] - end -``` - -1. 小程序「我的服务」:区域服务商名称不变;分销中心内「待入账差价」「差价明细」显示正确 -2. 区域公司申请页:等级选项为「省级公司」等;提交失败/成功 toast 文案正确 -3. 钱包流水:type_name 与 memo 不含「代理/佣金」 -4. 后台侧边栏:「区域公司」「差价明细」等新菜单名生效 -5. 后台列表/导出:列头与 Excel 文件名/表头一致 -6. 重新编译小程序并上传体验版 - ---- - -## 工作量估计 - -- 小程序源码:约 8 个文件 -- 后台视图 + JS + PHP:约 25–30 个文件 -- SQL 脚本:1 个新文件 -- 预计改动均为字符串替换,不涉及业务逻辑 diff --git a/plan/本地数据库完整还原_5823409e.plan.md b/plan/本地数据库完整还原_5823409e.plan.md deleted file mode 100644 index 5750645..0000000 --- a/plan/本地数据库完整还原_5823409e.plan.md +++ /dev/null @@ -1,197 +0,0 @@ ---- -name: 本地数据库完整还原 -overview: 在本地 MySQL 完全重建 `gushiyu` 库:先导入 FastAdmin 基础表 + Shopro 插件表,再按顺序执行二开迁移 SQL,补齐代码中引用但仓库缺失的自定义表,最后导入白酒测试数据并做全量校验。 -todos: - - id: prep-db - content: DROP/CREATE gushiyu 并确认 .env 与 database.php 连接一致 - status: completed - - id: import-base - content: 导入 fastadmin.sql + 预处理后的 shopro/install.sql - status: completed - - id: custom-ddl - content: 编写并执行 20260810_custom_business_tables.sql(8张缺失表) - status: completed - - id: run-migrations - content: 按依赖顺序执行 sql/migrations 全部 9 个二开迁移 - status: completed - - id: addon-menus - content: 注册 fa_addon 并 php think addon enable/upgrade shopro,重置 admin 密码 - status: completed - - id: seed-data - content: 执行 decorate_bootstrap + baijiu_data + repair_goods_sku_prices + 业务测试种子 - status: completed - - id: verify - content: 编写 verify_schema 脚本并运行 verification/*.sql + 后台/接口冒烟 - status: completed -isProject: false ---- - -# 本地 gushiyu 数据库完整还原计划 - -## 目标与环境 - -| 项 | 值 | -|---|---| -| 数据库 | `gushiyu` | -| 连接 | [application/database.php](application/database.php) — `127.0.0.1:3306` / `root` / `root` | -| 表前缀 | `fa_` | -| 策略 | **DROP DATABASE 后从零重建**(你已确认) | - -## 现状分析(全局检查结果) - -### SQL 资产分层 - -```mermaid -flowchart TD - base[fastadmin.sql 19张核心表] - shopro[shopro/install.sql 76张Shopro表+配置种子] - mig[sql/migrations 9个二开迁移] - data[baijiu_data.sql 白酒商品测试数据] - gap[缺失: 8张二开业务表DDL] - base --> shopro --> mig --> gap --> data -``` - -1. **[yuanshi.sql](yuanshi.sql)** — 仅含 FastAdmin 原始 18 张表 + 少量 admin 数据,**不含 Shopro**,不适合作为本项目主结构源。 -2. **[application/admin/command/Install/fastadmin.sql](application/admin/command/Install/fastadmin.sql)** — 完整 FastAdmin 安装脚本(19 表 + 默认 `fa_auth_rule`),**作为第一层基础**。 -3. **[addons/shopro/install.sql](addons/shopro/install.sql)** — Shopro 全部 **76 张表**、`fa_shopro_config` 默认配置、`fa_shopro_area` 地区数据、以及对 `fa_user` / `fa_user_group` 的扩展字段(分销相关)。需将 `__PREFIX__` 替换为 `fa_` 后导入。 -4. **[sql/migrations/](sql/migrations/)** — 项目二开增量(门店三级/锁客/区域代理/后台菜单),**必须在 shopro 基础表之后执行**。 -5. **[baijiu_data.sql](baijiu_data.sql)** — 仅 **DML**(42 个白酒商品、22 分类、运费模板、首页装修 UPDATE),**不含 CREATE TABLE**。其中装修 UPDATE 依赖生产环境固定 ID(`decorate_id=50`,`decorate_content.id=9212~9217`),新库需先 seed 对应记录。 - -### 二开迁移依赖顺序(不可乱序) - -| 顺序 | 文件 | 作用 | -|------|------|------| -| 1 | `20260725_store_income_foundation.sql` | `fa_shopro_store` 增 level/parent_id/收益字段;新建 `fa_shopro_store_income`;`fa_shopro_order_item.store_income_snapshot` | -| 2 | `20260725_store_customer_lock_code.sql` | 门店锁客码字段 + 唯一索引 | -| 3 | `20260725_store_customer_lock_income.sql` | 锁客收益比例;`fa_user.customer_lock_*`;`fa_shopro_store_income.income_source` + 唯一键调整 | -| 4 | `20260725_store_income_wallet_compat.sql` | 钱包流水索引兼容 | -| 5 | `20260725_region_agent_settlement.sql` | 7 张区域代理表 + 菜单权限节点 | -| 6 | `20260725_normalize_admin_menu.sql` | Shopro 后台菜单归位(硬编码 `fa_auth_rule`) | -| 7 | `20260725_promote_shop_menu_to_top_level.sql` | 商城菜单提升为顶级 | -| 8 | `20260726_region_agent_admin_simplify.sql` | 区域代理菜单收敛 + 索引 | -| 9 | `20260726_repair_goods_sku_prices.sql` | 为非 SKU 商品补 `fa_shopro_goods_sku_price`(**在 baijiu_data 之后**) | - -### 代码引用但仓库无 DDL 的表(需新建) - -通过全局扫描 `application/` 与 `addons/shopro/model/` 的 `$name` 属性,以下表 **不在任何 .sql 中**,需根据模型/控制器/视图反推并新建 [sql/migrations/20260810_custom_business_tables.sql](sql/migrations/20260810_custom_business_tables.sql): - -| 表名 | 来源 | 关键字段(从代码推断) | -|------|------|------------------------| -| `fa_rob_order` | [RobOrderModel.php](addons/shopro/model/RobOrderModel.php) | user_id, activity_id, goods_id, title, activity_price, is_rob, is_use, create_time | -| `fa_video` | [VideoModel.php](application/common/model/VideoModel.php) + [video/add.html](application/admin/view/video/add.html) | title, image, video, desc, content, views, play_num, sort, status, create_time | -| `fa_notice` | [NoticeModel.php](application/common/model/NoticeModel.php) | title, cover, desc, content, views, type, status, create_time | -| `fa_message` | [MessageModel.php](application/common/model/MessageModel.php) | content, status, create_time(+ user_id 如有 API 使用) | -| `fa_report` | [ReportModel.php](application/common/model/ReportModel.php) | user_id, order_id, name, phone, address, content, images, status, create_time | -| `fa_upgrade` | [UpgradeModel.php](application/common/model/UpgradeModel.php) | name, code, content(JSON), status, create_time, update_time | -| `fa_attachment_nav` | [AttachmentNavModel.php](application/common/model/AttachmentNavModel.php) | pid, name, sort, status, createtime | -| `fa_shopro_goods_params` | [ParamsModel.php](application/common/model/ParamsModel.php) | title, params, status, create_time | - -> `fa_shopro_decorate_page` 仅有 Model 定义、无控制器/SQL 引用,优先级最低,可暂不建。 - -### 二开字段汇总(迁移后 `fa_shopro_store` / `fa_user` 最终态) - -**fa_shopro_store 新增字段:** -`level`, `parent_id`, `settlement_user_id`, `pickup_income_rate`, `customer_lock_income_rate`, `province_unique_key`, `city_unique_key`, `customer_lock_code`, `customer_lock_code_version`, `customer_lock_code_updated_at` - -**fa_user 新增字段:** -Shopro 分销:`parent_user_id`, `child_user_count`, `child_user_count_1/2`, `total_consume` -锁客:`customer_lock_store_id`, `customer_lock_time` - -**fa_shopro_order_item 新增字段:** -`store_income_snapshot`, `customer_lock_income_snapshot` - -## 执行步骤 - -### 阶段 1:准备与建库 - -1. 确认本地 MySQL 可连接(`mysql -uroot -proot -h127.0.0.1`)。 -2. 确认项目 `.env` 与 [application/database.php](application/database.php) 一致(database=`gushiyu`)。 -3. 执行: - ```sql - DROP DATABASE IF EXISTS `gushiyu`; - CREATE DATABASE `gushiyu` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - USE `gushiyu`; - ``` - -### 阶段 2:导入结构与二开迁移 - -4. 导入 FastAdmin 基础:`application/admin/command/Install/fastadmin.sql` -5. 预处理并导入 Shopro: - - 将 [addons/shopro/install.sql](addons/shopro/install.sql) 中 `__PREFIX__` → `fa_` - - 通过 `mysql gushiyu < shopro_fa.sql` 导入(约 5500 行,含 `fa_shopro_area` 与 `fa_shopro_config`) -6. 新建并执行 `sql/migrations/20260810_custom_business_tables.sql`(补齐 8 张缺失表) -7. 按上表顺序依次执行 `sql/migrations/20260725_*.sql` 和 `20260726_*.sql`(每个文件内 `__PREFIX__` → `fa_`) - -### 阶段 3:Shopro 插件菜单与后台权限 - -8. 在 `fa_addon` 注册 shopro/epay/alisms 插件记录(若表不存在则 FastAdmin 首次访问插件页会自动创建,或手动 CREATE) -9. 执行 ThinkPHP 命令同步菜单: - ```bash - php think addon --name=shopro --action=enable - php think addon --name=shopro --action=upgrade - ``` -10. 重置管理员密码(fastadmin.sql 默认密码为空;使用 yuanshi.sql 中可用 hash:`admin` / `123456`): - ```sql - UPDATE fa_admin SET password='cba719238115b3611accf3072a29b942', salt='0f77e1' WHERE username='admin'; - ``` - -### 阶段 4:测试数据导入 - -11. **新建** [sql/seed/20260810_decorate_bootstrap.sql](sql/seed/20260810_decorate_bootstrap.sql): - - `INSERT fa_shopro_decorate` id=50(platform 含 H5/wxMiniProgram,status=normal) - - `INSERT fa_shopro_decorate_content` id=9212~9217(category=home,type 对应 banner/title/menu/goods 组件,content 可为 `{}` 占位) - - 设置 AUTO_INCREMENT 避免后续冲突 -12. 执行 `decorate_bootstrap.sql` -13. 执行 [baijiu_data.sql](baijiu_data.sql)(42 商品 + 分类 + 运费 + 装修 UPDATE) -14. 执行 [20260726_repair_goods_sku_prices.sql](sql/migrations/20260726_repair_goods_sku_prices.sql) 为 42 个商品生成默认 SKU 价格行 - -### 阶段 5:可选业务测试种子 - -15. **新建** [sql/seed/20260810_business_test_data.sql](sql/seed/20260810_business_test_data.sql),插入最小可测数据: - - 1 个测试会员(`fa_user`) - - 3 级门店样例(省/市/区,`fa_shopro_store`,含锁客码) - - 1 条区域代理规则 + 1 个省代授权(`fa_shopro_region_config` / `fa_shopro_region_agent`) - - 1 条公告、1 条视频(可选) - -### 阶段 6:全量校验(防遗漏) - -16. 编写并执行 [sql/restore/verify_schema.ps1](sql/restore/verify_schema.ps1)(或 PHP 脚本),对比: - - 期望表总数 ≈ **19 + 76 + 1 + 7 + 8 = 111** 张(含 `fa_jobs`) - - 二开关键列存在性:`information_schema.columns` 检查 store/user/order_item 扩展字段 - - 模型 `$name` 与数据库表一一对应(扫描结果作为 checklist) -17. 运行已有校验脚本(只读 SELECT): - - [sql/verification/20260725_store_customer_lock_code_check.sql](sql/verification/20260725_store_customer_lock_code_check.sql) - - [sql/verification/20260725_store_customer_lock_income_check.sql](sql/verification/20260725_store_customer_lock_income_check.sql) - - [sql/verification/20260726_store_hierarchy_manager_scope_check.sql](sql/verification/20260726_store_hierarchy_manager_scope_check.sql) -18. 功能冒烟: - - 后台登录 https://本地/s.php/index/login(admin/123456) - - 商品列表有 42 个白酒 SKU - - 小程序/H5 首页装修接口返回非空(`fa_shopro_decorate` id=50) - - 区域代理/门店锁客菜单可见且无 SQL 字段报错 - -## 将新增的文件(按规范归入 sql/) - -| 文件 | 用途 | -|------|------| -| `sql/migrations/20260810_custom_business_tables.sql` | 8 张缺失业务表 DDL | -| `sql/seed/20260810_decorate_bootstrap.sql` | 装修模板 bootstrap(匹配 baijiu_data 固定 ID) | -| `sql/seed/20260810_business_test_data.sql` | 门店/代理/用户测试数据 | -| `sql/restore/restore_local.ps1` | 一键还原编排脚本(DROP → 导入 → 迁移 → seed → 校验) | -| `sql/restore/verify_schema.ps1` | 表/字段完整性校验 | - -## 风险与注意事项 - -- **baijiu_data.sql 图片路径** 引用 `/uploads/20260724/...`,需确保 [public/uploads/](public/uploads/) 目录存在对应图片,否则前端显示空白图。 -- **region_agent_settlement.sql** 中 `uniq_region_settle_period` 索引重建语句在非幂等场景可能报错;脚本中需加 `information_schema` 判断(迁移文件已有部分处理,执行时注意日志)。 -- **normalize/promote 菜单迁移** 依赖 shopro 菜单已存在(必须先 `addon enable/upgrade`)。 -- **yuanshi.sql 不导入** — 仅作 FastAdmin 原始参考,避免与 fastadmin.sql 冲突。 -- 生产库(118.184.172.94)本次**不在范围内**;本地验证通过后可复用同一脚本链路上线。 - -## 预期结果 - -还原完成后本地库应包含: -- FastAdmin 完整后台框架 + Shopro 商城 76 表 -- 全部二开字段(门店三级、锁客、区域代理结算) -- 42 个谷时雨白酒商品 + 分类 + 运费模板 + 首页装修 -- 8 张自定义业务表结构就绪 -- 后台可登录,商城核心 API 无 "fields not exists" / "Table doesn't exist" 错误 diff --git a/plan/汇付个人进件对接_e1144173.plan.md b/plan/汇付个人进件对接_e1144173.plan.md deleted file mode 100644 index 7fc0fb7..0000000 --- a/plan/汇付个人进件对接_e1144173.plan.md +++ /dev/null @@ -1,346 +0,0 @@ ---- -name: 汇付个人进件对接 -overview: 在 addons/shopro_huifu 插件内新增个人进件模块,统一服务推广员(分销)与区域代理两条申请链路;用户提交申请时按汇付标准字段收集资料并发起进件,汇付审核成功后后台才允许业务审核通过,成功后自动写入 shopro_split_receiver 供 SplitCalculator/HuifuSplitService 分账。 -todos: - - id: p0-schema - content: 新增 upgrade_huifu_onboard.sql:shopro_huifu_onboard 表 + commission/regional_agent 关联字段 + install 集成 - status: completed - - id: p0-service - content: 插件 library/onboard/ 实现 Picture/BasicIndv/BusiOpen/Query/Validator/ReceiverSync 与 HuifuOnboardService 主编排 - status: completed - - id: p1-api - content: 新增 controller/Onboard.php(config/status/upload/submit/resubmit/notify)+ CLI shopro_huifu:onboard-poll - status: completed - - id: p2-commission - content: 分销:Hook shopro_commission_apply_after + 后台审核拦截 + info 返回进件状态 + 小程序 apply.vue 汇付表单组件 - status: completed - - id: p3-regional - content: 区域代理:Hook shopro_regional_agent_apply_after + audit 拦截 + apply.vue 复用汇付表单组件 - status: completed - - id: p4-split - content: 进件 approved 自动写 shopro_split_receiver;HuifuSplitService 缺 receiver 日志;后台 receiver/进件列表展示 - status: completed - - id: p5-test - content: 沙箱联调:进件→业务审核→延时分账全链路 + 非汇付模式回归 - status: completed -isProject: false ---- - -# 汇付个人进件(推广员/区域代理)细化实施计划 - -## 一、Skill 口径与现状 - -| 维度 | 判定 | -|------|------| -| **能力域** | 商户/个人进件(非支付交易);支付分账已在 [`addons/shopro_huifu`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu) 完成 | -| **进件类型** | **个人用户**(`V2UserBasicdataIndv` + `V2UserBusiOpen`) | -| **技术栈** | PHP / FastAdmin + Shopro,复用插件内 `dg-php-sdk 2.0.30` | -| **触发条件** | `split_mode=huifu` 或 `split_provider=huifu` 且插件启用时,分销/代理申请**强制走汇付进件** | -| **审核顺序** | **汇付优先**:汇付进件成功 → 后台才允许业务审核通过 | - -**当前缺口(代码已核实):** - -- 分销申请:[`commission/Agent::applyForm()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\commission\Agent.php) 仅保存 JSON `apply_info`,无汇付 API -- 区域代理申请:[`regional_agent/Agent::apply()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\regional_agent\Agent.php) 同上 -- 分账计算:[`SplitCalculator::getReceiver()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitCalculator.php) 汇付模式下**必须有** `shopro_split_receiver.channel=huifu` 且 `receiver_account=huifu_id`,否则跳过该角色分账 -- 插件 SDK 已含进件 Request:`V2SupplementaryPictureRequest`、`V2UserBasicdataIndvRequest`、`V2UserBusiOpenRequest`、`V2UserApplyQueryRequest`、`V2UserBasicdataQueryRequest` - -```mermaid -sequenceDiagram - participant MP as 小程序申请页 - participant API as Shopro/插件API - participant OB as HuifuOnboardService - participant HF as 汇付斗拱 - participant Admin as 后台审核 - participant Split as SplitCalculator - - MP->>API: 提交业务资料+进件资料 - API->>OB: createOnboard(promoter/regional_agent) - OB->>HF: 图片上传 SupplementaryPicture - OB->>HF: UserBasicdataIndv 开户 - HF-->>OB: huifu_id - OB->>HF: UserBusiOpen 业务入驻 - HF-->>OB: apply_no - loop 轮询 - OB->>HF: UserApplyQuery - end - OB->>API: onboard_status=approved - OB->>API: 写入 split_receiver - Admin->>API: 审核通过(仅当汇付已通过) - Note over Split: 分账时读取 huifu_id -``` - ---- - -## 二、数据表设计 - -新增插件表 [`upgrade_huifu_onboard.sql`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\upgrade_huifu_onboard.sql): - -### 2.1 `shopro_huifu_onboard`(进件主表) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | int PK | 自增 | -| `user_id` | int | 商城用户 ID | -| `role_type` | enum | `promoter` / `regional_agent` | -| `role_ref_id` | int | 推广员=`user_id`;区域代理=`shopro_regional_agent.id` | -| `onboard_status` | varchar(20) | `draft/submitting/basic_ok/busi_pending/approved/rejected/failed` | -| `huifu_id` | varchar(32) | 汇付客户号(开户返回) | -| `apply_no` | varchar(64) | 业务入驻申请单号 | -| `req_seq_id` | varchar(64) | 最近一次汇付请求流水(保留不重写) | -| `req_date` | char(8) | 请求日期 Ymd | -| `basic_req_seq_id` | varchar(64) | 开户流水 | -| `busi_req_seq_id` | varchar(64) | 入驻流水 | -| `reject_reason` | varchar(500) | 汇付/本地驳回原因 | -| `payload` | text | 脱敏后的提交快照 JSON | -| `file_map` | text | 本地图片 URL → 汇付 file_id 映射 | -| `resp_snapshot` | text | 最后一次汇付响应摘要 | -| `createtime/updatetime` | int | 时间戳 | - -**唯一约束:** `UNIQUE(user_id, role_type, role_ref_id)` — 同一角色仅一条有效进件记录。 - -### 2.2 业务表扩展(轻量) - -| 表 | 新增字段 | 用途 | -|----|----------|------| -| `shopro_commission_agent` | `huifu_onboard_id` int NULL | 关联进件记录 | -| `shopro_regional_agent` | `huifu_onboard_id` int NULL | 关联进件记录 | - -### 2.3 与分账接收方关系 - -进件 `approved` 后自动 upsert [`shopro_split_receiver`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_payment_split.sql): - -```sql -role_type = promoter|regional_agent -role_id = user_id -channel = huifu -receiver_type = HUIFU_ID -receiver_account = huifu_id -status = normal -``` - ---- - -## 三、汇付接口清单与调用顺序 - -| 步骤 | SDK Request | 路径/用途 | 触发时机 | -|------|-------------|-----------|----------| -| 1 | `V2SupplementaryPictureRequest` | 图片上传 | 用户提交前/提交时,身份证正反面、银行卡等 | -| 2 | `V2UserBasicdataIndvRequest` | 个人基本信息开户 | 提交进件 | -| 3 | `V2UserBusiOpenRequest` | 用户业务入驻(结算卡/结算周期) | 步骤 2 返回 `huifu_id` 后 | -| 4 | `V2UserApplyQueryRequest` | 申请单状态查询 | 异步轮询 / CLI 补偿 | -| 5 | `V2UserBasicdataQueryRequest` | 用户详情复核 | 终态确认、后台展示 | - -**异步通知(可选 P1):** 插件新增 `controller/Onboard.php` 接收 `async_return_url`,验签后更新 `onboard_status`(与支付 notify 同样 RSA 验签 + 幂等)。 - -**SDK 约束(与支付一致):** -- 加载 SDK 前 `DEBUG=false` -- `skill_source=hfps/1.3.5;hfms/1.0.2`(支付+进件联合请求) -- 复用 [`HuifuClient`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\library\HuifuClient.php) 初始化 `BsPayClient` - ---- - -## 四、汇付字段对照表(个人进件 MVP) - -### 4.1 小程序采集字段 → `V2UserBasicdataIndv` - -| 业务字段(小程序/后台) | 汇付 wire 字段 | 必填 | 说明 | -|------------------------|----------------|------|------| -| 真实姓名 | `name` | Y | 与身份证一致 | -| 证件类型 | `cert_type` | Y | 固定 `00` 身份证 | -| 身份证号 | `cert_no` | Y | 18 位 | -| 证件有效期类型 | `cert_validity_type` | Y | `1`长期 / `0`非长期 | -| 证件开始日期 | `cert_begin_date` | Y | `yyyyMMdd` | -| 证件截止日期 | `extendInfo.cert_end_date` | 条件 | 非长期必填 | -| 手机号 | `mobile_no` | Y | 与银行卡预留手机号一致 | -| 身份证人像面 | `extendInfo.file_list[F02]` | Y | 先 `SupplementaryPicture` 得 `file_id` | -| 身份证国徽面 | `extendInfo.file_list[F03]` | Y | 同上 | - -### 4.2 小程序采集字段 → `V2UserBusiOpen` - -| 业务字段 | 汇付 extendInfo 路径 | 必填 | 说明 | -|----------|---------------------|------|------| -| — | `huifu_id` | Y | 步骤 2 返回 | -| — | `upper_huifu_id` | Y | 读插件配置 `upper_huifu_id` 或 `sys_id` | -| 开户名 | `card_info.card_name` | Y | 与 `name` 一致 | -| 银行卡号 | `card_info.card_no` | Y | 对私借记卡 | -| 银行省市 | `card_info.prov_id/area_id` | Y | 用现有 [`Area`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\model\Area.php) 映射汇付编码 | -| 支行联行号 | `card_info.branch_code` | Y | 小程序选银行+支行或后台维护字典 | -| 持卡人证件 | `card_info.cert_*` | Y | 复用基本信息 | -| 银行预留手机 | `card_info.mp` | Y | | -| 结算周期 | `settle_config_list[0].settle_cycle` | Y | 默认 `D1`(后台可配) | -| 取现配置 | `cash_config` | Y | 默认模板(后台可配 `fix_amt/fee_rate/cash_type`) | -| 银行卡照片 | `file_list[F12]` | 视通道 | 按汇付要求 | -| 异步通知 | `async_return_url` | N | `/addons/shopro_huifu/onboard/notify` | - -### 4.3 状态映射 - -| 汇付 `apply_status` / 查询结果 | 本地 `onboard_status` | -|-------------------------------|----------------------| -| 受理中 / 审核中 | `busi_pending` | -| 成功 / 开通完成 | `approved` | -| 驳回 / 失败 | `rejected` / `failed` | - ---- - -## 五、内部 API 清单 - -全部放在插件 `addons/shopro_huifu/controller/Onboard.php`(需登录): - -| 接口 | 方法 | 说明 | -|------|------|------| -| `/addons/shopro_huifu/onboard/config` | GET | 返回是否强制进件、字段模板、银行字典入口 | -| `/addons/shopro_huifu/onboard/status` | GET | 参数 `role_type` + `role_ref_id`;返回进件进度 | -| `/addons/shopro_huifu/onboard/uploadPicture` | POST | 代理上传图片到汇付,返回 `file_id` | -| `/addons/shopro_huifu/onboard/submit` | POST | 提交完整进件(含 role 信息) | -| `/addons/shopro_huifu/onboard/resubmit` | POST | 驳回后重提 | -| `/addons/shopro_huifu/onboard/notify` | POST | 汇付异步回调(无需登录,验签) | - -**Shopro 核心改造(Hook,约 2 处):** - -| Hook | 注入点 | 行为 | -|------|--------|------| -| `shopro_commission_apply_after` | [`commission/Agent::applyForm()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\commission\Agent.php) 事务末尾 | 插件 listener 读取 POST 中 `huifu_onboard` 块并调用 `HuifuOnboardService::submit()` | -| `shopro_regional_agent_apply_after` | [`regional_agent/Agent::apply()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\regional_agent\Agent.php) create 后 | 同上,`role_ref_id=新代理ID` | - -> 若暂不增 Hook,可在两个 Controller 各加 3 行 `Hook::listen(...)` 桥接(与支付 Hook 同模式)。 - ---- - -## 六、分销 / 区域代理两条链路改造 - -### 6.1 推广员(分销) - -**现有流程:** [`pages/app/commission/apply.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\commission\apply.vue) → `commission.form` / `commission.apply` - -**改造:** - -1. 当 `onboard/config.required=true` 时,在动态表单下方追加**固定汇付进件区块**(姓名/身份证/有效期/银行卡/支行/证件照),不再仅依赖自由 `agent_form` JSON -2. 提交 payload 增加 `huifu_onboard: { ... }` 与原有 `data` 并列 -3. 后端 `applyForm` 成功后触发进件;返回文案改为「申请已提交,汇付进件审核中」 -4. [`commission/Agent::info()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\commission\Agent.php) 增加 `huifu_onboard_status` 字段供前端展示 - -**后台审核拦截(汇付优先):** - -- [`admin/commission/Agent::update()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\commission\Agent.php) 当 `key=status` 且 `value=normal` 时: - - 若汇付模式开启且 `onboard_status != approved` → **拒绝审核**,提示「汇付进件未通过」 - - 通过后确认 `shopro_split_receiver` 已存在 - -### 6.2 区域代理 - -**现有流程:** [`pages/app/regional-agent/apply.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\app\regional-agent\apply.vue) → `regionalAgent.apply` - -**改造:** - -1. 保留区域层级 + 省市区选择 -2. 同样追加汇付进件固定字段区块(与推广员共用组件 `components/huifu-onboard-form.vue`) -3. `apply()` create 后立即绑定 `huifu_onboard_id` -4. [`admin/regional_agent/Agent::audit()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\controller\shopro\regional_agent\Agent.php) `approve` 前校验 `onboard_status=approved` - ---- - -## 七、插件内服务层结构 - -``` -addons/shopro_huifu/library/onboard/ -├── HuifuOnboardService.php # 编排:upload → basic → busi → poll -├── HuifuOnboardPicture.php # V2SupplementaryPicture 封装 -├── HuifuOnboardBasicIndv.php # V2UserBasicdataIndv -├── HuifuOnboardBusiOpen.php # V2UserBusiOpen(读后台默认 settle/cash 模板) -├── HuifuOnboardQuery.php # ApplyQuery + BasicdataQuery -├── HuifuOnboardReceiverSync.php # approved 后写 shopro_split_receiver -└── HuifuOnboardValidator.php # 字段校验、身份证/手机号格式 -``` - -**核心方法 `HuifuOnboardService::submit($userId, $roleType, $roleRefId, $formData)`:** - -1. 校验 + 落库 `draft` → `submitting` -2. 批量上传图片得 `file_map` -3. 调 `UserBasicdataIndv`,保存 `huifu_id`、`basic_req_seq_id` → `basic_ok` -4. 调 `UserBusiOpen`,保存 `apply_no` → `busi_pending` -5. 同步查询一次;若未终态则交给队列/CLI - -**`HuifuOnboardReceiverSync::sync($onboard)`:** - -- `approved` 时 upsert 分账接收方 -- 更新 `receiver_name` 为真实姓名 - ---- - -## 八、与 SplitCalculator 对接点 - -现有逻辑(无需改计算规则,仅补强前置条件): - -```138:166:f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitCalculator.php - protected function getReceiver($roleType, $roleId, $ruleMode = false) - { - $channel = $this->config->isHuifuMode() ? 'huifu' : 'wechat'; - // ... - if ($this->config->isHuifuMode()) { - // promoter/regional_agent 无 huifu_id 则 return null → 该角色不分账 - return null; - } -``` - -| 对接点 | 动作 | -|--------|------| -| 进件成功 | `HuifuOnboardReceiverSync` 写入 `shopro_split_receiver` | -| 分账执行前 | [`HuifuSplitService::executeByOrderId()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\library\HuifuSplitService.php) 已有 `buildAcctInfos`;缺 receiver 的 item 会被跳过 — **需增加日志/告警** | -| 业务准入 | 推广员/代理未 `approved` 不应进入 `normal` 状态,避免产生佣金但无法分账 | -| 后台分账接收方页 | [`receiver.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\public\assets\js\backend\shopro\split\receiver.js) 增加「汇付进件状态」列,替代仅 `syncWx` | - -**可选增强(P1):** `SplitCalculator::calculate()` 汇付模式下汇总前检查:若存在佣金角色但无 `huifu_id`,写 `split_order` 失败原因「接收方未进件」。 - ---- - -## 九、后台管理扩展 - -| 模块 | 路径 | 新增能力 | -|------|------|----------| -| 进件记录 | `shopro_huifu/onboard` | 列表、详情、手动重试、状态查询 | -| 进件配置 | `shopro_huifu/config` 扩展 | 默认 `settle_cycle`、`cash_config` 模板、`onboard_required` 开关 | -| 分销商管理 | `shopro/commission/agent` | 列:汇付状态 / huifu_id;审核按钮 disabled 直到 approved | -| 区域代理管理 | `shopro/regional_agent/agent` | 同上 | -| 分账接收方 | `shopro/split/receiver` | 展示 `channel=huifu` + 进件来源 | - -**CLI 补偿:** `php think shopro_huifu:onboard-poll` — 扫描 `busi_pending` 记录调 `UserApplyQuery`,成功后触发 `ReceiverSync`。 - ---- - -## 十、实施阶段与工时 - -| 阶段 | 内容 | 预估 | -|------|------|------| -| **P0 数据与服务** | SQL + Model + `HuifuOnboardService` 五步 API 封装 + 单元日志 | 2 天 | -| **P1 插件 API** | Onboard Controller + notify + CLI 轮询 | 1 天 | -| **P2 分销链路** | Hook + commission apply 改造 + 后台审核拦截 + 小程序表单组件 | 1.5 天 | -| **P3 区域代理链路** | regional apply 改造 + audit 拦截 + 复用表单组件 | 1 天 | -| **P4 分账联动** | ReceiverSync + Split 缺 receiver 告警 + 后台展示 | 0.5 天 | -| **P5 联调上线** | 沙箱进件 → 业务审核 → 实单分账全链路 | 2 天 | - -**合计约 8 人天**(不含汇付商务开通个人用户入驻权限)。 - ---- - -## 十一、测试验收清单 - -1. 汇付模式开启时,推广员/区域代理申请页均展示统一进件表单,缺字段不可提交 -2. 提交后本地产生 `shopro_huifu_onboard` 记录,状态流转 `submitting → basic_ok → busi_pending → approved` -3. 汇付未 `approved` 时,后台审核「通过」按钮报错拦截 -4. `approved` 后自动创建 `shopro_split_receiver(channel=huifu, HUIFU_ID)` -5. 支付 + 延时分账:[`HuifuSplitService`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro_huifu\library\HuifuSplitService.php) 分账串包含推广员/代理 `huifu_id` -6. 进件驳回后可修改重提;`req_seq_id` 每次新生成,历史流水保留 -7. 非汇付模式(`split_mode=wallet/wechat`)下,原有申请流程不受影响 -8. CLI 轮询可补偿异步通知缺失场景 - ---- - -## 十二、风险与人工确认项 - -| 项 | 说明 | -|----|------| -| 汇付控台权限 | 需确认渠道商已开通「个人用户开户 + 用户业务入驻 + 分账接收方」能力 | -| 支行联行号 | 需引入银行/支行数据(汇付编码表或第三方),MVP 可先后台维护常用银行 JSON | -| 敏感信息 | 身份证号/银行卡仅服务端存储,payload 脱敏展示;禁止写日志明文 | -| 企业代理 | 本期仅个人;企业代理需 `V2UserBasicdataEnt`,放二期 | -| 存量代理 | 已存在的 normal 代理需补进件:提供后台「补录进件」入口或批量导入 huifu_id | diff --git a/plan/汇付小程序支付对接_c945b5d0.plan.md b/plan/汇付小程序支付对接_c945b5d0.plan.md deleted file mode 100644 index 291a605..0000000 --- a/plan/汇付小程序支付对接_c945b5d0.plan.md +++ /dev/null @@ -1,1000 +0,0 @@ ---- -name: 汇付小程序支付对接 -overview: 以独立 FastAdmin 插件 addons/shopro_huifu 接入汇付斗拱(聚合支付 V4 + 延时分账),Shopro 核心仅增加可选 Hook 桥接;插件可安装/启用/禁用/卸载,卸载后系统自动回退直连微信支付。 -todos: - - id: p0-bridge - content: Shopro 核心增加 3 个可选 Hook 桥接点(prepay/refund/split),无插件时不影响现有逻辑 - status: completed - - id: p0-plugin-scaffold - content: 创建 addons/shopro_huifu 插件骨架(install/uninstall/enable/disable/menu/SQL) - status: completed - - id: p1-sdk - content: 插件内引入 dg-php-sdk 2.0.30,实现 HuifuClient / HuifuPayService(V4 create + notify + 查单补偿) - status: completed - - id: p1-admin - content: 插件后台配置页(5.3 完整参数)+ 分账设置扩展联动 - status: completed - - id: p2-split - content: 插件内延时分账 + SplitCalculator 规则表驱动(rate/money) + 后台 split_timing 三选一(支付成功/确认收货/订单完成) - status: completed - - id: p3-refund - content: 插件内退款/关单/确认退款,卸载保护策略,commission 防重复入账 - status: completed - - id: p4-test - content: 安装/禁用/卸载回归 + 沙箱全链路 + go-live-checklist - status: completed -isProject: false ---- - -# 汇付小程序微信支付 + 延时分账对接方案 - -> 本方案已按 `$huifu-pay-integration`(hfps/1.3.5)复核产品线、接口合同与存量接入口径。 - -## 零、Skill 产品线判断与方案卡 - -### 0.1 维度判定 - -| 维度 | 判定 | -|------|------| -| **产品线** | **聚合支付**(非托管支付、非 checkout-js) | -| **接入阶段** | 存量系统首次接入汇付(Shopro 已有 Yansongda 直连微信 + 分账模块) | -| **技术栈** | PHP / FastAdmin + Shopro,`huifurepo/dg-php-sdk ^2.0.30` | -| **端形态** | 微信小程序 `T_MINIAPP`,服务端下单 + 前端 `uni.requestPayment` | -| **分账模式** | **延时分账**:下单 `delay_acct_flag=Y`,确认时调「交易确认」传 `acct_split_bunch` | -| **通道策略** | 并行:小程序后台可切换 yansongda / huifu,其余端保留直连 | - -### 0.2 推荐方案与排除项 - -**推荐:聚合支付 + 存量增量适配层** - -- 小程序标准服务端收款,接入轻量,与现有 `Pay.php → PayService → paymentProcess` 链路兼容。 -- 延时分账与现有 `split_timing`(confirm/finish)天然匹配,不必在 prepay 前预估佣金。 - -**暂不推荐:** - -| 方案 | 原因 | -|------|------| -| 托管支付 | 需 `project_id` 和托管收银台闭环,你的场景是自有小程序 + 自有 prepay API | -| checkout-js | 依赖托管预下单 + 前端组件,与 uni-app 现有 `uni.requestPayment` 重复 | -| V2 `/v2/trade/payment/jspay` | 你提供的文档链接属旧版;Skill 基线优先 **V4 `v4/trade/payment/create`** + `TradePaymentCreateRequest`,能力等价且 SDK 主链路已对齐 | - -### 0.3 本轮 Skill References - -1. `copilot-solution-selection.md` — 产品线选择 -2. `copilot-existing-system.md` — 存量改造口径 -3. `aggregation-order.md` + `aggregation-php-adapter.md` — V4 下单与 PHP SDK -4. `aggregation-payload-construction.md` — `method_expand` / `acct_split_bunch` 建模 -5. `shared-async-notify.md` — 异步通知验签、幂等、ACK 格式 - -### 0.4 组件职责(新增 / 保留 / 人工确认) - -| 类别 | 内容 | -|------|------| -| **建议新增** | `HuifuConfig`、`HuifuPaymentAdapter`(V4 create)、`HuifuNotifyHandler`、`HuifuQueryService`(查单补偿)、`HuifuSplitService`(交易确认)、`HuifuRefundService` | -| **建议保留** | `Pay.php::prepay` 入口、订单号生成、`OrderOper::paymentProcess`、佣金/区域代理钩子、小程序 `uni.requestPayment` | -| **人工确认后再改** | 订单 `pay_type` 映射、支付成功后的发货/权益动作、灰度路由、退款后库存/账务 | -| **建议落库字段** | `req_seq_id`、`req_date`、`hf_seq_id`、`trans_stat`、`delay_acct_flag`、`confirm_hf_seq_id`、退款请求流水 | -| **进件(独立 Skill)** | 主商户/子商户开户、分账权限、延时权限、AppID 绑定 → 使用 `$huifu-merchant-onboarding`,不在支付 Skill 内实现 | - -### 0.6 凭证查看与绑定位置(操作指引) - -#### 主 `huifu_id` / `sys_id` / `product_id` 在哪里看 - -| 标识 | 含义 | 查看位置 | -|------|------|----------| -| **主 `huifu_id`** | 交易商户号,写入 `data.huifu_id` | **商户控台** 或 **合作伙伴控台** → 商户管理 / 商户详情(进件完成后可见,通常 16 位数字如 `6666000...`) | -| **`sys_id`** | API 调用方系统号 | 直连商户:`sys_id` = 自己的 `huifu_id`;渠道商:`sys_id` = 渠道商 `huifu_id`。在控台「开发参数 / 接入信息 / API 密钥」区域查看 | -| **`product_id`** | 汇付分配的产品号 | 控台「开发参数 / 接入信息」或商务开通材料中(如 `MCS`) | -| **RSA 密钥对** | 请求签名 + 响应验签 | 控台「开发参数 / API 密钥管理」下载或配置;**不能**从前端或日志暴露 | - -入口:[斗拱开放平台](https://paas.huifu.com/open/home/index.html) → 登录对应控台(商户控台 / 合作伙伴控台)。 - -> 商户进件、详情查询、申请状态 → 使用 `$huifu-merchant-onboarding` Skill 或联系汇付商务,不在支付 Skill 范围内。 - -#### 微信小程序 AppID(`sub_appid`)在哪里绑定 - -`sub_appid` **不是在微信公众平台上绑到汇付**,而是在 **汇付控台 / 接口** 完成「微信业务开通 + 应用配置」: - -1. 登录 **合作伙伴控台**(渠道商代操作)或 **商户控台**(直连商户自助) -2. 进入目标商户 → **业务开通 / 业务变更** → 开通 **微信支付** -3. 在 **微信配置 / 微信商户配置** 中填写小程序 AppID(即 `sub_appid`) -4. 也可通过 API:**【微信商户配置】** 或 **【微信支付宝入驻信息修改】** 接口修改(见 `aggregation-faq.md`) - -绑定完成后,该 AppID 与商户 `huifu_id` 建立关联。常见报错 `sub_mch_id与sub_appid不匹配` 即此步未完成或 AppID 填错(注意首尾空格)。 - -你的项目对应值:Shopro 后台 [`shopro_config.wxMiniProgram`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\config\platform.html) 中的 `app_id`,需与汇付控台绑定的 `sub_appid` **完全一致**。 - -#### `sub_openid` 授权链路(不在汇付控台绑定) - -`sub_openid` 是**运行时参数**,来自微信侧用户授权,**汇付控台没有「绑定 openid」的操作**。 - -```mermaid -sequenceDiagram - participant MP as 小程序 - participant WX as 微信服务器 - participant Shopro as Shopro后端 - participant HF as 汇付下单 - - MP->>WX: wx.login() 获取 code - MP->>Shopro: getWxMiniProgramSessionKey(code) - Shopro->>WX: code2session - WX-->>Shopro: openid + session_key - Shopro-->>MP: 存 openid 到 UserOauth - MP->>Shopro: pay/prepay(openid) - Shopro->>HF: method_expand.sub_appid + sub_openid -``` - -**Skill 硬约束:** -- `sub_openid` 必须来自**同一个** `sub_appid` 下的微信登录,不能跨小程序/公众号复用 -- 你的项目已有链路:`getWxMiniProgramSessionKey` → `UserOauth.openid` → `Pay.php::prepay` 读取 -- 汇付下单时:`sub_appid` = 小程序 AppID,`sub_openid` = 该 AppID 下用户的 openid - -**自检清单:** -1. 汇付控台 `sub_appid` = Shopro 小程序 AppID -2. 用户已微信登录,`UserOauth` 表有对应 openid -3. prepay 传的 openid 与 `sub_appid` 匹配(同一小程序) - -### 0.5 请求 / 通知 / 终态 / 安全边界 - -- **请求**:保留 Controller 传入的 `req_date`、`req_seq_id`、金额、商户号;PHP 加载 SDK 前固定 `DEBUG=false`,禁用官方 Demo loader。 -- **前端交接**:同步返回 `pay_info` 仅用于唤起支付,**不是支付终态**;结果页轮询可保留,但终态以服务端为准。 -- **通知**:`notify_url` 验签 → 校验金额/商户号/流水 → 幂等更新 → 回包 `RECV_ORD_ID_{req_seq_id}` + HTTP 200。 -- **终态补偿**:通知缺失时调聚合查单(`TradePaymentScanpayQueryRequest`),`trans_stat=S` 才可标记已支付。 -- **延时分账终态**:交易确认成功后,`acct_stat=S` 才标记分账完成;可用 `v2/trade/trans/split/query` 复核。 -- **退款**:未确认部分走交易退款;已确认部分走交易确认退款(`loan_flag` 规则见 Skill FAQ)。 - ---- - -## 一、现状与目标 - -**当前架构** - -```mermaid -flowchart LR - MP[小程序] -->|POST pay/prepay| PayCtrl[Pay.php] - PayCtrl --> PaySvc[PayService] - PaySvc --> YSD[Yansongda 直连微信] - YSD -->|pay_data| MP - YSD -->|notify| PayCtrl - PayCtrl --> OrderProc[paymentProcess] - OrderProc --> SplitHook[SplitHook] - SplitHook --> WXSplit[ProfitSharingService 微信分账] -``` - -- 后端入口:[`addons/shopro/controller/Pay.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\Pay.php) 的 `prepay` / `notifyx` -- 支付封装:[`addons/shopro/library/PayService.php`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\PayService.php) -- 小程序端:[`xgsc.gynhc.com_wx/shopro/pay/index.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro\pay\index.js) 将 `pay_data` 传给 `uni.requestPayment`,**无需改接口形态** -- 已有分账模块(默认关闭):[`SplitCalculator`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitCalculator.php) + [`SplitExecutor`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitExecutor.php)(微信 openid/商户号分账) - -**目标架构(并行通道 + 延时分账)** - -```mermaid -sequenceDiagram - participant MP as 小程序 - participant Pay as Pay.php - participant Router as PaymentRouter - participant HF as HuifuPayService - participant HFAPI as 汇付斗拱API - participant Order as paymentProcess - participant Split as HuifuSplitExecutor - - MP->>Pay: prepay(payment=wechat) - Pay->>Router: 读配置 miniprogram_channel - alt channel=huifu - Router->>HF: V4 create T_MINIAPP - Note over HF,HFAPI: delay_acct_flag=Y - HF->>HFAPI: POST v4/trade/payment/create - HFAPI-->>MP: pay_info → pay_data - else channel=yansongda - Router->>Pay: 现有 PayService - end - MP->>MP: uni.requestPayment - HFAPI->>Pay: 异步通知 notifyHuifu - Pay->>Order: paymentProcess - Note over Order: 佣金/区域代理计算(现有钩子) - Order->>Split: 读 split_timing 配置 - alt split_timing=payed - Split->>HFAPI: 支付成功即交易确认 + acct_split_bunch - else split_timing=confirm - Split->>HFAPI: 确认收货后交易确认 + acct_split_bunch - else split_timing=finish - Split->>HFAPI: 订单完成后交易确认 + acct_split_bunch - end -``` - -参考文档:[聚合支付 V4 下单](https://paas.huifu.com/open/doc/api/#/smzf/api_jhzs?id=miniwx)(旧版 jspay 等价迁移至 V4 create)、[分账串说明](https://spin.cloudpnr.com/topds/appendix/acctSplitBunch.html)、[延时分账说明](https://www.explinks.com/api/scd2024012252731a672326) - ---- - -## 二、汇付与现有微信分账的核心差异 - -| 维度 | 现有(Yansongda 直连) | 汇付斗拱 | -|------|------------------------|----------| -| 分账标识 | 微信 `openid` / `mch_id` | 汇付 `huifu_id`(子商户号) | -| 分账时机 | 支付后调微信 profitsharing API | **延时分账**:支付时 `delay_acct_flag=Y`,确认时调「交易确认」传 `acct_split_bunch` | -| 分账金额规则 | 各接收方之和 ≤ 订单 30% | **各分账方 `div_amt` 之和 = 交易金额 `trans_amt`**(主商户也要在分账串里拿留存部分) | -| 接收方前置 | 微信添加分账接收方 | 汇付侧需「用户开户 + 业务入驻」拿到 `huifu_id` | -| 小程序参数 | Yansongda 封装 | `trade_type=T_MINIAPP`,`method_expand` 内直接传 `sub_appid` + `sub_openid`(不用 `wx_data`,不用 `T_MINIAPP` 包装 key) | - -**延时分账优势(符合你的选择)**:与现有 `split_timing`(payed/confirm/finish)一致,可在佣金、区域代理奖励计算完成后再发起分账,不必在 `prepay` 前预估金额。 - ---- - -## 三、商务/资质前置条件(必须先确认) - -对接开发前,需向汇付商务/运营确认并开通: - -1. **主商户进件**(`$huifu-merchant-onboarding`):取得主 `huifu_id`、`sys_id`、`product_id`、RSA 密钥对 -2. **微信小程序绑定**:在汇付控台绑定小程序 AppID(对应 [`shopro_config.wxMiniProgram`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\config\platform.html) 中的 app_id);`sub_openid` 必须来自该 `sub_appid` 的授权链路 -3. **分账权限**(进件 Skill):`rule_origin=01`(接口发起),`div_flag=Y`,配置 `apply_ratio` -4. **延时分账权限**(进件 Skill):开通延迟交易;未开通前**不要默认传** `delay_acct_flag=Y` -5. **分账接收方开户**(进件 Skill):推广员/区域代理需获得各自 `huifu_id`,后台绑定到 `shopro_split_receiver` -6. **测试环境**:沙箱与生产密钥/商户号分离;本地沙箱仅验证协议闭环,不证明真实通道/资金结果 - ---- - -## 四、后端实现方案 - -### 4.1 引入 SDK 与基础封装(位于插件 `addons/shopro_huifu/`) - -> 以下代码**全部在插件内**,不在 Shopro 核心目录。 - -- 通过 Composer 引入官方 SDK:`huifurepo/dg-php-sdk ^2.0.30` -- SDK 主链路:`BsPaySdk\core\Payment::create()` + `TradePaymentCreateRequest`(V4) -- **禁止**使用官方 `BsPayDemo/loader.php` 或会定义 `DEBUG=true` 的 Composer 入口;加载任何 SDK 文件前固定 `DEBUG=false` -- 新建目录 `addons/shopro/library/huifu/`: - -| 文件 | 职责 | -|------|------| -| `HuifuClient.php` | 读取配置、初始化 Payment/BsPayClient、统一验签 | -| `HuifuPayService.php` | V4 下单 create、查单、关单 | -| `HuifuSplitService.php` | 延迟交易确认(分账)、`v2/trade/trans/split/query` | -| `HuifuRefundService.php` | 交易退款、交易确认退款 | -| `HuifuNotifyHandler.php` | 解析 `resp_data`、验签、幂等、ACK 回包 | - -**V4 create 关键参数(小程序 T_MINIAPP)**: - -```php -// TradePaymentCreateRequest 核心字段 -$request->setReqDate(date('Ymd')); -$request->setReqSeqId($order_sn); // 当天唯一,保留 prepay 传入值不重写 -$request->setHuifuId($config['huifu_id']); -$request->setTransAmt(number_format($total_fee, 2, '.', '')); // 元,两位小数 -$request->setGoodsDesc('商城订单支付'); -$request->setTradeType('T_MINIAPP'); -$request->setNotifyUrl($notify_url); -// 仅 split_enable=1 且 delay_acct_enable=1 且商户已开通延时权限时: -$request->setDelayAcctFlag('Y'); -// 可选扩展(后台可配,空则不传):time_expire、pay_scene、channel_no、fee_sign -// method_expand 是 JSON 对象,直接放 sub_appid/sub_openid,不要包 T_MINIAPP 层 -$request->setMethodExpand(json_encode([ - 'sub_appid' => $miniProgramAppId, - 'sub_openid' => $openid, -], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); -// 延时分账:支付阶段不传 acct_split_bunch -// Payment::create($request) -``` - -**返回处理**:解析响应 `pay_info`(JSON 字符串)→ 转为小程序 `pay_data`(`timeStamp/nonceStr/package/signType/paySign`),保持与现有 [`Pay.php` prepay 返回格式](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\Pay.php) 一致。 - -### 4.2 支付通道路由(插件 Hook + 后台可切换) - -配置存储在插件表 `shopro_huifu_config`(或 `shopro_config` 插件写入隔离 key): - -```json -{ - "miniprogram": "huifu", // yansongda | huifu - "split_provider": "huifu" // wechat | huifu(与 split_enable 联动) -} -``` - -修改 [`Pay.php::prepay`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\Pay.php) 增加 Hook 桥接(见 13.4);插件 `PayCreateHook` 内判断: - -```php -if ($platform === 'wxMiniProgram' && Bridge::getChannel() === 'huifu') { - return (new HuifuPayService())->miniAppPay($order_data); -} -// 返回 null 则核心继续走 PayService -``` - -- 小程序端仍传 `payment=wechat`,**前端零改动** -- 订单 `pay_type` 记为 `huifu_wechat`(便于分账/退款路由) -- 移除汇付路径下对 `settle_info.profit_sharing` 的设置(那是微信直连专用) - -### 4.3 异步通知(插件独立 Controller) - -插件 [`addons/shopro_huifu/controller/Pay.php`](addons/shopro_huifu/controller/Pay.php): - -``` -/addons/shopro_huifu/pay/notify/platform/wxMiniProgram -/addons/shopro_huifu/pay/notifyRefund/platform/wxMiniProgram -``` - -处理逻辑(按 `shared-async-notify.md`): -1. 从回调体取 `resp_data`,RSA 验签 -2. 校验 `huifu_id`、金额、`req_seq_id` 与本地订单一致 -3. `trans_stat=S` 才进入支付成功候选;`P` 保持支付中并触发查单补偿 -4. 幂等:已支付订单直接回包,不重复 `paymentProcess` -5. 组装 notify → 调用 `$order->paymentProcess($order, $notify)` -6. 保存 `hf_seq_id`、`req_date`、`req_seq_id` -7. **ACK 回包**:HTTP 200 + 响应体 `RECV_ORD_ID_{req_seq_id}`(不是普通 JSON success) - -### 4.4 延时分账执行(插件 listener + 核心 SplitCalculator) - -#### 4.4.1 分账时机:后台三选一(客户可配置) - -现有 Shopro 分账设置页 [`shopro/split/config`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\split\config\index.html) 已有 `split_timing` 下拉,**汇付插件完全复用**,无需新建配置项。运营可在后台自由选择: - -| 后台选项 | 值 | 触发 Hook | 业务含义 | 适用场景 | -|----------|-----|-----------|----------|----------| -| **支付成功** | `payed` | `order_payed_after` | 用户支付成功后**立即**发起汇付「交易确认」分账 | 需求图「支付成功后自动分账」;资金快速到账 | -| **确认收货** | `confirm` | `order_confirm_after` | 用户确认收货后才发起交易确认 | 降低退货/纠纷风险;佣金已结算 | -| **订单完成** | `finish` | `order_finish` | 订单完结(含售后窗口)后再分账 | 更长风控周期 | - -**执行链路(与现有微信分账一致)**: - -```mermaid -flowchart TD - Config[后台 split_timing] --> Hook{匹配事件?} - Payed[order_payed_after] --> Hook - Confirm[order_confirm_after] --> Hook - Finish[order_finish] --> Hook - Hook -->|是| Executor[SplitExecutor.executeByOrderId] - Executor --> Bridge{shopro_split_execute Hook} - Bridge -->|pay_type=huifu_wechat| HuifuSplit[插件 HuifuSplitService.confirm] - Bridge -->|否则| WxSplit[现有微信分账] -``` - -核心 [`SplitHook`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\listener\split\SplitHook.php) 已按 `split_timing` 过滤事件;插件 `SplitHook` 同样注册三个 Hook,**仅当 `split_provider=huifu` 且订单 `pay_type=huifu_wechat` 时**接管汇付「交易确认」。 - -**汇付延时分账说明**:无论选哪种时机,支付阶段均只传 `delay_acct_flag=Y`(资金冻结);真正分配在对应 Hook 触发时调「交易确认」。对终端用户而言,`payed` 模式仍是「付完即分」,`confirm`/`finish` 则是「确认后再分」。 - -**后台 UI 增强(实施时)**: -- 保留三选项,增加每项下方说明文案(见上表) -- 切换 `split_timing` 时提示:在途订单仍按**下单/支付时**的配置快照执行(见 4.4.2) -- 汇付模式下隐藏/禁用与微信 openid 相关的平台接收方字段,改为 `platform_huifu_id` - -#### 4.4.2 配置快照(防切换影响在途订单) - -`shopro_split_order` 或订单扩展字段保存 **`split_timing_at_pay`**(支付成功时读取的配置值)。Hook 触发分账时优先读快照,避免运营中途改配置导致同一批次订单行为不一致。 - -插件 `SplitHook` 注册到 `order_payed_after` / `order_confirm_after` / `order_finish` / `order_refund_after`;或通过核心 `shopro_split_execute` Hook 被 `SplitExecutor` 调用。 - -**Huifu 分支(替换 ProfitSharingService 调用)**: - -1. [`SplitCalculator`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitCalculator.php) 计算出各角色金额(推广员、区域代理) -2. **构建汇付分账串**(关键差异): - -```json -{ - "acct_infos": [ - {"huifu_id": "6666000104218017", "div_amt": "5.00"}, - {"huifu_id": "6666000104218018", "div_amt": "3.00"}, - {"huifu_id": "6666000104218019", "div_amt": "92.00"} - ] -} -``` - -- 每个 `div_amt` 保留两位小数 -- **总和必须等于 `trans_amt`** -- 最后一项 = 主商户留存(订单实付 - 各分账方之和) -- 手续费承担方由汇付返回的 `fee_huifu_id` 决定 - -3. 调用「交易确认接口」传入 `acct_split_bunch` -4. 写入现有 `shopro_split_order` / `shopro_split_order_receiver` 表,增加 `channel=huifu` 字段 -5. 失败重试:复用现有 [`SplitRetryJob`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitRetryJob.php) / `shopro:split-retry` - -**SplitCalculator 适配**: -- `getReceiver()` 优先读 `receiver_account` 作为 `huifu_id`(新增 `receiver_type=HUIFU_ID`) -- 不再自动从 OAuth 创建 openid 接收方(汇付必须事先开户) -- 保留 `split_max_rate` 校验 - -### 4.5 退款 - -[`OrderOper::refund()`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\traits\model\order\OrderOper.php) 分支: - -| 场景 | 接口 | -|------|------| -| 未做交易确认(延时分账未确认) | 汇付「交易退款接口」 | -| 已确认分账 | 「交易确认退款接口」+ 可能需分账回退 | - -[`SplitHook::orderRefundAfter`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\listener\split\SplitHook.php) 增加 Huifu 退款联动。 - -### 4.6 与内部佣金系统的关系 - -[`shopro_split_config.split_mode`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_payment_split.sql) 扩展: - -| split_mode | 行为 | -|------------|------| -| `wallet` | 仅内部钱包佣金(现状) | -| `wechat` | 仅微信直连分账 | -| `huifu` | 仅汇付延时分账 | -| `both` | 不建议,易重复发放 | - -当 `split_mode=huifu` 且汇付分账成功时,[`CommissionHook`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\listener\commission\CommissionHook.php) 应标记奖励为「已网关分账」,**跳过钱包入账**(与现有 `shouldSkipWallet()` 逻辑一致)。 - ---- - -## 五、数据库与后台配置 - -### 5.1 SQL 变更(`upgrade_huifu_payment.sql`) - -- `shopro_config` 插入 `huifu`、`payment_channel` 配置行 -- `shopro_split_receiver` 增加 `huifu_id` 字段(或复用 `receiver_account` 存 huifu_id,增加 `channel` 字段区分 wechat/huifu) -- `shopro_split_order` 增加 `channel`、`hf_req_seq_id`、`confirm_status` -- `shopro_order` 的 `pay_type` 枚举支持 `huifu_wechat` - -### 5.2 后台管理界面(概览) - -新增两个后台模块(含菜单 SQL): - -| 模块 | 路径 | 职责 | -|------|------|------| -| **汇付支付配置** | `shopro/huifu/config` | 密钥、通道、下单/通知/退款参数 | -| **分账设置(扩展)** | 现有 `shopro/split/config` | 增加汇付分账模式与延时分账开关 | -| **分账接收方(扩展)** | 现有 `shopro/split/receiver` | 增加 `channel=huifu`、`huifu_id`、`acct_id` | -| **分账记录(扩展)** | 现有 `shopro/split/order` | 增加手动重试确认、分账明细查询 | - -### 5.3 后台可配置参数清单(Skill 复核后完整版) - -#### A. 汇付支付配置页 `shopro_config.name = huifu` - -| 配置键 | 类型 | 必填 | 用途 | Skill 来源 | -|--------|------|------|------|-----------| -| `env` | test/prod | Y | 切换网关域名 | shared-local-sandbox / 上线检查 | -| `gateway_url` | string | Y | 测试/生产 API 地址 | 随 env 自动填充,可手动覆盖 | -| `sys_id` | string | Y | 公共请求参数 | aggregation-common-params | -| `product_id` | string | Y | 产品号 | aggregation-common-params | -| `huifu_id` | string | Y | 交易商户号 `data.huifu_id` | aggregation-common-params | -| `upper_huifu_id` | string | N | 渠道商场景上级商户号 | payment-operations-faq | -| `merchant_private_key` | text/file | Y | 请求 RSA 私钥(服务端存储,脱敏展示) | shared-credential-boundary | -| `huifu_public_key` | text/file | Y | 响应/通知验签公钥 | shared-signing-v2 | -| `skill_source` | string | N | SDK 请求头,默认 `hfps/1.3.5` | shared-request-header-policy | -| `miniprogram_channel` | yansongda/huifu | Y | 小程序支付通道路由 | 方案决策 | -| `notify_url` | string | 只读 | 支付异步通知(自动生成展示) | shared-async-notify | -| `refund_notify_url` | string | N | 退款异步通知 | aggregation-customer-preparation | -| `time_expire` | int(分钟) | N | 交易超时,不传则微信默认 | aggregation-order-request | -| `pay_scene` | string | N | 微信业务场景类型(如 `02`) | payment-complete-field-catalog | -| `channel_no` | string | N | 指定渠道号;**空则不传**(禁止传空字符串) | payment-operations-faq | -| `fee_sign` | string | N | 手续费场景标识 | payment-complete-field-catalog | -| `goods_desc_tpl` | string | N | 商品描述模板,如 `商城订单{order_sn}` | aggregation-faq | -| `limit_pay_type` | string | N | 禁用支付方式(如 `NO_CREDIT`) | aggregation-faq | -| `status` | 0/1 | Y | 汇付通道总开关 | 存量灰度 | - -**安全约束(后台保存时校验):** -- 生产环境禁止开启 SDK DEBUG -- 私钥/公钥仅管理员可见,列表页脱敏 -- `notify_url` 必须 HTTPS、无 query 参数(Skill:`shared-async-notify.md`) - -#### B. 分账设置页扩展 `shopro_split_config`(现有页补字段) - -现有 [`shopro/split/config/index.html`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\split\config\index.html) 需扩展: - -| 配置键 | 类型 | 默认 | 说明 | -|--------|------|------|------| -| `split_mode` | select | wallet | 增加 **`仅汇付分账(huifu)`** 选项;`both` 仍不建议 | -| `split_provider` | wechat/huifu/auto | auto | auto=跟随 `miniprogram_channel` | -| `delay_acct_enable` | 0/1 | 0 | 延时分账开关;仅 `split_provider=huifu` 且商户已开通时可开 | -| `platform_huifu_id` | string | — | 平台留存方汇付商户号(主商户 huifu_id) | -| `platform_acct_id` | string | N | 平台分账子账户(基本户/现金户,可选) | -| `term_div_coupon_type` | 1/2/3 | 3 | 遇优惠时分账规则:1按比例 2按顺序 3只给交易商户 | -| `split_retry_max` | int | 5 | 已有,保留 | -| `split_retry_interval` | int | 300 | 已有,保留 | -| `split_max_rate` | decimal | 30 | 已有;汇付侧还需 ≤ 控台 `apply_ratio` | -| `split_timing` | payed/confirm/finish | payed | **已有,运营三选一**:支付成功 / 确认收货 / 订单完成;汇付与微信分账共用;见 4.4.1 | - -**联动规则(后台保存校验):** -- `split_mode=huifu` 时 `split_enable` 必须=1 -- `delay_acct_enable=1` 要求 `split_provider=huifu` 且汇付商户已开通延时权限 -- `split_mode=huifu` 时禁用微信 openid 自动创建接收方 - -#### C. 分账接收方页扩展 `shopro_split_receiver` - -| 字段 | 说明 | -|------|------| -| `channel` | wechat / huifu | -| `receiver_type` | 微信:`PERSONAL_OPENID`/`MERCHANT_ID`;汇付:`HUIFU_ID` | -| `receiver_account` | 微信 openid/商户号 或 汇付 huifu_id | -| `acct_id` | 汇付分账子账户(可选,基本户/现金户) | -| `role_type` | promoter / regional_agent / platform / supplier | -| `status` | normal / hidden | - -#### D. 只读展示项(帮助运营填汇付控台) - -后台「汇付支付配置」页底部只读展示: -- 支付通知 URL:`/addons/shopro/pay/notifyHuifu/platform/wxMiniProgram` -- 退款通知 URL:`/addons/shopro/pay/notifyHuifuRefund/platform/wxMiniProgram`(若独立) -- 当前小程序 AppID(读取 `shopro_config.wxMiniProgram.app_id`,提示需与汇付控台 sub_appid 一致) - ---- - -## 十一、Skill 复核遗漏项(本次补充) - -> 对照 `$huifu-pay-integration` 的 `copilot-go-live-checklist.md`、`aggregation-payload-construction.md`、`payment-operations-faq.md`、`trade-split-detail-query.md` 复核。 - -### 11.1 支付链路遗漏(需补进方案) - -| 遗漏项 | 严重度 | 补充方案 | -|--------|--------|----------| -| **查单补偿任务** | 高 | 新增 `HuifuQueryService` + 定时任务:对 `trans_stat=P` 或 notify 缺失的订单主动查单(`TradePaymentScanpayQueryRequest`) | -| **notify 幂等事件表** | 高 | 新增 `shopro_huifu_notify_log`(`huifu_id+req_seq_id+event_type` 唯一键),防重复发货 | -| **`req_date` 落库** | 高 | prepay 时保存 `req_date`,查单/退款/关单/确认分账必须复用,不能事后重写 | -| **关单接口** | 中 | 超时未支付订单调聚合关单(`TradePaymentScanpayCloseRequest`),与现有订单超时逻辑联动 | -| **`refund_notify_url`** | 中 | 退款异步通知独立 endpoint + 验签 + 幂等 | -| **`time_expire`** | 低 | 后台可配,避免订单长期挂起 | -| **`pay_scene` / `channel_no`** | 低 | 多渠道/多微信商户号场景后台可配;`channel_no` 空则不传 | -| **`fee_sign`** | 低 | 多费率场景后台可配 | -| **PHP SDK 初始化** | 高 | `MerConfig.skill_source`、显式 require `init.php`(包无 autoload)、`DEBUG=false` 硬约束 | -| **订单扩展表** | 高 | `shopro_order_pay_ext` 或在 order 增 JSON:`hf_seq_id`、`req_date`、`req_seq_id`、`trans_stat`、`confirm_hf_seq_id` | -| **组合支付 group** | 中 | MVP 暂不支持汇付+余额组合,后台开关拦截并提示 | -| **充值订单 TO*** | 中 | MVP 仅商品订单;充值二期适配 | -| **对账** | 低 | 二期:`V2TradeCheckFilequeryRequest` 对账文件下载 | - -### 11.2 分账链路遗漏(需补进方案) - -| 遗漏项 | 严重度 | 补充方案 | -|--------|--------|----------| -| **`delay_acct_flag` 条件化** | 高 | 不应无条件 `Y`:仅当 `split_enable=1` 且 `delay_acct_enable=1` 且商户已开通延时权限时才传 | -| **交易确认 API 封装** | 高 | `HuifuSplitService::confirm()` 需保存返回 `confirm_hf_seq_id`,供退款/查询用 | -| **分账明细查询** | 中 | 确认后调 `v2/trade/trans/split/query` 复核 `acct_stat=S` | -| **分账串 `acct_id`** | 低 | 接收方可选指定基本户/现金户,后台可配 | -| **`term_div_coupon_type`** | 中 | 有优惠券/满减时影响分账,后台可配(默认 3=只给交易商户) | -| **主商户留存计算** | 高 | `div_amt` 总和必须=订单实付;平台留存 = 实付 - 各分账方之和,用 `bcmul/bcadd` | -| **分账仅汇付订单** | 高 | `SplitExecutor` 仅处理 `pay_type=huifu_wechat` 且 `split_provider=huifu` | -| **后台手动重试** | 中 | `shopro/split/order` 增加「重试交易确认」按钮(已有微信重试,需加 huifu 分支) | -| **分账失败告警** | 低 | 复用 `shopro:split-retry`,超次数写日志/通知运营 | -| **延时分账退款分支** | 高 | 未确认→交易退款;已确认→交易确认退款(`loan_flag` 规则,`payment-operations-faq`) | - -### 11.3 后台配置遗漏(用户明确要求) - -原方案 5.2 仅列 5 项,**不足以支撑运营自助配置**。已扩展为 **5.3 完整参数清单**(支付 17 项 + 分账 9 项 + 接收方 6 字段)。 - -还需补充: -- 新建 **`shopro/huifu/config`** 独立菜单(不与 platform.html 混放,避免配置项过多) -- 扩展现有 **分账设置** 下拉增加 `huifu` 模式 -- 扩展 **分账接收方** 支持 `channel` + `huifu_id` -- 配置保存时做 **联动校验**(见 5.3 B 节) - -### 11.4 测试清单补充(对照 go-live-checklist) - -在原第八章基础上增加: - -9. **查单补偿**:notify 不到达时,定时任务能补单成功 -10. **重复 notify**:不重复 `paymentProcess`、不重复发货 -11. **关单**:超时订单正确关单 -12. **退款 notify**:退款终态闭环 -13. **参数缺失拦截**:无 openid / 无 huifu_id / 未开通延时不传 delay_acct_flag -14. **后台配置生效**:改 channel_no/pay_scene/time_expire 后请求参数正确 -15. **灰度切换**:汇付↔直连切换不影响在途订单 - -### 11.5 MVP 边界调整建议 - -| 范围 | MVP(一期) | 二期 | -|------|------------|------| -| 支付 | 小程序商品单 + V4 create + notify + 查单补偿 | 充值单、组合支付 | -| 分账 | 延时分账 + 交易确认 + 明细查询 + 后台配置 | 百分比分账、净值分账 | -| 退款 | 未确认/已确认两种路径 | 垫资退款 | -| 运营 | 完整后台配置页 + 分账记录重试 | 对账报表、批量开户 | - ---- - -## 六、小程序端 - -**基本无需改动**。现有流程: - -```javascript -// shopro/pay/index.js - wxMiniProgramPay -uni.requestPayment({ provider: 'wxpay', ...result.data.pay_data }) -``` - -仅需确认汇付返回的 `pay_info` 字段名与微信一致(`timeStamp` 大小写兼容处理)。 - -可选:支付结果页 [`result.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\order\payment\result.vue) 展示 `pay_type=huifu_wechat` 时文案为「微信支付(汇付)」。 - ---- - -## 七、实施阶段与工时估算 - -| 阶段 | 内容 | 预估 | -|------|------|------| -| P0 资质 | 汇付开户、分账/延时权限、子商户 huifu_id | 商务周期(1~2 周) | -| P1 基础支付 | SDK 接入、HuifuPayService、V4 create、notify+查单补偿、后台配置 | 2~3 天 | -| P2 延时分账 | HuifuSplitService、SplitExecutor 分支、分账串构建、确认接口 | 2~3 天 | -| P3 退款/查询 | 退款、交易查询、关单、分账明细查询 | 1~2 天 | -| P4 联调 | 沙箱支付 → 确认收货分账 → 退款全链路 | 2~3 天 | -| P5 上线 | 生产密钥、控台配置、灰度切换 miniprogram_channel | 1 天 | - -**合计开发约 8~12 人天**(不含商务进件与子商户开户)。 - ---- - -## 八、测试清单 - -1. **支付**:0.01 元小程序下单 → 唤起支付 → 异步通知 → 订单状态变已支付 -2. **通道切换**:后台切回 yansongda,确认直连微信仍正常 -3. **延时分账(两种时机)**: - - `split_timing=payed`:支付成功 → 立即交易确认 → split_order 成功 - - `split_timing=confirm`:支付成功仅冻结;确认收货 → 交易确认 → split_order 成功 - - 切换配置后,在途订单按支付时快照执行 -4. **分账金额**:多分账方 + 主商户留存,总和 = 订单实付 -5. **佣金不重复**:split_mode=huifu 时钱包不入账 -6. **退款**:未确认前退款 / 确认后退款 -7. **幂等**:重复通知、重复分账确认不重复处理 -8. **异常**:分账失败重试、超 max_rate 拦截 - ---- - -## 九、风险与注意事项 - -1. **分账接收方必须是 huifu_id**:推广员/区域代理需提前在汇付开户,不能沿用微信 openid 自动创建逻辑 -2. **金额精度**:汇付用「元」两位小数,现有系统用「元」float,注意 `bcmul/bcadd` 避免精度丢失 -3. **订单号**:`req_seq_id` 需全局唯一;现有 prepay 会 regenerate `order_sn`,需确保与汇付流水一致 -4. **手续费**:分账串返回的 `fee_amt` 可能从某一方扣除,需在构建分账串时预留或按汇付规则处理 -5. **组合支付 group**:余额+微信组合时,仅微信部分走汇付,需单独评估是否支持 -6. **充值订单 TO***:若充值也需走汇付,需同样适配 TradeOrder 流程 - ---- - -## 十、推荐的首批交付范围(MVP) - -1. 小程序商品订单 + 汇付 V4 create + 异步通知 + 查单补偿(不含分账) -2. 后台通道切换(yansongda ↔ huifu) -3. 延时分账 + 交易确认(对接现有 SplitCalculator) -4. 基础退款 - -**二期**:子商户批量开户工具、对账文件、组合支付、充值订单、垫资退款。 - ---- - -## 十二、Skill 复核结论 - -**方案主链路正确**:聚合支付 V4 + 存量适配 + 延时分账 + 并行通道,与 Skill 推荐一致。 - -**主要遗漏已在本节补充**,集中在四类: -1. **支付终态闭环**:查单补偿、notify 幂等表、`req_date` 落库、关单 -2. **分账条件化**:`delay_acct_flag` 不应无条件开启;交易确认/查询/退款三分支 -3. **后台可配置性**:原方案配置项过少,已扩展为 5.3 完整清单(支付+分账+接收方) -4. **MVP 边界**:组合支付、充值单、对账应明确排除在一期外 - -**References 追加**:`copilot-go-live-checklist.md`、`trade-split-detail-query.md`、`aggregation-refund.md`、`payment-operations-faq.md` - ---- - -## 十三、插件化改造方案($huifu-pay-integration 存量接入口径) - -> Skill 依据:`copilot-existing-system.md`(优先新增适配层、保留原订单/支付/回调链路)、`copilot-solution-selection.md`(存量增量接入)、`copilot-go-live-checklist.md`(卸载/灰度/回滚)。 - -### 13.1 结论:可以做成独立插件 - -**可行**,推荐新建 FastAdmin 插件 **`addons/shopro_huifu`**(依赖 `shopro`,参考现有 [`addons/epay`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\epay\Epay.php) 的独立封装方式)。 - -| 状态 | 系统行为 | -|------|----------| -| **未安装** | 与现在完全一致,仅 Yansongda 直连微信/支付宝 | -| **已安装+启用** | 小程序可按配置走汇付;分账可走汇付延时分账 | -| **已禁用** | 不路由到汇付,历史数据保留,Yansongda 正常 | -| **已卸载** | 移除插件表/菜单/定时任务;Shopro 核心不受影响 | - -**Skill 对齐原则**: -- 汇付逻辑全部在插件内(Adapter / Notify / Query / Refund / Split) -- Shopro 核心只保留 **3 个可选 Hook 桥接点** + `paymentProcess` 不变 -- 不修改订单状态机、发货、佣金计算主流程 - -### 13.2 总体架构 - -```mermaid -flowchart TB - subgraph core [Shopro 核心 最小改动] - PayCtrl[Pay.php prepay] - OrderProc[paymentProcess] - SplitCalc[SplitCalculator 共用] - HookBridge[3 个 Hook 桥接点] - end - - subgraph plugin [addons/shopro_huifu 可卸载] - Bridge[Bridge 入口] - HuifuPay[HuifuPayService] - HuifuNotify[NotifyHandler] - HuifuSplit[HuifuSplitService] - HuifuAdmin[后台配置/菜单] - HuifuDB[(插件私有表)] - SDK[dg-php-sdk] - end - - PayCtrl --> HookBridge - HookBridge -->|插件启用且 channel=huifu| Bridge - HookBridge -->|否则| YSD[现有 PayService Yansongda] - Bridge --> HuifuPay - HuifuPay --> SDK - HuifuNotify --> OrderProc - HuifuSplit --> SplitCalc - HuifuSplit --> HuifuDB -``` - -### 13.3 插件目录结构 - -``` -addons/shopro_huifu/ -├── ShoproHuifu.php # install / uninstall / enable / disable / appInit -├── info.ini -├── config.php # 插件元配置 -├── config/menu.php # 后台菜单 -├── install.sql # 插件表 + 默认配置 -├── uninstall.sql # 可选:DROP 插件表(见 13.6) -├── hooks.php # 注册 Shopro 行为(由 appInit 加载) -├── library/ -│ ├── Bridge.php # class_exists 安全入口、isEnabled() -│ ├── HuifuClient.php -│ ├── HuifuPayService.php -│ ├── HuifuNotifyHandler.php -│ ├── HuifuQueryService.php -│ ├── HuifuRefundService.php -│ ├── HuifuSplitService.php -│ └── sdk/ # 或 composer 依赖隔离在插件 vendor -├── controller/ -│ ├── Pay.php # notifyHuifu / notifyRefund(独立 URL) -│ └── Config.php # 小程序 init 可读通道状态(可选) -├── listener/ -│ ├── PayCreateHook.php # shopro_pay_create -│ ├── RefundHook.php # shopro_pay_refund -│ └── SplitHook.php # order_confirm/finish/refund 汇付分账 -├── model/ # 插件私有 Model -├── command/ -│ ├── CompensateQuery.php # 查单补偿 -│ └── SplitRetry.php # 分账重试 -└── application/admin/ # FastAdmin 后台(随插件安装) - ├── controller/shopro_huifu/ - └── view/shopro_huifu/ -``` - -### 13.4 Shopro 核心「桥接层」改动(极小、可回滚) - -仅在 Shopro 核心增加 **3 处 Hook**,无插件时不执行任何汇付代码: - -| Hook 名 | 注入位置 | 作用 | -|---------|----------|------| -| `shopro_pay_create` | [`Pay.php::prepay`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\controller\Pay.php) 调 PayService 前 | 插件返回 pay_data 则短路;否则走 Yansongda | -| `shopro_pay_refund` | [`OrderOper::refund`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\traits\model\order\OrderOper.php) | 插件处理 `pay_type=huifu_wechat` 退款 | -| `shopro_split_execute` | [`SplitExecutor::executeByOrderId`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitExecutor.php) 开头 | 插件处理汇付分账;返回 true 则跳过微信分账 | - -**桥接代码模式(Skill:不猜、class_exists 防护)**: - -```php -// Pay.php 示例 -if (class_exists('\\addons\\shopro_huifu\\library\\Bridge')) { - $pluginResult = \think\Hook::listen('shopro_pay_create', [ - 'order' => $order, 'order_data' => $order_data, - 'payment' => $payment, 'platform' => $platform, - ], null, true); - if ($pluginResult) { - return $pluginResult; - } -} -// 原有 PayService 逻辑不变 -``` - -**禁止做法**(违反 Skill 存量接入原则): -- 在 `PayService.php` 内硬编码汇付 SDK 或 `use addons\shopro_huifu\...` -- 在 `shopro/hooks.php` 永久写入汇付 listener(应只在插件 `appInit` 动态注册) -- 卸载插件后仍要求 `composer require huifurepo/dg-php-sdk` 在项目根目录 - -### 13.5 插件生命周期 - -#### install(安装) - -1. 执行 `install.sql`:插件配置表、notify 幂等表、订单支付扩展表(或 ext 表) -2. 注册后台菜单:`shopro_huifu/config`、`shopro_huifu/log` -3. 写入默认配置:`miniprogram_channel=yansongda`(默认不影响现网) -4. 注册 CLI 命令:查单补偿、分账重试 -5. **不修改** Shopro 原有表结构(除可选 ext 外联表) - -#### enable(启用) - -1. `appInit` 注册 `think\Hook` 行为 -2. 加载 SDK(`DEBUG=false` 硬约束) -3. 小程序 init 接口返回当前通道(可选) - -#### disable(禁用) - -1. 停止 Hook 注册(`Bridge::isEnabled()` 返回 false) -2. 自动将 `miniprogram_channel` 置为 `yansongda`(防止禁用后仍路由汇付) -3. **保留**配置、历史订单、分账记录 -4. 定时任务跳过执行 - -#### uninstall(卸载) - -1. **前置检查**(人工确认):是否存在 `pay_type=huifu_wechat` 且未完结订单/未确认分账/退款中 -2. 删除后台菜单 -3. 执行 `uninstall.sql` 或保留数据策略(见 13.6) -4. 移除 CLI 命令注册 -5. Shopro 核心 3 个 Hook 桥接仍保留但无 listener → **零影响** - -### 13.6 数据隔离与卸载策略 - -| 数据 | 归属 | 卸载策略 | -|------|------|----------| -| 汇付配置/密钥 | 插件表 `shopro_huifu_config` | 卸载时删除(或导出后删除) | -| notify 幂等日志 | 插件表 `shopro_huifu_notify_log` | 可保留 N 天后删 | -| 支付扩展流水 | 插件表 `shopro_huifu_pay_ext` | **建议保留**供财务追溯,卸载不删 | -| 分账记录 | 现有 `shopro_split_order` + `channel=huifu` | **不删**;卸载后仅不可新分账 | -| 订单 `pay_type` | Shopro 订单表 | **不删**;历史 `huifu_wechat` 订单只读 | - -**卸载后历史订单**:不能再发起汇付退款/分账确认(插件已不存在),需人工通过汇付控台处理;安装期间应禁止在有在途汇付订单时卸载。 - -### 13.7 与现有分账模块的关系 - -| 模块 | 归属 | 说明 | -|------|------|------| -| `SplitCalculator` / 佣金规则 | **Shopro 核心** | 继续计算推广员/区域代理金额,插件复用 | -| `shopro_split_config` | **Shopro 核心** | 扩展 `split_mode=huifu`、`delay_acct_enable` 等字段 | -| `SplitExecutor` 微信分支 | **Shopro 核心** | 保持不动 | -| 汇付交易确认 / 分账查询 | **插件** | `HuifuSplitService` + `SplitHook` listener | -| 分账接收方 `huifu_id` | **Shopro 核心表** + 插件校验 | `receiver.channel=huifu` | - -插件 `SplitHook` 仅在 `Bridge::shouldHandleSplit($order)` 时执行,避免与微信分账重复。 - -### 13.8 后台配置归属(插件化后) - -| 配置页 | 位置 | -|--------|------| -| 汇付支付参数(5.3 A 节) | 插件 `shopro_huifu/config` | -| 分账模式/时机/比例(5.3 B 节) | 仍用 Shopro `shopro/split/config`(核心),插件读取 | -| 分账接收方 huifu_id(5.3 C 节) | 仍用 Shopro `shopro/split/receiver` | -| 分账记录/重试 | Shopro `shopro/split/order` + 插件提供 huifu 重试实现 | - -### 13.9 SDK 与 Composer 隔离 - -参考 [`epay`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\epay\Epay.php) 做法,二选一: - -| 方案 | 优点 | 缺点 | -|------|------|------| -| **A. 插件内 vendor** | 卸载即移除依赖 | 需在插件目录 `composer install` | -| **B. 插件内 bundled SDK** | 与 epay 一致,零根目录污染 | 体积较大 | - -Skill 要求:PHP 加载 SDK 前 `DEBUG=false`;`MerConfig.skill_source=hfps/1.3.5`;禁止 Demo loader。 - -### 13.10 卸载/禁用回归清单(必测) - -对照 `copilot-go-live-checklist.md` 存量检查: - -1. 禁用插件后,小程序 prepay 仍走 Yansongda,支付成功 -2. 卸载插件后,Shopro 安装/启用/订单/退款/微信分账均正常 -3. 卸载插件后,访问 `/addons/shopro_huifu/*` 返回 404,不影响 Shopro API -4. 禁用插件后,无汇付定时任务执行 -5. 启用插件后,通道切换 yansongda ↔ huifu 可灰度 -6. 插件启用时,重复 notify 不重复发货(幂等表在插件内) - -### 13.11 实施顺序调整(插件优先) - -| 阶段 | 内容 | 预估 | -|------|------|------| -| P0 | Shopro 3 个 Hook 桥接 + 插件骨架 + install/disable/uninstall | 1~2 天 | -| P1 | 插件内支付(V4 create + notify + 查单补偿 + 后台配置) | 2~3 天 | -| P2 | 插件内延时分账 + 对接 SplitCalculator | 2~3 天 | -| P3 | 插件内退款/关单 + 卸载保护 | 1~2 天 | -| P4 | 安装/禁用/卸载回归 + 沙箱联调 | 2~3 天 | - -**合计约 8~13 人天**(比原方案多 0~1 天插件骨架,但长期维护成本更低)。 - -### 13.12 与原方案章节的关系 - -- **第四节「后端实现」**:代码目标目录从 `addons/shopro/library/huifu/` 改为 **`addons/shopro_huifu/`** -- **第五节「后台配置」**:汇付专属页迁入插件;分账共用页仍在 Shopro -- **第十一节「遗漏项」**:查单补偿、幂等表、关单等均在**插件内**实现 -- **Shopro 核心改动**:仅 3 个 Hook 桥接(约 30 行),可单独 PR 审查 - ---- - -## 十四、需求符合性分析(对照需求图 × $huifu-pay-integration) - -> 需求图五项:**分账接入 / 分账角色管理 / 分账规则配置 / 自动分账 / 分账记录** -> 分析依据:现有 Shopro 分账模块 + 本方案插件化汇付方案 + Skill 延时分账/实时分账能力边界。 - -### 14.1 总览对照表 - -| 需求项 | 符合度 | 现有基础 | 方案覆盖 | 缺口/备注 | -|--------|--------|----------|----------|-----------| -| **1. 分账接入** | ✅ 符合 | 无汇付 | 插件 `shopro_huifu` 对接聚合支付 V4 + 延时分账「交易确认」 | 需汇付控台开通分账+延时权限(进件 Skill) | -| **2. 分账角色管理** | ⚠️ 基本符合 | [`shopro/split/receiver`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\split\receiver\index.html) 已有平台/推广员/区域代理 | 扩展 `channel=huifu`、`huifu_id`、`acct_id` | 需去掉汇付模式下 openid 自动创建;推广员/代理需事先汇付开户拿 `huifu_id` | -| **3. 分账规则配置** | ⚠️ 部分符合 | [`shopro/split/rule`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_payment_split.sql) 支持 `rate`/`money` | 复用规则表 + `SplitCalculator` | 当前计算器**优先读佣金/区域奖励**,规则表对推广员/代理未完全驱动;需增强「按规则表计算」分支 | -| **4. 自动分账** | ✅ 后台可选 | `split_timing` 三选一(已有 UI) | `payed`→支付成功即确认;`confirm`→确认收货后分账 | 两种主场景均支持;选 `payed` 满足需求图「支付成功后自动」;选 `confirm`/`finish` 满足风控需求 | -| **5. 分账记录** | ✅ 基本符合 | [`shopro/split/order`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\split\order\index.html) + 重试命令 | 增加 `channel=huifu`、`confirm_hf_seq_id`、插件内 `v2/trade/trans/split/query` 复核 | 需补汇付失败原因展示、手动重试「交易确认」 | - -**综合结论**:在插件方案落地 + 下列 14.3 补强项完成后,**可满足需求图五项**;第 4 项「自动分账」通过后台 `split_timing` 在「支付成功」与「确认收货」两种模式间切换,客户自行选择。 - -### 14.2 分项说明(Skill 口径) - -#### 1)分账接入 — ✅ 符合 - -- Skill 产品线:**聚合支付** + 分账能力(`acct_split_bunch` / 延时分账「交易确认」) -- 本方案:独立插件对接汇付斗拱,不替换 Shopro 订单与 `paymentProcess` -- 与图意「对接第三方支付公司分账服务商」一致 - -#### 2)分账角色管理 — ⚠️ 基本符合(需扩展) - -| 图中角色 | 系统对应 | 汇付侧要求 | -|----------|----------|------------| -| 平台 | `role_type=platform` + `platform_huifu_id` | 主商户 `huifu_id` 拿留存 | -| 推广员 | `role_type=promoter` + 用户绑定 | 需个人/企业 **汇付开户** 得 `huifu_id` | -| 区域代理 | `role_type=regional_agent` | 同上 | - -现有后台已有接收方 CRUD;插件化后需: -- 接收方类型增加 `HUIFU_ID` -- 列表展示汇付同步状态(替代仅「同步微信」) -- 缺 `huifu_id` 的接收方拦截分账 - -#### 3)分账规则配置 — ⚠️ 部分符合(需增强计算器) - -需求:「按订单金额**比例或固定金额**,设置各角色分账比例」。 - -数据库已支持: - -```sql --- shopro_split_rule -rule_type enum('rate','money') -- 比例 / 固定金额 -role_type enum('platform','promoter','regional_agent') -``` - -**缺口**:[`SplitCalculator`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\library\split\SplitCalculator.php) 当前主要从 `commission_reward` / `regional_agent_reward` 取数,**不是**完全按 `shopro_split_rule` 表驱动。 - -**补强(写入实施)**: -- 增加 `split_amount_source` 配置:`commission`(跟佣金)/ `rule`(纯规则表)/ `mixed`(优先佣金,无则规则) -- 纯规则模式下:`rate` → `pay_fee * rule_value / 100`;`money` → 固定 `rule_value` -- 汇付分账串构建仍遵守 Skill:**各 `div_amt` 之和 = 订单实付** - -#### 4)自动分账 — ✅ 后台可选两种主模式 - -需求原文:**「用户支付成功后自动触发分账,资金直接分配至各方账户」**;同时业务也可能需要 **确认收货后再分账**。 - -**方案:后台 `split_timing` 三选一,客户自行配置**(现有 [`shopro/split/config`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\application\admin\view\shopro\split\config\index.html) 已具备): - -| 后台选择 | 是否符合「支付成功后自动」 | 是否符合「确认收货后再分账」 | -|----------|--------------------------|------------------------------| -| `split_timing=payed` | ✅ 支付成功 Hook 内立即「交易确认」 | — | -| `split_timing=confirm` | — | ✅ 确认收货 Hook 内「交易确认」 | -| `split_timing=finish` | — | ✅(更保守)订单完结后再分 | - -汇付技术路径统一为 **延时分账**(支付时 `delay_acct_flag=Y`,触发时机由 `split_timing` 决定)。无需两套接口,仅 Hook 触发点不同。 - -**默认建议**:新装默认 `payed`(贴合需求图);有退货风险的商户可在后台改为 `confirm`,**无需改代码**。 - -#### 5)分账记录 — ✅ 基本符合(需汇付字段) - -现有能力: -- [`shopro_split_order`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\upgrade_payment_split.sql) / `shopro_split_order_receiver` 流水与明细 -- 状态:待分账/分账中/成功/部分成功/失败 -- [`shopro:split-retry`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\chufang.gynhc.com\addons\shopro\command\SplitRetry.php) 失败重试 - -插件补强: -- `channel=huifu`、`hf_seq_id`、`confirm_hf_seq_id`、`acct_stat` -- 调用 Skill 规定的 [`v2/trade/trans/split/query`](https://paas.huifu.com/partners/api/doc/smzf/api_fzmxcx.md) 复核终态(`acct_stat=S` 才标记成功) -- 后台「手动重试交易确认」 - -### 14.3 为完全贴合需求图必须补强的项 - -| 优先级 | 补强项 | 对应需求 | -|--------|--------|----------| -| P0 | 后台 `split_timing` 三选一 UI 说明文案 + 支付时配置快照 `split_timing_at_pay` | 自动分账(两种模式可选) | -| P0 | 接收方管理扩展 `huifu_id` + 开户校验 | 角色管理 | -| P1 | `SplitCalculator` 增加按 `shopro_split_rule`(rate/money)计算分支 | 规则配置 | -| P1 | 分账记录页展示汇付流水、失败原因、手动重试 | 分账记录 | -| P2 | 接收方「汇付开户状态」展示(进件 Skill 对接) | 角色管理 | - -### 14.4 不符合或超出需求图的范围(需知悉) - -| 项 | 说明 | -|----|------| -| 组合支付 `group` | 一期 MVP 不支持,图中未要求但商城可能存在 | -| 充值单 `TO*` | 二期 | -| 对账文件 | 二期 | -| 微信直连分账 | 已有模块,与汇付插件并行;`split_mode` 切换 | -| 钱包佣金 | `split_mode=wallet` 时仍走内部钱包,不走汇付网关 | - -### 14.5 需求验收清单(对照需求图) - -1. 安装并启用 `shopro_huifu`,后台可配置汇付商户号与密钥 -2. 分账接收方可维护平台/推广员/区域代理及 `huifu_id` -3. 分账规则可按比例或固定金额配置各角色 -4. 后台选择 `split_timing=payed` 时支付成功即分账;选择 `confirm` 时确认收货后分账;各方账户收到对应金额 -5. 后台可查看分账流水、状态,失败可重试并最终成功或标记失败 -6. 禁用/卸载插件后,商城直连微信支付与订单流程不受影响 diff --git a/plan/深蓝酒业主题改造_d0048f3e.plan.md b/plan/深蓝酒业主题改造_d0048f3e.plan.md deleted file mode 100644 index f41161e..0000000 --- a/plan/深蓝酒业主题改造_d0048f3e.plan.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -name: 深蓝酒业主题改造 -overview: 将微信小程序从当前红色商城风格,改造为参考「雄戈小酒」包装的深海军蓝 + 金色高端酒业主题;按钮/选中态用金色,价格保留红色;同时更新后台装修默认 tabBar 配置。 -todos: - - id: create-theme-vars - content: 新建 theme.scss + theme.js,并在 uni.scss 中引入 - status: completed - - id: update-global-styles - content: 更新 pages.json、uview theme.scss、index.scss 全局样式 - status: completed - - id: update-headers - content: 改造首页头部渐变、navbar、个人中心头部 fallback - status: completed - - id: replace-colors-by-context - content: 按按钮(金)/价格(红)/选中态(金或蓝) 区分替换 35+ vue 文件中的硬编码色值 - status: completed - - id: tabbar-fallback - content: shopro-tabbar + Vuex 增加新主题 fallback 及旧色自动映射 - status: completed - - id: backend-decorate - content: 更新 decorate.js 默认 tabBar 配置 + SQL 更新已有数据库模板 - status: completed - - id: verify-build - content: 编译微信小程序并逐项验证主要页面视觉效果 - status: completed -isProject: false ---- - -# 微信小程序深蓝酒业主题改造方案 - -## 设计目标 - -参考包装图「雄戈小酒」的视觉语言,建立 **深海军蓝 + 金色 + 价格红** 的三色体系: - -| 用途 | 色值 | 说明 | -|------|------|------| -| 主色(导航/头部/TabBar 背景) | `#001F54` | 深皇家蓝 | -| 主色渐变 | `#001F54 → #003399` | 首页/个人中心头部 | -| 按钮/选中态/强调 | `#C5A059 → #E9C875` | 金色渐变(已有登录弹窗 `#e9b461 → #eecc89` 可统一) | -| 价格/金额 | `#FF0e25` | **保留红色**(按你的选择) | -| 页面底色 | `#F0F3F8` | 微蓝灰,比纯白 `#f6f6f6` 更贴合主题 | -| TabBar 未选中文字 | `#8FA8C8` | 浅蓝灰 | - -```mermaid -flowchart LR - subgraph palette [ColorPalette] - Navy["#001F54 深海军蓝"] - Gold["#C5A059 金色"] - Red["#FF0e25 价格红"] - end - subgraph usage [Usage] - Navy --> NavBar[导航栏/头部/TabBar背景] - Navy --> CategorySel[分类选中背景] - Gold --> Buttons[购买/结算/确认按钮] - Gold --> Checkbox[复选框/Tab选中] - Red --> Price[商品价格/合计金额] - end -``` - ---- - -## 现状分析 - -- 框架:**uni-app (Vue2) + Shopro-plus + uView UI** -- 当前品牌色 `#FF0e25` 分散在 **约 35 个** `.vue` 文件及 [`pages.json`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages.json) 中,无统一主题文件 -- 首页头部为橙红渐变([`pages/index/index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\index.vue) 第 5 行): - -```5:5:f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\index.vue -style="...background: linear-gradient(to right, #FFA33E, #ff1926);" -``` - -- 主 Tab 页使用 **自定义 TabBar**([`components/shopro-tabbar/shopro-tabbar.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components\shopro-tabbar\shopro-tabbar.vue)),颜色由后台装修 API 下发(Vuex `tabbarData`) -- 个人中心头部背景色同样来自后台 `userTemplate[0].content.color` - ---- - -## 实施步骤 - -### 1. 建立统一主题变量(前端核心) - -新建 [`static/style/theme.scss`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static\style\theme.scss): - -```scss -$brand-primary: #001F54; -$brand-primary-light: #003399; -$brand-gold: #C5A059; -$brand-gold-light: #E9C875; -$brand-gold-gradient: linear-gradient(90deg, #C5A059, #E9C875); -$brand-header-gradient: linear-gradient(135deg, #001F54, #003399); -$brand-price: #FF0e25; // 价格保留红 -$brand-page-bg: #F0F3F8; -$brand-tabbar-bg: #001F54; -$brand-tabbar-active: #C5A059; -$brand-tabbar-inactive: #8FA8C8; -``` - -新建 [`shopro/config/theme.js`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\shopro\config\theme.js) 导出同名常量,供 template 内联 `style` 和 uView 组件 `activeColor` / `confirm-color` 属性使用。 - -在 [`uni.scss`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\uni.scss) 中 `@import 'static/style/theme.scss'`。 - -### 2. 全局基础样式 - -| 文件 | 改动 | -|------|------| -| [`uview-ui/theme.scss`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\uview-ui\theme.scss) | `$u-type-primary` 改为 `#001F54`,light/disabled 衍生色同步调整 | -| [`static/style/index.scss`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\static\style\index.scss) | `page` 背景改为 `$brand-page-bg` | -| [`pages.json`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages.json) | `globalStyle`: 导航栏背景 `#001F54`、文字 `white`;`tabBar`: 背景 `#001F54`、选中 `#C5A059`、未选中 `#8FA8C8` | - -### 3. 首页与个人中心头部 - -| 文件 | 改动 | -|------|------| -| [`pages/index/index.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\index.vue) | 头部渐变 `#FFA33E→#ff1926` 改为 `$brand-header-gradient`;内联 style 提取为 class | -| [`pages/index/index/home-head.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\index\home-head.vue) | 搜索框在深色背景下微调边框/背景透明度 | -| [`components/shopro-navbar/shopro-navbar.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components\shopro-navbar\shopro-navbar.vue) | 默认背景改为透明/深蓝,返回图标改白色 | - -个人中心头部 `userinfo-card` 的背景色来自后台配置;前端在 [`userinfo-card.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\user\userinfo-card.vue) 增加 fallback:当 `detail.color` 为空或为旧色值时,使用 `$brand-header-gradient`。 - -### 4. 按场景区分替换 `#FF0e25`(约 35 个文件) - -**改为金色渐变(按钮/CTA):** -- [`pages/goods/detail.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\goods\detail.vue) — 购买/加购按钮背景 -- [`pages/index/cart.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\cart.vue) — 结算按钮 -- [`components/shopro-sku/shopro-sku.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components\shopro-sku\shopro-sku.vue) — 确认按钮 -- [`components/shopro-share/shopro-share.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\components\shopro-share\shopro-share.vue) — 分享按钮 -- [`pages/index/components/sh-goods-card.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\components\sh-goods-card.vue) — `btnBg` 秒杀/拼团按钮 -- [`pages/index/category/takeout-catgory.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\category\takeout-catgory.vue) — 加购按钮 - -**保留红色(价格/金额):** -- 上述文件中的 `.price`、`.total-price`、`shopro-mini-card` 价格、`order/confirm.vue` 金额、`cart.vue` 合计金额等 **不改动** - -**改为深蓝/金色(交互选中态):** -- 分类页选中指示条(`one-catgory.vue`、`two-catgory.vue`、`three-catgory.vue`)→ 背景 `#001F54` 或金色左边框 -- Checkbox `activeColor`(cart、favorite、view-log 等)→ `#C5A059` -- [`pages/index/components/sh-grid-swiper.vue`](f:\修改的项目\贵州宥川商贸有限公司\chufang.gynhc.com\xgsc.gynhc.com_wx\pages\index\components\sh-grid-swiper.vue) 指示点 → 金色 - -**统一引入 theme:** -各 `.vue` 的 `