6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/OfflineOrderPreviewControll...

87 lines
2.7 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Controllers\Controller;
use App\Exceptions\BizException;
use App\Models\OfflineOrderPreview;
use App\Models\Store\Store;
use EasyWeChat\Factory;
use EasyWeChat\Kernel\Http\StreamResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class OfflineOrderPreviewController extends Controller
{
public function store(Request $request)
{
$request->validate([
'store_id' => ['bail', 'required', 'int'],
'items' => ['bail', 'required', 'array'],
'items.*.product_category_id' => ['bail', 'required', 'int'],
'items.*.products_total_amount' => ['bail', 'required', 'numeric', 'min:0', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'],
'items.*.discount' => ['bail', 'nullable', 'numeric', 'gt:0', 'lt:10', 'regex:/^[0-9](\.\d{1,2})?$/'],
]);
$user = $request->user();
if (! $user->userInfo->is_company) {
throw new BizException('非内部员工');
}
$store = Store::findOrFail($request->input('store_id'));
$preview = OfflineOrderPreview::create([
'store_id' => $store->id,
'staff_id' => $user->id,
'payload' => ['items' => $request->input('items')],
]);
$scene = http_build_query([
'oo' => $preview->id,
'i' => $user->userInfo->code,
]);
// 生成小程序码
$app = Factory::miniProgram(config('wechat.mini_program.default'));
$response = $app->app_code->getUnlimit($scene, [
'page' => 'pages/welcome/index',
'check_path' => false,
'env_version' => app()->isProduction() ? 'release' : $request->input('env_version', 'trial'),
'width' => $request->input('width', 200),
]);
// 保存小程序码
if ($response instanceof StreamResponse) {
$directory = 'offline-order-preview';
$filename = "{$preview->id}.png";
$disk = Storage::disk('public');
$response->save($disk->path($directory), $filename);
$preview->update(['qrcode' => $disk->url("{$directory}/{$filename}")]);
return response()->json([
'id' => $preview->id,
'qrcode' => $preview->qrcode,
]);
}
logger('offline_order_preview 小程序码生成失败', $response);
throw new BizException('生成失败, 请重试');
}
public function show($id)
{
$preview = OfflineOrderPreview::findOrFail($id);
return response()->json([
'id' => $preview->id,
'qrcode' => $preview->qrcode,
]);
}
}