Explorar el Código

【亿道外协厂EIS增加接口:SN序列号测试LOG采集信息】

xiaost hace 2 semanas
padre
commit
01370fcab3

+ 31 - 4
src/main/java/com/uas/eis/controller/MESDataController.java

@@ -2,12 +2,11 @@ package com.uas.eis.controller;
 
 import com.uas.eis.entity.ErrorMessage;
 import com.uas.eis.entity.ProdBindSetRequest;
+import com.uas.eis.entity.SNBindInfoRequest;
 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;
@@ -16,9 +15,7 @@ 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;
@@ -209,9 +206,39 @@ public class MESDataController {
         if (!violations.isEmpty()) {
             String msg = violations.stream()
                     .map(ConstraintViolation::getMessage)
+                    .distinct()  // 按消息内容去重
                     .collect(Collectors.joining(";"));
             return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, msg);
         }
         return mesDataService.prodBindSet(accessKey,requestId,reqData,rawJson);
     }
+
+
+    /**
+     * @add xiaost 2026-06-03
+     * SN序列号测试LOG采集信息
+     * @param rawJson
+     * @return
+     */
+    @RequestMapping(value = "/api/mes/SNBindInfo" , method = RequestMethod.POST)
+    public ApiResult<Map<Object,Object>> SNBindInfo(HttpServletRequest request,@RequestBody String rawJson){
+        String accessKey = request.getHeader("AccessKey");
+        String requestId = request.getHeader("RequestId");
+        SNBindInfoRequest reqData;
+        try {
+            reqData = FlexJsonUtil.fromJson(rawJson, SNBindInfoRequest.class);
+        } catch (Exception e) {
+            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(),requestId,"传参数据格式错误");
+        }
+        // 手动校验
+        Set<ConstraintViolation<SNBindInfoRequest>> violations = validator.validate(reqData);
+        if (!violations.isEmpty()) {
+            String msg = violations.stream()
+                    .map(ConstraintViolation::getMessage)
+                    .distinct()  // 按消息内容去重
+                    .collect(Collectors.joining(";"));
+            return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, msg);
+        }
+        return mesDataService.SNBindInfo(accessKey,requestId,reqData,rawJson);
+    }
 }

+ 4 - 3
src/main/java/com/uas/eis/entity/ProdBindSetRequest.java

@@ -1,10 +1,11 @@
 package com.uas.eis.entity;
+
 import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
 
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
-import javax.validation.constraints.Size;
 import java.util.List;
 
 @Data
