|
227
|
21
|
37
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `3f35b1a10 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `3f35b1a10656366e7b6e98afaaae5cf9bfcb13e1`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-19 19:44:17
---
## 1. 审查摘要
- **代码质量评分**:5.5/10
- **总体评价**:代码实现了较为复杂的自助台球/包厢业务流转,但存在明显的架构耦合与规范缺失。大量重复的模型加载、全局状态污染、魔法数字硬编码以及未做边界校验的循环逻辑,显著增加了维护成本与运行时风险。部分安全与性能隐患需优先修复。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `check_room()` 方法内 | 直接修改全局 CI 实例属性 (`$CI->merchant_id = $merchant_id;` 等),破坏请求隔离性。在多并发或异步任务中极易引发数据串扰与状态泄漏。 | 移除对 `$CI` 超全局对象的直接赋值。应通过方法参数传递、Session 存储、或使用框架的 `Config`/`Registry` 组件管理上下文。 | `$this->config->set('merchant_id', $merchant_id);`<br>或封装为独立的 `RoomContext` 对象传递。 |
| 🔴 严重 | `get_room_package_list()` 约第 180 行 | `for` 循环步长依赖 `$this->ahead_shop_book_time_info_model->min_minute_unit_time`,未做 `>0` 校验。若配置异常为 `0`,将触发死循环耗尽 CPU/内存。 | 增加步长防御性校验,失败时抛出明确异常或 fallback 到默认值。 | `if ($step <= 0) { throw new \InvalidArgumentException('时间步长必须大于0'); }` |
| 🔴 严重 | `get_room_page_info()` 约第 230 行 | 使用字符串拼接构造 `where` 条件 (`FIND_IN_SET(...)`) 并传入查询构建器。未使用参数绑定或严格转义,存在潜在 SQL 注入风险。 | 优先使用 CI 查询构建器的安全方法,或对拼接变量进行强制类型转换/转义。 | `$this->db->where("FIND_IN_SET(" . (int)$this->room_data['_id'] . ", _room_ids)");` |
| 🟠 警告 | 全局多处 | 每个方法开头重复调用 `$this->load->model()`。CI 框架虽支持重复加载,但频繁 I/O 会降低性能,且破坏代码整洁度。 | 在 `__construct()` 中统一加载依赖模型,或配置 `config/autoload.php` 自动加载。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_xxx_model'); }` |
| 🟠 警告 | 全局多处 | 大量魔法数字/字符串(如 `'1'`, `'2'`, `2333`, `10`, `11`)散落各处,业务语义模糊,后续迭代极易误改。 | 提取为类常量或独立配置文件,统一枚举管理。 | `const SCENE_KTV = '1'; const SCENE_CHESS = '3'; const ERR_ROOM_NOT_FOUND = 2333;` |
| 🟠 警告 | `buy_room_package()` 约第 380 行 | `defined('FACILITATOR')` 常量名疑似拼写错误(常见应为 `FACILITATOR` 或 `FACILITATOR`?),可能导致服务商模式分支永远不执行。 | 核对全局常量定义,修正拼写并严格使用 `===` 比较。 | `if (defined('FACILITATOR') && FACILITATOR === 1)` |
| 🟡 建议 | `check_room_status()` 等 | 核心方法过长(超 150 行),嵌套 `if/switch` 极深,违反单一职责原则(SRP),可读性与可测试性差。 | 按 `operational_scene` 拆分逻辑至独立私有方法,主方法仅做路由分发。 | `private function handleTavernStatus($uid, $params) { ... }` |
| 🟡 建议 | 全局日志处 | `do_log($open_id . '-' . var_export($res, true), ...)` 直接打印完整响应数组,可能泄露 OpenID、Token 或敏感业务数据。 | 日志记录前进行脱敏,或仅记录关键状态码/错误信息。 | `do_log("{$open_id}-status:" . ($res['code'] ?? 'unknown'), 'billiardsPush');` |
| 🟡 建议 | PHPDoc 注释 | 注释不规范,如 `@return true` 非标准类型声明;方法签名缺少 PHP 7+ 类型提示,不利于静态分析与 IDE 提示。 | 遵循 PSR-5/PSR-12,补充参数与返回值类型声明。 | `public function send_mini_msg(string $open_id, int $room_id, int $merchant_id, int $shop_id): bool` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **消除全局状态污染**:立即移除 `$CI->xxx = $value` 的写法。这是导致线上偶发性数据错乱的常见根源。建议改用 `Session` 或方法参数透传。
2. **防御性编程加固**:为 `min_minute_unit_time` 等外部配置增加 `>0` 校验;对 `FIND_IN_SET` 等动态 SQL 片段强制类型转换或使用查询构建器安全接口。
3. **常量与枚举化**:将散落的 `'1'`/`'2'`/`2333` 等提取为 `const`,建立业务状态字典,降低后续维护的认知负荷。
### 🛠 后续重构与优化方向
- **方法拆分与策略模式**:当前 `check_room_status` 和 `get_room_package_list` 承载了台球、KTV、棋牌、酒馆等多套逻辑。建议引入 **策略模式 (Strategy Pattern)**,将不同 `operational_scene` 的处理逻辑抽离为独立类,主 Model 仅负责上下文组装与路由。
- **查询性能优化**:`get_room_package_list` 中存在多次 `foreach` 遍历、`unset` 与 `array_values` 重建索引。可考虑在数据库层使用更精准的 `WHERE` 条件过滤,或使用 `array_filter` 替代手动 `unset`,减少内存拷贝。
- **日志规范化**:建议接入结构化日志(如 Monolog),对 `var_export` 输出进行 JSON 序列化与敏感字段过滤,便于 ELK 等日志平台检索与告警。
- **框架适配说明**:注:当前代码结构高度符合 **CodeIgniter 3** 规范。若 `phpci` 为基于 CI3 的定制框架,上述建议可直接应用;若为全新架构,请查阅 `phpci` 官方文档确认其依赖注入(DI)容器与模型加载机制,逐步替换 `$this->load->model()` 为构造函数注入。
> ⚠️ **局限性提示**:提供的代码在 `get_valid_room_package_coupon()` 方法末尾截断,未能完整审查该方法的后续逻辑(如优惠券校验、库存扣减等)。建议补充完整代码后再次进行针对性审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779191057
|
1779191057
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
228
|
21
|
38
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `9508f796c ## 自动代码审查报告
**分支**: pay-260519
**提交**: `9508f796c462fe49f6d673e0f662e51fa6a7cfdc`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-19 19:57:05
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的计费、时段匹配、跨天处理与VIP折扣逻辑,业务实现完整但高度耦合。代码中存在多处影响财务精度的浮点运算、数组遍历指针误用、潜在SQL注入风险及性能瓶颈。模型职责过重,混合了数据查询、业务计算与视图数据格式化,不符合现代 MVC 分层规范。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_timing_by_room_id` (约第 70 行) | `foreach ($timingData as $key => &$timeItem)` 循环内部混用 `next($timingData)` 修改数组内部指针,且使用引用传递。PHP 的 `foreach` 会复制数组指针,混用会导致遍历错乱、跳过元素或死循环。 | 移除 `next()`,改用索引遍历或提前将“次日数据”独立查询并合并。避免在 `foreach` 中操作迭代器指针。 | `// 错误做法<br>foreach ($arr as $k => &$v) { next($arr); }<br><br>// 正确做法:使用 for 循环或提前构建映射数组<br>for ($i = 0; $i < count($timingData); $i++) { ... }` |
| 🔴 严重 | `get_now_price`, `get_date_time_price_info` 等多处 | `where` 条件中直接拼接变量至 SQL 字符串(如 `FIND_IN_SET('{$room_id}', _room_ids)`)。若框架查询构造器未对该键值进行强制转义,将导致 SQL 注入。 | 使用参数绑定或框架提供的安全查询方法,确保所有外部输入经过严格过滤/转义。 | `$this->db->where("FIND_IN_SET(?, _room_ids)", $room_id);<br>// 或框架封装的安全写法<br>$where['where'][] = ['FIND_IN_SET(?, _room_ids)', $room_id];` |
| 🔴 严重 | `calculate_timing_cost`, `calculate_timing_cost_count` 等多处 | 使用浮点数进行金额累加(`$cost += $priceFlag * $till;`)。PHP 浮点数精度缺陷会导致 `0.00000001` 级误差,长期累积或高并发下极易引发财务对账失败。 | 金额计算统一转为“分”(整数)或使用 `bcmath` 扩展。仅在最终返回时格式化为元。 | `$cost = bcadd($cost, bcmul($priceFlag, $till, 4), 2);<br>// 返回前转换<br>'cost' => number_format(bcdiv($cost, 100, 2), 2, '.', '')` |
| 🟠 警告 | `get_date_time_price_info` (约第 450 行) | 使用 `for ($i = $start_time; $i < $end_time; $i += 300)` 按 5 分钟步长生成时间数组。跨天或长时段会生成数百个数组元素,内存占用高且无必要。 | 改为区间逻辑计算,仅在 API 响应前按需生成;或引入缓存/预计算表,避免实时循环生成。 | `// 改为区间记录,前端/视图层按需展开<br>$ranges[] = ['start' => $start_time, 'end' => $end_time, 'price' => $price];` |
| 🟠 警告 | 全文多处 | 频繁调用未声明的全局函数(`throwError`, `hourToTime`, `preMinute`, `getNextUnitTime` 等)。若 Helper 未自动加载,将触发 `Fatal Error`。 | 在 `config/autoload.php` 中统一加载对应 Helper,或封装为静态工具类 `TimingHelper::hourToTime()` 并添加 `function_exists()` 防御。 | `if (!function_exists('hourToTime')) { throw new \RuntimeException('Helper not loaded'); }` |
| 🟡 建议 | 全文 | 魔法数字泛滥(`86400`, `3600`, `0.01`, `8`, `9`, `300` 等),降低可读性与后期维护成本。 | 提取为类常量,集中管理业务阈值与类型标识。 | `const SECONDS_PER_DAY = 86400;<br>const TYPE_BD = 8;<br>const TYPE_NEXT_BD = 9;` |
| 🟡 建议 | `get_timing_by_room_id` 等 | 参数命名不一致(`$extraParams` vs `$extParams`),存在拼写错误(`$startInitTiem`),且模型内重复调用 `$this->load->model()`。 | 统一参数命名规范;修复拼写错误;将依赖模型加载移至构造函数或父类初始化方法。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model(['Ahead_family_servers_model', 'Ahead_yc_shop_model']);<br>}` |
| 🟡 建议 | 整体架构 | 模型承担了大量业务计算、价格策略匹配与数据格式化逻辑,违反单一职责原则(SRP)。 | 将计费、时段匹配、VIP折扣逻辑抽离至独立的 `Service` 层(如 `RoomPricingService`),Model 仅保留数据存取与基础查询。 | `// Controller 调用<br>$pricing = new RoomPricingService($this->ahead_room_timing_model);<br>$result = $pricing->calculate($merchantId, $roomId, $start, $end);` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复财务精度隐患**:立即将所有涉及金额加减乘除的逻辑替换为 `bcmath` 函数或整数(分)运算。这是计费系统的核心红线。
2. **消除数组遍历 Bug**:重构 `get_timing_by_room_id` 中的 `foreach` + `next()` 逻辑,改用索引遍历或独立构建 `$nextTimingData` 数组,确保时段匹配逻辑稳定。
3. **封堵 SQL 注入风险**:审查所有包含 `FIND_IN_SET`、`like`、`where` 的查询条件,确保外部参数通过参数绑定传入,禁止直接字符串拼接。
### 🛠 后续重构与优化方向
1. **架构分层解耦**:当前 Model 已演变为“上帝类”。建议按职责拆分为:
- `TimingModel`:仅负责数据库 CRUD 与基础查询。
- `PricingService`:处理计费规则匹配、跨天计算、VIP折扣策略。
- `TimingFormatter`:负责将原始数据转换为前端所需的 `time_str`、`is_default` 等展示格式。
2. **性能优化**:
- 将 `get_date_time_price_info` 中的 5 分钟循环改为区间计算,或引入 Redis 缓存热点时段的定价规则。
- 统一在构造函数中加载依赖模型,避免方法内重复调用 `$this->load->model()`。
3. **规范与可维护性**:
- 提取所有魔法数字为 `const` 常量。
- 统一参数命名风格(推荐 `$extraParams`),修复 `$startInitTiem` 等拼写错误。
- 补充 PHPDoc 类型声明(如 `@param int $merchantId`),便于静态分析工具(如 PHPStan/Psalm)介入。
4. **框架适配说明**:代码结构高度类似 CodeIgniter 3。若 `phpci` 为定制框架,请重点核对 `$this->select()` 与 `$this->get_one()` 对 `where` 数组中原始 SQL 片段的转义策略。若框架未自动转义,必须手动使用查询构造器的参数绑定语法。
> 💡 **提示**:建议在合并前补充单元测试(PHPUnit),重点覆盖:跨天时段匹配、VIP折扣叠加、不满一小时计费规则、以及边界时间(如 `23:59` 与 `00:00`)的精度验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779191825
|
1779191825
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
231
|
21
|
41
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `7bc8899d9 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `7bc8899d9e76df8b5780014e1339a037561beb71`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-20 10:58:31
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了完整的预订、支付、退款及消息通知业务流程,但存在明显的遗留架构特征。核心问题集中在**事务控制不规范**、**循环内数据库查询**、**原始SQL拼接风险**以及**魔法数字泛滥**。整体可维护性较低,在高并发或异常场景下易引发数据不一致或性能瓶颈。
- **风险等级**:🔴 高(存在潜在SQL注入风险、事务状态机异常隐患及硬编码配置泄露风险)
> 📌 **框架说明**:从 `$CI = &get_instance()`、`$this->load->model()`、`$this->db->trans_start()` 等特征判断,该代码高度契合 **CodeIgniter 3** 架构。若 `phpci` 为基于 CI3 的定制框架,以下建议同样适用;若为全新架构,请优先确认其事务与模型加载的生命周期规范。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_book_order_model.php` ~L330 | **SQL 注入风险**:`$log_where` 使用字符串拼接传入自定义 `up()` 方法,未做参数绑定或过滤,若 `_id` 含特殊字符将导致注入或语法错误。 | 使用框架查询构造器或确保底层方法支持预处理参数。避免直接拼接 SQL 片段。 | `$this->db->where('_relation_id', $order_data['_id'])->where('_status', 1)->where_in('_type', [5, 13]);`<br>`$this->ahead_pay_log_model->update($log_up, $where_array);` |
| 🔴 严重 | `Ahead_book_order_model.php` L100-L140 | **事务控制不规范**:混用 `trans_start()` 与手动 `trans_rollback()`。CI 框架内部维护事务计数器,手动回滚可能破坏状态机,导致后续查询不在事务中或连接池异常。 | 遵循 CI 标准事务模式:`trans_start()` → 业务逻辑 → `trans_complete()` → 检查 `trans_status()`。异常捕获中仅记录日志,交由框架自动回滚。 | `$this->db->trans_start();`<br>`try { /* 业务逻辑 */ $this->db->trans_complete(); }`<br>`catch(Exception $e) { doLog($e->getMessage()); $this->db->trans_rollback(); }`<br>`if ($this->db->trans_status() === FALSE) { /* 处理失败 */ }` |
| 🟠 警告 | `Ahead_book_order_model.php` L380-L390 | **N+1 查询性能瓶颈**:`get_list()` 的 `foreach` 循环内调用 `get_one()` 查询商家信息,数据量大时将产生大量 DB 连接与查询开销。 | 提取所有 `merchant_id`,使用 `WHERE IN` 批量查询,构建映射数组后在循环中赋值。 | `$ids = array_unique(array_column($order_info, 'merchant_id'));`<br>`$merchants = $this->ahead_merchant_model->get_list(['_id' => $ids], '_id,_business_model');`<br>`$map = array_column($merchants, '_business_model', '_id');` |
| 🟠 警告 | 两个文件顶部 | **全局 `$CI` 实例化与重复加载**:文件顶部 `$CI = &get_instance();` 在类未实例化时执行,违反框架生命周期;方法内频繁 `load->model()` 增加 I/O 开销。 | 移除文件顶部 `$CI` 赋值;将高频依赖模型移至 `__construct()` 中加载,或确保按需加载一次。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_vip_model'); $this->load->model('ahead_shop_model'); }` |
| 🟠 警告 | 全局多处 | **魔法数字泛滥**:`_pay_platform` (1,3,14)、`_status` (-1,1,4)、`_pay_scene` (5,8,9) 等硬编码散落各处,可读性差且极易引发逻辑遗漏。 | 定义类常量或独立配置文件集中管理枚举值,业务逻辑中统一引用。 | `const PAY_WX = 1; const PAY_VIP = 3; const STATUS_PENDING = -1;`<br>`if ($data['_pay_platform'] === self::PAY_WX) { ... }` |
| 🟡 建议 | 全局 | **代码规范不统一**:混用 `array()` 与 `[]`;类名大小写不一致(如 `Ahead_shop_model` vs `ahead_shop_model`);`doLog` 与 `do_log` 混用。 | 严格遵循 PSR-12:统一使用短数组语法 `[]`;统一类名与加载名的大小写;统一日志函数命名。 | `['key' => 'value']`<br>`$this->load->model('Ahead_shop_model');`<br>`do_log($msg, $channel);` |
| 🟡 建议 | `Ahead_book_order_model.php` L135 | **日志记录性能与安全隐患**:`json_encode($e->getTrace(), 256)` 记录完整调用栈,生产环境易暴露敏感路径且日志体积庞大。 | 仅记录关键错误信息、行号及脱敏上下文。避免在生产日志输出完整 Trace。 | `doLog('支付失败: ' . $e->getMessage() . ' at line ' . $e->getLine(), 'book_order');` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **重构事务控制逻辑**:立即统一 `check_notify`、`refund`、`create_book_order` 中的事务写法,采用 `trans_start()` + `trans_complete()` + `trans_status()` 的标准模式,移除冗余的手动 `trans_rollback()`,防止高并发下数据库连接状态错乱。
2. **消除 SQL 拼接隐患**:将 `refund_by_notify` 中的 `$log_where` 字符串替换为查询构造器或参数化数组。若 `ahead_pay_log_model::up()` 为自定义方法,需确保其底层使用 PDO 预处理。
3. **优化列表查询性能**:修复 `get_list()` 的 N+1 查询问题,改为批量 `WHERE IN` 查询。该优化可显著降低数据库 CPU 与网络延迟。
### 🛠 后续重构与优化方向
- **枚举与配置抽离**:建立 `config/payment_platforms.php` 与 `config/order_status.php`,或使用类常量集中管理状态机。支付场景(`_pay_scene`)与平台(`_pay_platform`)的判断逻辑建议抽离至独立的 `PaymentStrategy` 策略类,降低 `if/else` 嵌套深度。
- **服务层拆分**:当前 Model 承载了过多业务逻辑(支付路由、退款计算、短信发送、社区收入结算)。建议引入 **Service 层**(如 `BookOrderService`、`RefundService`),Model 仅负责数据持久化,符合单一职责原则(SRP)。
- **框架适配确认**:若 `phpci` 为自研框架,请核对以下两点:
1. 模型加载是否支持自动加载(Autoloading)?若支持,可移除所有 `$this->load->model()`。
2. 事务驱动是否兼容 CI3 的计数器机制?若为全新实现,需查阅官方文档确认 `trans_start()` 与手动回滚的兼容性。
- **代码片段局限性说明**:`create_community_shop_book_order` 方法在末尾被截断,无法完整评估其支付路由、团购券核销及异常回滚逻辑。建议补充完整代码后二次审查。
> 💡 **专家提示**:支付与退款链路属于资金敏感型业务,建议在核心节点(如 `refund_by_notify`、`check_notify`)增加**幂等性校验**(如基于 `_trade_no` 或 `_log_id` 的唯一索引/Redis 锁),并补充单元测试覆盖退款分支与事务回滚场景。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779245911
|
1779245911
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
236
|
21
|
42
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `98d481964 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `98d481964b8c1f4240e5b71e6c1edf49a80bba3d`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-20 13:12:50
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该文件为典型的业务逻辑密集型服务类,承担了订单价格计算、会员折扣、优惠券抵扣、服务费核算及套餐组装等核心职责。代码具备完整的业务闭环,但存在**严重违反单一职责原则**、**遗留调试代码**、**潜在 SQL 注入风险**及**财务计算精度隐患**等问题。整体可维护性较低,重构优先级高。
- **风险等级**:🔴 高
> 📌 **框架说明**:代码结构(`BASEPATH`、`get_instance()`、`$this->CI->load->model()`)明确属于 **CodeIgniter 3** 架构,而非 `phpci`(phpci 为 PHP 持续集成服务器)。以下审查将基于 CI3 最佳实践与通用 PHP 规范进行。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `getOrderTypeInfo` 方法内 | **遗留调试输出**:循环中存在 `echo $vip_upgrade_data_actual_pay;`。在生产环境中会破坏 JSON/XML 响应结构,且可能泄露内部计算逻辑。 | 立即删除 `echo`。如需追踪,应使用 CI 日志系统 `$this->CI->log->write_log('debug', $msg);`。 | `// 删除 echo 语句<br>if ($this->CI->config->item('environment') === 'development') {<br> log_message('debug', '升级计算: ' . $vip_upgrade_data_actual_pay);<br>}` |
| 🔴 严重 | `getOrderTypeInfo` 方法内 | **SQL 注入风险**:`$pack_goods_where = "wares_package._package_id in (" . implode(",", $id_array['package_id']) . ")";` 直接拼接数组至 SQL 字符串。若 `$id_array['package_id']` 含未过滤的用户输入,将导致注入。 | 使用 `array_map('intval', ...)` 强制类型转换,或改用 CI 查询构建器。 | `$safe_ids = array_map('intval', $id_array['package_id']);<br>$pack_goods_where = "wares_package._package_id IN (" . implode(',', $safe_ids) . ")";` |
| 🔴 严重 | `getOrderTypeInfo` 方法内 | **数组键覆盖逻辑错误**:`$order['_prime_service_charge']` 被连续赋值两次,第二次 `$service_charge` 覆盖了第一次 `$prime_after_paid_service_charge`,导致业务数据错乱。 | 核对业务定义,保留正确的一次赋值,或重命名键名避免冲突。 | `$order['_prime_service_charge'] = $prime_after_paid_service_charge; // 保留原始值<br>// 删除下方重复赋值行` |
| 🟠 警告 | 全局/多处 | **频繁动态加载模型**:在多个方法内部重复调用 `$this->CI->load->model(...)`。CI3 虽支持懒加载,但高频调用会增加文件 I/O 与内存开销。 | 将依赖模型统一移至 `__construct()` 中加载,或配置 `config/autoload.php`。 | `public function __construct() {<br> $this->CI =& get_instance();<br> $this->CI->load->model(['Ahead_vip_level_model', 'Ahead_merchant_goods_model', 'Ahead_goods_price_rooms_model']);<br>}` |
| 🟠 警告 | `_create_insert_infos_data` 等 | **静态属性访问模型实例**:`$this->CI->Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME`。CI3 模型为对象实例,`::` 通常用于类常量。若为属性应使用 `->`,若为常量建议直接引用类名。 | 明确访问方式。若为类常量,使用 `Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME`;若为实例属性,使用 `->`。 | `$vip_max_level = count(Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME);` |
| 🟠 警告 | 全局价格计算 | **浮点数精度与舍入隐患**:大量使用 `sprintf("%.2f", ...)` 及直接乘除。`sprintf` 仅返回字符串,不改变底层浮点精度,财务累加易产生 `0.000000001` 误差。 | 财务计算统一使用 `round($val, 2)` 或 `bcmath` 扩展。累加前确保为 `float` 类型。 | `$actual_pay = round($goods_price_data['actual_pay'] * $discount_goods_reward, 2);` |
| 🟡 建议 | 类定义 | **违反单一职责原则 (SRP)**:该类同时处理订单组装、价格策略、会员逻辑、优惠券、服务费、套餐解析等,且大量使用 `public` 属性存储中间状态,导致类膨胀且难以测试。 | 按领域拆分:`OrderCalculator`(核心计算)、`VipPriceStrategy`(会员价策略)、`CouponDeductor`(优惠券抵扣)。属性改为 `private/protected`,通过方法参数传递上下文。 | `// 重构方向示例<br>class OrderCalculator {<br> public function calculate(OrderContext $ctx): array { ... }<br>}` |
| 🟡 建议 | 全局 | **不符合 PSR-12 规范**:变量命名随意(`$vv`, `$vls`, `$mar_goods`),缺少类型声明,注释与代码混杂,缩进不一致。 | 启用 IDE 自动格式化,添加 PHP 7.4+ 类型提示(`array`, `int`, `float`),统一使用驼峰命名。 | `private function _create_insert_infos_data(array $goods, int $package_id = 0): array { ... }` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即移除 `echo` 调试语句**:防止生产环境接口响应污染。
2. **修复 SQL 拼接注入风险**:对 `$id_array['package_id']` 进行严格的 `intval` 过滤或改用 Query Builder。
3. **修正 `$order['_prime_service_charge']` 覆盖 Bug**:核对财务字段定义,确保服务费计算链路准确。
4. **统一财务计算精度**:将 `sprintf` 替换为 `round()`,并在关键累加节点增加精度校验。
### 🛠 后续重构与优化方向
1. **架构拆分(核心)**:当前 `getOrderTypeInfo` 方法超过 600 行,嵌套层级深,维护成本极高。建议采用 **策略模式 (Strategy Pattern)** 处理不同订单类型(酒水/套餐/开房),将价格计算、优惠券抵扣、服务费核算抽离为独立服务类。
2. **状态管理优化**:移除类级别的 `public` 状态变量(如 `$room_id`, `$vip_data` 等),改为通过构造函数或方法参数注入。避免并发请求下的状态污染。
3. **异常处理标准化**:当前使用全局函数 `throwError()`,不利于上层捕获与统一响应。建议改为 `throw new \InvalidArgumentException()` 或自定义业务异常类,配合全局异常处理器返回标准 JSON。
4. **性能优化**:
- 模型预加载至构造函数。
- 循环内避免重复调用 `$this->CI->load->model()` 或 `$this->CI->load->helper()`。
- 对 `$goods_quantity`、`$id_array` 等入参增加类型校验与边界限制(如 `max_quantity` 校验)。
5. **代码规范**:引入 `PHP_CodeSniffer` 配合 `PSR-12` 规则集进行 CI 流水线卡点,逐步清理历史技术债。
> ⚠️ **局限性说明**:您提供的代码在 `$result['have_good` 处被截断,未能完整审查 `case '2'/'4'` 的后续逻辑及类末尾的闭合部分。若后续逻辑包含数据库事务控制、支付回调或库存扣减,请补充完整代码以便进行事务一致性与并发安全审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779253970
|
1779253970
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
237
|
21
|
43
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `d0e7d691b ## 自动代码审查报告
**分支**: pay-260519
**提交**: `d0e7d691b58ee95524879913eb502c0f45974de9`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-20 13:52:10
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖较全面,但存在**严重的密码学误用**、**安全配置隐患**及**分布式事务一致性风险**。代码结构偏向过程式,核心方法(如退款、回调处理)过于臃肿,违反单一职责原则(SRP)。部分金额计算、IP获取及签名逻辑存在明显缺陷,需优先修复。
- **风险等级**:🔴 高
> 📌 **框架说明**:提交代码实际基于 **CodeIgniter 3** 架构(典型特征:`get_instance()`、`$this->load->model()`、`$this->db->trans_start()`)。若确为 `phpci` 定制版,请确认其底层加载机制与 CI3 完全一致。以下审查将基于 CI3 规范及现代 PHP 标准进行。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `GuoTong.php`<br>`checksign()` / `create_sing()` | **密码学逻辑错误**:签名验证误用 `openssl_public_decrypt`,且 `$data` 被 `str_split` 覆盖导致原始数据丢失;签名生成误用公钥加密(应使用私钥签名)。标准 RSA 签名应使用 `openssl_sign()` 与 `openssl_verify()`。 | 替换为标准的非对称签名流程。签名使用私钥+`openssl_sign`,验签使用公钥+`openssl_verify`。 | ```php<br>// 签名<br>openssl_sign($str, $sign, $privateKey, OPENSSL_ALGO_SHA256);<br>return base64_encode($sign);<br><br>// 验签<br>$pubKey = openssl_pkey_get_public($key_pem);<br>$verify = openssl_verify($signStr, base64_decode($sign), $pubKey, OPENSSL_ALGO_SHA256);<br>return $verify === 1;<br>``` |
| 🔴 严重 | `GuoTong.php`<br>`request()` | **SSL 证书验证关闭**:`CURLOPT_SSL_VERIFYPEER` 与 `CURLOPT_SSL_VERIFYHOST` 设为 `false`,生产环境极易遭受中间人攻击(MITM),导致支付数据被劫持或篡改。 | 生产环境必须开启证书验证,并配置正确的 CA 证书路径。 | ```php<br>curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);<br>curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);<br>curl_setopt($ch, CURLOPT_CAINFO, APPPATH.'config/cacert.pem');<br>``` |
| 🔴 严重 | `GuoTong.php`<br>`get_client_ip()` | **IP 伪造漏洞**:直接信任 `HTTP_CLIENT_IP` 和 `HTTP_X_FORWARDED_FOR`,攻击者可轻易伪造 IP 绕过风控或日志追踪。 | 增加 IP 格式校验,或优先使用框架内置安全方法。仅在内网可信代理下才解析 `X-Forwarded-For`。 | ```php<br>$ip = $_SERVER['REMOTE_ADDR'];<br>if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {<br> $list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);<br> $ip = trim($list[0]);<br>}<br>return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : '0.0.0.0';<br>``` |
| 🟠 警告 | `GuoTong.php`<br>`create_wx_orderss()` | **浮点数金额计算隐患**:`round($order['totalFee'] * 100, 2)` 仍返回浮点数,后续参与整数运算或入库时可能产生精度丢失(如 `0.1*100 = 10.000000000000002`)。 | 支付金额统一转为**整数分**处理,使用 `(int)round()` 或 `bcmul()`。 | `$params['txamt'] = (int)round($order['totalFee'] * 100);` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`refund()` / `refund_by_notify()` | **事务与外部 API 混合调用**:在 `$this->db->trans_start()` 内调用微信/银联退款 API。若 API 成功但后续 DB 操作失败,事务回滚无法撤销已发生的资金退款,导致**资金不一致**。 | 采用**最终一致性**设计:先落库记录退款单(状态:处理中),异步或独立流程调用支付网关,成功后更新状态。增加幂等键防重。 | 见下方“行动建议”第 2 点 |
| 🟠 警告 | `Ahead_book_order_change_pay_log_model.php`<br>`refund()` | **循环退款无原子性保障**:`refund_by_order()` 遍历多条记录调用 `refund()`,若中途某条失败直接 `return`,已成功的退款无法回滚,且未使用数据库事务包裹。 | 使用 `$this->db->trans_start()` 包裹循环,或改为批量处理+状态机。失败时记录异常日志并触发补偿任务。 | ```php<br>$this->db->trans_start();<br>foreach ($log_data as $log) {<br> $res = $this->refund($log, $book_order);<br> if (!$res['status']) { $this->db->trans_rollback(); return $res; }<br>}<br>$this->db->trans_complete();<br>``` |
| 🟡 建议 | `GuoTong.php`<br>`create_wx_orderss()` / `create_ali_orderss()` | **代码高度重复**:两个方法 90% 逻辑一致,仅 `payWay`、`wxAppid`/`zfbappid` 及日志标识不同,违反 DRY 原则。 | 提取公共方法 `create_order($order, $payType)`,通过配置数组区分渠道。 | 见下方“行动建议”第 3 点 |
| 🟡 建议 | 全局文件 | **魔法数字泛滥**:`1, 2, 3, 4, 5, 8, 9, 10` 等硬编码表示支付渠道、场景、状态,可读性差且易引发维护错误。 | 定义常量或枚举类(PHP 8.1+),如 `PayPlatform::WECHAT = 1`。 | `const PAY_PLATFORM_WECHAT = 1;` |
| 🟡 建议 | 全局文件 | **不符合 PSR-12 规范**:缺少类型声明(参数/返回值)、`array()` 与 `[]` 混用、方法职责过重(如 `refund_by_notify` 超 200 行)、拼写错误 `create_sing`。 | 逐步添加类型提示,统一数组语法,拆分大方法,修正拼写。启用 PHPStan/Psalm 静态检查。 | `public function create_sign(array $params): string` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题(P0/P1)
1. **立即修正签名/验签逻辑**:当前 `GuoTong` 类的加解密用法完全违背非对称密码学规范,会导致第三方回调验签失败或伪造签名通过。请严格替换为 `openssl_sign()` / `openssl_verify()`。
2. **开启 SSL 证书验证**:支付网关通信必须启用 `CURLOPT_SSL_VERIFYPEER = true`,否则存在资金劫持风险。
3. **修复 IP 获取逻辑**:增加 `FILTER_VALIDATE_IP` 校验,避免风控策略被绕过。
4. **金额计算转整数**:所有涉及支付、退费的金额在入库或请求前统一转为**分(整数)**,杜绝浮点精度问题。
### 🛠 后续重构与优化方向
1. **引入支付服务层(Service Layer)**:
- 将 `GuoTong`、微信、银联等支付逻辑抽象为独立的 `PaymentService`,采用**策略模式**按渠道路由。
- 模型层仅负责数据持久化,不直接调用外部 HTTP API。
2. **重构退款事务模型(最终一致性)**:
- 退款流程改为:`创建退款单(状态:待处理) -> 调用网关 -> 接收异步回调 -> 更新退款单状态 -> 更新业务订单状态`。
- 增加**幂等性控制**(如基于 `out_refund_no` 唯一索引),防止网络重试导致重复退款。
3. **代码规范与现代化**:
- 统一使用 PHP 7.4+ 类型声明:`public function checksign(array $params): string`
- 使用常量/枚举替代魔法数字,提升可读性。
- 拆分 `refund_by_notify` 等超长方法,按业务域拆分为 `refundWx()`, `refundVip()`, `refundCommunityRevenue()` 等私有方法。
4. **框架适配提示**:
- 代码中大量使用 `$this->load->model()` 动态加载,建议在 CI3 中通过 `$autoload['model']` 预加载高频模型,或使用构造函数一次性加载,减少运行时开销。
- 若后续计划升级至 PHP 8+ 或现代框架(如 Laravel/Symfony),建议尽早剥离 `get_instance()` 强耦合,转向依赖注入(DI)。
> ⚠️ **局限性说明**:`Ahead_book_order_model.php` 末尾代码被截断(`create_community_shop_book_order` 方法未完成),无法评估该分支的完整逻辑与异常处理。建议补充完整代码后再次审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779256330
|
1779256330
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
249
|
21
|
46
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `c2f698590 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `c2f6985906699521199792adbee2115351bbaf66`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-20 18:09:59
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了核心的预订、支付回调、退款及消息推送逻辑,业务链路完整。但存在**事务边界混乱、SQL拼接注入风险、财务计算精度隐患、方法严重超长违反单一职责原则**等问题。代码风格不统一,硬编码与魔法数字较多,且文件末尾代码被截断,无法评估完整逻辑。
- **风险等级**:🔴 高(涉及资金流转与支付回调,当前实现存在数据不一致与注入风险)
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `check_notify` 方法 | **事务与异常处理冲突**:`$this->db->trans_complete()` 在 `try` 块中提前执行,若后续 `send_success_msg()` 抛出异常,`catch` 块会调用 `trans_rollback()`。此时事务已提交,回滚无效,且会导致支付回调响应超时被平台重试。 | 严格限定事务仅包裹数据库操作。外部API调用(微信/短信/VIP回调)必须移至事务提交后,或放入异步队列。移除包裹外部调用的 `try-catch` 或拆分逻辑。 | ```php<br>// 正确做法:<br>$this->db->trans_start();<br>// ... 仅数据库操作 ...<br>$this->db->trans_complete();<br><br>if ($this->db->trans_status() === FALSE) {<br> // 处理DB失败<br>} else {<br> // 事务成功后再执行外部通知<br> $this->send_success_msg($order_data);<br>}``` |
| 🔴 严重 | `refund_by_notify` 方法 | **SQL 注入漏洞**:`$log_where = '_relation_id="' . $order_data['_id'] . '" and ...'` 直接拼接字符串传入 `up()` 方法。若 `_id` 未严格校验,攻击者可构造恶意输入执行任意 SQL。 | 废弃字符串拼接,全面使用查询构造器或参数绑定。 | ```php<br>$this->db->where('_relation_id', $order_data['_id'])<br> ->where('_status', 1)<br> ->where_in('_type', [5, 13])<br> ->update('pay_log_table', $update_data);``` |
| 🟠 警告 | `refund_by_notify` / `check_notify` | **浮点数精度丢失**:金额计算直接使用 `float` 乘除(如 `$total_amount * 100`),在 PHP 中极易产生 `0.000000001` 级误差,导致退款金额对账失败。 | 财务计算统一转为“分”(整数)处理,或使用 `bcmath` 扩展函数。 | ```php<br>// 使用 bcmath 保证精度<br>$total_fee = bcmul($total_amount, '100', 0);<br>$refund_fee = bcmul($can_refund_amount, '100', 0);``` |
| 🟠 警告 | 文件顶部 | **框架规范违规**:`$CI = &get_instance();` 定义在类外部。CI/类CI框架中,全局获取实例应在类方法内部按需调用,否则可能在自动加载前引发 `Fatal Error`。 | 删除顶部代码,在类内部方法中按需 `$CI =& get_instance();`,或使用 `$this->load->config()` 替代。 | ```php<br>class Ahead_book_order_model extends Simple_model {<br> public function some_method() {<br> $CI =& get_instance();<br> $CI->config->load('wx', TRUE);<br> }<br>}``` |
| 🟠 警告 | `get_list` 方法 | **N+1 查询隐患**:虽使用 `$merchant_business_model` 局部缓存,但循环内仍可能触发多次 DB 查询。若订单列表跨多个商家,性能会显著下降。 | 提取所有 `merchant_id` 使用 `where_in` 批量查询,或在 Service 层统一组装数据。 | ```php<br>$merchant_ids = array_column($order_info, 'merchant_id');<br>$merchants = $this->ahead_merchant_model->get_many(['_id' => $merchant_ids], '_id,_business_model');<br>// 转为 key-value 映射后循环赋值``` |
| 🟡 建议 | 全文件 | **魔法数字与硬编码泛滥**:状态码 `-1, 1, 2, 3, 4, 5, 14, 56, 58, 99` 直接散落在代码中,可读性差且后期维护极易出错。 | 在类顶部定义常量枚举,如 `const STATUS_PENDING = -1; const STATUS_PAID = 1;`。 | ```php<br>class Ahead_book_order_model extends Simple_model {<br> const STATUS_PENDING = -1;<br> const STATUS_PAID = 1;<br> // ...<br>}``` |
| 🟡 建议 | `check_notify`, `refund_by_notify`, `create_community_shop_book_order` | **违反单一职责原则 (SRP)**:单个方法超过 150~200 行,混合了参数校验、库存扣减、事务控制、第三方退款、日志记录、消息推送。 | 按业务域拆分为独立服务类:`OrderValidator`、`InventoryService`、`RefundProcessor`、`NotificationDispatcher`。模型仅保留数据访问层逻辑。 | *(架构级建议,无需具体代码)* |
| 🟡 建议 | 全文件 | **代码规范不统一**:数组语法混用 `array()` 与 `[]`;日志函数名不一致 (`doLog` vs `do_log`);存在大量注释掉的死代码。 | 统一使用短数组语法 `[]`;统一日志函数命名;清理无用注释代码;严格遵循 PSR-12。 | *(使用 PHP-CS-Fixer 或 IDE 格式化即可)* |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复事务边界**:立即将 `check_notify` 中的 `$this->db->trans_complete()` 移至所有数据库操作结束后,确保外部 API 调用不在事务块内。若外部调用失败,不应影响已提交的支付状态,应记录日志并走补偿机制。
2. **消除 SQL 注入**:全局搜索 `$this->...->up($log_up, $log_where)` 及类似字符串拼接查询,全部替换为 CI Query Builder 或预处理语句。
3. **金额精度改造**:所有涉及支付、退款、分账的金额计算,强制使用 `bcmul`/`bcadd` 或统一转为整数(分)运算,避免财务对账差异。
### 🛠 后续重构与优化方向
1. **架构分层**:当前 Model 承担了 Controller/Service 的职责。建议引入 `Service` 层处理业务编排(如支付回调流程、退款流程),Model 仅负责 `CRUD` 与基础查询。
2. **异步化改造**:支付成功后的微信模板消息、短信通知、VIP 积分回调等耗时操作,应通过消息队列(如 Redis Queue / RabbitMQ)异步执行,确保支付回调接口在 `2s` 内返回,避免被支付平台判定超时并重复回调。
3. **常量与配置管理**:将散落的魔法数字、短信模板ID、微信配置等抽离至配置文件或常量类,提升可维护性。
4. **代码截断说明**:您提供的代码在 `if ($this->tuangou->consume_check_time == '1') {` 处被截断。若该分支涉及团购券核销或退款逻辑,请补充完整代码以便进行针对性审查。
> 💡 **框架适配提示**:代码结构高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请确认其事务管理器(`trans_start/complete`)与 CI3 行为是否一致。若存在差异,请以官方文档的事务生命周期为准。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779271799
|
1779271799
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
268
|
21
|
57
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `bbb443cea ## 自动代码审查报告
**分支**: pay-260519
**提交**: `bbb443cead2db3ca65e1002c021bb1dd8de0475a`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 13:21:15
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了多业务场景下的营收明细记录功能,业务分支覆盖较全,但存在严重的架构反模式(如模型中使用 `exit()`、全局实例化、数据库连接切换缺乏异常保护)。性能层面存在明显的 N+1 查询与循环内频繁切换连接的问题。代码规范与类型安全性有待提升。
- **风险等级**:🔴 高(存在流程中断、连接状态污染及潜在的性能雪崩风险)
> 📌 **框架说明**:根据目录结构 (`system/`, `application/`) 及 `get_instance()` 用法,推断该项目基于 **CodeIgniter 3** 架构(或深度定制版)。以下审查基于 CI3 最佳实践与通用 PHP 规范。若 `phpci` 为内部定制框架,请结合其官方生命周期文档调整。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `update_room_info` 方法内 | 模型中使用 `exit()` 终止脚本执行。在 Web 请求或异步任务中会直接中断响应流,破坏 MVC 分层原则,且无法被上层捕获处理。 | 移除 `exit()`,改为抛出异常或返回结构化错误数组。由 Controller/Service 层统一处理错误响应。 | `if ($merchant_id <= 0) { throw new \InvalidArgumentException('商家ID无效'); }` |
| 🔴 严重 | `_add_log` / `update_room_info` 中的 `enforce_con_db()` | 数据库连接切换 (`enforce_con_db()`) 与恢复 (`enforce_con_db(2)`) 之间无异常保护。若中间发生 SQL 错误或 PHP 异常,连接将停留在错误状态,污染后续请求。 | 使用 `try...finally` 确保无论成功或失败,连接状态必定恢复。 | `try { $this->enforce_con_db(); $this->insert($insert); } finally { $this->enforce_con_db(2); }` |
| 🔴 严重 | 文件顶部 (第2行) | `$CI = &get_instance();` 在类外部全局执行。每次 `require/include` 该文件都会实例化一次,浪费资源且可能引发不可预知的状态覆盖。 | 删除文件顶部代码。在类方法内部使用 `$this->load` 或 `$CI =& get_instance()`(仅限 CI3 兼容场景),推荐优先使用 `$this`。 | 直接删除顶部两行,改用 `$this->load->model()` 或构造函数加载。 |
| 🟠 警告 | `_add_log` / `add_by_order` 等 | `in_array()` 与数组键比对未开启严格模式。PHP 弱类型特性可能导致 `'1' == 1` 误判,引发业务逻辑错乱。 | 所有 `in_array()` 添加第三个参数 `true`;常量数组键建议统一使用整型或字符串,比对时保持类型一致。 | `in_array($insert['_pay_platform'], $this->revenues_pay_platform_arr, true)` |
| 🟠 警告 | `update_room_info` 循环体 | `foreach` 内部频繁调用 `enforce_con_db()`、`load->model()` 及 `update()`。单次处理 100 条数据将产生数百次 DB 切换与模型加载,极易导致超时或连接池耗尽。 | 将 DB 切换移至循环外;模型加载移至构造函数或按需缓存;批量更新替代逐条更新。 | 见下方重构建议 |
| 🟠 警告 | 多处 `$this->load->model()` | 同一模型在多个方法中重复加载。CI 框架虽会缓存,但重复调用仍增加解析开销,且不利于依赖管理。 | 在 `__construct()` 中统一加载,或使用懒加载+静态缓存机制。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_yc_merchant_model'); ... }` |
| 🟡 建议 | 全局类与方法命名 | 类名 `Jh_community_shop_revenues_detail_model` 与方法名不符合 PSR-12 规范(应为大驼峰 `JhCommunityShopRevenuesDetailModel`,方法小驼峰)。 | 遵循 PSR-12 命名规范。若受历史包袱限制,至少保证新增方法使用驼峰命名,并添加 `@deprecated` 标记旧方法。 | `class JhCommunityShopRevenuesDetailModel extends Report_model` |
| 🟡 建议 | `get_record_order_data` 末尾 | `$room_info` 变量在 `if (!empty($order_data))` 块内定义,若条件不满足则未初始化。虽使用 `?? []` 兜底,但会触发 PHP Notice。 | 方法开头显式初始化 `$room_info = [];`,提升可读性与静态分析兼容性。 | `$room_info = []; if (!empty($order_data)) { $room_info = $this->get_room_info_by_order($order_data); } return $room_info;` |
| 🟡 建议 | `del_by_order` / `get_duplicate_order` | 硬编码 `_order_type => 4` 且无注释说明。后续维护者难以理解为何只操作特定类型,易引发误删或漏查。 | 将硬编码值提取为类常量,或作为参数传入,并补充业务注释。 | `const TYPE_SCAN_OPEN_ROOM = 4; // 扫码开房` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **移除模型中的 `exit()`**:立即替换为异常抛出或错误码返回,确保业务流可被上层捕获与降级。
2. **修复数据库连接切换逻辑**:所有涉及 `enforce_con_db()` 的代码必须包裹在 `try...finally` 中,防止异常导致连接状态泄漏。
3. **消除文件级 `get_instance()`**:删除顶部全局调用,改为在类内部按需加载或使用 `$this` 上下文。
### 🛠 后续重构与优化方向
1. **性能批量处理**:
`update_room_info` 方法应改为“批量查询 -> 内存组装 -> 批量更新”模式。示例:
```php
// 优化后伪代码
$this->enforce_con_db();
try {
$data = $this->select($where, '*', '_id asc', 1, 100);
if (empty($data)) return ['status' => 'Finish', 'last_id' => $last_id];
$batchUpdate = [];
foreach ($data as $v) {
$roomInfo = $this->get_record_order_data($v);
if ($roomInfo) {
$batchUpdate[] = ['_id' => $v['_id'], 'data' => $roomInfo];
}
$last_id = $v['_id'];
}
// 假设框架支持批量更新,否则可分批执行
$this->update_batch($batchUpdate);
} finally {
$this->enforce_con_db(2);
}
return ['status' => 'Continue', 'last_id' => $last_id];
```
2. **类型安全与常量管理**:
- 将 `ORDER_TYPE` 的键改为整型 `1 => '在线预订'`,并在所有比对处使用严格类型 `===` 或 `in_array(..., true)`。
- 支付方式数组 `$revenues_pay_platform_arr` 建议转为整型数组或使用 `array_flip()` 提升 `isset()` 查询性能。
3. **依赖注入/模型预加载**:
将频繁加载的模型(如 `ahead_yc_merchant_model`, `ahead_family_servers_model` 等)移至构造函数中初始化,减少运行时 I/O 开销。
4. **框架适配确认**:
若 `phpci` 为 CI4 或自研框架,请确认 `enforce_con_db()` 是否为官方推荐的多库切换方式。CI4 推荐使用 `$this->db->setDatabase()` 或配置多连接组,避免手动切换底层连接。
> 💡 **提示**:建议在合并前补充单元测试覆盖 `_add_log` 的边界条件(如金额≤0、表不存在、退款单号拼接等),并使用静态分析工具(如 PHPStan/Psalm)检查类型一致性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779340875
|
1779340875
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
274
|
21
|
59
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `5d31b5604 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `5d31b56044a16cb5b46fa6ec83c79701df0309ec`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 15:47:23
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码整体实现了预订、支付、退款及营收流水的核心业务逻辑,具备一定的事务意识与异常捕获机制。但存在**资金状态与第三方API调用顺序倒置**的严重逻辑缺陷,模型中频繁动态加载组件导致性能损耗,且大量硬编码魔法数字与不规范的日志/中断处理降低了可维护性。部分核心方法过长,违反单一职责原则。
- **风险等级**:🔴 高(涉及资金流转状态不一致、潜在数据脏写、模型层强制中断流程)
> 📌 **框架说明**:基于提供的目录结构(`system/`、`application/`)及 `$CI->load->model()` 语法,推测该项目基于 **CodeIgniter 3.x** 架构或深度定制版(`phpci`)。以下审查建议基于 CI3 最佳实践与通用 PHP 规范,若为自研框架请对照官方文档调整。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_book_order_change_pay_log_model.php` / `refund()` | **状态提前更新导致资金不一致**:在调用微信/银联退款 API 前,已执行 `$this->update(['_status' => 4], ...)`。若第三方 API 返回失败或网络超时,数据库状态已变更为“退款完成”,但资金未退回,造成严重账务差异。 | 将状态更新移至 API 调用成功之后;或使用数据库事务包裹状态更新,API 失败时回滚。 | `// 1. 调用 API<br>$res = WxPayApi::refund($input);<br>if ($res['result_code'] !== 'SUCCESS') { return ['status'=>false, 'msg'=>...]; }<br>// 2. API 成功后再更新状态<br>$this->update(['_status' => 4], ['_id' => $data['_id']]);` |
| 🔴 严重 | `Ahead_book_order_model.php` / `refund_by_notify()` | **退款后置操作缺乏事务保护**:支付网关退款成功后,执行了 `ahead_book_order_refund_model`、`ahead_pay_log_model`、`jh_community_shop_revenues_detail_model` 等多表更新。若中途报错或超时,将产生部分成功、部分失败的脏数据。 | 使用 CI3 事务机制包裹 API 成功后的所有数据库写操作。 | `$this->db->trans_start();<br>// ... 执行所有 update/insert ...<br>$this->db->trans_complete();<br>if ($this->db->trans_status() === FALSE) { $this->db->trans_rollback(); return ['status'=>false, 'msg'=>'数据更新异常']; }` |
| 🟠 警告 | 全局多处 | **浮点数直接参与金额计算**:`$data['_actual_pay'] * 100` 在 PHP 中可能因 IEEE 754 精度问题产生 `100.00000000000001` 或 `99.99999999999999`,导致支付/退款金额差 1 分。 | 金额计算统一转为“分”整数处理,或使用 `bcmul()` / `round()` 确保精度。 | `$total_fee = (int)round($data['_actual_pay'] * 100, 0);` |
| 🟠 警告 | `Jh_community_shop_revenues_detail_model.php` / `update_room_info()` 等 | **模型层使用 `exit()` 中断流程**:直接调用 `exit()` 会破坏框架生命周期,导致无法捕获异常、无法返回标准 JSON 响应,且极难进行单元测试。 | 改为抛出异常或返回状态数组,交由控制器统一处理错误响应。 | `if (!$this->check_table_exist(false)) { throw new RuntimeException('商家分表不存在'); }` |
| 🟠 警告 | 多个 Model 文件 | **方法内频繁动态加载模型**:如 `$this->load->model('ahead_yc_shop_model')` 散落在业务方法中,每次调用都会触发文件包含与实例化,增加 I/O 与内存开销。 | 将依赖模型统一移至 `__construct()` 中加载,或配置 CI 自动加载。 | `public function __construct() { parent::__construct(); $this->load->model(['ahead_yc_shop_model', 'ahead_chinaums_set_model']); }` |
| 🟡 建议 | `Ahead_book_order_model.php` / `refund_by_notify()` | **潜在 SQL 注入风险**:`$log_up = '_status=4,_refund_amount=_actual_pay'; $this->ahead_pay_log_model->up($log_up, $log_where);` 若 `up()` 为自定义方法且直接拼接 SQL,未使用 Query Builder 或参数绑定,存在注入隐患。 | 优先使用 CI 的 `$this->db->set()` 与 `$this->db->update()`,或确保自定义 `up()` 内部严格转义。 | `$this->db->set('_status', 4);<br>$this->db->set('_refund_amount', '_actual_pay', FALSE);<br>$this->db->where($log_where);<br>$this->db->update('table_name');` |
| 🟡 建议 | 全局 | **魔法数字泛滥**:`1, 3, 4, 8, 14` 等状态码、平台码硬编码在逻辑中,可读性差且后期维护极易出错。 | 提取为类常量或独立配置文件。 | `const PAY_PLATFORM_WX = 1; const PAY_PLATFORM_VIP = 3; const STATUS_REFUNDED = 4;` |
| 🟡 建议 | 全局 | **日志函数命名不一致 & 敏感信息泄露**:混用 `doLog` 与 `do_log`;且 `doLog(var_export($res, true), ...)` 可能将包含 `sign`、`access_token` 的完整 API 响应写入日志。 | 统一日志函数名;记录前过滤敏感字段。 | `do_log($this->filter_sensitive_data($res), 'wx_refund');` |
| 🟡 建议 | `Ahead_book_order_model.php` (末尾) | **代码片段截断**:`if ($this->tuangou->con` 未闭合,无法评估完整逻辑与潜在缺陷。 | 请补充完整代码以便进行闭环审查。 | N/A |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复退款状态时序问题**:立即调整 `Ahead_book_order_change_pay_log_model::refund()` 的执行顺序,确保**第三方退款 API 成功返回后再更新本地数据库状态**。这是当前最高优先级的资金安全漏洞。
2. **补全事务边界**:在 `Ahead_book_order_model::refund_by_notify()` 中,将支付网关调用后的所有关联表更新(退款日志、流水记录、营收明细、团购核销撤销等)包裹在 `$this->db->trans_start()` 与 `$this->db->trans_complete()` 中,失败时自动回滚。
3. **移除模型层 `exit()`**:将 `Jh_community_shop_revenues_detail_model` 中的 `exit()` 替换为异常抛出或状态返回,确保 Web 请求能正常返回 HTTP 响应码与业务提示。
### 🛠 后续重构与优化方向
- **架构解耦与单一职责**:当前 `refund()`、`refund_by_notify()`、`send_success_msg()` 等方法均超过 150 行,嵌套过深。建议按业务域拆分:
- 将支付网关调用封装为独立的 `PaymentGatewayService`。
- 将消息推送(微信模板、短信)抽离为 `NotificationService`。
- Model 层仅保留数据读写与基础校验,复杂编排逻辑下沉至 Service 层。
- **金额计算规范化**:全局统一金额存储与计算单位(建议底层统一使用“分”整数,展示层再格式化)。废弃 `float` 直接运算,引入 `bcmath` 扩展或封装 `Money` 值对象。
- **依赖注入与自动加载**:利用 CI3 的 `config/autoload.php` 或模型构造函数预加载高频依赖模型,消除运行时动态加载的性能损耗。
- **常量与配置集中化**:建立 `config/payment.php` 与 `config/order_status.php`,将平台标识、状态码、超时阈值等魔法数字集中管理,提升代码可读性与多环境适配能力。
- **日志安全规范**:制定日志脱敏规范,禁止直接 `var_export` 第三方 API 全量响应。关键资金操作日志需包含 `trace_id`、操作人、前后状态快照,便于审计与对账。
> 💡 **提示**:若 `phpci` 为内部定制框架,请重点核对框架对数据库事务的自动提交机制、自定义 `up()` 方法的底层实现是否支持预处理语句,以及全局异常处理器是否已覆盖模型层抛出的异常。建议补充完整代码后,可进一步进行静态扫描(如 PHPStan / Psalm)与支付沙箱联调验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779349643
|
1779349643
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
276
|
21
|
60
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `e5c5ca71d ## 自动代码审查报告
**分支**: pay-260519
**提交**: `e5c5ca71d6b9fc7e2037ae7b3165e84bab8d83c1`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 15:49:02
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了预订、支付回调、退款、消息推送等核心交易链路,业务逻辑较为完整。但存在**严重的事务管理缺陷、SQL注入隐患、支付回调同步阻塞**等高风险问题。代码结构冗长,违反单一职责原则,且存在多处框架使用反模式与性能瓶颈。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `refund_by_notify` ~L230 | **SQL注入风险**:`$log_where = '_relation_id="' . $order_data['_id'] . '" ...'` 直接拼接变量到SQL条件中,未做转义或参数绑定。若 `_id` 被恶意构造,将导致注入。 | 废弃字符串拼接,全面改用 CI 查询构造器(Query Builder)或 `$this->db->escape()`。 | `$this->db->where('_relation_id', $order_data['_id'])<br>->where('_status', 1)<br>->where_in('_type', [5, 13])<br>->update('pay_log_table', $update_data);` |
| 🔴 严重 | `check_notify` ~L60-115 | **事务管理混乱**:混用 `trans_start()`、手动 `trans_rollback()` 与 `trans_complete()`。`trans_complete()` 被放在 `else` 分支中,若前置逻辑失败直接 `return`,事务未正确关闭,极易导致数据库连接泄漏或死锁。 | 统一使用 `trans_begin()` / `trans_commit()` / `trans_rollback()` 显式控制,或依赖 CI 的 `trans_start()` / `trans_complete()` 自动回滚机制,移除手动回滚。 | `$this->db->trans_begin();<br>try { /* 业务逻辑 */ $this->db->trans_commit(); }<br>catch (\Exception $e) { $this->db->trans_rollback(); /* 记录日志 */ }` |
| 🟠 警告 | `check_notify` ~L100-120 | **支付回调同步阻塞**:在支付成功回调中同步执行微信模板消息、短信发送、外部API调用。极易导致接口响应超时,支付平台会触发重试机制,引发重复扣款或状态覆盖。 | 将非核心链路(消息推送、日志、第三方同步)剥离,通过消息队列(Redis/RabbitMQ)或异步任务执行。回调仅更新核心状态并立即返回 `SUCCESS`。 | `// 回调末尾<br>Queue::push(new SendOrderSuccessJob($order_data));<br>return ['status' => true, 'msg' => 'success'];` |
| 🟠 警告 | `get_list` ~L280-295 | **N+1 查询性能瓶颈**:在 `foreach` 循环中调用 `$this->ahead_merchant_model->get_one()`。当列表数据量大时,会产生大量冗余查询,严重拖慢接口响应。 | 提取所有 `merchant_id`,使用 `where_in` 批量查询,构建映射数组后在循环中赋值。 | `$ids = array_column($order_info, 'merchant_id');<br>$merchants = $this->ahead_merchant_model->get_many(['_id' => $ids]);<br>$map = array_column($merchants, '_business_model', '_id');` |
| 🟠 警告 | 文件顶部 L1-3 | **框架反模式**:在类外部直接调用 `$CI = &get_instance();` 并加载模型。该代码会在每次文件被 `include` 时执行,破坏框架生命周期与单例模式。 | 移除顶部全局代码,将依赖模型加载移至 `__construct()` 或按需延迟加载。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model('Simple_model');<br>}` |
| 🟡 建议 | `create_book_order` ~L240 | **浮点数精度丢失**:金额计算使用普通浮点运算 `($price * $discount_rate) / 100`。金融场景下浮点数存在精度丢失风险(如 `0.1+0.2=0.30000000000000004`)。 | 财务计算统一使用 `BCMath` 扩展,或统一以“分”为单位进行整数运算,展示时再转换。 | `$actual_pay = bcdiv(bcmul($price, $discount_rate, 2), 100, 2);` |
| 🟡 建议 | 全局多处 | **魔法数字泛滥**:大量硬编码状态码(`-1, 1, 2, 3, 14, 56, 99` 等),可读性差,后期维护极易出错。 | 在类顶部定义语义化常量,统一引用。 | `const STATUS_PENDING = -1; const STATUS_PAID = 1;`<br>`if ($status === self::STATUS_PAID) { ... }` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复 SQL 注入漏洞**:立即替换 `refund_by_notify` 中的字符串拼接 SQL 条件,全面启用查询构造器或参数绑定。
2. **重构事务控制流**:清理 `check_notify` 中的事务逻辑,确保 `begin/commit/rollback` 成对出现,避免连接池耗尽与数据不一致。
3. **解耦支付回调阻塞**:将 `send_success_msg` 及短信、微信推送逻辑移出同步回调链路,改为异步队列处理。这是保障支付系统稳定性的核心。
4. **消除 N+1 查询**:优化 `get_list` 方法,采用批量查询替代循环单查。
### 🛠 后续重构与优化方向
- **拆分巨型方法**:`check_notify`、`refund_by_notify`、`send_success_msg` 均超过 150 行,严重违反单一职责原则(SRP)。建议按业务域拆分为 `PaymentCallbackService`、`RefundService`、`NotificationService` 等独立服务类,Model 仅负责数据持久化。
- **统一金额处理规范**:引入 `Money` 值对象或全局 `bcmath` 封装函数,杜绝浮点数直接参与交易计算。
- **规范框架使用**:当前代码结构高度契合 **CodeIgniter 3** 架构。若 `phpci` 为基于 CI 的定制框架,请严格遵循其生命周期规范(如模型依赖注入、配置项读取 `$this->config->item()` 替代全局常量)。
- **补充单元测试**:针对支付回调、退款金额计算、事务回滚等核心链路编写 PHPUnit 测试用例,覆盖正常流、异常流与边界条件。
> ⚠️ **局限性说明**:您提供的代码片段在 `if ($this->tuangou->verify_token) {` 处被截断,未能包含完整的方法实现与后续逻辑。本次审查仅基于已提供部分进行深度分析。若后续补充完整代码,可进一步评估团购核销、预购单退款等链路的完整性与安全性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779349743
|
1779349743
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
277
|
21
|
61
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `a1f205967 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `a1f205967928b1d283141eb90b17072f62877ee3`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 15:56:15
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码具备完整的业务闭环(支付回调、退款、下单、消息推送),但存在明显的架构臃肿问题。核心方法(如 `refund_by_notify`)承担职责过多,混合了支付网关交互、数据库事务、日志记录与第三方通知。部分逻辑存在并发安全隐患与 SQL 拼接风险,且未充分利用现代 PHP 特性与框架最佳实践。
- **风险等级**:🔴 高(存在 SQL 注入隐患、库存超卖风险、事务状态不一致可能)
> 📌 **框架说明**:根据目录结构、`$CI = &get_instance()`、`$this->load->model()` 及 `$this->db->trans_start()` 等特征,判定为 **CodeIgniter 3.x** 架构。若为内部定制框架 `phpci`,请对照官方文档调整组件调用方式。
> ⚠️ **局限性说明**:末尾 `create_community_shop_book_order` 方法代码被截断,本次审查仅基于已提供片段进行静态分析。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `refund_by_notify` ~L145 | **SQL 注入风险**:使用字符串拼接构造 WHERE 条件 `$log_where = '_relation_id="' . $order_data['_id'] . '" ...'`,若传入数据未严格过滤,将导致注入。 | 废弃字符串拼接,统一使用 CI 查询构造器或参数绑定。 | `$this->db->where('_relation_id', $order_data['_id'])<br>->where('_status', 1)<br>->where_in('_type', [5, 13])<br>->update('pay_log', $update_data);` |
| 🔴 严重 | `check_notify` ~L50-80 | **并发超卖风险**:`check_remain_sale_num` 校验库存后直接执行后续扣减,未加行级锁或分布式锁,高并发下极易超卖。 | 引入数据库行级锁 (`SELECT ... FOR UPDATE`) 或 Redis 原子操作保障库存扣减一致性。 | `$this->db->where('_id', $id)->get(..., NULL, NULL, TRUE); // CI3 支持 lock('FOR UPDATE')` |
| 🔴 严重 | 文件顶部 L7-8 | **全局实例化隐患**:`$CI = &get_instance();` 在类外部执行。若文件被提前 `include` 或 CLI 环境加载,将触发致命错误。 | 移除顶部代码。Model 内部应直接使用 `$this->load` 或 `$this->config`。 | 删除顶部两行,内部改用 `$this->load->model()` 或 `$this->config->item()` |
| 🟠 警告 | `check_notify` & `refund_by_notify` | **事务控制不规范**:`try-catch` 中手动 `trans_rollback()` 与 CI 自动回滚机制混用,且 `trans_complete()` 仅在 `else` 分支调用,易导致事务状态残留或重复回滚报错。 | 依赖 CI 的 `trans_start()` / `trans_complete()` 自动机制,移除显式 `trans_rollback()`;失败时直接 `return`,CI 会在脚本结束时自动回滚。 | 移除 `try` 内的 `$this->db->trans_rollback();`,统一在方法末尾调用 `$this->db->trans_complete();` |
| 🟠 警告 | `get_list` ~L200 | **循环查询性能损耗**:虽做了内存缓存 `$merchant_business_model`,但首次仍为多次 `get_one` 查询。数据量大时拖慢响应。 | 提取所有 `merchant_id`,使用 `where_in` 批量查询后映射。 | `$ids = array_column($order_info, 'merchant_id');<br>$merchants = $this->ahead_merchant_model->where_in('_id', $ids)->get()->result_array();` |
| 🟠 警告 | 全局多处 | **重复加载模型/配置**:方法内部频繁 `$this->load->model()`,降低可读性且违反依赖注入原则。CI 虽会缓存,但增加解析开销。 | 在 `__construct()` 中集中加载高频模型,或采用 Service 层解耦。 | `public function __construct() { parent::__construct(); $this->load->model(['ahead_merchant_model', 'ahead_vip_model']); }` |
| 🟡 建议 | 全局 | **命名规范与 PSR-12 冲突**:方法名使用 `snake_case`,数组混用 `array()` 与 `[]`,缺少 PHP 7+ 类型声明。 | 遵循 PSR-12,统一使用 `camelCase`,添加类型提示,清理历史注释代码。 | `public function checkNotify(string $orderId, string $transactionId = ''): array` |
| 🟡 建议 | `check_notify` ~L115 | **异常日志泄露敏感信息**:`json_encode($e->getTrace(), 256)` 记录完整堆栈,可能暴露服务器路径、配置或用户隐私。 | 仅记录异常消息、行号及脱敏后的业务主键。 | `doLog('支付失败: ' . $e->getMessage() . ' | Order: ' . $order_id, 'book_order');` |
| 🟡 建议 | `refund_by_notify` | **单一职责违背 (SRP)**:退款逻辑超 200 行,混合支付网关、DB 更新、财务流水、消息推送。维护成本极高。 | 拆分为独立 Service:`RefundService`、`PaymentGatewayService`、`NotificationService`。Model 仅负责数据持久化。 | 将退款核心流程抽离至 `app/services/RefundService.php`,Model 仅暴露 `updateStatus()` 等方法。 |
---
## 3. 总结与行动建议
### 🔑 优先修复项(P0/P1)
1. **修复 SQL 注入漏洞**:立即替换 `refund_by_notify` 中的字符串拼接 WHERE 条件,全面改用 CI Query Builder 或预处理语句。
2. **解决库存超卖问题**:在 `check_notify` 的库存校验环节引入 `SELECT ... FOR UPDATE` 行级锁,或迁移至 Redis `DECR` + Lua 脚本实现原子扣减。
3. **规范事务生命周期**:清理 `try-catch` 中冗余的 `trans_rollback()`,严格遵循 `trans_start() -> 业务逻辑 -> trans_complete()` 模式,避免事务状态污染。
### 🛠 后续重构与优化方向
1. **架构分层解耦**:当前 Model 承担了 Controller 和 Service 的职责。建议引入 Service 层处理复杂业务流(如支付回调、退款、消息推送),Model 仅保留 CRUD 与基础查询。
2. **统一编码规范**:
- 启用 `declare(strict_types=1);`
- 方法名统一转为 `camelCase`(如 `checkNotify`、`refundByNotify`)
- 清理 `//add by nan 18.1.22` 等历史注释及大段注释代码,必要时提交至 Git 历史保留。
3. **性能与可观测性提升**:
- 将循环内的单条查询改为批量 `WHERE IN` 查询。
- 关键业务节点(支付回调、退款发起)增加结构化日志(如 JSON 格式),便于 ELK 等日志系统检索与告警。
- 对 `send_success_msg` 中的微信模板消息与短信发送改为**异步队列**处理,避免阻塞主支付回调流程。
> 💡 **提示**:若 `phpci` 为内部定制框架且与 CI3 行为存在差异(如事务自动回滚机制、查询构造器语法),请以官方文档为准调整上述建议。代码末尾截断部分建议补充完整后再次提交审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779350176
|
1779350176
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
278
|
21
|
62
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `36eddc8c3 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `36eddc8c34290a3af1654792d5b7540e0951706b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 15:57:47
---
## 1. 审查摘要
- **代码质量评分**:4/10 分
- **总体评价**:代码实现了预订变更差价退款的核心流程,但存在严重的架构与业务逻辑缺陷。资金操作缺乏事务保护、状态更新与外部调用顺序颠倒、框架生命周期使用错误,且方法冗长、硬编码严重。需进行结构性重构后方可投入生产环境。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 第 2-3 行 | `$CI = &get_instance();` 与 `$CI->load->model()` 在类外部调用。框架未初始化完成时调用会导致 Fatal Error,且破坏 MVC 生命周期。 | 移除外部代码,将模型加载移至类构造函数 `__construct()` 中,或直接依赖框架自动加载。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_book_order_model'); }` |
| 🔴 严重 | `refund()` 方法 | **先更新状态后调用支付接口**。`_status` 被直接改为 `4`,若后续微信/银联接口失败,方法直接返回 `false`,但数据库状态已变更,导致账务状态不一致且无法自动重试。 | 引入数据库事务。仅在外部接口返回成功后,再执行状态更新;或先更新为“退款中”状态,成功后改为“已退款”,失败则回滚或标记“退款失败”。 | `$this->db->trans_start(); $this->update(...); $api_res = $this->callRefundApi(...); if ($api_res['success']) { $this->db->trans_complete(); } else { $this->db->trans_rollback(); }` |
| 🔴 严重 | `refund()` 方法 | **核心资金操作未使用数据库事务**。退款涉及状态更新、第三方接口调用、社区分账记录写入,任一环节失败都会导致数据不一致。 | 使用 CI 的 `$this->db->trans_start()` / `$this->db->trans_complete()` 包裹整个退款流程,确保原子性。 | 见上条示例 |
| 🟠 警告 | 第 45, 58, 85 行 | 动态加载模型 (`$this->load->model()`) 散落在业务方法中。每次调用都会重复解析、实例化,增加内存与 CPU 开销。 | 将依赖模型统一在 `__construct()` 中加载,或配置 `autoload.php`。 | `public function __construct() { parent::__construct(); $this->load->model(['ahead_yc_shop_model', 'ahead_chinaums_set_model', 'ahead_shop_model']); }` |
| 🟠 警告 | 全文多处 | 大量魔法数字硬编码(如 `1, 3, 4, 8, [5,7,8,9,10]`),业务含义不明,后期维护极易出错。 | 提取为类常量或配置项,使用语义化命名。 | `const PAY_PLATFORM_WX = 1; const PAY_SCENE_HAIZAN_APP = 8; if ($data['_pay_platform'] === self::PAY_PLATFORM_WX) { ... }` |
| 🟠 警告 | 第 53, 71, 102 行 | `doLog(var_export($res, true), ...)` 记录完整 API 响应。可能泄露商户密钥、交易流水号等敏感信息,且 `var_export` 序列化大数组性能较差。 | 仅记录关键字段(状态码、错误信息、流水号),使用 `json_encode` 替代 `var_export`,并对敏感字段脱敏。 | `doLog(json_encode(['code'=>$res['result_code'],'msg'=>$res['err_code_des']]), 'changeBookOrderWxRefund');` |
| 🟡 建议 | `refund()` 方法 | 方法体超 150 行,嵌套层级达 5 层,违反单一职责原则,可读性与可测试性极差。 | 采用**策略模式**或**工厂模式**拆分支付渠道逻辑。将 `WxPay`、`ChinaUMS`、`VIP` 退款逻辑抽离为独立 Service 类。 | `class RefundStrategyFactory { public static function make($platform) { return match($platform) { 1 => new WxRefundService(), 3 => new VipRefundService(), }; } }` |
| 🟡 建议 | `add_data()`, `refund()` | 未对 `$params` / `$data` 进行类型校验与金额边界检查。直接参与计算与入库,存在精度丢失或负数退款风险。 | 增加输入校验,金额统一转为 `int`(分)或使用 `bcmath` 处理,拦截非法值。 | `if (!is_numeric($params['difference_price']) || $params['difference_price'] < 0) { throw new InvalidArgumentException('差价金额非法'); }` |
| 🟡 建议 | 全文 | 数组语法混用 `[]` 与 `array()`,缩进不一致,缺少 PHP 7+ 类型声明,不符合 PSR-12 规范。 | 统一使用短数组语法 `[]`,添加 `declare(strict_types=1);`,补充参数与返回值类型提示。 | `public function add_data(array $params): string|false { ... }` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **修复框架生命周期错误**:立即删除文件顶部的 `$CI = &get_instance();`,改为在类构造函数中加载依赖。
2. **引入数据库事务**:所有涉及资金状态变更的操作必须包裹在 `$this->db->trans_start()` 中,确保“状态更新-外部调用-分账记录”的原子性。
3. **修正状态更新时序**:严禁在调用第三方退款接口前将状态置为终态(`_status => 4`)。建议改为:`0(待退款) -> 1(退款中) -> 4(成功) / 5(失败)`。
### 🛠 后续重构与优化方向
1. **架构解耦**:当前 Model 承担了“数据访问 + 业务编排 + 第三方 SDK 调用 + 日志记录”多重职责。建议将支付渠道逻辑下沉至 `application/services/Payment/RefundService.php`,Model 仅保留纯 CRUD 操作。
2. **配置化管理**:将支付平台标识、支付场景、分账规则等硬编码迁移至 `application/config/payment.php`,通过配置项驱动业务分支。
3. **安全与健壮性**:
- 增加金额精度处理(建议全链路使用“分”为单位,避免浮点数计算)。
- 对第三方 API 响应增加超时控制与重试机制(如 Guzzle 或 CI 的 HTTP 库)。
- 日志脱敏,避免生产环境泄露敏感交易凭证。
4. **框架适配说明**:代码特征高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请确认其是否兼容 CI3 的 `get_instance()` 与 `load->model()` 机制。若为全新架构,建议全面替换为依赖注入(DI)容器管理依赖,以提升可测试性。
> 💡 **提示**:财务类代码的容错率极低。建议在重构完成后,补充单元测试(PHPUnit)覆盖正常退款、接口超时、金额异常、并发重复退款等边界场景,并接入灰度发布与资金对账监控。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779350267
|
1779350267
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
280
|
21
|
63
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `527b37c10 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `527b37c106b743b4e035cf0fe54af5fd99580d7c`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 16:51:28
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码实现了复杂的门店时段预订逻辑,涵盖了跨天、团购券、最低时长、清扫时间等多维度业务规则。但存在**静态缓存污染、对象状态意外修改、方法职责过重、框架上下文滥用**等典型问题。整体可维护性较低,边界条件与异常处理不够严谨。
- **风险等级**:🟠 中(存在数据串扰与状态污染隐患,高并发或复杂预订场景下易引发逻辑错乱)
> 📌 **注**:代码结构高度符合 `CodeIgniter 3` 规范(如 `get_instance()`、`$this->load->model()`)。若 `phpci` 为内部定制框架,请结合其官方文档调整生命周期与依赖管理。此外,**提交代码在末尾被截断**,以下审查基于已提供部分,未覆盖完整逻辑。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` 方法 | **静态缓存未区分参数**:`self::$book_days_info` 作为全局静态变量,首次赋值后直接返回,忽略后续传入的 `$merchant_id`、`$shop_id`、`$check_date` 等参数,导致多商户/多日期数据严重串扰。 | 移除静态缓存,或改用基于参数哈希的实例级缓存/Redis缓存。 | `// 错误:直接返回静态变量<br>if (!empty(self::$book_days_info)) return self::$book_days_info;<br><br>// 正确:使用参数键值缓存<br>$cache_key = md5(implode('_', func_get_args()));<br>if (isset($this->cache['book_days'][$cache_key])) return $this->cache['book_days'][$cache_key];` |
| 🔴 严重 | `get_book_days_info` 方法 | **意外修改实例状态**:`$this->book_days += 1;` 直接修改了类属性。若该方法被多次调用(如 `$add_day` 交替为 true/false),将导致后续所有计算基准错误。 | 使用局部变量进行计算,严禁在查询方法中修改类属性。 | `$calc_days = $add_day ? $this->book_days + 1 : $this->book_days;<br>for ($i = 0; $i < $calc_days; $i++) { ... }` |
| 🟠 警告 | `get_book_day_time_info` 方法 | **方法过长且职责混杂**:该方法超 300 行,混合了数据查询、时间切片、团购券校验、营业规则过滤、状态标记等逻辑,违反单一职责原则(SRP),极难测试与维护。 | 拆分为独立私有方法:`_fetch_booking_data()`、`_calculate_time_slots()`、`_apply_voucher_rules()`、`_filter_unavailable_times()`。 | 见下方重构建议 |
| 🟠 警告 | 多处(`set_shop_config`、`set_room_info` 等) | **滥用 `get_instance()` 且越权修改控制器上下文**:模型中频繁调用 `get_instance()`,且直接修改 `$CI->operational_scene`、`$CI->package_not_available_time` 等全局变量,破坏 MVC 分层,易引发请求间状态污染。 | 模型应仅负责数据与业务计算,上下文数据通过参数传入或返回值传出。移除冗余 `get_instance()`。 | `// 错误<br>$CI = &get_instance();<br>$CI->operational_scene = $room_operational_scene;<br><br>// 正确<br>return $room_operational_scene; // 由控制器接收并赋值` |
| 🟠 警告 | `get_book_day_time_info` 循环内 | **数组分块逻辑存在越界风险**:`array_chunk($v['time_range_arr'], $time_range_arr_count / 2)` 依赖偶数长度假设。若数组长度为奇数,后半段切片可能缺失或错位,导致后续 `array_intersect` 判断失效。 | 使用 `ceil()` 明确分界,或改用索引范围截取。 | `$mid = (int)ceil($count / 2);<br>$first_half = array_slice($arr, 0, $mid);<br>$last_half = array_slice($arr, $mid);` |
| 🟡 建议 | `_get_un_book_time` 及多处 | **`json_decode` 未做安全校验**:直接对数据库字段 `_time_info_new` 解码,若数据损坏或非 JSON 格式,将返回 `null`,后续 `foreach` 或数组访问会触发 `Warning`。 | 增加类型校验与默认值回退。 | `$raw = $row['_time_info_new'] ?? '[]';<br>$decoded = json_decode($raw, true);<br>$book_time_info = is_array($decoded) ? $decoded : [];` |
| 🟡 建议 | 类属性定义区 | **魔法数字/字符串泛滥**:大量硬编码如 `86400`、`3600`、`'1'`、`'-1'`、`'7'`,降低可读性且易引发维护错误。 | 提取为类常量或配置文件。 | `const SECONDS_PER_DAY = 86400;<br>const STATUS_AVAILABLE = '1';<br>const STATUS_UNAVAILABLE = '-1';` |
| 🟡 建议 | 构造函数 `__construct` | **依赖隐式加载且无异常处理**:`$this->load->library('Tuangou');` 未校验加载结果,若库不存在或 Redis 连接失败,后续 `$this->tuangou->...` 将触发致命错误。 | 增加加载校验与降级策略,或改用依赖注入。 | `if (!$this->load->is_loaded('tuangou')) {<br> $this->load->library('Tuangou');<br>}<br>if (method_exists($this->tuangou, 'get_voucher_info_from_redis')) {<br> $this->tuangou->get_voucher_info_from_redis();<br>}` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存串扰**:立即移除 `self::$book_days_info`、`self::$shop_data` 等静态缓存,或改为基于 `merchant_id + shop_id + date` 的实例级缓存数组。
2. **禁止方法内修改实例属性**:将 `$this->book_days += 1` 改为局部变量计算,确保对象状态纯净。
3. **清理控制器上下文污染**:移除模型中对 `$CI->xxx` 的赋值操作,改为通过方法参数传递或返回值暴露数据。
### 🛠 后续重构与优化方向
1. **方法拆分与职责收敛**:
- 将 `get_book_day_time_info` 拆分为:
- `prepareContext($params)`:加载门店配置、营业时间、团购券信息。
- `fetchBookingData($date)`:查询当日/前后日包厢占用数据。
- `generateTimeSlots($business_from, $business_end)`:生成基础时间片。
- `applyFilters($slots, $rules)`:依次应用最低时长、清扫时间、团购券、停用规则等过滤逻辑。
2. **引入现代 PHP 特性**:
- 添加类型声明(`declare(strict_types=1);`、参数类型、返回类型)。
- 使用 `DateTimeImmutable` 替代 `strtotime` + 字符串拼接,彻底规避时区与跨天计算隐患。
3. **性能优化**:
- 将重复的 `get_shop_setting` 调用合并为批量查询或引入配置缓存层。
- 对 `array_intersect`、`array_merge` 操作的大数组进行预过滤,避免在循环中重复计算。
4. **安全与健壮性**:
- 对 `$params` 输入进行严格类型校验(如 `filter_var`、`ctype_digit`)。
- 为 `json_decode`、`array_chunk`、`strtotime` 等易错函数添加防御性编程。
> 💡 **提示**:由于代码在 `_get_un_book_time` 方法末尾被截断,建议补充完整文件后再次进行边界条件与跨天逻辑的专项审查。若需针对特定业务规则(如团购券跨天校验、最低时长计算)进行深度推演,可提供对应测试用例以便精准验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779353488
|
1779353488
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
281
|
21
|
64
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `003261ac5 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `003261ac5a9231513a631299b1032fd0dcd3e8db`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 17:07:55
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的时段计算、团购券规则校验与多门店配置逻辑。整体业务意图清晰,但存在**静态缓存导致的数据串扰风险**、**方法严重超长**、**缺乏输入校验与类型约束**等问题。代码风格偏向传统 CI3 模式,现代 PHP 特性应用不足,可维护性与运行性能均有较大优化空间。
- **风险等级**:🔴 高(逻辑缺陷与潜在性能瓶颈可能引发线上客诉或超时)
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` (约第150行) | **静态缓存未区分参数**:`self::$book_days_info` 直接返回缓存,完全忽略传入的 `$merchant_id`、`$shop_id`、`$check_date` 等参数。在多商户/多门店并发请求下会导致严重的数据串扰。 | 移除静态缓存,或改用参数组合键缓存(如 `md5(implode('_', func_get_args()))`)。建议优先改为实例属性或依赖外部缓存服务(Redis)。 | `private static $cache = [];<br>$key = md5($merchant_id . '_' . $shop_id . '_' . $check_date . '_' . (int)$add_day);<br>if (isset(self::$cache[$key])) return self::$cache[$key];` |
| 🔴 严重 | 文件末尾 | **代码截断**:文件在 `_get_un_book_time` 方法中突然中断,缺少闭合括号、`return` 语句及后续逻辑。直接部署将引发 `ParseError` 致命错误。 | 补全完整代码。若为提交遗漏,请提供完整文件以便进行闭环审查。 | N/A |
| 🟠 警告 | `get_book_day_time_info` (约第200-450行) | **方法过长且嵌套过深**:单方法超 300 行,包含大量 `foreach`、`array_intersect`、`array_unique` 及条件分支。时间复杂度呈指数级增长,极易触发 PHP 最大执行时间限制。 | 严格遵循单一职责原则,拆分为:`calculateTimeSlots()`、`applyCouponRestrictions()`、`checkBusinessHours()`、`mergeUnavailableRanges()` 等独立方法。 | 见下方重构示例 |
| 🟠 警告 | 全局 `$params` 使用 | **缺乏输入校验**:直接信任 `$params['date']`、`$params['merchant_id']` 等外部输入。若底层 `Simple_model` 未强制使用预处理语句,存在 SQL 注入或越权查询风险。 | 在方法入口处进行严格类型转换与白名单校验,或使用框架内置验证器。 | `$merchant_id = filter_var($params['merchant_id'] ?? 0, FILTER_VALIDATE_INT);<br>if (!$merchant_id) throwError('商户ID无效');` |
| 🟠 警告 | `set_shop_config` & `set_room_info` | **逻辑重复 (DRY 违反)**:两个方法包含完全相同的场景前缀判断、配置加载逻辑。 | 提取公共逻辑至私有方法 `loadSceneConfig($scene)`,统一复用。 | `private function loadSceneConfig($scene, $merchant_id, $shop_id) { ... }` |
| 🟡 建议 | 全局 | **魔法数字与硬编码泛滥**:`'1'`、`'-1'`、`86400`、`3600` 等散落各处,且大量使用松散比较 `==`。 | 定义类常量或枚举,统一使用严格比较 `===`,提升可读性与静态分析能力。 | `const STATUS_AVAILABLE = '1';<br>const SECONDS_PER_DAY = 86400;<br>if ($status === self::STATUS_AVAILABLE)` |
| 🟡 建议 | 全局 | **缺失现代 PHP 类型声明**:未使用属性类型、参数类型及返回类型声明,降低代码健壮性。 | 升级至 PHP 8.1+ 规范,补充类型提示。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
| 🟡 建议 | 构造函数/全局 | **冗余获取 CI 实例**:频繁调用 `$CI = &get_instance()`。在 CI/PHPCI 架构中,模型已继承基类,可直接通过 `$this->load` 访问组件。 | 移除冗余的 `&get_instance()`,统一使用 `$this->load` 或在构造函数中注入依赖。 | `// 删除 $CI = &get_instance();<br>$this->load->model('ahead_shop_config_second_model');` |
> 📌 **框架适配说明**:代码结构高度契合 `CodeIgniter 3` 规范。若 `phpci` 为内部定制框架,请以官方文档为准。上述建议基于通用 PHP/CI 最佳实践,若框架对静态属性生命周期或模型加载有特殊机制,请相应调整。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存串扰**:立即移除 `self::$book_days_info` 等静态缓存,或改为带参数键的缓存策略。这是当前最高优先级的逻辑缺陷。
2. **补全截断代码**:确认 `_get_un_book_time` 及后续方法是否完整提交,避免线上 `ParseError`。
3. **增加输入校验层**:在 `get_book_day_time_info` 入口对 `$params` 进行严格过滤,防止非法参数穿透至数据库查询层。
### 🛠 后续重构与优化方向
1. **巨型方法拆分**:将 `get_book_day_time_info` 拆分为职责单一的子方法。示例结构:
```php
public function get_book_day_time_info(array $params, bool $add_day = false): array
{
$this->validateParams($params);
$this->initBusinessHours($params['date']);
$unavailableRanges = $this->collectUnavailableRanges($params, $add_day);
$timeSlots = $this->generateTimeSlots($params['date']);
return $this->applyRulesToSlots($timeSlots, $unavailableRanges, $params);
}
```
2. **性能优化策略**:
- 避免在循环中重复调用 `array_intersect`、`array_unique`、`sort`。可先将所有不可用时间段合并为连续区间,再使用二分查找或区间树算法快速过滤可用时段。
- 将 `strtotime`、`date` 等时间转换操作提前计算,避免在 `foreach` 中重复执行。
3. **架构规范升级**:
- 引入 PHP 8 类型声明与严格模式 (`declare(strict_types=1);`)。
- 将魔法数字提取为 `const` 或配置项。
- 若项目支持,考虑将复杂的时段计算逻辑抽离至独立的 `Service` 层,模型仅负责数据持久化,符合 MVC 分层原则。
4. **测试覆盖**:该逻辑涉及大量边界条件(跨天营业、套餐时长不足、停用规则、团购券限制),建议补充 PHPUnit 单元测试,重点覆盖时间区间交集、静态缓存隔离、异常参数拦截等场景。
> ⚠️ **局限性说明**:由于提供的代码在 `_get_un_book_time` 方法处截断,且未包含依赖的 `Simple_model`、自定义 Helper 函数(如 `mergeTimeRanges`、`shiftTimeRange`)及控制器调用上下文,部分性能与逻辑推断基于现有片段。建议提供完整文件及关联依赖以便进行闭环验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779354475
|
1779354475
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
282
|
21
|
65
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `69dcf87d4 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `69dcf87d468f81f5e15dc67de42fb8960e997a63`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 17:10:45
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了较为复杂的门店预订时间计算、团购券校验与冲突检测逻辑,但存在明显的架构越界与状态管理缺陷。模型类承担了过多业务逻辑(上帝类),静态缓存与实例属性混用导致潜在的数据污染,且存在大量重复代码、魔法值与循环内重复计算。整体可维护性、扩展性与性能表现均有较大优化空间。
- **风险等级**:🔴 高(逻辑状态污染可能导致预订时间计算错误;巨型方法易引发边界条件遗漏与超时)
> 📌 **框架说明**:从目录结构(`system/helpers/`, `system/libraries/`)、`get_instance()`、`$this->load->model()` 等特征判断,当前代码基于 **CodeIgniter 3** 框架。`phpci` 实际为 PHP 持续集成服务器,并非 Web 框架。以下审查将基于 CI3 最佳实践与通用 PHP 规范进行。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info()` 方法头部 | **静态缓存与实例状态冲突**:方法顶部使用 `self::$book_days_info` 作为静态缓存,但内部执行了 `$this->book_days += 1`。若首次调用 `$add_day=true`,会永久修改实例属性并缓存结果;后续调用即使 `$add_day=false` 也会返回被篡改的缓存,导致日期状态计算错误。 | 移除静态缓存,或改为带参数的缓存键(如 `self::$book_days_info[$add_day]`);**严禁在缓存命中后修改实例状态**。 | `if (isset(self::$book_days_info[$add_day])) { return self::$book_days_info[$add_day]; }`<br>`// 计算逻辑...`<br>`self::$book_days_info[$add_day] = $result;` |
| 🔴 严重 | `get_book_day_time_info()` 全方法 | **圈复杂度过高 & 职责越界**:方法超 300 行,混合了配置加载、时间轴生成、团购券校验、营业时段过滤、状态标记等逻辑。违反单一职责原则,极难编写单元测试,且 `foreach` 内嵌套大量 `if/else` 易遗漏边界条件(如跨天、24小时营业)。 | 拆分为独立服务类:`ShopConfigService`(配置)、`TimeRangeCalculator`(时间计算)、`VoucherRuleValidator`(券规则)。模型仅保留数据查询。 | *(架构级重构,见第3部分建议)* |
| 🟠 警告 | `set_shop_config()` 与 `set_room_info()` | **严重违反 DRY 原则**:两个方法逻辑高度重复(约 80% 代码相同),仅触发时机与参数略有差异。维护成本高,易出现同步遗漏。 | 提取为私有统一方法 `load_scene_config($room_id = 0)`,由原方法按需调用。 | `private function load_scene_config($room_id = 0) { /* 统一逻辑 */ }` |
| 🟠 警告 | `get_book_day_time_info()` 循环体内 | **循环内重复计算与频繁 DB 调用**:`foreach` 中多次调用 `strtotime()`、`date()`;`ahead_shop_config_second_model->get_shop_setting()` 在多处被重复调用。增加 CPU 与 I/O 开销。 | 循环外预计算基准时间戳;配置项应在初始化时批量获取并缓存至数组。 | `$base_ts = strtotime($date);`<br>`foreach ($time_info as &$v) { $v['ts'] = $base_ts + $v['time']; }` |
| 🟠 警告 | 多处 `$CI = &get_instance();` | **修改超全局对象引发并发污染**:直接赋值 `$CI->operational_scene`、`$CI->package_not_available_time` 等。在 CI3 中,`$CI` 是单例,高并发或异步任务下会导致请求间数据串扰。 | 避免修改 CI 超全局对象。应通过方法返回值、独立配置类或 Session 传递上下文数据。 | `return ['scene' => $scene, 'config' => $config];` |
| 🟡 建议 | 全文件 | **魔法值泛滥 & 违反 PSR-12**:大量使用 `'1'`, `'-1'`, `86400`, `3600` 等硬编码;属性全部为 `public` 暴露内部状态;缩进、换行、命名不一致。 | 定义常量类/枚举替代魔法值;属性改为 `protected` 并提供 Getter/Setter;严格遵循 PSR-12。 | `const STATUS_AVAILABLE = '1';`<br>`const SECONDS_PER_DAY = 86400;`<br>`protected $book_time_limit = 3600;` |
| 🟡 建议 | `_get_un_book_time()` | **数组操作性能隐患**:频繁使用 `array_merge` + `array_unique` + `sort`,且 `array_intersect(...array_values($all_room_book_time))` 在数组较大时消耗显著。 | 使用时间轴标记法(布尔数组)或提前过滤无效区间;减少不必要的数组合并。 | `$timeline = array_fill(0, 1440, false);`<br>`// 标记不可用时间段` |
| 🟡 建议 | 框架适配 | **模型承担业务逻辑**:CI3 模型应专注数据持久化。当前代码包含大量规则计算、状态流转与第三方库交互,不符合 MVC 分层规范。 | 将业务逻辑迁移至 `application/services/` 或 `application/libraries/`,模型仅保留 `get_one()`, `get_where()` 等基础查询。 | `// 控制器调用`<br>`$bookingService = new BookingTimeService();`<br>`$result = $bookingService->calculateAvailableTimes($params);` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存状态污染**:立即调整 `get_book_days_info()` 的缓存策略,确保 `$add_day` 参数变化时能正确重新计算或隔离缓存,避免线上出现日期状态错乱。
2. **拆分巨型方法**:将 `get_book_day_time_info()` 按职责拆分为 3~4 个独立方法或服务类。建议先提取 `filterByBusinessHours()`, `filterByVoucherRules()`, `calculateConflictTimes()`,降低圈复杂度至 15 以下。
3. **消除超全局对象副作用**:移除所有 `$CI->xxx = ...` 赋值,改为通过方法返回值或配置对象传递数据,保障请求隔离性。
### 🛠 后续重构与优化方向
- **引入服务层架构 (Service Layer)**:当前模型已演变为“业务逻辑容器”。建议新建 `BookingTimeCalculator` 服务类,注入 Model、Config、Voucher 依赖,模型仅作为数据访问层(DAO)。
- **时间计算算法优化**:当前使用大量 `strtotime`、`date` 和数组交集运算。可改用 **时间轴标记法**(将一天划分为 5 分钟粒度数组,标记可用/不可用状态)或 **区间合并算法**,将时间复杂度从 `O(n²)` 降至 `O(n)`。
- **配置与状态管理规范化**:
- 使用 `const` 或 `enum` 替代 `'1'/'-1'` 等魔法状态值。
- 将 `$this->book_time_limit`、`$this->minute_unit` 等配置项改为只读属性,通过构造函数或初始化方法注入,避免运行时随意修改。
- **补充测试与静态检查**:
- 针对跨天营业、24小时营业、团购券不可用星期、最低时长限制等边界条件编写 PHPUnit 单元测试。
- 引入 `PHPStan` 或 `Psalm` 进行静态类型分析,提前捕获空指针、类型不匹配及未定义变量问题。
> 💡 **提示**:若代码片段因截断未包含完整逻辑(如 `throwError()` 定义、`Simple_model` 基类实现),建议补充完整上下文以便进行更精准的依赖与安全审查。当前审查基于已提供代码的静态分析与架构推演,可直接作为重构基线。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779354645
|
1779354645
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
303
|
21
|
79
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `af89b01ea ## 自动代码审查报告
**分支**: pay-260519
**提交**: `af89b01ea1204b4e64bf663fcbdb1024f00aaee5`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-25 14:10:29
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码实现了完整的会员充值、支付回调、奖励发放及多端订单联动逻辑,业务覆盖全面。但存在**支付回调同步阻塞、并发幂等性不足、全局变量滥用、方法职责过重**等典型架构隐患。部分逻辑耦合度高,不利于后续维护与横向扩展。
- **风险等级**:🔴 高(支付回调超时重试、并发重复处理可能导致资金对账异常或重复发券)
> 📌 **框架说明**:从目录结构(`system/`、`application/`)、`$CI = &get_instance()` 及 `$this->db->trans_start()` 等特征判断,该代码实际基于 **CodeIgniter 3.x** 架构。以下审查基于 CI3 最佳实践,若为内部定制版 `phpci`,请结合其官方文档微调。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `pay_call_back()` 方法 | **支付回调同步调用外部服务**(短信、微信模板消息、App推送、打印机)。支付网关通常要求 2s 内返回 `SUCCESS`,同步阻塞易导致网关超时重试,引发重复回调或资金对账混乱。 | 将非核心链路(通知、短信、打印、日志)剥离,改为**异步队列**(Redis List / RabbitMQ / 定时任务)或至少使用 `fastcgi_finish_request()` 提前响应网关。 | ```php<br>// 提前响应网关<br>echo xml_encode(['code'=>'SUCCESS','msg'=>'OK']);<br>fastcgi_finish_request();<br>// 后续执行异步任务<br>Queue::push('VipRechargeNotifyJob', $rechargeId);<br>``` |
| 🔴 严重 | `pay_call_back()` 方法 | **状态更新缺乏原子性,存在并发竞态条件**。先 `get_one` 判断状态,再 `update` 状态。高并发下两个回调可能同时通过状态检查,导致重复扣款/发券。 | 使用**条件更新**或**分布式锁**保证幂等性。优先使用数据库原子更新:`UPDATE table SET _status=1 WHERE _id=? AND _status=-1`。 | ```php<br>$this->db->where('_id', $rechargeId)<br> ->where('_status', -1)<br> ->update($this->table_name, ['_status' => 1, '_trade_no' => $transaction_id]);<br>if ($this->db->affected_rows() === 0) {<br> return ['code'=>'SUCCESS','msg'=>'已处理'];<br>}<br>``` |
| 🟠 警告 | 文件顶部 (第4行) | **全局 `$CI = &get_instance();` 在类外实例化**。文件被 `include/require` 时即执行,浪费内存且可能在未初始化环境下抛出致命错误。 | 移除全局实例化。在 Model 构造函数中赋值,或直接在方法内按需调用 `$this->load->`。 | ```php<br>class Ahead_vip_recharge_order_model extends Simple_model {<br> protected $ci;<br> public function __construct() {<br> parent::__construct();<br> $this->ci =& get_instance();<br> }<br>}<br>``` |
| 🟠 警告 | `recharge()` / `pay_call_back()` | **频繁调用 `$this->load->model()`**。每次请求重复加载相同模型,增加 I/O 与内存开销。 | 将高频依赖模型移至 `__construct()` 中加载,或配置 `config/autoload.php` 自动加载。 | ```php<br>public function __construct() {<br> parent::__construct();<br> $this->load->model(['ahead_vip_model', 'ahead_shop_model', 'ahead_user_model']);<br>}<br>``` |
| 🟠 警告 | `recharge()` 方法 | **类型比较不一致**。`$from` 可能为整型,但 `in_array($from, ['2','4'...])` 使用松散比较,且 `$from == '1'` 混用字符串/整型,易引发逻辑误判。 | 统一类型转换或开启严格模式。建议将 `$from` 强转为整型后再比较。 | ```php<br>$from = (int)($params['from'] ?? 1);<br>if (in_array($from, [2,4,5,6,7,8,9,11,12,13], true)) { ... }<br>``` |
| 🟠 警告 | `pay_call_back()` 方法 | **事务回滚逻辑与 CI 自动模式冲突**。`$this->db->trans_start()` 开启手动模式,但 `catch` 中手动 `trans_rollback()` 后直接 `return`,未调用 `trans_complete()`,可能导致后续 DB 操作处于未定义状态。 | 统一使用 CI 事务标准写法:`$this->db->trans_begin(); ... if($err) { $this->db->trans_rollback(); return; } ... $this->db->trans_commit();` 或保持 `trans_start()` 但确保 `trans_complete()` 必执行。 | ```php<br>$this->db->trans_start();<br>try {<br> // 业务逻辑<br> $this->db->trans_complete();<br>} catch (Exception $e) {<br> $this->db->trans_rollback();<br> throw $e;<br>}<br>``` |
| 🟡 建议 | 全局 | **魔法数字与硬编码值泛滥**。如 `256`、`1800`、`1`、`-1`、`22`、`50`、`0.08` 等散落在代码中,可读性差且难以维护。 | 提取为类常量,集中管理业务枚举与配置阈值。 | ```php<br>const REDIS_EXPIRE_SEC = 1800;<br>const JSON_UNESCAPED_UNICODE = 256;<br>const PAY_PLATFORM_FREE = 22;<br>const SMS_MIN_BALANCE = 0.08;<br>``` |
| 🟡 建议 | `recharge()` / `pay_call_back()` | **方法过长(>300行),违反单一职责原则**。支付路由、订单组装、奖励计算、通知发送全部耦合在一个 Model 方法中。 | 按领域拆分:`PaymentGatewayService`(支付适配)、`VipRewardService`(奖励/邀请)、`OrderDispatchService`(订单生成)。Model 仅负责数据持久化。 | 建议后续重构时采用 Service 层架构,Model 保持纯净。 |
| 🟡 建议 | `add_free_order()` | **代码片段不完整**。方法在 `if ($registration_fee > 0) {//需要办卡费用的去生成办卡费用订单` 处截断,无法评估后续逻辑。 | 请补充完整代码以便审查边界条件与事务一致性。 | 无 |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **支付回调幂等性与原子更新**:立即将 `pay_call_back` 中的状态检查与更新合并为一条 `UPDATE ... WHERE _status = -1` 语句,或引入 Redis 分布式锁(`SETNX`),彻底杜绝并发重复处理导致的资金/发券异常。
2. **回调响应解耦**:支付成功回调必须**秒级返回**。将短信、微信模板消息、App推送、打印机调用移至异步队列。若暂无队列中间件,可临时使用 `ignore_user_abort(true)` + `fastcgi_finish_request()` 提前返回网关,后台继续执行。
3. **全局 `$CI` 实例化修复**:移除文件顶部的 `&get_instance()`,改为构造函数注入或按需加载,避免框架初始化阶段的潜在 Fatal Error。
### 🛠 后续重构与优化方向
- **架构分层**:当前 Model 承担了 Controller 与 Service 的职责。建议引入 `Service` 层处理复杂业务编排(如:`VipRechargeService::initiate()`、`VipRechargeService::handleCallback()`),Model 仅保留 `insert`、`update`、`get_one` 等数据访问方法。
- **配置与枚举集中化**:将 `FROM_MAP`、支付平台标识、Redis 库 ID、短信阈值等提取至 `config/vip_recharge.php` 或类常量中,便于多环境部署与后期审计。
- **安全加固**:
- 确保所有 `$this->db->where()` 或基础 Model 的查询方法底层使用 Query Builder 或 PDO 预处理,杜绝 SQL 注入。
- `doLog()` 记录异常时,过滤掉 `$params` 中的敏感字段(如 `openId`、`mobile`、`sms_code`),防止日志泄露。
- 若该接口对外暴露,需补充 CSRF Token 校验(Web端)或签名验签机制(API端)。
- **框架适配提示**:若 `phpci` 为 CI3 的定制版,请确认 `$this->db->trans_start()` 是否启用了 `strict_mode`。建议统一使用 `$this->db->trans_begin()` + `$this->db->trans_commit()` / `$this->db->trans_rollback()` 显式控制,避免隐式状态混乱。
> 💡 **下一步建议**:优先完成回调幂等改造与异步化拆分,可立即降低线上资金风险。后续可安排 1~2 个迭代进行 Service 层重构与常量提取,提升代码可测试性与可维护性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779689429
|
1779689429
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
307
|
21
|
82
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `d712d39b4 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `d712d39b4237953f9e9cd9a4623af65a0e6a1259`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-25 15:29:04
---
## 1. 审查摘要
- **代码质量评分**:6.0 / 10 分
- **总体评价**:业务逻辑覆盖较全面,能支撑 AI 预订、多业态(KTV/台球/棋牌/酒馆)套餐推荐与支付流程。但代码存在明显的架构反模式:大量使用公开属性存储中间状态、频繁修改全局 `$CI` 对象、静态缓存未隔离导致跨店数据污染、超长方法违反单一职责原则。性能与可维护性存在较大优化空间。
- **风险等级**:🟠 中高(存在数据隔离缺陷、全局状态污染、潜在 N+1 查询瓶颈)
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_merchant_room_type_model.php`<br>L15, L28-40 | **静态缓存未隔离导致跨店数据污染**:`self::$room_type_data` 为扁平数组,首次查询门店A后,后续查询门店B会直接返回门店A的缓存数据。 | 移除静态缓存或改为带唯一键的缓存结构,或交由框架缓存组件管理。 | `if (!isset(self::$room_type_data[$merchant_id . '_' . $shop_id])) { ... }`<br>`return self::$room_type_data[$merchant_id . '_' . $shop_id] ?? [];` |
| 🔴 严重 | `Ahead_ai_book_model.php`<br>`Ahead_billiards_model.php`<br>文件头部 L1-3 | **类外部使用 `$CI = &get_instance();` 违反框架规范**:在模型文件顶部直接获取实例并加载模型,易引发未初始化错误,且破坏 CI 生命周期。 | 删除文件头部代码。依赖加载应移至 `__construct()` 或具体业务方法内。 | `// 删除顶部代码`<br>`public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟠 警告 | `Ahead_ai_book_model.php`<br>L18-27 | **公开属性滥用存储中间状态**:`$time_eligible_package_data` 等大量公开数组用于累积计算结果,破坏封装性,若实例复用会导致状态残留。 | 改为 `private` 属性,并在方法入口处显式重置,或改为局部变量通过返回值传递。 | `private $time_eligible_package_data = [];`<br>`// 方法开头:$this->time_eligible_package_data = [];` |
| 🟠 警告 | `Ahead_ai_book_model.php`<br>L102, L360<br>`Ahead_billiards_model.php`<br>L52 | **频繁修改 `$CI` 超全局属性**:如 `$CI->operational_scene = $operational_scene;` 污染全局上下文,极易引发并发请求或后续逻辑的隐蔽冲突。 | 避免修改 `$CI`。应通过方法参数传递业务上下文,或使用独立的 `Context` 对象。 | 移除 `$CI->xxx = ...`,改为参数传递或依赖注入。 |
| 🟠 警告 | `Ahead_ai_book_model.php`<br>L250-260 | **循环逐日查询引发性能瓶颈**:`for ($i = 0; $i < 7; $i++)` 每次循环调用 `_get_date_room_list_info`,触发完整模型加载与 DB 查询,存在严重 N+1 问题。 | 改为批量查询未来 7 天数据,或在 SQL 层使用 `BETWEEN` 一次性拉取,内存中过滤。 | `WHERE book_date BETWEEN ? AND ?` 替代循环查询。 |
| 🟠 警告 | `Ahead_ai_book_model.php`<br>L130-160 | **手动括号匹配解析 JSON 脆弱**:依赖 `strpos` 和计数器提取 JSON,若 AI 返回嵌套字符串或格式微调,极易解析失败或越界。 | 使用正则提取或要求 AI 严格输出 JSON 块,配合 `json_decode` 与异常捕获。 | `preg_match('/book_params=\s*(\{.*\})/s', $str, $m);`<br>`$data = json_decode($m[1], true);` |
| 🟡 建议 | 全局多处 | **重复加载模型/库**:每个方法内部频繁调用 `$this->load->model()`,浪费 I/O 与内存。 | 将高频依赖移至构造函数,或配置框架自动加载。 | `public function __construct() { parent::__construct(); $this->load->model(['xxx','yyy']); }` |
| 🟡 建议 | `Ahead_billiards_model.php`<br>L180-200 | **存在大量注释死代码**:如 `/*if ($result['operational_scene'] == '2')...*/` 影响可读性与静态分析。 | 彻底清理注释掉的代码,历史版本交由 Git 管理。 | 直接删除注释块。 |
| 🟡 建议 | 全局 | **违反 PSR-12 与类型规范**:命名不统一(`minToStr` vs `mintoStr`)、使用 `array()`、缺乏类型声明、方法过长(>300行)。 | 统一驼峰/蛇形命名,使用 `[]`,为 PHP 7.4+ 添加类型提示,拆分超长方法。 | `public function get_page_info(int $uid, int $mid, int $sid, array $params): array` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存隔离缺陷**:立即修改 `Ahead_merchant_room_type_model::get_shop_room_type_list` 中的 `self::$room_type_data`,按 `merchant_id_shop_id` 键值隔离,否则会导致严重的跨店数据错乱。
2. **清理全局状态污染**:移除所有 `$CI = &get_instance();` 及 `$CI->xxx = ...` 赋值。业务上下文(如 `operational_scene`、`merchant_id`)应通过方法参数或独立的 `RequestContext` 对象传递。
3. **优化 7 天循环查询**:将 `get_ai_book_recommend` 中的 `for ($i=0; $i<7; $i++)` 替换为单次范围查询(如 `WHERE date >= CURDATE() AND date <= DATE_ADD(CURDATE(), INTERVAL 7 DAY)`),在 PHP 层按日期分组处理,预计可降低 60%+ DB 交互耗时。
### 🛠 后续重构与优化方向
- **遵循单一职责原则 (SRP)**:`get_ai_book_recommend` 方法已超 400 行,建议拆分为:
- `resolve_booking_time()`:处理时间解析、模糊时间转换、卡券时间校验。
- `fetch_available_rooms()`:批量获取空闲包厢与套餐。
- `calculate_recommendation_priority()`:封装推荐权重排序逻辑。
- **引入数据校验层**:当前 `$params` 仅使用 `??` 默认值,建议在入口增加严格校验(如 `book_date` 格式、`book_hour` 范围),可使用框架自带的 `Form_validation` 或自定义 DTO 类。
- **统一异常处理**:`throwError()` 若为自定义函数,建议统一替换为 `throw new \DomainException()` 或 `BusinessException`,便于全局捕获与标准化错误码返回。
- **框架适配说明**:代码结构高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请确认其是否支持依赖注入容器(DIC)或 PSR-11 规范。若支持,建议逐步将 `$this->load->model()` 替换为构造函数注入,以提升可测试性与生命周期可控性。
> 💡 **提示**:`Ahead_billiards_model.php` 末尾代码被截断,若包含支付回调或订单状态机逻辑,请补充完整以便进行事务一致性审查。当前审查基于已提供片段,建议结合完整调用链进行集成测试。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779694144
|
1779694144
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
324
|
21
|
91
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `c9973db30 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `c9973db30df7b2dd76ea9b396f517d5b08229f5c`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-26 14:18:53
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算逻辑,业务覆盖全面(含跨天、套餐、清扫、锁定、多业态等)。但代码存在明显的架构设计缺陷:方法严重超长、静态状态管理混乱、框架基础用法冗余、时间格式混用且缺乏统一抽象。整体可维护性较低,在并发或高负载场景下易出现状态污染与性能瓶颈。
- **风险等级**:🟠 中高(逻辑边界隐患、并发状态污染、性能退化风险)
> 📌 **框架说明**:您提及的 `phpci` 通常为 PHP 持续集成工具,而非 Web 框架。从代码结构(`get_instance()`、`$this->load->model()`、目录规范)判断,该代码实际基于 **CodeIgniter 3 (CI3)**。以下审查将严格遵循 CI3 最佳实践与 PHP 现代编码规范。若确为自研框架,请忽略框架特定提示,其余逻辑与规范建议依然适用。
> ⚠️ **局限性说明**:代码在 `$this->next_date_room_book_time = [...]` 处截断,以下审查基于已提供部分。若后续存在关键逻辑差异,请补充完整文件以便二次评估。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 全局/多处 | **框架误用:Model 中冗余调用 `get_instance()`**<br>在 CI3 中,Model 继承自 `CI_Model`,`$this` 本身即为 CI 超级对象。频繁使用 `$CI = &get_instance()` 是反模式,增加内存开销且破坏框架设计初衷。 | 移除所有 `$CI = &get_instance();`,直接使用 `$this->load->model()`、`$this->merchant_id` 等。若需访问 Controller 专属属性,应通过方法参数显式传递。 | `$this->load->model('ahead_shop_model');`<br>`$merchant_id = $this->merchant_id ?? 0;` |
| 🔴 严重 | 全局/静态属性 | **静态属性缓存导致状态污染与并发隐患**<br>`public static $book_days_info = [];` 等静态变量在单次请求内可复用,但若同一请求处理不同商户/门店数据,会返回脏数据。长进程(如 CLI/Worker)下易内存泄漏。 | 改为实例属性,或引入带维度的请求级缓存。若必须静态缓存,需拼接 `merchant_id_shop_id_date` 作为 Key。 | `private static $cache = [];`<br>`$key = "book_days_{$m}_{$s}";`<br>`if (isset(self::$cache[$key])) return self::$cache[$key];` |
| 🟠 警告 | `get_book_day_time_info` 方法 | **方法严重超长且违反单一职责原则 (SRP)**<br>该方法超 250 行,混杂了参数校验、配置加载、时间计算、套餐校验、营业时间判断、锁定状态检查等逻辑,调试与单元测试极其困难。 | 拆分为多个私有方法:`validateParams()`, `loadShopConfig()`, `calculateAvailableSlots()`, `checkPackageRules()`, `checkBusinessHours()` 等。 | `private function validateBookingParams(array $params): void { ... }`<br>`private function filterByPackageRules(array $slots): array { ... }` |
| 🟠 警告 | 时间处理逻辑 | **时间格式混用与边界计算风险**<br>代码中混用 `YmdHi`、`H:i`、Unix 时间戳、秒数(`86400`)。`strtotime()` 强依赖服务器时区,跨天/夏令时/闰秒处理极易出错。 | 引入 `nesbot/carbon` 或封装统一时间工具类。所有计算统一转为时间戳或 `DateTime` 对象,仅在输出时格式化。 | `$start = Carbon::createFromFormat('YmdHi', $date.'0000');`<br>`$end = $start->copy()->addHours(24);`<br>`$diff = $end->diffInSeconds($start);` |
| 🟠 警告 | `_get_un_book_time` 及数组操作 | **数组操作性能瓶颈与潜在崩溃**<br>`array_intersect(...array_values($all_room_book_time))` 使用参数展开,数据量大时易触发 `ArgumentCountError` 或内存溢出。循环内频繁 `array_merge`/`array_unique`。 | 使用迭代方式求交集,或预先过滤。将去重操作移至循环外。避免在循环中重复分配数组。 | `function intersectMulti(array $arrays): array {`<br>` return array_reduce($arrays, fn($carry, $item) => array_intersect($carry, $item), $arrays[0] ?? []);`<br>`}` |
| 🟡 建议 | 全局 | **魔法数字泛滥**<br>`1, 2, 3, 4, 7, 86400, 3600, 1800` 等硬编码散落各处,降低可读性且后期调整需全局搜索。 | 提取为类常量或配置项,集中管理。 | `const SCENE_KTV = 1;`<br>`const SECONDS_PER_DAY = 86400;`<br>`const MINUTE_UNIT_DEFAULT = 30;` |
| 🟡 建议 | 属性定义 | **属性可见性设计不当**<br>大量业务状态属性声明为 `public`,外部可随意修改,破坏封装性且易引发不可预知的副作用。 | 改为 `protected` 或 `private`,提供必要的 `getter` 方法。 | `protected $book_room_id = 0;`<br>`public function getBookRoomId(): int { return $this->book_room_id; }` |
| 🟡 建议 | 输入处理 | **缺乏参数类型校验与防御性编程**<br>`$params['date']` 等直接用于 `strtotime`,未校验格式、范围或类型。`throwError()` 依赖全局函数,不利于异常栈追踪。 | 增加类型检查、格式校验,失败时抛出标准异常或返回明确错误码。 | `if (!preg_match('/^\d{8}$/', $params['date'])) {`<br>` throw new InvalidArgumentException('日期格式必须为 Ymd');`<br>`}` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **清理框架冗余调用**:全局搜索并替换 `$CI = &get_instance();`,统一使用 `$this` 访问 CI 组件,消除不必要的引用开销。
2. **隔离静态缓存状态**:将 `public static` 属性改为带业务维度 Key 的缓存机制,或降级为实例属性,防止多商户/多门店请求交叉污染。
3. **拆分巨型方法**:将 `get_book_day_time_info()` 按职责拆分为 4~6 个子方法,每个方法不超过 50 行,显著提升可读性与可测试性。
4. **统一时间处理规范**:废弃 `YmdHi` 字符串直接参与数学运算的做法,全面转为时间戳或 `DateTime` 对象计算,彻底规避跨天与时区边界 Bug。
### 🛠 后续重构与优化方向
- **引入策略模式处理多业态**:当前 `if/elseif` 判断 `book_room_operational_scene`(KTV/台球/棋牌/酒馆)的逻辑散落在多处。建议抽象为 `BookingStrategyInterface`,按场景注入不同策略类,符合开闭原则。
- **配置与数据缓存层**:`ahead_shop_config_second_model->get_shop_setting()` 被高频调用。建议在 Service 层或 CI Cache 驱动中增加 Redis/Memcached 缓存,设置合理 TTL,降低 DB 压力。
- **标准化错误处理**:逐步替换全局 `throwError()`,改用 `throw new \DomainException()` 或 CI3 的 `show_error()`,并配合日志记录(`log_message()`),便于生产环境排查。
- **补充单元测试**:时间计算与状态机逻辑极易出错。建议使用 `PHPUnit` 针对 `_get_un_book_time()`、套餐时长校验、跨天逻辑编写边界测试用例(如:23:55 预订、跨零点、营业结束前 5 分钟等场景)。
> 💡 **提示**:若需针对截断部分(如次日不可用时间计算、最终结果组装逻辑)进行深度审查,请提供完整文件。当前建议已覆盖核心风险点,按优先级实施可显著提升代码健壮性与团队维护效率。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779776333
|
1779776333
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
333
|
21
|
97
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `783fccb96 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `783fccb96970e1dafb1004f28bca3cf1aad18a60`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-26 15:42:23
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:代码整体呈现典型的“测试/调试控制器”特征,但混杂了大量未经验证的业务逻辑。存在严重的 SQL 注入风险、框架反模式(如污染 CI 超类对象)、硬编码敏感数据及输入校验缺失。模型层部分方法仍使用原始字符串拼接 SQL,未充分利用现代 PHP 类型声明与框架安全机制。
- **风险等级**:🔴 高
> *注:代码结构高度符合 **CodeIgniter 3 (CI3)** 规范。若 `phpci` 为内部定制框架,以下安全与架构原则依然通用。*
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_vip_model.php`<br>`check_is_register` / `pay_order` / `notify_book` | **SQL 注入漏洞**:直接将外部变量拼接到 SQL 字符串中(如 `$orStr .= "(_ahead_user_id='" . $uid . "'";` 及 `$up = "_account=_account-'" . $order_data['_actual_pay'] . "'";`),未使用查询绑定或构造器。若传入恶意字符将导致数据泄露或破坏。 | 严格使用 CI3 查询构造器或参数绑定。金额/ID 字段必须强制类型转换。 | `$this->db->where('_ahead_user_id', (int)$uid);`<br>`$this->db->set('_account', '_account - ' . (float)$pay, FALSE);` |
| 🔴 严重 | `TestHlj.php`<br>`check_params()` 方法 | **属性名拼写错误引发致命异常**:`$family_server_id = $this->param['family_server_id'] ?? '';` 中 `$this->param` 未定义,应为 `$this->params`。在严格模式下将直接抛出 `Undefined property` 错误。 | 统一修正为 `$this->params`,并建议在类顶部声明属性类型。 | `$family_server_id = $this->params['family_server_id'] ?? '';` |
| 🟠 警告 | `TestHlj.php`<br>`__construct()` | **滥用全局实例污染框架核心对象**:`$CI->merchant_id = ...` 动态向 CI 超类注入属性。破坏封装性,易引发并发请求下的状态覆盖、内存泄漏及单元测试困难。 | 使用 Session、配置类或依赖注入传递上下文,避免全局状态污染。 | `$this->session->set_userdata(['merchant_id' => $id]);`<br>或通过方法参数显式传递 |
| 🟠 警告 | `TestHlj.php`<br>`jsonEcho()` | **输出缓冲与响应机制不规范**:手动 `ob_end_clean()`/`ob_start()` 易与 CI 的 Output 类冲突;硬编码 `die()` 终止流程不利于中间件/钩子执行。 | 使用 CI 内置 `$this->output` 类标准化 JSON 响应。 | `$this->output->set_status_header($code)`<br>`->set_content_type('application/json')`<br>`->set_output(json_encode($result, JSON_UNESCAPED_UNICODE))`<br>`->_display();` |
| 🟠 警告 | `TestHlj.php`<br>多处方法 | **硬编码敏感数据与调试输出**:包含明文 Token、固定 UID(`66`)、`var_dump`/`print_r`,且未对 `$_GET`/`$_REQUEST` 做过滤。若部署至生产环境将导致信息泄露与越权。 | 移除所有调试输出;敏感配置移至 `.env` 或 `config`;API 入口统一接入验证层。 | 移除 `var_dump`,使用 `$this->form_validation` 或自定义 Validator 拦截非法请求 |
| 🟡 建议 | `TestHlj.php`<br>`updateShopShiftTurnoverCount` | **使用 JS 跳转实现服务端批处理**:`echo '<script>window.location.href=...` 对 API/CLI 无效,且易被浏览器拦截或破坏 RESTful 规范。 | 改为返回 JSON 状态,由前端轮询或使用 CLI 脚本 + 消息队列执行。 | 返回 `['status' => 'processing', 'next_cursor' => $last_id]` |
| 🟡 建议 | 全局 | **缺乏现代 PHP 类型声明与 PSR-12 规范**:无参数类型、返回值类型;魔法数字多(如 `json_encode($data, 256)`);注释与业务逻辑混杂。 | 逐步引入 PHP 7+ 类型声明;使用常量替代魔法数字;遵循 PSR-12 缩进与命名规范。 | `public function getCommunityShopList(): void`<br>`const JSON_FLAGS = JSON_UNESCAPED_UNICODE \| JSON_THROW_ON_ERROR;` |
## 3. 总结与行动建议
### 🚨 优先修复(P0)
1. **修复 SQL 注入**:立即重构 `Ahead_vip_model` 中所有直接拼接 SQL 字符串的方法。全面替换为 `$this->db->where()`、`$this->db->set()` 或 `$this->db->query($sql, $bindings)`。
2. **修正致命拼写错误**:将 `TestHlj::check_params()` 中的 `$this->param` 统一改为 `$this->params`,并补充空值防御逻辑。
3. **移除生产环境调试代码**:清理 `TestHlj.php` 中的 `var_dump`、`print_r`、硬编码 Token 及固定测试账号(如 `uid=66`)。测试控制器应通过环境变量或独立路由隔离,严禁随业务代码发布。
### 🛠 后续重构与优化方向
1. **统一响应与输入校验机制**:
- 废弃 `jsonEcho()`,封装统一的 `ApiResponse` 服务类,利用 CI3 的 `$this->output` 输出。
- 在 `__construct()` 或前置钩子中引入参数校验(如 `Form_validation` 或自定义 DTO),拦截非法 `$_GET`/`php://input` 数据。
2. **解耦全局状态**:
- 停止使用 `$CI->xxx` 传递业务上下文。推荐方案:使用 `$this->session->set_userdata()` 存储用户态,或通过构造函数/方法参数显式注入依赖。
3. **架构规范化**:
- 将 `TestHlj` 中的批量更新逻辑(如 `updateShopShiftTurnoverCount`)迁移至 CLI 命令或队列任务(如 Redis Queue / Supervisor),避免 HTTP 超时与 JS 跳转依赖。
- 逐步为 Model/Controller 方法添加 PHP 类型声明(`declare(strict_types=1);`),提升静态分析能力与运行时安全性。
4. **框架适配提示**:
- 若 `phpci` 为 CI3 的二次封装,请确认其是否重写了 `$this->output` 或数据库驱动。若为标准 CI3,上述建议可直接落地。建议查阅官方文档中 `Output Class` 与 `Query Builder` 章节以对齐最佳实践。
> 本次审查基于静态代码分析。建议在修复后配合 `SonarQube` 或 `PHPStan` 进行自动化扫描,并补充核心链路的单元测试(PHPUnit)以覆盖边界条件与并发场景。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779781343
|
1779781343
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
366
|
21
|
110
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `eb0f6c752 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `eb0f6c752ec531d38f10fc74a1315f68591405a9`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:10:04
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了复杂的业务逻辑(时段预订计算、评价发券、触摸屏设备交互),但存在明显的架构与安全缺陷。模型层承担了过多服务层与控制器职责,存在 SQL 注入隐患、`goto` 滥用、异常静默吞没、异步状态不同步等问题。整体耦合度高,可维护性与扩展性较弱。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `ScreenApi.php` / `case "2001"` | 使用 `goto famail_close;` 破坏控制流,且标签拼写为 `famail`(应为 `family`),极易引发逻辑跳跃与维护灾难。 | 提取关房后置逻辑为独立私有方法,使用条件分支或 `return` 替代 `goto`。 | `if ($family_data['_status'] == 1) { return $this->_handle_auto_close($family_data, $open_room_data); }` |
| 🔴 严重 | `Ahead_shop_comment_model.php` / `checkWriteable()` | `$this->db->where($openLogWhereStr)` 直接拼接外部参数 `$uniqueKey` 与 `$uid`,存在 SQL 注入风险。 | 使用 CI3 查询构造器或参数绑定,避免原生字符串拼接。 | `$this->db->where('_unique_key', $uniqueKey)->where("FIND_IN_SET($uid, _join_customer) > 0");` |
| 🔴 严重 | `ScreenApi.php` / `case "2001"` | `$upOpenLogStr` 直接拼接 `$cost` 到 SQL 更新语句中,违反安全编码规范,且易因类型转换引发语法错误。 | 使用 Query Builder 的 `set()` 方法,并强制类型转换。 | `$this->db->set('_unpaid_amount', '_unpaid_amount + ' . floatval($cost), FALSE)->update('table', $where);` |
| 🔴 严重 | `ScreenApi.php` / 文件头部 | `header("Access-Control-Allow-Origin:*");` 允许任意域名跨域,易被恶意站点利用发起 CSRF 或数据窃取。 | 根据业务需求配置可信域名白名单,或动态读取 `HTTP_ORIGIN` 校验后返回。 | `header("Access-Control-Allow-Origin: " . ($allowed_origin ?: 'https://yourdomain.com'));` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php` / `get_book_day_time_info()` | `array_intersect(...array_values($all_room_book_time))` 当数组元素不足 2 个时,PHP 8+ 会抛出 `ArgumentCountError` 致命错误。 | 增加数量校验,或使用兼容写法。 | `if (count($all_room_book_time) > 1) { $un_book_time = array_intersect(...array_values($all_room_book_time)); }` |
| 🟠 警告 | `Ahead_shop_comment_model.php` / `add_shop_comment()` | `catch (Exception $e)` 仅返回“评价失败”,未记录异常堆栈,导致线上故障无法定位。 | 捕获后写入日志,并返回脱敏提示。 | `log_message('error', '评价提交异常: ' . $e->getMessage()); return ['success'=>false, 'msg'=>'系统繁忙,请稍后重试'];` |
| 🟠 警告 | `service-receipt.js` / `addService()` | 图片上传为异步操作,但提交时直接读取 `this.data.imageList`,未等待上传完成,可能导致提交空数组或部分失败数据。 | 使用 `Promise.all` 聚合上传任务,全部成功后再调用提交接口。 | `Promise.all(uploadTasks).then(urls => this.submitComment(urls)).catch(err => wx.showToast({title:'上传失败'}))` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php` / 多处 | 频繁在方法内部调用 `$CI = &get_instance()`,且部分逻辑重复加载 Model。 | 在构造函数中统一获取并赋值给实例属性,后续直接复用。 | `protected $ci; public function __construct(){ parent::__construct(); $this->ci =& get_instance(); }` |
| 🟡 建议 | `ScreenApi.php` / 全局 | 控制器过于臃肿(God Object),`switch` 包含数百行业务逻辑,违反单一职责与开闭原则。 | 按功能域拆分为独立 Service 类,控制器仅负责路由分发、参数校验与响应格式化。 | 引入策略模式:`$handler = ScreenHandlerFactory::create($function); $handler->handle($params);` |
| 🟡 建议 | `Ahead_shop_book_time_info_model.php` / 多处 | 大量使用 `self::$xxx` 静态变量缓存数据。在长连接/CLI 环境下易导致内存泄漏或请求间数据污染。 | 改用实例属性缓存,或接入 Redis 等外部缓存并设置 TTL。 | `private $requestCache = [];` 替代 `public static $xxx = [];` |
| 🟡 建议 | 全局 | 代码风格未严格遵循 PSR-12(缩进不一致、大括号位置混用、命名规范不统一)。 | 配置 `PHP-CS-Fixer` 或 `PHP_CodeSniffer` 进行自动化格式化与静态检查。 | `php-cs-fixer fix . --rules=@PSR12` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **安全漏洞修复**:立即替换 `checkWriteable()` 与关房逻辑中的原生 SQL 拼接,全面改用 CI3 Query Builder 或预处理语句;限制 CORS 白名单。
2. **控制流重构**:彻底移除 `goto` 语句,将关房后的状态更新、消息推送、任务生成等逻辑封装为独立方法,通过 `return` 或条件判断流转。
3. **致命错误防御**:修复 `array_intersect` 空数组展开问题,增加 `json_decode` 后的类型校验(如 `is_array()`),避免线上 500 错误。
4. **前端异步治理**:小程序端 `addService` 需引入 `Promise.all` 等待图片上传完成,并增加 loading 状态与失败重试机制。
### 🛠 后续重构与优化方向
1. **架构分层解耦**:当前 Model 层严重越权(承担了 Service、Helper、甚至部分 Controller 职责)。建议引入 `Service` 层处理复杂业务(如时段计算、发券逻辑、微信推送),Model 仅保留数据存取与基础查询。
2. **控制器瘦身**:`ScreenApi.php` 建议采用 **命令模式(Command Pattern)** 或 **策略模式(Strategy Pattern)** 替代巨型 `switch`。每个 `function` 对应一个独立 Handler 类,便于单元测试与后续扩展。
3. **缓存策略升级**:静态变量缓存改为请求级缓存(实例属性)或 Redis 分布式缓存。对于高频查询的门店配置、包厢状态,建议增加缓存失效机制(如发布订阅或版本号控制)。
4. **框架适配说明**:
> ⚠️ 注:提交代码实际基于 **CodeIgniter 3** 架构(特征:`get_instance()`、`load->model()`、`BASEPATH`、`$this->db`)。若 `phpci` 为内部定制框架,请对照其官方生命周期文档调整组件加载方式。CI3 已停止官方维护,若项目处于长期迭代期,建议评估平滑迁移至 CI4 或现代 PHP 框架(如 Laravel/Symfony)的可行性,以获得更好的类型安全、依赖注入与中间件支持。
5. **质量保障**:引入 PHPStan 或 Psalm 进行静态类型分析;为核心时段计算逻辑补充 PHPUnit 单元测试,覆盖边界条件(如跨天、24小时营业、最低时长限制、并发预订冲突)。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779869404
|
1779869404
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
367
|
21
|
111
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `58b9c6915 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `58b9c6915931a7b047a3cba8208be79183192a18`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:14:28
---
## 1. 审查摘要
- **代码质量评分**:4 / 10 分
- **总体评价**:该类承担了订单创建、价格计算、会员折扣、优惠券匹配、服务费核算等核心业务,逻辑复杂度高。但实现方式较为陈旧,存在**SQL注入隐患、浮点数精度丢失、关键变量重复覆盖**等严重问题。方法体过长(超600行),严重违反单一职责原则,可维护性与扩展性较差。
- **风险等级**:🔴 高
- **⚠️ 局限性说明**:提交代码在 `$result['have_good` 处截断,本次审查仅基于可见部分。若截断处包含关键事务提交或状态更新逻辑,请补充后复核。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `getOrderTypeInfo` 约 L240 | **SQL 注入风险**:使用 `implode` 拼接 `IN` 查询条件 `$pack_goods_where = "... in (" . implode(",", $id_array['package_id']) . ")"`,未对 `$id_array['package_id']` 进行类型过滤或参数绑定。 | 严格使用框架查询构建器的 `where_in` 方法,或对输入数组进行强制整型转换。 | `$ids = array_map('intval', $id_array['package_id']);`<br>`$this->CI->db->where_in('wares_package._package_id', $ids);` |
| 🔴 严重 | 全文多处 | **金额计算精度丢失**:直接使用浮点数进行货币乘除(如 `$goods['_cost_price'] * $quantity`),PHP 浮点运算会导致 `0.1+0.2=0.30000000000000004` 类问题,极易引发财务对账差异。 | 财务计算必须使用 `bcmath` 扩展函数,或统一转换为“分”为单位的整数运算。 | `bcmul($price, $quantity, 2)`<br>或 `$price_cents = (int)round($price * 100);` |
| 🔴 严重 | `getOrderTypeInfo` 约 L330 | **逻辑覆盖/冗余赋值**:`$order['_prime_service_charge']` 被连续赋值两次,后者直接覆盖前者,导致前置计算结果丢失,业务逻辑错误。 | 删除重复赋值行,明确业务意图。若需区分“折前”与“折后”服务费,应使用不同键名。 | 移除 `$order['_prime_service_charge'] = $service_charge;` 或改为 `$order['_final_service_charge'] = $service_charge;` |
| 🟠 警告 | 全文多处 | **模型重复加载**:在方法内部多次调用 `$this->CI->load->model(...)`。虽然 CI 框架会缓存实例,但频繁调用增加解析开销且破坏代码整洁性。 | 将模型加载统一移至 `__construct()` 或方法顶部,按需使用。 | `// __construct 中统一加载`<br>`$this->CI->load->model(['Ahead_merchant_goods_model', 'Ahead_vip_level_model', ...]);` |
| 🟠 警告 | `_create_insert_infos_data` 等 | **静态属性访问不规范 & 重复计算**:通过实例访问静态属性 `$this->CI->Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME`,且在多处重复调用 `count()`。PHP 8+ 已废弃此写法。 | 直接通过类名访问静态属性,并将结果缓存为类属性,避免重复计算。 | `private $vip_max_level;`<br>`// 构造时赋值`<br>`$this->vip_max_level = count(Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME);` |
| 🟠 警告 | `getOrderTypeInfo` | **异常处理不规范**:使用全局函数 `throwError()` 中断流程,破坏面向对象封装,且无法被上层 `try-catch` 统一捕获,不利于事务回滚。 | 改用标准 `throw new \Exception()` 或自定义业务异常类,配合事务机制处理。 | `throw new \InvalidArgumentException("商品{$val['_goods_name']}已被禁用");` |
| 🟡 建议 | 类定义/方法名 | **命名不符合 PSR-12**:类名 `Neworderservice` 未使用大驼峰;方法 `rest_goods_price_by_un_vip` 存在拼写错误(应为 `reset`);变量命名风格混杂。 | 遵循 PSR-12 规范:类名 `NewOrderService`,方法名 `resetGoodsPriceByUnVip`,属性使用小驼峰。 | `class NewOrderService { public function resetGoodsPriceByUnVip(...) }` |
| 🟡 建议 | `getOrderTypeInfo` | **方法过长/违反单一职责**:该方法超 600 行,混合了数据校验、价格计算、优惠券匹配、订单组装等逻辑,圈复杂度过高,极难测试与维护。 | 拆分为独立私有方法或策略类,如 `validateGoods()`, `calculatePrice()`, `applyDiscounts()`, `buildOrderData()`。 | 提取 `private function calculatePackagePrice(...)` 等方法,主方法仅负责流程编排。 |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入漏洞**:将 `implode` 拼接的 SQL 条件替换为框架查询构建器或严格类型过滤,防止恶意输入导致数据泄露或篡改。
2. **统一财务计算精度**:全局替换浮点数直接运算,引入 `bcmath` 或“分”单位整数计算,并在输出前统一格式化,确保财务数据绝对准确。
3. **修正重复赋值逻辑**:排查 `$order['_prime_service_charge']` 及 `$result['service_charge']` 的重复赋值问题,避免业务计算结果被意外覆盖。
### 🛠 后续重构与优化方向
1. **架构拆分(SRP 原则)**:
- 将 `getOrderTypeInfo` 拆分为:`校验层`(商品状态/库存/权限)、`计算层`(原价/会员价/折扣/服务费)、`组装层`(订单结构/明细)。
- 针对订单类型 `1/13` 与 `2/4`,建议引入 **策略模式(Strategy Pattern)**,将不同订单类型的计价逻辑抽离为独立类,消除庞大的 `switch-case`。
2. **依赖注入与模型管理**:
- 避免在业务方法中动态 `load->model()`,改为在构造函数中注入或统一加载。若 `phpci` 支持 DI 容器,建议通过容器解析模型依赖。
3. **异常与事务控制**:
- 使用 `try-catch` 包裹核心下单流程,结合数据库事务(`$this->CI->db->trans_start()` / `trans_complete()`),确保价格计算失败或库存校验不通过时能安全回滚。
4. **框架适配提示**:
> 基于代码特征(`defined('BASEPATH')`, `get_instance()`, `$this->CI->load->model()`),该代码高度符合 **CodeIgniter 3** 架构。若 `phpci` 为内部定制框架,请查阅其官方文档确认:
> - 查询构建器是否支持 `where_in` 参数绑定
> - 模型加载机制是否支持自动依赖注入
> - 全局异常处理钩子(`_exception_handler`)的配置方式
如需对截断部分或特定业务分支(如优惠券抵扣逻辑、会员升级推荐算法)进行深度审查,请提供完整代码片段。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779869668
|
1779869668
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
368
|
21
|
112
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `957cbb6a7 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `957cbb6a73dfead2972a3f1e02720cb6c81d94bc`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:18:07
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖全面,能处理多场景(KTV/台球/棋牌/酒馆)、套餐规则、跨天营业等复杂预订需求。但代码存在严重的架构设计缺陷:静态缓存未隔离租户、直接污染全局 `$CI` 实例、核心方法严重违反单一职责原则。时间处理依赖大量字符串拼接与未定义的辅助函数,可维护性与可测试性较低。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据目录结构、`get_instance()`、`$this->load->model()` 等特征,该代码实际基于 **CodeIgniter 3** 架构。若 `phpci` 为内部定制框架,请对照其官方文档调整。以下审查基于 CI3 最佳实践与现代 PHP 规范。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 静态属性/缓存 | `self::$book_days_info`、`self::$shop_data` 等静态缓存未区分 `merchant_id` 与 `shop_id`。在多租户/多门店并发或长连接环境下,会导致严重的数据串扰与越权访问。 | 为静态缓存增加复合键,或改用 CI Cache/Redis 驱动,并设置合理 TTL。避免在 Model 中使用无状态隔离的静态变量。 | `private static $cache = [];`<br>`$key = md5($merchant_id . '_' . $shop_id . '_' . $date);`<br>`if (isset(self::$cache[$key])) return self::$cache[$key];`<br>`self::$cache[$key] = $result;` |
| 🔴 严重 | 多处 | 直接修改全局 `$CI` 实例属性(如 `$CI->operational_scene`、`$CI->package_not_available_time`、`$CI->change_book_order_id`)。破坏框架请求隔离机制,极易引发并发状态污染与难以追踪的隐蔽 Bug。 | 严禁修改 `$CI` 全局状态。应通过类属性、方法返回值、Session 或 Config 传递上下文数据。 | 移除 `$CI->xxx = ...`,改为 `$this->operational_scene = $scene;` 或作为参数/返回值传递。 |
| 🔴 严重 | `get_book_day_time_info` | 方法超 300 行,混合了配置加载、时间区间计算、多规则校验(套餐/锁定/营业/清扫)、数据格式化。严重违反单一职责原则(SRP),无法进行单元测试,后期维护成本极高。 | 拆分为独立私有方法,或抽离为 `BookingTimeCalculator` 服务类。按职责分层:配置获取 → 基础时间生成 → 规则过滤 → 结果组装。 | 见下方【重构方向】建议。 |
| 🟠 警告 | 多处 | 大量使用硬编码魔法值(如 `'1'`, `'2'`, `'merchantApp'`, `'-1'`, `'7'`),缺乏语义化常量。业务逻辑变更时极易遗漏或误改。 | 定义类常量或全局配置常量,提升代码可读性与安全性。 | `const SCENE_KTV = '1'; const SCENE_BILLIARDS = '2';`<br>`const STATUS_AVAILABLE = '1'; const STATUS_UNAVAILABLE = '-1';` |
| 🟠 警告 | `_get_un_book_time` 及循环内 | 频繁调用 `get_shop_setting()` 获取配置,未做批量查询或内存缓存。在复杂请求链路中易引发 N+1 查询与数据库性能瓶颈。 | 在方法入口一次性批量获取所需配置,或使用 CI Cache 缓存门店配置项。 | `$keys = ['book_minute_unit', 'book_hour_options', ...];`<br>`$configs = $this->ahead_shop_config_second_model->get_batch_settings($mid, $sid, $keys);` |
| 🟠 警告 | `array_intersect(...)` | `array_intersect(...array_values($all_room_book_time))` 在数组为空或仅含一个元素时,PHP 会抛出 `Warning`,且解包逻辑不符合预期。 | 增加数组长度安全判断,或使用循环计算交集。 | `if (count($all_room_book_time) > 1) { $un_book_time = array_intersect(...array_values($all_room_book_time)); } else { $un_book_time = $all_room_book_time[0] ?? []; }` |
| 🟡 建议 | 全局 | 未遵循 PSR-12 规范:缺少严格类型声明、属性可见性不统一、注释不完整、行过长。部分辅助函数(如 `timeToHour`, `shiftTimeRange`)未提供定义,难以评估其边界行为。 | 补充 `declare(strict_types=1);`,为方法参数/返回值添加类型提示,统一使用 `private/protected` 属性,完善 PHPDoc。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
| 🟡 建议 | 时间处理 | 依赖大量自定义辅助函数与字符串拼接处理时间,缺乏时区控制与 `DateTimeImmutable` 对象封装。跨天、24小时制、边界分钟计算易出现逻辑漏洞。 | 引入 `DateTimeImmutable` 或专用时间区间 Value Object 替代字符串操作,提升类型安全与可读性。 | 建议使用 `Carbon` 或原生 `DateTimeImmutable` 进行区间计算,避免 `strtotime` + 字符串拼接。 |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **隔离静态缓存**:立即为所有 `self::$xxx` 静态属性添加 `merchant_id` + `shop_id` + `date` 的复合键,或彻底移除静态缓存改用 CI Cache/Redis,杜绝多租户数据串扰。
2. **清除全局 `$CI` 污染**:全面排查并移除 `$CI->xxx = ...` 赋值操作。将上下文数据改为通过方法参数传递或封装在类实例属性中。
3. **拆分超长方法**:将 `get_book_day_time_info` 拆分为至少 4 个独立步骤:
- `loadBookingConfig()`:加载门店与场景配置
- `generateBaseTimeSlots()`:生成基础时间轴
- `applyBookingRules()`:应用套餐、锁定、清扫、营业规则过滤
- `formatTimeSlots()`:组装最终返回结构
### 🛠 后续重构与优化方向
- **引入策略模式**:不同场景(KTV/台球/棋牌/酒馆)的预订规则差异较大,建议定义 `BookingRuleInterface`,按场景注入对应策略类,替代冗长的 `if/elseif` 分支。
- **时间区间对象化**:创建 `TimeRange` 值对象,封装 `start`, `end`, `isOverlap()`, `merge()`, `shift()` 等方法,彻底替代当前散落的字符串与数组操作。
- **完善输入校验**:对 `$params` 数组进行严格类型校验与白名单过滤,避免未定义键导致 `Undefined index` 警告或逻辑跳过。
- **补充单元测试**:核心时间计算逻辑必须覆盖边界用例(如跨天 23:55-00:05、24小时营业、套餐时长不足、并发锁定等),建议引入 `PHPUnit` 建立测试基线。
> ⚠️ **局限性说明**:您提供的代码片段在 `_get_un_book_time` 方法末尾被截断,无法完整评估次日时间计算、清扫逻辑闭环及最终返回结构。建议补充完整文件后再次提交审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779869887
|
1779869887
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
372
|
21
|
113
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `ccc72448c ## 自动代码审查报告
**分支**: pay-260519
**提交**: `ccc72448c881e39cebbc23ef0bd26770da488063`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:20:13
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该文件为典型的业务核心计价与订单组装类,承载了商品/套餐价格计算、VIP折扣、服务费、优惠券抵扣等复杂逻辑。整体功能完整,但存在**严重的方法臃肿、重复代码、遗留调试输出、潜在SQL注入及金额精度风险**。代码结构偏向过程式,未充分利用面向对象设计原则,且多处违反现代 PHP 与 CI3 最佳实践。
- **风险等级**:🔴 高(存在破坏 API 响应、数据覆盖、SQL 注入及金额计算偏差风险)
> 📌 **框架说明**:从 `defined('BASEPATH')`、`get_instance()`、目录结构及加载方式判断,该项目实际使用的是 **CodeIgniter 3** 框架,而非 `phpci`(phpci 为 CI/CD 持续集成工具)。以下审查基于 CI3 架构与 PSR-12 规范进行。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | ~L388 | 遗留调试代码 `echo $vip_upgrade_data_actual_pay;` 会直接输出到响应流,破坏 JSON/XML 结构,导致前端解析崩溃。 | 立即删除该 `echo`。生产环境严禁使用 `echo`/`print_r`/`var_dump`,应使用日志组件记录。 | `// 删除此行,如需记录请使用:log_message('debug', 'Upgrade pay: ' . $vip_upgrade_data_actual_pay);` |
| 🔴 严重 | ~L155 & L160 | 数组键 `$order['_prime_service_charge']` 被重复赋值,后者 `$service_charge` 覆盖前者,导致业务逻辑错乱。 | 明确业务意图,保留正确赋值,删除冗余行。 | `$order['_prime_service_charge'] = $service_charge; // 确认意图后仅保留一行` |
| 🔴 严重 | ~L248 | SQL 注入风险:`implode(",", $id_array['package_id'])` 直接拼接进 SQL 字符串传入模型。若 `$id_array` 含用户输入,将导致注入。 | 使用 CI3 Query Builder 的 `where_in()` 或参数绑定,严禁手动拼接 `IN` 条件。 | `$this->CI->db->where_in('_package_id', $id_array['package_id'])->get('wares_package_goods')->result_array();` |
| 🟠 警告 | 全文多处 | 模型重复加载:`$this->CI->load->model()` 在循环或方法内多次调用,增加不必要的 I/O 与内存开销。 | 将高频使用的模型统一在 `__construct()` 或方法顶部加载一次。 | `public function __construct() { $this->CI->load->model(['Ahead_merchant_goods_model', 'Ahead_vip_level_model', ...]); }` |
| 🟠 警告 | ~L100, L280 | 浮点数精度丢失:金额计算直接使用 `*`、`/` 和 `sprintf("%.2f")`,PHP 浮点运算易产生 `0.1+0.2=0.30000000000000004` 类偏差。 | 涉及财务计算统一转为“分”(整数运算)或使用 `bcmath` 扩展。 | `$actual_pay = bcmul($price, $quantity, 2); // 或使用 int 分单位计算后除以 100` |
| 🟠 警告 | ~L300 | 魔法数字泛滥:`-1`, `1`, `100`, `9999999999999` 等硬编码散落全文,状态含义不透明,维护成本高。 | 提取为类常量,使用语义化命名。 | `private const STATUS_DISABLED = -1; const MAX_REWARD_AMOUNT = 9999999999999; const DISCOUNT_RATE_BASE = 100;` |
| 🟡 建议 | ~L40 | `getOrderTypeInfo` 方法过长(>600行),嵌套深,违反单一职责原则(SRP),可读性与可测试性极差。 | 拆分为独立私有方法:`processGoodsOrder()`, `processPackageOrder()`, `calculateServiceCharge()`, `applyVipDiscount()` 等。 | 采用策略模式或提取子方法,将主方法控制在 50 行以内。 |
| 🟡 建议 | 全文 | 类名与属性不符合 PSR-12:`Neworderservice` 应为 `NewOrderService`;大量 `public` 属性暴露内部状态,易被外部误改。 | 遵循 PSR-12 命名规范;将属性改为 `private/protected`,通过构造函数或 Setter 注入必要参数。 | `class NewOrderService { private $room_id = 0; public function setRoomId(int $id): self { $this->room_id = $id; return $this; } }` |
| 🟡 建议 | ~L20 | `throwError()` 非 PHP 原生机制。若其内部调用 `exit/die`,将导致数据库事务无法回滚、中间件生命周期中断。 | 改用标准异常 `throw new \RuntimeException(...)`,确保上层可 `try-catch` 并安全回滚。 | `throw new \RuntimeException("商品已售完,请联系商家", 100);` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即移除 `echo` 调试输出**:防止线上 API 响应格式损坏。
2. **修复重复赋值逻辑**:确认 `$order['_prime_service_charge']` 与 `$result['service_charge']` 的正确业务含义,消除覆盖 Bug。
3. **修复 SQL 拼接隐患**:将 `implode` 拼接的 `IN` 查询替换为 CI3 的 `where_in()` 或预处理语句。
4. **统一异常处理机制**:将 `throwError` 替换为 `throw new \Exception()`,确保事务与框架生命周期可正常回滚。
### 🛠 后续重构与优化方向
1. **方法拆分与职责分离**:`getOrderTypeInfo` 承载了太多职责。建议按订单类型(商品/套餐/开房)拆分为独立处理器,或引入**策略模式**(`OrderTypeStrategy`)动态路由计算逻辑。
2. **财务计算规范化**:引入 `Money` 值对象或使用 `bcmath`/整数分单位进行所有金额运算,避免浮点精度漂移导致的对账差异。
3. **依赖注入与模型预加载**:在 `__construct` 中集中加载模型,避免运行时重复 `load->model()`。考虑逐步向 CI4 或现代 PHP 的依赖注入容器过渡。
4. **常量与枚举替代魔法值**:将状态码(如 `-1` 禁用、`1` 启用、`100` 折扣基数)定义为 `const` 或 PHP 8.1+ `enum`,提升代码自解释性。
5. **单元测试覆盖**:该计价逻辑复杂度高,强烈建议补充 PHPUnit 测试用例,覆盖 VIP 折扣边界、服务费计算、优惠券叠加、免单逻辑等核心分支。
> ⚠️ **局限性说明**:您提供的代码在 `$result['have_good` 处被截断,未能完整展示方法结尾及后续逻辑。若截断部分包含事务提交、数据库写入或关键返回逻辑,请补充完整代码以便进行闭环审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779870013
|
1779870013
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
374
|
21
|
114
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `f60da7484 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `f60da748498cde8057bf3eb5a1f033392744a180`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:28:55
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算与业务规则判断,逻辑耦合度高。存在多处架构设计缺陷(如顶部全局实例调用、静态属性滥用、巨型方法)、潜在运行时崩溃风险(空数组展开)以及明显的代码重复。整体可维护性、测试性与安全性较弱,需系统性重构。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 文件顶部 (第2行) | 在类外部直接调用 `$CI = &get_instance();`。在 PHP 请求生命周期中,框架实例尚未初始化或已销毁,会导致 `Fatal Error` 或不可预期的行为。 | 删除顶部全局调用。在类内部统一使用 `$this->load->model()` / `$this->load->library()` 加载依赖。 | `// 删除: $CI = &get_instance();`<br>`// 改为在方法内使用: $this->load->model('Simple_model');` |
| 🔴 严重 | `get_book_day_time_info` 方法内 | `array_intersect(...array_values($all_room_book_time))` 当 `$all_room_book_time` 为空数组时,展开运算符 `...` 会传递 0 个参数,触发 `ArgumentCountError` 致命错误。 | 增加数组长度校验,或使用 `call_user_func_array` 安全调用。 | `if (count($all_room_book_time) > 1) {<br> $un_book_time = array_intersect(...array_values($all_room_book_time));<br>} elseif (count($all_room_book_time) === 1) {<br> $un_book_time = reset($all_room_book_time);<br>}` |
| 🔴 严重 | 多处 (`self::$book_days_info` 等) | 滥用 `public static` 属性作为请求级缓存。在 PHP-FPM、Swoole 或常驻内存环境中会导致**数据串扰**与**内存泄漏**,且严重破坏单元测试的隔离性。 | 移除静态缓存。改用框架 Cache 组件(如 Redis/Memcached)或依赖注入容器管理请求级状态。 | `// 移除 public static $book_days_info = [];`<br>`// 改用: $cache_key = "book_days:{$merchant_id}:{$shop_id}";`<br>`$result = $this->cache->get($cache_key);` |
| 🟠 警告 | `set_shop_config()` & `set_room_info()` | 两个方法存在约 80% 的重复逻辑(场景前缀计算、配置加载、分钟单位换算),违反 DRY 原则,后期维护极易遗漏同步。 | 提取私有方法 `_get_scene_prefix()` 与 `_apply_shop_config()` 统一处理配置加载。 | `private function _get_scene_prefix(string $scene): string {<br> return match($scene) {<br> '2' => 'billiards_',<br> '3' => 'card_',<br> '4' => 'tavern_',<br> default => ''<br> };<br>}` |
| 🟠 警告 | `get_book_day_time_info()` | 方法超过 300 行,混合了数据查询、时间区间计算、状态标记、套餐规则校验、营业时间过滤等,违反单一职责原则(SRP),极难调试与测试。 | 拆分为独立方法:`_fetch_booking_data()`, `_calculate_time_slots()`, `_apply_package_rules()`, `_filter_by_business_hours()`。 | 建议将时间区间交集判断封装为独立工具类 `TimeRangeCalculator::hasOverlap($a, $b)`。 |
| 🟠 警告 | 多处 `$params['key']` | 直接访问 `$params` 数组键未做存在性检查,当外部传入缺失字段时会触发 `Undefined index` 警告,可能导致逻辑分支异常。 | 使用空值合并运算符 `??` 或提前进行参数校验。 | `$date = $params['date'] ?? '';`<br>`$book_model = $params['book_model'] ?? '1';` |
| 🟡 建议 | 全局 | 大量硬编码魔法值(如 `'1'`, `'2'`, `'-1'`, `'merchantApp'`, `'7'`)散落在业务逻辑中,可读性差且易出错。 | 定义类常量或枚举类集中管理。 | `const SCENE_KTV = '1';`<br>`const SCENE_BILLIARDS = '2';`<br>`const STATUS_AVAILABLE = '1';` |
| 🟡 建议 | 全局 | 缺乏现代 PHP 类型声明(参数类型、返回值类型、属性可见性),不符合 PSR-12 及 PHP 8+ 最佳实践。 | 为所有公开方法添加类型提示,明确属性可见性(`protected`/`private`)。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
| 🟡 建议 | 时间处理逻辑 | 依赖 `date()` 和 `strtotime()` 未显式指定时区,在多租户或跨时区部署时极易产生“差一天/差一小时”的边界 Bug。 | 统一使用 `DateTimeImmutable` 或框架时区配置,避免隐式时区转换。 | `$dt = new DateTimeImmutable($date, new DateTimeZone('Asia/Shanghai'));` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **移除顶部 `$CI = &get_instance();`**:这是导致应用启动崩溃或状态污染的根源。所有框架实例访问必须收敛至类方法内部。
2. **修复 `array_intersect` 空数组展开崩溃**:在调用前增加 `count() > 1` 判断,避免生产环境 500 错误。
3. **废弃 `public static` 缓存**:立即替换为框架 Cache 组件或请求级单例模式,防止持久化进程下的数据串扰与内存泄漏。
4. **补充 `$params` 参数校验**:在方法入口处统一校验必填字段,使用 `??` 提供安全默认值,阻断 `Undefined index` 传播。
### 🛠 后续重构与优化方向
- **架构拆分**:将 `get_book_day_time_info` 拆分为“数据获取层”、“时间计算层”、“规则过滤层”。建议引入策略模式处理不同预订模型(时长预订 vs 套餐预订)的差异逻辑。
- **配置加载优化**:当前多次调用 `get_shop_setting` 获取不同配置项,建议改为批量查询或一次性加载门店配置到内存数组中,减少数据库 I/O。
- **时间区间计算标准化**:当前大量使用 `array_intersect`、`shiftTimeRange`、`mergeTimeRanges` 等自定义函数处理时间交集。建议引入成熟的时间区间处理库(如 `spatie/period`)或封装独立的 `TimeSlotManager` 类,提升边界条件(跨天、重叠、包含)的准确性。
- **规范与静态分析**:全面对齐 PSR-12 规范,补充 PHPDoc 与类型声明。建议接入 `PHPStan` 或 `Psalm` 进行静态代码分析,提前捕获类型不匹配与未定义变量问题。
- **框架适配说明**:代码结构高度类似 CodeIgniter 3。若 `phpci` 为内部定制框架,请查阅其官方文档确认 `get_instance()` 的生命周期与模型加载规范。但无论何种框架,**模型层不应承担视图/控制器职责**,且应严格遵循依赖注入或标准加载器模式。
> 💡 **提示**:由于未提供 `Simple_model` 父类实现及外部辅助函数(如 `throwError`, `mergeTimeRanges` 等)的定义,本次审查主要聚焦于当前文件可见的逻辑与架构问题。建议在完整上下文中补充单元测试,重点覆盖跨天预订、套餐时长不足、营业时间边界等核心场景。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779870535
|
1779870535
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
377
|
21
|
115
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `7a26bc126 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `7a26bc126a88c6deedb8b70b5c8031ae5b33e1bb`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:33:56
---
## 1. 审查摘要
- **代码质量评分**:6.0 / 10 分
- **总体评价**:代码实现了较为复杂的订单计价与包厢预订时间计算逻辑,业务覆盖全面。但存在典型的“上帝方法(God Method)”特征,方法体过长、职责不单一;遗留了调试输出语句;金额计算缺乏高精度控制;且未遵循现代 PHP 类型声明规范。整体可维护性较低,存在线上稳定性与精度风险。
- **风险等级**:🔴 高(涉及金额精度、调试输出污染、逻辑覆盖风险)
> ⚠️ **局限性说明**:提供的代码片段在末尾被截断(如 `getOrderTypeInfo` 未闭合、`Ahead_shop_book_time_info_model.php` 结尾不完整)。本次审查仅基于可见代码进行,若截断部分包含关键事务提交、锁机制或异常回滚逻辑,请补充后二次审查。
> 📌 **框架说明**:代码结构高度符合 `CodeIgniter 3` 规范(`BASEPATH`、`get_instance()`、`$this->load->model()`)。若 `phpci` 为内部定制框架,请结合其官方文档确认组件加载与生命周期差异。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Neworderservice.php` (约第 380 行) | 循环体内遗留 `echo $vip_upgrade_data_actual_pay;` 调试语句。在 API 或 JSON 响应场景下会直接破坏输出结构,导致前端解析失败。 | 立即移除 `echo`,替换为日志记录(如 `log_message('debug', ...)`)或直接删除。 | `// 移除该行,或改为:<br>log_message('debug', 'VIP升级金额累加: ' . $vip_upgrade_data_actual_pay);` |
| 🔴 严重 | `Neworderservice.php` (多处) | 金额计算全程使用浮点数直接乘除累加(如 `$actual_pay += ...`),PHP 浮点数精度缺陷会导致 `0.1+0.2=0.30000000000000004` 类问题,最终结算金额可能偏差。 | 引入 `bcmath` 扩展进行高精度计算,或统一将金额转为“分(整数)”计算,仅在输出时格式化。 | `$actual_pay = bcadd($actual_pay, bcmul($price, $quantity, 2), 2);` |
| 🟠 警告 | `Neworderservice.php` (约第 400 行) | `$order['_prime_service_charge']` 与 `$result['service_charge']` 被重复赋值覆盖,逻辑冗余且易掩盖真实业务意图。 | 清理重复赋值,明确变量职责。若为笔误,保留最终计算值即可。 | `// 删除重复行:<br>$order['_prime_service_charge'] = $service_charge;` |
| 🟠 警告 | `Neworderservice.php` / `Model` 多处 | 频繁在业务方法内部调用 `$this->CI->load->model()` 或 `get_instance()`。CI 框架每次调用均会触发文件包含与实例化检查,造成不必要的性能损耗。 | 将依赖模型统一在 `__construct` 中加载,或配置 CI 的 `autoload.php`。 | `public function __construct() {<br> $this->CI =& get_instance();<br> $this->CI->load->model(['Ahead_vip_level_model', 'Ahead_merchant_goods_model']);<br>}` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php` (多处) | 大量使用 `strtotime()` + `date()` 进行时间区间运算,未处理时区/夏令时边界,且在循环中重复调用性能较差。 | 使用 PHP `DateTime` 与 `DateInterval` 对象替代,提升准确性与可读性。 | `$dt = new DateTime($date, new DateTimeZone('Asia/Shanghai'));<br>$dt->modify('+1 day');<br>$nextDate = $dt->format('Ymd');` |
| 🟠 警告 | `Neworderservice.php` (约第 100 行) | `count($this->CI->Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME)` 通过实例访问静态属性。PHP 8.2+ 已弃用此语法,将触发 `Deprecated` 警告。 | 直接使用类名访问静态属性。 | `count(Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME)` |
| 🟡 建议 | `Neworderservice.php` (方法名) | `rest_goods_price_by_un_vip` 存在拼写错误,语义应为 `reset`(重置)。 | 重命名方法并全局替换调用处,保持命名一致性。 | `public function reset_goods_price_by_un_vip(...)` |
| 🟡 建议 | 两文件全篇 | 缺乏类型声明(属性、参数、返回值),违反 PSR-12 规范,降低静态分析工具(PHPStan/Psalm)检测能力与 IDE 提示体验。 | 逐步补充 PHP 7.4+/8.0+ 类型提示。 | `public function getOrderTypeInfo(string $type, array $id_array, array $goods_quantity, int $get_actual_pay = -1, array &$goods_reward = []): array` |
| 🟡 建议 | `Neworderservice.php` (多处) | 魔法数字泛滥(如 `9999999999999`、`1000`、`100`、`-1`、`1`),业务含义不透明,后期维护困难。 | 提取为类常量或配置文件,增强语义。 | `const MAX_REWARD_AMOUNT = 9999999999999;<br>const VIP_DISCOUNT_BASE = 100;` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **立即移除 `echo` 调试代码**:防止破坏 API 响应结构或引发前端白屏。
2. **统一金额计算精度**:将核心计价逻辑中的浮点运算替换为 `bcmath` 函数族(`bcadd`, `bcmul`, `bcsub`),或在入库/返回前强制 `round($val, 2)`。
3. **清理重复赋值与冗余逻辑**:检查 `$order['_prime_service_charge']` 等覆盖赋值,确认业务真实意图,避免财务对账差异。
### 🛠 后续重构与优化方向
1. **拆分“上帝方法”**:`getOrderTypeInfo` 与 `get_book_day_time_info` 均超过 300 行,圈复杂度极高。建议按业务域拆分为独立方法或类:
- `calculateGoodsPrice()`
- `calculatePackagePrice()`
- `applyVipDiscount()`
- `calculateServiceCharge()`
- 使用 **策略模式(Strategy Pattern)** 替代冗长的 `switch ($type)`,提升扩展性。
2. **优化模型加载与依赖注入**:CI 框架中频繁 `load->model` 会拖慢响应。建议在 `__construct` 中集中加载,或考虑迁移至依赖注入容器(若框架支持)。
3. **强化输入校验与安全边界**:
- `$id_array`、`$params` 等外部传入数据应使用 CI 的 `form_validation` 或自定义校验器进行类型/范围过滤。
- `throwError()` 若直接输出异常信息,需确保已过滤敏感路径或 SQL 语句,避免信息泄露。
4. **补充现代 PHP 规范**:逐步添加 `declare(strict_types=1);`、属性类型声明、方法返回值类型。可借助 `PHP_CodeSniffer` (PSR-12) 与 `PHPStan` 进行自动化流水线检查。
5. **时间计算重构**:预订逻辑涉及大量跨天、时段合并、区间交集运算。建议封装独立的 `TimeRangeCalculator` 工具类,使用 `DateTimeImmutable` 保证不可变性,避免隐式状态污染。
> 💡 **提示**:若 `phpci` 框架内置了事务管理、缓存驱动或权限中间件,请优先使用框架原生组件替代手写逻辑。建议查阅 `phpci` 官方文档中关于 `Database Transactions`、`Cache` 及 `Middleware` 的最佳实践章节。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779870837
|
1779870837
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
378
|
21
|
116
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `d51040a64 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `d51040a64d4ca444a5aa3542ab2812879528d3ff`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:34:53
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了较为复杂的订单计价、会员折扣、包厢预订时段计算等核心业务逻辑,但存在明显的调试代码残留、变量覆盖、SQL 拼接隐患及方法过长等问题。整体架构偏向“过程式堆砌”,缺乏模块化拆分与常量管理,可维护性与扩展性较弱。
- **风险等级**:🔴 高(存在破坏 API 响应、服务费计算错误及潜在 SQL 注入风险)
> 📌 **框架说明**:代码结构、`BASEPATH`、`get_instance()` 及 `$this->CI->load->model()` 等特征高度符合 **CodeIgniter 3** 规范。若 `phpci` 为贵司内部定制分支,请确保以下建议与底层核心兼容。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Neworderservice.php` ~L450 | 遗留 `echo $vip_upgrade_data_actual_pay;` 调试语句。在 API 场景下会直接输出到响应体,破坏 JSON/XML 结构,导致客户端解析崩溃。 | 立即移除 `echo`,如需记录日志请使用 CI 日志组件 `$this->CI->log->write_log()`。 | `// 删除该行,或替换为:<br>$this->CI->log->write_log('debug', 'vip_upgrade_actual_pay: ' . $vip_upgrade_data_actual_pay);` |
| 🔴 严重 | `Neworderservice.php` ~L520 | 变量重复赋值覆盖:`$order['_prime_service_charge']` 先被赋值为 `$prime_after_paid_service_charge`,紧接着又被 `$service_charge` 覆盖,导致原始服务费计算结果丢失。 | 核对业务意图,若需保留两个值请重命名变量;若为笔误则删除冗余赋值。 | `$order['_prime_service_charge'] = $prime_after_paid_service_charge;<br>// 删除下方重复的 $order['_prime_service_charge'] = $service_charge;` |
| 🟠 警告 | `Neworderservice.php` ~L280 | 直接拼接 SQL 条件:`"wares_package._package_id in (" . implode(",", $id_array['package_id']) . ")"`,未对数组元素进行类型过滤,存在 SQL 注入风险。 | 使用 CI3 查询构造器 `where_in()`,或对 ID 进行 `(int)` 强转清洗。 | `$clean_ids = array_map('intval', $id_array['package_id']);<br>$this->CI->db->where_in('_package_id', $clean_ids);` |
| 🟠 警告 | `Neworderservice.php` 多处 | 频繁在业务方法内 `$this->CI->load->model()`,增加框架 I/O 开销;且 `$this->CI->Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME` 静态访问方式不规范。 | 将常用模型加载移至 `__construct()`;静态常量应通过类名直接访问。 | `// __construct 中:<br>$this->CI->load->model('Ahead_vip_level_model');<br>// 使用时:<br>$vip_max_level = count(Ahead_vip_level_model::VIP_LEVEL_DEFAULT_NAME);` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php` 多处 | 使用 `self::$book_days_info`、`self::$shop_data` 等静态属性缓存数据。在 PHP-FPM 长进程环境下易跨请求残留,且无失效机制,可能引发脏数据或内存泄漏。 | 改用 CI Cache 驱动或请求级单例,并设置合理 TTL。 | `$key = "shop_book_days_{$merchant_id}_{$shop_id}";<br>if (!$data = $this->cache->get($key)) {<br> // 计算逻辑...<br> $this->cache->save($key, $data, 300);<br>}` |
| 🟡 建议 | `Neworderservice.php` ~L150 | 财务金额计算使用 `sprintf("%.2f", ...)` 返回字符串类型,后续参与加减乘除会触发隐式类型转换,存在精度丢失隐患。 | 统一使用 `round($val, 2)` 返回浮点型,或引入 `bcmath` 扩展进行高精度计算。 | `$__wares_vip_price = round($wares_price_data['vip_price'] * $discount_goods_reward, 2);` |
| 🟡 建议 | 两个文件多处 | 核心方法过长(`getOrderTypeInfo` 超 500 行,`get_book_day_time_info` 超 400 行),严重违反单一职责原则(SRP),难以单元测试与后续迭代。 | 按业务边界拆分为独立私有方法,主方法仅负责流程编排。 | `private function calculateGoodsPricing($goods, $vip_info) {...}<br>private function calculatePackagePricing($package, $vip_info) {...}<br>public function getOrderTypeInfo(...) {<br> $goods_res = $this->calculateGoodsPricing(...);<br> $pkg_res = $this->calculatePackagePricing(...);<br> return $this->assembleOrderResult($goods_res, $pkg_res);<br>}` |
| 🟡 建议 | 两个文件多处 | 大量魔法数字散落(如 `-1`, `1`, `100`, `9999999999999`, `7`),缺乏语义化定义,可读性与维护成本高。 | 在类顶部定义 `const` 常量集中管理状态与阈值。 | `const STATUS_DISABLED = -1;<br>const DISCOUNT_BASE = 100;<br>const MAX_REWARD_AMOUNT = 9999999999999;<br>const PAY_PLATFORM_SCAN = 7;` |
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **清除调试输出**:全局搜索 `echo`、`var_dump`、`print_r`,确保生产环境无意外输出。
2. **修复变量覆盖**:定位 `$order['_prime_service_charge']` 重复赋值处,确认业务逻辑后修正,避免服务费结算错误引发客诉。
3. **SQL 注入防御**:将所有 `implode` 拼接的 `IN` 查询替换为 `$this->db->where_in()` 或严格类型过滤。
### 🛠 重构与优化方向
1. **方法拆分与职责收敛**:建议将 `Neworderservice` 拆分为 `OrderPriceCalculator`、`VipDiscountStrategy`、`PackageHandler` 等独立类,利用策略模式处理不同支付平台与会员等级的计价逻辑。
2. **财务计算规范化**:金额计算统一使用 `round($value, 2, PHP_ROUND_HALF_UP)`,若涉及分账或高精度对账,强烈建议迁移至 `bcmath` 函数族(如 `bcadd`, `bcmul`)。
3. **缓存机制升级**:移除模型中的静态数组缓存,改用 CI 内置 Cache 库(Redis/Memcached/File)并设置合理过期时间,避免 PHP-FPM 进程池数据污染。
4. **常量与枚举管理**:建立全局配置类或枚举文件,将 `-1`(禁用/不可用)、`1`(启用/可用)、`100`(折扣基数)等魔法值集中管理,提升代码自解释能力。
> ⚠️ **局限性说明**:由于提供的代码片段在 `Neworderservice.php` 末尾及 `Ahead_shop_book_time_info_model.php` 末尾被截断,部分上下文(如 `throwError` 实现、辅助函数 `shiftTimeRange`/`mergeTimeRanges` 定义、数据库事务控制)未能完整评估。建议在完整代码合并前补充上述缺失部分进行二次审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779870893
|
1779870893
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
379
|
21
|
117
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `1297c9757 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `1297c97575e9eb332e955aaa4f63a84310cf42eb`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:37:11
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了复杂的包厢预订时段计算逻辑,涵盖跨天营业、团购券校验、最低时长限制、清扫缓冲等业务场景。但存在明显的架构设计缺陷:静态缓存滥用导致状态污染、方法职责过重、时间计算缺乏时区安全、强依赖全局超对象且缺乏输入校验。整体可维护性与健壮性较低,需进行结构性重构。
- **风险等级**:🔴 高(静态缓存脏数据、时间计算边界漏洞、方法过长导致逻辑难以追踪)
> 📌 **注**:代码呈现典型的 **CodeIgniter 3** 架构特征(如 `get_instance()`、`$this->load->model()`)。若 `phpci` 为内部定制框架,请确认其生命周期与 CI 一致。以下审查基于 CI/PHP 通用最佳实践。此外,**文件末尾代码被截断**,部分逻辑(如下一天不可用时间的完整计算)无法全面评估。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 约 145-150 行 | **静态缓存状态污染**:`self::$book_days_info` 等静态变量在首次赋值后直接返回,未区分 `$merchant_id`、`$shop_id`、`$add_day` 等参数。同一请求处理不同门店/日期时将返回错误数据。 | 改为实例级缓存或带复合键的静态缓存,或在方法入口清空/校验缓存键。 | `private static $book_days_cache = [];<br>public function get_book_days_info(...) {<br> $cache_key = md5(implode('_', func_get_args()));<br> if (isset(self::$book_days_cache[$cache_key])) return self::$book_days_cache[$cache_key];<br> // ... 计算逻辑 ...<br> return self::$book_days_cache[$cache_key] = $result;<br>}` |
| 🔴 严重 | 约 200-210 行 | **静态门店数据缓存未区分门店**:`self::$shop_data` 仅缓存首次查询的门店配置。若同请求切换 `$shop_id`,将复用错误营业时间,导致时段计算全面错乱。 | 移除静态缓存,或改为 `self::$shop_data[$shop_id]` 键值对缓存。 | `if (!isset(self::$shop_data[$shop_id])) {<br> self::$shop_data[$shop_id] = $this->ahead_shop_model->get_one(...);<br>}<br>$shop_data = self::$shop_data[$shop_id];` |
| 🟠 警告 | 全文多处 | **频繁调用 `get_instance()`**:每次调用都会产生函数开销,且破坏 OOP 封装。CI 框架推荐在构造函数中绑定一次。 | 在类属性中声明 `$ci`,构造函数中赋值,后续统一使用 `$this->ci`。 | `private $ci;<br>public function __construct() {<br> parent::__construct();<br> $this->ci =& get_instance();<br>}` |
| 🟠 警告 | 约 250-400 行 | **时间计算未处理时区/夏令时**:大量使用 `strtotime()`、`date()` 及硬编码 `86400` 进行加减。在跨天、夏令时切换或服务器时区变更时极易产生 `±1小时` 偏差。 | 统一使用 `DateTimeImmutable` 或 `Carbon` 库,显式指定时区,避免直接操作时间戳。 | `$dt = new DateTimeImmutable($date, new DateTimeZone('Asia/Shanghai'));<br>$end = $dt->modify('+1 day')->setTime(0,0);` |
| 🟠 警告 | 约 280-350 行 | **魔法数字与状态码硬编码**:`'1'`、`'-1'`、`86400`、`3600`、`'7'` 等散落各处,语义不明且极易在后续维护中引发逻辑错误。 | 提取为类常量,统一命名规范。 | `const STATUS_AVAILABLE = '1';<br>const STATUS_UNAVAILABLE = '-1';<br>const SECONDS_PER_DAY = 86400;` |
| 🟠 警告 | 约 230-550 行 | **方法职责过重(SRP 违反)**:`get_book_day_time_info` 超过 300 行,混合了数据查询、时间区间合并、套餐校验、状态标记、前端展示字段组装。难以测试与维护。 | 拆分为独立方法:`fetchBookingData()`、`calculateUnavailableSlots()`、`applyPackageRules()`、`formatTimeSlots()`。 | 见下方重构建议 |
| 🟡 建议 | 约 300 行 | **数组解包潜在风险**:`array_intersect(...array_values($all_room_book_time))` 在数组为空时会抛出 `ArgumentCountError`。虽有 `count > 1` 保护,但边界仍脆弱。 | 使用 `array_reduce` 或显式循环求交集,或确保数组非空。 | `if (count($all_room_book_time) > 1) {<br> $un_book_time = array_intersect(...array_values($all_room_book_time));<br>} else {<br> $un_book_time = reset($all_room_book_time) ?? [];<br>}` |
| 🟡 建议 | 约 100-130 行 | **输入参数缺乏校验**:`$params` 直接用于数据库查询与逻辑分支,未校验类型、必填项或合法范围。 | 增加前置校验或使用 CI 的 `form_validation`/自定义验证器。 | `if (empty($params['merchant_id']) || empty($params['shop_id'])) {<br> throwError('缺少必要参数');<br>}` |
| 🟡 建议 | 全文 | **PSR-12 规范与注释缺失**:属性声明混杂、部分方法无 PHPDoc、长行未换行、全局函数(如 `throwError`、`mergeTimeRanges`)依赖隐式加载。 | 遵循 PSR-12 格式化,补充 `@param`、`@return`、`@throws`,显式加载依赖或使用 DI。 | 使用 `php-cs-fixer` 自动格式化,补充类型声明:`public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **静态缓存污染**:立即修复 `self::$book_days_info` 和 `self::$shop_data` 的缓存策略。这是导致线上“时段显示错乱/不可预订”的高频根因。
2. **时间计算安全**:将所有 `strtotime` + 秒数加减的逻辑替换为 `DateTimeImmutable` 或 `Carbon`,并统一时区配置(建议在 `index.php` 或框架入口设置 `date_default_timezone_set('Asia/Shanghai')`)。
3. **魔法数字常量化**:将 `'1'/'-1'`、`86400`、`3600` 等提取为类常量,提升代码可读性与可维护性。
### 🛠 后续重构与优化方向
1. **拆分巨型方法**:将 `get_book_day_time_info` 按职责拆分为 4~5 个私有方法。例如:
```php
private function calculateBaseUnavailableSlots($params): array
private function applyPackageConstraints(array &$slots): void
private function applyBusinessHoursConstraints(array &$slots): void
private function formatResponseSlots(array $slots): array
```
2. **引入策略模式处理规则**:当前大量 `if ($this->tuangou->verify_token)`、`if ($this->ignore_tuangou_time_limit)` 嵌套。建议抽象为 `BookingRuleInterface`,通过工厂或配置动态加载规则链,避免 `if-else` 爆炸。
3. **依赖注入替代全局加载**:逐步将 `$this->load->model()` 和 `$this->load->library()` 移至构造函数或通过 Service Container 注入,便于单元测试与 Mock。
4. **性能优化**:
- 对 `array_intersect`、`array_merge` 等高频数组操作,若数据量 > 1000,建议改用位运算或预计算索引。
- 考虑将 `prev_date` 和 `next_date` 的数据库查询合并为 `WHERE _date IN (...)` 批量查询,减少 DB 往返次数。
5. **补充单元测试**:针对跨天营业、套餐时长不足、清扫缓冲、不可用星期等边界场景编写 PHPUnit 用例,确保重构不破坏核心业务逻辑。
> 💡 **提示**:由于代码在 `$this->next_date_room_book_time = [...]` 处截断,后续关于“下一天不可用时间”的计算逻辑未完整展示。建议在完整提交后补充审查,重点关注跨天时间区间的合并算法与边界条件处理。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779871031
|
1779871031
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
380
|
21
|
118
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `9526c8bb4 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `9526c8bb434751493f71e1b7d7d1e13f97bc89bf`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:37:55
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了复杂的包厢预订时间计算逻辑,但存在明显的架构反模式(如模型强状态化、静态缓存键冲突、超长方法违反单一职责)。业务规则交织严重,可维护性与并发安全性较低。部分逻辑存在重复与潜在的性能瓶颈。
- **风险等级**:🔴 高(状态污染与缓存键冲突可能导致线上预订数据错乱)
> 📌 **框架说明**:从目录结构(`system/helpers/`、`application/models/`)及 `$CI = &get_instance()` 的调用方式判断,该代码实际基于 **CodeIgniter 3** 架构。若 `phpci` 为内部定制框架,请结合其官方文档对生命周期与组件加载方式进行微调。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` (约 L158) | **静态缓存键冲突**:`self::$book_days_info` 未区分 `$merchant_id`、`$shop_id`、`$date` 等参数。同一请求内多次调用不同参数时,会返回错误缓存数据,导致日期状态错乱。 | 移除静态变量缓存,改用 CI 缓存驱动(`$this->cache->save()`)或构建复合键。若必须用静态缓存,需使用参数哈希作为键名。 | `// 推荐方案:使用复合键缓存<br>$cache_key = md5(__METHOD__ . serialize(func_get_args()));<br>if (isset(self::$cache_pool[$cache_key])) return self::$cache_pool[$cache_key];` |
| 🔴 严重 | 全局 (Model 属性) | **模型强状态化反模式**:大量 `public` 属性(如 `$book_room_id`, `$ignore_tuangou_time_limit`, `$tuangou`)用于存储单次请求上下文。在并发请求或同一请求多次实例化时极易发生状态污染。 | 模型应保持无状态。将请求上下文封装为 DTO 对象或通过方法参数传递。复杂业务逻辑应剥离至 `Service` 层。 | `// 错误:$this->book_room_id = $id;<br>// 正确:public function calculate($params, $room_id) { ... }` |
| 🟠 警告 | `set_shop_config` & `set_room_info` | **逻辑重复**:两个方法中计算 `$shop_config_scene` 及加载配置的代码高度重复,违反 DRY 原则。 | 提取为私有方法 `private function resolveShopConfigScene($scene)`,统一调用。 | `private function resolveSceneConfig($scene) {<br> $map = ['2'=>'billiards_', '3'=>'card_', '4'=>'tavern_'];<br> return $map[$scene] ?? '';<br>}` |
| 🟠 警告 | `get_book_day_time_info` (约 L190-L450) | **方法过长 & 违反单一职责**:该方法超 250 行,混合了营业时间计算、套餐规则过滤、不可用时间合并、跨天逻辑、状态标记等。极难测试与维护。 | 拆分为独立私有方法:`_calculateBusinessHours()`, `_applyPackageRules()`, `_mergeUnavailableTimes()`, `_filterTimeSlots()`。主方法仅负责流程编排。 | `// 主方法仅保留流程控制<br>$time_info = $this->_buildBaseTimeSlots($date);<br>$time_info = $this->_applyPackageConstraints($time_info, $params);<br>$time_info = $this->_filterByAvailability($time_info, $un_book_time);` |
| 🟠 警告 | 多处 (`$CI = &get_instance()`) | **频繁获取 CI 实例**:在多个方法中重复调用 `&get_instance()`,且直接读取控制器属性(如 `$CI->merchant_id`)。破坏封装性且增加开销。 | 在构造函数中统一赋值 `$this->ci = &get_instance();`,后续使用 `$this->ci`。控制器上下文应通过参数或 Session/Config 传递。 | `public function __construct() {<br> parent::__construct();<br> $this->ci = &get_instance();<br>}` |
| 🟡 建议 | `get_book_day_time_info` (约 L195) | **输入校验不足**:仅判断 `$date` 是否为空,未校验格式(如 `Ymd`)。非法日期传入 `strtotime` 会导致静默失败或返回错误时间戳。 | 增加正则或 `DateTime::createFromFormat` 校验,失败时抛出明确异常。 | `if (!preg_match('/^\d{8}$/', $date)) {<br> throwError('日期格式错误,应为 YYYYMMDD');<br>}` |
| 🟡 建议 | 全局 (硬编码字符串) | **魔法值泛滥**:`'1'`, `'2'`, `'3'`, `'merchantApp'`, `'-1'` 等散落在业务逻辑中,语义不明确且易改漏。 | 在类顶部定义常量:`const SCENE_KTV = '1'; const SCENE_BILLIARDS = '2'; const SOURCE_MERCHANT_APP = 'merchantApp';` | `if ($scene === self::SCENE_BILLIARDS) { ... }` |
| 🟡 建议 | `_get_un_book_time` (末尾截断) | **代码片段不完整**:方法在 `if (empty($this->next_date_room_book_time))` 处中断,无法审查后续逻辑(如次日时间合并、边界处理)。 | 请补充完整代码以便进行闭环审查。当前可见部分已存在多次重复的 `get_one` 查询,建议合并为批量查询。 | *(待补充)* |
---
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **消除模型状态污染**:立即将 `$book_room_id`、`$ignore_tuangou_time_limit`、`$tuangou` 等请求级状态移出 Model 属性。建议创建 `BookingTimeCalculator` 服务类,通过构造函数或方法参数注入上下文。
2. **修复静态缓存键冲突**:`self::$book_days_info` 等静态缓存必须加入参数指纹(如 `md5($merchant_id . $shop_id . $date)`),否则在多门店/多日期并发查询时必现数据串扰。
3. **拆分巨型方法**:`get_book_day_time_info` 是典型“上帝方法”。请按“数据获取 → 规则计算 → 状态过滤 → 结果格式化”四个阶段拆分为独立方法,并补充单元测试。
### 🛠 后续重构与优化方向
- **架构分层**:遵循 `Controller → Service → Model` 分层。Model 仅负责数据库 CRUD 与基础数据映射;时间计算、套餐规则、营业逻辑等复杂业务下沉至 Service 层。
- **性能优化**:
- 将 `_get_un_book_time` 中对前一日、当日、后一日的多次 `get_one` 查询合并为单次 `get_where_in` 批量查询,减少 DB 往返。
- 时间区间计算可考虑引入 `Carbon` 或自定义 `TimeRange` 值对象,替代散落的 `strtotime`/`date`/字符串拼接,提升可读性与准确性。
- **规范与安全**:
- 全面替换魔法值为类常量。
- 对 `$params` 中的 `date`、`merchant_id`、`shop_id` 增加严格类型与格式校验,防御越权与异常输入。
- 若项目运行在 PHP 7.4+,建议为所有方法添加返回类型声明(如 `: array`, `: void`),提升静态分析能力。
> 💡 **提示**:由于提供的代码在 `_get_un_book_time` 方法末尾截断,当前审查主要基于可见逻辑。若需对次日时间合并、跨天清扫逻辑进行深度验证,请补充完整代码片段。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779871075
|
1779871075
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
385
|
21
|
119
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `66797615c ## 自动代码审查报告
**分支**: pay-260519
**提交**: `66797615c137ce308920c0eec2bce907cd8a1491`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:48:12
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖全面,时间计算、订单流转、支付回调等核心链路已实现。但代码呈现典型的“上帝类/上帝方法”特征,缺乏分层设计。存在 **SQL注入隐患、弱加密算法、事务嵌套风险、循环性能瓶颈** 及大量硬编码。整体可维护性与安全性需重点提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_yc_order_model.php` / `get_bill_goods_info()` | **SQL注入风险**:使用字符串拼接构造查询条件并直接传入 `$this->select()`,未进行参数绑定或转义。若 `$unique_key` 含特殊字符将导致注入或语法错误。 | 使用框架查询构造器链式调用或 `$this->db->escape()` 进行安全转义。 | ```php<br>// 修改前<br>$sql = '_unique_key="' . $unique_key . '" AND ...';<br>$this->select($sql);<br><br>// 修改后<br>$this->db->where('_unique_key', $unique_key);<br>$this->db->where_in('_status', [1, 4]);<br>$this->db->or_where('_pay_platform', 10);<br>$this->db->where('_status', -1);<br>$this->db->where('_timestamp >', time() - 7*86400);<br>$order_data = $this->get();<br>``` |
| 🔴 严重 | `Ahead_yc_order_model.php` / `encode_group_buying_order()` | **弱加密算法**:使用 `md5()` 进行订单签名验证。MD5 已证实存在碰撞漏洞,不适用于安全校验。 | 改用 `hash_hmac('sha256', ...)` 或框架内置的加密组件。 | ```php<br>// 修改后<br>if ($type === "ENCODE") {<br> return hash_hmac('sha256', $order_id, $this->encrypt);<br>} else {<br> return hash_equals(hash_hmac('sha256', $order_id, $this->encrypt), $sign);<br>}<br>``` |
| 🔴 严重 | `Ahead_songs_order_model.php` / `add_songs_order()` & `notify()` | **事务嵌套风险**:外层方法开启事务后调用 `notify()`,而 `notify()` 内部再次调用 `$this->db->trans_start()`。CI3 默认事务计数器机制在复杂分支下易导致部分提交或死锁。 | 将事务边界统一上移至 Service/Controller 层,Model 层仅负责原子数据操作,不主动管理事务生命周期。 | 移除 `notify()` 中的 `trans_start/complete`,由调用方统一控制。若必须保留,需使用 `$this->db->trans_begin()` 配合显式 `trans_commit()`/`trans_rollback()` 并严格校验状态。 |
| 🟠 警告 | 所有文件头部 | **类外全局 `$CI` 引用**:文件顶部直接执行 `$CI = &get_instance();`。在 CLI、定时任务或异步环境下易触发 `Undefined variable`,且每次 `include` 都会执行,增加开销。 | 移除类外引用,改为在构造函数中按需获取,或封装为 `$this->ci` 属性。 | ```php<br>class Ahead_xxx_model extends Simple_model {<br> protected $ci;<br> public function __construct() {<br> parent::__construct();<br> $this->ci =& get_instance();<br> }<br>}<br>``` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php` / `get_book_day_time_info()` | **循环内高频时间计算**:`date()`, `strtotime()`, `array_intersect` 在 `foreach` 中重复调用,且未缓存中间结果,导致 CPU 占用高。 | 提前计算基准时间戳,将时间转换移至循环外;使用位运算或预计算数组替代重复 `strtotime`。 | 将 `$date_time = strtotime($date);` 提至循环前,循环内使用 `$date_time + $v['time']` 替代重复解析。 |
| 🟠 警告 | 多个文件 | **魔法数字/字符串泛滥**:支付类型 `'1','3','22'`、订单类型 `6,2,4,10`、状态 `-1,1` 等硬编码散落各处,极易引发逻辑遗漏。 | 提取为类常量或独立配置类,统一命名规范。 | ```php<br>class OrderConst {<br> const PAY_WECHAT = '1';<br> const PAY_VIP = '3';<br> const TYPE_SONG_PREBUY = 6;<br>}<br>``` |
| 🟡 建议 | `Ahead_yc_order_model.php` / `get_detail()`, `get_bill_goods_info()` | **方法过长/职责不清**:单个方法超 500 行,混合了数据查询、金额计算、格式化、关联加载。违反单一职责原则(SRP),难以测试与维护。 | 拆分为 `OrderQueryService`、`BillCalculator`、`OrderFormatter` 等独立组件,Model 仅保留数据访问逻辑。 | 将金额计算逻辑抽离至 `BillCalculator::calculate($orderData)`,返回结构化数组。 |
| 🟡 建议 | 全局静态属性 | **静态缓存污染风险**:`self::$book_days_info` 等静态变量在 PHP-FPM 单次请求中有效,但若部署于 Swoole/Workerman 等常驻内存环境,会导致跨请求数据污染。 | 改为实例属性,或使用请求级缓存(如 `Registry`、`Request` 对象或 `APCu`)。 | `public $book_days_info = [];` 替代 `public static $book_days_info = [];` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复 SQL 注入漏洞**:立即替换 `get_bill_goods_info()` 中的字符串拼接查询,全面使用参数绑定或查询构造器。
2. **替换弱加密算法**:将 `md5` 签名验证升级为 `hash_hmac('sha256')`,并配合 `hash_equals` 防时序攻击。
3. **重构事务管理**:梳理 `add_songs_order` 与 `notify` 的事务边界,确保事务扁平化,避免嵌套导致的数据不一致。
4. **清理类外 `$CI` 引用**:统一改为构造函数注入或按需调用,提升环境兼容性。
### 🛠 后续重构与优化方向
- **架构分层**:当前 Model 承担了过多业务逻辑(时间窗计算、账单聚合、支付路由)。建议引入 **Service 层** 处理复杂业务编排,Model 仅负责 CRUD 与基础查询。
- **常量与配置集中化**:建立 `config/order_types.php` 或 `src/Constants/OrderConst.php`,消除魔法值,提升代码可读性与可维护性。
- **性能优化**:对 `get_book_day_time_info` 中的时间区间计算进行算法优化(如使用区间树或预计算映射表),减少 `array_intersect` 与循环内函数调用。
- **规范对齐**:严格遵循 PSR-12 规范(命名空间、缩进、方法长度、类型声明)。若 `phpci` 为 CodeIgniter 3 的定制分支,建议查阅官方文档确认 `DB_driver` 与事务管理的最佳实践,必要时引入 `PHPStan` 或 `Psalm` 进行静态分析。
- **测试覆盖**:针对时间计算边界(跨天、闰年、营业时段重叠)、支付回调幂等性、事务回滚场景补充单元测试,确保核心链路稳定。
> 💡 **注**:代码结构高度契合 CodeIgniter 3 规范。若 `phpci` 为内部定制框架,请核对 `$this->db->trans_*` 与 `get_instance()` 的生命周期是否与官方文档一致。提供的修复方案均兼容标准 CI3/PHP 7.4+ 环境,可直接参考落地。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779871692
|
1779871692
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
387
|
21
|
121
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `15e0c7fca ## 自动代码审查报告
**分支**: pay-260519
**提交**: `15e0c7fca61763171d0611a91369785065ed63a4`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 16:48:53
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10
- **总体评价**:代码实现了复杂的包厢预订时间计算逻辑,覆盖了营业时段、团购券规则、跨天预订、清扫时间等多维度业务场景。但整体呈现典型的“上帝模型”特征,核心方法过长、职责混杂、状态管理混乱,且存在迭代器修改、静态缓存污染、重复查询等隐患。可维护性与扩展性较差,需进行架构级重构。
- **风险等级**:🔴 高(逻辑边界易出错、静态缓存易引发脏数据、性能瓶颈明显)
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_day_time_info` 循环体内 | 在 `foreach ($time_info as $k => &$v)` 中直接使用 `unset($time_info[$k])` 修改正在遍历的数组。PHP 中此操作会导致迭代器指针错乱,可能跳过元素或引发不可预知的内存行为。 | 改为先收集需移除的键,循环结束后统一过滤;或使用 `array_filter` 重构。 | `// 推荐写法<br>$valid_times = array_filter($time_info, function($v) use ($today, $now_hour_time) {<br> return !($v['date'] == $today && $v['time'] <= $now_hour_time);<br>});` |
| 🔴 严重 | 全局静态属性 `self::$book_days_info` 等 | 静态缓存未绑定业务上下文(如 `merchant_id`/`shop_id`/`date`)。在 PHP-FPM 多请求复用或并发场景下,极易返回其他商户的脏数据,导致严重业务错乱。 | 移除静态属性缓存,或改用带唯一键的缓存组件(如 CI Cache/Redis),键名需包含业务参数。 | `$cache_key = "book_days_{$merchant_id}_{$shop_id}_{$date}";<br>$result = $this->cache->get($cache_key);<br>if ($result === false) { /* 计算并缓存 */ }` |
| 🟠 警告 | `get_book_day_time_info` 中段 | `array_intersect(...array_values($all_room_book_time))` 当数组元素少于 2 个时,解包操作在部分 PHP 版本会触发 Warning,且逻辑不符合交集定义。 | 增加元素数量判断,少于 2 个时直接取首个或空数组。 | `if (count($all_room_book_time) >= 2) {<br> $un_book_time = array_intersect(...array_values($all_room_book_time));<br>} else {<br> $un_book_time = reset($all_room_book_time) ?? [];<br>}` |
| 🟠 警告 | `set_shop_config` / `_get_un_book_time` | 多次重复调用 `ahead_shop_config_second_model->get_shop_setting` 获取相同配置项,造成冗余的 DB/缓存查询。 | 在初始化阶段批量获取配置,或引入配置缓存层,避免循环/多方法内重复查询。 | `$configs = $this->ahead_shop_config_second_model->get_batch_settings($merchant_id, $shop_id, $keys);<br>$this->minute_unit = $configs['book_minute_unit'] ?? 30;` |
| 🟡 建议 | 全文多处 | 违反单一职责原则(SRP)。`get_book_day_time_info` 超 300 行,混合了数据拉取、时间区间计算、状态判定、团购券校验、门店规则过滤等逻辑。 | 拆分为独立的服务类或私有方法,如 `TimeSlotCalculator`、`VoucherRuleValidator`、`BusinessHourChecker`。 | `// 控制器/服务层调用<br>$calculator = new TimeSlotCalculator($params);<br>$slots = $calculator->calculateAvailableSlots();` |
| 🟡 建议 | 全文多处 | 存在拼写错误 `opreational_scene`(应为 `operational_scene`),且大量使用魔法数字/字符串(如 `'1'`, `'-1'`, `86400`, `'7'`)。 | 修正拼写,使用类常量或枚举管理状态码与时间常量,提升可读性。 | `const STATUS_AVAILABLE = '1';<br>const STATUS_UNAVAILABLE = '-1';<br>const SECONDS_PER_DAY = 86400;` |
| 🟡 建议 | `__construct` 及多处方法 | 频繁调用 `$CI = &get_instance();`。在 CI 架构中,模型内部应优先使用 `$this->load` 或依赖注入,重复获取实例增加开销且不符合规范。 | 在类顶部声明一次 `$this->ci = &get_instance();`,或统一通过 `$this->load` 加载依赖。 | `protected $ci;<br>public function __construct() {<br> parent::__construct();<br> $this->ci = &get_instance();<br>}` |
| 🟡 建议 | `_get_un_book_time` 末尾 | 代码片段在末尾被截断,未展示完整逻辑。跨天时间计算(`prev_date`/`next_date`)涉及大量字符串拼接与时间转换,易受时区/夏令时影响。 | 补充完整代码审查。建议统一使用 `DateTime` 或 `Carbon` 处理跨天逻辑,避免手动 `strtotime` + 字符串拼接。 | `$dt = new DateTime($date);<br>$prev = $dt->modify('-1 day')->format('Ymd');` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复迭代器越界风险**:立即替换 `foreach` 中的 `unset` 操作,改用 `array_filter` 或键值收集后批量移除,防止时间列表数据丢失。
2. **清理静态缓存污染**:移除 `self::$book_days_info`、`self::$shop_data` 等静态属性。若需性能优化,请替换为带业务键的 Redis/CI Cache 缓存,并设置合理的 TTL。
3. **防御性输入校验**:`$params` 数组缺乏类型与边界校验。建议在方法入口增加 `assert` 或自定义验证器,确保 `merchant_id`、`shop_id`、`date` 等核心参数合法,避免类型隐式转换引发逻辑漏洞。
### 🛠 后续重构与优化方向
1. **架构拆分(核心)**:将 `Ahead_shop_book_time_info_model` 从“数据模型”升级为“领域服务”。模型仅保留 `get_one`、`get_list` 等基础 DB 操作;将时间计算、规则校验、状态映射抽离至独立的 `BookingTimeService` 或 `VoucherRuleService`。
2. **时间处理标准化**:当前大量使用 `strtotime`、`date('YmdHi')`、手动加减 `86400` 处理跨天逻辑,极易在闰秒、时区切换或 DST 期间产生偏差。建议引入 `Carbon` 或 PHP 8.1+ `DateTimeImmutable`,使用 `modify()`、`diff()` 等语义化方法。
3. **配置与常量治理**:建立统一的 `BookingConfig` 类或配置中心,集中管理 `book_time_limit`、`minute_unit`、状态码等魔法值。避免在多个方法中硬编码或重复查询。
4. **框架适配说明**:当前代码结构高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请确认其是否支持依赖注入(DI)容器。若支持,建议将 `$this->load->model()` 替换为构造函数注入,以提升单元测试覆盖率与代码可测试性。
> 💡 **注**:由于提供的代码在 `_get_un_book_time` 方法末尾被截断,部分跨天时间合并逻辑未能完整评估。建议补充完整代码后,重点审查 `prev_un_book_time` 与 `next_un_book_time` 的区间合并算法是否覆盖所有边界条件(如 23:55-00:05 跨天场景)。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779871733
|
1779871733
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
389
|
21
|
123
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `c7a32e000 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `c7a32e000e05e6ca4796c60e39de52e8327a0bc5`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-27 17:04:45
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该 Model 承载了大量核心业务逻辑,但存在明显的架构设计问题。代码中混合了数据查询、业务计算、状态流转与视图格式化,导致单一方法过长、职责不清。存在多处 N+1 查询、缺乏事务保护、硬编码魔法值及潜在 SQL 注入风险。整体可维护性与安全性亟待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_bill_goods_info` (~L230) | **SQL 注入风险**:直接拼接 `$unique_key` 构建查询字符串 `'_unique_key="' . $unique_key . '" ...'`,若未严格过滤将导致注入。 | 使用框架查询构造器或参数绑定,杜绝字符串拼接。 | `$this->db->where('_unique_key', $unique_key)->where('_status', [1,4], 'OR')->get($this->table_name)->result_array();` |
| 🔴 严重 | `confirm_receipt` (~L185) | **缺乏数据库事务**:连续执行两次 `insert` 记录订单状态,若第二次失败会导致订单状态停留在“已确认收货”但未“完成”,数据不一致。 | 使用事务包裹连续写操作,失败时自动回滚。 | `$this->db->trans_start(); $this->insert($data1); $this->insert($data2); $this->db->trans_complete();` |
| 🔴 严重 | `close_room_after` (~L210) | **循环内 DB 操作且无事务**:在 `foreach` 中逐条 `update` 和 `insert`,性能极差且部分失败会导致脏数据。 | 改用批量操作 `update_batch()` / `insert_batch()`,并包裹事务。 | `$this->db->trans_start(); $this->update_batch(...); $this->insert_batch(...); $this->db->trans_complete();` |
| 🟠 警告 | `get_list` / `get_detail` | **N+1 查询问题**:在 `foreach` 循环内加载模型并执行 `get_one()`,订单量稍大时将引发严重性能瓶颈。 | 提前收集关联 ID,使用 `where_in` 批量查询,在 PHP 中映射关联数据。 | `$ids = array_column($order_info, 'package_id'); $res = $this->db->where_in('_id', $ids)->get(...)->result_array();` |
| 🟠 警告 | `encode_group_buying_order` | **弱加密算法**:使用 `md5()` 进行签名/校验,MD5 已不具备抗碰撞性,易被伪造。 | 改用 `hash_hmac('sha256', ...)` 或框架内置加密库。 | `return hash_hmac('sha256', $order_id, $this->encrypt);` |
| 🟠 警告 | `binding_order_check` | **隐式依赖/越权隐患**:使用未定义的 `$this->uid` 进行权限校验,若父类未正确初始化或遭篡改,将导致越权绑定。 | 将用户 ID 作为显式参数传入,或从 Session/Token 安全获取。 | `public function binding_order_check($order_id, $sign, $current_uid)` |
| 🟠 警告 | `get_detail` (~L115) | **框架调用异常**:在 Model 内部调用 `$this->ahead_yc_order_model->get_one()`,易引发递归加载或作用域混乱。 | 直接调用 `$this->get_one()` 或明确加载别名。 | `$before_order_info_data = $this->get_one(array('_id' => $order_info['before_order_id']));` |
| 🟡 建议 | `get_bill_goods_info` (~L235) | **调试代码残留**:存在 `if (1) {` 硬编码分支,影响代码整洁度与后续维护。 | 移除无用分支,保留真实业务逻辑。 | 直接删除 `if (1) {` 及对应闭合括号 |
| 🟡 建议 | 全局 | **命名规范不符 PSR-12**:类名含下划线 `Ahead_yc_order_model`,方法名混用驼峰与下划线(如 `bindingOrder` vs `get_list`)。 | 类名改为 `PascalCase`,方法统一 `camelCase`。 | `class AheadYcOrderModel extends Simple_model` |
| 🟡 建议 | 全局 | **模型重复加载**:多处方法内部频繁调用 `$this->load->model()`,增加框架开销。 | 移至 `__construct()` 统一加载,或配置自动加载。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_room_package_model'); }` |
| 🟡 建议 | 全局 | **魔法值泛滥**:大量硬编码数字(如 `1, 2, 10, 14, 7*86400`)散落在逻辑中,可读性差。 | 提取为类常量,与现有 `const` 统一管理。 | `const SEVEN_DAYS_SECONDS = 604800;` |
> ⚠️ **局限性说明**:代码末尾 `get_timing_order` 方法被截断,无法评估其完整逻辑。若该方法包含复杂关联查询或状态计算,建议补充完整后二次审查。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复 SQL 注入与事务缺失**:立即将 `get_bill_goods_info` 中的字符串拼接改为参数绑定/查询构造器;为 `confirm_receipt` 和 `close_room_after` 添加 `$this->db->trans_start()/trans_complete()` 事务保护。
2. **消除 N+1 查询**:重构 `get_list` 与 `get_detail`,将循环内的单条查询改为 `IN` 批量查询,预计可降低 70% 以上的数据库交互耗时。
3. **替换弱加密算法**:将 `encode_group_buying_order` 中的 `md5` 替换为 `hash_hmac('sha256', ...)`,防止团购核销签名被伪造。
### 🛠 后续重构与优化方向
1. **职责分离(SRP 原则)**:`get_bill_goods_info` 方法超过 300 行,混合了数据查询、金额计算、商品格式化、退款处理等逻辑。建议拆分为:
- `fetchBillOrders()`:负责数据查询
- `calculateBillTotals()`:负责金额聚合
- `formatBillGoods()`:负责视图层数据组装
2. **统一数据映射层**:当前类中同时存在 `public $pay_id_arr`(数组)与 `const ORDER_PAY_PLATFORM_ARR`(常量),功能重叠。建议废弃数组,统一使用 `const` 或配置类管理字典映射。
3. **框架适配规范**:
- 移除文件顶部的 `$CI = &get_instance();`,Model 中应直接使用 `$this` 访问 Loader。
- 若 `phpci` 为定制框架,请确认其底层是否支持 `trans_start()` 与 `where_in` 批量查询;若不支持,需替换为框架等效的事务与查询 API。
- 全局函数(如 `throwError()`, `minToStr()`, `send_wx_pay_order()`)建议封装至独立 Helper 或服务类中,避免破坏 OOP 封装性。
> 💡 **提示**:建议在 CI/CD 流程中接入 `PHP_CodeSniffer`(PSR-12 规则)与 `PHPStan`(静态分析),在合并前自动拦截命名不规范、未定义变量及潜在类型错误,从源头提升代码质量。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779872685
|
1779872685
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
394
|
21
|
125
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `60048e2b7 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `60048e2b7d39888d4bcf6018185b6b0481e0b900`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-28 12:20:23
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务逻辑覆盖了团购券兑换的核心链路(验券、模式判断、Redis 缓存、事务落库、核销回调),流程相对完整。但代码存在较多**全局状态污染、事务处理不规范、硬编码泛滥及框架生命周期误用**等问题,在并发场景下易引发数据不一致或越权访问。整体偏向老旧 CI3 写法,未充分利用现代 PHP 特性与工程化规范。
- **风险等级**:🔴 高(主要源于全局属性修改、事务回滚缺陷及 Redis Key 隔离不足)
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 第 2-3 行 | 文件顶部直接执行 `$CI = &get_instance();` 并加载模型。该代码在 `include/require` 时即运行,违反框架按需加载原则,且每次加载都会重复执行,可能引发实例冲突或内存泄漏。 | 移除顶部代码。将 `get_instance()` 调用移至类方法内部,或依赖框架的自动加载机制。 | `// 删除顶部代码,在方法内按需获取:<br>$CI = &get_instance();` |
| 🔴 严重 | `tuangou_exchange` 方法内 | 直接修改 CI 超全局对象属性(如 `$CI->check_goods_title = false;`、`$CI->coupon_room_type = ...`)。在 PHP-FPM 并发请求下,会导致**严重的状态交叉污染**,引发其他请求逻辑错乱。 | 禁止修改全局属性。应通过方法参数传递上下文,或封装为独立的 DTO/Context 对象。 | `$context = ['check_goods_title' => false, 'coupon_room_type' => $type];<br>$this->tuangou->prepare($context);` |
| 🔴 严重 | `_tuangou_exchange` 方法内 | 数据库事务处理不规范。手动调用 `$this->db->trans_rollback()` 后直接 `return`,跳过了 `$this->db->trans_complete()`。在部分 CI 版本中会导致连接状态未重置,后续查询可能报错或产生脏连接。 | 使用 `try...catch` 包裹事务逻辑,确保 `trans_complete()` 始终被调用,或依赖 CI 的 `trans_status()` 自动回滚。 | `try {<br> $this->db->trans_start();<br> // ... 业务逻辑<br> if (!$this->db->trans_status()) throw new \Exception('DB Error');<br> $this->db->trans_complete();<br>} catch (\Exception $e) {<br> $this->db->trans_rollback();<br> return ['status'=>false, 'msg'=>$e->getMessage()];<br>}` |
| 🟠 警告 | `get_redis` / `del_redis_data` 等 | Redis Key 仅使用 `$uid` 拼接(`tuangou_exchange_{$uid}`),缺乏商户/门店维度隔离。若 UID 非全局唯一或存在多租户架构,极易发生**数据覆盖或越权读取**。 | 在 Key 中加入 `merchant_id` 或 `shop_id` 前缀,确保多租户数据严格隔离。 | `$redis_key = "tuangou_exchange:{$merchant_id}:{$uid}";` |
| 🟠 警告 | 多处 `$this->load->model()` | 同一请求周期内多次重复加载模型。虽 CI 会缓存实例,但增加了解析开销与代码冗余,降低可维护性。 | 统一在 `__construct()` 中加载,或使用服务容器/依赖注入管理。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model('ahead_shop_group_buying_coupon_model');<br> // ... 其他模型<br>}` |
| 🟠 警告 | `json_encode($redis_data, 256)` | 使用魔法数字 `256` 作为 `json_encode` 选项,可读性差且易随 PHP 版本变更产生歧义(实际对应 `JSON_UNESCAPED_UNICODE`)。 | 使用 PHP 内置常量替代魔法数字,并补充 `JSON_THROW_ON_ERROR` 增强错误处理。 | `json_encode($redis_data, JSON_UNESCAPED_UNICODE \| JSON_THROW_ON_ERROR)` |
| 🟡 建议 | 类名与方法名 | 命名不符合 PSR-12 规范。类名使用蛇形命名,方法名未采用小驼峰,降低代码可读性与 IDE 静态分析体验。 | 遵循 PSR-12:类名 `StudlyCaps`,方法名 `camelCase`。 | `class AheadTuangouExchangeLogModel extends Simple_model {<br> public function checkExchange(...) {}<br>}` |
| 🟡 建议 | 状态值硬编码 | 大量使用 `'1'`, `'2'`, `11`, `3600` 等魔法值,业务含义不透明,后期维护与扩展成本极高。 | 提取为类常量或 PHP 8.1+ 枚举(Enum),集中管理业务状态。 | `const VERIFY_MODE_IMMEDIATE = '1';<br>const VERIFY_MODE_BOOKING = '2';<br>const USER_TYPE_MINIPROGRAM = 2;` |
| 🟡 建议 | `throwError()` 调用 | 使用自定义全局函数中断执行,未进行资源清理(如 Redis 数据、事务状态),可能导致脏数据残留或连接泄漏。 | 统一使用 `return ['status' => false, 'msg' => '...']` 或抛出标准异常,由控制器层统一捕获处理。 | `if (empty($shop_id)) {<br> return ['status' => false, 'msg' => '请选择门店'];<br>}` |
---
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **消除全局状态污染**:立即移除 `$CI->xxx = value` 的写法。将配置项改为方法参数传递或封装为 `ExchangeContext` 对象,彻底解决并发请求下的状态串扰问题。
2. **规范事务生命周期**:重构 `_tuangou_exchange` 中的事务处理逻辑,采用 `try-catch` + `trans_status()` 模式,确保任何异常都能正确回滚并释放数据库连接。
3. **增强 Redis Key 隔离性**:将 Key 结构升级为 `业务前缀:商户ID:用户ID`,防止多商户/多门店场景下的数据越权与覆盖。
### 🛠 后续重构与优化方向
1. **架构解耦**:当前 Model 承担了过多职责(验券、Redis 缓存、事务落库、外部 API 调用、业务规则判断)。建议拆分为:
- `TuangouExchangeService`:处理核心业务编排与规则校验。
- `TuangouExchangeRepository`:专注数据库与 Redis 的读写操作。
- `TuangouPlatformClient`:封装抖音/美团等第三方验券 API 调用。
2. **现代化 PHP 语法**:全面引入 PHP 7.4+ 类型声明(参数类型、返回类型、属性类型),使用 `match` 表达式替代冗长的 `if-elseif` 分支,提升代码健壮性。
3. **性能优化**:
- 将同步循环请求第三方平台(`foreach ($platform_arr as $platform)`)改为**异步并发请求**或**带优先级的短路重试**,降低接口响应延迟。
- 评估 `gift_data` 等大数据结构存入 Redis 的必要性,可改为仅缓存核心 ID,按需从 DB 或缓存服务中懒加载。
4. **统一错误处理**:废弃全局 `throwError()`,建立标准化的 `Result` 对象或异常体系(如 `BusinessException`),便于上层统一拦截、日志记录与 API 响应格式化。
> 📌 **框架适配说明**:代码呈现典型的 CodeIgniter 3/4 架构特征(如 `$CI = &get_instance()`、`$this->load->model()`、`$this->db->trans_start()`)。若 `phpci` 为基于 CI 的定制或衍生框架,请结合其官方文档确认组件生命周期与事务管理机制。若存在差异,建议优先查阅 `phpci` 官方关于 `Database Transactions` 与 `Model Loading` 的最佳实践文档。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779942023
|
1779942023
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
404
|
21
|
128
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `1646d0a85 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `1646d0a85e1d0d6e967c5abbe17c54e8656a8407`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-28 15:39:02
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算、规则校验与状态组装逻辑。虽然功能覆盖面广,但存在**严重的静态状态污染风险**、**方法严重违反单一职责原则**、**重复数据库查询与低效数组运算**等问题。整体架构偏向“上帝类”,可维护性、可测试性与高并发性能均存在较大隐患。
- **风险等级**:🔴 高(存在数据串扰、并发冲突及性能瓶颈风险)
> 📌 **框架说明**:代码结构、加载方式(`$this->load->model/library`、`get_instance()`)高度符合 **CodeIgniter 3** 规范。若 `phpci` 为基于 CI 的定制框架,以下审查原则与优化方案完全适用;若为独立框架,请根据其官方文档替换对应的加载器语法。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` 开头 | **静态缓存未区分上下文**:`self::$book_days_info`、`self::$shop_data` 等静态属性在首次赋值后直接返回,完全忽略 `$merchant_id`、`$shop_id`、`$date` 等参数。多商户/多日期请求将导致严重的数据串扰与逻辑错乱。 | 移除全局静态缓存,或改为带唯一键的内存缓存数组(如 `self::$cache[$merchant_id.'_'.$shop_id.'_'.$date]`),并增加缓存失效机制。 | `if (isset(self::$cache[$merchant_id][$shop_id][$check_date])) { return self::$cache[$merchant_id][$shop_id][$check_date]; }` |
| 🔴 严重 | `get_book_day_time_info` 全方法 | **严重违反单一职责原则 (SRP)**:单方法超 500 行,混合了 DB 查询、时间区间计算、团购规则校验、状态标记、UI 数据组装。逻辑耦合极深,极易产生边界漏洞且无法进行单元测试。 | 将业务逻辑剥离至独立的 `BookingTimeCalculator` 或 `PackageRuleService` 类。Model 仅保留数据读写(`get_one`、`get_batch`),计算逻辑通过依赖注入传入。 | 见下方“总结与行动建议”中的架构拆分示例 |
| 🟠 警告 | `set_shop_config` / `_get_un_book_time` | **重复数据库查询**:`ahead_shop_config_second_model->get_shop_setting()` 被多次调用相同或相似 Key,每次调用均触发独立 SQL,增加 DB 压力与延迟。 | 在方法入口处统一批量加载配置并缓存至 `$this->shop_config` 数组,后续直接读取内存数据。 | `$this->shop_config = $this->ahead_shop_config_second_model->get_batch_settings($merchant_id, $shop_id, $keys);` |
| 🟠 警告 | `get_book_day_time_info` 循环内 | **循环内高频时间函数调用**:`date()`、`strtotime()`、`array_intersect()`、`array_merge()` 在 `foreach` 中反复执行,时间复杂度呈 O(N²) 甚至更高,高并发下易导致 CPU 飙升与响应超时。 | 预计算基准时间戳;将时间区间判断优化为布尔映射或区间树算法;减少循环内的函数调用与数组重建。 | 使用 `DateTimeImmutable` 预计算 `$date_ts = strtotime($date);`,循环内仅做整数加减与比较 |
| 🟠 警告 | 多处 | **冗余的 `get_instance()` 调用**:在 Model 内部多次调用 `$CI = &get_instance();`。在 CI/PHPCI 架构中,Model 已继承框架基类,可直接使用 `$this->load` 或 `$this->config`。 | 移除冗余调用,直接使用 `$this` 上下文。若需访问控制器属性(如 `$CI->merchant_id`),应通过方法参数显式传递,避免隐式依赖。 | `// 删除 $CI = &get_instance();`<br>`$this->load->model('ahead_shop_model');` |
| 🟡 建议 | 全文 | **魔法数字/字符串泛滥**:大量使用 `'1'`、`'-1'`、`'2'`、`'3'`、`'4'`、`'7'` 表示场景、状态、预订模式。可读性差,修改时易遗漏。 | 定义类常量或 PHP 8.1+ 枚举统一管理状态码与业务标识。 | `const SCENE_KTV = '1'; const STATUS_AVAILABLE = '1'; const BOOK_MODEL_DURATION = '1';` |
| 🟡 建议 | 方法签名 | **缺乏严格类型声明**:未使用 PHP 7+ 类型提示,依赖动态类型易引发隐式转换 Bug(如字符串 `'1'` 与整数 `1` 比较)。 | 补充 `declare(strict_types=1);` 及参数/返回值类型注解,提升代码健壮性。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
| 🟡 建议 | `get_book_day_time_info` 中后段 | **数组展开操作风险**:`array_intersect(...array_values($all_room_book_time))` 若 `$all_room_book_time` 为空数组,在部分 PHP 版本会抛出致命错误或返回非预期结果。 | 增加空值防护,或使用显式循环/归并逻辑替代展开运算符。 | `if (count($all_room_book_time) > 1) { $un_book_time = array_intersect(...array_values($all_room_book_time)); }` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **消除静态缓存污染**:立即重构 `self::$book_days_info`、`self::$shop_data`、`self::$date_time_info` 等静态属性。改为实例属性或带唯一键的缓存池,确保不同商户、不同日期的请求数据完全隔离。
2. **拆分“上帝方法”**:`get_book_day_time_info` 必须拆分。建议按职责划分为:
- `ShopConfigLoader`:负责加载并缓存门店配置。
- `TimeRangeCalculator`:负责营业时间、已预订时间、锁定时间的区间合并与差集计算。
- `PackageRuleValidator`:负责团购券/套餐的可用时间、跨天规则、星期限制校验。
- `BookingTimeAssembler`:负责最终状态标记与前端数据结构组装。
3. **优化数据库查询**:将分散的 `get_shop_setting` 调用合并为批量查询,或在请求生命周期内使用内存数组缓存,避免重复 I/O。
### 🛠 后续重构与优化方向
- **引入区间算法**:当前使用 `array_intersect` 和 `array_merge` 处理时间片,效率低下且易出错。建议将时间转换为 `[start_ts, end_ts]` 对象,使用成熟的区间合并库(如 `spatie/period` 或自研区间树)进行交集/差集运算。
- **统一错误处理**:代码中使用了全局函数 `throwError()`。建议替换为 PHP 标准 `throw new \InvalidArgumentException('...')` 或框架提供的异常处理机制,便于统一捕获与日志记录。
- **补充输入校验**:在方法入口处对 `$params` 进行严格校验(如日期格式 `Ymd`、商户ID类型、必填字段检查),防止脏数据流入核心计算逻辑。
- **框架适配提示**:若 `phpci` 框架提供内置的 `Cache` 组件或 `Config` 单例,请优先使用框架原生缓存机制替代静态变量,以更好地适配框架生命周期与多进程环境。
> ⚠️ **局限性说明**:您提供的代码片段在 `get_book_day_time_info` 方法末尾被截断,未能包含完整的逻辑闭环(如 `next_date_room_book_time` 的后续处理、返回值组装等)。本次审查基于已提供部分进行深度分析,若需更精准的边界条件与完整流程评估,请补充完整代码。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779953942
|
1779953942
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
405
|
21
|
129
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `9978533a1 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `9978533a1ccd2fbb3c2a20826c7dac089ae6c785`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-28 15:44:18
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算逻辑,业务覆盖全面,但存在严重的架构设计问题。方法过长、职责不清、静态缓存未做参数隔离、直接污染全局 CI 对象、大量魔法数字与隐式依赖,导致代码可维护性差、潜在逻辑漏洞多、性能瓶颈明显。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info()` | **静态缓存未区分参数**:`self::$book_days_info` 作为静态缓存,未结合 `$merchant_id`、`$shop_id`、`$check_date` 等参数生成 Key。同一请求内多次调用不同门店/日期时,会返回错误的缓存数据。 | 移除全局静态缓存,改用带复合 Key 的缓存机制(如 CI Cache 或 Redis),或改为实例级缓存并严格校验参数一致性。 | `// 错误示例<br>if (!empty(self::$book_days_info)) return self::$book_days_info;<br><br>// 建议方案<br>$cache_key = "book_days:{$merchant_id}:{$shop_id}:{$check_date}";<br>$cached = $this->cache->get($cache_key);<br>if ($cached !== false) return $cached;` |
| 🔴 严重 | `get_book_days_info()` | **类属性被意外永久修改**:`$this->book_days += 1;` 在方法内部直接修改了类属性。若该方法被多次调用,`book_days` 会持续累加,导致后续日期计算严重偏离预期。 | 使用局部变量进行计算,绝不修改类属性状态。 | `$days_to_check = $add_day ? $this->book_days + 1 : $this->book_days;` |
| 🔴 严重 | `get_book_day_time_info()` | **遍历中修改数组**:`foreach ($time_info as $k => &$v) { ... unset($time_info[$k]); }` 在 `foreach` 循环中直接 `unset` 当前数组元素,会导致指针错乱、跳过元素或触发 PHP 警告。 | 改用 `array_filter` 过滤,或收集需删除的 Key 在循环结束后统一 `unset`。 | `$time_info = array_filter($time_info, function($v) use ($today, $now_hour_time) {<br> return !($v['date'] == $today && $v['time'] <= $now_hour_time);<br>});` |
| 🟠 警告 | 多处 (`set_shop_config`, `set_room_info`) | **全局 CI 对象状态污染**:频繁使用 `$CI->operational_scene = ...` 直接修改超全局对象属性。这破坏了封装性,极易在并发或后续请求中引发难以追踪的副作用。 | 通过方法返回值、DTO 对象或 Session/Config 传递状态,避免直接操作 `$CI` 属性。 | `// 建议通过返回值或独立配置类传递<br>$scene = $this->determineOperationalScene($room_id);<br>$this->config->set('operational_scene', $scene);` |
| 🟠 警告 | `get_book_day_time_info()` | **严重违反单一职责原则 (SRP)**:该方法长达 300+ 行,混合了数据查询、时间范围合并、套餐校验、营业规则过滤、状态标记等数十种逻辑,嵌套层级深,极难测试与维护。 | 拆分为独立的方法或策略类。例如:`calculateBusinessHours()`、`checkVoucherConstraints()`、`applyLockRules()`、`filterAvailableSlots()`。 | `// 拆分后主流程示例<br>$slots = $this->generateTimeSlots($date, $business_from, $business_end);<br>$slots = $this->applyVoucherRules($slots, $params);<br>$slots = $this->applyLockRules($slots, $params);<br>return $this->formatOutput($slots);` |
| 🟠 警告 | `get_book_day_time_info()` | **高频重复数据库查询**:`$this->get_one()`、`$this->ahead_shop_config_second_model->get_shop_setting()` 在循环或多次调用中重复执行,且缺乏有效的请求级缓存。 | 在构造函数或初始化阶段批量加载配置,或使用 CI 的 `$this->db->cache_on()` / 内存缓存池。 | `// 构造函数中预加载<br>$this->shop_config = $this->ahead_shop_config_second_model->get_all_settings($merchant_id, $shop_id);<br>// 后续直接读取数组` |
| 🟡 建议 | 全局 | **魔法数字与字符串泛滥**:代码中大量使用 `'1'`, `'2'`, `'3'`, `'7'`, `'-1'`, `86400`, `3600` 等硬编码值,缺乏语义化,易引发维护歧义。 | 在类顶部定义 `const` 常量,或使用枚举类(PHP 8.1+)。 | `const SCENE_KTV = '1';<br>const SCENE_BILLIARDS = '2';<br>const SECONDS_PER_DAY = 86400;` |
| 🟡 建议 | 全局 | **命名规范不符合 PSR-12**:大量类属性使用 `snake_case`(如 `$book_time_limit_after_close_room`),而方法使用 `camelCase`。PHP 社区推荐统一使用 `camelCase`。 | 统一属性与方法命名为 `camelCase`,保持代码风格一致。 | `public $bookTimeLimitAfterCloseRoom = 1200;` |
| 🟡 建议 | 全局 | **强依赖未声明的全局辅助函数**:大量调用 `throwError()`, `timeToHour()`, `mergeTimeRanges()` 等全局函数,未通过命名空间或依赖注入引入,降低可测试性。 | 将辅助函数封装为独立的 `Helper` 类或 `Service`,通过构造函数注入,或确保在框架自动加载范围内。 | `// 使用服务类替代全局函数<br>$timeHelper = new TimeHelper();<br>$timeHelper->mergeRanges($ranges);` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存与状态污染**:立即移除 `self::$book_days_info` 等无参数隔离的静态缓存,改用带 Key 的缓存或实例变量。彻底禁止在 Getter 方法中修改 `$this->book_days` 等核心属性。
2. **消除 `foreach` 中 `unset` 的风险**:将 `get_book_day_time_info()` 中的数组过滤逻辑改为 `array_filter` 或收集 Key 后批量删除,避免运行时指针异常。
3. **解耦全局 CI 对象操作**:停止使用 `$CI->xxx = ...` 传递业务状态。改为通过方法参数、返回值或独立的 `Context/DTO` 对象传递,确保请求隔离。
### 🛠 后续重构与优化方向
1. **方法拆分与策略模式应用**:
- `get_book_day_time_info()` 必须拆分。建议采用 **责任链模式** 或 **策略模式** 处理各类校验规则(如:营业时间校验、团购券校验、包厢锁定校验、最低时长校验)。每个规则独立成类,便于单元测试与动态开关。
2. **性能优化**:
- 引入 **请求级内存缓存**(如 `static $cache_pool = []` 配合复合 Key),避免同一请求内重复查询数据库或重复计算时间区间。
- 时间区间合并/交集计算(`array_intersect`, `mergeTimeRanges`)在数据量大时复杂度较高,建议将时间轴离散化为固定步长(如 5 分钟)的位图(BitMap)或使用区间树算法优化。
3. **类型安全与规范升级**:
- 启用 `declare(strict_types=1);`,为所有方法添加参数类型与返回类型声明。
- 将硬编码状态码(`'1'`, `'-1'`)替换为枚举或常量,提升代码可读性。
- 遵循 PSR-12 规范统一命名风格,补充完整的 PHPDoc 注释。
4. **框架适配说明**:
> ⚠️ 注:当前代码结构高度符合 **CodeIgniter 3** 的 MVC 模式(如 `get_instance()`、`$this->load->model()`)。若 `phpci` 为内部定制框架,请查阅其官方文档确认是否提供原生的缓存组件、依赖注入容器或生命周期钩子。建议优先使用框架内置的 `$this->cache` 替代手动静态缓存,并利用框架的 `config` 或 `session` 管理跨方法状态。
> 📝 **局限性说明**:提供的代码片段在 `_get_un_book_time()` 方法末尾被截断,部分时间边界计算与次日逻辑未完全展示。以上审查基于已提供部分进行深度分析,若需完整评估跨日时间轴计算逻辑,请补充完整文件内容。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779954258
|
1779954258
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
406
|
21
|
130
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `2b2ca8a22 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `2b2ca8a22166e775eb913bb3de0edea67f780a6c`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-28 15:53:49
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的预订时段计算逻辑,涵盖多业态场景、团购券规则、营业时段、清扫缓冲、跨天逻辑等核心业务。但代码存在典型的“上帝方法”问题,过度依赖全局状态传递,静态缓存缺乏生命周期管理,且存在数组遍历修改隐患。整体可维护性、可测试性与扩展性较差,需进行架构级重构。
- **风险等级**:🔴 高
> 📌 **框架说明**:代码结构、加载方式(`get_instance()`、`$this->load->model()`)高度符合 **CodeIgniter 3** 规范。若 `phpci` 为基于 CI3 的定制分支,以下建议同样适用。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_day_time_info` (~L240) | 在 `foreach ($time_info as $k => &$v)` 中直接 `unset($time_info[$k])` 会破坏引用迭代器,导致后续元素处理异常、跳过或产生 `Undefined variable` 警告。 | 收集需移除的键,循环结束后统一处理;或改用 `array_filter` 过滤。 | `// ❌ 错误\nforeach ($arr as $k => &$v) { if ($cond) unset($arr[$k]); }\n\n// ✅ 正确\n$removeKeys = [];\nforeach ($arr as $k => $v) { if ($cond) $removeKeys[] = $k; }\nforeach ($removeKeys as $k) unset($arr[$k]);` |
| 🔴 严重 | 全局多处 (`$CI->xxx`) | 将业务状态(如 `$CI->operational_scene`, `$CI->package_not_available_time`, `$CI->renewal_order_id`)直接挂载到 CI 超全局对象上。在并发请求、异步任务或单元测试中极易引发数据串扰,严重破坏 OOP 封装。 | 使用 DTO/上下文对象传递状态,或通过方法参数显式注入。避免污染 `$CI` 实例。 | `// 建议封装上下文类\nclass BookingContext {\n public $operationalScene;\n public $packageConstraints;\n public $renewalOrderIds = [];\n}\n// 方法签名改为: public function get_book_day_time_info($params, BookingContext $ctx)` |
| 🟠 警告 | `get_book_day_time_info` (~L180, L200) | 多次重复调用 `$this->ahead_shop_config_second_model->get_shop_setting()` 获取相同门店配置,产生冗余数据库查询,拖慢接口响应。 | 在方法入口处一次性批量查询配置,存入局部数组或类属性缓存。 | `$keys = ['book_minute_unit', 'book_hour_options', 'book_max_days', 'book_package_time_not_enough'];\n$configs = $this->ahead_shop_config_second_model->get_batch_settings($merchant_id, $shop_id, $shop_config_scene, $keys);\n$this->minute_unit = $configs['book_minute_unit'] ?? 30;` |
| 🟠 警告 | 类属性定义处 (~L130-L135) | 使用 `public static $xxx = []` 缓存请求级数据,但未提供重置机制。若部署于 Swoole/Workerman 等常驻内存环境,将导致严重的数据污染与内存泄漏。 | 增加 `resetStaticCache()` 方法在请求结束时调用;或改用非静态属性/请求级缓存组件(如 CI 的 `cache` 驱动)。 | `public static function resetCache(): void {\n self::$book_days_info = [];\n self::$shop_data = [];\n self::$date_time_info = [];\n self::$date_use_time_info = [];\n self::$date_room_book_time_info = [];\n self::$shop_business_time = [];\n}` |
| 🟠 警告 | `get_book_day_time_info` (~L115) | `array_intersect(...array_values($all_room_book_time))` 依赖 PHP 7.3+ 参数解包,且当数组为空或元素类型不一致时可能触发 Warning。后续 `else` 分支逻辑冗余且易读性差。 | 使用 `array_reduce` 安全求交集,提升兼容性与可读性。 | `$un_book_time = array_reduce($all_room_book_time, function($carry, $item) {\n return $carry === null ? $item : array_intersect($carry, $item);\n});\n$un_book_time = $un_book_time ?? [];` |
| 🟡 建议 | 全文多处 | 大量使用魔法字符串/数字(`'1'`, `'-1'`, `'3'`, `'7'`)表示状态、场景、通知类型,缺乏语义化,极易在后续迭代中引发逻辑误判。 | 定义类常量集中管理状态枚举,提升代码自解释能力。 | `const STATUS_AVAILABLE = '1';\nconst STATUS_UNAVAILABLE = '-1';\nconst SCENE_KTV = '1';\nconst NOTICE_TYPE_TIME_EXCEED = '1';\n// 使用时: $v['status'] = self::STATUS_AVAILABLE;` |
| 🟡 建议 | `get_book_day_time_info` (~L100-L400) | 方法行数超 300,嵌套层级深,混合了配置加载、时间计算、券规则校验、状态过滤、价格注入等职责,严重违反单一职责原则(SRP),难以编写单元测试。 | 按业务边界拆分为独立私有方法,主流程仅保留编排逻辑。 | `// 拆分后主流程示例\n$this->loadConfigs($params);\n$timeSlots = $this->generateTimeSlots($date, $business_from, $business_end);\n$timeSlots = $this->applyVoucherRules($timeSlots, $params);\n$timeSlots = $this->filterUnavailableSlots($timeSlots, $un_book_time);\nreturn $this->injectPriceInfo($timeSlots, $params);` |
| 🟡 建议 | 构造函数及多处 | 频繁调用 `$CI = &get_instance();`。在 CI3 模型中,可直接复用 `$this->load`,且重复获取实例有微小性能损耗与代码冗余。 | 在构造函数中统一赋值 `$this->ci = &get_instance();`,后续统一使用 `$this->ci`。 | `public function __construct() {\n parent::__construct();\n $this->ci = &get_instance();\n $this->book_room_id = $this->get_book_room_id();\n if (!empty($this->ci->merchant_id) && !empty($this->ci->shop_id)) {\n $this->set_shop_config();\n }\n}` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复数组遍历删除隐患**:立即将 `foreach` 中的 `unset` 逻辑改为收集键后批量删除,避免线上出现不可预知的时段过滤错误。
2. **解耦 `$CI` 状态污染**:梳理所有挂载在 `$CI` 上的业务变量,逐步迁移至方法参数或独立的 `BookingContext` 对象。这是保障系统在高并发下稳定运行的基础。
3. **消除重复 DB 查询**:将 `get_shop_setting` 的多次调用合并为批量查询,预计可降低 30%~50% 的数据库 IO 开销。
### 🛠 后续重构与优化方向
- **方法拆分与 SRP 落地**:将 `get_book_day_time_info` 拆分为 `配置加载`、`时段生成`、`规则过滤(券/营业/锁定/清扫)`、`状态标记` 四个独立阶段。每个阶段可独立进行单元测试。
- **引入策略模式处理多业态**:当前 `if/elseif` 判断 `operational_scene`(KTV/台球/棋牌/酒馆)的逻辑散落在多处。建议抽象为 `SceneStrategyInterface`,通过工厂模式动态加载对应场景的时段计算策略。
- **静态缓存生命周期管理**:若项目未来计划向常驻内存架构(如 Swoole、RoadRunner)演进,必须彻底移除 `public static $xxx` 缓存,改用请求级上下文或 Redis/本地缓存组件。
- **常量与枚举规范化**:建立 `BookingStatus`、`NoticeType`、`OperationalScene` 等枚举类/常量文件,替换所有魔法值。
> ⚠️ **局限性说明**:您提供的代码在 `$this->next_date_room_book_time = [...]` 处被截断,未能看到 `_get_un_book_time` 方法的完整实现及后续逻辑。若截断部分包含核心时段合并算法或数据库写入操作,请补充完整代码以便进行二次深度审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779954829
|
1779954829
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
407
|
21
|
131
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `b43d085d8 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `b43d085d86dcd31d3597c0311377317a67d79671`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-28 16:59:00
---
> 📌 **框架说明**:根据目录结构 (`system/`, `application/`)、`$CI = &get_instance()` 语法及加载方式,该代码实际基于 **CodeIgniter 3** 框架。以下审查将基于 CI3 架构规范与现代 PHP 最佳实践进行。若 `phpci` 为内部定制分支,请同步核对底层差异。
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖全面,但模型承担了配置加载、时间计算、团购券校验、UI状态标记等多重职责,严重违反单一职责原则(SRP)。存在静态变量跨请求污染、全局 `$CI` 状态篡改、时间格式混用及大量魔法值等隐患。代码片段在 `_get_un_book_time` 方法中途截断,部分逻辑无法完整评估。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 类级别 / `self::$xxx` 静态属性 | **静态缓存导致跨请求数据污染**:`self::$book_days_info`、`self::$shop_data` 等静态变量在 PHP-FPM 进程生命周期内持久化。若同一 Worker 处理不同 `merchant_id` 的请求,将直接返回脏数据,引发严重业务错乱。 | 移除 `static` 关键字,改为实例级缓存(如 `$this->cache['shop_data']`)或按 `merchant_id`+`shop_id` 组合键缓存。请求结束后自动释放。 | `// 错误:public static $shop_data = [];`<br>`// 正确:protected $cache = [];`<br>`if (!isset($this->cache['shop_data'])) { ... }` |
| 🔴 严重 | `set_shop_config()` / `set_room_info()` | **直接修改全局 `$CI` 属性引发副作用**:`$CI->operational_scene = $room_operational_scene;` 篡改了 CI 超级对象状态。在并发或后续中间件/控制器中极易引发不可预知的逻辑覆盖。 | 避免直接赋值全局对象。应通过方法返回值传递,或使用 CI 配置项 `$this->config->set_item()`,或注入到当前实例属性中。 | `// 错误:$CI->operational_scene = $room_operational_scene;`<br>`// 正确:$this->book_room_operational_scene = $room_operational_scene;`<br>`return $this->book_room_operational_scene;` |
| 🟠 警告 | `get_book_day_time_info()` 循环体 | **状态覆盖与优先级混乱**:连续多个 `if ($v['status'] == '1')` 判断,后序条件可能覆盖前序已标记的 `status` 或 `notice_type`,且缺乏明确的优先级控制与短路机制。 | 引入状态优先级常量,使用 `continue` 提前终止已判定为不可用的时间点;或抽离为独立的状态机/规则链。 | `foreach ($time_info as $k => &$v) {`<br>` if ($v['status'] !== '1') continue; // 已不可用则跳过`<br>` // 按优先级依次判断...`<br>`}` |
| 🟠 警告 | 多处时间处理逻辑 | **时间格式混用与重复计算**:`Ymd`、`YmdHi`、`H:i`、时间戳、自定义字符串混用,且 `strtotime($date)`、`date('Ymd')` 在循环/分支中重复调用,易引发跨天/时区边界 Bug。 | 统一使用 `DateTimeImmutable` 或纯时间戳进行计算,仅在最终输出时格式化。缓存基础时间戳变量。 | `$date_ts = strtotime($date);`<br>`$today_ts = strtotime(date('Y-m-d'));`<br>`// 后续全部基于 $date_ts 进行加减运算` |
| 🟠 警告 | `__construct()` 及多处 | **重复加载模型与冗余 `$CI` 获取**:`$CI = &get_instance()` 在文件顶部、构造函数、多个方法中重复声明;`$this->load->model()` 在方法内频繁调用。虽 CI3 有加载缓存,但严重影响可读性与执行效率。 | 在构造函数中统一加载依赖模型与库;移除冗余的 `$CI` 声明,直接使用 `$this->load` 或 `$this->ci`(若父类提供)。 | `public function __construct() {`<br>` parent::__construct();`<br>` $this->load->model(['ahead_shop_model', 'ahead_shop_config_second_model']);`<br>` $this->load->library('Tuangou');`<br>`}` |
| 🟡 建议 | 类属性与方法定义 | **违反 PSR-12 与单一职责原则**:属性命名混用 `snake_case` 与 `camelCase`;大量 `public` 属性暴露内部状态;模型同时处理配置、时间计算、团购校验、UI 状态标记。 | 遵循 PSR-12:方法/属性统一使用 `camelCase`,内部属性设为 `protected`。按职责拆分为 `ShopConfigService`、`BookingTimeCalculator`、`VoucherRuleValidator`。 | `// 属性规范`<br>`protected $defaultHours = [];`<br>`protected $bookTimeLimit = 3600;`<br>`// 方法规范`<br>`public function getBookDaysInfo(...)` |
| 🟡 建议 | 全文件 | **魔法值与硬编码散落**:`'1'`、`'2'`、`'3'`、`'merchantApp'`、`'-1'` 等状态码与场景标识直接硬编码,维护成本极高。 | 定义类常量或枚举类(PHP 8.1+),集中管理业务字典。 | `const SCENE_KTV = '1';`<br>`const SCENE_BILLIARDS = '2';`<br>`const STATUS_AVAILABLE = '1';`<br>`const STATUS_UNAVAILABLE = '-1';` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **清除静态状态污染**:立即将 `self::$xxx` 静态属性改为实例属性或请求级缓存,防止多商户并发请求下的数据串扰。
2. **隔离全局 `$CI` 修改**:停止直接赋值 `$CI->xxx`,改为通过方法返回值、配置项或依赖注入传递上下文,确保请求隔离性。
3. **统一时间计算基线**:将所有时间操作收敛为时间戳或 `DateTime` 对象,消除字符串格式混用带来的隐式转换风险。
### 🛠 后续重构与优化方向
- **架构拆分(SRP)**:当前模型已演变为“上帝类”。建议将业务逻辑拆分为:
- `ShopConfigLoader`:负责读取门店配置、场景映射。
- `BookingTimeEngine`:专注时间片计算、冲突检测、跨天逻辑。
- `VoucherRuleChecker`:封装团购券可用时间、星期、时长限制等规则。
- **规则链模式替代嵌套 `if`**:将 `get_book_day_time_info` 中的状态判定改为责任链或策略模式。每个规则返回 `['status' => '1', 'reason' => '']`,主流程按优先级合并结果,提升可测试性与扩展性。
- **输入校验与异常处理**:对 `$params` 中的 `date`、`merchant_id`、`shop_id` 增加类型与格式校验。将 `throwError()` 替换为标准 `throw new \InvalidArgumentException()` 或 CI3 的 `show_error()`,避免敏感路径泄露。
- **性能优化**:`array_intersect`、`mergeTimeRanges`、`shiftTimeRanges` 等数组操作在循环中频繁执行,建议将时间片计算移至数据库层(如使用 MySQL 的 `INTERVAL` 或生成临时表),或引入位图/区间树算法降低时间复杂度。
> ⚠️ **局限性说明**:提供的代码在 `_get_un_book_time` 方法中途截断,后续逻辑(如次日时间处理、最终返回结构)无法完整审查。建议补充完整文件后,可进一步评估边界条件处理与内存泄漏风险。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779958740
|
1779958740
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
408
|
21
|
132
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `eb5b4dbe1 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `eb5b4dbe1e21990dc4ce9ae1f3ef659c98f1c761`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-28 17:06:11
---
## 1. 审查摘要
- **代码质量评分**:6.0 / 10 分
- **总体评价**:业务链路覆盖较全(支付回调、退款、下单、消息推送等),但存在**高危 SQL 注入风险**、**事务状态管理混乱**及**全局变量滥用**等架构缺陷。代码中大量使用魔法数字、重复加载模型、错误处理机制不统一,导致可维护性与扩展性较差。
- **风险等级**:🔴 高
- **⚠️ 局限性说明**:提供的代码在 `create_community_shop_book_order` 方法末尾被截断,本次审查仅基于已提供片段。若截断部分包含核心支付或状态流转逻辑,建议补充后二次复核。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `refund_by_notify` ~L240 | `$log_where` 使用字符串拼接构造 WHERE 条件,若 `_id` 未严格过滤或未来传入恶意字符,将直接导致 **SQL 注入**。且 `$log_up` 同样为裸字符串,绕过框架安全转义。 | 废弃裸字符串拼接,全面改用 CI 查询构造器(Query Builder)或 `$this->db->escape()`。 | `$this->db->where('_relation_id', $order_data['_id'])<br>->where('_status', 1)<br>->where_in('_type', [5, 13])<br>->update('pay_log_table', $update_data);` |
| 🔴 严重 | 文件顶部 L7 | `$CI = &get_instance();` 定义在类外部。PHP 每次 `include/require` 该文件都会执行此赋值,破坏单例模式且可能在未初始化环境下报错。 | 移除全局定义,改为在类内部方法中按需获取,或在 `__construct()` 中赋值给类属性。 | `protected $CI;<br>public function __construct() { parent::__construct(); $this->CI =& get_instance(); }` |
| 🔴 严重 | `check_notify` L88-L150 | 在 `try` 块中手动调用 `$this->db->trans_rollback()` 后直接 `return`,但后续逻辑仍可能触发 `$this->db->trans_complete()`。CI 事务状态机在手动回滚后调用 `trans_complete()` 会返回 `FALSE` 并可能引发隐式状态冲突。 | 移除手动 `trans_rollback()`,统一交由 `trans_complete()` 根据 `trans_status()` 自动决定提交或回滚。 | `// 移除所有 $this->db->trans_rollback();<br>// 在方法末尾统一:<br>$this->db->trans_complete();<br>if ($this->db->trans_status() === FALSE) { return ['status'=>false, 'msg'=>'事务失败']; }` |
| 🟠 警告 | 全局多处 | 大量使用魔法数字(如 `-1, 1, 2, 3, 4, 5, 14, 58, 56, 9`)表示订单状态、支付渠道、短信模板等。硬编码导致后期维护极易出错。 | 提取为类常量或独立配置文件,增强语义化。 | `const STATUS_PENDING = -1; const STATUS_PAID = 1; const PAY_SCENE_WX = '5';` |
| 🟠 警告 | `send_success_msg` 等 | 方法内部频繁调用 `$this->load->model()`。虽然 CI 有加载缓存,但破坏了单一职责原则,增加耦合度与初始化开销。 | 统一在 `__construct()` 中预加载,或采用依赖注入思想按需传递。 | `public function __construct() { parent::__construct(); $this->load->model(['ahead_merchant_room_type_model', 'ahead_yc_notice_model', 'ahead_user_model']); }` |
| 🟠 警告 | `check_notify` L142 | `json_encode($e->getTrace(), 256)` 记录完整调用栈。生产环境高频支付失败时会导致日志文件暴增,且可能泄露服务器绝对路径等敏感信息。 | 仅记录异常核心信息、行号及关键业务标识。 | `doLog('支付失败: ' . $e->getMessage() . ' (Line:' . $e->getLine() . ') Order:' . $order_id, 'book_order');` |
| 🟡 建议 | `refund` / `check_notify` | 错误处理机制不统一:部分方法返回 `['status'=>false]` 数组,部分直接调用 `throwError()` 中断执行。调用方难以统一捕获。 | 统一契约:Model 层建议全部返回结构化数组,由 Controller 层统一处理异常或跳转。 | 保持全量 `return ['status' => false, 'msg' => '...', 'code' => 500];` 风格 |
| 🟡 建议 | `get_list` L308 | 循环内虽做了 `$merchant_business_model` 缓存,但变量命名易混淆,且未处理 `$order_info` 为空时的边界情况。 | 使用 `array_column` 批量查询,提升可读性与性能。 | `$ids = array_column($order_info, 'merchant_id');<br>$merchants = $this->ahead_merchant_model->get_batch(['_id' => $ids], '_id,_business_model');` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入漏洞**:将 `refund_by_notify` 中的 `$log_where` 和 `$log_up` 替换为 CI 查询构造器链式调用,杜绝字符串拼接。
2. **规范事务生命周期**:移除 `check_notify` 中所有手动 `trans_rollback()`,统一在方法末尾调用 `trans_complete()`,并通过 `trans_status()` 判断结果。避免事务状态机紊乱导致的数据不一致。
3. **清理全局变量**:删除文件顶部的 `$CI = &get_instance();`,改为类属性或方法内局部变量,符合 PHP 面向对象规范。
### 🛠 后续重构与优化方向
1. **常量与枚举化**:建立 `OrderStatus`、`PayPlatform`、`PayScene` 等常量类或配置文件,替换所有魔法数字。可大幅提升代码可读性并降低误改风险。
2. **模型加载优化**:将高频使用的 Model 移至 `__construct()` 中统一加载。对于超长方法(如 `refund_by_notify` 超 200 行),建议按职责拆分为 `processRefund()`、`notifyThirdParty()`、`updateInventory()` 等私有方法。
3. **统一错误契约**:Model 层应作为纯数据与业务逻辑层,避免直接调用 `throwError()` 或输出视图。建议全量采用 `return ['status' => bool, 'msg' => string, 'data' => mixed]` 结构,由 Controller 层统一处理 HTTP 响应。
4. **日志脱敏与分级**:支付、退款等核心链路日志需进行敏感字段脱敏(如手机号、交易号掩码)。建议引入 `Monolog` 或 CI 内置日志分级(`log_message('error', ...)`),避免 `doLog` 泛滥。
5. **框架适配说明**:基于 `system/`、`application/models/` 结构判断,本项目高度疑似基于 **CodeIgniter 3** 架构(提示中 `phpci` 可能为笔误)。上述事务、查询构造器及模型加载建议均严格遵循 CI3 官方最佳实践。若实际为自研框架,请核对 `trans_start/complete` 与 `load->model` 的底层实现是否一致。
> 💡 **下一步建议**:优先完成安全与事务修复后,可引入 `PHPStan` 或 `PHP_CodeSniffer (PSR-12)` 进行静态扫描,逐步建立自动化代码质量门禁。如需对截断的 `create_community_shop_book_order` 进行深度审查,请补充完整代码。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779959171
|
1779959171
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
409
|
21
|
133
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `d971b2acc ## 自动代码审查报告
**分支**: pay-260519
**提交**: `d971b2acce158758365aee22d773f29ebaa4e171`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-28 17:08:50
---
## 1. 审查摘要
- **代码质量评分**:6.0 / 10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算、团购券规则校验、跨天时段合并及多场景配置逻辑。整体功能完整,但存在**静态缓存键缺失业务维度**、**内部状态过度暴露**、**循环内高频数组运算**等隐患。代码结构偏向“过程式堆砌”,未遵循单一职责原则(SRP),在并发或多门店切换场景下易引发数据串扰与性能瓶颈。
- **风险等级**:🟠 中(逻辑与缓存缺陷可能导致错误展示可预订时段;性能问题在高并发下可能引发响应延迟)
> 📌 **框架说明**:根据目录结构(`system/`、`application/`、`get_instance()`)及加载方式,推断 `phpci` 实为 **CodeIgniter 3** 框架。以下审查基于 CI3 架构规范进行。若为内部定制框架,请以官方文档为准。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` / `get_book_day_time_info` | **静态缓存未隔离业务维度**:`self::$book_days_info`、`self::$shop_data`、`self::$date_room_book_time_info` 等静态属性直接缓存数据,但未将 `merchant_id`、`shop_id`、`date` 纳入缓存键。同一请求内切换门店或并发请求不同门店时,会直接返回脏数据,导致严重超售或不可预订误判。 | 移除静态缓存,改用实例属性缓存或带业务维度的键。若需请求级缓存,建议使用 `$this->cache->save()` 或明确包含参数的数组键。 | `$cache_key = "book_days_{$merchant_id}_{$shop_id}_{$add_day}";`<br>`if (!isset($this->cache_pool[$cache_key])) { ... }` |
| 🔴 严重 | `get_book_day_time_info` (~L150) | **多包厢占用时间计算逻辑歧义**:`$un_book_time = array_intersect(...array_values($all_room_book_time));` 此代码返回的是**所有包厢同时被占用的时间**。若业务意图是“智能推荐任意可用包厢”,该逻辑会导致系统认为只要有一个包厢空闲,该时段就完全可用,但实际未过滤已被占用的具体包厢,极易引发预订冲突。 | 明确业务意图。若需合并所有包厢的占用时间,应使用 `array_merge` + `array_unique`。建议抽离为独立方法并添加明确注释。 | `$un_book_time = array_unique(array_merge(...array_values($all_room_book_time)));` |
| 🟠 警告 | 全文多处 | **频繁调用 `&get_instance()`**:在多个方法中重复调用 `$CI = &get_instance();`。虽 CI3 中开销较小,但破坏封装性且不符合框架最佳实践。 | 在构造函数中统一获取一次并赋值给实例属性,后续直接通过 `$this->ci` 访问。 | `protected $ci;`<br>`public function __construct() { parent::__construct(); $this->ci =& get_instance(); }` |
| 🟠 警告 | `get_book_day_time_info` (~L200-L350) | **循环内高频数组运算与时间转换**:核心 `foreach` 中反复调用 `array_intersect`、`array_merge`、`array_unique`、`sort` 及 `strtotime()`/`date()`。当全天按 5 分钟切分(约 288 个时间点)时,时间复杂度呈指数级增长,内存与 CPU 消耗显著。 | 将时间戳计算提前至循环外;使用区间合并算法替代频繁交集运算;将复杂时间校验逻辑抽离至独立 `BookingTimeCalculator` 服务类。 | *(见下方重构建议)* |
| 🟠 警告 | 全文多处 | **魔法值散落**:状态码 `'1'`、`'-1'`、场景标识 `'merchantApp'`、`'7'` 等硬编码遍布逻辑分支,可读性差且易引发维护错误。 | 定义类常量统一管理,提升语义化与可维护性。 | `const STATUS_AVAILABLE = '1';`<br>`const STATUS_UNAVAILABLE = '-1';`<br>`const SOURCE_MERCHANT_APP = 'merchantApp';` |
| 🟡 建议 | 类属性定义 | **内部状态过度暴露**:大量 `public` 属性(如 `$book_time_limit_un_book_time`、`$now_room_book_time`)用于存储中间计算结果。外部可直接修改,破坏封装且易引发不可预知的副作用。 | 改为 `protected` 或 `private`,通过方法返回值或 DTO 对象传递数据。 | `protected $book_time_limit_un_book_time = [];` |
| 🟡 建议 | 文件末尾 | **代码片段截断**:代码在 `$this->next_date_room_book_time = [...]` 处中断,缺失后续跨天逻辑处理、返回值组装及异常边界处理。当前审查仅基于可见片段。 | 请补充完整方法体以便进行闭环审查。 | N/A |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存串扰**:立即为所有 `self::$xxx` 静态缓存添加 `merchant_id` + `shop_id` + `date` 组合键,或改为实例级缓存。这是防止多门店数据污染的最关键一步。
2. **明确多包厢占用计算逻辑**:与产品/业务方确认 `array_intersect` 的真实意图。若为“找任意可用包厢”,需改为 `array_merge` 并记录具体包厢 ID 映射;若为“找全满时段”,需补充注释说明。
3. **统一 CI 实例获取**:将 `&get_instance()` 收敛至构造函数,消除重复调用。
### 🛠 后续重构与优化方向
1. **职责分离(SRP)**:当前模型同时承担了 `数据查询`、`时间区间数学计算`、`团购券规则校验`、`缓存管理` 四大职责。建议:
- 保留 Model 仅负责 DB 读写(`get_one`, `get_shop_config`)。
- 抽离 `BookingTimeService` 或 `TimeRangeCalculator` 类,专门处理时段合并、交集/差集运算、跨天逻辑。
- 抽离 `VoucherRuleValidator` 处理团购券可用性校验。
2. **性能优化策略**:
- **预计算时间戳**:在循环外将 `$time_info` 中的时间字符串统一转为 Unix 时间戳,避免循环内重复 `strtotime()`。
- **位图/区间树替代数组交集**:对于高频的时段重叠判断,可考虑将时间轴离散化为位图(BitMap)或使用区间树(Interval Tree)算法,将 `O(N²)` 降至 `O(N log N)`。
- **批量查询优化**:`prev_date` 与 `next_date` 的查询可合并为一次 `WHERE _date IN (...)` 查询,减少 DB 往返次数。
3. **规范与可维护性提升**:
- 引入 PHP 7+ 类型声明(如 `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array`)。
- 使用常量替换魔法值,配合 IDE 可实现跳转与重构保护。
- 补充单元测试:针对 `_get_un_book_time` 和时段交集逻辑编写边界用例(跨天、24小时营业、最低时长限制、清扫时间叠加等)。
> 💡 **提示**:若需对截断部分或完整业务流程进行深度审查,请提供剩余代码。当前建议已覆盖核心风险点,按优先级实施可显著提升系统稳定性与可维护性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779959330
|
1779959330
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
451
|
21
|
164
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `473df92ce ## 自动代码审查报告
**分支**: pay-260519
**提交**: `473df92ce3abc56c6dcc8b61b18f91afcca7a540`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 10:14:47
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:该文件承载了核心订单计价与组装逻辑,业务场景复杂。但代码存在**财务精度计算隐患、SQL注入风险、调试代码残留、重复赋值覆盖**等严重问题。方法体极度臃肿,违反单一职责原则,且大量使用魔法数字与不规范命名,可维护性与扩展性较差。
- **风险等级**:🔴 高
> 📌 **框架说明**:代码中 `defined('BASEPATH')`、`get_instance()`、`$this->CI->load->model()` 等特征高度符合 **CodeIgniter 3** 架构规范,与提示中的 `phpci` 框架可能存在差异。以下审查基于 CI3 最佳实践及现代 PHP 标准。代码末尾存在截断(`$result['have_good`),部分逻辑未完全展示,审查基于已提供内容。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | ~第380行 | **生产环境残留调试输出**:`echo $vip_upgrade_data_actual_pay;` 会破坏 HTTP 响应流,导致 JSON/XML 解析失败或前端白屏。 | 立即移除 `echo`,改用框架日志记录。 | `log_message('debug', 'VIP升级计算金额: ' . $vip_upgrade_data_actual_pay);` |
| 🔴 严重 | 全文多处 | **浮点数精度丢失风险**:金额计算直接使用 `* / +`(如 `$goods_actual_pay * $vip_discount_rate`),PHP 浮点运算易产生 `0.0000000001` 误差,财务场景致命。 | 统一使用 `bcmath` 扩展函数,并在累加/返回前严格保留2位小数。 | `$actual_pay = bcadd($actual_pay, $goods_actual_pay, 2);`<br>`$discounted = bcmul($price, $rate, 2);` |
| 🔴 严重 | ~第265行 | **SQL 注入隐患**:`"wares_package._package_id in (" . implode(",", $id_array['package_id']) . ")"` 未对输入做类型强转,恶意构造可注入 SQL。 | 强制转为整型数组,或使用 CI3 查询构造器 `where_in()`。 | `$ids = array_map('intval', $id_array['package_id']);`<br>`$pack_goods_where = "wares_package._package_id IN (" . implode(',', $ids) . ")";` |
| 🟠 警告 | ~第225-227行 | **逻辑覆盖错误**:`$order['_prime_service_charge']` 被连续赋值两次,后者 `$service_charge` 覆盖前者 `$prime_after_paid_service_charge`,导致业务数据错乱。 | 核对业务意图,删除冗余赋值,保留正确变量。 | `$order['_prime_service_charge'] = $prime_after_paid_service_charge;`<br>`// 删除下方重复的 $order['_prime_service_charge'] = $service_charge;` |
| 🟠 警告 | 全文多处 | **重复加载模型**:在循环/分支内频繁调用 `$this->CI->load->model()`,增加不必要的 I/O 与内存开销。 | 统一在 `__construct()` 或方法入口处加载,CI3 模型加载本身具备懒加载特性,无需重复调用。 | `public function __construct() {`<br>` $this->CI =& get_instance();`<br>` $this->CI->load->model(['Ahead_vip_level_model', 'Ahead_merchant_goods_model', 'Ahead_goods_price_rooms_model']);`<br>`}` |
| 🟠 警告 | ~第130行 | **魔法数字泛滥**:`100`, `-1`, `1`, `7`, `9999999999999` 等硬编码散落各处,业务规则变更时极易遗漏。 | 提取为类常量,增强语义与可维护性。 | `private const DISCOUNT_BASE = 100;`<br>`private const STATUS_DISABLED = -1;`<br>`private const MAX_REWARD_AMOUNT = 9999999999999;` |
| 🟡 建议 | 全文 | **违反 PSR-12 规范**:属性命名混用驼峰与下划线(`$supermarketRoomName` vs `$room_id`),方法带 `_` 前缀,大量 `public` 属性暴露内部状态。 | 统一使用驼峰命名,将非接口属性改为 `private/protected`,移除方法名前缀。 | `private $supermarketRoomName = '自助扫码厅';`<br>`private $roomId = 0;`<br>`private function createInsertInfosData(...)` |
| 🟡 建议 | `getOrderTypeInfo` | **方法过长且职责混杂**:单方法超 500 行,混合了商品查询、套餐计算、VIP折扣、服务费、优惠券抵扣、免单逻辑等,违反 SRP。 | 按业务域拆分为独立私有方法或策略类,如 `calculateGoodsPrice()`, `applyVipDiscount()`, `computeServiceCharge()`。 | 使用提取方法重构(Extract Method),保持单方法行数 < 80。 |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题(P0)
1. **立即删除 `echo` 调试语句**,避免线上接口响应污染。
2. **修复 SQL 注入风险**:对所有动态拼接的 `IN` 条件执行 `array_map('intval', $ids)` 过滤。
3. **修正重复赋值逻辑**:确认 `$order['_prime_service_charge']` 的正确业务含义,删除覆盖代码。
4. **引入 `bcmath` 金额计算规范**:所有涉及价格的乘除加减必须使用 `bcmul`/`bcadd`/`bcsub`,并在最终返回前统一 `round($val, 2)`。
### 🛠 后续重构与优化方向
1. **架构拆分(策略模式/职责分离)**:
- 将 `getOrderTypeInfo` 拆分为 `OrderCalculator` 服务类。
- 使用策略模式处理不同订单类型(`case '1'`, `case '2'` 等),避免巨型 `switch`。
- 示例结构:
```php
interface OrderTypeStrategy { public function calculate(array $params): array; }
class GoodsOrderStrategy implements OrderTypeStrategy { ... }
class RoomPackageStrategy implements OrderTypeStrategy { ... }
```
2. **数据校验与异常处理**:
- 使用 CI3 的 `Form_validation` 或自定义 DTO 对 `$id_array`, `$goods_quantity` 进行强类型校验。
- 将 `throwError()` 替换为抛出标准异常(如 `throw new \InvalidArgumentException(...)`),便于全局捕获与日志追踪。
3. **框架规范对齐**:
- 若确为 CI3 环境,建议将模型加载移至 `config/autoload.php` 或构造函数中。
- 数据库查询优先使用 `$this->CI->db->where_in()` 等 Query Builder 方法,彻底杜绝字符串拼接。
4. **代码规范升级**:
- 逐步引入 PHP 7+ 类型声明(如 `public function getOrderTypeInfo(string $type, array $idArray, array $goodsQuantity, int $getActualPay = -1, array &$goodsReward = []): array`)。
- 清理历史注释(如 `//add by nan 22.07.11`),改用 Git 提交记录追溯变更。
> 💡 **提示**:由于代码在末尾被截断,部分订单组装逻辑(如 `have_goods` 字段赋值、最终返回结构)未完整展示。建议在修复上述高危问题后,补充完整代码进行二次审查,并补充单元测试覆盖核心计价分支。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780366487
|
1780366487
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
458
|
21
|
171
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `86c4ad47f ## 自动代码审查报告
**分支**: pay-260519
**提交**: `86c4ad47ffe62ac1ed36e7dfc000b075636d8d47`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 13:35:51
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了复杂的多场景(KTV/台球/棋牌/酒馆)包厢预订时间计算逻辑,业务覆盖较全。但存在严重的**状态管理混乱**、**方法职责过重**、**静态缓存设计缺陷**及**潜在运行时错误**。代码结构偏向“上帝类”,违反单一职责原则(SRP),可维护性与测试性较差。
- **风险等级**:🔴 高
- **框架说明**:注:从目录结构、`$CI = &get_instance()`、`load->model()` 等特征判断,该代码实际基于 **CodeIgniter 3 (CI3)** 架构。以下审查基于 CI3 最佳实践,若 `phpci` 为内部定制版本,核心 PHP 规范与逻辑建议依然适用。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` / `self::$shop_data` 等静态属性 | 静态缓存未区分商户/门店ID。同一请求周期内若传入不同 `merchant_id`/`shop_id`,将直接返回错误缓存数据,导致严重业务串扰。 | 移除静态缓存或改用复合键缓存。建议改为实例属性或使用请求级缓存(如 CI 的 `$this->cache`)。 | `$key = "shop_{$merchant_id}_{$shop_id}"; if (!isset(self::$shop_data[$key])) { self::$shop_data[$key] = $this->ahead_shop_model->get_one(...); }` |
| 🔴 严重 | `get_book_day_time_info` / `foreach` 循环内 | 在 `foreach ($time_info as $k => &$v)` 中直接使用 `unset($time_info[$k])` 会破坏数组内部指针,导致后续元素跳过或遍历异常。 | 改用 `array_filter` 过滤,或收集待删除键后统一 `unset`。 | `$time_info = array_filter($time_info, fn($v) => $date != $today || $v['time'] > $now_hour_time);` |
| 🔴 严重 | `get_book_day_time_info` / `array_intersect` | `array_intersect(...array_values($all_room_book_time))` 在数组为空或元素不足时,PHP 8+ 会抛出 `Argument unpacking` 警告/错误,导致脚本中断。 | 增加元素数量校验,或使用 `call_user_func_array` 安全解包。 | `if (count($all_room_book_time) > 1) { $un_book_time = array_intersect(...array_values($all_room_book_time)); }` |
| 🟠 警告 | `get_book_days_info` | `$this->book_days += 1;` 直接修改类属性状态。若该方法被多次调用,天数会持续累加,造成不可预期的逻辑污染。 | 使用局部变量计算,保持实例状态不可变。 | `$days = $this->book_days + ($add_day ? 1 : 0); for ($i = 0; $i < $days; $i++) { ... }` |
| 🟠 警告 | `__construct` 及多处方法 | 频繁调用 `$CI = &get_instance()` 且未复用,增加不必要的函数调用开销。 | 在构造函数中统一赋值给 `$this->ci`,后续统一使用。 | `protected $ci; public function __construct() { parent::__construct(); $this->ci =& get_instance(); }` |
| 🟠 警告 | `get_book_day_time_info` | 方法体超 300 行,嵌套层级深,混合了时间计算、套餐校验、营业时间判断、DB查询等逻辑,违反单一职责原则。 | 拆分为独立私有方法或提取至 `BookingTimeService` 服务层。模型仅保留数据访问。 | 将 `_check_package_time()`, `_check_business_hours()`, `_merge_unavailable_times()` 拆分为独立方法。 |
| 🟠 警告 | 全局 `$params` 使用 | 直接使用 `$params['date']`, `$params['merchant_id']` 等,缺乏类型校验与白名单过滤,存在越权或非法参数注入风险。 | 引入显式类型转换或 CI 表单验证库,关键参数需做合法性校验。 | `$merchant_id = filter_var($params['merchant_id'], FILTER_VALIDATE_INT); if (!$merchant_id) throwError('商户ID无效');` |
| 🟡 建议 | 全局多处 | 存在大量魔法数字/字符串(如 `86400`, `'1'`, `'2'`, `'7'`, `'3600'`),降低可读性且易引发维护错误。 | 提取为类常量或配置文件枚举。 | `const SECONDS_PER_DAY = 86400; const SCENE_KTV = '1'; const SCENE_BILLIARDS = '2';` |
| 🟡 建议 | `get_book_day_time_info` | 变量名拼写错误:`opreational_scene`(应为 `operational_scene`)。 | 全局搜索替换修正拼写,避免后续维护混淆。 | 统一修正为 `operational_scene`。 |
| 🟡 建议 | 全局方法签名 | 缺少 PHP 7+ 类型声明(参数类型、返回类型),不符合现代 PHP 编码规范。 | 补充 `int`, `string`, `array`, `bool` 等类型提示,提升静态分析能力。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **修复静态缓存串扰**:立即将 `self::$shop_data`、`self::$date_time_info` 等静态属性改为带业务主键的数组缓存,或彻底移除静态缓存改用实例属性。这是当前最高风险点。
2. **修复 `foreach` 中的 `unset` 与数组解包**:替换为 `array_filter` 并增加 `count()` 判断,避免 PHP 8+ 环境下的致命错误。
3. **消除状态污染**:将 `$this->book_days += 1` 等直接修改实例属性的操作改为局部变量计算,确保对象可复用。
### 🛠 架构与重构方向
1. **模型瘦身(Model-Service 分离)**:当前模型承担了过多业务逻辑。建议将时间计算、套餐规则校验、不可用时间合并等逻辑抽离至独立的 `BookingTimeCalculatorService` 或 `PackageRuleValidator`。模型仅保留 `get_one()`, `get_shop_setting()` 等数据访问方法。
2. **统一 CI 实例引用**:在 `__construct` 中缓存 `$this->ci = &get_instance()`,避免重复调用。
3. **引入配置常量**:将 `86400`、`3600`、场景标识 `'1'/'2'/'3'` 等提取为类常量或独立配置文件,提升代码可读性与可维护性。
4. **补充输入校验**:在方法入口处对 `$params` 进行类型强转与合法性校验,避免脏数据流入核心计算逻辑。
### 📝 局限性说明
提供的代码片段在 `_get_un_book_time` 方法末尾被截断(`$this->next_date_room_book_time = [...]` 后无闭合),未能审查完整逻辑。建议补充完整文件后,重点检查跨天时间计算、数据库事务处理及异常回滚机制。若需进一步深度审查完整文件,可提供全量代码。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780378551
|
1780378551
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
459
|
21
|
172
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `33cf68b8e ## 自动代码审查报告
**分支**: pay-260519
**提交**: `33cf68b8eed08573f0ad52ebc59f46f33e002b6c`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 13:42:33
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算与状态判定逻辑,业务覆盖全面。但核心方法过长、职责边界模糊、大量依赖全局 `$CI` 对象传递状态,且存在多处逻辑交叉覆盖风险。代码风格偏向传统 PHP 5/7 早期写法,未遵循现代 PSR 规范,可维护性与性能存在明显瓶颈。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据代码结构(`$CI = &get_instance()`、`system/` 目录、`$this->load->model()` 等),该代码实际基于 **CodeIgniter 3** 架构。以下审查基于 CI3 最佳实践。若确为内部自研 `phpci` 框架,请对照其官方文档调整组件加载与生命周期调用方式。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_day_time_info()` 核心循环 | 方法超 300 行,`$v['status']` 在多个 `if` 分支中被反复覆盖修改。条件交叉重叠(如套餐限制、营业时间、不可用时间、跨天逻辑等),极易因执行顺序导致状态误判或漏判。 | **拆分职责**:将校验逻辑抽离为独立方法(如 `checkVoucherTime()`, `checkBusinessHours()`, `checkLockedTime()`),采用**责任链模式**或**策略模式**依次校验,任一失败则提前返回或标记状态,避免嵌套覆盖。 | `foreach ($time_info as &$v) { $v['status'] = $this->validateTimeSlot($v, $constraints); }` |
| 🔴 严重 | `__construct()` & `set_shop_config()` | 频繁调用 `$CI = &get_instance()` 并直接读写 `$CI->operational_scene`、`$CI->request_source` 等属性。破坏 MVC 封装,易引发全局状态污染,且在并发或 CLI 环境下可能导致数据串扰。 | 移除对 `$CI` 属性的直接赋值。改为通过方法参数传递上下文,或使用 `$this->ci = &get_instance()` 在构造函数中缓存一次,仅通过 `$this->ci->config->item()` 读取配置。 | `protected $ci; public function __construct() { parent::__construct(); $this->ci = &get_instance(); }` |
| 🟠 警告 | `_get_un_book_time()` & `get_book_day_time_info()` | 多次重复调用 `ahead_shop_config_second_model->get_shop_setting()` 获取相同配置项,未做请求级缓存,增加数据库 I/O 压力。 | 使用 CI 缓存驱动或请求级静态数组缓存配置。若配置变更不频繁,建议接入 Redis/文件缓存。 | `protected function getShopConfig($key) { static $cache = []; return $cache[$key] ??= $this->ci->ahead_shop_config_second_model->get_shop_setting(...); }` |
| 🟠 警告 | `get_book_day_time_info()` 数据解析 | `json_decode($book_time_info['_time_info_new'], 1)` 未校验 JSON 格式。若数据库字段损坏或包含非法字符,将触发 Warning 并返回 `null`,导致后续 `foreach` 报错。 | 增加 `json_last_error()` 校验,并提供安全降级默认值。 | `$data = json_decode($json, true); if (json_last_error() !== JSON_ERROR_NONE) { $data = []; }` |
| 🟠 警告 | 全局时间计算 | 大量使用字符串时间(如 `'202407010800'`)进行 `array_intersect`、`strtotime` 转换。字符串比较易受时区、格式不一致影响,且性能低于整型时间戳。 | **统一使用 Unix 时间戳(int)**进行区间计算与交集判断,仅在最终输出时格式化为字符串。可封装 `TimeRange` 值对象。 | `class TimeRange { public int $start; public int $end; public function intersects(self $other): bool { ... } }` |
| 🟡 建议 | 全局常量与魔法值 | 大量硬编码魔法值:`'1'`, `'-1'`, `'2'`, `'3'`, `'4'`, `86400`, `3600`。可读性差,后期维护易出错。 | 定义类常量或枚举(PHP 8.1+),集中管理业务状态与时间单位。 | `const STATUS_AVAILABLE = '1'; const STATUS_UNAVAILABLE = '-1'; const SECONDS_PER_DAY = 86400;` |
| 🟡 建议 | 辅助函数依赖 | 依赖大量未命名空间的全局函数(`timeToHour`, `mergeTimeRanges`, `throwError` 等),不符合 PSR-4/12 规范,难以进行单元测试。 | 封装为独立的服务类(如 `BookingTimeCalculator`、`ValidationHelper`),通过依赖注入或静态方法调用,便于 Mock 测试。 | `class TimeUtils { public static function mergeRanges(array $ranges): array { ... } }` |
| 🟡 建议 | `set_shop_config()` 与 `set_room_info()` | 两个方法逻辑高度重复(获取场景、加载配置、计算分钟单位),违反 DRY 原则。 | 合并为单一受保护方法,通过参数区分调用场景,或提取为 `SceneConfigLoader` 组件。 | `protected function loadSceneConfig(?int $roomId = null): void { ... }` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **消除 `$v['status']` 状态覆盖风险**:当前 `get_book_day_time_info()` 的 `foreach` 循环是系统核心,状态被多次覆盖极易引发线上客诉(如“明明可订却显示不可订”)。请立即将校验逻辑拆分为独立方法,采用**短路返回**或**状态累加器**模式。
2. **收敛全局 `$CI` 对象滥用**:禁止在 Model 中直接修改 `$CI->xxx` 属性。所有上下文数据(如 `request_source`, `operational_scene`)应通过方法参数传入,或使用 `$this->ci->session->userdata()` 等标准方式获取。
3. **增强 JSON 解析与输入校验**:对 `$params` 增加类型强转与基础校验(如 `ctype_digit($params['merchant_id'])`),对 `json_decode` 增加错误捕获,防止脏数据导致白屏或逻辑中断。
### 🛠 后续重构与优化方向
1. **架构分层**:当前 Model 承担了 `数据查询`、`业务规则计算`、`状态组装` 三重职责。建议引入 **Service 层**(如 `BookingAvailabilityService`)处理复杂时间计算,Model 仅负责数据持久化与基础查询。
2. **时间计算引擎化**:将 `mergeTimeRanges`、`shiftTimeRange`、`minutesToUnits` 等函数抽象为独立的 `TimeRangeCalculator` 类。内部统一使用 `int` 时间戳运算,彻底告别字符串时间拼接,提升计算精度与性能。
3. **配置缓存策略**:门店配置(`book_minute_unit`, `book_hour_options` 等)变更频率低,建议接入 CI 缓存驱动(`$this->ci->cache->save()`)或 Redis,设置合理 TTL(如 30 分钟),减少高频查询对 DB 的冲击。
4. **单元测试覆盖**:该模块逻辑分支极多,强烈建议使用 PHPUnit 编写核心校验逻辑的单元测试。通过 Mock 数据库与 `$CI` 对象,验证不同场景(跨天、套餐限制、最低时长、清扫时间)下的时间槽输出是否符合预期。
> 💡 **提示**:若需进一步审查 `Simple_model` 基类实现、`Tuangou` 库逻辑或控制器层调用方式,请提供相关代码片段。当前审查仅基于已提交的 Model 文件,部分全局函数与框架生命周期细节可能存在上下文盲区。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780378954
|
1780378954
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
202
|
21
|
20
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 14003服务费判断临时授权。余额同步修改。
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `9ecd6a01b ## 自动代码审查报告
**分支**: pay-260519
**提交**: `9ecd6a01b44fa05433ae81813f037b665e7efdf2`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 15:43:42
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:代码实现了门店账户余额查询、扣减、日志记录及第三方接口上报等核心业务,但存在**严重的并发竞态条件、浮点数精度隐患、未定义变量引用及 SQL 拼接风险**。部分方法存在死代码,且大量重复逻辑未做抽象,整体可维护性与财务安全性不足。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `_check_consume_deduction_balance` 方法内 | 方法参数为 `$merchantId, $shopId`,但内部直接判断 `if (empty($shopInfo))`。`$shopInfo` 未定义,将触发 PHP Notice 且逻辑永远走 DB 查询,属于明显 BUG。 | 移除无意义的 `if (empty($shopInfo))` 判断,直接执行查询逻辑。 | `public function _check_consume_deduction_balance($merchantId, $shopId) { $shopWhere = [...]; $shopInfo = $this->get_one(...); ... }` |
| 🔴 严重 | `modify_shop_account` / `modify_shop_all_account` | 采用“先 `get_one` 判断是否存在,再 `insert` 或 `up`”的模式。高并发下会产生**竞态条件(Race Condition)**,导致重复插入或余额超扣/负数。 | 使用数据库原子更新或事务。插入使用 `INSERT ... ON DUPLICATE KEY UPDATE`,更新时增加余额校验条件。 | `$this->db->set('_balance', '_balance + ' . (float)$amount, FALSE)->where('_id', $id)->where('_balance >=', $amount)->update($table);` |
| 🔴 严重 | 全局金额计算与比较 | 使用 `float` 进行金额计算(如 `0.08 * count`)和比较(`$balance <= 0`)。PHP 浮点数精度丢失会导致财务对账错误(如 `0.1+0.2 != 0.3`)。 | 财务字段统一使用数据库 `DECIMAL` 类型,PHP 层转为**“分”(整数)**计算,或使用 `bcmath` 扩展。 | `$amount_cents = (int)round($amount * 100);` 比较时:`if ($balance_cents <= 0)` |
| 🟠 警告 | `modify_shop_*` 系列方法 | SQL 更新语句使用字符串拼接:`$up = '_balance=_balance+' . $amount`。若 `$amount` 来源不可控,存在 **SQL 注入风险**,且不符合框架安全规范。 | 使用框架 Query Builder 或参数绑定,严禁直接拼接变量。若底层 `up()` 仅支持字符串,必须强制类型转换。 | `$amount = (float)$amount; $up = "_balance=_balance+{$amount}";`(临时方案)<br>推荐:使用 `$this->db->set()` 链式调用。 |
| 🟠 警告 | `sent_cavca_open_room_order` | 方法首行直接 `return true;`,导致后续所有业务逻辑(加载模型、计算价格、请求 API)成为**死代码**。 | 确认是否为调试遗留。若需保留逻辑,删除首行 `return true;`;若已废弃,直接删除该方法。 | 移除 `return true;` 或添加注释说明废弃原因。 |
| 🟠 警告 | `check_shop_balance` | `$shopInfo` 可能为 `null`,但后续直接访问 `$shopInfo['_start_time']` 和 `$shopInfo['_temp_auth_expire_time']`,未做空值保护,可能触发 `Undefined array key` 警告。 | 在访问数组键前增加 `isset()` 或空合并运算符 `??` 保护。 | `$startTime = $shopInfo['_start_time'] ?? 0;`<br>`$tempAuth = $shopInfo['_temp_auth_expire_time'] ?? 0;` |
| 🟡 建议 | 全局多处 | 频繁在方法内部调用 `$this->load->model()` 和 `$this->config->load()`,增加 I/O 开销且违反依赖注入原则。 | 将依赖的 Model 和 Config 统一在 `__construct()` 中加载,或使用框架自动加载机制。 | `public function __construct() { parent::__construct(); $this->load->model(['Ahead_agent_authenticate_model', 'ahead_shop_account_log_model']); }` |
| 🟡 建议 | 命名与规范 | 变量命名风格混用(`$merchantId` vs `$merchant_id`),缺乏 PHP 7+ 类型声明,注释与代码实际行为不符(如 `consume_deduction_account` 注释说金额由 `$data` 传入,实际被硬编码覆盖)。 | 统一命名规范(建议驼峰),添加类型声明,修正注释。遵循 PSR-12。 | `public function consume_deduction_account(int $merchantId, int $shopId, array $data, array $shopInfo = []): bool` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **修复未定义变量 BUG**:立即修正 `_check_consume_deduction_balance` 中的 `$shopInfo` 作用域问题。
2. **消除并发竞态条件**:所有涉及余额增减的操作必须改为**原子 SQL 更新**或包裹在数据库事务中(`$this->db->trans_start()` / `$this->db->trans_complete()`),确保扣款与日志写入的 ACID 特性。
3. **统一金额精度处理**:财务系统严禁使用 `float` 直接计算。建议全链路改为“分”为单位整数,或引入 `bcmath` 函数族进行安全运算。
4. **清理死代码与 SQL 拼接**:移除 `sent_cavca_open_room_order` 的无效 `return`;将 `$up` 字符串拼接替换为框架安全的 Query Builder 或严格类型转换。
### 🛠 后续重构与优化方向
- **抽象财务操作服务层**:当前 Model 承担了查询、扣减、日志、报表、第三方 API 调用等多重职责。建议拆分出 `ShopAccountService`,遵循单一职责原则(SRP),Model 仅负责数据持久化。
- **引入数据库事务机制**:在 `update_shop_account_by_sms`、`consume_deduction_account` 等方法中,将余额更新与日志插入包裹在事务内,失败时自动回滚,避免“钱扣了但没日志”的脏数据。
- **规范异常处理**:替换自定义 `throwError()`,改用标准 `throw new \InvalidArgumentException()` 或框架异常类,并在 Controller 层统一捕获返回 JSON 错误码,避免敏感堆栈信息泄露。
- **框架适配提示**:代码语法与 **CodeIgniter 3** 高度一致。若 `phpci` 为内部定制框架,请务必查阅官方文档确认:
- `up()`、`get_one()` 是否支持预处理参数绑定(Prepared Statements)。
- 框架是否提供内置的 `trans_start()` 事务管理。
- 若底层不支持参数绑定,请在所有拼接处强制使用 `(int)` 或 `(float)` 过滤,并开启框架的 `db_debug` 进行安全审计。
> 💡 **审查局限性说明**:本次审查基于提供的单文件代码。由于未提供 `Simple_model` 父类实现、数据库表结构及全局配置,部分底层方法(如 `up()`、`get_one()`)的安全性与事务支持需结合实际框架源码进一步验证。建议结合完整项目上下文进行集成测试。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779176622
|
1779176622
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
259
|
21
|
54
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - Merge branch 'pay-260519 🔍 代码审查报告:pay-260519 - Merge branch 'pay-260519' of https://gitea.g-hi.co...
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `e22a68ad1 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `e22a68ad122d6c6f12ebc50a10a022d5ade96570`
**提交人**: linyangrui (yangruilin888@gmail.com)
**时间**: 2026-05-21 09:52:27
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:代码整体呈现典型的“快速迭代/调试期”特征,业务逻辑覆盖较广,但存在大量硬编码敏感信息、未授权调试接口、密码学逻辑混乱及架构规范缺失问题。控制器文件 `Test.php` 承担了过多非生产职责,严重违反 MVC 分层原则。部分核心计算逻辑(如金额、签名)缺乏精度控制与安全校验,需优先重构。
- **风险等级**:🔴 高(存在凭证泄露、越权访问、中间人攻击及密码学误用风险)
> 📌 **框架说明**:从 `BASEPATH`、`get_instance()`、`$this->load->model()` 等特征判断,当前项目实际基于 **CodeIgniter 3** 架构。以下审查建议将基于 CI3 最佳实践与 PSR-12 规范提供。若 `phpci` 为内部定制框架,请对照其生命周期文档调整组件加载方式。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Test.php` (多处) | **敏感凭证硬编码**:阿里云 AK/SK、Redis 密码、OSS 密钥、微信/支付宝配置直接写死在代码中,极易随版本库泄露。 | 统一迁移至环境变量或 `config/production/` 配置文件,通过 `getenv()` 或 CI3 配置类读取。 | `// .env 或 config.php<br>$config['aliyun_oss']['access_key'] = getenv('ALIYUN_OSS_AK');` |
| 🔴 严重 | `Test.php` (`get_redis_memory`) | **越权访问风险**:允许通过 `$_GET['id']` 任意指定 Redis 数据库索引,且无任何权限校验,攻击者可读取/清空任意库数据。 | 移除该接口或增加严格鉴权(如后台登录态+IP白名单),固定 DB 索引,禁止外部参数传入。 | `// 移除动态参数<br>$redis->select(2); // 固定业务库` |
| 🔴 严重 | `GuoTong.php` (`request`) | **禁用 SSL 验证**:`CURLOPT_SSL_VERIFYPEER => false` 导致请求易受中间人攻击,支付回调数据可能被篡改。 | 生产环境必须开启 SSL 验证,配置系统 CA 证书路径。 | `curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);<br>curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');` |
| 🔴 严重 | `GuoTong.php` (`create_sing`/`checksign`) | **密码学逻辑错误**:使用公钥进行“签名”(实为公钥加密),且变量 `$privateKey` 实际存储公钥。标准签名应使用私钥 `openssl_sign`,验签使用公钥 `openssl_verify`。当前实现可能导致验签失败或伪造签名。 | 修正为标准的 RSA 签名/验签流程,重命名变量避免歧义。 | `// 签名<br>openssl_sign($str, $sign, $privateKey, OPENSSL_ALGO_SHA256);<br>$sign = base64_encode($sign);` |
| 🔴 严重 | `GuoTong.php` (`get_client_ip`) | **IP 伪造漏洞**:直接信任 `HTTP_X_FORWARDED_FOR` 等请求头,未做格式校验,攻击者可伪造 IP 绕过风控或日志追踪。 | 优先使用 `REMOTE_ADDR`,若需代理 IP 需严格正则校验并限制可信代理列表。 | `// 安全获取 IP<br>$ip = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';` |
| 🟠 警告 | `Test.php` (整体) | **调试接口暴露**:包含大量 `exit`、`echo`、`debug_backtrace`、JS 跳转分页,且无路由鉴权,生产环境极易被恶意调用导致服务阻塞或数据异常。 | 将测试逻辑剥离至独立 CLI 脚本或受保护的 Admin 模块;生产环境通过路由中间件禁用 `/test/*`。 | `// 路由配置中屏蔽<br>$route['test/(:any)'] = 'errors/404';` |
| 🟠 警告 | `Rocketmqs.php` (`__construct`) | **配置硬编码与非标准加载**:Endpoint、AK/SK 写死;`import()` 非 PHP 原生函数,依赖框架自定义加载器,不利于 Composer 生态集成。 | 配置抽离至 `config/rocketmq.php`;使用 Composer `require 'vendor/autoload.php'` 替代 `import()`。 | `// 标准自动加载<br>require_once APPPATH . 'third_party/aliyun-mq/vendor/autoload.php';` |
| 🟠 警告 | `Neworderservice.php` (多处) | **浮点数精度丢失**:金额计算使用 `sprintf("%.2f")` 和浮点乘除,在累加或折扣场景下易出现 `0.000000001` 误差,导致对账不平。 | 金额统一转为“分”(整数)计算,或使用 `bcmath` 扩展进行高精度运算。 | `// 使用 bcmath<br>$actual_pay = bcdiv(bcmul($price, $quantity, 2), 100, 2);` |
| 🟠 警告 | `Test.php` (`checkJspk`/`sendHzBill`) | **JS 跳转实现批处理**:依赖浏览器 `window.location.href` 分页执行服务端逻辑,易因网络中断、并发刷新导致重复执行或数据不一致。 | 改用 CLI 脚本 + 队列/定时任务,或提供标准 RESTful 分页 API 供前端/脚本调用。 | `// CLI 脚本示例<br>php index.php cli process_jspk --page=1` |
| 🟡 建议 | `Juhai.php` & `Tuangou.php` | **代码重复 (DRY)**:`prepare()` 与 `room_package_prepare()` 中套餐校验、时间交集计算、不可用日期处理逻辑高度重复。 | 提取公共方法(如 `validatePackageTimeWindow()`、`calculateAvailableHours()`),提升可维护性。 | `// 提取公共逻辑<br>protected function resolvePackageTimeWindow($package_info, $shop_business_time) { ... }` |
| 🟡 建议 | `Test.php` (`ToXml`) | **XML 注入风险**:直接拼接 XML 字符串,若 `$val` 包含 `<`、`&` 或换行符,将破坏 XML 结构。 | 使用 `htmlspecialchars()` 转义,或统一包裹 `<![CDATA[]]>`,推荐改用 `DOMDocument`。 | `$xml .= "<{$key}><![CDATA[{$val}]]></{$key}>";` |
| 🟡 建议 | `Neworderservice.php` (循环内) | **残留调试输出**:`echo $vip_upgrade_data_actual_pay;` 未清理,会污染 JSON/HTML 响应流,导致前端解析失败。 | 移除所有 `echo`/`var_dump`,统一使用日志系统记录调试信息。 | `// 替换为日志<br>log_message('debug', 'Upgrade pay: ' . $vip_upgrade_data_actual_pay);` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题(P0)
1. **凭证与配置脱敏**:立即将 `Test.php`、`Rocketmqs.php`、`GuoTong.php` 中的 AK/SK、Redis 密码、OSS 密钥、支付证书路径迁移至环境变量或加密配置文件。生产环境严禁硬编码。
2. **修复密码学与网络请求安全**:
- 修正 `GuoTong.php` 的签名逻辑,使用 `openssl_sign`/`openssl_verify` 标准流程。
- 开启 cURL 的 `CURLOPT_SSL_VERIFYPEER`,配置 CA 证书。
- 严格校验客户端 IP,禁用不可信代理头。
3. **下线/隔离调试接口**:`Test.php` 中的 `get_redis_memory`、`copyoss`、`delGgOss` 等接口具备高危操作能力,必须立即添加鉴权中间件或移至内网/CLI 环境,禁止公网暴露。
### 🛠 后续重构与优化方向
1. **架构分层与职责分离**:
- `Test.php` 已演变为“上帝控制器”,建议按业务域拆分为独立的 CLI 脚本(如 `cli/migrate/`、`cli/debug/`)或 Admin 后台模块。
- 控制器仅负责接收请求、参数校验、调用 Service 层、返回响应。将订单计算、券校验、支付签名等逻辑下沉至 `application/services/` 或 `application/libraries/` 中。
2. **金额与精度规范**:
- 全局统一金额存储与计算单位为“分”(整数),或强制使用 `bcmath` 扩展。禁止在业务逻辑中直接使用浮点数进行乘除累加。
3. **框架适配与 PSR-12 规范**:
- 逐步替换全局函数(`throwError`、`do_log`、`curlRequest`、`import`)为类方法或依赖注入服务,提升单元测试覆盖率。
- 统一命名规范(如 `Neworderservice` → `NewOrderService`),移除冗余的 `exit`/`echo`,确保响应格式统一(JSON/HTML 分离)。
4. **批处理任务改造**:
- 将 `checkJspk`、`sendHzBill`、`delGgOss` 等依赖 JS 跳转的“伪异步”逻辑改造为基于队列(如 Redis Queue / RabbitMQ)的异步任务,配合 Supervisor 守护进程执行,提升系统稳定性与可观测性。
> ⚠️ **局限性说明**:`Neworderservice.php` 与 `Tuangou.php` 代码在末尾被截断,未能完整审查订单状态机流转与团购平台路由分发逻辑。建议补充完整文件后再次进行深度审计。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779328347
|
1779328347
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
261
|
21
|
55
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 'origin/pay-260519' i...
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `bb6144db5 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `bb6144db5ac1f4053557295d5beadfd9eafa0e47`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-21 10:37:53
---
## 1. 审查摘要
- **代码质量评分**:3.5 / 10 分
- **总体评价**:当前提交的代码包含大量调试/测试逻辑与生产代码混杂,存在严重的硬编码凭证、不安全的数据库连接切换、同步阻塞调用及明显的 PSR-12 规范违规。整体架构偏向“脚本堆砌”,缺乏分层设计与框架最佳实践。注:根据代码特征(`BASEPATH`、`$this->load->library`、`get_instance()` 等),项目实际基于 **CodeIgniter 3** 框架,而非 `phpci`。以下审查将基于 CI3 及现代 PHP 标准进行。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Test.php` 多处 | **硬编码敏感凭证**(阿里云 AK/SK、Redis 密码、OSS 密钥、微信 AppID、RSA 私钥等)直接暴露在源码中,极易导致云资源被盗用或数据泄露。 | 所有敏感配置必须移至 `application/config/` 下的独立配置文件或环境变量中,通过 `$this->config->item()` 读取。生产环境严禁提交凭证。 | `// config/aliyun.php<br>$config['aliyun_ak'] = getenv('ALIYUN_AK') ?: 'default';` |
| 🔴 严重 | `Test.php::showPhpInfo` | 公开暴露 `phpinfo()`,泄露服务器环境、扩展版本、路径等核心信息,为攻击者提供精准攻击面。 | 立即删除或添加严格的 IP/权限白名单校验,生产环境必须关闭。 | `if ($this->input->ip_address() !== '127.0.0.1') show_404();` |
| 🔴 严重 | `Test.php::get_redis_memory` | 直接使用 `$_GET['id']` 传入 Redis 命令,未做类型过滤,存在 **命令注入** 风险。 | 使用 CI 的 `$this->input->get('id', TRUE)` 并严格校验为合法整数范围。 | `$db_id = filter_var($this->input->get('id'), FILTER_VALIDATE_INT, ['options'=>['min_range'=>0, 'max_range'=>15]]);` |
| 🔴 严重 | `Test.php::up_song_score` | 手动替换 `$this->db->conn_id = $this->sync_db->conn_id;` 切换数据库连接。此操作会破坏 CI DB 驱动的内部状态,极易导致连接泄漏、事务错乱或后续查询指向错误库。 | 使用 CI 原生多数据库加载机制,保持连接隔离。 | `$sync_db = $this->load->database('sync_db', TRUE);<br>$sync_db->select('*')->get('table')->result();` |
| 🟠 警告 | `Rocketmqs.php` | 构造函数硬编码接入点与凭证;使用非标准的 `import()` 加载 Composer;`main()` 方法直接 `print` 输出,不符合 Library 设计规范(应返回数据或抛异常)。 | 配置外置;使用 `require_once` 或 CI 自动加载;方法改为返回结果对象/数组,由 Controller 决定输出格式。 | `public function publish(array $payload, array $props = []): \MQ\Model\TopicMessage { ... return $result; }` |
| 🟠 警告 | `Test.php::testzkmqtt` | 循环内使用 `usleep(2000000)`(2秒)同步阻塞 HTTP 请求。高并发下将迅速耗尽 PHP-FPM 进程,导致服务雪崩。 | 改为异步消息队列(如 Redis/RabbitMQ)处理,或优化硬件/协议交互逻辑,避免在 Web 请求中长时间阻塞。 | `// 建议:将指令写入 Redis List/Stream,由独立 CLI Worker 消费并控制发送间隔` |
| 🟠 警告 | `Test.php` 多处 | 大量测试方法(如 `tttttttt`, `ssdsadssdew`, `checkJspk`)使用 `echo` + JS `window.location.href` 实现分页/跳转,且频繁 `exit()` 中断 MVC 流程。 | 测试脚本应独立为 CLI 命令或专用测试控制器;使用 CI 的 `redirect()` 或返回 JSON/视图。 | `return $this->output->set_content_type('application/json')->set_output(json_encode(['status'=>true]));` |
| 🟡 建议 | `Jh_community_shop_revenues_detail_model.php` | 类外部直接执行 `$CI = &get_instance();`,且方法内频繁 `$this->load->model()`。每次请求加载该 Model 都会触发全局实例获取与重复加载,影响性能。 | 移除外部 `$CI` 调用;将高频依赖的 Model 移至构造函数或使用 CI 自动加载配置。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_yc_merchant_model'); }` |
| 🟡 建议 | 全局文件 | 严重违反 PSR-12 规范:缩进混用(Tab/空格)、命名不规范(`KtvAplicationController` 拼写错误、`tttttttt` 等无意义方法名)、缺乏类型声明与返回值提示。 | 使用 `PHP-CS-Fixer` 统一格式化;遵循驼峰命名;补充 `declare(strict_types=1);` 及类型提示。 | `public function add_by_book_order(array $book_order, int $type, int $order_type): bool` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **凭证与配置外置化**:立即将 `Test.php` 与 `Rocketmqs.php` 中的所有 AK/SK、密码、私钥路径、AppID 等迁移至 `application/config/` 或 `.env` 文件。生产环境务必通过 CI/CD 注入环境变量。
2. **下线危险调试接口**:删除或严格限制 `showPhpInfo()`、`get_redis_memory()`、`up_song_score()` 等直接暴露系统状态或操作底层资源的接口。若需保留,必须添加强鉴权(如 Token+IP 白名单)。
3. **修复数据库连接切换**:彻底移除 `$this->db->conn_id = ...` 的手动赋值,全面改用 CI3 的 `$this->load->database('group_name', TRUE)` 获取独立连接实例。
### 🛠 后续重构与优化方向
1. **职责分离与架构清理**:
- `Test.php` 已演变为“调试大杂烩”,建议拆分为:
- `cli/` 目录下的命令行脚本(用于数据迁移、批量处理、定时任务)。
- 独立的 `TestController`(仅保留核心功能验证,且需鉴权)。
- 生产业务逻辑必须剥离至独立的 `Service` 层或 `Library` 中。
2. **异步化改造**:
- 涉及 `usleep`、外部 API 同步调用、批量 OSS 删除等耗时操作,应统一接入消息队列(如阿里云 RocketMQ/RabbitMQ),由后台 Worker 异步消费,释放 Web 进程。
3. **规范化与工程化**:
- 引入 `PHP-CS-Fixer` 配置 PSR-12 规则,纳入 Git Pre-commit Hook。
- 补充 PHPDoc 注释与类型声明,提升 IDE 提示与静态分析(如 PHPStan)能力。
- 统一日志输出:替换 `print_r`/`echo` 为 `log_message('error', $msg)` 或 CI 的 `Output` 类。
4. **框架适配说明**:
- 当前代码基于 **CodeIgniter 3**。若未来计划升级至 CI4 或 Laravel,建议提前将 `get_instance()`、`$this->load->library()` 等 CI3 特有语法抽象为接口,降低迁移成本。
- `Rocketmqs.php` 中的 `import()` 为项目自定义辅助函数,建议逐步替换为 Composer 原生 `autoload` 机制,便于依赖管理。
> 💡 **提示**:`Test.php` 末尾的 `MakeSigns` 方法代码被截断,若涉及支付签名逻辑,请务必确保签名算法符合微信/支付宝官方最新规范(如 V3 接口要求 RSA-SHA256 及证书序列号),并补充完整的异常捕获与重试机制。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779331073
|
1779331073
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
290
|
21
|
70
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 'origin/pay-260519' i...
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `63ac35f4f ## 自动代码审查报告
**分支**: pay-260519
**提交**: `63ac35f4f14a2c31e93062fb377d5fcb83378644`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-22 14:41:28
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:代码实现了较为复杂的订单计价、会员折扣计算及阿里云 RocketMQ 消息发送逻辑。但存在**严重的安全隐患**(硬编码云密钥)、**调试代码残留**、**重复加载模型**导致的性能损耗,以及大量魔法数字与不规范命名。业务逻辑高度耦合,可维护性与扩展性较差。
- **风险等级**:🔴 高
> *注:根据代码特征(`defined('BASEPATH')`、`get_instance()`、`system/` 目录结构等),判定该项目实际基于 **CodeIgniter 3.x** 框架。以下审查将基于 CI3 规范与 PHP 最佳实践进行。*
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Rocketmqs.php` L6-L8 | **硬编码敏感凭证**:阿里云 `AccessKey ID` 与 `AccessKey Secret` 直接写死在代码中,极易泄露导致云资源被盗用或产生高额账单。 | 将凭证移至 CI 配置文件(如 `application/config/aliyun.php`)或环境变量中,通过 `$this->CI->config->item()` 动态读取。 | `// config/aliyun.php<br>$config['aliyun_mq'] = [<br> 'endpoint' => getenv('MQ_ENDPOINT'),<br> 'ak' => getenv('MQ_AK'),<br> 'sk' => getenv('MQ_SK')<br>];` |
| 🔴 严重 | `Neworderservice.php` ~L400 | **潜在 SQL 注入**:`$pack_goods_where = "wares_package._package_id in (" . implode(",", $id_array['package_id']) . ")";` 未对数组元素进行类型过滤,若传入恶意字符串将直接拼接进 SQL。 | 使用 CI Query Builder 的 `where_in()`,或强制转换为整型数组。 | `$ids = array_map('intval', $id_array['package_id']);<br>$this->CI->db->where_in('wares_package._package_id', $ids);` |
| 🔴 严重 | `Neworderservice.php` ~L350 | **调试代码未清理**:循环内存在 `echo $vip_upgrade_data_actual_pay;`,生产环境会破坏 JSON/HTML 响应结构,并暴露内部计算逻辑。 | 立即移除 `echo`。如需追踪,应使用 CI 日志 `$this->CI->load->library('log'); log_message('debug', ...)`。 | `// 移除 echo<br>// 改为:<br>log_message('debug', 'VIP升级计算: ' . $vip_upgrade_data_actual_pay);` |
| 🟠 警告 | `Rocketmqs.php` L28 | **逻辑与注释不符**:注释标注 `// 10秒后投递`,但代码实际为 `time() * 1000 + 20 * 1000`(延迟 20 秒)。 | 统一注释与代码逻辑,避免误导后续维护者。 | `$publishMessage->setStartDeliverTime(time() * 1000 + 10 * 1000); // 10秒后投递` |
| 🟠 警告 | `Neworderservice.php` 多处 | **重复加载模型**:在 `getOrderTypeInfo` 及私有方法中多次调用 `$this->CI->load->model(...)`。CI3 的 `load->model()` 虽支持重复调用,但会产生不必要的文件 I/O 与内存开销。 | 在构造函数或方法入口处统一加载所需模型,后续直接通过 `$this->CI->ModelName` 调用。 | `public function __construct() {<br> $this->CI =& get_instance();<br> $this->CI->load->model(['Ahead_vip_level_model', 'Ahead_merchant_goods_model', 'Ahead_goods_price_rooms_model']);<br>}` |
| 🟠 警告 | `Neworderservice.php` 多处 | **浮点数精度风险**:金额计算大量使用 `sprintf("%.2f", ...)` 和直接乘除。PHP 浮点数运算存在精度丢失风险,可能导致财务对账差异。 | 财务计算应使用 `bcmath` 扩展函数(如 `bcmul`, `bcadd`)或统一在入库前使用 `round($val, 2, PHP_ROUND_HALF_UP)`。 | `$actual = bcmul((string)$price, (string)$quantity, 2);<br>$actual = round($actual, 2, PHP_ROUND_HALF_UP);` |
| 🟡 建议 | `Rocketmqs.php` L1, L23 | **非标准输出与加载**:使用 `import()`(非 PHP 原生)及 `print`/`print_r` 直接输出。类库不应直接产生输出,应返回数据或抛出异常。 | 改用标准 `require_once` 或 CI 自动加载;移除 `print`,改为返回结果数组或抛出 `\RuntimeException`。 | `try {<br> $result = $this->producer->publishMessage($publishMessage);<br> return ['success' => true, 'message_id' => $result->getMessageId()];<br>} catch (MQException $e) {<br> log_message('error', 'MQ发送失败: ' . $e->getMessage());<br> throw new \RuntimeException('消息发送失败', 0, $e);<br>}` |
| 🟡 建议 | `Neworderservice.php` 全局 | **魔法数字与短变量名**:大量使用 `100`, `-1`, `1`, `7`, `13` 及 `$v`, `$vv`, `$k` 等无意义命名,严重降低可读性。 | 提取为类常量(如 `const STATUS_DISABLED = -1;`),使用语义化变量名(如 `$goods`, `$package`)。 | `const PAY_PLATFORM_WECHAT = 3;<br>const PAY_PLATFORM_OFFLINE = 7;<br>const DISCOUNT_RATE_FULL = 100;` |
| 🟡 建议 | `Neworderservice.php` ~L600 | **冗余赋值与覆盖**:`$result['service_charge'] = $service_charge;` 被连续赋值两次;`$order['_prime_service_charge']` 先赋值后又被 `$service_charge` 覆盖。 | 审查业务意图,删除重复行,确保变量生命周期清晰。 | `// 删除重复行<br>$result['service_charge'] = $service_charge;` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **立即移除硬编码密钥**:将 `Rocketmqs.php` 中的阿里云凭证迁移至配置文件或 `.env`,并在部署时通过环境变量注入。
2. **清理调试代码**:全局搜索并移除 `echo`、`print_r` 等直接输出语句,替换为规范的日志记录。
3. **修复 SQL 拼接风险**:所有 `IN (...)` 条件必须使用框架提供的 `where_in()` 或严格类型转换,杜绝字符串直接拼接。
### 🛠 后续重构与优化方向
1. **拆分巨型方法(SRP 原则)**:`getOrderTypeInfo` 方法超过 400 行,混合了商品查询、价格策略、会员折扣、服务费计算、套餐逻辑等。建议拆分为:
- `OrderPriceCalculator`(负责金额计算)
- `VipDiscountStrategy`(负责会员折扣策略)
- `PackageHandler`(负责套餐逻辑)
2. **统一财务计算规范**:引入 `bcmath` 或封装 `Money` 值对象,确保所有金额运算在 `2` 位小数精度下进行,避免浮点误差累积。
3. **规范异常处理**:当前使用全局 `throwError()` 函数中断流程。建议逐步迁移至 PHP 原生 `Exception` 或 CI 的 `show_error()`,并在控制器层统一捕获处理,便于 API 返回标准化 JSON。
4. **补充单元测试**:计价逻辑极其复杂且分支众多,强烈建议使用 PHPUnit 编写核心计价方法的单元测试,覆盖正常折扣、免单、经理打折、服务费叠加等边界场景。
> ⚠️ **局限性说明**:提供的 `Neworderservice.php` 代码在末尾被截断(`$result['have_good`),部分上下文(如 `throwError` 函数实现、模型底层查询逻辑)无法完全评估。建议提交完整文件以便进行更精准的静态分析与依赖链审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779432088
|
1779432088
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
183
|
21
|
14
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 'pay/pay-260519' into...
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `b44bc1364 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `b44bc1364c13ad1c28c37124418000afeb7d209c`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 13:40:30
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了较为完整的支付流水、套餐查询与门店管理业务,但整体呈现“过程式”堆砌特征。存在明显的 **SQL 注入风险**、**N+1 查询性能瓶颈**、**财务浮点数精度隐患**,且方法过长、职责混杂。代码实际基于 **CodeIgniter 3** 架构(非 `phpci`),建议后续统一遵循 CI3 规范与现代 PHP 工程实践。
- **风险等级**:🔴 高(涉及资金流水与核心业务数据,安全与事务一致性需优先处理)
---
## 2. 问题详情
| 严重程度 | 文件/方法 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_pay_log_model.php`<br>`get_vip_pay_log()` | **SQL 注入风险**:使用字符串拼接构造 `WHERE` 条件,`$vip_card` 未做任何过滤或参数绑定。 | 使用 CI 查询构造器或参数化查询,彻底杜绝拼接。 | `$this->db->where('_merchant_id', $merchant_id)->where('_vip_card', $vip_card)->get($this->table_name)->result_array();` |
| 🔴 严重 | `Ahead_room_package_infos_model.php`<br>`get_book_package_list()` / `get_hot_sale_top5()` | **SQL 注入风险**:原生 SQL 中直接拼接 `$shop_name` 等外部参数,未使用 `escape` 或预处理。 | 改用 CI Query Builder 的 `like()` 方法,或 `$this->db->escape()`。 | `$this->db->like('shop._name', $shop_name);` |
| 🔴 严重 | `Ahead_pay_log_model.php`<br>`get_bill_pay_log()` / `add_by_order()` | **财务精度丢失**:使用 `float` 直接进行金额加减(`$total_actual_pay += $v['actual_pay']`),PHP 浮点运算会导致分位误差。 | 财务计算统一使用 `bcmath` 扩展,或转为“分”为单位的整数运算。 | `$total_actual_pay = bcadd($total_actual_pay, $v['actual_pay'], 2);` |
| 🟠 警告 | `Ahead_pay_log_model.php`<br>`get_bill_pay_log()` | **N+1 查询与重复加载**:`foreach` 循环内反复执行 `$this->load->model()` 和 `get_one()`,数据库 IO 压力极大。 | 提前收集所有 `admin_id`,使用 `where_in` 批量查询;模型应在构造函数或方法入口加载一次。 | `$ids = array_unique(array_column($log_data, 'admin_id')); $users = $this->ahead_yc_merchant_user_model->get_list(['where_in' => ['_id', $ids]]);` |
| 🟠 警告 | `Ahead_pay_log_model.php`<br>`add_by_order()` / `add_by_book_order()` | **缺乏数据库事务**:支付流水插入后,紧接着调用多个关联模型更新营收、积分、地图数据。若中途失败,将导致数据不一致。 | 使用 `$this->db->trans_start()` 包裹核心写入逻辑,失败时 `trans_rollback()`。 | `$this->db->trans_start(); /* 插入与关联更新 */ $this->db->trans_complete();` |
| 🟠 警告 | `Ahead_shop_model.php`<br>`get_cache_shop_data()` | **缓存异常处理缺失**:未捕获 Redis 连接失败或 `json_decode` 解析异常,可能引发致命错误。 | 增加 `try-catch` 或条件判断,降级回源数据库查询。 | `if ($redis->ping()) { $data = $redis->get($key); }` |
| 🟡 建议 | 全局多个文件 | **魔法数字泛滥**:大量硬编码状态值(如 `1, 2, 3, 11, 14, 16, 17`)散落在逻辑判断中,可读性与可维护性差。 | 提取为类常量或独立配置类,如 `const PAY_TYPE_ORDER = 1;`。 | `if ($order['_type'] == self::PAY_TYPE_ORDER) { ... }` |
| 🟡 建议 | `Ahead_room_package_infos_model.php`<br>`get_package_price_list()` | **方法过长 & 违反单一职责**:单个方法超 200 行,混合了数据查询、时间计算、折扣逻辑、数组重组与视图格式化。 | 拆分为 `fetchPackages()`、`calculateDiscount()`、`formatForView()`,或使用 Service/DTO 模式。 | (架构级重构建议) |
| 🟡 建议 | 全局 | **框架适配说明**:代码实际使用 **CodeIgniter 3** 规范。CI3 推荐在 `__construct()` 中预加载高频模型,避免运行时重复 `load->model()`。 | 将 `$this->load->model('xxx')` 移至构造函数,或配置 `autoload.php`。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_shop_config_model'); }` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题(P0/P1)
1. **立即修复 SQL 注入漏洞**:替换所有字符串拼接的 `WHERE` 条件与原生 `LIKE` 查询,全面改用 CI Query Builder 或参数绑定。
2. **引入财务计算安全机制**:所有涉及金额累加、抵扣、分账的逻辑,强制使用 `bcmath` 函数族(`bcadd`, `bcsub`, `bcmul`, `bcdiv`)或转为整数(分)计算。
3. **补充数据库事务控制**:支付流水写入属于强一致性场景,必须使用 `$this->db->trans_start()` / `trans_complete()` 包裹,防止部分成功导致账目不平。
### 🛠 后续重构与优化方向
1. **性能优化**:
- 消除循环内查询(N+1),改为批量 `IN` 查询或 `JOIN`。
- 高频只读接口(如套餐列表、门店信息)引入 Redis 缓存层,并设置合理的缓存失效策略(避免缓存穿透/雪崩)。
2. **架构与规范**:
- **拆分上帝类**:当前 Model 承载了过多业务逻辑(折扣计算、时间判断、视图格式化)。建议将业务逻辑抽离至 `Service` 层,Model 仅负责数据存取。
- **统一常量管理**:建立 `config/constants.php` 或独立 `Enum` 类管理支付类型、订单状态、运营场景等枚举值。
- **遵循 PSR-12**:统一命名规范(方法名驼峰、属性名小写)、补充类型声明(PHP 7.4+ 支持属性类型、方法返回类型)、规范注释块。
3. **框架适配提示**:
> 注:代码特征高度匹配 **CodeIgniter 3**。若项目确为内部定制框架 `phpci`,请核对 `load->model()`、`$this->db` 等核心组件的生命周期是否与 CI3 一致。CI3 已停止官方维护,若为长期项目,建议规划向 CI4、Laravel 或 Symfony 迁移,以获得更好的类型安全、依赖注入与现代化生态支持。
### ⚠️ 审查局限性说明
- 提供的 `Ahead_room_package_infos_model.php` 与 `Neworderservice.php` 文件末尾被截断,部分业务逻辑(如 `getOrderTypeInfo` 后半段、事务回滚逻辑、异常抛出机制)未能完整评估。建议补充完整代码后进行二次深度审查。
- 未提供数据库表结构,部分字段类型(如 `_actual_pay` 是否为 `DECIMAL`)及索引设计无法评估,建议结合 `EXPLAIN` 分析慢查询。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779169230
|
1779169230
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
250
|
21
|
47
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 'pay/pay-260519' into...
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `1693cd0c9 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `1693cd0c92f774fe0768e35812c1c00e4f644e34`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-20 18:21:22
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码覆盖了较完整的支付、团购验券、订单计算及桌台状态流转业务,但存在**严重的密码学误用、API 响应污染、SQL 注入风险及大量重复逻辑**。财务计算未做精度控制,架构偏向过程式堆砌,可维护性与安全性亟待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `GuoTong.php` / `checksign()` | **返回值覆盖 Bug**:循环解密后拼接了 `$result`,但 `return $dataDecrypt;` 仅返回最后一次解密的片段,导致签名校验必然失败或数据截断。 | 返回累积结果 `$result`,并增加解密失败时的异常处理。 | `return $result;` |
| 🔴 严重 | `GuoTong.php` / `create_sing()` | **密码学误用**:使用公钥进行“签名”(`openssl_public_encrypt`)。标准 API 签名应使用**私钥**配合 `openssl_sign()`,公钥仅用于验签。当前实现无法防篡改且不符合国密/RSA 规范。 | 改用 `openssl_sign()` 配合私钥生成签名,或确认第三方接口是否确实要求“公钥加密”(若是,应重命名方法为 `encrypt` 而非 `sign`)。 | `openssl_sign($sha256, $sign, $privateKey, OPENSSL_ALGO_SHA256);` |
| 🔴 严重 | `Neworderservice.php` / ~380行 | **输出污染**:循环内存在 `echo $vip_upgrade_data_actual_pay;`,会直接破坏 JSON/XML 响应结构,导致前端解析失败或支付回调异常。 | 立即删除该 `echo` 语句,调试应使用 `do_log()` 或 CI 日志组件。 | `// 删除 echo $vip_upgrade_data_actual_pay;` |
| 🔴 严重 | `Neworderservice.php` / ~320行 | **SQL 注入风险**:`$pack_goods_where = "wares_package._package_id in (" . implode(",", $id_array['package_id']) . ")";` 直接拼接数组,若 `$id_array['package_id']` 含非数字字符将导致注入。 | 使用 CI 查询构造器安全绑定参数。 | `$this->CI->db->where_in('wares_package._package_id', $id_array['package_id']);` |
| 🔴 严重 | `GuoTong.php` / `request()` | **SSL 验证关闭**:`CURLOPT_SSL_VERIFYPEER` 与 `CURLOPT_SSL_VERIFYHOST` 设为 `false`,极易遭受中间人攻击(MITM),导致支付数据泄露。 | 生产环境必须开启验证,并配置正确的 CA 证书路径。 | `curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_CAINFO, APPPATH.'certs/ca-bundle.crt');` |
| 🟠 警告 | `GuoTong.php` / `get_client_ip()` | **IP 伪造风险**:直接信任 `HTTP_CLIENT_IP` 和 `HTTP_X_FORWARDED_FOR`,攻击者可轻易伪造 IP 绕过风控或日志追踪。 | 使用 CI3 内置安全方法或严格过滤 IP 格式。 | `return $this->CI->input->ip_address();` |
| 🟠 警告 | `Juhai.php` / `prepare_by_voucher_data` & `room_package_prepare` | **严重代码重复**:两个方法中套餐校验、时间交集计算、Redis 缓存逻辑重复率超 80%,违反 DRY 原则,维护成本极高。 | 抽取公共方法 `validate_and_prepare_package($merchant_id, $shop_id, $package_info, $is_voucher = true)`,差异化逻辑通过参数控制。 | *(见下方重构建议)* |
| 🟠 警告 | `Neworderservice.php` / 价格计算 | **浮点数精度丢失**:大量使用 `*`、`/` 进行金额计算(如 `$goods_actual_pay * $vip_discount_rate`),PHP 浮点运算易产生 `0.000000001` 误差,导致对账不平。 | 财务计算统一使用 `bcmath` 扩展或 `round($val, 2)` 严格保留两位小数。 | `$actual = bcmul($price, $rate, 4); $actual = round($actual, 2);` |
| 🟠 警告 | `Tuangou.php` / `_common_processing()` | **违反开闭原则**:巨型 `switch` 分发器耦合了抖音、美团、巨嗨等所有平台逻辑,新增平台需修改核心类,易引发回归 Bug。 | 采用**策略模式**:定义 `TuangouPlatformInterface`,各平台实现独立类,通过工厂或容器动态加载。 | `$platform = TuangouFactory::create($platform_id); $platform->prepare(...);` |
| 🟡 建议 | 全局 | **缺乏类型声明与 PSR-12 规范**:方法无参数/返回值类型提示,缩进不一致,魔法数字(如 `13`, `4`, `7`, `-1`)遍布,可读性差。 | 补充 `declare(strict_types=1);`,使用 `int`, `string`, `array`, `bool` 类型声明,将魔法数字提取为 `const`。 | `public function prepare(int $merchant_id, int $shop_id, string $voucher_code): bool` |
| 🟡 建议 | `GuoTong.php` / `set_config()` | **模型重复加载**:每次调用 `set_config()` 都执行 `$CI->load->model()`,增加 I/O 开销。 | 在构造函数中加载模型,或使用 CI 的 `autoload.php` 预加载。 | `public function __construct() { $this->CI =& get_instance(); $this->CI->load->model('Ahead_common_config_model'); }` |
| 🟡 建议 | `Tuangou.php` / Redis 操作 | **异常静默吞没**:`catch (RedisException $e) {}` 未记录日志,缓存失败时业务无降级策略,可能导致验券状态不一致。 | 记录错误日志,并返回明确状态码供上层处理。 | `catch (RedisException $e) { log_message('error', 'Redis操作失败: '.$e->getMessage()); return false; }` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题(P0)
1. **修复密码学与签名逻辑**:立即核实第三方 `GuoTong` 接口文档。若为签名,必须改用 `openssl_sign()` + 私钥;若为加密,请重命名方法避免歧义。修复 `checksign` 的返回值覆盖 Bug。
2. **清理输出污染**:全局搜索并移除 `Neworderservice.php` 中的 `echo` 调试语句,确保 API 响应纯净。
3. **封堵 SQL 注入**:将 `Neworderservice.php` 中的字符串拼接查询全部替换为 CI3 的 `$this->CI->db->where_in()` 或 `$this->CI->db->query($sql, $bindings)`。
4. **开启 SSL 验证**:支付类请求必须强制验证证书,配置 CA 文件路径,杜绝中间人劫持。
### 🛠 后续重构与优化方向
1. **架构解耦(策略模式)**:`Tuangou.php` 的 `_common_processing` 是典型的过程式反模式。建议按平台拆分为 `DouyinStrategy`、`MeituanStrategy`、`JuhaiStrategy`,通过工厂类按需实例化,符合开闭原则。
2. **财务计算标准化**:建立统一的 `PriceCalculator` 工具类,内部封装 `bcmath` 运算与四舍五入规则,所有涉及金额、折扣、服务费的计算必须经过该类,避免散落各处的浮点运算。
3. **消除重复代码**:`Juhai.php` 中两个 `prepare` 方法高度相似。建议提取核心校验链(券状态 → 门店/套餐匹配 → 时间/星期交集 → Redis 缓存),通过配置数组控制差异点。
4. **规范与可测试性**:
- 补充 `declare(strict_types=1);` 及 PHP 7.4+ 类型声明。
- 将魔法数字(如 `pay_platform == 7`、`status == 1`)定义为类常量或枚举。
- 为价格计算、时间交集算法编写 PHPUnit 单元测试,覆盖边界条件(如跨天、闰年、0元单、负数折扣)。
> 💡 **框架说明**:当前代码结构高度符合 **CodeIgniter 3** 规范(如 `get_instance()`、`$this->load->model()`、`BASEPATH` 守卫)。若 `phpci` 为贵司基于 CI3 的定制框架,上述建议可直接适用;若为独立框架,请确保 `load->model()` 与查询构造器行为与 CI3 一致,必要时参考 `phpci` 官方文档调整组件调用方式。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779272482
|
1779272482
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
284
|
21
|
66
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 'pay/pay-260519' into...
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `2bff7d95d ## 自动代码审查报告
**分支**: pay-260519
**提交**: `2bff7d95dc470de71955de8e943db93119d7af02`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-22 10:48:39
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了多业务线的微信退款核心流程,具备基本的参数校验与日志记录能力。但存在严重的逻辑漏洞(恒真条件拦截)、硬编码安全密钥、大量重复代码、破坏框架生命周期的输出方式以及浮点数精度隐患。整体可维护性与健壮性较弱,需进行结构性重构。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `OrderWxRefund.php` ~L240 | `refundQuery()` 中条件判断逻辑恒为真:`if (isset($param['order_id']) \|\| empty($param['order_id']))`。无论参数是否存在,该条件均成立,导致所有正常请求被错误拦截。 | 修正逻辑运算符,改为非空校验。 | `if (!isset($param['order_id']) \|\| empty($param['order_id'])) { $this->error_response('订单号不为空'); }` |
| 🔴 严重 | `OrderWxRefund.php` ~L10, L155, L210 | 退款密钥校验使用硬编码盐值 `'1441600902'` 和 `'1621353600'`。一旦代码泄露,攻击者可伪造合法退款请求,造成资金损失。 | 将盐值迁移至 `application/config/config.php` 或环境变量,通过 `config_item()` 读取。 | `if ($param['refund_key'] !== md5($param['order_id'] . $param['trade_no'] . config_item('refund_verify_salt'))) { ... }` |
| 🟠 警告 | `OrderWxRefund.php` ~L15-25 | `$_REQUEST['json']` 或 `php://input` 直接 `json_decode`,未校验 JSON 格式。非法 JSON 会导致 `$this->stream` 为 `null`,后续访问 `$this->stream['request']` 触发 `Fatal Error`。 | 增加 `json_last_error()` 校验,或统一使用 CI 的 `$this->input->raw_input_stream`。 | `$raw = $_REQUEST['json'] ?? file_get_contents('php://input'); $this->stream = json_decode($raw, true); if (json_last_error() !== JSON_ERROR_NONE) { $this->error_response('请求数据格式错误'); }` |
| 🟠 警告 | `OrderWxRefund.php` ~L130, L275, L315 | 退款单号 `out_refund_no` 使用 `date("YmdHis")` 生成。高并发场景下同一秒内多次请求会导致单号重复,微信接口将拒绝退款。 | 追加微秒时间戳或 `uniqid()` 确保全局唯一。 | `$input->SetOut_refund_no(WxPayConfig::MCHID . date("YmdHis") . substr(microtime(true), 2, 6));` |
| 🟠 警告 | `OrderWxRefund.php` ~L75, L95 | 直接修改请求参数 `$param['total_fee'] = $pay_list['_actual_pay'];`。污染原始请求数据,影响后续日志记录与审计追踪。 | 使用独立变量接收计算后的金额,保持 `$param` 只读。 | `$actual_total_fee = $pay_list['_actual_pay'] ?? $param['total_fee'];` |
| 🟠 警告 | `OrderWxRefund.php` 全文件 | `doRefund`、`platformIncomeRefund`、`repairRefund`、`haizanAppRefund` 中存在大量重复的参数校验、金额转换、响应组装逻辑,违反 DRY 原则。 | 提取基类方法 `validateRefundParams()`、`buildRefundResponse()`,或采用策略模式按 `type` 分发处理。 | `protected function validateRefundParams(array $param, array $allowedFrom, array $allowedType) { ... }` |
| 🟡 建议 | `OrderWxRefund.php` ~L350 | `jsonEcho()` 使用 `ob_end_clean(); ob_start(); ... die();` 强行接管输出,破坏 CI 框架的 Output 类生命周期,且 `exit()` 与 `die()` 冗余。 | 使用 CI 标准输出方式,移除缓冲区操作,保持框架完整性。 | `$this->output->set_content_type('application/json')->set_output(json_encode(['header' => $this->stream['header'], 'response' => $response])); return;` |
| 🟡 建议 | `Ahead_book_order_model.php` ~L100 | 事务回滚逻辑与 CI3 事务管理器冲突。`$this->db->trans_start()` 配合 `try-catch` 手动 `trans_rollback()` 易导致事务状态机异常。 | 移除 `catch` 中的手动回滚,依赖 CI 的 `trans_complete()` 自动回滚机制,或改用原生 PDO 事务。 | `try { ... } catch (Exception $e) { log_message('error', $e->getMessage()); throw $e; } // CI 会自动回滚` |
| 🟡 建议 | `OrderWxRefund.php` ~L125 | 金额计算 `$param['total_fee'] * 100` 使用浮点数乘法,存在精度丢失风险(如 `0.1 * 100 = 10.000000000000002`)。 | 使用 `bcmul()` 进行高精度计算,或统一以“分”为单位存储与传输。 | `$total_fee = (int) bcmul((string)$param['total_fee'], '100', 0);` |
| 🟡 建议 | 全文件多处 | 大量使用魔法数字(如状态码 `1, 2, 3, 4`、平台标识 `1, 3, 14`),降低代码可读性。 | 定义类常量或配置数组集中管理。 | `const STATUS_PAID = 1; const PAY_PLATFORM_WX = 1;` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复恒真拦截 Bug**:立即修正 `refundQuery()` 中的 `isset/empty` 逻辑,否则该接口完全不可用。
2. **移除硬编码密钥**:将退款校验盐值、商户号等敏感配置抽离至 `config/` 目录,并通过 `.env` 或服务器环境变量管理,杜绝代码库泄露风险。
3. **保障退款单号唯一性**:替换 `date("YmdHis")` 为带微秒或随机后缀的生成逻辑,避免高并发退款失败。
4. **修复 JSON 解析崩溃隐患**:在 `__construct()` 中增加 `json_last_error()` 校验,防止畸形请求导致 500 错误。
### 🛠 后续重构与优化方向
1. **架构解耦(策略模式)**:当前 `doRefund()` 中长达 150+ 行的 `if-elseif` 分支严重违反开闭原则。建议按 `$param['type']` 映射到独立的退款策略类(如 `OrderRefundStrategy`, `VipRechargeRefundStrategy`),控制器仅负责路由与参数校验。
2. **统一响应与校验层**:提取 `BaseApiController`,封装 `validateParams()`、`success()`、`error()` 方法。移除 `ob_*` 和 `die()`,全面接入 CI 的 `$this->output` 组件。
3. **财务精度规范**:所有涉及金额的计算、存储、传输必须统一使用**整数分**或 `BCMath` 扩展。禁止直接使用浮点数进行加减乘除。
4. **事务安全规范**:CI3 的 `$this->db->trans_start()` 与 `$this->db->trans_complete()` 是成对设计的。建议在业务层仅使用 `trans_start()`,在 `catch` 中仅记录日志并抛出异常,由框架或上层统一处理回滚,避免状态混乱。
5. **框架适配提示**:代码中大量使用 `$this->load->model()` 动态加载。建议在 CI 的 `autoload.php` 中预加载高频模型,或在构造函数中统一加载,减少运行时 I/O 开销。
> 📝 **局限性说明**:本次审查基于提供的 `OrderWxRefund.php` 及部分截断的 Model 文件。由于 `Ahead_book_order_model.php`、`Ahead_shop_book_time_info_model.php` 等文件内容不完整,部分业务逻辑(如预订状态流转、团购券核销联动)未能进行全链路验证。建议在完整代码合并前,补充单元测试覆盖核心退款与事务分支。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779418119
|
1779418119
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
326
|
21
|
92
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 🔍 代码审查报告:pay-260519 - Merge remote-tracking branch 'pay/pay-260519' into...
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `f90ce2136 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `f90ce21368ba163b3bba3807fa37d2362192d9e9`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-26 14:46:11
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了复杂的门店预订时段计算与会员注册/支付逻辑,业务覆盖全面。但存在明显的架构反模式(如“上帝对象”、巨型方法)、硬编码敏感信息、SQL 拼接隐患及状态污染问题。财务计算未考虑浮点精度,部分方法职责过重,可维护性与安全性亟待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_vip_model.php`<br>`check_is_register()` ~185行 | **SQL 注入风险**:直接拼接 `$uid` 和 `$mobile` 到 SQL 条件字符串中,未做转义或参数绑定。 | 使用查询构建器或参数化查询替代字符串拼接。 | `$this->db->where("(_ahead_user_id = ? OR _mobile = ?) AND (_expiry_date = -1 OR _expiry_date > ?)", [$uid, $mobile, $now_time]);` |
| 🔴 严重 | `Ahead_vip_model.php`<br>`pay_order()` ~485行 | **SQL 注入与金额精度风险**:直接拼接金额到 UPDATE 语句,且未处理浮点数精度问题,易导致余额计算偏差。 | 使用框架 Query Builder 安全更新;金额统一转为“分”(整数)或使用 `bcmath` 计算。 | `$this->db->set('_account', '_account - ' . (int)($amount * 100), FALSE)->where($vip_where)->update($this->table_name);` |
| 🔴 严重 | `Ahead_vip_model.php`<br>第 12 行 | **硬编码敏感信息**:`public $encrypt = "Vs!Fs7VT";` 将加密密钥直接暴露在源码中,违反安全规范。 | 移至配置文件或环境变量,通过配置中心读取。 | `protected $encrypt; public function __construct() { parent::__construct(); $this->encrypt = config_item('vip_encrypt_key'); }` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php`<br>`get_book_days_info()` ~118行 | **状态污染/逻辑缺陷**:`$this->book_days += 1;` 直接修改实例属性。若该方法被多次调用或结合静态缓存,会导致天数累加错误。 | 使用局部变量进行计算,绝不修改实例状态。 | `$days_to_check = $add_day ? $this->book_days + 1 : $this->book_days; for ($i = 0; $i < $days_to_check; $i++) { ... }` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php`<br>`get_book_day_time_info()` ~145行起 | **巨型方法/违反单一职责**:该方法超 300 行,混合了时段生成、套餐校验、门店配置加载、DB 查询、时间交集计算等,极难测试与维护。 | 拆分为多个私有方法,如 `load_unavailable_times()`, `calculate_package_slots()`, `filter_by_business_hours()` 等。 | 见下方重构建议 |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php`<br>`set_shop_config()` & `set_room_info()` | **代码重复**:两个方法中加载场景配置、计算 `shop_config_scene`、获取 `minute_unit` 的逻辑高度重复。 | 提取为私有方法 `get_scene_config_prefix()` 和 `load_scene_settings()` 复用。 | `private function get_scene_prefix($scene) { return match($scene) { '2' => 'billiards_', '3' => 'card_', '4' => 'tavern_', default => '' }; }` |
| 🟡 建议 | 全局多处 | **魔法数字泛滥**:`1`, `-1`, `86400`, `600`, `3600` 等硬编码散落在业务逻辑中,语义不明。 | 定义类常量或枚举,提升可读性与可维护性。 | `const STATUS_AVAILABLE = 1; const STATUS_UNAVAILABLE = -1; const SECONDS_PER_DAY = 86400; const MINUTE_UNIT_DEFAULT = 30;` |
| 🟡 建议 | `Ahead_vip_model.php`<br>`update_acount()` ~340行 | **方法名拼写错误**:`acount` 应为 `account`,影响代码规范性与 IDE 自动补全。 | 重命名方法,并全局搜索替换所有调用点。 | `public function update_account($uid, $cardNo, ...)` |
| 🟡 建议 | 全局多处 | **冗余的 `$CI = &get_instance();`**:模型已继承框架基类,频繁获取实例不仅冗余,且在部分框架版本中可能引发性能损耗。 | 直接使用 `$this->load`、`$this->config` 或 `$this->db`。若需访问控制器属性,应通过参数传递或依赖注入。 | 移除 `$CI = &get_instance();`,改用 `$this->load->model('xxx');` 或 `$this->config->item('xxx');` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入漏洞**:`check_is_register()` 与 `pay_order()` 中的字符串拼接必须替换为参数化查询或 Query Builder 安全方法。
2. **消除状态污染**:`get_book_days_info()` 中的 `$this->book_days += 1` 必须改为局部变量,否则在高并发或连续请求下会导致预订天数计算错乱。
3. **敏感信息脱敏**:将 `$encrypt` 密钥移至配置文件,禁止硬编码。
4. **财务计算规范化**:所有涉及金额的计算(充值、扣款、折扣)必须使用整数(单位:分)或 `bcmath` 扩展,避免浮点数精度丢失导致账目不平。
### 🛠 后续重构与优化方向
1. **拆分巨型方法**:`get_book_day_time_info()` 是典型的核心瓶颈。建议按业务阶段拆分:
- `load_base_config()`:加载门店、包厢、套餐基础配置。
- `fetch_unavailable_ranges()`:批量获取已预订、锁定、停业、规则停用时间。
- `generate_time_slots()`:基于营业时间和最小单位生成基础时间段。
- `apply_package_rules()`:应用团购券/套餐的可用时间、跨天、星期限制逻辑。
- `filter_and_format()`:执行交集/差集计算,返回最终状态。
2. **优化数据库查询**:当前存在明显的 N+1 查询隐患(如循环内调用 `get_shop_setting`、`get_room_lock_book_time`)。建议改为批量查询(`WHERE IN`)或引入 Redis 缓存热点配置与预订状态。
3. **规范框架适配**:代码高度疑似基于 CodeIgniter 架构。若 `phpci` 为内部定制框架,请确认 `$CI = &get_instance()` 是否为官方推荐用法。建议统一使用 `$this->load` 链式调用,并遵循 PSR-12 规范(如属性可见性、常量定义、类型声明)。
4. **补充类型声明与异常处理**:建议为方法参数和返回值添加 PHP 7.4+ 类型提示(如 `array`, `int`, `bool`),并在关键业务节点(如支付回调、事务提交)增加结构化日志记录,便于生产环境排查。
> ⚠️ **局限性说明**:提供的代码片段在 `Ahead_shop_book_time_info_model.php` 末尾及 `Ahead_vip_model.php` 的 `notify_preorder()` 处被截断,部分依赖的全局辅助函数(如 `mergeTimeRanges`, `shiftTimeRange`, `timeToHour` 等)未提供实现。以上审查基于可见代码逻辑推断,若辅助函数内部存在未处理的边界条件或性能问题,建议一并进行审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779777971
|
1779777971
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
336
|
21
|
100
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - bug-服务回执
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `5e74a2417 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `5e74a2417f60e748ba02fe144ea8c4a7b561a845`
**提交人**: caihongyuchy (1091045324@qq.com)
**时间**: 2026-05-26 16:47:03
---
## 📋 审查摘要
- **变更文件数**: 1
- **严重问题**: 1
- **高危问题**: 3
- **中危问题**: 2
- **建议优化**: 2
## 🐛 发现的问题
### <font color="red">[跨文件调用] 引用的前端模块未在提供的项目结构中定义</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js
- **行号**: 1-8
- **问题描述**: 代码顶部引入了 `../../../config.js`、`../../../models/public`、`../../../models/reserve` 和 `../../../utils/uploadFile`。但提供的项目结构仅包含 PHP/CodeIgniter 后端文件(`system/` 目录),未包含任何前端 JS 或模型文件。若这些文件不存在或相对路径错误,将直接导致模块加载失败、页面白屏或运行时崩溃。
- **修复建议**: 请确认前端项目目录中是否存在对应文件。若为独立前端仓库,请确保路径正确;若需与后端交互,请检查构建配置或目录映射。建议补充前端文件结构以便进行完整的跨文件引用验证。
### <font color="red">[语法错误] 未处理可能为 undefined 的变量导致 TypeError</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js
- **行号**: 约 78
- **问题描述**: `let extConfig = wx.getStorageSync('extConfig')` 在缓存未设置时会返回 `undefined`。紧接着执行 `extConfig.spe_merchant_id` 会直接抛出 `TypeError: Cannot read properties of undefined`,导致 `toMyRecords` 方法中断执行。
- **修复建议**: 增加空值保护(可选链或默认值):
```javascript
let extConfig = wx.getStorageSync('extConfig') || {};
let merchant_id = extConfig.spe_merchant_id || '';
```
### [逻辑 BUG] 直接修改 this.data 绕过 setData 机制
- **严重程度**: 高危
- **文件**: web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js
- **行号**: 约 118
- **问题描述**: `this.data.imageList.push(result)` 直接修改了底层数据对象。微信小程序中直接修改 `this.data` 不会触发视图层的 Diff 更新,且可能导致后续 `setData` 行为异常或状态不同步。
- **修复建议**: 使用 `this.setData` 进行不可变更新:
```javascript
this.setData({
imageList: [...this.data.imageList, result]
})
```
### [逻辑 BUG] 图片上传与提交存在竞态条件
- **严重程度**: 高危
- **文件**: web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js
- **行号**: 约 155
- **问题描述**: `addService` 方法中直接读取 `this.data.imageList` 提交。但 `uploadImage` 是异步操作,若用户点击提交时图片尚未上传完成,`imageList` 将为空或不完整。注释掉的代码表明开发者曾意识到此问题但未解决。
- **修复建议**: 引入上传状态标志(如 `isUploading`),或使用 `Promise.all` 等待所有图片上传完成后再调用提交接口。提交前校验 `imageList.length` 与用户选择的图片数量是否一致。
### [安全隐患] 动态跳转小程序未校验 appId 合法性
- **严重程度**: 中危
- **文件**: web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js
- **行号**: 约 75
- **问题描述**: `appId` 直接取自 `this.data.receiptInfo.min_pk`。若后端返回异常、空值或恶意数据,可能导致 `wx.openEmbeddedMiniProgram` 调用失败或跳转到非预期的小程序。
- **修复建议**: 跳转前增加基础格式校验:
```javascript
if (typeof appId !== 'string' || appId.length < 5) {
return wx.showToast({ title: '参数异常', icon: 'none' });
}
```
### [代码质量] Array.filter 回调函数返回值不规范
- **严重程度**: 中危
- **文件**: web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js
- **行号**: 约 108
- **问题描述**: `filter` 回调中 `if (key != index) { return item }` 返回的是元素本身而非布尔值。虽然 JS 会进行隐式类型转换,但不符合规范且易引发误解,变量名 `key` 实际代表索引,命名易混淆。
- **修复建议**: 改为返回布尔值,并优化命名:
```javascript
let arr = this.data.image_list.filter((_, idx) => idx !== index);
```
### [代码质量] 生产环境遗留大量 console.log
- **严重程度**: 低危
- **文件**: web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js
- **行号**: 多处 (如 35, 40, 77, 80, 84, 115 等)
- **问题描述**: 代码中包含大量 `console.log`,可能泄露敏感信息(如 userInfo, extConfig, OSS 签名结果)并影响小程序运行性能。
- **修复建议**: 移除生产环境日志,或封装为条件日志工具函数(如 `if (process.env.NODE_ENV === 'development') console.log(...)`)。
## ✅ 代码亮点
- 使用了微信小程序较新的 `wx.chooseMedia` API 替代已废弃的 `wx.chooseImage`,符合官方最佳实践。
- 动态设置 `setData` 键名使用了 ES6 模板字符串语法 ``[`comment_set[${comment_set_index}].star_num`]``,写法规范且高效。
- 页面数据初始化结构清晰,注释较为完整,业务逻辑分层(数据获取、交互、提交)相对明确。
## 📝 总体建议
1. **前后端结构分离说明**:本次审查的代码为**微信小程序前端 JS 文件**,而提供的项目结构为 **PHP CodeIgniter 后端**。两者属于不同技术栈,因此 CI 框架特定的模型/控制器命名规范不适用于此文件。建议后续提交审查时提供对应的前端目录结构,以便进行完整的跨文件引用验证。
2. **异步流程管控**:当前图片上传与表单提交逻辑耦合较紧,缺乏明确的异步状态管理。强烈建议引入 `async/await` 或 `Promise` 链式调用,确保“选择->上传->提交”流程的原子性,避免用户重复点击或提交不完整数据。
3. **防御性编程**:小程序运行环境复杂(网络波动、缓存缺失、用户快速点击等),建议在调用 `wx.*` API 和读取 `this.data` 前增加充分的空值校验和类型判断,避免线上白屏或崩溃。
4. **工程化规范**:建议接入 ESLint + Prettier 进行自动化检查,统一变量命名、移除调试日志,并严格遵循微信小程序官方开发规范。对于跨端/前后端交互,建议统一封装请求拦截器与错误处理中间件。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779785223
|
1779785223
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
353
|
21
|
107
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - bug-服务回执
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `e114eff88 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `e114eff885d59b5d088c1a4b7b89e2e96f8457fc`
**提交人**: caihongyuchy (1091045324@qq.com)
**时间**: 2026-05-27 10:51:36
---
## 📋 审查摘要
- **变更文件数**: 1
- **严重问题**: 1
- **高危问题**: 3
- **中危问题**: 2
- **建议优化**: 2
> 💡 **注**:提供的代码为 **微信小程序 JavaScript** 文件,但项目结构仅列出了 PHP CodeIgniter 框架文件。本次审查将严格基于实际提供的 JS 代码进行,PHP 框架规范检查不适用当前文件。
## 🐛 发现的问题
### <font color="red">[跨文件调用] 引用的模块文件在提供的项目结构中不存在</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js`
- **行号**: 1-8
- **问题描述**: 代码顶部引入了 `../../../config.js`、`../../../models/public`、`../../../models/reserve` 和 `../../../utils/uploadFile`。但提供的项目结构仅包含 `system/` 目录下的 PHP 文件,**未包含任何 JS/TS 模块文件**。无法验证 `PublicModel`、`ReserveModel`、`uploadFile` 及其调用的方法(`getReceipt`、`getOssSignature`、`addShopComment`)是否存在或签名是否匹配。
- **修复建议**: 确保对应相对路径下存在这些文件,并核对默认导出/命名导出名称。若为 TypeScript 项目,需补充 `.d.ts` 类型声明或检查 `tsconfig.json` 路径映射。
### [逻辑 BUG] 提交评论时存在异步竞态条件与数据未同步风险
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js`
- **行号**: 约 145-160 (`addService` 方法)
- **问题描述**: `addService` 直接读取 `this.data.imageList` 作为提交参数,但图片是通过 `uploadImage` 异步上传并动态 `push` 进数组的。若用户快速点击提交,可能部分图片尚未上传完成,导致提交给后端的 `img` 字段为空或不完整。注释掉的代码也印证了此处原本应有同步等待逻辑。
- **修复建议**: 使用 `Promise` 或状态标志控制提交流程。例如:
```javascript
// 维护一个上传完成状态或等待 Promise.all
const uploadPromises = this.data.image_list.map(item =>
new Promise(resolve => this.uploadImage(item.tempFilePath, resolve))
);
Promise.all(uploadPromises).then(urls => {
let data = { img: urls, ... };
reserveModel.addShopComment(data, res => { ... });
});
```
### [安全隐患] 跨小程序跳转传递完整用户信息存在泄露风险
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js`
- **行号**: 约 85 (`toMyRecords` 方法)
- **问题描述**: `wx.openEmbeddedMiniProgram` 的 `extraData` 中直接透传了 `wx.getStorageSync('userInfo')` 的完整对象。若该对象包含敏感字段(如 `openid`、`phone`、`token`、`unionid` 等),可能被目标小程序非法读取、缓存或记录到第三方日志中,违反最小权限原则。
- **修复建议**: 仅传递目标小程序业务必需的字段(如 `merchant_id`、`content_url`)。用户身份应由目标小程序通过微信授权登录或后端接口自行校验获取。
### [逻辑 BUG] 动态键名可能为 null 导致 setData 异常
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js`
- **行号**: 约 128-135 (`selectStar` 方法)
- **问题描述**: 当遍历 `comment_set` 未找到匹配的 `key` 时,`comment_set_index` 保持初始值 `null`。执行 ``[`comment_set[${comment_set_index}].star_num`]`` 会生成非法路径 `comment_set[null].star_num`,在部分基础库版本中会抛出运行时错误或导致数据绑定静默失败。
- **修复建议**: 增加边界校验:
```javascript
if (comment_set_index === null) return; // 或 wx.showToast 提示异常
this.setData({ [`comment_set[${comment_set_index}].star_num`]: index });
```
### [代码质量] 直接修改 this.data 违反小程序规范
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js`
- **行号**: 约 118 (`uploadImage` 成功回调内)
- **问题描述**: `this.data.imageList.push(result)` 直接修改了页面数据对象。微信小程序官方明确禁止直接修改 `this.data`,必须通过 `this.setData()` 更新,否则会导致视图层与逻辑层数据不同步,且可能引发后续 `setData` 性能问题。
- **修复建议**: 改为不可变更新方式:
```javascript
this.setData({
imageList: [...this.data.imageList, result]
});
```
### [代码质量] 网络请求与 API 调用缺乏错误处理
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/service-receipt/service-receipt.js`
- **行号**: 约 55, 155 (`getReceiptInfo`, `addService`)
- **问题描述**: 模型调用仅提供了成功回调 `res => {}`,未处理失败/异常回调。若网络超时、接口返回 5xx 或业务码非 200,页面将无响应、按钮无法点击或处于假死状态,严重影响用户体验。
- **修复建议**: 补充失败回调,统一处理错误提示:
```javascript
reserveModel.addShopComment(data,
res => { /* 成功逻辑 */ },
err => { wx.showToast({ title: err.msg || '提交失败', icon: 'none' }); }
);
```
## ✅ 代码亮点
1. **生命周期使用规范**:合理使用了 `onLoad` 获取参数、`onShow` 同步本地缓存,符合小程序页面生命周期最佳实践。
2. **动态数据绑定**:在 `selectStar` 中使用了 ``[`comment_set[${comment_set_index}].star_num`]`` 动态路径更新数组子项,避免了全量替换,提升了渲染性能。
3. **图片数量限制**:在 `addImage` 中正确限制了最多 9 张图片,并做了截断处理,符合微信 `chooseMedia` 规范。
## 📝 总体建议
1. **补充模块依赖**:当前代码强依赖外部 JS 模块,但项目结构中缺失。请优先确认 `models/`、`utils/`、`config.js` 的路径与导出方式,确保跨文件引用可解析。
2. **统一异步流控制**:涉及多图上传+表单提交的场景,务必使用 `Promise.all` 或 `async/await` 确保所有异步操作完成后再发起最终请求,避免数据丢失。
3. **清理冗余代码**:`addService` 中存在大段注释代码,建议移除或移至版本控制系统历史中,保持代码库整洁。
4. **硬编码治理**:路径 `'/pages/coupon/my-coupons/my-coupons'`、业务标识 `'4'`、OSS 目录 `'bistro'` 建议提取至 `config.js` 或常量文件中,便于后续维护与环境切换。
5. **类型安全**:若项目后续升级为 TypeScript,建议为 `ReserveModel`、`PublicModel` 补充接口定义,避免 `res.result` 等隐式 `any` 类型带来的运行时隐患。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779850296
|
1779850296
|
0
|
0
|
0
|
0
|
Edit
Delete
|