src/main/java/com/ruoyi/basic/dto/StorageAttachmentDTO.java
@@ -10,5 +10,5 @@ /** * å卿件å表 */ private List<StorageBlobVO> storageBlobVOS; private List<StorageBlobDTO> storageBlobDTOs; } src/main/java/com/ruoyi/basic/dto/StorageAttachmentVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.ruoyi.basic.dto; import com.ruoyi.basic.pojo.StorageAttachment; import lombok.Data; import java.util.List; @Data public class StorageAttachmentVO extends StorageAttachment { /** * å卿件å表 */ private List<StorageBlobVO> storageBlobVOS; } src/main/java/com/ruoyi/basic/dto/StorageBlobDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package com.ruoyi.basic.dto; import com.ruoyi.basic.pojo.StorageBlob; import lombok.Data; @Data public class StorageBlobDTO extends StorageBlob { /** * é¢è§å°å */ private String previewURL; /** * ä¸è½½å°å */ private String downloadURL; } src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java
@@ -2,7 +2,10 @@ public enum ApplicationTypeEnum { IMAGE("image"), FILE("file"); FILE("file"), AFTER_FILE("after_file"), BEFORE_FILE("before_file"); private final String type; ApplicationTypeEnum(String type) { this.type = type; } src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -1,7 +1,8 @@ package com.ruoyi.basic.enums; public enum RecordTypeEnum { FILE("file"); SHIPPING_INFO("shipping_info"), INSPECTION_TASK("inspection_task"); private final String type; RecordTypeEnum(String type) { this.type = type; } src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java
@@ -5,7 +5,7 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; import java.time.LocalDateTime; /** * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ å®ä½ç±» @@ -23,12 +23,12 @@ /** å建æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) private Date createTime; private LocalDateTime createTime; /** æ´æ°æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; private LocalDateTime updateTime; /** * é»è¾å é¤ @@ -55,4 +55,4 @@ */ @TableField(value = "storage_blob_id") private Long storageBlobId; } } src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java
@@ -16,14 +16,6 @@ * @since 2025-05-29 */ public interface StorageAttachmentService extends IService<StorageAttachment> { /** * æ¥è¯¢éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ * @param recordId å ³èè®°å½id * @param recordType å ³èè®°å½ç±»å * @param fileType æä»¶ç±»å * @return æä»¶ä¿¡æ¯å表 */ List<StorageAttachment> selectStorageAttachments(Long recordId, StorageAttachmentRecordType recordType, String fileType); /** * ä¿åéç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
@@ -8,7 +8,6 @@ import com.ruoyi.basic.service.StorageBlobService; import com.ruoyi.common.constant.StorageAttachmentConstants; import com.ruoyi.common.enums.StorageAttachmentRecordType; import com.ruoyi.common.utils.MinioUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -31,28 +30,6 @@ private final StorageBlobService storageBlobService; private final MinioUtils minioUtils; @Override public List<StorageAttachment> selectStorageAttachments(Long recordId, StorageAttachmentRecordType recordType, String fileType) { // todo fileChange // List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() // .eq(StorageAttachment::getRecordId, recordId) // .eq(StorageAttachment::getRecordType, recordType.ordinal()) // .eq(StorageAttachment::getName, fileType)); // if (storageAttachments != null) { // for (StorageAttachment storageAttachment : storageAttachments) { // StorageBlob storageBlob = storageBlobMapper.selectById(storageAttachment.getStorageBlobId()); // StorageBlobDTO storageBlobDTO = new StorageBlobDTO(); // BeanUtils.copyProperties(storageBlob, storageBlobDTO); // storageBlobDTO.setUrl(minioUtils.getPreviewUrl(storageBlob.getBucketName(), storageBlob.getBucketName(), true)); // storageAttachment.setStorageBlobDTO(storageBlobDTO); // } // } // return storageAttachments; return null; } @Override public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType) { src/main/java/com/ruoyi/basic/utils/FileUtil.java
@@ -2,7 +2,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.ruoyi.basic.dto.StorageAttachmentDTO; import com.ruoyi.basic.dto.StorageAttachmentVO; import com.ruoyi.basic.dto.StorageBlobDTO; import com.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; @@ -48,10 +49,10 @@ * @param application æä»¶ç¨é * @param recordType å ³èè®°å½ç±»å * @param recordId å ³èè®°å½id * @param storageBlobVOS æä»¶ä¿¡æ¯ * @param storageBlobDTOS æä»¶ä¿¡æ¯ */ public void saveStorageAttachment(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, List<StorageBlobVO> storageBlobVOS) { if (CollectionUtils.isEmpty(storageBlobVOS)) { public void saveStorageAttachment(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, List<StorageBlobDTO> storageBlobDTOS) { if (CollectionUtils.isEmpty(storageBlobDTOS)) { throw new RuntimeException("æä»¶ä¿¡æ¯ä¸è½ä¸ºç©º"); } if (application == null) { @@ -66,13 +67,14 @@ // å 餿§éä»¶ä¿¡æ¯ deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); List<StorageAttachment> storageAttachments = new ArrayList<>(); for (StorageBlobVO storageBlobVO : storageBlobVOS) { for (StorageBlobDTO storageBlobDTO : storageBlobDTOS) { StorageAttachment storageAttachment = new StorageAttachment(); storageAttachment.setApplication(application.getType()); storageAttachment.setRecordType(recordType.getType()); storageAttachment.setRecordId(recordId); storageAttachment.setStorageBlobId(storageBlobVO.getId()); storageAttachment.setStorageBlobId(storageBlobDTO.getId()); storageAttachment.setDeleted(0L); storageAttachments.add(storageAttachment); } storageAttachmentMapper.insert(storageAttachments); } @@ -102,10 +104,10 @@ * * @param application æä»¶ç¨é * @param recordType å ³èè®°å½ç±»å * @param recordId å ³èè®°å½id * @param recordIds å ³èè®°å½id */ public void deleteStorageBlobsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { if (recordId == null || recordId <= 0) { public void deleteStorageBlobsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum application, RecordTypeEnum recordType, List<Long> recordIds) { if (recordIds == null || recordIds.isEmpty()) { throw new RuntimeException("å ³èè®°å½idä¸è½ä¸ºç©º"); } if (application == null) { @@ -116,7 +118,7 @@ } List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() .eq(StorageAttachment::getRecordType, recordType.getType()) .eq(StorageAttachment::getRecordId, recordId) .in(StorageAttachment::getRecordId, recordIds) .eq(StorageAttachment::getApplication, application.getType())); if (CollectionUtils.isNotEmpty(storageAttachments)) { List<Long> storageAttachmentIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId) @@ -135,6 +137,13 @@ storageAttachmentMapper.deleteByIds(storageAttachmentIds); } /** * å é¤æä»¶å ³èä¿¡æ¯ * * @param application æä»¶ç¨é * @param recordType å ³èè®°å½ç±»å * @param recordId å ³èè®°å½id */ public void deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { if (recordId == null || recordId <= 0) { throw new RuntimeException("å ³èè®°å½idä¸è½ä¸ºç©º"); @@ -145,7 +154,7 @@ if (recordType == null) { throw new RuntimeException("å ³èè®°å½ç±»åä¸è½ä¸ºç©º"); } deleteStorageBlobsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); deleteStorageBlobsByApplicationAndRecordTypeAndRecordIds(application, recordType, Arrays.asList(recordId)); storageAttachmentMapper.delete(new LambdaQueryWrapper<StorageAttachment>() .eq(StorageAttachment::getRecordType, recordType.getType()) .eq(StorageAttachment::getRecordId, recordId) @@ -153,7 +162,31 @@ } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ * æ¹éå é¤æä»¶å ³èä¿¡æ¯ attachment * * @param application æä»¶ç¨é * @param recordType å ³èè®°å½ç±»å * @param recordIds å ³èè®°å½id */ public void deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum application, RecordTypeEnum recordType, List<Long> recordIds) { if (recordIds == null || recordIds.isEmpty()) { throw new RuntimeException("å ³èè®°å½idä¸è½ä¸ºç©º"); } if (application == null) { throw new RuntimeException("æä»¶ç¨éä¸è½ä¸ºç©º"); } if (recordType == null) { throw new RuntimeException("å ³èè®°å½ç±»åä¸è½ä¸ºç©º"); } deleteStorageBlobsByApplicationAndRecordTypeAndRecordIds(application, recordType, recordIds); storageAttachmentMapper.delete(new LambdaQueryWrapper<StorageAttachment>() .eq(StorageAttachment::getRecordType, recordType.getType()) .in(StorageAttachment::getRecordId, recordIds) .eq(StorageAttachment::getApplication, application.getType())); } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ attachment * * @param storageAttachmentIds æä»¶id */ @@ -165,7 +198,7 @@ } /** * éè¿æä»¶ç¨éãå ³èè®°å½ç±»åãå ³èè®°å½idè·åæä»¶å ³èä¿¡æ¯ * éè¿æä»¶ç¨éãå ³èè®°å½ç±»åãå ³èè®°å½idè·åæä»¶å ³èä¿¡æ¯ attachment * * @param application æä»¶ç¨é * @param recordType å ³èè®°å½ç±»å @@ -187,11 +220,11 @@ } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ blob * * @param storageAttachmentIds æä»¶id */ public List<StorageBlobVO> getStorageBlobDTOsByStorageAttachmentIds(List<Long> storageAttachmentIds) { public List<StorageBlobVO> getStorageBlobVOsByStorageAttachmentIds(List<Long> storageAttachmentIds) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByStorageAttachmentIds(storageAttachmentIds); if (CollectionUtils.isEmpty(storageAttachments)) { return null; @@ -210,12 +243,63 @@ } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯åå¨è¿ææ¶é´ * éè¿æä»¶ç¨éãå ³èè®°å½ç±»åãå ³èè®°å½idè·åæä»¶ä¿¡æ¯ blob * * @param application æä»¶ç¨é * @param recordType å ³èè®°å½ç±»å * @param recordId å ³èè®°å½id */ public List<StorageBlobVO> getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); if (CollectionUtils.isEmpty(storageAttachments)) { return null; } List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); List<StorageBlobVO> storageBlobDTOS = new ArrayList<>(); for (StorageBlob storageBlob : storageBlobs) { StorageBlobVO storageBlobVO = new StorageBlobVO(); BeanUtils.copyProperties(storageBlob, storageBlobVO); storageBlobVO.setPreviewURL(buildSignedPreviewUrl(storageBlobVO)); storageBlobVO.setDownloadURL(buildSignedDownloadUrl(storageBlobVO)); storageBlobDTOS.add(storageBlobVO); } return storageBlobDTOS; } /** * éè¿æä»¶ç¨éãå ³èè®°å½ç±»åãå ³èè®°å½idè·åæä»¶ä¿¡æ¯ èªå®ä¹è¿ææ¶é´ï¼åéï¼ blob * * @param application æä»¶ç¨é * @param recordType å ³èè®°å½ç±»å * @param recordId å ³èè®°å½id * @param expired è¿ææ¶é´ */ public List<StorageBlobVO> getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); if (CollectionUtils.isEmpty(storageAttachments)) { return null; } List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); List<StorageBlobVO> storageBlobDTOS = new ArrayList<>(); for (StorageBlob storageBlob : storageBlobs) { StorageBlobVO storageBlobVO = new StorageBlobVO(); BeanUtils.copyProperties(storageBlob, storageBlobVO); storageBlobVO.setPreviewURL(buildSignedUrl(storageBlobVO, "/preview/", expired)); storageBlobVO.setDownloadURL(buildSignedUrl(storageBlobVO, "/download/", expired)); storageBlobDTOS.add(storageBlobVO); } return storageBlobDTOS; } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯åå¨è¿ææ¶é´ èªå®ä¹è¿ææ¶é´ï¼åéï¼ blob * * @param storageAttachmentIds æä»¶id * @param expired è¿ææ¶é´ */ public List<StorageBlobVO> getStorageBlobDTOsByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { public List<StorageBlobVO> getStorageBlobVOsByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByStorageAttachmentIds(storageAttachmentIds); if (CollectionUtils.isEmpty(storageAttachments)) { return null; @@ -234,109 +318,109 @@ } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ attachment * * @param storageAttachmentIds æä»¶id */ public List<StorageAttachmentDTO> getStorageAttachmentDTOsByStorageAttachmentIds(List<Long> storageAttachmentIds) { public List<StorageAttachmentVO> getStorageAttachmentVOSByStorageAttachmentIds(List<Long> storageAttachmentIds) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByStorageAttachmentIds(storageAttachmentIds); if (CollectionUtils.isEmpty(storageAttachments)) { return new ArrayList<>(); } List<StorageAttachmentDTO> storageAttachmentDTOS = new ArrayList<>(); List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>(); for (StorageAttachment storageAttachment : storageAttachments) { StorageAttachmentDTO storageAttachmentDTO = new StorageAttachmentDTO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentDTO); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); if (CollectionUtils.isEmpty(storageBlobVOS)) { storageAttachmentDTO.setStorageBlobVOS(new ArrayList<>()); storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); } else { storageAttachmentDTO.setStorageBlobVOS(storageBlobVOS); storageAttachmentVO.setStorageBlobVOS(storageBlobVOS); } storageAttachmentDTOS.add(storageAttachmentDTO); storageAttachmentVOS.add(storageAttachmentVO); } return storageAttachmentDTOS; return storageAttachmentVOS; } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯åå¨è¿ææ¶é´ * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯åå¨è¿ææ¶é´ èªå®ä¹è¿ææ¶é´ï¼åéï¼ attachment * * @param storageAttachmentIds æä»¶id * @param expired è¿ææ¶é´ */ public List<StorageAttachmentDTO> getStorageAttachmentDTOsByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { public List<StorageAttachmentVO> getStorageAttachmentVOSByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByStorageAttachmentIds(storageAttachmentIds); if (CollectionUtils.isEmpty(storageAttachments)) { return new ArrayList<>(); } List<StorageAttachmentDTO> storageAttachmentDTOS = new ArrayList<>(); List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>(); for (StorageAttachment storageAttachment : storageAttachments) { StorageAttachmentDTO storageAttachmentDTO = new StorageAttachmentDTO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentDTO); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); if (CollectionUtils.isEmpty(storageBlobVOS)) { storageAttachmentDTO.setStorageBlobVOS(new ArrayList<>()); storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); } else { storageAttachmentDTO.setStorageBlobVOS(storageBlobVOS); storageAttachmentVO.setStorageBlobVOS(storageBlobVOS); } storageAttachmentDTOS.add(storageAttachmentDTO); storageAttachmentVOS.add(storageAttachmentVO); } return storageAttachmentDTOS; return storageAttachmentVOS; } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯ attachment * * @param application åºç¨ * @param recordType è®°å½ç±»å * @param recordId è®°å½id */ public List<StorageAttachmentDTO> getStorageAttachmentDTOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { public List<StorageAttachmentVO> getStorageAttachmentVOSByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); if (CollectionUtils.isEmpty(storageAttachments)) { return new ArrayList<>(); } List<StorageAttachmentDTO> storageAttachmentDTOS = new ArrayList<>(); List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>(); for (StorageAttachment storageAttachment : storageAttachments) { StorageAttachmentDTO storageAttachmentDTO = new StorageAttachmentDTO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentDTO); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); if (CollectionUtils.isEmpty(storageBlobVOS)) { storageAttachmentDTO.setStorageBlobVOS(new ArrayList<>()); storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); } else { storageAttachmentDTO.setStorageBlobVOS(storageBlobVOS); storageAttachmentVO.setStorageBlobVOS(storageBlobVOS); } storageAttachmentDTOS.add(storageAttachmentDTO); storageAttachmentVOS.add(storageAttachmentVO); } return storageAttachmentDTOS; return storageAttachmentVOS; } /** * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯åå¨è¿ææ¶é´ * éè¿æä»¶å ³èidè·åæä»¶ä¿¡æ¯åå¨è¿ææ¶é´ èªå®ä¹è¿ææ¶é´ï¼åéï¼ attachment * * @param application åºç¨ * @param recordType è®°å½ç±»å * @param recordId è®°å½id * @param expired è¿ææ¶é´ */ public List<StorageAttachmentDTO> getStorageAttachmentDTOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { public List<StorageAttachmentVO> getStorageAttachmentVOSByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); if (CollectionUtils.isEmpty(storageAttachments)) { return new ArrayList<>(); } List<StorageAttachmentDTO> storageAttachmentDTOS = new ArrayList<>(); List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>(); for (StorageAttachment storageAttachment : storageAttachments) { StorageAttachmentDTO storageAttachmentDTO = new StorageAttachmentDTO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentDTO); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); if (CollectionUtils.isEmpty(storageBlobVOS)) { storageAttachmentDTO.setStorageBlobVOS(new ArrayList<>()); storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); } else { storageAttachmentDTO.setStorageBlobVOS(storageBlobVOS); storageAttachmentVO.setStorageBlobVOS(storageBlobVOS); } storageAttachmentDTOS.add(storageAttachmentDTO); storageAttachmentVOS.add(storageAttachmentVO); } return storageAttachmentDTOS; return storageAttachmentVOS; } /** @@ -346,7 +430,7 @@ */ public List<String> getFilePreviewURLByStorageAttachmentIds(List<Long> storageAttachmentIds) { List<String> res = new ArrayList<>(); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); for (StorageBlobVO storageBlobVO : storageBlobVOS) { res.add(buildSignedPreviewUrl(storageBlobVO)); } @@ -354,14 +438,14 @@ } /** * éè¿æä»¶å ³èidè·åæä»¶é¢è§å°ååå¨è¿ææ¶é´ * éè¿æä»¶å ³èidè·åæä»¶é¢è§å°ååå¨è¿ææ¶é´ èªå®ä¹è¿ææ¶é´ï¼åéï¼ * * @param storageAttachmentIds æä»¶å ³èid * @param expired è¿ææ¶é´ */ public List<String> getFilePreviewURLByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { List<String> res = new ArrayList<>(); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); for (StorageBlobVO storageBlobVO : storageBlobVOS) { res.add(buildSignedUrl(storageBlobVO, "/preview/", expired)); } @@ -375,7 +459,7 @@ */ public List<String> getFileDownloadURLByStorageAttachmentIds(List<Long> storageAttachmentIds) { List<String> res = new ArrayList<>(); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); for (StorageBlobVO storageBlobVO : storageBlobVOS) { res.add(buildSignedDownloadUrl(storageBlobVO)); } @@ -383,14 +467,14 @@ } /** * éè¿æä»¶å ³èidè·åæä»¶ä¸è½½å°ååå¨è¿ææ¶é´ * éè¿æä»¶å ³èidè·åæä»¶ä¸è½½å°ååå¨è¿ææ¶é´ èªå®ä¹è¿ææ¶é´ï¼åéï¼ * * @param storageAttachmentIds æä»¶å ³èid * @param expired è¿ææ¶é´ */ public List<String> getFileDownloadURLByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { List<String> res = new ArrayList<>(); List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); for (StorageBlobVO storageBlobVO : storageBlobVOS) { res.add(buildSignedUrl(storageBlobVO, "/download/", expired)); } @@ -489,7 +573,7 @@ } /** * å缩æä»¶ * å缩æä»¶ å¾ç * * @param file æä»¶ * @return å缩åçæä»¶ src/main/java/com/ruoyi/common/config/MinioConfig.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/common/utils/MinioUtils.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
@@ -59,7 +59,7 @@ @PostMapping("/addOrEditInspectionTask") @Operation(summary = "å·¡æ£ä»»å¡è¡¨æ°å¢ä¿®æ¹") @Transactional(rollbackFor = Exception.class) public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) throws IOException { public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) { return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto)); } src/main/java/com/ruoyi/inspectiontask/dto/InspectionTaskDto.java
@@ -1,7 +1,8 @@ package com.ruoyi.inspectiontask.dto; import com.ruoyi.basic.dto.StorageBlobDTO; import com.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.inspectiontask.pojo.InspectionTask; import com.ruoyi.sales.pojo.CommonFile; import lombok.Data; import java.util.List; @@ -16,9 +17,12 @@ // // private List<StorageAttachment> attachments; private List<String> tempFileIds; private List<CommonFile> commonFileList; //çäº§ä¸ private List<CommonFile> commonFileListAfter; //ç产å private List<CommonFile> commonFileListBefore; //ç产å private List<StorageBlobDTO> commonFileListDTO; //çäº§ä¸ private List<StorageBlobDTO> commonFileListAfterDTO; //ç产å private List<StorageBlobDTO> commonFileListBeforeDTO; //ç产å private List<StorageBlobVO> commonFileListVO; //çäº§ä¸ private List<StorageBlobVO> commonFileListAfterVO; //ç产å private List<StorageBlobVO> commonFileListBeforeVO; //ç产å } src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java
@@ -6,8 +6,6 @@ import com.ruoyi.inspectiontask.dto.InspectionTaskDto; import com.ruoyi.inspectiontask.pojo.InspectionTask; import java.io.IOException; /** * @author :yys * @date : 2025/9/19 10:49 @@ -16,7 +14,7 @@ IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto); int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) throws IOException; int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto); int delByIds(Long[] ids); } src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
@@ -5,13 +5,9 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.basic.mapper.StorageAttachmentMapper; import com.ruoyi.basic.mapper.StorageBlobMapper; import com.ruoyi.basic.pojo.StorageBlob; import com.ruoyi.basic.service.StorageAttachmentService; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.utils.MinioUtils; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; @@ -21,18 +17,13 @@ import com.ruoyi.inspectiontask.service.InspectionTaskService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.stream.Collectors; @@ -48,19 +39,9 @@ private final InspectionTaskMapper inspectionTaskMapper; private final StorageAttachmentService storageAttachmentService; private final StorageBlobMapper storageBlobMapper; private final StorageAttachmentMapper storageAttachmentMapper; private final MinioUtils minioUtils; private final SysUserMapper sysUserMapper; private final CommonFileMapper commonFileMapper; private final CommonFileServiceImpl commonFileService; private final FileUtil fileUtil; @Override public IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) { @@ -114,16 +95,6 @@ SysUser::getUserId, SysUser::getNickName, (existing, replacement) -> existing)); //å¤çéä»¶ List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>() .in(CommonFile::getCommonId, ids) .in(CommonFile::getType, Arrays.asList(FileNameType.INSPECTION.getValue(), FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue(), FileNameType.INSPECTION_PRODUCTION_AFTER.getValue()))); if(commonFiles == null){ commonFiles = new ArrayList<>(); } AtomicReference<List<CommonFile>> finalCommonFiles = new AtomicReference<>(commonFiles); List<InspectionTaskDto> dtoList = entityPage.getRecords().stream().map(inspectionTask -> { InspectionTaskDto dto = new InspectionTaskDto(); BeanUtils.copyProperties(inspectionTask, dto); // å¤å¶ä¸»å¯¹è±¡å±æ§ @@ -150,11 +121,10 @@ } dto.setDateStr(inspectionTask.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); finalCommonFiles.set(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getCommonId().equals(inspectionTask.getId())).collect(Collectors.toList())); // åå§åä¸ä¸ªéä»¶å表 dto.setCommonFileList(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION.getValue())).collect(Collectors.toList())); dto.setCommonFileListAfter(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_AFTER.getValue())).collect(Collectors.toList())); dto.setCommonFileListBefore(finalCommonFiles.get().stream().filter(commonFile -> commonFile.getType().equals(FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue())).collect(Collectors.toList())); dto.setCommonFileListVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListAfterVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListBeforeVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); return dto; @@ -167,32 +137,9 @@ return resultPage; } // æåå建BlobDTOçå ¬å ±æ¹æ³ private StorageBlobVO createBlobDto(StorageBlob blob) { StorageBlobVO dto = new StorageBlobVO(); BeanUtils.copyProperties(blob, dto); // todo fileChange // // 设置URL // dto.setUrl(minioUtils.getPreviewUrls( // blob.getBucketFilename(), // blob.getBucketName(), // true // )); // // // 设置ä¸è½½URL // dto.setDownloadUrl(minioUtils.getDownloadUrls( // blob.getBucketFilename(), // blob.getBucketName(), // blob.getOriginalFilename(), // true // )); return dto; } @Override @Transactional(rollbackFor = Exception.class) public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) throws IOException { public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) { InspectionTask inspectionTask = new InspectionTask(); BeanUtils.copyProperties(inspectionTaskDto, inspectionTask); inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId()); @@ -203,7 +150,11 @@ } else { i = inspectionTaskMapper.updateById(inspectionTask); } commonFileService.migrateTempFilesToFormal(inspectionTask.getId(),inspectionTaskDto.getTempFileIds()); // ä¿åæä»¶ fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListDTO()); fileUtil.saveStorageAttachment(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListAfterDTO()); fileUtil.saveStorageAttachment(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListBeforeDTO()); return i; } @@ -214,9 +165,10 @@ if (ids == null || ids.length == 0) { return 0; } commonFileService.deleteByBusinessIds(Arrays.asList(ids),FileNameType.INSPECTION.getValue()); commonFileService.deleteByBusinessIds(Arrays.asList(ids),FileNameType.INSPECTION_PRODUCTION_BEFORE.getValue()); commonFileService.deleteByBusinessIds(Arrays.asList(ids),FileNameType.INSPECTION_PRODUCTION_AFTER.getValue()); // å 餿件 fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); return inspectionTaskMapper.deleteBatchIds(Arrays.asList(ids)); } src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
@@ -16,30 +16,10 @@ @Data public class ProductionPlanDto extends ProductionPlan { /** * ç©æç¼ç */ @Schema(description = "ç©æç¼ç ") @Excel(name = "ç©æç¼ç ") private String materialCode; /** * 产ååç§° */ @Schema(description = "产ååç§°") @Excel(name = "产ååç§°") private String productName; /** * 客æ·åç§° */ @Schema(description = "客æ·åç§°") @Excel(name = "客æ·åç§°") private String customerName; /** * 产åè§æ ¼ */ @Schema(description = "产åè§æ ¼") @Excel(name = "产åè§æ ¼") private String model; @@ -59,17 +39,7 @@ @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate planCompleteTime; /** * å ³èç©æä¿¡æ¯è¡¨ */ @Schema(description = "å ³èç©æä¿¡æ¯è¡¨ID") private Long productMaterialId; /** * 强度 */ @Schema(description = "强度") @Excel(name = "强度") private String strength; @Schema(description = "产åID") private Long productId; } src/main/java/com/ruoyi/production/bean/dto/ProductionPlanImportDto.java
@@ -1,12 +1,11 @@ package com.ruoyi.production.bean.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; import java.util.Date; import java.time.LocalDate; /** * <br> @@ -20,126 +19,43 @@ @Data @Schema(name = "éå®çäº§éæ± Excelå¯¼å ¥å¯¼åºDTO") public class ProductionPlanImportDto { /** * ç³è¯·åç¼å· */ @Schema(description = "ç³è¯·åç¼å·") @Excel(name = "ç³è¯·åç¼å·") private String applyNo; /** * 客æ·åç§° */ @Schema(description = "客æ·åç§°") @Excel(name = "客æ·åç§°") private String customerName; @Schema(description = "主ç产计åå·") @Excel(name = "主ç产计åå·") private String mpsNo; /** * ç©æç¼ç */ @Schema(description = "ç©æç¼ç ") @Excel(name = "ç©æç¼ç ") private String materialCode; @Schema(description = "éæ±æ¥æ") @Excel(name = "éæ±æ¥æ") private LocalDate requiredDate; /** * 产ååç§° */ @Schema(description = "夿³¨") @Excel(name = "夿³¨") private String remark; @Schema(description = "éæ±æ°é") @Excel(name = "éæ±æ°é") private BigDecimal qtyRequired; @Schema(description = "æ¥æº éå®/å é¨") @Excel(name = "æ¥æº éå®/å é¨") private String source; @Schema(description = "æ¿è¯ºæ¥æ") @Excel(name = "æ¿è¯ºæ¥æ") private LocalDate promisedDeliveryDate; @Schema(description = "产ååç§°") @Excel(name = "产ååç§°") private String productName; /** * 产åè§æ ¼ */ @Schema(description = "产åè§æ ¼") @Excel(name = "产åè§æ ¼") private String productSpec; @Schema(description = "è§æ ¼åå·") @Excel(name = "è§æ ¼åå·") private String model; /** * é¿ */ @Schema(description = "é¿") @Excel(name = "é¿(mm)") private Integer length; @Schema(description = "åä½") @Excel(name = "åä½") private String unit; /** * 宽 */ @Schema(description = "宽") @Excel(name = "宽(mm)") private Integer width; /** * é« */ @Schema(description = "é«") @Excel(name = "é«(mm)") private Integer height; /** * åæ° */ @Schema(description = "åæ°") @Excel(name = "åæ°") private Integer quantity; /** * æ¹æ° */ @Schema(description = "æ¹æ°") @Excel(name = "æ¹æ°") private BigDecimal volume; /** * 强度 */ @Schema(description = "强度") @Excel(name = "强度") private String strength; /** * å¼å§æ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @Schema(description = "å¼å§æ¥æ") @Excel(name = "å¼å§æ¥æ", width = 20, dateFormat = "yyyy-MM-dd") private Date startDate; /** * ç»ææ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @Schema(description = "ç»ææ¥æ") @Excel(name = "ç»ææ¥æ", width = 20, dateFormat = "yyyy-MM-dd") private Date endDate; /** * æäº¤äºº */ @Schema(description = "æäº¤äºº") @Excel(name = "æäº¤äºº") private String submitter; /** * æäº¤äººç»ç» */ @Schema(description = "æäº¤äººç»ç»") @Excel(name = "æäº¤äººç»ç»") private String submitOrg; /** * 夿³¨1 */ @Schema(description = "夿³¨1") @Excel(name = "夿³¨1") private String remarkOne; /** * 夿³¨2 */ @Schema(description = "夿³¨2") @Excel(name = "夿³¨2") private String remarkTwo; /** * å建人 @@ -155,22 +71,11 @@ @Excel(name = "ä¿®æ¹äºº", type = Excel.Type.EXPORT) private String modifierName; /** * æ°æ®åæ¥ç±»åï¼1=æå¨ 2=宿¶ä»»å¡ */ @Schema(description = "æ°æ®åæ¥ç±»åï¼1=æå¨ 2=宿¶ä»»å¡") private Integer dataSyncType; /** * æ°æ®æ¥æºç±»åï¼1=忥 2=æ°å¢ * å·²ä¸åæ°é */ @Schema(description = "æ°æ®æ¥æºç±»åï¼1=忥 2=æ°å¢") private Integer dataSourceType; /** * ä¸åæ°é */ @Schema(description = "ä¸åæ°é") @Excel(name = "ä¸åæ°é", type = Excel.Type.EXPORT) @Schema(description = "å·²ä¸åæ°é") @Excel(name = "å·²ä¸åæ°é", type = Excel.Type.EXPORT) private BigDecimal assignedQuantity; } src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java
@@ -9,8 +9,6 @@ @Data @Schema(name = "ProductionPlanVo", description = "ç产计åè¿å对象") public class ProductionPlanVo extends ProductionPlan { @Schema(description = "ç©æç¼ç ") private String materialCode; @Schema(description = "产ååç§°") private String productName; @@ -21,6 +19,6 @@ @Schema(description = "åä½") private String unit; @Schema(description = "å ³è产åç©æID") private Long productMaterialId; @Schema(description = "产åID") private Long productId; } src/main/java/com/ruoyi/production/mapper/ProductionPlanMapper.java
@@ -27,5 +27,4 @@ List<ProductionPlanDto> selectWithMaterialByIds(@Param("ids") List<Long> ids); ProductionPlanDto selectProductionPlanDtoById(@Param("productionPlanId") Long productionPlanId); } src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
@@ -30,6 +30,12 @@ @TableId(value = "id", type = IdType.AUTO) private Long id; @Schema(description = "éå®å°è´¦id") private Long salesLedgerId; @Schema(description = "éå®äº§åè§æ ¼id") private Long salesLedgerProductId; @Schema(description = "主ç产计åå·") private String mpsNo; @@ -55,6 +61,10 @@ @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; @Schema(description = "é¨é¨ID") @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "产ååå·id") private Long productModelId; @@ -64,7 +74,7 @@ @Schema(description = "æ¯å¦ä¸åå¶é 订å") private Boolean issued; @Schema(description = "æ¥æº") @Schema(description = "æ¥æº éå®/å é¨") private String source; @Schema(description = "å®¡æ ¸ç¶æ") @@ -72,9 +82,6 @@ @Schema(description = "æ¿è¯ºæ¥æ") private LocalDate promisedDeliveryDate; @Schema(description = "ç³è¯·åç¼å·") private String applyNo; @Schema(description = "ç¶æ 0æªä¸å 1é¨åä¸å 2å·²ä¸å") private Integer status; src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -2,6 +2,7 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -62,7 +63,7 @@ private final FileUtil fileUtil; @Override public com.baomidou.mybatisplus.core.metadata.IPage<ProductionOrderVo> pageProductionOrder(Page<ProductionOrderDto> page, ProductionOrderDto dto) { public IPage<ProductionOrderVo> pageProductionOrder(Page<ProductionOrderDto> page, ProductionOrderDto dto) { Page<ProductionOrderVo> result = (Page<ProductionOrderVo>) baseMapper.pageProductionOrder(page, dto); fillProductImages(result.getRecords()); return result; @@ -359,18 +360,18 @@ if (defaultDecimal(productionOrder.getQuantity()).compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("quantity must be greater than 0"); } if (productionOrder.getTechnologyRoutingId() == null) { // æªæ¾å¼æå®å·¥èºè·¯çº¿æ¶ï¼æäº§åè§æ ¼éææ°ä¸æ¡å·¥èºä½ä¸ºé»è®¤è·¯çº¿ã TechnologyRouting technologyRouting = technologyRoutingMapper.selectOne( Wrappers.<TechnologyRouting>lambdaQuery() .eq(TechnologyRouting::getProductModelId, productionOrder.getProductModelId()) .orderByDesc(TechnologyRouting::getId) .last("limit 1")); if (technologyRouting == null) { throw new ServiceException("No technology routing found for the product model"); } productionOrder.setTechnologyRoutingId(technologyRouting.getId()); } // if (productionOrder.getTechnologyRoutingId() == null) { // // æªæ¾å¼æå®å·¥èºè·¯çº¿æ¶ï¼æäº§åè§æ ¼éææ°ä¸æ¡å·¥èºä½ä¸ºé»è®¤è·¯çº¿ã // TechnologyRouting technologyRouting = technologyRoutingMapper.selectOne( // Wrappers.<TechnologyRouting>lambdaQuery() // .eq(TechnologyRouting::getProductModelId, productionOrder.getProductModelId()) // .orderByDesc(TechnologyRouting::getId) // .last("limit 1")); // if (technologyRouting == null) { // throw new ServiceException("No technology routing found for the product model"); // } // productionOrder.setTechnologyRoutingId(technologyRouting.getId()); // } if (oldOrder != null && ProductOrderStatusEnum.isStarted(oldOrder.getStatus())) { // å¼å·¥ååªå 许修æ£éæ ¸å¿åæ®µï¼æ ¸å¿çäº§ä¾æ®éå®ã if (!Objects.equals(oldOrder.getProductModelId(), productionOrder.getProductModelId()) src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -17,6 +18,7 @@ import com.ruoyi.production.mapper.ProductionPlanMapper; import com.ruoyi.production.pojo.ProductionOrder; import com.ruoyi.production.pojo.ProductionPlan; import com.ruoyi.production.service.ProductionOrderService; import com.ruoyi.production.service.ProductionPlanService; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -24,20 +26,24 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService { private final ProductionPlanMapper productionPlanMapper; private static final int PLAN_STATUS_WAIT = 0; private static final int PLAN_STATUS_PARTIAL = 1; private static final int PLAN_STATUS_ISSUED = 2; private final ProductionPlanMapper productionPlanMapper; private final ProductionOrderMapper productionOrderMapper; private final ProductionOrderService productionOrderService; @Override public IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) { @@ -45,133 +51,98 @@ } /** * åå¹¶ç产计å * åå¹¶ç产计åå¹¶ä¸åç产订åã * ä¸å¡çº¦æï¼ * 1. ä» å 许åä¸äº§ååå·ç计ååå¹¶ï¼ * 2. å·²ä¸åæé¨åä¸åç计åç¦æ¢å次åå¹¶ï¼ * 3. ä¸åæ°éä¸è½å¤§äºæé计åéæ±æ»éï¼ * 4. 订åå建ç»ä¸å¤ç¨ ProductionOrderService.saveProductionOrderï¼ç¡®ä¿å·¥èº/BOM/颿䏻åçåç»é»è¾ä¸è´ã */ @Override @Transactional(rollbackFor = Exception.class) public boolean combine(ProductionPlanDto productionPlanDto) { if (productionPlanDto.getIds() == null || productionPlanDto.getIds().isEmpty()) { if (productionPlanDto == null || productionPlanDto.getIds() == null || productionPlanDto.getIds().isEmpty()) { return false; } // æ¥è¯¢ä¸»ç产计å List<ProductionPlanDto> plans = productionPlanMapper.selectWithMaterialByIds(productionPlanDto.getIds()); if (plans == null || plans.isEmpty()) { throw new ServiceException("ä¸å失败,ç产计åä¸åå¨"); List<Long> planIds = productionPlanDto.getIds().stream() .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); if (planIds.isEmpty()) { throw new ServiceException("ä¸åå¤±è´¥ï¼æªéæ©ç产计å"); } // æ ¡éªæ¯å¦åå¨ä¸åç产ååç§° String firstProductName = plans.get(0).getProductName(); if (plans.stream().anyMatch(p -> p.getProductName() == null || !p.getProductName().equals(firstProductName))) { throw new BaseException("å并失败ï¼åå¨ä¸åç产ååç§°"); List<ProductionPlanDto> plans = productionPlanMapper.selectWithMaterialByIds(planIds); if (plans == null || plans.isEmpty() || plans.size() != planIds.size()) { throw new ServiceException("ä¸å失败ï¼ç产计åä¸åå¨æå·²è¢«å é¤"); } // æ ¡éªæ¯å¦åå¨ä¸åç产åè§æ ¼ String firstProductSpec = plans.get(0).getModel(); if (plans.stream().anyMatch(p -> p.getModel() == null || !p.getModel().equals(firstProductSpec))) { throw new BaseException("å并失败ï¼åå¨ä¸åç产åè§æ ¼"); ProductionPlanDto firstPlan = plans.getFirst(); if (firstPlan.getProductModelId() == null) { throw new ServiceException("ä¸å失败ï¼ç产计å缺å°äº§ååå·"); } // å建ç产订å boolean hasDifferentModel = plans.stream() .anyMatch(item -> !Objects.equals(item.getProductModelId(), firstPlan.getProductModelId())); if (hasDifferentModel) { throw new BaseException("åå¹¶å¤±è´¥ï¼æéç产计åç产ååå·ä¸ä¸è´"); } boolean hasIssuedPlan = plans.stream() .anyMatch(item -> item.getStatus() != null && item.getStatus() != PLAN_STATUS_WAIT); if (hasIssuedPlan) { throw new BaseException("åå¹¶å¤±è´¥ï¼æéç产计ååå¨å·²ä¸åæé¨åä¸åæ°æ®"); } BigDecimal totalRequiredQuantity = plans.stream() .map(ProductionPlan::getQtyRequired) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); if (totalRequiredQuantity.compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("ä¸åå¤±è´¥ï¼æéç产计åéæ±æ»éå¿ é¡»å¤§äº0"); } BigDecimal assignedQuantity = productionPlanDto.getTotalAssignedQuantity(); if (assignedQuantity == null || assignedQuantity.compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("ä¸å失败ï¼ä¸åæ°éå¿ é¡»å¤§äº0"); } if (assignedQuantity.compareTo(totalRequiredQuantity) > 0) { throw new ServiceException("ä¸å失败ï¼ä¸åæ°éä¸è½å¤§äºè®¡åéæ±æ»é"); } ProductionOrder productionOrder = new ProductionOrder(); productionOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); productionOrder.setProductionPlanIds(formatPlanIds(planIds)); productionOrder.setProductModelId(firstPlan.getProductModelId()); productionOrder.setQuantity(assignedQuantity); productionOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); // // å å å©ä½æ¹æ° // BigDecimal totalRemainingVolume = plans.stream() // .map(ProductionPlan::getRemainingVolume) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // // 夿ä¸åæ°éæ¯å¦å¤§äºçäºå©ä½æ¹æ° // if (productionPlanDto.getTotalAssignedQuantity().compareTo(totalRemainingVolume) > 0) { // throw new BaseException("æä½å¤±è´¥ï¼ä¸åæ°éä¸è½å¤§äºå©ä½æ¹æ°"); // } // // // å建ç产订å // ProductOrder productOrder = new ProductOrder(); // productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); // productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); // productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode()); // productOrder.setStrength(productionPlanDto.getStrength()); // productOrder.setProductMaterialSkuId(plans.get(0).getProductMaterialSkuId()); // // Long orderId = productOrderService.insertProductOrder(productOrder); // // // å½ä¸åç产å为ç åææ¿æï¼å°±æåBOMåéä¸å·¥èºè·¯çº¿åéæ°æ®åå ¥å°éè¡¨ä¸ // if ("ç å".equals(productionPlanDto.getProductName())) { // productOrder.setRouteId(productionOrderAppendixService.populateBlocks(orderId, productionPlanDto)); // } // if ("æ¿æ".equals(productionPlanDto.getProductName())) { // productOrder.setRouteId(productionOrderAppendixService.populatePlates(orderId, productionPlanDto)); // } // // æ´æ°ç»å®çå·¥èºè·¯çº¿ // productOrderService.updateById(productOrder); // // // æ ¹æ®ä¸åæ°éï¼ä»ç¬¬ä¸ä¸ªç产计åå¼å§åé æ¹æ° // BigDecimal assignedVolume = BigDecimal.ZERO; // for (ProductionPlan plan : plans) { // BigDecimal volume = plan.getVolume(); // if (volume == null) { // continue; // } // // 计ç®å©ä½æ¹æ° // BigDecimal remainingVolume = plan.getRemainingVolume(); // if (remainingVolume.compareTo(BigDecimal.ZERO) <= 0) { // continue; // } // // ProductOrderPlan productOrderPlan = new ProductOrderPlan(); // productOrderPlan.setProductOrderId(productOrder.getId()); // productOrderPlan.setProductionPlanId(plan.getId()); // // if (assignedVolume.add(remainingVolume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) { // // æåä¸ä¸ªè®¡åï¼åé å©ä½æ¹æ° // BigDecimal lastRemainingVolume = productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume); // BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(lastRemainingVolume); // plan.setAssignedQuantity(assignedQuantity); // plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1); // productOrderPlan.setAssignedQuantity(lastRemainingVolume); // productionPlanMapper.updateById(plan); // productOrderPlanMapper.insert(productOrderPlan); // break; // } // // // åé å½åè®¡åæ¹æ° // BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(remainingVolume); // plan.setAssignedQuantity(assignedQuantity); // plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1); // productOrderPlan.setAssignedQuantity(remainingVolume); // // æ´æ°ç产计å // productionPlanMapper.updateById(plan); // // åå»ºå ³èå ³ç³» // productOrderPlanMapper.insert(productOrderPlan); // assignedVolume = assignedVolume.add(remainingVolume); // } // // for (ProductionPlan plan : plans) { // BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO); // BigDecimal volume = Optional.ofNullable(plan.getVolume()).orElse(BigDecimal.ZERO); // if (assignedQuantity.compareTo(BigDecimal.ZERO) <= 0) { // plan.setStatus(0); // } else if (assignedQuantity.compareTo(volume) >= 0) { // plan.setStatus(2); // } else { // plan.setStatus(1); // } // productionPlanMapper.updateById(plan); // } boolean saved = productionOrderService.saveProductionOrder(productionOrder); if (!saved) { throw new ServiceException("ä¸å失败ï¼ç产订åä¿å失败"); } int targetStatus = assignedQuantity.compareTo(totalRequiredQuantity) < 0 ? PLAN_STATUS_PARTIAL : PLAN_STATUS_ISSUED; List<ProductionPlan> updates = planIds.stream().map(id -> { ProductionPlan update = new ProductionPlan(); update.setId(id); update.setStatus(targetStatus); return update; }).collect(Collectors.toList()); if (!updates.isEmpty()) { this.updateBatchById(updates); } return true; } @Override @Transactional(rollbackFor = Exception.class) public boolean add(ProductionPlanDto dto) { if (StringUtils.isBlank(dto.getApplyNo())) { throw new ServiceException("æ°å¢å¤±è´¥ï¼ç³è¯·åç¼å·ä¸è½ä¸ºç©º"); } checkApplyNoUnique(dto.getApplyNo(), null); dto.setStatus(0); if (StringUtils.isBlank(dto.getMpsNo())) { dto.setMpsNo(generateNextPlanNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")))); }else checkMpsNoUnique(dto.getMpsNo(), null); dto.setStatus(PLAN_STATUS_WAIT); dto.setSource("å é¨"); return productionPlanMapper.insert(dto) > 0; } @@ -179,51 +150,49 @@ @Transactional(rollbackFor = Exception.class) public boolean update(ProductionPlanDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("ç¼è¾å¤±è´¥,æ°æ®ä¸è½ä¸ºç©º"); throw new ServiceException("ç¼è¾å¤±è´¥ï¼æ°æ®ä¸è½ä¸ºç©º"); } ProductionPlan old = getById(dto.getId()); if (old == null) { throw new ServiceException("ç¼è¾å¤±è´¥,主ç产计åä¸åå¨"); throw new ServiceException("ç¼è¾å¤±è´¥ï¼ç产计åä¸åå¨"); } // ç¶ææ ¡éª if (old.getStatus() != 0) { throw new BaseException("ç¼è¾å¤±è´¥,该ç产计åå·²ä¸åæé¨åä¸åç¶æ,ç¦æ¢ç¼è¾"); if (old.getStatus() != PLAN_STATUS_WAIT) { throw new BaseException("ç¼è¾å¤±è´¥ï¼è¯¥ç产计åå·²ä¸åæé¨åä¸åï¼ç¦æ¢ç¼è¾"); } // applyNoåæ´ææ ¡éª if (StringUtils.isNotBlank(dto.getApplyNo()) && !dto.getApplyNo().equals(old.getApplyNo())) { checkApplyNoUnique(dto.getApplyNo(), dto.getId()); if (StringUtils.isNotBlank(dto.getMpsNo()) && !dto.getMpsNo().equals(old.getMpsNo())) { checkMpsNoUnique(dto.getMpsNo(), dto.getId()); } return productionPlanMapper.updateById(dto) > 0; } private void checkApplyNoUnique(String applyNo, Long excludeId) { private void checkMpsNoUnique(String mpsNo, Long excludeId) { LambdaQueryWrapper<ProductionPlan> wrapper = Wrappers.lambdaQuery(); wrapper.eq(ProductionPlan::getApplyNo, applyNo); wrapper.eq(ProductionPlan::getMpsNo, mpsNo); if (excludeId != null) { wrapper.ne(ProductionPlan::getId, excludeId); } if (productionPlanMapper.selectCount(wrapper) > 0) { throw new ServiceException("ç³è¯·åç¼å· " + applyNo + " å·²åå¨"); throw new ServiceException("ç产计åå· " + mpsNo + " å·²åå¨"); } } @Override @Transactional(rollbackFor = Exception.class) public boolean delete(List<Long> ids) { // 妿åå¨å·²ä¸åç计åï¼åä¸è½å é¤ if (productionPlanMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery().in(ProductionPlan::getId, ids)).stream().anyMatch(p -> p.getStatus() == 1 || p.getStatus() == 2)) { if (productionPlanMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery().in(ProductionPlan::getId, ids)) .stream() .anyMatch(p -> p.getStatus() == PLAN_STATUS_PARTIAL || p.getStatus() == PLAN_STATUS_ISSUED)) { throw new BaseException("å é¤å¤±è´¥ï¼åå¨å·²ä¸åæé¨åä¸åç计å"); } // 妿æå ³è订åï¼åä¸è½å é¤ if (productionOrderMapper.selectList(Wrappers.<ProductionOrder>lambdaQuery().in(ProductionOrder::getProductionPlanIds, ids)).stream().anyMatch(p -> p.getId() != null)) { throw new BaseException("å é¤å¤±è´¥ï¼åå¨å ³è订å"); if (productionOrderMapper.selectList(Wrappers.<ProductionOrder>lambdaQuery().in(ProductionOrder::getProductionPlanIds, ids)) .stream() .anyMatch(p -> p.getId() != null)) { throw new BaseException("å é¤å¤±è´¥ï¼åå¨å ³èç产订å"); } return productionPlanMapper.deleteBatchIds(ids) > 0; @@ -240,80 +209,81 @@ try { list = excelUtil.importExcel(file.getInputStream()); } catch (Exception e) { log.error("çäº§éæ±Excelå¯¼å ¥å¤±è´¥", e); throw new ServiceException("Excelè§£æå¤±è´¥"); } if (list == null || list.isEmpty()) { throw new ServiceException("Excelæ²¡ææ°æ®"); } Set<String> applyNos = new HashSet<>(); Set<String> materialCodes = new HashSet<>(); Set<String> mpsNos = new HashSet<>(); for (int i = 0; i < list.size(); i++) { ProductionPlanImportDto dto = list.get(i); String applyNo = dto.getApplyNo(); String materialCode = dto.getMaterialCode(); if (StringUtils.isEmpty(applyNo)) { throw new ServiceException("å¯¼å ¥å¤±è´¥ï¼ç¬¬ " + (i + 2) + " è¡ç³è¯·åç¼å·ä¸è½ä¸ºç©º"); String mpsNo = dto.getMpsNo(); if (StringUtils.isEmpty(mpsNo)) { generateNextPlanNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); } if (!applyNos.add(applyNo)) { throw new ServiceException("å¯¼å ¥å¤±è´¥ï¼Excel ä¸åå¨éå¤çç³è¯·åç¼å·: " + applyNo); if (!mpsNos.add(mpsNo)) { throw new ServiceException("å¯¼å ¥å¤±è´¥ï¼Excel ä¸åå¨éå¤çç³è¯·åç¼å· " + mpsNo); } if (StringUtils.isEmpty(materialCode)) { throw new ServiceException("å¯¼å ¥å¤±è´¥ï¼ç¬¬ " + (i + 2) + " è¡ç©æç¼ç ä¸è½ä¸ºç©º"); } String strength = dto.getStrength(); if (StringUtils.isNotEmpty(strength)) { if (!"A3.5".equals(strength) && !"A5.0".equals(strength)) { throw new ServiceException("å¯¼å ¥å¤±è´¥ï¼ç¬¬ " + (i + 2) + " è¡å¼ºåº¦åªè½æ¯ A3.5 æ A5.0"); } } materialCodes.add(materialCode); } // ç³è¯·åç¼å·æ¯å¦å·²åå¨ Long existApplyNoCount = baseMapper.selectCount(Wrappers.<ProductionPlan>lambdaQuery() .in(ProductionPlan::getApplyNo, applyNos)); .in(ProductionPlan::getMpsNo, mpsNos)); if (existApplyNoCount > 0) { List<String> existApplyNos = baseMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery() .in(ProductionPlan::getApplyNo, applyNos)) .stream().map(ProductionPlan::getApplyNo).collect(Collectors.toList()); throw new ServiceException("å¯¼å ¥å¤±è´¥ï¼ç³è¯·åç¼å·å·²åå¨: " + String.join(", ", existApplyNos)); List<String> existMpsNos = baseMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery() .in(ProductionPlan::getMpsNo, mpsNos)) .stream() .map(ProductionPlan::getMpsNo) .collect(Collectors.toList()); throw new ServiceException("å¯¼å ¥å¤±è´¥ï¼ç产计åå·å·²åå¨: " + String.join(", ", existMpsNos)); } LocalDateTime now = LocalDateTime.now(); List<ProductionPlan> entityList = list.stream().map(dto -> { ProductionPlan entity = new ProductionPlan(); BeanUtils.copyProperties(dto, entity); entity.setStatus(0); entity.setStatus(PLAN_STATUS_WAIT); entity.setSource("å é¨"); entity.setCreateTime(now); entity.setUpdateTime(now); return entity; }).collect(Collectors.toList()); this.saveBatch(entityList); } @Override public void exportProdData(HttpServletResponse response, List<Long> ids) { List<ProductionPlan> list; if (ids != null && !ids.isEmpty()) { list = baseMapper.selectBatchIds(ids); } else { list = baseMapper.selectList(null); } List<ProductionPlanDto> list = productionPlanMapper.selectWithMaterialByIds(ids); List<ProductionPlanImportDto> exportList = new ArrayList<>(); for (ProductionPlan entity : list) { for (ProductionPlanDto entity : list) { ProductionPlanImportDto dto = new ProductionPlanImportDto(); BeanUtils.copyProperties(entity, dto); exportList.add(dto); } ExcelUtil<ProductionPlanImportDto> util = new ExcelUtil<>(ProductionPlanImportDto.class); util.exportExcel(response, exportList, "éå®çäº§éæ±æ°æ®"); util.exportExcel(response, exportList, "主ç产计å"); } private String formatPlanIds(List<Long> planIds) { return planIds.stream() .filter(Objects::nonNull) .distinct() .map(String::valueOf) .collect(Collectors.joining(",", "[", "]")); } private String generateNextPlanNo(String datePrefix) { QueryWrapper<ProductionPlan> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("mps_no", "JH" + datePrefix); queryWrapper.orderByDesc("mps_no"); queryWrapper.last("LIMIT 1"); ProductionPlan latestPlan = productionPlanMapper.selectOne(queryWrapper); int sequence = 1; if (latestPlan != null && latestPlan.getMpsNo() != null && !latestPlan.getMpsNo().isEmpty()) { String sequenceStr = latestPlan.getMpsNo().substring(("JH" + datePrefix).length()); try { sequence = Integer.parseInt(sequenceStr) + 1; } catch (NumberFormatException e) { sequence = 1; } } return "JH" + datePrefix + String.format("%04d", sequence); } } src/main/java/com/ruoyi/project/common/CommonController.java
@@ -3,10 +3,9 @@ import com.ruoyi.basic.service.StorageBlobService; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.framework.aspectj.lang.annotation.Anonymous; import com.ruoyi.framework.config.ServerConfig; import com.ruoyi.framework.web.domain.R; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.slf4j.Logger; @@ -36,9 +35,6 @@ public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); private ServerConfig serverConfig; private static final String FILE_DELIMETER = ","; private final StorageBlobService storageBlobService; private final FileUtil fileUtil; @@ -77,16 +73,6 @@ // } // // /** // * minioéç¨ä¸ä¼ 请æ±ï¼å¤ä¸ªï¼ // */ // @PostMapping("/minioUploads") // @Operation(summary = "minioéç¨ä¸ä¼ 请æ±") // public AjaxResult minioUploadFiles(List<MultipartFile> files, String bucketName, Long type) throws Exception // { // return AjaxResult.success(); // } // // /** // * éç¨ä¸ä¼ 请æ±ï¼åä¸ªï¼ // */ // @PostMapping("/upload") @@ -104,43 +90,6 @@ // ajax.put("fileName", fileName); // ajax.put("newFileName", FileUtils.getName(fileName)); // ajax.put("originalFilename", file.getOriginalFilename()); // return ajax; // } // catch (Exception e) // { // return AjaxResult.error(e.getMessage()); // } // } // // /** // * éç¨ä¸ä¼ 请æ±ï¼å¤ä¸ªï¼ // */ // @PostMapping("/uploads") // public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception // { // try // { // // ä¸ä¼ æä»¶è·¯å¾ // String filePath = RuoYiConfig.getUploadPath(); // List<String> urls = new ArrayList<String>(); // List<String> fileNames = new ArrayList<String>(); // List<String> newFileNames = new ArrayList<String>(); // List<String> originalFilenames = new ArrayList<String>(); // for (MultipartFile file : files) // { // // ä¸ä¼ å¹¶è¿åæ°æä»¶åç§° // String fileName = FileUploadUtils.upload(filePath, file); // String url = serverConfig.getUrl() + fileName; // urls.add(url); // fileNames.add(fileName); // newFileNames.add(FileUtils.getName(fileName)); // originalFilenames.add(file.getOriginalFilename()); // } // AjaxResult ajax = AjaxResult.success(); // ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); // ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); // ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); // ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); // return ajax; // } // catch (Exception e) src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
@@ -1,10 +1,10 @@ package com.ruoyi.sales.dto; import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.basic.dto.StorageBlobDTO; import com.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.ShippingInfo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.List; @@ -33,4 +33,7 @@ private String productName; private List<StorageBlobDTO> storageBlobDTOs; private List<StorageBlobVO> storageBlobVOs; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -232,6 +232,7 @@ private BigDecimal ticketsTotal = BigDecimal.ZERO; @Schema(description = "æ¯å¦è´¨æ£") //é对éè´å°è´¦ï¼æ¯å¦è´¨æ£ private Boolean isChecked; @TableField(exist = false) @@ -251,4 +252,8 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "æ¯å¦ç产") //é对éå®å°è´¦ï¼æ¯å¦ç产 private Boolean isProduction; } src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -3,13 +3,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.procurementrecord.dto.ReturnSaleProductDto; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.dto.ShippingInfoDto; import com.ruoyi.sales.pojo.ShippingInfo; import org.apache.ibatis.annotations.Param; import java.io.IOException; import java.util.List; /** @@ -19,7 +16,7 @@ public interface ShippingInfoService extends IService<ShippingInfo>{ IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req); boolean deductStock(ShippingInfoDto req) throws IOException; boolean deductStock(ShippingInfoDto req); boolean delete(List<Long> ids); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -6,20 +6,14 @@ 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.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.ProductionAccount; import com.ruoyi.production.pojo.ProductionOperationTask; import com.ruoyi.production.pojo.ProductionOrder; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.pojo.ProductionPlan; import com.ruoyi.production.service.ProductionOrderService; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; @@ -68,7 +62,7 @@ private final ProductionAccountMapper productionAccountMapper; private final SalesLedgerMapper salesLedgerMapper; private final PurchaseLedgerMapper purchaseLedgerMapper; private final ProductionOrderMapper productionOrderMapper; private final ProductionPlanMapper productionPlanMapper; private final ProductionOperationTaskMapper productionOperationTaskMapper; private final ProductionOrderService productionOrderService; private final TechnologyRoutingMapper technologyRoutingMapper; @@ -256,70 +250,38 @@ * æ°å¢çäº§æ°æ® */ public void addProductionData(SalesLedgerProduct salesLedgerProduct) { ProductionOrder productionOrder = new ProductionOrder(); productionOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productionOrder.setProductModelId(salesLedgerProduct.getProductModelId()); productionOrder.setSaleLedgerProductId(salesLedgerProduct.getId().intValue()); productionOrder.setNpsNo(generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")))); productionOrder.setQuantity(salesLedgerProduct.getQuantity()); productionOrder.setCompleteQuantity(BigDecimal.ZERO); //å å¤æè¯¥äº§åæ¯å¦éè¦ç产 if (!salesLedgerProduct.getIsProduction()) { return; } ProductionPlan productionPlan = new ProductionPlan(); productionPlan.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productionPlan.setSalesLedgerProductId(salesLedgerProduct.getId()); productionPlan.setMpsNo(generateNextPlanNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")))); productionPlan.setProductModelId(salesLedgerProduct.getProductModelId()); productionPlan.setQtyRequired(salesLedgerProduct.getQuantity()); productionPlan.setSource("éå®"); productionPlan.setStatus(0); productionPlanMapper.insert(productionPlan); TechnologyRouting routing = technologyRoutingMapper.selectOne( new QueryWrapper<TechnologyRouting>().lambda() .eq(TechnologyRouting::getProductModelId, salesLedgerProduct.getProductModelId()) .orderByDesc(TechnologyRouting::getCreateTime) .last("LIMIT 1")); if (routing != null) { productionOrder.setTechnologyRoutingId(routing.getId()); } productionOrderMapper.insert(productionOrder); if (productionOrder.getTechnologyRoutingId() != null) { productionOrderService.syncProductionOrderSnapshot(productionOrder.getId()); } } /** * å é¤çäº§æ°æ® * å é¤ç产计å */ public void deleteProductionData(List<Long> productIds) { List<ProductionOrder> productionOrders = productionOrderMapper.selectList( new LambdaQueryWrapper<ProductionOrder>() .in(ProductionOrder::getSaleLedgerProductId, productIds.stream().map(Long::intValue).collect(Collectors.toList()))); if (org.springframework.util.CollectionUtils.isEmpty(productionOrders)) { List<ProductionPlan> productionPlans = productionPlanMapper.selectList( new LambdaQueryWrapper<ProductionPlan>() .in(ProductionPlan::getSalesLedgerProductId, productIds.stream().map(Long::intValue).collect(Collectors.toList()))); if (org.springframework.util.CollectionUtils.isEmpty(productionPlans)) { return; } List<Long> orderIds = productionOrders.stream().map(ProductionOrder::getId).collect(Collectors.toList()); List<Long> taskIds = productionOperationTaskMapper.selectList( new LambdaQueryWrapper<ProductionOperationTask>() .in(ProductionOperationTask::getProductionOrderId, orderIds)) .stream().map(ProductionOperationTask::getId).collect(Collectors.toList()); if (!taskIds.isEmpty()) { List<ProductionProductMain> productMains = productionProductMainMapper.selectList( new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getProductionOperationTaskId, taskIds)); List<Long> productMainIds = productMains.stream().map(ProductionProductMain::getId).collect(Collectors.toList()); if (!productMainIds.isEmpty()) { List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>().in(QualityInspect::getProductMainId, productMainIds)); qualityInspects.forEach(qualityInspect -> { if (qualityInspect.getInspectState() == 1) { throw new RuntimeException("å·²æäº¤çæ£éªåä¸è½å é¤"); } }); productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); qualityInspectMapper.deleteByProductMainIds(productMainIds); productionAccountMapper.delete(new LambdaQueryWrapper<ProductionAccount>() .in(ProductionAccount::getProductionProductMainId, productMainIds)); for (Long productMainId : productMainIds) { stockUtils.deleteStockOutRecord(productMainId, StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); stockUtils.deleteStockInRecord(productMainId, StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); } } productionProductMainMapper.delete(new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getProductionOperationTaskId, taskIds)); //妿ç产计åå·²ä¸ååä¸è½å é¤ if (productionPlans.stream().anyMatch(productionPlan -> productionPlan.getStatus() != 0)) { throw new RuntimeException("ç产计åå·²ä¸åï¼ä¸è½å é¤è¯¥éå®äº§å"); } productionOrderService.removeProductionOrder(orderIds); List<Long> ids = productionPlans.stream().map(ProductionPlan::getId).collect(Collectors.toList()); productionPlanMapper.deleteByIds(ids); } @Override @@ -432,21 +394,21 @@ return R.ok(); } private String generateNextOrderNo(String datePrefix) { QueryWrapper<ProductionOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("nps_no", "SC" + datePrefix); queryWrapper.orderByDesc("nps_no"); private String generateNextPlanNo(String datePrefix) { QueryWrapper<ProductionPlan> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("mps_no", "JH" + datePrefix); queryWrapper.orderByDesc("mps_no"); queryWrapper.last("LIMIT 1"); ProductionOrder latestOrder = productionOrderMapper.selectOne(queryWrapper); ProductionPlan latestPlan = productionPlanMapper.selectOne(queryWrapper); int sequence = 1; if (latestOrder != null && latestOrder.getNpsNo() != null && !latestOrder.getNpsNo().isEmpty()) { String sequenceStr = latestOrder.getNpsNo().substring(("SC" + datePrefix).length()); if (latestPlan != null && latestPlan.getMpsNo() != null && !latestPlan.getMpsNo().isEmpty()) { String sequenceStr = latestPlan.getMpsNo().substring(("JH" + datePrefix).length()); try { sequence = Integer.parseInt(sequenceStr) + 1; } catch (NumberFormatException e) { sequence = 1; } } return "SC" + datePrefix + String.format("%04d", sequence); return "JH" + datePrefix + String.format("%04d", sequence); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -520,7 +520,7 @@ List<Long> productIds = products.stream() .map(SalesLedgerProduct::getId) .collect(Collectors.toList()); //å é¤çäº§æ°æ® //å é¤ç产计å salesLedgerProductServiceImpl.deleteProductionData(productIds); // æ¹éå é¤äº§åå表 src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.other.service.impl.TempFileServiceImpl; @@ -22,7 +25,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import java.io.IOException; import java.util.Collections; import java.util.List; @@ -41,18 +43,19 @@ private final StockUtils stockUtils; private final CommonFileServiceImpl commonFileService; private final ApproveProcessServiceImpl approveProcessService; private final FileUtil fileUtil; @Override public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) { IPage<ShippingInfoDto> listPage = shippingInfoMapper.listPage(page, req); listPage.getRecords().forEach(item ->{ item.setCommonFileList(commonFileService.getFileListByBusinessId(item.getId(), FileNameType.SHIP.getValue())); item.setStorageBlobVOs(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, item.getId())); }); return listPage; } @Override public boolean deductStock(ShippingInfoDto req) throws IOException { public boolean deductStock(ShippingInfoDto req) { ShippingInfo byId = this.getById(req.getId()); if (byId == null) { throw new RuntimeException("åè´§ä¿¡æ¯ä¸åå¨"); @@ -68,10 +71,8 @@ byId.setShippingCarNumber(req.getShippingCarNumber()); byId.setShippingDate(req.getShippingDate()); boolean update = this.updateById(byId); // è¿ç§»æä»¶ if(CollectionUtils.isNotEmpty(req.getTempFileIds())){ tempFileService.migrateTempFilesToFormal(req.getId(), req.getTempFileIds(), FileNameType.SHIP.getValue()); } // ä¿åæä»¶ fileUtil.saveStorageAttachment(ApplicationTypeEnum.IMAGE, RecordTypeEnum.SHIPPING_INFO, req.getId(), req.getStorageBlobDTOs()); return update ; } src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -23,31 +23,25 @@ <select id="listPage" resultType="com.ruoyi.production.bean.vo.ProductionPlanVo"> SELECT pp.*, pms.material_code AS materialCode, pmdl.model, pms.product_id AS productMaterialId, pm.model, p.id as productId, p.product_name AS productName, pmdl.unit pm.unit FROM production_plan pp left join product_material_sku pms on pp.product_material_sku_id = pms.id left join product_model pmdl on pp.product_model_id = pmdl.id left join product p on pmdl.product_id = p.id ORDER BY COALESCE(pp.form_modified_time, pp.id) DESC left join product_model pm on pp.product_model_id = pm.id left join product p on pm.product_id = p.id ORDER BY COALESCE(pp.id) DESC </select> <select id="selectWithMaterialByIds" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto"> SELECT pp.*, pms.material_code AS materialCode, pmdl.model, pm.model, p.product_name AS productName, pmdl.unit, pms.product_id AS productMaterialId pm.unit FROM production_plan pp LEFT JOIN product_material_sku pms ON pp.product_material_sku_id = pms.id LEFT JOIN product_model pmdl ON pp.product_model_id = pmdl.id LEFT JOIN product p ON pmdl.product_id = p.id LEFT JOIN product_model pm ON pp.product_model_id = pm.id LEFT JOIN product p ON pm.product_id = p.id WHERE pp.id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} @@ -57,15 +51,12 @@ <select id="selectProductionPlanDtoById" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto"> SELECT pp.*, pms.material_code AS materialCode, pmdl.model, pms.product_id AS productMaterialId, pm.model, p.product_name AS productName, pmdl.unit pm.unit FROM production_plan pp left join product_material_sku pms on pp.product_material_sku_id = pms.id left join product_model pmdl on pp.product_model_id = pmdl.id left join product p on pmdl.product_id = p.id left join product_model pm on pp.product_model_id = pm.id left join product p on pm.product_id = p.id WHERE pp.id = #{productionPlanId} </select> </mapper>