Commit eac35281 by lzy

Merge branch 'dev' of git.xmmakeit.com:huangjiay/iot-platform-server into dev

parents 81c4bf51 de040ee3
Showing with 364 additions and 44 deletions
......@@ -416,21 +416,23 @@ CREATE TABLE `alarm_config` (
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '告警配置';
CREATE TABLE `alarm_record` (
CREATE TABLE `plat_alarm_record` (
`id` VARCHAR ( 64 ) NOT NULL COMMENT 'id',
`alarm_id` VARCHAR ( 64 ) DEFAULT NULL COMMENT '关联告警配置',
`alarm_date` datetime DEFAULT NULL COMMENT '告警时间',
`status` TINYINT ( 1 ) DEFAULT NULL COMMENT '状态 1 待处理 2 已处理',
`status` char ( 1 ) DEFAULT NULL COMMENT '状态 0 待处理 1 已处理',
`notice_status` char ( 1 ) DEFAULT NULL COMMENT '通知家属状态 0 未通知 1 已通知',
`content` varchar(128) NOT NULL COMMENT '告警内容',
`deal_user` VARCHAR ( 64 ) DEFAULT NULL COMMENT '处理人',
`deal_time` VARCHAR ( 64 ) DEFAULT NULL COMMENT '处理时间',
`deal_date` datetime DEFAULT NULL COMMENT '处理时间',
`create_by` VARCHAR ( 64 ) DEFAULT NULL COMMENT '创建者',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` VARCHAR ( 64 ) DEFAULT NULL COMMENT '更新者',
`update_date` datetime DEFAULT NULL COMMENT '更新时间',
`del_flag` INT ( 1 ) DEFAULT '0' COMMENT '删除标记',
`del_flag` char ( 1 ) DEFAULT '0' COMMENT '删除标记',
`tenant_id` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ' 租户id ',
PRIMARY KEY ( `id` ) USING BTREE
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '告警配置';
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = '告警记录';
CREATE TABLE `plafform_setting` (
......
......@@ -133,7 +133,7 @@ CREATE TABLE `saas_operation_log` (
CREATE TABLE `plat_tenant` (
`id` varchar(64) NOT NULL COLLATE utf8mb4_general_ci COMMENT 'id',
`id` varchar(64) NOT NULL COMMENT 'id',
`name` varchar(128) DEFAULT NULL COMMENT '名称',
`status` varchar(10) NOT NULL COMMENT '状态 0停用 1启用',
`start_time` datetime NOT NULL COMMENT '租户有效期-开始时间',
......@@ -143,9 +143,10 @@ CREATE TABLE `plat_tenant` (
`alert_channel` varchar(32) DEFAULT NULL COMMENT '告警渠道 1-短信 2-邮件 3-语音短信 4-云龄工单 5-晶奇工单',
`create_date` datetime NOT NULL COMMENT '创建时间',
`update_date` datetime NOT NULL COMMENT '更新时间',
`del_flag` CHAR(1) DEFAULT NULL COMMENT '删除标识',
`del_flag` char(1) DEFAULT NULL COMMENT '删除标识',
`create_by` varchar(64) NOT NULL COMMENT '创建人',
`update_by` varchar(64) NOT NULL COMMENT '更新人',
`iot_org_id` varchar(64) DEFAULT NULL COMMENT 'iot组织id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 STATS_AUTO_RECALC=0 ROW_FORMAT=COMPACT COMMENT='租户管理';
......
package com.makeit.controller.saas;
import com.makeit.common.dto.BaseIdDTO;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.global.annotation.Action;
import com.makeit.module.admin.dto.saas.SaasMenuDTOVO;
import com.makeit.module.admin.dto.saas.SaasMenuQueryDTO;
import com.makeit.service.saas.SaasMenuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>
* 平台端菜单 前端控制器
* </p>
*
* @author eugene young
* @since 2022-05-10
*/
@Api(tags = "saas端-菜单")
@RestController
@RequestMapping("/saas/menu")
public class SaasMenuController {
@Autowired
private SaasMenuService platMenuService;
@Action(module = "saas端-菜单", name = "列表", code = "plat:menu:list")
@ApiOperation("列表")
@PostMapping("list")
public ApiResponseEntity<List<SaasMenuDTOVO>> list(@RequestBody SaasMenuQueryDTO dto) {
return ApiResponseUtils.success(platMenuService.list(dto));
}
@Action(module = "saas端-菜单", name = "树形列表", code = "plat:menu:tree")
@ApiOperation("树形列表")
@PostMapping("tree")
public ApiResponseEntity<List<SaasMenuDTOVO>> tree(@RequestBody SaasMenuQueryDTO dto) {
return ApiResponseUtils.success(platMenuService.tree(dto));
}
@ApiOperation("列表(AuthIgnore)")
@PostMapping("listAuthIgnore")
public ApiResponseEntity<List<SaasMenuDTOVO>> listAuthIgnore(@RequestBody SaasMenuQueryDTO dto) {
return ApiResponseUtils.success(platMenuService.list(dto));
}
@ApiOperation("树形列表(AuthIgnore)")
@PostMapping("treeAuthIgnore")
public ApiResponseEntity<List<SaasMenuDTOVO>> treeAuthIgnore(@RequestBody SaasMenuQueryDTO dto) {
return ApiResponseUtils.success(platMenuService.tree(dto));
}
@Action(module = "saas端-菜单", name = "新增", code = "plat:menu:add")
@ApiOperation("新增")
@PostMapping("add")
public ApiResponseEntity<?> add(@Validated @RequestBody SaasMenuDTOVO dto) {
platMenuService.add(dto);
return ApiResponseUtils.success();
}
@Action(module = "saas端-菜单", name = "编辑", code = "plat:menu:edit")
@ApiOperation("编辑")
@PostMapping("edit")
public ApiResponseEntity<?> edit(@Validated @RequestBody SaasMenuDTOVO dto) {
platMenuService.edit(dto);
return ApiResponseUtils.success();
}
//@Action(module = "saas端-菜单", name = "详情", code = "plat:menu:view")
@ApiOperation("详情")
@PostMapping("view")
public ApiResponseEntity<SaasMenuDTOVO> view(@RequestBody BaseIdDTO dto) {
return ApiResponseUtils.success(platMenuService.view(dto.getId()));
}
@Action(module = "saas端-菜单", name = "删除", code = "plat:menu:del")
@ApiOperation("删除")
@PostMapping("del")
public ApiResponseEntity<?> del(@RequestBody BaseIdDTO dto) {
platMenuService.del(dto.getId());
return ApiResponseUtils.success();
}
@ApiOperation("同步")
@PostMapping("sync")
public ApiResponseEntity<?> sync() {
platMenuService.sync();
return ApiResponseUtils.success();
}
}
......@@ -53,4 +53,6 @@ public class PlatUserLoginVO implements Serializable {
@ApiModelProperty("企微菜单列表")
private List<String> wechatMenuCodeList;
private String userType = "plat";
}
......@@ -36,4 +36,6 @@ public class SaasUserLoginVO implements Serializable {
@ApiModelProperty("按钮列表")
private List<SaasMenuDTOVO> buttonList;
private String userType = "saas";
}
......@@ -37,7 +37,9 @@ public class DeviceInstanceEntity {
@Schema(
description = "状态(只读)"
description = "状态(只读) notActive(\"禁用\"),\n" +
" offline(\"离线\"),\n" +
" online(\"在线\"); "
, accessMode = Schema.AccessMode.READ_ONLY
, defaultValue = "notActive"
)
......
package com.makeit.task;
import com.makeit.module.iot.service.IotOrgService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class IotSyncTask {
@Autowired
private IotOrgService iotOrgService;
@Scheduled(cron = "0 */1 * * * ?")
public void syncEquipmentInfo() {
log.info("开始执行同步设备信息接口");
log.info("结束执行同步设备信息接口");
}
@Scheduled(cron = "0 0/1 * * * ?")
public void syncDeviceLog() {
log.info("开始同步设备日志");
log.info("同步设备日志结束");
}
}
......@@ -7,7 +7,7 @@ import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.platform.alarm.PlatAlarmConfigDTOVO;
import com.makeit.dto.platform.alarm.PlatAlarmConfigQueryDTO;
import com.makeit.server.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.alarm.PlatAlarmConfigService;
import com.makeit.vo.platform.alarm.PlatAlarmConfigListVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......
package com.makeit.entity.platform.alarm;
import com.baomidou.mybatisplus.annotation.TableName;
import com.makeit.common.entity.BaseBusEntity;
import lombok.Data;
import java.util.Date;
/**
* 告警记录
* @TableName plat_alarm_record
*/
@TableName(value ="plat_alarm_record")
@Data
public class PlatAlarmRecord extends BaseBusEntity {
/**
* 关联告警配置
*/
private String alarmId;
/**
* 告警时间
*/
private Date alarmDate;
/**
* 状态 0 待处理 1 已处理
*/
private String status;
/**
* 通知家属状态 0 未通知 1 已通知
*/
private String noticeStatus;
/**
* 告警内容
*/
private String content;
/**
* 处理人
*/
private String dealUser;
/**
* 处理时间
*/
private Date dealDate;
}
......@@ -49,5 +49,10 @@ public class PlatTenant extends BaseEntity {
*/
private String alertChannel;
/**
* 新增租户时,会在iot创建一个组织
*/
private String iotOrgId;
}
\ No newline at end of file
package com.makeit.mapper.platform.alarm;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
/**
* @author lixl
* @description 针对表【plat_alarm_record(告警记录)】的数据库操作Mapper
* @createDate 2023-09-06 14:26:05
* @Entity com.makeit.entity.platform.alarm.PlatAlarmRecord
*/
public interface PlatAlarmRecordMapper extends BaseMapper<PlatAlarmRecord> {
}
package com.makeit.server.platform.alarm;
package com.makeit.service.platform.alarm;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.common.dto.StatusDTO;
......
package com.makeit.service.platform.alarm;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
/**
* @author lixl
* @description 针对表【plat_alarm_record(告警记录)】的数据库操作Service
* @createDate 2023-09-06 14:26:05
*/
public interface PlatAlarmRecordService extends IService<PlatAlarmRecord> {
}
package com.makeit.server.platform.alarm.impl;
package com.makeit.service.platform.alarm.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
......@@ -11,7 +11,7 @@ import com.makeit.enums.CodeMessageEnum;
import com.makeit.enums.CommonEnum;
import com.makeit.exception.BusinessException;
import com.makeit.mapper.platform.alarm.PlatAlarmConfigMapper;
import com.makeit.server.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.auth.PlatUserService;
import com.makeit.utils.data.convert.BeanDtoVoUtils;
import com.makeit.utils.data.convert.StreamUtil;
......
package com.makeit.service.platform.alarm.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.mapper.platform.alarm.PlatAlarmRecordMapper;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import org.springframework.stereotype.Service;
/**
* @author lixl
* @description 针对表【plat_alarm_record(告警记录)】的数据库操作Service实现
* @createDate 2023-09-06 14:26:05
*/
@Service
public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMapper, PlatAlarmRecord>
implements PlatAlarmRecordService{
}
......@@ -22,6 +22,8 @@ import com.makeit.module.admin.dto.plat.PlatTenantDTOVO;
import com.makeit.module.admin.dto.plat.PlatTenantMenuDTO;
import com.makeit.module.admin.dto.plat.PlatTenantStatusDTO;
import com.makeit.module.admin.vo.plat.PlatTenantVO;
import com.makeit.module.iot.service.IotOrgService;
import com.makeit.module.iot.vo.OrganizationEntity;
import com.makeit.module.system.service.SysConfigService;
import com.makeit.service.platform.auth.PlatOrgService;
import com.makeit.service.platform.auth.PlatUserService;
......@@ -75,6 +77,9 @@ implements PlatTenantService {
@Autowired
private PlatOrgService platOrgService;
@Autowired
private IotOrgService iotOrgService;
private LambdaQueryWrapper<PlatTenant> listLambdaQueryWrapper(PlatTenantVO dto, boolean userAccountLike) {
List<String> tenantUserIdList = new ArrayList<>(10);
......@@ -192,6 +197,13 @@ implements PlatTenantService {
checkName(dto);
checkDate(dto);
PlatTenant tntTenant = BeanDtoVoUtils.convert(dto, PlatTenant.class);
//新租户同步到iot
PlatTenantVO platTenantVO = new PlatTenantVO();
platTenantVO.setName(dto.getName());
OrganizationEntity organizationEntity = iotOrgService.syncTenantInfoToIot(platTenantVO);
tntTenant.setIotOrgId(organizationEntity.getId());
save(tntTenant);
dto.setId(tntTenant.getId());
......
package com.makeit.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.makeit.common.entity.BaseBusEntity;
import com.makeit.common.entity.BaseEntity;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.enums.CommonEnum;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.module.iot.service.IotOrgService;
import com.makeit.module.iot.vo.DeviceInstanceEntity;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.saas.PlatTenantService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Component
@Slf4j
public class IotSyncTask {
@Autowired
private IotOrgService iotOrgService;
@Autowired
private PlatTenantService platTenantService;
@Autowired
private PlatDeviceService platDeviceService;
/**
* 一小时同步一次
* 启用状态的租户才同步
* 新增和更新平台端设备表
*/
@Scheduled(cron = "0 0 */1 * * ?")
// @Scheduled(cron = "0 */1 * * * ?")
@TenantIdIgnore
public void syncEquipmentInfo() {
log.info("开始执行同步设备信息接口");
LambdaQueryWrapper<PlatTenant> tenantLambdaQueryWrapper = new LambdaQueryWrapper<PlatTenant>().eq(PlatTenant::getStatus, CommonEnum.YES.getValue());
List<PlatTenant> platTenants = platTenantService.list(tenantLambdaQueryWrapper);
for (PlatTenant platTenant : platTenants) {
String iotOrgId = platTenant.getIotOrgId();
if(StringUtils.isBlank(iotOrgId)){
continue;
}
//查询iot设备
List<DeviceInstanceEntity> iotDeviceList = iotOrgService.getOrgDevice(iotOrgId);
if(CollectionUtils.isEmpty(iotDeviceList)){
continue;
}
//查询平台设备
Set<String> iotDeviceIdSet = iotDeviceList.stream().map(DeviceInstanceEntity::getId).collect(Collectors.toSet());
LambdaQueryWrapper<PlatDevice> deviceLambdaQueryWrapper = new LambdaQueryWrapper<PlatDevice>().eq(BaseBusEntity::getTenantId, platTenant.getId())
.in(BaseEntity::getId, iotDeviceIdSet);
List<PlatDevice> deviceList = platDeviceService.list(deviceLambdaQueryWrapper);
//更新平台设备
Collection<PlatDevice> platDevices = convertToPlatDevice(iotDeviceList, deviceList,platTenant.getId());
platDeviceService.saveOrUpdateBatch(platDevices);
}
log.info("结束执行同步设备信息接口");
}
@Scheduled(cron = "0 0/1 * * * ?")
public void syncDeviceLog() {
log.info("开始同步设备日志");
log.info("同步设备日志结束");
}
private Collection<PlatDevice> convertToPlatDevice(List<DeviceInstanceEntity> iotDeviceList, List<PlatDevice> deviceList,String tenantId){
Map<String, PlatDevice> deviceMap = deviceList.stream().collect(Collectors.toMap(PlatDevice::getOriDeviceId, v -> v, (a, b) -> a));
iotDeviceList.forEach(iotDevice->{
PlatDevice platDevice = deviceMap.get(iotDevice.getId());
if(platDevice==null){
platDevice=new PlatDevice();
platDevice.setTenantId(tenantId);
}
platDevice.setOriDeviceId(iotDevice.getId());
platDevice.setName(iotDevice.getName());
platDevice.setProductName(iotDevice.getProductName());
platDevice.setProductId(iotDevice.getProductId());
LocalDateTime registryTime = LocalDateTime.ofEpochSecond(iotDevice.getRegistryTime()/1000, 0, ZoneOffset.ofHours(8));
platDevice.setRegistrationDate(registryTime);
platDevice.setDescription(iotDevice.getDescribe());
String state = iotDevice.getState();
platDevice.setStatus(StringUtils.equals("online",state)?CommonEnum.YES.getValue() : CommonEnum.NO.getValue());
// platDevice.setFirmwareVersion();
// platDevice.setLastOnlineData();
// platDevice.setOrgId();
// platDevice.setCityOrgId();
// platDevice.setDistrictOrgId();
// platDevice.setStreetOrgId();
// platDevice.setOrgPath();
// platDevice.setId();
// platDevice.setCreateDate();
// platDevice.setUpdateDate();
// platDevice.setDelFlag();
// platDevice.setCreateBy();
// platDevice.setUpdateBy();
deviceMap.put(iotDevice.getId(),platDevice);
});
return deviceMap.values();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment