|
|
@@ -1,48 +1,59 @@
|
|
|
package com.xunmei.system.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.alibaba.excel.EasyExcel;
|
|
|
+import com.alibaba.excel.context.AnalysisContext;
|
|
|
+import com.alibaba.excel.event.AnalysisEventListener;
|
|
|
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
|
|
|
import com.alibaba.nacos.common.utils.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.xunmei.common.core.constant.CacheConstants;
|
|
|
+import com.xunmei.common.core.constant.DictConstants;
|
|
|
import com.xunmei.common.core.constant.SecurityConstants;
|
|
|
import com.xunmei.common.core.domain.device.domain.SysMultiLayerDictionary;
|
|
|
+import com.xunmei.common.core.domain.device.vo.DictionaryTreeVo;
|
|
|
import com.xunmei.common.core.exception.ServiceException;
|
|
|
+import com.xunmei.common.core.util.BeanHelper;
|
|
|
import com.xunmei.common.core.utils.DateHelper;
|
|
|
import com.xunmei.common.core.utils.DateUtils;
|
|
|
import com.xunmei.common.core.web.page.TableDataInfo;
|
|
|
+import com.xunmei.common.redis.utils.RedisUtils;
|
|
|
+import com.xunmei.common.security.utils.DictUtils;
|
|
|
import com.xunmei.common.security.utils.SecurityUtils;
|
|
|
import com.xunmei.system.api.RemoteProtectionService;
|
|
|
import com.xunmei.system.api.domain.SysDevice;
|
|
|
+import com.xunmei.system.api.domain.SysDictData;
|
|
|
import com.xunmei.system.api.domain.SysOrg;
|
|
|
import com.xunmei.system.api.dto.ProtectionDTO;
|
|
|
import com.xunmei.system.api.dto.SysDeviceInnerListDto;
|
|
|
import com.xunmei.system.api.vo.ProtectionVO;
|
|
|
+import com.xunmei.system.api.vo.SysOrgVO;
|
|
|
import com.xunmei.system.dto.SysDevicePageDto;
|
|
|
import com.xunmei.system.mapper.SysDeviceMapper;
|
|
|
import com.xunmei.system.mapper.SysOrgMapper;
|
|
|
-import com.xunmei.system.service.ISysDeviceService;
|
|
|
-import com.xunmei.system.service.ISysMultiLayerDictionaryService;
|
|
|
-import com.xunmei.system.service.ISysOrgService;
|
|
|
+import com.xunmei.system.service.*;
|
|
|
import com.xunmei.system.util.DeviceExport;
|
|
|
+import com.xunmei.system.util.DeviceImportErrorMsg;
|
|
|
import com.xunmei.system.vo.area.AccessType;
|
|
|
import com.xunmei.system.vo.area.HostVO;
|
|
|
import com.xunmei.system.vo.area.VideoVO;
|
|
|
import com.xunmei.system.vo.device.SysDevicePageVo;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.net.URLEncoder;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 【请填写功能名称】Service业务层处理
|
|
|
@@ -64,7 +75,9 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
|
|
|
@Resource
|
|
|
private ISysMultiLayerDictionaryService dictionaryService;
|
|
|
@Autowired
|
|
|
- private RedisTemplate redisTemplate;
|
|
|
+ private ISysDictDataService sysDictDataService;
|
|
|
+ @Autowired
|
|
|
+ private ISysDictTypeService dictTypeService;
|
|
|
|
|
|
@Override
|
|
|
public TableDataInfo<SysDevicePageVo> selectPage(SysDevicePageDto req) {
|
|
|
@@ -264,8 +277,12 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
|
|
|
public ProtectionDTO insertSysDeviceExcel(SysDevice sysDevice) {
|
|
|
sysDevice.setCreateTime(DateUtils.getNowDate());
|
|
|
sysDevice.setCreateBy(SecurityUtils.getUsername());
|
|
|
+ sysDevice.setCreateBy(SecurityUtils.getUsername());
|
|
|
+ sysDevice.setUpdateBy(SecurityUtils.getUsername());
|
|
|
SysOrg sysOrg = orgService.selectSysOrgById(sysDevice.getOrgId());
|
|
|
sysDevice.setOrgName(sysOrg.getShortName());
|
|
|
+ sysDevice.setOrgPath(sysOrg.getPath());
|
|
|
+ sysDevice.setOrgId(sysOrg.getId());
|
|
|
SysDevice sysDevice1 = this.checkName(sysDevice.getOrgId(), sysDevice.getDeviceName());
|
|
|
if (null != sysDevice1) {
|
|
|
throw new RuntimeException("设备名称重复");
|
|
|
@@ -373,4 +390,217 @@ public class SysDeviceServiceImpl extends ServiceImpl<SysDeviceMapper, SysDevice
|
|
|
public int deleteSysDeviceById(Long id) {
|
|
|
return sysDeviceMapper.deleteById(id);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void importData(MultipartFile file, boolean updateSupport, HttpServletResponse response) {
|
|
|
+ List<DeviceExport> list = new ArrayList<>();
|
|
|
+ List<SysDevice> result = new ArrayList<>();
|
|
|
+ List<DeviceImportErrorMsg> errorList = new ArrayList<>();
|
|
|
+ List<DictionaryTreeVo> dictionaryList = dictionaryService.selectList();
|
|
|
+ List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
|
|
|
+ // 读取excel
|
|
|
+ EasyExcel.read(multipartFileToFile(file), DeviceExport.class, new AnalysisEventListener<DeviceExport>() {
|
|
|
+ @Override
|
|
|
+ public void invoke(DeviceExport deviceExport, AnalysisContext analysisContext) {
|
|
|
+ validatorParam(deviceExport, dictionaryList, errorList, result, cacheList);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void doAfterAllAnalysed(AnalysisContext analysisContext) {
|
|
|
+ for (SysDevice d : result) {
|
|
|
+ ProtectionDTO protectionDTO = insertSysDeviceExcel(d);
|
|
|
+ remoteProtectionService.addByDevice(protectionDTO, SecurityConstants.INNER);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }).sheet().doRead();
|
|
|
+
|
|
|
+
|
|
|
+ if (errorList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ // 设置响应头
|
|
|
+ response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备导入数据.xlsx", "utf-8"));
|
|
|
+ response.setContentType("application/octet-stream;charset=UTF-8");
|
|
|
+ response.setCharacterEncoding("utf-8");
|
|
|
+ // 数据导出
|
|
|
+ EasyExcel.write(response.getOutputStream(), DeviceImportErrorMsg.class)
|
|
|
+ .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("设备导入数据.xlsx").doWrite(errorList);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 重置response
|
|
|
+ response.reset();
|
|
|
+ response.setContentType("application/json");
|
|
|
+ response.setCharacterEncoding("utf-8");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void validatorParam(DeviceExport deviceExport, List<DictionaryTreeVo> dictionaryList, List<DeviceImportErrorMsg> errorList, List<SysDevice> result, List<SysOrgVO> cacheList) {
|
|
|
+ SysDevice device = new SysDevice();
|
|
|
+ List<String> msgList = new ArrayList<>();
|
|
|
+ String orgName = deviceExport.getOrgName();
|
|
|
+ Optional<SysOrgVO> orgNameOptional = cacheList.stream().filter(sysOrgVO -> sysOrgVO.getShortName().equals(orgName) || sysOrgVO.getName().equals(orgName)).findFirst();
|
|
|
+ if (!orgNameOptional.isPresent()) {
|
|
|
+ msgList.add("账户名称为空");
|
|
|
+ } else {
|
|
|
+ SysOrgVO orgVO = orgNameOptional.get();
|
|
|
+ device.setOrgId(orgVO.getId());
|
|
|
+ device.setOrgName(orgVO.getShortName());
|
|
|
+ device.setOrgPath(orgVO.getPath());
|
|
|
+ }
|
|
|
+
|
|
|
+ String assetNo = deviceExport.getAssetNo();
|
|
|
+ if (StringUtils.isEmpty(assetNo)) {
|
|
|
+ msgList.add("资产编号为空");
|
|
|
+ } else {
|
|
|
+ device.setAssetNo(assetNo);
|
|
|
+ }
|
|
|
+
|
|
|
+ String deviceName = deviceExport.getDeviceName();
|
|
|
+ if (StringUtils.isEmpty(deviceName)) {
|
|
|
+ msgList.add("设备名称为空");
|
|
|
+ } else {
|
|
|
+ device.setDeviceName(deviceName);
|
|
|
+ }
|
|
|
+ String assetType = deviceExport.getAssetType();
|
|
|
+ Optional<DictionaryTreeVo> assetOptional = dictionaryList.stream().filter(r -> ObjectUtil.equal(r.getName(), assetType)).findFirst();
|
|
|
+ if (!assetOptional.isPresent()) {
|
|
|
+ msgList.add("资产分类未填写");
|
|
|
+ } else {
|
|
|
+ device.setAssetType(assetOptional.get().getId().toString());
|
|
|
+ }
|
|
|
+ String deviceType = deviceExport.getDeviceType();
|
|
|
+ if (StringUtils.isEmpty(deviceType)) {
|
|
|
+ msgList.add("设备分类未填写");
|
|
|
+ } else {
|
|
|
+ Optional<DictionaryTreeVo> deviceOptional = dictionaryList.stream().filter(r -> ObjectUtil.equal(r.getName(), deviceType)).findFirst();
|
|
|
+ if (!deviceOptional.isPresent()) {
|
|
|
+ msgList.add("设备分类不存在");
|
|
|
+ } else {
|
|
|
+ device.setDeviceType(deviceOptional.get().getId().toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String deviceModel = deviceExport.getDeviceModel();
|
|
|
+ if (StringUtils.isEmpty(deviceModel)) {
|
|
|
+ msgList.add("设备型号未填写");
|
|
|
+ } else {
|
|
|
+ Optional<DictionaryTreeVo> deviceModelOptional = dictionaryList
|
|
|
+ .stream()
|
|
|
+ .filter(r -> ObjectUtil.equal(r.getName(), deviceModel))
|
|
|
+ .findFirst();
|
|
|
+ if (!deviceModelOptional.isPresent()) {
|
|
|
+ msgList.add("设备型号不存在");
|
|
|
+ } else {
|
|
|
+ device.setDeviceModel(deviceModelOptional.get().getId().toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String deviceBrand = deviceExport.getDeviceBrand();
|
|
|
+ if (StringUtils.isEmpty(deviceBrand)) {
|
|
|
+ msgList.add("设备品牌未填写");
|
|
|
+ } else {
|
|
|
+ Optional<DictionaryTreeVo> deviceBrandOptional = dictionaryList
|
|
|
+ .stream()
|
|
|
+ .filter(r -> ObjectUtil.equal(r.getName(), deviceBrand))
|
|
|
+ .findFirst();
|
|
|
+ if (!deviceBrandOptional.isPresent()) {
|
|
|
+ msgList.add("设备品牌不存在");
|
|
|
+ } else {
|
|
|
+ device.setDeviceBrand(deviceBrandOptional.get().getId().toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String purchasingTimeStr = deviceExport.getPurchasingTime();
|
|
|
+ if (StringUtils.isEmpty(purchasingTimeStr)) {
|
|
|
+ msgList.add("采购时间未填写");
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ DateTime purchasingTime = DateUtil.parse(purchasingTimeStr);
|
|
|
+ device.setPurchasingTime(purchasingTime);
|
|
|
+ } catch (Exception e) {
|
|
|
+ msgList.add("采购时间日期格式错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String address = deviceExport.getAddress();
|
|
|
+ if (StringUtils.isEmpty(address)) {
|
|
|
+ msgList.add("安装位置未填写");
|
|
|
+ }
|
|
|
+ String checkTimeStr = deviceExport.getCheckTime();
|
|
|
+ if (StringUtils.isEmpty(checkTimeStr)) {
|
|
|
+ msgList.add("消防有效期未填写");
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ DateTime checkTime = DateUtil.parse(checkTimeStr);
|
|
|
+ device.setCheckTime(checkTime);
|
|
|
+ } catch (Exception e) {
|
|
|
+ msgList.add("消防有效期日期格式错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String maintenanceTermStr = deviceExport.getMaintenanceTerm();
|
|
|
+ if (StringUtils.isEmpty(maintenanceTermStr)) {
|
|
|
+ msgList.add("保修期限未填写");
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ DateUtil.parse(maintenanceTermStr);
|
|
|
+ device.setMaintenanceTerm(maintenanceTermStr);
|
|
|
+ } catch (Exception e) {
|
|
|
+ msgList.add("保修期限日期格式错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String useTimeStr = deviceExport.getUseTime();
|
|
|
+ if (StringUtils.isEmpty(useTimeStr)) {
|
|
|
+ msgList.add("投产日期未填写");
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ DateTime useTime = DateUtil.parse(useTimeStr);
|
|
|
+ device.setUseTime(useTime);
|
|
|
+ } catch (Exception e) {
|
|
|
+ msgList.add("投产日期格式错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String deviceStatus = deviceExport.getDeviceStatus();
|
|
|
+ if (StringUtils.isEmpty(deviceStatus)) {
|
|
|
+ msgList.add("设备状态未填写");
|
|
|
+ } else {
|
|
|
+ List<SysDictData> dictCache = DictUtils.getDictCache(DictConstants.ASSET_STATUS);
|
|
|
+ Optional<SysDictData> optional = dictCache.stream().filter(dictData -> dictData.getDictLabel().equals(deviceStatus)).findFirst();
|
|
|
+ if (optional.isPresent()) {
|
|
|
+ device.setDeviceStatus(Integer.parseInt(optional.get().getDictValue()));
|
|
|
+ } else {
|
|
|
+ msgList.add("设备状态填写错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (msgList.isEmpty()) {
|
|
|
+ result.add(device);
|
|
|
+ } else {
|
|
|
+ String string = String.join(";", msgList);
|
|
|
+ DeviceImportErrorMsg properties = BeanHelper.copyProperties(deviceExport, DeviceImportErrorMsg.class);
|
|
|
+ properties.setErrorMsg(string);
|
|
|
+ errorList.add(properties);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 功能描述:
|
|
|
+ * MultipartFile 转 File
|
|
|
+ * @return: java.io.File
|
|
|
+ */
|
|
|
+ public static File multipartFileToFile(MultipartFile multipartFile) {
|
|
|
+ // 获取文件名
|
|
|
+ String fileName = multipartFile.getOriginalFilename();
|
|
|
+ // 获取文件后缀
|
|
|
+ assert fileName != null;
|
|
|
+ String suffix = fileName.substring(fileName.lastIndexOf("."));
|
|
|
+ // 若需要防止临时文件重复,需要在文件名后加上UUID
|
|
|
+ try {
|
|
|
+ File file = File.createTempFile(fileName.substring(0, fileName.lastIndexOf(".")) + UUID.randomUUID(), suffix);
|
|
|
+ multipartFile.transferTo(file);
|
|
|
+ return file;
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|