Browse Source

【慧眼EIS接口,增加接口进行产品个参校验】

xiaost 1 month ago
parent
commit
0a288b15b0

+ 10 - 0
src/main/java/com/uas/eis/annotation/ApiLog.java

@@ -0,0 +1,10 @@
+package com.uas.eis.annotation;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ApiLog {
+    String actionType() default "";  // 可选操作类型
+}

+ 118 - 0
src/main/java/com/uas/eis/aspect/ApiLogAspect.java

@@ -0,0 +1,118 @@
+package com.uas.eis.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.eis.annotation.ApiLog;
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.dao.BaseDao;
+import com.uas.eis.entity.ErrorMessage;
+import com.uas.eis.exception.ApiStepWorkException;
+import com.uas.eis.exception.ApiSystemException;
+import com.uas.eis.sdk.entity.ApiResult;
+import com.uas.eis.sdk.entity.StepWorkApiResult;
+import org.apache.commons.lang.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+
+@Aspect
+@Component
+public class ApiLogAspect {
+
+    @Autowired
+    private BaseDao baseDao;   // 假设您的BaseDao包含执行SQL和保存CLOB的方法
+
+    @Value("${spring.datasource.username}")
+    private String username;
+
+    // 1. 记录请求日志(独立事务)
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public Long saveRequestLog(String actionType, String requestJson, String usercode) {
+        long id = baseDao.getSeqId("EISAPILOG_SEQ");
+        baseDao.execute("INSERT INTO EISAPILOG(EL_ID, EL_ACTIONTYPE, EL_INDATE, EL_EMCODE) VALUES(?, ?, SYSDATE, ?)",
+                id, actionType, usercode);
+        baseDao.saveClob("EISAPILOG", "EL_DATA", requestJson, "EL_ID=" + id);
+        return (long) id;
+    }
+
+    // 2. 更新日志结果(独立事务)
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public void updateLogResult(Long logId, String resultJson,int issuccess) {
+        baseDao.saveClob("EISAPILOG", "EL_RESULT", resultJson, "EL_ID=" + logId);
+        baseDao.execute(
+                "UPDATE EISAPILOG SET EL_ISSUCCESS = ? WHERE EL_ID = ?",
+                issuccess, logId
+        );
+        //issuccess 等于 1 标识成功,0 标识失败
+    }
+
+    // 环绕通知:拦截所有带有 @ApiLog 注解的方法
+    @Around("@annotation(com.uas.eis.annotation.ApiLog)")   // 替换为实际包路径
+    public Object aroundApiLog(ProceedingJoinPoint joinPoint) throws Throwable {
+        // 1. 获取方法参数
+        Object[] args = joinPoint.getArgs();
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        ApiLog apiLog = method.getAnnotation(ApiLog.class);
+        String actionType = apiLog.actionType();
+
+        // 2. 从参数中提取 accessKey, requestId, rawJson(按参数名称或顺序)
+        HttpServletRequest request = null;
+        String rawJson = null;
+        String[] paramNames = signature.getParameterNames();  // 需要编译保留参数名,或使用 Spring 的 LocalVariableTableParameterNameDiscoverer
+        // 这里假设参数顺序固定:(HttpServletRequest request, String data)
+        // 更稳健的方式是根据参数名获取
+        for (int i = 0; i < args.length; i++) {
+            if ("request".equals(paramNames[i])) {
+                request = (HttpServletRequest) args[i];
+            }else if ("data".equals(paramNames[i])) {
+                rawJson = (String) args[i];
+            }
+        }
+        String usercode = request.getSession().getAttribute("usercode").toString();
+        // 4. 记录请求日志,获取日志ID
+        Long logId = saveRequestLog(actionType, rawJson, usercode);
+
+        // 5. 执行业务方法(try-catch 确保异常也记录)
+        Object result = null;
+        String resultJson = null;
+        int issuccess = 0;  // 默认失败
+        try {
+            result = joinPoint.proceed();
+            resultJson = JSON.toJSONString(result);
+            // 判断是否为 ApiResult,且 code == "0"
+            if (result instanceof ApiResult) {
+                StepWorkApiResult<?> apiResult = (StepWorkApiResult<?>) result;
+                if (apiResult.getSuccess()) {
+                    issuccess = 1;
+                }
+            } else {
+                // 非 ApiResult 类型,可根据业务定义(默认视为成功?此处可自定义)
+                issuccess = 0;  // 或记录为 UNKNOWN,按需处理
+            }
+            return result;
+        } catch (ApiStepWorkException e) {
+            // 自定义业务异常,包含错误信息
+            StepWorkApiResult<?> errorResult = e.getApiResult(); // 假设异常中携带ApiResult
+            resultJson = JSON.toJSONString(errorResult);
+            issuccess = 0;
+            throw e;  // 继续抛出,由全局异常处理器处理
+        } catch (Throwable e) {
+            // 其他异常
+            resultJson = "异常: " + e.getMessage();
+            issuccess = 0;
+            throw e;
+        } finally {
+            // 6. 更新日志(结果和状态)
+            updateLogResult(logId, resultJson, issuccess);
+        }
+    }
+}

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

