package com.estate.expert.admin.service.impl; import com.estate.expert.admin.domain.business.device.DeviceType; import com.estate.expert.admin.domain.business.device.usage.DeviceUsage; import com.estate.expert.admin.domain.business.device.usage.DeviceUsageDto; import com.estate.expert.admin.domain.business.device.usage.DeviceUsageRepository; import com.estate.expert.admin.domain.common.request.PageReq; import com.estate.expert.admin.domain.common.response.PageResp; import com.estate.expert.admin.domain.project.ProjectRepository; import com.estate.expert.admin.domain.user.User; import com.estate.expert.admin.enums.BizResultCode; import com.estate.expert.admin.service.DeviceService; import com.estate.expert.admin.service.DeviceUsageService; import com.estate.expert.admin.service.common.CrudServiceBaseImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.UUID; /** * 设备使用服务实现 */ @Service @Slf4j public class DeviceUsageServiceImpl extends CrudServiceBaseImpl implements DeviceUsageService { @Resource private DeviceUsageRepository repository; @Resource private DeviceService deviceService; @Resource private ProjectRepository projectRepository; @Override public PageResp listUsages(Integer projectId, DeviceType deviceType, PageReq pageReq) { var page = repository.list(projectId, deviceType, pageReq.toPageRequest()); return PageResp.of(page, toDto(page.getContent())); } @Override public PageResp history(Integer projectId, DeviceType deviceType, PageReq pageReq) { var page = repository.history(projectId, deviceType, pageReq.toPageRequest()); return PageResp.of(page, toDto(page.getContent())); } @Override public List listUsages(Integer projectId, DeviceType deviceType) { return repository.list(projectId, deviceType); } @Override public void removeById(List ids) { var usages = repository.findAllById(ids); usages.forEach(deviceUsage -> { deviceUsage.setDisabled(true); deviceUsage.setDeleted(true); }); repository.saveAll(usages); } @Transactional @Override public DeviceUsage add(User user, DeviceUsage usage) { var device = deviceService.get(usage.getDevice().getId()); BizResultCode.DEVICE_NOT_FOUND.check(device == null); BizResultCode.DEVICE_IS_BUSY.check(device.isBusy()); var project = projectRepository.findById(usage.getProject().getId()); BizResultCode.BIZ_PROJECT_NOT_EXIST.check(project.isEmpty()); // 占用设备,防止其他项目使用 device.setBusy(true); deviceService.save(device); usage.setName(UUID.randomUUID().toString()); return super.add(user, usage); } @Override protected void beforeDelete(DeviceUsage entity) { var device = deviceService.get(entity.getDevice().getId()); BizResultCode.DEVICE_NOT_FOUND.check(device == null); // 释放设备,可以被其他项目使用 device.setBusy(false); deviceService.save(device); } }