Quellcode durchsuchen

【奥维-赛力斯】

DINGYL vor 2 Wochen
Ursprung
Commit
591dce35c5

+ 11 - 2
pom.xml

@@ -50,7 +50,11 @@
             <groupId>org.springframework.boot</groupId>  
             <artifactId>spring-boot-starter-data-jpa</artifactId>  
         </dependency>
-	
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>druid-spring-boot-starter</artifactId>
+			<version>1.2.6</version>
+		</dependency>
 		<dependency>
 		    <groupId>log4j</groupId>
 		    <artifactId>log4j</artifactId>
@@ -119,7 +123,12 @@
 			<scope>system</scope>
 			<systemPath>${project.basedir}/lib/ojdbc7.jar</systemPath>
 		</dependency>
-	</dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
 
 	<build>
 		<plugins>

+ 56 - 0
src/main/java/com/uas/eis/controller/SERESController.java

@@ -0,0 +1,56 @@
+package com.uas.eis.controller;
+
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.service.SERESService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+public class SERESController {
+    @Autowired
+    private SERESService seresService;
+    /**
+     *  *赛力斯内部及3PL库存
+     * ERP端调用 获取塞力斯数据 在ERP端展示
+    * */
+    @PostMapping("/erp/ZHJK/getStock")
+    @ResponseBody
+    public Map<String, Object> getStock() throws IOException {
+        SpObserver.putSp("AW_ZHJK");
+        Map<String, Object> modelMap = new HashMap<String, Object>();
+        seresService.getToken();
+        return modelMap;
+    }
+
+    /**
+     * 赛力斯及3PL库存波动预警
+     * 外部调用 写入ERP
+    * */
+    @PostMapping("/api/ZHJK/pushAlert")
+    @ResponseBody
+    public Map<String, Object> pushAlert(HttpServletRequest request, @RequestBody String data){
+        SpObserver.putSp("AW_ZHJK");
+        Map<String, Object> modelMap =  seresService.saveAlert(data);
+        System.out.println(data);
+        return modelMap;
+    }
+    /**
+     * 供应商零部件成品库存
+     * 外部调用,获取ERP库存数据
+     *
+     * */
+    @PostMapping("/api/ZHJK/getInventory")
+    public Map<String, Object> getInventory(HttpServletRequest request, @RequestBody String param) throws IOException {
+        SpObserver.putSp("AW_ZHJK");
+        Map<String, Object> modelMap =seresService.getERPStock(param);
+        return modelMap;
+    }
+}

+ 45 - 0
src/main/java/com/uas/eis/core/TokenManager.java

@@ -0,0 +1,45 @@
+package com.uas.eis.core;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class TokenManager {
+    private static final Logger logger = LoggerFactory.getLogger(TokenManager.class);
+    // 线程安全的token缓存: key=用户名, value=TokenInfo
+    private static final ConcurrentHashMap<String, TokenInfo> tokenCache = new ConcurrentHashMap<>();
+    private static final ReentrantLock lock = new ReentrantLock();
+
+    // Token信息内部类
+    private static class TokenInfo {
+        String token;
+        long expirationTime; // 过期时间戳(毫秒)
+    }
+
+    /**
+     * 多线程安全的获取共享token方法
+     */
+    public static String getToken(String  tokenKey,long REFRESH_ADVANCE_MS) {
+        TokenInfo tokenInfo = tokenCache.get(tokenKey);
+        if (tokenInfo == null || tokenInfo.expirationTime - System.currentTimeMillis() < REFRESH_ADVANCE_MS) {
+            return null;
+        }
+        logger.info("获取缓存token,token:{},过期时间:{}",tokenInfo.token,tokenInfo.expirationTime);
+        return tokenInfo.token;
+    }
+    public static void setToken(String tokenKey, String token, long expirationTime) {
+        TokenInfo tokenInfo = new TokenInfo();
+        tokenInfo.token = token;
+        tokenInfo.expirationTime = expirationTime;
+        logger.info("设置token,token:{},过期时间:{},系统时间:{}",token,expirationTime,System.currentTimeMillis());
+        lock.lock();
+        try {
+            tokenCache.put(tokenKey, tokenInfo);
+        }finally {
+            lock.unlock();
+        }
+
+    }
+}

+ 8 - 2
src/main/java/com/uas/eis/core/WebAppConfig.java

