gongchunyi
5 天以前 089964a497c2528e88ddc610af5f88f631303431
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -1,34 +1,62 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.execl.DeviceRepairExeclDto;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.device.service.IDeviceLedgerService;
import com.ruoyi.device.service.IDeviceRepairService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.other.service.TempFileService;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@Service
@AllArgsConstructor
@Slf4j
public class DeviceRepairServiceImpl extends ServiceImpl<DeviceRepairMapper, DeviceRepair> implements IDeviceRepairService {
    @Autowired
    private DeviceDefectRecordService deviceDefectRecordService;
    @Autowired
    private DeviceRepairMapper deviceRepairMapper;
    @Autowired
    private IDeviceLedgerService deviceLedgerService;
    @Autowired
    private CommonFileMapper commonFileMapper;
    @Autowired
    private TempFileService tempFileService;
    @Override
    public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) {
@@ -37,20 +65,132 @@
    }
    @Override
    public AjaxResult saveDeviceRepair(DeviceRepair deviceRepair) {
        boolean save = this.save(deviceRepair);
        if (save){
            return AjaxResult.success();
    public Long saveDeviceRepair(DeviceRepair deviceRepair) {
        DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId());
        if (byId == null) {
            throw new ServiceException("设备台账不存在");
        }
        return AjaxResult.error();
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        if (!this.save(deviceRepair)) {
            throw new ServiceException("添加失败");
        }
        return deviceRepair.getId();
    }
    @Override
    public AjaxResult updateDeviceRepair(DeviceRepair deviceRepair) {
        if (this.updateById(deviceRepair)) {
            return AjaxResult.success();
    public void updateDeviceRepair(DeviceRepair deviceRepair) {
        DeviceRepair existing = this.getById(deviceRepair.getId());
        if (existing == null) {
            throw new ServiceException("报修单不存在");
        }
        return AjaxResult.error();
        if (!Objects.equals(existing.getStatus(), 0)) {
            throw new ServiceException("仅待维修状态可编辑");
        }
        if (!this.updateById(deviceRepair)) {
            throw new ServiceException("修改失败");
        }
        clearDefectRecordsIfNeeded(deviceRepair.getId());
    }
    @Override
    public void submitDeviceMaintain(DeviceRepair deviceRepair) {
        if (deviceRepair == null || deviceRepair.getId() == null) {
            throw new ServiceException("报修单ID不能为空");
        }
        DeviceRepair existing = this.getById(deviceRepair.getId());
        if (existing == null) {
            throw new ServiceException("报修单不存在");
        }
        if (!Objects.equals(existing.getStatus(), 0)) {
            throw new ServiceException("仅待维修状态可提交维修");
        }
        if (StringUtils.isEmpty(deviceRepair.getMaintenanceResult())) {
            throw new ServiceException("请填写维修结果");
        }
        String loginNick = SecurityUtils.getLoginUser().getNickName();
        if (StringUtils.isEmpty(existing.getMaintenanceName())) {
            throw new ServiceException("未指定维修人,无法维修");
        }
        if (!Objects.equals(existing.getMaintenanceName(), loginNick)) {
            throw new ServiceException("仅指定的维修人可进行维修");
        }
        existing.setMaintenanceResult(deviceRepair.getMaintenanceResult());
        existing.setMaintenanceTime(deviceRepair.getMaintenanceTime() != null
                ? deviceRepair.getMaintenanceTime() : LocalDateTime.now());
        // 维修失败=2,否则进入待验收=3
        if (Objects.equals(deviceRepair.getStatus(), 2)) {
            existing.setStatus(2);
        } else {
            existing.setStatus(3);
        }
        if (!this.updateById(existing)) {
            throw new ServiceException("提交维修失败");
        }
        clearDefectRecordsIfNeeded(existing.getId());
    }
    @Override
    public void acceptDeviceRepair(DeviceRepair deviceRepair) {
        if (deviceRepair == null || deviceRepair.getId() == null) {
            throw new ServiceException("报修单ID不能为空");
        }
        DeviceRepair existing = this.getById(deviceRepair.getId());
        if (existing == null) {
            throw new ServiceException("报修单不存在");
        }
        if (!Objects.equals(existing.getStatus(), 3)) {
            throw new ServiceException("当前状态不可验收");
        }
        String loginNick = SecurityUtils.getLoginUser().getNickName();
        if (StringUtils.isEmpty(existing.getAcceptanceName())) {
            throw new ServiceException("未指定验收人,无法验收");
        }
        if (!Objects.equals(existing.getAcceptanceName(), loginNick)) {
            throw new ServiceException("仅指定的验收人可进行验收");
        }
        if (StringUtils.isEmpty(deviceRepair.getAcceptanceRemark())) {
            throw new ServiceException("请填写验收备注");
        }
        existing.setAcceptanceTime(deviceRepair.getAcceptanceTime() != null
                ? deviceRepair.getAcceptanceTime() : LocalDateTime.now());
        existing.setAcceptanceRemark(deviceRepair.getAcceptanceRemark());
        existing.setStatus(1);
        if (!this.updateById(existing)) {
            throw new ServiceException("验收失败");
        }
        clearDefectRecordsIfNeeded(existing.getId());
    }
    private void clearDefectRecordsIfNeeded(Long repairId) {
        DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto();
        deviceDefectRecordDto.setDeviceLedgerId(repairId);
        deviceDefectRecordDto.setStatus("严重缺陷");
        List<DeviceDefectRecordDto> records = deviceDefectRecordService.listPage(new Page<>(1, -1), deviceDefectRecordDto).getRecords();
        if (!records.isEmpty()) {
            records.forEach(deviceDefectRecord -> {
                deviceDefectRecord.setStatus("正常");
                deviceDefectRecordService.updateByDDR(deviceDefectRecord);
            });
        }
    }
    private static String statusLabel(Integer status) {
        if (status == null) {
            return "";
        }
        switch (status) {
            case 0:
                return "待维修";
            case 1:
                return "完成";
            case 2:
                return "维修失败";
            case 3:
                return "待验收";
            default:
                return "";
        }
    }
    @Override
@@ -60,24 +200,24 @@
            ArrayList<DeviceRepairExeclDto> deviceLedgerExeclDtos = new ArrayList<>();
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : "完结");
                BeanUtils.copyProperties(deviceRepair, deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(statusLabel(deviceRepair.getStatus()));
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
            });
            ExcelUtil<DeviceRepairExeclDto> util = new ExcelUtil<DeviceRepairExeclDto>(DeviceRepairExeclDto.class);
            util.exportExcel(response, deviceLedgerExeclDtos, "设备报修导出");
        }else {
        } else {
            ArrayList<Long> arrayList = new ArrayList<>();
            Arrays.stream(ids).map(id -> {
                return arrayList.add( id);
                return arrayList.add(id);
            });
            List<DeviceRepair> supplierManageList = deviceRepairMapper.selectBatchIds(arrayList);
            ArrayList<DeviceRepairExeclDto> deviceLedgerExeclDtos = new ArrayList<>();
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : "完结");
                BeanUtils.copyProperties(deviceRepair, deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(statusLabel(deviceRepair.getStatus()));
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
            });
