Commit f84bb85d by huangjy

feat:声网PID管理

parent dbe84faf
ALTER TABLE `plat_device_other`
ALTER TABLE `plat_device_other`
......@@ -66,3 +66,17 @@ INSERT INTO `sys_dictionary` VALUES ('204', 'alarm.alarmType.offBed', '离床异
## 离床次数月统计
ALTER TABLE `plat_elder_report_month` add column off_bed_exception_count int(11) default 0 COMMENT '离床异常次数' after behavior_exception_count;
CREATE TABLE `saas_pid_manage` (
`id` varchar(64) NOT NULL COMMENT 'id',
`pid` varchar(100) NOT NULL COMMENT 'pid',
`status` char(1) DEFAULT NULL COMMENT '状态 0禁用 1启用',
`available_credit` int4 DEFAULT NULL COMMENT '可用额度',
`used_credit` int4 DEFAULT NULL COMMENT '已用额度',
`total_credit` int4 DEFAULT NULL COMMENT '总额度',
`create_date` datetime NOT NULL COMMENT '创建时间',
`update_date` datetime NOT NULL COMMENT '更新时间',
`del_flag` char(1) DEFAULT NULL COMMENT '删除标识',
`create_by` varchar(64) NOT NULL COMMENT '创建人',
`update_by` varchar(64) NOT NULL COMMENT '更新人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='声网pid管理';
\ No newline at end of file
package com.makeit.controller.saas;
import com.makeit.common.dto.BaseIdDTO;
import com.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.entity.platform.device.PlatDeviceLog;
import com.makeit.entity.saas.SaasPidManage;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.saas.SaasPidManageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
* <p>
* 声网pid管理 前端控制器
* </p>
*
* @author eugene young
* @since 2023-12-13
*/
@RestController
@RequestMapping("/saas/pidManage")
@Api(tags = "租户管理-声网pid管理")
public class SaasPidManageController {
@Autowired
private SaasPidManageService saasPidManageService;
@ApiOperation("列表")
@PostMapping("page")
@TenantIdIgnore
public ApiResponseEntity<PageVO<SaasPidManage>> page(@RequestBody PageReqDTO<SaasPidManage> pageReqDTO) {
return ApiResponseUtils.success(saasPidManageService.pageList(pageReqDTO));
}
@ApiOperation("新增")
@PostMapping("add")
@TenantIdIgnore
public ApiResponseEntity<Void> add(@RequestBody SaasPidManage dto) {
saasPidManageService.add(dto);
return ApiResponseUtils.success();
}
@ApiOperation("新增")
@PostMapping("delete")
@TenantIdIgnore
public ApiResponseEntity<Void> delete(@RequestBody BaseIdDTO dto) {
saasPidManageService.delete(dto.getId());
return ApiResponseUtils.success();
}
}
......@@ -17,7 +17,7 @@ public class ShengwangHttpUtil {
@Autowired
private ShengwangProperties shengwangProperties;
public String active(String licenseKey) {
public String active(String licenseKey,String pid) {
String plainCredentials = shengwangProperties.getCustomerKey() + ":" + shengwangProperties.getCustomerSecret();
String base64Credentials = new String(Base64.getEncoder().encode(plainCredentials.getBytes()));
// 创建 authorization header
......
......@@ -106,7 +106,7 @@ public class CodeGenerator {
// 使用重点 下列字段填写表名 运行方法
// strategy.setInclude("edu_teacher","..."); // 多表-逆向工程
strategy.setInclude("plat_device_log");
strategy.setInclude("saas_pid_manage");
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体属性时去掉表"_"前缀并且第一个字母大写 如:gmt_create -> gmtCreate
......
package com.makeit.entity.saas;
import com.makeit.common.entity.BaseBusEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 声网pid管理
* </p>
*
* @author eugene young
* @since 2023-12-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value="SaasPidManage对象", description="声网pid管理")
public class SaasPidManage extends BaseBusEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "pid")
private String pid;
@ApiModelProperty(value = "状态 0已用完 1可用")
private String status;
@ApiModelProperty(value = "可用额度")
private Integer availableCredit;
@ApiModelProperty(value = "已用额度")
private Integer usedCredit;
@ApiModelProperty(value = "总额度")
private Integer totalCredit;
}
package com.makeit.mapper.saas;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.entity.saas.SaasPidManage;
/**
* <p>
* 声网pid管理 Mapper 接口
* </p>
*
* @author eugene young
* @since 2023-12-13
*/
public interface SaasPidManageMapper extends BaseMapper<SaasPidManage> {
}
......@@ -35,6 +35,7 @@ import com.makeit.entity.platform.space.PlatRegionSetting;
import com.makeit.entity.platform.space.PlatRoomBedDevice;
import com.makeit.entity.platform.space.PlatSpace;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.entity.saas.SaasPidManage;
import com.makeit.enums.CodeMessageEnum;
import com.makeit.enums.CommonEnum;
import com.makeit.enums.report.DeviceNameEnum;
......@@ -60,6 +61,7 @@ import com.makeit.service.platform.space.PlatRegionSettingService;
import com.makeit.service.platform.space.PlatRoomBedDeviceService;
import com.makeit.service.platform.space.PlatSpaceService;
import com.makeit.service.saas.PlatTenantService;
import com.makeit.service.saas.SaasPidManageService;
import com.makeit.shengwang.agora.dto.PlatCallingDeviceDTO;
import com.makeit.shengwang.agora.http.ShengwangHttpUtil;
import com.makeit.shengwang.agora.media.RtcTokenBuilder2;
......@@ -140,6 +142,8 @@ public class PlatDeviceServiceImpl extends ServiceImpl<PlatDeviceMapper, PlatDev
private AliyunOSSRepository aliyunOSSRepository;
@Autowired
private PlatDeviceLogService platDeviceLogService;
@Autowired
private SaasPidManageService saasPidManageService;
/**
* 平台设备列表
......@@ -837,7 +841,22 @@ public class PlatDeviceServiceImpl extends ServiceImpl<PlatDeviceMapper, PlatDev
if (StringUtils.isNotEmpty(AttrResult)) {
throw new RuntimeException(AttrResult);
}
String active = shengwangHttpUtil.active(platDevice.getOriDeviceId());
SaasPidManage saasPidManage = saasPidManageService.getOne(new QueryWrapper<SaasPidManage>().lambda()
.eq(SaasPidManage::getStatus, "1")
.orderByAsc(BaseEntity::getCreateDate)
.last("limit 1"));
if (saasPidManage == null) {
return;
}
saasPidManage.setUsedCredit(saasPidManage.getUsedCredit() + 1);
saasPidManage.setAvailableCredit(saasPidManage.getAvailableCredit() - saasPidManage.getUsedCredit());
if (Objects.equals(saasPidManage.getAvailableCredit(), saasPidManage.getUsedCredit())) {
saasPidManage.setStatus("0");
}
saasPidManageService.updateById(saasPidManage);
// 先为了业务测试注释
/* String active = shengwangHttpUtil.active(platDevice.getOriDeviceId(),saasPidManage.getPid());
ApiResponseEntity responseEntity = JSON.parseObject(active, ApiResponseEntity.class);
if (responseEntity.getCode() != 200) {
throw new RuntimeException(responseEntity.getMessage());
......@@ -859,7 +878,7 @@ public class PlatDeviceServiceImpl extends ServiceImpl<PlatDeviceMapper, PlatDev
if (StringUtils.isNotEmpty(result)) {
throw new RuntimeException(result);
}
}
}*/
}
......
......@@ -191,20 +191,16 @@ public class PlatElderRealTimeServiceImpl implements PlatElderRealTimeService {
// 判断是否在床睡觉
Integer sleepTimeActionThreshold = getSleepTimeActionThreshold();
Long sleepTimeActionDuration = getSleepTimeActionDuration();
Map<Object, Object> entries = redisTemplate.opsForHash().entries(DEVICE_BR_ANALYSIS + platDevice.getOriDeviceId());
Collection<Object> values = entries.values();
if (values.size() >= sleepTimeActionDuration) {
int count = 0;
for (Object entity : values) {
JSONObject result = JSON.parseObject(entity.toString());
Integer bodymove = Integer.valueOf(result.getString("bodymove"));
boolean b = bodymove.compareTo(sleepTimeActionThreshold) <= 0;
if (b) {
count++;
}
}
log.info("计算后睡眠集合大小:{},count:{}",values.size(),count);
if (values.size() - count <= 5) {
Set<String> dataSet = redisTemplate.opsForZSet().rangeByScore(DEVICE_BR_ANALYSIS + platDevice.getOriDeviceId(), 0, Integer.MAX_VALUE);
if (CollectionUtils.isNotEmpty(dataSet) && dataSet.size() >= sleepTimeActionDuration) {
boolean flag = dataSet.stream().anyMatch(s -> {
JSONObject result = JSON.parseObject(s);
JSONObject properties = (JSONObject)result.get("properties");
Integer bodymove = Integer.valueOf(properties.getString("bodymove"));
return bodymove.compareTo(sleepTimeActionThreshold) <= 0;
});
log.info("计算后睡眠集合大小:{}",dataSet.size());
if (flag) {
log.info("当前属于在床睡眠:" + platElderIdDTO.getElderId());
platElderRealTimeNowVO.setStatus(PlatElderRealtimeReportEnum.NowStatus.SLEEP.getValue());
return platElderRealTimeNowVO;
......
package com.makeit.service.saas;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO;
import com.makeit.entity.saas.SaasPidManage;
/**
* <p>
* 声网pid管理 服务类
* </p>
*
* @author eugene young
* @since 2023-12-13
*/
public interface SaasPidManageService extends IService<SaasPidManage> {
PageVO<SaasPidManage> pageList(PageReqDTO<SaasPidManage> pageReqDTO);
void add(SaasPidManage dto);
void delete(String id);
}
package com.makeit.service.saas.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO;
import com.makeit.entity.saas.SaasPidManage;
import com.makeit.mapper.saas.SaasPidManageMapper;
import com.makeit.service.saas.SaasPidManageService;
import com.makeit.utils.data.convert.PageUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* <p>
* 声网pid管理 服务实现类
* </p>
*
* @author eugene young
* @since 2023-12-13
*/
@Service
public class SaasPidManageServiceImpl extends ServiceImpl<SaasPidManageMapper, SaasPidManage> implements SaasPidManageService {
@Resource
private SaasPidManageMapper saasPidManageMapper;
@Override
public PageVO<SaasPidManage> pageList(PageReqDTO<SaasPidManage> pageReqDTO) {
SaasPidManage dto = pageReqDTO.getData();
Page<SaasPidManage> p = PageUtil.toMpPage(pageReqDTO);
LambdaQueryWrapper<SaasPidManage> lambdaQueryWrapper = new QueryWrapper<SaasPidManage>().lambda()
.like(StringUtils.isNotEmpty(dto.getPid()), SaasPidManage::getPid, dto.getPid())
.eq(StringUtils.isNotEmpty(dto.getStatus()), SaasPidManage::getStatus, dto.getStatus());
Page<SaasPidManage> saasPidManagePage = saasPidManageMapper.selectPage(p, lambdaQueryWrapper);
List<SaasPidManage> records = saasPidManagePage.getRecords();
return PageUtil.toPageVO(records, saasPidManagePage);
}
@Override
public void add(SaasPidManage dto) {
dto.setStatus("1");
dto.setUsedCredit(0);
save(dto);
}
@Override
public void delete(String id) {
delete(id);
}
}
......@@ -246,17 +246,12 @@ public class PushCallback implements MqttCallback {
// 缓存呼吸设备某段时间的数据,hash 最大长度 duration
String key = DEVICE_BR_ANALYSIS + device.getDeviceId();
long duration = getSleepTimeActionDuration();
long size = redisTemplate.opsForHash().size(key);
long size = redisTemplate.opsForZSet().zCard(key);
long differenceValue = currentSecond - duration;
if (size == duration) {
redisTemplate.opsForHash().delete(key, differenceValue);
}else if (size - duration >= 5) {
// 兼容设备上报数据时间不准确问题
for (long i = differenceValue; i < differenceValue - 10; i--) {
redisTemplate.opsForHash().delete(key, i);
}
if (size > duration) {
redisTemplate.opsForZSet().removeRangeByScore(key,differenceValue - 60,differenceValue - 1);
}
redisTemplate.opsForHash().put(key, currentSecond,JSON.toJSONString(device.getProperties()));
redisTemplate.opsForZSet().add(key,JSON.toJSONString(device),currentSecond);
redisTemplate.expire(key,duration + 3,TimeUnit.MINUTES);
}
......
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