Browse Source

慧眼EIS--增加工序作业对接接口

xiaost 3 months ago
parent
commit
437aabf23d

+ 7 - 4
src/main/java/com/uas/eis/UasEisApplication.java

@@ -1,23 +1,26 @@
 package com.uas.eis;
 
 import com.uas.eis.core.config.DataSourceProperties;
+import com.uas.eis.core.config.DynamicDataSourceRegister;
 import com.uas.eis.core.support.TokenPropertiesListener;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Import;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
-@SpringBootApplication
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
 @EnableCaching
 @EnableScheduling
-/*@Import({DynamicDataSourceRegister.class})*/
+@Import({DynamicDataSourceRegister.class})
 @EnableConfigurationProperties(DataSourceProperties.class)
 public class UasEisApplication {
 	public static void main(String[] args) {
 		SpringApplication application = new SpringApplication(UasEisApplication.class);
-		//application.addListeners(new TokenPropertiesListener("token.properties"));
-		application.addListeners(new TokenPropertiesListener("api_sign_key_mapping.properties"));
+		application.addListeners(new TokenPropertiesListener("token.properties"));
+		//application.addListeners(new TokenPropertiesListener("api_sign_key_mapping.properties"));
 		application.run(args);
 	}
 	

+ 87 - 0
src/main/java/com/uas/eis/controller/StepWorkController.java

@@ -0,0 +1,87 @@
+package com.uas.eis.controller;
+
+import com.uas.eis.entity.ErrorMessage;
+import com.uas.eis.entity.ErrorMsg;
+import com.uas.eis.entity.StepWork.TestReq;
+import com.uas.eis.exception.ApiStepWorkException;
+import com.uas.eis.exception.SystemException;
+import com.uas.eis.sdk.entity.ApiResult;
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+import com.uas.eis.sdk.resp.ApiResponse;
+import com.uas.eis.sdk.resp.StepWorkApiResponse;
+import com.uas.eis.service.StepWorkService;
+import com.uas.eis.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author xiaost
+ * @date 2025/8/26 17:51
+ * 按照文档:MES工序作业对接接口说明文档 要求编写api 接口请求名字,输入,输出参数
+ **/
+@RestController
+public class StepWorkController {
+   @Autowired
+   private StepWorkService stepWorkService;
+
+    /**
+     * 登录获取token
+     * 租户ID	tenantId	String	是	租户ID
+     * 账号	username	String	是	账号
+     * 密码	password	String	是	md5(password)
+     * @return
+     */
+    @RequestMapping(value="/blade-auth/oauth/token", method = RequestMethod.POST)
+    public StepWorkApiResult<Map<String,Object>> getToken(HttpServletRequest request,String username,String password){
+        Map<String,Object> map = new HashMap<>();
+        if(!StringUtil.hasText(username) || !StringUtil.hasText(password) ){
+            return StepWorkApiResponse.failRsp(400,"用户名和密码必填!");
+        }
+        map.put("accessToken",stepWorkService.login(username, password));
+        map.put("tokenType","bearer");
+        //refresh_token
+        return StepWorkApiResponse.successRsp(map);
+    }
+
+    /**
+     * 成品测试
+     * @param request
+     * @param data
+     * @return
+     */
+    @RequestMapping(value="/mes-product/public/station/center/test", method = RequestMethod.POST)
+    public StepWorkApiResult<Map<String,Object>> test(HttpServletRequest request, @RequestBody String data){
+        if(!StringUtil.hasText(data) || !StringUtil.hasText(data) ){
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.BUSINESS_DATAILLEGAL));
+        }
+        return stepWorkService.test(data);
+    }
+
+    /**
+     * 成品过站
+     * @param request
+     * @param data
+     * {
+     *  "workOrderNo":"WO20220826000002SHD",  //工单号
+     * "stationCode":"GW--001",  //工位编码
+     * "routeCode":"22b443b4fa379a546330f4e984cc6ed1", //工序编号
+     * "sequenceNumber":"[P]2022083426046[B]" //产品SN
+     * }
+     * @return
+     */
+    @RequestMapping(value="/mes-product/public/station/center/over/station", method = RequestMethod.POST)
+    public StepWorkApiResult<Map<String,Object>> station(HttpServletRequest request, @RequestBody String data){
+        if(!StringUtil.hasText(data) || !StringUtil.hasText(data) ){
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.BUSINESS_DATAILLEGAL));
+        }
+        return stepWorkService.station(data);
+    }
+}

+ 9 - 6
src/main/java/com/uas/eis/core/WebAppConfig.java

@@ -1,10 +1,7 @@
 package com.uas.eis.core;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.uas.eis.core.support.ApiSignLoginInterceptor;