@@ -123,4 +123,20 @@ public class StepWorkController {
         data = JSONUtil.decodeUnicode(data.replace("%", "\\"));
         return stepWorkService.UploadThruputLog(request,data);
     }
+
+
+    /**
+     * 产品个参校验防呆
+     * @param request
+     * @param data
+     * @return
+     */
+    @RequestMapping(value="/mes-product/public/station/center/checkProdParam", method = RequestMethod.POST)
+    public StepWorkApiResult<Map<String,Object>> checkProdParam(HttpServletRequest request, @RequestBody String data){
+        if(!StringUtil.hasText(data) || !StringUtil.hasText(data) ){
+            throw new ApiStepWorkException(new StepWorkApiResult(ErrorMessage.BUSINESS_DATAILLEGAL));
+        }
+        data = JSONUtil.decodeUnicode(data.replace("%", "\\"));
+        return stepWorkService.checkProdParam(request,data);
+    }
 }

+ 23 - 4
src/main/java/com/uas/eis/dao/BaseDao.java

@@ -1,9 +1,6 @@
 package com.uas.eis.dao;
 
-import java.sql.CallableStatement;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Timestamp;
+import java.sql.*;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
@@ -18,6 +15,11 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.CallableStatementCallback;
 import org.springframework.jdbc.core.CallableStatementCreator;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback;
+import org.springframework.jdbc.core.support.JdbcDaoSupport;
+import org.springframework.jdbc.support.lob.DefaultLobHandler;
+import org.springframework.jdbc.support.lob.LobCreator;
+import org.springframework.jdbc.support.lob.LobHandler;
 import org.springframework.stereotype.Repository;
 
 import com.uas.eis.utils.BaseUtil;
@@ -34,6 +36,7 @@ public class BaseDao{
 	@Autowired
 	private JdbcTemplate jdbcTemplate;
 
+	LobHandler lobHandler = new DefaultLobHandler();
 
 	public JdbcTemplate getJdbcTemplate() {
 		return jdbcTemplate;
@@ -120,6 +123,7 @@ public class BaseDao{
 			jdbcTemplate.update(sql, objs);
 			return true;
 		} catch (Exception e) {
+			BaseUtil.showError(e.getMessage());
 			return false;
 		}
 	}
@@ -701,4 +705,19 @@ public class BaseDao{
 		return 0;
 	}
 
+	public void saveClob(final String tabName, final String clobField, final String clobStr, final String condition) {
+		try {
+			StringBuffer sb = new StringBuffer("update ").append(tabName).append(" set ").append(clobField).append("=? where ")
+					.append(condition);
+			getJdbcTemplate().execute(sb.toString(), new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
+				@Override
+				protected void setValues(PreparedStatement ps, LobCreator lob) throws SQLException, DataAccessException {
+					lob.setClobAsString(ps, 1, clobStr);
+				}
+			});
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
 }

+ 6 - 1
src/main/java/com/uas/eis/sdk/resp/StepWorkApiResponse.java

@@ -35,8 +35,13 @@ public class StepWorkApiResponse {
     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);
+        return new StepWorkApiResult<T>().setSuccess(false).setData(data).setCode(400);
+    }
+
+    public static <T> StepWorkApiResult<T> failRsp(String msg) {
+        return new StepWorkApiResult<T>().setSuccess(false).setCode(400).setMsg(msg);
     }
 
 }

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

@@ -14,4 +14,6 @@ public interface StepWorkService {
     StepWorkApiResult<Map<String,Object>> station(HttpServletRequest request,String data);
 
     StepWorkApiResult<Map<String,Object>> UploadThruputLog(HttpServletRequest request,String data);
+
+    StepWorkApiResult<Map<String, Object>> checkProdParam(HttpServletRequest request, String data);
 }

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

@@ -1,6 +1,7 @@
 package com.uas.eis.serviceImpl;
 
 import com.alibaba.fastjson.JSON;
+import com.uas.eis.annotation.ApiLog;
 import com.uas.eis.core.support.TokenHandler;
 import com.uas.eis.dao.BaseDao;
 import com.uas.eis.dao.SqlMap;
@@ -161,6 +162,119 @@ public class StepWorkServiceImpl implements StepWorkService {
         return new StepWorkApiResult(true,200,"上传MES测试信息成功");
     }
 
