86 lines
2.7 KiB
PHP
86 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([
|
|
'offline_order' => $preview->id,
|
|
]);
|
|
|
|
// 生成小程序码
|
|
$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,
|
|
]);
|
|
}
|
|
}
|