erp-backend/app/Http/Controllers/PrintPluginController.php
2026-04-01 17:07:04 +08:00

463 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Services\PrintPluginService;
use App\Services\PrintJobService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class PrintPluginController extends Controller
{
protected PrintPluginService $pluginService;
protected PrintJobService $jobService;
public function __construct(PrintPluginService $pluginService, PrintJobService $jobService)
{
$this->pluginService = $pluginService;
$this->jobService = $jobService;
}
/**
* 获取插件列表
*/
public function index(Request $request)
{
$platform = $request->get('platform');
$plugins = $this->pluginService->getPlugins($platform);
return response()->json([
'code' => 200,
'data' => $plugins,
]);
}
/**
* 获取插件详情
*/
public function show(string $code)
{
$plugin = $this->pluginService->getPlugin($code);
if (!$plugin) {
return response()->json([
'code' => 404,
'message' => '插件不存在',
], 404);
}
return response()->json([
'code' => 200,
'data' => $plugin,
]);
}
/**
* 获取插件最新版本
*/
public function version(string $code)
{
$version = $this->pluginService->getLatestVersion($code);
if (!$version) {
return response()->json([
'code' => 404,
'message' => '插件不存在',
], 404);
}
return response()->json([
'code' => 200,
'data' => $version,
]);
}
/**
* 下载插件
*/
public function download(string $code)
{
$path = $this->pluginService->downloadPlugin($code);
if (!$path) {
return response()->json([
'code' => 500,
'message' => '下载失败',
], 500);
}
return response()->download($path);
}
/**
* 获取用户已安装插件
*/
public function installations()
{
$user = Auth::user();
$installations = $this->pluginService->getUserInstallations($user->id);
return response()->json([
'code' => 200,
'data' => $installations,
]);
}
/**
* 检查插件版本(前端轮询)
*/
public function checkVersion(Request $request)
{
$user = Auth::user();
$pluginCode = $request->get('plugin_code');
$deviceId = $request->get('device_id');
$result = $this->pluginService->checkUserPluginVersion($user->id, $pluginCode, $deviceId);
return response()->json([
'code' => 200,
'data' => $result,
]);
}
/**
* 注册插件安装
*/
public function register(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'plugin_code' => 'required|string',
'version' => 'required|string',
'device_id' => 'required|string',
'device_name' => 'nullable|string',
'os_version' => 'nullable|string',
]);
$result = $this->pluginService->registerInstallation(
$user->id,
$validated['plugin_code'],
$validated['version'],
$validated['device_id'],
$validated['device_name'] ?? null,
$validated['os_version'] ?? null
);
return response()->json([
'code' => $result['success'] ? 200 : 400,
'data' => $result,
]);
}
/**
* 记录心跳
*/
public function heartbeat(Request $request)
{
$user = Auth::user();
$deviceId = $request->get('device_id');
if (!$deviceId) {
return response()->json([
'code' => 400,
'message' => '缺少device_id',
], 400);
}
$success = $this->pluginService->recordHeartbeat($user->id, $deviceId);
return response()->json([
'code' => $success ? 200 : 400,
'message' => $success ? '心跳成功' : '设备未注册',
]);
}
/**
* 卸载插件
*/
public function uninstall(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'plugin_code' => 'required|string',
'device_id' => 'required|string',
]);
$success = $this->pluginService->uninstall(
$user->id,
$validated['plugin_code'],
$validated['device_id']
);
return response()->json([
'code' => $success ? 200 : 404,
'message' => $success ? '卸载成功' : '安装记录不存在',
]);
}
/**
* 获取设备状态
*/
public function deviceStatus(string $deviceId)
{
$user = Auth::user();
$status = $this->pluginService->getDeviceStatus($user->id, $deviceId);
return response()->json([
'code' => 200,
'data' => $status,
]);
}
/**
* 打印任务相关
*/
public function createJob(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'platform' => 'required|string',
'plugin_code' => 'required|string',
'order_id' => 'nullable|integer',
'template_id' => 'nullable|integer',
'print_data' => 'required|array',
'priority' => 'nullable|integer',
]);
$result = $this->jobService->createJob(
$user->id,
$validated['platform'],
$validated['plugin_code'],
$validated['print_data'],
$validated['order_id'] ?? null,
$validated['template_id'] ?? null,
$validated['priority'] ?? 0
);
return response()->json([
'code' => 200,
'data' => $result,
]);
}
/**
* 批量创建打印任务
*/
public function createBatchJobs(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'platform' => 'required|string',
'plugin_code' => 'required|string',
'template_id' => 'nullable|integer',
'orders' => 'required|array',
]);
$result = $this->jobService->createBatchJobs(
$user->id,
$validated['platform'],
$validated['plugin_code'],
$validated['orders'],
$validated['template_id'] ?? null
);
return response()->json([
'code' => 200,
'data' => $result,
]);
}
/**
* 获取打印队列
*/
public function queue(Request $request)
{
$user = Auth::user();
$status = $request->get('status');
$queue = $this->jobService->getQueue($user->id, $status);
return response()->json([
'code' => 200,
'data' => $queue,
]);
}
/**
* 设备获取下一个任务
*/
public function getNextJob(Request $request)
{
$user = Auth::user();
$deviceId = $request->get('device_id');
if (!$deviceId) {
return response()->json(['code' => 400, 'message' => '缺少device_id'], 400);
}
$job = $this->jobService->getNextJob($user->id, $deviceId);
return response()->json([
'code' => 200,
'data' => $job?->toArray() ?? null,
]);
}
/**
* 设备认领任务
*/
public function claimJob(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'job_id' => 'required|integer',
'device_id' => 'required|string',
]);
$success = $this->jobService->claimJob($user->id, $validated['device_id'], $validated['job_id']);
return response()->json([
'code' => $success ? 200 : 400,
'message' => $success ? '任务已认领' : '认领失败',
]);
}
/**
* 标记打印完成
*/
public function completeJob(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'job_id' => 'required|integer',
'device_id' => 'nullable|string',
]);
$success = $this->jobService->completeJob($user->id, $validated['job_id'], $validated['device_id'] ?? null);
return response()->json([
'code' => $success ? 200 : 400,
'message' => $success ? '打印完成' : '操作失败',
]);
}
/**
* 标记打印失败
*/
public function failJob(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'job_id' => 'required|integer',
'error' => 'required|string',
'device_id' => 'nullable|string',
]);
$success = $this->jobService->failJob($user->id, $validated['job_id'], $validated['error'], $validated['device_id'] ?? null);
return response()->json([
'code' => $success ? 200 : 400,
'message' => $success ? '已记录' : '操作失败',
]);
}
/**
* 重试任务
*/
public function retryJob(int $jobId)
{
$user = Auth::user();
$result = $this->jobService->retryJob($user->id, $jobId);
return response()->json([
'code' => $result['success'] ? 200 : 400,
'data' => $result,
]);
}
/**
* 取消任务
*/
public function cancelJob(int $jobId)
{
$user = Auth::user();
$success = $this->jobService->cancelJob($user->id, $jobId);
return response()->json([
'code' => $success ? 200 : 400,
'message' => $success ? '已取消' : '操作失败',
]);
}
/**
* 获取打印历史
*/
public function history(Request $request)
{
$user = Auth::user();
$page = (int) $request->get('page', 1);
$perPage = (int) $request->get('per_page', 20);
$history = $this->jobService->getHistory($user->id, $page, $perPage);
return response()->json([
'code' => 200,
'data' => $history,
]);
}
/**
* 获取打印统计
*/
public function stats()
{
$user = Auth::user();
$stats = $this->jobService->getStats($user->id);
return response()->json([
'code' => 200,
'data' => $stats,
]);
}
/**
* 批量加入队列
*/
public function batchQueue(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'job_ids' => 'required|array',
]);
$result = $this->jobService->batchQueue($user->id, $validated['job_ids']);
return response()->json([
'code' => 200,
'data' => $result,
]);
}
/**
* 清空已完成任务
*/
public function clearCompleted()
{
$user = Auth::user();
$count = $this->jobService->clearCompleted($user->id);
return response()->json([
'code' => 200,
'message' => "已清空 {$count} 条记录",
]);
}
}