若依微服务1.9.4

business:
1、设备导入
master
xins 2 years ago
parent 020afb92a8
commit f6f64bcd4f

@ -143,6 +143,12 @@ public @interface Excel
*/ */
public String[] args() default {}; public String[] args() default {};
/**
* ,classclassgetIdgetName
*/
public String[] dbCombo() default {};
/** /**
* 012 * 012
*/ */

@ -70,11 +70,16 @@ public class HwDictConstants {
public static final String DEVICE_TYPE_GATEWAY_SUB_EQUIPMENT = "2";//网关子设备 public static final String DEVICE_TYPE_GATEWAY_SUB_EQUIPMENT = "2";//网关子设备
public static final String DEVICE_TYPE_DIRECT_CONNECT_DEVICE = "3";//直连设备 public static final String DEVICE_TYPE_DIRECT_CONNECT_DEVICE = "3";//直连设备
public static final String DEVICE_NETWORKING_MODE_WIFI = "1";//设备联网方式WiFi
public static final Long DEVICE_ACCESS_PROTOCOL_MQTT = 1L;//设备接入协议MQTT
public static final Long DEVICE_DATA_FORMAT_JSON = 1L;//数据格式JSON
public static final String REDIS_KEY_DEVICE_INFO = "hw_device_info";//保存设备用户名和密码等信息的redis的key public static final String REDIS_KEY_DEVICE_INFO = "hw_device_info";//保存设备用户名和密码等信息的redis的key
public static final String REDIS_KEY_ONLINE_DEVICE_COUNT_INFO = "online_device_count";//按照天存放每天设备在线数量 public static final String REDIS_KEY_ONLINE_DEVICE_COUNT_INFO = "online_device_count";//按照天存放每天设备在线数量
public static final String DEVICE_MODE_STATUS_NORMAL = "1";//设备模型正常状态 public static final String DEVICE_MODE_STATUS_NORMAL = "1";//设备模型正常状态
public static final String DEVICE_MODE_STATUS_DELETED = "9";//设备模型删除状态
public static final String SCENE_DEFAULT_FLAG_YES = "1";//场景是否默认标识:是 public static final String SCENE_DEFAULT_FLAG_YES = "1";//场景是否默认标识:是
public static final String SCENE_DEFAULT_FLAG_NO = "0";//场景是否默认标识:否 public static final String SCENE_DEFAULT_FLAG_NO = "0";//场景是否默认标识:否

@ -0,0 +1,62 @@
package com.ruoyi.common.core.enums;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public enum DeviceTypeEnums {
/**
*
*/
GATEWAY_DEVICE("1","网关设备"),
/**
*
*/
SUB_DEVICE("2", "网关子设备"),
/**
*
*/
DIRECT_CONNECT_DEVICE("3", "直连设备");
// 属性值与属性名Map
public static final Map<String, String> dataCodeTypeMap = Arrays.stream(values()).collect(
Collectors.toMap(
DeviceTypeEnums::getDataCode,
DeviceTypeEnums::getDataType
)
);
// 属性名与属性值Map
public static final Map<String, String> dataTypeCodeMap = Arrays.stream(values()).collect(
Collectors.toMap(
DeviceTypeEnums::getDataType,
DeviceTypeEnums::getDataCode
)
);
// 性别值
private final String dataCode;
// 性别名
private final String dataType;
DeviceTypeEnums(String dataCode, String dataType) {
this.dataCode = dataCode;
this.dataType = dataType;
}
public String getDataCode() {
return dataCode;
}
public String getDataType() {
return dataType;
}
}

@ -5,6 +5,7 @@ import com.ruoyi.business.domain.HwDeviceMode;
import com.ruoyi.business.domain.HwMonitorUnit; import com.ruoyi.business.domain.HwMonitorUnit;
import com.ruoyi.business.domain.HwScene; import com.ruoyi.business.domain.HwScene;
import com.ruoyi.business.domain.VO.DeviceControlVo; import com.ruoyi.business.domain.VO.DeviceControlVo;
import com.ruoyi.business.domain.VO.HwDeviceImportVo;
import com.ruoyi.business.service.IHwDeviceModeService; import com.ruoyi.business.service.IHwDeviceModeService;
import com.ruoyi.business.service.IHwDeviceService; import com.ruoyi.business.service.IHwDeviceService;
import com.ruoyi.business.service.IHwMonitorUnitService; import com.ruoyi.business.service.IHwMonitorUnitService;
@ -19,11 +20,17 @@ import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.domain.SysUser;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Controller * Controller
@ -70,6 +77,48 @@ public class HwDeviceController extends BaseController {
util.exportExcel(response, list, "设备信息数据"); util.exportExcel(response, list, "设备信息数据");
} }
@Log(title = "设备信息", businessType = BusinessType.IMPORT)
@RequiresPermissions("business:device:import")
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file, boolean updateSupport, Long sceneId) throws Exception {
ExcelUtil<HwDeviceImportVo> util = new ExcelUtil<HwDeviceImportVo>(HwDeviceImportVo.class);
List<HwDeviceImportVo> deviceList = util.importExcel(file.getInputStream());
String message = hwDeviceService.importDevices(deviceList, updateSupport, sceneId);
return success(message);
}
@RequiresPermissions("business:device:import")
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response, Long sceneId) throws IOException {
ExcelUtil<HwDeviceImportVo> util = new ExcelUtil<HwDeviceImportVo>(HwDeviceImportVo.class);
Map<String, List<?>> classListMap = new HashMap<String, List<?>>();
//根据场景ID获取最子级监控单元列表
HwMonitorUnit queryMonitorUnit = new HwMonitorUnit();
queryMonitorUnit.setSceneId(sceneId);
queryMonitorUnit.setMonitorUnitStatus(HwDictConstants.MONITOR_UNIT_STATUS_NORMAL);
List<HwMonitorUnit> monitorList = hwMonitorUnitService.selectLimitSubMonitorUnit(queryMonitorUnit);
classListMap.put("HwMonitorUnit", monitorList);
//根据场景ID获取没有删除的网关设备列表
HwDevice queryDevice = new HwDevice();
queryDevice.setSceneId(sceneId);
queryDevice.setDeviceType(HwDictConstants.DEVICE_TYPE_GATEWAY_DEVICE);
List<HwDevice> gatewayDevices = hwDeviceService.selectHwDeviceList(queryDevice);
classListMap.put("HwDevice", gatewayDevices);
//根据场景ID获取启用的设备模型列表
HwDeviceMode queryDeviceMode = new HwDeviceMode();
queryDeviceMode.setSceneId(sceneId);
queryDeviceMode.setDeviceModeStatus(HwDictConstants.DEVICE_MODE_STATUS_NORMAL);
List<HwDeviceMode> deviceModes = hwDeviceModeService.selectHwDeviceModeList(queryDeviceMode);
classListMap.put("HwDeviceMode", deviceModes);
util.importTemplateExcel(response, "设备数据", classListMap);
}
/** /**
* *
*/ */