@@ -1,10 +1,10 @@
 package com.uas.eis.core;
 
 import java.nio.charset.Charset;
-import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.List;
 
+import com.uas.eis.core.support.ApiSERESSignInterceptor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.converter.HttpMessageConverter;
@@ -25,9 +25,15 @@ public class WebAppConfig extends WebMvcConfigurationSupport{
 	public LoginInterceptor loginInterceptor(){
 		return new LoginInterceptor();
 	}
+	@Bean
+	public ApiSERESSignInterceptor apiSERESSignInterceptor(){
+		return new ApiSERESSignInterceptor();
+	}
 	
 	public void addInterceptors(InterceptorRegistry registry){
-		registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/EIS/login");
+		registry.addInterceptor(apiSERESSignInterceptor()).addPathPatterns("/api/**")
+				.excludePathPatterns("/login", "/erp/**");
+		//registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/EIS/login");
 		registry.addInterceptor(new DataSourceInterceptor()).addPathPatterns("/*/**");
 	}
 	

+ 18 - 0
src/main/java/com/uas/eis/core/config/SeresConfig.java

@@ -0,0 +1,18 @@
+package com.uas.eis.core.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import lombok.Data;
+
+@Configuration
+@ConfigurationProperties(prefix = "seres")
+@Data
+public class SeresConfig {
+    private String clientId;
+    private String clientSecret;
+    private String url;
+    private String clientCode;
+    private String clientName;
+    private String accessKey;
+    private String accessSecret;
+}

+ 114 - 0
src/main/java/com/uas/eis/core/support/ApiSERESSignInterceptor.java

@@ -0,0 +1,114 @@
+package com.uas.eis.core.support;
+
+import com.uas.eis.core.config.SeresConfig;
+import com.uas.eis.entity.ErrorMsg;
+import com.uas.eis.exception.SystemException;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+
+@Service
+public class ApiSERESSignInterceptor extends HandlerInterceptorAdapter {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    // 签名超时时长,默认时间为5分钟,ms
+    private static final int SIGN_EXPIRED_TIME = 5 * 60 * 1000;
+    private static final String TIMESTAMP_KEY = "Timestamp";
+
+    private static final String ACCESS_KEY = "AccessKey";
+    private static final String ACCESS_SECRET = "AccessSecret";
+    private static final String SIGN_KEY = "Signature";
+    private static final String API_ID = "ApiID";
+
+    private static final String  CLIENT_CODE= "SupplierCode";
+
+    @Autowired
+    private SeresConfig seresConfig;
+
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        logger.info("RequestURI:{}", request.getRequestURI());
+        //鉴权
+        String timestamp = request.getHeader(TIMESTAMP_KEY);
+        logger.info("RequestURI:{}", request.getRequestURI());
+        logger.info("TIMESTAMP:{}", System.currentTimeMillis());
+        if (!StringUtils.isNumeric(timestamp)) {
+            logger.info("Interceptor_err:{}", ErrorMsg.TIMESTAMP_ILLEGAL);
+            throw new SystemException(ErrorMsg.TIMESTAMP_ILLEGAL);
+        }
+        Long ts = Long.valueOf(timestamp);
+        // 禁止超时签名
+        if (System.currentTimeMillis() - ts > SIGN_EXPIRED_TIME) {
+            logger.info("Interceptor_err:时间戳失效{}", ts );
+            throw new SystemException(ErrorMsg.TIMEOUT_ILLEGAL);
+        }
+
+        String client= request.getHeader(CLIENT_CODE);
+        if(StringUtils.isEmpty(client) || !client.equals(seresConfig.getClientCode())){
+            logger.info("Interceptor_err:CLIENT_CODE {}", client );
+            throw new SystemException(ErrorMsg.CLIENT_CODE_ILLEGAL);
+        }
+
+        String accessKey = request.getHeader(ACCESS_KEY );
+        // 检查KEY是否合理
+        if (StringUtils.isEmpty(accessKey)  || !accessKey.equals(seresConfig.getAccessKey())) {
+            logger.info("Interceptor_err:ACCESS_KEY {}", accessKey );
+            throw new SystemException(ErrorMsg.ACCESS_KEY_ILLEGAL);
+        }
+        String apiID=request.getHeader(API_ID);
+        if(StringUtils.isEmpty(apiID) || (!apiID.equals("CRM_ZHJK_SERESS"))){
+            logger.info("Interceptor_err:API_ID {}", apiID );
+            throw new SystemException(ErrorMsg.APIID_ILLEGAL);
+        }
+        if (!verificationSign(request)) {
+            throw new SystemException(ErrorMsg.SIGNATURE_ILLEGAL);
+        }
+        return true;
+    }
+
+    private boolean verificationSign(HttpServletRequest request) throws UnsupportedEncodingException {
+        Enumeration<?> pNames = request.getHeaderNames();
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put(ACCESS_KEY,request.getHeader(ACCESS_KEY));
+        params.put(API_ID,request.getHeader(API_ID));
+        params.put(TIMESTAMP_KEY,request.getHeader(TIMESTAMP_KEY));
+        String originSign = request.getHeader(SIGN_KEY);
+        String sign = createSign(params);
+        System.out.println(sign);
+
+        return sign.equals(originSign);
+    }
+    private String createSign(Map<String, Object> params) throws UnsupportedEncodingException {
+        String accessSecret=seresConfig.getClientSecret();
+        Set<String> keysSet = params.keySet();
+        Object[] keys = keysSet.toArray();
+        Arrays.sort(keys);
+        StringBuilder temp = new StringBuilder();
+        boolean first = true;
+        for (Object key : keys) {
+            if (first) {
+                first = false;
+            } else {
+                temp.append("&");
+            }
+            temp.append(key).append("=");
+            Object value = params.get(key);
+            String valueString = "";
+            if (null != value) {
+                valueString = String.valueOf(value);
+            }
+            temp.append(valueString);
+        }
+        temp.append("&").append(ACCESS_SECRET).append("=").append(accessSecret);
+        logger.info("Interceptor_err:Sign_temp {}", temp );
+        logger.info("Interceptor_err:Signature {}", DigestUtils.md5Hex(temp.toString()).toUpperCase() );
+        return DigestUtils.md5Hex(temp.toString()).toUpperCase();
+    }
+}

