diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index c2d1dc613..7a9932a4f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java @@ -1,12 +1,15 @@ package cn.iocoder.yudao.module.iot.controller.admin.device; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.erp.controller.admin.product.vo.unit.ErpProductUnitImportExcelVO; import cn.iocoder.yudao.module.infra.service.job.JobService; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; +import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.DeviceAttributeImportExcelVO; import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.DeviceContactModelPageReqVO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; @@ -17,12 +20,14 @@ import cn.iocoder.yudao.module.iot.service.device.TDengineService; import com.fasterxml.jackson.core.JsonProcessingException; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.eclipse.paho.client.mqttv3.MqttException; import org.quartz.SchedulerException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -357,6 +362,34 @@ public class DeviceController { return success(deviceService.getDeviceAttribute(id)); } + @GetMapping({"/get-import-template", "/device-attribute/get-import-template"}) + @Operation(summary = "获得导入设备属性模板") + @PreAuthorize("@ss.hasPermission('iot:device:import')") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + DeviceAttributeImportExcelVO.builder().attributeCode("StackCount").attributeName("堆叠数量").attributeType("产量统计").dataType("int") + .address("").dataUnit("kg").ratio(0.00).remark("").build() + ); + // 输出 + ExcelUtils.write(response, "设备点位导入模板.xls", "设备点位列表", DeviceAttributeImportExcelVO.class, list); + } + + @PostMapping({"/import", "/device-attribute/import"}) + @Operation(summary = "导入设备属性") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + //@PreAuthorize("@ss.hasPermission('')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport, + @RequestParam("deviceId") Long deviceId) throws Exception { + List list = ExcelUtils.read(file, DeviceAttributeImportExcelVO.class); + deviceService.importDeviceAttributeList(list, updateSupport, deviceId); + return success("导入成功"); + } + @GetMapping("/devicePointList") @PreAuthorize("@ss.hasPermission('iot:device:query')") public CommonResult> devicePointList() { diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicecontactmodel/vo/DeviceAttributeImportExcelVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicecontactmodel/vo/DeviceAttributeImportExcelVO.java new file mode 100644 index 000000000..ce56b920a --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/devicecontactmodel/vo/DeviceAttributeImportExcelVO.java @@ -0,0 +1,79 @@ +package cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableId; +import com.sun.xml.bind.v2.TODO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 单位 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class DeviceAttributeImportExcelVO { + + /** + * 点位编码 + */ + @ExcelProperty("点位编码") + private String attributeCode; + /** + * 点位名称 + */ + @ExcelProperty("点位名称") + private String attributeName; + + /** + * 点位类型 + * + * 枚举 {@link TODO mes_data_type 对应的类} + */ + @ExcelProperty("点位类型") + private String attributeType; + + /** + * 数据类型 + * + * 枚举 {@link TODO iot_device_data_type 对应的类} + */ + @ExcelProperty(value ="数据类型", converter = DictConvert.class) + @DictFormat("iot_device_data_type") + private String dataType; + /** + * 寄存器地址 + */ + @ExcelProperty("寄存器地址") + private String address; + + /** + * 单位 + */ + @ExcelProperty("单位") + private String dataUnit; + + /** + * 倍率 + */ + @ExcelProperty("倍率") + private Double ratio; + + /** + * 备注 + */ + @ExcelProperty("备注") + private String remark; + /* *//** + * 设备id + *//* + private Long deviceId; +*/ +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java index 5644fb52a..86bcc22c8 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; +import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.DeviceAttributeImportExcelVO; import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.DeviceContactModelPageReqVO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; @@ -165,4 +166,6 @@ public interface DeviceService { List> getDeviceAttributeGroupList(DeviceContactModelPageReqVO deviceModelAttributePageReqVO); Map historyAnalyse(Long deviceId, String collectionStartTime, String collectionEndTime, List attributeCodes); + + void importDeviceAttributeList(List list, Boolean updateSupport, Long deviceId); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index c6c7fd610..5def5f1ae 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.utils.CronE import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler.TaskSchedulerManager; import cn.iocoder.yudao.module.iot.controller.admin.device.utils.DataTypeParseUtil; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; +import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.DeviceAttributeImportExcelVO; import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.DeviceContactModelPageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils.TimeConverterUtil; import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.DeviceTotalTimeRecordReqVO; @@ -50,6 +51,7 @@ import cn.iocoder.yudao.module.iot.framework.mqtt.consumer.IMqttservice; import cn.iocoder.yudao.module.iot.util.MapListStatsCalculator; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -81,6 +83,7 @@ import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.IMPORT_LIST_IS_EMPTY; /** * 物联设备 Service 实现类 @@ -1176,6 +1179,39 @@ public class DeviceServiceImpl implements DeviceService { } } + @Override + public void importDeviceAttributeList(List list, Boolean updateSupport, Long deviceId) { + // 1.1 参数校验 + if (CollUtil.isEmpty(list)) { + throw exception(IMPORT_LIST_IS_EMPTY); + } + + // 1.2 查询主单位数据 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("primary_flag", "Y"); + List erpProductUnitDOS = productUnitMapper.selectList(wrapper); + Map> map = erpProductUnitDOS.stream().filter(Objects::nonNull) + .collect(Collectors.groupingBy( + ErpProductUnitDO::getName, + Collectors.toList() + )); + List erpDeviceContactDOs = new ArrayList<>(); + list.stream().forEach(importDeviceAttribute -> { + /* if(importDeviceAttribute.getDataUnit()!=null){ + List erpProductUnitDOS1 = map.get(importDeviceAttribute.getPrimaryName()); + if (CollUtil.isEmpty(erpProductUnitDOS1)) { + importDeviceAttribute.setPrimaryId(null); + } else { + importDeviceAttribute.setPrimaryId(erpProductUnitDOS1.get(0).getId()); + } + }*/ + DeviceContactModelDO deviceAttribute = BeanUtils.toBean(importDeviceAttribute, DeviceContactModelDO.class); + deviceAttribute.setDeviceId(deviceId); + erpDeviceContactDOs.add(deviceAttribute); + }); + CollUtil.isNotEmpty(erpDeviceContactDOs);deviceContactModelMapper.insertBatch(erpDeviceContactDOs); + } + @Override public PageResult> historyRecord(