106 lines
3.7 KiB
PHP
106 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Mini;
|
|
|
|
use App\Exceptions\RepositoryException;
|
|
use App\Models\StatementModel;
|
|
use App\Services\ExportService;
|
|
use App\Services\StatementGenerateService;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Modules\AnnoRoute\Attribute\GetRoute;
|
|
use Modules\AnnoRoute\Attribute\PostRoute;
|
|
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
/**
|
|
* 小程序门店对账单(自助生成 / 查看 / 导出)
|
|
*/
|
|
#[RequestAttribute('/mini', 'mini', authGuard: 'users')]
|
|
class StatementController extends BaseMiniController
|
|
{
|
|
/** 对账单列表(当前门店) */
|
|
#[GetRoute('/statement', authorize: true)]
|
|
public function index(Request $request): JsonResponse
|
|
{
|
|
$user = $this->currentUser($request);
|
|
$store = $this->ensureStoreBound($user);
|
|
|
|
$data = StatementModel::query()
|
|
->where('store_id', $store->id)
|
|
->orderBy('id', 'desc')
|
|
->paginate((int) $request->input('pageSize', 10))
|
|
->toArray();
|
|
|
|
return $this->success($data);
|
|
}
|
|
|
|
/** 生成对账单:快照当前回款周期,settlement_date = period_end + cycle 天 */
|
|
#[PostRoute('/statement/generate', authorize: true)]
|
|
public function generate(Request $request): JsonResponse
|
|
{
|
|
$data = $request->validate([
|
|
'period_start' => 'required|date_format:Y-m-d',
|
|
'period_end' => 'required|date_format:Y-m-d|after_or_equal:period_start',
|
|
], [
|
|
'period_start.required' => '请选择对账周期开始日期',
|
|
'period_start.date_format' => '开始日期格式为 Y-m-d',
|
|
'period_end.required' => '请选择对账周期结束日期',
|
|
'period_end.date_format' => '结束日期格式为 Y-m-d',
|
|
'period_end.after_or_equal' => '结束日期不能早于开始日期',
|
|
]);
|
|
|
|
$user = $this->currentUser($request);
|
|
$store = $this->ensureStoreBound($user);
|
|
|
|
$statement = app(StatementGenerateService::class)->generate(
|
|
$store,
|
|
$data['period_start'],
|
|
$data['period_end'],
|
|
);
|
|
|
|
return $this->success([
|
|
'id' => $statement->id,
|
|
'statement_no' => $statement->statement_no,
|
|
'total_amount' => $statement->total_amount,
|
|
'settlement_date' => $statement->settlement_date?->toDateString(),
|
|
], '对账单已生成');
|
|
}
|
|
|
|
/** 对账单详情(校验归属,含单品对账状态标识) */
|
|
#[GetRoute('/statement/{id}', authorize: true, where: ['id' => '[0-9]+'])]
|
|
public function detail(int $id, Request $request): JsonResponse
|
|
{
|
|
$user = $this->currentUser($request);
|
|
$store = $this->ensureStoreBound($user);
|
|
|
|
$statement = StatementModel::with('items')
|
|
->where('store_id', $store->id)
|
|
->find($id);
|
|
if ($statement === null) {
|
|
throw new RepositoryException('对账单不存在');
|
|
}
|
|
|
|
return $this->success($statement->toArray());
|
|
}
|
|
|
|
/** 导出对账单:?format=xlsx|pdf */
|
|
#[GetRoute('/statement/{id}/export', authorize: true, where: ['id' => '[0-9]+'])]
|
|
public function export(int $id, Request $request): Response
|
|
{
|
|
$user = $this->currentUser($request);
|
|
$store = $this->ensureStoreBound($user);
|
|
|
|
$statement = StatementModel::where('store_id', $store->id)->find($id);
|
|
if ($statement === null) {
|
|
throw new RepositoryException('对账单不存在');
|
|
}
|
|
|
|
return app(ExportService::class)->download(
|
|
'statement',
|
|
$statement,
|
|
(string) $request->query('format', ExportService::FORMAT_XLSX),
|
|
);
|
|
}
|
|
}
|