44import com .apexgrid .transformertracker .ai .ParameterTuningService ;
55import com .apexgrid .transformertracker .ai .PythonAnalyzerService ;
66import com .apexgrid .transformertracker .model .Inspection ;
7+ import com .apexgrid .transformertracker .model .MaintenanceRecord ;
78import com .apexgrid .transformertracker .model .Transformer ;
89import com .apexgrid .transformertracker .repo .InspectionRepo ;
10+ import com .apexgrid .transformertracker .repo .MaintenanceRecordRepo ;
911import com .apexgrid .transformertracker .repo .TransformerRepo ;
1012import com .fasterxml .jackson .databind .JsonNode ;
1113import com .fasterxml .jackson .databind .ObjectMapper ;
3234import java .io .IOException ;
3335import java .io .InputStream ;
3436import java .nio .charset .StandardCharsets ;
37+ import java .math .BigDecimal ;
3538import java .time .Instant ;
3639import java .util .ArrayList ;
3740import java .util .Arrays ;
4750public class InspectionController {
4851 private final InspectionRepo repo ;
4952 private final TransformerRepo transformerRepo ;
53+ private final MaintenanceRecordRepo maintenanceRecordRepo ;
5054 private final PythonAnalyzerService pythonAnalyzerService ;
5155 private final ParameterTuningService parameterTuningService ;
5256 private final AiParameterService aiParameterService ;
5357
5458 public InspectionController (InspectionRepo repo ,
5559 TransformerRepo transformerRepo ,
60+ MaintenanceRecordRepo maintenanceRecordRepo ,
5661 PythonAnalyzerService pythonAnalyzerService ,
5762 ParameterTuningService parameterTuningService ,
5863 AiParameterService aiParameterService ) {
5964 this .repo = repo ;
6065 this .transformerRepo = transformerRepo ;
66+ this .maintenanceRecordRepo = maintenanceRecordRepo ;
6167 this .pythonAnalyzerService = pythonAnalyzerService ;
6268 this .parameterTuningService = parameterTuningService ;
6369 this .aiParameterService = aiParameterService ;
@@ -76,6 +82,46 @@ public ResponseEntity<Inspection> getOne(@PathVariable String id) {
7682 .orElse (ResponseEntity .notFound ().build ());
7783 }
7884
85+ @ GetMapping ("/{id}/maintenance-record" )
86+ public ResponseEntity <?> getMaintenanceRecord (@ PathVariable String id ) {
87+ if (!repo .existsById (id )) {
88+ return ResponseEntity .status (404 ).body (Map .of ("error" , "Inspection not found" ));
89+ }
90+ var record = maintenanceRecordRepo .findByInspectionId (id );
91+ if (record .isPresent ()) {
92+ return ResponseEntity .ok (MaintenanceRecordResponse .fromEntity (record .get ()));
93+ }
94+ return ResponseEntity .status (404 ).body (Map .of ("error" , "Maintenance record not found" ));
95+ }
96+
97+ @ PostMapping ("/{id}/maintenance-record" )
98+ public ResponseEntity <?> upsertMaintenanceRecord (@ PathVariable String id ,
99+ @ RequestBody (required = false ) MaintenanceRecordRequest payload ) {
100+ if (payload == null ) {
101+ return ResponseEntity .badRequest ().body (Map .of ("error" , "Request body is required" ));
102+ }
103+ var inspectionOpt = repo .findById (id );
104+ if (inspectionOpt .isEmpty ()) {
105+ return ResponseEntity .status (404 ).body (Map .of ("error" , "Inspection not found" ));
106+ }
107+ MaintenanceRecord record = maintenanceRecordRepo .findByInspectionId (id )
108+ .orElseGet (MaintenanceRecord ::new );
109+ Inspection inspection = inspectionOpt .get ();
110+ record .setInspection (inspection );
111+ record .setTransformerName (resolveTransformerName (inspection ));
112+ record .setInspectionDate (inspection .getInspectedDate ());
113+ record .setTimestamp (defaultTimestamp (payload .timestamp ()));
114+ record .setInspectorName (trimToNull (payload .inspectorName ()));
115+ record .setStatus (trimToNull (payload .status ()));
116+ record .setVoltage (payload .voltage ());
117+ record .setCurrent (payload .current ());
118+ record .setEfficiency (payload .efficiency ());
119+ record .setRecommendation (trimToNull (payload .recommendation ()));
120+ record .setRemarks (trimToNull (payload .remarks ()));
121+ MaintenanceRecord saved = maintenanceRecordRepo .save (record );
122+ return ResponseEntity .ok (MaintenanceRecordResponse .fromEntity (saved ));
123+ }
124+
79125 @ GetMapping ("/{id}/export" )
80126 public ResponseEntity <?> exportInspection (@ PathVariable String id ) {
81127 return repo .findById (id ).map (inspection -> {
@@ -318,6 +364,69 @@ public ResponseEntity<?> upload(@PathVariable String id,
318364 }).orElse (ResponseEntity .notFound ().build ());
319365 }
320366
367+ private static String trimToNull (String value ) {
368+ if (!StringUtils .hasText (value )) return null ;
369+ return value .trim ();
370+ }
371+
372+ private static String defaultTimestamp (String candidate ) {
373+ if (StringUtils .hasText (candidate )) {
374+ return candidate .trim ();
375+ }
376+ return Instant .now ().toString ();
377+ }
378+
379+ private static String resolveTransformerName (Inspection inspection ) {
380+ Transformer transformer = inspection .getTransformer ();
381+ if (transformer != null && StringUtils .hasText (transformer .getTransformerNumber ())) {
382+ return transformer .getTransformerNumber ();
383+ }
384+ return "unknown-transformer" ;
385+ }
386+
387+ public record MaintenanceRecordRequest (
388+ String timestamp ,
389+ String inspectorName ,
390+ String status ,
391+ BigDecimal voltage ,
392+ BigDecimal current ,
393+ BigDecimal efficiency ,
394+ String recommendation ,
395+ String remarks
396+ ) { }
397+
398+ public record MaintenanceRecordResponse (
399+ String id ,
400+ String inspectionId ,
401+ String inspectionDate ,
402+ String transformerName ,
403+ String timestamp ,
404+ String inspectorName ,
405+ String status ,
406+ BigDecimal voltage ,
407+ BigDecimal current ,
408+ BigDecimal efficiency ,
409+ String recommendation ,
410+ String remarks
411+ ) {
412+ static MaintenanceRecordResponse fromEntity (MaintenanceRecord record ) {
413+ return new MaintenanceRecordResponse (
414+ record .getId (),
415+ record .getInspection () != null ? record .getInspection ().getId () : null ,
416+ record .getInspectionDate (),
417+ record .getTransformerName (),
418+ record .getTimestamp (),
419+ record .getInspectorName (),
420+ record .getStatus (),
421+ record .getVoltage (),
422+ record .getCurrent (),
423+ record .getEfficiency (),
424+ record .getRecommendation (),
425+ record .getRemarks ()
426+ );
427+ }
428+ }
429+
321430 @ PostMapping ("/{id}/analyze" )
322431 public ResponseEntity <?> analyze (@ PathVariable String id ,
323432 @ RequestParam ("file" ) MultipartFile file ,
0 commit comments