|
|
@@ -69,15 +69,69 @@ class AgentEquityService
|
|
|
|
|
|
public function cancel(Agent $agent, int $orderId): AgentEquityOrder
|
|
|
{
|
|
|
- return DB::transaction(function () use ($agent, $orderId) {
|
|
|
- $order = AgentEquityOrder::query()->where('agent_id', $agent->id)->lockForUpdate()->findOrFail($orderId);
|
|
|
+ return $this->cancelOrder(fn ($query) => $query->where('agent_id', $agent->id), $orderId, null, '');
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 总后台取消待付款订单(如代理长期不充值),需填写原因。 */
|
|
|
+ public function adminCancel(int $orderId, int $adminId, string $remark): AgentEquityOrder
|
|
|
+ {
|
|
|
+ $remark = trim($remark);
|
|
|
+ if ($remark === '') throw new \InvalidArgumentException('请填写取消原因');
|
|
|
+ return $this->cancelOrder(fn ($query) => $query, $orderId, $adminId, $remark);
|
|
|
+ }
|
|
|
+
|
|
|
+ private function cancelOrder(callable $scope, int $orderId, ?int $adminId, string $remark): AgentEquityOrder
|
|
|
+ {
|
|
|
+ return DB::transaction(function () use ($scope, $orderId, $adminId, $remark) {
|
|
|
+ $order = $scope(AgentEquityOrder::query())->lockForUpdate()->findOrFail($orderId);
|
|
|
if ($order->status !== AgentEquityOrder::STATUS_PENDING) throw new \RuntimeException('只有待付款订单可以取消');
|
|
|
$order->status = AgentEquityOrder::STATUS_CANCELLED;
|
|
|
+ $order->cancelled_by = $adminId;
|
|
|
+ $order->cancel_remark = $remark;
|
|
|
$order->save();
|
|
|
return $order;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 总后台:全部代理的入股购买记录。summary 按当前筛选条件汇总:
|
|
|
+ * 已开通的比例和金额、待付款笔数和金额。
|
|
|
+ */
|
|
|
+ public function paginate(array $params): array
|
|
|
+ {
|
|
|
+ $page = max(1, (int) ($params['page'] ?? 1));
|
|
|
+ $limit = min(100, max(1, (int) ($params['limit'] ?? 20)));
|
|
|
+ $query = AgentEquityOrder::query();
|
|
|
+ if (!empty($params['agent_id'])) $query->where('agent_id', (int) $params['agent_id']);
|
|
|
+ if (!empty($params['username'])) {
|
|
|
+ $query->whereIn('agent_id', Agent::query()->where('username', 'like', '%' . $params['username'] . '%')->select('id'));
|
|
|
+ }
|
|
|
+ if (!empty($params['order_no'])) $query->where('order_no', $params['order_no']);
|
|
|
+ if (!empty($params['status'])) $query->where('status', $params['status']);
|
|
|
+ $dateColumn = ($params['date_type'] ?? '') === 'completed_at' ? 'completed_at' : 'created_at';
|
|
|
+ if (!empty($params['start_date'])) $query->where($dateColumn, '>=', $params['start_date'] . ' 00:00:00');
|
|
|
+ if (!empty($params['end_date'])) $query->where($dateColumn, '<=', $params['end_date'] . ' 23:59:59');
|
|
|
+
|
|
|
+ $sums = (clone $query)->selectRaw(
|
|
|
+ 'COALESCE(SUM(CASE WHEN status = ? THEN percent ELSE 0 END), 0) AS completed_percent, '
|
|
|
+ . 'COALESCE(SUM(CASE WHEN status = ? THEN amount ELSE 0 END), 0) AS completed_amount, '
|
|
|
+ . 'COALESCE(SUM(CASE WHEN status = ? THEN 1 ELSE 0 END), 0) AS pending_count, '
|
|
|
+ . 'COALESCE(SUM(CASE WHEN status = ? THEN amount ELSE 0 END), 0) AS pending_amount',
|
|
|
+ [AgentEquityOrder::STATUS_COMPLETED, AgentEquityOrder::STATUS_COMPLETED, AgentEquityOrder::STATUS_PENDING, AgentEquityOrder::STATUS_PENDING]
|
|
|
+ )->first();
|
|
|
+ $total = (clone $query)->count();
|
|
|
+ $list = $query->with('agent:id,username,real_name,type,equity_percent,balance')->orderByDesc('id')->forPage($page, $limit)->get();
|
|
|
+ $summary = [
|
|
|
+ 'completed_percent' => bcadd((string) $sums->completed_percent, '0', 4),
|
|
|
+ 'completed_amount' => bcadd((string) $sums->completed_amount, '0', 4),
|
|
|
+ 'pending_count' => (int) $sums->pending_count,
|
|
|
+ 'pending_amount' => bcadd((string) $sums->pending_amount, '0', 4),
|
|
|
+ // 全平台入股代理当前持股合计(不受筛选影响)
|
|
|
+ 'total_equity_percent' => bcadd((string) Agent::query()->where('type', Agent::TYPE_EQUITY)->sum('equity_percent'), '0', 4),
|
|
|
+ ];
|
|
|
+ return compact('total', 'page', 'limit', 'list', 'summary');
|
|
|
+ }
|
|
|
+
|
|
|
/** 余额足够时完成待付款订单(下单后、充值到账后调用)。 */
|
|
|
public function fulfillPending(int $agentId): int
|
|
|
{
|