- 基础环境:Docker 部署配置,源码挂载实时同步 - 修复:super_admin 权限补全、登录重定向循环 - 开发:店铺营销账户账单 - 抖音账户(15字段汇总账单) - 开发:店铺营销账户账单 - 淘系支付宝账户(8字段流水账单) - 开发:店铺营销账户账单 - 拼多多账户(7字段流水账单) - 业务页面导航集成:config/business_navigation.php + Business\Pages 控制器 - 各平台独立表结构和视图,互不影响
227 lines
6.8 KiB
PHP
227 lines
6.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Banking;
|
|
|
|
use App\Abstracts\Http\Controller;
|
|
use App\Http\Requests\Banking\MarketingPinduoduoBill as Request;
|
|
use App\Models\Banking\MarketingPinduoduoBill;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request as HttpRequest;
|
|
|
|
class MarketingPinduoduoBills 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()
|
|
{
|
|
return view('banking.marketing_pinduoduo_bills.index', [
|
|
'bills' => MarketingPinduoduoBill::orderBy('transaction_time', 'desc')
|
|
->orderBy('id', 'desc')
|
|
->paginate(setting('default.list_limit', 25)),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 创建表单
|
|
*/
|
|
public function create()
|
|
{
|
|
return view('banking.marketing_pinduoduo_bills.form', [
|
|
'bill' => new MarketingPinduoduoBill([
|
|
'company_id' => company_id(),
|
|
'transaction_time' => now(),
|
|
]),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 下载导入模板
|
|
*/
|
|
public function template()
|
|
{
|
|
return response()->streamDownload(function () {
|
|
$csv = fopen('php://output', 'w');
|
|
fputs($csv, chr(0xEF) . chr(0xBB) . chr(0xBF));
|
|
|
|
fputcsv($csv, [
|
|
'店铺名称', '时间', '资金类型', '流水类型',
|
|
'交易金额', '余额', '交易摘要',
|
|
]);
|
|
|
|
fclose($csv);
|
|
}, 'marketing_pinduoduo_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 = MarketingPinduoduoBill::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_time?->format('Y-m-d H:i:s'),
|
|
$bill->fund_type,
|
|
$bill->flow_type,
|
|
$bill->transaction_amount,
|
|
$bill->balance,
|
|
$bill->transaction_summary,
|
|
]);
|
|
}
|
|
|
|
fclose($csv);
|
|
}, 'marketing_pinduoduo_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_pinduoduo_bills.import_required'),
|
|
'import.mimes' => trans('marketing_pinduoduo_bills.import_file_type'),
|
|
'import.max' => trans('marketing_pinduoduo_bills.import_file_size'),
|
|
]);
|
|
|
|
$file = $validated['import'];
|
|
$handle = fopen($file->getRealPath(), 'r');
|
|
|
|
$bom = fread($handle, 3);
|
|
if ($bom !== chr(0xEF) . chr(0xBB) . chr(0xBF)) {
|
|
rewind($handle);
|
|
}
|
|
|
|
fgetcsv($handle);
|
|
|
|
$count = 0;
|
|
$companyId = company_id();
|
|
$userId = user()->id;
|
|
|
|
while (($row = fgetcsv($handle)) !== false) {
|
|
if (empty($row[0]) && empty($row[1])) {
|
|
continue;
|
|
}
|
|
|
|
$transactionTime = null;
|
|
if (!empty($row[1])) {
|
|
try {
|
|
$transactionTime = \Carbon\Carbon::parse($row[1]);
|
|
} catch (\Exception $e) {
|
|
$transactionTime = null;
|
|
}
|
|
}
|
|
|
|
MarketingPinduoduoBill::create([
|
|
'company_id' => $companyId,
|
|
'store_name' => $row[0] ?? '',
|
|
'transaction_time' => $transactionTime,
|
|
'fund_type' => $row[2] ?? '',
|
|
'flow_type' => $row[3] ?? null,
|
|
'transaction_amount' => (float) ($row[4] ?? 0),
|
|
'balance' => (float) ($row[5] ?? 0),
|
|
'transaction_summary' => $row[6] ?? null,
|
|
'created_from' => 'core::ui',
|
|
'created_by' => $userId,
|
|
]);
|
|
|
|
$count++;
|
|
}
|
|
|
|
fclose($handle);
|
|
|
|
flash(trans('marketing_pinduoduo_bills.import_success', ['count' => $count]))->success();
|
|
|
|
return redirect()->route('marketing-pinduoduo-bills.index');
|
|
}
|
|
|
|
/**
|
|
* 存储新账单
|
|
*/
|
|
public function store(Request $request): RedirectResponse
|
|
{
|
|
$data = $request->validated();
|
|
|
|
MarketingPinduoduoBill::create(array_merge($data, [
|
|
'company_id' => company_id(),
|
|
'created_from' => 'core::ui',
|
|
'created_by' => user()->id,
|
|
]));
|
|
|
|
flash(trans('messages.success.created', ['type' => trans('marketing_pinduoduo_bills.title')]))->success();
|
|
|
|
return redirect()->route('marketing-pinduoduo-bills.index');
|
|
}
|
|
|
|
/**
|
|
* 编辑表单
|
|
*/
|
|
public function edit(MarketingPinduoduoBill $marketingPinduoduoBill)
|
|
{
|
|
return view('banking.marketing_pinduoduo_bills.form', [
|
|
'bill' => $marketingPinduoduoBill,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 更新账单
|
|
*/
|
|
public function update(Request $request, MarketingPinduoduoBill $marketingPinduoduoBill): RedirectResponse
|
|
{
|
|
$marketingPinduoduoBill->update($request->validated());
|
|
|
|
flash(trans('messages.success.updated', ['type' => trans('marketing_pinduoduo_bills.title')]))->success();
|
|
|
|
return redirect()->route('marketing-pinduoduo-bills.index');
|
|
}
|
|
|
|
/**
|
|
* 删除账单
|
|
*/
|
|
public function destroy(MarketingPinduoduoBill $marketingPinduoduoBill): RedirectResponse
|
|
{
|
|
$marketingPinduoduoBill->delete();
|
|
|
|
flash(trans('messages.success.deleted', ['type' => trans('marketing_pinduoduo_bills.title')]))->success();
|
|
|
|
return redirect()->route('marketing-pinduoduo-bills.index');
|
|
}
|
|
}
|