Skip to content

Commit 2541670

Browse files
author
realshade
committed
перейменовано та оновлено моделі, контролери та запити для слотів філаменту; додано валідацію для імені файлу
1 parent 50674a9 commit 2541670

27 files changed

+1210
-614
lines changed

app/Http/Controllers/Api/TaskController.php

Lines changed: 116 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -9,162 +9,175 @@
99
use App\Http\Requests\Api\Print\AfterPrintRequest;
1010
use App\Http\Requests\Api\Print\BeforePrintRequest;
1111
use App\Http\Requests\Api\Print\StopPrintRequest;
12+
use App\Models\PrinterFilamentSlot;
1213
use App\Models\PartTask;
1314
use App\Models\PrintingTask;
1415
use App\Models\PrintingTaskLog;
1516
use App\Models\Task;
16-
use App\Traits\ParsesFilenameTemplate;
17+
use App\Traits\ParseFilament;
18+
use App\Traits\ParseFilename;
1719
use Illuminate\Http\JsonResponse;
1820
use Illuminate\Support\Facades\DB;
1921
use Illuminate\Support\Facades\Event;
2022
use Throwable;
2123

2224
class TaskController extends Controller
2325
{
24-
use ParsesFilenameTemplate;
26+
use ParseFilename, ParseFilament;
2527

2628
/* **************************************** Public **************************************** */
2729
/**
2830
* @throws Throwable
2931
*/
3032
public function afterPrint(AfterPrintRequest $request) : JsonResponse
3133
{
32-
$validationResult = $this->parseFilename($request->filename, $request->user()->id);
34+
$result = [];
3335

34-
if (!$validationResult['success']) {
36+
$printer = $request->getPrinter();
37+
if (!$printer) {
3538
return response()->json([
3639
'success' => false,
37-
'errors' => $validationResult['errors'],
40+
'errors' => [
41+
'printer_id' => [__('printer.validation.printer_id')],
42+
],
3843
], 422);
3944
}
45+
$result['printer'] = [
46+
'id' => $printer->id,
47+
'name' => $printer->name,
48+
];
49+
50+
$dataTasks = $this->parseFilename($request->filename);
51+
if ($dataTasks['success']) {
52+
DB::transaction(function() use ($request, $dataTasks, $printer) {
53+
// Обновление значений count_printed в PartTask
54+
foreach ($dataTasks['data']['tasks'] ?? [] as $taskData) {
55+
foreach ($taskData['parts'] ?? [] as $partData) {
56+
if (!$partData['count_printing'] || !$partData['is_printing']) {
57+
continue;
58+
}
4059

41-
DB::transaction(function() use ($request, $validationResult) {
42-
$printer = $request->getPrinter();
60+
$partTask = PartTask::find($partData['part_task_id']);
61+
if (!$partTask) {
62+
continue;
63+
}
64+
65+
$partTask->count_printed += $partData['count_printing'];
66+
$partTask->save();
67+
68+
PrintingTaskLog::create([
69+
'part_task_id' => $partData['part_task_id'],
70+
'printer_id' => $printer->id,
71+
'count' => $partData['count_printing'],
72+
'event_source' => PrintTaskEventSource::API,
73+
]);
4374

44-
// Обновление значений count_printed в PartTask
45-
foreach ($validationResult['data']['tasks'] as $taskData) {
46-
foreach ($taskData['parts'] ?? [] as $partData) {
47-
if (!$partData['count_printing'] || !$partData['is_printing']) {
48-
continue;
49-
}
5075

51-
$partTask = PartTask::find($partData['part_task_id']);
52-
if (!$partTask) {
53-
continue;
5476
}
77+
}
5578

56-
$partTask->count_printed += $partData['count_printing'];
57-
$partTask->save();
79+
$printer->printingTasks()->delete();
80+
});
81+
}
82+
$result['tasks'] = $dataTasks;
5883

59-
PrintingTaskLog::create([
60-
'part_task_id' => $partData['part_task_id'],
61-
'printer_id' => $printer->id,
62-
'count' => $partData['count_printing'],
63-
'event_source' => PrintTaskEventSource::API,
64-
]);
84+
$dataSlots = $this->parseFilament($request, $printer);
85+
if ($dataSlots['success']) {
6586

87+
DB::transaction(function() use ($printer, &$dataSlots) {
88+
foreach ($dataSlots['data']['slots'] ?? [] as $slotName => $usedWeight) {
89+
/** @var PrinterFilamentSlot $slot */
90+
$slot = $printer->filamentSlots()->where('attribute', $slotName)->first();
91+
if (!$slot) {
92+
continue;
93+
}
94+
if ($slot->filamentSpool) {
95+
$filamentSpool = $slot->filamentSpool;
96+
97+
$dataSlots['data']['change'][ $slotName ] = [
98+
'filament_spool_id' => $filamentSpool->id,
99+
'filament_spool' => sprintf('#%d %s %s (%s)', $filamentSpool->id, $filamentSpool->filament->name, $filamentSpool->filament->type->name, $filamentSpool->filament->vendor->name),
100+
'weight_initial' => $filamentSpool->weight_initial,
101+
'weight_used' => $filamentSpool->weight_used,
102+
'weight_remaining' => $filamentSpool->weight_initial - $filamentSpool->weight_used,
103+
'subtracted' => $usedWeight,
104+
'weight_future' => $filamentSpool->weight_initial - $filamentSpool->weight_used - $usedWeight,
105+
'date_last_used' => $filamentSpool->date_last_used?->format('Y-m-d H:i:s'),
106+
];
66107

108+
$filamentSpool->weight_used = $filamentSpool->weight_used + $usedWeight;
109+
$filamentSpool->date_last_used = now();
110+
if (!$filamentSpool->date_first_used) {
111+
$filamentSpool->date_first_used = now();
112+
}
113+
$filamentSpool->save();
114+
} else {
115+
$dataSlots['data']['change'][ $slotName ] = [
116+
'filament_spool_id' => null,
117+
'filament_spool' => __('printer.filament_slot.empty'),
118+
'weight_initial' => null,
119+
'weight_used' => null,
120+
'weight_remaining' => null,
121+
'subtracted' => $usedWeight,
122+
'weight_future' => null,
123+
'date_last_used' => null,
124+
];
125+
}
67126
}
68-
}
69-
70-
$printer->printingTasks()->delete();
71-
});
127+
});
128+
}
129+
$result['slots'] = $dataSlots;
72130

73-
return response()->json($validationResult);
131+
return response()->json($result);
74132
}
75133

76134
public function beforePrint(BeforePrintRequest $request) : JsonResponse
77135
{
78-
$validationResult = $this->parseFilename($request->filename, $request->user()->id);
79-
80-
if (!$validationResult['success']) {
136+
$result = [];
137+
$printer = $request->getPrinter();
138+
if (!$printer) {
81139
return response()->json([
82140
'success' => false,
83-
'errors' => $validationResult['errors'],
141+
'errors' => [
142+
'printer_id' => [__('printer.validation.printer_id')],
143+
],
84144
], 422);
85145
}
86146

87-
$printer = $request->getPrinter();
147+
$result['printer'] = [
148+
'id' => $printer->id,
149+
'name' => $printer->name,
150+
];
151+
152+
$dataFilename = $this->parseFilename($request->filename);
153+
$result['tasks'] = $dataFilename;
88154

89-
foreach ($validationResult['data']['tasks'] as $taskData) {
90-
foreach ($taskData['parts'] ?? [] as $partData) {
91-
if ($partData['count_printing']) {
92-
PrintingTask::create([
93-
'part_task_id' => $partData['part_task_id'],
94-
'printer_id' => $printer->id,
95-
'count' => $partData['count_printing'],
96-
]);
97-
98-
$partTask = PartTask::find($partData['part_task_id']);
99-
if ($partTask) {
100-
$task = $partTask->task;
101-
if ($task->status === TaskStatus::NEW) {
155+
if ($dataFilename['success']) {
156+
foreach ($dataFilename['data']['tasks'] as $taskData) {
157+
foreach ($taskData['parts'] ?? [] as $partData) {
158+
if ($partData['count_printing']) {
159+
PrintingTask::create([
160+
'part_task_id' => $partData['part_task_id'],
161+
'printer_id' => $printer->id,
162+
'count' => $partData['count_printing'],
163+
]);
164+
165+
$task = PartTask::find($partData['part_task_id'])?->task;
166+
if ($task && $task->status === TaskStatus::NEW) {
102167
$task->update(['status' => TaskStatus::IN_PROGRESS]);
103168
}
104169
}
105170
}
106171
}
107172
}
108173

109-
$validationResult['data']['printer'][ $printer->id ] = $printer->name;
110-
111-
return response()->json($validationResult);
174+
return response()->json($result);
112175
}
113176

114-
public function index() : JsonResponse
177+
public function index()
115178
{
116-
$tasks = Task::query()
117-
->whereIn('status', [
118-
TaskStatus::NEW->value,
119-
TaskStatus::IN_PROGRESS->value,
120-
TaskStatus::PRINTED->value,
121-
])
122-
->with(['parts' => function($query) {
123-
$query->select('parts.id', 'name', 'version', 'count_per_set');
124-
}])
125-
->latest()
126-
->get()
127-
->map(function($task) {
128-
return [
129-
'id' => $task->id,
130-
'name' => $task->name,
131-
'status' => $task->status->value,
132-
'external_id' => $task->external_id,
133-
'count_set_planned' => $task->count_set_planned,
134-
'parts' => $task->parts->map(function($part) {
135-
return [
136-
'id' => $part->id,
137-
'name' => $part->name,
138-
'version' => $part->version,
139-
'count_per_set' => $part->pivot->count_per_set,
140-
];
141-
}),
142-
];
143-
});
144-
145-
return response()->json($tasks);
146-
}
147-
148-
public function show(Task $task) : JsonResponse
149-
{
150-
$task->load(['parts' => function($query) {
151-
$query->select('parts.id', 'name', 'version', 'count_per_set');
152-
}]);
153-
154179
return response()->json([
155-
'id' => $task->id,
156-
'name' => $task->name,
157-
'status' => $task->status->value,
158-
'external_id' => $task->external_id,
159-
'count_set_planned' => $task->count_set_planned,
160-
'parts' => $task->parts->map(function($part) {
161-
return [
162-
'id' => $part->id,
163-
'name' => $part->name,
164-
'version' => $part->version,
165-
'count_per_set' => $part->pivot->count_per_set,
166-
];
167-
}),
180+
'success' => true,
168181
]);
169182
}
170183

@@ -182,4 +195,5 @@ public function stopPrint(StopPrintRequest $request) : JsonResponse
182195
'message' => __('printer.printing_tasks_purged'),
183196
]);
184197
}
198+
185199
}

app/Http/Controllers/FilamentLoadedController.php

Lines changed: 0 additions & 58 deletions
This file was deleted.

0 commit comments

Comments
 (0)