dengzedong
2024-10-14 558ffc4bcaf7aa5c683e7c9ce01e971feb9e4d95
提交 | 用户 | 时间
449017 1 package com.iailab.module.model.mpk.controller.admin;
D 2
3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONArray;
5 import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants;
6 import com.iailab.framework.common.pojo.CommonResult;
558ffc 7 import com.iailab.framework.tenant.core.context.TenantContextHolder;
1fea3e 8 import com.iailab.module.model.mpk.common.MdkConstant;
912a1e 9 import com.iailab.module.model.mpk.common.utils.DllUtils;
449017 10 import com.iailab.module.model.mpk.common.utils.Readtxt;
D 11 import com.iailab.module.model.mpk.dto.MdkDTO;
12 import io.swagger.v3.oas.annotations.Operation;
912a1e 13 import lombok.extern.slf4j.Slf4j;
1fea3e 14 import org.springframework.beans.factory.annotation.Value;
449017 15 import org.springframework.util.CollectionUtils;
D 16 import org.springframework.web.bind.annotation.*;
17 import org.springframework.web.multipart.MultipartFile;
18
1fea3e 19 import java.io.File;
D 20 import java.net.URLClassLoader;
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.List;
449017 24
D 25 import static com.iailab.framework.common.pojo.CommonResult.error;
26 import static com.iailab.framework.common.pojo.CommonResult.success;
27
28 /**
29  * @author PanZhibao
30  * @Description
31  * @createTime 2024年08月08日
32  */
33 @RestController
912a1e 34 @Slf4j
449017 35 @RequestMapping("/model/mpk/api")
D 36 public class MdkController {
1fea3e 37     @Value("${mpk.bak-file-path}")
D 38     private String mpkBakFilePath;
39
40
449017 41     @PostMapping("run")
D 42     public CommonResult<String> run(@RequestBody MdkDTO dto) {
558ffc 43         Long tenantId = TenantContextHolder.getTenantId();
D 44         // 备份文件 租户隔离
45         String mpkTenantBakFilePath = mpkBakFilePath + File.separator + tenantId;
46
912a1e 47         Class<?> clazz;
D 48         URLClassLoader classLoader;
1fea3e 49         try {
558ffc 50             File jarFile = new File(mpkTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getPyName() + ".jar");
1fea3e 51             if (!jarFile.exists()) {
D 52                 throw new RuntimeException("jar包不存在,请先生成代码。jarPath:" + jarFile.getAbsolutePath());
53             }
558ffc 54             File dllFile = new File(mpkTenantBakFilePath + File.separator + MdkConstant.DLL + File.separator + dto.getPyName() + ".dll");
1fea3e 55             if (!dllFile.exists()) {
912a1e 56                 throw new RuntimeException("dll文件不存在,请先生成代码。dllPath:" + dllFile.getAbsolutePath());
1fea3e 57             }
D 58             // 加载jar包
912a1e 59             classLoader = DllUtils.loadJar(jarFile.getAbsolutePath());
D 60             // 实现类
61             clazz = classLoader.loadClass(dto.getClassName());
62             // 加载dll到实现类
63             DllUtils.loadDll(clazz,dllFile.getAbsolutePath());
1fea3e 64         } catch (Exception e) {
912a1e 65             e.printStackTrace();
1fea3e 66             throw new RuntimeException("加载运行环境失败。");
D 67         }
68
449017 69         System.out.println("runTime=" + System.currentTimeMillis());
D 70         try {
71             List<String> datas = dto.getDatas();
72
73             int paramLength = dto.getHasModel() ? datas.size() + 2 : datas.size() + 1;
74             Object[] paramsValueArray = new Object[paramLength];
75             Class<?>[] paramsArray = new Class[paramLength];
76
77             try {
78                 for (int i = 0; i < datas.size(); i++) {
79                     String json = datas.get(i);
80                     JSONArray jsonArray = JSON.parseArray(json);
81                     double[][] data = new double[jsonArray.size()][jsonArray.getJSONArray(0).size()];
82                     for (int j = 0; j < jsonArray.size(); j++) {
83                         for (int k = 0; k < jsonArray.getJSONArray(j).size(); k++) {
84                             data[j][k] = jsonArray.getJSONArray(j).getDoubleValue(k);
85                         }
86                     }
87                     paramsValueArray[i] = data;
88                     paramsArray[i] = double[][].class;
89                 }
90             } catch (Exception e) {
91                 e.printStackTrace();
92                 return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),"参数错误,请检查!");
93             }
94
95             if (dto.getHasModel()) {
96                 paramsValueArray[datas.size()] = dto.getModel();
97                 paramsValueArray[datas.size() + 1] = dto.getModelSettings();
98                 paramsArray[datas.size()] = HashMap.class;
99                 paramsArray[datas.size() + 1] = HashMap.class;
100             }else {
101                 paramsValueArray[datas.size()] = dto.getModelSettings();
102                 paramsArray[datas.size()] = HashMap.class;
103             }
104
912a1e 105             HashMap result = (HashMap) clazz.getDeclaredMethod(dto.getMethodName(), paramsArray).invoke(clazz.newInstance(), paramsValueArray);
449017 106             return success(JSON.toJSONString(result));
D 107         } catch (Exception ex) {
108             ex.printStackTrace();
109             return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常");
110         } finally {
912a1e 111             if (classLoader != null) {
c12dae 112                 DllUtils.unloadDll(classLoader);
D 113                 DllUtils.unloadJar(classLoader);
912a1e 114             }
449017 115             System.gc();
D 116         }
117     }
118
119     @PostMapping("/import")
120     @Operation(summary = "导入参数")
121     public CommonResult<List<String>> importExcel(@RequestParam("file") MultipartFile file) throws Exception {
122         List<double[][]> datas = Readtxt.readMethodExcel(file);
123         List<String> result = new ArrayList<>();
124         if (!CollectionUtils.isEmpty(datas)) {
125             for (double[][] data : datas) {
126                 if (data.length > 0) {
127                     result.add(JSON.toJSONString(data));
128                 }
129             }
130         }
131         return success(result);
1fea3e 132     }
449017 133 }