gongchunyi
2026-05-15 7828b982da116070fe11526733609ecce23631b6
feat: 设备维修新增报修人、验收人、维修人
已添加1个文件
已修改8个文件
247 ■■■■ 文件已修改
doc/device_repair_add_acceptance_name.sql 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/FileNameType.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceRepair.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/IDeviceRepairService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java 161 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceRepairMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/device_repair_add_acceptance_name.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
-- ============================================================================
-- è®¾å¤‡æŠ¥ä¿® device_repair
-- ============================================================================
ALTER TABLE `device_repair`
    ADD COLUMN `acceptance_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '验收人' AFTER `repair_name`;
ALTER TABLE `device_repair`
    ADD COLUMN `acceptance_time` datetime NULL DEFAULT NULL COMMENT '验收时间' AFTER `acceptance_name`;
ALTER TABLE `device_repair`
    ADD COLUMN `acceptance_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '验收备注' AFTER `acceptance_time`;
-- çŠ¶æ€è¯´æ˜Žï¼š0-待维修 1-完成 2-维修失败 3-待验收
src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -17,7 +17,9 @@
    INSPECTION_PRODUCTION_BEFORE(10),
    INSPECTION_PRODUCTION_AFTER(11),
    INSPECTION(12),//巡检 ç”Ÿäº§å‰
    EQUIPMENT_WARRANTY(13);   //  è®¾å¤‡ä¿ä¿®
    EQUIPMENT_WARRANTY(13),   //  è®¾å¤‡ä¿ä¿®
    EQUIPMENT_REPAIR_PROBLEM(14),   // è®¾å¤‡æŠ¥ä¿®-设备问题图片
    EQUIPMENT_REPAIR_MAINTAIN(15);  // è®¾å¤‡æŠ¥ä¿®-维修完成图片
    private final int value;
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -10,7 +10,6 @@
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -39,7 +38,8 @@
    @PostMapping()
    @ApiOperation("添加设备报修")
    public AjaxResult add(@RequestBody DeviceRepair deviceRepair) {
        return deviceRepairService.saveDeviceRepair(deviceRepair);
        Long id = deviceRepairService.saveDeviceRepair(deviceRepair);
        return AjaxResult.success("添加成功", id);
    }
    @ApiOperation("根据id查询设备报修")
@@ -52,13 +52,22 @@
    @PutMapping()
    @ApiOperation("修改设备报修")
    public AjaxResult update(@RequestBody DeviceRepair deviceRepair) {
        return deviceRepairService.updateDeviceRepair(deviceRepair);
        deviceRepairService.updateDeviceRepair(deviceRepair);
        return AjaxResult.success();
    }
    @PostMapping("repair")
    @ApiOperation("设备维修")
    public AjaxResult repair(@RequestBody DeviceRepair deviceRepair) {
        return deviceRepairService.updateDeviceRepair(deviceRepair);
        deviceRepairService.submitDeviceMaintain(deviceRepair);
        return AjaxResult.success();
    }
    @PostMapping("acceptance")
    @ApiOperation("设备报修验收")
    public AjaxResult acceptance(@RequestBody DeviceRepair deviceRepair) {
        deviceRepairService.acceptDeviceRepair(deviceRepair);
        return AjaxResult.success();
    }
    @DeleteMapping("/{ids}")
