[fastadmin] 第五十五篇 搞定 Shopro 订单详情“不存在”及“科学计数法”报错
快速搞定 Shopro 订单详情“不存在”及“科学计数法”报错
在使用 FastAdmin + Shopro 开发时,你可能会遇到在前台访问订单详情页却提示“订单不存在”的情况。通过打印 SQL 发现,原本长长的订单号(如 20260122...)竟然变成了类似 2.0260E+23 的科学计数法。
请求api如下:
http://shopadmin.xxxx.com/index.php/addons/shopro/order.order/detail?id=202601223288531440001400&order_sn=202601223288531440001400
sql 如下:
SELECT * FROM `fs_shopro_order` WHERE ( `user_id` = 14 AND `id` = 2.0260122328853E+23 ) AND `xmy_shopro_order`.`deletetime` IS NULL LIMIT 1
这是因为 PHP 在处理超长数字字符串时,若未强制指定类型,可能会将其误认为浮点数导致精度丢失。本文教你用 3 分钟完成修复。
修改步骤
请打开文件:addons/shopro/controller/order/Order.php。
1. 找到 detail 方法
定位到 detail() 函数,你会发现原逻辑通常只通过主键 id 配合 find() 方法查询。
2. 替换核心逻辑
将 detail 方法的内容替换为以下代码:
PHP
public function detail()
{
$user = auth_user();
// 关键点1:强制转换为字符串,防止大数字变成科学计数法
$id = (string)$this->request->param('id');
// 关键点2:兼容查询。如果长度较长则匹配订单号,否则匹配主键ID
$order = OrderModel::where('user_id', $user->id)
->where(function($query) use ($id) {
if (strlen($id) > 10) {
$query->where('order_sn', $id);
} else {
$query->where('id', $id);
}
})
->with(['items', 'invoice'])
->find();
if (!$order) {
$this->error('订单不存在');
}
$orderModel = new OrderModel();
$order = $orderModel->setOrderItemStatusByOrder($order);
// 注入商品类型逻辑(按需保留)
if (isset($order['items'])) {
foreach ($order['items'] as &$item) {
$g_type = $item['goods_type'] ?? 'normal';
$item['goods_type_text'] = $this->getGoodsTypeLabel($g_type);
}
}
$this->success('获取成功', $order);
}
为什么这样改有效?
字符串化处理:通过
(string)$id确保订单号在 PHP 层级始终以文本形式存在,杜绝了被转为float导致精度丢失的可能。智能匹配:利用
strlen($id) > 10这一简单规则自动识别用户传的是“内部自增ID”还是“对外展示订单号”,极大提升了接口的兼容性。权限锁定:始终保留
where('user_id', $user->id),确保用户只能查看自己的订单,安全不降级。
最后一步
修改保存后,请务必前往 FastAdmin 后台 -> 右上角 -> 点击“清除缓存”。
现在,再次访问详情页,长订单号也能秒速找回!
想让虚拟商品在发货后自动确认收货? 欢迎查看我的下一篇技术分享。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu