Quellcode durchsuchen

feat:修改冷链设备导入方法,增加必填项未填校验
feat:新增冰箱批量导入功能
feat:新增冰箱批量修改功能
feat:新增房间名组织内不可重复校验

黄渊昊 vor 4 Monaten
Ursprung
Commit
e30c198dc3
11 geänderte Dateien mit 357 neuen und 14 gelöschten Zeilen
  1. 21 10
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/entity/MonitorDeviceTemplate.java
  2. 12 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/param/MonitorDeviceAddParam.java
  3. 12 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/param/MonitorDeviceEditParam.java
  4. 16 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java
  5. 27 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/controller/MonitorTargetController.java
  6. 50 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/entity/MonitorTargetTemplate.java
  7. 70 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetBatchEditWithRoomParam.java
  8. 21 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/MonitorTargetService.java
  9. 91 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/impl/MonitorTargetServiceImpl.java
  10. 10 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/TargetRoomService.java
  11. 27 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/impl/TargetRoomServiceImpl.java

+ 21 - 10
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/entity/MonitorDeviceTemplate.java

@@ -13,6 +13,7 @@
 package vip.xiaonuo.coldchain.modular.monitordevice.entity;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -31,57 +32,67 @@ public class MonitorDeviceTemplate{
      * 设备型号
      */
     @Schema(description = "设备型号")
-    @ExcelProperty("设备型号编码")
+    @ColumnWidth(25)
+    @ExcelProperty("设备型号编码(必选)")
     private String modelName;
 
     /**
      * 设备编码
      */
     @Schema(description = "设备编码")
-    @ExcelProperty("设备编码")
+    @ExcelProperty("设备编码(必填)")
+    @ColumnWidth(15)
     private String deviceCode;
 
     /**
-     * 设备名称
+     * mac
      */
-    @Schema(description = "设备名称")
-    @ExcelProperty("设备名称")
-    private String deviceName;
+    @Schema(description = "mac")
+    @ExcelProperty("设备mac地址(必填)")
+    @ColumnWidth(20)
+    private String mac;
 
     /**
-     * 传感器路数
+     * 设备名称
      */
-    @Schema(description = "传感器路数")
-    @ExcelProperty("传感器总路数")
-    private Integer sensorCount;
+    @Schema(description = "设备名称")
+    @ExcelProperty("设备名称(必填)")
+    @ColumnWidth(15)
+    private String deviceName;
 
     /** 报警上限 */
     @Schema(description = "报警上限")
     @ExcelProperty("温度上限(℃)")
+    @ColumnWidth(13)
     private Float temperatureUp;
 
     /** 报警上限 */
     @Schema(description = "报警上限")
     @ExcelProperty("湿度上限(%)")
+    @ColumnWidth(13)
     private Float humidityUp;
 
     /** 报警上限 */
     @Schema(description = "报警上限")
     @ExcelProperty("二氧化碳上限(ppm)")
+    @ColumnWidth(15)
     private Float co2Up;
 
     /** 报警下限 */
     @Schema(description = "报警下限")
     @ExcelProperty("温度下限(℃)")
+    @ColumnWidth(13)
     private Float temperatureDown;
 
     /** 报警下限 */
     @Schema(description = "报警下限")
     @ExcelProperty("湿度下限(%)")
+    @ColumnWidth(13)
     private Float humidityDown;
 
     /** 报警下限 */
     @Schema(description = "报警下限")
     @ExcelProperty("二氧化碳下限(ppm)")
+    @ColumnWidth(15)
     private Float co2Down;
 }

+ 12 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/param/MonitorDeviceAddParam.java

@@ -68,6 +68,18 @@ public class MonitorDeviceAddParam {
     @Schema(description = "排序码")
     private Integer sortCode;
 
+    /**
+     * mac
+     */
+    @Schema(description = "mac")
+    private String mac;
+
+    /**
+     * ip
+     */
+    @Schema(description = "ip")
+    private String ip;
+
     /**
      * 报警上限
      */

+ 12 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/param/MonitorDeviceEditParam.java

@@ -77,6 +77,18 @@ public class MonitorDeviceEditParam {
     @Schema(description = "排序码")
     private Integer sortCode;
 
+    /**
+     * mac
+     */
+    @Schema(description = "mac")
+    private String mac;
+
+    /**
+     * ip
+     */
+    @Schema(description = "ip")
+    private String ip;
+
     /** 报警上限 */
     @Schema(description = "报警上限")
     private Float temperatureUp;

+ 16 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java

@@ -441,8 +441,6 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
 //        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
         response.setContentType("application/vnd.ms-excel");
         response.setCharacterEncoding("utf-8");
-        //设置导出文件名
-        String filename = "笼位信息模版";
 
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8) + ".xls");
         //模板实体类
@@ -473,7 +471,7 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
         map.put(0, billingNameList.toArray(new String[0]));
         return map;
     }
-
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void importMonitorDevice(MultipartFile file) {
         List<MonitorDeviceTemplate> monitorDeviceTemplateList = null;
@@ -489,23 +487,38 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
         }
         List<MonitorDeviceAddParam> monitorDeviceList = new ArrayList<>();
         for (MonitorDeviceTemplate monitorDeviceTemplate : monitorDeviceTemplateList) {
+            MonitorDeviceType monitorDeviceType = monitorDeviceTypeService.getByModelName(monitorDeviceTemplate.getModelName());
+            if (StrUtil.isBlank(monitorDeviceTemplate.getDeviceName()) && StrUtil.isBlank(monitorDeviceTemplate.getModelName())
+            && StrUtil.isBlank(monitorDeviceTemplate.getDeviceCode()) && StrUtil.isBlank(monitorDeviceTemplate.getMac())) {
+                throw new CommonException("设备:*" + monitorDeviceTemplate.getDeviceName() + "*包含未填的必填项");
+            }
             // 判断上下限输入是否合法
             if (!Objects.isNull(monitorDeviceTemplate.getTemperatureUp()) && !Objects.isNull(monitorDeviceTemplate.getTemperatureDown())) {
                 if (monitorDeviceTemplate.getTemperatureDown() >= monitorDeviceTemplate.getTemperatureUp()) {
                     throw new CommonException("设备:*" + monitorDeviceTemplate.getDeviceName() + "*的温度上下限填写有误");
                 }
+            } else {
+                monitorDeviceTemplate.setTemperatureUp(monitorDeviceType.getTemperatureUp());
+                monitorDeviceTemplate.setTemperatureDown(monitorDeviceType.getTemperatureDown());
             }
             if (!Objects.isNull(monitorDeviceTemplate.getHumidityUp()) && !Objects.isNull(monitorDeviceTemplate.getHumidityDown())) {
                 if (monitorDeviceTemplate.getHumidityDown() >= monitorDeviceTemplate.getHumidityUp()) {
                     throw new CommonException("设备:*" + monitorDeviceTemplate.getDeviceName() + "*的湿度上下限填写有误");
                 }
+            } else {
+                monitorDeviceTemplate.setHumidityUp(monitorDeviceType.getHumidityUp());
+                monitorDeviceTemplate.setHumidityDown(monitorDeviceType.getHumidityDown());
             }
             if (!Objects.isNull(monitorDeviceTemplate.getCo2Up()) && !Objects.isNull(monitorDeviceTemplate.getCo2Down())) {
                 if (monitorDeviceTemplate.getCo2Down() >= monitorDeviceTemplate.getCo2Up()) {
                     throw new CommonException("设备:*" + monitorDeviceTemplate.getDeviceName() + "*的二氧化碳上下限填写有误");
                 }
+            } else {
+                monitorDeviceTemplate.setCo2Up(monitorDeviceType.getCo2Up());
+                monitorDeviceTemplate.setCo2Down(monitorDeviceType.getCo2Down());
             }
             MonitorDeviceAddParam monitorDevice = BeanUtil.copyProperties(monitorDeviceTemplate, MonitorDeviceAddParam.class);
+            monitorDevice.setSensorCount(monitorDeviceType.getSensorCount());
             monitorDeviceList.add(monitorDevice);
         }
         // 入库操作

+ 27 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/controller/MonitorTargetController.java

@@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
 import org.springframework.validation.annotation.Validated;
