From 76737018088902622b4435868b65751ece7acf0d Mon Sep 17 00:00:00 2001 From: 86158 <461356067@qq.com> Date: Fri, 9 Jan 2026 20:17:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E9=85=8D=E6=96=B9?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/iot/enums/ErrorCodeConstants.java | 3 +- .../RecipeDeviceAttributeController.java | 25 ++ .../RecipeDeviceRecordController.java | 312 ++++++++++++++++++ .../vo/RecipeDeviceRecordPageReqVO.java | 52 +++ .../vo/RecipeDeviceRecordRespVO.java | 63 ++++ .../vo/RecipeDeviceRecordSaveReqVO.java | 45 +++ .../RecipePlanDetailController.java | 17 +- .../vo/RecipePlanDetailPageRespDTO.java | 34 ++ .../vo/RecipePlanDetailRespVO.java | 4 + .../vo/RecipePlanDetailSaveReqVO.java | 2 +- .../recipepoint/vo/RecipePointPageReqVO.java | 3 + .../recipepoint/vo/RecipePointRespVO.java | 4 + .../recipepoint/vo/RecipePointSaveReqVO.java | 3 + .../RecipePointRecordController.java | 95 ++++++ .../vo/RecipePointRecordPageReqVO.java | 47 +++ .../vo/RecipePointRecordRespVO.java | 56 ++++ .../vo/RecipePointRecordSaveReqVO.java | 40 +++ .../RecipeDeviceRecordDO.java | 71 ++++ .../recipeplandetail/RecipePlanDetailDO.java | 1 + .../RecipePlanDetailWithRelationsDO.java | 21 -- .../dataobject/recipepoint/RecipePointDO.java | 4 + .../RecipePointRecordDO.java | 66 ++++ .../DeviceContactModelMapper.java | 9 + .../RecipeDeviceAttributeMapper.java | 14 +- .../RecipeDeviceRecordMapper.java | 36 ++ .../RecipePlanDetailMapper.java | 50 ++- .../mysql/recipepoint/RecipePointMapper.java | 1 + .../RecipePointRecordMapper.java | 34 ++ .../RecipeDeviceAttributeService.java | 25 +- .../RecipeDeviceAttributeServiceImpl.java | 225 +++++++++++-- .../RecipeDeviceRecordService.java | 55 +++ .../RecipeDeviceRecordServiceImpl.java | 74 +++++ .../RecipePlanDetailService.java | 4 +- .../RecipePlanDetailServiceImpl.java | 10 +- .../recipepoint/RecipePointService.java | 2 + .../recipepoint/RecipePointServiceImpl.java | 12 +- .../RecipePointRecordService.java | 55 +++ .../RecipePointRecordServiceImpl.java | 74 +++++ .../DeviceContactModelMapper.xml | 11 + .../RecipeDeviceRecordMapper.xml | 12 + .../RecipePointRecordMapper.xml | 12 + 41 files changed, 1611 insertions(+), 72 deletions(-) create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/RecipeDeviceRecordController.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordPageReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordRespVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordSaveReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailPageRespDTO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/RecipePointRecordController.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordPageReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordRespVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordSaveReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedevicerecord/RecipeDeviceRecordDO.java delete mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailWithRelationsDO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepointrecord/RecipePointRecordDO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedevicerecord/RecipeDeviceRecordMapper.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepointrecord/RecipePointRecordMapper.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordService.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordServiceImpl.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordService.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordServiceImpl.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/devicecontactmodel/DeviceContactModelMapper.xml create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipedevicerecord/RecipeDeviceRecordMapper.xml create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipepointrecord/RecipePointRecordMapper.xml diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java index 1016e76529..39b2543f92 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java @@ -59,5 +59,6 @@ public interface ErrorCodeConstants { ErrorCode RECIPE_CODE_DUPLICATE = new ErrorCode(1_003_000_004, "编码已存在"); ErrorCode RECIPE_CODE_EMPTY = new ErrorCode(1_003_000_005, "配方编码不能为空"); ErrorCode RECIPE_PLAN_DETAIL_NOT_EXISTS = new ErrorCode(1_003_000_006, "配方计划详情表(配方库)不存在"); - + ErrorCode RECIPE_POINT_RECORD_NOT_EXISTS = new ErrorCode(1_003_000_007, "IoT配方点位记录不存在"); + ErrorCode RECIPE_DEVICE_RECORD_NOT_EXISTS = new ErrorCode(1_003_000_008, "设备点位采集值记录不存在"); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java index ad41f6fc8b..290ed9c111 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedeviceattribute/RecipeDeviceAttributeController.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute; +import com.fasterxml.jackson.core.JsonProcessingException; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -28,6 +29,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.recipedeviceattribute.RecipeDeviceAttributeDO; import cn.iocoder.yudao.module.iot.service.recipedeviceattribute.RecipeDeviceAttributeService; +import cn.iocoder.yudao.module.iot.service.device.TDengineService; @Tag(name = "管理后台 - 配方配置(关联采集设备模型-点位管理)") @RestController @@ -37,6 +39,8 @@ public class RecipeDeviceAttributeController { @Resource private RecipeDeviceAttributeService recipeDeviceAttributeService; + @Resource + private TDengineService tDengineService; @PostMapping("/create") @Operation(summary = "创建配方配置(关联采集设备模型-点位管理)") @@ -105,4 +109,25 @@ public class RecipeDeviceAttributeController { BeanUtils.toBean(list, RecipeDeviceAttributeRespVO.class)); } + + @GetMapping("/singleDevice") + @Operation(summary = "设备运行参数最新值") + @PreAuthorize("@ss.hasPermission('iot:device-model-attribute:query')") +// 修正返回值类型为Service方法对应的Map结构 + public CommonResult>>> operationAnalysisDetails( + @RequestParam("deviceId") Long deviceId) throws JsonProcessingException { + + // 1. 注入RecipeDeviceAttributeService(需确保类名和注入名称正确) + // 注意:这里假设你的Service类名为RecipeDeviceAttributeService,需和实际类名一致 + // 如果是通过@Autowired注入,需在Controller类中先声明: + // @Autowired + // private RecipeDeviceAttributeService recipeDeviceAttributeService; + + // 2. 调用Service方法(变量类型改为Map,匹配返回值) + Map>> recipeDeviceAttribute = recipeDeviceAttributeService.singleDevice(deviceId); + + // 3. 返回结果(参数类型匹配) + return success(recipeDeviceAttribute); + } + } \ 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 new file mode 100644 index 0000000000..27d9e12438 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/RecipeDeviceRecordController.java @@ -0,0 +1,312 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +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.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 cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipedevicerecord.RecipeDeviceRecordDO; +import cn.iocoder.yudao.module.iot.service.recipedevicerecord.RecipeDeviceRecordService; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +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.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 cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipedevicerecord.RecipeDeviceRecordDO; +import cn.iocoder.yudao.module.iot.service.recipedevicerecord.RecipeDeviceRecordService; +// 新增必要的导入 +import cn.iocoder.yudao.module.iot.service.recipedeviceattribute.RecipeDeviceAttributeService; +import cn.iocoder.yudao.module.iot.service.device.TDengineService; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipedeviceattribute.RecipeDeviceAttributeDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipepoint.RecipePointDO; +import cn.iocoder.yudao.module.iot.service.recipepoint.RecipePointService; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipepointrecord.RecipePointRecordDO; +import cn.iocoder.yudao.module.iot.service.recipepointrecord.RecipePointRecordService; + +@Tag(name = "管理后台 - 设备点位采集值记录") +@RestController +@RequestMapping("/iot/recipe-device-record") +@Validated +public class RecipeDeviceRecordController { + + @Resource + private RecipeDeviceRecordService recipeDeviceRecordService; + // 新增注入的服务 + @Resource + private RecipeDeviceAttributeService recipeDeviceAttributeService; + @Resource + private TDengineService tDengineService; + @Resource + private RecipePointService recipePointService; + @Resource + private RecipePointRecordService recipePointRecordService; + @Resource + private ObjectMapper objectMapper; + + @PostMapping("/create") + @Operation(summary = "创建设备点位采集值记录") + @PreAuthorize("@ss.hasPermission('iot:recipe-device-record:create')") + public CommonResult createRecipeDeviceRecord(@Valid @RequestBody RecipeDeviceRecordSaveReqVO createReqVO) { + return success(recipeDeviceRecordService.createRecipeDeviceRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备点位采集值记录") + @PreAuthorize("@ss.hasPermission('iot:recipe-device-record:update')") + public CommonResult updateRecipeDeviceRecord(@Valid @RequestBody RecipeDeviceRecordSaveReqVO updateReqVO) { + recipeDeviceRecordService.updateRecipeDeviceRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备点位采集值记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('iot:recipe-device-record:delete')") + public CommonResult deleteRecipeDeviceRecord(@RequestParam("id") Long id) { + recipeDeviceRecordService.deleteRecipeDeviceRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得设备点位采集值记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('iot:recipe-device-record:query')") + public CommonResult getRecipeDeviceRecord(@RequestParam("id") Long id) { + RecipeDeviceRecordDO recipeDeviceRecord = recipeDeviceRecordService.getRecipeDeviceRecord(id); + return success(BeanUtils.toBean(recipeDeviceRecord, RecipeDeviceRecordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备点位采集值记录分页") + @PreAuthorize("@ss.hasPermission('iot:recipe-device-record:query')") + public CommonResult> getRecipeDeviceRecordPage(@Valid RecipeDeviceRecordPageReqVO pageReqVO) { + PageResult pageResult = recipeDeviceRecordService.getRecipeDeviceRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, RecipeDeviceRecordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出设备点位采集值记录 Excel") + @PreAuthorize("@ss.hasPermission('iot:recipe-device-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportRecipeDeviceRecordExcel(@Valid RecipeDeviceRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = recipeDeviceRecordService.getRecipeDeviceRecordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "设备点位采集值记录.xls", "数据", RecipeDeviceRecordRespVO.class, + BeanUtils.toBean(list, RecipeDeviceRecordRespVO.class)); + } + + + + + +// +// +// /** +// * 批量创建设备点位采集记录和配方点位记录 +// * @param recipeId 配方ID +// * @param pointList 点位列表 [{id: 1, refer: "参考值1"}, {id: 2, refer: "参考值2"}] +// * @return 创建结果 +// * @throws JsonProcessingException JSON处理异常 +// */ +// @PostMapping("/batch-create") +// @Operation(summary = "批量创建设备点位采集记录和配方点位记录") +// @PreAuthorize("@ss.hasPermission('iot:recipe-device-record:create')") +// public CommonResult batchCreateRecipeDeviceRecord( +// @RequestParam("recipeId") Long recipeId, +// @RequestBody List pointList) throws JsonProcessingException { +// +// // ========== 第一步:查询配方关联的点位属性信息 ========== +// // 1.1 根据recipeId查询iot_recipe_device_attribute表记录 +// List attributeList = recipeDeviceAttributeService.getByRecipeId(recipeId); +// if (CollectionUtils.isEmpty(attributeList)) { +// return success(false); // 无关联属性,直接返回 +// } +// +// // 1.2 构建attributeName -> (attributeId, dataUnit)的映射关系 +// Map attributeMap = new HashMap<>(); +// for (RecipeDeviceAttributeDO attributeDO : attributeList) { +// // 根据attribute_id查询iot_device_contact_model表获取attribute_name和data_unit +// // 假设通过service方法获取,需根据实际业务调整 +// Map modelAttr = recipeDeviceAttributeService.getDeviceContactModelAttr(attributeDO.getAttributeId()); +// String attributeName = modelAttr.get("attributeName"); +// String dataUnit = modelAttr.get("dataUnit"); +// +// attributeMap.put(attributeName, new AttributeInfo( +// attributeDO.getId(), attributeName, dataUnit, attributeDO.getDeviceId())); +// } +// +// // ========== 第二步:获取设备运行参数并创建设备点位采集记录 ========== +// // 2.1 获取设备运行参数JSON数据(复用singleDevice逻辑,取第一个设备ID) +// if (attributeList.isEmpty()) { +// return success(false); +// } +// Long deviceId = attributeList.get(0).getDeviceId(); +// Map>> deviceData = recipeDeviceAttributeService.singleDevice(deviceId); +// +// // 2.2 解析JSON数据并匹配属性名 +// if (deviceData != null && deviceData.containsKey("data")) { +// // 解析嵌套的data节点(适配示例JSON结构) +// String dataJson = objectMapper.writeValueAsString(deviceData.get("data")); +// JsonNode dataNode = objectMapper.readTree(dataJson); +// +// // 遍历所有数据分类(设备基础数据、班次信息等) +// Iterator> categoryIterator = dataNode.fields(); +// while (categoryIterator.hasNext()) { +// Map.Entry categoryEntry = categoryIterator.next(); +// JsonNode attrListNode = categoryEntry.getValue(); +// +// // 遍历分类下的每个属性 +// if (attrListNode.isArray()) { +// for (JsonNode attrNode : attrListNode) { +// String attributeName = attrNode.get("attributeName").asText(); +// JsonNode addressValueNode = attrNode.get("addressValue"); +// Object addressValue = addressValueNode.isNull() ? null : +// (addressValueNode.isNumber() ? addressValueNode.numberValue() : addressValueNode.textValue()); +// +// // 匹配第一步的属性名,匹配成功则创建记录 +// if (attributeMap.containsKey(attributeName)) { +// AttributeInfo attrInfo = attributeMap.get(attributeName); +// +// // 构建设备点位采集记录DO +// RecipeDeviceRecordDO recordDO = new RecipeDeviceRecordDO(); +// recordDO.setRecipeId(recipeId); +// recordDO.setAttributeName(attributeName); +// recordDO.setAddressValue(addressValue != null ? addressValue.toString() : null); +// recordDO.setDataUnit(attrInfo.getDataUnit()); +// recordDO.setDeviceId(deviceId); +// +// // 创建记录 +// recipeDeviceRecordService.createRecipeDeviceRecord(recordDO); +// } +// } +// } +// } +// } +// +// // ========== 第三步:创建配方点位记录 ========== +// for (PointReferVO pointVO : pointList) { +// // 3.1 根据id查询iot_recipe_point表记录 +// RecipePointDO pointDO = recipePointService.getRecipePoint(pointVO.getId()); +// if (pointDO == null) { +// continue; // 点位不存在则跳过 +// } +// +// // 3.2 构建配方点位记录DO +// RecipePointRecordDO pointRecordDO = new RecipePointRecordDO(); +// pointRecordDO.setPointId(pointDO.getId()); +// pointRecordDO.setName(pointDO.getName()); +// pointRecordDO.setMax(pointDO.getMax()); +// pointRecordDO.setMin(pointDO.getMin()); +// pointRecordDO.setDataUnit(pointDO.getDataUnit()); +// pointRecordDO.setRemark(pointDO.getRemark()); +// pointRecordDO.setRefer(pointVO.getRefer()); // 入参的refer值 +// pointRecordDO.setRecipeId(recipeId); +// +// // 3.3 创建配方点位记录 +// recipePointRecordService.createRecipePointRecord(pointRecordDO); +// } +// +// return success(true); +// } + + // ========== 内部辅助类 ========== + /** + * 点位参考值VO + */ + public static class PointReferVO { + private Long id; // 配方点位ID + private String refer; // 参考值 + + // getter/setter + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getRefer() { + return refer; + } + + public void setRefer(String refer) { + this.refer = refer; + } + } + + /** + * 属性信息封装类 + */ + private static class AttributeInfo { + private Long attributeId; // 属性ID + private String attributeName; // 属性名 + private String dataUnit; // 数据单位 + private Long deviceId; // 设备ID + + public AttributeInfo(Long attributeId, String attributeName, String dataUnit, Long deviceId) { + this.attributeId = attributeId; + this.attributeName = attributeName; + this.dataUnit = dataUnit; + this.deviceId = deviceId; + } + + // getter + public String getDataUnit() { + return dataUnit; + } + + public Long getDeviceId() { + return deviceId; + } + } + +} \ 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/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 new file mode 100644 index 0000000000..d13e337b3d --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordPageReqVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 设备点位采集值记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RecipeDeviceRecordPageReqVO extends PageParam { + + @Schema(description = "编码") + private String attributeCode; + + @Schema(description = "名称", example = "张三") + private String attributeName; + + @Schema(description = "类型", example = "2") + private String attributeType; + + @Schema(description = "数据类型", example = "2") + private String dataType; + + @Schema(description = "地址") + private String address; + + @Schema(description = "单位") + private String dataUnit; + + @Schema(description = "倍率") + private Double ratio; + + @Schema(description = "备注", example = "随便") + private String remark; + + @Schema(description = "设备id", example = "32535") + private Long deviceId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "采集值") + private Double value; + +} \ 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/vo/RecipeDeviceRecordRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordRespVO.java new file mode 100644 index 0000000000..3e1df78b51 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordRespVO.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 设备点位采集值记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class RecipeDeviceRecordRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13509") + @ExcelProperty("id") + private Long id; + + @Schema(description = "编码") + @ExcelProperty("编码") + private String attributeCode; + + @Schema(description = "名称", example = "张三") + @ExcelProperty("名称") + private String attributeName; + + @Schema(description = "类型", example = "2") + @ExcelProperty("类型") + private String attributeType; + + @Schema(description = "数据类型", example = "2") + @ExcelProperty("数据类型") + private String dataType; + + @Schema(description = "地址") + @ExcelProperty("地址") + private String address; + + @Schema(description = "单位") + @ExcelProperty("单位") + private String dataUnit; + + @Schema(description = "倍率") + @ExcelProperty("倍率") + private Double ratio; + + @Schema(description = "备注", example = "随便") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "设备id", example = "32535") + @ExcelProperty("设备id") + private Long deviceId; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "采集值") + @ExcelProperty("采集值") + private Double value; + +} \ 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/vo/RecipeDeviceRecordSaveReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordSaveReqVO.java new file mode 100644 index 0000000000..f50f8fdff8 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipedevicerecord/vo/RecipeDeviceRecordSaveReqVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 设备点位采集值记录新增/修改 Request VO") +@Data +public class RecipeDeviceRecordSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13509") + private Long id; + + @Schema(description = "编码") + private String attributeCode; + + @Schema(description = "名称", example = "张三") + private String attributeName; + + @Schema(description = "类型", example = "2") + private String attributeType; + + @Schema(description = "数据类型", example = "2") + private String dataType; + + @Schema(description = "地址") + private String address; + + @Schema(description = "单位") + private String dataUnit; + + @Schema(description = "倍率") + private Double ratio; + + @Schema(description = "备注", example = "随便") + private String remark; + + @Schema(description = "设备id", example = "32535") + private Long deviceId; + + @Schema(description = "采集值") + private Double value; + +} \ 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/RecipePlanDetailController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/RecipePlanDetailController.java index 3a9cf8beec..b311b6137f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/RecipePlanDetailController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/RecipePlanDetailController.java @@ -71,12 +71,19 @@ public class RecipePlanDetailController { return success(BeanUtils.toBean(recipePlanDetail, RecipePlanDetailRespVO.class)); } +// @GetMapping("/page") +// @Operation(summary = "获得配方计划详情表(配方库)分页") +// @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:query')") +// public CommonResult> getRecipePlanDetailPage(@Valid RecipePlanDetailPageReqVO pageReqVO) { +// PageResult pageResult = recipePlanDetailService.getRecipePlanDetailPage(pageReqVO); +// return success(BeanUtils.toBean(pageResult, RecipePlanDetailRespVO.class)); +// } + @GetMapping("/page") - @Operation(summary = "获得配方计划详情表(配方库)分页") - @PreAuthorize("@ss.hasPermission('iot:recipe-plan-detail:query')") - public CommonResult> getRecipePlanDetailPage(@Valid RecipePlanDetailPageReqVO pageReqVO) { - PageResult pageResult = recipePlanDetailService.getRecipePlanDetailPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, RecipePlanDetailRespVO.class)); + @Operation(summary = "分页查询配方计划详情(含关联信息)") + public CommonResult> pageRecipePlanDetail(RecipePlanDetailPageReqVO reqVO) { + PageResult pageResult = recipePlanDetailService.pageRecipePlanDetail(reqVO); + return CommonResult.success(pageResult); } @GetMapping("/export-excel") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailPageRespDTO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailPageRespDTO.java new file mode 100644 index 0000000000..24381149d9 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailPageRespDTO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.util.Date; + +/** + * 配方计划详情分页返回DTO(包含关联字段) + */ +@Data +public class RecipePlanDetailPageRespDTO { + // 基础字段(和iot_recipe_plan_detail表对应) + private Long id; + private String code; // 编码 + private String name; // 名称 + private Long recipeId; // 关联配方ID + private Long planId; // 关联计划ID + private String source; // 来源(新增/生产中) + private Boolean isEnable; // 是否启用 + private String creator; // 创建人 + private Date createTime; // 创建时间 + private String updater; // 更新人 + private Date updateTime; // 更新时间 + private Long tenantId; // 租户ID + + // 关联字段(从其他表查询) + private String recipeName; // 配方名称(来自iot_recipe表) + private String planCode; // 计划编码(来自mes_plan表) +// private String creatorName; + private Long deviceId; +} \ 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/RecipePlanDetailRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailRespVO.java index 20f7f315a5..9196736917 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipeplandetail/vo/RecipePlanDetailRespVO.java @@ -49,4 +49,8 @@ public class RecipePlanDetailRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; +// @Schema(description = "创建人名字", example = "随便") +// @ExcelProperty("创建人名字") +// private String creatorName; + } \ 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 fca5e3de42..2598ec191b 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 @@ -32,7 +32,7 @@ public class RecipePlanDetailSaveReqVO { private String source; @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "是否启用不能为空") +// @NotNull(message = "是否启用不能为空") private Boolean isEnable; } \ 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/recipepoint/vo/RecipePointPageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointPageReqVO.java index ce75ec3f84..849b87c8cc 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointPageReqVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointPageReqVO.java @@ -41,4 +41,7 @@ public class RecipePointPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "参考值") + private BigDecimal refer; + } \ 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/recipepoint/vo/RecipePointRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointRespVO.java index b9e6b4daf2..f931eb1d8a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointRespVO.java @@ -49,4 +49,8 @@ public class RecipePointRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "参考值") + @ExcelProperty("参考值") + private BigDecimal refer; + } \ 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/recipepoint/vo/RecipePointSaveReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointSaveReqVO.java index dc64f19114..73341db467 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointSaveReqVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepoint/vo/RecipePointSaveReqVO.java @@ -34,4 +34,7 @@ public class RecipePointSaveReqVO { @Schema(description = "备注", example = "你说的对") private String remark; + @Schema(description = "参考值") + private BigDecimal refer; + } \ 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/recipepointrecord/RecipePointRecordController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/RecipePointRecordController.java new file mode 100644 index 0000000000..2cbf672dfe --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/RecipePointRecordController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +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.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 cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipepointrecord.RecipePointRecordDO; +import cn.iocoder.yudao.module.iot.service.recipepointrecord.RecipePointRecordService; + +@Tag(name = "管理后台 - IoT配方点位记录") +@RestController +@RequestMapping("/iot/recipe-point-record") +@Validated +public class RecipePointRecordController { + + @Resource + private RecipePointRecordService recipePointRecordService; + + @PostMapping("/create") + @Operation(summary = "创建IoT配方点位记录") + @PreAuthorize("@ss.hasPermission('iot:recipe-point-record:create')") + public CommonResult createRecipePointRecord(@Valid @RequestBody RecipePointRecordSaveReqVO createReqVO) { + return success(recipePointRecordService.createRecipePointRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新IoT配方点位记录") + @PreAuthorize("@ss.hasPermission('iot:recipe-point-record:update')") + public CommonResult updateRecipePointRecord(@Valid @RequestBody RecipePointRecordSaveReqVO updateReqVO) { + recipePointRecordService.updateRecipePointRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除IoT配方点位记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('iot:recipe-point-record:delete')") + public CommonResult deleteRecipePointRecord(@RequestParam("id") Long id) { + recipePointRecordService.deleteRecipePointRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得IoT配方点位记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('iot:recipe-point-record:query')") + public CommonResult getRecipePointRecord(@RequestParam("id") Long id) { + RecipePointRecordDO recipePointRecord = recipePointRecordService.getRecipePointRecord(id); + return success(BeanUtils.toBean(recipePointRecord, RecipePointRecordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得IoT配方点位记录分页") + @PreAuthorize("@ss.hasPermission('iot:recipe-point-record:query')") + public CommonResult> getRecipePointRecordPage(@Valid RecipePointRecordPageReqVO pageReqVO) { + PageResult pageResult = recipePointRecordService.getRecipePointRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, RecipePointRecordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出IoT配方点位记录 Excel") + @PreAuthorize("@ss.hasPermission('iot:recipe-point-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportRecipePointRecordExcel(@Valid RecipePointRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = recipePointRecordService.getRecipePointRecordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "IoT配方点位记录.xls", "数据", RecipePointRecordRespVO.class, + BeanUtils.toBean(list, RecipePointRecordRespVO.class)); + } + +} \ 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/recipepointrecord/vo/RecipePointRecordPageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordPageReqVO.java new file mode 100644 index 0000000000..fbce731d5e --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordPageReqVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - IoT配方点位记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RecipePointRecordPageReqVO extends PageParam { + + @Schema(description = "配方ID", example = "3078") + private Long recipeId; + + @Schema(description = "名字", example = "张三") + private String name; + + @Schema(description = "最大值") + private BigDecimal max; + + @Schema(description = "最小值") + private BigDecimal min; + + @Schema(description = "数据类型", example = "2") + private String dataType; + + @Schema(description = "单位") + private String dataUnit; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "参考值") + private BigDecimal refer; + +} \ 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/recipepointrecord/vo/RecipePointRecordRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordRespVO.java new file mode 100644 index 0000000000..809809b231 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordRespVO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - IoT配方点位记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class RecipePointRecordRespVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19126") + @ExcelProperty("id") + private Long id; + + @Schema(description = "配方ID", example = "3078") + @ExcelProperty("配方ID") + private Long recipeId; + + @Schema(description = "名字", example = "张三") + @ExcelProperty("名字") + private String name; + + @Schema(description = "最大值") + @ExcelProperty("最大值") + private BigDecimal max; + + @Schema(description = "最小值") + @ExcelProperty("最小值") + private BigDecimal min; + + @Schema(description = "数据类型", example = "2") + @ExcelProperty("数据类型") + private String dataType; + + @Schema(description = "单位") + @ExcelProperty("单位") + private String dataUnit; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "参考值") + @ExcelProperty("参考值") + private BigDecimal refer; + +} \ 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/recipepointrecord/vo/RecipePointRecordSaveReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordSaveReqVO.java new file mode 100644 index 0000000000..7e245cc0c4 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/recipepointrecord/vo/RecipePointRecordSaveReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - IoT配方点位记录新增/修改 Request VO") +@Data +public class RecipePointRecordSaveReqVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19126") + private Long id; + + @Schema(description = "配方ID", example = "3078") + private Long recipeId; + + @Schema(description = "名字", example = "张三") + private String name; + + @Schema(description = "最大值") + private BigDecimal max; + + @Schema(description = "最小值") + private BigDecimal min; + + @Schema(description = "数据类型", example = "2") + private String dataType; + + @Schema(description = "单位") + private String dataUnit; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "参考值") + private BigDecimal refer; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedevicerecord/RecipeDeviceRecordDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedevicerecord/RecipeDeviceRecordDO.java new file mode 100644 index 0000000000..0976c28df2 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipedevicerecord/RecipeDeviceRecordDO.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.iot.dal.dataobject.recipedevicerecord; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 设备点位采集值记录 DO + * + * @author 内蒙必硕 + */ +@TableName("iot_recipe_device_record") +@KeySequence("iot_recipe_device_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RecipeDeviceRecordDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编码 + */ + private String attributeCode; + /** + * 名称 + */ + private String attributeName; + /** + * 类型 + */ + private String attributeType; + /** + * 数据类型 + */ + private String dataType; + /** + * 地址 + */ + private String address; + /** + * 单位 + */ + private String dataUnit; + /** + * 倍率 + */ + private Double ratio; + /** + * 备注 + */ + private String remark; + /** + * 设备id + */ + private Long deviceId; + /** + * 采集值 + */ + private Double value; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailDO.java index fd9f279241..df0501509e 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailDO.java @@ -52,4 +52,5 @@ public class RecipePlanDetailDO extends BaseDO { */ private Boolean isEnable; + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailWithRelationsDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailWithRelationsDO.java deleted file mode 100644 index c3ccd3bc96..0000000000 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipeplandetail/RecipePlanDetailWithRelationsDO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail; - -import lombok.Data; -import java.time.LocalDateTime; - -/** - * 包含关联信息的配方计划详情DO - */ -@Data -public class RecipePlanDetailWithRelationsDO { - private Long id; - private String code; - private String name; - private Long recipeId; - private String recipeName; // 来自iot_recipe表 - private Long planId; - private String planCode; // 来自mes_plan表 - private String source; - private Boolean isEnable; - private LocalDateTime createTime; -} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepoint/RecipePointDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepoint/RecipePointDO.java index ef91d4a35b..20895cbd31 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepoint/RecipePointDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepoint/RecipePointDO.java @@ -57,5 +57,9 @@ public class RecipePointDO extends BaseDO { * 备注 */ private String remark; + /** + * 参考值 + */ + private BigDecimal refer; } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepointrecord/RecipePointRecordDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepointrecord/RecipePointRecordDO.java new file mode 100644 index 0000000000..5bf91c917a --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/recipepointrecord/RecipePointRecordDO.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.iot.dal.dataobject.recipepointrecord; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * IoT配方点位记录 DO + * + * @author 内蒙必硕 + */ +@TableName("iot_recipe_point_record") +@KeySequence("iot_recipe_point_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RecipePointRecordDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 配方ID + */ + private Long recipeId; + /** + * 名字 + */ + private String name; + /** + * 最大值 + */ + private BigDecimal max; + /** + * 最小值 + */ + private BigDecimal min; + /** + * 数据类型 + */ + private String dataType; + /** + * 单位 + */ + private String dataUnit; + /** + * 备注 + */ + private String remark; + /** + * 参考值 + */ + private BigDecimal refer; + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/devicecontactmodel/DeviceContactModelMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/devicecontactmodel/DeviceContactModelMapper.java index 9f5d5730eb..a533c4c35c 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/devicecontactmodel/DeviceContactModelMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/devicecontactmodel/DeviceContactModelMapper.java @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelattribute.DeviceMod import cn.iocoder.yudao.module.iot.dal.devicecontactmodel.DeviceContactModelDO; import com.alibaba.excel.util.StringUtils; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.*; /** @@ -63,4 +64,12 @@ public interface DeviceContactModelMapper extends BaseMapperX selectAttributeNameAndUnitById(@Param("id") 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/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java index c25d80108b..b2bd32d3c4 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedeviceattribute/RecipeDeviceAttributeMapper.java @@ -73,7 +73,7 @@ public interface RecipeDeviceAttributeMapper extends BaseMapperX", - "SELECT rda.id, rda.attribute_id, dcm.attribute_name, dcm.attribute_type, dcm.data_type, dcm.data_unit", + "SELECT rda.id, rda.attribute_id, dcm.attribute_name, dcm.attribute_type, dcm.data_type, dcm.data_unit, dcm.address", "FROM iot_recipe_device_attribute rda", "LEFT JOIN iot_device_contact_model dcm ON rda.attribute_id = dcm.id", "WHERE 1=1", @@ -98,4 +98,16 @@ public interface RecipeDeviceAttributeMapper extends BaseMapperX(list, page.getTotal()); } + /** + * 根据配方ID查询设备属性记录 + * @param recipeId 配方ID + * @return 设备属性记录列表 + */ + List selectByRecipeId(@Param("recipeId") Long recipeId); + + // 分页关联查询 + PageResult selectPageWithAttribute(RecipeDeviceAttributePageReqVO reqVO); + // 根据RecipeId删除 + int deleteByRecipeId(@Param("recipeId") 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/dal/mysql/recipedevicerecord/RecipeDeviceRecordMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedevicerecord/RecipeDeviceRecordMapper.java new file mode 100644 index 0000000000..a90ff279e2 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipedevicerecord/RecipeDeviceRecordMapper.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.iot.dal.mysql.recipedevicerecord; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipedevicerecord.RecipeDeviceRecordDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo.*; + +/** + * 设备点位采集值记录 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface RecipeDeviceRecordMapper extends BaseMapperX { + + default PageResult selectPage(RecipeDeviceRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RecipeDeviceRecordDO::getAttributeCode, reqVO.getAttributeCode()) + .likeIfPresent(RecipeDeviceRecordDO::getAttributeName, reqVO.getAttributeName()) + .eqIfPresent(RecipeDeviceRecordDO::getAttributeType, reqVO.getAttributeType()) + .eqIfPresent(RecipeDeviceRecordDO::getDataType, reqVO.getDataType()) + .eqIfPresent(RecipeDeviceRecordDO::getAddress, reqVO.getAddress()) + .eqIfPresent(RecipeDeviceRecordDO::getDataUnit, reqVO.getDataUnit()) + .eqIfPresent(RecipeDeviceRecordDO::getRatio, reqVO.getRatio()) + .eqIfPresent(RecipeDeviceRecordDO::getRemark, reqVO.getRemark()) + .eqIfPresent(RecipeDeviceRecordDO::getDeviceId, reqVO.getDeviceId()) + .betweenIfPresent(RecipeDeviceRecordDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(RecipeDeviceRecordDO::getValue, reqVO.getValue()) + .orderByDesc(RecipeDeviceRecordDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipeplandetail/RecipePlanDetailMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipeplandetail/RecipePlanDetailMapper.java index 32ca893138..142fb71844 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipeplandetail/RecipePlanDetailMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipeplandetail/RecipePlanDetailMapper.java @@ -5,9 +5,14 @@ import java.util.*; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; +import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.RecipePlanDetailPageRespDTO; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + /** * 配方计划详情表(配方库) Mapper @@ -28,8 +33,49 @@ public interface RecipePlanDetailMapper extends BaseMapperX .betweenIfPresent(RecipePlanDetailDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(RecipePlanDetailDO::getId)); } + // 核心:联表分页查询(包含配方名称、计划编码) + @Select({ + "" + }) + List selectPageWithRelations( + Page page, // MyBatis-Plus分页插件自动填充页码/页大小 + @Param("reqVO") RecipePlanDetailPageReqVO reqVO); + + // 封装成芋道框架的PageResult(复用框架分页逻辑) + default PageResult selectPageWithRelationsWrap(RecipePlanDetailPageReqVO reqVO) { + Page page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize()); + List list = selectPageWithRelations(page, reqVO); + return new PageResult<>(list, page.getTotal()); + } - // 新增关联查询分页方法 -// PageResult selectPageWithRelations(@Param("req") RecipePlanDetailPageReqVO reqVO); } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepoint/RecipePointMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepoint/RecipePointMapper.java index 54ac2e5574..794d84b789 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepoint/RecipePointMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepoint/RecipePointMapper.java @@ -27,6 +27,7 @@ public interface RecipePointMapper extends BaseMapperX { .eqIfPresent(RecipePointDO::getDataUnit, reqVO.getDataUnit()) .eqIfPresent(RecipePointDO::getRemark, reqVO.getRemark()) .betweenIfPresent(RecipePointDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(RecipePointDO::getRefer, reqVO.getRefer()) .orderByDesc(RecipePointDO::getId)); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepointrecord/RecipePointRecordMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepointrecord/RecipePointRecordMapper.java new file mode 100644 index 0000000000..df63db65d1 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/recipepointrecord/RecipePointRecordMapper.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.iot.dal.mysql.recipepointrecord; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipepointrecord.RecipePointRecordDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord.vo.*; + +/** + * IoT配方点位记录 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface RecipePointRecordMapper extends BaseMapperX { + + default PageResult selectPage(RecipePointRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(RecipePointRecordDO::getRecipeId, reqVO.getRecipeId()) + .likeIfPresent(RecipePointRecordDO::getName, reqVO.getName()) + .eqIfPresent(RecipePointRecordDO::getMax, reqVO.getMax()) + .eqIfPresent(RecipePointRecordDO::getMin, reqVO.getMin()) + .eqIfPresent(RecipePointRecordDO::getDataType, reqVO.getDataType()) + .eqIfPresent(RecipePointRecordDO::getDataUnit, reqVO.getDataUnit()) + .eqIfPresent(RecipePointRecordDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(RecipePointRecordDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(RecipePointRecordDO::getRefer, reqVO.getRefer()) + .orderByDesc(RecipePointRecordDO::getId)); + } + +} \ 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/recipedeviceattribute/RecipeDeviceAttributeService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeService.java index 5be305d89f..3598448719 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.recipedeviceattribute.RecipeDeviceAttributeDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.fasterxml.jackson.core.JsonProcessingException; /** * 配方配置(关联采集设备模型-点位管理) Service 接口 @@ -54,11 +55,33 @@ public interface RecipeDeviceAttributeService { Boolean createRecipeDeviceAttributeBatch(RecipeDeviceAttributeSaveReqVO createReqVO); - PageResult selectPageWithAttribute(RecipeDeviceAttributePageReqVO reqVO); Boolean updateRecipeDeviceAttribute(RecipeDeviceAttributeUpdateReqVO reqVO); +// public List> operationAnalysisDetails(Long deviceId, String collectionStartTime, String collectionEndTime); + Map>> singleDevice(Long deviceId) throws JsonProcessingException; + + + // ========== 扩展方法(需实现) ========== + /** + * 根据配方ID查询关联的设备属性记录 + * @param recipeId 配方ID + * @return 设备属性记录列表 + */ + List getByRecipeId(Long recipeId); + /** + * 根据属性ID查询设备触点模型的属性名和数据单位 + * @param attributeId 属性ID + * @return 包含attributeName和dataUnit的Map + */ + Map getDeviceContactModelAttr(Long attributeId); + /** + * 分页查询(关联设备触点模型) + * @param reqVO 分页参数 + * @return 关联查询分页结果 + */ + PageResult selectPageWithAttribute(RecipeDeviceAttributePageReqVO reqVO); } \ 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/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java index 60d4d1fee3..44fb64b178 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedeviceattribute/RecipeDeviceAttributeServiceImpl.java @@ -1,5 +1,11 @@ package cn.iocoder.yudao.module.iot.service.recipedeviceattribute; +import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttributeTypeDO; +import cn.iocoder.yudao.module.iot.service.device.TDengineService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -7,6 +13,8 @@ import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.*; import cn.iocoder.yudao.module.iot.controller.admin.recipedeviceattribute.vo.*; @@ -43,10 +51,12 @@ public class RecipeDeviceAttributeServiceImpl implements RecipeDeviceAttributeSe @Resource private RecipeDeviceAttributeMapper recipeDeviceAttributeMapper; + @Resource + private TDengineService tdengineService; -// @Override + // @Override // public Long createRecipeDeviceAttribute(RecipeDeviceAttributeSaveReqVO createReqVO) { // // 插入 // RecipeDeviceAttributeDO recipeDeviceAttribute = BeanUtils.toBean(createReqVO, RecipeDeviceAttributeDO.class); @@ -80,7 +90,7 @@ public class RecipeDeviceAttributeServiceImpl implements RecipeDeviceAttributeSe return insertSuccess; } -// @Override + // @Override // public void updateRecipeDeviceAttribute(RecipeDeviceAttributeSaveReqVO updateReqVO) { // // 校验存在 // validateRecipeDeviceAttributeExists(updateReqVO.getId()); @@ -88,38 +98,38 @@ public class RecipeDeviceAttributeServiceImpl implements RecipeDeviceAttributeSe // RecipeDeviceAttributeDO updateObj = BeanUtils.toBean(updateReqVO, RecipeDeviceAttributeDO.class); // recipeDeviceAttributeMapper.updateById(updateObj); // } -@Override -@Transactional(rollbackFor = Exception.class) // 事务保证原子性 -public Boolean updateRecipeDeviceAttribute(RecipeDeviceAttributeUpdateReqVO reqVO) { - // 1. 非空校验:recipeId不能为空(和create保持一致的校验风格) - if (reqVO.getRecipeId() == null) { - throw new IllegalArgumentException("更新失败:配方ID(recipeId)不能为空"); - } + @Override + @Transactional(rollbackFor = Exception.class) // 事务保证原子性 + public Boolean updateRecipeDeviceAttribute(RecipeDeviceAttributeUpdateReqVO reqVO) { + // 1. 非空校验:recipeId不能为空(和create保持一致的校验风格) + if (reqVO.getRecipeId() == null) { + throw new IllegalArgumentException("更新失败:配方ID(recipeId)不能为空"); + } - // 步骤1:删除该recipeId下的所有旧记录 - LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); - deleteWrapper.eq(RecipeDeviceAttributeDO::getRecipeId, reqVO.getRecipeId()); - recipeDeviceAttributeMapper.delete(deleteWrapper); + // 步骤1:删除该recipeId下的所有旧记录 + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(RecipeDeviceAttributeDO::getRecipeId, reqVO.getRecipeId()); + recipeDeviceAttributeMapper.delete(deleteWrapper); - // 步骤2:如果ids不为空,批量创建新记录(复用create的Bean拷贝+流式处理风格) - Boolean insertSuccess = true; // 默认成功(无ids时直接返回成功) - if (!CollectionUtils.isEmpty(reqVO.getIds())) { - List attributeList = reqVO.getIds().stream() - .map(attributeId -> { - // 复用create的Bean拷贝逻辑,保持代码风格一致 - RecipeDeviceAttributeDO attributeDO = BeanUtils.toBean(reqVO, RecipeDeviceAttributeDO.class); - attributeDO.setAttributeId(attributeId); - return attributeDO; - }) - .collect(Collectors.toList()); + // 步骤2:如果ids不为空,批量创建新记录(复用create的Bean拷贝+流式处理风格) + Boolean insertSuccess = true; // 默认成功(无ids时直接返回成功) + if (!CollectionUtils.isEmpty(reqVO.getIds())) { + List attributeList = reqVO.getIds().stream() + .map(attributeId -> { + // 复用create的Bean拷贝逻辑,保持代码风格一致 + RecipeDeviceAttributeDO attributeDO = BeanUtils.toBean(reqVO, RecipeDeviceAttributeDO.class); + attributeDO.setAttributeId(attributeId); + return attributeDO; + }) + .collect(Collectors.toList()); - // 复用create的批量插入逻辑,返回插入结果 - insertSuccess = recipeDeviceAttributeMapper.insertBatch(attributeList); - } + // 复用create的批量插入逻辑,返回插入结果 + insertSuccess = recipeDeviceAttributeMapper.insertBatch(attributeList); + } - // 返回最终结果(删除必成功,插入结果决定最终返回值) - return insertSuccess; -} + // 返回最终结果(删除必成功,插入结果决定最终返回值) + return insertSuccess; + } @Override public void deleteRecipeDeviceAttribute(Long id) { @@ -150,4 +160,157 @@ public Boolean updateRecipeDeviceAttribute(RecipeDeviceAttributeUpdateReqVO reqV return recipeDeviceAttributeMapper.selectPageWithAttributeWrap(reqVO); } -} \ No newline at end of file + + // @Override +// public List> operationAnalysisDetails(Long deviceId, String collectionStartTime, String collectionEndTime) { +// // 1. 入参校验:仅校验deviceId +// if (deviceId == null) { +// throw exception(DEVICE_ID_DOES_NOT_EXIST); +// } +// +// List> resultList = new ArrayList<>(); +// +// try { +// // 2. 获取设备数据列表(按时间倒序) +// List> deviceDataList = tdengineService.getstDeviceDataOrderByTimeDesc( +// deviceId, collectionStartTime, collectionEndTime); +// +// // 3. 遍历每个时间点的数据 +// for (Map deviceData : deviceDataList) { +// String queryDataJson = (String) deviceData.get("queryData"); +// Timestamp timestamp = (Timestamp) deviceData.get("timestamp"); +// +// // 时间格式化(保持原有格式) +// SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); +// String formattedTime = sdf.format(timestamp); +// +// // 仅处理有效数据(JSON非空 + 时间戳非空) +// if (StringUtils.isNotBlank(queryDataJson) && timestamp != null) { +// // 解析JSON为结构化数据 +// List> dataList = new ObjectMapper().readValue( +// queryDataJson, +// new TypeReference>>() {} +// ); +// +// // 按属性类型分组(保留LinkedHashMap保证顺序) +// Map>> groupedData = new LinkedHashMap<>(); +// for (Map data : dataList) { +// // 移除modelId过滤逻辑,处理所有数据 +// String attributeTypeName = "其他"; +// String typeStr = (String) data.get("attributeType"); +// if (typeStr != null) { +// try { +// attributeTypeName = typeStr; +// } catch (Exception e) { +// attributeTypeName = "未知"; +// } +// } +// +// // 简化数据结构(仅保留核心字段) +// Map simplifiedData = new HashMap<>(); +// simplifiedData.put("addressValue", data.get("addressValue")); +// simplifiedData.put("attributeName", data.get("attributeName")); +// +// // 按属性类型分组存储 +// groupedData.computeIfAbsent(attributeTypeName, k -> new ArrayList<>()).add(simplifiedData); +// } +// +// // 构建当前时间点的最终数据 +// Map timePointData = new LinkedHashMap<>(); +// // 添加分组后的属性数据 +// for (Map.Entry>> entry : groupedData.entrySet()) { +// timePointData.put(entry.getKey(), entry.getValue()); +// } +// // 添加格式化的采集时间 +// timePointData.put("collectTime", formattedTime); +// +// resultList.add(timePointData); +// } +// } +// } catch (Exception e) { +// throw new RuntimeException("处理设备数据时发生异常", e); +// } +// +// return resultList; +// } + @Override + public Map>> singleDevice(Long deviceId) throws JsonProcessingException { + + Map>> resultMap = new LinkedHashMap<>(); + + try { + // 1. 获取设备数据列表 + List> deviceDataList = tdengineService.getNewestDeviceDataOrderByTimeDesc(deviceId); + // 3. 遍历并处理 + for (Map deviceData : deviceDataList) { + String queryDataJson = (String) deviceData.get("queryData"); + + if (StringUtils.isNotBlank(queryDataJson)) { + // 使用TypeReference解析为List而不是具体的DO对象 + List> dataList = new ObjectMapper().readValue( + queryDataJson, + new TypeReference>>() {} + ); + + for (Map data : dataList) { + // 获取属性类型名称 + String attributeTypeName = "其他"; + String typeStr = (String) data.get("attributeType"); + if (typeStr != null) { + try { + attributeTypeName = typeStr; + } catch (Exception e) { + attributeTypeName = "未知"; + } + } + + // 提取需要的字段 + Map simplifiedData = new HashMap<>(); + simplifiedData.put("addressValue", data.get("addressValue")); + simplifiedData.put("attributeName", data.get("attributeName")); + + resultMap + .computeIfAbsent(attributeTypeName, k -> new ArrayList<>()) + .add(simplifiedData); + } + } + } + + } catch (Exception e) { + System.out.println("处理设备数据时发生异常: " + e.getMessage()); + } + + return resultMap; + } + + + @Override + public List getByRecipeId(Long recipeId) { + if (recipeId == null) { + return Collections.emptyList(); + } + return recipeDeviceAttributeMapper.selectByRecipeId(recipeId); + } + + @Override + public Map getDeviceContactModelAttr(Long attributeId) { + Map resultMap = new HashMap<>(2); + if (attributeId == null) { + resultMap.put("attributeName", ""); + resultMap.put("dataUnit", ""); + return resultMap; + } + // 查询设备触点模型记录 +// Map modelMap = deviceContactModelMapper.selectAttributeNameAndUnitById(attributeId); +// if (modelMap == null) { +// resultMap.put("attributeName", ""); +// resultMap.put("dataUnit", ""); +// return resultMap; +// } +// // 封装返回结果 +// resultMap.put("attributeName", modelMap.getOrDefault("attribute_name", "")); +// resultMap.put("dataUnit", modelMap.getOrDefault("data_unit", "")); + return resultMap; + } + +} 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 new file mode 100644 index 0000000000..b05b6d8371 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.iot.service.recipedevicerecord; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipedevicerecord.RecipeDeviceRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 设备点位采集值记录 Service 接口 + * + * @author 内蒙必硕 + */ +public interface RecipeDeviceRecordService { + + /** + * 创建设备点位采集值记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRecipeDeviceRecord(@Valid RecipeDeviceRecordSaveReqVO createReqVO); + + /** + * 更新设备点位采集值记录 + * + * @param updateReqVO 更新信息 + */ + void updateRecipeDeviceRecord(@Valid RecipeDeviceRecordSaveReqVO updateReqVO); + + /** + * 删除设备点位采集值记录 + * + * @param id 编号 + */ + void deleteRecipeDeviceRecord(Long id); + + /** + * 获得设备点位采集值记录 + * + * @param id 编号 + * @return 设备点位采集值记录 + */ + RecipeDeviceRecordDO getRecipeDeviceRecord(Long id); + + /** + * 获得设备点位采集值记录分页 + * + * @param pageReqVO 分页查询 + * @return 设备点位采集值记录分页 + */ + PageResult getRecipeDeviceRecordPage(RecipeDeviceRecordPageReqVO pageReqVO); + +} \ 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 new file mode 100644 index 0000000000..45e7db22ba --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipedevicerecord/RecipeDeviceRecordServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.iot.service.recipedevicerecord; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.iot.controller.admin.recipedevicerecord.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipedevicerecord.RecipeDeviceRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.iot.dal.mysql.recipedevicerecord.RecipeDeviceRecordMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; + +/** + * 设备点位采集值记录 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class RecipeDeviceRecordServiceImpl implements RecipeDeviceRecordService { + + @Resource + private RecipeDeviceRecordMapper recipeDeviceRecordMapper; + + @Override + public Long createRecipeDeviceRecord(RecipeDeviceRecordSaveReqVO createReqVO) { + // 插入 + RecipeDeviceRecordDO recipeDeviceRecord = BeanUtils.toBean(createReqVO, RecipeDeviceRecordDO.class); + recipeDeviceRecordMapper.insert(recipeDeviceRecord); + // 返回 + return recipeDeviceRecord.getId(); + } + + @Override + public void updateRecipeDeviceRecord(RecipeDeviceRecordSaveReqVO updateReqVO) { + // 校验存在 + validateRecipeDeviceRecordExists(updateReqVO.getId()); + // 更新 + RecipeDeviceRecordDO updateObj = BeanUtils.toBean(updateReqVO, RecipeDeviceRecordDO.class); + recipeDeviceRecordMapper.updateById(updateObj); + } + + @Override + public void deleteRecipeDeviceRecord(Long id) { + // 校验存在 + validateRecipeDeviceRecordExists(id); + // 删除 + recipeDeviceRecordMapper.deleteById(id); + } + + private void validateRecipeDeviceRecordExists(Long id) { + if (recipeDeviceRecordMapper.selectById(id) == null) { + throw exception(RECIPE_DEVICE_RECORD_NOT_EXISTS); + } + } + + @Override + public RecipeDeviceRecordDO getRecipeDeviceRecord(Long id) { + return recipeDeviceRecordMapper.selectById(id); + } + + @Override + public PageResult getRecipeDeviceRecordPage(RecipeDeviceRecordPageReqVO pageReqVO) { + return recipeDeviceRecordMapper.selectPage(pageReqVO); + } + +} \ 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/recipeplandetail/RecipePlanDetailService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailService.java index 428989f463..dd6b4d1a41 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailService.java @@ -1,11 +1,9 @@ package cn.iocoder.yudao.module.iot.service.recipeplandetail; -import java.util.*; import javax.validation.*; import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; /** * 配方计划详情表(配方库) Service 接口 @@ -52,4 +50,6 @@ public interface RecipePlanDetailService { */ PageResult getRecipePlanDetailPage(RecipePlanDetailPageReqVO pageReqVO); + PageResult pageRecipePlanDetail(RecipePlanDetailPageReqVO reqVO); + } \ 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/recipeplandetail/RecipePlanDetailServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailServiceImpl.java index 91cdd70aac..1aeec05948 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipeplandetail/RecipePlanDetailServiceImpl.java @@ -3,13 +3,10 @@ package cn.iocoder.yudao.module.iot.service.recipeplandetail; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; -import java.util.*; import cn.iocoder.yudao.module.iot.controller.admin.recipeplandetail.vo.*; import cn.iocoder.yudao.module.iot.dal.dataobject.recipeplandetail.RecipePlanDetailDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.iot.dal.mysql.recipeplandetail.RecipePlanDetailMapper; @@ -17,6 +14,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.recipeplandetail.RecipePlanDetailMa import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; + /** * 配方计划详情表(配方库) Service 实现类 * @@ -71,4 +69,10 @@ public class RecipePlanDetailServiceImpl implements RecipePlanDetailService { return recipePlanDetailMapper.selectPage(pageReqVO); } + @Override + public PageResult pageRecipePlanDetail(RecipePlanDetailPageReqVO reqVO) { + // 直接调用Mapper的联表分页方法,无需手动拼接关联字段 + return recipePlanDetailMapper.selectPageWithRelationsWrap(reqVO); + } + } \ 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/recipepoint/RecipePointService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepoint/RecipePointService.java index bd2b42d7e5..c8d6cb3fe5 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepoint/RecipePointService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepoint/RecipePointService.java @@ -52,4 +52,6 @@ public interface RecipePointService { */ PageResult getRecipePointPage(RecipePointPageReqVO pageReqVO); + + } \ 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/recipepoint/RecipePointServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepoint/RecipePointServiceImpl.java index 999836e331..2cee739c38 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepoint/RecipePointServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepoint/RecipePointServiceImpl.java @@ -62,13 +62,17 @@ public class RecipePointServiceImpl implements RecipePointService { } @Override - public RecipePointDO getRecipePoint(Long id) { - return recipePointMapper.selectById(id); + public PageResult getRecipePointPage(RecipePointPageReqVO pageReqVO) { + return recipePointMapper.selectPage(pageReqVO); } @Override - public PageResult getRecipePointPage(RecipePointPageReqVO pageReqVO) { - return recipePointMapper.selectPage(pageReqVO); + public RecipePointDO getRecipePoint(Long id) { + if (id == null) { + return null; + } + return Optional.ofNullable(recipePointMapper.selectById(id)) + .orElse(null); } } \ 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/RecipePointRecordService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordService.java new file mode 100644 index 0000000000..eeb5921b57 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.iot.service.recipepointrecord; + +import java.util.*; +import javax.validation.*; +import cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipepointrecord.RecipePointRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * IoT配方点位记录 Service 接口 + * + * @author 内蒙必硕 + */ +public interface RecipePointRecordService { + + /** + * 创建IoT配方点位记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRecipePointRecord(@Valid RecipePointRecordSaveReqVO createReqVO); + + /** + * 更新IoT配方点位记录 + * + * @param updateReqVO 更新信息 + */ + void updateRecipePointRecord(@Valid RecipePointRecordSaveReqVO updateReqVO); + + /** + * 删除IoT配方点位记录 + * + * @param id 编号 + */ + void deleteRecipePointRecord(Long id); + + /** + * 获得IoT配方点位记录 + * + * @param id 编号 + * @return IoT配方点位记录 + */ + RecipePointRecordDO getRecipePointRecord(Long id); + + /** + * 获得IoT配方点位记录分页 + * + * @param pageReqVO 分页查询 + * @return IoT配方点位记录分页 + */ + PageResult getRecipePointRecordPage(RecipePointRecordPageReqVO pageReqVO); + +} \ 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 new file mode 100644 index 0000000000..c08cb7bfc5 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/recipepointrecord/RecipePointRecordServiceImpl.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.iot.service.recipepointrecord; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.iot.controller.admin.recipepointrecord.vo.*; +import cn.iocoder.yudao.module.iot.dal.dataobject.recipepointrecord.RecipePointRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.iot.dal.mysql.recipepointrecord.RecipePointRecordMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; + +/** + * IoT配方点位记录 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class RecipePointRecordServiceImpl implements RecipePointRecordService { + + @Resource + private RecipePointRecordMapper recipePointRecordMapper; + + @Override + public Long createRecipePointRecord(RecipePointRecordSaveReqVO createReqVO) { + // 插入 + RecipePointRecordDO recipePointRecord = BeanUtils.toBean(createReqVO, RecipePointRecordDO.class); + recipePointRecordMapper.insert(recipePointRecord); + // 返回 + return recipePointRecord.getId(); + } + + @Override + public void updateRecipePointRecord(RecipePointRecordSaveReqVO updateReqVO) { + // 校验存在 + validateRecipePointRecordExists(updateReqVO.getId()); + // 更新 + RecipePointRecordDO updateObj = BeanUtils.toBean(updateReqVO, RecipePointRecordDO.class); + recipePointRecordMapper.updateById(updateObj); + } + + @Override + public void deleteRecipePointRecord(Long id) { + // 校验存在 + validateRecipePointRecordExists(id); + // 删除 + recipePointRecordMapper.deleteById(id); + } + + private void validateRecipePointRecordExists(Long id) { + if (recipePointRecordMapper.selectById(id) == null) { + throw exception(RECIPE_POINT_RECORD_NOT_EXISTS); + } + } + + @Override + public RecipePointRecordDO getRecipePointRecord(Long id) { + return recipePointRecordMapper.selectById(id); + } + + @Override + public PageResult getRecipePointRecordPage(RecipePointRecordPageReqVO pageReqVO) { + return recipePointRecordMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/devicecontactmodel/DeviceContactModelMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/devicecontactmodel/DeviceContactModelMapper.xml new file mode 100644 index 0000000000..8f4186458d --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/devicecontactmodel/DeviceContactModelMapper.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipedevicerecord/RecipeDeviceRecordMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipedevicerecord/RecipeDeviceRecordMapper.xml new file mode 100644 index 0000000000..4b14ee0383 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipedevicerecord/RecipeDeviceRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipepointrecord/RecipePointRecordMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipepointrecord/RecipePointRecordMapper.xml new file mode 100644 index 0000000000..fa21166f87 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/recipepointrecord/RecipePointRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file