Browse Source

对接qad完成

master
liuchen 8 months ago
parent
commit
c3927c748c
  1. 6
      pom.xml
  2. 3
      src/main/java/com/win/qad/config/ShellConfig.java
  3. 80
      src/main/java/com/win/qad/controller/ShellController.java
  4. 1
      src/main/java/com/win/qad/exception/GlobalErrorCodeConstants.java
  5. 63
      src/main/java/com/win/qad/handler/GlobalExceptionHandler.java
  6. 4
      src/main/java/com/win/qad/utils/shell/ShellUtil.java
  7. 13
      src/main/resources/application-dev.yml
  8. 4
      src/main/resources/logback-spring.xml

6
pom.xml

@ -30,6 +30,12 @@
<version>3.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

3
src/main/java/com/win/qad/config/ShellConfig.java

@ -10,9 +10,8 @@ import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "shell")
public class ShellConfig {
//linux配置信息
private ShellVo jlht;
private ShellVo jlht2;
//linux配置信息
// private Map<String, ShellVo> linux;
}

80
src/main/java/com/win/qad/controller/ShellController.java

@ -1,5 +1,6 @@
package com.win.qad.controller;
import com.alibaba.fastjson.JSONObject;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.win.qad.common.CommonResult;
@ -7,8 +8,11 @@ import com.win.qad.config.ShellConfig;
import com.win.qad.exception.GlobalErrorCodeConstants;
import com.win.qad.utils.ProfileUtil;
import com.win.qad.utils.shell.ShellUtil;
import com.win.qad.utils.shell.ShellVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
@ -18,14 +22,19 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import static com.win.qad.exception.GlobalErrorCodeConstants.EXECUTE_FAIL;
@Slf4j
@RestController
@RequestMapping("/shell")
public class ShellController {
private static final Logger logger = LoggerFactory.getLogger("sys-user");
@Autowired
private ShellUtil shellUtil;
@Autowired
@ -40,7 +49,7 @@ public class ShellController {
*/
@PostMapping("/api")
@SuppressWarnings("unchecked")
public CommonResult<String> api(HttpServletRequest request, @RequestBody String body) {
public CommonResult<String> api(HttpServletRequest request, @RequestBody String body) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
String interfaceName = request.getHeader("interface");
String sign = request.getHeader("sign");
String timeStr = request.getHeader("timestamp");
@ -55,11 +64,6 @@ public class ShellController {
}
String tmp = interfaceName + body + timestamp;
String computeSign = DigestUtils.md5DigestAsHex(tmp.getBytes());
log.info("{}, interfaceName: {}", "interfaceName", interfaceName);
log.info("{}, sign: {}", "sign", sign);
log.info("{}, timestamp: {}", "timestamp", timestamp);
log.info("{}, tmp: {}", "tmp", tmp);
log.info("{}, computeSign: {}", "computeSign", computeSign);
long tenTimestamp = timestamp + (10 * 60 * 1000); // 计算10分钟后的时间戳
long currentTimestamp = System.currentTimeMillis(); // 获取当前时间戳
//过期
@ -71,26 +75,68 @@ public class ShellController {
if(!activeProfile.contains("dev") && !StringUtils.equals(sign, computeSign.toUpperCase())) {
return CommonResult.error(GlobalErrorCodeConstants.SIGN_ERROR);
}
try {
Method method = this.getClass().getMethod(interfaceName, String.class);
return (CommonResult<String>) method.invoke(this, body);
} catch (NoSuchMethodException e) {
return CommonResult.error(GlobalErrorCodeConstants.INTERFACE_ERROR);
} catch (Exception e) {
return CommonResult.error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR);
}
Method method = this.getClass().getMethod(interfaceName, String.class);
return (CommonResult<String>) method.invoke(this, body);
}
public CommonResult<String> jlht(String body) throws JSchException, IOException {
Session session = shellUtil.getShellSession(shellConfig.getJlht());
public CommonResult<String> itemmastercreate(String body) throws JSchException, IOException {
Session session = shellUtil.getShellSession(shellConfig.getJlht2());
String result = shellUtil.execute(session, "cd /opt && ls -l");
return CommonResult.success(result);
}
public CommonResult<String> jlht2(String body) throws JSchException, IOException {
public CommonResult<String> itemdetailcreate(String body) throws JSchException, IOException {
Session session = shellUtil.getShellSession(shellConfig.getJlht2());
String result = shellUtil.execute(session, "cd /opt && ls -l");
return CommonResult.success(result);
}
public CommonResult<String> discretepo(String body) throws JSchException, IOException {
JSONObject jsonObject = JSONObject.parseObject(body);
jsonObject = JSONObject.parseObject(jsonObject.getString("dsDescreteOrder"));
ShellVo shellVo;
if(jsonObject.getString("domain") != null && jsonObject.getString("domain").equals("JLHT2")) {
shellVo = shellConfig.getJlht2();
} else {
shellVo = shellConfig.getJlht();
}
Session session = shellUtil.getShellSession(shellVo);
//生成traceid
String traceid = jsonObject.getString("traceid");
jsonObject.remove("traceid");
jsonObject.remove("company");
jsonObject.remove("domain");
String inJson = "{\"dsDescreteOrder\":"+ jsonObject+"}";
log.info("inJson: {}", inJson);
//写入json
String result = shellUtil.execute(session, "touch /home/mfg/work/cim/po/"+traceid+".json && echo '"+inJson+"'>/home/mfg/work/cim/po/"+traceid+".json");
log.info("write json result : " + result);
//写入dat.json
String datJson = "\"/home/mfg/work/cim/po/"+traceid+".json\" \"xxdspoapi.p\" \"/home/mfg/work/out/po/"+traceid+".out.log\" \""+shellVo.getQadUser()+"\" \""+shellVo.getQadPassword()+"\"\r\n\""+shellVo.getQadDomain()+"\"";
log.info("datJson: {}", datJson);
result = shellUtil.execute(session, "touch /home/mfg/work/cim/po/"+traceid+".dat && echo '"+datJson+"'>/home/mfg/work/cim/po/"+traceid+".dat");
log.info("write dat json result : " + result);
//写入执行文件
String pJson = "output to /home/mfg/work/out/po/" + traceid + ".run.log.\r\n" +
"input from /home/mfg/work/cim/po/" + traceid + ".dat.\r\n" +
"run /home/mfg/work/scripts/xxcommon01.p.\r\n" +
"input close.\r\n" +
"output close.";
log.info("pJson: {}", pJson);
result = shellUtil.execute(session, "touch /home/mfg/work/cim/po/"+traceid+".p && echo '"+pJson+"'>/home/mfg/work/cim/po/"+traceid+".p");
log.info("write p result : " + result);
//执行QAD脚本
result = shellUtil.execute(session, "/home/mfg/work/scripts/client-ch-cimload /home/mfg/work/cim/po/"+traceid+".p");
log.info("execute client-ch-loaddata : " + result);
result = shellUtil.execute(session, "cat /home/mfg/work/out/po/" + traceid + ".run.out.json");
log.info("cat execute log : " + result);
if(result.indexOf("\"SUCCESS\"") > 0) {
//移动执行结果文件
shellUtil.execute(session, "mv /home/mfg/work/out/po/" + traceid + ".run.out.json /home/mfg/work/success/po/" + traceid + ".run.out.json");
return CommonResult.success(traceid);
}
shellUtil.execute(session, "mv /home/mfg/work/out/po/" + traceid + ".run.out.json /home/mfg/work/err/po/" + traceid + ".run.out.json");
return CommonResult.error(EXECUTE_FAIL.getCode(), result);
}
}

1
src/main/java/com/win/qad/exception/GlobalErrorCodeConstants.java

@ -34,6 +34,7 @@ public interface GlobalErrorCodeConstants {
ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启");
ErrorCode EXECUTE_FAIL = new ErrorCode(502, "执行失败");
// ========== 自定义错误段 ==========
ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求

63
src/main/java/com/win/qad/handler/GlobalExceptionHandler.java

@ -0,0 +1,63 @@
package com.win.qad.handler;
import com.win.qad.common.CommonResult;
import com.win.qad.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import static com.win.qad.exception.GlobalErrorCodeConstants.INTERFACE_ERROR;
import static com.win.qad.exception.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR;
/**
* 全局异常处理器 Exception 翻译成 CommonResult + 对应的异常编号
*
* @author 闻荫源码
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 接口未找到业务异常 NoSuchMethodException
*/
@ExceptionHandler(NoSuchMethodException.class)
public CommonResult<?> noSuchMethodExceptionHandler(NoSuchMethodException e) {
log.error("[serviceExceptionHandler]", e);
return CommonResult.error(INTERFACE_ERROR.getCode(), INTERFACE_ERROR.getMsg());
}
/**
* 处理业务异常 ServiceException
*
* 例如说商品库存不足用户手机号已存在
*/
@ExceptionHandler(ServiceException.class)
public CommonResult<?> serviceExceptionHandler(ServiceException ex, HttpServletRequest request) {
log.error("[serviceExceptionHandler]", ex);
return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg());
}
/**
* 处理业务异常 ServiceException
*
* 例如说商品库存不足用户手机号已存在
*/
@ExceptionHandler(RuntimeException.class)
public CommonResult<?> runtimeExceptionHandler(ServiceException ex, HttpServletRequest request) {
log.error("[runtimeExceptionHandler]", ex);
return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg());
}
/**
* 处理系统异常兜底处理所有的一切
*/
@ExceptionHandler(Exception.class)
public CommonResult<?> defaultExceptionHandler(Throwable ex, HttpServletRequest request) {
log.error("[defaultExceptionHandler]", ex);
return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg());
}
}

