瀏覽代碼

【亿道外协厂EID接口修改,支持动态数据源,增加SN物料绑定项设置接口】

xiaost 2 周之前
父節點
當前提交
8ce883c8bc

+ 5 - 5
src/main/java/com/uas/eis/UasEisApplication.java

@@ -1,18 +1,18 @@
 package com.uas.eis;
 
-import com.uas.eis.core.config.DataSourceProperties;
-import com.uas.eis.core.support.TokenPropertiesListener;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-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;
 
+import com.uas.eis.core.config.DynamicDataSourceRegister;
+import com.uas.eis.core.support.TokenPropertiesListener;
+
 @SpringBootApplication
 @EnableCaching
 @EnableScheduling
-/*@Import({DynamicDataSourceRegister.class})*/
-@EnableConfigurationProperties(DataSourceProperties.class)
+@Import({DynamicDataSourceRegister.class})
 public class UasEisApplication {
 	public static void main(String[] args) {
 		SpringApplication application = new SpringApplication(UasEisApplication.class);

+ 43 - 0
src/main/java/com/uas/eis/controller/MESDataController.java

@@ -1,8 +1,13 @@
 package com.uas.eis.controller;
 
+import com.uas.eis.entity.ErrorMessage;
+import com.uas.eis.entity.ProdBindSetRequest;
 import com.uas.eis.sdk.entity.ApiResult;
 import com.uas.eis.sdk.resp.ApiResponse;
 import com.uas.eis.service.MESDataService;
+import com.uas.eis.utils.FlexJsonUtil;
+import com.uas.eis.utils.JacksonUtil;
+import net.sf.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -10,8 +15,14 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.validation.ConstraintViolation;
+import javax.validation.Valid;
+import javax.validation.Validator;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author xiaost
@@ -23,6 +34,8 @@ public class MESDataController {
 
     @Autowired
     private MESDataService mesDataService;
+    @Autowired
+    private Validator validator;
 
     /**
      * 产品SN工序过站记录
@@ -171,4 +184,34 @@ public class MESDataController {
         String requestId = request.getHeader("RequestId");
         return mesDataService.barcode(accessKey,requestId,json);
     }
+
+    /**
+     * @add xiaost 2026-06-01
+     * 设置产品SN强制绑定项
+     * @param rawJson
+     * @return
+     */
+    @RequestMapping(value = "/api/mes/prodBindSet" , method = RequestMethod.POST)
+    public ApiResult<Map<Object,Object>> prodBindSet(HttpServletRequest request,@RequestBody String rawJson){
+        String accessKey = request.getHeader("AccessKey");
+        String requestId = request.getHeader("RequestId");
+        //@RequestBody ProdBindSetRequest reqData
+        // 获取原始的 JSON 字符串(从 HttpServletRequest 的 body 中读取)
+        // 手动解析 JSON 字符串为 ProdBindSetRequest
+        ProdBindSetRequest reqData;
+        try {
+            reqData = FlexJsonUtil.fromJson(rawJson,ProdBindSetRequest.class);
+        } catch (Exception e) {
+            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(),requestId,"传参数据格式错误");
+        }
+        // 手动校验
+        Set<ConstraintViolation<ProdBindSetRequest>> violations = validator.validate(reqData);
+        if (!violations.isEmpty()) {
+            String msg = violations.stream()
+                    .map(ConstraintViolation::getMessage)
+                    .collect(Collectors.joining(";"));
+            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, msg);
+        }
+        return mesDataService.prodBindSet(accessKey,requestId,reqData,rawJson);
+    }
 }

+ 1 - 3
src/main/java/com/uas/eis/core/WebAppConfig.java