@@ -24,6 +25,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
 import vip.xiaonuo.coldchain.modular.monitortarget.param.*;
 import vip.xiaonuo.coldchain.modular.monitortarget.service.MonitorTargetService;
@@ -96,6 +98,11 @@ public class MonitorTargetController {
         return CommonResult.ok();
     }
 
+    /**
+     * 批量配置报警接收人
+     */
+
+
 
     /**
      * 根据房间添加监控对象管理
@@ -185,4 +192,24 @@ public class MonitorTargetController {
     public CommonResult<List<MonitorTarget>> list(Boolean isAll,String sensorType) {
         return CommonResult.data(monitorTargetService.myList(isAll));
     }
+
+    /**
+     * 下载Excel模板
+     */
+    @Operation(summary = "下载Excel模板")
+    @GetMapping("/coldchain/monitortarget/downloadTemplate")
+    public CommonResult<String> downloadTemplate(HttpServletResponse response) {
+        monitorTargetService.downloadTemplate(response);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 导入数据
+     */
+    @Operation(summary = "导入数据")
+    @PostMapping("/coldchain/monitortarget/import")
+    public CommonResult<String> importMonitorDevice(MultipartFile file) {
+        monitorTargetService.importMonitorDevice(file);
+        return CommonResult.ok();
+    }
 }

+ 50 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/entity/MonitorTargetTemplate.java

@@ -0,0 +1,50 @@
+package vip.xiaonuo.coldchain.modular.monitortarget.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.google.common.collect.Lists;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.coldchain.core.alarm.bean.NotificationChannel;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
+import vip.xiaonuo.coldchain.core.handler.NotificationChannelListTypeHandler;
+import vip.xiaonuo.coldchain.core.handler.SensorAlarmUserTypeHandler;
+import vip.xiaonuo.coldchain.modular.monitortargetregion.entity.MonitorTargetRegion;
+
+import java.util.Date;
+import java.util.List;
+
+@Getter
+@Setter
+@EqualsAndHashCode
+@Data
+public class MonitorTargetTemplate {
+
+    /**
+     * 房间名
+     */
+    @Schema(description = "房间名")
+    @ExcelProperty("房间名(必填)")
+    @ColumnWidth(20)
+    private String roomName;
+
+    /**
+     * 名称
+     */
+    @Schema(description = "名称")
+    @ExcelProperty("冰箱名称(必填)")
+    @ColumnWidth(25)
+    private String name;
+
+    /**
+     * 监控位置区域
+     */
+    @Schema(description = "监控位置区域")
+    @ExcelProperty("冰箱位置")
+    @ColumnWidth(30)
+    private String monitorPoint;
+}

+ 70 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetBatchEditWithRoomParam.java

@@ -0,0 +1,70 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.coldchain.modular.monitortarget.param;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.google.common.collect.Lists;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
+import vip.xiaonuo.coldchain.core.handler.SensorAlarmUserTypeHandler;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 监控对象管理编辑参数
+ *
+ * @author 黄渊昊
+ * @date 2024/11/13 16:56
+ **/
+@Getter
+@Setter
+public class MonitorTargetBatchEditWithRoomParam {
+
+    /**
+     * ID
+     */
+    @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "id不能为空")
+    private List<String> idList;
+
+    /**
+     * 状态(1:正常,2:闲置)
+     */
+    @Schema(description = "状态(1:正常,2:闲置)")
+    private String status;
+
+    /**
+     * 监控位置区域
+     */
+    @Schema(description = "监控位置区域")
+    private String monitorPoint;
+
+    /**
+     * 告警接收人,存储告警通知的接收用户信息
+     */
+    @TableField(value = "alarm_users", typeHandler = SensorAlarmUserTypeHandler.class)
+    @Schema(description = "告警接收人,存储告警通知的接收用户信息")
+    private List<SensorAlarmUser> alarmUsers = Lists.newArrayList();
+
+    /**
+     * 房间id
+     */
+    @NotNull(message = "房间不能为空")
+    private String roomId;
+}

+ 21 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/MonitorTargetService.java

