1、合作商余额查询

2、分油账户司机可用额度
This commit is contained in:
2026-10-20 23:21:10 +08:00
parent 45452c1799
commit fafd3e2c16
134 changed files with 2344 additions and 352 deletions
+12 -6
View File
@@ -153,8 +153,10 @@ class Order extends Controller
*/
public function cancelShare(): Json
{
// 企油通改造:本功能依赖已下线的上游(智慧油客/定聚),现已停用。
return $this->renderError('小程序油品链路已停用');
// 企油通改造:小程序订单的发放/加油/退款统一走 yoshop_partners_order,
// 后台操作接口复用 app/store/controller/partners/Order.php(/partners.order/*),
// 前端订单页传的是商品行上挂的 qyt.order_id。本接口保留仅为兼容老前端。
return $this->renderError('该入口已迁移,请使用 /partners.order/ 下的同名接口');
}
/**
@@ -164,8 +166,10 @@ class Order extends Controller
*/
public function qrCode(): Json
{
// 企油通改造:本功能依赖已下线的上游(智慧油客/定聚),现已停用。
return $this->renderError('小程序油品链路已停用');
// 企油通改造:小程序订单的发放/加油/退款统一走 yoshop_partners_order,
// 后台操作接口复用 app/store/controller/partners/Order.php(/partners.order/*),
// 前端订单页传的是商品行上挂的 qyt.order_id。本接口保留仅为兼容老前端。
return $this->renderError('该入口已迁移,请使用 /partners.order/ 下的同名接口');
}
/**
@@ -250,7 +254,9 @@ class Order extends Controller
*/
public function share(): Json
{
// 企油通改造:本功能依赖已下线的上游(智慧油客/定聚),现已停用。
return $this->renderError('小程序油品链路已停用');
// 企油通改造:小程序订单的发放/加油/退款统一走 yoshop_partners_order,
// 后台操作接口复用 app/store/controller/partners/Order.php(/partners.order/*),
// 前端订单页传的是商品行上挂的 qyt.order_id。本接口保留仅为兼容老前端。
return $this->renderError('该入口已迁移,请使用 /partners.order/ 下的同名接口');
}
}
@@ -13,7 +13,7 @@ declare (strict_types=1);
namespace app\store\controller\partners;
use app\common\service\PartnersBalance;
use app\common\service\MallOil;
use app\common\service\QueueService;
use app\common\model\qyt\Enterprise as EnterpriseModel;
use app\common\service\QytInvoice;
@@ -119,16 +119,10 @@ class Order extends Controller
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('合作商余额不足,请先充值后再重发');
// 发放失败时额度已原路退回,重发需重新扣减:
// 合作商单扣合作商余额,小程序单扣下单用户余额
if (!MallOil::take($order, (float) $order['total_price'])) {
return $this->renderError(MallOil::notEnoughText($order));
}
// 仅允许从「发放失败(3)」重置为「未提交(0)」,避免与「发放中(1)」的单冲突。
// 同时清空编号并把重发次数 +1:企油通按 batch_no 幂等,沿用老批次的话
@@ -148,17 +142,13 @@ class Order extends Controller
'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']
);
// 状态已被其它进程改变 -> 回补刚扣的额度
MallOil::giveBack($order, (float) $order['total_price'], '重发撤销');
return $this->renderError('当前状态不允许重发(仅「发放失败」的订单可重发)');
}
(new QueueService())->push('partners_queue', json_encode(['order_id' => $orderId], 320));
// 小程序单把「重新发放」状态同步回订单商品行,用户端立刻能看到
MallOil::syncGoods($order);
return $this->renderSuccess('已提交重新发放,请稍后刷新查看结果');
}
+70
View File
@@ -21,6 +21,7 @@ use think\facade\Request;
use app\common\model\Goods as GoodsModel;
use app\common\model\Order as OrderModel;
use app\common\service\Order as OrderService;
use app\common\service\QytOil;
use app\common\service\Message as MessageService;
use app\common\service\order\Refund as RefundService;
use app\common\enum\order\OrderStatus as OrderStatusEnum;
@@ -121,6 +122,8 @@ class Order extends OrderModel
})
->order(['order.create_time' => 'desc'])
->paginate(10);
// 给每个油券商品行挂上对应的企油通发放单(后台订单页的企油通列与操作按钮用)
$this->setQytData($list);
// 获取数据列表
return [
'list' => $list,
@@ -128,6 +131,55 @@ class Order extends OrderModel
];
}
/**
* 给订单商品行挂上企油通发放单数据(字段名 qyt)
*
* 小程序订单在支付成功后由 MallOil::create 为每个油券商品行建了一条
* yoshop_partners_order(source='mall',mall_order_goods_id 指回商品行),
* 企油通的发放/加油/退款/发票全挂在那张表上。后台订单页要展示这些信息、
* 并复用 /partners.order/* 的操作接口,所以这里按商品行把发放单带出来。
*
* @param \think\Paginator|\think\Collection $list
*/
public function setQytData($list): void
{
$goodsIds = [];
foreach ($list as $order) {
foreach ($order['goods'] as $goods) {
$goodsIds[] = (int)$goods['order_goods_id'];
}
}
if (!$goodsIds) {
return;
}
$rows = Db::name('partners_order')
->where('source', '=', 'mall')
->whereIn('mall_order_goods_id', $goodsIds)
->select()->toArray();
$map = [];
foreach ($rows as $row) {
// 身份证号脱敏(后台展示层)
$row['id_card_mask'] = QytOil::maskIdCard((string)$row['id_card']);
unset($row['id_card']);
// 前端用的是严格相等(item.oil_status_zsy !== 2),这里显式转型,
// 不依赖 PDO 是否把 int 列取成字符串
foreach (['order_id', 'oil_status', 'oil_status_zsy', 'use_status', 'refund_status',
'used_num', 'oil_callback', 'use_callback', 'qyt_enterprise_id',
'mall_order_id', 'mall_order_goods_id', 'user_id'] as $k) {
$row[$k] = (int)$row[$k];
}
// 剩余可退金额 = 发放金额 - 已加油 - 已退款
$row['remain_amount'] = number_format(max(0, (float)$row['total_price']
- (float)$row['used_amount'] - (float)$row['refund_amount']), 2, '.', '');
$map[(int)$row['mall_order_goods_id']] = $row;
}
foreach ($list as $order) {
foreach ($order['goods'] as $goods) {
$goods['qyt'] = $map[(int)$goods['order_goods_id']] ?? null;
}
}
}
/**
* 订单列表(全部)
@@ -173,6 +225,8 @@ class Order extends OrderModel
'pay_status' => -1, // 支付状态
'oil_status' => -1, // 分油状态
'use_status' => -1, // 使用状态
'oil_status_zsy' => -1, // 企油通发放态 0未提交 1发放中 2成功 3失败
'refund_status' => -1, // 退款状态 0未退款 1退款中 2已退款 3退款失败 4待人工确认
'deliveryType' => -1, // 配送方式
'betweenTime' => [], // 起止时间
'userId' => 0, // 会员ID
@@ -233,6 +287,22 @@ class Order extends OrderModel
->column('order_id'); // 获取所有符合条件的 order_id 数组
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 企油通发放态(挂在 partners_order 上,按 mall_order_id 反查)
if($params['oil_status_zsy'] > -1){
$subQuery = Db::name('partners_order')
->where('source', '=', 'mall')
->where('oil_status_zsy', '=', (int)$params['oil_status_zsy'])
->column('mall_order_id');
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 退款状态(同上)
if($params['refund_status'] > -1){
$subQuery = Db::name('partners_order')
->where('source', '=', 'mall')
->where('refund_status', '=', (int)$params['refund_status'])
->column('mall_order_id');
$filter[] = ['order.order_id', 'in', $subQuery];
}
// 配送方式
$params['deliveryType'] > -1 && $filter[] = ['delivery_type', '=', (int)$params['deliveryType']];
// 用户id
@@ -81,10 +81,13 @@ class Order extends OrderModel
'use_status' => -1, // 加油核销状态
'refund_status' => -1, // 退款状态 0未退款 1退款中 2已退款 3退款失败 4待人工确认
'id_card' => '', // 司机身份证号(从司机管理跳转过来时使用)
'source' => 'partner', // 订单来源 partner=下单平台 mall=小程序商城 all=全部
'betweenTime' => [] // 起止时间
]);
// 检索查询条件
$filter = [];
// 来源:本页只管下单平台的单,小程序单在「订单管理」里看,默认过滤掉
$params['source'] !== 'all' && $filter[] = ['order.source', '=', (string)$params['source']];
// 合作商ID
$params['partners_id'] > 0 && $filter[] = ['order.partners_id', '=', $params['partners_id']];
// 司机手机号
@@ -150,8 +153,9 @@ class Order extends OrderModel
if(!empty($partners)) {
$filter[] = ['partners_id', '=', $partners['partners_id']];
}
// 总销售额
// 总销售额(只统计下单平台的单,小程序单不计入合作商口径)
return $query->where('oil_status_zsy', '=', 2)
->where('source', '=', 'partner')
->where($filter)
->sum('total_price');
}