CaiWuXiTong/app/Http/Controllers/Banking/MarketingTaobaoAlipayBills.php

280 lines
8.8 KiB
PHP

<?php
namespace App\Http\Controllers\Banking;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Banking\MarketingTaobaoAlipayBill as Request;
use App\Models\Banking\MarketingTaobaoAlipayBill;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request as HttpRequest;
class MarketingTaobaoAlipayBills extends Controller
{
public function __construct()
{
$this->middleware('permission:read-banking-accounts')->only('index');
$this->middleware('permission:create-banking-accounts')->only('create', 'store', 'import', 'template');
$this->middleware('permission:update-banking-accounts')->only('edit', 'update', 'export');
$this->middleware('permission:delete-banking-accounts')->only('destroy');
}
/**
* 列表页
*/
public function index()
{
$storeName = mb_substr(trim((string) request()->query('store_name')), 0, 191);
$fromDate = $this->dateFilter(request()->query('from'));
$toDate = $this->dateFilter(request()->query('to'));
$query = MarketingTaobaoAlipayBill::query();
if ($storeName !== '') {
$query->where('store_name', $storeName);
}
if ($fromDate !== '') {
$query->where('transaction_date', '>=', $fromDate);
}
if ($toDate !== '') {
$query->where('transaction_date', '<=', $toDate);
}
$storeOptions = MarketingTaobaoAlipayBill::select('store_name')
->whereNotNull('store_name')
->distinct()
->orderBy('store_name')
->pluck('store_name')
->toArray();
return view('banking.marketing_taobao_alipay_bills.index', [
'bills' => $query->orderBy('transaction_date', 'desc')
->orderBy('id', 'desc')
->paginate(setting('default.list_limit', 25))
->appends([
'store_name' => $storeName,
'from' => $fromDate,
'to' => $toDate,
]),
'filters' => [
'store_name' => $storeName,
'from' => $fromDate,
'to' => $toDate,
'store_options' => $storeOptions,
],
]);
}
/**
* 创建表单
*/
public function create()
{
return view('banking.marketing_taobao_alipay_bills.form', [
'bill' => new MarketingTaobaoAlipayBill([
'company_id' => company_id(),
'transaction_date' => now()->toDateString(),
'bookkeeping_time' => now(),
]),
]);
}
/**
* 下载导入模板
*/
public function template()
{
return response()->streamDownload(function () {
$csv = fopen('php://output', 'w');
fputs($csv, chr(0xEF) . chr(0xBB) . chr(0xBF)); // BOM for Excel
fputcsv($csv, [
'店铺名称', '交易日期', '记账时间', '收支类型', '交易类型',
'操作金额(元)', '操作后余额(元)', '备注',
]);
fclose($csv);
}, 'marketing_taobao_alipay_bills_template.csv', [
'Content-Type' => 'text/csv; charset=UTF-8',
]);
}
/**
* 批量导出
*/
public function export(HttpRequest $request)
{
$ids = $request->validate([
'ids' => ['nullable', 'array', 'max:5000'],
'ids.*' => ['integer'],
])['ids'] ?? [];
$query = MarketingTaobaoAlipayBill::oldest('id');
if (!empty($ids)) {
$query->whereKey($ids);
}
$bills = $query->get();
return response()->streamDownload(function () use ($bills) {
$csv = fopen('php://output', 'w');
fputs($csv, chr(0xEF) . chr(0xBB) . chr(0xBF));
fputcsv($csv, [
'店铺名称', '交易日期', '记账时间', '收支类型', '交易类型',
'操作金额(元)', '操作后余额(元)', '备注',
]);
foreach ($bills as $bill) {
fputcsv($csv, [
$bill->store_name,
$bill->transaction_date->toDateString(),
$bill->bookkeeping_time?->format('Y-m-d H:i:s'),
$bill->income_expense_type,
$bill->transaction_type,
$bill->operation_amount,
$bill->balance_after,
$bill->notes,
]);
}
fclose($csv);
}, 'marketing_taobao_alipay_bills_export.csv', [
'Content-Type' => 'text/csv; charset=UTF-8',
]);
}
/**
* 批量导入
*/
public function import(HttpRequest $request): RedirectResponse
{
$validated = $request->validate([
'import' => ['required', 'file', 'mimes:xlsx,xls,csv', 'max:5120'],
], [
'import.required' => trans('marketing_taobao_alipay_bills.import_required'),
'import.mimes' => trans('marketing_taobao_alipay_bills.import_file_type'),
'import.max' => trans('marketing_taobao_alipay_bills.import_file_size'),
]);
$file = $validated['import'];
$handle = fopen($file->getRealPath(), 'r');
// Skip BOM
$bom = fread($handle, 3);
if ($bom !== chr(0xEF) . chr(0xBB) . chr(0xBF)) {
rewind($handle);
}
// Skip header
fgetcsv($handle);
$count = 0;
$companyId = company_id();
$userId = user()->id;
while (($row = fgetcsv($handle)) !== false) {
if (empty($row[0]) && empty($row[1])) {
continue;
}
// Parse bookkeeping time - handle various formats
$bookkeepingTime = null;
if (!empty($row[2])) {
try {
$bookkeepingTime = \Carbon\Carbon::parse($row[2]);
} catch (\Exception $e) {
$bookkeepingTime = null;
}
}
MarketingTaobaoAlipayBill::create([
'company_id' => $companyId,
'store_name' => $row[0] ?? '',
'transaction_date' => $row[1] ?? now()->toDateString(),
'bookkeeping_time' => $bookkeepingTime,
'income_expense_type' => $row[3] ?? '支出',
'transaction_type' => $row[4] ?? null,
'operation_amount' => (float) ($row[5] ?? 0),
'balance_after' => (float) ($row[6] ?? 0),
'notes' => $row[7] ?? null,
'created_from' => 'core::ui',
'created_by' => $userId,
]);
$count++;
}
fclose($handle);
flash(trans('marketing_taobao_alipay_bills.import_success', ['count' => $count]))->success();
return redirect()->route('marketing-taobao-alipay-bills.index');
}
/**
* 存储新账单
*/
public function store(Request $request): RedirectResponse
{
$data = $request->validated();
MarketingTaobaoAlipayBill::create(array_merge($data, [
'company_id' => company_id(),
'created_from' => 'core::ui',
'created_by' => user()->id,
]));
flash(trans('messages.success.created', ['type' => trans('marketing_taobao_alipay_bills.title')]))->success();
return redirect()->route('marketing-taobao-alipay-bills.index');
}
/**
* 编辑表单
*/
public function edit(MarketingTaobaoAlipayBill $marketingTaobaoAlipayBill)
{
return view('banking.marketing_taobao_alipay_bills.form', [
'bill' => $marketingTaobaoAlipayBill,
]);
}
/**
* 更新账单
*/
public function update(Request $request, MarketingTaobaoAlipayBill $marketingTaobaoAlipayBill): RedirectResponse
{
$marketingTaobaoAlipayBill->update($request->validated());
flash(trans('messages.success.updated', ['type' => trans('marketing_taobao_alipay_bills.title')]))->success();
return redirect()->route('marketing-taobao-alipay-bills.index');
}
/**
* 删除账单
*/
public function destroy(MarketingTaobaoAlipayBill $marketingTaobaoAlipayBill): RedirectResponse
{
$marketingTaobaoAlipayBill->delete();
flash(trans('messages.success.deleted', ['type' => trans('marketing_taobao_alipay_bills.title')]))->success();
return redirect()->route('marketing-taobao-alipay-bills.index');
}
private function dateFilter(mixed $value): string
{
$date = trim((string) $value);
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $date) !== 1) {
return '';
}
[$year, $month, $day] = array_map('intval', explode('-', $date));
return checkdate($month, $day, $year) ? $date : '';
}
}