doc/maintenance_task_add_person_and_items.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ -- ============================================================================ -- 宿¶ä¿å »ä»»å¡ maintenance_taskï¼ä¿å »äººãä¿å »é¡¹ç® -- 设å¤ä¿å »è®°å½ device_maintenanceï¼è®¡åä¿å »äºº -- ============================================================================ ALTER TABLE `maintenance_task` ADD COLUMN `maintenance_person_id` bigint NULL DEFAULT NULL COMMENT 'ä¿å »äººid' AFTER `registrant`; ALTER TABLE `maintenance_task` ADD COLUMN `maintenance_person` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'ä¿å »äºº' AFTER `maintenance_person_id`; ALTER TABLE `maintenance_task` ADD COLUMN `maintenance_items` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'ä¿å »é¡¹ç®' AFTER `maintenance_person`; ALTER TABLE `device_maintenance` ADD COLUMN `maintenance_person_id` bigint NULL DEFAULT NULL COMMENT '计åä¿å »äººid' AFTER `maintenance_actually_name`; ALTER TABLE `device_maintenance` ADD COLUMN `maintenance_person` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '计åä¿å »äºº' AFTER `maintenance_person_id`; src/main/java/com/ruoyi/device/controller/DeviceMaintenanceFileController.java
@@ -8,6 +8,7 @@ import io.swagger.annotations.Api; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.util.List; @@ -31,22 +32,41 @@ /** * æ°å¢ * * @param deviceMaintenanceFile * @return */ @PostMapping("/add") public AjaxResult add(@RequestBody DeviceMaintenanceFile deviceMaintenanceFile) { return AjaxResult.success(deviceMaintenanceFileService.save(deviceMaintenanceFile)); try { return AjaxResult.success(deviceMaintenanceFileService.saveRecord(deviceMaintenanceFile)); } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } /** * ä¸ä¼ éä»¶ */ @PostMapping("/upload") public AjaxResult upload(@RequestParam("file") MultipartFile file, @RequestParam("deviceMaintenanceId") Integer deviceMaintenanceId) { try { return AjaxResult.success(deviceMaintenanceFileService.uploadFile(file, deviceMaintenanceId)); } catch (Exception e) { return AjaxResult.error(e.getMessage()); } } /** * å é¤ * * @param ids * @return */ @DeleteMapping("/del") public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) { if(CollectionUtils.isEmpty(ids)){ if (CollectionUtils.isEmpty(ids)) { return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } //å 餿£éªéä»¶ @@ -54,14 +74,20 @@ } /** *å页æ¥è¯¢ * å页æ¥è¯¢ * * @param page * @param deviceMaintenanceFile * @return */ @GetMapping("/listPage") public AjaxResult qualityInspectFileListPage(Page page, DeviceMaintenanceFile deviceMaintenanceFile) { return AjaxResult.success(deviceMaintenanceFileService.page(page, Wrappers.<DeviceMaintenanceFile>lambdaQuery().eq(DeviceMaintenanceFile::getDeviceMaintenanceId,deviceMaintenanceFile.getDeviceMaintenanceId()))); Page<DeviceMaintenanceFile> result = deviceMaintenanceFileService.page(page, Wrappers.<DeviceMaintenanceFile>lambdaQuery() .eq(DeviceMaintenanceFile::getDeviceMaintenanceId, deviceMaintenanceFile.getDeviceMaintenanceId()) .orderByDesc(DeviceMaintenanceFile::getCreateTime)); deviceMaintenanceFileService.enrichAccessUrl(result.getRecords()); return AjaxResult.success(result); } src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -32,6 +32,9 @@ @ApiModelProperty("计åä¿å »æ¥æ") private String maintenancePlanTime; @ApiModelProperty("计åä¿å »äºº") private String maintenancePerson; @ApiModelProperty("å®é ä¿å »äºº") private String maintenanceActuallyName; src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -50,6 +50,12 @@ @ApiModelProperty("å®é ä¿å »äºº") private String maintenanceActuallyName; @ApiModelProperty("计åä¿å »äººid") private Long maintenancePersonId; @ApiModelProperty("计åä¿å »äºº") private String maintenancePerson; @ApiModelProperty("å®é ä¿å »æ¥æ") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") src/main/java/com/ruoyi/device/pojo/DeviceMaintenanceFile.java
@@ -37,6 +37,10 @@ @ApiModelProperty("æä»¶è·¯å¾") private String url; @ApiModelProperty("ä¸´æ¶æä»¶ID") @TableField(exist = false) private String tempId; @ApiModelProperty("æä»¶å¤§å°") private Integer fileSize; src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -69,6 +69,17 @@ @Excel(name = "å½å ¥äºº") private String registrant; @ApiModelProperty(value = "ä¿å »äººid") private Long maintenancePersonId; @ApiModelProperty(value = "ä¿å »äºº") @Excel(name = "ä¿å »äºº") private String maintenancePerson; @ApiModelProperty(value = "ä¿å »é¡¹ç®") @Excel(name = "ä¿å »é¡¹ç®") private String maintenanceItems; @ApiModelProperty(value = "å½å ¥æ¥æ") @Excel(name = "å½å ¥æ¥æ", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd") src/main/java/com/ruoyi/device/service/DeviceMaintenanceFileService.java
@@ -1,7 +1,11 @@ package com.ruoyi.device.service; import com.ruoyi.device.pojo.DeviceMaintenanceFile; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.device.pojo.DeviceMaintenanceFile; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; /** * <p> @@ -13,4 +17,11 @@ */ public interface DeviceMaintenanceFileService extends IService<DeviceMaintenanceFile> { DeviceMaintenanceFile uploadFile(MultipartFile file, Integer deviceMaintenanceId) throws IOException; DeviceMaintenanceFile bindFromTemp(String tempId, Integer deviceMaintenanceId, String name) throws IOException; DeviceMaintenanceFile saveRecord(DeviceMaintenanceFile deviceMaintenanceFile) throws IOException; void enrichAccessUrl(List<DeviceMaintenanceFile> files); } src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceFileServiceImpl.java
@@ -1,10 +1,31 @@ package com.ruoyi.device.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.device.mapper.DeviceMaintenanceFileMapper; import com.ruoyi.device.pojo.DeviceMaintenanceFile; import com.ruoyi.device.service.DeviceMaintenanceFileService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.framework.config.RuoYiConfig; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.UUID; /** * <p> @@ -15,6 +36,167 @@ * @since 2026-01-27 09:48:09 */ @Service public class DeviceMaintenanceFileServiceImpl extends ServiceImpl<DeviceMaintenanceFileMapper, DeviceMaintenanceFile> implements DeviceMaintenanceFileService { @Slf4j public class DeviceMaintenanceFileServiceImpl extends ServiceImpl<DeviceMaintenanceFileMapper, DeviceMaintenanceFile> implements DeviceMaintenanceFileService { @Resource private TempFileMapper tempFileMapper; @Value("${file.upload-dir}") private String uploadDir; @Value("${file.temp-dir}") private String tempDir; @Override public DeviceMaintenanceFile uploadFile(MultipartFile file, Integer deviceMaintenanceId) throws IOException { if (deviceMaintenanceId == null || deviceMaintenanceId <= 0) { throw new ServiceException("设å¤ä¿å »è®°å½IDä¸è½ä¸ºç©º"); } if (file == null || file.isEmpty()) { throw new ServiceException("ä¸ä¼ å¤±è´¥ï¼æä»¶ä¸è½ä¸ºç©º"); } Path formalPath = storeMultipartFile(file, deviceMaintenanceId); return insertFileRecord(deviceMaintenanceId, file.getOriginalFilename(), formalPath, (int) file.getSize()); } @Override public DeviceMaintenanceFile bindFromTemp(String tempId, Integer deviceMaintenanceId, String name) throws IOException { if (!StringUtils.hasText(tempId)) { throw new ServiceException("ä¸´æ¶æä»¶IDä¸è½ä¸ºç©º"); } if (deviceMaintenanceId == null || deviceMaintenanceId <= 0) { throw new ServiceException("设å¤ä¿å »è®°å½IDä¸è½ä¸ºç©º"); } TempFile tempFile = tempFileMapper.selectById(tempId); if (tempFile == null) { throw new ServiceException("ä¸´æ¶æä»¶ä¸åå¨æå·²è¿æ"); } Path source = Paths.get(tempFile.getTempPath()); if (!Files.exists(source)) { tempFileMapper.deleteById(tempId); throw new ServiceException("ä¸´æ¶æä»¶å·²å¤±æï¼è¯·éæ°ä¸ä¼ "); } Path formalPath = copyToFormalDir(source, deviceMaintenanceId, tempFile.getOriginalName()); Files.deleteIfExists(source); tempFileMapper.deleteById(tempId); String fileName = StringUtils.hasText(name) ? name : tempFile.getOriginalName(); return insertFileRecord(deviceMaintenanceId, fileName, formalPath, null); } @Override public DeviceMaintenanceFile saveRecord(DeviceMaintenanceFile deviceMaintenanceFile) throws IOException { if (deviceMaintenanceFile == null) { throw new ServiceException("éä»¶ä¿¡æ¯ä¸è½ä¸ºç©º"); } if (StringUtils.hasText(deviceMaintenanceFile.getTempId())) { return bindFromTemp( deviceMaintenanceFile.getTempId(), deviceMaintenanceFile.getDeviceMaintenanceId(), deviceMaintenanceFile.getName()); } String url = deviceMaintenanceFile.getUrl(); if (isTempStoragePath(url)) { throw new ServiceException("请å¿ç´æ¥ä¿å临æ¶ç®å½æä»¶ï¼è¯·ä½¿ç¨ä¸ä¼ æ¥å£æä¼ é tempId"); } if (StringUtils.hasText(url) && !url.startsWith(Constants.RESOURCE_PREFIX)) { deviceMaintenanceFile.setUrl(buildAccessLink(Paths.get(url))); } save(deviceMaintenanceFile); enrichAccessUrl(deviceMaintenanceFile); return deviceMaintenanceFile; } @Override public void enrichAccessUrl(List<DeviceMaintenanceFile> files) { if (files == null) { return; } files.forEach(this::enrichAccessUrl); } private void enrichAccessUrl(DeviceMaintenanceFile file) { if (file == null || !StringUtils.hasText(file.getUrl())) { return; } String url = file.getUrl().trim(); if (url.startsWith(Constants.RESOURCE_PREFIX) || url.startsWith("http://") || url.startsWith("https://")) { return; } try { file.setUrl(buildAccessLink(Paths.get(url))); } catch (Exception e) { log.warn("éä»¶URL转æ¢å¤±è´¥ id={} url={}", file.getId(), url); } } private Path storeMultipartFile(MultipartFile file, Integer deviceMaintenanceId) throws IOException { Path formalDirPath = resolveFormalDirPath(); Files.createDirectories(formalDirPath); String originalFilename = file.getOriginalFilename(); if (!StringUtils.hasText(originalFilename)) { throw new ServiceException("æä»¶åä¸è½ä¸ºç©º"); } Path formalPath = formalDirPath.resolve(buildFormalFilename(deviceMaintenanceId, originalFilename)); file.transferTo(formalPath.toFile()); return formalPath; } private Path copyToFormalDir(Path source, Integer deviceMaintenanceId, String originalFilename) throws IOException { Path formalDirPath = resolveFormalDirPath(); Files.createDirectories(formalDirPath); String name = StringUtils.hasText(originalFilename) ? originalFilename : source.getFileName().toString(); Path formalPath = formalDirPath.resolve(buildFormalFilename(deviceMaintenanceId, name)); Files.copy(source, formalPath, StandardCopyOption.REPLACE_EXISTING); return formalPath; } private Path resolveFormalDirPath() { String dir = uploadDir; if (!dir.endsWith("/") && !dir.endsWith("\\")) { dir = dir + "/"; } return Paths.get(dir + "deviceMaintenance/" + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE)); } private String buildFormalFilename(Integer deviceMaintenanceId, String originalFilename) { String ext = FilenameUtils.getExtension(originalFilename); String base = deviceMaintenanceId + "_" + System.currentTimeMillis() + "_" + UUID.randomUUID().toString().substring(0, 8); return StringUtils.hasText(ext) ? base + "." + ext : base; } private DeviceMaintenanceFile insertFileRecord(Integer deviceMaintenanceId, String name, Path formalPath, Integer fileSize) { DeviceMaintenanceFile record = new DeviceMaintenanceFile(); record.setName(name); record.setUrl(buildAccessLink(formalPath)); record.setFileSize(fileSize); record.setDeviceMaintenanceId(deviceMaintenanceId); save(record); return record; } private boolean isTempStoragePath(String url) { if (!StringUtils.hasText(url)) { return false; } String normalized = url.replace("\\", "/").toLowerCase(); return normalized.contains("/temp/") || normalized.contains("temp/uploads"); } private String buildAccessLink(Path formalFilePath) { String normalizedPath = formalFilePath.toString().replace("\\", "/"); String profile = RuoYiConfig.getProfile(); String normalizedProfile = profile == null ? "" : profile.replace("\\", "/"); String relativePath = normalizedPath; if (StringUtils.hasText(normalizedProfile) && normalizedPath.startsWith(normalizedProfile)) { relativePath = normalizedPath.substring(normalizedProfile.length()); } if (!relativePath.startsWith("/")) { relativePath = "/" + relativePath; } return Constants.RESOURCE_PREFIX + relativePath; } } src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -37,8 +37,8 @@ @Override public AjaxResult saveDeviceRepair(DeviceMaintenance deviceMaintenance) { boolean save = this.save(deviceMaintenance); if (save){ return AjaxResult.success(); if (save) { return AjaxResult.success(deviceMaintenance); } return AjaxResult.error(); } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
@@ -97,6 +97,11 @@ inspectionTask.setTenantId(timingTask.getTenantId()); inspectionTask.setStatus(0); inspectionTask.setDeviceModel(timingTask.getDeviceModel()); inspectionTask.setMaintenanceLocation(timingTask.getMaintenanceItems()); if (timingTask.getMaintenancePersonId() != null) { inspectionTask.setMaintenancePersonId(timingTask.getMaintenancePersonId()); inspectionTask.setMaintenancePerson(timingTask.getMaintenancePerson()); } inspectionTask.setCreateUser(Integer.parseInt(timingTask.getRegistrantId().toString())); inspectionTask.setUpdateTime(LocalDateTime.now()); inspectionTask.setCreateTime(LocalDateTime.now()); src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -66,6 +66,9 @@ if (task.getRegistrantId() != null) { userIds.add(task.getRegistrantId()); } if (task.getMaintenancePersonId() != null) { userIds.add(task.getMaintenancePersonId()); } }); // 4. æ¹éæ¥è¯¢ç¨æ·ä¿¡æ¯ @@ -75,10 +78,12 @@ users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName())); } taskPage.getRecords().forEach(task -> { // 设置ç»è®°äººæµç§° if (task.getRegistrantId() != null) { task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "æªç¥ç¨æ·")); } if (task.getMaintenancePersonId() != null) { task.setMaintenancePerson(userNickNameMap.getOrDefault(task.getMaintenancePersonId(), "æªç¥ç¨æ·")); } }); return AjaxResult.success(taskPage); } src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -18,6 +18,7 @@ dm.update_user, dm.tenant_id, dm.maintenance_actually_name, dm.maintenance_person, dm.maintenance_location, dl.device_name, dl.device_model, @@ -67,6 +68,7 @@ dm.update_user, dm.tenant_id, dm.maintenance_actually_name, dm.maintenance_person, dm.maintenance_location, dl.device_name, dl.device_model,