@@ -14,6 +14,9 @@ package vip.xiaonuo.coldchain.modular.monitortarget.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.web.multipart.MultipartFile;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
 import vip.xiaonuo.coldchain.modular.monitortarget.enums.MonitorStatusEnum;
 import vip.xiaonuo.coldchain.modular.monitortarget.param.*;
@@ -63,6 +66,11 @@ public interface MonitorTargetService extends IService<MonitorTarget> {
      */
     void edit(MonitorTargetEditParam monitorTargetEditParam);
 
+    /**
+     * 批量设置预警接收人
+     */
+    void batchEditAlarmUsers(MonitorTargetBatchEditWithRoomParam batchEditWithRoomParam);
+
     /**
      * 删除监控对象管理
      *
@@ -145,4 +153,17 @@ public interface MonitorTargetService extends IService<MonitorTarget> {
     void updateStatusbatch(Map<String,Integer> deviceCodes);
 
     Page<MonitorTarget> selectMonitorTargetByPage(MonitorTargetPageParam monitorTargetPageParam);
+
+    /**
+     * 下载导入模版
+     * @param response
+     */
+    void downloadTemplate(HttpServletResponse response);
+
+    /**
+     * 导入数据
+     * @param file
+     * @return
+     */
+    void importMonitorDevice(MultipartFile file);
 }

+ 91 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/impl/MonitorTargetServiceImpl.java

@@ -17,20 +17,30 @@ import cn.hutool.core.collection.CollStreamUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 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.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
 import vip.xiaonuo.coldchain.core.config.JfcloudRedisCacheService;
+import vip.xiaonuo.coldchain.modular.monitordevice.entity.MonitorDeviceTemplate;
+import vip.xiaonuo.coldchain.modular.monitordevice.handler.CustomCellWriteHandler;
+import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceAddParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
+import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.MonitorDeviceType;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
+import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTargetTemplate;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.StatusCount;
 import vip.xiaonuo.coldchain.modular.monitortarget.enums.MonitorStatusEnum;
 import vip.xiaonuo.coldchain.modular.monitortarget.mapper.MonitorTargetMapper;
@@ -45,6 +55,11 @@ import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.page.CommonPageRequest;
 
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -132,7 +147,18 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         MonitorTarget monitorTarget = this.queryEntity(monitorTargetEditParam.getId());
         BeanUtil.copyProperties(monitorTargetEditParam, monitorTarget);
         this.updateById(monitorTarget);
-        
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void batchEditAlarmUsers(MonitorTargetBatchEditWithRoomParam batchEditWithRoomParam) {
+        List<MonitorTarget> monitorTargetList = new ArrayList<>();
+        batchEditWithRoomParam.getIdList().forEach(id -> {
+            MonitorTarget monitorTarget = this.queryEntity(id);
+            BeanUtil.copyProperties(batchEditWithRoomParam, monitorTarget);
+            monitorTargetList.add(monitorTarget);
+        });
+        this.updateBatchById(monitorTargetList);
     }
 
     @Override
@@ -388,4 +414,68 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         return list(queryWrapper);
     }
 
