gaoluyang
5 天以前 6b8585fc452ecdcaa82d86fab79a9f27bb442851
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package cn.iocoder.yudao.module.mdm.service.item;
 
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemTechnicalFileCreateReqVO;
import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemTechnicalFileRespVO;
import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemTechnicalFileDO;
import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemTechnicalFileMapper;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.Collections;
import java.util.List;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mdm.enums.ErrorCodeConstants.MDM_ITEM_NOT_EXISTS;
 
@Service
public class MdmItemTechnicalFileServiceImpl implements MdmItemTechnicalFileService {
 
    private static final String RECORD_TYPE = "mdm_item_technical_file";
 
    private final MdmItemTechnicalFileMapper mapper;
    private final MdmItemService itemService;
    private final StorageAttachmentApi storageAttachmentApi;
 
    public MdmItemTechnicalFileServiceImpl(MdmItemTechnicalFileMapper mapper,
                                           MdmItemService itemService,
                                           StorageAttachmentApi storageAttachmentApi) {
        this.mapper = mapper;
        this.itemService = itemService;
        this.storageAttachmentApi = storageAttachmentApi;
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createTechnicalFile(MdmItemTechnicalFileCreateReqVO reqVO) {
        if (itemService.getItem(reqVO.getItemId()) == null) {
            throw exception(MDM_ITEM_NOT_EXISTS);
        }
        int version = mapper.selectMaxVersionNo(reqVO.getItemId()) + 1;
        // 记录 ID 必须与附件关系记录 ID 一致,因此先插入版本记录,再绑定附件。
        MdmItemTechnicalFileDO file = new MdmItemTechnicalFileDO();
        file.setItemId(reqVO.getItemId());
        file.setStorageBlobId(reqVO.getBlobId());
        file.setVersionNo(version);
        mapper.insert(file);
        storageAttachmentApi.bindAttachments("file", RECORD_TYPE, file.getId(),
                Collections.singletonList(reqVO.getBlobId()));
        return file.getId();
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteTechnicalFile(Long itemId, Long id) {
        MdmItemTechnicalFileDO file = mapper.selectById(id);
        if (file == null || !java.util.Objects.equals(file.getItemId(), itemId)) {
            throw new cn.iocoder.yudao.framework.common.exception.ServiceException(400, "技术文件不存在或不属于该物料");
        }
        // 只移除物料的当前文件记录。保留附件及文件本体,供已有工单快照使用。
        mapper.deleteById(id);
    }
 
    @Override
    public List<MdmItemTechnicalFileRespVO> getTechnicalFileList(Long itemId) {
        return mapper.selectListByItemId(itemId).stream().map(file -> {
            MdmItemTechnicalFileRespVO resp = BeanUtils.toBean(file, MdmItemTechnicalFileRespVO.class);
            resp.setBlobId(file.getStorageBlobId());
            List<StorageBlobRespDTO> blobs = storageAttachmentApi.listAttachments(RECORD_TYPE, file.getId());
            if (blobs != null && !blobs.isEmpty()) {
                StorageBlobRespDTO blob = blobs.get(0);
                resp.setFileName(blob.getName());
                resp.setPreviewURL(blob.getPreviewURL());
                resp.setDownloadURL(blob.getDownloadURL());
            }
            return resp;
        }).toList();
    }
}