Преглед на файлове

excel设备信息导入查询

chejianzheng преди 3 месеца
родител
ревизия
d645106ad4

+ 7 - 0
pom.xml

@@ -24,6 +24,7 @@
         <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
         <baomidou.version>3.5.2</baomidou.version>
         <spring-cloud.version>Hoxton.SR12</spring-cloud.version> <!-- Update Spring Cloud version -->
+        <easyexcel.version>3.3.2</easyexcel.version>
     </properties>
 
     <modules>
@@ -191,6 +192,12 @@
                 <version>4.5.0</version>
             </dependency>
 
+            <!-- EasyExcel 核心依赖 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version> <!-- 请检查最新版本 -->
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 52 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/admin/AdminDataController.java

@@ -0,0 +1,52 @@
+
+package com.hfln.portal.application.controller.admin;
+
+
+import cn.hfln.framework.catchlog.CatchAndLog;
+import cn.hfln.framework.dto.ApiResult;
+import com.hfln.portal.common.dto.data.device.DeviceDTO;
+import com.hfln.portal.common.request.device.DeviceListQueryReq;
+import com.hfln.portal.common.request.share.ShareParam;
+import com.hfln.portal.common.vo.PageRecord;
+import com.hfln.portal.common.vo.UploadRes;
+import com.hfln.portal.domain.gateway.AdminGateway;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.IOException;
+
+@RestController
+@CatchAndLog
+@Api(tags = "后台数据")
+@Slf4j
+@RequestMapping("/admin/data")
+public class AdminDataController {
+
+    @Autowired
+    private AdminGateway adminGateway;
+
+    @PostMapping("/uploadDev")
+    @ApiOperation(value = "excel上传设备信息")
+    public ApiResult<UploadRes> uploadDev(@Valid @RequestParam MultipartFile file) throws IOException {
+        return ApiResult.success(adminGateway.uploadDev(file));
+    }
+
+    @PostMapping("/queryDevList")
+    @ApiOperation(value = "查询上传设备信息")
+    public ApiResult<PageRecord<DeviceDTO>> queryDevList(@Valid @RequestBody DeviceListQueryReq queryReq) {
+        return ApiResult.success(adminGateway.queryDevList(queryReq));
+    }
+
+    @PostMapping("/addOneDevice")
+    @ApiOperation(value = "添加上传设备信息")
+    public ApiResult<Void> addOneDevice(@Valid @RequestBody DeviceDTO deviceDTO) {
+        adminGateway.addOneDevice(deviceDTO);
+        return ApiResult.success();
+    }
+
+}

+ 17 - 0
portal-service-common/src/main/java/com/hfln/portal/common/dto/DevInfoImportDto.java

@@ -0,0 +1,17 @@
+package com.hfln.portal.common.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class DevInfoImportDto {
+
+    @ExcelProperty("固件版本")
+    private String software;
+
+    @ExcelProperty("设备ID")
+    private String devId;
+
+    @ExcelProperty("设备类型")
+    private String devType;
+}

+ 17 - 0
portal-service-common/src/main/java/com/hfln/portal/common/request/device/DeviceListQueryReq.java

@@ -0,0 +1,17 @@
+package com.hfln.portal.common.request.device;
+
+import com.hfln.portal.common.vo.PageVo;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class DeviceListQueryReq extends PageVo {
+
+    private String clientId;
+
+    private LocalDate createTimeStart;
+
+    private LocalDate createTimeEnd;
+
+}

+ 2 - 2
portal-service-common/src/main/java/com/hfln/portal/common/vo/PageVo.java

@@ -9,8 +9,8 @@ import lombok.EqualsAndHashCode;
 public class PageVo extends BaseVO{
 
     @ApiModelProperty(value = "当前页码",required = true)
-    private Integer pageNo;
+    private Integer pageNo = 1;
 
     @ApiModelProperty(value = "页面大小",required = true)
-    private Integer pageSize;
+    private Integer pageSize = 10;
 }

+ 15 - 0
portal-service-common/src/main/java/com/hfln/portal/common/vo/UploadRes.java