-import com.uas.eis.core.support.DataSourceInterceptor;
-import com.uas.eis.core.support.LoginInterceptor;
-import com.uas.eis.core.support.MesHelperApiLoginInterceptor;
+import com.uas.eis.core.support.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -39,12 +36,18 @@ public class WebAppConfig extends WebMvcConfigurationSupport{
 		return new MesHelperApiLoginInterceptor();
 	}
 
+	@Bean
+	public ApiStepWorkInterceptor apiStepWorkInterceptor(){ return new ApiStepWorkInterceptor();}
+
+
 	@Override
 	public void addInterceptors(InterceptorRegistry registry){
 		registry.addInterceptor(dataSourceInterceptor).addPathPatterns("/*/**");
-		registry.addInterceptor(apiSignLoginInterceptor()).addPathPatterns("/api/**","/mes/**")
+		registry.addInterceptor(apiStepWorkInterceptor()).addPathPatterns("/mes-product/public/station/center/**")
+				.excludePathPatterns("/blade-auth/oauth/token");
+		/*registry.addInterceptor(apiSignLoginInterceptor()).addPathPatterns("/api/**","/mes/**")
 				.excludePathPatterns("/login", "/erp/**");
-		registry.addInterceptor(mesHelperApiLoginInterceptor()).addPathPatterns("/MES/helper/**");
+		registry.addInterceptor(mesHelperApiLoginInterceptor()).addPathPatterns("/MES/helper/**");*/
 		//registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/EIS/login");
 	}
 	

+ 89 - 0
src/main/java/com/uas/eis/core/support/ApiStepWorkInterceptor.java

@@ -0,0 +1,89 @@
+package com.uas.eis.core.support;
+
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.dao.BaseDao;
+import com.uas.eis.dao.SqlRowList;
+import com.uas.eis.entity.ErrorMessage;
+import com.uas.eis.entity.ErrorMsg;
+import com.uas.eis.exception.ApiStepWorkException;
+import com.uas.eis.exception.ApiSystemException;
+import com.uas.eis.exception.SystemException;
+import com.uas.eis.sdk.entity.ApiResult;
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+import com.uas.eis.utils.MD5Util;
+import io.jsonwebtoken.Claims;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.util.*;
+
+public class ApiStepWorkInterceptor extends HandlerInterceptorAdapter {
+
+    @Autowired
+    private BaseDao baseDao;
+
+    // 签名超时时长,默认时间为5分钟,ms
+    private static final int SIGN_EXPIRED_TIME = 60 * 60 * 1000;
+    private static final String ACCESS_KEY = "AccessKey";
+    private static final String ACCESS_SECRET = "AccessSecret";
+    private static final String TIMESTAMP_KEY = "Timestamp";
+    private static final String BLADEAUTH = "Blade-Auth";
+    private static final String AUTHORIZATION = "Authorization";
+
+    private static final String AUTHDATA = "Basic c3dvcmQ6c3dvcmRfc2VjcmV0";
+
+
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        Map<String, Object> result = new HashMap<String, Object>();
+        String token = request.getHeader(BLADEAUTH);
+        String Authorization = request.getHeader(AUTHORIZATION);
+        if(!AUTHDATA.equals(Authorization)){
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.AUTHOR_ILLEGAL));
+        }
+        Claims claims =  parseToken(token);
+        String username = (String) claims.get("username");
+        String password = (String) claims.get("password");
+        checkUser(username, password); // 验证用户是否合法
+        return true;
+    }
+
+    private void checkUser(String username, String password) {
+        SqlRowList rs = baseDao.queryForRowSet("select AE_SECRET,AE_MASTER from APIEMPLOYEE where AE_KEY=?",username);
+        if(rs.next()){
+            if(!password.equals(rs.getString("ae_secret"))){
+                throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.ACCESSSECRET_ERROR));
+            }else{
+               SpObserver.putSp(rs.getString("ae_master"));
+            }
+        }else{
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.ACCESSKEY_ERROR));
+        }
+    }
+
+
+    private Claims parseToken(String token) {
+        if(StringUtils.isEmpty(token) || !token.startsWith("bearer")){
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.TOKEN_ILLEGAL));
+        }
+        token = token.substring(7);
+        Claims claims = TokenHandler.parseToken(token);
+        if(claims == null) {
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.INVALID_TOKEN));
+        }
+        Date now = new Date();
+        Date start = claims.getNotBefore();
+        Date end = claims.getExpiration();
+
+        if (now.after(start) && now.before(end)) {
+            return claims;
+        }else {
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.EXPIRED_TOKEN));
+        }
+    }
+
+
+}

+ 5 - 1
src/main/java/com/uas/eis/entity/ErrorMessage.java

