From bed5f88da76498012eb8ab1670c49c7e58260424 Mon Sep 17 00:00:00 2001 From: chiguyong Date: Tue, 24 Mar 2026 00:56:28 +0800 Subject: [PATCH] feat: add inspection template management --- .../InspectionTemplateController.java | 53 ++++++++ .../pms/mdm/entity/InspectionTemplate.java | 65 ++++++++++ .../InspectionTemplateRepository.java | 16 +++ .../service/InspectionTemplateService.java | 14 +++ .../impl/InspectionTemplateServiceImpl.java | 114 ++++++++++++++++++ 5 files changed, 262 insertions(+) create mode 100644 module-mdm/src/main/java/com/ether/pms/mdm/controller/InspectionTemplateController.java create mode 100644 module-mdm/src/main/java/com/ether/pms/mdm/entity/InspectionTemplate.java create mode 100644 module-mdm/src/main/java/com/ether/pms/mdm/repository/InspectionTemplateRepository.java create mode 100644 module-mdm/src/main/java/com/ether/pms/mdm/service/InspectionTemplateService.java create mode 100644 module-mdm/src/main/java/com/ether/pms/mdm/service/impl/InspectionTemplateServiceImpl.java diff --git a/module-mdm/src/main/java/com/ether/pms/mdm/controller/InspectionTemplateController.java b/module-mdm/src/main/java/com/ether/pms/mdm/controller/InspectionTemplateController.java new file mode 100644 index 0000000..a8f34cf --- /dev/null +++ b/module-mdm/src/main/java/com/ether/pms/mdm/controller/InspectionTemplateController.java @@ -0,0 +1,53 @@ +package com.ether.pms.mdm.controller; + +import com.ether.pms.common.ApiResponse; +import com.ether.pms.mdm.entity.InspectionTemplate; +import com.ether.pms.mdm.service.InspectionTemplateService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/api/v1/ops/inspection-templates") +@RequiredArgsConstructor +public class InspectionTemplateController { + + private final InspectionTemplateService inspectionTemplateService; + + @GetMapping + public ApiResponse> getTemplates(@RequestParam UUID projectId) { + List templates = inspectionTemplateService.getTemplatesByProject(projectId); + return ApiResponse.success(templates); + } + + @PostMapping + public ApiResponse createTemplate(@Valid @RequestBody InspectionTemplate template) { + InspectionTemplate created = inspectionTemplateService.createTemplate(template); + return ApiResponse.success(created); + } + + @GetMapping("/{id}") + public ApiResponse getTemplate(@PathVariable UUID id) { + return ApiResponse.success(inspectionTemplateService.getTemplateById(id)); + } + + @PutMapping("/{id}") + public ApiResponse updateTemplate(@PathVariable UUID id, + @Valid @RequestBody InspectionTemplate template) { + return ApiResponse.success(inspectionTemplateService.updateTemplate(id, template)); + } + + @PostMapping("/{id}/copy") + public ApiResponse copyTemplate(@PathVariable UUID id, + @RequestParam String newName) { + return ApiResponse.success(inspectionTemplateService.copyTemplate(id, newName)); + } + + @GetMapping("/by-type/{equipmentType}") + public ApiResponse> getTemplatesByType(@PathVariable String equipmentType) { + return ApiResponse.success(inspectionTemplateService.getTemplatesByType(equipmentType)); + } +} \ No newline at end of file diff --git a/module-mdm/src/main/java/com/ether/pms/mdm/entity/InspectionTemplate.java b/module-mdm/src/main/java/com/ether/pms/mdm/entity/InspectionTemplate.java new file mode 100644 index 0000000..325afbf --- /dev/null +++ b/module-mdm/src/main/java/com/ether/pms/mdm/entity/InspectionTemplate.java @@ -0,0 +1,65 @@ +package com.ether.pms.mdm.entity; + +import jakarta.persistence.*; +import lombok.Data; +import java.time.LocalDateTime; +import java.util.UUID; + +@Entity +@Table(name = "ops_inspection_template") +@Data +public class InspectionTemplate { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @Column(name = "project_id", nullable = false) + private UUID projectId; + + @Column(name = "template_code", nullable = false, unique = true) + private String templateCode; + + @Column(name = "template_name", nullable = false) + private String templateName; + + @Column(name = "equipment_type", nullable = false) + private String equipmentType; + + @Column(name = "inspection_items", columnDefinition = "TEXT") + private String inspectionItems; + + @Column(name = "estimated_duration") + private Integer estimatedDuration; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private Status status = Status.ACTIVE; + + public enum Status { + ACTIVE, INACTIVE + } + + @Column(nullable = false) + private Integer version = 1; + + @Column(name = "created_by") + private String createdBy; + + @Column(name = "created_at") + private LocalDateTime createdAt; + + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @PrePersist + public void prePersist() { + createdAt = LocalDateTime.now(); + updatedAt = LocalDateTime.now(); + } + + @PreUpdate + public void preUpdate() { + updatedAt = LocalDateTime.now(); + } +} \ No newline at end of file diff --git a/module-mdm/src/main/java/com/ether/pms/mdm/repository/InspectionTemplateRepository.java b/module-mdm/src/main/java/com/ether/pms/mdm/repository/InspectionTemplateRepository.java new file mode 100644 index 0000000..3a118c2 --- /dev/null +++ b/module-mdm/src/main/java/com/ether/pms/mdm/repository/InspectionTemplateRepository.java @@ -0,0 +1,16 @@ +package com.ether.pms.mdm.repository; + +import com.ether.pms.mdm.entity.InspectionTemplate; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface InspectionTemplateRepository extends JpaRepository { + List findByProjectId(UUID projectId); + List findByEquipmentType(String equipmentType); + Optional findByTemplateCode(String templateCode); + boolean existsByTemplateCode(String templateCode); +} \ No newline at end of file diff --git a/module-mdm/src/main/java/com/ether/pms/mdm/service/InspectionTemplateService.java b/module-mdm/src/main/java/com/ether/pms/mdm/service/InspectionTemplateService.java new file mode 100644 index 0000000..c6c937a --- /dev/null +++ b/module-mdm/src/main/java/com/ether/pms/mdm/service/InspectionTemplateService.java @@ -0,0 +1,14 @@ +package com.ether.pms.mdm.service; + +import com.ether.pms.mdm.entity.InspectionTemplate; +import java.util.List; +import java.util.UUID; + +public interface InspectionTemplateService { + InspectionTemplate createTemplate(InspectionTemplate template); + InspectionTemplate updateTemplate(UUID id, InspectionTemplate template); + InspectionTemplate copyTemplate(UUID templateId, String newName); + List getTemplatesByType(String equipmentType); + List getTemplatesByProject(UUID projectId); + InspectionTemplate getTemplateById(UUID id); +} \ No newline at end of file diff --git a/module-mdm/src/main/java/com/ether/pms/mdm/service/impl/InspectionTemplateServiceImpl.java b/module-mdm/src/main/java/com/ether/pms/mdm/service/impl/InspectionTemplateServiceImpl.java new file mode 100644 index 0000000..9274818 --- /dev/null +++ b/module-mdm/src/main/java/com/ether/pms/mdm/service/impl/InspectionTemplateServiceImpl.java @@ -0,0 +1,114 @@ +package com.ether.pms.mdm.service.impl; + +import com.ether.pms.common.BusinessException; +import com.ether.pms.common.ErrorCode; +import com.ether.pms.mdm.entity.InspectionTemplate; +import com.ether.pms.mdm.repository.InspectionTemplateRepository; +import com.ether.pms.mdm.service.InspectionTemplateService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class InspectionTemplateServiceImpl implements InspectionTemplateService { + + private final InspectionTemplateRepository inspectionTemplateRepository; + private static final DateTimeFormatter CODE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + + @Override + @Transactional + public InspectionTemplate createTemplate(InspectionTemplate template) { + String templateCode = generateTemplateCode(); + template.setTemplateCode(templateCode); + + if (template.getStatus() == null) { + template.setStatus(InspectionTemplate.Status.ACTIVE); + } + + return inspectionTemplateRepository.save(template); + } + + @Override + @Transactional + public InspectionTemplate updateTemplate(UUID id, InspectionTemplate template) { + InspectionTemplate existing = getTemplateById(id); + + if (existing.getStatus() != InspectionTemplate.Status.ACTIVE) { + throw new BusinessException(6001, "只有ACTIVE状态的模板才能更新"); + } + + if (template.getTemplateName() != null) { + existing.setTemplateName(template.getTemplateName()); + } + if (template.getEquipmentType() != null) { + existing.setEquipmentType(template.getEquipmentType()); + } + if (template.getInspectionItems() != null) { + existing.setInspectionItems(template.getInspectionItems()); + } + if (template.getEstimatedDuration() != null) { + existing.setEstimatedDuration(template.getEstimatedDuration()); + } + if (template.getStatus() != null) { + existing.setStatus(template.getStatus()); + } + + return inspectionTemplateRepository.save(existing); + } + + @Override + @Transactional + public InspectionTemplate copyTemplate(UUID templateId, String newName) { + InspectionTemplate original = getTemplateById(templateId); + + InspectionTemplate copy = new InspectionTemplate(); + copy.setProjectId(original.getProjectId()); + copy.setTemplateName(newName); + copy.setEquipmentType(original.getEquipmentType()); + copy.setInspectionItems(original.getInspectionItems()); + copy.setEstimatedDuration(original.getEstimatedDuration()); + copy.setCreatedBy(original.getCreatedBy()); + copy.setVersion(original.getVersion() + 1); + copy.setStatus(InspectionTemplate.Status.ACTIVE); + + String newTemplateCode = generateTemplateCode(); + copy.setTemplateCode(newTemplateCode); + + return inspectionTemplateRepository.save(copy); + } + + @Override + public List getTemplatesByType(String equipmentType) { + return inspectionTemplateRepository.findByEquipmentType(equipmentType); + } + + @Override + public List getTemplatesByProject(UUID projectId) { + return inspectionTemplateRepository.findByProjectId(projectId); + } + + @Override + public InspectionTemplate getTemplateById(UUID id) { + return inspectionTemplateRepository.findById(id) + .orElseThrow(() -> new BusinessException(ErrorCode.NOT_FOUND, "点检模板不存在")); + } + + private String generateTemplateCode() { + String timestamp = LocalDateTime.now().format(CODE_FORMATTER); + String templateCode = "IT" + timestamp; + + int suffix = 1; + while (inspectionTemplateRepository.existsByTemplateCode(templateCode)) { + templateCode = "IT" + timestamp + "_" + suffix; + suffix++; + } + + return templateCode; + } +} \ No newline at end of file