+ 13 - 1
src/main/java/com/uas/eis/dao/BaseDao.java

@@ -579,5 +579,17 @@ public class BaseDao{
 		}
 		return datas;
 	}
-	
+
+    public Object getSeqId(String seq) {
+		String sql = "select " + seq + ".nextval from dual";
+		SqlRowList rs = queryForRowSet(sql);
+		if (rs.next()) {
+			return rs.getInt(1);
+		}
+		return null;
+    }
+
+	public synchronized String sGetMaxNumber(String myTable, int thisType) {
+		return callProcedure("Sp_GetMaxNumber", new Object[] { myTable, thisType });
+	}
 }

+ 6 - 0
src/main/java/com/uas/eis/entity/ErrorMsg.java

@@ -5,6 +5,12 @@ package com.uas.eis.entity;
  * 异常处理返回信息
  */
 public enum ErrorMsg {
+    TIMESTAMP_ILLEGAL(1001,"Timestamp is illegal","请求时间戳不合法"),
+    TIMEOUT_ILLEGAL(1002,"Time is Out","请求超时"),
+    CLIENT_CODE_ILLEGAL(1003,"SupplierCode is illegal","供应商编码错误"),
+    ACCESS_KEY_ILLEGAL(1004,"AccessKey is illegal","AccessKey错误"),
+    SIGNATURE_ILLEGAL(1005,"invalid Signature","签名错误"),
+    APIID_ILLEGAL(1006,"ApiId illegal","API编码无效"),
     NULL_TOKEN(10001,"token not found","缺失token,请把token做为参数传入"),
     INVALID_TOKEN(10002,"invalid token","无效的token,请重新申请token"),
     EXPIRED_TOKEN(10003,"expired token","token已过期,请重新申请token"),

+ 22 - 0
src/main/java/com/uas/eis/entity/SeresStock.java

@@ -0,0 +1,22 @@
+package com.uas.eis.entity;
+
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class SeresStock {
+    private int SerialNumber;
+    private String SupplierCode;
+    private String SupplierName;
+    private String MaterialCode;
+    private String MaterialName;
+    private Double WIPStock=0.0;
+    private Double OfflineNotStoredStock=0.0;
+    private Double TransitStock=0.0;
+    private List<SeresStockDet> StockList;
+    private String  Attribute1;
+    private String  Attribute2;
+    private String  Attribute3;
+    private String  Attribute4;
+    private String  Attribute5;
+}

+ 13 - 0
src/main/java/com/uas/eis/entity/SeresStockDet.java

@@ -0,0 +1,13 @@
+package com.uas.eis.entity;
+
+import lombok.Data;
+
+@Data
+public class SeresStockDet {
+    private  String StockCode;
+    private  String StockName;
+    private  String StockAddress ;
+    private  Double FGQualifiedStock;
+    private  Double FGNonQualifiedStock;
+    private  Double FrozenStock;
+}

+ 12 - 0
src/main/java/com/uas/eis/service/SERESService.java

@@ -0,0 +1,12 @@
+package com.uas.eis.service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.Map;
+
+public interface SERESService {
+    Map<String,Object> getStock() throws IOException;
+    Map<String,Object> getERPStock(String param) ;
+    void getToken() throws IOException;
+    Map<String,Object> saveAlert(String data) ;
+}

+ 232 - 0
src/main/java/com/uas/eis/serviceImpl/SERESServiceImpl.java

@@ -0,0 +1,232 @@
+package com.uas.eis.serviceImpl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.eis.core.TokenManager;
+import com.uas.eis.core.config.SeresConfig;
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.dao.BaseDao;
+import com.uas.eis.dao.SqlRowList;
+import com.uas.eis.entity.SeresStock;
+import com.uas.eis.entity.SeresStockDet;
+import com.uas.eis.service.SERESService;
+import com.uas.eis.utils.*;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+import java.io.IOException;
+import java.util.*;
+
+@Service
+public class SERESServiceImpl implements SERESService {
+    @Autowired
+    private SeresConfig seresConfig;
+    @Autowired
+    private BaseDao baseDao;
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    // Token最大有效期 60分钟 毫秒
+    private static final long MAX_TOKEN_VALID_MS = 60L * 60 * 1000;
+    // 提前1分钟刷新Token(毫秒)
+    private static final long REFRESH_ADVANCE_MS = 60L * 1000;
+
+    private static final String seresTokenKey = "SERES_TOKEN" ;
+
+    static final String errLogSql="insert into Seres_Stock_Alert_errlog(ID_,CODE_,DATE_,MESSAGE_,DATA_)values(?,?,sysdate,?,?)";
+    /**
+     * 获取有效Token,自动判断是否刷新
+     */
+    public synchronized String getValidToken() throws IOException {
+        String accessToken = TokenManager.getToken(seresTokenKey,REFRESH_ADVANCE_MS);
+        long nowMs = System.currentTimeMillis();
+        // 无token 或 距离过期不足1分钟,重新拉取
+        if (accessToken == null ) {
+            logger.info("token 为空重新获取");
+            accessToken=refreshToken();
+        }
+        return accessToken;
+    }
+
+    private String refreshToken() throws IOException {
+        String accessToken ="";
+        String tokenUrl = seresConfig.getUrl() + "/aito/DIS/COMM_GET_JWT_TOKEN/1.0.0";
+        String clientId=seresConfig.getClientId();
+        String clientSecret=seresConfig.getClientSecret();
+
+        long nowMs = System.currentTimeMillis();
+        long expTs = nowMs + MAX_TOKEN_VALID_MS;
+        // 请求体
+        JSONObject reqBody = new JSONObject();
+        reqBody.put("grant_type", "client_credentials");
+        reqBody.put("client_id", clientId);
+        reqBody.put("client_secret", clientSecret);
+        reqBody.put("exp", expTs);
+        System.out.println(expTs);
+         // 发送POST
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(tokenUrl);
+        httpPost.setHeader("Content-Type", "application/json");
+        StringEntity entity = new StringEntity(reqBody.toString(), "UTF-8");
+        httpPost.setEntity(entity);
+
+        try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
+            String respJson = EntityUtils.toString(response.getEntity(), "UTF-8");
+            JSONObject respObj = JSON.parseObject(respJson);
+            if (!respObj.containsKey("access_token")) {
+                throw new RuntimeException("获取Token失败,响应:" + respJson);
+            }
+            accessToken = respObj.getString("access_token");
+            TokenManager.setToken(seresTokenKey,respObj.getString("access_token"),expTs);
+            logger.info("token {}",accessToken);
+            System.out.println("Token刷新成功,有效期:" + respObj.get("expires_in") + "秒");
+        } finally {
+            httpClient.close();
+        }
+        return accessToken;
+    }
+
+    @Override
+    public Map<String, Object> getStock() throws IOException {
+        Map<String, Object> modelMap = new HashMap<String, Object>();
+        String token = getValidToken();
+        String apiPath="/aito/DIS/INV_STOCK_STS/1.0.0";
+        String fullUrl =  seresConfig.getUrl()  + apiPath;
+
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(fullUrl);
+        // 鉴权头
+        httpPost.setHeader("Authorization", "Bearer " + token);
+        httpPost.setHeader("Content-Type", "application/json");
+        JSONObject reqBody = new JSONObject();
+        //供应商编码
+        reqBody.put("SupplierCode", seresConfig.getClientCode());
+        //工厂编码
+        //reqBody.put("FactoryCode", seresConfig.getClient_code());
+        //物料编码
+        //reqBody.put("MaterialCode", seresConfig.getClient_code());
+       //页码
+        //reqBody.put("Skip", seresConfig.getClient_code());
+        //分页大小
+        //reqBody.put("Take", seresConfig.getClient_code());
+        if (reqBody != null) {
+            StringEntity entity = new StringEntity(JSON.toJSONString(reqBody), "UTF-8");
+            httpPost.setEntity(entity);
+        }
+        try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
+            String respStr = EntityUtils.toString(response.getEntity(), "UTF-8");
+            return JSON.parseObject(respStr);
+        } finally {
+            httpClient.close();
+            return modelMap;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getERPStock(String param){
+        Map<String, Object> modelMap = new HashMap<String, Object>();
+        SpObserver.putSp("AW_ZHJK");
+        List<SeresStock> data=new ArrayList();
+        String con="";
+        String MaterialCode_Q="";
+        if(StringUtil.hasText(param)){
+            Map<Object, Object> map = BaseUtil.parseFormStoreToMap(param);
+            if(StringUtil.hasText(map.get("MaterialCode"))){
+                MaterialCode_Q=map.get("MaterialCode").toString();
+            }
+        }
+        if(StringUtil.hasText(MaterialCode_Q)){
+            con="MaterialCode='"+MaterialCode_Q+"'";
+        }else{
+            con="1=1";
+        }
+        SqlRowList rs = baseDao.queryForRowSet("select MaterialCode,MaterialName from ZHJK_SERES_STOCK_VIEW where "+con+" group by MaterialCode,MaterialName order by MaterialCode");
+        int n = 1;
+        if(rs.size()>0){
+            while (rs.next()){
+                SeresStock seresStock=new SeresStock();
+                seresStock.setSerialNumber(n);
+                n++;
+                seresStock.setSupplierCode(seresConfig.getClientCode());
+                seresStock.setSupplierName(seresConfig.getClientName());
+                seresStock.setMaterialCode(rs.getString("MaterialCode"));
+                seresStock.setMaterialName(rs.getString("MaterialName"));
+                String prcon="MaterialCode='"+rs.getString("MaterialCode")+"'";
+                List<SeresStockDet> det=new ArrayList();
+                SqlRowList rs_det = baseDao.queryForRowSet("select StockCode,StockName,StockAddress,FGQualifiedStock,FGNonQualifiedStock from ZHJK_SERES_STOCK_VIEW where "+prcon+" order by StockCode");
+                while (rs_det.next()){
+                    SeresStockDet detInfo=new SeresStockDet();
+                    detInfo.setStockCode(rs.getString("StockCode"));
+                    detInfo.setStockName(rs.getString("StockName"));
+                    detInfo.setStockAddress(rs.getString("StockAddress"));
+                    detInfo.setFGQualifiedStock(rs.getGeneralDouble("FGQualifiedStock"));
+                    detInfo.setFGNonQualifiedStock(rs.getGeneralDouble("FGNonQualifiedStock"));
+                    det.add(detInfo);
+                }
+                data.add(seresStock);
+            }
+            System.out.println(JSONArray.toJSONString(data));
+            modelMap.put("code",0);
+            modelMap.put("message","成功");
+            modelMap.put("data",JSONArray.toJSONString(data));
+        } else if (StringUtil.hasText(MaterialCode_Q)) {
+            //物料号不存在
+            modelMap.put("code",1);
+            modelMap.put("message","物料号不存在");
+            System.out.println("物料号不存在");
+        }else{
+            //未配置对照关系
+            modelMap.put("code",1);
+            modelMap.put("message","未配置对照关系");
+            System.out.println("未配置对照关系");
+        }
+        return modelMap;
+    }
+
+    @Override
+    public void getToken() throws IOException {
+        String token=getValidToken();
+        logger.info("当前token {}",token);
+    }
+
+    @Override
+    public Map<String, Object> saveAlert(String data) {
+        Map<String, Object> modelMap = new HashMap<String, Object>();
+        List<Map<Object, Object>> dets =  BaseUtil.parseGridStoreToMaps(data);
+        Object  id = baseDao.getSeqId("SERES_STOCK_ALERT_SEQ");
+        String  code = baseDao.sGetMaxNumber("Seres_Stock_Alert", 2);
+        baseDao.execute("insert into SERES_STOCK_ALERT(Sta_id,sta_code,sta_recorddate) values("+id+",'"+code+"',sysdate)");
+        for (Map<Object, Object> det : dets) {
+            det.put("stad_id",baseDao.getSeqId("SERES_STOCK_ALERT_DET_SEQ"));
+            det.put("stad_staid",id);
+        }
+        try{
+            List<String> gridSql = SqlUtil.getInsertSqlbyGridStore(dets, "SERES_STOCK_ALERT_DET");
+            baseDao.execute(gridSql);
+            baseDao.execute("update Seres_Stock_Alert set sta_dockStatus='成功' where Sta_id="+id);
+            modelMap.put("code",0);
+            modelMap.put("message","接收成功");
+            modelMap.put("data","");
+        }catch (Exception e){
+            Object  errid = baseDao.getSeqId("SERES_ERRLOG_SEQ");
+            baseDao.execute("update Seres_Stock_Alert set sta_dockStatus='失败' where Sta_id="+id);
+            baseDao.execute(errLogSql,
+                    new Object[]{errid,code,e.getMessage(),data});
+            modelMap.put("code",1);
+            modelMap.put("message","接收失败");
+            modelMap.put("data","");
+        }
+
+        return modelMap;
+    }
+}

+ 14 - 1
src/main/java/com/uas/eis/utils/BaseUtil.java

@@ -151,5 +151,18 @@ public class BaseUtil {
 		json.put("grid", JSONArray.fromObject(gridList));
 		return json.toString();
 	}
-	
+	/**
+	 * 将formStore解析成一个map
+	 *
+	 * @param formStore
+	 *            字符串形式的表单数据
+	 * @return map形式的表单数据
+	 */
+	public static Map<Object, Object> parseFormStoreToMap(String formStore) {
+		try {
+			return FlexJsonUtil.fromJson(formStore);
+		} catch (Exception e) {
+			return JSONUtil.toMap(formStore);
+		}
+	}
 }

