guoyujie
2025-11-10 37bb2aac6fe2d856f06ff447d26163422c56024a
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.example.erp.service.sd;
 
import com.aspose.cad.Image;
import com.aspose.cad.ImageOptionsBase;
import com.aspose.cad.imageoptions.CadRasterizationOptions;
import com.aspose.cad.imageoptions.PngOptions;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.example.erp.common.Result;
import com.example.erp.entity.sd.OrderDetail;
import com.example.erp.entity.sd.OrderFile;
import com.example.erp.mapper.sd.OrderFileMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
 
@Service
@RequiredArgsConstructor
public class OrderFileService {
    private final OrderFileMapper orderFileMapper;
    public List<OrderFile> getOrderFilePicture(List<Map<String,Object>> orderDetails) throws NoSuchFieldException {
        Set<String> seenKeys = new HashSet<>();
        List<Map<String,Object>> result = new ArrayList<>();
        // 遍历订单详情列表去重
        result = orderDetails.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toMap(
                                map -> map.get("order_id") + "_" + map.get("order_number"),
                                map -> map,
                                (existing, replacement) -> existing // 保留第一个出现的
                        ),
                        map -> new ArrayList<>(map.values())
                ));
        //循环获取图片
        List<OrderFile> orderFiles = new ArrayList<>();
        for (Map<String,Object> obj : result) {
            OrderFile orderFile = orderFileMapper.selectOne(new QueryWrapper<OrderFile>()
                    .select("order_id, order_number, image_base64")
                    .eq("order_id", obj.get("order_id"))
                    .eq("order_number", obj.get("order_number"))
            );
            if (orderFile != null){
                orderFiles.add(orderFile);
            }
        }
       return orderFiles;
    }
 
    public Object updateOrderFileByOrderNumber(MultipartFile file,String orderId,String orderNumber) throws IOException {
 
        // 调用Image类的Load方法来加载输入的DWG文件。
        Image image = Image.load(file.getInputStream());
        // 创建CadRasterizationOptions实例以启用CAD栅格化选项。
        CadRasterizationOptions rasterizationOptions = new CadRasterizationOptions();
        // 设置宽度
        rasterizationOptions.setPageWidth(1000);
        // 设置高度
        rasterizationOptions.setPageHeight(1000);
        // 调用这个setEmbedBackground方法来设置背景色是否不等于输出格式的默认背景色
        rasterizationOptions.setEmbedBackground(true);
        // 为生成的图像创建一个PngOptions的实例,并将其分配给ImageOptionsBase类的实例。
        ImageOptionsBase options = new PngOptions();
        // 调用 setVectorRasterizationOptions 方法来定义光栅化选项
        options.setVectorRasterizationOptions(rasterizationOptions);
 
        // 保存到字节流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        image.save(outputStream, options);
        byte[] imageBytes = outputStream.toByteArray();
        String base64 = "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes);
        OrderFile orderFile = new OrderFile();
        orderFile.setImageBase64(base64);
        orderFile.setFileName(file.getName());
        orderFile.setOrderId(orderId);
        orderFile.setOrderNumber(orderNumber);
        orderFile.setFileData(Arrays.toString(file.getBytes()));
 
        OrderFile orderFileExist = orderFileMapper
                .selectOne(new LambdaQueryWrapper<OrderFile>()
                        .eq(OrderFile::getOrderId, orderId)
                        .eq(OrderFile::getOrderNumber, orderNumber)
                );
        if (orderFileExist == null) {
            orderFileMapper.insert(orderFile);
        }else {
            orderFileMapper.update(orderFile,new LambdaUpdateWrapper<OrderFile>()
                    .eq(OrderFile::getOrderId, orderId)
                    .eq(OrderFile::getOrderNumber, orderNumber)
            );
        }
 
 
        return base64;
    }
}