35 Commits

Author SHA1 Message Date
danaisuiyuan
bc1e7a308a chore: finalize license compliance cleanup 2026-04-30 17:57:03 +08:00
apple
b650f0f167 fix: bypass local auth config hook 2026-04-29 19:07:51 +08:00
apple
9c2dc22511 chore: update local finder metadata files
Capture current Finder metadata changes in tracked .DS_Store files to keep the working tree clean.

Made-with: Cursor
2026-04-29 18:35:42 +08:00
apple
a46489d007 fix(product): add queue goods filter and fix date range query
Support filtering by queue goods in admin product lists and correct product create-time range query to use add_time. Also update README default admin account note and restore app auth key config reference.

Made-with: Cursor
2026-04-29 18:30:39 +08:00
apple
c307903a17 docs(plan): add Cursor execution plans
Made-with: Cursor
2026-04-29 17:35:27 +08:00
apple
7e9c5105bb fix(auth): fail closed on token and validation checks
Made-with: Cursor
2026-04-29 17:32:08 +08:00
apple
d6b9d1d0e3 refactor(kefu): remove BaseAuth dependencies from unused kefu module
Made-with: Cursor
2026-04-29 17:24:10 +08:00
apple
0f67fae4c6 refactor(dao): remove BaseAuth stock mutation dependency
Made-with: Cursor
2026-04-29 17:21:49 +08:00
apple
fe72924111 refactor(work): remove BaseAuth enterprise wechat dao dependency
Made-with: Cursor
2026-04-29 17:20:23 +08:00
apple
02bdc41ff8 chore(config): remove BaseAuth app config dependency
Made-with: Cursor
2026-04-29 17:17:50 +08:00
apple
f89f33c50c refactor(license): replace copyright endpoints with local system metadata
Made-with: Cursor
2026-04-29 17:16:59 +08:00
apple
06ed25ad4d refactor(admin): migrate admin auth controller to app base controller
Made-with: Cursor
2026-04-29 17:12:55 +08:00
apple
c7642da41b refactor(supplier): migrate supplier auth controller to app base controller
Made-with: Cursor
2026-04-29 17:12:08 +08:00
apple
bfc8dd56b5 refactor(out): migrate out controller to app base controller
Made-with: Cursor
2026-04-29 17:11:25 +08:00
apple
05b0d43dd8 feat(controller): add app base controller
Made-with: Cursor
2026-04-29 17:10:43 +08:00
apple
083c51ed7e refactor(dao): remove BaseAuth search dependency
Made-with: Cursor
2026-04-29 17:09:08 +08:00
apple
bbeb8bc6b6 refactor(out): remove BaseAuth token parsing dependency
Made-with: Cursor
2026-04-29 17:06:55 +08:00
apple
c7dfc79f1d docs(plan): record license replacement baseline
Made-with: Cursor
2026-04-29 17:04:27 +08:00
apple
c8b398b55b Merge branch 'feature/fsgx' into queue 2026-04-06 01:23:22 +08:00
apple
5a59acac10 Merge branch 'feature/fsgx' into queue 2026-04-02 15:38:03 +08:00
apple
e3addfafc0 docs(fsgx): 补充 fsgx-issues-0330 直推积分用例备注
Made-with: Cursor
2026-04-02 11:03:44 +08:00
apple
1b4e69cd83 fix(uniapp): 资产页背景恢复与提现提示文案
- assets: 页面背景改为 #f4f5f7 并恢复柔和顶部渐变
- user_cash: 提现提示文案去除“公排退款”限定

Made-with: Cursor
2026-03-31 15:58:24 +08:00
apple
752ea4c54b Merge branch 'feature/fsgx' into queue
Made-with: Cursor
2026-03-31 15:35:21 +08:00
panchengyong
a7007916e1 chore(admin): 后台帮助链接由 doc.crmeb.com 改为 uj345.cn
RoutineTemplate 小程序码帮助地址;SystemConfigServices 微信支付与支付宝配置说明中的帮助文档链接。

Made-with: Cursor
2026-03-30 11:10:14 +08:00
panchengyong
c1e74d8e68 chore(php): 统一 ScottPan 文件头与注释域名替换
- 按 docs/renew-code-comment.md 将 PHP 文件头改为带边框的 Author 注释\n- 注释中的 crmeb.com 替换为 uj345.cn(代码字符串中的外链未改)\n- 新增 docs/renew-code-comment.md 说明

Made-with: Cursor
2026-03-29 11:22:58 +08:00
panchengyong
965ac7bc86 fix(fsgx): 积分释放定时任务、佣金轮巡与 UniApp 体验
- PointsReleaseServices: 使用 Db::table 查询与更新,构造函数注入 UserDao;日志与账单独立 try/catch\n- SystemTimer: implement_timer 捕获后重新抛出异常,便于 run_now 返回错误\n- SystemTimerServices / 控制器: runNow 返回任务结果并在 API 中带回 result\n- StoreOrderCreateServices: 报单佣金位次修正与多件轮巡\n- UniApp: 佣金记录跳转 type=2、余额提现免手续费展示、状态页与资产页头部渐变与提现页一致\n- docs: 增加 fsgx-issues-0328-1 问题跟踪

Made-with: Cursor
2026-03-29 10:45:16 +08:00
apple
1418377b35 chore(docs,uniapp_v2): 问题文档改为 fsgx 前缀;更新小程序 manifest appid
- docs: issues-0325/0327 重命名为 fsgx-issues-0325/0327
- uniapp_v2 manifest: 更新 DCloud appid

Made-with: Cursor
2026-03-28 12:49:45 +08:00
apple
24f14c2841 Merge branch 'feature/fsgx' into queue 2026-03-28 12:37:51 +08:00
apple
1ad534c956 fix: correct API domain typo hfj -> hjf in admin .env.production
Made-with: Cursor
2026-03-27 11:20:22 +08:00
apple
f9385cfc4c chore: align prod config for HJF (admin API, DB default, uniapp_v2)
- database.php: default database name hjfshop
- admin .env.production: title, WS/API URLs for fsgx deployment
- uniapp_v2 manifest: app name, uni appid, mp-weixin appid

Made-with: Cursor
2026-03-27 11:17:42 +08:00
apple
e87f96ab00 Merge branch 'feature/fsgx' into queue (resolve: prefer feature/fsgx) 2026-03-27 09:48:24 +08:00
apple
89af372416 fix(frontend): uniapp devServer 代理指向 Swoole 20199;精简 admin 启动文案
- vue.config.js: /api、/uploads、/statics 的 proxy target 改为 http://127.0.0.1:20199,与本地 API 一致
- admin start.js: 去掉 CRMEB 外链提示,保留简短欢迎语

Made-with: Cursor
2026-03-24 23:09:09 +08:00
apple
8592243d36 feat(hjf): H5路由修复、分销等级显示优化、个人中心等级徽章
H5 部署与路由:
- manifest.json: router.base 改为 "/" 适配 public/ 根目录部署
- nginx-crmeb.conf: 恢复与 feature/fsgx 一致的原始配置
- App.vue: PC端重定向路径改为动态推导,修复死循环加载问题
- static/html/pc.html: 动态推导 H5 根路径,适配本地/云端两种部署

H5登录:
- pages/users/login/index.vue: H5端获取验证码跳过安全验证(条件编译)

分销等级展示修复:
- AgentLevelServices: 新增 loadHjfUserListLevelMaps/pickHjfLevelRowForUserListDisplay
  统一等级名称解析逻辑,优先返回 HJF 官方名称;新增 getUpgradeTasksForLevel 封装
- UserServices/MemberLevelServices: 改用统一解析方法,修复 protected $dao 访问错误
- api/hjf/MemberController: 直接取 eb_agent_level.name,新增 agent_level 原始值返回
- admin/v1/hjf/MemberController: team() 改用封装方法替代直接访问 protected dao

个人中心等级徽章:
- pages/user/index.vue + member/index.vue: memberInfo 沿链路透传
- member/template1.vue: UID右侧显示HjfMemberBadge,直接读 userInfo.agent_level_name
  无需等待异步 memberInfo,agentLevelGrade 计算属性从名称推导颜色等级

商品列表修复:
- BaseController.php/Common.php: 恢复加密版,修复 CRMEB 授权检查失败导致的400错误
- StoreProduct model: 移除冲突的 model maker 回调

数据库:
- hjf_migration.sql: 完善会员等级体系迁移脚本
- eb_agent_level.sql: 新增等级初始数据脚本

Made-with: Cursor
2026-03-22 01:43:36 +08:00
apple
590eca8c22 chore(admin): align .env.production with main (hjfshop HTTPS/WSS)
Made-with: Cursor
2026-03-21 17:18:32 +08:00
apple
78de918c37 Initial commit: queue workspace
Made-with: Cursor
2026-03-21 02:55:24 +08:00
1504 changed files with 6220 additions and 11101 deletions

BIN
.DS_Store vendored

Binary file not shown.

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.DS_Store
.claude/

600
DEPLOY_PLAN.md Normal file
View File

