From 778fe392da1d110019834d250001eff2448c2203 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Wed, 4 Feb 2026 18:29:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E9=85=8D=E6=96=B9?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/recipe/vo/RecipeRespVO.java | 3 + .../admin/recipe/vo/RecipeSaveReqVO.java | 3 + .../RecipeDeviceRecordController.java | 77 ++++++++++++++----- .../vo/RecipeDeviceRecordPageReqVO.java | 1 + .../vo/RecipePlanDetailSaveReqVO.java | 2 +- .../iot/dal/dataobject/recipe/RecipeDO.java | 7 ++ .../DeviceContactModelService.java | 2 + .../DeviceContactModelServiceImpl.java | 5 ++ .../RecipeDeviceRecordService.java | 3 + .../RecipeDeviceRecordServiceImpl.java | 14 ++++ .../RecipePointRecordServiceImpl.java | 7 ++ 11 files changed, 103 insertions(+), 21 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java index 80dec1c43..6bbee8c9f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeRespVO.java @@ -56,4 +56,7 @@ public class RecipeRespVO { // @ExcelProperty("关联设备ID") private Long deviceId; + @Schema(description = "设备Id") + private Long machineId; + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeSaveReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeSaveReqVO.java index c432c6b28..3826accc3 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeSaveReqVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipe/vo/RecipeSaveReqVO.java @@ -37,4 +37,7 @@ public class RecipeSaveReqVO { @Schema(description = "数据单位") private String dataUnit; + @Schema(description = "设备Id") + private Long machineId; + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/RecipeDeviceRecordController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/RecipeDeviceRecordController.java index a0ba78a9d..8c412b939 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/RecipeDeviceRecordController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/RecipeDeviceRecordController.java @@ -1,9 +1,15 @@ package cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord; +import cn.iocoder.yudao.framework.common.util.opc.OpcUtils; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceRespVO; +import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipe.RecipeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; import cn.iocoder.yudao.module.iot.service.device.DeviceService; +import cn.iocoder.yudao.module.iot.service.devicecontactmodel.DeviceContactModelService; import cn.iocoder.yudao.module.iot.service.recipe.RecipeService; import cn.iocoder.yudao.module.iot.service.recipeplandetail.RecipePlanDetailService; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -16,17 +22,23 @@ import javax.validation.*; import javax.servlet.http.*; import java.util.*; import java.io.IOException; +import java.util.function.Function; +import java.util.stream.Collectors; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DEVICE_NOT_EXISTS; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.RECIPE_NOT_EXISTS; import cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.recipedevicerecord.RecipeDeviceRecordDO; @@ -73,6 +85,9 @@ public class RecipeDeviceRecordController { @Resource private DeviceService deviceService; + @Resource + private DeviceContactModelService deviceContactModelService; + @PostMapping("/create") @@ -134,7 +149,6 @@ public class RecipeDeviceRecordController { /** * 批量创建设备点位采集记录和配方点位记录 * @param recipeId 配方ID - * @param pointList 点位列表 [{id: 1, refer: "参考值1"}, {id: 2, refer: "参考值2"}] * @return 创建结果 * @throws JsonProcessingException JSON处理异常 */ @@ -152,28 +166,51 @@ public class RecipeDeviceRecordController { // ========== 第一步:查询配方关联的点位属性信息 ========== // 1.1 根据recipeId查询iot_recipe_device_attribute表记录 - recipePlanDetailDO.setRecipeId(32L); + recipePlanDetailDO.setRecipeId(recipeId); List attributeList = recipeDeviceAttributeService.getByRecipeId(recipePlanDetailDO.getRecipeId()); -// if (CollectionUtils.isEmpty(attributeList)) { -// return success(false); // 无关联属性,直接返回 -// } - Map> deviceDataMap = deviceService.createDeviceDataMap(103L);//recipeRespVO.getDeviceId() - - for (RecipeDeviceAttributeDO attributeDO : attributeList) { - Map data = deviceDataMap.get(attributeDO.getAttributeId()); - if (data != null ) { - // 创建 - RecipeDeviceRecordDO recipeDeviceRecordDO = new RecipeDeviceRecordDO(); - recipeDeviceRecordDO.setRecipeId(recipeId); - recipeDeviceRecordDO.setAttributeCode(attributeDO.getAttributeName()); - recipeDeviceRecordDO.setDataType(attributeDO.getDataType()); - recipeDeviceRecordDO.setDataUnit(attributeDO.getDataUnit()); - if (data.get("addressValue") != null && data.get("addressValue").toString() != null) { - recipeDeviceRecordDO.setValue(data.get("addressValue").toString()); - } - recipeDeviceRecordService.createRecipeDeviceRecord(BeanUtils.toBean(recipeDeviceRecordDO, RecipeDeviceRecordSaveReqVO.class)); + //先删除在添加 + List recipeDeviceRecordDOS = recipeDeviceRecordService.getListByRecipeId(recipeId); + if (!recipeDeviceRecordDOS.isEmpty()){ + recipeDeviceRecordService.deleteByIds(recipeDeviceRecordDOS); + } + RecipeDO recipe = recipeService.getRecipe(recipeId); + if (recipe == null){ + throw exception(RECIPE_NOT_EXISTS); + } + + DeviceRespVO device = deviceService.getDevice(recipe.getMachineId()); + if (device== null ){ + throw exception(DEVICE_NOT_EXISTS); + } + + Map deviceContactModelMap = new HashMap<>(); + List deviceContactModelDOS = deviceContactModelService.selectListByDeviceId(device.getId()); + if (!deviceContactModelDOS.isEmpty()){ + deviceContactModelMap = deviceContactModelDOS.stream() + .collect(Collectors.toMap( + DeviceContactModelDO::getId, + Function.identity() + )); + } + + OpcUtils.connect(device.getUrl(),device.getUsername(),device.getPassword(),10); + + for (RecipeDeviceAttributeDO attributeDO : attributeList) { + DeviceContactModelDO deviceContactModelDO = deviceContactModelMap.get(attributeDO.getAttributeId()); + if (deviceContactModelDO == null){ + continue; } + // 创建 + RecipeDeviceRecordDO recipeDeviceRecordDO = new RecipeDeviceRecordDO(); + recipeDeviceRecordDO.setRecipeId(recipeId); + recipeDeviceRecordDO.setAttributeCode(deviceContactModelDO.getAttributeName()); + recipeDeviceRecordDO.setDataType(deviceContactModelDO.getDataType()); + recipeDeviceRecordDO.setDataUnit(deviceContactModelDO.getDataUnit()); + recipeDeviceRecordDO.setValue((String) OpcUtils.readValue(deviceContactModelDO.getAddress())); + + recipeDeviceRecordService.createRecipeDeviceRecord(BeanUtils.toBean(recipeDeviceRecordDO, RecipeDeviceRecordSaveReqVO.class)); + } return success(true); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordPageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordPageReqVO.java index 3cc8aeefd..880ce1901 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordPageReqVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordPageReqVO.java @@ -52,4 +52,5 @@ public class RecipeDeviceRecordPageReqVO extends PageParam { @Schema(description = "配方id", example = "32535") private Long recipeId; + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailSaveReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailSaveReqVO.java index 2598ec191..4bfda9daf 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailSaveReqVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailSaveReqVO.java @@ -25,7 +25,7 @@ public class RecipePlanDetailSaveReqVO { private Long recipeId; @Schema(description = "关联计划(关联mes_plan表的id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "28398") - @NotNull(message = "关联计划(关联mes_plan表的id)不能为空") +// @NotNull(message = "关联计划(关联mes_plan表的id)不能为空") private Long planId; @Schema(description = "来源(新增/生产中)") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipe/RecipeDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipe/RecipeDO.java index c3c943865..81e54841b 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipe/RecipeDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipe/RecipeDO.java @@ -60,4 +60,11 @@ public class RecipeDO extends BaseDO { */ private String dataUnit; + /** + * 数据单位 + */ + private Long machineId; + + + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelService.java index 8eca7be5b..5daff8797 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelService.java @@ -53,4 +53,6 @@ public interface DeviceContactModelService { PageResult getDeviceContactModelPage(DeviceContactModelPageReqVO pageReqVO); List getDeviceContactModelList(Long id); + + List selectListByDeviceId(Long id); } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelServiceImpl.java index b6cbb5f71..0108420cb 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/devicecontactmodel/DeviceContactModelServiceImpl.java @@ -99,4 +99,9 @@ public class DeviceContactModelServiceImpl implements DeviceContactModelService .orderByDesc(DeviceContactModelDO::getCreateTime)); } + @Override + public List selectListByDeviceId(Long id) { + return deviceContactModelMapper.selectList(Wrappers.lambdaQuery().eq(DeviceContactModelDO::getDeviceId,id)); + } + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordService.java index b05b6d837..9b4e3107a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordService.java @@ -52,4 +52,7 @@ public interface RecipeDeviceRecordService { */ PageResult getRecipeDeviceRecordPage(RecipeDeviceRecordPageReqVO pageReqVO); + List getListByRecipeId(Long recipeId); + + void deleteByIds(List recipeDeviceRecordDOS); } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordServiceImpl.java index 45e7db22b..e3ab5db96 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.iot.service.recipedevicerecord; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -31,6 +32,7 @@ public class RecipeDeviceRecordServiceImpl implements RecipeDeviceRecordService @Override public Long createRecipeDeviceRecord(RecipeDeviceRecordSaveReqVO createReqVO) { + // 插入 RecipeDeviceRecordDO recipeDeviceRecord = BeanUtils.toBean(createReqVO, RecipeDeviceRecordDO.class); recipeDeviceRecordMapper.insert(recipeDeviceRecord); @@ -71,4 +73,16 @@ public class RecipeDeviceRecordServiceImpl implements RecipeDeviceRecordService return recipeDeviceRecordMapper.selectPage(pageReqVO); } + @Override + public List getListByRecipeId(Long recipeId) { + return recipeDeviceRecordMapper.selectList(Wrappers.lambdaQuery().eq(RecipeDeviceRecordDO::getRecipeId, recipeId)); + + } + + @Override + public void deleteByIds(List recipeDeviceRecordDOS) { + recipeDeviceRecordMapper.deleteByIds(recipeDeviceRecordDOS); + + } + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordServiceImpl.java index c08cb7bfc..a07dbee01 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.iot.service.recipepointrecord; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -31,6 +32,12 @@ public class RecipePointRecordServiceImpl implements RecipePointRecordService { @Override public Long createRecipePointRecord(RecipePointRecordSaveReqVO createReqVO) { + List recipePointRecordDOS = recipePointRecordMapper.selectList(Wrappers.lambdaQuery().eq(RecipePointRecordDO::getRecipeId, createReqVO.getRecipeId())); + if (!recipePointRecordDOS.isEmpty()){ + recipePointRecordMapper.deleteByIds(recipePointRecordDOS); + } + + // 插入 RecipePointRecordDO recipePointRecord = BeanUtils.toBean(createReqVO, RecipePointRecordDO.class); recipePointRecordMapper.insert(recipePointRecord);