+ 4 - 0
src/main/java/com/uas/eis/utils/Constant.java

@@ -20,10 +20,14 @@ public class Constant {
 
 	public final static String YMD_HMS = "yyyy-MM-dd HH:mm:ss";
 
+	public final static String YMD_HMS_LOCAL = "yyyy-MM-dd'T'HH:mm:ss";
+
 	public final static String ORACLE_YMD = "yyyy-MM-dd";
 
 	public final static String ORACLE_YMD_HMS = "yyyy-MM-dd HH24:mi:ss";
 
+	public final static String ORACLE_YMD_HMS_LOCAL = "yyyy-MM-dd\"T\"HH24:mi:ss";
+
 	public static final String REGEXP_MOBILE = "^[1|8][3-8]\\d{9}$|^([6|9])\\d{7}$|^[0][9]\\d{8}$|^[6]([8|6])\\d{5}$|^(886|0)[9]\\d{8}$";
 
 	public static final String REGEXP_EMAIL = "^([\\w-])+(\\.\\w+)*@([\\w-])+((\\.\\w{2,3}){1,3})$";

+ 2 - 0
src/main/java/com/uas/eis/utils/DateUtil.java

@@ -399,6 +399,8 @@ public class DateUtil {
 		}
 		if (Constant.YMD_HMS.toUpperCase().equals(format.toUpperCase())) {
 			format = Constant.ORACLE_YMD_HMS;
+		} else if (Constant.YMD_HMS_LOCAL.toUpperCase().equals(format.toUpperCase())) {
+			format = Constant.ORACLE_YMD_HMS_LOCAL;
 		} else {
 			format = Constant.ORACLE_YMD;
 		}

+ 3 - 2
src/main/java/com/uas/eis/utils/SqlUtil.java

@@ -31,8 +31,7 @@ public class SqlUtil {
 	public final static String REG_D = "\\d{4}-\\d{2}-\\d{2}";
 	public final static String REG_DT = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}";
 	public final static String REG_TS = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{1}";
-
-
+	public final static String REG_LOCAL_DT =  "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}";
 	public static String getFullTableName(String tabName, String masterCode) {
 		String[] strs = tabName.split("left join ");
 		StringBuffer sb = new StringBuffer();
@@ -118,6 +117,8 @@ public class SqlUtil {
 						sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val));
 					} else if (val.matches(REG_TS)) {
 						sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS, val.substring(0, val.lastIndexOf("."))));