@@ -87,4 +227,96 @@
    }
    @Override
    public DeviceRepairDto detailById(Long id) {
        return deviceRepairMapper.detailById(id);
    }
    @Override
    public void uploadFile(MultipartFile file, Long deviceRepairId, Integer fileType) {
        if (file == null || file.isEmpty()) {
            throw new ServiceException("上传失败,文件不能为空");
        }
        if (deviceRepairId == null || deviceRepairId <= 0) {
            throw new ServiceException("上传失败,设备报修ID不能为空");
        }
        int resolvedType = resolveRepairFileType(fileType);
        try {
            tempFileService.uploadByCommon(file, resolvedType, deviceRepairId);
        } catch (Exception e) {
            throw new ServiceException("上传失败," + e.getMessage());
        }
    }
    /** 设备报修附件类型:14设备问题 15维修完成;13为历史类型归入设备问题 */
    private int resolveRepairFileType(Integer fileType) {
        if (fileType == null) {
            return FileNameType.EQUIPMENT_REPAIR_PROBLEM.getValue();
        }
        if (Objects.equals(fileType, FileNameType.EQUIPMENT_REPAIR_PROBLEM.getValue())
                || Objects.equals(fileType, FileNameType.EQUIPMENT_REPAIR_MAINTAIN.getValue())
                || Objects.equals(fileType, FileNameType.EQUIPMENT_WARRANTY.getValue())) {
            return fileType;
        }
        throw new ServiceException("上传失败,附件类型无效");
    }
    private List<Integer> repairFileTypes() {
        return Arrays.asList(
                FileNameType.EQUIPMENT_REPAIR_PROBLEM.getValue(),
                FileNameType.EQUIPMENT_REPAIR_MAINTAIN.getValue(),
                FileNameType.EQUIPMENT_WARRANTY.getValue()
        );
    }
    @Override
    public List<CommonFile> getFiles(Long deviceRepairId) {
        if (deviceRepairId == null || deviceRepairId <= 0) {
            return Collections.emptyList();
        }
        return commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                .eq(CommonFile::getCommonId, deviceRepairId)
                .in(CommonFile::getType, repairFileTypes())
                .orderByAsc(CommonFile::getId));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteFile(Long fileId) {
        if (fileId == null || fileId <= 0) {
            throw new ServiceException("删除失败,传入数据异常");
        }
        CommonFile commonFile = commonFileMapper.selectById(fileId);
        if (commonFile == null) {
            throw new ServiceException("删除失败,文件不存在");
        }
        try {
            if (commonFile.getUrl() != null && !commonFile.getUrl().isEmpty()) {
                Files.deleteIfExists(Paths.get(commonFile.getUrl()));
            }
        } catch (Exception e) {
            log.error("设备保修文件删除失败: {}", e.getMessage());
            throw new ServiceException("删除失败," + e.getMessage());
        }
        commonFileMapper.deleteById(fileId);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteRepairAndFiles(Collection<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            throw new ServiceException("删除失败,请传入要删除的数据");
        }
        List<CommonFile> fileList = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                .in(CommonFile::getCommonId, ids)
                .in(CommonFile::getType, repairFileTypes()));
        for (CommonFile commonFile : fileList) {
            deleteFile(commonFile.getId());
        }
        return this.removeBatchByIds(ids);
    }
}