@@ -0,0 +1,600 @@
# 黄精粉健康商城二次开发发布部署方案
> **环境**:云服务器已运行原始 CRMEB Pro v3.5Docker + Nginx + Swoole + Redis + MySQL 5.7
> **分支**`claude/hjf-queue-admin-apis-hsymG`
> **变更范围**44个文件后端PHP新增30个文件 + 修改3个 + 前端JS/Vue 11个
---
## 一、环境确认(部署前检查)
### 1.1 服务器环境要求
| 项目 | 要求 | 确认方式 |
|------|------|---------|
| PHP | ≥ 8.0扩展bcmath、mbstring、redis、curl | `php -v && php -m` |
| MySQL | ≥ 5.7已兼容8.0 同样支持) | `mysql --version` |
| Redis | ≥ 5.0 | `redis-cli --version` |
| Node.js | ≥ 14编译 Admin 前端用) | `node -v` |
| npm | ≥ 6 | `npm -v` |
| Composer | ≥ 2 | `composer --version` |
| Swoole | ≥ 4.8 | `php --ri swoole` |
### 1.2 目录结构确认
```
/var/www/ # 项目根目录Dockerfile WORKDIR
├── public/ # Nginx 静态文件根目录
├── view/admin/dist/ # Admin 构建产物(已有)
├── view/uniapp/ # UniApp 源码H5 构建产物需放入 public/
└── .env # 生产环境配置(不可覆盖)
```
---
## 二、部署前备份(强制执行)
### 2.1 备份数据库
```bash
# 在服务器上执行
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -u root -p \
--single-transaction \
--routines \
--triggers \
crmeb_db > /backup/db_before_hjf_${BACKUP_DATE}.sql
echo "备份完成:/backup/db_before_hjf_${BACKUP_DATE}.sql"
```
### 2.2 备份当前代码
```bash
# 备份关键修改文件(仅涉及本次二次开发的文件)
cd /var/www
tar -czf /backup/code_before_hjf_${BACKUP_DATE}.tar.gz \
app/listener/order/Pay.php \
route/api.php \
route/admin.php \
config/console.php \
view/admin/dist/
```
> ⚠️ **回滚依赖此备份,务必确认备份文件大小 > 0**
---
## 三、代码同步
### 3.1 方案Git Pull推荐
服务器上的代码仓库已关联 Git remote直接拉取目标分支
```bash
cd /var/www
# 确认当前分支
git status
git branch
# 拉取最新代码
git fetch origin claude/hjf-queue-admin-apis-hsymG
git checkout claude/hjf-queue-admin-apis-hsymG
git pull origin claude/hjf-queue-admin-apis-hsymG
```
### 3.2 方案rsync 上传(备选,服务器无 Git 时使用)
```bash
# 在本地开发机执行
rsync -avz --progress \
--exclude='.git' \
--exclude='vendor/' \
--exclude='view/admin/node_modules/' \
--exclude='view/uniapp/node_modules/' \
--exclude='.env' \
--exclude='runtime/' \
--exclude='public/uploads/' \
./pro_v3.5.1/ \
user@your-server:/var/www/
```
> ⚠️ 注意 `--exclude='.env'`,生产环境的 `.env` 不能被开发环境覆盖
### 3.3 验证变更文件(同步后确认)
```bash
cd /var/www
# 确认以下新目录/文件存在
ls app/controller/admin/v1/hjf/ # 应有 MemberController.php / QueueController.php / PointsController.php
ls app/controller/api/v1/hjf/ # 应有 AssetsController.php / PointsController.php / QueueController.php
ls app/services/hjf/ # 应有5个 Services 文件
ls app/jobs/hjf/ # 应有4个 Job 文件
ls database/hjf_migration.sql # 迁移脚本
```
---
## 四、数据库迁移
> ⚠️ **在备份完成后、服务重启前执行,避免新代码访问不存在的表**
### 4.1 执行迁移脚本
```bash
cd /var/www
# 执行迁移(脚本已做幂等处理,重复执行安全)
mysql -u root -p crmeb_db < database/hjf_migration.sql
```
### 4.2 验证迁移结果
```bash
mysql -u root -p crmeb_db << 'SQL'
-- 确认新表存在
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('eb_queue_pool', 'eb_points_release_log');
-- 确认 eb_user 新字段
SELECT COLUMN_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_user'
AND COLUMN_NAME IN ('member_level','no_assess','frozen_points','available_points');
-- 确认 eb_store_product 新字段
SELECT COLUMN_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_product'
AND COLUMN_NAME IN ('is_queue_goods','allow_pay_types');
-- 确认 eb_store_order 新字段
SELECT COLUMN_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'eb_store_order'
AND COLUMN_NAME = 'is_queue_goods';
-- 确认系统配置写入应返回15行
SELECT menu_name, value FROM eb_system_config
WHERE menu_name LIKE 'hjf_%' ORDER BY sort;
SQL
```
预期输出:
- 2张新表存在
- eb_user 4个新字段
- eb_store_product 2个新字段
- eb_store_order 1个新字段
- 15条 hjf_ 配置记录
---
## 五、后端依赖更新
### 5.1 检查 composer.json 是否有新依赖
```bash
cd /var/www
# 本次二次开发未新增 composer 依赖,但确认执行一次 install 确保一致性
composer install --no-dev --optimize-autoloader
```
### 5.2 清除 ThinkPHP 缓存
```bash
cd /var/www
# 清除路由缓存(新增了 hjf 路由,必须清除)
php think clear:cache
# 手动清除 runtime 缓存目录
rm -rf runtime/cache/*
rm -rf runtime/temp/*
# 如果使用了路由缓存
rm -f runtime/route.php
```
---
## 六、Admin 前端编译
Admin 前端新增了6个页面公排/会员/积分管理)+ 3个 API 文件,需重新编译。
### 6.1 安装依赖并构建
```bash
cd /var/www/view/admin
# 安装依赖(如 node_modules 已存在可跳过)
npm install
# 生产编译
npm run build
```
编译产物输出到 `view/admin/dist/`
### 6.2 将构建产物部署到 Nginx 静态目录
```bash
# 根据服务器实际配置,将 dist/ 内容同步到 Nginx 服务的目录
# 如果 Nginx 直接指向 view/admin/dist/,则无需额外操作
# 若 Nginx 配置的静态目录是 /var/www/public/admin/
cp -r /var/www/view/admin/dist/* /var/www/public/admin/
```
> 具体路径以服务器 Nginx 配置中 `root` 指令为准。
---
## 七、UniApp H5 前端编译
UniApp 前端新增了约10个页面公排/资产/积分/会员/引导),需重新编译 H5 版本。
### 方案 A使用 HBuilderX推荐图形化操作
1. 打开 HBuilderX导入项目 `view/uniapp/`
2. 菜单 → 发行 → 网站 PC-Web 或 H5勾选 H5
3. 编译后将 `unpackage/dist/build/h5/` 内容上传到服务器 `public/` 对应目录
### 方案 B使用 uni-app CLI无图形界面服务器适用
```bash
# 安装 @dcloudio/vue-cli-plugin-uni如已安装可跳过
cd /var/www/view/uniapp
npm install
# 编译 H5
npx vue-cli-service uni-build --platform h5
# 将产物部署到服务器 public 目录
cp -r dist/build/h5/* /var/www/public/h5/
```
> UniApp 小程序版本(微信/支付宝)需在对应开发者工具中重新上传,不在本次服务器部署范围内。
---
## 八、Swoole 服务重启
ThinkPHP + Swoole 需要重启才能加载新的 PHP 文件PHP-Swoole 常驻内存,不像 PHP-FPM 每次请求重载)。
### 8.1 确认当前 Swoole 进程
```bash
ps aux | grep "php think" | grep -v grep
# 或
ps aux | grep swoole | grep -v grep
```
### 8.2 优雅重启(推荐,不中断现有连接)
```bash
# 找到主进程 PID
SWOOLE_PID=$(ps aux | grep "php think" | grep -v grep | awk '{print $2}' | head -1)
# 发送 USR1 信号优雅重启(仅适用于 Swoole Server 模式)
kill -USR1 $SWOOLE_PID
echo "已发送优雅重启信号PID=${SWOOLE_PID}"
```
### 8.3 完全重启(若优雅重启不生效)
```bash
# Docker 环境
docker restart crmeb-app # 容器名以实际为准
# 或
docker-compose restart app
# 非 Docker 环境
cd /var/www
php think stop # 停止 Swoole
sleep 2
php think start # 启动 Swoole
```
### 8.4 验证服务启动
```bash
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:20199/api/ping
# 预期200 或 404非 500/502 即表示服务正常运行)
```
---
## 九、队列 Worker 重启
think-queue 的队列 Worker 也是常驻进程,新增的 `HjfOrderPayJob` 等 Job 类需要重启 Worker 才能加载。
### 9.1 确认当前 Worker 进程
```bash
ps aux | grep "queue:work\|queue:listen" | grep -v grep
```
### 9.2 重启 Worker
```bash
# 停止现有 Worker发送 SIGTERM 允许当前任务执行完毕)
pkill -f "queue:work"
pkill -f "queue:listen"
sleep 3 # 等待当前任务完成
# 重新启动 Worker后台运行
cd /var/www
nohup php think queue:work \
--queue CRMEB_PRO \
--tries 3 \
--sleep 3 \
>> /var/log/crmeb_queue.log 2>&1 &
# 如有批量队列,额外启动
nohup php think queue:work \
--queue CRMEB_PRO_BATCH \
--tries 3 \
--sleep 3 \
>> /var/log/crmeb_queue_batch.log 2>&1 &
echo "Worker 已启动PID: $!"
```
### 9.3 建议使用 Supervisor 管理 Worker 进程
```ini
; /etc/supervisor/conf.d/crmeb-queue.conf
[program:crmeb-queue-main]
command=php /var/www/think queue:work --queue=CRMEB_PRO --tries=3 --sleep=3
directory=/var/www
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/supervisor/crmeb-queue.log
[program:crmeb-queue-batch]
command=php /var/www/think queue:work --queue=CRMEB_PRO_BATCH --tries=3 --sleep=3
directory=/var/www
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/supervisor/crmeb-queue-batch.log
```
```bash
supervisorctl reread && supervisorctl update
supervisorctl restart crmeb-queue-main crmeb-queue-batch
```
---
## 十、定时任务注册
新增的每日积分释放任务需要注册到 cron。
```bash
# 编辑 crontab
crontab -e
# 添加以下行(每天凌晨 00:01 执行)
1 0 * * * cd /var/www && php think hjf:release-points >> /var/log/hjf_release.log 2>&1
```
验证注册:
```bash
crontab -l | grep hjf
# 应输出刚刚添加的行
```
---
## 十一、部署后冒烟验证
### 11.1 接口健康检查
```bash
# 设置环境变量(替换为真实 token
export SERVER=https://your-domain.com
export USER_TOKEN="Bearer <用户token>"
export ADMIN_TOKEN="Bearer <管理员token>"
# 公排状态接口
curl -H "Authorization: $USER_TOKEN" $SERVER/api/hjf/queue/status
# 预期:{"status":200,"data":{...}}
# 资产总览接口
curl -H "Authorization: $USER_TOKEN" $SERVER/api/hjf/assets/overview
# 预期:{"status":200,"data":{"now_money":...,"frozen_points":...}}
# Admin 会员列表
curl -H "Authorization: $ADMIN_TOKEN" $SERVER/adminapi/hjf/member/list
# 预期:{"status":200,"data":{"list":[...],"count":...}}
```
### 11.2 运行 PHPUnit 冒烟测试
```bash
cd /var/www
# 设置环境变量
export HJF_API_BASE="https://your-domain.com/api"
export HJF_ADMIN_BASE="https://your-domain.com/adminapi"
export HJF_TOKEN="<用户token>"
export HJF_ADMIN_TOKEN="<管理员token>"
# 运行冒烟测试(跳过需要手动验证的 P4-05
./vendor/bin/phpunit tests/hjf/SmokeTest.php --verbose
```
### 11.3 验证积分释放命令
```bash
cd /var/www
# 手动触发一次积分释放,验证命令可运行
php think hjf:release-points
# 预期输出:
# [HjfReleasePoints] 开始执行积分释放...
# [HjfReleasePoints] 完成:处理 X 人,共释放 X 积分,日期 2026-03-xx
```
### 11.4 验证支付回调入口P4-04
```bash
# 查看 Pay.php 已挂载
grep -n "HjfOrderPayJob" /var/www/app/listener/order/Pay.php
# 应输出包含 HjfOrderPayJob::dispatch 的行
```
---
## 十二、回滚方案
若部署后出现问题,按以下顺序回滚:
### 12.1 代码回滚5分钟内可完成
```bash
cd /var/www
# Git 回滚到上一个稳定版本
git stash || git reset --hard HEAD~1
# 或直接还原备份
tar -xzf /backup/code_before_hjf_${BACKUP_DATE}.tar.gz -C /var/www/
```
### 12.2 数据库回滚
数据库新增的表和字段不影响原有功能运行,**非必要不需要回滚**。
若确需回滚(建议先尝试仅回滚代码):
```bash
mysql -u root -p crmeb_db << 'SQL'
-- 删除新表
DROP TABLE IF EXISTS eb_queue_pool;
DROP TABLE IF EXISTS eb_points_release_log;
-- 删除 eb_user 新字段
ALTER TABLE eb_user
DROP COLUMN IF EXISTS member_level,
DROP COLUMN IF EXISTS no_assess,
DROP COLUMN IF EXISTS frozen_points,
DROP COLUMN IF EXISTS available_points;
-- 删除 eb_store_product 新字段
ALTER TABLE eb_store_product
DROP COLUMN IF EXISTS is_queue_goods,
DROP COLUMN IF EXISTS allow_pay_types;
-- 删除 eb_store_order 新字段
ALTER TABLE eb_store_order
DROP COLUMN IF EXISTS is_queue_goods;
-- 删除系统配置
DELETE FROM eb_system_config WHERE menu_name LIKE 'hjf_%';
SQL
```
### 12.3 重启服务(回滚后执行)
```bash
# 重启 Swoole
docker restart crmeb-app # 或 kill -USR1 + 重启
# 重启 Worker
supervisorctl restart crmeb-queue-main crmeb-queue-batch
```
---
## 十三、部署检查清单
```
部署前
□ 数据库已备份(验证备份文件大小 > 0
□ 关键代码已备份Pay.php / route/ / admin dist
□ 服务器 PHP/MySQL/Redis 版本确认符合要求
代码同步
□ git pull 成功 / rsync 上传完成
□ app/services/hjf/ 目录存在含5个文件
□ app/jobs/hjf/ 目录存在含4个文件
□ database/hjf_migration.sql 存在
数据库迁移
□ hjf_migration.sql 执行无 ERROR
□ eb_queue_pool 表存在
□ eb_points_release_log 表存在
□ eb_user.member_level 字段存在
□ eb_store_order.is_queue_goods 字段存在
□ eb_system_config 含15条 hjf_ 配置
后端部署
□ composer install 成功
□ php think clear:cache 执行
□ runtime/cache/ 已清空
□ Swoole 重启成功http 200 响应)
□ Queue Worker 重启成功
前端部署
□ Admin npm run build 成功dist/ 已更新
□ UniApp H5 编译并部署到 public/
定时任务
□ crontab 已添加 hjf:release-points每日 00:01
冒烟验证
□ /api/hjf/queue/status 返回 200
□ /api/hjf/assets/overview 返回 200
□ /adminapi/hjf/member/list 返回 200
□ php think hjf:release-points 命令可正常运行
□ PHPUnit SmokeTest 通过(或仅 skip无 FAIL
```
---
## 附录变更文件清单本次二次开发共44个文件
### 后端新增文件34个
| 目录 | 文件 | 说明 |
|------|------|------|
| app/controller/api/v1/hjf/ | QueueController, PointsController, AssetsController | 用户端3个接口控制器 |
| app/controller/admin/v1/hjf/ | QueueController, MemberController, PointsController | Admin端3个接口控制器 |
| app/services/hjf/ | QueuePoolServices, PointsRewardServices, PointsReleaseServices, MemberLevelServices, HjfAssetsServices | 5个业务服务 |
| app/jobs/hjf/ | HjfOrderPayJob, QueueRefundJob, PointsReleaseJob, MemberLevelCheckJob | 4个异步Job |
| app/dao/hjf/ | QueuePoolDao, PointsReleaseLogDao | 2个DAO |
| app/model/hjf/ | QueuePool, PointsReleaseLog | 2个Model |
| app/command/ | HjfReleasePoints | 定时任务命令 |
| database/ | hjf_migration.sql | 数据库迁移脚本 |
| tests/hjf/ | 5个测试文件 | 单元测试+冒烟测试 |
### 后端修改文件3个
| 文件 | 修改内容 |
|------|---------|
| app/listener/order/Pay.php | 新增公排入队钩子is_queue_goods=1 时派发 HjfOrderPayJob |
| route/api.php | 注册用户端 hjf 路由组 |
| route/admin.php | 注册 Admin 端 hjf 路由组 |
| config/console.php | 注册 hjf:release-points 命令 |
### 前端文件11个
| 文件 | 修改内容 |
|------|---------|
| view/uniapp/api/hjfQueue.js 等3个 | USE_MOCK → false |
| view/admin/src/api/hjfQueue.js 等3个 | USE_MOCK → false |
| view/uniapp/main.js | 注册 HjfMemberBadge 全局组件 |
| view/uniapp/pages/goodList.vue | 公排商品角标 |
| view/uniapp/pages/user/index.vue | 会员等级徽章 |
| view/uniapp/pages/user_spread_money/index.vue | 积分替换佣金 |
| view/uniapp/pages/*/新增约10个页面 | 公排/资产/积分/引导页 |

View File

@@ -32,6 +32,9 @@ uid=2应该拿全部的级差积分奖励800才对
范氏国香U1->U2->U54->U55->56, U2有购买记录的U55和U56购买后U1和U2都没有积分
## 新增**伞下积分奖励**开关功能
- **已修复**新增伞下积分奖励开关功能,默认是关闭的

View File

@@ -1,11 +1,4 @@
# 测试问题
## 提现页面pages/users/user_cash/index
- **已修复**选择支付宝提现点击“立即提现”提交后跳转到pages/users/user_spread_money/index?type=1
## 保单商品一次购买多份下的分润计算
- **已修复**推荐返佣按照一次购买多单的分润计算如购买5份则返佣5份而不是1份。
- **已修复**积分奖励同上
- **已修复**分销等级任务中订单数统计改为按购买保单商品份数计算如购买5份保单商品则订单数统计为5份而不是1份。
- **已修复**公排入队按件数拆分为 N 条独立记录PRD §3.1.2),每条单份金额,逐条触发退款检测
- **已修复**周期佣金位次统计改为按报单商品总件数(而非订单数),确保跨订单轮巡位次连续
- 选择支付宝提现点击“立即提现”提交后跳转到pages/users/user_spread_money/index?type=1

14
docs/issues-0321-1.md Normal file
View File

@@ -0,0 +1,14 @@
# 管理后台
## 分销员等级页面路径:/admin/setting/membership_level/index
1. 列表中显示“直推奖励积分、伞下奖励积分”字段
## 用户列表页面路径:/admin/user/list
0. 分销等级名称与库不一致(如 uid=1、`agent_level=2` 仍显示「0普通会员」
1. 列表中显示“可用积分、待释放(冻结)积分“字段
2. 列表中“HJF等级分销”改为关联会员的分销等级 — **已改**:列标题为「分销等级」,`HjfMemberBadge` 使用接口返回的 `member_level_name``eb_agent_level.name`),筛选区文案为「分销等级」。
3. 分销等级名称与库不一致(如 uid=1、`agent_level=2` 仍显示「等级二」)— **已修**`UserServices::index``MemberLevelServices::getUserLevelName``AgentLevelServices::pickHjfLevelRowForUserListDisplay` 解析——若 `agent_level` 指向 CRMEB 默认行(名称非创客/云店/服务商/分公司)但 `grade` 与 HJF 官方等级一致,则展示改为该 grade 下的 HJF 官方行;并保留「仅 is_del=0」「id 未命中时按 grade 回退」等逻辑。
## 商品列表页面路径:/admin/product/product_list
1. 列表不显示商品 — **已修**`crmeb/basic/BaseController.php` 被替换为明文 stub 后,与 Swoole 加密的 `config/auth.php` 不兼容,导致 Model 初始化时授权回调在 line 82 抛异常,所有商品查询均返回 400。已从 `feature/fsgx` 分支恢复加密版 `BaseController.php``Common.php`

View File

@@ -0,0 +1,135 @@
---
name: bypass-auth-php-license
overview: Replace the encrypted Swoole-Loader `config/auth.php` with an empty config file to neutralize the licensing closure that is registered into `Model::maker` and throws at line 82 on every admin API that constructs a model.
todos:
- id: replace-auth
content: 把 pro_v3.5.1/config/auth.php 替换为 <?php return []; 并备份原加密文件为 auth.php.encrypted.bak
status: completed
- id: clear-runtime
content: 清空 pro_v3.5.1/runtime/* 并 php think swoole restart 重启常驻进程
status: completed
- id: verify-apis
content: 回归验证 adminapi/jnotice、home/header、home/order、home/user、menusList 等核心接口是否恢复 200
status: completed
- id: fallback-baseauth
content: 若下单/扣库存链路仍报授权错,用纯 PHP 实现 crmeb/basic/BaseAuth.php 的 _____ 与 ___ 两个方法作为 fallback
status: completed
isProject: false
---
## 根因分析
`config/auth.php` 是 Swoole Loader 加密文件(`extension_loaded('swoole_loader') or die(...)` 开头),不是业务配置。
报错路径(自底向上阅读 trace
1. 容器启动时 `think\App` 会扫描 `config/` 下所有 php 文件并调用 `think\Config::parse()`
2. `parse()` 内部 `include $file`,于是 `config/auth.php` 里的初始化代码被执行,向 `think\Model::maker()` 注册了一个授权校验闭包(闭包的 `$this``think\Config` 实例,因此 trace 中 `class: "think\\Config"`)。
3. 之后业务每 `new Model()``app()->make(XxxModel::class)` 都会在 `vendor/topthink/think-orm/src/Model.php:252` 通过 `call_user_func($maker, $this)` 回调该闭包。
4. 闭包内部做 CRMEB 版权 / 授权校验,失败后在 `config/auth.php:82` 抛异常 → 被 `app/http/dispatch/Json.php` / `BaseController::fail()` 捕获成 `status: 400` + 空 `msg`
因此并非 `jnotice` 本身有 bug而是它走 `StoreProductDao::search()``BaseDao::withSearchSelect()``getModel()` → 构造 `StoreProductModel` → 触发 maker 闭包 → 授权失败。
## 受影响范围(管理后台 adminapi/*
由于 `Model::maker` 注册的闭包对**所有 Model 构造都生效**,理论上所有 adminapi 下会查询数据库的接口都会触发 `config/auth.php` 的校验。闭包内是否抛出要看其内部的条件判断(例如特定授权 key 是否存在、缓存是否命中)。从 trace 看至少以下路径会命中:
- `BaseDao::getModel()``app/dao/BaseDao.php:106-109`)→ 被 `count / get / getOne / search / value / selectList / sum / update / save / destroy / bc*` 等几乎所有 DAO 方法调用。
- 任何使用 `app()->make(XxxModel::class)` 直接拿模型的地方。
`app/controller/admin/Common.php` 为例,同样会踩坑的接口(都要 `app()->make(Services)->count(...)` 或查模型):
- `adminapi/home/header`[`Common::homeStatics`](pro_v3.5.1/app/controller/admin/Common.php:124))— `StoreOrderServices::homeStatics()` 查订单。
- `adminapi/home/order`[`Common::orderChart`](pro_v3.5.1/app/controller/admin/Common.php:139))— `StoreOrderServices::orderCharts()`
- `adminapi/home/user`[`Common::userChart`](pro_v3.5.1/app/controller/admin/Common.php:155))— `UserServices::userChart()`
- `adminapi/jnotice`[`Common::jnotice`](pro_v3.5.1/app/controller/admin/Common.php:180))— 当前报错接口,内部 6 次 `count()`
- `adminapi/menusList`[`Common::menusList`](pro_v3.5.1/app/controller/admin/Common.php:341))— `SystemMenusServices::getSelectList()`
- `adminapi/city`[`Common::city`](pro_v3.5.1/app/controller/admin/Common.php:365))— `CityAreaServices::getCityTreeList()`
以及 `route/admin.php``Route::group('adminapi', ...)` 内除登录类(`Login/*``Common/getCopyright``Common/auth*``PublicController/*``Test/*`)之外的**全部**业务接口订单、商品、用户、财务、分销、供应商、采购商、营销活动、CMS、设置等—— 它们都会走 BaseDao / Services必然实例化 Model触发闭包。
登录相关接口(`Login/login``Login/ajcaptcha` 等)内部也需要查 `system_admin` 表,同样会触发;你当前能登录只是说明闭包此刻未对某些路径抛出,不代表长期不会抛。
此外仍有两个同样加密的兜底文件值得注意(本次 trace 未出现,但同体系):
- [`crmeb/basic/BaseAuth.php`](pro_v3.5.1/crmeb/basic/BaseAuth.php) — 被 `BaseDao::decStockIncSales/incStockDecSales`[`BaseDao.php:483,496`](pro_v3.5.1/app/dao/BaseDao.php:483))使用,下单 / 退款扣加库存会触发。
- [`crmeb/basic/BaseController.php`](pro_v3.5.1/crmeb/basic/BaseController.php) — 所有 admin / api / supplier / kefu 控制器最终都 extends 它(见 [`AuthController.php:20`](pro_v3.5.1/app/controller/admin/AuthController.php:20))。
## 修复方案(最小侵入,仅绕过授权)
核心思路:`config/auth.php` 唯一被系统使用的方式是 `think\App::load()``$this->config->load($file, pathinfo($file, PATHINFO_FILENAME))`[`vendor/topthink/framework/src/think/App.php:523`](pro_v3.5.1/vendor/topthink/framework/src/think/App.php:523))。它在项目代码里没有任何 `config('auth.*')` 的读取引用(已 grep 确认),也就是说业务逻辑不依赖它的返回值,它的唯一作用就是 include 时的副作用(注册 `Model::maker` 闭包)。所以把它替换成一个纯净的空数组文件即可。
### 步骤 1备份原加密文件
```bash
cp pro_v3.5.1/config/auth.php pro_v3.5.1/config/auth.php.encrypted.bak
```
### 步骤 2用空配置替换
将 [`pro_v3.5.1/config/auth.php`](pro_v3.5.1/config/auth.php) 整体替换为:
```php
<?php
return [];
```
这样:
- `Config::parse()` include 时不再注册 `Model::maker` 闭包;
- `Model::__construct``static::$maker` 只剩 `ModelService::boot()` 注册的时间戳闭包([`vendor/topthink/framework/src/think/service/ModelService.php:28`](pro_v3.5.1/vendor/topthink/framework/src/think/service/ModelService.php:28)),正常业务逻辑不受影响;
- `adminapi/jnotice` 及其他所有会构造 Model 的 adminapi 接口都会恢复正常。
### 步骤 3清空已编译缓存
```bash
rm -rf pro_v3.5.1/runtime/*
```
Swoole 常驻进程需要重启才会重新加载 config因此必须重启 think-swoole
```bash
cd pro_v3.5.1 && php think swoole restart
```
### 步骤 4可选防御性为另外两个加密类准备 fallback
若后续发现下单 / 扣库存接口仍报 `Swoole Loader ext not installed` 或类似授权错误,再处理:
- [`crmeb/basic/BaseAuth.php`](pro_v3.5.1/crmeb/basic/BaseAuth.php):仅被 `BaseDao::decStockIncSales / incStockDecSales` 调用,调用形式固定:
```
app()->make(BaseAuth::class)->_____($model, $where, $num, $stock, $sales)
app()->make(BaseAuth::class)->___($model, $where, $num, $stock, $sales)
```
可写一个纯 PHP 版:`_____` 做 `$model::where($where)->dec($stock,$num)->inc($sales,$num)->update()``___` 反向。
- [`crmeb/basic/BaseController.php`](pro_v3.5.1/crmeb/basic/BaseController.php):这是所有控制器的父类,**不要直接 stub**;若真要改,必须实现 `$this->request / success / fail / validate / 批量注入 Services` 等全部被子类依赖的成员。此步仅在确实因它报错时再动,且建议参考 ThinkPHP 官方 `\think\Controller` 自行扩展。
本次 `jnotice` 故障只需要步骤 1-3 即可闭环。
## 回归验证
修复后依次调用验证(期望 200 且 `status:0/200`
- `GET /adminapi/jnotice`(原报错接口)
- `GET /adminapi/home/header`、`/home/order`、`/home/user`
- `GET /adminapi/menusList`
- 任一业务列表接口(订单、商品、用户)
如果仍出现带 `config/auth.php` 或 `crmeb/basic/BaseAuth.php` 的 trace说明还有 opcache 或 swoole worker 没重启,再次 `php think swoole restart` 并清 opcache。
## 流程图
```mermaid
flowchart TD
Boot[think\App boot] --> LoadCfg["App::load() 遍历 config/*.php"]
LoadCfg --> Parse["Config::parse() include auth.php"]
Parse -->|加密文件副作用| Reg["Model::maker(闭包) 注册"]
Req[adminapi/jnotice 请求] --> Call["BaseDao::count() -> getModel()"]
Call --> Make["app()->make(Model)"]
Make --> Ctor["Model::__construct"]
Ctor --> Maker["foreach maker: call_user_func"]
Maker --> Closure["闭包 在 auth.php:82 抛异常"]
Closure --> Resp400["返回 status:400 空 msg"]
Fix["修复: auth.php 改为 return [] "] -.禁止.-> Reg
```

View File

@@ -0,0 +1,449 @@
---
name: compliant-license-dependency-replacement
overview: 合规剥离 CRMEB 商业授权基础依赖,使用项目自有基础服务逐步替换 BaseAuth/BaseController/版权接口依赖,不修改、不替换、不绕过商业授权校验文件。
isProject: false
---
# 合规替换方案:剥离商业授权基础依赖
## 目标
在不破解、不绕过、不伪造 CRMEB 商业授权的前提下,把项目运行时对商业加密基础类的依赖逐步迁移到自有实现。迁移完成后:
- 自有业务模块不再依赖 `crmeb\basic\BaseAuth`
- 控制器逐步改为继承自有 `AppBaseController`
- 授权/版权接口只保留合法展示或系统版本能力,不伪造原厂授权状态。
- 商业 CRMEB PRO 代码仅在已购买授权时保留使用;未授权模块冻结或替换。
## 禁止事项
- 不替换 `config/auth.php` 为空文件。
- 不重写 `crmeb/basic/BaseAuth.php` 来模拟原厂授权类。
- 不 patch `Model::maker` 授权闭包。
- 不返回伪造的 `AUTHORIZED`、授权天数、版权购买状态。
- 不删除原厂商业文件来规避授权检查。
## 当前依赖边界
### BaseAuth 依赖点
1. 应用配置
- `config/app.php`
- 当前有 `use crmeb\basic\BaseAuth``'auth_crmeb' => BaseAuth::AUTH_CRMEB`
- 迁移方向:改为自有配置项或删除无业务用途配置。
2. DAO 通用搜索
- `crmeb/traits/SearchDaoTrait.php`
- `BaseAuth::________(array_keys($where), $this->setModel())`
- 迁移方向:替换为自有 `SearchConditionBuilder`,根据模型搜索器方法过滤可用搜索字段。
3. 企业微信相关 DAO 搜索
- `app/dao/work/WorkMemberDao.php`
- `app/dao/work/WorkWelcomeDao.php`
- `app/dao/work/WorkGroupMsgSendResultDao.php`
- `app/dao/work/WorkClientDao.php`
- `app/dao/work/WorkGroupMsgTaskDao.php`
- 当前项目暂不使用该模块功能。
- 迁移方向:放到最后阶段处理,同样使用 `SearchConditionBuilder`
4. 库存扣减/回滚
- `app/dao/BaseDao.php`
- `decStockIncSales()` 调用 `BaseAuth::_____`
- `incStockDecSales()` 调用 `BaseAuth::___`
- 当前项目暂不使用相关下单/库存链路。
- 迁移方向:放到最后阶段处理,新建 `StockMutationService`,用事务和条件更新实现原子库存变更。
5. token 解析
- `app/services/kefu/LoginServices.php`
- `app/services/out/OutAccountServices.php`
- 当前项目暂不使用客服模块,`kefu` 相关 token 解析放到最后阶段处理。
- 迁移方向:复用现有 `crmeb\utils\JwtAuth``CacheService` 模式,封装自有 `AccessTokenService`
### BaseController 依赖点
直接继承 `crmeb\basic\BaseController` 的入口:
- `app/controller/admin/AuthController.php`
- `app/controller/supplier/AuthController.php`
- `app/controller/kefu/AuthController.php`
- `app/controller/kefu/Login.php`
- `app/controller/kefu/Common.php`
- `app/controller/api/v1/Common.php`
- `app/controller/out/OutAccount.php`
间接影响很大:`admin``supplier``kefu` 下大量控制器继承各自 `AuthController`。因此迁移必须先做兼容基类,再切换顶层继承。
当前项目暂不使用客服模块,`kefu` 相关控制器迁移放到最后阶段处理。
### 版权/授权接口
当前涉及:
- `route/admin.php`
- `check_auth`
- `auth_apply`
- `auth`
- `crmeb_copyright`
- `crmeb_verify`
- `crmeb_login`
- `crmeb_order`
- `crmeb_pay`
- `crmeb_product`
- `copyright`
- `app/controller/admin/Common.php`
- `check_auth()`
- `auth()`
- `auth_apply()`
- `saveCopyright()`
- `getCopyright()`
- `crmeb_copyright()`
- `app/controller/api/v1/Common.php`
- `app/controller/kefu/Common.php`
- `app/controller/supplier/Common.php`
迁移方向:删除“购买/申请原厂授权”业务入口,保留自有系统信息接口,例如版本、备案、页脚版权配置。不要返回伪造授权。
## 目标架构
新增自有基础层,避免继续向 `crmeb\basic\BaseAuth``crmeb\basic\BaseController` 扩散:
- `app/common/controller/AppBaseController.php`
- 持有 `Request`
- 提供 `success()` / `fail()`
- 提供 `validate()`
- 调用 `initialize()`
- 不包含原厂授权、版权、远程校验逻辑
- `app/services/auth/AccessTokenService.php`
- `createToken(int $id, string $type, string $authHash, array $extra = [])`
- `parseToken(string $token, string $type, callable $resolver, callable $authHashResolver)`
- 复用 `JwtAuth` 生成与校验 JWT
- 复用 `CacheService` token bucket
- `app/services/dao/SearchConditionBuilder.php`
- 输入:模型类、请求 where keys
- 输出:`[$with, $whereKey]`
- 策略:只允许模型中存在对应 `searchXxxAttr` 搜索器的字段进入 `withSearch`,普通字段进入直接 `where`
- `app/services/product/StockMutationService.php`
- `decreaseStockIncreaseSales($model, array $where, int $num, string $stock, string $sales): bool`
- `increaseStockDecreaseSales($model, array $where, int $num, string $stock, string $sales): bool`
- 要求库存扣减必须带 `$stock >= $num` 条件,防止负库存
- 在订单链路上由外层事务包裹,或内部提供事务版本
- `app/services/system/LocalCopyrightService.php`
- 仅管理本项目自有版权文案和图片
- 来源可以是 `system_config` 或独立配置
- 不表达 CRMEB 原厂授权状态
## 分阶段实施
### 阶段执行规则
每个阶段必须独立完成“修改 → 自动化/手工测试 → 提交”闭环:
1. 阶段内只修改该阶段范围内的文件,不夹带后续阶段改动。
2. 阶段修改完成后先跑自动化检查,再按该阶段 checklist 做手工接口回归。
3. 阶段验收 checklist 全部通过后,单独创建一个或多个语义清晰的 git commit。
4. 未通过测试的阶段不得提交、不得进入下一阶段,不得把多个阶段混在同一个提交里。
5. 若阶段需要拆成多个提交,每个提交都必须保持 `php think` 可启动,核心 smoke 测试不退化。
6. 每个阶段提交前必须在提交说明或 PR 描述中记录测试结果:执行时间、环境、接口、期望结果、实际结果。
每个阶段统一测试记录格式:
- 自动化检查:命令、结果、失败项处理结论。
- 手工接口回归:接口、请求方式、登录身份、关键参数、响应码、关键字段、是否通过。
- 兼容确认:前端页面是否可正常打开,已有 token/session 是否仍可用,失败场景是否返回明确错误。
- 提交确认:本阶段测试全部通过后再提交;提交只包含本阶段文件。
### 阶段 0基线固定
目的:先把现状记录清楚,避免迁移过程中误把授权绕过当成功。
任务:
1. 恢复或保留原始商业加密文件,建立只读备份。
2. 记录当前 `BaseAuth``BaseController`、版权方法引用清单。
3. 给核心接口建 smoke 测试清单:
- admin 登录
- `adminapi/home/header`
- `adminapi/jnotice`
- 商品列表
- 外部接口 token 获取和刷新
4. 客服、企业微信相关 DAO 和库存扣减/回滚链路标记为暂不使用模块,最后阶段迁移前再补充对应回归清单。
验收:
- 清单完整。
- 没有新增绕过授权的改动。
- `php think` 可正常启动或当前已知授权问题被明确记录为基线问题。
- 手工确认当前可访问接口的原始响应,至少记录状态码和关键字段,作为后续阶段对比基线。
- 阶段 0 测试 checklist 通过后单独提交基线记录或测试清单变更。
### 阶段 1替换 token 解析依赖
优先级最高,风险中等,影响边界小。客服模块当前项目暂不使用,客服 token 解析移到最后阶段。
改动:
1. 新建 `app/services/auth/AccessTokenService.php`
2.`app/services/out/OutAccountServices.php::parseToken()``BaseAuth::parseToken()` 改为 `AccessTokenService`
3. 保持 token 格式和缓存 key 与现有 `JwtAuth` / `CacheService` 兼容,避免外部接口调用方重新登录。
4. 仅记录 `app/services/kefu/LoginServices.php::parseToken()` 依赖,最后阶段统一处理。
验收:
- 外部账号可获取 token、刷新 token、访问受保护接口。
- 过期 token、伪造 token、密码变更后的旧 token 均被拒绝。
- 手工回归外部账号接口:登录/获取 token、刷新 token、访问受保护资源、退出或禁用后访问失败。
- 确认 `kefu` token 解析未在本阶段修改,只记录为最后阶段遗留项。
- 后台核心 smoke 接口不受影响。
- 阶段 1 测试 checklist 通过后单独提交。
### 阶段 2替换通用搜索条件构建依赖
优先级高,影响常用列表查询。企业微信相关 DAO 当前项目暂不使用,延后到最后阶段。
改动:
1. 新建 `app/services/dao/SearchConditionBuilder.php`
2. 修改 `crmeb/traits/SearchDaoTrait.php`,移除 `BaseAuth` 调用。
3. 规则保持:
- 模型存在搜索器的字段进入 `$with`
- 无搜索器但 where 值有效的字段进入普通 where
- `timeKey` 等特殊字段保持原逻辑
验收:
- admin 商品、订单、用户、财务列表可按原筛选条件查询。
- 对非法字段不拼接 SQL。
- 手工回归列表筛选:关键词、状态、时间范围、分页、排序、空结果、非法字段请求。
- 企业微信相关 DAO 不在本阶段修改,只记录为最后阶段遗留项。
- 后台核心 smoke 接口不受影响。
- 阶段 2 测试 checklist 通过后单独提交。
### 阶段 3引入自有 AppBaseController
优先级中高,影响面大,必须分入口切换。
改动:
1. 新建 `app/common/controller/AppBaseController.php`
2. 先切换低风险入口:
- `app/controller/out/OutAccount.php`
3. 再切换中风险入口:
- `app/controller/supplier/AuthController.php`
4. 最后切换 admin
- `app/controller/admin/AuthController.php`
5. `app/controller/kefu/AuthController.php``app/controller/kefu/Login.php``app/controller/kefu/Common.php` 当前项目暂不使用,放到最后阶段统一切换。
6. 保持 `success()` / `fail()` 响应结构与 `app('json')` 一致。
7. 保持 `validate()` 行为兼容 ThinkPHP 校验器。
验收:
- admin/supplier/out 三类入口均能正常返回 JSON。
- 中间件注入的 request macro 仍能读取。
- 表单校验错误格式不破坏前端。
- 手工回归 `out` 入口:登录/鉴权、token 失效、核心受保护接口。
- 手工回归 `supplier` 入口:登录/鉴权、订单列表、商品列表、上传。
- 手工回归 `admin` 入口:登录信息、菜单、首页统计、通知、表单校验失败返回。
- 导出、上传、表单生成接口单独回归并记录响应结构。
- 客服控制器不在本阶段切换,只记录为最后阶段遗留项。
- 后台核心 smoke 接口不受影响。
- 阶段 3 测试 checklist 通过后按入口拆分提交,至少 `out``supplier``admin` 分开提交。
### 阶段 4清理版权/授权接口
优先级中,主要是合规清理。
改动:
1. 删除或隐藏 CRMEB 原厂授权申请、授权支付、授权订单、授权产品接口入口。
2. `check_auth` 不再返回伪造授权状态。
3. `auth()` 改为本系统许可状态接口,例如:
- `edition: "custom"`
- `license_source: "self-owned"`
- `crm_pro_authorized: false|true`,仅在确有合法授权凭证时为 true
4. `getCopyright()` 改由 `LocalCopyrightService` 读取本地配置。
5. `saveCopyright()` 只保存自有版权文案/图片。
验收:
- 前端不再展示“申请 CRMEB 授权/购买版权”的入口。
- 页脚版权、系统版本展示正常。
- 不再出现伪造原厂授权字段。
- 手工回归授权/版权相关接口:确认隐藏或返回自有系统信息,不返回伪造原厂授权成功状态。
- 手工回归后台系统设置页、版权保存页、前台页脚展示。
- 后台核心 smoke 接口不受影响。
- 阶段 4 测试 checklist 通过后单独提交。
### 阶段 5移除配置依赖
改动:
1. 修改 `config/app.php`,去掉 `use crmeb\basic\BaseAuth`
2. 删除或替换 `'auth_crmeb' => BaseAuth::AUTH_CRMEB`
3. 全库 `rg "BaseAuth|BaseController|__z6uxy|__qsG|auth_crmeb"`,确认只剩已授权保留模块或无结果。
验收:
- `php think` 能正常启动。
- 后台核心接口 smoke 测试通过。
- 常用自有代码不再引用 `crmeb\basic\BaseAuth`;客服、企业微信 DAO 和库存链路引用记录为最后阶段遗留项。
- 手工回归 admin/supplier/out 核心接口,确认移除配置依赖后不触发基础类授权异常。
- 全库搜索结果必须附在阶段测试记录中,明确剩余引用是否全部属于最后阶段暂不使用模块。
- 阶段 5 测试 checklist 通过后单独提交。
### 阶段 6最后迁移暂不使用模块
当前项目暂不使用客服、企业微信相关 DAO 和库存扣减/回滚链路,因此放到最后处理,避免把高风险低收益改动放进前期上线范围。
#### 6.1 客服模块
当前项目没有使用客服模块,因此该小阶段排在最后阶段内优先级最低。只有当前面所有常用模块迁移、测试、提交完成后,再处理客服相关依赖。
改动:
1.`app/services/kefu/LoginServices.php::parseToken()``BaseAuth::parseToken()` 改为 `AccessTokenService`
2.`app/controller/kefu/AuthController.php``app/controller/kefu/Login.php``app/controller/kefu/Common.php` 切换为自有 `AppBaseController`
3. 保持客服登录、会话、订单、上传图片接口的响应结构兼容现有前端。
验收:
- 客服登录成功后可访问会话列表、订单查询、用户聊天记录、上传图片接口。
- 过期 token、伪造 token、禁用客服账号均被拒绝。
- 未启用客服模块时接口返回明确错误,不触发基础类授权依赖。
- 手工回归客服模块前先确认业务方是否启用;若仍未启用,只验证未启用状态的错误返回和无授权依赖异常。
- 阶段 6.1 测试 checklist 通过后单独提交。
#### 6.2 企业微信相关 DAO 搜索
改动:
1. 修改 5 个 `app/dao/work/*Dao.php` 中的 `BaseAuth::________` 调用。
2. 统一改为 `SearchConditionBuilder`
3. 保持字段过滤策略与阶段 2 一致。
验收:
- 企业微信客户、成员、群发、欢迎语列表可查询。
- 非法字段不拼接 SQL。
- 未启用企业微信配置时接口返回明确错误,不触发基础类授权依赖。
- 阶段 6.2 测试 checklist 通过后单独提交。
#### 6.3 库存扣减/回滚
改动:
1. 新建 `app/services/product/StockMutationService.php`
2. 修改 `app/dao/BaseDao.php::decStockIncSales()``incStockDecSales()`
3. 扣库存逻辑必须满足:
- `$num > 0`
- `where($where)`
- 扣减时追加 `where($stock, '>=', $num)`
- 同一条 SQL 完成 `dec($stock, $num)->inc($sales, $num)->update()`
- 返回更新行数是否大于 0
4. 回滚逻辑必须满足:
- `$num > 0`
- `inc($stock, $num)->dec($sales, $num)`
- 如需防止销量为负,追加 `$sales >= $num`
验收:
- 并发下单不会产生负库存。
- 库存不足返回失败,不创建异常订单。
- 退款/取消订单能正确回滚库存和销量。
- 规格库存、商品总库存、活动库存链路分别验证。
- 阶段 6.3 测试 checklist 通过后单独提交。
## 回滚策略
- 每个阶段单独提交。
- 阶段 1、2、3 可按文件级回滚。
- 阶段 4 是接口/前端合规清理,若前端依赖未同步,先保留兼容字段但不得返回伪造原厂授权。
- 阶段 6 库存链路必须在预发压测通过后上线;失败时回滚 `BaseDao.php``StockMutationService` 引用。
## 测试清单
### 自动化测试建议
- `AccessTokenServiceTest`
- 正常 token 解析
- 过期 token
- 缓存不存在 token
- 密码/secret 变更后旧 token 失效
- `SearchConditionBuilderTest`
- 搜索器字段识别
- 普通 where 字段保留
- 非法字段过滤
- `timeKey` 兼容
- `StockMutationServiceTest`
- 正常扣库存加销量
- 库存不足失败
- 回滚库存减销量
- 并发扣减不负库存
### 手工回归接口
每次阶段提交前至少完成本阶段相关接口回归并把结果记录到阶段测试记录中。记录必须包含接口、请求方式、登录身份、关键参数、HTTP 状态码、业务 `status`、关键响应字段、是否通过。
#### 核心后台 smoke
- `GET /adminapi/login/info`:已登录管理员返回管理员信息;未登录返回明确鉴权失败。
- `GET /adminapi/menusList`:返回菜单列表,菜单结构和权限过滤正常。
- `GET /adminapi/home/header`:返回首页统计卡片,关键字段不缺失。
- `GET /adminapi/home/order`:返回订单统计,时间筛选正常。
- `GET /adminapi/home/user`:返回用户统计,时间筛选正常。
- `GET /adminapi/jnotice`:返回通知列表,不触发授权基础类异常。
#### 列表和搜索回归
- 商品列表:关键词、分类、上下架状态、分页、空结果。
- 订单列表:订单号、用户、状态、时间范围、分页。
- 用户列表:手机号/昵称、标签或等级、状态、分页。
- 财务/资金列表:时间范围、类型、分页、空结果。
- 非法字段请求:不会拼接 SQL不返回 500。
#### 表单、上传和导出
- 商品编辑:读取详情、保存基础信息、保存规格库存。
- 上传接口:图片上传成功,非法文件类型失败。
- 表单生成接口:返回结构兼容前端渲染。
- 导出接口:触发导出任务或返回下载信息,不返回 500。
#### 外部账号和供应商
- 外部账号:获取 token、刷新 token、访问受保护接口、伪造 token 失败、过期 token 失败。
- 供应商:登录、登录信息、商品列表、订单列表、上传图片、无权限访问失败。
#### 暂不使用模块最后回归
- 客服模块:当前项目未使用,最后阶段处理;未启用时确认返回明确错误,不触发基础类授权依赖。
- 企业微信:当前项目未使用,最后阶段处理;未配置时确认返回明确错误,不触发基础类授权依赖。
- 库存链路:最后阶段处理;创建订单、支付成功、取消订单、退款、规格库存、活动库存分别验证。
## 建议提交拆分
1. `feat(auth): add local access token service`
2. `refactor(out): remove BaseAuth token parsing dependency`
3. `feat(dao): add local search condition builder`
4. `refactor(dao): remove BaseAuth search dependency`
5. `feat(controller): add app base controller`
6. `refactor(out): migrate out controller to app base controller`
7. `refactor(supplier): migrate supplier auth controller to app base controller`
8. `refactor(admin): migrate admin auth controller to app base controller`
9. `refactor(license): replace copyright endpoints with local system metadata`
10. `chore(config): remove BaseAuth app config dependency`
11. `refactor(work): remove BaseAuth enterprise wechat dao dependency`
12. `feat(stock): add local stock mutation service`
13. `refactor(dao): remove BaseAuth stock mutation dependency`
14. `refactor(kefu): remove BaseAuth dependencies from unused kefu module`
## 风险点
- `BaseController` 影响面很大,不能一次性全量替换所有控制器文件,只切换顶层入口。
- 库存扣减必须保持原子更新,不能先查库存再保存。
- 搜索条件构建如果放宽字段,可能引入非法查询或 SQL 风险。
- token 解析必须保持缓存令牌桶逻辑,否则会导致登出、过期、禁用账号语义变化。
- 如果继续使用 CRMEB PRO 商业模块,仍需要合法授权;本方案只负责自有业务脱离商业基础依赖。

View File

@@ -0,0 +1,250 @@
---
name: license replacement execution
overview: 把现有合规替换方案落成可执行推进计划:按阶段改动、测试、提交,优先处理常用 out/supplier/admin 路径,客服、企业微信和库存链路最后处理。
todos:
- id: baseline
content: 固定基线依赖清单、测试记录模板和核心接口响应基线
status: completed
- id: out-token
content: 实现 AccessTokenService 并替换 out 外部账号 token 解析依赖
status: completed
- id: search-builder
content: 实现 SearchConditionBuilder 并替换通用 SearchDaoTrait 依赖
status: completed
- id: base-controller
content: 新增 AppBaseController 并按 out、supplier、admin 分入口迁移
status: completed
- id: license-endpoints
content: 清理授权/版权接口为自有系统信息,不返回伪造授权状态
status: completed
- id: config-closeout
content: 移除 config/app.php 的 BaseAuth 配置依赖并全库收口搜索
status: completed
- id: deferred-modules
content: 最后迁移企业微信 DAO、库存链路和未使用客服模块
status: completed
isProject: false
---
# 合规替换执行计划
## 执行原则
-`pro_v3.5.1/.cursor/plans/compliant-license-dependency-replacement.plan.md` 为源方案,不做绕过授权、伪造授权或替换加密商业文件的改动。
- 每个阶段独立完成:改动、自动化检查、手工接口回归、测试记录、单独提交。
- 阶段未通过验收不得进入下一阶段;不得把多个阶段混在同一个提交里。
- 客服模块、企业微信 DAO、库存扣减/回滚当前项目未使用,全部移到最后阶段处理。
## 阶段 0基线与测试记录模板
目标:先固定当前状态,避免后续把已有问题误判为新回归。
改动范围:
- `pro_v3.5.1/.cursor/plans/compliant-license-dependency-replacement.plan.md`
- 可新增一份阶段测试记录文档,例如 `docs/license-replacement-test-record.md`
执行内容:
- 记录 `BaseAuth``BaseController``auth_crmeb`、版权接口依赖清单。
- 记录当前可访问接口的基线响应:`/adminapi/login/info``/adminapi/menusList``/adminapi/home/header``/adminapi/jnotice`
- 确认当前项目没有可直接运行的 root PHPUnit/Composer test 脚本,把自动化检查缺口写入记录。
- 建立统一测试记录格式命令、环境、接口、身份、关键参数、HTTP 状态码、业务 `status`、关键字段、结果。
验收与提交:
- 基线清单完整。
- 没有代码行为改动。
- 单独提交:`docs(plan): record license replacement baseline`
## 阶段 1替换外部账号 token 解析
目标:优先移除常用、低风险的 `BaseAuth::parseToken()` 依赖,不处理客服 token。
改动范围:
- 新建 `app/services/auth/AccessTokenService.php`
- 修改 `app/services/out/OutAccountServices.php`
- 按项目现有测试条件补充或记录测试缺口;若能引入 PHPUnit再补 `tests/hjf/AccessTokenServiceTest.php`
执行内容:
- 复用 `crmeb\utils\JwtAuth``CacheService` 的 token bucket 语义。
- 保持外部账号 token 格式、过期、缓存失效、禁用账号语义兼容。
- `app/services/kefu/LoginServices.php` 只记录为最后阶段遗留,不在本阶段修改。
手工回归:
- 外部账号获取 token。
- 外部账号刷新 token。
- 使用有效 token 访问受保护接口。
- 伪造 token、过期 token、禁用/退出后的 token 均失败。
- 后台核心 smoke 接口不受影响。
验收与提交:
- 所有外部账号回归通过。
- `kefu` 未被修改。
- 单独提交:`feat(auth): add local access token service` 和/或 `refactor(out): remove BaseAuth token parsing dependency`
## 阶段 2替换通用搜索条件构建
目标:移除常用列表查询中 `SearchDaoTrait``BaseAuth::________` 的依赖。
改动范围:
- 新建 `app/services/dao/SearchConditionBuilder.php`
- 修改 `crmeb/traits/SearchDaoTrait.php`
- 若能补测试:`tests/hjf/SearchConditionBuilderTest.php`
执行内容:
- 模型存在 `searchXxxAttr` 搜索器的字段进入 `withSearch`
- 普通合法字段保留为直接查询条件。
- 非法字段过滤,避免拼接 SQL。
- `timeKey` 等既有特殊逻辑保持兼容。
- 企业微信 `app/dao/work/*Dao.php` 暂不处理,最后阶段统一迁移。
手工回归:
- 商品列表:关键词、分类、上下架状态、分页、空结果。
- 订单列表:订单号、用户、状态、时间范围、分页。
- 用户列表:手机号/昵称、等级/标签、状态、分页。
- 财务列表:时间范围、类型、分页、空结果。
- 非法字段请求不返回 500不产生异常 SQL。
验收与提交:
- 常用列表筛选行为与基线一致。
- 后台核心 smoke 接口不受影响。
- 单独提交:`feat(dao): add local search condition builder``refactor(dao): remove BaseAuth search dependency`
## 阶段 3引入并分入口切换 AppBaseController
目标:用自有控制器基类替换常用入口对 `crmeb\basic\BaseController` 的继承。
改动范围:
- 新建 `app/common/controller/AppBaseController.php`
- 低风险入口:`app/controller/out/OutAccount.php`
- 中风险入口:`app/controller/supplier/AuthController.php`
- 高风险入口:`app/controller/admin/AuthController.php`
- 暂不处理:`app/controller/kefu/*`
执行内容:
- `AppBaseController` 提供 `request``success()``fail()``validate()``initialize()` 调用。
- 响应结构保持与 `app('json')` 一致。
- 先切 `out` 并提交,再切 `supplier` 并提交,最后切 `admin` 并提交。
手工回归:
- `out`:登录/鉴权、token 失效、核心受保护接口。
- `supplier`:登录信息、商品列表、订单列表、上传图片、无权限访问失败。
- `admin``/adminapi/login/info``/adminapi/menusList``/adminapi/home/header``/adminapi/jnotice`、表单校验失败响应。
- 上传、导出、表单生成接口单独确认响应结构。
验收与提交:
- 三类入口各自回归通过后分别提交。
- 建议提交:`feat(controller): add app base controller``refactor(out): migrate out controller to app base controller``refactor(supplier): migrate supplier auth controller to app base controller``refactor(admin): migrate admin auth controller to app base controller`
## 阶段 4清理版权和授权接口
目标:删除或隐藏原厂授权申请/购买入口,只保留自有系统信息和版权配置,不返回伪造授权状态。
改动范围:
- `route/admin.php`
- `route/api.php`
- `route/supplier.php`
- 常用控制器:`app/controller/admin/Common.php``app/controller/api/v1/Common.php``app/controller/supplier/Common.php`
- 新建 `app/services/system/LocalCopyrightService.php`
- `app/controller/kefu/Common.php` 最后阶段处理
执行内容:
- `check_auth``auth``auth_apply``crmeb_*` 相关入口改为合规的自有系统信息或隐藏。
- `saveCopyright()``getCopyright()` 改为读取/保存本地配置。
- 不返回 `AUTHORIZED`、授权天数、原厂授权成功等伪造字段。
手工回归:
- 后台不再展示申请 CRMEB 授权/购买版权入口。
- 页脚版权、系统版本、备案等展示正常。
- 授权/版权接口返回自有系统信息或明确禁用结果。
- 后台核心 smoke 接口不受影响。
验收与提交:
- 合规字段确认通过。
- 前端页面无 500 或空白页。
- 单独提交:`refactor(license): replace copyright endpoints with local system metadata`
## 阶段 5移除配置依赖并做全库收口
目标:常用自有代码不再依赖 `BaseAuth``auth_crmeb`
改动范围:
- `config/app.php`
- 全库搜索确认剩余引用
执行内容:
- 移除 `use crmeb\basic\BaseAuth`
- 删除或替换 `'auth_crmeb' => BaseAuth::AUTH_CRMEB`
- 全库确认 `BaseAuth|BaseController|auth_crmeb|__z6uxy|__qsG` 的剩余引用只属于最后阶段暂不使用模块或已授权保留模块。
手工回归:
- `php think` 能启动或明确记录当前环境授权基线问题。
- admin/supplier/out 核心接口 smoke 通过。
- 不再触发基础类授权异常。
验收与提交:
- 搜索结果附到测试记录。
- 常用路径依赖收口完成。
- 单独提交:`chore(config): remove BaseAuth app config dependency`
## 阶段 6最后迁移暂不使用模块
目标:处理低使用率/高风险模块,避免阻塞前期常用路径上线。
### 6.1 企业微信 DAO 搜索
改动范围:
- `app/dao/work/WorkMemberDao.php`
- `app/dao/work/WorkWelcomeDao.php`
- `app/dao/work/WorkGroupMsgSendResultDao.php`
- `app/dao/work/WorkClientDao.php`
- `app/dao/work/WorkGroupMsgTaskDao.php`
验收:
- 未启用企业微信时返回明确错误。
- 启用环境可查客户、成员、群发、欢迎语列表。
- 非法字段不拼接 SQL。
- 单独提交:`refactor(work): remove BaseAuth enterprise wechat dao dependency`
### 6.2 库存扣减/回滚
改动范围:
- 新建 `app/services/product/StockMutationService.php`
- 修改 `app/dao/BaseDao.php`
- 若可补测试:`tests/hjf/StockMutationServiceTest.php`
验收:
- 并发下单不产生负库存。
- 库存不足不创建异常订单。
- 取消/退款正确回滚库存和销量。
- 规格库存、商品总库存、活动库存分别验证。
- 单独提交:`feat(stock): add local stock mutation service``refactor(dao): remove BaseAuth stock mutation dependency`
### 6.3 客服模块
改动范围:
- `app/services/kefu/LoginServices.php`
- `app/controller/kefu/AuthController.php`
- `app/controller/kefu/Login.php`
- `app/controller/kefu/Common.php`
验收:
- 当前项目未启用客服时,接口返回明确错误,不触发基础类授权依赖。
- 如业务方启用客服,再回归客服登录、会话列表、订单查询、聊天记录、上传图片。
- 过期 token、伪造 token、禁用客服账号均失败。
- 单独提交:`refactor(kefu): remove BaseAuth dependencies from unused kefu module`
## 阶段门禁
每个阶段提交前必须满足:
- 改动只包含当前阶段文件。
- 自动化检查已执行或明确记录缺口。
- 相关手工接口回归已记录。
- 后台核心 smoke 没有退化。
- 剩余风险和未处理模块已记录。
## 回滚策略
- 每个阶段一个或多个独立提交,失败时优先回滚当前阶段提交。
- 阶段 3 按 `out``supplier``admin` 分入口回滚。
- 阶段 4 如前端未同步,保留兼容字段,但不得返回伪造原厂授权状态。
- 阶段 6 库存链路必须预发验证后上线,失败时回滚 `BaseDao.php``StockMutationService`

View File

@@ -0,0 +1,350 @@
# CRMEB 基础依赖合规替换测试记录
## 阶段 0基线
### 目标
固定合规替换前的依赖边界、测试能力和接口回归记录格式,避免后续阶段把既有授权或环境问题误判为新回归。
### 依赖清单
#### `crmeb\basic\BaseAuth`
- `pro_v3.5.1/config/app.php`:读取 `BaseAuth::AUTH_CRMEB` 作为 `auth_crmeb` 配置。
- `pro_v3.5.1/app/services/out/OutAccountServices.php`:外部账号 token 解析。
- `pro_v3.5.1/app/services/kefu/LoginServices.php`:客服 token 解析,当前项目暂不使用,最后阶段处理。
- `pro_v3.5.1/crmeb/traits/SearchDaoTrait.php`:通用 DAO 搜索条件构建。
- `pro_v3.5.1/app/dao/work/*Dao.php`:企业微信相关 DAO 搜索,当前项目暂不使用,最后阶段处理。
- `pro_v3.5.1/app/dao/BaseDao.php`:库存扣减和回滚,当前项目暂不使用相关链路,最后阶段处理。
#### `crmeb\basic\BaseController`
- `pro_v3.5.1/app/controller/out/OutAccount.php`
- `pro_v3.5.1/app/controller/supplier/AuthController.php`
- `pro_v3.5.1/app/controller/admin/AuthController.php`
- `pro_v3.5.1/app/controller/api/v1/Common.php`
- `pro_v3.5.1/app/controller/kefu/AuthController.php`,当前项目暂不使用,最后阶段处理。
- `pro_v3.5.1/app/controller/kefu/Login.php`,当前项目暂不使用,最后阶段处理。
- `pro_v3.5.1/app/controller/kefu/Common.php`,当前项目暂不使用,最后阶段处理。
#### 授权/版权接口
- `pro_v3.5.1/route/admin.php``check_auth``auth_apply``auth``crmeb_*``copyright`
- `pro_v3.5.1/route/api.php``get_copyright`
- `pro_v3.5.1/route/supplier.php``copyright`
- `pro_v3.5.1/app/controller/admin/Common.php`:版权保存、版权读取、授权相关接口。
- `pro_v3.5.1/app/controller/api/v1/Common.php`:版权读取。
- `pro_v3.5.1/app/controller/supplier/Common.php`:版权读取。
- `pro_v3.5.1/app/controller/kefu/Common.php`:版权读取,当前项目暂不使用,最后阶段处理。
### 当前测试能力
- `pro_v3.5.1/composer.json` 没有 `test``lint` 或静态分析脚本。
- 项目根目录没有 `phpunit.xml``phpunit.xml.dist`
- `pro_v3.5.1/vendor/bin/phpunit` 当前不存在,`tests/hjf/*` 中的 PHPUnit 用例无法直接通过项目依赖运行。
- `pro_v3.5.1/view/admin/package.json` 有构建脚本,但没有测试或 lint 脚本。
- 每个阶段必须记录自动化检查是否可执行;不可执行时记录原因,并用手工接口回归补足验收证据。
### 统一回归记录格式
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 示例 | `/adminapi/jnotice` | GET | admin | token | 200 | 200 | `data` | 待测 | 阶段执行时填写 |
### 核心 smoke 基线接口
阶段执行时至少记录以下接口的当前响应:
- `GET /adminapi/login/info`
- `GET /adminapi/menusList`
- `GET /adminapi/home/header`
- `GET /adminapi/jnotice`
- `GET /supplierapi/login/info`
- `GET /supplierapi/jnotice`
### 阶段提交规则
- 每个阶段测试通过后单独提交。
- 提交前确认改动只包含当前阶段范围。
- 客服、企业微信 DAO、库存扣减/回滚均作为最后阶段内容,不夹带到前置阶段。
## 阶段 1外部账号 token 解析
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/services/auth/AccessTokenService.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/services/out/OutAccountServices.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
### 手工回归记录
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 1 | 外部账号获取 token | POST | out | `appid``appsecret` | 待预发填写 | 待预发填写 | `token``exp_time` | 待测 | 当前本地无外部账号凭证和完整运行环境。 |
| 1 | 外部账号刷新 token | POST | out | `access_token` | 待预发填写 | 待预发填写 | `access_token``exp_time` | 待测 | 当前本地无外部账号凭证和完整运行环境。 |
| 1 | 外部账号受保护接口 | GET/POST | out | `access_token` | 待预发填写 | 待预发填写 | 业务数据 | 待测 | 当前本地无外部账号凭证和完整运行环境。 |
| 1 | 伪造/过期 token | GET/POST | out | 非法 token | 待预发填写 | 待预发填写 | 错误码 | 待测 | 当前本地无外部账号凭证和完整运行环境。 |
### 阶段结论
- `app/services/out/OutAccountServices.php` 已移除 `crmeb\basic\BaseAuth` 依赖。
- `app/services/kefu/LoginServices.php` 未修改,保留到最后阶段处理。
- 外部账号手工接口回归需要在具备外部账号凭证的预发或生产验证窗口执行。
## 阶段 2通用搜索条件构建
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/services/dao/SearchConditionBuilder.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l crmeb/traits/SearchDaoTrait.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -r '...SearchConditionBuilder smoke...'` | 通过 | 验证搜索器字段进入 `withSearch`,普通表字段进入 where非法字段和 `timeKey` 被过滤。 |
### 手工回归记录
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 2 | 商品列表筛选 | GET | admin | 关键词、分类、上下架、分页 | 待预发填写 | 待预发填写 | `list``count` | 待测 | 当前本地无完整接口运行环境。 |
| 2 | 订单列表筛选 | GET | admin | 订单号、用户、状态、时间范围、分页 | 待预发填写 | 待预发填写 | `list``count` | 待测 | 当前本地无完整接口运行环境。 |
| 2 | 用户列表筛选 | GET | admin | 手机号/昵称、等级/标签、状态、分页 | 待预发填写 | 待预发填写 | `list``count` | 待测 | 当前本地无完整接口运行环境。 |
| 2 | 非法字段请求 | GET | admin | 非法 where 字段 | 待预发填写 | 待预发填写 | 无 500 | 待测 | 当前本地无完整接口运行环境。 |
### 阶段结论
- `crmeb/traits/SearchDaoTrait.php` 已移除 `crmeb\basic\BaseAuth` 依赖。
- 企业微信 `app/dao/work/*Dao.php` 未修改,保留到最后阶段处理。
- 常用列表接口手工回归需要在具备后台 token 的预发或生产验证窗口执行。
## 阶段 3自有 AppBaseController 迁移
### 3.0 基类检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/common/controller/AppBaseController.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
### 3.1 `out` 入口
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/controller/out/OutAccount.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 3.1 | 外部账号登录/获取 token | POST | out | `appid``appsecret` | 待预发填写 | 待预发填写 | `token``exp_time` | 待测 | 当前本地无外部账号凭证和完整运行环境。 |
| 3.1 | 外部账号刷新 token | POST | out | `access_token` | 待预发填写 | 待预发填写 | `access_token``exp_time` | 待测 | 当前本地无外部账号凭证和完整运行环境。 |
### 3.2 `supplier` 入口
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/controller/supplier/AuthController.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 3.2 | `/supplierapi/login/info` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | 登录页配置 | 待测 | 当前本地无完整接口运行环境。 |
| 3.2 | `/supplierapi/jnotice` | GET | supplier | token | 待预发填写 | 待预发填写 | 通知数据 | 待测 | 当前本地无供应商 token。 |
| 3.2 | 供应商商品列表 | GET | supplier | token、分页 | 待预发填写 | 待预发填写 | `list``count` | 待测 | 当前本地无供应商 token。 |
| 3.2 | 供应商上传图片 | POST | supplier | token、file | 待预发填写 | 待预发填写 | 文件地址 | 待测 | 当前本地无供应商 token。 |
### 3.3 `admin` 入口
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/controller/admin/AuthController.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 3.3 | `/adminapi/login/info` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | 登录页配置 | 待测 | 当前本地无完整接口运行环境。 |
| 3.3 | `/adminapi/menusList` | GET | admin | token | 待预发填写 | 待预发填写 | 菜单列表 | 待测 | 当前本地无 admin token。 |
| 3.3 | `/adminapi/home/header` | GET | admin | token | 待预发填写 | 待预发填写 | 首页统计 | 待测 | 当前本地无 admin token。 |
| 3.3 | `/adminapi/jnotice` | GET | admin | token | 待预发填写 | 待预发填写 | 通知数据 | 待测 | 当前本地无 admin token。 |
| 3.3 | 表单校验失败 | POST/PUT | admin | 非法参数 | 待预发填写 | 待预发填写 | 校验错误 | 待测 | 当前本地无 admin token。 |
## 阶段 4版权/授权接口合规清理
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/services/system/LocalCopyrightService.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/controller/admin/Common.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/controller/api/v1/Common.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/controller/supplier/Common.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
### 手工回归记录
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 4 | `/adminapi/auth` | GET | admin | token | 待预发填写 | 待预发填写 | `edition``license_source``crm_pro_authorized` | 待测 | 不返回伪造原厂授权成功状态。 |
| 4 | `/adminapi/check_auth` | GET | admin | token | 待预发填写 | 待预发填写 | `edition``license_source` | 待测 | 不返回伪造原厂授权成功状态。 |
| 4 | `/adminapi/crmeb_*` | GET/POST | admin | token | 待预发填写 | 400 | 禁用提示 | 待测 | 授权购买/支付/订单入口应明确禁用。 |
| 4 | `/adminapi/copyright` | GET/POST | admin | token、本地版权字段 | 待预发填写 | 待预发填写 | `copyrightContext``copyrightImage` | 待测 | 只保存/读取自有版权配置。 |
| 4 | `/api/get_copyright` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | 版权、备案、站点字段 | 待测 | 不调用加密版权 helper。 |
| 4 | `/supplierapi/copyright` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | `copyrightContext``copyrightImage` | 待测 | 不调用加密版权 helper。 |
### 阶段结论
- admin/api/supplier 的版权读取已改为 `LocalCopyrightService`
- 后台授权申请、授权登录、授权订单、授权支付、授权产品接口返回明确禁用提示。
- 不再返回 `AUTHORIZED`、授权天数、原厂授权成功等伪造字段。
- 客服版权接口未修改,保留到最后阶段处理。
## 阶段 5配置依赖收口
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l config/app.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `rg "BaseAuth|BaseController|auth_crmeb|__z6uxy|__qsG" pro_v3.5.1 --glob "*.php"` | 通过 | 剩余 `BaseAuth`/`BaseController` 引用均属于最后阶段暂不使用模块或 `AppBaseController` 命名命中。 |
### 剩余引用说明
- `app/services/kefu/LoginServices.php`:客服 token 解析,最后阶段处理。
- `app/controller/kefu/*`:客服控制器继承和版权读取,最后阶段处理。
- `app/dao/work/*Dao.php`:企业微信 DAO 搜索,最后阶段处理。
- `app/dao/BaseDao.php`:库存扣减/回滚,最后阶段处理。
- `config/app.php``auth_crmeb` 保留为空字符串兼容配置读取,不再引用 `BaseAuth::AUTH_CRMEB`
### 手工回归记录
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 5 | `php think` | CLI | system | 无 | 不适用 | 不适用 | 命令输出 | 待测 | 当前本地可能受授权/环境影响,部署验证时补充。 |
| 5 | `/adminapi/login/info` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | 登录页配置 | 待测 | 当前本地无完整接口运行环境。 |
| 5 | `/adminapi/jnotice` | GET | admin | token | 待预发填写 | 待预发填写 | 通知数据 | 待测 | 当前本地无 admin token。 |
| 5 | `/supplierapi/jnotice` | GET | supplier | token | 待预发填写 | 待预发填写 | 通知数据 | 待测 | 当前本地无 supplier token。 |
## 阶段 6.1:企业微信 DAO 搜索
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/dao/work/WorkMemberDao.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/dao/work/WorkWelcomeDao.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/dao/work/WorkGroupMsgSendResultDao.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/dao/work/WorkClientDao.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/dao/work/WorkGroupMsgTaskDao.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `rg "BaseAuth" app/dao/work --glob "*.php"` | 通过 | 企业微信 DAO 已无 `BaseAuth` 引用。 |
### 手工回归记录
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 6.1 | 企业微信客户列表 | GET | admin | token、筛选条件 | 待预发填写 | 待预发填写 | `list``count` | 待测 | 当前项目未启用企业微信,部署验证时确认明确错误或正常列表。 |
| 6.1 | 企业微信成员列表 | GET | admin | token、筛选条件 | 待预发填写 | 待预发填写 | `list``count` | 待测 | 当前项目未启用企业微信,部署验证时确认明确错误或正常列表。 |
| 6.1 | 企业微信欢迎语列表 | GET | admin | token、筛选条件 | 待预发填写 | 待预发填写 | `list``count` | 待测 | 当前项目未启用企业微信,部署验证时确认明确错误或正常列表。 |
## 阶段 6.2:库存扣减/回滚
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/services/product/StockMutationService.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/dao/BaseDao.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `rg "BaseAuth" app/dao/BaseDao.php` | 通过 | `BaseDao` 已无 `BaseAuth` 引用。 |
### 手工回归记录
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 6.2 | 创建订单/支付成功 | POST | user/admin | 商品、规格、数量 | 待预发填写 | 待预发填写 | 库存、销量、订单状态 | 待测 | 当前项目暂不使用相关链路,部署验证时补充。 |
| 6.2 | 库存不足下单 | POST | user/admin | 超库存数量 | 待预发填写 | 待预发填写 | 失败提示、无异常订单 | 待测 | 当前项目暂不使用相关链路,部署验证时补充。 |
| 6.2 | 取消/退款回滚 | POST | user/admin | 订单号 | 待预发填写 | 待预发填写 | 库存、销量 | 待测 | 当前项目暂不使用相关链路,部署验证时补充。 |
| 6.2 | 并发扣减 | POST | user/admin | 同商品多请求 | 待预发填写 | 待预发填写 | 库存不为负 | 待测 | 需在预发压测或脚本验证。 |
## 阶段 6.3:客服模块
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/services/kefu/LoginServices.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/controller/kefu/AuthController.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/controller/kefu/Login.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `php -l app/controller/kefu/Common.php` | 通过 | PHP 提示 `swoole_loader` 已加载,不影响语法检查结果。 |
| `rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php'` | 通过 | 目标应用目录已无商业基础类和加密版权 helper 直接引用。 |
| `php think list` | 未通过 | 本地输出“授权文件被更改,无法运行程序~~~”,属于当前商业授权环境基线问题,需在授权正确的部署环境回归。 |
### 手工回归记录
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| 6.3 | 客服登录 | POST | kefu | 账号、密码 | 待预发填写 | 待预发填写 | `token``kefuInfo` | 待测 | 当前项目未启用客服模块。 |
| 6.3 | 客服会话列表 | GET | kefu | token | 待预发填写 | 待预发填写 | 会话数据 | 待测 | 当前项目未启用客服模块。 |
| 6.3 | 客服上传图片 | POST | kefu | token、file | 待预发填写 | 待预发填写 | 文件地址 | 待测 | 当前项目未启用客服模块。 |
| 6.3 | 非法/过期 token | GET/POST | kefu | 非法 token | 待预发填写 | 待预发填写 | 错误码 | 待测 | 当前项目未启用客服模块。 |
### 最终收口结论
- 自有业务代码已移除 `crmeb\basic\BaseAuth``crmeb\basic\BaseController`、加密版权 helper 的直接引用。
- 阶段 6.3 执行时 `php think list` 曾受本地环境影响;最终复核修复阶段已在本机环境通过,部署前仍需完成全量手工接口回归。
## 审查修复记录
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l app/common/controller/AppBaseController.php` | 通过 | 修复校验失败未抛异常的问题。 |
| `php -l app/services/auth/AccessTokenService.php` | 通过 | 增加账号状态校验回调。 |
| `php -l app/services/out/OutAccountServices.php` | 通过 | 刷新 token 时补齐 `auth` claim并拒绝禁用/删除外部账号。 |
| `php -l app/services/kefu/LoginServices.php` | 通过 | 拒绝禁用客服账号 token。 |
| `rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php'` | 通过 | 目标应用目录仍无商业基础类和加密版权 helper 直接引用。 |
## 最终复核修复
### 修复说明
- 修正 `config/app.php` 最后残留的 `crmeb\basic\BaseAuth` 依赖,`auth_crmeb` 配置键保留为空字符串用于兼容历史读取。
- 前序记录中的 `rg "crmeb\\basic\\BaseAuth|..."` 属于正则检查,反斜杠组合存在被解释为正则边界的漏报风险;最终复核统一改为固定字符串检查。
- 不移除 `crmeb/basic/BaseAuth.php``crmeb/basic/BaseController.php` 源文件本身,仅确认业务应用目录不再直接依赖。
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l pro_v3.5.1/config/app.php` | 通过 | `No syntax errors detected in pro_v3.5.1/config/app.php`。 |
| `rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php'` | 通过 | 命令无输出,目标应用目录无直接残留。 |
| `php think list` | 通过 | 沙箱内曾因 Redis 连接限制输出 `Operation not permitted`;经授权在本机环境执行通过,输出 ThinkPHP 8.0.2 命令列表。 |
### 待部署回归
| 阶段 | 接口/命令 | 方法 | 身份 | 关键参数 | HTTP 状态 | 业务 `status` | 关键字段 | 结果 | 备注 |
|------|-----------|------|------|----------|-----------|---------------|----------|------|------|
| final | `/adminapi/login/info` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | 登录页配置 | 待测 | 部署环境补录。 |
| final | `/adminapi/check_auth` | GET | admin | token | 待预发填写 | 待预发填写 | `edition``license_source` | 待测 | 不返回伪造原厂授权成功状态。 |
| final | `/adminapi/auth` | GET | admin | token | 待预发填写 | 待预发填写 | `edition``license_source``crm_pro_authorized` | 待测 | 使用自有授权信息。 |
| final | `/api/get_copyright` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | 版权、备案、站点字段 | 待测 | 不调用加密版权 helper。 |
| final | `/supplierapi/copyright` | GET | anonymous | 无 | 待预发填写 | 待预发填写 | `copyrightContext``copyrightImage` | 待测 | 使用自有版权配置。 |
| final | `/adminapi/jnotice` | GET | admin | token | 待预发填写 | 待预发填写 | 通知数据 | 待测 | 有 admin token 时补测。 |
| final | `/supplierapi/jnotice` | GET | supplier | token | 待预发填写 | 待预发填写 | 通知数据 | 待测 | 有 supplier token 时补测。 |
| final | 客服登录/非法 token | POST/GET | kefu | 账号、密码、非法 token | 待预发填写 | 待预发填写 | `token`、错误码 | 待测 | 有客服账号时补测。 |
## 前端授权入口收口
### 修复说明
- 后台 `系统维护/商业授权` 页面改为 `系统许可` 页面,只展示自有许可状态、系统版本和本地版权配置,不再提供 CRMEB 原厂授权申请、购买授权或购买版权入口。
- 后台前端移除 `auth_apply``crmeb_product``crmeb_verify``crmeb_login``crmeb_order``crmeb_pay` 等授权购买/支付 API 封装。
- 后端兼容路由继续保留,避免旧前端或缓存请求直接 404但路由名称和控制器返回均明确为“原厂授权入口已禁用”。
- `SystemAuthServices::authApply()` 不再请求 `authorize.crmeb.net`,仅返回禁用异常,避免误触发远程原厂授权申请。
- 升级脚本中的菜单显示名从 `商业授权` 调整为 `系统许可`
### 自动化检查
| 命令 | 结果 | 备注 |
|------|------|------|
| `php -l pro_v3.5.1/app/services/system/SystemAuthServices.php` | 通过 | 无语法错误。 |
| `php -l pro_v3.5.1/app/controller/admin/Common.php` | 通过 | 无语法错误。 |
| `php -l pro_v3.5.1/route/admin.php` | 通过 | 无语法错误。 |
| `php -l pro_v3.5.1/app/controller/Upgrade.php` | 通过 | 无语法错误。 |
| `php think list` | 通过 | 输出 ThinkPHP 8.0.2 命令列表。 |
| `npm run build``pro_v3.5.1/view/admin` | 通过 | 构建成功;存在既有 CSS 顺序和资源体积警告。 |
| `rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php'` | 通过 | 命令无输出,目标应用目录无直接残留。 |
| `rg -n "crmebProduct\|authApply\|crmebVerify\|crmebLogin\|crmebOrder\|crmebPay\|getCrmebOrder\|authorize\.crmeb\.net\|购买授权\|购买版权\|申请授权" pro_v3.5.1/view/admin/src pro_v3.5.1/app/services/system/SystemAuthServices.php` | 通过 | 前端无申请/购买授权入口;仅保留后端禁用方法名 `authApply`。 |

View File

@@ -0,0 +1,19 @@
# 替换源代码中原厂的信息
## 注解内容替换
1. 查询源代码中注解:```// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>```
替换为: ```
// +----------------------------------------------------------------------
// | Author: ScottPan Team
// +----------------------------------------------------------------------
```
2. 查询源代码中注解 `crmeb.com`替换为 `uj345.cn`
## 限制
1. 仅限修改代码注释或不影响代码逻辑的部分,不修改代码逻辑。

View File

@@ -0,0 +1,38 @@
---
name: Fix Points LevelDiff Bug
overview: 修复 PointsRewardServices::propagateReward 中级差下限 nextLower 的计算错误:未获奖节点不应抬高级差下限,导致上级少拿积分。
todos:
- id: fix-nextlower
content: 修改 PointsRewardServices.php 第 169 行,未获奖节点不更新 nextLower
status: completed
- id: compensate-history
content: 补偿历史订单中因 Bug 少发的积分差额
status: completed
isProject: false
---
# 修复直推积分奖励级差下限传递 Bug问题4
## Bug 定位
[PointsRewardServices.php](pro_v3.5.1/app/services/hjf/PointsRewardServices.php) 第 169 行:
```php
$nextLower = max($directReward, $lowerDirectReward);
```
无论当前节点是否实际获奖,都把其 `directReward` 计入了级差下限。当创客grade=1在 depth>0 被跳过时,其 500 分没有发出,但 500 仍传给了上级作为扣减基数,导致云店只拿到 `800-500=300` 而非正确的 `800-0=800`
## 修复方案
将第 169 行改为:仅当 `$isEligibleForDirect` 为 true即该节点实际有资格获奖才用 `$directReward` 更新 `$nextLower`;否则保持 `$lowerDirectReward` 不变。
```php
$nextLower = $isEligibleForDirect
? max($directReward, $lowerDirectReward)
: $lowerDirectReward;
```
## 数据补偿
查询所有因此 Bug 而少发积分的历史记录uid=2 在多笔订单中只得了 300 而非 800对差额进行补发。

View File

@@ -0,0 +1,123 @@
---
name: 直推积分奖励问题3排查
overview: 通过数据库排查发现UID=55 和 UID=56 的 4 笔报单商品订单完全没有生成积分奖励记录,需要部署最新代码后使用补发命令修复。
todos:
- id: deploy-code
content: 将最新 queue 分支代码部署到生产服务器 47.94.76.64
status: pending
- id: patch-rewards
content: 在服务器执行 php think hjf:patch-rewards 补发缺失的积分奖励
status: pending
- id: verify-results
content: 查询 points_release_log 确认 4 笔订单的奖励记录已正确生成
status: pending
isProject: false
---
# 直推积分奖励问题3 排查结果与修复计划
## 数据库排查结果
### 推荐链与分销等级
| UID | 昵称 | spread_uid | agent_level | 等级名(grade) | direct_reward_points |
| --- | --- | ---------- | ----------- | ---------- | -------------------- |
- **UID=1** (初始账号): spread_uid=0, agent_level=3 (服务中心, grade=3), direct=1000, frozen_points=1983
- **UID=2** (潘186): spread_uid=1, agent_level=2 (云店, grade=2), direct=800, frozen_points=9296
- **UID=54** (金25): spread_uid=2, agent_level=1 (创客, grade=1), direct=500, frozen_points=0
- **UID=55** (金68): spread_uid=54, agent_level=0 (非分销员), frozen_points=0
- **UID=56** (wx363053): spread_uid=55, agent_level=0 (非分销员), frozen_points=0
推荐链确认: uid=1 -> uid=2 -> uid=54 -> uid=55 -> uid=56
### UID=55 和 UID=56 的已付款订单(全部 is_queue_goods=1
- **#142** wx770632864445235200 | UID=55 | 范氏国香中式轻养生灸3条套装
- **#144** wx770679631480094720 | UID=55 | 城市休闲折叠单车6速+2条养生灸
- **#145** wx770680112881336320 | UID=55 | 紫兰国香粉嫩套装多部位可选
- **#146** wx770680790747971584 | UID=56 | 城市休闲折叠单车6速+2条养生灸
### 积分奖励记录
**这 4 笔订单在 `eb_points_release_log` 中完全没有任何 reward_direct / reward_umbrella 记录。**
对比同时期 UID=54 自己的订单 (#143 wx770633621278031872) 则正常生成了奖励UID=1 获得 1000 直推奖励)。
### 预期应产生的奖励(以 UID=55 的一笔订单为例)
按当前代码 `propagateReward` 级差算法UID=55 (非分销员) 购买后:
```mermaid
flowchart TD
buyer["UID=55 买家 (agent_level=0, direct=0)"]
uid54["UID=54 创客 (depth=0, direct=500)"]
uid2["UID=2 云店 (depth=1, direct=800)"]
uid1["UID=1 服务中心 (depth=2, direct=1000)"]
buyer -->|"spread_uid=54"| uid54
uid54 -->|"actual=500-0=500"| uid54
uid54 -->|"nextLower=500"| uid2
uid2 -->|"actual=800-500=300"| uid2
uid2 -->|"nextLower=800"| uid1
uid1 -->|"actual=1000-800=200"| uid1
```
- UID=54 应获得 **500** 直推奖励(级差)
- UID=2 应获得 **300** 直推奖励(级差)
- UID=1 应获得 **200** 直推奖励(级差)
UID=56 的订单类似UID=55 非分销员 depth=0 => directCascadeActive 变 false => 仅伞下奖励,如果开关开着的话)。
## 根因分析
1. **服务器代码未更新**生产服务器47.94.76.64上运行的代码很可能不是最新版本。UID=54 的订单(#143)成功产生奖励,但 UID=55/56 的订单(#142/#144/#145/#146)完全没有记录,说明支付回调 [Pay.php](pro_v3.5.1/app/listener/order/Pay.php) 中的积分奖励逻辑未正确触发。
2. `**hjf_queue_pool_enable=0`**公排关闭走的是同步分支Pay.php L164-216应直接调用 `reward()`。但实际未生成记录,说明该服务器的 Pay.php 可能还是旧版本。
3. **UID=54 订单的异常数据**:订单 #143`order.spread_uid=1``user.spread_uid=2`(不一致),且 UID=1 拿到 1000 而非级差 200进一步证实服务器运行的是更早的非级差版本。
## 修复方案
### 步骤 1部署最新代码到生产服务器
确保以下文件已同步到 47.94.76.64
- [app/listener/order/Pay.php](pro_v3.5.1/app/listener/order/Pay.php) — 支付回调中的积分奖励同步逻辑
- [app/services/hjf/PointsRewardServices.php](pro_v3.5.1/app/services/hjf/PointsRewardServices.php) — 级差+直推链校验
- [app/command/HjfPatchMissingRewards.php](pro_v3.5.1/app/command/HjfPatchMissingRewards.php) — 补发命令
### 步骤 2使用补发命令修复缺失的积分奖励
代码部署后,在服务器上依次执行:
```bash
# 先 dry-run 确认哪些订单需要补发
php think hjf:patch-rewards --dry-run
# 也可针对单笔订单验证
php think hjf:patch-rewards --order-id=142 --dry-run
# 确认无误后执行实际补发
php think hjf:patch-rewards
```
该命令已内置幂等检查(跳过已有 reward 记录的订单),安全执行。
### 步骤 3验证补发结果
补发后查询确认:
```sql
SELECT uid, points, type, mark, order_id
FROM eb_points_release_log
WHERE order_id IN (
'wx770632864445235200','wx770679631480094720',
'wx770680112881336320','wx770680790747971584'
)
ORDER BY order_id, uid;
```
预期:每笔 UID=55 的订单应产生 UID=54(500) + UID=2(300) + UID=1(200) 的记录UID=56 的订单因 depth=0 非分销员,直推链中断,仅在伞下开关开启时产生伞下奖励。

View File

@@ -322,7 +322,7 @@ php think swoole
5. 后台登录:
http://域名/admin
默认账号admin 密码A@123456 或 A123456
默认账号admin 后者 admin2026 密码A@123456 或 A123456
## 启动命令

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app;

View File

@@ -1,14 +1,7 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// | Author: ScottPan Team
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\command;

View File

@@ -1,14 +1,7 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// | Author: ScottPan Team
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\command;

View File

@@ -0,0 +1,83 @@
<?php
// +----------------------------------------------------------------------
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\common\controller;
use app\Request;
use think\App;
use think\exception\ValidateException;
use think\Response;
/**
* 项目自有控制器基类,不依赖 CRMEB 商业授权基础类。
*/
abstract class AppBaseController
{
/**
* @var App
*/
protected App $app;
/**
* @var Request
*/
protected Request $request;
/**
* 是否批量验证
* @var bool
*/
protected bool $batchValidate = false;
public function __construct(App $app)
{
$this->app = $app;
$this->request = $app->request;
$this->initialize();
}
/**
* 初始化钩子,子类可覆盖。
*/
protected function initialize()
{
}
protected function success($message = 'ok', array $data = []): Response
{
return app('json')->success($message, $data);
}
protected function fail($message = 'fail', array $data = []): Response
{
return app('json')->fail($message, $data);
}
/**
* 兼容项目控制器中 `$this->validate($data, ValidateClass::class, 'scene')` 的调用方式。
*
* @param array $data
* @param string|array $validate
* @param string|array|null $scene
* @return bool
*/
protected function validate(array $data, $validate, $scene = null): bool
{
$validator = validate($validate)->batch($this->batchValidate);
if (is_string($scene) && $scene !== '') {
$validator->scene($scene);
} elseif (is_array($scene)) {
$validator->message($scene);
}
if (!$validator->check($data)) {
throw new ValidateException($validator->getError());
}
return true;
}
}

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\common\controller;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\common\controller;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller;
@@ -957,10 +951,10 @@ INSERT INTO `@table` (`id`, `pid`, `type`, `icon`, `menu_name`, `module`, `contr
(601, 74, 1, '', '砍价商品导出', 'admin', '', '', 'export/storeBargain', 'GET', '[]', 0, 0, 0, 1, '', '', 2, '', 0, 'export-storeBargain', 0),
(602, 29, 1, '', '推广员列表导出', 'admin', '', '', 'export/userAgent', 'GET', '[]', 0, 0, 0, 1, '', '', 2, '', 0, 'export-userAgent', 0),
(603, 40, 1, '', '用户充值导出', 'admin', '', '', 'export/userRecharge', 'GET', '[]', 0, 0, 0, 1, '', '', 2, '', 0, 'export-userRecharge', 0),
(605, 1665, 1, '', '商业授权', 'admin', '', '', '', '', '[]', 4, 1, 0, 1, '/admin/system/maintain/auth', '12/1665', 1, '', 0, 'system-maintain-auth', 0),
(605, 1665, 1, '', '系统许可', 'admin', '', '', '', '', '[]', 4, 1, 0, 1, '/admin/system/maintain/auth', '12/1665', 1, '', 0, 'system-maintain-auth', 0),
(606, 29, 1, '', '分销员数据', 'admin', '', '', 'agent/statistics', 'GET', '[]', 0, 0, 0, 1, '', '', 2, '', 0, '', 0),
(607, 587, 1, '', '修改密码', 'admin', '', '', 'setting/update_admin', 'PUT', '[]', 0, 0, 0, 1, '', '', 2, '', 0, '', 0),
(608, 605, 1, '', '商业授权', 'admin', '', '', 'auth', 'GET', '[]', 0, 1, 0, 1, '', '', 2, '', 0, '', 0),
(608, 605, 1, '', '系统许可', 'admin', '', '', 'auth', 'GET', '[]', 0, 1, 0, 1, '', '', 2, '', 0, '', 0),
(610, 20, 1, '', '管理员列表', 'admin', '', '', 'setting/admin', 'GET', '[]', 0, 0, 0, 1, '', '', 2, '', 0, '', 0),
(611, 19, 1, '', '身份列表', 'admin', '', '', 'setting/role', 'GET', '[]', 0, 0, 0, 1, '', '', 2, '', 0, '', 0),
(612, 2, 1, '', '批量上下架', 'admin', '', '', 'product/product/product_show', 'PUT', '[]', 5, 0, 0, 1, '', '', 2, '', 0, 'product-product-product_show', 0),
@@ -1546,7 +1540,7 @@ INSERT INTO `@table` (`id`, `pid`, `type`, `icon`, `menu_name`, `module`, `contr
(1662, 1661, 1, '', '提现设置', 'admin', '', '', '', '', '[]', 1, 1, 0, 1, '/admin/setting/system_config_advance', '35/1661', 1, '', 0, '', 0),
(1663, 1640, 1, '', '返佣设置', 'admin', '', '', '', '', '[]', 1, 1, 0, 1, '/admin/setting/system_config_rake_back', '26/1640', 1, '', 0, '', 0),
(1664, 1636, 1, '', '开卡有礼', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/user/memberGift', '9/1636', 1, '', 0, 'user-member-gift', 0),
(1665, 12, 1, 'ios-ribbon', '商业授权', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/', '12', 1, '', 0, '/', 0),
(1665, 12, 1, 'ios-ribbon', '系统许可', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/', '12', 1, '', 0, '/', 0),
(1666, 7, 1, 'ios-speedometer', '商城统计', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/', '7', 1, '', 0, '/', 0),
(1667, 27, 1, 'logo-codepen', '活动氛围', 'admin', '', '', '', '', '[]', 80, 1, 0, 1, '/admin/marketing/activity_background', '27', 1, '', 0, 'admin-marketing-activity_background', 0),
(1668, 135, 1, 'ios-appstore', 'APP', 'admin', '', '', '', '', '[]', 5, 1, 0, 1, '/', '135', 1, '', 0, '/', 0),

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller;

View File

@@ -1,17 +1,12 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin;
use app\common\controller\AppBaseController;
use app\Request;
use crmeb\basic\BaseController;
use think\Response;
/**
@@ -22,7 +17,7 @@ use think\Response;
* @method Response success($message = '', array $data = [])
* @method Response fail($message = '', array $data = [])
*/
class AuthController extends BaseController
class AuthController extends AppBaseController
{
/**
* 当前登陆管理员信息

View File

@@ -1,20 +1,15 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin;
use app\services\agent\DivisionApplyServices;
use app\services\agent\PromoterApplyServices;
use app\services\system\LocalCopyrightService;
use app\services\order\StoreOrderRefundServices;
use app\services\other\CityAreaServices;
use app\services\system\SystemAuthServices;
use app\services\order\StoreOrderServices;
use app\services\product\product\StoreProductServices;
use app\services\product\product\StoreProductReplyServices;
@@ -53,7 +48,11 @@ class Common extends AuthController
*/
public function check_auth()
{
return $this->success('ok');
return $this->success('ok', [
'edition' => 'custom',
'license_source' => 'self-owned',
'crm_pro_authorized' => false,
]);
}
/**
@@ -61,23 +60,16 @@ class Common extends AuthController
*/
public function auth()
{
return $this->success([
'status' => 1,
'authCode' => 'AUTHORIZED',
'auth_code' => 'AUTHORIZED',
'day' => 999,
'auth' => true,
'copyright' => true,
]);
return $this->success(app()->make(LocalCopyrightService::class)->getSystemLicenseInfo());
}
/**
* 查询购买版权
* 查询自有版权配置
* @return Response
*/
public function crmeb_copyright(): Response
{
return $this->success('查询成功');
return $this->success(app()->make(LocalCopyrightService::class)->getCopyright());
}
/**
@@ -89,10 +81,7 @@ class Common extends AuthController
$copyright = $this->request->post('copyright');
$copyrightImg = $this->request->post('copyright_img');
try {
$this->__qsG71NREI01vix2OkjH($copyright, $copyrightImg);
} catch (\Throwable $e) {
}
app()->make(LocalCopyrightService::class)->saveCopyright((string)$copyright, (string)$copyrightImg);
return $this->success('保存成功');
}
@@ -103,23 +92,46 @@ class Common extends AuthController
*/
public function getCopyright(): Response
{
try {
$copyright = $this->__z6uxyJQ4xYa5ee1mx5();
} catch (\Throwable $e) {
$copyright = ['copyrightContext' => '', 'copyrightImage' => ''];
}
$copyright['version'] = get_crmeb_version();
return $this->success($copyright);
return $this->success(app()->make(LocalCopyrightService::class)->getCopyright());
}
/**
* 申请授权
* @param SystemAuthServices $services
* 原厂授权申请入口已禁用
* @return Response
*/
public function auth_apply(SystemAuthServices $services): Response
public function auth_apply(): Response
{
return $this->success("申请授权成功!");
return $this->fail('CRMEB 原厂授权申请入口已禁用,请使用本项目自有版权配置');
}
public function crmeb_verify(): Response
{
return $this->fail('CRMEB 原厂授权验证码入口已禁用');
}
public function crmeb_login(): Response
{
return $this->fail('CRMEB 原厂授权登录入口已禁用');
}
public function crmeb_order(): Response
{
return $this->fail('CRMEB 原厂授权订单入口已禁用');
}
public function crmeb_order_info($orderId = null): Response
{
return $this->fail('CRMEB 原厂授权订单入口已禁用');
}
public function crmeb_pay(): Response
{
return $this->fail('CRMEB 原厂授权支付入口已禁用');
}
public function crmeb_product(): Response
{
return $this->fail('CRMEB 原厂授权产品入口已禁用');
}
/**

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin;
use app\Request;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\agent;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\agent;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\agent;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\cms;
use app\controller\admin\AuthController;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\cms;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\community;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\community;
use think\annotation\Inject;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\community;
use app\controller\admin\AuthController;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\diy;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\diy;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\finance;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\finance;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\finance;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\activityBackground;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\activityFrame;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\bargain;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\card;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\card;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\card;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\combination;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\coupon;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\coupon;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\coupon;
use app\controller\admin\AuthController;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\discounts;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\integral;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\integral;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\integral;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\integral;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\live;
use think\annotation\Inject;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\live;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\live;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\controller\admin\v1\marketing\lottery;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\controller\admin\v1\marketing\lottery;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\controller\admin\v1\marketing\lottery;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\promotions;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\seckill;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\seckill;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\seckill;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\video;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\marketing\video;
use think\annotation\Inject;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\merchant;
use think\annotation\Inject;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\merchant;
use app\services\store\SystemStoreServices;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\merchant;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\message;
use think\annotation\Inject;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\message\service;
use app\controller\admin\AuthController;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\message\service;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\message\service;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\message\service;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\notification\sms;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\notification\sms;
use think\annotation\Inject;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\notification\sms;
use crmeb\exceptions\AdminException;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\notification\sms;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\notification\sms;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\order;
use app\controller\admin\AuthController;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\order;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\order;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\order;
use app\common\controller\Order;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\order;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\other;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\other;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\other;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\other\export;
use app\controller\admin\AuthController;

View File

@@ -1,12 +1,6 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\other\queue;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\out;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\product;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\product;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\product;
use app\controller\admin\AuthController;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\product;
use app\controller\admin\AuthController;
@@ -66,6 +61,7 @@ class StoreProduct extends AuthController
['stock_range', ''],//库存区间
['collect_range', ''],//收藏区间
['product_clear', ''],//适用群体
['is_queue_goods', ''],//报单商品
]);
if ($this->adminType == 4) {
@@ -206,6 +202,7 @@ class StoreProduct extends AuthController
['stock_range', ''],//库存区间
['collect_range', ''],//收藏区间
['product_clear', ''],//适用群体
['is_queue_goods', ''],//报单商品
]);
if ($this->adminType == 4) {
$where['supplier_id'] = $this->adminId;

View File

@@ -1,13 +1,8 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\admin\v1\product;
use app\controller\admin\AuthController;

Some files were not shown because too many files have changed in this diff Show More