+    /**
+     *
+     * @param request
+     * @param data
+     *  数据格式
+     * {
+     * "SN":"序列号",    //必填
+     * "DeviceType":"",  //必填
+     * "MacStart":"",
+     * "MacEnd":"",
+     * "WholeDeviceCode":"",
+     * "CameraID":"",
+     * "ExtCode":"",
+     * "EncryKey":"",
+     * "RSANORM":""
+     *  }
+     * @return
+     */
+    @ApiLog(actionType = "产品SN个参校对成功")
+    @Transactional
+    @Override
+    public StepWorkApiResult<Map<String, Object>> checkProdParam(HttpServletRequest request, String data) {
+        //解析data 获取数据
+         Map<Object,Object> map =  BaseUtil.parseFormStoreToMap(data);
+         Object sn = map.get("SN");
+         if(!StringUtil.hasText(sn)){
+            return StepWorkApiResponse.failRsp("传参:SN,异常不能为空!");
+         }
+        Object prodcode = map.get("DeviceType");
+        if(!StringUtil.hasText(prodcode)){
+            return StepWorkApiResponse.failRsp("传参:DeviceType,异常不能为空!");
+        }
+        // 判断产品是否有设置个参字段
+        String paramCodes = null;
+        SqlRowList rsParam = baseDao.queryForRowSet(
+                "select wm_concat(pp_paramcode) as paramcodes " +
+                        " from (select distinct pp_paramcode from product left join prodparam on pr_id=pp_prid " +
+                        " where pr_code=? and pp_id>0 and pp_paramcode is not null)", prodcode);
+        if (rsParam.next()) {
+            paramCodes = rsParam.getGeneralString("paramcodes");
+        }
+        if (!StringUtil.hasText(paramCodes)) {
+            return StepWorkApiResponse.failRsp("产品[" + prodcode + "]未配置个参字段,无法校对!");
+        }
+
+        //根据产品编号+sn号,寻找工作中心是组装的工单
+        String macode = "";
+        SqlRowList rs = baseDao.queryForRowSet("select ma_code from makeserial left join make on ma_code=ms_makecode where ms_sncode=? and ma_prodcode=? and ma_wccode='103'",sn,prodcode);
+        if(rs.next()){
+            macode = rs.getGeneralString("ma_code");
+        }else{
+            return StepWorkApiResponse.failRsp("(SN:"+sn+"和DeviceType:"+prodcode+"),未找到工作中心是组装的工单!");
+        }
+
+        // 解析配置字段列表
+        Set<String> configFields = new HashSet<>();
+        for (String field : paramCodes.split(",")) {
+            configFields.add(field.trim().toUpperCase());
+        }
+
+        // 提取传入参数(除 SN 外),key 转大写
+        Map<String, Object> inputMap = new HashMap<>();
+        for (Map.Entry<Object, Object> entry : map.entrySet()) {
+            String key = entry.getKey().toString();
+            if (!"SN".equalsIgnoreCase(key) && !"DEVICETYPE".equalsIgnoreCase(key)) {
+                inputMap.put(key.toUpperCase(), entry.getValue());
+            }
+        }
+
+        // 1. 校验字段一致性:传入字段必须在配置列表中,配置字段必须全部传入且非空
+        Set<String> inputFields = inputMap.keySet();
+        for (String field : inputFields) {
+            if (!configFields.contains(field)) {
+                return StepWorkApiResponse.failRsp("传入个参字段[" + field + "]不在产品个参配置中!");
+            }
+        }
+        for (String field : configFields) {
+            Object value = inputMap.get(field);
+            if (value == null || !StringUtil.hasText(value.toString())) {
+                return StepWorkApiResponse.failRsp("产品个参设置字段[" + field + "]传入值为空,必须提供!");
+            }
+        }
+        // 2. 动态构建查询条件,检查 PRODPARAMDATA 中是否存在一条记录与传入数据完全匹配
+        StringBuilder sqlWhere = new StringBuilder(" where DeviceType=? and pd_makecode=? ");
+        List<Object> params = new ArrayList<>();
+        params.add(prodcode);
+        params.add(macode);
+
+         // 将配置的所有字段作为等值条件加入查询
+        for (String field : configFields) {
+            Object val = inputMap.get(field);
+            // 传入值必非空(已校验),直接做等值匹配
+            sqlWhere.append(" and ").append(field).append("=? ");
+            params.add(val.toString());
+        }
+
+        String sql = "select max(pd_id) from PRODPARAMDATA " + sqlWhere.toString();
+        int pd_id = baseDao.getJdbcTemplate().queryForObject(sql,Integer.class, params.toArray()); // 根据实际 DAO 调整方法名
+        if (pd_id > 0) {
+            baseDao.execute("update PRODPARAMDATA set pd_checkcount=nvl(pd_checkcount,0)+1 where pd_id=?",pd_id);
+        }else{
+            return StepWorkApiResponse.failRsp("工单[" + macode + "]+产品["+prodcode+"]中无任何个参数据与传入数据匹配!");
+        }
+       // ========== 所有校验通过,写入日志 ==========
+        long id = baseDao.getSeqId("PRODPARAMCHECKLOGGER_SEQ"); // 请确认序列名
+        String inman = request.getSession().getAttribute("usercode").toString(); // 从 request 或 session 获取操作人,示例留空
+        String sqlLog = "insert into prodparamchecklogger(pl_id, pl_indate, pl_inman, pl_sncode, pl_makecode, pl_prodcode) " +
+                "values(?, sysdate, ?, ?, ?, ?)";
+        baseDao.execute(sqlLog,id, inman,sn,macode,prodcode);
+        baseDao.saveClob("prodparamchecklogger", "PL_INDATA",data, "pl_id=" + id);
+        return new StepWorkApiResult(true,200,"SN:"+sn+",个参校对成功!");
+    }
+
     /**
      * 工单绑定,工序检测
      *