@@ -13,6 +13,10 @@ public enum ErrorMessage {
     TIMEOUT_ILLEGAL("1003","请求超时"),
     REQUESTID_ILLEGAL("1004","随机字符串不合法"),
     SIGNATURE_ILLEGAL("1005","签名错误"),
+    AUTHOR_ILLEGAL("1006","授权Authorization错误"),
+    TOKEN_ILLEGAL("1006","缺少令牌token"),
+    INVALID_TOKEN("1007","无效的token,请重新申请token"),
+    EXPIRED_TOKEN("1008","token已过期,请重新申请token"),
     BUSINESS_ILLEGAL("2001","业务异常"),
     BUSINESS_TYPENULL("2002","类型不能为空"),
     BUSINESS_TYPEILLEGAL("2003","类型不在范围内"),
@@ -23,7 +27,7 @@ public enum ErrorMessage {
     private String code;
     private String message;
 
-    ErrorMessage(String  code,String message){
+    ErrorMessage(String code,String message){
         this.code = code;
         this.message = message;
     }

+ 49 - 0
src/main/java/com/uas/eis/exception/ApiStepWorkException.java

@@ -0,0 +1,49 @@
+package com.uas.eis.exception;
+
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+
+/**
+ * 系统程序执行异常
+ * 
+ * @author yingp
+ * 
+ */
+public class ApiStepWorkException extends RuntimeException {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 4218425517031998401L;
+
+	private StepWorkApiResult apiResult;
+
+	public ApiStepWorkException() {
+	}
+
+	public ApiStepWorkException(String paramString) {
+		super(paramString);
+	}
+
+	public ApiStepWorkException(StepWorkApiResult apiResult) {
+		super(apiResult.getMsg());
+		this.apiResult = apiResult;
+	}
+
+	public ApiStepWorkException(StepWorkApiResult apiResult, Throwable paramThrowable) {
+		super(apiResult.getMsg(), paramThrowable);
+		this.apiResult = apiResult;
+	}
+
+	public ApiStepWorkException(Throwable paramThrowable) {
+		super(paramThrowable);
+	}
+
+
+	public StepWorkApiResult getApiResult() {
+		return apiResult;
+	}
+
+	public void setApiResult(StepWorkApiResult apiResult) {
+		this.apiResult = apiResult;
+	}
+}

+ 22 - 0
src/main/java/com/uas/eis/exception/ExceptionHandlerAdvice.java

@@ -2,6 +2,8 @@ package com.uas.eis.exception;
 
 import com.uas.eis.entity.ErrorMessage;
 import com.uas.eis.sdk.entity.ApiResult;
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+import com.uas.eis.sdk.resp.StepWorkApiResponse;
 import org.apache.log4j.Logger;
 import org.springframework.http.HttpStatus;
 import org.springframework.ui.ModelMap;
@@ -78,4 +80,24 @@ public class ExceptionHandlerAdvice {
 		return map;
 	}
 
+
+	/**
+	 * 处理通过工序作业接口抛出的异常
+	 *
+	 * @param ex
+	 * @return
+	 */
+	@ExceptionHandler(ApiStepWorkException.class)
+	@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
+	@ResponseBody
+	public ModelMap handleApiStepWorkError(ApiStepWorkException ex, HttpServletRequest request) {
+		ModelMap map = new ModelMap();
+		StepWorkApiResult apiResult = ex.getApiResult();
+		map.put("success",apiResult.getSuccess());
+		map.put("code", apiResult.getCode());
+		map.put("message", apiResult.getMsg());
+		map.put("data",apiResult.getData());
+		return map;
+	}
+
 }

+ 93 - 0
src/main/java/com/uas/eis/sdk/entity/StepWorkApiResult.java

@@ -0,0 +1,93 @@
+package com.uas.eis.sdk.entity;
+
+import com.uas.eis.entity.ErrorMessage;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class StepWorkApiResult<T> {
+
+    /**
+     * 自定义业务码
+     */
+    private int code;
+
+    /**
+     * 自定义业务提示说明
+     */
+    private String msg;
+
+
+    /**
+     * 自定义返回 数据结果集
+     */
+    private T data;
+
+    private Boolean success;
+
+    public int getCode() {
+        return code;
+    }
+
+    public StepWorkApiResult<T> setCode(int code) {
+        this.code = code;
+        return this;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public StepWorkApiResult<T> setMsg(String msg) {
+        this.msg = msg;
+        return this;
+    }
+    public T getData() {
+        return data;
+    }
+
+    public StepWorkApiResult<T> setData(T data) {
+        this.data = data;
+        return this;
+    }
+
+    public Boolean getSuccess() {
+        return success;
+    }
+
+    public StepWorkApiResult<T> setSuccess(Boolean success) {
+        this.success = success;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return "Result{" +
+                ", code=" + code +
+                ", msg=" + msg +
+                ", data=" + data +
+                ", success=" + success +
+                '}';
+    }
+
+    public StepWorkApiResult(Boolean success,int code, String message, T data){
+        this.success = success;
+        this.code = code;
+        this.msg = message;
+        this.data = data;
+    }
+
+    public StepWorkApiResult(Boolean success,int code, String message){
+        this.success = success;
+        this.code = code;
+        this.msg = message;
+    }
+
+    public StepWorkApiResult(ErrorMessage errorMessage){
+        this.success = false;
+        this.code = 400;
+        this.msg = errorMessage.getMessage();
+    }
+
+}

+ 42 - 0
src/main/java/com/uas/eis/sdk/resp/StepWorkApiResponse.java

@@ -0,0 +1,42 @@
+package com.uas.eis.sdk.resp;
+
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+
+
+/**
+ * @author
+ * @email
+ * @date 2021-12-22 20:00
+ */
+public class StepWorkApiResponse {
+
+    public static <T> StepWorkApiResult<T> successRsp(int code, String msg) {
+        return new StepWorkApiResult<T>().setSuccess(true).setCode(code).setMsg(msg);
+    }
+
+    public static <T> StepWorkApiResult<T> successRsp(int code,T data) {
+        return new StepWorkApiResult<T>().setSuccess(true).setData(data).setCode(code);
+    }
+
+    public static <T> StepWorkApiResult<T> successRsp(int code, String msg,T data) {
+        return new StepWorkApiResult<T>().setSuccess(true).setCode(code).setMsg(msg).setData(data);
+    }
+
+    public static <T> StepWorkApiResult<T> successRsp(T data) {
+        return successRsp(200,data);
+    }
+
+
+    public static <T> StepWorkApiResult<T> failRsp(int code, String msg) {
+        return new StepWorkApiResult<T>().setSuccess(false).setCode(code).setMsg(msg);
+    }
+
+
+    public static <T> StepWorkApiResult<T> failRsp(int code, String msg, T data) {
+        return new StepWorkApiResult<T>().setSuccess(false).setCode(code).setMsg(msg).setData(data);
+    }
+    public static <T> StepWorkApiResult<T> failRsp(T data) {
+        return new StepWorkApiResult<T>().setSuccess(false).setData(data);
+    }
+
+}

+ 14 - 0
src/main/java/com/uas/eis/service/StepWorkService.java

@@ -0,0 +1,14 @@
+package com.uas.eis.service;
+
+import com.uas.eis.entity.StepWork.TestReq;
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+
+import java.util.Map;
+
+public interface StepWorkService {
+    String login(String username, String password);
+
+    StepWorkApiResult<Map<String,Object>> test(String data);
+
+    StepWorkApiResult<Map<String,Object>> station(String data);
+}

+ 365 - 0
src/main/java/com/uas/eis/serviceImpl/StepWorkServiceImpl.java

@@ -0,0 +1,365 @@
+package com.uas.eis.serviceImpl;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.eis.core.support.TokenHandler;
+import com.uas.eis.dao.BaseDao;
+import com.uas.eis.dao.SqlMap;
+import com.uas.eis.dao.SqlRowList;
+import com.uas.eis.entity.ErrorMessage;
+import com.uas.eis.entity.ErrorMsg;
+import com.uas.eis.entity.StepWork.StationReq;
+import com.uas.eis.entity.StepWork.TestReq;
+import com.uas.eis.exception.ApiStepWorkException;
+import com.uas.eis.exception.SystemException;
+import com.uas.eis.sdk.entity.ApiResult;
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+import com.uas.eis.sdk.resp.StepWorkApiResponse;
+import com.uas.eis.service.StepWorkService;
+import com.uas.eis.utils.*;
+import org.aspectj.weaver.ast.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+@Service
+public class StepWorkServiceImpl implements StepWorkService {
+    @Autowired
+    private BaseDao baseDao;
+
+    @Override
+    public String login(String username, String password) {
+        SqlRowList rs = baseDao.queryForRowSet("select AE_SECRET from APIEMPLOYEE where AE_KEY=?",username);
+        if(rs.next()){
+            System.out.println("secret:"+MD5Util.encrypt32Up(rs.getString("ae_secret")));
+          if(!password.equals(MD5Util.encrypt32Up(rs.getString("ae_secret")))){
+              throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.ACCESSSECRET_ERROR));
+          }else{
+              return TokenHandler.createToken(username,rs.getString("ae_secret"));
+          }
+        }else{
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.ACCESSKEY_ERROR));
+        }
+    }
+
+    /**
+     * 保存测试信息并且过站
+     * @param data
+     * @return
+     *  {
+     *  "workOrderNo":"WO20220826000002SHD", //工单号 必填
+     *  "stationCode":"GW--001",  //工位编码 必填
+     * "routeCode":"22b443b4fa379a546330f4e984cc6ed1", //工序编号 必填
+     * "sequenceNumber":"[P]2022083426046[B]",//产品SN 必填
+     * "eventResult":"PASS", 测试结果:PASS(合格),FAIL(不合格) 必填
+     *  failureCode MES不良配置里维护的信息 * 注:PASS可以不用传, 如果是FAIL不良代码就必传 非必填
+     *	extendSequenceNumber 测试合格后会把三方条码和组合体SN组合,后续扫描其中任意条码都可以识别。多个条码中间用逗分隔 非必填
+     * 	machineTestData	设备测试数据 非必填 Json可以传产品多次测试记录。results的键值需要和titles的键值对应Titles中的键值不能重复
+     * 	isInputSn	 是否属于投入产品 非必填 Boolean (true:根据投入SN过站并生成产品数据,false[默认]:从工单中查找是否有过站SN)
+     * }
+     *
+     */
+    @Override
+    public StepWorkApiResult<Map<String,Object>> test(String data) {
+        insertLogger(data,"test");
+        return testmain(data);
+    }
+
+    /**
+     *  * {
+     *      *  "workOrderNo":"WO20220826000002SHD",  //工单号
+     *      * "stationCode":"GW--001",  //工位编码
+     *      * "routeCode":"22b443b4fa379a546330f4e984cc6ed1", //工序编号
+     *      * "sequenceNumber":"[P]2022083426046[B]" //产品SN
+     *      * }
+     * @param data
+     * @return
+     */
+    @Override
+    public StepWorkApiResult<Map<String,Object>> station(String data) {
+        insertLogger(data,"station");
+        return stationmain(data);
+    }
+
+    /**
+     * 工单绑定,工序检测
+     *
+     */
+    private Map<String,Object> checkStep(String macode,String sourcecode,String sncode,String usercode ){
+        List<String> list = new ArrayList<String>();
+        /**
+         *     v_i_macode  in varchar2 ,
+         *     v_i_sourcecode in varchar2,
+         *     v_i_sncode in varchar2,
+         *     v_i_usercode in varchar2,
+         *     v_o_macode out varchar2,
+         *     v_o_msid out int,
+         *     v_o_errmsg out varchar2
+         */
+        list = baseDao.callProcedureWithOut("CS_CHECKSTEPSNANDMACODE", new Object[]{
+                macode, sourcecode,sncode,usercode
+        }, new Integer[]{1, 2, 3, 4}, new Integer[]{5, 6, 7});
+        Map<String,Object> map = new HashMap<>();
+        String msg = list.get(2);
+        if(StringUtil.hasText(msg)){
+            map.put("success",false);
+            map.put("msg",msg);
+        }else{
+            map.put("success",true);
+            map.put("macode",list.get(0));
+        }
+        return map;
+
+    }
+
+    private boolean stepPassed(String iMakeCode, String iSourceCode, String iSN, String iUserCode, String iResult) {
+        String msg = baseDao.callProcedure("CS_SETSTEPRESULT",
+                String.valueOf(iMakeCode),
+                String.valueOf(iSourceCode),
+                String.valueOf(iSN),
+                String.valueOf(iUserCode),
+                String.valueOf(iResult));
+        if(StringUtil.hasText(msg)){
+            throw new ApiStepWorkException(new StepWorkApiResult(false,400,msg));
+        }else{
+            return true;
+        }
+    }
+
+    /**
+     * 保存测试数据并且过站
+     * @param macode
+     * @param sccode
+     * @param sncode
+     * @param isok
+     * @param failureCode
+     * @param machineTestData
+     * "machineTestData":{
+     * "machineCode":"JT001",
+     * "titles":{
+     * "芯片型号":"100",
+     * "开机电流":"200",
+     *"线损补偿":"300",
+     * "输出功率":"400",
+     * "测试时长":"500",
+     * "测试结果":"600"},
+     * "results":[{
+     * "芯片型号":"XXC5121",
+     * "开机电流":"9.438",
+     * "线损补偿":"11.00",
+     * "输出功率":"11.683",
+     * "测试时长":"31.37",
+     * "测试结果":"成功"
+     * }]}
+     */
+    private void saveTestDataAndPassed(String macode, String stepcode,String sccode, String sncode, String isok, String failureCode, Object isinput,Object machineTestData) {
+        //保存测试数据
+        Object machinecode = "";
+        List<Map<Object,Object>> sqldata = new ArrayList<>();
+        int mainid = baseDao.getSeqId("STEPTESTMAIN_SEQ");
+        if(StringUtil.hasText(machineTestData)){
+            Map<Object, Object> map = null;
+            if (machineTestData instanceof Map) {
+                map = (Map<Object, Object>) machineTestData;
+            }else{
+                map = BaseUtil.parseFormStoreToMap(machineTestData.toString());
+            }
+            if(!map.isEmpty()) {
+                int detno=1;
+                machinecode = map.containsKey("machineCode")?map.get("machineCode"):"";
+                Object titles = map.get("titles");
+                Object results = map.get("results");
+                if(StringUtil.hasText(titles) && StringUtil.hasText(results)){
+                   // SD_SN,SD_MAKECODE,SD_MACHINECODE,SD_INDATE,
+                    Map<Object,Object> baseData = new HashMap<>() ;
+                    baseData.put("SD_SN",sncode);
+                    baseData.put("SD_MAKECODE",macode);
+                    baseData.put("SD_MACHINECODE",machinecode);
+                    baseData.put("SD_INDATE",DateUtil.parseDateToString(new Date(), Constant.YMD_HMS));
+                    Map<String,Object> titledata = null;
+                    if (machineTestData instanceof Map) {
+                        titledata = (Map<String, Object>) titles;
+                    }else{
+                        titledata = FlexJsonUtil.fromJson(titles.toString());
+                    }
+                    List<Map<String,Object>> resultdata = null;
+                    if (results instanceof List) {
+                        resultdata = (List<Map<String,Object>>) results;
+                    }else{
+                        resultdata = FlexJsonUtil.fromJsonArray(results.toString(),HashMap.class);
+                    }
+                    for(Map<String,Object> m : resultdata){
+                        Iterator<Map.Entry<String, Object>> iterator = titledata.entrySet().iterator();
+                        baseData.put("SD_DETNO", detno);
+                        detno++;
+                        while (iterator.hasNext()) {
+                            Map.Entry<String, Object> entry = iterator.next();
+                            String key = entry.getKey();
+                            Object value = entry.getValue();
+                            Map<Object,Object> sqlm = new HashMap<>();
+                            sqlm.putAll(baseData);
+                            sqlm.put("SD_CLASS", key);
+                            sqlm.put("SD_LENGTH", value);
+                            sqlm.put("SD_SMID",mainid);
+                            Object v = m.get(key);
+                            sqlm.put("SD_ACTVALUE",v);
+                            sqlm.put("SD_ID",null);
+                            sqldata.add(sqlm);
+                        }
+                    }
+                }
+            }
+        }
+        //测试项和测试结果不一致
+        /**
+         * insert into STEPTESTMAIN(SM_ID,SM_SN,SM_MAKECODE,SM_STEPCODE,SM_SCCODE,SM_RESULT,SM_BADCODE,SM_ISINPUT,SM_INDATE)
+         * insert into STEPTESTDETAIL(SD_ID,SD_SMID,SD_SN,SD_MAKECODE,SD_MACHINECODE,SD_INDATE,SD_CLASS,SD_StandardVALUE,SD_ACTVALUE)
+         */
+        //插入数据
+        baseDao.execute("insert into STEPTESTMAIN(SM_ID,SM_SN,SM_MAKECODE,SM_STEPCODE,SM_SCCODE,SM_RESULT,SM_BADCODE,SM_ISINPUT,SM_INDATE)" +
+                "select ?,?,?,?,?,?,?,?,sysdate from dual ",mainid,sncode,macode,stepcode,sccode,isok,failureCode,isinput);
+        if(sqldata.size()>0){
+            baseDao.execute(SqlUtil.getInsertSqlbyList(sqldata,"STEPTESTDETAIL","SD_ID"));
+        }
+
+        Object msstepcode = baseDao.getFieldDataByCondition("Makeserial", "ms_stepcode", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
+        Object BgCode = baseDao.getFieldDataByCondition("step", "nvl(st_badgroupcode,' ')", "st_code='" + stepcode + "'");
+        Map<Object, Object> rmap = new HashMap<>();
+        if("FAIL".equals(isok)){
+            //将历史的不良记录更新状态
+            baseDao.execute("update makebad set mb_status=-1 where mb_sncode=? and mb_makecode=? and mb_stepcode=? and mb_status=0",sncode,macode);
+            baseDao.execute("insert into makebad(mb_id,mb_makecode,mb_mscode,mb_sncode,mb_inman,mb_indate,mb_stepcode,mb_sourcecode,mb_badcode,mb_badtable,mb_bgcode,mb_soncode,mb_status)" +
+                    " select makebad_seq.nextval,ma_code,ms_code,ms_sncode,'EIS对接',sysdate,?,?,?,'',?,sp_soncode,0 from make left join makeserial on ms_makecode=ma_code left join " +
+                    " stepproduct on sp_mothercode=ma_prodcode and sp_stepcode=ms_nextstepcode where ms_sncode=? and ms_makecode=?",stepcode,sccode,failureCode,BgCode,sncode,macode);
+            //将不良的序列号的状态码设为3
+            //baseDao.execute("update "+Master+".makeserial set ms_status='3' where ms_sncode='" + iSN + "' and ms_makecode='" + iMakeCode + "'");
+        }else if("PASS".equals(isok) && StringUtil.hasText(failureCode)){ //强制良品也有不良代码的
+            baseDao.execute("insert into makebad(mb_id,mb_makecode,mb_mscode,mb_sncode,mb_inman,mb_indate,mb_stepcode,mb_sourcecode,mb_badcode,mb_badtable,mb_bgcode,mb_soncode,mb_status)" +
+                    " select makebad_seq.nextval,ma_code,ms_code,ms_sncode,'EIS对接',sysdate,?,?,?,'',?,sp_soncode,-1 from make left join makeserial on ms_makecode=ma_code left join " +
+                    " stepproduct on  sp_mothercode=ma_prodcode and sp_stepcode=ms_nextstepcode where ms_sncode=? and ms_makecode=?",stepcode,sccode,failureCode,BgCode,sncode,macode);
+        }
+        //不良采集为良品是更新
+        if (msstepcode!=null && msstepcode.toString().equals(stepcode) && isok == "PASS") {
+            Object[] ob = baseDao.getFieldsDataByCondition("makeserial", "ms_status,ms_craftcode,ms_prodcode", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
+            if (ob!=null){
+                String ms_status =ob[0].toString();
+                String ms_craftcode= ob[1].toString();
+                String ms_prodcode = ob[2].toString();
+                if (ms_status == "3") {
+                    String nextstepcode =baseDao.getFieldDataByCondition("craft left join  craftdetail on cr_id=cd_crid ", "cd_nextstepcode", "cr_code='" + ms_craftcode + "' and cr_prodcode='" + ms_prodcode + "' and cd_stepcode='" + stepcode + "'").toString();
+                    baseDao.updateByCondition("makeserial", "ms_status=1,ms_nextstepcode='" + nextstepcode + "'", "ms_sncode='" + sncode + "' and ms_makecode='" + macode + "'");
+                    baseDao.updateByCondition("makebad", "mb_status=-1", "mb_sncode='" + sncode + "' and mb_makecode='" + macode + "'");
+                }
+            }
+        }
+        stepPassed(macode,sccode,sncode,null,"PASS".equals(isok)?"OK":"NG");
+    }
+
+    //记录日志
+    private void insertLogger(String data,String type){
+        baseDao.execute("insert into EISDATA(ed_id,ed_data,ed_indate,ED_TYPE)" +
+                "values(EISDATA_seq.nextval,?,sysdate,?)", data,type);
+    }
+
+    @Transactional
+    public StepWorkApiResult<Map<String,Object>> testmain(String data){
+        Map<Object,Object> map =  BaseUtil.parseFormStoreToMap(data);
+        String macode = " ";
+        if(StringUtil.hasText(map.get("workOrderNo"))){//工单号可填写可不填
+            macode = map.get("workOrderNo").toString();
+        }
+        Object sccode = map.get("stationCode");
+        if(!StringUtil.hasText(sccode)){
+            return StepWorkApiResponse.failRsp(400,"工位编码(stationCode)不能为空!");
+        }
+        Object stepcode = map.get("routeCode");
+        if(!StringUtil.hasText(stepcode)){
+            return StepWorkApiResponse.failRsp(400,"工序编号(routeCode)不能为空!");
+        }
+        Object sncode = map.get("sequenceNumber");
+        if(!StringUtil.hasText(sncode)){
+            return StepWorkApiResponse.failRsp(400,"产品SN(sequenceNumber)不能为空!");
+        }
+        //测试结果
+        Object isok = map.get("eventResult");  //测试结果:PASS(合格),FAIL(不合格) 必填 ,测试强制合格有的时候也会有不良代码
+        Object failureCode =map.get("failureCode");
+        if(!StringUtil.hasText(isok)){
+            return StepWorkApiResponse.failRsp(400,"测试结果(eventResult)不能为空!");
+        }else{
+            if(!"PASS".equals(isok) && !"FAIL".equals(isok)){
+                return StepWorkApiResponse.failRsp(400,"测试结果值【"+isok+"】,只能是PASS或者FAIL!");
+            }
+            if("FAIL".equals(isok) && !StringUtil.hasText(failureCode)){
+                return StepWorkApiResponse.failRsp(400,"测试结果为不合格,不良代码(failureCode)值必填!");
+            }
+        }
+        if(StringUtil.hasText("failureCode")) {
+            String bccode = baseDao.getJdbcTemplate().queryForObject("select max(bc_code) from badcode where bc_code=?", String.class, failureCode);//oErrMessage = "不良代码"+BadCode[i]+"不存在";
+            if (null == bccode) {
+                throw new ApiStepWorkException(new StepWorkApiResult(false, 400, "测试不良代码:" + failureCode + "在MES系统不存在!"));
+            }
+        }
+        //工序校验
+        Map<String,Object> remap =  checkStep(macode,sccode.toString(),sncode.toString(),null);
+        if(Boolean.valueOf(remap.get("success").toString())){
+            //工序保存测试数据并且过站
+            saveTestDataAndPassed(remap.get("macode").toString(),stepcode.toString(),sccode.toString(),sncode.toString(),
+                    isok.toString(),failureCode.toString(),map.get("isinput"),map.get("machineTestData"));
+            return StepWorkApiResponse.successRsp(200,"【"+sncode+"】产品序列号过站成功!");
+        }else{
+            return StepWorkApiResponse.failRsp(400,remap.get("msg").toString());
+        }
+    }
+
+    @Transactional
+    public StepWorkApiResult<Map<String,Object>> stationmain(String data) {
+        Map<Object, Object> map = BaseUtil.parseFormStoreToMap(data);
+        String macode = " ";
+        if (StringUtil.hasText(map.get("workOrderNo"))) {//工单号可填写可不填
+            macode = map.get("workOrderNo").toString();
+        }
+        Object sccode = map.get("stationCode");
+        if (!StringUtil.hasText(sccode)) {
+            return StepWorkApiResponse.failRsp(400, "工位编码(stationCode)不能为空!");
+        }
+        Object stepcode = map.get("routeCode");
+        if (!StringUtil.hasText(stepcode)) {
+            return StepWorkApiResponse.failRsp(400, "工序编号(routeCode)不能为空!");
+        }
+        Object sncode = map.get("sequenceNumber");
+        if (!StringUtil.hasText(sncode)) {
+            return StepWorkApiResponse.failRsp(400, "产品SN(sequenceNumber)不能为空!");
+        }
+        Map<String, Object> remap = checkStep(macode, sccode.toString(), sncode.toString(), null);
+        if (Boolean.valueOf(remap.get("success").toString())) {
+            stepPassed(remap.get("macode").toString(), sccode.toString(), sncode.toString(), null, "OK");
+            return StepWorkApiResponse.successRsp(200, "【" + sncode + "】产品序列号过站成功!");
+        } else {
+            return StepWorkApiResponse.failRsp(400, remap.get("msg").toString());
+        }
+    }
+
+      /* SqlRowList rs=baseDao.queryForRowSet("select nvl(st_ifinput,0)st_ifinput,nvl(st_ifoqc,0)st_ifoqc,nvl(st_ifweigh,0)st_ifweigh from "+Master+".source left join "+Master+".step on sc_stepcode=st_code where sc_code='"+iResCode+"'");
+        if(rs.next()){
+            String st_ifinput=rs.getString("st_ifinput");
+            String st_ifoqc=rs.getString("st_ifinput");
+            String st_ifweigh=rs.getString("st_ifweigh");
+            if(st_ifinput.equals("-1")){
+                oErrMessage = "上料工序必须在客户端进行过站";
+                rmap.put("oErrMessage",oErrMessage);
+                return rmap;
+            }
+            if(st_ifoqc.equals("-1")){
+                oErrMessage = "OQC必须在客户端进行过站";
+                rmap.put("oErrMessage",oErrMessage);
+                return rmap;
+            }
+            if(st_ifweigh.equals("-1")){
+                oErrMessage = "称重工序必须在客户端进行过站";
+                rmap.put("oErrMessage",oErrMessage);
+                return rmap;
+            }
+        }*/
+
+}

+ 3 - 3
src/main/resources/application.yml

@@ -2,9 +2,9 @@ spring:
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: oracle.jdbc.OracleDriver
-        username: YD_CYZZ
+        username: N_MES
         password: select!#%*(
-        url: jdbc:oracle:thin:@192.168.0.85:1521:orcl
+        url: jdbc:oracle:thin:@127.0.0.1:1521:orcl
         initialSize: 1
         maxActive: 3
         maxWait: 30000
@@ -32,7 +32,7 @@ server:
     tomcat:
         uri_encoding: UTF-8
     context-path:
-        /EIS
+        /api
 logging:
   level:
     org:

+ 1 - 1
src/main/resources/token.properties

@@ -1,2 +1,2 @@
 SECURITY_KEY=435aMe9L5itTrckY35kfcOQvPkBGZtGo
-KEEP=86400000
+KEEP=3600000