Files
lgp-admin-plus-api/app/Service/wx/WxOrderService.php
LQ bcf54c2727 初始化
缺陷:主题配色需要优化整体的同风格
2026-08-14 23:21:21 +08:00

113 lines
3.7 KiB
PHP
Raw Permalink 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
namespace App\Service\wx;
use App\BaseApp\BaseWxService;
use App\Models\business\OrderModel;
use App\Models\business\WxUserModel;
use App\Service\business\OrderCoreService;
use App\Service\business\PriceService;
/**
* 小程序订单:用户自己从清单下单、看订单、传凭证或调起微信支付
*/
class WxOrderService extends BaseWxService
{
/**
* 我的订单,可按状态筛
*
* 金额 text 必须在这里补OrderCoreService::detail 才格式化金额list 只走 paginate
* 而小程序订单列表卡片直接渲染 total_amount_text不补就会出现 ¥0。
*/
public function list(): array
{
$status = request()->get('status');
$result = OrderModel::with([
'items' => fn ($query) => $query->where('deleted_at', 0),
])->where('user_id', $this->userId)
->where('deleted_at', 0)
->when($status !== null && $status !== '', fn ($query) => $query->where('status', (int) $status))
->orderBy('id', 'desc')
->paginate((int) request()->get('pageSize', 10))
->toArray();
// 复用后台同款格式化,保证两端金额展示一致
$price = PriceService::getInstance();
foreach ($result['data'] as &$item) {
$item['total_amount_text'] = $price->centsToYuan((int) ($item['total_amount'] ?? 0));
$item['paid_amount_text'] = $price->centsToYuan((int) ($item['paid_amount'] ?? 0));
}
unset($item);
return [
'page' => $result['current_page'],
'size' => $result['per_page'],
'page_count' => $result['last_page'],
'total' => $result['total'],
'items' => $result['data'],
];
}
public function detail(int $id): array
{
$order = OrderCoreService::getInstance()->detail($id);
if ((int) $order['user_id'] !== $this->userId) {
$this->utils->errorThrow('无权查看该订单');
}
return $order;
}
/**
* 清单转订单
*/
public function createFromList(array $params): array
{
$listId = (int) ($params['list_id'] ?? 0);
if ($listId <= 0) {
$this->utils->errorThrow('请选择清单');
}
return OrderCoreService::getInstance()->createFromList($listId, $this->userId, $params);
}
/**
* 上传转账凭证
*/
public function submitVoucher(array $params): array
{
$orderId = (int) ($params['order_id'] ?? 0);
return OrderCoreService::getInstance()->submitVoucher($orderId, $params, $this->userId);
}
/**
* 调起微信支付
*/
public function wechatPay(array $params): array
{
$orderId = (int) ($params['order_id'] ?? 0);
$order = $this->detail($orderId);
$user = WxUserModel::where('id', $this->userId)->first(['open_id']);
if (empty($user['open_id'])) {
$this->utils->errorThrow('缺少 openid请重新登录');
}
OrderModel::where('id', $orderId)->update([
'pay_type' => OrderModel::PAY_TYPE_WECHAT,
'updated_at' => time(),
]);
return WxPayService::getInstance()->jsapiOrder($order, (string) $user['open_id']);
}
/**
* 取消订单(仅未付款可取消)
*/
public function cancel(int $id): array
{
return OrderCoreService::getInstance()->transition($id, OrderModel::STATUS_CANCELLED, $this->userId);
}
/**
* 确认收货
*/
public function complete(int $id): array
{
return OrderCoreService::getInstance()->transition($id, OrderModel::STATUS_DONE, $this->userId);
}
}