+					}else if(val.matches(REG_LOCAL_DT)){
+						sb2.append(DateUtil.parseDateToOracleString(Constant.YMD_HMS_LOCAL, val));
 					} else if (value.toString().equals("null")) {
 						sb2.append("null");
 					} else if (val.contains("%n")) {

+ 37 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,37 @@
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: oracle.jdbc.OracleDriver
+        username: N_DATACENTER
+        password: select!#%*(
+        url: jdbc:oracle:thin:@10.1.81.208:11537:orcl
+        initialSize: 1
+        maxActive: 3
+        maxWait: 30000
+        testOnBorrow: false
+        testOnReturn: false
+        testWhileIdle: true
+        validationQuery: SELECT 1 FROM DUAL
+        timeBetweenEvictionRunsMillis: 60000
+        removeAbandoned: true
+        removeAbandonedTimeout: 1800
+        minEvictableIdleTimeMillis: 300000
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 3
+server:
+    tomcat:
+        uri_encoding: UTF-8
+    context-path: /eis_aow_api
+    port: 8187
+
+action:
+    api_action: /eis_aow_api/api
+
+seres:
+    clientId : 0000002446-JTTKHON4
+    clientSecret : sidn9fv0GEkLBKR38WfD8YHfh065b46V
+    url : https://dis-api-test.seres.cn
+    clientCode : "0000002446"
+    clientName : 深圳市英唐智慧健康科技有限公司
+    accessKey: C000168331
+    accessSecret: 7sK9pR2dF5zQ8bN4vG1jL6tX0cA3mS7w

+ 37 - 0
src/main/resources/application-prod.yml

@@ -0,0 +1,37 @@
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: oracle.jdbc.OracleDriver
+        username: N_DATACENTER
+        password: select!#%*(
+        url: jdbc:oracle:thin:@127.0.0.1:1521:orcl
+        initialSize: 1
+        maxActive: 3
+        maxWait: 30000
+        testOnBorrow: false
+        testOnReturn: false
+        testWhileIdle: true
+        validationQuery: SELECT 1 FROM DUAL
+        timeBetweenEvictionRunsMillis: 60000
+        removeAbandoned: true
+        removeAbandonedTimeout: 1800
+        minEvictableIdleTimeMillis: 300000
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 3
+server:
+    tomcat:
+        uri_encoding: UTF-8
+    context-path: /eis_aow_api
+    port: 8187
+
+action:
+    api_action: /eis_aow_api/api
+
+seres:
+    clientId : 0000002446-JTTKHON4
+    clientSecret : sidn9fv0GEkLBKR38WfD8YHfh065b46V
+    url : https://dis-api-test.seres.cn
+    clientCode : "0000002446"
+    clientName : 深圳市英唐智慧健康科技有限公司
+    accessKey: C000168331
+    accessSecret: 7sK9pR2dF5zQ8bN4vG1jL6tX0cA3mS7w

+ 2 - 15
src/main/resources/application.yml

@@ -1,10 +1,6 @@
 spring:
-    datasource:
-        type: org.apache.tomcat.jdbc.pool.DataSource
-        driverClassName: oracle.jdbc.OracleDriver
-        username: UAS_DEV
-        password: select!#%*(
-        url: jdbc:oracle:thin:@192.168.253.6:1521:orcl
+    profiles:
+        active: dev
     http:
         encoding:
             force: true
@@ -12,12 +8,3 @@ spring:
             enabled: true
     message:
         encoding: UTF-8
-server:
-    tomcat:
-        uri_encoding: UTF-8
-    context-path:
-        /EIS
-
-action:
-    api_action: /EIS/api
-    public_actions: /EIS/logout,/EIS/hello1

+ 52 - 1
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -1,16 +1,67 @@
 package com.uas.eis;
 
+import com.alibaba.fastjson.JSONObject;
+import com.uas.eis.core.config.SeresConfig;
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.service.SERESService;
+import com.uas.eis.utils.FlexJsonUtil;
+import com.uas.eis.utils.HttpUtil;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @RunWith(SpringRunner.class)
 @SpringBootTest
 public class UasEisApplicationTests {
+	private static final long MAX_TOKEN_VALID_MS = 60L * 60 * 1000;
+
+	@Autowired
+	SERESService seresService;
+	@Autowired
+	private SeresConfig seresConfig;
 
 	@Test
-	public void contextLoads() {
+	public void test() {
+		seresService.getERPStock();
 	}
 
+	@Test
+	public void test1() throws Exception {
+		String tokenUrl = seresConfig.getUrl() + "/aito/DIS/COMM_GET_JWT_TOKEN/1.0.0";
+		String clientId=seresConfig.getClientId();
+		String clientSecret=seresConfig.getClientSecret();
+		System.out.println("clientId:"+clientId);
+		System.out.println("clientSecret:"+clientSecret);
+		long nowMs = System.currentTimeMillis();
+		long expTs = nowMs + MAX_TOKEN_VALID_MS;
+		JSONObject reqBody = new JSONObject();
+		reqBody.put("grant_type", "client_credentials");
+		reqBody.put("client_id", clientId);
+		reqBody.put("client_secret", clientSecret);
+		reqBody.put("exp", expTs);
+		System.out.println("reqBody:"+reqBody.toString());
+		HttpUtil.Response response = HttpUtil.doPost(tokenUrl,reqBody.toString(),false,null);
+	}
+	@Test
+	public void test2() {
+		String gridStore="[{\"SerialNumber\": 1,\"FactoryCode\": \"F001\",\"WarehouseCode\": \"WH001\",\"SupplierCode\": \"SUP001\",\"SupplierName\": \"华域模具\",\"MaterialCode\": \"CMP-AXLE-001\",\"MaterialName\": \"前轴组件\",\"AlertType\": \"LowStock\",\"AlertLevel\": \"High\",\"UpperLimit\": 200.00,\"LowerLimit\": 100.00,\"CurrentValue\": 80.00,\"VarianceQty\": -20.00,\"VariancePercent\": -20.00,\"AlertTime\": \"2025-09-15T10:30:00\",\"Remark\": \"可用库存低于安全库存阈值20%\",\"Attribute1\": \"\",\"Attribute2\": \"\",\"Attribute3\": \"\",\"Attribute4\": \"\",\"Attribute5\": \"\"},{\"SerialNumber\": 2,\"FactoryCode\": \"F002\",\"WarehouseCode\": \"WH003\",\"SupplierCode\": \"SUP002\",\"SupplierName\": \"博世电子\",\"MaterialCode\": \"ELEC-ECU-002\",\"MaterialName\": \"电子控制单元\",\"AlertType\": \"OverStock\",\"AlertLevel\": \"Medium\",\"UpperLimit\": 150.00,\"LowerLimit\": 50.00,\"CurrentValue\": 210.00,\"VarianceQty\": 60.00,\"VariancePercent\": 40.00,\"AlertTime\": \"2025-09-16T14:45:30\",\"Remark\": \"库存超过上限40%,存在积压风险\",\"Attribute1\": \"需求预测下调\",\"Attribute2\": \"\",\"Attribute3\": \"\",\"Attribute4\": \"\",\"Attribute5\": \"\"}]";
+		//grid = BaseUtil.parseGridStoreToMaps(gridStore);
+		/*List<SeresStockAlertInfo> dets= JacksonUtil.fromJsonArray(gridStore);
+		for (SeresStockAlertInfo info : dets) {
+			System.out.println(info.getSerialNumber());
+		}*/
+		System.out.println(seresConfig.getClientCode());
+		/*SpObserver.putSp("AW_ZHJK");
+		seresService.saveAlert(gridStore);*/
+		/*List<Map<String, Object>> dets = FlexJsonUtil.fromJsonArray(gridStore, HashMap.class);
+		for (Map<String, Object> det : dets) {
+			System.out.println(det.get("SerialNumber"));
+		}*/
+	}
 }