From bb54679b87f7934114006d9daf22894b3c9dc324 Mon Sep 17 00:00:00 2001
From: hky <13673834656@163.com>
Date: Sat, 16 Sep 2023 09:49:00 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=B7=A5=E7=A8=8B=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=E5=88=86=E7=BB=84=202?=
=?UTF-8?q?=E3=80=81=E6=B7=BB=E5=8A=A0=E7=BB=9F=E4=B8=80=E4=B8=8A=E4=BC=A0?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
jeecg-boot-base-core/pom.xml | 6 +
.../common/util/RemoteExecuteCommand.java | 242 ++++++
jeecg-module-system/jeecg-system-biz/pom.xml | 64 +-
.../bizCmaq/controller/BizCmaqController.java | 270 ++++++
.../project/bizCmaq/entity/BizCmaq.java | 209 +++++
.../project/bizCmaq/mapper/BizCmaqMapper.java | 17 +
.../bizCmaq/mapper/xml/BizCmaqMapper.xml | 5 +
.../bizCmaq/service/IBizCmaqService.java | 30 +
.../service/impl/BizCmaqServiceImpl.java | 458 +++++++++++
.../project/bizCmaq/vue/BizCmaqList.vue | 363 ++++++++
.../bizCmaq/vue/BizCmaq_menu_insert.sql | 26 +
.../bizCmaq/vue/modules/BizCmaqForm.vue | 264 ++++++
.../vue/modules/BizCmaqModal.Style#Drawer.vue | 84 ++
.../bizCmaq/vue/modules/BizCmaqModal.vue | 60 ++
.../controller/BizEngineeringController.java | 121 +++
.../bizEngineering/entity/BizEngineering.java | 52 ++
.../mapper/BizEngineeringMapper.java | 16 +
.../service/IBizEngineeringService.java | 8 +
.../impl/BizEngineeringServiceImpl.java | 42 +
.../controller/BizOpenfoamController.java | 326 ++++++++
.../bizOpenfoam/entity/BizOpenfoam.java | 102 +++
.../bizOpenfoam/mapper/BizOpenfoamMapper.java | 17 +
.../mapper/xml/BizOpenfoamMapper.xml | 5 +
.../service/IBizOpenfoamService.java | 20 +
.../service/impl/BizOpenfoamServiceImpl.java | 141 ++++
.../controller/BizUpdateFileController.java | 174 ++++
.../bizUploadFile/entity/BizUploadFile.java | 59 ++
.../mapper/BizUploadFileMapper.java | 7 +
.../service/BizUploadFileService.java | 13 +
.../impl/BizUploadFileServiceImpl.java | 83 ++
.../bizWrf/controller/BizWrfController.java | 774 ++++++++++++++++++
.../modules/project/bizWrf/entity/BizWrf.java | 208 +++++
.../project/bizWrf/mapper/BizWrfMapper.java | 19 +
.../bizWrf/mapper/xml/BizWrfMapper.xml | 5 +
.../bizWrf/service/IBizWrfService.java | 14 +
.../service/impl/BizWrfServiceImpl.java | 19 +
.../modules/project/bizWrf/vue/BizWrfList.vue | 309 +++++++
.../project/bizWrf/vue/BizWrf_menu_insert.sql | 26 +
.../project/bizWrf/vue/modules/BizWrfForm.vue | 219 +++++
.../vue/modules/BizWrfModal.Style#Drawer.vue | 84 ++
.../bizWrf/vue/modules/BizWrfModal.vue | 60 ++
.../jeecg/modules/project/util/CmdUtil.java | 80 ++
.../jeecg/modules/project/util/SFTPUtil.java | 206 +++++
43 files changed, 5305 insertions(+), 2 deletions(-)
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RemoteExecuteCommand.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/controller/BizCmaqController.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/entity/BizCmaq.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/BizCmaqMapper.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/xml/BizCmaqMapper.xml
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/IBizCmaqService.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/impl/BizCmaqServiceImpl.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaqList.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaq_menu_insert.sql
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqForm.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.Style#Drawer.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/controller/BizEngineeringController.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/entity/BizEngineering.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/mapper/BizEngineeringMapper.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/IBizEngineeringService.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/impl/BizEngineeringServiceImpl.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/controller/BizOpenfoamController.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/entity/BizOpenfoam.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/BizOpenfoamMapper.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/xml/BizOpenfoamMapper.xml
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/IBizOpenfoamService.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/impl/BizOpenfoamServiceImpl.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/controller/BizUpdateFileController.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/entity/BizUploadFile.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/mapper/BizUploadFileMapper.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/BizUploadFileService.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/impl/BizUploadFileServiceImpl.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/controller/BizWrfController.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/entity/BizWrf.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/mapper/BizWrfMapper.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/mapper/xml/BizWrfMapper.xml
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/service/IBizWrfService.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/service/impl/BizWrfServiceImpl.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/vue/BizWrfList.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/vue/BizWrf_menu_insert.sql
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/vue/modules/BizWrfForm.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/vue/modules/BizWrfModal.Style#Drawer.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/vue/modules/BizWrfModal.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/util/CmdUtil.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/util/SFTPUtil.java
diff --git a/jeecg-boot-base-core/pom.xml b/jeecg-boot-base-core/pom.xml
index 37904e6d..21e6818e 100644
--- a/jeecg-boot-base-core/pom.xml
+++ b/jeecg-boot-base-core/pom.xml
@@ -252,6 +252,12 @@
commons-fileupload
commons-fileupload
+
+
+ ch.ethz.ganymed
+ ganymed-ssh2
+ build210
+
\ No newline at end of file
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RemoteExecuteCommand.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RemoteExecuteCommand.java
new file mode 100644
index 00000000..259b44a1
--- /dev/null
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RemoteExecuteCommand.java
@@ -0,0 +1,242 @@
+package org.jeecg.common.util;
+
+/**
+ * Created by hpp on 2017/6/5.
+ */
+
+import ch.ethz.ssh2.Connection;
+import ch.ethz.ssh2.Session;
+import ch.ethz.ssh2.StreamGobbler;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 远程执行linux的shell script
+ * @author Ickes
+ * @author2 hpp
+ * @since V0.2
+ */
+public class RemoteExecuteCommand {
+ //字符编码默认是utf-8
+ private static String DEFAULTCHART="UTF-8";
+ private static Connection conn;
+ private String ip;
+ private String userName;
+ private String userPwd;
+
+ public RemoteExecuteCommand(String ip, String userName, String userPwd) {
+ this.ip = ip;
+ this.userName = userName;
+ this.userPwd = userPwd;
+ }
+
+ public RemoteExecuteCommand() {
+
+ }
+
+ /**
+ * 远程登录linux的主机
+ * @author Ickes
+ * @since V0.1
+ * @return
+ * 登录成功返回true,否则返回false
+ */
+ public Boolean login(){
+ boolean flg=false;
+ try {
+ conn = new Connection(ip);
+ conn.connect();//连接
+ flg=conn.authenticateWithPassword(userName, userPwd);//认证
+ if (flg){
+ System.out.println("认证成功!");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return flg;
+ }
+ /**
+ * @author Ickes
+ * 远程执行shll脚本或者命令
+ * @param cmd
+ * 即将执行的命令
+ * @return
+ * 命令执行完后返回的结果值
+ * @since V0.1
+ */
+ public String execute(String cmd){
+ String result="";
+ try {
+ if(login()){
+ Session session= conn.openSession();//打开一个会话
+ session.execCommand(cmd);//执行命令
+ result=processStdout(session.getStdout(),DEFAULTCHART);
+ //如果为得到标准输出为空,说明脚本执行出错了
+ if(StringUtils.isBlank(result)){
+ result=processStdout(session.getStderr(),DEFAULTCHART);
+ }
+ conn.close();
+ session.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+
+ /**
+ * @author Ickes
+ * 远程执行shll脚本或者命令
+ * @param cmd
+ * 即将执行的命令
+ * @return
+ * 命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null
+ * @since V0.1
+ */
+ public String executeSuccess(String cmd){
+ String result="";
+ try {
+ if(login()){
+ Session session= conn.openSession();//打开一个会话
+ session.execCommand(cmd);//执行命令
+ result=processStdout(session.getStdout(),DEFAULTCHART);
+ conn.close();
+ session.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+ /**
+ * 解析脚本执行返回的结果集
+ * @author Ickes
+ * @param in 输入流对象
+ * @param charset 编码
+ * @since V0.1
+ * @return
+ * 以纯文本的格式返回
+ */
+ public static String processStdout(InputStream in, String charset){
+ InputStream stdout = new StreamGobbler(in);
+ StringBuffer buffer = new StringBuffer();;
+ try {
+ BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));
+ String line=null;
+ while((line=br.readLine()) != null){
+ buffer.append(line+"\n");
+ }
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return buffer.toString();
+ }
+
+ //远程连接并执行多条linux命令
+ public static List runRemoteLinuxCmd(String linux_ip,String linux_username,String password, List lines) {
+ System.out.println("runRemoteLinuxCmds");
+ //执行的命令返回结果
+ List resultList = new ArrayList<>();
+ if(lines!=null && lines.size()>0 && StringUtils.isNotBlank(linux_ip) && StringUtils.isNotBlank(linux_username) && StringUtils.isNotBlank(password)){
+ RemoteExecuteCommand remote = new RemoteExecuteCommand(linux_ip,linux_username,password);
+ for (String cmd : lines) {
+ System.out.println("cmdString:" + cmd);
+ String execute = remote.execute(cmd);
+ resultList.add(execute);
+ }
+ }
+ return resultList;
+ }
+
+ //远程连接并执行单条linux命令
+ public static String runRemoteLinuxCmd(String linux_ip,String linux_username,String password, String cmd) {
+ System.out.println("cmdString:" + cmd);
+ //执行的命令返回结果
+ String executeResult = "";
+ if(StringUtils.isNotBlank(cmd) && StringUtils.isNotBlank(linux_ip) && StringUtils.isNotBlank(linux_username) && StringUtils.isNotBlank(password)){
+ RemoteExecuteCommand remote = new RemoteExecuteCommand(linux_ip,linux_username,password);
+ executeResult = remote.execute(cmd);
+ }
+ return executeResult;
+ }
+
+
+ public static void main(String[] args) {
+
+ RemoteExecuteCommand rec=new RemoteExecuteCommand("172.21.70.56", "oracle","123!@#qwe");
+ //执行命令
+ try {
+ if(rec.login()){
+
+ System.out.println("=====第一个步骤=====");
+ Session session= conn.openSession();//打开一个会话
+ //TODO:多条命令
+ session.execCommand("/usr/bin/gmt --version");//执行命令
+ String result=processStdout(session.getStdout(),DEFAULTCHART);
+ //如果为得到标准输出为空,说明脚本执行出错了
+ if(StringUtils.isBlank(result)){
+ System.out.println("脚本出错");
+ result=processStdout(session.getStderr(),DEFAULTCHART);
+ }
+ System.out.println(result);
+ session.close();
+
+// System.out.println("=====第二个步骤=====");
+// Session session2= conn.openSession();//打开一个会话
+// //TODO:多条命令
+// session2.execCommand("cd /home/ubuntu/Desktop/music_rec/user_sim/result;cat xyy_result_m10d.json");//执行命令
+// String result2=processStdout(session2.getStdout(),DEFAULTCHART);
+// //如果为得到标准输出为空,说明脚本执行出错了
+// if(StringUtils.isBlank(result2)){
+// System.out.println("脚本出错");
+// result2=processStdout(session2.getStderr(),DEFAULTCHART);
+// }
+// System.out.println(result2);
+// session2.close();
+
+
+ conn.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+
+ public static void setCharset(String charset) {
+ DEFAULTCHART = charset;
+ }
+ public Connection getConn() {
+ return conn;
+ }
+ public void setConn(Connection conn) {
+ this.conn = conn;
+ }
+ public String getIp() {
+ return ip;
+ }
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+ public String getUserName() {
+ return userName;
+ }
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+ public String getUserPwd() {
+ return userPwd;
+ }
+ public void setUserPwd(String userPwd) {
+ this.userPwd = userPwd;
+ }
+}
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-module-system/jeecg-system-biz/pom.xml
index faa0ad98..a8d55e42 100644
--- a/jeecg-module-system/jeecg-system-biz/pom.xml
+++ b/jeecg-module-system/jeecg-system-biz/pom.xml
@@ -39,11 +39,71 @@
drag-free
1.0.2
-
+
+ edu.ucar
+ netcdf4
+ 4.5.5
+
+
+
+ com.opencsv
+ opencsv
+ 4.6
+
+
+ com.jcraft
+ jsch
+ 0.1.54
+
+
-
+
+
+
+
+ edu.ucar
+ netcdf4
+ 4.5.5
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.4.15
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.13
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+
+
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/controller/BizCmaqController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/controller/BizCmaqController.java
new file mode 100644
index 00000000..f93f09c8
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/controller/BizCmaqController.java
@@ -0,0 +1,270 @@
+package org.jeecg.modules.project.bizCmaq.controller;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jcraft.jsch.SftpException;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.RemoteExecuteCommand;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.project.bizCmaq.entity.BizCmaq;
+import org.jeecg.modules.project.bizCmaq.service.IBizCmaqService;
+import static java.nio.file.Files.readAllBytes;
+import static java.nio.file.Paths.get;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+import org.jeecg.modules.project.bizEngineering.service.IBizEngineeringService;
+import org.jeecg.modules.project.bizOpenfoam.entity.BizOpenfoam;
+import org.jeecg.modules.project.bizWrf.entity.BizWrf;
+import org.jeecg.modules.project.bizWrf.service.IBizWrfService;
+import org.jeecg.modules.project.util.CmdUtil;
+import org.jeecg.modules.project.util.SFTPUtil;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import ucar.ma2.Array;
+import ucar.ma2.Index;
+import ucar.nc2.NetcdfFile;
+import ucar.nc2.Variable;
+import ucar.nc2.dataset.NetcdfDataset;
+
+/**
+ * @Description: CMAQ
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+@Api(tags="CMAQ")
+@RestController
+@RequestMapping("/bizCmaq")
+@Slf4j
+public class BizCmaqController extends JeecgController {
+ @Autowired
+ private IBizCmaqService bizCmaqService;
+ @Autowired
+ private IBizWrfService bizWrfService;
+
+
+// private String cshPath = "C:\\Users\\13673\\Documents\\WeChat Files\\wxid_v7skypcxmgno22\\FileStorage\\File\\2022-12\\run_cctm_Bench_tem.csh";
+// private String cmaqPath = "C:\\Users\\13673\\Documents\\WeChat Files\\wxid_v7skypcxmgno22\\FileStorage\\File\\2022-12\\run_cctm_Bench_2016_12SE1.csh";
+
+ /**
+ * 分页列表查询
+ *
+ * @param bizCmaq
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "CMAQ-分页列表查询")
+ @ApiOperation(value="CMAQ-分页列表查询", notes="CMAQ-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(BizCmaq bizCmaq,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(bizCmaq, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = bizCmaqService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * get
+ *
+ * @return
+ */
+ @GetMapping(value = "/getCmaqNCFileInfo")
+ public Result>> getCmaqNCFileInfo(int layer) {
+ List> resultAll = bizCmaqService.getNCFileInfo(layer);
+ if(resultAll == null || resultAll.isEmpty()){
+ Result.error("请运行CMAQ程序!");
+ }
+ return Result.OK(resultAll);
+ }
+
+
+ /**
+ * 添加
+ *
+ * @param bizCmaq
+ * @return
+ */
+ @AutoLog(value = "CMAQ-添加")
+ @ApiOperation(value="CMAQ-添加", notes="CMAQ-添加")
+ //@RequiresPermissions("bizCmaq:biz_cmaq:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody BizCmaq bizCmaq) {
+ BizWrf wrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,bizCmaq.getEngineeringId()));
+ bizCmaq.setColsN(Double.valueOf(wrf.getWe()) -3 + "");
+ bizCmaq.setRowsN(Double.valueOf(wrf.getSn()) -3 + "");
+ bizCmaq.setWrfLcRefLat(wrf.getRefLat());
+ bizCmaqService.saveOrUpdate(bizCmaq);
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param bizCmaq
+ * @return
+ */
+ @AutoLog(value = "CMAQ-编辑")
+ @ApiOperation(value="CMAQ-编辑", notes="CMAQ-编辑")
+ //@RequiresPermissions("bizCmaq:biz_cmaq:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody BizCmaq bizCmaq) {
+ bizCmaqService.updateById(bizCmaq);
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "CMAQ-通过id删除")
+ @ApiOperation(value="CMAQ-通过id删除", notes="CMAQ-通过id删除")
+ //@RequiresPermissions("bizCmaq:biz_cmaq:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ bizCmaqService.removeById(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "CMAQ-批量删除")
+ @ApiOperation(value="CMAQ-批量删除", notes="CMAQ-批量删除")
+ //@RequiresPermissions("bizCmaq:biz_cmaq:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.bizCmaqService.removeByIds(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "CMAQ-通过id查询")
+ @ApiOperation(value="CMAQ-通过id查询", notes="CMAQ-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ BizCmaq bizCmaq = bizCmaqService.getById(id);
+ if(bizCmaq==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(bizCmaq);
+ }
+
+ /**
+ * 查询cmaq参数
+ *
+ * @return
+ */
+ //@AutoLog(value = "wrf-查询cmaq参数")
+ @ApiOperation(value="wrf-查询cmaq参数", notes="wrf-查询cmaq参数")
+ @GetMapping(value = "/getCmaqParam")
+ public Result getCmaqParam(String engineeringId) {
+ BizCmaq bizCmaq = bizCmaqService.getOne(new LambdaQueryWrapper().eq(BizCmaq::getEngineeringId,engineeringId));
+ if(bizCmaq==null) {
+ return Result.error("未找到对应数据");
+ }
+ BizWrf wrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,bizCmaq.getEngineeringId()));
+ if(wrf != null){
+ bizCmaq.setColsN(Double.valueOf(wrf.getWe()) -3 + "");
+ bizCmaq.setRowsN(Double.valueOf(wrf.getSn()) -3 + "");
+ bizCmaq.setWrfLcRefLat(wrf.getRefLat());
+ }
+ return Result.OK(bizCmaq);
+ }
+
+ @GetMapping(value = "/runMcipShell")
+ public Result> runMcipShell(String engineeringId) {
+ boolean result = bizCmaqService.runMcipShell(engineeringId);
+ return Result.OK(result);
+ }
+
+ @GetMapping(value = "/runIconShell")
+ public Result> runIconShell(String engineeringId) {
+ boolean result = bizCmaqService.runIconShell(engineeringId);
+ return Result.OK(result);
+ }
+
+ @GetMapping(value = "/runBconShell")
+ public Result> runBconShell(String engineeringId) {
+ boolean result = bizCmaqService.runBconShell(engineeringId);
+ return Result.OK(result);
+ }
+
+ @GetMapping(value = "/runCctmShell")
+ public Result> runCctmShell(String engineeringId) {
+ boolean result = bizCmaqService.runCctmShell(engineeringId);
+ return Result.OK(result);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param bizCmaq
+ */
+ //@RequiresPermissions("bizCmaq:biz_cmaq:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, BizCmaq bizCmaq) {
+ return super.exportXls(request, bizCmaq, BizCmaq.class, "CMAQ");
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ //@RequiresPermissions("bizCmaq:biz_cmaq:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ return super.importExcel(request, response, BizCmaq.class);
+ }
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/entity/BizCmaq.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/entity/BizCmaq.java
new file mode 100644
index 00000000..8c18ce40
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/entity/BizCmaq.java
@@ -0,0 +1,209 @@
+package org.jeecg.modules.project.bizCmaq.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: CMAQ
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+@Data
+@TableName("biz_cmaq")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="biz_cmaq对象", description="CMAQ")
+public class BizCmaq implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @ApiModelProperty(value = "主键")
+ private String id;
+ /**创建人*/
+ @ApiModelProperty(value = "创建人")
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty(value = "创建日期")
+ private Date createTime;
+ /**更新人*/
+ @ApiModelProperty(value = "更新人")
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty(value = "更新日期")
+ private Date updateTime;
+ /**start_date*/
+ @Excel(name = "start_date", width = 15)
+ @ApiModelProperty(value = "start_date")
+ private String startDate;
+ /**end_date*/
+ @Excel(name = "end_date", width = 15)
+ @ApiModelProperty(value = "end_date")
+ private String endDate;
+ /**sttime*/
+ @Excel(name = "sttime", width = 15)
+ @ApiModelProperty(value = "sttime")
+ private String sttime;
+ /**nsteps*/
+ @Excel(name = "nsteps", width = 15)
+ @ApiModelProperty(value = "nsteps")
+ private String nsteps;
+ /**tstep*/
+ @Excel(name = "tstep", width = 15)
+ @ApiModelProperty(value = "tstep")
+ private String tstep;
+ /**ctm_maxsync*/
+ @Excel(name = "ctm_maxsync", width = 15)
+ @ApiModelProperty(value = "ctm_maxsync")
+ private String ctmMaxsync;
+ /**ctm_minsync*/
+ @Excel(name = "ctm_minsync", width = 15)
+ @ApiModelProperty(value = "ctm_minsync")
+ private String ctmMinsync;
+ /**sigma_sync_top*/
+ @Excel(name = "sigma_sync_top", width = 15)
+ @ApiModelProperty(value = "sigma_sync_top")
+ private String sigmaSyncTop;
+ /**ctm_adv_cfl*/
+ @Excel(name = "ctm_adv_cfl", width = 15)
+ @ApiModelProperty(value = "ctm_adv_cfl")
+ private String ctmAdvCfl;
+ /**ctm_ocean_chem*/
+ @Excel(name = "ctm_ocean_chem", width = 15)
+ @ApiModelProperty(value = "ctm_ocean_chem")
+ private String ctmOceanChem;
+ /**ctm_wb_dust*/
+ @Excel(name = "ctm_wb_dust", width = 15)
+ @ApiModelProperty(value = "ctm_wb_dust")
+ private String ctmWbDust;
+ /**ctm_ltng_no*/
+ @Excel(name = "ctm_ltng_no", width = 15)
+ @ApiModelProperty(value = "ctm_ltng_no")
+ private String ctmLtngNo;
+ /**kzmin*/
+ @Excel(name = "kzmin", width = 15)
+ @ApiModelProperty(value = "kzmin")
+ private String kzmin;
+ /**ctm_mosaic*/
+ @Excel(name = "ctm_mosaic", width = 15)
+ @ApiModelProperty(value = "ctm_mosaic")
+ private String ctmMosaic;
+ /**ctm_fst*/
+ @Excel(name = "ctm_fst", width = 15)
+ @ApiModelProperty(value = "ctm_fst")
+ private String ctmFst;
+ /**px_version*/
+ @Excel(name = "px_version", width = 15)
+ @ApiModelProperty(value = "px_version")
+ private String pxVersion;
+ /**clm_version*/
+ @Excel(name = "clm_version", width = 15)
+ @ApiModelProperty(value = "clm_version")
+ private String clmVersion;
+ /**noah_version*/
+ @Excel(name = "noah_version", width = 15)
+ @ApiModelProperty(value = "noah_version")
+ private String noahVersion;
+ /**ctm_abflux*/
+ @Excel(name = "ctm_abflux", width = 15)
+ @ApiModelProperty(value = "ctm_abflux")
+ private String ctmAbflux;
+ /**ctm_bidi_fert_nh3*/
+ @Excel(name = "ctm_bidi_fert_nh3", width = 15)
+ @ApiModelProperty(value = "ctm_bidi_fert_nh3")
+ private String ctmBidiFertNh3;
+ /**ctm_hgbidi*/
+ @Excel(name = "ctm_hgbidi", width = 15)
+ @ApiModelProperty(value = "ctm_hgbidi")
+ private String ctmHgbidi;
+ /**ctm_sfc_hono*/
+ @Excel(name = "ctm_sfc_hono", width = 15)
+ @ApiModelProperty(value = "ctm_sfc_hono")
+ private String ctmSfcHono;
+ /**ctm_grav_setl*/
+ @Excel(name = "ctm_grav_setl", width = 15)
+ @ApiModelProperty(value = "ctm_grav_setl")
+ private String ctmGravSetl;
+ /**ctm_biogemis*/
+ @Excel(name = "ctm_biogemis", width = 15)
+ @ApiModelProperty(value = "ctm_biogemis")
+ private String ctmBiogemis;
+ /**icpath*/
+ @Excel(name = "icpath", width = 15)
+ @ApiModelProperty(value = "icpath")
+ private String icpath;
+ /**bcpath*/
+ @Excel(name = "bcpath", width = 15)
+ @ApiModelProperty(value = "bcpath")
+ private String bcpath;
+ /**emispath*/
+ @Excel(name = "emispath", width = 15)
+ @ApiModelProperty(value = "emispath")
+ private String emispath;
+ /**emispath2*/
+ @Excel(name = "emispath2", width = 15)
+ @ApiModelProperty(value = "emispath2")
+ private String emispath2;
+ /**in_ptpath*/
+ @Excel(name = "in_ptpath", width = 15)
+ @ApiModelProperty(value = "in_ptpath")
+ private String inPtpath;
+ /**in_ltpath*/
+ @Excel(name = "in_ltpath", width = 15)
+ @ApiModelProperty(value = "in_ltpath")
+ private String inLtpath;
+ /**metpath*/
+ @Excel(name = "metpath", width = 15)
+ @ApiModelProperty(value = "metpath")
+ private String metpath;
+ /**lupath*/
+ @Excel(name = "lupath", width = 15)
+ @ApiModelProperty(value = "lupath")
+ private String lupath;
+ /**szpath*/
+ @Excel(name = "szpath", width = 15)
+ @ApiModelProperty(value = "szpath")
+ private String szpath;
+ /**fileName*/
+ @Excel(name = "fileName", width = 15)
+ @ApiModelProperty(value = "fileName")
+ private String fileName;
+ @Excel(name = "x0", width = 15)
+ @ApiModelProperty(value = "x0")
+ private String x0;
+ @Excel(name = "y0", width = 15)
+ @ApiModelProperty(value = "y0")
+ private String y0;
+ @Excel(name = "colsN", width = 15)
+ @ApiModelProperty(value = "colsN")
+ private String colsN;
+ @Excel(name = "rowsN", width = 15)
+ @ApiModelProperty(value = "rowsN")
+ private String rowsN;
+ @Excel(name = "wrfLcRefLat", width = 15)
+ @ApiModelProperty(value = "wrfLcRefLat")
+ private String wrfLcRefLat;
+ @Excel(name = "engineeringId", width = 15)
+ @ApiModelProperty(value = "engineeringId")
+ private String engineeringId;
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/BizCmaqMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/BizCmaqMapper.java
new file mode 100644
index 00000000..f29ca65c
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/BizCmaqMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.project.bizCmaq.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.project.bizCmaq.entity.BizCmaq;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: CMAQ
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+public interface BizCmaqMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/xml/BizCmaqMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/xml/BizCmaqMapper.xml
new file mode 100644
index 00000000..fa8a819c
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/mapper/xml/BizCmaqMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/IBizCmaqService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/IBizCmaqService.java
new file mode 100644
index 00000000..40130ba0
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/IBizCmaqService.java
@@ -0,0 +1,30 @@
+package org.jeecg.modules.project.bizCmaq.service;
+
+import com.jcraft.jsch.SftpException;
+import org.jeecg.modules.project.bizCmaq.entity.BizCmaq;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * @Description: CMAQ
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+public interface IBizCmaqService extends IService {
+
+ List> getNCFileInfo(int layer);
+
+ boolean runMcipShell(String engineeringId);
+
+ boolean runIconShell(String engineeringId);
+
+ boolean runBconShell(String engineeringId);
+
+ boolean runCctmShell(String engineeringId);
+
+ List getVariableNames();
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/impl/BizCmaqServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/impl/BizCmaqServiceImpl.java
new file mode 100644
index 00000000..4902b2e8
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/service/impl/BizCmaqServiceImpl.java
@@ -0,0 +1,458 @@
+package org.jeecg.modules.project.bizCmaq.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jcraft.jsch.SftpException;
+import org.jeecg.common.util.RemoteExecuteCommand;
+import org.jeecg.modules.project.bizCmaq.entity.BizCmaq;
+import org.jeecg.modules.project.bizCmaq.mapper.BizCmaqMapper;
+import org.jeecg.modules.project.bizCmaq.service.IBizCmaqService;
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+import org.jeecg.modules.project.bizEngineering.service.IBizEngineeringService;
+import org.jeecg.modules.project.bizOpenfoam.entity.BizOpenfoam;
+import org.jeecg.modules.project.bizOpenfoam.service.IBizOpenfoamService;
+import org.jeecg.modules.project.bizWrf.service.IBizWrfService;
+import org.jeecg.modules.project.util.CmdUtil;
+import org.jeecg.modules.project.util.SFTPUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.jeecg.modules.project.bizWrf.entity.BizWrf;
+import org.jeecg.modules.project.bizWrf.mapper.BizWrfMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import ucar.ma2.Array;
+import ucar.ma2.Index;
+import ucar.nc2.NetcdfFile;
+import ucar.nc2.Variable;
+import ucar.nc2.dataset.NetcdfDataset;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import static java.nio.file.Files.readAllBytes;
+import static java.nio.file.Paths.get;
+
+/**
+ * @Description: CMAQ
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+@Service
+public class BizCmaqServiceImpl extends ServiceImpl implements IBizCmaqService {
+
+ @Autowired
+ private BizWrfMapper bizWrfMapper;
+ @Autowired
+ private IBizWrfService bizWrfService;
+ @Autowired
+ private IBizOpenfoamService bizOpenfoamService;
+ @Autowired
+ private IBizEngineeringService bizEngineeringService;
+
+ @Value("${spring.baseHome}")
+ private String baseHome;
+ @Value("${spring.CMAQ.cmaqLocalShellHome}")
+ private String cmaqLocalShellHome;
+ @Value("${spring.CMAQ.outputLocalPath}")
+ private String outputLocalPath;
+ @Value("${spring.CMAQ.cshTemFielPath}")
+ private String cshTemFielPath;
+ @Value("${spring.CMAQ.pythonPath}")
+ private String pythonPath;
+ @Value("${spring.WRF.wrfLocalPrefix}")
+ private String wrfLocalPrefix;
+ @Value("${spring.Linux.ip}")
+ private String ip;
+ @Value("${spring.Linux.username}")
+ private String username;
+ @Value("${spring.Linux.password}")
+ private String password;
+ @Value("${spring.Linux.port}")
+ private Integer port;
+
+ private String genMcipsShell(String allRunPath, String startTime, String endTime,Integer domain,String ncols,String nrows) throws IOException, SftpException {
+ String fileName = "all_run_mcip.csh";
+ String data = new String(readAllBytes(get(cshTemFielPath + "all_run_mcip_tem.csh")));
+ data = data
+ .replace("#{RUN_PATH}", allRunPath)
+ .replace("#{START_DATE}", startTime)
+ .replace("#{END_DATE}", endTime)
+ .replace("#{domain}", domain+"")
+ .replace("#{NCOLS_ARR}", ncols)
+ .replace("#{NROWS_ARR}", nrows);
+ String targetFilePath = cmaqLocalShellHome + "MCIP/" + fileName;
+ FileUtil.writeString(data, targetFilePath, "UTF-8");
+ sftpUpload(targetFilePath,allRunPath + "CMAQ/PREP/mcip/scripts/", fileName);
+ return fileName;
+ }
+
+ public String genIconShell(String allRunPath,String startTime,String endTime,Integer domain){
+ String fileName = "all_run_icon.csh";
+ try {
+ String data = new String(readAllBytes(get(cshTemFielPath + "all_run_icon_tem.csh")));
+ data = data.replace("#{RUN_PATH}", allRunPath).replace("#{START_DATE}", startTime).replace("#{END_DATE}", endTime).replace("#{domain}", domain+"");
+ // todo sftp 上传
+ String targetFilePath = cmaqLocalShellHome + "ICON/" + fileName;
+ FileUtil.writeString(data, targetFilePath, "UTF-8");
+ sftpUpload(targetFilePath,allRunPath + "CMAQ/PREP/icon/scripts/", fileName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return fileName;
+ }
+
+ public String genBconShell(String allRunPath,String startTime,String endTime,Integer domain) {
+ String fileName = "all_run_bcon.csh";
+ try {
+ String data = new String(readAllBytes(get(cshTemFielPath + "all_run_bcon_tem.csh")));
+ data = data.replace("#{RUN_PATH}", allRunPath).replace("#{START_DATE}", startTime).replace("#{END_DATE}", endTime).replace("#{domain}", domain + "");
+ // todo sftp 上传
+ String targetFilePath = cmaqLocalShellHome + "BCON/" + fileName;
+ FileUtil.writeString(data, targetFilePath, "UTF-8");
+ sftpUpload(targetFilePath, allRunPath + "CMAQ/PREP/bcon/scripts/", fileName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return fileName;
+ }
+
+ public String genCctmShell(String allRunPath, String startDate, String endDate, String stTime, String nSteps, String tStep) {
+ String fileName = "run_cctm_2016.csh";
+ try {
+ String data = new String(readAllBytes(get(cshTemFielPath + "run_cctm_2016_tem.csh")));
+ data = data.replace("#{START_DATE}", startDate).replace("#{END_DATE}", endDate).replace("#{STTIME}", stTime)
+ .replace("#{NSTEPS}", nSteps).replace("#{TSTEP}", tStep);
+ // todo sftp 上传
+ String targetFilePath = cmaqLocalShellHome + "CCTM/" + fileName;
+ FileUtil.writeString(data, targetFilePath, "UTF-8");
+ sftpUpload(targetFilePath,allRunPath + "CMAQ/CCTM/scripts/",fileName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return fileName;
+ }
+
+ @Override
+ public boolean runMcipShell(String engineeringId) {
+ BizCmaq cmaq = getOne(new LambdaQueryWrapper().eq(BizCmaq::getEngineeringId,engineeringId));
+ BizWrf wrf = bizWrfMapper.selectOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,engineeringId));
+
+ String allRunPath = baseHome + wrf.getCreateBy() + wrf.getEngineeringId() + "/" + wrf.getTimeStamp() + "/";
+ try {
+ // todo step1 mcip
+ String mcipFileName = genMcipsShell(allRunPath,wrf.getStartTime().substring(0, 10),wrf.getEndTime().substring(0, 10),wrf.getMaxDom(),cmaq.getColsN(),cmaq.getRowsN());
+ // todo 执行mcip.csh
+ runCmd(allRunPath + "CMAQ/","PREP/mcip",mcipFileName);
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean runIconShell(String engineeringId) {
+ BizWrf wrf = bizWrfMapper.selectOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,engineeringId));
+ String allRunPath = baseHome + wrf.getCreateBy() + wrf.getEngineeringId() + "/" + wrf.getTimeStamp() + "/";
+ try {
+ // todo step2 icon
+ String iconFileName = genIconShell(allRunPath,wrf.getStartTime().substring(0, 10),wrf.getEndTime().substring(0, 10),wrf.getMaxDom());
+ // todo 执行icon.csh
+ runCmd(allRunPath + "CMAQ/","PREP/icon",iconFileName);
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean runBconShell(String engineeringId) {
+ BizWrf wrf = bizWrfMapper.selectOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,engineeringId));
+ String allRunPath = baseHome + wrf.getCreateBy() + wrf.getEngineeringId() + "/" + wrf.getTimeStamp() + "/";
+ try {
+ // todo step2 bcon
+ String iconFileName = genBconShell(allRunPath,wrf.getStartTime().substring(0, 10),wrf.getEndTime().substring(0, 10),wrf.getMaxDom());
+ // todo 执行bcon.csh
+ runCmd(allRunPath + "CMAQ/","PREP/bcon",iconFileName);
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean runGeneratePy(String emisBenchCmd,String METCRO3DCmd,String outputCmd) {
+ String runCmd = String.format("cd %s;./python %sgenerate.py %s %s %s",pythonPath + "rtm/bin/",pythonPath,emisBenchCmd,METCRO3DCmd,outputCmd);
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, runCmd);
+ return true;
+ }
+
+ public boolean runSetvaluePy(String type,String value,String emisOutputCmd,String outputCmd,int x,int y,Integer layer) {
+ String runCmd = String.format("cd %s;./python %ssetvalue.py %s %s %s %s %s %s %s",pythonPath + "rtm/bin/",pythonPath,type,value,emisOutputCmd,outputCmd,x,y,layer);
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, runCmd);
+ return true;
+ }
+
+ @Override
+ public boolean runCctmShell(String engineeringId) {
+ BizWrf wrf = bizWrfMapper.selectOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,engineeringId));
+ BizCmaq cmaq = getOne(new LambdaQueryWrapper().eq(BizCmaq::getEngineeringId,engineeringId));
+ BizOpenfoam openfoam = bizOpenfoamService.getOne(new LambdaQueryWrapper().eq(BizOpenfoam::getEngineeringId, engineeringId));
+ String allRunPath = baseHome + wrf.getCreateBy() + wrf.getEngineeringId() + "/" + wrf.getTimeStamp() + "/";
+
+ String ymdFormat = "yyyy-MM-dd";
+ String yymdFormat = "yyMMdd";
+ String format = "yyyy-MM-dd_hh:mm:ss";
+ DateTime startTime = DateUtil.parse(wrf.getStartTime(), format);
+ DateTime endTime = DateUtil.parse(wrf.getEndTime(), format);
+ long startTimeSecs = startTime.getTime();
+ long endTimeSecs = endTime.getTime();
+ long oneDaySecs = 60 * 60 * 24 * 1000;
+ String newStartTime = DateUtil.format(new Date(startTimeSecs + oneDaySecs), ymdFormat);
+ String newEndTime = DateUtil.format(new Date(endTimeSecs - oneDaySecs), ymdFormat);
+
+ String emisBenchPath = String.format("%sCMAQ/data/input/emis/",allRunPath);
+ String emisBenchNcName = "emis_mole_tem.nc";
+ try {
+ sftpUpload(cshTemFielPath + emisBenchNcName, emisBenchPath , emisBenchNcName);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (SftpException e) {
+ e.printStackTrace();
+ }
+ for (Integer i = 0; i < wrf.getMaxDom(); i++) {
+ for (long tmpSecs = startTimeSecs; tmpSecs < endTimeSecs; tmpSecs += oneDaySecs) {
+ String outputNcName = String.format("emis_mole_d0%s_%s_tem.nc",i+1,DateUtil.format(new Date(tmpSecs), yymdFormat));
+
+ String METCRO3DPath = String.format("%sCMAQ/data/input/mcip/",allRunPath);
+ String METCRO3DNcName = String.format("METCRO3D_d0%s_%s.nc",i+1,DateUtil.format(new Date(tmpSecs), yymdFormat));
+ runGeneratePy(emisBenchPath + emisBenchNcName,METCRO3DPath + METCRO3DNcName,emisBenchPath + outputNcName);
+
+ List coAndPecInfo = bizOpenfoamService.getCoAndPecInfo(wrf);
+ String coNcName = String.format("co_emis_d0%s_%s.nc",i+1,DateUtil.format(new Date(tmpSecs), yymdFormat));
+ String perNcName = String.format("emis_d0%s_%s.nc",i+1,DateUtil.format(new Date(tmpSecs), yymdFormat));
+ runSetvaluePy("CO",coAndPecInfo.get(0),emisBenchPath + outputNcName,emisBenchPath + coNcName,wrf.getXIndex(),wrf.getYIndex(),openfoam.getLayer());
+ runSetvaluePy("PEC",coAndPecInfo.get(1),emisBenchPath + coNcName,emisBenchPath + perNcName,wrf.getXIndex(),wrf.getYIndex(),openfoam.getLayer());
+ }
+ }
+ try {
+ // todo step2 cctm
+ String cctmFileName = genCctmShell(allRunPath,newStartTime,newEndTime,cmaq.getSttime(), cmaq.getNsteps(), cmaq.getTstep());
+ // todo 执行cctm.csh
+ runCmd(allRunPath + "CMAQ/","CCTM",cctmFileName);
+ String ncName = "CCTM_ACONC_v532_2016_12SE1_"+newStartTime.replace("-","")+".nc";
+ String ncLocalName = "CCTM_ACONC_v532_2016_12SE1_"+DateUtil.format(new Date(startTimeSecs), ymdFormat).replace("-","")+".nc";
+ SFTPUtil sftpUtil = new SFTPUtil();
+ sftpUtil.login(username, password,ip,port);
+ sftpUtil.download(allRunPath + "CMAQ/data/output/v532_2016_12SE1/",ncName,outputLocalPath + ncLocalName);
+ sftpUtil.logout();
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public List> getNCFileInfo(int layer){
+ List> resultAll = new ArrayList<>();
+ try {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ BizEngineering bizEngineeringByState = bizEngineeringService.getBizEngineeringByState();
+ BizCmaq bizCmaq = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(BizCmaq::getEngineeringId,bizEngineeringByState.getId()));
+ if(bizCmaq != null) {
+
+ NetcdfFile griddot2d = NetcdfDataset.open("C:\\Users\\13673\\Desktop\\某源\\Nuclear\\file\\wrfout_d01_2016-07-01_00_00_00");
+ NetcdfFile ncfile = NetcdfDataset.open("C:\\Users\\13673\\Desktop\\某源\\Nuclear\\file\\CCTM_ACONC_v532_2016_12SE1_20160701.nc");
+// String ncName = "CCTM_ACONC_v532_2016_12SE1_" + sdf.format(sdf.parse(bizCmaq.getStartDate())).replace("-", "") + ".nc";
+// NetcdfFile ncfile = NetcdfDataset.open(outputLocalPath + ncName);
+// BizWrf bizWrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId, bizEngineeringByState.getId()));
+// String ncNameWrf = "wrfout_d01_" + bizWrf.getStartTime();
+// NetcdfFile griddot2d = NetcdfDataset.open(wrfLocalPrefix + ncNameWrf);
+ List>> coAllList = getNCByName(ncfile, "CO", layer);
+ List>> no2AllList = getNCByName(ncfile, "NO2", layer);
+ List>> no3AllList = getNCByName(ncfile, "NO3", layer);
+ List>> xlatAllList = getNCByName(griddot2d, "XLAT", layer);
+ List>> xlongAllList = getNCByName(griddot2d, "XLONG", layer);
+
+ for (int l = 0; l < coAllList.size(); l++) {
+ List result = new ArrayList<>();
+ for (int i = 0; i < coAllList.get(l).size(); i++) {
+ List xlats = xlatAllList.get(0).get(i);
+ List xlongs = xlongAllList.get(0).get(i);
+ List cos = coAllList.get(l).get(i);
+ List no2s = no2AllList.get(l).get(i);
+ List no3s = no3AllList.get(l).get(i);
+ for (int j = 0; j < cos.size(); j++) {
+ Double[] resultArray = new Double[5];
+ resultArray[0] = xlongs.get(j);
+ resultArray[1] = xlats.get(j);
+ resultArray[2] = cos.get(j);
+ resultArray[3] = no2s.get(j);
+ resultArray[4] = no3s.get(j);
+ result.add(resultArray);
+ }
+ }
+ resultAll.add(result);
+ }
+ }else{
+ return null;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return resultAll;
+ }
+
+ @Override
+ public List getVariableNames(){
+ List variableNames = new ArrayList<>();
+ BizEngineering bizEngineeringByState = bizEngineeringService.getBizEngineeringByState();
+ BizCmaq bizCmaq = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(BizCmaq::getEngineeringId,bizEngineeringByState.getId()));
+ BizWrf bizWrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId, bizEngineeringByState.getId()));
+
+ String ymdFormat = "yyyy-MM-dd";
+ String format = "yyyy-MM-dd_hh:mm:ss";
+ DateTime startTime = DateUtil.parse(bizWrf.getStartTime(), format);
+ long startTimeSecs = startTime.getTime();
+ long oneDaySecs = 60 * 60 * 24 * 1000;
+
+ if(bizCmaq != null) {
+// NetcdfFile ncfile = NetcdfDataset.open("C:\\Users\\13673\\Desktop\\Nuclear\\file\\CCTM_ACONC_v532_intel_Bench_2016_12SE1_20160702.nc");
+ String newStartTime = DateUtil.format(new Date(startTimeSecs + oneDaySecs), ymdFormat);
+ String ncName = "CCTM_ACONC_v532_2016_12SE1_" + newStartTime.replace("-", "") + ".nc";
+ try {
+ NetcdfFile ncfile = NetcdfDataset.open(outputLocalPath + ncName);
+ List variables = ncfile.getVariables();
+ variables.forEach(li ->{
+ variableNames.add(li.getShortName());
+ });
+ return variableNames;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ public void runCmd(String allRunPath,String type,String fileName){
+ String runCmd = "cd " + allRunPath + type+"/scripts/;chmod +x " + fileName + ";./" + fileName;
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, runCmd);
+ }
+
+ private List everyDay(String beginTime, String endTime) {
+ List allDate = new ArrayList();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
+ Date dBegin = null;
+ Date dEnd = null;
+ try {
+ dBegin = sdf.parse(beginTime);
+ dEnd = sdf.parse(endTime);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ allDate.add(sdf.format(dBegin));
+ Calendar calBegin = Calendar.getInstance();
+ // 使用给定的 Date 设置此 Calendar 的时间
+ calBegin.setTime(dBegin);
+ Calendar calEnd = Calendar.getInstance();
+ // 使用给定的 Date 设置此 Calendar 的时间
+ calEnd.setTime(dEnd);
+ // 测试此日期是否在指定日期之后
+ while (dEnd.after(calBegin.getTime())) {
+ // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+ calBegin.add(Calendar.DAY_OF_MONTH, 1);
+ allDate.add(sdf.format(calBegin.getTime()));
+ }
+ return allDate;
+ }
+
+ public void sftpUpload(String file,String cshFilePath,String fileName) throws FileNotFoundException, SftpException {
+ SFTPUtil sftpUtil = new SFTPUtil();
+ sftpUtil.login(username, password,ip,port);
+ InputStream inputStream = new FileInputStream(file);
+ sftpUtil.upload(cshFilePath,fileName,inputStream);
+ sftpUtil.logout();
+ }
+
+ public static List>> getNCByName(NetcdfFile ncfile, String name,int layer){
+ Variable variable = ncfile.findVariable(name);
+ List>> resultAll = new ArrayList<>();
+
+ // 读取nc数据到数组
+ Array data = null;
+ try {
+ data = variable.read();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ // 获取参数和索引,其中shape的前三个参数分别是时间、纬度、经度
+ int[] shape = data.getShape();
+ Index index = data.getIndex();
+
+ // 将三维数组降维,并用String数组提取数据
+ // 按时间
+ // 按维度
+ if(shape.length == 3){
+ // 将三维数组降维,并用String数组提取数据
+ // 按时间
+ // 按维度
+ for (int i = 0; i < shape[0]; i++) {
+ List> resultPiece = new ArrayList<>();
+ for (int j = 0; j < shape[1]; j++) {
+ List strings = new ArrayList<>();
+ // 按经度
+ for (int k = 0; k < shape[2]; k++) {
+ // 按照对应索引获取数据并转换为string类型添加到数组中
+ Double dval = Math.round(data.getDouble(index.set(i, j, k)) * 1000) /1000d;
+ strings.add(dval);
+ }
+ resultPiece.add(strings);
+ }
+ resultAll.add(resultPiece);
+ }
+ }else{
+ for (int i = 0; i < shape[0]; i++) {
+ List> resultPiece = new ArrayList<>();
+ for (int j = 0; j < shape[2]; j++) {
+ List strings = new ArrayList<>();
+ // 按经度
+ for (int k = 0; k < shape[3]; k++) {
+ // 按照对应索引获取数据并转换为string类型添加到数组中
+ Double dval = 0.0;
+ if(name.equals("LATD") || name.equals("LOND")){
+ dval = Math.round(data.getFloat(index.set(i, layer, j, k)) * 10000) /10000d;
+ }else{
+ try {
+ dval = Math.round(data.getDouble(index.set(i, layer, j, k)) * 10000000) /10000000d;
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ strings.add(dval);
+ }
+ resultPiece.add(strings);
+ }
+ resultAll.add(resultPiece);
+ }
+ }
+ return resultAll;
+ }
+
+ public static void main(String[] args) {
+ String runCmd = "C:\\hky-work\\python\\emis\\python.exe C:\\hky-work\\python\\generate.py C:\\hky-work\\python\\emis_mole_all_20160701_cb6_bench.nc C:\\hky-work\\python\\METCRO3D_d01_160701.nc C:\\hky-work\\python\\a.nc";
+// String runCmd = "cmd.exe /c start diskmgmt.msc";
+ System.out.println(CmdUtil.execCmd(runCmd));
+ }
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaqList.vue b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaqList.vue
new file mode 100644
index 00000000..52673c02
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaqList.vue
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+
+
新增
+
导出
+
+ 导入
+
+
+
+
+
+ 删除
+
+ 批量操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无图片
+
+
+
+ 无文件
+
+ 下载
+
+
+
+
+ 编辑
+
+
+
+ 更多
+
+
+ 详情
+
+
+ handleDelete(record.id)">
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaq_menu_insert.sql b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaq_menu_insert.sql
new file mode 100644
index 00000000..29ae54dc
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/BizCmaq_menu_insert.sql
@@ -0,0 +1,26 @@
+-- 注意:该页面对应的前台目录为views/bizCmaq文件夹下
+-- 如果你想更改到其他目录,请修改sql中component字段对应的值
+
+
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
+VALUES ('2022121909458100390', NULL, 'CMAQ', '/bizCmaq/bizCmaqList', 'bizCmaq/BizCmaqList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2022-12-19 21:45:39', NULL, NULL, 0);
+
+-- 权限控制sql
+-- 新增
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2022121909458100391', '2022121909458100390', '添加CMAQ', NULL, NULL, 0, NULL, NULL, 2, 'bizCmaq:biz_cmaq:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-19 21:45:39', NULL, NULL, 0, 0, '1', 0);
+-- 编辑
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2022121909458100392', '2022121909458100390', '编辑CMAQ', NULL, NULL, 0, NULL, NULL, 2, 'bizCmaq:biz_cmaq:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-19 21:45:39', NULL, NULL, 0, 0, '1', 0);
+-- 删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2022121909458100393', '2022121909458100390', '删除CMAQ', NULL, NULL, 0, NULL, NULL, 2, 'bizCmaq:biz_cmaq:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-19 21:45:39', NULL, NULL, 0, 0, '1', 0);
+-- 批量删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2022121909458100394', '2022121909458100390', '批量删除CMAQ', NULL, NULL, 0, NULL, NULL, 2, 'bizCmaq:biz_cmaq:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-19 21:45:39', NULL, NULL, 0, 0, '1', 0);
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2022121909458100395', '2022121909458100390', '导出excel_CMAQ', NULL, NULL, 0, NULL, NULL, 2, 'bizCmaq:biz_cmaq:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-19 21:45:39', NULL, NULL, 0, 0, '1', 0);
+-- 导入excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2022121909458100396', '2022121909458100390', '导入excel_CMAQ', NULL, NULL, 0, NULL, NULL, 2, 'bizCmaq:biz_cmaq:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-19 21:45:39', NULL, NULL, 0, 0, '1', 0);
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqForm.vue b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqForm.vue
new file mode 100644
index 00000000..35cef51d
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqForm.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.Style#Drawer.vue b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.Style#Drawer.vue
new file mode 100644
index 00000000..d43319a5
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.Style#Drawer.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.vue b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.vue
new file mode 100644
index 00000000..d91155a0
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizCmaq/vue/modules/BizCmaqModal.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/controller/BizEngineeringController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/controller/BizEngineeringController.java
new file mode 100644
index 00000000..5675f792
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/controller/BizEngineeringController.java
@@ -0,0 +1,121 @@
+package org.jeecg.modules.project.bizEngineering.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.RemoteExecuteCommand;
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+import org.jeecg.modules.project.bizEngineering.service.IBizEngineeringService;
+import org.jeecg.modules.project.bizWrf.entity.BizWrf;
+import org.jeecg.modules.project.bizWrf.service.IBizWrfService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+@Api(tags="BizEngineering")
+@RestController
+@RequestMapping("/bizEngineering")
+@Slf4j
+public class BizEngineeringController {
+
+ @Autowired
+ private IBizEngineeringService bizEngineeringService;
+
+ @Value("${spring.baseHome}")
+ private String baseHome;
+
+ /**
+ * 查询工程
+ *
+ * @return
+ */
+ @GetMapping(value = "/list")
+ public Result> list() {
+ LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+ List bizEngineerings = bizEngineeringService.list(new LambdaQueryWrapper().
+ eq(BizEngineering::getCreateBy,sysUser.getUsername()).
+ orderByDesc(BizEngineering::getCreateTime));
+ if(bizEngineerings == null || bizEngineerings.isEmpty()) {
+ String engPath= String.format("%s%s",baseHome,sysUser.getUsername());
+ BizEngineering bizEngineering = new BizEngineering();
+ bizEngineering.setCreateBy(sysUser.getUsername());
+ bizEngineering.setCreateTime(new Date());
+ bizEngineering.setEngineeringName("系统自动创建工程");
+ bizEngineering.setEngineeringPath(engPath);
+ bizEngineering.setSceneType(0);
+ bizEngineeringService.save(bizEngineering);
+ bizEngineerings.add(bizEngineering);
+ }
+ for (BizEngineering bizEngineering : bizEngineerings) {
+ bizEngineering.setEngineeringPath(bizEngineering.getEngineeringPath() + "/" + bizEngineering.getId());
+ }
+ return Result.OK(bizEngineerings);
+ }
+
+
+ /**
+ * 添加
+ *
+ * @param bizEngineering
+ * @return
+ */
+ @AutoLog(value = "BizEngineering-添加")
+ @ApiOperation(value="BizEngineering-添加", notes="BizEngineering-添加")
+ //@RequiresPermissions("bizWrf:biz_wrf:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody BizEngineering bizEngineering) {
+ LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+ String engPath= String.format("%s%s",baseHome,sysUser.getUsername());
+ bizEngineering.setEngineeringPath(engPath);
+ bizEngineeringService.save(bizEngineering);
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param bizEngineering
+ * @return
+ */
+ @AutoLog(value = "BizEngineering-编辑")
+ @ApiOperation(value="BizEngineering-编辑", notes="BizEngineering-编辑")
+ //@RequiresPermissions("bizWrf:biz_wrf:add")
+ @PutMapping(value = "/edit")
+ public Result edit(@RequestBody BizEngineering bizEngineering) {
+ bizEngineeringService.updateById(bizEngineering);
+ return Result.OK("编辑成功!");
+ }
+
+// /**
+// * 编辑
+// *
+// * @param bizEngineering
+// * @return
+// */
+// @AutoLog(value = "BizEngineering-编辑")
+// @ApiOperation(value="BizEngineering-编辑", notes="BizEngineering-编辑")
+// //@RequiresPermissions("bizWrf:biz_wrf:add")
+// @PostMapping(value = "/updateStateById")
+// public Result updateStateById(String id) {
+// bizEngineeringService.updateById(bizEngineering);
+// return Result.OK("编辑成功!");
+// }
+
+ /**
+ * 查询选中工程
+ *
+ * @return
+ */
+ @GetMapping(value = "/getBizEngineeringByState")
+ public Result getBizEngineeringByState() {
+ return Result.ok(bizEngineeringService.getBizEngineeringByState());
+ }
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/entity/BizEngineering.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/entity/BizEngineering.java
new file mode 100644
index 00000000..4d5b6da9
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/entity/BizEngineering.java
@@ -0,0 +1,52 @@
+package org.jeecg.modules.project.bizEngineering.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class BizEngineering {
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @ApiModelProperty(value = "主键")
+ private String id;
+ /**创建人*/
+ @ApiModelProperty(value = "创建人")
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty(value = "创建日期")
+ private Date createTime;
+ /**更新人*/
+ @ApiModelProperty(value = "更新人")
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty(value = "更新日期")
+ private Date updateTime;
+ /**工程名称*/
+ @ApiModelProperty(value = "工程名称")
+ private String engineeringName;
+ /**场景类型*/
+ @ApiModelProperty(value = "场景类型")
+ private Integer sceneType;
+ /**
+ * 工程存放地址(baseHome/userName)前端显示时,需要拼接工程ID
+ * */
+ @ApiModelProperty(value = "工程存放地址")
+ private String engineeringPath;
+ /**工程选中状态*/
+ @ApiModelProperty(value = "工程选中状态")
+ private int engineeringState;
+ /**备注*/
+ @ApiModelProperty(value = "备注")
+ private String remark;
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/mapper/BizEngineeringMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/mapper/BizEngineeringMapper.java
new file mode 100644
index 00000000..040cab30
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/mapper/BizEngineeringMapper.java
@@ -0,0 +1,16 @@
+package org.jeecg.modules.project.bizEngineering.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+
+/**
+ * @Description: wrf
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+@Mapper
+public interface BizEngineeringMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/IBizEngineeringService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/IBizEngineeringService.java
new file mode 100644
index 00000000..17ed898c
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/IBizEngineeringService.java
@@ -0,0 +1,8 @@
+package org.jeecg.modules.project.bizEngineering.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+
+public interface IBizEngineeringService extends IService {
+ BizEngineering getBizEngineeringByState();
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/impl/BizEngineeringServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/impl/BizEngineeringServiceImpl.java
new file mode 100644
index 00000000..cbad4342
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizEngineering/service/impl/BizEngineeringServiceImpl.java
@@ -0,0 +1,42 @@
+package org.jeecg.modules.project.bizEngineering.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+import org.jeecg.modules.project.bizEngineering.mapper.BizEngineeringMapper;
+import org.jeecg.modules.project.bizEngineering.service.IBizEngineeringService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class BizEngineeringServiceImpl extends ServiceImpl implements IBizEngineeringService {
+
+ @Value("${spring.baseHome}")
+ private String baseHome;
+
+ @Override
+ public BizEngineering getBizEngineeringByState(){
+ LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+ List bizEngineerings = this.baseMapper.selectList(new LambdaQueryWrapper().
+ eq(BizEngineering::getCreateBy,sysUser.getUsername()).
+ orderByDesc(BizEngineering::getCreateTime));
+ if(bizEngineerings == null || bizEngineerings.isEmpty()) {
+ String engPath= String.format("%s%s",baseHome,sysUser.getUsername());
+ BizEngineering bizEngineering = new BizEngineering();
+ bizEngineering.setCreateBy(sysUser.getUsername());
+ bizEngineering.setCreateTime(new Date());
+ bizEngineering.setEngineeringName("系统自动创建工程");
+ bizEngineering.setEngineeringPath(engPath);
+ bizEngineering.setSceneType(0);
+ this.baseMapper.insert(bizEngineering);
+ return bizEngineering;
+ }
+ return bizEngineerings.get(0);
+ }
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/controller/BizOpenfoamController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/controller/BizOpenfoamController.java
new file mode 100644
index 00000000..cf8221c4
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/controller/BizOpenfoamController.java
@@ -0,0 +1,326 @@
+package org.jeecg.modules.project.bizOpenfoam.controller;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.hutool.core.io.FileUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.opencsv.CSVWriter;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.RemoteExecuteCommand;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+import org.jeecg.modules.project.bizEngineering.service.IBizEngineeringService;
+import org.jeecg.modules.project.bizOpenfoam.entity.BizOpenfoam;
+import org.jeecg.modules.project.bizOpenfoam.service.IBizOpenfoamService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.project.bizWrf.entity.BizWrf;
+import org.jeecg.modules.project.bizWrf.mapper.BizWrfMapper;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import ucar.ma2.Array;
+import ucar.ma2.Index;
+import ucar.nc2.Attribute;
+import ucar.nc2.NetcdfFile;
+import ucar.nc2.Variable;
+import ucar.nc2.dataset.NetcdfDataset;
+
+import static java.nio.file.Files.readAllBytes;
+import static java.nio.file.Paths.get;
+
+/**
+ * @Description: openFoam
+ * @Author: jeecg-boot
+ * @Date: 2022-12-20
+ * @Version: V1.0
+ */
+@Api(tags="openFoam")
+@RestController
+@RequestMapping("/bizOpenfoam")
+@Slf4j
+public class BizOpenfoamController extends JeecgController {
+ @Autowired
+ private IBizOpenfoamService bizOpenfoamService;
+ @Autowired
+ private BizWrfMapper bizWrfMapper;
+ @Autowired
+ private IBizEngineeringService bizEngineeringService;
+
+ @Value("${spring.baseHome}")
+ private String baseHome;
+ @Value("${spring.CMAQ.cshTemFielPath}")
+ private String cshTemFielPath;
+ @Value("${spring.Linux.ip}")
+ private String ip;
+ @Value("${spring.Linux.username}")
+ private String username;
+ @Value("${spring.Linux.password}")
+ private String password;
+ @Value("${spring.Linux.port}")
+ private Integer port;
+
+ /**
+ * 分页列表查询
+ *
+ * @param bizOpenfoam
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "openFoam-分页列表查询")
+ @ApiOperation(value="openFoam-分页列表查询", notes="openFoam-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(BizOpenfoam bizOpenfoam,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(bizOpenfoam, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = bizOpenfoamService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param bizOpenfoam
+ * @return
+ */
+ @AutoLog(value = "openFoam-添加")
+ @ApiOperation(value="openFoam-添加", notes="openFoam-添加")
+ //@RequiresPermissions("bizOpenfoam:biz_openfoam:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody BizOpenfoam bizOpenfoam) {
+ bizOpenfoamService.saveOrUpdate(bizOpenfoam);
+ return Result.OK(bizOpenfoam);
+ }
+
+ /**
+ * 编辑
+ *
+ * @param bizOpenfoam
+ * @return
+ */
+ @AutoLog(value = "openFoam-编辑")
+ @ApiOperation(value="openFoam-编辑", notes="openFoam-编辑")
+ //@RequiresPermissions("bizOpenfoam:biz_openfoam:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody BizOpenfoam bizOpenfoam) {
+ bizOpenfoamService.updateById(bizOpenfoam);
+ return Result.OK("编辑成功!");
+ }
+
+
+ /**
+ * 查询openfoam参数
+ *
+ * @return
+ */
+ //@AutoLog(value = "wrf-查询openfoam参数")
+ @ApiOperation(value="wrf-查询openfoam参数", notes="wrf-查询openfoam参数")
+ @GetMapping(value = "/getOpenFoamParam")
+ public Result getOpenFoamParam(String engineeringId) {
+ BizOpenfoam bizOpenfoam = bizOpenfoamService.getOne(new LambdaQueryWrapper().eq(BizOpenfoam::getEngineeringId,engineeringId));
+ if(bizOpenfoam == null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(bizOpenfoam);
+ }
+
+ /**
+ * 运行
+ *
+ * @return
+ */
+ @GetMapping(value = "/runOpenFoamByUserId")
+ public String runOpenFoam(String engineeringId) throws IOException {
+ BizOpenfoam openfoam = bizOpenfoamService.getOne(new LambdaQueryWrapper().eq(BizOpenfoam::getEngineeringId,engineeringId));
+ String openFoamPath = baseHome + "OpenFOAM/openfoam-8/run/" + openfoam.getCreateBy() + "/" + engineeringId;
+ String runCmd = String.format("cd %s;%s;",openFoamPath,openfoam.getFoam());
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, runCmd);
+ return "运行成功";
+ }
+
+ public double[][][] resolveOpenFoamResult(int startLine,int x,int y,int z,String openFoamPath,String param) throws IOException {
+ String stepFileName = bizOpenfoamService.getStepFileName(openFoamPath);
+ if(StringUtils.isBlank(param)){
+ param = "c1";
+ }
+ Path p = Paths.get( openFoamPath + "/" + stepFileName + "/" + param);
+ List lines = Files.readAllLines(p);
+ double[][][] result = new double[x][y][z];
+ if(lines != null && !lines.isEmpty()) {
+ try {
+ for(int k=0;k().eq(BizWrf::getEngineeringId,engineeringId));
+
+ String openFoamPath = baseHome + "OpenFOAM/openfoam-8/run/" + wrf.getCreateBy() + "/" + engineeringId;
+// String openFoamPath = "C:\\Users\\13673\\Desktop\\Nuclear\\file\\openfoam\\bak\\cylinder_U";
+ String systemPath = openFoamPath + "/system/";
+
+ String [] hexArray = null;
+ List blockMeshDictFileInfos = Files.readAllLines(Paths.get(systemPath + "blockMeshDict"));
+ for (String info : blockMeshDictFileInfos) {
+ if(info.indexOf("hex") > 0){
+ int index1 = info.indexOf("(");
+ int index2 = info.indexOf("(", index1 + 1);
+ int index3 = info.indexOf(")", index2 + 1);
+ hexArray = info.substring(index2+1, index3).split(" ");
+ }
+ }
+
+ int xSize = Integer.valueOf(hexArray[0]);
+ int ySize = Integer.valueOf(hexArray[1]);
+ int zSize = Integer.valueOf(hexArray[2]);
+
+ int resampleIndex = 3;
+ double[][][] smallRes = new double[2*(xSize/resampleIndex)][ySize/resampleIndex][2*(zSize/resampleIndex)];
+
+ double[][][] res1 = resolveOpenFoamResult(22,xSize,ySize,zSize,openFoamPath,param);
+ double[][][] res2 = resolveOpenFoamResult(22 + xSize*ySize*zSize,xSize,ySize,zSize,openFoamPath,param);
+ double[][][] res3 = resolveOpenFoamResult(22 + 2*xSize*ySize*zSize,xSize,ySize,zSize,openFoamPath,param);
+ double[][][] res4 = resolveOpenFoamResult(22 + 3*xSize*ySize*zSize,xSize,ySize,zSize,openFoamPath,param);
+ for(int i=resampleIndex-2;i controlDicts = Files.readAllLines(controlDictPath);
+ List result = new ArrayList<>();
+ for (String controlDict : controlDicts) {
+ if(controlDict.indexOf("application ") > 0){
+ controlDict = "application "+bizOpenfoam.getApplication()+";";
+ }
+ if(controlDict.indexOf("startTime ") > 0){
+ controlDict = "startTime "+bizOpenfoam.getStartTime()+";";
+ }
+ if(controlDict.indexOf("endTime ") > 0){
+ controlDict = "endTime "+bizOpenfoam.getEndTime()+";";
+ }
+ if(controlDict.indexOf("deltaT ") > 0){
+ controlDict = "deltaT "+bizOpenfoam.getDeltat()+";";
+ }
+ if(controlDict.indexOf("writeInterval ") > 0){
+ controlDict = "writeInterval "+bizOpenfoam.getWriteinterval()+";";
+ }
+ result.add(controlDict);
+ }
+ FileOutputStream fileOutputStream = new FileOutputStream(controlDictFilePath);
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
+ for (String res : result) {
+ bw.write(res);
+ bw.newLine();
+ }
+ bw.flush();
+ bw.close();
+ fileOutputStream.flush();
+ fileOutputStream.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return "添加成功!";
+ }
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/entity/BizOpenfoam.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/entity/BizOpenfoam.java
new file mode 100644
index 00000000..f0a3541a
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/entity/BizOpenfoam.java
@@ -0,0 +1,102 @@
+package org.jeecg.modules.project.bizOpenfoam.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: openFoam
+ * @Author: jeecg-boot
+ * @Date: 2022-12-20
+ * @Version: V1.0
+ */
+@Data
+@TableName("biz_openfoam")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="biz_openfoam对象", description="openFoam")
+public class BizOpenfoam implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @ApiModelProperty(value = "主键")
+ private String id;
+ /**创建人*/
+ @ApiModelProperty(value = "创建人")
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty(value = "创建日期")
+ private Date createTime;
+ /**更新人*/
+ @ApiModelProperty(value = "更新人")
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty(value = "更新日期")
+ private Date updateTime;
+ /**foamclass*/
+ @Excel(name = "foamclass", width = 15)
+ @ApiModelProperty(value = "foamclass")
+ private String foamclass;
+ /**foam*/
+ @Excel(name = "foam", width = 15)
+ @ApiModelProperty(value = "foam")
+ private String foam;
+ /**application*/
+ @Excel(name = "application", width = 15)
+ @ApiModelProperty(value = "application")
+ private String application;
+ /**start_time*/
+ @Excel(name = "start_time", width = 15)
+ @ApiModelProperty(value = "start_time")
+ private String startTime;
+ /**end_time*/
+ @Excel(name = "end_time", width = 15)
+ @ApiModelProperty(value = "end_time")
+ private String endTime;
+ /**deltat*/
+ @Excel(name = "deltat", width = 15)
+ @ApiModelProperty(value = "deltat")
+ private String deltat;
+ /**writeInterval*/
+ @Excel(name = "writeInterval", width = 15)
+ @ApiModelProperty(value = "writeInterval")
+ private String writeinterval;
+ /**layer*/
+ @Excel(name = "layer", width = 15)
+ @ApiModelProperty(value = "layer")
+ private Integer layer;
+ /**lat*/
+ @Excel(name = "lat", width = 15)
+ @ApiModelProperty(value = "lat")
+ private String lat;
+ /**lon*/
+ @Excel(name = "lon", width = 15)
+ @ApiModelProperty(value = "lon")
+ private String lon;
+ /**equivalent*/
+ @Excel(name = "equivalent", width = 15)
+ @ApiModelProperty(value = "equivalent")
+ private String equivalent;
+ @Excel(name = "engineeringId", width = 15)
+ @ApiModelProperty(value = "engineeringId")
+ private String engineeringId;
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/BizOpenfoamMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/BizOpenfoamMapper.java
new file mode 100644
index 00000000..18cadb03
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/BizOpenfoamMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.project.bizOpenfoam.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.project.bizOpenfoam.entity.BizOpenfoam;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: openFoam
+ * @Author: jeecg-boot
+ * @Date: 2022-12-20
+ * @Version: V1.0
+ */
+public interface BizOpenfoamMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/xml/BizOpenfoamMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/xml/BizOpenfoamMapper.xml
new file mode 100644
index 00000000..b2a285ec
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/mapper/xml/BizOpenfoamMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/IBizOpenfoamService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/IBizOpenfoamService.java
new file mode 100644
index 00000000..8e3fe3a3
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/IBizOpenfoamService.java
@@ -0,0 +1,20 @@
+package org.jeecg.modules.project.bizOpenfoam.service;
+
+import org.jeecg.modules.project.bizOpenfoam.entity.BizOpenfoam;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.project.bizWrf.entity.BizWrf;
+
+import java.util.List;
+
+/**
+ * @Description: openFoam
+ * @Author: jeecg-boot
+ * @Date: 2022-12-20
+ * @Version: V1.0
+ */
+public interface IBizOpenfoamService extends IService {
+
+ List getCoAndPecInfo(BizWrf wrf);
+ String getStepFileName(String systemPath);
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/impl/BizOpenfoamServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/impl/BizOpenfoamServiceImpl.java
new file mode 100644
index 00000000..60562d02
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizOpenfoam/service/impl/BizOpenfoamServiceImpl.java
@@ -0,0 +1,141 @@
+package org.jeecg.modules.project.bizOpenfoam.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.modules.project.bizOpenfoam.entity.BizOpenfoam;
+import org.jeecg.modules.project.bizOpenfoam.mapper.BizOpenfoamMapper;
+import org.jeecg.modules.project.bizOpenfoam.service.IBizOpenfoamService;
+import org.jeecg.modules.project.bizWrf.entity.BizWrf;
+import org.jeecg.modules.project.bizWrf.mapper.BizWrfMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description: openFoam
+ * @Author: jeecg-boot
+ * @Date: 2022-12-20
+ * @Version: V1.0
+ */
+@Service
+public class BizOpenfoamServiceImpl extends ServiceImpl implements IBizOpenfoamService {
+
+ @Value("${spring.baseHome}")
+ private String baseHome;
+
+ @Override
+ public List getCoAndPecInfo(BizWrf wrf) {
+ String openFoamPath = baseHome + "OpenFOAM/openfoam-8/run/" + wrf.getEngineeringId();
+
+ String stepFileName = getStepFileName(openFoamPath);
+ try {
+ String [] hexArray = null;
+ List blockMeshDictFileInfos = Files.readAllLines(Paths.get(openFoamPath + "/system/" + "blockMeshDict"));
+ for (String info : blockMeshDictFileInfos) {
+ if(info.indexOf("hex") > 0){
+ int index1 = info.indexOf("(");
+ int index2 = info.indexOf("(", index1 + 1);
+ int index3 = info.indexOf(")", index2 + 1);
+ hexArray = info.substring(index2+1, index3).split(" ");
+ }
+ }
+ int count = Integer.valueOf(hexArray[0]) * Integer.valueOf(hexArray[1]) * Integer.valueOf(hexArray[2]) * 4;
+ List c1Lines = Files.readAllLines(Paths.get(openFoamPath + "/" + stepFileName + "/c1"));
+ List c2Lines = Files.readAllLines(Paths.get(openFoamPath + "/" + stepFileName + "/c2"));
+ List c1Values = new ArrayList<>();
+ List c2Values = new ArrayList<>();
+ for (int i = 22; i < count; i++) {
+ c1Values.add(Double.valueOf(c1Lines.get(i)));
+ c2Values.add(Double.valueOf(c2Lines.get(i)));
+ }
+ List result = new ArrayList<>();
+ result.add(c1Values.stream().mapToDouble( Double :: valueOf ).average().getAsDouble()+"");
+ result.add(c2Values.stream().mapToDouble( Double :: valueOf ).average().getAsDouble()+"");
+ return result;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ public String getStepFileName(String systemPath){
+ List folderNames = getFolderNames(systemPath);
+ List stepFileNames = new ArrayList<>();
+ for (String folderName : folderNames) {
+ if(isNumeric(folderName)){
+ stepFileNames.add(Double.valueOf(folderName));
+ }
+ }
+ Collections.reverse(stepFileNames);
+ String stepFileName = stepFileNames.get(0) + "";
+ File file = new File( systemPath + "/" + stepFileName);
+ if (!file.exists()) {
+ stepFileName = stepFileName.substring(0,stepFileName.length() - 2);
+ }
+ return stepFileName;
+ }
+
+ /**
+ * 判断字符串是不是double型
+ * @param str
+ * @return
+ */
+ public static boolean isNumeric(String str){
+ Pattern pattern = Pattern.compile("[0-9]+[.]{0,1}[0-9]*[dD]{0,1}");
+ Matcher isNum = pattern.matcher(str);
+ if( !isNum.matches() ){
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * 得到文件名称
+ *
+ * @param path 路径
+ * @return {@link List}<{@link String}>
+ */
+ private List getFolderNames(String path) {
+ List folderNames = new ArrayList<>();
+ File folder = new File(path);
+ File[] listOfFiles = folder.listFiles();
+
+ for (File file : listOfFiles) {
+ if (file.isDirectory()) {
+ folderNames.add(file.getName());
+ }
+ }
+ return folderNames;
+ }
+
+ /**
+ * 得到文件名称
+ *
+ * @param file 文件
+ * @param fileNames 文件名
+ * @return {@link List}<{@link String}>
+ */
+ private List getFileNames(File file, List fileNames) {
+ File[] files = file.listFiles();
+ for (File f : files) {
+ if (f.isDirectory()) {
+ getFileNames(f, fileNames);
+ } else {
+ fileNames.add(f.getName());
+ }
+ }
+ return fileNames;
+ }
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/controller/BizUpdateFileController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/controller/BizUpdateFileController.java
new file mode 100644
index 00000000..8c66d99c
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/controller/BizUpdateFileController.java
@@ -0,0 +1,174 @@
+package org.jeecg.modules.project.bizUploadFile.controller;
+
+import cn.hutool.core.io.FileUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.project.bizUploadFile.entity.BizUploadFile;
+import org.jeecg.modules.project.bizUploadFile.service.BizUploadFileService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: BizUpload
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+@Api(tags="BizUpload")
+@RestController
+@RequestMapping("/bizUploadFile")
+@Slf4j
+public class BizUpdateFileController extends JeecgController {
+
+ @Autowired
+ private BizUploadFileService bizUploadFileService;
+
+ @Value("${spring.WRF.wpsLocalPrefix}")
+ private String wpsLocalPrefix;
+
+ @PostMapping(value = "/uploadFile")
+ public boolean uploadFile(@RequestParam String relevanceId, @RequestParam Integer type, @RequestParam List files) {
+ LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+ try{
+// String localFilePrefix = wpsLocalPrefix + loginUser.getUsername() + "/" + relevanceId + "/";
+ String localFilePrefix = "D:\\upload\\" + loginUser.getUsername() + "/" + relevanceId + "/";
+ if (!FileUtil.exist(localFilePrefix)) {
+ FileUtil.mkdir(localFilePrefix);
+ }
+ bizUploadFileService.save(relevanceId,loginUser.getUsername(),type, files);
+ }catch (Exception e){
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ @PostMapping(value = "/downloadFile")
+ public boolean downloadFile(@RequestParam String relevanceId,@RequestParam Integer type) {
+ List bizUploadFiles = bizUploadFileService.list(new LambdaQueryWrapper().
+ eq(BizUploadFile::getRelevanceId, relevanceId).eq(BizUploadFile::getType, type));
+ try{
+
+ }catch (Exception e){
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * 下载并保存文件
+ *
+ * @return {@code String}
+ *//*
+ public String downloadAndSaveFile(@RequestParam String relevanceId,@RequestParam Integer type) {
+ try {
+ List bizUploadFiles = bizUploadFileService.list(new LambdaQueryWrapper().
+ eq(BizUploadFile::getRelevanceId, relevanceId).eq(BizUploadFile::getType, type));
+ if(bizUploadFiles == null || bizUploadFiles.isEmpty()){
+ return
+ }
+ URL fileUrl = new URL(bizUploadFiles);
+ HttpURLConnection connection = (HttpURLConnection) fileUrl.openConnection();
+ connection.setRequestMethod("GET");
+
+ String fileName = generateFileNameWithTimestamp(originalFileName);
+ String savePath = generateSavePath(fileName);
+
+ try (InputStream inputStream = connection.getInputStream();
+ BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(savePath))) {
+
+ byte[] buffer = new byte[4096];
+ int bytesRead;
+
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+
+ return convertToReturnPath(savePath);
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ log.error("Error: " + e.getMessage());
+ return null;
+ }
+ }
+
+ *//**
+ * 生成文件名字和时间戳
+ *
+ * @param originalFileName 原始文件名字
+ * @return {@code String}
+ *//*
+ private String generateFileNameWithTimestamp(String originalFileName) {
+ String timestamp = getCurrentTimestamp();
+ int dotIndex = originalFileName.lastIndexOf(".");
+ String extension = "";
+ if (dotIndex != -1) {
+ extension = originalFileName.substring(dotIndex);
+ originalFileName = originalFileName.substring(0, dotIndex);
+ }
+ return originalFileName + "_" + timestamp + extension;
+ }
+
+ *//**
+ * 生成保存路径
+ *
+ * @param fileName 文件名称
+ * @return {@code String}
+ *//*
+ private String generateSavePath(String fileName) {
+ Date currentDate = new Date();
+ SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
+ SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
+ SimpleDateFormat dayFormat = new SimpleDateFormat("dd");
+
+ String year = yearFormat.format(currentDate);
+ String month = monthFormat.format(currentDate);
+ String day = dayFormat.format(currentDate);
+
+ String filePath = defaultBaseDir + "/upload/" + year + "/" + month + "/" + day + "/";
+ return filePath + fileName;
+ }
+
+ *//**
+ * 转换返回路径
+ *
+ * @param filePath 文件路径
+ * @return {@code String}
+ *//*
+ private String convertToReturnPath(String filePath) {
+ String relativePath = filePath.replace(defaultBaseDir, "/profile");
+ return relativePath.replace("\\", "/");
+ }
+
+ *//**
+ * 获得当前时间戳
+ *
+ * @return {@code String}
+ *//*
+ public String getCurrentTimestamp() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+ Date currentDate = new Date();
+ return dateFormat.format(currentDate);
+ }*/
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/entity/BizUploadFile.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/entity/BizUploadFile.java
new file mode 100644
index 00000000..f7846f22
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/entity/BizUploadFile.java
@@ -0,0 +1,59 @@
+package org.jeecg.modules.project.bizUploadFile.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class BizUploadFile implements Serializable {
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ private String id;
+ /**主表id*/
+ private String relevanceId;
+ /**文件名称*/
+ private String fileName;
+ /**文件路径*/
+ private String filePath;
+ /**文件全路径*/
+ private String fileFullPath;
+ private Integer type;
+ /**文件大小*/
+ private long fileSize;
+
+ @TableField(exist = false)
+ @JSONField(serialize = false)
+ private List files;
+
+ /**创建人*/
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+ /**更新人*/
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ @TableField(exist = false)
+ private String userName;
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/mapper/BizUploadFileMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/mapper/BizUploadFileMapper.java
new file mode 100644
index 00000000..427d2e05
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/mapper/BizUploadFileMapper.java
@@ -0,0 +1,7 @@
+package org.jeecg.modules.project.bizUploadFile.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.project.bizUploadFile.entity.BizUploadFile;
+
+public interface BizUploadFileMapper extends BaseMapper {
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/BizUploadFileService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/BizUploadFileService.java
new file mode 100644
index 00000000..e77ccbc4
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/BizUploadFileService.java
@@ -0,0 +1,13 @@
+package org.jeecg.modules.project.bizUploadFile.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.project.bizUploadFile.entity.BizUploadFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+public interface BizUploadFileService extends IService {
+
+ void save(String trainingId,String userName, Integer type, List fileList);
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/impl/BizUploadFileServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/impl/BizUploadFileServiceImpl.java
new file mode 100644
index 00000000..dbb8132a
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizUploadFile/service/impl/BizUploadFileServiceImpl.java
@@ -0,0 +1,83 @@
+package org.jeecg.modules.project.bizUploadFile.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.io.IOUtils;
+import org.jeecg.modules.project.bizUploadFile.entity.BizUploadFile;
+import org.jeecg.modules.project.bizUploadFile.mapper.BizUploadFileMapper;
+import org.jeecg.modules.project.bizUploadFile.service.BizUploadFileService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class BizUploadFileServiceImpl extends ServiceImpl implements BizUploadFileService {
+
+ @Value("${spring.WRF.wpsLocalPrefix}")
+ private String wpsLocalPrefix;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(String relevanceId,String userName, Integer type, List fileList) {
+ try {
+ for (MultipartFile file : fileList) {
+ BizUploadFile bizUploadFile = new BizUploadFile();
+ bizUploadFile.setRelevanceId(relevanceId);
+ bizUploadFile.setCreateTime(new Date());
+ String filename = file.getOriginalFilename();
+ bizUploadFile.setFileName(filename);
+ bizUploadFile.setFileSize(file.getSize());
+ bizUploadFile.setType(type);
+ // 文件地址
+ String dbDir = userName + "/" + relevanceId;
+ bizUploadFile.setFilePath(dbDir);
+ // 全路径
+ String descDir = "";
+ wpsLocalPrefix = "D:\\upload\\";
+ if(type == 1){
+ descDir = wpsLocalPrefix + userName + "/" + relevanceId;
+ }else if (type == 1){
+ descDir = wpsLocalPrefix + userName + "/" + relevanceId;
+ }else{
+ descDir = wpsLocalPrefix + userName + "/" + relevanceId;
+ }
+ bizUploadFile.setFileFullPath(descDir);
+ //删除之前导入的相同类型数据
+ this.getBaseMapper().delete(new LambdaQueryWrapper().
+ eq(BizUploadFile::getRelevanceId,relevanceId).
+ eq(BizUploadFile::getType,type).
+ eq(BizUploadFile::getFileName,filename));
+ // 插入数据
+ this.getBaseMapper().insert(bizUploadFile);
+ // 生成本地文件
+ saveFile(descDir, filename, file.getInputStream());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void saveFile(String descDir, String filename, InputStream inputStream) throws Exception {
+ // 文件夹
+ File folder = new File(descDir);
+ if (!folder.exists()) {
+ folder.mkdirs();
+ }
+ // 文件地址
+ String filePath = descDir + "//" + filename;
+ File newFile = new File(filePath);
+
+ OutputStream os = new BufferedOutputStream(new FileOutputStream(newFile));
+ // 复制文件数据
+ IOUtils.copy(inputStream, os);
+ os.close();
+ inputStream.close();
+ }
+
+}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/controller/BizWrfController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/controller/BizWrfController.java
new file mode 100644
index 00000000..00f33dd6
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/project/bizWrf/controller/BizWrfController.java
@@ -0,0 +1,774 @@
+package org.jeecg.modules.project.bizWrf.controller;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jcraft.jsch.SftpException;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.RemoteExecuteCommand;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.project.bizEngineering.entity.BizEngineering;
+import org.jeecg.modules.project.bizEngineering.service.IBizEngineeringService;
+import org.jeecg.modules.project.bizOpenfoam.entity.BizOpenfoam;
+import org.jeecg.modules.project.bizOpenfoam.service.IBizOpenfoamService;
+import org.jeecg.modules.project.bizWrf.entity.BizWrf;
+import org.jeecg.modules.project.bizWrf.service.IBizWrfService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.project.util.CmdUtil;
+import org.jeecg.modules.project.util.SFTPUtil;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import ucar.ma2.Array;
+import ucar.ma2.Index;
+import ucar.nc2.NetcdfFile;
+import ucar.nc2.ProxyReader;
+import ucar.nc2.Variable;
+import ucar.nc2.dataset.NetcdfDataset;
+
+import static java.nio.file.Files.readAllBytes;
+import static java.nio.file.Paths.get;
+
+/**
+ * @Description: wrf
+ * @Author: jeecg-boot
+ * @Date: 2022-12-19
+ * @Version: V1.0
+ */
+@Api(tags="wrf")
+@RestController
+@RequestMapping("/bizWrf")
+@Slf4j
+public class BizWrfController extends JeecgController {
+ @Autowired
+ private IBizWrfService bizWrfService;
+ @Autowired
+ private IBizOpenfoamService bizOpenfoamService;
+
+ @Autowired
+ private IBizEngineeringService bizEngineeringService;
+
+ @Value("${spring.baseHome}")
+ private String baseHome;
+ @Value("${spring.WRF.wpsLocalPrefix}")
+ private String wpsLocalPrefix;
+ @Value("${spring.WRF.wrfLocalPrefix}")
+ private String wrfLocalPrefix;
+ @Value("${spring.CMAQ.cshTemFielPath}")
+ private String cshTemFielPath;
+ @Value("${spring.WRF.geog_data_path}")
+ private String geog_data_path;
+ @Value("${spring.WRF.fnldataPath}")
+ private String fnldataPath;
+ @Value("${spring.Linux.ip}")
+ private String ip;
+ @Value("${spring.Linux.username}")
+ private String username;
+ @Value("${spring.Linux.password}")
+ private String password;
+ @Value("${spring.Linux.port}")
+ private Integer port;
+
+
+
+// private String wpsPrefix = "C:\\Users\\13673\\Desktop\\Nuclear\\file\\";
+// private String wrfPrefix = "C:\\Users\\13673\\Desktop\\Nuclear\\file\\";
+ /**
+ * 分页列表查询
+ *
+ * @param bizWrf
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "wrf-分页列表查询")
+ @ApiOperation(value="wrf-分页列表查询", notes="wrf-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(BizWrf bizWrf,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(bizWrf, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = bizWrfService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param bizWrf
+ * @return
+ */
+ @AutoLog(value = "wrf-添加")
+ @ApiOperation(value="wrf-添加", notes="wrf-添加")
+ //@RequiresPermissions("bizWrf:biz_wrf:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody BizWrf bizWrf) {
+ bizWrf.setTimeStamp(new Date().getTime()+"");
+ // bizWrf.setTimeStamp("1673629673050");
+ bizWrf.setDy(bizWrf.getDx());
+
+// 1纬度=111.1949km
+// SN方向网格数为 纬度差*111.1949/dx(米)
+// WE方向网格数为 111.1949*cos(中心纬度)*经度差/dx
+
+ Double latM = 111194.9;
+ Double sn = Math.abs(Double.valueOf(bizWrf.getLat1()) - Double.valueOf(bizWrf.getLat2())) * latM / Double.valueOf(bizWrf.getDx());
+ bizWrf.setSn(String.format("%.0f",Math.ceil(sn)));
+ Double we = latM * Math.cos(Math.toRadians(Double.valueOf(bizWrf.getRefLat()))) * Math.abs(Double.valueOf(bizWrf.getLon1()) - Double.valueOf(bizWrf.getLon2())) / Double.valueOf(bizWrf.getDx());
+ bizWrf.setWe(String.format("%.0f",(Math.ceil(we))));
+
+
+ bizWrfService.saveOrUpdate(bizWrf);
+ String newAllRunPath = String.format("%s%s/%s/", baseHome, bizWrf.getCreateBy(),bizWrf.getEngineeringId());
+ File file = new File(newAllRunPath);
+ if (!file.exists()) {
+ file.mkdir();
+ }
+ String runCmd = String.format("cp -r %sAll_Run %s", baseHome, newAllRunPath + bizWrf.getTimeStamp());
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, runCmd);
+ saveWpsFile(bizWrf);
+ saveInputFile(bizWrf);
+ return Result.OK("添加成功!");
+ }
+
+ public void saveWpsFile(BizWrf bizWrf){
+ String allRunPath = baseHome + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/" + bizWrf.getTimeStamp() + "/";
+ String localFilePrefix = wpsLocalPrefix + "/" + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/";
+ String fileName = "namelist.wps";
+ try {
+ String startStr = "";
+ String endStr = "";
+ if (ObjectUtil.isNotEmpty(bizWrf.getMaxDom())){
+ Integer max = bizWrf.getMaxDom();
+ for (int i = 0; i < max; i++) {
+ startStr += String.format("'%s',",bizWrf.getStartTime());
+ endStr += String.format("'%s',",bizWrf.getEndTime());
+ }
+ }else {
+ startStr = String.format("'%s',",bizWrf.getStartData());
+ endStr = String.format("'%s',",bizWrf.getEndData());
+ }
+ String data = new String(readAllBytes(get(cshTemFielPath + "namelistTem.wps")));
+ data = data.replace("#{wrf_core}", bizWrf.getWrfCore())
+ .replace("#{max_dom}", bizWrf.getMaxDom()+"")
+ .replace("#{start_date}", startStr)
+ .replace("#{end_date}", endStr)
+ .replace("#{parent_grid_ratio}", bizWrf.getParentGridRatio())
+ .replace("#{i_parent_start}", bizWrf.getParentStartI())
+ .replace("#{j_parent_start}", bizWrf.getParentStartJ())
+ .replace("#{e_we}", bizWrf.getWe())
+ .replace("#{e_sn}", bizWrf.getSn())
+ .replace("#{geog_data_res}", bizWrf.getGeogDataRes())
+ .replace("#{dx}", bizWrf.getDx())
+ .replace("#{dy}", bizWrf.getDy())
+ .replace("#{map_proj}", bizWrf.getMapProj())
+ .replace("#{ref_lat}", bizWrf.getRefLat())
+ .replace("#{ref_lon}", bizWrf.getRefLon())
+ .replace("#{truelat1}", bizWrf.getTruelat1())
+ .replace("#{truelat2}", bizWrf.getTruelat2())
+ .replace("#{stand_lon}", bizWrf.getStandLon())
+ .replace("#{geog_data_path}", geog_data_path)
+ .replace("#{opt_output_from_metgrid_path}",allRunPath+"WRF/run");
+ // todo sftp 上传
+ FileUtil.writeString(data, localFilePrefix + fileName, "UTF-8");
+ sftpUpload(localFilePrefix + fileName, allRunPath + "WPS", fileName);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void saveInputFile(BizWrf bizWrf){
+ String allRunPath = baseHome + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/" + bizWrf.getTimeStamp() + "/";
+ String localFilePrefix = wpsLocalPrefix + "/" + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/";
+ try {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
+ Calendar startCal = Calendar.getInstance();
+ startCal.setTime(sdf.parse(bizWrf.getStartTime()));
+ Calendar endCal = Calendar.getInstance();
+ endCal.setTime(sdf.parse(bizWrf.getEndTime()));
+
+ String startYear = "";
+ String startMonth = "";
+ String startDay = "";
+ String startHour = "";
+ String endYear = "";
+ String endMonth = "";
+ String endDay = "";
+ String endHour = "";
+ String inputFromFile = "";
+ String historyInterval = "";
+ String framesPerOutfile = "";
+ if (ObjectUtil.isNotEmpty(bizWrf.getMaxDom())){
+ Integer max = bizWrf.getMaxDom();
+ for (int i = 0; i < max; i++) {
+ startYear += String.format("%s,",startCal.get(Calendar.YEAR));
+ startMonth += String.format("%s,",String.format("%0" + 2 + "d", startCal.get(Calendar.MONTH)+1));
+ startDay += String.format("%s,",String.format("%0" + 2 + "d", startCal.get(Calendar.DATE)));
+ startHour += String.format("%s,",String.format("%0" + 2 + "d", startCal.get(Calendar.HOUR_OF_DAY)));
+ endYear += String.format("%s,",startCal.get(Calendar.YEAR));
+ endMonth += String.format("%s,",String.format("%0" + 2 + "d", endCal.get(Calendar.MONTH)+1));
+ endDay += String.format("%s,",String.format("%0" + 2 + "d", endCal.get(Calendar.DATE)));
+ endHour += String.format("%s,",String.format("%0" + 2 + "d", endCal.get(Calendar.HOUR_OF_DAY)));
+ inputFromFile += ".true.,";
+ historyInterval += "60,";
+ framesPerOutfile += "24,";
+ }
+ }else {
+ startYear = String.format("%s,",startCal.get(Calendar.YEAR));
+ startMonth = String.format("%s,",String.format("%0" + 2 + "d", startCal.get(Calendar.MONTH)+1));
+ startDay = String.format("%s,",String.format("%0" + 2 + "d", startCal.get(Calendar.DATE)));
+ startHour = String.format("%s,",String.format("%0" + 2 + "d", startCal.get(Calendar.HOUR_OF_DAY)));
+ endYear = String.format("%s,",startCal.get(Calendar.YEAR));
+ endMonth = String.format("%s,",String.format("%0" + 2 + "d", endCal.get(Calendar.MONTH)+1));
+ endDay = String.format("%s,",String.format("%0" + 2 + "d", endCal.get(Calendar.DATE)));
+ endHour = String.format("%s,",String.format("%0" + 2 + "d", endCal.get(Calendar.HOUR_OF_DAY)));
+ inputFromFile += ".true.,";
+ historyInterval += "60,";
+ framesPerOutfile += "24,";
+ }
+
+ String fileName = "namelist.input";
+ String data = new String(readAllBytes(get(cshTemFielPath + "namelistTem.input")));
+ data = data.replace("#{run_days}", bizWrf.getRunDays())
+ .replace("#{run_hours}", bizWrf.getRunHours())
+ .replace("#{run_minutes}", bizWrf.getRunMinutes())
+ .replace("#{run_seconds}", bizWrf.getRunSeconds())
+ .replace("#{start_year}", startYear)
+ .replace("#{start_month}", startMonth)
+ .replace("#{start_day}", startDay)
+ .replace("#{start_hour}", startHour)
+ .replace("#{end_year}", endYear)
+ .replace("#{end_month}", endMonth)
+ .replace("#{end_day}", endDay)
+ .replace("#{end_hour}", endHour)
+ .replace("#{input_from_file}", inputFromFile)
+ .replace("#{history_interval}", historyInterval)
+ .replace("#{frames_per_outfile}", framesPerOutfile)
+ .replace("#{time_step}", bizWrf.getTimeStep())
+ .replace("#{max_dom}", bizWrf.getMaxDom()+"")
+ .replace("#{e_we}", bizWrf.getWe())
+ .replace("#{e_sn}", bizWrf.getSn())
+ .replace("#{e_vert}", bizWrf.getVert())
+ .replace("#{dx}", bizWrf.getDx())
+ .replace("#{dy}", bizWrf.getDy())
+ .replace("#{i_parent_start}", bizWrf.getParentStartI())
+ .replace("#{j_parent_start}", bizWrf.getParentStartJ())
+ .replace("#{parent_grid_ratio}", bizWrf.getParentGridRatio());
+ // todo sftp 上传
+ FileUtil.writeString(data, localFilePrefix + fileName, "UTF-8");
+ sftpUpload(localFilePrefix + fileName, allRunPath + "WRF/run", fileName);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ } catch (SftpException e) {
+ e.printStackTrace();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 运行WPS
+ *
+ * @return
+ */
+ @GetMapping(value = "/runWps")
+ public Result runWps(String timeStamp) throws IOException {
+ String engineeringId = bizEngineeringService.getBizEngineeringByState().getId();
+ BizWrf bizWrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,engineeringId));
+ String allRunPath = baseHome + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/" + bizWrf.getTimeStamp() + "/";
+ String localFilePrefix = wpsLocalPrefix + "/" + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/";
+
+ String format = "yyyy-MM-dd_hh:mm:ss";
+ String ymdFormat = "yyyy-MM-dd";
+ DateTime startTime = DateUtil.parse(bizWrf.getStartTime(), format);
+ DateTime endTime = DateUtil.parse(bizWrf.getEndTime(), format);
+ long startTimeSecs = startTime.getTime();
+ long endTimeSecs = endTime.getTime();
+ long oneDaySecs = 60 * 60 * 24 * 1000;
+ StringBuffer runLinkGrib = new StringBuffer();
+ for (long tmpSecs = startTimeSecs; tmpSecs <= endTimeSecs; tmpSecs += oneDaySecs) {
+ runLinkGrib.append(fnldataPath).append("fnl_").append(DateUtil.format(new Date(tmpSecs), ymdFormat).replace("-","")).append("* ");
+ }
+
+ String cdWPS = "cd " + allRunPath + "WPS;";
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, cdWPS + "./geogrid.exe");
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, cdWPS + "./link_grib.csh " + runLinkGrib + ";cp ungrib/Variable_Tables/Vtable.GFS Vtable");
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, cdWPS + "./ungrib.exe");
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, cdWPS + "./metgrid.exe");
+ SFTPUtil sftpUtil = new SFTPUtil();
+ sftpUtil.login(username, password,ip,port);
+ sftpUtil.download(allRunPath + "WPS","metgrid.log",localFilePrefix + "metgrid.log");
+ sftpUtil.logout();
+ String metgridLog = new String(readAllBytes(get(localFilePrefix + "metgrid.log")));
+ if(metgridLog.indexOf("Successful completion of program metgrid.exe") > 0){
+ return Result.OK(metgridLog);
+ }
+ return Result.error(metgridLog);
+ }
+
+ /**
+ * 运行
+ *
+ * @return
+ */
+ @GetMapping(value = "/runWrf")
+ public Result runWrf(String timeStamp) throws IOException {
+ String engineeringId = bizEngineeringService.getBizEngineeringByState().getId();
+ BizWrf bizWrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,engineeringId));
+ String allRunPath = baseHome + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/" + bizWrf.getTimeStamp() + "/";
+ String localFilePrefix = wpsLocalPrefix + "/" + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/";
+
+ String cdWRF = "cd " + allRunPath + "WRF/run;";
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, cdWRF + "ulimit -s unlimited;./real.exe >&real.log");
+ RemoteExecuteCommand.runRemoteLinuxCmd(ip, username, password, cdWRF + "ulimit -s unlimited;./wrf.exe >&wrf.log");
+
+ SFTPUtil sftpUtil = new SFTPUtil();
+ sftpUtil.login(username, password,ip,port);
+ sftpUtil.download(allRunPath + "WRF/run","wrf.log",localFilePrefix + "wrf.log");
+ String wrfLog = new String(readAllBytes(get(localFilePrefix + "wrf.log")));
+// sftpUtil.download(allRunPath + "WRF/run","rsl.out.0000",localFilePrefix + "rsl.out.0000");
+// String wrfLog = new String(readAllBytes(get(localFilePrefix + "rsl.out.0000")));
+ if(wrfLog.indexOf("SUCCESS COMPLETE WRF") > 0){
+ String format = "yyyy-MM-dd_HH:mm:ss";
+ DateTime startTime = DateUtil.parse(bizWrf.getStartTime(), format);
+ long oneDaySecs = 60 * 60 * 24 * 1000;
+ String newStartTime = DateUtil.format(new Date(startTime.getTime() + oneDaySecs), format);
+ String ncNameWrf = "wrfout_d01_" + newStartTime;
+ sftpUtil.download(allRunPath + "WRF/run/",ncNameWrf,localFilePrefix + ncNameWrf);
+ sftpUtil.logout();
+ return Result.OK("SUCCESS COMPLETE WRF");
+ }else{
+ sftpUtil.logout();
+ }
+// String format = "yyyy-MM-dd_HH:mm:ss";
+// DateTime startTime = DateUtil.parse(bizWrf.getStartTime(), format);
+// long oneDaySecs = 60 * 60 * 24 * 1000;
+// String newStartTime = DateUtil.format(new Date(startTime.getTime() + oneDaySecs), format);
+// String ncNameWrf = "wrfout_d01_" + newStartTime;
+// sftpUtil.download(allRunPath + "WRF/run/",ncNameWrf,wrfLocalPrefix + ncNameWrf);
+// sftpUtil.logout();
+// return Result.OK("SUCCESS COMPLETE WRF");
+ return Result.error(wrfLog);
+ }
+
+ /**
+ * 运行
+ *
+ * @return
+ */
+ @GetMapping(value = "/getRunWrfLog")
+ public Result getRunWrfLog(String timeStamp) {
+ try {
+ String engineeringId = bizEngineeringService.getBizEngineeringByState().getId();
+ BizWrf bizWrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,engineeringId));
+ String allRunPath = baseHome + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/" + bizWrf.getTimeStamp() + "/";
+ String localFilePrefix = wpsLocalPrefix + "/" + bizWrf.getCreateBy() + bizWrf.getEngineeringId() + "/";
+
+ SFTPUtil sftpUtil = new SFTPUtil();
+ sftpUtil.login(username, password,ip,port);
+// sftpUtil.download(allRunPath + "WRF/run/","rsl.out.0000",wrfLocalPrefix + "rsl.out.0000");
+ sftpUtil.download(allRunPath + "WRF/run","wrf.log",localFilePrefix + "wrf.log");
+ sftpUtil.logout();
+ String wrfLog = new String(readAllBytes(get(localFilePrefix + "wrf.log")));
+// String wrfLog = new String(readAllBytes(get("C:\\Users\\13673\\Desktop\\Nuclear\\file\\wrf.log")));
+ return Result.OK(wrfLog);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return Result.error("文件不存在!");
+ }
+
+ /**
+ * get
+ *
+ * @return
+ */
+ @GetMapping(value = "/getNCFileInfo")
+ public Result>> getNCFileInfo(int layer) {
+ List> resultAll = new ArrayList<>();
+ List> resultSample = new ArrayList<>();
+ int column = 0;
+ BizEngineering bizEngineeringByState = bizEngineeringService.getBizEngineeringByState();
+ try {
+ NetcdfFile ncfile = NetcdfDataset.open("C:\\Users\\13673\\Desktop\\某源\\Nuclear\\file\\wrfout_d01_2016-07-01_00_00_00");
+// BizWrf bizWrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,bizEngineeringByState.getId()));
+// String format = "yyyy-MM-dd_HH:mm:ss";
+// DateTime startTime = DateUtil.parse(bizWrf.getStartTime(), format);
+// long oneDaySecs = 60 * 60 * 24 * 1000;
+// String newStartTime = DateUtil.format(new Date(startTime.getTime() + oneDaySecs), format);
+// String ncNameWrf = "wrfout_d01_" + newStartTime;
+// NetcdfFile ncfile = NetcdfDataset.open(wrfLocalPrefix + ncNameWrf);
+ List>> xlatAllList = getNCByName(ncfile, "XLAT",layer);
+ List>> xlongAllList = getNCByName(ncfile, "XLONG",layer);
+ List>> uAllList = getNCByName(ncfile, "U",layer);
+ List>> vAllList = getNCByName(ncfile, "V",layer);
+
+ for (int l=0; l result = new ArrayList<>();
+ List usList = new ArrayList<>();
+ List vsList = new ArrayList<>();
+ for (int i = 0;i < xlatAllList.get(l).size(); i++) {
+ List xlats = xlatAllList.get(l).get(i);
+ List xlongs = xlongAllList.get(l).get(i);
+ List us = uAllList.get(l).get(i);
+ List vs = vAllList.get(l).get(i);
+ column = xlats.size();
+
+ for (int j = 0;j < xlats.size(); j++) {
+ Double[] resultArray = new Double[4];
+ resultArray[0] = xlongs.get(j);
+ resultArray[1] = xlats.get(j);
+ resultArray[2] = us.get(j);
+ resultArray[3] = vs.get(j);
+ usList.add(us.get(j));
+ vsList.add(vs.get(j));
+ // resultArray[2] = Math.toDegrees(Math.round(Math.atan(Double.valueOf(us.get(j)) / Double.valueOf(vs.get(j))) * 10) / 10f);
+// resultArray[3] = Math.sqrt(Double.valueOf(us.get(j)) * Double.valueOf(us.get(j)) + Double.valueOf(vs.get(j)) * Double.valueOf(vs.get(j)));
+ result.add(resultArray);
+ }
+ }
+
+ if(result != null && !result.isEmpty()){
+ resultAll.add(result);
+ }
+ }
+ return Result.OK(resultAll);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * get
+ *
+ * @return
+ */
+ @GetMapping(value = "/getNCTerrainInfo")
+ public Result>> getNCTerrainInfo() {
+ List> resultAll = new ArrayList<>();
+ List> resultSample = new ArrayList<>();
+ int column = 0;
+ BizEngineering bizEngineeringByState = bizEngineeringService.getBizEngineeringByState();
+ try {
+ NetcdfFile ncfile = NetcdfDataset.open("C:\\Users\\13673\\Desktop\\某源\\Nuclear\\file\\wrfout_d01_2016-07-01_00_00_00");
+// BizWrf bizWrf = bizWrfService.getOne(new LambdaQueryWrapper().eq(BizWrf::getEngineeringId,bizEngineeringByState.getId()));
+// String format = "yyyy-MM-dd_HH:mm:ss";
+// DateTime startTime = DateUtil.parse(bizWrf.getStartTime(), format);
+// long oneDaySecs = 60 * 60 * 24 * 1000;
+// String newStartTime = DateUtil.format(new Date(startTime.getTime() + oneDaySecs), format);
+// String ncNameWrf = "wrfout_d01_" + newStartTime;
+// NetcdfFile ncfile = NetcdfDataset.open(wrfLocalPrefix + ncNameWrf);
+ List>> hgtAllList = getNCByName(ncfile, "HGT",0);
+ List>> xlatAllList = getNCByName(ncfile, "XLAT",0);
+ List>> xlongAllList = getNCByName(ncfile, "XLONG",0);
+ for (int l=0;l result = new ArrayList<>();
+ for (int i = 0; i < hgtAllList.get(l).size(); i++) {
+ List hgts = hgtAllList.get(l).get(i);
+ List xlats = xlatAllList.get(l).get(i);
+ List xlongs = xlongAllList.get(l).get(i);
+ column = xlats.size();
+ for (int j = 0; j < hgts.size(); j++) {
+ Double[] resultArray = new Double[3];
+ resultArray[0] = xlongs.get(j);
+ resultArray[1] = xlats.get(j);
+ resultArray[2] = hgts.get(j);
+ result.add(resultArray);
+ }
+ }
+ resultAll.add(result);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ Result.error("未找到WRF输出文件");
+ }
+ return Result.OK(resultAll);
+ }
+
+ /**
+ * get
+ *
+ * @return
+ */
+ @GetMapping(value = "/getNCPointInfo")
+ public Result