99use App \Http \Requests \Api \Print \AfterPrintRequest ;
1010use App \Http \Requests \Api \Print \BeforePrintRequest ;
1111use App \Http \Requests \Api \Print \StopPrintRequest ;
12+ use App \Models \PrinterFilamentSlot ;
1213use App \Models \PartTask ;
1314use App \Models \PrintingTask ;
1415use App \Models \PrintingTaskLog ;
1516use App \Models \Task ;
16- use App \Traits \ParsesFilenameTemplate ;
17+ use App \Traits \ParseFilament ;
18+ use App \Traits \ParseFilename ;
1719use Illuminate \Http \JsonResponse ;
1820use Illuminate \Support \Facades \DB ;
1921use Illuminate \Support \Facades \Event ;
2022use Throwable ;
2123
2224class 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}
0 commit comments