@@ -22,8 +22,6 @@ import java.util.List;
 @Configuration
 public class WebAppConfig extends WebMvcConfigurationSupport{
 
-	@Autowired
-	private DataSourceInterceptor dataSourceInterceptor;
 	@Bean
 	public LoginInterceptor loginInterceptor(){
 		return new LoginInterceptor();
@@ -41,7 +39,7 @@ public class WebAppConfig extends WebMvcConfigurationSupport{
 
 	@Override
 	public void addInterceptors(InterceptorRegistry registry){
-		registry.addInterceptor(dataSourceInterceptor).addPathPatterns("/*/**");
+		registry.addInterceptor(new DataSourceInterceptor()).addPathPatterns("/*/**");
 		registry.addInterceptor(apiSignLoginInterceptor()).addPathPatterns("/api/**","/mes/**")
 				.excludePathPatterns("/login", "/erp/**");
 		registry.addInterceptor(mesHelperApiLoginInterceptor()).addPathPatterns("/MES/helper/**");

+ 2 - 19
src/main/java/com/uas/eis/core/support/DataSourceInterceptor.java

@@ -3,34 +3,17 @@ package com.uas.eis.core.support;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import com.uas.eis.core.config.DataSourceProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.bind.RelaxedPropertyResolver;
-import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 
 import com.uas.eis.core.config.SpObserver;
 
-@Component
 public class DataSourceInterceptor implements HandlerInterceptor{
 
-	private final DataSourceProperties dataSourceProperties;
-     @Autowired
-    public DataSourceInterceptor(DataSourceProperties dataSourceProperties) {
-        this.dataSourceProperties = dataSourceProperties;
-    }
-
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 		String master = request.getParameter("master");
-		if(master != null) {
+		if(master != null)
 			SpObserver.putSp(master);
-		}else{
-			String a = dataSourceProperties.getUsername();
-           SpObserver.putSp(a);
-		}
-
 		return true;
 	}
 	

+ 27 - 5
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;
@@ -26,7 +28,7 @@ import com.uas.eis.utils.DateUtil;
 import net.sf.json.JSONObject;
 
 @Repository
-public class BaseDao{
+public class BaseDao  {
 
 	static final String CREATE_SEQ = "CREATE SEQUENCE ?" + // 创建序列
 			" MINVALUE 1 MAXVALUE 99999999999 INCREMENT BY 1 START WITH 3000 CACHE 20 NOORDER NOCYCLE ";
@@ -34,11 +36,16 @@ public class BaseDao{
 	@Autowired
 	private JdbcTemplate jdbcTemplate;
 
+	LobHandler lobHandler = new DefaultLobHandler();
 
 	public JdbcTemplate getJdbcTemplate() {
 		return jdbcTemplate;
 	}
 
+	public void execute(SqlMap sql) {
+		sql.execute(getJdbcTemplate(), lobHandler);
+	}
+
 	public List<Map<String, Object>> queryForList(String sql) {
 		try {
 			return jdbcTemplate.queryForList(sql);
@@ -701,4 +708,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();
+		}
+	}
+
 }

+ 63 - 0
src/main/java/com/uas/eis/entity/ProdBindSetRequest.java

@@ -0,0 +1,63 @@
+package com.uas.eis.entity;
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+@Data
+public class ProdBindSetRequest {
+
+    @NotNull(message = "code不能为空")
+    private String code;
+
+    @NotNull(message = "data不能为空")
+
+    @Valid
+    private DataDTO data;
+
+    // getter/setter 省略
+    @Data
+    public static class DataDTO {
+
+        @NotNull(message = "type不能为空")
+        @Pattern(regexp = "ADD|DEL", message = "type必须是ADD或DEL")
+        private String type;
+
+        @NotNull(message = "ss_mothercode不能为空")
+        private String ss_mothercode;
+
+        // 注意:detail 在 ADD 时必填且元素必填,但注解无法表达“条件必填”,
+        // 所以这里只做基础非空校验(若为空数组则通过 @Size(min=1) 限制)
+       /* @NotNull(message = "detail不能为null")
+        @Size(min = 1, message = "detail至少包含一条记录")
+        @Valid*/
+        private List<DetailDTO> detail;
+
+        // getter/setter 省略
+    }
+
+    @Data
+    public static class DetailDTO {
+
+        private Integer ss_detno;
+
+        @NotNull(message = "ss_prodcode不能为空")
+        private String ss_prodcode;
+
+        @NotNull(message = "ss_prdetail不能为空")
+        private String ss_prdetail;
+
+        // ss_repcodes 可为空,不加校验
+        private String ss_repcodes;
+
+       // @NotNull(message = "ss_stepcode不能为空")
+        private String ss_stepcode;
+
+       // @NotNull(message = "ss_stepname不能为空")
+        private String ss_stepname;
+
+    }
+}

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

@@ -2,16 +2,21 @@ package com.uas.eis.exception;
 
 import com.uas.eis.entity.ErrorMessage;
 import com.uas.eis.sdk.entity.ApiResult;
+import com.uas.eis.sdk.resp.ApiResponse;
 import org.apache.log4j.Logger;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.validation.FieldError;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.stream.Collectors;
 
 
 @ControllerAdvice
@@ -78,4 +83,20 @@ public class ExceptionHandlerAdvice {
 		return map;
 	}
 
+	@ExceptionHandler(MethodArgumentNotValidException.class)
+	public ApiResult<?> handleValidation(MethodArgumentNotValidException e,HttpServletRequest request) {
+		/*String message = e.getBindingResult().getAllErrors().stream()
+				.map(DefaultMessageSourceResolvable::getDefaultMessage)
+				.collect(Collectors.joining(";"));*/
+		// 直接获取字段错误,并提取其默认消息
+		 String message = e.getBindingResult().getFieldErrors().stream()
+				.map(FieldError::getDefaultMessage)
+				.collect(Collectors.joining(";"));
+		return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), request.getHeader("RequestId"), message);
+	}
+
+	@ExceptionHandler(HttpMessageNotReadableException.class)
+	public ApiResult<?> handleJsonParseError() {
+		return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), null, "JSON格式错误");
+	}
 }

+ 3 - 0
src/main/java/com/uas/eis/service/MESDataService.java

@@ -1,5 +1,6 @@
 package com.uas.eis.service;
 
+import com.uas.eis.entity.ProdBindSetRequest;
 import com.uas.eis.sdk.entity.ApiResult;
 
 import java.util.List;
@@ -34,4 +35,6 @@ public interface MESDataService {
 	List<Map<Object,Object>> oqcitemsamples(String accessKey, String requestId, String data);
 
 	ApiResult<Map<Object,Object>> barcode(String accessKey, String requestId, String data);
+
+	ApiResult<Map<Object, Object>> prodBindSet(String accessKey, String requestId, ProdBindSetRequest reqData,String jsonData);
 }

+ 92 - 2
src/main/java/com/uas/eis/serviceImpl/MESDataServiceImpl.java

@@ -3,8 +3,8 @@ package com.uas.eis.serviceImpl;
 import com.uas.eis.core.config.SpObserver;
 import com.uas.eis.dao.BaseDao;
 import com.uas.eis.dao.SqlRowList;
-import com.uas.eis.dto.DataCenter;
 import com.uas.eis.entity.ErrorMessage;
+import com.uas.eis.entity.ProdBindSetRequest;
 import com.uas.eis.exception.ApiSystemException;
 import com.uas.eis.sdk.entity.ApiResult;
 import com.uas.eis.sdk.resp.ApiResponse;
@@ -14,13 +14,14 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Logger;
 
 @Service
 public class MESDataServiceImpl implements MESDataService {
@@ -542,8 +543,96 @@ public class MESDataServiceImpl implements MESDataService {
 			}
 		}
 		return ApiResponse.successRsp("0",requestId,"操作成功");
+	}
+	/**
+	 * @add xiaost 2026-06-01
+	 * 设置产品SN强制绑定项
+	 * @param jsonData
+	 * * .{
+	 *      * ."code": "PRODBINDSET",
+	 *      * ."data":{
+	 *      * .  "type":"ADD",
+	 *      * .  "ss_mothercode":"01.EL0.PR68M06030A",
+	 *      * .  "detail":[{
+	 *      * .   "ss_detno": 1,
+	 *      * .   "ss_prodcode":"01.ER0.60R4J02010A",
+	 *      * .   "ss_prdetail":"主板 PCBA",
+	 *      * .   "ss_repcodes":"",
+	 *      * .   "ss_stepcode":"B_AOIB",
+	 *      * .   "ss_stepname":"AOIB"
+	 *      * .  }]
+	 *      * . }
+	 *      * .}
+	 * @return
+	 */
+	@Override
+	public ApiResult<Map<Object, Object>> prodBindSet(String accessKey, String requestId, ProdBindSetRequest reqData,String jsonData) {
+		String AE_MASTER = checkAccessKey(accessKey, requestId);
+		SpObserver.putSp(AE_MASTER);  //切换数据源
+		//保存传参数据原始JSON串,记录日志
+		savelog("设置产品SN强制绑定项",jsonData,accessKey,requestId);
+		return ApiResponse.successRsp("0",requestId,"操作成功");
+		//执行业务操作
+		//return executeSNBindSet(accessKey,requestId,reqData);
+	}
+
+
+	/*@Transactional
+	public ApiResult<Map<Object, Object>> executeSNBindSet(String accessKey, String requestId, ProdBindSetRequest reqData){
+		String type = reqData.getData().getType();
+		String ss_mothercode = reqData.getData().getSs_mothercode();
+		List<ProdBindSetRequest.DetailDTO> detailList = reqData.getData().getDetail();
+		// 业务规则:ADD 时要求 detail 中每个元素的特定字段已存在(其实已在DTO中校验,此处可省略)
+		// 但如果有更复杂的跨字段规则(例如 ss_detno 必须大于0),可以在这里补充
+		long ss_id = 0;
+		SqlRowList rs = baseDao.queryForRowSet("select * from SNBINDSET where ss_mothercode=?",ss_mothercode);
+		if(rs.next()){
+			ss_id = rs.getGeneralLong("ss_id");
+		}
+		List<String> sql = new ArrayList<>();
+		if ("ADD".equals(type)) { //新增或者修改
+			if(ss_id>0){  //存在则删除
+				baseDao.execute("delete from SNBINDSET where ss_mothercode=?",ss_mothercode);
+			}
+			if (detailList == null || detailList.isEmpty()) {
+				return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, "ADD操作时detail不能为空");
+			}
+			// 2. 批量插入新数据
+			String insertSql = "INSERT INTO snbindset (ss_id,ss_mothercode, ss_detno, ss_prodcode, ss_prdetail," +
+					"  ss_repcodes, ss_stepcode, ss_stepname,ss_indate) " +
+					"VALUES (snbindset_seq.nextval,?, ?, ?, ?, ?, ?, ?,sysdate)";
+			List<Object[]> batchArgs = new ArrayList<>();
+			int i =1;
+			for (ProdBindSetRequest.DetailDTO detail : detailList) {
+				batchArgs.add(new Object[]{
+						ss_mothercode,
+						i,
+						detail.getSs_prodcode(),
+						detail.getSs_prdetail(),
+						detail.getSs_repcodes(),
+						detail.getSs_stepcode(),
+						detail.getSs_stepname()
+				});
+				i++;
+			}
+			baseDao.getJdbcTemplate().batchUpdate(insertSql, batchArgs);
+		} else if ("DEL".equals(type)) {
+			if(ss_id == 0){
+				return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, "错误,当前产品编号:"+ss_mothercode+",未设置绑定项,不需要删除");
+			}else {  //不存在
+				baseDao.execute("delete from SNBINDSET where ss_mothercode=?",ss_mothercode);
+			}
+		}
+		return ApiResponse.successRsp("0",requestId,"操作成功");
+	}*/
 
+	@Transactional(propagation = Propagation.REQUIRES_NEW)
+	public void savelog(String actiontype, String json, String accesskey, String requestId){
+		int id = baseDao.getSeqId("EISAPILOG_SEQ");
+		baseDao.execute("insert into EISAPILOG(EL_ID,EL_ACTIONTYPE,EL_INDATE,EL_EMCODE) values(?,?,sysdate,?)",id,actiontype,accesskey);
+		baseDao.saveClob("EISAPILOG", "EL_DATA", json,"EL_ID=" +id);
 	}
+
 	private String checkAccessKey(String accessKey,String requestId){
 		Object accessSecret_O = baseDao.getFieldDataByCondition("APIEMPLOYEE", "AE_SECRET", "AE_KEY='"+accessKey+"'");
 		Object AE_MASTER = baseDao.getFieldDataByCondition("APIEMPLOYEE", "AE_MASTER", "AE_KEY='"+accessKey+"'");
@@ -559,4 +648,5 @@ public class MESDataServiceImpl implements MESDataService {
 		return AE_MASTER.toString();
 	}
 
+
 }