getList($this->request->param()); return $this->renderSuccess($list); } /** * 订单详情(含企油通加油消费流水) * @return Json */ public function detail(): Json { $orderId = (int) $this->request->param('orderId'); $order = OrderModel::detail($orderId); if (!$order) { return $this->renderError('订单不存在'); } $consume = Db::name('qyt_consume') ->where('order_id', $orderId) ->order('id', 'desc') ->select() ->toArray(); return $this->renderSuccess(['order' => $order, 'consume' => $consume]); } /** * 获取司机免登加油地址(企油通 7.15) * @return Json */ public function qrCode(): Json { $orderId = (int) $this->request->param('orderId'); $order = OrderModel::detail($orderId); if (!$order) { return $this->renderError('订单不存在'); } if ($order['use_status'] != 0) { return $this->renderError('该单已加油核销'); } if ($order['oil_status'] != 1) { return $this->renderError('该单尚未发放成功,无法获取加油地址'); } // 免登链接要带本单企业的 creditcode(营业执照号),把登录固定到该企业 $enterprise = EnterpriseModel::detail((int) $order['qyt_enterprise_id']); if (!$enterprise) { return $this->renderError('本单绑定的企油通企业不存在,无法生成加油地址'); } if ($enterprise['status'] !== 'approved') { return $this->renderError('企业「' . $enterprise['company_name'] . '」尚未通过企油通审核,无法生成加油地址'); } $h5Url = QytOil::forEnterprise($enterprise)->h5Url((string) $order['mobile']); if (!$h5Url) { return $this->renderError('生成加油地址失败,请检查企油通配置'); } // 留痕 (new QrCodeModel())->add([ 'oilCardNo' => $order['oilCardNo'], 'qrCode' => $h5Url, 'amount' => $order['goods_price'], 'order_id' => $order['order_id'], 'user_id' => 0, 'store_id' => $order['store_id'], ]); return $this->renderSuccess(['qrCode' => $h5Url], '获取成功'); } /** * 重新发放(把订单打回未提交态并重投队列,由 partners:queue 调用企油通 7.7) * @return Json */ public function share(): Json { $orderId = (int) $this->request->param('orderId'); $order = OrderModel::detail($orderId); if (!$order) { return $this->renderError('订单不存在'); } if ($order['oil_status'] == 1) { return $this->renderError('该单已发放成功,无需重发'); } if ($order['use_status'] != 0) { return $this->renderError('该单已加油核销,不可重发'); } // 发放失败时余额已回补,重发需重新扣减合作商余额 $logId = PartnersBalance::deduct( (int) $order['partners_id'], (float) $order['total_price'], (string) $order['partners_order_no'], $orderId, (int) $order['store_id'] ); if ($logId === false) { return $this->renderError('合作商余额不足,请先充值后再重发'); } // 仅允许从「发放失败(3)」重置为「未提交(0)」,避免与「发放中(1)」的单冲突。 // 同时清空编号并把重发次数 +1:企油通按 batch_no 幂等,沿用老批次的话 // 7.8 会一直返回那条旧的失败记录,重发永远不可能成功。 $reset = Db::name('partners_order')->where('order_id', $orderId) ->where('oil_status', 0) ->where('oil_status_zsy', 3) ->update([ 'oil_status_zsy' => 0, 'batch_no' => '', 'waybill_no' => '', 'waybill_no_code' => '', 'qyt_retry_num' => Db::raw('qyt_retry_num + 1'), 'qyt_query_time' => 0, 'qyt_query_num' => 0, 'oil_text' => '后台重新发放', 'update_time' => time(), ]); if (!$reset) { // 状态已被其它进程改变 -> 回补刚扣的余额 PartnersBalance::refund( (int) $order['partners_id'], (float) $order['total_price'], (string) $order['partners_order_no'], $orderId, (int) $order['store_id'] ); return $this->renderError('当前状态不允许重发(仅「发放失败」的订单可重发)'); } (new QueueService())->push('partners_queue', json_encode(['order_id' => $orderId], 320)); return $this->renderSuccess('已提交重新发放,请稍后刷新查看结果'); } /** * 重推「发放结果」给下单平台 * @return Json */ public function oilCallback(): Json { $orderId = (int) $this->request->param('orderId'); $order = OrderModel::detail($orderId); if (!$order) { return $this->renderError('订单不存在'); } if ($order['oil_status'] != 1) { return $this->renderError('该单未发放成功,无可回调内容'); } (new QueueService())->push('notify_queue', json_encode([ 'order_id' => $orderId, 'type' => 'add', 'optType' => 'share_oil', 'retry_count' => 0, ], 320)); return $this->renderSuccess('已重新推送发放结果'); } /** * 重推「加油核销」结果给下单平台 * @return Json */ public function useCallback(): Json { $orderId = (int) $this->request->param('orderId'); $order = OrderModel::detail($orderId); if (!$order) { return $this->renderError('订单不存在'); } if ($order['use_status'] != 1) { return $this->renderError('该单未加油核销,无可回调内容'); } (new QueueService())->push('notify_queue', json_encode([ 'order_id' => $orderId, 'type' => 'sub', 'optType' => 'add_oil', 'retry_count' => 0, ], 320)); return $this->renderSuccess('已重新推送加油结果'); } }