+    @Override
+    public void downloadTemplate(HttpServletResponse response) {
+        String fileName = "冰箱导入模板";
+        String sheetName = "冰箱设备导入模板";
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+
+        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8) + ".xls");
+        //模板实体类
+        List<MonitorDeviceTemplate> secondInspProbExcelDTOS = new ArrayList<>();
+        //普通下拉数据
+        Map<Integer, String[]> map = ordinarySelect();
+        try (OutputStream outputStream = response.getOutputStream()) {
+            EasyExcel.write(outputStream, MonitorTargetTemplate.class)
+                    .registerWriteHandler(new CustomCellWriteHandler(map))
+                    .excelType(ExcelTypeEnum.XLS)
+                    .sheet(sheetName)
+                    .doWrite(secondInspProbExcelDTOS);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 普通下拉数据
+     *
+     * @return
+     */
+    private Map<Integer, String[]> ordinarySelect() {
+        Map<Integer, String[]> map = new HashMap<>();
+
+        List<TargetRoom> list = targetRoomService.myList();
+        List<String> billingNameList = list.stream().map(TargetRoom::getName).toList();
+        map.put(0, billingNameList.toArray(new String[0]));
+        return map;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void importMonitorDevice(MultipartFile file) {
+        List<MonitorTargetTemplate> monitorTargetTemplates = null;
+        // excel同步读取数据
+        try {
+            monitorTargetTemplates = EasyExcel.read(new BufferedInputStream(file.getInputStream())).head(MonitorTargetTemplate.class).sheet().doReadSync();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        // 检查是否大于1000条
+        if (monitorTargetTemplates.size() > 1000) {
+            throw new RuntimeException("超过最多处理条数");
+        }
+        List<MonitorTargetAddWithRoomParam> monitorTargetAddParamList = new ArrayList<>();
+        for (MonitorTargetTemplate monitorTargetTemplate : monitorTargetTemplates) {
+            if (StrUtil.isBlank(monitorTargetTemplate.getName()) && StrUtil.isBlank(monitorTargetTemplate.getRoomName())) {
+                throw new CommonException("冰箱:*" + monitorTargetTemplate.getName() + "*包含未填的必填项");
+            }
+            MonitorTargetAddWithRoomParam monitorTargetAddParam = BeanUtil.copyProperties(monitorTargetTemplate, MonitorTargetAddWithRoomParam.class);
+            TargetRoom roomByName = targetRoomService.getRoomByName(monitorTargetTemplate.getRoomName());
+            monitorTargetAddParam.setRoomId(roomByName.getId());
+            monitorTargetAddParamList.add(monitorTargetAddParam);
+        }
+        // 入库操作
+        monitorTargetAddParamList.forEach(this::addWithRoom);
+    }
 }

+ 10 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/TargetRoomService.java

@@ -80,4 +80,14 @@ public interface TargetRoomService extends IService<TargetRoom> {
 
     List<TargetRoom> myList();
 
+    /**
+     * 判断房间名是否重复
+     */
+    Boolean ifRoomExist(String roomName);
+
+    /**
+     * 根据房间名获取房间对象
+     */
+    TargetRoom getRoomByName(String roomName);
+
 }

+ 27 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/targetroom/service/impl/TargetRoomServiceImpl.java

@@ -75,6 +75,9 @@ public class TargetRoomServiceImpl extends ServiceImpl<TargetRoomMapper, TargetR
     @Override
     public void add(TargetRoomAddParam targetRoomAddParam) {
         SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+        if (ifRoomExist(targetRoomAddParam.getName())) {
+            throw new CommonException("该房间名已存在!请重新输入");
+        }
         TargetRoom targetRoom = BeanUtil.toBean(targetRoomAddParam, TargetRoom.class);
          this.save(targetRoom);
     }
@@ -83,6 +86,9 @@ public class TargetRoomServiceImpl extends ServiceImpl<TargetRoomMapper, TargetR
     @Override
     public void edit(TargetRoomEditParam targetRoomEditParam) {
         TargetRoom targetRoom = this.queryEntity(targetRoomEditParam.getId());
+        if (ifRoomExist(targetRoomEditParam.getName())) {
+            throw new CommonException("该房间名已存在!请重新输入");
+        }
         BeanUtil.copyProperties(targetRoomEditParam, targetRoom);
         this.updateById(targetRoom);
     }
@@ -127,4 +133,25 @@ public class TargetRoomServiceImpl extends ServiceImpl<TargetRoomMapper, TargetR
         });
         return list;
     }
+
+    @Override
+    public Boolean ifRoomExist(String roomName) {
+        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+        LambdaQueryWrapper<TargetRoom> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TargetRoom::getCreateOrg,loginUser.getOrgId())
+                .eq(TargetRoom::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
+                .eq(TargetRoom::getName, roomName);
+        List<TargetRoom> list = list(queryWrapper);
+        return !list.isEmpty();
+    }
+
+    @Override
+    public TargetRoom getRoomByName(String roomName) {
+        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+        LambdaQueryWrapper<TargetRoom> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TargetRoom::getCreateOrg,loginUser.getOrgId())
+                .eq(TargetRoom::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
+                .eq(TargetRoom::getName, roomName);
+        return getOne(queryWrapper);
+    }
 }