@@ -0,0 +1,15 @@
+package com.hfln.portal.common.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class UploadRes extends BaseVO {
+
+
+    private boolean isSuc = true;
+    private String msg;
+    private List<String> msgList = new ArrayList<>();
+}

+ 48 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/customer/util/CopyUtils.java

@@ -0,0 +1,48 @@
+package com.hfln.portal.domain.customer.util;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hfln.portal.common.vo.PageRecord;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class CopyUtils {
+
+
+    // 浅拷贝
+    public static <T> T copy(Object source, Class<T> clazz) {
+
+        if (source == null) {
+            return null;
+        }
+        T target = BeanUtils.instantiateClass(clazz);
+        BeanUtils.copyProperties(source, target);
+        return target;
+    }
+
+    public static <T> List<T> copyList(List<?> sourceList, Class<T> clazz) {
+
+        if (CollectionUtils.isEmpty(sourceList)) {
+            return null;
+        }
+
+        return sourceList.stream()
+                .map(source -> copy(source, clazz))
+                .collect(Collectors.toList());
+    }
+
+
+    public static <T> PageRecord<T> copyPage(Page<?> page, List<T> targets) {
+        int totalPages = (int) Math.ceil((double) page.getTotal() / page.getSize());
+        PageRecord<T> pageRecord = new PageRecord<>();
+        pageRecord.setRows(targets);
+        pageRecord.setTotal(page.getTotal());
+        pageRecord.setPageNum((int) page.getCurrent());
+        pageRecord.setPageSize((int) page.getSize());
+        pageRecord.setOutTotalPageNum(page.getCurrent() > totalPages);
+        pageRecord.setTotalPageNum(totalPages);
+        return pageRecord;
+    }
+}

+ 1 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/exception/ErrorEnum.java

