Files
oil/server-tp6/app/console/command/CallbackQueue.php
T

411 lines
20 KiB
PHP

<?php
namespace app\console\command;
use app\common\service\QueueService;
use app\console\model\OrderGoods;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use app\store\model\order\Record as RecordModel;
use app\common\service\SybOil;
use think\facade\Db;
class CallbackQueue extends Command
{
protected $queueService;
protected function configure()
{
$this->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;
case "qyt_consume":
// 企油通 7.10 运单加油明细推送(一次可能多条;企油通可能重推 -> 全流程幂等)
foreach ((array)($res['order_list'] ?? []) as $c) {
$code = $c['waybill_no_code'] ?? '';
$order = Db::name('partners_order')->where('waybill_no_code', $code)->find();
if (!$order) {
$SybOil->saveLogStore('企油通消费回调未匹配订单:' . json_encode($c, 320));
continue;
}
$payTime = !empty($c['pay_time']) ? (strtotime($c['pay_time']) ?: time()) : time();
// 落消费流水(uk_consume 去重:重复回调直接忽略)
try {
Db::name('qyt_consume')->insert([
'order_id' => $order['order_id'],
'waybill_no' => $c['waybill_no'] ?? '',
'waybill_no_code' => $code,
'order_code' => $c['order_code'] ?? '',
'station_code' => $c['station_code'] ?? '',
'station_name' => $c['station_name'] ?? '',
'oil_name' => $c['oil_name'] ?? '',
'litter' => $c['litter'] ?? '',
'oil_price' => (int)($c['oil_price'] ?? 0),
'actual_oil_price' => (int)($c['actual_oil_price'] ?? 0),
'pay_fee' => (int)($c['pay_fee'] ?? 0),
'consume_amount' => (int)($c['consume_amount'] ?? 0),
'pay_time' => $payTime,
'raw' => json_encode($c, 320),
'store_id' => $order['store_id'],
'create_time' => time(),
]);
} catch (\Exception $e) {
if (strpos($e->getMessage(), 'Duplicate') === false) {
throw $e;
}
$SybOil->saveLogStore('企油通消费回调重复,忽略流水:' . $code . '/' . ($c['order_code'] ?? ''));
}
// 条件跃迁 use_status 0 -> 1(要求已发放),仅胜出者通知下单平台
$affected = Db::name('partners_order')->where('order_id', $order['order_id'])
->where('use_status', 0)
->where('oil_status', 1)
->update([
'use_status' => 1,
'use_time' => time(),
'use_text' => '加油',
'qyt_order_code' => $c['order_code'] ?? '',
'shareNo' => $c['order_code'] ?: $order['shareNo'],
'station_name' => $c['station_name'] ?? '',
'oil_name' => $c['oil_name'] ?? '',
'litter' => $c['litter'] ?? '',
'pay_fee' => (int)($c['pay_fee'] ?? 0),
'consume_time' => $payTime,
'update_time' => time(),
]);
if ($affected) {
$queueService = new QueueService();
$queueService->push('notify_queue', json_encode([
'order_id' => $order['order_id'],
'optType' => 'add_oil',
'retry_count' => 0,
], 320));
$SybOil->saveLogStore('企油通消费回调处理成功:' . json_encode($c, 320));
}
}
break;
default:
$SybOil->saveLogStore('队列数据处理异常,未知:【'.$message.'】');
}
} catch (\Exception $e) {
$SybOil->saveLogStore(
'队列回调处理异常:' . $e->getMessage() .
' 在文件:' . $e->getFile() .
' 第:' . $e->getLine() .
' 行。堆栈跟踪:' . $e->getTraceAsString()
);
}
}
}