package com.ruoyi.device.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.device.mapper.MaintenanceItemMapper; import com.ruoyi.device.pojo.MaintenanceItem; import com.ruoyi.device.service.MaintenanceItemService; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor public class MaintenanceItemServiceImpl extends ServiceImpl implements MaintenanceItemService { private static final List VALID_FREQUENCIES = List.of( "DAILY", "WEEKLY", "MONTHLY", "QUARTERLY", "ALL" ); private final MaintenanceItemMapper maintenanceItemMapper; @Override public List listActive() { return list(new LambdaQueryWrapper() .eq(MaintenanceItem::getDeleted, 0) .eq(MaintenanceItem::getIsActive, 1) .orderByAsc(MaintenanceItem::getSortNum) .orderByAsc(MaintenanceItem::getId)); } @Override public List list(MaintenanceItem query) { LambdaQueryWrapper wrapper = buildQueryWrapper(query, false) .orderByDesc(MaintenanceItem::getId); return maintenanceItemMapper.selectList(wrapper); } @Override public Page page( long pageNum, long pageSize, boolean includeCommon, MaintenanceItem query ) { long safePageNum = Math.max(pageNum, 1); long safePageSize = Math.min(Math.max(pageSize, 1), 100); LambdaQueryWrapper wrapper = buildQueryWrapper(query, includeCommon) .orderByAsc(MaintenanceItem::getSortNum) .orderByAsc(MaintenanceItem::getId); return maintenanceItemMapper.selectPage(new Page<>(safePageNum, safePageSize), wrapper); } @Override @Transactional(rollbackFor = Exception.class) public void createItem(MaintenanceItem item) { if (!isValid(item)) { throw new ServiceException("保养项目、保养内容和频率不能为空或无效"); } normalize(item); item.setDeleted(0); if (existsName(item, null)) { throw new ServiceException("该设备和频率下已存在同名保养内容"); } if (maintenanceItemMapper.insert(item) <= 0) { throw new ServiceException("新增保养项目失败"); } } @Override @Transactional(rollbackFor = Exception.class) public void updateItem(MaintenanceItem item) { if (item == null || item.getId() == null || !isValid(item)) { throw new ServiceException("保养项目、保养内容和频率不能为空或无效"); } MaintenanceItem existingItem = maintenanceItemMapper.selectById(item.getId()); if (existingItem == null || Integer.valueOf(1).equals(existingItem.getDeleted())) { throw new ServiceException("保养项目不存在"); } normalize(item); if (existsName(item, item.getId())) { throw new ServiceException("该设备和频率下已存在同名保养内容"); } existingItem.setItemProject(item.getItemProject()); existingItem.setItemName(item.getItemName()); existingItem.setDeviceLedgerId(item.getDeviceLedgerId()); existingItem.setFrequencyType(item.getFrequencyType()); existingItem.setSortNum(item.getSortNum() == null ? 0 : item.getSortNum()); existingItem.setIsActive(item.getIsActive() == null ? existingItem.getIsActive() : item.getIsActive()); existingItem.setRemarks(item.getRemarks()); if (maintenanceItemMapper.updateById(existingItem) <= 0) { throw new ServiceException("修改保养项目失败"); } } @Override @Transactional(rollbackFor = Exception.class) public void deleteItem(Long id) { if (id == null) { throw new ServiceException("保养项目编号不能为空"); } MaintenanceItem item = maintenanceItemMapper.selectById(id); if (item == null || Integer.valueOf(1).equals(item.getDeleted())) { throw new ServiceException("保养项目不存在"); } item.setDeleted(1); item.setIsActive(0); if (maintenanceItemMapper.updateById(item) <= 0) { throw new ServiceException("删除保养项目失败"); } } private LambdaQueryWrapper buildQueryWrapper( MaintenanceItem query, boolean includeCommon ) { MaintenanceItem filter = query == null ? new MaintenanceItem() : query; LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(MaintenanceItem::getDeleted, 0); if (StringUtils.isNotBlank(filter.getItemName())) { wrapper.like(MaintenanceItem::getItemName, filter.getItemName().trim()); } if (StringUtils.isNotBlank(filter.getItemProject())) { wrapper.like(MaintenanceItem::getItemProject, filter.getItemProject().trim()); } if (filter.getIsActive() != null) { wrapper.eq(MaintenanceItem::getIsActive, filter.getIsActive()); } if (filter.getDeviceLedgerId() != null) { if (includeCommon) { wrapper.and(condition -> condition .eq(MaintenanceItem::getDeviceLedgerId, filter.getDeviceLedgerId()) .or() .isNull(MaintenanceItem::getDeviceLedgerId)); } else { wrapper.eq(MaintenanceItem::getDeviceLedgerId, filter.getDeviceLedgerId()); } } if (StringUtils.isNotBlank(filter.getFrequencyType())) { if (includeCommon) { wrapper.and(condition -> condition .eq(MaintenanceItem::getFrequencyType, filter.getFrequencyType()) .or() .eq(MaintenanceItem::getFrequencyType, "ALL")); } else { wrapper.eq(MaintenanceItem::getFrequencyType, filter.getFrequencyType()); } } return wrapper; } private boolean isValid(MaintenanceItem item) { return item != null && StringUtils.isNotBlank(item.getItemProject()) && StringUtils.isNotBlank(item.getItemName()) && StringUtils.isNotBlank(item.getFrequencyType()) && VALID_FREQUENCIES.contains(item.getFrequencyType()); } private void normalize(MaintenanceItem item) { item.setItemProject(item.getItemProject().trim()); item.setItemName(item.getItemName().trim()); item.setSortNum(item.getSortNum() == null ? 0 : item.getSortNum()); item.setIsActive(item.getIsActive() == null ? 1 : item.getIsActive()); } private boolean existsName(MaintenanceItem item, Long excludedId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(MaintenanceItem::getDeleted, 0) .eq(MaintenanceItem::getItemName, item.getItemName()) .eq(MaintenanceItem::getFrequencyType, item.getFrequencyType()); if (item.getDeviceLedgerId() == null) { wrapper.isNull(MaintenanceItem::getDeviceLedgerId); } else { wrapper.eq(MaintenanceItem::getDeviceLedgerId, item.getDeviceLedgerId()); } if (excludedId != null) { wrapper.ne(MaintenanceItem::getId, excludedId); } return maintenanceItemMapper.selectCount(wrapper) > 0; } }