all(); $param['poi_id'] = $request->user['store_id']; $productType = $this->goodsService->productType(); $data = $this->service->setModel()->getList($param,['product' => function($query) use($productType){ $query->field("product_id,product_name,product_type")->append(['types'])->withAttr(['types' => function($query,$resp) use($productType){ $productTypeArr = []; foreach ($productType as $val) { $productTypeArr[$val['key']] = $val['name']; } return $productTypeArr[$resp['product_type']]??''; }]); },'user' => function($query){ $query->field("openid,nickname,avatar"); }],true,['end_time'],["end_time" => function ($resp,$next) { return timeDiff(strtotime("+30 minutes",strtotime($next['create_at'])),time()); }]); return successTrans("success.data",pageFormat($data),200); } catch (\Throwable $throwable) { return error($throwable->getMessage()); } } #[GetMapping('detail')] public function getOrderDetail(Request $request): Response { try { $param = $this->_valid([ "order.require" => trans("empty.require"), ],$request->method()); if (!is_array($param)) return error($param); $order = $this->model->where("out_order_no",$param['order'])->with(['product','poi','user'])->findOrEmpty(); if ($order->isEmpty()) return errorTrans("empty.data"); if ($order['poi_id'] <> $request->user['store_id']) return errorTrans("empty.data"); $order['end_time'] = timeDiff(strtotime("+30 minutes",strtotime($order['create_at'])),time()); return successTrans("success.data",$order->toArray()); } catch (\Throwable $throwable) { return error($throwable->getMessage()); } } /** * 手动核销 * @param Request $request * @return Response|void */ #[PostMapping('done')] public function doneOrder(Request $request) { try { $param = $this->_valid([ "id.require" => trans("empty.require") ],$request->method()); if (!is_array($param)) return error($param); $order = $this->model->where("order_sn",$param['id'])->with(['product','poi','user'])->findOrEmpty(); if ($order->isEmpty()) return errorTrans("empty.data"); if ($order['poi_id'] <> $request->user['store_id']) return errorTrans("empty.data"); if ($order['status'] <> 1) return error("该订单状态不支持核销"); $store = (new SaasStore)->where("poi_id",$request->user['store_id'])->findOrEmpty(); if ($store->isEmpty()) return errorTrans("error.data"); // 获取到订单encrypted_code $orderCode = (new OrderData)->config([ "appid" => sConf("wechat.appid"), "secret" => sConf("wechat.secret"), "account" => sConf("wechat.shop_id"), ])->token()->getCertificate($order['order_sn'],$store['store_id']); if (empty($orderCode['certificates'])) return error("获取订单数据失败"); if (!isset($orderCode['certificates'][0]['encrypted_code'])) return error("获取订单数据失败"); if ($orderCode['certificates'][0]['status'] <> 1) return error("该订单状态不支持核销"); // 核销订单 $orderDone = (new OrderData)->config([ "appid" => sConf("wechat.appid"), "secret" => sConf("wechat.secret"), "account" => sConf("wechat.shop_id"), ])->token()->verifyCertificate([ "account_id" => $store['store_id'], "pay_sn" => $order['pay_sn'], "encrypted_code" => $orderCode['certificates'][0]['encrypted_code'], "order_id" => $order['order_sn'], "poi_id" => $order['poi_id'] ]); if (empty($orderDone['verify_results'])) return error("核销失败"); if (!isset($orderDone['verify_results'][0]['verify_id'])) return error("核销失败"); if (!isset($orderDone['verify_results'][0]['certificate_id'])) return error("核销失败"); $order->status = 2; $order->verify_id = $orderDone['verify_results'][0]['verify_id']; $order->certificate_id = $orderDone['verify_results'][0]['certificate_id']; $order->done_at = getDateFull(); $state = $order->save(); if (!$state) return error("核销失败"); return success("核销成功"); } catch (\Throwable $throwable) { } } }