@ -50,7 +50,7 @@ public class HwDevice extends BaseEntity {
/** /**
* 123 * 123
*/ */
@Excel(name = "设备类型", readConverterExp = "1=网关设备,2网关子设备,3直连设备") @Excel(name = "设备类型", readConverterExp = "1=网关设备,2=网关子设备,3=直连设备")
private String deviceType; private String deviceType;
/** /**
@ -93,13 +93,13 @@ public class HwDevice extends BaseEntity {
/** /**
* 10 * 10
*/ */
@Excel(name = "激活状态", readConverterExp = "1=激活,0未激活") @Excel(name = "激活状态", readConverterExp = "1=激活,0=未激活")
private String activeStatus; private String activeStatus;
/** /**
* 019 * 019
*/ */
@Excel(name = "设备状态", readConverterExp = "0=测试,1发布,9删除") @Excel(name = "设备状态", readConverterExp = "0=测试,1=发布,9=删除")
private String deviceStatus; private String deviceStatus;
/** /**

@ -0,0 +1,92 @@
package com.ruoyi.business.domain.VO;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.web.domain.BaseEntity;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
/**
* HwDeviceImportVoVo
*
* @author xins
* @date 2023-09-13
*/
@Data
public class HwDeviceImportVo extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
*
*/
@Excel(name = "设备编号")
private String deviceCode;
/**
*
*/
@Excel(name = "设备名称")
private String deviceName;
/**
* hw_scenescene_id
*/
private Long sceneId;
/**
* hw_monitor_unitmonitor_unit_id
*/
@Excel(name = "监控单元ID-名称", width = 25,
dbCombo = {"HwMonitorUnit", "getMonitorUnitId", "getMonitorUnitName"})
private String monitorUnitInfo;
/**
* 123
*/
@Excel(name = "设备类型", combo = {"网关设备", "网关子设备", "直连设备"})
private String deviceType;
/**
* (1:Wi-Fi2(2G/3G/4G/5G),34)
*/
// @Excel(name = "联网方式(1=Wi-Fi,2=蜂窝(2G/3G/4G/5G),3=以太网,4=其他)")
private String networkingMode;
/**
* 1MQTT
*/
// @Excel(name = "接入协议", readConverterExp = "1=MQTT")
private Long accessProtocol;
/**
* 1Json
*/
// @Excel(name = "数据格式", readConverterExp = "1=Json")
private Long dataFormat;
/**
* hw_devicedevice_id
*/
@Excel(name = "关联网关设备ID-名称", width = 25,
dbCombo = {"HwDevice", "getDeviceId", "getDeviceName"})
private String releatedDeviceInfo;
/**
* hw_device_modedevice_mode_id
*/
@Excel(name = "设备模型ID-名称", width = 25,
dbCombo = {"HwDeviceMode", "getDeviceModeId", "getDeviceModeName"})
private String deviceModeInfo;
/**
* 1Modbus
* OPC-UA,Modbus
*/
// @Excel(name = "接入网关协议", readConverterExp = "1=Modbus")
private Long accessGwProtocol;
}

