diff --git a/backend/app/api/controller/v1/order/CenterOrderController.php b/backend/app/api/controller/v1/order/CenterOrderController.php index 306128ee9..df6dd31df 100644 --- a/backend/app/api/controller/v1/order/CenterOrderController.php +++ b/backend/app/api/controller/v1/order/CenterOrderController.php @@ -2749,6 +2749,38 @@ class CenterOrderController return null; } + /** + * 按订单号+SKU unique 定位中台订单内的评价商品条目 + * 评价必须落到用户指定的那笔订单:同商品重复购买时各订单 unique 相同,仅凭 unique 反查会命中旧订单 + * @param string $orderNo 中台订单号 + * @param string $unique SKU 唯一码 + * @param int|null $uid 限定归属用户 + * @return array|null + */ + protected function findOrderItemByOrderNo(string $orderNo, string $unique, ?int $uid = null): ?array + { + if ($orderNo === '' || $unique === '') { + return null; + } + $order = app()->make(OrderCenterDao::class)->get(['order_no' => $orderNo]); + if (!$order) { + return null; + } + $order = is_object($order) ? $order->toArray() : (array)$order; + if ($uid !== null && (int)($order['uid'] ?? 0) !== $uid) { + return null; + } + $extra = is_string($order['extra_info'] ?? null) ? json_decode($order['extra_info'], true) : ($order['extra_info'] ?? []); + foreach ($extra['items'] ?? [] as $item) { + if (($item['attr_info']['unique'] ?? '') === $unique) { + $item['_order_no'] = (string)$order['order_no']; + $item['_center_id'] = (int)$order['id']; + return $item; + } + } + return null; + } + /** * 订单评价(中台化) * @param StoreProductReplyServices $replyServices @@ -2780,7 +2812,11 @@ class CenterOrderController } // ==================== 4. 从中台订单快照定位商品(unique 为 SKU 唯一码,限定本人订单防越权) ==================== - $item = $this->findOrderItemBySkuUnique((string)$unique, $uid); + // 页面带订单号(uni)时按订单精确定位;同商品重复购买时 unique 跨订单重复,仅凭 unique 会命中旧订单 + $uni = (string)request()->param('uni', ''); + $item = $uni !== '' + ? $this->findOrderItemByOrderNo($uni, (string)$unique, $uid) + : $this->findOrderItemBySkuUnique((string)$unique, $uid); if (!$item) { return app('json')->fail('商品不存在'); } diff --git a/frontend/uni-app/src/dynamic-pages/api/action-map.js b/frontend/uni-app/src/dynamic-pages/api/action-map.js index 6c8d674a2..9742d717c 100644 --- a/frontend/uni-app/src/dynamic-pages/api/action-map.js +++ b/frontend/uni-app/src/dynamic-pages/api/action-map.js @@ -157,9 +157,19 @@ export default { /** 去评价(后端 NormalOrderAdapter 等模块下发的 action 名;评价页按 SKU unique 提交) */ goComment(order, params) { var orderNo = order.order_no || (params && params.order_no) || ''; - // 取第一个商品条目的 SKU unique;section 以 key='product' 注册,props.product.items 为商品条目 + // 详情页:section 以 key='product' 注册,props.product.items 为商品条目; + // 列表行:extra_info.items 为商品条目(用户端列表接口已解码 extra_info) var items = (order.product && order.product.product && order.product.product.items) || []; - var skuUnique = items.length && items[0].attr_info && items[0].attr_info.unique; + if (!items.length && order.extra_info && Array.isArray(order.extra_info.items)) { + items = order.extra_info.items; + } + var skuUnique = ''; + for (var i = 0; i < items.length; i++) { + if (items[i] && items[i].attr_info && items[i].attr_info.unique) { + skuUnique = items[i].attr_info.unique; + break; + } + } if (!orderNo || !skuUnique) { uni.showToast({ title: i18n.t(`订单信息异常`), icon: 'none' }); return; diff --git a/frontend/uni-app/src/pages/goods/goods_comment_con/index.vue b/frontend/uni-app/src/pages/goods/goods_comment_con/index.vue index 048b4ba32..e86a28a1a 100644 --- a/frontend/uni-app/src/pages/goods/goods_comment_con/index.vue +++ b/frontend/uni-app/src/pages/goods/goods_comment_con/index.vue @@ -180,6 +180,8 @@ value.service_score = service_score; value.pics = pics.value; value.unique = unique.value; + // 评价必须落到用户点进来的这笔订单:同商品重复购买时 unique 不唯一,后端需按订单号定位 + value.uni = orderId.value; uni.showLoading({ title: i18n.t(`正在发布评论`) });