mes接口修复

liweidong
绫Umbrella 4 days ago
parent a7cc4f7819
commit efd6693d8d
  1. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/QcHardnessIot.java
  2. 2
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/QcWithstandVoltageIot.java
  3. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/iot/controller/IotWebApiController.java
  4. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MesQcProduceRunServiceImpl.java
  5. 9
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/IotThicknessMapper.java
  6. 7
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/IotThicknessMapper.xml
  7. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/QcHardnessIotMapper.xml
  8. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/QcThicknessIotMapper.xml
  9. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/mapper/QcWithstandVoltageIotMapper.xml
  10. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/IIotThicknessService.java
  11. 26
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/IotThicknessServiceImpl.java
  12. 145
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/service/impl/QcHardnessIotServiceImpl.java

@ -30,7 +30,7 @@ public class QcHardnessIot implements Serializable {
/**
* 主键ID
*/
@TableId(value = "QH_ID", type = IdType.AUTO)
@TableId(value = "QH_ID", type = IdType.ASSIGN_ID)
@Schema(description = "主键ID")
private Long qhId;

@ -30,7 +30,7 @@ public class QcWithstandVoltageIot implements Serializable {
/**
* 主键ID
*/
@TableId(value = "QW_ID", type = IdType.AUTO)
@TableId(value = "QW_ID", type = IdType.ASSIGN_ID)
@Schema(description = "主键ID")
private Long qwId;

@ -12,7 +12,7 @@ import org.springblade.desk.basic.pojo.entity.BasicClazz;
import org.springblade.desk.basic.service.IBasicClazzService;
import org.springblade.desk.iot.setvice.IEpLineElectricService;
import org.springblade.desk.quality.service.IQcHardnessIotService;
import org.springblade.desk.quality.service.IQcThicknessIotService;
import org.springblade.desk.quality.service.IIotThicknessService;
import org.springblade.desk.quality.service.IQcWithstandVoltageIotService;
import org.springframework.web.bind.annotation.*;
@ -28,7 +28,7 @@ public class IotWebApiController {
private final IEpLineElectricService lineElectricService;
private final IBasicClazzService bsBasicClassService;
private final IQcThicknessIotService qcThicknessIotService;
private final IIotThicknessService iotThicknessService;
private final IQcHardnessIotService qcHardnessIotService;
private final IQcWithstandVoltageIotService qcWithstandVoltageIotService;
@ -61,7 +61,7 @@ public class IotWebApiController {
if (data == null || data.isEmpty()) {
throw new ServiceException("参数传递异常!");
}
qcThicknessIotService.pushThickness(data);
iotThicknessService.pushThickness(data);
return R.success();
}

@ -75,7 +75,7 @@ public class MesQcProduceRunServiceImpl extends BaseServiceImpl<MesQcProduceRunM
}
@Override
public void createProduceRun() {
public void createProduceRun() {
List<Map<String, Object>> mtuList = macToolUseMapper.listAllByNoFinished();
if (mtuList == null || mtuList.isEmpty()) {
return;

@ -37,4 +37,13 @@ public interface IotThicknessMapper extends BaseMapper<IotThickness> {
* @return List<IotThicknessExcel>
*/
List<IotThicknessExcel> exportIotThickness(@Param("ew") Wrapper<IotThickness> queryWrapper);
/**
* 根据设备编码和文件时间查询记录去重
*
* @param equipmentCode 设备编码
* @param filetime 文件时间
* @return IotThickness
*/
IotThickness getByEquipmentAndFiletime(@Param("equipmentCode") String equipmentCode, @Param("filetime") String filetime);
}

@ -29,4 +29,11 @@
SELECT *
FROM QA_IOT_THICKNESS ${ew.customSqlSegment}
</select>
<select id="getByEquipmentAndFiletime" resultMap="iotThicknessResultMap">
SELECT *
FROM QA_IOT_THICKNESS
WHERE EQUIPMENT_CODE = #{equipmentCode} AND REMARK = #{filetime} AND is_deleted = 0
AND ROWNUM &lt;= 1
</select>
</mapper>

@ -18,10 +18,10 @@
</resultMap>
<select id="getDataByDeviceCodeAndDataContent" resultMap="qcHardnessIotResultMap">
SELECT QH_ID, DEVICE_CODE, BATCH_NO, FILETIME, DATA_CONTENT, CREATE_TIME, NOT_USE, IS_READ, IP
SELECT QH_ID, DEVICE_CODE, BATCH_NO, FILETIME, DATA_CONTENT, CREATE_TIME, NOT_USE
FROM QC_HARDNESS_IOT
WHERE DEVICE_CODE = #{deviceCode} AND DATA_CONTENT = #{dataContent}
FETCH FIRST 1 ROWS ONLY
AND ROWNUM &lt;= 1
</select>
</mapper>

@ -24,7 +24,7 @@
SELECT QT_ID, DEVICE_CODE, FILETIME, DATA_CONTENT, CREATE_TIME, NOT_USE
FROM QC_THICKNESS_IOT
WHERE DEVICE_CODE = #{deviceCode} AND FILETIME = #{filetime}
FETCH FIRST 1 ROWS ONLY
AND ROWNUM &lt;= 1
</select>
</mapper>

@ -20,7 +20,7 @@
SELECT QW_ID, DEVICE_CODE, WO_CODE, TEST_TIME, CUR_CONTENT, RES_RANGE, CREATE_TIME, IS_READ
FROM QC_WITHSTAND_VOLTAGE_IOT
WHERE WO_CODE = #{woCode}
FETCH FIRST 1 ROWS ONLY
AND ROWNUM &lt;= 1
</select>
</mapper>

@ -3,6 +3,7 @@
*/
package org.springblade.desk.quality.service;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
@ -41,4 +42,11 @@ public interface IIotThicknessService extends BaseService<IotThickness> {
* @param vo
*/
void setVOValue(IotThicknessVO vo);
/**
* iot系统推送测厚数据
*
* @param data 推送数据
*/
void pushThickness(JSONObject data);
}

@ -3,6 +3,7 @@
*/
package org.springblade.desk.quality.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.annotation.Resource;
@ -58,4 +59,29 @@ public class IotThicknessServiceImpl extends BaseServiceImpl<IotThicknessMapper,
public void setVOValue(IotThicknessVO vo) {
}
@Override
public void pushThickness(JSONObject data) {
String deviceCode = data.getString("devId");
String fileTime = data.getString("filetime");
// 查询是否已存在相同设备编码和文件时间的记录
IotThickness existing = baseMapper.getByEquipmentAndFiletime(deviceCode, fileTime);
if (existing != null && existing.getId() != null) {
log.info("测厚数据已存在,跳过: equipmentCode={}, filetime={}", deviceCode, fileTime);
return;
}
// 新增记录
IotThickness entity = new IotThickness();
entity.setEquipmentCode(deviceCode);
entity.setData(data.toJSONString());
entity.setUploadDate(java.time.LocalDateTime.now());
entity.setRemark(fileTime);
entity.setFlagRead(0);
entity.setFlagUse(0);
save(entity);
log.info("iot系统推送测厚数据: equipmentCode={}, fileTime={}, data={}", deviceCode, fileTime, data.toJSONString());
}
}

@ -34,118 +34,71 @@ import java.util.List;
public class QcHardnessIotServiceImpl extends ServiceImpl<QcHardnessIotMapper, QcHardnessIot> implements IQcHardnessIotService {
@Override
@SuppressWarnings("unchecked")
public void pushHardness(JSONArray dataArray) {
// 存储需要的字段:hardnessValue列表、IP、deviceCode
List<Double> hardnessValues = new ArrayList<>();
List<String> ipList = new ArrayList<>();
List<String> deviceCodeList = new ArrayList<>();
// 遍历数组提取所需数据
for (Object obj : dataArray) {
if (!(obj instanceof JSONObject)) {
log.error("数组中包含非JSON对象元素: {}", obj);
JSONObject data;
if (obj instanceof JSONObject) {
data = (JSONObject) obj;
} else if (obj instanceof java.util.Map) {
data = new JSONObject((java.util.Map<String, Object>) obj);
} else {
log.error("数组中包含不支持类型的元素: {}", obj);
continue;
}
JSONObject data = (JSONObject) obj;
// 提取largeEquipment对象
JSONObject largeEquipment = data.getJSONObject("largeEquipment");
if (largeEquipment == null) {
log.warn("未找到largeEquipment字段,跳过当前数据: {}", data);
continue;
}
// 提取deviceCode并添加到列表
String deviceCode = largeEquipment.getString("deviceCode");
if (StringUtils.isNotBlank(deviceCode)) {
deviceCodeList.add(deviceCode);
}
// 提取IP并添加到列表
String ip = largeEquipment.getString("IP");
if (StringUtils.isNotBlank(ip)) {
ipList.add(ip);
}
String deviceCode = data.getString("Equipment_code");
String batchNo = data.getString("Batch_number");
String testTime = data.getString("Test_time");
// 提取parameter_Values中的hardnessValue
JSONArray paramValuesArray = largeEquipment.getJSONArray("parameter_Values");
if (paramValuesArray == null) {
log.warn("parameter_Values字段为空,跳过当前数据");
if (StringUtils.isBlank(deviceCode)) {
log.warn("未获取到有效设备编码,跳过当前数据");
continue;
}
// 遍历每个参数值字符串,解析JSON并提取hardnessValue
for (Object paramValObj : paramValuesArray) {
String paramValStr = paramValObj.toString();
try {
JSONObject paramValJson = JSONObject.parseObject(paramValStr);
Double hardnessValue = paramValJson.getDouble("hardnessValue");
if (hardnessValue != null) {
hardnessValues.add(hardnessValue);
// 提取Parameter_values并格式化为 "name:value unit" 形式
JSONArray paramValues = data.getJSONArray("Parameter_values");
List<String> paramStrList = new ArrayList<>();
if (paramValues != null) {
for (Object pvObj : paramValues) {
JSONObject pv;
if (pvObj instanceof JSONObject) {
pv = (JSONObject) pvObj;
} else if (pvObj instanceof java.util.Map) {
pv = new JSONObject((java.util.Map<String, Object>) pvObj);
} else {
log.warn("当前参数中未找到hardnessValue: {}", paramValStr);
continue;
}
} catch (Exception e) {
log.error("解析parameter_Values元素失败: {},错误信息: {}", paramValStr, e.getMessage(), e);
String paramName = pv.getString("Parameter_name");
String paramValue = pv.getString("Parameter_value");
String paramUnit = pv.getString("Parameter_unit");
paramStrList.add(paramName + ":" + paramValue + " " + paramUnit);
}
}
}
// 处理合并后的数据
processMergedData(deviceCodeList, ipList, hardnessValues);
}
String formattedParams = String.join(", ", paramStrList);
/**
* 处理合并后的三个列表数据
*/
private void processMergedData(List<String> deviceCodeList, List<String> ipList, List<Double> hardnessValues) {
// 获取核心字段
String deviceCode = deviceCodeList.isEmpty() ? "" : deviceCodeList.get(0);
String ip = ipList.isEmpty() ? "" : ipList.get(0);
if (StringUtils.isBlank(deviceCode)) {
log.warn("未获取到有效设备编码,终止数据处理");
return;
}
// 格式化hardnessValue为"hv 值1-值2-值3"格式
String formattedHardness;
if (hardnessValues.isEmpty()) {
formattedHardness = "hv ";
log.warn("未提取到任何hardnessValue值");
} else {
List<String> hardnessStrList = new ArrayList<>();
for (Double hv : hardnessValues) {
hardnessStrList.add(String.valueOf(hv));
// 数据去重检查
QcHardnessIot duplicateData = baseMapper.getDataByDeviceCodeAndDataContent(deviceCode, data.toJSONString());
if (duplicateData != null) {
log.info("已存在相同设备编码+相同硬度数据的记录,无需重复存储: deviceCode={}", deviceCode);
continue;
}
formattedHardness = "hv " + String.join("-", hardnessStrList);
}
// 构建存储的JSON对象
JSONObject formattedJson = new JSONObject();
formattedJson.put("formatted_hardness", formattedHardness);
String dataContentStr = formattedJson.toJSONString();
// 数据去重检查
QcHardnessIot duplicateData = baseMapper.getDataByDeviceCodeAndDataContent(deviceCode, dataContentStr);
if (duplicateData != null) {
log.info("已存在相同设备编码+相同硬度数据的记录,无需重复存储");
return;
// 将同设备编码下所有未读记录标记为超时未读
baseMapper.updateAllToRead(deviceCode);
// 新增记录
QcHardnessIot entity = new QcHardnessIot();
entity.setCreateTime(new Date());
entity.setNotUse(2);
entity.setDataContent(data.toJSONString());
entity.setDeviceCode(deviceCode);
entity.setBatchNo(batchNo);
entity.setFiletime(testTime);
entity.setIsRead(0);
save(entity);
log.info("新增硬度数据成功,设备编码:{},批次号:{},检测时间:{},参数:{}", deviceCode, batchNo, testTime, formattedParams);
}
// 将同设备编码下所有未读记录标记为超时未读
baseMapper.updateAllToRead(deviceCode);
// 新增记录
QcHardnessIot entity = new QcHardnessIot();
entity.setCreateTime(new Date());
entity.setNotUse(2);
entity.setDataContent(dataContentStr);
entity.setDeviceCode(deviceCode);
entity.setIp(ip);
entity.setIsRead(0);
save(entity);
log.info("新增硬度数据成功,设备编码:{},IP:{},格式化硬度值:{}", deviceCode, ip, formattedHardness);
}
}
Loading…
Cancel
Save