package com.kaidi.oa.web; import com.kaidi.oa.common.ApiException; import com.kaidi.oa.common.ApiResp; import com.kaidi.oa.common.NotFoundException; import com.kaidi.oa.domain.LabInstrument; import com.kaidi.oa.repository.LabInstrumentRepository; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.Instant; import java.util.List; /** * Laboratory center (实验室) instruments and devices. status is one of 在用 / * 维修 / 停用 / 待校准, defaulting to 在用 on create. calibrationDate and * nextCalibration record the last and next calibration dates. */ @RestController @RequestMapping("/api/oa/lab-instruments") public class LabInstrumentController { private final LabInstrumentRepository instrumentRepo; public LabInstrumentController(LabInstrumentRepository instrumentRepo) { this.instrumentRepo = instrumentRepo; } @GetMapping public ApiResp> list(@RequestParam(required = false) String status) { List list; if (status != null && !status.isBlank()) { list = instrumentRepo.findByStatus(status); } else { list = instrumentRepo.findAll(); } return ApiResp.ok(list); } @GetMapping("/{id}") public ApiResp get(@PathVariable Long id) { return ApiResp.ok(instrumentRepo.findById(id) .orElseThrow(() -> new NotFoundException("lab instrument not found: " + id))); } public record CreateLabInstrumentRequest( String name, String model, String assetNo, String calibrationDate, String nextCalibration, String status, String location, String manager, String supplier, String commissionDate, Integer calibrationCycleDays, Integer maintenanceCycleDays) { } @PostMapping public ApiResp create(@RequestBody CreateLabInstrumentRequest req) { if (req.name() == null || req.name().isBlank()) { throw new ApiException(400, "name is required"); } LabInstrument i = new LabInstrument(); i.setName(req.name()); i.setModel(req.model()); i.setAssetNo(req.assetNo()); i.setCalibrationDate(req.calibrationDate()); i.setNextCalibration(req.nextCalibration()); i.setStatus(req.status() == null || req.status().isBlank() ? "在用" : req.status()); i.setLocation(req.location()); i.setManager(req.manager()); i.setSupplier(req.supplier()); i.setCommissionDate(req.commissionDate()); i.setCalibrationCycleDays(req.calibrationCycleDays()); i.setMaintenanceCycleDays(req.maintenanceCycleDays()); i.setCreatedAt(Instant.now()); return ApiResp.ok(instrumentRepo.save(i)); } /** PUT /{id} -> 编辑实验室仪器; 只覆盖请求体里给出的字段。 */ @PutMapping("/{id}") public ApiResp update(@PathVariable Long id, @RequestBody CreateLabInstrumentRequest req) { LabInstrument i = instrumentRepo.findById(id) .orElseThrow(() -> new NotFoundException("lab instrument not found: " + id)); if (req.name() != null) { if (req.name().isBlank()) { throw new ApiException(400, "name is required"); } i.setName(req.name()); } if (req.model() != null) i.setModel(req.model()); if (req.assetNo() != null) i.setAssetNo(req.assetNo()); if (req.calibrationDate() != null) i.setCalibrationDate(req.calibrationDate()); if (req.nextCalibration() != null) i.setNextCalibration(req.nextCalibration()); if (req.status() != null && !req.status().isBlank()) i.setStatus(req.status()); if (req.location() != null) i.setLocation(req.location()); if (req.manager() != null) i.setManager(req.manager()); if (req.supplier() != null) i.setSupplier(req.supplier()); if (req.commissionDate() != null) i.setCommissionDate(req.commissionDate()); if (req.calibrationCycleDays() != null) i.setCalibrationCycleDays(req.calibrationCycleDays()); if (req.maintenanceCycleDays() != null) i.setMaintenanceCycleDays(req.maintenanceCycleDays()); return ApiResp.ok(instrumentRepo.save(i)); } /** DELETE /{id} -> 删除实验室仪器。 */ @DeleteMapping("/{id}") public ApiResp delete(@PathVariable Long id) { if (!instrumentRepo.existsById(id)) { throw new NotFoundException("lab instrument not found: " + id); } instrumentRepo.deleteById(id); return ApiResp.ok(null); } }