小程序接口
This commit is contained in:
@@ -16,24 +16,70 @@ use Modules\AnnoRoute\Attribute\RequestAttribute;
|
||||
#[RequestAttribute('/mini', 'mini', authGuard: 'users')]
|
||||
class BillController extends BaseMiniController
|
||||
{
|
||||
/** 账单列表:当前门店强制过滤,?status= 按支付状态筛选(0未支付 1已支付) */
|
||||
/**
|
||||
* 账单列表:当前门店强制过滤
|
||||
* ?status= 支付状态(0未支付 1已支付);?payable=1 仅可发起付款(未支付且未在审核中,供合并付款选择页);
|
||||
* ?start_date=&end_date= 账单日期区间;?page=&pageSize= 分页(pageSize 上限 50)
|
||||
* 响应附加 summary:待支付笔数/金额(仅按门店口径,不受列表筛选影响)
|
||||
*/
|
||||
#[GetRoute('/bill', authorize: true)]
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$params = $request->validate([
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
'payable' => 'nullable|boolean',
|
||||
'start_date' => 'nullable|date_format:Y-m-d',
|
||||
'end_date' => 'nullable|date_format:Y-m-d|after_or_equal:start_date',
|
||||
'page' => 'nullable|integer|min:1',
|
||||
'pageSize' => 'nullable|integer|min:1|max:50',
|
||||
], [
|
||||
'status.in' => '支付状态不正确',
|
||||
'start_date.date_format' => '开始日期格式为 Y-m-d',
|
||||
'end_date.date_format' => '结束日期格式为 Y-m-d',
|
||||
'end_date.after_or_equal' => '结束日期不能早于开始日期',
|
||||
'pageSize.max' => '每页数量最大 50',
|
||||
]);
|
||||
|
||||
$user = $this->currentUser($request);
|
||||
$store = $this->ensureStoreBound($user);
|
||||
|
||||
$query = BillModel::query()
|
||||
->where('store_id', $store->id)
|
||||
->with('purchase:id,purchase_no,purchase_date');
|
||||
if ($request->filled('status')) {
|
||||
$query->where('status', (int) $request->input('status'));
|
||||
if (isset($params['status'])) {
|
||||
$query->where('status', (int) $params['status']);
|
||||
}
|
||||
if ($request->boolean('payable')) {
|
||||
$query->where('status', BillModel::STATUS_UNPAID)->where('payment_id', 0);
|
||||
}
|
||||
if (! empty($params['start_date'])) {
|
||||
$query->whereDate('bill_date', '>=', $params['start_date']);
|
||||
}
|
||||
if (! empty($params['end_date'])) {
|
||||
$query->whereDate('bill_date', '<=', $params['end_date']);
|
||||
}
|
||||
|
||||
$data = $query->orderBy('bill_date', 'desc')
|
||||
$paginator = $query->orderBy('bill_date', 'desc')
|
||||
->orderBy('id', 'desc')
|
||||
->paginate((int) $request->input('pageSize', 10))
|
||||
->toArray();
|
||||
->paginate((int) ($params['pageSize'] ?? 10));
|
||||
|
||||
$cycleDays = (int) $store->payment_cycle_days;
|
||||
$paginator->getCollection()->transform(
|
||||
fn (BillModel $bill): array => $this->formatBill($bill, $cycleDays)
|
||||
);
|
||||
|
||||
// 待支付汇总(合并付款入口的头部统计)
|
||||
$unpaid = BillModel::query()
|
||||
->where('store_id', $store->id)
|
||||
->where('status', BillModel::STATUS_UNPAID)
|
||||
->selectRaw('COUNT(*) as aggregate_count, COALESCE(SUM(total_amount), 0) as aggregate_amount')
|
||||
->first();
|
||||
|
||||
$data = $paginator->toArray();
|
||||
$data['summary'] = [
|
||||
'unpaid_count' => (int) $unpaid->aggregate_count,
|
||||
'unpaid_amount' => bcadd((string) $unpaid->aggregate_amount, '0', 2),
|
||||
];
|
||||
|
||||
return $this->success($data);
|
||||
}
|
||||
@@ -58,9 +104,48 @@ class BillController extends BaseMiniController
|
||||
->toArray();
|
||||
|
||||
return $this->success([
|
||||
'bill' => $bill->toArray(),
|
||||
'bill' => $this->formatBill($bill, (int) $store->payment_cycle_days),
|
||||
'items' => app(BillDetailService::class)->mergedItems($bill),
|
||||
'orders' => $orders,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 账单输出格式化(列表行与详情共用)
|
||||
* 推导支付进度(待支付/审核中/已支付),按门店回款周期计算应结算日期;
|
||||
* 剔除收款操作人等后台字段
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
private function formatBill(BillModel $bill, int $cycleDays): array
|
||||
{
|
||||
$payState = $bill->payState();
|
||||
|
||||
return [
|
||||
'id' => $bill->id,
|
||||
'bill_no' => $bill->bill_no,
|
||||
'bill_date' => $bill->bill_date->toDateString(),
|
||||
'purchase_id' => $bill->purchase_id,
|
||||
'purchase' => $bill->purchase?->toArray(),
|
||||
'product_amount' => $bill->product_amount,
|
||||
'delivery_fee' => $bill->delivery_fee,
|
||||
'box_num' => $bill->box_num,
|
||||
'tray_num' => $bill->tray_num,
|
||||
'box_price' => $bill->box_price,
|
||||
'tray_price' => $bill->tray_price,
|
||||
'added_amount' => $bill->added_amount,
|
||||
'total_amount' => $bill->total_amount,
|
||||
'status' => $bill->status,
|
||||
'status_name' => BillModel::STATUS_NAMES[$bill->status] ?? '',
|
||||
'pay_state' => $payState,
|
||||
'pay_state_name' => BillModel::PAY_STATE_NAMES[$payState],
|
||||
'can_pay' => $payState === BillModel::PAY_STATE_UNPAID,
|
||||
'payment_id' => $bill->payment_id,
|
||||
'settlement_date' => $bill->bill_date->copy()->addDays($cycleDays)->toDateString(),
|
||||
'paid_at' => $bill->paid_at?->toDateTimeString(),
|
||||
'pay_remark' => $bill->pay_remark,
|
||||
'remark' => $bill->remark,
|
||||
'created_at' => $bill->created_at?->toDateTimeString(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,24 +128,81 @@ class OrderController extends BaseMiniController
|
||||
], '下单成功');
|
||||
}
|
||||
|
||||
/** 历史订单:当前门店强制过滤,?status=&page=&pageSize= */
|
||||
/**
|
||||
* 历史订单:当前门店强制过滤
|
||||
* ?status= 状态筛选;?start_date=&end_date= 订货日期区间(配合 /order/summary 周期下钻);
|
||||
* ?page=&pageSize= 分页(pageSize 上限 50)
|
||||
* 行数据附带 status_name / can_cancel / 商品预览(前 3 条明细)/ item_count,完整明细走详情接口
|
||||
*/
|
||||
#[GetRoute('/order', authorize: true)]
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$params = $request->validate([
|
||||
'status' => 'nullable|integer|in:0,1,2,3,4,9',
|
||||
'start_date' => 'nullable|date_format:Y-m-d',
|
||||
'end_date' => 'nullable|date_format:Y-m-d|after_or_equal:start_date',
|
||||
'page' => 'nullable|integer|min:1',
|
||||
'pageSize' => 'nullable|integer|min:1|max:50',
|
||||
], [
|
||||
'status.in' => '订单状态不正确',
|
||||
'start_date.date_format' => '开始日期格式为 Y-m-d',
|
||||
'end_date.date_format' => '结束日期格式为 Y-m-d',
|
||||
'end_date.after_or_equal' => '结束日期不能早于开始日期',
|
||||
'pageSize.max' => '每页数量最大 50',
|
||||
]);
|
||||
|
||||
$user = $this->currentUser($request);
|
||||
$store = $this->ensureStoreBound($user);
|
||||
|
||||
$query = StoreOrderModel::query()->where('store_id', $store->id);
|
||||
if ($request->filled('status')) {
|
||||
$query->where('status', (int) $request->input('status'));
|
||||
$query = StoreOrderModel::query()
|
||||
->where('store_id', $store->id)
|
||||
->select([
|
||||
'id', 'order_no', 'order_date', 'total_quantity', 'total_weight',
|
||||
'total_amount', 'status', 'remark', 'purchase_id', 'bill_id', 'created_at',
|
||||
])
|
||||
->with(['items' => static fn ($itemsQuery) => $itemsQuery
|
||||
->select(['id', 'order_id', 'product_name', 'quantity', 'unit'])
|
||||
->orderBy('id')]);
|
||||
if (isset($params['status'])) {
|
||||
$query->where('status', (int) $params['status']);
|
||||
}
|
||||
if (! empty($params['start_date'])) {
|
||||
$query->whereDate('order_date', '>=', $params['start_date']);
|
||||
}
|
||||
if (! empty($params['end_date'])) {
|
||||
$query->whereDate('order_date', '<=', $params['end_date']);
|
||||
}
|
||||
|
||||
$data = $query->orderBy('order_date', 'desc')
|
||||
$paginator = $query->orderBy('order_date', 'desc')
|
||||
->orderBy('id', 'desc')
|
||||
->paginate((int) $request->input('pageSize', 10))
|
||||
->toArray();
|
||||
->paginate((int) ($params['pageSize'] ?? 10));
|
||||
|
||||
return $this->success($data);
|
||||
$paginator->getCollection()->transform(
|
||||
static fn (StoreOrderModel $order): array => [
|
||||
'id' => $order->id,
|
||||
'order_no' => $order->order_no,
|
||||
'order_date' => $order->order_date->toDateString(),
|
||||
'status' => $order->status,
|
||||
'status_name' => StoreOrderModel::STATUS_NAMES[$order->status] ?? '',
|
||||
'can_cancel' => $order->status === StoreOrderModel::STATUS_PENDING,
|
||||
'total_quantity' => $order->total_quantity,
|
||||
'total_weight' => $order->total_weight,
|
||||
'total_amount' => $order->total_amount,
|
||||
'remark' => $order->remark,
|
||||
'purchase_id' => $order->purchase_id,
|
||||
'bill_id' => $order->bill_id,
|
||||
'created_at' => $order->created_at?->toDateTimeString(),
|
||||
'item_count' => $order->items->count(),
|
||||
'items' => $order->items->take(3)
|
||||
->map(static fn (StoreOrderItemModel $item): array => [
|
||||
'product_name' => $item->product_name,
|
||||
'quantity' => $item->quantity,
|
||||
'unit' => $item->unit,
|
||||
])->values()->all(),
|
||||
]
|
||||
);
|
||||
|
||||
return $this->success($paginator->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user