@@ -78,9 +87,9 @@
    }
    @PostMapping("/uploadFile")
    @ApiOperation("设备保修-附件上传")
    public AjaxResult uploadFile(MultipartFile file, Long deviceRepairId) {
        deviceRepairService.uploadFile(file, deviceRepairId);
    @ApiOperation("设备保修-附件上传(fileType: 14设备问题 15维修完成)")
    public AjaxResult uploadFile(MultipartFile file, Long deviceRepairId, Integer fileType) {
        deviceRepairService.uploadFile(file, deviceRepairId, fileType);
        return AjaxResult.success();
    }
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
@@ -32,6 +32,17 @@
    @ApiModelProperty("报修人")
    private String repairName;
    @ApiModelProperty("验收人")
    private String acceptanceName;
    @ApiModelProperty("验收时间")
    private Date acceptanceTime;
    private String acceptanceTimeStr;
    @ApiModelProperty("验收备注")
    private String acceptanceRemark;
    @ApiModelProperty("报修内容")
    private String remark;
src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java
@@ -27,6 +27,10 @@
    @Excel(name = "报修人")
    private String repairName;
    @ApiModelProperty("验收人")
    @Excel(name = "验收人")
    private String acceptanceName;
    @ApiModelProperty("报修内容")
    @Excel(name = "报修内容")
    private String remark;
src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -31,6 +31,17 @@
    @ApiModelProperty("报修人")
    private String repairName;
    @ApiModelProperty("验收人")
    private String acceptanceName;
    @ApiModelProperty("验收时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime acceptanceTime;
    @ApiModelProperty("验收备注")
    private String acceptanceRemark;
    @ApiModelProperty("报修内容")
    private String remark;
@@ -45,7 +56,7 @@
    @ApiModelProperty("维修结果")
    private String maintenanceResult;
    @ApiModelProperty("状态 0 å¾…ç»´ä¿® 1完结 2 å¤±è´¥")
    @ApiModelProperty("状态 0待维修 1完成 2维修失败 3待验收")
    private Integer status;
    @ApiModelProperty("创建时间")
src/main/java/com/ruoyi/device/service/IDeviceRepairService.java
@@ -5,7 +5,6 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.pojo.CommonFile;
import org.springframework.web.multipart.MultipartFile;
@@ -18,15 +17,19 @@
    IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto);
    AjaxResult saveDeviceRepair(DeviceRepair deviceRepair);
    Long saveDeviceRepair(DeviceRepair deviceRepair);
    AjaxResult updateDeviceRepair(DeviceRepair deviceRepair);
    void updateDeviceRepair(DeviceRepair deviceRepair);
    void submitDeviceMaintain(DeviceRepair deviceRepair);
    void acceptDeviceRepair(DeviceRepair deviceRepair);
    void export(HttpServletResponse response, Long[] ids);
    DeviceRepairDto detailById(Long id);
    void uploadFile(MultipartFile file, Long deviceRepairId);
    void uploadFile(MultipartFile file, Long deviceRepairId, Integer fileType);
    List<CommonFile> getFiles(Long deviceRepairId);
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -6,6 +6,8 @@
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;
@@ -17,7 +19,6 @@
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;
@@ -31,11 +32,13 @@
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
@@ -62,24 +65,106 @@
    }
    @Override
    public AjaxResult saveDeviceRepair(DeviceRepair deviceRepair) {
    public Long saveDeviceRepair(DeviceRepair deviceRepair) {
        DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId());
        if (byId == null) {
            throw new ServiceException("设备台账不存在");
        }
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        boolean save = this.save(deviceRepair);
        if (save) {
            return AjaxResult.success();
        if (!this.save(deviceRepair)) {
            throw new ServiceException("添加失败");
        }
        return AjaxResult.error();
        return deviceRepair.getId();
    }
    @Override
    public AjaxResult updateDeviceRepair(DeviceRepair deviceRepair) {
        if (this.updateById(deviceRepair)) {
            Long id = deviceRepair.getId();
            //
    public void updateDeviceRepair(DeviceRepair deviceRepair) {
        DeviceRepair existing = this.getById(deviceRepair.getId());
        if (existing == null) {
            throw new ServiceException("报修单不存在");
        }
        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(id);
        deviceDefectRecordDto.setDeviceLedgerId(repairId);
            deviceDefectRecordDto.setStatus("严重缺陷");
            List<DeviceDefectRecordDto> records = deviceDefectRecordService.listPage(new Page<>(1, -1), deviceDefectRecordDto).getRecords();
            if (!records.isEmpty()) {
@@ -88,9 +173,24 @@
                    deviceDefectRecordService.updateByDDR(deviceDefectRecord);
                });
            }
            return AjaxResult.success();
        }
        return AjaxResult.error();
    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
@@ -101,7 +201,7 @@
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair, deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : deviceRepair.getStatus() == 1 ? "完结" : "失败");
                deviceRepairExeclDto.setStatusStr(statusLabel(deviceRepair.getStatus()));
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
            });
@@ -117,7 +217,7 @@
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair, deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : deviceRepair.getStatus() == 1 ? "完结" : "失败");
                deviceRepairExeclDto.setStatusStr(statusLabel(deviceRepair.getStatus()));
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
            });
@@ -134,19 +234,41 @@
    }
    @Override
    public void uploadFile(MultipartFile file, Long deviceRepairId) {
    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, FileNameType.EQUIPMENT_WARRANTY.getValue(), deviceRepairId);
            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
@@ -157,7 +279,8 @@
        return commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                .eq(CommonFile::getCommonId, deviceRepairId)
                .eq(CommonFile::getType, FileNameType.EQUIPMENT_WARRANTY.getValue()));
                .in(CommonFile::getType, repairFileTypes())
                .orderByAsc(CommonFile::getId));
    }
    @Override
@@ -190,7 +313,7 @@
        List<CommonFile> fileList = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                .in(CommonFile::getCommonId, ids)
                .eq(CommonFile::getType, FileNameType.EQUIPMENT_WARRANTY.getValue()));
                .in(CommonFile::getType, repairFileTypes()));
        for (CommonFile commonFile : fileList) {
            deleteFile(commonFile.getId());
        }
src/main/resources/mapper/device/DeviceRepairMapper.xml
@@ -10,6 +10,9 @@
               dr.device_ledger_id,
                dr.repair_time,
                dr.repair_name,
                dr.acceptance_name,
                dr.acceptance_time,
                dr.acceptance_remark,
                dr.remark,
                dr.maintenance_name,
                dr.maintenance_time,
@@ -55,6 +58,9 @@
               dr.device_ledger_id,
               dr.repair_time,
               dr.repair_name,
               dr.acceptance_name,
               dr.acceptance_time,
               dr.acceptance_remark,
               dr.remark,
               dr.maintenance_name,
               dr.maintenance_time,