Files
oil/server-tp6/app/store/controller/partners/Order.php
T

184 lines
6.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// +----------------------------------------------------------------------
// | 后台 · 下单平台(合作商)订单管理
// +----------------------------------------------------------------------
// | 企油通改造后:
// | list() 订单列表(含企油通批次号/运单号/发放态/加油明细)
// | detail() 订单详情 + 加油消费流水
// | share() 重新发放:把订单打回未提交态并重投 partners_queue,由 7.7 下发
// | qrCode() 获取司机免登加油地址(7.15),出参 qrCode 为 H5 URL
// | oilCallback() / useCallback() 重推「发放/加油」结果给下单平台
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\store\controller\partners;
use app\common\service\PartnersBalance;
use app\common\service\QueueService;
use app\common\service\QytOil;
use app\store\controller\Controller;
use app\store\model\order\QrCode as QrCodeModel;
use app\store\model\partners\Order as OrderModel;
use think\facade\Db;
use think\response\Json;
class Order extends Controller
{
/**
* 订单列表
* @return mixed
*/
public function list()
{
$model = new OrderModel;
$list = $model->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('该单尚未发放成功,无法获取加油地址');
}
$h5Url = (new QytOil())->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)」,避免与正在处理的单冲突
$reset = Db::name('partners_order')->where('order_id', $orderId)
->where('oil_status', 0)
->where('oil_status_zsy', 3)
->update(['oil_status_zsy' => 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('已重新推送加油结果');
}
}