@@ -50,6 +50,7 @@ public enum ErrorEnum implements ErrorEnumInterface{
     DEVICE_IS_NOT_EXIST("50001", "设备不存在!"),
     DEVICE_IS_BINDING("50002", "当前设备已经被绑定!"),
     CLIENT_ID_ID_NULL("50003", "设备ID不能为空!"),
+    DEVICE_IS_EXIST("50004", "设备已存在!"),
 
     /**
      * 群组相关

+ 19 - 0
portal-service-domain/src/main/java/com/hfln/portal/domain/gateway/AdminGateway.java

@@ -0,0 +1,19 @@
+package com.hfln.portal.domain.gateway;
+
+import com.hfln.portal.common.dto.data.device.DeviceDTO;
+import com.hfln.portal.common.request.device.DeviceListQueryReq;
+import com.hfln.portal.common.vo.PageRecord;
+import com.hfln.portal.common.vo.UploadRes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.IOException;
+
+public interface AdminGateway {
+
+    UploadRes uploadDev(MultipartFile file) throws IOException;
+
+    PageRecord<DeviceDTO> queryDevList(@Valid DeviceListQueryReq queryReq);
+
+    void addOneDevice(@Valid DeviceDTO deviceDTO);
+}

+ 5 - 1
portal-service-infrastructure/pom.xml

@@ -81,7 +81,11 @@
             <artifactId>spring-integration-mqtt</artifactId>
         </dependency>
 
-
+        <!-- EasyExcel 核心依赖 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 143 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/AdminGatewayImpl.java

@@ -0,0 +1,143 @@
+package com.hfln.portal.infrastructure.gateway.impl;
+
+import cn.hfln.framework.extension.BizException;
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hfln.portal.common.dto.DevInfoImportDto;
+import com.hfln.portal.common.dto.data.device.DeviceDTO;
+import com.hfln.portal.common.request.device.DeviceListQueryReq;
+import com.hfln.portal.common.vo.PageRecord;
+import com.hfln.portal.common.vo.UploadRes;
+import com.hfln.portal.domain.customer.util.CopyUtils;
+import com.hfln.portal.domain.exception.ErrorEnum;
+import com.hfln.portal.domain.gateway.AdminGateway;
+import com.hfln.portal.infrastructure.mqtt.MqttClient;
+import com.hfln.portal.infrastructure.oss.OssClient;
+import com.hfln.portal.infrastructure.po.BasePO;
+import com.hfln.portal.infrastructure.po.DevInfo;
+import com.hfln.portal.infrastructure.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class AdminGatewayImpl implements AdminGateway {
+
+    @Autowired
+    private DevShareService devShareService;
+
+    @Autowired
+    private DevInfoService devInfoService;
+
+    @Autowired
+    private GroupShareService groupShareService;
+
+    @Autowired
+    private DevGroupService devGroupService;
+
+    @Autowired
+    private EventService eventService;
+
+    @Autowired
+    private OssFileService ossFileService;
+
+    @Autowired
+    private DevRoomService devRoomService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private MqttClient mqttClient;
+
+    @Autowired
+    private OssClient ossClient;
+
+    @Autowired
+    private AlarmEventService alarmEventService;
+
+
+    @Override
+    public UploadRes uploadDev(MultipartFile file) throws IOException {
+
+        // 校验文件非空
+        if (file.isEmpty()) {
+            throw new BizException(ErrorEnum.FILE_IS_EMPTY.getErrorCode(), ErrorEnum.FILE_IS_EMPTY.getErrorMessage());
+        }
+        List<DevInfoImportDto> devInfoImportVoList = EasyExcel.read(file.getInputStream(), DevInfoImportDto.class, null).sheet(0).doReadSync();
+        if (CollectionUtils.isEmpty(devInfoImportVoList)) {
+            throw new BizException(ErrorEnum.FILE_IS_EMPTY.getErrorCode(), ErrorEnum.FILE_IS_EMPTY.getErrorMessage());
+        }
+
+        List<String> devIds = devInfoImportVoList.stream()
+                .map(DevInfoImportDto::getDevId)
+                .distinct()
+                .collect(Collectors.toList());
+        List<String> existClientIds = devInfoService.queryClientIdListByClientIds(devIds);
+        if (!CollectionUtils.isEmpty(existClientIds)) {
+            devInfoImportVoList = devInfoImportVoList.stream().filter(item -> !existClientIds.contains(item.getDevId())).collect(Collectors.toList());
+        }
+
+        devInfoService.saveOrUpdateBatch(devInfoImportVoList.stream().map(item -> {
+            DevInfo devInfo = new DevInfo();
+            devInfo.setClientId(item.getDevId());
+            devInfo.setDevType(item.getDevType());
+            devInfo.setSoftware(item.getSoftware());
+            devInfo.setStatusLight(1);
+            devInfo.setOnline(0);
+            devInfo.setIsDeleted(BasePO.DeleteFlag.NOT_DELETED);
+            devInfo.setX(BigDecimal.ZERO);
+            devInfo.setY(BigDecimal.ZERO);
+            devInfo.setNorthAngle(BigDecimal.ZERO);
+            return devInfo;
+        }).collect(Collectors.toList()));
+
+        UploadRes uploadRes = new UploadRes();
+        if (!CollectionUtils.isEmpty(existClientIds)) {
+            uploadRes.setSuc(false);
+            uploadRes.setMsgList(existClientIds);
+        }
+        uploadRes.setMsg("上传重复");
+        return uploadRes;
+    }
+
+    @Override
+    public PageRecord<DeviceDTO> queryDevList(DeviceListQueryReq queryReq) {
+
+        // 执行分页查询
+        Page<DevInfo> devInfoPage = devInfoService.queryDevList(queryReq);
+        // 换为目标VO
+        List<DeviceDTO> targets = CopyUtils.copyList(devInfoPage.getRecords(), DeviceDTO.class);
+        return CopyUtils.copyPage(devInfoPage, targets);
+    }
+
+    @Override
+    public void addOneDevice(DeviceDTO deviceDTO) {
+
+        DevInfo devInfo = devInfoService.queryOneByClientId(deviceDTO.getClientId());
+        if (devInfo != null) {
+            throw new BizException(ErrorEnum.DEVICE_IS_EXIST.getErrorCode(), ErrorEnum.DEVICE_IS_EXIST.getErrorMessage());
+        }
+
+        DevInfo saveInfo = new DevInfo();
+        saveInfo.setClientId(deviceDTO.getClientId());
+        saveInfo.setDevType(deviceDTO.getDevType());
+        saveInfo.setSoftware(deviceDTO.getSoftware());
+        saveInfo.setStatusLight(1);
+        saveInfo.setOnline(0);
+        saveInfo.setIsDeleted(BasePO.DeleteFlag.NOT_DELETED);
+        saveInfo.setX(BigDecimal.ZERO);
+        saveInfo.setY(BigDecimal.ZERO);
+        saveInfo.setNorthAngle(BigDecimal.ZERO);
+        devInfoService.save(saveInfo);
+
+    }
+}

+ 8 - 0
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/DevInfoService.java

@@ -1,7 +1,9 @@
 package com.hfln.portal.infrastructure.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.hfln.portal.common.request.device.DeviceBandingParams;
+import com.hfln.portal.common.request.device.DeviceListQueryReq;
 import com.hfln.portal.infrastructure.po.DevInfo;
 
 import java.util.List;
@@ -18,4 +20,10 @@ public interface DevInfoService extends IService<DevInfo> {
     Boolean updateDevice(Object identifier, DeviceBandingParams request);
 
     List<DevInfo> queryByClientId(String clientId);
+
+    List<String> queryClientIdListByClientIds(List<String> devIds);
+
+    Page<DevInfo> queryDevList(DeviceListQueryReq queryReq);
+
+    DevInfo queryOneByClientId(String clientId);
 }

+ 50 - 1
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/service/impl/DevInfoServiceImpl.java

@@ -2,18 +2,20 @@ package com.hfln.portal.infrastructure.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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 com.hfln.portal.common.request.device.DeviceBandingParams;
+import com.hfln.portal.common.request.device.DeviceListQueryReq;
 import com.hfln.portal.domain.customer.util.UpdateWrapperBuilder;
 import com.hfln.portal.infrastructure.mapper.DevInfoMapper;
 import com.hfln.portal.infrastructure.mapper.GroupDevMapMapper;
 import com.hfln.portal.infrastructure.po.DevInfo;
-import com.hfln.portal.infrastructure.po.GroupDevMap;
 import com.hfln.portal.infrastructure.service.DevInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.time.LocalDateTime;
 import java.util.Collections;
@@ -129,4 +131,51 @@ public class DevInfoServiceImpl extends ServiceImpl<DevInfoMapper, DevInfo> impl
         wrapper.eq(DevInfo::getClientId, clientId);
         return this.baseMapper.selectList(wrapper);
     }
+
+    @Override
+    public List<String> queryClientIdListByClientIds(List<String> devIds) {
+
+        if (CollectionUtils.isEmpty(devIds)) {
+            return Collections.emptyList();
+        }
+
+        return this.baseMapper.selectObjs(
+                        new LambdaQueryWrapper<DevInfo>()
+                                .select(DevInfo::getClientId)
+                                .in(DevInfo::getClientId, devIds)
+                ).stream()
+                .map(obj -> (String) obj)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public Page<DevInfo> queryDevList(DeviceListQueryReq queryReq) {
+        Page<DevInfo> page = new Page<>(queryReq.getPageNo(), queryReq.getPageSize());
+
+        // 2. 构建查询条件
+        LambdaQueryWrapper<DevInfo> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.hasText(queryReq.getClientId())) {
+            queryWrapper.like(DevInfo::getClientId, queryReq.getClientId());
+        }
+
+
+        // 3. 添加日期条件
+        if (Objects.nonNull(queryReq.getCreateTimeStart())) {
+            queryWrapper.ge(DevInfo::getCreateTime, queryReq.getCreateTimeStart());
+        }
+        if (Objects.nonNull(queryReq.getCreateTimeEnd())) {
+            queryWrapper.lt(DevInfo::getCreateTime, queryReq.getCreateTimeEnd().plusDays(1));
+        }
+
+        // 4. 设置排序
+        queryWrapper.orderByDesc(DevInfo::getCreateTime);
+        return this.baseMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public DevInfo queryOneByClientId(String clientId) {
+        LambdaQueryWrapper<DevInfo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(DevInfo::getClientId, clientId);
+        return this.baseMapper.selectOne(wrapper);
+    }
 }