Browse Source

【亿道外协厂EIS 增加接口支持外协厂删除绑定的info数据和物料数据】

xiaost 1 week ago
parent
commit
91936fe06a

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

@@ -236,4 +236,18 @@ public class MESDataController {
         String requestId = request.getHeader("RequestId");
         return mesDataService.checkSNBind(accessKey,requestId,rawJson);
     }
+
+    /**
+     * @add xiaost 2026-08-20
+     * 删除SN绑定采集数据
+     * @param request
+     * @param rawJson
+     * @return
+     */
+    @RequestMapping(value = "/api/mes/SNBindDel" , method = RequestMethod.POST)
+    public ApiResult<String> SNBindDel(HttpServletRequest request,@RequestBody String rawJson){
+        String accessKey = request.getHeader("AccessKey");
+        String requestId = request.getHeader("RequestId");
+        return mesDataService.SNBindDel(accessKey,requestId,rawJson);
+    }
 }

+ 49 - 0
src/main/java/com/uas/eis/entity/SNBindDelRequest.java

@@ -0,0 +1,49 @@
+package com.uas.eis.entity;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+import javax.validation.Valid;
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+@Data
+public class SNBindDelRequest {
+
+    @NotBlank(message = "code不能为空")
+    private String code;
+
+    @NotNull(message = "data不能为空")
+    @Valid
+    private DataDTO data;
+
+    @Data
+    public static class DataDTO {
+        @NotBlank(message = "type不能为空")
+        @Pattern(regexp = "INFO|MATERIAL|ALL", message = "type必须是INFO、MATERIAL或者ALL")
+        private String type;  //INFO、MATERIAL、ALL
+
+
+        // (若为空数组则通过 @Size(min=1) 限制)
+        @NotNull(message = "detail不能为空或者null")
+        @Size(min = 1, max = 1000, message = "detail至少包含1条记录,最多不超过1000条")
+        @Valid
+        private List<DetailDTO> detail;
+
+    }
+
+    @Data
+    public static class DetailDTO {
+        @NotBlank(message = "sncode不能为空")
+        private String sncode;
+
+        @NotBlank(message = "maprodcode产品编号不能为空")
+        private String maprodcode;
+
+        @NotBlank(message = "macode亿道工单号不能为空")
+        private String macode;
+
+    }
+}

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

@@ -45,4 +45,6 @@ public interface MESDataService {
 	ApiResult<Map<Object, Object>> SNBindMaterial(String accessKey, String requestId, String rawJson);
 
 	ApiResult<Map<Object, Object>> checkSNBind(String accessKey, String requestId, String rawJson);
+
+    ApiResult<String> SNBindDel(String accessKey, String requestId, String rawJson);
 }

+ 121 - 4
src/main/java/com/uas/eis/serviceImpl/MESDataServiceImpl.java

@@ -4,10 +4,7 @@ import com.uas.eis.annotation.ApiLog;
 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.ProdBindSetRequest;
-import com.uas.eis.entity.SNBindInfoRequest;
-import com.uas.eis.entity.SNBindMaterialRequest;
+import com.uas.eis.entity.*;
 import com.uas.eis.exception.ApiSystemException;
 import com.uas.eis.sdk.entity.ApiResult;
 import com.uas.eis.sdk.resp.ApiResponse;
@@ -709,6 +706,126 @@ public class MESDataServiceImpl implements MESDataService {
 		}
 	}
 