@@ -44,10 +45,10 @@ public class ProdBindSetRequest {
 
         private Integer ss_detno;
 
-        @NotNull(message = "ss_prodcode不能为空")
+        @NotBlank(message = "ss_prodcode不能为空")
         private String ss_prodcode;
 
-        @NotNull(message = "ss_prdetail不能为空")
+        @NotBlank(message = "ss_prdetail不能为空")
         private String ss_prdetail;
 
         // ss_repcodes 可为空,不加校验

+ 66 - 0
src/main/java/com/uas/eis/entity/SNBindInfoRequest.java

@@ -0,0 +1,66 @@
+package com.uas.eis.entity;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+@Data
+public class SNBindInfoRequest {
+
+    @NotBlank(message = "code不能为空")
+    private String code;
+
+    @NotNull(message = "data不能为空")
+    @Valid
+    private DataDTO data;
+
+    // getter/setter 省略
+    @Data
+    public static class DataDTO {
+        // (若为空数组则通过 @Size(min=1) 限制)
+        @NotNull(message = "detail不能为空或者null")
+        @Size(min = 1, max = 1000, message = "detail至少包含1条记录,最多不超过1000条")
+        @Valid
+        private List<DetailDTO> detail;
+        // getter/setter 省略
+    }
+
+    @Data
+    public static class DetailDTO {
+
+        @NotBlank(message = "si_sncode不能为空")
+        private String si_sncode;
+
+        @NotBlank(message = "si_prodcode不能为空")
+        private String si_prodcode;
+
+        @NotBlank(message = "si_macode不能为空")
+        private String si_macode;
+
+        @NotBlank(message = "si_cpu不能为空")
+        private String si_cpu;
+
+        @NotBlank(message = "si_wifi不能为空")
+        private String si_wifi;
+
+        @NotBlank(message = "si_bt不能为空")
+        private String si_bt;
+
+        @NotBlank(message = "si_uuid不能为空")
+        private String si_uuid;
+
+        @NotBlank(message = "si_bios不能为空")
+        private String si_bios;
+
+        @NotBlank(message = "si_os不能为空")
+        private String si_os;
+
+        @NotBlank(message = "si_ec不能为空")
+        private String si_ec;
+
+        private String si_dp;
+    }
+}

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

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

+ 93 - 6
src/main/java/com/uas/eis/serviceImpl/MESDataServiceImpl.java

@@ -5,6 +5,7 @@ import com.uas.eis.dao.BaseDao;
 import com.uas.eis.dao.SqlRowList;
 import com.uas.eis.entity.ErrorMessage;
 import com.uas.eis.entity.ProdBindSetRequest;
+import com.uas.eis.entity.SNBindInfoRequest;
 import com.uas.eis.exception.ApiSystemException;
 import com.uas.eis.sdk.entity.ApiResult;
 import com.uas.eis.sdk.resp.ApiResponse;
@@ -18,10 +19,8 @@ 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.*;
+import java.util.stream.Collectors;
 
 @Service
 public class MESDataServiceImpl implements MESDataService {
@@ -575,6 +574,95 @@ public class MESDataServiceImpl implements MESDataService {
 		return executeSNBindSet(accessKey,requestId,reqData);
 	}
 
+	/**
+	 * @add xiaost 2026-06-03
+	 * SN序列号测试LOG采集信息
+	 * @param rawJson
+	 * .{
+	 * ."code": "SNBINDINFO",
+	 * ."data":{
+	 * ."detail": [{
+	 * . "si_sncode":"W20211230029A1" ,
+	 * . "si_prodcode": "01.ER0.60R4J02010A",
+	 * . "si_macode":"MA2026052801-1",
+	 * . "si_cpu":"CPU",
+	 * . "si_wifi":"WIFI",
+	 * . "si_bt":"BT",
+	 * . "si_uuid":"UUID",
+	 * . "si_bios":"BIOS",
+	 * . "si_os":"OS",
+	 * . "si_ec":"EC",
+	 * . "si_dp":"DP"
+	 * .}]
+	 * .}
+	 * .}
+	 * @return
+	 */
+	@Override
+	public ApiResult<Map<Object, Object>> SNBindInfo(String accessKey, String requestId, SNBindInfoRequest reqData, String rawJson) {
+		String AE_MASTER = checkAccessKey(accessKey, requestId);
+		SpObserver.putSp(AE_MASTER);  //切换数据源
+		//保存传参数据原始JSON串,记录日志
+		savelog("SN序列号测试LOG采集信息",rawJson,accessKey,requestId);
+		//执行业务操作
+		return executeSNBindInfo(accessKey,requestId,reqData);
+	}
+
+	@Transactional
+	public ApiResult<Map<Object, Object>> executeSNBindInfo(String accessKey, String requestId, SNBindInfoRequest reqData) {
+		List<SNBindInfoRequest.DetailDTO> detailList =  reqData.getData().getDetail();
+		// 1. sncode(去重,避免重复处理)
+		List<String> sncodeList = detailList.stream()
+				.map(SNBindInfoRequest.DetailDTO::getSi_sncode)
+				.distinct()
+				.collect(Collectors.toList());
+		// 2. 批量查询已存在的记录(返回 sncode 和 si_id)
+		String selectSql = "SELECT si_id,si_sncode FROM SNBIND_INFO WHERE si_sncode IN (%s)";
+		String inSql = String.join(",", Collections.nCopies(sncodeList.size(), "?"));
+		String fullSelectSql = String.format(selectSql, inSql);
+		List<Map<String, Object>> existList = baseDao.getJdbcTemplate().queryForList(fullSelectSql, sncodeList.toArray());
+		// 3. 如果存在旧记录,则批量插入历史表
+		if (!existList.isEmpty()) {
+			String insertHisSql = "INSERT INTO SNBIND_INFO_HIS (SI_ID,SI_SNCODE,SI_PRODCODE,SI_MACODE," +
+					"SI_CPU,SI_WIFI,SI_BT,SI_UUID,SI_BIOS,SI_OS,SI_EC,SI_DP,SI_INDATE,SIH_INDATE) " +
+					"SELECT SI_ID,SI_SNCODE,SI_PRODCODE,SI_MACODE,SI_CPU,SI_WIFI,SI_BT," +
+					"SI_UUID,SI_BIOS,SI_OS,SI_EC,SI_DP,SI_INDATE,SYSDATE FROM SNBIND_INFO WHERE si_sncode IN (%s)";
+			String inClause = String.join(",", Collections.nCopies(existList.size(), "?"));
+			String fullInsertHisSql = String.format(insertHisSql, inClause);
+			// 提取已存在的 sncode 列表作为条件参数
+			List<String> existSncodes = existList.stream()
+					.map(m -> (String) m.get("si_sncode"))
+					.collect(Collectors.toList());
+			baseDao.execute(fullInsertHisSql, existSncodes.toArray());
+			// 4. 批量删除原表中这些 sncode 的记录
+			String deleteSql = "DELETE FROM SNBIND_INFO WHERE si_sncode IN (%s)";
+			String fullDeleteSql = String.format(deleteSql, inClause);
+			baseDao.execute(fullDeleteSql, existSncodes.toArray());
+		}
+		// 5. 批量插入新数据
+		String insertSql = "INSERT INTO SNBIND_INFO (SI_ID,SI_SNCODE,SI_PRODCODE,SI_MACODE,SI_CPU,SI_WIFI,SI_BT," +
+				" SI_UUID,SI_BIOS,SI_OS,SI_EC,SI_DP,SI_INDATE) " +
+				"VALUES (snbind_info_seq.nextval,?, ?, ?, ?, ?, ?, ?,?,?,?,?,sysdate)";
+		List<Object[]> batchArgs = new ArrayList<>();
+		for (SNBindInfoRequest.DetailDTO detail : detailList) {
+			batchArgs.add(new Object[]{
+					detail.getSi_sncode(),
+					detail.getSi_prodcode(),
+					detail.getSi_macode(),
+					detail.getSi_cpu(),
+					detail.getSi_wifi(),
+					detail.getSi_bt(),
+					detail.getSi_uuid(),
+					detail.getSi_bios(),
+					detail.getSi_os(),
+					detail.getSi_ec(),
+					detail.getSi_dp()
+			});
+		}
+		baseDao.getJdbcTemplate().batchUpdate(insertSql, batchArgs);
+		return ApiResponse.successRsp("0",requestId,"操作成功");
+	}
+
 
 	@Transactional
 	public ApiResult<Map<Object, Object>> executeSNBindSet(String accessKey, String requestId, ProdBindSetRequest reqData){
@@ -588,8 +676,7 @@ public class MESDataServiceImpl implements MESDataService {
 		if(rs.next()){
 			ss_id = rs.getGeneralLong("ss_id");
 		}
-		List<String> sql = new ArrayList<>();
-		if ("ADD".equals(type)) { //新增或者修改
+        if ("ADD".equals(type)) { //新增或者修改
 			if(ss_id>0){  //存在则删除
 				baseDao.execute("delete from SNBINDSET where ss_mothercode=?",ss_mothercode);
 			}