feat: add maintenance plan and task services

This commit is contained in:
chiguyong 2026-03-24 00:11:57 +08:00
parent db41b5a8f5
commit 60cb1ba8f3
4 changed files with 365 additions and 0 deletions

View File

@ -0,0 +1,14 @@
package com.ether.pms.mdm.service;
import com.ether.pms.mdm.entity.MaintenancePlan;
import java.util.List;
import java.util.UUID;
public interface MaintenancePlanService {
MaintenancePlan createPlan(MaintenancePlan plan);
MaintenancePlan updatePlan(UUID id, MaintenancePlan plan);
void deactivatePlan(UUID id);
MaintenancePlan getPlanById(UUID id);
List<MaintenancePlan> getActivePlansByProject(UUID projectId);
List<MaintenancePlan> getPlansByTriggerType(MaintenancePlan.TriggerType triggerType);
}

View File

@ -0,0 +1,21 @@
package com.ether.pms.mdm.service;
import com.ether.pms.mdm.entity.MaintenancePlan;
import com.ether.pms.mdm.entity.MaintenanceTask;
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
public interface MaintenanceTaskService {
MaintenanceTask getTaskById(UUID id);
List<MaintenanceTask> getTasksByAssignee(UUID assignee);
List<MaintenanceTask> getTasksByStatus(UUID projectId, MaintenanceTask.Status status);
List<MaintenanceTask> getTasksByEquipment(UUID equipmentId);
List<MaintenanceTask> getOverdueTasks();
MaintenanceTask createTask(MaintenanceTask task);
MaintenanceTask acceptTask(UUID taskId, UUID userId);
MaintenanceTask startTask(UUID taskId);
MaintenanceTask completeTask(UUID taskId, BigDecimal laborHours, BigDecimal materialsCost, String remarks);
void cancelTask(UUID taskId);
List<MaintenanceTask> generateTasksFromPlan(MaintenancePlan plan);
}

View File

@ -0,0 +1,130 @@
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.MaintenancePlan;
import com.ether.pms.mdm.repository.MaintenancePlanRepository;
import com.ether.pms.mdm.service.MaintenancePlanService;
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 MaintenancePlanServiceImpl implements MaintenancePlanService {
private final MaintenancePlanRepository maintenancePlanRepository;
private static final DateTimeFormatter CODE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
@Override
@Transactional
public MaintenancePlan createPlan(MaintenancePlan plan) {
// 生成计划编码 MP + 时间戳
String planCode = generatePlanCode();
plan.setPlanCode(planCode);
// 设置默认状态为ACTIVE
if (plan.getStatus() == null) {
plan.setStatus(MaintenancePlan.Status.ACTIVE);
}
return maintenancePlanRepository.save(plan);
}
@Override
@Transactional
public MaintenancePlan updatePlan(UUID id, MaintenancePlan plan) {
MaintenancePlan existing = getPlanById(id);
// 状态转换校验只有ACTIVE状态才能更新
if (existing.getStatus() != MaintenancePlan.Status.ACTIVE) {
throw new BusinessException(6001, "只有ACTIVE状态的计划才能更新");
}
// 更新字段
if (plan.getPlanName() != null) {
existing.setPlanName(plan.getPlanName());
}
if (plan.getEquipmentType() != null) {
existing.setEquipmentType(plan.getEquipmentType());
}
if (plan.getTriggerType() != null) {
existing.setTriggerType(plan.getTriggerType());
}
if (plan.getTriggerValue() != null) {
existing.setTriggerValue(plan.getTriggerValue());
}
if (plan.getTriggerUnit() != null) {
existing.setTriggerUnit(plan.getTriggerUnit());
}
if (plan.getMaintenanceItems() != null) {
existing.setMaintenanceItems(plan.getMaintenanceItems());
}
if (plan.getEstimatedDuration() != null) {
existing.setEstimatedDuration(plan.getEstimatedDuration());
}
if (plan.getAssignedTo() != null) {
existing.setAssignedTo(plan.getAssignedTo());
}
if (plan.getSlaResponseHours() != null) {
existing.setSlaResponseHours(plan.getSlaResponseHours());
}
if (plan.getSlaCompleteHours() != null) {
existing.setSlaCompleteHours(plan.getSlaCompleteHours());
}
return maintenancePlanRepository.save(existing);
}
@Override
@Transactional
public void deactivatePlan(UUID id) {
MaintenancePlan plan = getPlanById(id);
// 状态转换校验只有ACTIVE状态才能停用
if (plan.getStatus() != MaintenancePlan.Status.ACTIVE) {
throw new BusinessException(6002, "只有ACTIVE状态的计划才能停用");
}
plan.setStatus(MaintenancePlan.Status.INACTIVE);
maintenancePlanRepository.save(plan);
}
@Override
public MaintenancePlan getPlanById(UUID id) {
return maintenancePlanRepository.findById(id)
.orElseThrow(() -> new BusinessException(ErrorCode.NOT_FOUND, "维保计划不存在"));
}
@Override
public List<MaintenancePlan> getActivePlansByProject(UUID projectId) {
return maintenancePlanRepository.findByProjectIdAndStatus(projectId, MaintenancePlan.Status.ACTIVE);
}
@Override
public List<MaintenancePlan> getPlansByTriggerType(MaintenancePlan.TriggerType triggerType) {
return maintenancePlanRepository.findByTriggerType(triggerType);
}
/**
* 生成计划编码MP + yyyyMMddHHmmss
*/
private String generatePlanCode() {
String timestamp = LocalDateTime.now().format(CODE_FORMATTER);
String planCode = "MP" + timestamp;
// 确保编码唯一
int suffix = 1;
while (maintenancePlanRepository.existsByPlanCode(planCode)) {
planCode = "MP" + timestamp + "_" + suffix;
suffix++;
}
return planCode;
}
}