4
src/main/java/com/win/qad/utils/shell/ShellUtil.java

@ -45,7 +45,9 @@ public class ShellUtil {
line.trim();
result = result + line + "\r\n";
}
result = result.substring(0, result.length() - 2);
if(result.length() > 2) {
result = result.substring(0, result.length() - 2);
}
// 关闭SSH Channel
channel.disconnect();
return result;

13
src/main/resources/application-dev.yml

@ -16,28 +16,19 @@ server:
# Tomcat启动初始化的线程数,默认值10
min-spare: 10
sfms:
username: admin #用户名
password: 123456 #密码
purchase-order: http://localhost:12080/admin-api/wms/purchase-main/create #采购订单
access-token: http://localhost:12080/admin-api/system/oauth2/token #登陆token
refresh-token: http://localhost:12080/admin-api/system/auth/refresh-token #刷新token
# 日志配置
logging:
file:
path: logs
level:
com.win: debug
org.springframework: warn
shell:
jlht:
qad-domain: JLHT
company-code: CCWININ
server-id: master
#ip: dev.ccwin-in.com
#port: 23022
#linux-id: root
#linux-password: Microsoft@2022
ip: 222.169.228.163
port: 6122
linux-id: mfg

4
src/main/resources/logback-spring.xml

@ -87,7 +87,7 @@
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.hc" level="info" />
<logger name="com.win" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
@ -105,4 +105,4 @@
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
</configuration>
Loading…
Cancel
Save