+	@ApiLog(actionType = "删除SN绑定采集数据")
+	@Override
+	public ApiResult<String> SNBindDel(String accessKey, String requestId, String rawJson) {
+		String AE_MASTER = checkAccessKey(accessKey, requestId);
+		SpObserver.putSp(AE_MASTER);  //切换数据源
+		SNBindDelRequest reqData = SNBindDelCheck(requestId,rawJson);
+		//执行业务操作
+		return executeSNBindDel(accessKey,requestId,reqData);
+	}
+
+	@Transactional
+	public ApiResult<String> executeSNBindDel(String accessKey, String requestId, SNBindDelRequest reqData) {
+		String type = reqData.getData().getType();
+		List<SNBindDelRequest.DetailDTO> detailList = reqData.getData().getDetail();
+
+		// 1. 去重检查
+		Set<String> snSet = new HashSet<>();
+		List<String> duplicates = detailList.stream()
+				.map(SNBindDelRequest.DetailDTO::getSncode)
+				.filter(s -> !snSet.add(s))
+				.collect(Collectors.toList());
+		if (!duplicates.isEmpty()) {
+			return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId,
+					"本次传参存在重复的sncode: " + String.join(", ", duplicates));
+		}
+
+		List<String> sncodes = new ArrayList<>(snSet);
+		boolean needInfo = "INFO".equals(type) || "ALL".equals(type);
+		boolean needMaterial = "MATERIAL".equals(type) || "ALL".equals(type);
+
+		// 2. 批量查询已存在的sncode(分别查两张表)
+		String placeholders = String.join(",", Collections.nCopies(sncodes.size(), "?"));
+		Set<String> existInfo = new HashSet<>();
+		Set<String> existMaterial = new HashSet<>();
+
+		if (needInfo) {
+			String queryInfoSql = "SELECT SI_SNCODE FROM SNBIND_INFO WHERE SI_SNCODE IN (" + placeholders + ")";
+			existInfo = new HashSet<>(baseDao.getJdbcTemplate().queryForList(queryInfoSql, String.class, sncodes.toArray()));
+		}
+		if (needMaterial) {
+			String queryMatSql = "SELECT SM_SNCODE FROM SNBINDMATERIAL WHERE SM_SNCODE IN (" + placeholders + ")";
+			existMaterial = new HashSet<>(baseDao.getJdbcTemplate().queryForList(queryMatSql, String.class, sncodes.toArray()));
+		}
+
+		// 3. 生成消息(根据类型组合)
+		List<String> resData = new ArrayList<>();
+		for (String sn : sncodes) {
+			boolean hasInfo = existInfo.contains(sn);
+			boolean hasMat = existMaterial.contains(sn);
+
+			if (needInfo && needMaterial) { // ALL
+				if (!hasInfo && !hasMat) {
+					resData.add("sncode:" + sn + ",未绑定测试LOG采集信息和物料信息!");
+				} else if (!hasInfo) {
+					resData.add("sncode:" + sn + ",未绑定测试LOG采集信息!");
+				} else if (!hasMat) {
+					resData.add("sncode:" + sn + ",未绑定物料信息!");
+				}
+			} else if (needInfo) { // INFO
+				if (!hasInfo) {
+					resData.add("sncode:" + sn + ",未绑定测试LOG采集信息!");
+				}
+			} else if (needMaterial) { // MATERIAL
+				if (!hasMat) {
+					resData.add("sncode:" + sn + ",未绑定物料信息!");
+				}
+			}
+		}
+
+		// 4. 执行迁移操作(插入历史 + 删除原表)
+		if (needInfo && !existInfo.isEmpty()) {
+			List<String> infoList = new ArrayList<>(existInfo);
+			String infoPlaceholders = String.join(",", Collections.nCopies(infoList.size(), "?"));
+
+			String insertInfoSql = "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 (" + infoPlaceholders + ")";
+			String deleteInfoSql = "DELETE FROM SNBIND_INFO WHERE SI_SNCODE IN (" + infoPlaceholders + ")";
+
+			baseDao.getJdbcTemplate().update(insertInfoSql, infoList.toArray());
+			baseDao.getJdbcTemplate().update(deleteInfoSql, infoList.toArray());
+		}
+
+		if (needMaterial && !existMaterial.isEmpty()) {
+			List<String> matList = new ArrayList<>(existMaterial);
+			String matPlaceholders = String.join(",", Collections.nCopies(matList.size(), "?"));
+
+			String insertMatSql = "INSERT INTO SNBINDMATERIAL_HIS (SM_ID,SM_SNCODE,SM_MAPRODCODE,SM_MACODE,SM_STEPCODE,SM_STEPNAME,SM_BINDDETNO,SM_FPRODCODE,SM_APRODCODE,SM_QTY,SM_BARCODE,SM_INDATE,SH_INDATE,SH_TYPE) " +
+					"SELECT SM_ID,SM_SNCODE,SM_MAPRODCODE,SM_MACODE,SM_STEPCODE,SM_STEPNAME,SM_BINDDETNO,SM_FPRODCODE,SM_APRODCODE,SM_QTY,SM_BARCODE,SM_INDATE,SYSDATE,'删除解绑-SNBindDel' FROM SNBINDMATERIAL WHERE SM_SNCODE IN (" + matPlaceholders + ")";
+			String deleteMatSql = "DELETE FROM SNBINDMATERIAL WHERE SM_SNCODE IN (" + matPlaceholders + ")";
+
+			baseDao.getJdbcTemplate().update(insertMatSql, matList.toArray());
+			baseDao.getJdbcTemplate().update(deleteMatSql, matList.toArray());
+		}
+		if(existMaterial.isEmpty() && existInfo.isEmpty()) {
+			// 5. 返回成功(附带未绑定的消息,如有)
+			return ApiResponse.failRsp(ErrorMessage.BUSINESS_ILLEGAL.getCode(), requestId, "无符合删除要求的数据。"+String.join(";", resData));
+		}
+		// 5. 返回成功(附带未绑定的消息,如有)
+		return ApiResponse.successRsp("0", "操作成功", requestId, String.join(";", resData));
+	}
+
+	private SNBindDelRequest SNBindDelCheck(String requestId, String rawJson) {
+		SNBindDelRequest reqData;
+		try {
+			reqData = FlexJsonUtil.fromJson(rawJson, SNBindDelRequest.class);
+		} catch (Exception e) {
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,"传参数据格式错误"));
+		}
+		// 手动校验
+		Set<ConstraintViolation<SNBindDelRequest>> violations = validator.validate(reqData);
+		if (!violations.isEmpty()) {
+			String msg = violations.stream()
+					.map(ConstraintViolation::getMessage)
+					.distinct()  // 按消息内容去重
+					.collect(Collectors.joining(";"));
+			throw new ApiSystemException(new ApiResult(ErrorMessage.ACCESSKEY_ILLEGAL.getCode(),requestId,msg));
+		}
+		return reqData;
+	}
+
 
 	@Transactional
 	public ApiResult<Map<Object, Object>> executeSNBindMaterial(String accessKey, String requestId, SNBindMaterialRequest reqData) {