View File

@ -0,0 +1,200 @@
package com.ether.pms.mdm.service.impl;
import com.ether.pms.common.BusinessException;
import com.ether.pms.mdm.entity.MaintenancePlan;
import com.ether.pms.mdm.entity.MaintenanceTask;
import com.ether.pms.mdm.repository.MaintenanceTaskRepository;
import com.ether.pms.mdm.service.MaintenanceTaskService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
@Service
@RequiredArgsConstructor
public class MaintenanceTaskServiceImpl implements MaintenanceTaskService {
private final MaintenanceTaskRepository maintenanceTaskRepository;
private static final DateTimeFormatter CODE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
@Override
public MaintenanceTask getTaskById(UUID id) {
return maintenanceTaskRepository.findById(id)
.orElseThrow(() -> new BusinessException(6003, "维保任务不存在"));
}
@Override
public List<MaintenanceTask> getTasksByAssignee(UUID assignee) {
return maintenanceTaskRepository.findByAssignedToAndStatus(assignee, MaintenanceTask.Status.PENDING);
}
@Override
public List<MaintenanceTask> getTasksByStatus(UUID projectId, MaintenanceTask.Status status) {
return maintenanceTaskRepository.findByProjectIdAndStatus(projectId, status);
}
@Override
public List<MaintenanceTask> getTasksByEquipment(UUID equipmentId) {
return maintenanceTaskRepository.findByEquipmentIdAndStatusNot(equipmentId, MaintenanceTask.Status.CANCELLED);
}
@Override
public List<MaintenanceTask> getOverdueTasks() {
return maintenanceTaskRepository.findOverdueTasks(LocalDateTime.now());
}
@Override
@Transactional
public MaintenanceTask createTask(MaintenanceTask task) {
// 生成任务编码 MT + 时间戳
String taskCode = generateTaskCode();
task.setTaskCode(taskCode);
// 设置默认状态为PENDING
if (task.getStatus() == null) {
task.setStatus(MaintenanceTask.Status.PENDING);
}
// 设置默认任务类型为预防性维护
if (task.getTaskType() == null) {
task.setTaskType(MaintenanceTask.TaskType.PREVENTIVE);
}
return maintenanceTaskRepository.save(task);
}
@Override
@Transactional
public MaintenanceTask acceptTask(UUID taskId, UUID userId) {
MaintenanceTask task = getTaskById(taskId);
// 状态校验只有PENDING状态才能接受
if (task.getStatus() != MaintenanceTask.Status.PENDING) {
throw new BusinessException(6004, "只有PENDING状态的任务才能接受");
}
task.setStatus(MaintenanceTask.Status.ACCEPTED);
task.setAssignedTo(userId);
return maintenanceTaskRepository.save(task);
}
@Override
@Transactional
public MaintenanceTask startTask(UUID taskId) {
MaintenanceTask task = getTaskById(taskId);
// 状态校验只有ACCEPTED状态才能开始执行
if (task.getStatus() != MaintenanceTask.Status.ACCEPTED) {
throw new BusinessException(6005, "只有ACCEPTED状态的任务才能开始执行");
}
task.setStatus(MaintenanceTask.Status.IN_PROGRESS);
task.setActualStartDate(LocalDateTime.now());
return maintenanceTaskRepository.save(task);
}
@Override
@Transactional
public MaintenanceTask completeTask(UUID taskId, BigDecimal laborHours, BigDecimal materialsCost, String remarks) {
MaintenanceTask task = getTaskById(taskId);
// 状态校验只有IN_PROGRESS状态才能完成
if (task.getStatus() != MaintenanceTask.Status.IN_PROGRESS) {
throw new BusinessException(6006, "只有IN_PROGRESS状态的任务才能完成");
}
task.setStatus(MaintenanceTask.Status.COMPLETED);
task.setActualEndDate(LocalDateTime.now());
if (laborHours != null) {
task.setLaborHours(laborHours);
}
if (materialsCost != null) {
task.setMaterialsCost(materialsCost);
}
if (remarks != null) {
task.setRemarks(remarks);
}
return maintenanceTaskRepository.save(task);
}
@Override
@Transactional
public void cancelTask(UUID taskId) {
MaintenanceTask task = getTaskById(taskId);
// 状态校验PENDINGACCEPTEDIN_PROGRESS状态都可以取消
List<MaintenanceTask.Status> cancellableStatuses = Arrays.asList(
MaintenanceTask.Status.PENDING,
MaintenanceTask.Status.ACCEPTED,
MaintenanceTask.Status.IN_PROGRESS
);
if (!cancellableStatuses.contains(task.getStatus())) {
throw new BusinessException(6007, "只有PENDING、ACCEPTED或IN_PROGRESS状态的任务才能取消");
}
task.setStatus(MaintenanceTask.Status.CANCELLED);
maintenanceTaskRepository.save(task);
}
@Override
@Transactional
public List<MaintenanceTask> generateTasksFromPlan(MaintenancePlan plan) {
List<MaintenanceTask> generatedTasks = new ArrayList<>();
// 根据触发类型生成相应数量的任务
int taskCount = 1; // 默认生成1个任务
if (plan.getTriggerValue() != null && plan.getTriggerValue() > 0) {
taskCount = plan.getTriggerValue();
}
for (int i = 0; i < taskCount; i++) {
MaintenanceTask task = new MaintenanceTask();
task.setProjectId(plan.getProjectId());
task.setPlanId(plan.getId());
task.setTriggerType(plan.getTriggerType());
task.setMaintenanceItems(plan.getMaintenanceItems());
task.setAssignedTo(plan.getAssignedTo());
task.setStatus(MaintenanceTask.Status.PENDING);
task.setTaskType(MaintenanceTask.TaskType.PREVENTIVE);
// 设置计划执行时间如果有
if (plan.getEstimatedDuration() != null) {
task.setScheduledDate(LocalDateTime.now().plusDays(i * (long) plan.getEstimatedDuration()));
}
MaintenanceTask savedTask = createTask(task);
generatedTasks.add(savedTask);
}
return generatedTasks;
}
/**
* 生成任务编码MT + yyyyMMddHHmmss
*/
private String generateTaskCode() {
String timestamp = LocalDateTime.now().format(CODE_FORMATTER);
String taskCode = "MT" + timestamp;
// 确保编码唯一
int suffix = 1;
while (maintenanceTaskRepository.existsByTaskCode(taskCode)) {
taskCode = "MT" + timestamp + "_" + suffix;
suffix++;
}
return taskCode;
}
}