@ -119,6 +119,16 @@ public interface IHwDeviceService
public List<HwDevice> selectHwDeviceJoinList(HwDevice hwDevice); public List<HwDevice> selectHwDeviceJoinList(HwDevice hwDevice);
/**
*
*
* @param deviceImportVoList
* @param isUpdateSupport
* @param sceneId ID
* @return
*/
public String importDevices(List<HwDeviceImportVo> deviceImportVoList, Boolean isUpdateSupport, Long sceneId);
/** /**
* @param: days * @param: days
* @description 线 * @description 线

@ -3,14 +3,8 @@ package com.ruoyi.business.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ruoyi.business.domain.HwDevice; import com.ruoyi.business.domain.*;
import com.ruoyi.business.domain.HwDeviceMode; import com.ruoyi.business.domain.VO.*;
import com.ruoyi.business.domain.HwDeviceModeFunction;
import com.ruoyi.business.domain.HwScene;
import com.ruoyi.business.domain.VO.DeviceControlVo;
import com.ruoyi.business.domain.VO.DeviceModeVo;
import com.ruoyi.business.domain.VO.DevicesInfoVo;
import com.ruoyi.business.domain.VO.HwDeviceVo;
import com.ruoyi.business.mapper.*; import com.ruoyi.business.mapper.*;
import com.ruoyi.business.service.IHwDeviceService; import com.ruoyi.business.service.IHwDeviceService;
import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.Constants;
@ -19,6 +13,7 @@ import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.TdEngineConstants; import com.ruoyi.common.core.constant.TdEngineConstants;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.enums.DataTypeEnums; import com.ruoyi.common.core.enums.DataTypeEnums;
import com.ruoyi.common.core.enums.DeviceTypeEnums;
import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.NumberUtils; import com.ruoyi.common.core.utils.NumberUtils;
@ -51,6 +46,8 @@ public class HwDeviceServiceImpl implements IHwDeviceService {
@Autowired @Autowired
private HwSceneMapper hwSceneMapper; private HwSceneMapper hwSceneMapper;
@Autowired @Autowired
private HwMonitorUnitMapper hwMonitorUnitMapper;
@Autowired
private HwDeviceModeFunctionMapper hwDevieModeFunctionMapper; private HwDeviceModeFunctionMapper hwDevieModeFunctionMapper;
@Resource @Resource
private RemoteTdEngineService remoteTdEngineService; private RemoteTdEngineService remoteTdEngineService;
@ -513,6 +510,133 @@ public class HwDeviceServiceImpl implements IHwDeviceService {
return hwDeviceMapper.selectHwDeviceJoinList(hwDevice); return hwDeviceMapper.selectHwDeviceJoinList(hwDevice);
} }
/**
*
*
* @param deviceImportVoList
* @param isUpdateSupport
* @param sceneId ID
* @return
*/
@Override
public String importDevices(List<HwDeviceImportVo> deviceImportVoList, Boolean isUpdateSupport, Long sceneId) {
if (StringUtils.isNull(deviceImportVoList) || deviceImportVoList.size() == 0) {
throw new ServiceException("导入标准数据不能为空!");
}
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
String operName = SecurityUtils.getUsername();
Long tenantId = SecurityUtils.getTenantId();
String infoSeparator = "-";
//判断场景是否属于此租户
HwScene scene = hwSceneMapper.selectHwSceneBySceneId(sceneId);
if (!scene.getTenantId().equals(tenantId)) {
throw new ServiceException("选择场景不属于此租户!");
}
for (HwDeviceImportVo deviceImportVo : deviceImportVoList) {
try {
String checkMsg = this.checkImportDeviceData(deviceImportVo, sceneId, infoSeparator);
if (StringUtils.isNotEmpty(checkMsg)) {
failureNum++;
failureMsg.append(
"<br/>"
+ failureNum + "、"
+ checkMsg);
} else {
String deviceCode = deviceImportVo.getDeviceCode();
String deviceName = deviceImportVo.getDeviceName();
String deviceType = deviceImportVo.getDeviceType();
String monitorUnitInfo = deviceImportVo.getMonitorUnitInfo();
String gateWayDeviceInfo = deviceImportVo.getReleatedDeviceInfo();
String deviceModeInfo = deviceImportVo.getDeviceModeInfo();
Long monitorUnitId = Long.valueOf(monitorUnitInfo.substring(0, monitorUnitInfo.indexOf(infoSeparator)));
Long gatewayDeviceId = null;
Long deviceModeId = null;
//根据设备类型名称获取code
String deviceTypeCode = DeviceTypeEnums.dataTypeCodeMap.get(deviceType);
//验证是否存在这个设备
HwDevice d = hwDeviceMapper.selectHwDeviceByDeviceCode(deviceImportVo.getDeviceCode());
if (d == null) {
HwDevice device = new HwDevice();
device.setDeviceCode(deviceCode);
device.setDeviceName(deviceName);
device.setDeviceType(deviceTypeCode);
device.setSceneId(sceneId);
device.setMonitorUnitId(monitorUnitId);
switch (deviceTypeCode) {
case HwDictConstants.DEVICE_TYPE_GATEWAY_DEVICE:
device.setNetworkingMode(HwDictConstants.DEVICE_NETWORKING_MODE_WIFI);
device.setAccessProtocol(HwDictConstants.DEVICE_ACCESS_PROTOCOL_MQTT);
device.setDataFormat(HwDictConstants.DEVICE_DATA_FORMAT_JSON);
break;
case HwDictConstants.DEVICE_TYPE_GATEWAY_SUB_EQUIPMENT:
gatewayDeviceId = Long.valueOf(gateWayDeviceInfo.substring(0, gateWayDeviceInfo.indexOf(infoSeparator)));
deviceModeId = Long.valueOf(deviceModeInfo.substring(0, deviceModeInfo.indexOf(infoSeparator)));
device.setDeviceModeId(deviceModeId);
device.setReleatedDeviceId(gatewayDeviceId);
break;
case HwDictConstants.DEVICE_TYPE_DIRECT_CONNECT_DEVICE:
deviceModeId = Long.valueOf(deviceModeInfo.substring(0, deviceModeInfo.indexOf(infoSeparator)));
device.setNetworkingMode(HwDictConstants.DEVICE_NETWORKING_MODE_WIFI);
device.setAccessProtocol(HwDictConstants.DEVICE_ACCESS_PROTOCOL_MQTT);
device.setDataFormat(HwDictConstants.DEVICE_DATA_FORMAT_JSON);
device.setDeviceModeId(deviceModeId);
break;
}
device.setTenantId(tenantId);
device.setCreateBy(operName);
device.setCreateTime(new Date());
hwDeviceMapper.insertHwDevice(device);
successNum++;
successMsg.append(
"<br/>" + successNum + "、 " + device.getDeviceName() + " 导入成功");
} else if (isUpdateSupport) {//不支持更新
// device.setDeviceId(d.getDeviceId());
// device.setUpdateBy(operName);
// device.setUpdateTime(new Date());
// hwDeviceMapper.updateHwDevice(device);
successNum++;
successMsg.append(
"<br/>" + successNum + "、" + deviceImportVo.getDeviceName() + " 更新成功");
} else {
failureNum++;
failureMsg.append(
"<br/>"
+ failureNum
+ "、"
+ deviceImportVo.getDeviceCode()
+ "、"
+ deviceImportVo.getDeviceName()
+ " 已存在");
}
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、设备名称 " + deviceImportVo.getDeviceName() + " 导入失败:";
failureMsg.append(msg + e.getMessage());
}
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new ServiceException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
/** /**
* @param: days * @param: days
* @description 线 * @description 线
@ -889,4 +1013,73 @@ public class HwDeviceServiceImpl implements IHwDeviceService {
} }
} }
/**
* @return String
* @param: deviceImportVo
* @param: sceneId
* @param: infoSeparator
* @description
* @author xins
* @date 2023-11-10 10:50
*/
private String checkImportDeviceData(HwDeviceImportVo deviceImportVo, Long sceneId, String infoSeparator) {
String deviceCode = deviceImportVo.getDeviceCode();
String deviceName = deviceImportVo.getDeviceName();
String deviceType = deviceImportVo.getDeviceType();
String monitorUnitInfo = deviceImportVo.getMonitorUnitInfo();
String gateWayDeviceInfo = deviceImportVo.getReleatedDeviceInfo();
String deviceModeInfo = deviceImportVo.getDeviceModeInfo();
if (StringUtils.isEmpty(deviceCode) || StringUtils.isEmpty(deviceName)
|| StringUtils.isEmpty(deviceType) || StringUtils.isEmpty(monitorUnitInfo)) {
return "设备编号、设备名称、监控单元和设备类型不能为空";
}
//判断是否是子级监控单元,并且属于此场景
Long monitorUnitId = Long.valueOf(monitorUnitInfo.substring(0, monitorUnitInfo.indexOf(infoSeparator)));
HwMonitorUnit monitorUnit = hwMonitorUnitMapper.selectHwMonitorUnitByMonitorUnitId(monitorUnitId);
if (!monitorUnit.getSceneId().equals(sceneId)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 监控单元不属于所选择场景";
}
if (monitorUnit.getParentId() != null && !monitorUnit.getParentId().equals(0L)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 此监控单元不是子级监控单元";
}
//如果是直连设备或子设备,必选选择设备模型,判断设备模型是否存在,并且属于此场景
if (deviceType.equals(DeviceTypeEnums.DIRECT_CONNECT_DEVICE.getDataType())
|| deviceType.equals(DeviceTypeEnums.SUB_DEVICE.getDataType())) {
if (StringUtils.isEmpty(deviceModeInfo)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 设备模型不能为空";
}
Long deviceModeId = Long.valueOf(deviceModeInfo.substring(0, deviceModeInfo.indexOf(infoSeparator)));
HwDeviceMode deviceMode = hwDeviceModeMapper.selectHwDeviceModeByDeviceModeId(deviceModeId);
if (deviceMode == null || deviceMode.getDeviceModeStatus().equals(HwDictConstants.DEVICE_MODE_STATUS_DELETED)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 设备模型不存在";
}
if (!deviceMode.getSceneId().equals(sceneId)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 设备模型不属于所选择场景";
}
}
//如果是网关子设备,必须有关联网关设备,并且关联网关设备属于此场景
if (deviceType.equals(DeviceTypeEnums.SUB_DEVICE.getDataType())) {
if (StringUtils.isEmpty(gateWayDeviceInfo)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 关联网关设备不能为空";
}
Long gatewayDeviceId = Long.valueOf(gateWayDeviceInfo.substring(0, gateWayDeviceInfo.indexOf(infoSeparator)));
HwDevice gatewayDevice = hwDeviceMapper.selectHwDeviceByDeviceId(gatewayDeviceId);
if (gatewayDevice == null || gatewayDevice.getDeviceStatus().equals(HwDictConstants.DEVICE_STATUS_DELETE)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 关联网关设备不存在";
}
if (!gatewayDevice.getSceneId().equals(sceneId)) {
return "设备名称 " + deviceImportVo.getDeviceName() + " 关联网关设备不属于所选择场景";
}
}
return "";
}
} }

@ -138,20 +138,13 @@ public class HwMonitorUnitServiceImpl implements IHwMonitorUnitService {
} }
// @Override /**
// public List<AllNumsVo> selectSenceAllNums() { * @param: hwMonitorUnit
// List<AllNumsVo> allNumsVos = hwMonitorUnitMapper.selectAllNums(); * @description
// List<AllNumsVo> allNums = hwMonitorUnitMapper.selectsum(); * @author xins
// for (int i = 0; i < allNums.size(); i++) { * @date 2023-11-10 9:07
// for (int j = 0; j < allNums.size(); j++) { * @return List<HwMonitorUnit>
// if (allNums.get(i).getSceneId().equals(allNumsVos.get(i).getSceneId())) { */
// allNums.get(i).setSubSum(allNumsVos.get(i).getSubSum());
// }
// }
// }
// return allNums;
// }
@Override @Override
public List<HwMonitorUnit> selectLimitSubMonitorUnit(HwMonitorUnit hwMonitorUnit) { public List<HwMonitorUnit> selectLimitSubMonitorUnit(HwMonitorUnit hwMonitorUnit) {
@ -197,7 +190,6 @@ public class HwMonitorUnitServiceImpl implements IHwMonitorUnitService {
return hwMonitorUnitMapper.selectHwMonitorUnitByMonitorUnitId(monitorUnitId); return hwMonitorUnitMapper.selectHwMonitorUnitByMonitorUnitId(monitorUnitId);
} }
//todo SysDeptServiceImpl类中的递归方法recursionFn(以实现)
@Override @Override
public List<HwMonitorUnit> selectTreeList(List<HwMonitorUnit> hwMonitorUnits) { public List<HwMonitorUnit> selectTreeList(List<HwMonitorUnit> hwMonitorUnits) {
List<HwMonitorUnit> returnList = new ArrayList<>(); List<HwMonitorUnit> returnList = new ArrayList<>();

@ -92,7 +92,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 租户数据范围过滤 --> <!-- 租户数据范围过滤 -->
${params.tenantDataScope} ${params.tenantDataScope}
</where> </where>
order by scene_id desc order by tenant_id,scene_id desc
</select> </select>
<select id="selectHwSceneByTenantId0" parameterType="Long" resultMap="HwSceneResult"> <select id="selectHwSceneByTenantId0" parameterType="Long" resultMap="HwSceneResult">
<include refid="selectHwSceneVo"/> <include refid="selectHwSceneVo"/>

@ -99,6 +99,19 @@
>新增 >新增
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="el-icon-upload"
size="mini"
@click="handleImport"
v-hasPermi="['business:device:import']"
>导入
</el-button>
</el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
type="warning" type="warning"
@ -373,6 +386,56 @@
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
<!--设备导入对话框-->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
<el-form ref="uploadForm" :model="upload" :rules="uploadRules" label-width="80px">
<el-form-item label="所属场景" prop="sceneId">
<el-select v-model="upload.sceneId" placeholder="请选择" @input="uploadEditedSceneChange">
<el-option
v-for="(scene, index) in editedScenes"
:key="index"
:label="scene.sceneName"
:value="scene.sceneId"
:disabled="scene.selectedDisable && scene.selectedDisable == 1"
></el-option>
</el-select>
</el-form-item>
</el-form>
<el-upload
ref="upload"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport+'&sceneId=' + upload.sceneId"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<!--div class="el-upload__tip" slot="tip">
<el-checkbox v-model="upload.updateSupport"/>
是否更新已经存在的设备数据
</div-->
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
@click="importTemplate">下载模板
</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
@ -390,12 +453,11 @@ import {
getGatewayDevices, getGatewayDevices,
changeDeviceStatus, changeDeviceStatus,
publishControlCommand, publishControlCommand,
rebuildTdTables rebuildTdTables,
} from "@/api/business/device"; } from "@/api/business/device";
import {getToken} from "@/utils/auth"; import {getToken} from "@/utils/auth";
import Treeselect from "@riophae/vue-treeselect"; import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import {rebuildTdSuperTables} from "@/api/business/deviceMode";
export default { export default {
components: {Treeselect}, components: {Treeselect},
@ -482,6 +544,26 @@ export default {
// //
open: false, open: false,
//
upload: {
//
open: false,
//
title: "",
//
isUploading: false,
sceneId: "",//ID
sceneName: "",//
//
updateSupport: 0,
//
headers: {Authorization: "Bearer " + getToken()},
//
url: process.env.VUE_APP_BASE_API + "/business/device/importData"
},
// //
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
@ -509,6 +591,9 @@ export default {
}, },
// //
form: {}, form: {},
uploadForm: {},
// //
rules: { rules: {
deviceCode: [ deviceCode: [
@ -548,6 +633,14 @@ export default {
{required: true, message: "数据格式不能为空", trigger: "change"} {required: true, message: "数据格式不能为空", trigger: "change"}
], ],
}, },
//
uploadRules: {
sceneId: [
{required: true, message: "所属场景不能为空", trigger: "change"}
],
},
number: 0, number: 0,
uploadList: [], uploadList: [],
dialogImageUrl: "", dialogImageUrl: "",
@ -652,11 +745,16 @@ export default {
this.single = selection.length !== 1 this.single = selection.length !== 1
this.multiple = !selection.length this.multiple = !selection.length
}, },
/** 新增按钮操作 */
handleAdd() { getEditedScenes() {
getEditedScenes().then(response => { getEditedScenes().then(response => {
this.editedScenes = response.data; this.editedScenes = response.data;
}); });
},
/** 新增按钮操作 */
handleAdd() {
this.getEditedScenes();
this.deviceTypeDisabled = false; this.deviceTypeDisabled = false;
this.sceneDisabled = false; this.sceneDisabled = false;
this.deviceModeDisabled = false; this.deviceModeDisabled = false;
@ -669,9 +767,7 @@ export default {
handleUpdate(row) { handleUpdate(row) {
this.deviceModeDisabled = true; this.deviceModeDisabled = true;
this.confirmBtnVisible = true; this.confirmBtnVisible = true;
getEditedScenes().then(response => { this.getEditedScenes();
this.editedScenes = response.data;
});
this.deviceTypeDisabled = true; this.deviceTypeDisabled = true;
this.sceneDisabled = true; this.sceneDisabled = true;
this.reset(); this.reset();
@ -1003,6 +1099,48 @@ export default {
}); });
}, },
uploadEditedSceneChange(sceneId) {
const selectedOption = this.editedScenes.find(option => option.sceneId === sceneId);
this.upload.sceneName = selectedOption.sceneName;
},
/** 导入按钮操作 */
handleImport() {
this.upload.title = "设备导入";
this.upload.open = true;
this.getEditedScenes();
},
// /** */
importTemplate() {
this.$refs["uploadForm"].validate(valid => {
if (valid) {
this.download('business/device/importTemplate', {"sceneId": this.upload.sceneId}, `device_template_`+this.upload.sceneName+`_${new Date().getTime()}.xlsx`)
}
});
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
//
handleFileSuccess(response, file, fileList) {
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true});
this.getList();
},
//
submitFileForm() {
this.$refs["uploadForm"].validate(valid => {
if (valid) {
this.$refs.upload.submit();
}
});
}
} }
}; };
</script> </script>

Loading…
Cancel
Save