setName('callback:queue') ->setDescription('Process messages from the Redis queue'); } protected function execute(Input $input, Output $output) { $this->queueService = new QueueService(); while (true) { $message = $this->queueService->pop('callback_queue'); if ($message) { // 处理消息 $this->processMessage($message); } else { // 暂停一段时间再检查队列 sleep(1); } } } // protected function processMessage($message) // { // $SybOil = new SybOil(); // $SybOil->saveLogStore('callback_queue队列数据处理:【'.$message.'】'); // // 拿到队列数据处理 // $data = json_decode($message, true); // // 检查解码是否成功 // if ($data === false) { // $SybOil->saveLogStore('callback_queue队列数据解码失败:' . json_last_error_msg()); // return; // } // // 确保 $data 中包含 header 和 res // if (!isset($data['header']) || !isset($data['res'])) { // $SybOil->saveLogStore('数据格式不正确:【' . $message . '】'); // return; // } // $headers = $data['header']; // $res = $data['res']; // // 此处可以根据业务逻辑处理接收到的数据 // try { // switch ($headers['method']) { // case "syb.notify.pay.result": // // 二维码交易结果通知 // if($res['oilCardType'] == 'card') { // $where = array( // ['oilCardNo', '=', $res['oilCardNo']], // ['goods_price', '=', $res['amount']], // ); // }else{ // $where = array( // ['shareNo', '=', $res['shareNo']], // ['goods_price', '=', $res['amount']], // ); // } // $orderGoods = Db::name('order_goods') // ->where($where) // ->find(); // if($orderGoods['order_goods_id']) { // $field['qrCode'] = $res['qrCode']; // if ($res['status'] == 'success') { // $field['use_status'] = 1; // } else { // $field['use_text'] = $res['errMessage']; // } // // 更新用户使用状态 // Db::name('order_goods') // ->where('order_goods_id', $orderGoods['order_goods_id']) // ->update($field); // }else{ // $SybOil->saveLogStore('未找到订单信息:【'.$message.'】'); // } // break; // case "syb.notify.oilCard.change": // // 油卡变动通知 // $where = array( // ['oilCardNo', '=', $res['oilCardNo']], // ['goods_price', '=', $res['amount']], // ); // $orderGoods = Db::name('order_goods') // ->where($where) // ->find(); // $res['order_id'] = $orderGoods['order_id']; // $res['order_goods_id'] = $orderGoods['order_goods_id']; // $res['user_id'] = $orderGoods['user_id']; // $res['store_id'] = $orderGoods['store_id']; // $RecordModel = new RecordModel(); // // 油卡变动记录写入结果 // $RecordModel->add($res); // // 更新油券使用状态 // if($orderGoods['order_goods_id'] && $res['optType'] == 'add_oil'){ // Db::name('order_goods') // ->where('order_goods_id', $orderGoods['order_goods_id']) // ->update(array( // 'use_status' => 1, // 'use_time' => time(), // 'use_text' => '加油', // )); // // 修改主订单为已完成 // Db::name('order') // ->where('order_id', $orderGoods['order_id']) // ->update(array( // 'order_status' => 30 // )); // // 更新用户使用状态 // Db::name('account') // ->where('account_id', $orderGoods['account_id']) // ->update(['last_called_at' => time(), 'state' => 0]); // $SybOil->saveLogStore('加油回调处理成功了:'.json_encode($res)); // }else{ // $SybOil->saveLogStore('没有处理结果:【'.$message.'】'); // } // break; // case "syb.notify.oilCard.share": // // 分油结果通知 // if($res['oilCardType'] == 'card') { // $where = array( // ['oilCardNo', '=', $res['oilCardNo']], // ['goods_price', '=', $res['amount']], // ); // }else{ // $where = array( // ['shareNo', '=', $res['shareNo']], // ['goods_price', '=', $res['amount']], // ); // } // $orderGoods = Db::name('order_goods') // ->where($where) // ->find(); // if($orderGoods['order_goods_id']) { // $field = ['oil_time' => time()]; // if ($res['status'] == 'success') { // $field['oil_status'] = 1; // } else { // $field['oil_status'] = 0; // $field['oil_text'] = $res['msg']; // } // Db::name('order_goods') // ->where('order_goods_id', $orderGoods['order_goods_id']) // ->update($field); // // $SybOil->saveLogStore('分油回调处理成功了:'.json_encode($res)); // }else{ // $this->queueService->push('callback_queue', json_encode(['header'=>$headers,'res'=>$res],320)); // $SybOil->saveLogStore('重新加入队列:【'.$message.'】'); // } // break; // default: // $SybOil->saveLogStore('队列数据处理异常,未知:【'.$message.'】'); // } // } catch (\Exception $e) { // $SybOil->saveLogStore( // '队列回调处理异常:' . $e->getMessage() . // ' 在文件:' . $e->getFile() . // ' 第:' . $e->getLine() . // ' 行。堆栈跟踪:' . $e->getTraceAsString() // ); // // } // } protected function processMessage($message) { $SybOil = new SybOil(); $SybOil->saveLogStore('callback_queue队列数据处理:【'.$message.'】'); // 拿到队列数据处理 $data = json_decode($message, true); // 检查解码是否成功 if ($data === false) { $SybOil->saveLogStore('callback_queue队列数据解码失败:' . json_last_error_msg()); return; } // 确保 $data 中包含 header 和 res if (!isset($data['header']) || !isset($data['res'])) { $SybOil->saveLogStore('数据格式不正确:【' . $message . '】'); return; } $headers = $data['header']; $res = $data['res']; // 此处可以根据业务逻辑处理接收到的数据 try { switch ($headers['method']) { case "use": // 油卡变动通知 $where = array( ['shareNo', '=', $res['trade_no']], ); $orderGoods = Db::name('order_goods') ->where($where) ->find(); $res['order_id'] = $orderGoods['order_id']; $res['order_goods_id'] = $orderGoods['order_goods_id']; $res['user_id'] = $orderGoods['user_id']; $res['store_id'] = $orderGoods['store_id']; $res['optType'] = 'add_oil'; $RecordModel = new RecordModel(); // 油卡变动记录写入结果 $RecordModel->add($res); // 更新油券使用状态 if($orderGoods['order_goods_id'] && $res['useStatus'] == '2'){ Db::name('order_goods') ->where('order_goods_id', $orderGoods['order_goods_id']) ->update(array( 'use_status' => 1, 'use_time' => time(), 'use_text' => '加油', )); // 订单下的券都已使用 if(Db::name('order_goods')->where([['order_id' , '=', $orderGoods['order_id']], ['use_status', '=', '0']])->count() == 0) { // 修改主订单为已完成 Db::name('order') ->where('order_id', $orderGoods['order_id']) ->update(array( 'order_status' => 30 )); } // 更新用户使用状态 Db::name('account') ->where('account_id', $orderGoods['account_id']) ->update(['last_called_at' => time(), 'state' => 0]); $SybOil->saveLogStore('加油回调处理成功了:'.json_encode($res)); }else{ $SybOil->saveLogStore('没有处理结果:【'.$message.'】'); } break; case "oil": // 分油结果通知 $where = array( ['shareNo', '=', $res['trade_no']], ); $orderGoods = Db::name('order_goods') ->where($where) ->find(); if($orderGoods['order_goods_id'] && $res['useStatus'] == '1') { $field = ['oil_time' => time()]; $field['oil_status'] = 1; $field['qrCode'] = $res['useUrl'] ?? ''; Db::name('order_goods') ->where('order_goods_id', $orderGoods['order_goods_id']) ->update($field); $SybOil->saveLogStore('分油回调处理成功了:'.json_encode($res)); }else{ // $this->queueService->push('callback_queue', json_encode(['header'=>$headers,'res'=>$res],320)); // $SybOil->saveLogStore('重新加入队列:【'.$message.'】'); } break; case "use_partners": // 油卡变动通知 $where = array( ['shareNo', '=', $res['trade_no']], ); $order = Db::name('partners_order') ->where($where) ->find(); $res['order_id'] = $order['order_id']; $res['order_goods_id'] = $order['goods_id']; $res['user_id'] = 0; $res['store_id'] = $order['store_id']; $res['optType'] = 'add_oil'; $RecordModel = new RecordModel(); // 油卡变动记录写入结果 $RecordModel->add($res); // 更新油券使用状态 if($order['order_id'] && $res['useStatus'] == '2'){ Db::name('partners_order') ->where('order_id', $order['order_id']) ->update(array( 'use_status' => 1, 'use_time' => time(), 'use_text' => '加油', )); $SybOil->saveLogStore('加油回调处理成功了:'.json_encode($res)); // 通知对接公司 $queueService = new QueueService(); $queueService->push('notify_queue', json_encode([ 'order_id' => $order['order_id'], 'optType' => 'add_oil', 'retry_count' => 0, ], 320)); }else{ $SybOil->saveLogStore('没有处理结果:【'.$message.'】'); } break; case "oil_partners": // 分油结果通知 $where = array( ['shareNo', '=', $res['trade_no']], ); $order = Db::name('partners_order') ->where($where) ->find(); if($order['order_id'] && $res['useStatus'] == '1') { $field = ['oil_time' => time()]; $field['oil_status'] = 1; $field['qrCode'] = $res['useUrl'] ?? ''; Db::name('partners_order') ->where('order_id', $order['order_id']) ->update($field); $SybOil->saveLogStore('分油回调处理成功了:'.json_encode($res)); // 通知对接公司 $queueService = new QueueService(); $queueService->push('notify_queue', json_encode([ 'order_id' => $order['order_id'], 'optType' => 'share_oil', 'retry_count' => 0, ], 320)); }else{ // $this->queueService->push('callback_queue', json_encode(['header'=>$headers,'res'=>$res],320)); // $SybOil->saveLogStore('重新加入队列:【'.$message.'】'); } break; default: $SybOil->saveLogStore('队列数据处理异常,未知:【'.$message.'】'); } } catch (\Exception $e) { $SybOil->saveLogStore( '队列回调处理异常:' . $e->getMessage() . ' 在文件:' . $e->getFile() . ' 第:' . $e->getLine() . ' 行。堆栈跟踪:' . $e->getTraceAsString() ); } } }