dengzedong
2024-09-30 912a1e5f0b4537902b97ff81594611a8b6b3a853
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.iailab.module.model.mpk.controller.admin;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.module.model.mpk.common.MdkConstant;
import com.iailab.module.model.mpk.common.utils.DllUtils;
import com.iailab.module.model.mpk.common.utils.Readtxt;
import com.iailab.module.model.mpk.dto.MdkDTO;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.File;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
import static com.iailab.framework.common.pojo.CommonResult.error;
import static com.iailab.framework.common.pojo.CommonResult.success;
 
/**
 * @author PanZhibao
 * @Description
 * @createTime 2024年08月08日
 */
@RestController
@Slf4j
@RequestMapping("/model/mpk/api")
public class MdkController {
    @Value("${mpk.bak-file-path}")
    private String mpkBakFilePath;
 
 
    @PostMapping("run")
    public CommonResult<String> run(@RequestBody MdkDTO dto) {
        Class<?> clazz;
        URLClassLoader classLoader;
        try {
            File jarFile = new File(mpkBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getPyName() + ".jar");
            if (!jarFile.exists()) {
                throw new RuntimeException("jar包不存在,请先生成代码。jarPath:" + jarFile.getAbsolutePath());
            }
            File dllFile = new File(mpkBakFilePath + File.separator + MdkConstant.DLL + File.separator + dto.getPyName() + ".dll");
            if (!dllFile.exists()) {
                throw new RuntimeException("dll文件不存在,请先生成代码。dllPath:" + dllFile.getAbsolutePath());
            }
            // 加载jar包
            classLoader = DllUtils.loadJar(jarFile.getAbsolutePath());
            // 实现类
            clazz = classLoader.loadClass(dto.getClassName());
            // 加载dll到实现类
            DllUtils.loadDll(clazz,dllFile.getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("加载运行环境失败。");
        }
 
        System.out.println("runTime=" + System.currentTimeMillis());
        try {
            List<String> datas = dto.getDatas();
 
            int paramLength = dto.getHasModel() ? datas.size() + 2 : datas.size() + 1;
            Object[] paramsValueArray = new Object[paramLength];
            Class<?>[] paramsArray = new Class[paramLength];
 
            try {
                for (int i = 0; i < datas.size(); i++) {
                    String json = datas.get(i);
                    JSONArray jsonArray = JSON.parseArray(json);
                    double[][] data = new double[jsonArray.size()][jsonArray.getJSONArray(0).size()];
                    for (int j = 0; j < jsonArray.size(); j++) {
                        for (int k = 0; k < jsonArray.getJSONArray(j).size(); k++) {
                            data[j][k] = jsonArray.getJSONArray(j).getDoubleValue(k);
                        }
                    }
                    paramsValueArray[i] = data;
                    paramsArray[i] = double[][].class;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"参数错误,请检查!");
            }
 
            if (dto.getHasModel()) {
                paramsValueArray[datas.size()] = dto.getModel();
                paramsValueArray[datas.size() + 1] = dto.getModelSettings();
                paramsArray[datas.size()] = HashMap.class;
                paramsArray[datas.size() + 1] = HashMap.class;
            }else {
                paramsValueArray[datas.size()] = dto.getModelSettings();
                paramsArray[datas.size()] = HashMap.class;
            }
 
            HashMap result = (HashMap) clazz.getDeclaredMethod(dto.getMethodName(), paramsArray).invoke(clazz.newInstance(), paramsValueArray);
            return success(JSON.toJSONString(result));
        } catch (Exception ex) {
            ex.printStackTrace();
            return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常");
        } finally {
            if (classLoader != null) {
                DllUtils.uploadDll(classLoader);
                DllUtils.uploadJar(classLoader);
            }
            System.gc();
        }
    }
 
    @PostMapping("/import")
    @Operation(summary = "导入参数")
    public CommonResult<List<String>> importExcel(@RequestParam("file") MultipartFile file) throws Exception {
        List<double[][]> datas = Readtxt.readMethodExcel(file);
        List<String> result = new ArrayList<>();
        if (!CollectionUtils.isEmpty(datas)) {
            for (double[][] data : datas) {
                if (data.length > 0) {
                    result.add(JSON.toJSONString(data));
                }
            }
        }
        return success(result);
    }
}