|
653
|
21
|
300
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 现场扫码退款
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `1de21f249 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `1de21f24942458f96482e04d4bf8b4502dfe44e4`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-09 19:12:04
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码实现了较为复杂的预订、支付回调、退款及账单聚合业务,整体业务闭环完整。但存在明显的架构反模式、事务与外部API耦合、SQL注入风险、N+1查询性能瓶颈以及硬编码敏感信息等问题。部分方法逻辑冗长,缺乏常量抽象与错误边界控制。
- **风险等级**:🔴 高(存在致命运行时错误、SQL注入隐患及事务锁表风险)
> 📌 **框架说明**:从 `$CI = &get_instance()`、`$this->load->model()`、`$this->db->trans_start()` 等特征判断,当前代码基于 **CodeIgniter 3** 架构开发。若 `phpci` 为内部定制框架,以下建议仍完全适用,请结合官方文档微调生命周期调用。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_yc_notice_model.php`<br>`insert_after` 方法 | 将布尔属性 `$this->push_notice` 当作方法调用:`return $this->push_notice($arr);`,将直接触发 `Fatal Error: Function name must be a string` 导致服务崩溃。 | 明确区分属性与方法名,或改为条件判断后调用同名方法。 | `if ($this->push_notice === true) { return $this->push_notice($arr); }` |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>`get_bill_goods_info` | 直接字符串拼接 SQL 条件:`$sql = '_unique_key="' . $unique_key . '" ...'`,未做任何过滤或参数绑定,存在高危 SQL 注入漏洞。 | 全面改用 CI 查询构造器或参数绑定,杜绝手动拼接。 | `$this->db->where('_unique_key', $unique_key)->where('_status IN (1,4)')->get($this->table_name)->result_array();` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`check_notify` & `refund_by_notify` | 数据库事务中包裹了外部支付退款 API 调用(如 `WxPayApi::refund`)。网络请求耗时不可控,极易导致数据库连接池耗尽、长事务锁表或超时回滚失败。 | **事务与外部调用必须解耦**。先更新本地状态并提交事务,再通过异步队列、定时任务或独立流程调用退款接口,最后通过回调对账。 | 移除 `refund_by_notify` 中的 `WxPayApi` 调用,改为记录退款任务表,由 Cron 或消息队列异步执行。 |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`check_notify` | 事务回滚逻辑不完整。当 `refund_by_notify` 返回 `['status'=>false]` 时,方法直接 `return`,未显式执行 `$this->db->trans_rollback()`,依赖框架隐式行为存在脏数据风险。 | 统一使用 `$this->db->trans_begin()`、`trans_commit()`、`trans_rollback()` 显式控制,或在所有异常/失败分支前显式回滚。 | `if (!$res['status']) { $this->db->trans_rollback(); return $res; }` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`get_list` | 循环内执行数据库查询:`foreach ($order_info as &$v) { $merchant_data = $this->ahead_merchant_model->get_one(...); }`,典型 N+1 查询问题,数据量增长时性能呈指数级下降。 | 提取所有 `merchant_id` 使用 `where_in` 批量查询,或在主查询中使用 `JOIN` 一次性获取。 | `$ids = array_column($order_info, 'merchant_id'); $merchants = $this->ahead_merchant_model->where_in('_id', $ids)->get()->result_array();` |
| 🟠 警告 | `Ahead_yc_order_model.php`<br>类属性定义 | 硬编码加密密钥:`public $encrypt = "Vs!Fs7VT";`。密钥随代码库分发,违反安全规范,一旦仓库泄露将导致历史数据可被解密。 | 移至 `config/config.php` 或 `.env` 环境变量中,通过配置项读取。 | `protected $encrypt_key; public function __construct() { $this->encrypt_key = config_item('encrypt_key'); }` |
| 🟡 建议 | 全局多处 | 大量使用魔法数字(如状态 `-1, 1, 2, 3, 4, 5`,支付平台 `1, 3, 14, 22` 等),业务含义不透明,维护成本高。 | 定义类常量或独立枚举类,提升可读性与可维护性。 | `const STATUS_PENDING = -1; const PAY_PLATFORM_WECHAT = 1;` |
| 🟡 建议 | `Ahead_book_order_model.php`<br>文件顶部 | 顶部直接使用 `$CI = &get_instance();` 加载模型。在 CI 架构中,模型文件被 `include` 时即执行,此时 CI 核心可能未完全初始化,易引发未定义变量或加载失败。 | 移除顶部代码,在类构造函数或具体方法内按需 `$this->load->model()`。 | 删除顶部两行,在 `__construct()` 中调用 `$this->load->model('Simple_model');` |
| 🟡 建议 | `send_success_msg` 等方法 | 存在大量注释掉的废弃代码(如旧版短信发送逻辑、时间判断分支),且变量拼写错误 `$rooom_data`。 | 清理无用注释代码,依赖 Git 管理历史版本;修正拼写错误。 | 删除 `/* ... */` 块,将 `$rooom_data` 改为 `$room_data`。 |
| 🟡 建议 | `Ahead_book_order_model.php`<br>`create_community_shop_book_order` | 代码在 `if ($this->tuangou->verify_token) {` 处被截断,无法评估后续逻辑完整性与事务闭合情况。 | 补充完整代码后重新提交审查,确保 `trans_complete()` 或 `trans_rollback()` 成对出现。 | *(需补充完整代码)* |
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **修复致命调用错误**:立即修正 `Ahead_yc_notice_model::insert_after` 中的属性/方法名冲突,避免线上 Fatal Error。
2. **消除 SQL 注入风险**:将 `get_bill_goods_info` 及 `refund_by_notify` 中所有手动拼接的 SQL 条件替换为 CI 查询构造器或参数绑定。
3. **事务与外部调用解耦**:将微信支付/银联退款等网络请求移出数据库事务。采用“本地状态更新 → 提交事务 → 异步退款任务 → 回调对账”的标准支付架构。
### 🛠 后续重构与优化方向
1. **架构规范化**:
- 移除文件顶部的 `$CI = &get_instance();`,遵循 CI 模型生命周期。
- 统一使用 `$this->db->trans_begin()` / `trans_commit()` / `trans_rollback()` 替代 `trans_start()` + `try/catch` 的混合写法,提升事务可控性。
2. **性能与可维护性**:
- 消除 N+1 查询,对列表类接口采用批量查询或 `JOIN` 优化。
- 提取魔法数字为类常量(如 `OrderStatus::PAID`、`PayPlatform::WECHAT`),必要时引入 PHP 8.1+ `enum`。
- 拆分超长方法(如 `get_bill_goods_info` 超过 300 行),按职责拆分为 `calculateTotals()`、`mergeGoods()`、`formatBill()` 等私有方法。
3. **安全与规范**:
- 敏感配置(加密串、API 密钥、模板 ID)全部迁移至配置文件或环境变量。
- 清理历史注释代码,统一数组语法为 `[]`,遵循 PSR-12 命名与缩进规范。
- 日志记录避免直接输出 `$e->getTrace()`,改为记录 `$e->getMessage()` 与 `$e->getFile().':'.$e->getLine()`,防止敏感路径泄露。
> 💡 **提示**:若 `phpci` 为内部封装框架,请确认其事务管理器与 CI3 原生行为是否一致。建议在核心支付链路补充单元测试(PHPUnit)与集成测试,覆盖正常支付、退款失败、并发扣减库存等边界场景。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781003524
|
1781003524
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
654
|
21
|
301
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 现场扫码订单
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `f8aa117ea ## 自动代码审查报告
**分支**: pay-260616
**提交**: `f8aa117ea568aecfd6537e9b87159c6681f47c2b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-09 19:15:57
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖较为完整,但存在明显的架构与编码缺陷。核心问题集中在 **N+1 查询导致的性能瓶颈**、**SQL 拼接注入风险**、**缺乏事务保护**以及**敏感信息硬编码**。代码风格偏向老旧的 CI2/3 写法,未充分利用现代 PHP 特性与查询构建器,且单一方法职责过重,可维护性较低。
- **风险等级**:🔴 高
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_bill_goods_info` (~L200) | **SQL 注入风险**:使用字符串拼接构造查询条件 `$sql = '_unique_key="' . $unique_key . '" ...'` 并直接传入 `$this->select()`。若 `$unique_key` 来源不可控,将导致严重注入漏洞。 | 废弃字符串拼接,改用框架查询构建器(Query Builder)或参数绑定机制。 | `$this->db->where('_unique_key', $unique_key)->where_in('_status', [1,4])->get($this->table_name)->result_array();` |
| 🔴 严重 | `confirm_receipt` (~L155) | **数据一致性风险**:连续执行两次 `insert` 操作未包裹在数据库事务中。若第二次插入失败,将产生状态不一致的脏数据。 | 使用框架事务机制包裹关键写入操作,失败时自动回滚。 | `见下方事务示例` |
| 🔴 严重 | 类属性定义 (~L10) | **敏感信息硬编码**:加密串 `public $encrypt = "Vs!Fs7VT";` 直接暴露在源码中,易随版本控制泄露,且不利于多环境配置管理。 | 移至配置文件或环境变量,通过配置项动态读取。 | `protected $encrypt; public function __construct(){ parent::__construct(); $this->encrypt = config_item('order_encrypt_key'); }` |
| 🟠 警告 | `get_list` (~L75) | **严重性能瓶颈 (N+1 查询)**:在 `foreach` 循环内动态加载模型并执行单条查询。订单量超 50 时将引发数据库连接池耗尽与响应超时。 | 提前收集所有 `package_id`,使用 `WHERE IN` 批量查询,在内存中完成数据映射。 | `见下方批量查询示例` |
| 🟠 警告 | `get_detail` (~L115) | **冗余查询与未使用变量**:`$order_data['before_payment']` 赋值后从未返回或参与逻辑;在自身模型内调用 `$this->ahead_yc_order_model->get_one()` 属于冗余加载。 | 移除无效赋值;直接复用 `$this->get_one()`;合并重复的模型加载。 | `// 移除 $order_data 赋值块<br>// 改为: $before_order = $this->get_one(['_id' => $order_info['before_order_id']]);` |
| 🟠 警告 | `encode_group_buying_order` (~L310) | **弱加密算法**:使用 `md5()` 进行签名校验。MD5 已被证实存在碰撞漏洞,不适用于安全签名或防篡改场景。 | 改用 `hash_hmac('sha256', $data, $key)` 提供强加密签名。 | `return hash_hmac('sha256', $order_id, $this->encrypt);` |
| 🟡 建议 | 文件顶部 (~L4) | **框架生命周期误用**:`$CI = &get_instance();` 在类外部执行,文件被 `include` 时即触发,可能在框架未完全初始化时引发 Fatal Error。 | 移至构造函数中,或直接使用 `$this->load->` 链式调用。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟡 建议 | 全局/多处 | **违反 PSR-12 与单一职责**:类名 `Ahead_yc_order_model` 非驼峰;`get_bill_goods_info` 超 300 行,混合了数据查询、金额计算、格式化与业务分支。 | 类名改为 `AheadYcOrderModel`;将大方法拆分为 `fetchBillData()`、`calculateTotals()`、`formatGoods()`。 | `// 遵循 PSR-12<br>class AheadYcOrderModel extends Simple_model { ... }` |
| 🟡 建议 | `binding_order_check` (~L335) | **未定义属性引用**:使用 `$this->uid`,但类中未声明或初始化,依赖隐式全局或父类,破坏封装性。 | 显式声明属性,或通过方法参数/Session 安全注入。 | `protected $current_uid; public function set_current_uid(int $uid): void { $this->current_uid = $uid; }` |
### 🔧 关键代码修复示例
**1. 数据库事务保护 (`confirm_receipt`)**
```php
public function confirm_receipt($order_info, $aheaduid, $aheaduname, $star = 5)
{
$this->db->trans_start(); // 开启事务
// ... 前置校验逻辑 ...
$data = [
'_order_id' => $order_id,
'_process' => 7,
'_process_msg' => $aheaduname . ' - 已确认收货',
'_process_time' => time(),
'_ahead_user_id' => $aheaduid,
'_ahead_user_name' => $aheaduname,
'_star' => $star
];
$this->ahead_yc_order_process_model->insert($data);
$data['_process'] = 8;
$data['_process_msg'] = '订单完成';
$this->ahead_yc_order_process_model->insert($data);
$this->db->trans_complete(); // 提交事务
if ($this->db->trans_status() === FALSE) {
$this->db->trans_rollback();
return ['code' => false, 'msg' => '确认收货失败,数据已回滚'];
}
// ... 推送消息逻辑 ...
return ['code' => true, 'msg' => '确认收货成功'];
}
```
**2. 消除 N+1 查询 (`get_list` 优化思路)**
```php
// 优化前:循环内查库
// 优化后:批量查询 + 内存映射
$package_ids = array_filter(array_column($order_info, 'package_id'));
$package_imgs = [];
if ($package_ids) {
$this->load->model("ahead_room_package_model");
$this->load->model("ahead_wares_package_model");
// 假设框架支持 where_in 批量查询
$room_pkgs = $this->ahead_room_package_model->select(['_id' => $package_ids, 'where_in' => ['_id', $package_ids]], '_id,_img_url');
$wares_pkgs = $this->ahead_wares_package_model->select(['_id' => $package_ids, 'where_in' => ['_id', $package_ids]], '_id,_img_url');
foreach ($room_pkgs as $pkg) $package_imgs[$pkg['_id']] = $pkg['_img_url'] ?? DEFAULTIMG;
foreach ($wares_pkgs as $pkg) $package_imgs[$pkg['_id']] = $pkg['_img_url'] ?? DEFAULTIMG;
}
foreach ($order_info as &$val) {
$val['img'] = $package_imgs[$val['package_id']] ?? DEFAULTIMG;
// ... 其他字段处理 ...
}
```
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **修复 SQL 注入**:立即将 `get_bill_goods_info` 中的字符串拼接替换为参数化查询或 Query Builder。
2. **补充事务控制**:为所有涉及多表写入或状态流转的方法(如 `confirm_receipt`、`bindingOrder`)添加事务包裹。
3. **移除硬编码密钥**:将 `$encrypt` 迁移至 `config/application.php` 或 `.env` 文件,并通过 `config_item()` 读取。
4. **解决 N+1 查询**:重构 `get_list` 与 `get_detail` 中的循环查库逻辑,改为批量查询+内存映射,预计可提升 80% 以上的列表接口响应速度。
### 🛠 后续重构方向
1. **方法职责拆分**:`get_bill_goods_info` 严重违反单一职责原则(SRP)。建议拆分为:
- `fetchRawBillData()`:负责纯数据查询
- `calculateFinancials()`:负责金额、折扣、积分计算
- `formatBillResponse()`:负责视图层数据格式化
2. **统一常量管理**:当前类中同时存在 `public $pay_id_arr` 和 `const ORDER_PAY_PLATFORM_ARR` 等重复定义。建议统一使用 `const` 或 `enum`(PHP 8.1+),并移除魔法数字。
3. **异常处理规范化**:将自定义的 `throwError()` 替换为 PHP 标准异常 `\Exception` 或框架提供的 `show_error()`,便于全局错误捕获与日志记录。
4. **类型声明与严格模式**:在文件头部添加 `declare(strict_types=1);`,并为方法参数与返回值添加类型提示(如 `int`, `array`, `bool`),提升代码健壮性。
> ⚠️ **局限性说明**:提交的代码在 `get_timing_order` 方法处被截断,未能审查完整逻辑。若该方法涉及核心计费或状态机流转,请补充完整代码以便进行二次深度审查。
> 📖 **框架适配提示**:基于代码结构(`get_instance()`、`system/` 目录、`$this->load->model()`),判定为基于 CodeIgniter 3 架构的定制框架(phpci)。上述事务与 Query Builder 语法均兼容 CI3 标准,若 phpci 有自定义封装,请以官方文档的 `DB` 驱动 API 为准。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781003757
|
1781003757
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
655
|
21
|
302
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 开房订单申请退款
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `75d502a79 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `75d502a7967d58d46a34c788d574131fe3900efe`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-09 19:26:01
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:代码实现了订单创建、支付路由、账单统计等核心业务,但存在明显的架构反模式与安全/性能隐患。大量硬编码、重复的支付逻辑、循环内动态加载模型以及不规范的参数传递方式,严重影响了系统的可维护性与运行效率。整体偏向老旧的 CodeIgniter 3 风格,与现代 PHP 工程规范存在差距。
- **风险等级**:🔴 高(存在 SQL 注入隐患、敏感信息硬编码、越权删除风险及严重性能瓶颈)
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>文件顶部/类外 | **模型依赖加载位置错误**:在类外部直接执行 `$CI = &get_instance(); $CI->load->model('Simple_model');`。这会在文件被 `include/require` 时立即执行,破坏框架生命周期,且可能导致全局状态污染。 | 移除文件顶部的加载逻辑,模型应通过 `extends Simple_model` 继承,并在构造函数中调用 `parent::__construct()`。 | `class Ahead_yc_order_model extends Simple_model { public function __construct() { parent::__construct(); } }` |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>`get_bill_goods_info` 方法内 | **SQL 注入风险**:使用字符串拼接构建查询条件 `$sql = '_unique_key="' . $unique_key . '" AND ...'`,若 `$unique_key` 未经严格过滤直接传入底层查询,将导致注入。 | 全面使用框架查询构造器或参数绑定,禁止手动拼接 SQL 条件字符串。 | `$this->db->where('_unique_key', $unique_key)->where('_status IN (1,4)')->get();` |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>`delete_one` 方法 | **越权删除隐患**:当 `$uid = 0` 时,`if ($uid)` 条件不成立,直接执行软删除,未校验订单归属权。攻击者可传入 `0` 或空值删除任意订单。 | 强制要求传入有效用户 ID,或从 Session/Token 中获取当前用户 ID,禁止依赖外部可控参数。 | `if (empty($uid)) { throwError('用户身份校验失败'); } $where['_ahead_user_id'] = $uid;` |
| 🟠 警告 | `Ahead_yc_order_model.php`<br>`get_list` 方法 | **N+1 查询性能瓶颈**:在 `foreach` 循环内动态 `load->model()` 并执行 `get_one()`。订单量稍大时将导致数据库连接耗尽与响应超时。 | 提前收集所有 `package_id`,使用 `WHERE IN` 一次性批量查询,再通过 PHP 数组映射回填数据。 | 收集 `$ids` → `$this->db->where_in('_id', $ids)->get()->result_array()` → 建立映射表 `$map[$id]` 供循环使用。 |
| 🟠 警告 | `Order.php`<br>`check_params` 方法 | **参数来源不一致**:方法签名接收 `$param`,但在 `else` 分支中直接使用 `$this->param['family_server_id']`。若调用方未同步更新 `$this->param`,将引发 `Undefined index` 或逻辑错乱。 | 统一使用传入的 `$param` 数组,或在方法开头显式合并:`$param = array_merge($this->param, $param);` | `if ($from != '1') { $family_server_id = $param['family_server_id'] ?? ''; }` |
| 🟠 警告 | `Order.php`<br>`buyRenewalPackage` / `createOrder` | **支付路由逻辑高度重复**:微信支付与国通支付(Chinaums)的判断、参数组装、回调地址拼接在两个方法中几乎完全一致,维护成本极高。 | 提取为私有方法 `generatePaymentPayload($orderData, $payPlatform, $shopId)`,统一处理网关路由。 | 封装支付网关调用,控制器仅负责:`$payData = $this->buildPayParams($order, $platform);` |
| 🟠 警告 | `Ahead_yc_order_model.php`<br>类属性定义 | **敏感信息硬编码**:`public $encrypt = "Vs!Fs7VT";` 直接暴露在源码中,违反安全基线。 | 移至 `config/` 配置文件或环境变量,通过 `config_item()` 或 `getenv()` 动态获取。 | `protected $encrypt; public function __construct() { parent::__construct(); $this->encrypt = config_item('order_encrypt_key'); }` |
| 🟡 建议 | `Order.php` / `Ahead_yc_order_model.php`<br>全局 | **魔法数字泛滥**:大量使用 `1, 2, 4, -1, 10` 表示状态/类型。虽已定义 `const`,但业务逻辑中未全面替换,可读性差且易改错。 | 全面使用已定义的类常量,并在新增状态时同步更新常量映射表。 | `if ($order['type'] == self::ORDER_TIMING_OPEN_ROOM_TYPE)` 替代 `== 5` |
| 🟡 建议 | `Order.php`<br>`do_log` 调用处 | **日志记录敏感数据**:`do_log(var_export($order_add_res['order_data'], 1)...)` 直接打印完整订单数组,可能包含用户手机号、支付密钥等 PII/敏感信息。 | 脱敏处理后再记录,或使用框架标准日志函数,仅记录关键标识符。 | `log_message('debug', 'Pay initiated: order=' . $orderId . ', amount=' . $amount);` |
| 🟡 建议 | `Order.php`<br>文件头部 | **非标准父类引入**:使用 `include FCPATH . 'application' ...` 引入父控制器。现代框架应依赖自动加载或命名空间。 | 移除手动 `include`,确保框架自动加载机制已正确配置父类路径。 | 依赖 Composer 或框架 Autoloader 自动解析 `Index` 类。 |
> 📝 **局限性说明**:`Ahead_yc_order_model.php` 末尾的 `get_timing_order` 方法代码被截断,无法完整评估其查询逻辑与异常处理。建议补充完整代码后二次审查。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复 SQL 注入与越权漏洞**:立即替换 `get_bill_goods_info` 中的字符串拼接查询,并为 `delete_one` 增加强制用户身份校验。
2. **消除 N+1 查询**:重构 `get_list` 方法,将循环内查询改为批量 `IN` 查询或 `JOIN`,预计可降低 80% 以上的数据库 IO 开销。
3. **统一支付逻辑**:将 `buyRenewalPackage` 与 `createOrder` 中的支付网关路由代码抽离为独立服务类或私有方法,遵循 DRY 原则。
### 🛠 后续重构与优化方向
- **架构规范化**:当前代码呈现典型的 CI3 风格。若 `phpci` 为定制框架,请严格遵循其生命周期(如模型构造函数、控制器基类加载)。建议逐步引入依赖注入(DI)容器,替代 `$this->load->model()` 的隐式加载。
- **常量与枚举管理**:将散落在类中的状态数组(如 `$pay_id_arr`, `$type_arr`)统一迁移至独立的 `Enum` 类或配置文件中,业务层仅通过常量引用。
- **日志与安全审计**:建立统一的日志脱敏中间件,禁止在业务代码中直接 `var_export` 敏感数组。支付回调地址建议通过配置中心动态下发,避免硬编码 `PAY_BASE_URL`。
- **测试覆盖**:针对 `check_params` 边界条件、支付状态流转(`pay_status != -1` 分支)、并发关房场景补充单元测试,防止状态机死锁或资损。
> 💡 **框架适配提示**:代码中大量使用 `get_instance()` 与 `$this->load->` 语法,符合 CodeIgniter 3 特征。若 `phpci` 为基于 CI 的二次开发框架,请确认其是否已升级至 PHP 8.x 兼容模式。若为独立微框架,建议逐步替换为 PSR-4 自动加载与标准 MVC 路由,以提升长期可维护性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781004361
|
1781004361
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
656
|
21
|
303
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 申请退款
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `9b97b3156 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `9b97b3156adface57571495d2eb22c652b5e440f`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-09 19:35:24
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖较全面,但存在明显的安全隐患(SQL注入、弱加密签名)、严重的性能瓶颈(N+1查询)以及框架生命周期使用不规范的问题。核心方法 `get_bill_goods_info` 过于臃肿,混合了数据查询、聚合计算与视图格式化逻辑,缺乏事务保护与常量复用。
- **风险等级**:🔴 高
> 📌 **注**:项目目录结构及 `$CI = &get_instance()` 语法高度符合 **CodeIgniter 3** 特征。若 `phpci` 为内部定制框架,请核对底层加载机制。以下审查基于标准 CI3/MVC 最佳实践与 PSR-12 规范。代码末尾存在截断,审查仅基于已提供片段。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>`get_bill_goods_info` 方法 | **SQL 注入漏洞**:直接使用字符串拼接 `$unique_key` 构建 SQL 条件,未进行转义或使用查询构造器。 | 使用 CI3 查询构造器 `$this->db->where()` 自动转义,或显式调用 `$this->db->escape()`。 | `$this->db->where('_unique_key', $unique_key);`<br>`$this->db->where_in('_status', [1, 4]);` |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>L12, L685 | **硬编码密钥与弱加密**:`$encrypt` 为公开属性且硬编码在类中;`encode_group_buying_order` 使用 `md5` 签名,易受碰撞与彩虹表攻击。 | 密钥移至 `config` 或环境变量;签名改用 `hash_hmac('sha256', ...)`。 | `hash_hmac('sha256', $order_id, config_item('order_sign_key'), true)` |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>`get_detail` 方法 | **逻辑缺陷/数据丢失**:`$order_data['before_payment']` 被赋值,但后续未合并至 `$order_info` 且未返回,导致前端无法获取转房前金额。 | 修正变量名,将数据正确挂载到 `$order_info` 数组中。 | `$order_info['before_payment'] = $before_order_info_data['_actual_pay'] ?? '';` |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>`confirm_receipt` 方法 | **缺乏数据库事务**:连续执行两次 `insert` 记录订单状态,若第二次失败或中断,将导致订单状态不一致(卡在“已确认收货”但未“完成”)。 | 使用 CI3 事务机制包裹关键写入操作。 | `$this->db->trans_start();`<br>`// insert 1 & 2`<br>`$this->db->trans_complete();` |
| 🟠 警告 | `Ahead_yc_order_model.php`<br>`get_list` 方法 | **N+1 查询性能瓶颈**:在 `foreach` 循环内频繁 `load->model` 并执行 `get_one` 查询套餐图片。数据量大时将导致严重延迟。 | 提前收集所有 `package_id`,使用 `WHERE IN` 批量查询,或在主 SQL 中使用 `LEFT JOIN`。 | `$ids = array_column($order_info, 'package_id');`<br>`$imgs = $this->db->where_in('_id', $ids)->get('ahead_room_package')->result_array();` |
| 🟠 警告 | `Ahead_yc_order_model.php`<br>L6-L7 | **框架反模式**:模型文件顶部直接调用 `$CI = &get_instance();` 和 `load->model()`。文件被 `include` 时即执行,破坏 CI 生命周期与单例机制。 | 移至 `__construct()` 中,或交由控制器/自动加载器管理。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟠 警告 | `Ahead_yc_order_model.php`<br>多处方法 | **重复加载模型**:各业务方法内频繁调用 `$this->load->model()`,增加不必要的 I/O 与内存开销。 | 统一在 `__construct()` 中加载,或配置 `application/config/autoload.php`。 | `public function __construct() { $this->load->model(['ahead_room_package_model', 'ahead_yc_order_extension_model']); }` |
| 🟠 警告 | `Ahead_yc_order_model.php`<br>多处条件判断 | **魔法数字泛滥**:大量使用 `10, 12, 14` 等硬编码判断支付类型/状态,未复用类顶部已定义的 `const`。 | 全面替换为类常量,提升可读性与可维护性。 | `if ($order['_pay_platform'] == self::ORDER_AFTER_PAY_PAYPLATFORM)` |
| 🟡 建议 | `Ahead_yc_order_model.php`<br>L9 | **命名规范不符 PSR-12**:类名使用下划线 `Ahead_yc_order_model`,不符合 PHP 标准驼峰命名规范。 | 重命名为 `AheadYcOrderModel`,并全局替换引用。 | `class AheadYcOrderModel extends Simple_model` |
| 🟡 建议 | `Ahead_yc_order_model.php`<br>L12-L14 | **属性可见性不当**:`$encrypt`, `$pay_id_arr` 等声明为 `public`,易被外部实例意外修改或暴露。 | 改为 `protected` 或 `private`,通过 Getter 方法访问。 | `protected $encrypt = "Vs!Fs7VT";`<br>`protected $pay_id_arr = [...];` |
| 🟡 建议 | `Ahead_yc_order_model.php`<br>`get_bill_goods_info` | **违背单一职责原则 (SRP)**:该方法超 300 行,混合了 SQL 查询、金额聚合、商品格式化、业务规则判断。 | 拆分为 `fetchBillData()`, `calculateTotals()`, `formatGoodsList()` 等私有方法,或抽离至 `OrderBillService`。 | 将聚合逻辑与视图格式化逻辑分离,降低圈复杂度。 |
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **修复 SQL 注入**:立即将 `get_bill_goods_info` 中的字符串拼接改为查询构造器或预处理语句。
2. **补充事务控制**:为 `confirm_receipt`、`close_room_after`、`bindingOrder` 等涉及多表写入的方法添加 `$this->db->trans_start()/trans_complete()`。
3. **修正数据丢失 Bug**:将 `get_detail` 中的 `$order_data['before_payment']` 更正为 `$order_info['before_payment']`。
4. **规范框架加载**:移除文件顶部的 `$CI = &get_instance();`,将模型依赖移至构造函数。
### 🛠 后续重构与优化方向
1. **性能优化**:
- 彻底解决 `get_list` 的 N+1 查询问题,改用批量查询或 SQL `JOIN`。
- `get_bill_goods_info` 中的金额汇总(`price_total`, `amount_total` 等)可考虑下沉至数据库层,使用 `SUM()`, `GROUP BY` 替代 PHP 循环累加,大幅降低内存与 CPU 消耗。
2. **安全加固**:
- 废弃 `md5` 签名,全面升级至 `hash_hmac('sha256', ...)` 或 JWT。
- 敏感配置(如 `$encrypt`)必须移出代码库,使用 `.env` 或 CI 的 `config` 文件管理。
3. **架构与规范**:
- 遵循 PSR-12 重命名类文件,统一常量使用,消除魔法数字。
- 将 `get_bill_goods_info` 等巨型方法按 **CQRS** 或 **Service 层** 思想拆分,模型仅负责数据存取,业务逻辑与格式化交由上层处理。
- 补充全局函数(如 `throwError`, `minToStr`, `DEFAULTIMG`)的依赖声明或替换为框架内置方法,避免隐式依赖导致维护困难。
> 💡 **提示**:由于提供的代码在 `get_timing_order` 方法处截断,若该方法包含关键业务逻辑(如订单状态机流转、定时任务触发等),请补充完整代码以便进行闭环审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781004924
|
1781004924
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
657
|
21
|
304
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 立即开房申请退款
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `992fc0cc4 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `992fc0cc44f968c62e20e2681838a93533da9108`
**提交人**: linyangrui (yangruilin888@gmail.com)
**时间**: 2026-06-09 19:40:32
---
## 📋 审查摘要
- **变更文件数**: 4
- **严重问题**: 1
- **高危问题**: 3
- **中危问题**: 3
- **建议优化**: 4
> ⚠️ **框架说明**:本次审查的代码为 **微信小程序 JavaScript** 前端代码,非 PHP CodeIgniter 后端代码。因此 CI 框架特定的模型加载规范(如 `$this->load->model()`)不适用,但已严格按照最高优先级对前端跨文件引用、类/方法存在性进行了等效验证。
## 🐛 发现的问题
### <font color="red">[语法错误] 回调参数与内部变量同名导致重复声明</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 约 108 行 (`getOrderDetail` 方法内)
- **问题描述**: 在 `reserveModel.getBookOrderDetail` 的箭头函数回调 `(res) => { ... }` 中,内部使用了 `const res = wx.getStorageSync('handleOpenMachineResultRes')`。在 ES6 严格模式下,同一块级作用域内重复声明 `const` 变量会直接抛出 `SyntaxError: Identifier 'res' has already been declared`,导致页面白屏崩溃。即使不报错,也会覆盖外部传入的 API 响应对象 `res`,导致后续 `res.result` 访问失败。
- **修复建议**: 将内部存储变量重命名,避免与作用域参数冲突:
```javascript
// 修复前
const res = wx.getStorageSync('handleOpenMachineResultRes')
// 修复后
const storageRes = wx.getStorageSync('handleOpenMachineResultRes')
this.handleOpenMachineResult(storageRes)
```
### <font color="red">[跨文件调用] 引用了未提供的模型类及方法,无法验证存在性</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js` 及 `apply-refund.js`
- **行号**: 约 4~6 行, 11~13 行, 22 行
- **问题描述**: 代码中通过 `import` 引入了 `ReserveModel`、`CabinetModel` 和 `HTTP`,并调用了大量未在当前变更文件中定义的方法(如 `reserveModel.applyBookRefund`, `reserveModel.openMachine`, `cabinetModel.reOpenCabinetDoor`, `this.request` 等)。由于未提供 `models/reserve.js`、`models/cabinet.js`、`utils/http.js` 的源码,无法确认这些类是否被正确 `export`,以及方法签名是否匹配。若缺失,将直接引发 `ReferenceError` 或 `TypeError`。
- **修复建议**:
1. 确保依赖文件路径正确且存在。
2. 检查 `utils/http.js` 是否导出了 `HTTP` 基类,且包含 `request` 方法。
3. 检查 `models/reserve.js` 和 `models/cabinet.js` 是否完整导出对应类及所有被调用的方法。建议补充这些文件以便进行完整静态分析。
### [安全隐患] 未校验本地存储数据直接访问属性
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 约 95 行 (`onLoad` 方法内)
- **问题描述**: `const uid = wx.getStorageSync('userInfo').uid || ''`。若用户未登录、缓存被清理或 `userInfo` 为 `null`/`undefined`,直接调用 `.uid` 会抛出 `TypeError: Cannot read properties of null (reading 'uid')`,导致页面初始化失败。
- **修复建议**: 使用可选链或安全解构:
```javascript
const userInfo = wx.getStorageSync('userInfo') || {};
const uid = userInfo.uid || '';
```
### [逻辑 BUG] 对象属性重复定义与关键拼写错误
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 约 238 行 (`handleOpenMachineResult` 方法内)
- **问题描述**: `showCancelBtn: false` 在 `setData` 对象中连续定义了两次。虽然 JS 引擎会取最后一次的值,但属于冗余代码且极易引发维护误解。此外,`avilable_room_list` 存在明显拼写错误(应为 `available`),虽前后一致不影响运行,但严重降低代码可读性,且易导致后续 WXML 绑定或后端对接时出现字段不一致问题。
- **修复建议**: 删除重复的 `showCancelBtn: false`。全局搜索 `avilable_room_list` 并统一修正为 `available_room_list`,同步更新 JS 逻辑与 WXML 模板。
### [代码质量] 使用弱相等比较符及魔法数字硬编码
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js` 等多处
- **行号**: 约 100, 101, 113, 156, 178 等
- **问题描述**: 大量使用 `==` 进行类型不安全的比较(如 `this.data.bigType == 'book'`)。同时,业务状态码和场景码(如 `status == 5`, `type == 1`, `operational_scene == 2`)直接硬编码在逻辑中,缺乏语义化,后期新增状态时极易遗漏或写错。
- **修复建议**:
1. 统一替换为 `===` 严格相等。
2. 提取为常量枚举文件,例如:
```javascript
export const ORDER_STATUS = { IN_PROGRESS: 5 };
export const SCENE_TYPE = { ROOM: 1, TABLE: 2, CARD: 4 };
```
### [代码质量] 生产环境保留 console.log 且错误处理缺失
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/models/order.js`
- **行号**: 约 15, 28, 40, 54, 66 行
- **问题描述**: 所有网络请求的 `error` 回调仅使用 `console.log(err)` 打印日志,未向用户展示任何错误提示,也未上报至前端监控系统。在生产环境中,`console` 语句可能泄露接口调试信息,且用户遇到网络异常或接口报错时无任何交互反馈,体验极差。
- **修复建议**: 移除裸 `console.log`。封装统一的错误处理函数,例如:
```javascript
error: (err) => {
wx.showToast({ title: '请求失败,请重试', icon: 'none' });
// 可在此处接入 Sentry/神策等错误监控 SDK
}
```
## ✅ 代码亮点
1. **模块化设计清晰**:采用 `Model` 层封装网络请求,页面逻辑与数据请求分离,符合微信小程序 MVC/MVVM 最佳实践。
2. **生命周期使用合理**:在 `onShow` 中根据 `bigType` 动态拉取对应订单详情,避免了 `onLoad` 中一次性加载过多数据导致的性能问题。
3. **用户体验细节到位**:在 `getMyRoomOrderDetail` 中使用了 `complete: () => { wx.hideLoading() }`,确保无论请求成功或失败都会关闭 Loading,防止界面卡死。
## 📝 总体建议
1. **补充依赖文件审查**:当前审查受限于未提供 `models/reserve.js`、`models/cabinet.js` 和 `utils/http.js`。强烈建议在合并前补充这些文件,或使用 TypeScript 定义接口契约,彻底杜绝跨文件调用不一致的风险。
2. **强化类型与常量管理**:建议引入 TypeScript 或 JSDoc 注释,对 `order_detail`、`res.result` 等复杂数据结构进行类型定义。将硬编码的 `status`、`type`、`operational_scene` 抽离为全局常量枚举。
3. **统一错误与 Loading 管理**:当前各页面手动调用 `wx.showLoading()`/`wx.hideLoading()` 较为分散,建议在 `HTTP` 基类中封装全局拦截器,统一处理 Loading 状态、Token 失效跳转及错误提示。
4. **修复关键语法与空指针**:优先解决 `const res` 重复声明问题及 `wx.getStorageSync` 空指针风险,这两项是导致线上白屏的高频原因。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781005232
|
1781005232
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
658
|
21
|
305
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616 🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616' of https://gitea.g-hi.co...
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `3eb99cf2e ## 自动代码审查报告
**分支**: pay-260616
**提交**: `3eb99cf2e9b7a293aaff344582d130a791ed700a`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 09:54:52
---
## 📋 审查摘要
- **变更文件数**: 5
- **严重问题**: 3
- **高危问题**: 5
- **中危问题**: 2
- **建议优化**: 3
## 🐛 发现的问题
### <font color="red">[语法错误] PHP 文件顶部错误调用 get_instance() 导致 Fatal Error</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `application/models/Ahead_yc_order_model.php`
- **行号**: 约第 3-4 行
- **问题描述**: 在类定义外部直接调用 `$CI = &get_instance();` 和 `$CI->load->model('Simple_model');`。在 CodeIgniter 框架中,`get_instance()` 仅在类实例化后(如构造函数或方法内部)可用。在文件解析阶段调用会导致 `Call to undefined function get_instance()` 或 `Fatal error`,模型根本无法加载。
- **修复建议**: 将模型加载移至类的构造函数 `__construct()` 中:
```php
class Ahead_yc_order_model extends Simple_model {
public function __construct() {
parent::__construct();
$this->load->model('Simple_model'); // 若父类未自动加载
}
// ...
}
```
### <font color="red">[语法错误] PHP 文件末尾代码截断/不完整</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `application/models/Ahead_yc_order_model.php`
- **行号**: 文件末尾(约第 680 行)
- **问题描述**: `get_timing_order` 方法未闭合,代码在 `return ['success' => false, 'msg' => '订单` 处突然中断,缺少闭合的字符串引号、数组括号、方法大括号及文件结束符。直接导致 PHP 解析失败。
- **修复建议**: 补全缺失的代码结构:
```php
return ['success' => false, 'msg' => '订单不存在'];
}
} // 闭合 get_timing_order
} // 闭合 class
```
### <font color="red">[跨文件调用] 引用了未定义的函数/常量 (throwError, DEFAULTIMG, minToStr, send_wx_pay_order)</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_yc_order_model.php`
- **行号**: 约第 230, 115, 265, 615 行
- **问题描述**: 代码中直接调用了 `throwError('订单不存在')`、`DEFAULTIMG`、`minToStr(...)` 和 `send_wx_pay_order(...)`。这些均非 PHP 原生函数或 CI 内置方法,也未在当前文件或提供的结构中定义。若未正确引入对应 Helper 或全局文件,将触发 `Fatal error: Uncaught Error: Call to undefined function` 或 `Use of undefined constant`。
- **修复建议**:
1. 确认这些函数/常量所在的 Helper 文件(如 `application/helpers/common_helper.php`)是否已自动加载或手动 `require`。
2. 若为自定义全局函数,建议在文件顶部显式引入或改用 CI 的 `show_error()` / `log_message()`。
3. 常量建议通过 `defined('DEFAULTIMG') or define('DEFAULTIMG', '...');` 或配置项统一管理。
### <font color="red">[跨文件调用] 加载的模型文件未在项目中提供/命名不规范</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_yc_order_model.php`
- **行号**: 多处(如 118, 124, 228, 315, 610 等)
- **问题描述**: 代码中大量使用 `$this->load->model()` 加载模型,但提供的文件结构中均未包含对应文件。部分命名不符合 CI 规范:
- `$this->load->model("ahead_open_room_log");` 缺少 `_model` 后缀,CI 默认期望文件名为 `ahead_open_room_log_model.php`。
- 大小写混用:`$this->load->model('Ahead_yc_order_infos_model');` 与 `$this->load->model("ahead_yc_order_infos_model");` 混用,在 Linux 严格区分大小写的服务器上可能导致加载失败。
- **修复建议**:
1. 确保所有被加载的模型文件存在于 `application/models/` 目录下。
2. 统一命名规范:文件名必须为 `xxx_model.php`,类名必须为 `Xxx_model`。
3. 统一使用小写加载:`$this->load->model('ahead_open_room_log_model');`。
### [安全隐患] SQL 注入风险(字符串拼接查询条件)
- **严重程度**: 高危
- **文件**: `application/models/Ahead_yc_order_model.php`
- **行号**: 约第 310 行
- **问题描述**: 在 `get_bill_goods_info` 方法中,使用 `$sql = '_unique_key="' . $unique_key . '" AND ...'` 直接拼接字符串作为查询条件传入 `$this->select($sql)`。若 `$unique_key` 来源于用户输入或外部接口,未进行转义或参数化绑定,将导致严重的 SQL 注入漏洞。
- **修复建议**: 使用 CI 查询构建器的数组条件或参数绑定:
```php
$where = [
'_unique_key' => $unique_key,
'_status' => [1, 4],
'_timestamp>' => time() - 7 * 86400
];
// 或使用 $this->db->where() 链式调用,避免手动拼接 SQL 字符串
$order_data = $this->select($where);
```
### [逻辑 BUG] JS 空指针异常风险 (wx.getStorageSync)
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 约第 45 行
- **问题描述**: `const uid = wx.getStorageSync('userInfo').uid || ''`。若本地缓存中不存在 `userInfo` 键,`wx.getStorageSync` 返回 `undefined` 或 `null`,直接访问 `.uid` 会抛出 `TypeError: Cannot read properties of undefined (reading 'uid')`,导致页面白屏崩溃。
- **修复建议**: 增加安全访问判断:
```javascript
const userInfo = wx.getStorageSync('userInfo') || {};
const uid = userInfo.uid || '';
```
### [逻辑 BUG] JS 竞态条件/未初始化数据访问
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 约第 115, 140, 160 行(`onApplyClick`, `scanToOpen`, `onContinueBookClick` 等)
- **问题描述**: 页面 `onShow` 中调用 `getOrderDetail()` 或 `getMyRoomOrderDetail()` 获取数据,这些是异步请求。但多个按钮点击事件(如申请退款、扫码开门、续费)直接读取 `this.data.order_detail.xxx`。若用户点击过快或网络延迟,`order_detail` 仍为初始空对象 `{}`,导致 `undefined` 属性访问或逻辑判断失效。
- **修复建议**: 在操作前增加数据加载状态校验:
```javascript
if (!this.data.order_detail.id) {
wx.showToast({ title: '订单信息加载中,请稍候', icon: 'none' });
return;
}
// 或添加 loading 状态锁
```
### [代码质量] 模型内部冗余调用自身实例
- **严重程度**: 中危
- **文件**: `application/models/Ahead_yc_order_model.php`
- **行号**: 约第 275 行
- **问题描述**: `$before_order_info_data = $this->ahead_yc_order_model->get_one(...)`。在模型内部调用自身,CI 会尝试重新加载该模型并创建新实例,不仅浪费资源,还可能引发循环依赖或属性覆盖。当前类本身已继承 `Simple_model`,应直接使用 `$this->get_one()`。
- **修复建议**: 替换为 `$before_order_info_data = $this->get_one(array('_id' => $order_info['before_order_id']));`
### [代码质量] 函数过长且职责不单一
- **严重程度**: 中危
- **文件**: `application/models/Ahead_yc_order_model.php`
- **行号**: `get_bill_goods_info` 方法(约 300+ 行)
- **问题描述**: 该方法承担了订单查询、账单计算、商品合并、退款统计、格式化输出等过多职责,嵌套层级深,难以维护和测试。
- **修复建议**: 拆分为多个私有方法,如 `_calculate_totals()`, `_merge_goods_list()`, `_format_bill_output()`,提升可读性与可测试性。
## ✅ 代码亮点
1. **前端回调封装规范**:`order.js` 中统一使用 `success` 和 `error` 回调处理请求结果,结构清晰,便于后续统一拦截或日志上报。
2. **状态机设计合理**:`order-detail.js` 中通过 `bigType` 区分 `book` 和 `room` 订单,并分别调用对应接口,业务边界清晰。
3. **防御性编程意识**:JS 中多处使用 `|| ''` 或 `|| 0` 提供默认值,减少了部分 `undefined` 渲染问题。
## 📝 总体建议
1. **优先修复致命语法错误**:PHP 文件顶部的 `get_instance()` 调用和末尾的代码截断必须立即修复,否则服务将直接 500 报错。
2. **统一跨文件依赖管理**:建议建立依赖清单或使用 IDE 的引用检查工具,确保所有 `load->model()` 和 `import` 的文件真实存在且命名符合框架规范。
3. **加强安全与健壮性**:PHP 端严禁字符串拼接 SQL,必须使用参数化查询;JS 端所有异步数据消费前必须校验加载状态,避免竞态条件引发崩溃。
4. **代码重构规划**:`get_bill_goods_info` 方法已严重违反单一职责原则,建议在下一个迭代周期进行拆分重构,并补充单元测试覆盖核心计算逻辑。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781056492
|
1781056492
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
659
|
21
|
306
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 消息加包厢信息
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `47c710f82 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `47c710f82f528f960f1f040bd219ca307b697e8d`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 10:24:03
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了基础的消息通知与分表路由逻辑,业务意图清晰。但存在未定义变量、魔法数字泛滥、重复代码过多、模型重复加载等典型问题。部分逻辑缺乏边界防御,在并发或异常数据场景下易引发运行时警告或静默失败。整体可维护性与健壮性有较大提升空间。
- **风险等级**:🟠 中(存在明确运行时隐患与性能瓶颈,需优先修复)
> 📌 **框架说明**:代码结构、加载方式及目录规范与 **CodeIgniter 3** 高度一致。以下审查基于 CI3/PHPCI 通用最佳实践。若为深度定制框架,请以官方文档为准。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `after_order` (~138行) | `$admin_data` 变量从未定义,直接访问将触发 `PHP Warning`,导致 `_nickname` 始终为空字符串。 | 明确数据来源。若为当前操作管理员,应通过方法参数传入或从 Session/鉴权服务获取。 | `$data['_nickname'] = $admin_data['_admin_name'] ?? '';`<br>改为:`$data['_nickname'] = $admin_name ?? '';`(由调用方传入) |
| 🔴 严重 | `add_call_pay_order` (~108行) | `$content` 仅在 `_pay_platform` 为 `4` 或 `5` 时赋值。若传入其他支付类型,后续 `$insert_data['_content'] = $content;` 将报未定义变量错误。 | 补充 `else` 默认分支或初始化 `$content = ''`,确保变量始终存在。 | `else { $content = '未知支付类型订单待处理'; }` |
| 🟠 警告 | 全局 (~9行) | `$CI = &get_instance();` 置于类外部,违反框架生命周期规范。在部分 PHP 版本或 CLI 环境下会导致上下文丢失或 Fatal Error。 | 移除全局实例化。模型内部应直接使用 `$this->load->...` 或 `$this->config->...`。 | 删除顶部 `$CI = &get_instance();` 及 `$CI->load->model('Sub_table_model');` |
| 🟠 警告 | `push_notice` (~155行) | `$notice_menu_type[$jsondata['type']]['menu_id']` 未做键存在性校验。若配置缺失或 `_type` 值越界,将抛出 `Undefined index` 并中断推送。 | 使用空合并运算符或 `isset()` 提供安全降级逻辑。 | `$jsondata['menu_id'] = $notice_menu_type[$jsondata['type']]['menu_id'] ?? 0;` |
| 🟠 警告 | `insert` / 多处 | 方法内频繁调用 `$this->load->model()`。CI 框架中重复加载会增加内存与 I/O 开销,且破坏依赖注入原则。 | 统一移至 `__construct()` 中加载,或配置自动加载(autoload)。 | `public function __construct() { parent::__construct(); $this->load->model(['ahead_family_servers_model', 'ahead_shop_model', 'Ahead_merchant_model']); }` |
| 🟡 建议 | 全文多处 | 大量魔法数字硬编码(如 `_type=8`, `_php_version>190220`, `_pay_platform` 等),业务语义不透明,后期维护成本极高。 | 提取为类常量(Constants),集中管理业务枚举与阈值。 | `const TYPE_STOCK_UP = 8; const VERSION_SHARDING_THRESHOLD = 190220; const PAY_CASH = 4;` |
| 🟡 建议 | `insert` (~58行) | 每次插入都执行两次 `get_one` 查询。若在循环/批量场景中调用,将引发严重的 **N+1 查询性能瓶颈**。 | 建议由调用方补全 `_room_name`/`_shop_name`,或引入缓存层(如 CI Cache/Redis)避免重复查库。 | `if (empty($arr['_room_name']) && !empty($arr['_room_id'])) { ... }` |
| 🟡 建议 | 全文 | 多个 `add_*_notice` 方法数据结构高度重复,违反 DRY 原则;存在拼写错误 `merchang_data`;未遵循 PSR-12 规范(如 `array()` vs `[]`、缺少类型声明)。 | 抽取私有方法 `buildNoticeData()` 统一组装数据;修正拼写;补充 PHP 7+ 类型提示。 | 见下方重构示例 |
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **修复未定义变量**:立即处理 `after_order` 中的 `$admin_data` 与 `add_call_pay_order` 中的 `$content` 未初始化问题,避免生产环境日志污染与数据丢失。
2. **移除全局 `$CI` 实例化**:将 `$CI = &get_instance();` 从类外部移除,改为在构造函数或方法内部按需使用 `$this->load->...`。
3. **防御性编程**:为 `push_notice` 中的配置数组访问添加 `??` 或 `isset()` 保护,防止因配置缺失导致推送服务崩溃。
### 🛠 后续重构与优化方向
1. **提取公共数据组装逻辑**:当前 7 个通知方法结构高度相似,建议封装为受保护方法,减少重复代码并统一字段校验。
```php
protected function buildNoticeData(array $baseData, array $overrides = []): array
{
$defaults = [
'_status' => 0,
'_createdtime' => time(),
'_speech' => 0,
'_extended_field' => 0,
];
return array_merge($defaults, $baseData, $overrides);
}
```
2. **集中管理魔法数字**:将业务枚举与分表阈值定义为类常量,提升可读性。
```php
class Ahead_yc_notice_model extends Sub_table_model
{
const TYPE_ORDER_PAID = 1;
const TYPE_ORDER_UNPAID = 2;
const TYPE_STOCK_UP = 8;
const TYPE_BOOKING = 12;
const SHARDING_VERSION_THRESHOLD = 190220;
// ...
}
```
3. **优化分表路由逻辑**:当前 `set_table()` 在多个方法中重复调用,且 `insert()` 内部也会调用。建议统一在 `insert()` 或父类钩子中处理,避免重复执行或状态覆盖。
```php
public function insert(array $data)
{
// 统一处理分表逻辑
if (isset($data['_merchant_id'])) {
$this->set_table($data['_merchant_id']);
}
// 补充缺失的名称(建议改为缓存或调用方传入)
$data = $this->fillMissingNames($data);
return parent::insert($data);
}
```
4. **规范 HTTP 请求调用**:`curlRequest()` 为全局辅助函数,硬编码参数 `1, 1, 1, 1, false` 语义不明。建议封装为独立服务类或使用框架提供的 `CURL` 库/Guzzle,便于单元测试与超时重试策略管理。
5. **遵循 PSR-12 与类型安全**:逐步替换 `array()` 为 `[]`,为方法参数与返回值添加类型声明(如 `array $data`, `bool`, `int`),开启 `declare(strict_types=1);` 提升代码健壮性。
> 💡 **提示**:若 `phpci` 框架对模型生命周期、自动加载或数据库驱动有特殊约定,请优先查阅其官方文档。上述建议基于现代 PHP (7.4+) 与主流 MVC 框架最佳实践,可直接平滑迁移。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781058243
|
1781058243
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
660
|
21
|
307
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 关房失败记录日志
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `c4228b887 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `c4228b88720d75994636e692a6eb1a6bfc8c07b6`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 10:53:38
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了预订下单、支付回调、退款及消息通知等核心业务,但存在明显的架构反模式。事务管理机制混乱、存在 SQL 注入隐患、循环内执行数据库查询导致性能瓶颈,且单个方法过长严重违反单一职责原则(SRP)。整体安全性、可维护性与执行效率亟待重构。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据 `$CI = &get_instance()`、`$this->load->model()`、`$this->db->trans_start()` 等特征,代码高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请核对底层事务计数器、配置加载及查询构造器 API 的差异。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `refund_by_notify` 方法内 | **SQL 注入风险**:使用字符串拼接构造 `$log_where` 条件,若 `$order_data['_id']` 来源不可控,将导致注入。 | 使用框架查询构造器或参数绑定,禁止直接拼接 SQL 片段。 | `$this->db->where('_relation_id', $order_data['_id'])->where('_status', 1)->where_in('_type', [5, 13]);`<br>`$this->ahead_pay_log_model->up($log_up, $this->db->get_compiled_where());` |
| 🔴 严重 | `check_notify` 方法内 | **事务管理混乱**:混用 `trans_start()` 与手动 `trans_rollback()`。CI 的 `trans_start()` 依赖内部计数器,手动回滚会破坏状态,且提前 `return` 未调用 `trans_complete()` 可能导致连接池锁死。 | 统一使用 `trans_begin()` 配合手动 `trans_commit()`/`trans_rollback()`,或完全依赖 `trans_start()` + `trans_complete()` 自动机制。 | `$this->db->trans_begin();`<br>`try { /* 业务 */ $this->db->trans_commit(); } catch(\Exception $e) { $this->db->trans_rollback(); }` |
| 🟠 警告 | `get_list` 方法内 | **N+1 查询性能瓶颈**:在 `foreach` 循环中逐条查询商户信息,数据量大时将导致严重性能衰减。 | 批量查询或使用 `WHERE IN` 一次性获取,在内存中映射。 | `$ids = array_column($order_info, 'merchant_id');`<br>`$merchants = $this->ahead_merchant_model->get_many(['_id' => $ids], '_id,_business_model');`<br>`$map = array_column($merchants, '_business_model', '_id');` |
| 🟠 警告 | 文件顶部 & `send_success_msg` | **全局实例化与重复加载**:文件顶部 `$CI = &get_instance();` 在类外执行,易在框架未完全初始化时报错;方法内频繁 `$this->load->model()` 增加 I/O 开销。 | 移除顶部实例化;将高频使用的 Model 移至 `__construct()` 或配置自动加载;配置加载改用 `$this->load->config()`。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_merchant_model'); }` |
| 🟠 警告 | `refund_by_notify` 金额计算 | **浮点数精度丢失**:使用 `floatval()` 处理金额,PHP 浮点运算易产生 `0.0000000001` 级误差,导致对账失败。 | 金额统一以“分”为单位使用整数运算,或使用 `bcmath` 扩展。 | `$wx_pay_amount = bcsub($wx_pay_amount, $change_total_pay[1]['total_pay'] ?? '0', 2);` |
| 🟡 建议 | 全文多处 | **代码规范与可维护性**:混合使用 `array()` 与 `[]`;存在大量注释死代码;魔法数字泛滥(如 `-1, 1, 2, 14, 56`);日志函数名不统一(`doLog` vs `do_log`)。 | 遵循 PSR-12;统一短数组语法;提取业务常量;清理注释代码;统一日志调用入口。 | `const STATUS_PENDING = -1; const STATUS_PAID = 1;`<br>`$this->logger->info('msg');` |
| 🟡 建议 | `create_community_shop_book_order` 末尾 | **代码截断**:文件在 `if ($this->tuangou->verify_token) {` 处突然结束,逻辑不完整,无法评估后续分支。 | 补充完整代码或说明缺失部分。当前审查仅基于已提供片段。 | 无 |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **修复 SQL 注入**:立即将 `refund_by_notify` 中的字符串拼接条件替换为查询构造器或参数化查询。
2. **规范事务流程**:将 `check_notify` 中的 `$this->db->trans_start()` 改为 `$this->db->trans_begin()`,确保所有异常分支和提前返回均正确调用 `trans_rollback()`,成功分支调用 `trans_commit()`。
3. **消除 N+1 查询**:重构 `get_list` 方法,将循环内的单条查询改为批量查询,预计可提升列表接口 50%~80% 的响应速度。
### 🛠 后续重构与优化方向
1. **拆分“上帝模型”**:当前 `Ahead_book_order_model` 承担了订单创建、支付回调、退款、消息推送、库存扣减、财务对账等职责。建议按 **领域驱动设计 (DDD)** 或 **服务层模式** 拆分:
- `OrderService`:处理下单、退款业务流
- `PaymentNotifyHandler`:专注支付回调与幂等控制
- `NotificationService`:封装微信模板消息与短信发送
- `InventoryService`:处理套餐/包厢库存扣减与回滚
2. **统一金额处理规范**:全项目金额字段建议统一转为 `int`(单位:分),入库/出库时使用 `bcadd`/`bcsub`/`bcmul`/`bcdiv`,彻底杜绝浮点精度问题。
3. **清理技术债务**:
- 移除所有 `//` 注释的废弃代码,使用 Git 版本控制追溯历史。
- 将魔法数字提取为类常量或配置文件(如 `config/book_status.php`)。
- 统一日志函数调用(建议封装为 `Logger` 类或统一使用 `log_message()`)。
4. **框架适配确认**:若 `phpci` 非标准 CI3,请重点核对 `$this->db->trans_*` 系列方法的行为差异,以及 `$this->load->config()` 的命名空间隔离机制,必要时查阅官方文档进行 API 对齐。
> 💡 **审查局限性说明**:由于提供的代码在 `create_community_shop_book_order` 方法末尾截断,无法完整评估团购券核销、组合支付尾款处理等后续逻辑。建议补充完整文件后再次进行针对性审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781060018
|
1781060018
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
672
|
21
|
308
|
1
|
|
0
|
Merge pull request '260519分支分支' (#3) from Merge pull request '260519分支分支' (#3) from pay into pay-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141923
|
1781141933
|
1781141933
|
0
|
0
|
0
|
Edit
Delete
|
|
674
|
21
|
309
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781763027
|
1781763036
|
1781763036
|
0
|
0
|
0
|
Edit
Delete
|
|
675
|
21
|
310
|
1
|
|
0
|
退款api
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781763061
|
1781763086
|
1781763086
|
0
|
0
|
0
|
Edit
Delete
|
|
680
|
21
|
311
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782697976
|
1782697982
|
1782697982
|
0
|
0
|
0
|
Edit
Delete
|
|
681
|
21
|
312
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782698000
|
1782698023
|
1782698023
|
0
|
0
|
0
|
Edit
Delete
|
|
684
|
21
|
313
|
1
|
|
0
|
需求 小程序,h5默认灯光 16498
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720186
|
1782720207
|
1782720207
|
0
|
0
|
0
|
Edit
Delete
|
|
685
|
21
|
314
|
1
|
|
0
|
需求 小程序,h5默认灯光 16498
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720278
|
1782720287
|
1782720287
|
0
|
0
|
0
|
Edit
Delete
|
|
687
|
21
|
315
|
1
|
|
0
|
预订开房多过滤该包厢上一单已关房的账单时间
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782973124
|
1782973131
|
1782973131
|
0
|
0
|
0
|
Edit
Delete
|
|
696
|
21
|
316
|
1
|
|
0
|
需求 暂停屏保 16512
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783991980
|
1783991987
|
1783991987
|
0
|
0
|
0
|
Edit
Delete
|
|
697
|
21
|
317
|
1
|
|
0
|
预订开房多过滤该包厢上一单已关房的账单时间
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783992006
|
1783992023
|
1783992023
|
0
|
0
|
0
|
Edit
Delete
|
|
701
|
21
|
318
|
1
|
|
0
|
需求 续费弹窗语音提醒 16618
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696808
|
1784696845
|
1784696845
|
0
|
0
|
0
|
Edit
Delete
|
|
703
|
21
|
319
|
1
|
|
0
|
需求-H5点击下载不跳转
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784772792
|
1784772800
|
1784772800
|
0
|
0
|
0
|
Edit
Delete
|
|
708
|
21
|
320
|
1
|
|
0
|
套餐购买页“购买时长"页签根据后台设置显隐
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871323
|
1784871331
|
1784871331
|
0
|
0
|
0
|
Edit
Delete
|
|
709
|
21
|
321
|
1
|
|
0
|
套餐购买页“购买时长"页签根据后台设置显隐
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871361
|
1786672696
|
1784871367
|
0
|
0
|
0
|
Edit
Delete
|
|
714
|
21
|
322
|
1
|
|
0
|
新用户注册会员bug修复
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1785224230
|
1785224237
|
1785224237
|
0
|
0
|
0
|
Edit
Delete
|
|
715
|
21
|
323
|
1
|
|
0
|
新用户注册会员bug修复
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1785224252
|
1785224258
|
1785224258
|
0
|
0
|
0
|
Edit
Delete
|
|
721
|
21
|
324
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339342
|
1786339349
|
1786339349
|
0
|
0
|
0
|
Edit
Delete
|
|
722
|
21
|
325
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339360
|
1786339366
|
1786339366
|
0
|
0
|
0
|
Edit
Delete
|
|
738
|
21
|
326
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672642
|
1786672648
|
1786672648
|
0
|
0
|
0
|
Edit
Delete
|
|
739
|
21
|
327
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672660
|
1786672666
|
1786672666
|
0
|
0
|
0
|
Edit
Delete
|
|
740
|
21
|
328
|
1
|
|
0
|
Merge pull request '套餐购买页“购买时长"页签根据后台设置显隐& Merge pull request '套餐购买页“购买时长"页签根据后台设置显隐' (#321) from pay into pay-260818...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672685
|
1786672694
|
1786672694
|
0
|
0
|
0
|
Edit
Delete
|
|
744
|
21
|
329
|
1
|
|
0
|
美团包型库存同步
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787555151
|
1787555158
|
1787555158
|
0
|
0
|
0
|
Edit
Delete
|
|
745
|
21
|
330
|
1
|
|
0
|
美团包型库存同步
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787555173
|
1787555181
|
1787555181
|
0
|
0
|
0
|
Edit
Delete
|
|
746
|
21
|
331
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787639582
|
1787639588
|
1787639588
|
0
|
0
|
0
|
Edit
Delete
|
|
747
|
21
|
332
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787639604
|
1787639610
|
1787639610
|
0
|
0
|
0
|
Edit
Delete
|
|
763
|
21
|
333
|
1
|
|
0
|
需求 分账
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788242773
|
1788242779
|
1788242779
|
0
|
0
|
0
|
Edit
Delete
|
|
764
|
21
|
334
|
1
|
|
0
|
需求 分账
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788242824
|
1788242831
|
1788242831
|
0
|
0
|
0
|
Edit
Delete
|
|
778
|
21
|
335
|
1
|
|
0
|
包厢续费小程序码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789436449
|
1789436456
|
1789436456
|
0
|
0
|
0
|
Edit
Delete
|
|
779
|
21
|
336
|
1
|
|
0
|
包厢续费小程序码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789436483
|
1789436492
|
1789436492
|
0
|
0
|
0
|
Edit
Delete
|
|
782
|
21
|
337
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789441207
|
1789441214
|
1789441214
|
0
|
0
|
0
|
Edit
Delete
|
|
783
|
21
|
338
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789441226
|
1789441236
|
1789441236
|
0
|
0
|
0
|
Edit
Delete
|
|
786
|
21
|
339
|
1
|
|
0
|
需求 麦霸直播间不判断配置
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789718159
|
1789718167
|
1789718167
|
0
|
0
|
0
|
Edit
Delete
|