Commit ce1e9c90 by 罗志长

Merge branch 'dev'

parents 8e1d0ca8 3eb46154
Showing with 524 additions and 84 deletions
......@@ -46205,6 +46205,9 @@ INSERT INTO `saas_menu` VALUES ('1699779383360856066', '0', '数据分析', NULL
INSERT INTO `saas_menu` VALUES ('1701192156686856193', '0', '空间管理', NULL, 'QuestionFilled', 500, '1', '1', NULL, NULL, NULL, NULL, '1', '2023-09-11 19:13:11', '2023-09-11 19:13:11', '0', NULL, 'root', 'root', NULL, NULL);
INSERT INTO `saas_menu` VALUES ('1702153993116991489', '1699779383360856066', '模型管理', 'saasAnalysisModelList', NULL, 500, '1', '2', '/saas/analysis/model-list', NULL, NULL, NULL, '1', '2023-09-14 10:55:11', '2023-09-14 10:55:11', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1702227189241573378', '1699779383360856066', '报告管理', 'saasAnalysisReportList', NULL, 500, '1', '2', '/saas/analysis/report-list', NULL, NULL, NULL, '1', '2023-09-14 15:46:02', '2023-09-14 15:46:02', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1731523714760503298', '1699699374096998402', '租户设备日志', 'saasTenantDeviceLogList', NULL, 500, '1', '2', '/saas/tenant/device-log-list', NULL, NULL, NULL, '1', '2023-12-04 11:59:58', '2023-12-04 11:59:58', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1735846783046008833', '1699699374096998402', '声网PID管理', 'saasTenantSwPidList', NULL, 500, '1', '2', '/saas/tenant/sw-pid-list', NULL, NULL, NULL, '1', '2023-12-16 10:18:18', '2023-12-16 10:18:18', '0', NULL, 'root', 'root', 'list', NULL);
INSERT INTO `saas_menu` VALUES ('1751073621548666882', '1699699374096998402', 'OpenAPI管理', 'saasTenantOpenApiList', NULL, 500, '1', '2', '/saas/tenant/open-api-list', NULL, NULL, NULL, '1', '2024-01-27 10:44:19', '2024-01-27 10:44:19', '0', NULL, 'root', 'root', 'list', NULL);
-- ----------------------------
-- Table structure for saas_model_manage
INSERT INTO sys_dictionary (id, code, name, value, sort, description, category_id, create_date,
INSERT INTO sys_dictionary (id, code, name, value, sort, description, category_id, create_date,
update_date, del_flag, create_by, update_by, eng_name)
VALUES ('213', 'alarm.sendType.childWechat', '子女端小程序', '6', 4, '', '201', '2022-05-16 17:13:23',
'2022-05-16 17:13:27', '0', null, null, null);
\ No newline at end of file
......@@ -20,7 +20,10 @@ public class AnalysisVO {
private Boolean isAction; // 每分钟是否动过
private Boolean isMoveBed; // 是否离开床
/**
* 是否离开床或无人
*/
private Boolean isMoveBed;
private Boolean isMinuteActionFlag; // 每分钟体动值是否大于阈值
......@@ -49,6 +52,10 @@ public class AnalysisVO {
private int hrSlow; // 当前心率
private String hrSlowTime; // 发生时间
private String createdTime;
private String deviceId;
// private Integer sleepDeepMinuteCount; // 深睡每分钟体动和翻身次数
......
......@@ -20,4 +20,6 @@ public class SleepCountDTO {
private TreeMap<String, TreeMap<String, AnalysisVO>> restSleepMap;
private TreeMap<String, TreeMap<String, AnalysisVO>> allSleepMap;
}
......@@ -17,10 +17,9 @@ public class SleepTimeAnalysisVO {
*/
private String endTime;
/**
* 起床时间
*/
private String newEndTime;
private String getUpTime;
private String remark;
/**
* 间隔时间(分钟)
......@@ -32,6 +31,20 @@ public class SleepTimeAnalysisVO {
*/
private String type;
/**
* 体动次数
*/
private Integer actionCount;
/**
* 翻身次数
*/
private Integer turnedCount;
/**
* 所属睡眠区间开始时间
*/
private String belongToSleepTime;
private List<SleepTimeAnalysisVO> deepList;
private List<SleepTimeAnalysisVO> midList;
/**
......
......@@ -44,7 +44,7 @@ public class WxSpSender implements IMsgSender{
public void send(MsgSendDTO msgDTO) {
List<MsgSendDTO.ReceiverInfo> receiverInfos = msgDTO.getReceiverInfos();
if (CollUtil.isNotEmpty(receiverInfos)) {
if (CollUtil.isEmpty(receiverInfos)) {
return;
}
String content = msgDTO.getOriContent();
......
package com.makeit.utils.third.wechat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author wangzy
* @description
* @createDate 2024-01-26-14:09
*/
@Data
public class WechatBindDTO {
@ApiModelProperty(value = "用户id")
private String id;
@ApiModelProperty(value = "微信公众号openid")
private String weChatOpenid;
private String appid;
private String secret;
private String code;
private String grantType;
}
package com.makeit.utils.third.wechat;
import lombok.Data;
/**
* @author wangzy
* @description
* @createDate 2024-01-30-16:57
*/
@Data
public class WechatCodeDTO {
// {"access_token":"77_hfkGpaiIT8xPltYrmRmrHj_svTcoLKIvR-w_lkR_wWqGHyF1NnZiIvIg0LxnI2rO55U2NqSGpXStYFmwxPE2mO0gNyfUrGvHUMcckrNNM9I",
// "expires_in":7200,
// "refresh_token":"77_MFeHId8uo1EgV6NFlhDiaQMrK6FXGmKcDMfa-BqGOaWr20u-6aM4lkBx1fnsSMrgL5m_Q3Csdw8D4Z3_qmpDj0kZKMXLmTzxosLz2BEqJHs",
// "openid":"o1es866cj4fp2Np9S5rmnbIdSg4U",
// "scope":"snsapi_base"}
private String accessToken;
private String openid;
private String scope;
}
......@@ -56,5 +56,7 @@ public class WechatUserInfo implements Serializable {
private String isTenant;
private String weChatOpenid;
}
......@@ -4,6 +4,7 @@ import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.service.wechat.PlatElderChildrenInfoUserLoginWechatService;
import com.makeit.utils.third.wechat.WechatBindDTO;
import com.makeit.utils.third.wechat.WechatLoginPhoneDTO;
import com.makeit.utils.user.wechat.WechatUserInfo;
import io.swagger.annotations.Api;
......@@ -37,4 +38,12 @@ public class PlatElderChildrenInfoUserLoginChildrenController {
return ApiResponseUtils.success();
}
@ApiOperation(value = "绑定公众号")
@PostMapping(value = "/bind")
@TenantIdIgnore
public ApiResponseEntity<Void> bind(@RequestBody WechatBindDTO dto) {
platElderChildrenInfoUserLoginWechatService.bind(dto);
return ApiResponseUtils.success();
}
}
......@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils;
import com.makeit.dto.wechat.device.PlatDeviceAttrWechatDTO;
import com.makeit.entity.platform.elder.ElderSleepAnalysisVO;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.external.huineng.HuiNengService;
......@@ -73,7 +74,7 @@ public class PlatElderSleepController {
@GetMapping("test4")
@AuthIgnore
@TenantIdIgnore
public ApiResponseEntity<List<PlatElderSleepAnalysis>> elderSleepSleepAnalysisTask(@RequestParam Integer month,
public ApiResponseEntity<List<ElderSleepAnalysisVO>> elderSleepSleepAnalysisTask(@RequestParam Integer month,
@RequestParam Integer day) {
return ApiResponseUtils.success(platElderSleepService.elderSleepSleepAnalysisTask(month, day));
}
......
package com.makeit.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:42
*/
@Data
public class SaveLogDTO {
@JsonProperty("messageType")
private String messageType;
@JsonProperty("deviceId")
private String deviceId;
@JsonProperty("reportTime")
private LocalDateTime reportTime;
@JsonProperty("createdTime")
private LocalDateTime createdTime;
@JsonProperty("br")
private Integer br;
@JsonProperty("bodyMove")
private Integer bodyMove;
@JsonProperty("personState")
private Integer personState;
@JsonProperty("person")
private Integer person;
@JsonProperty("hr")
private Integer hr;
}
......@@ -45,7 +45,7 @@ public class PlatTenant extends BaseEntity {
private String menuList;
/**
* 告警渠道 1-短信 2-邮件 3-语音短信 4-云龄工单 5-晶奇工单
* 告警渠道 1-短信 2-邮件 3-语音短信 4-云龄工单 5-晶奇工单 6-微信公众号
*/
private String alertChannel;
......
......@@ -2,7 +2,10 @@ package com.makeit.mapper.platform.auth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.dto.SaveLogDTO;
import com.makeit.entity.platform.auth.PlatOrg;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
......@@ -15,4 +18,10 @@ import java.util.List;
public interface PlatOrgMapper extends BaseMapper<PlatOrg> {
List<PlatOrg> getSelfAndParents(String id);
void insertBatch(@Param("list") List<SaveLogDTO> saveList);
void saveBatch(@Param("list")List<AnalysisVO> list);
List<AnalysisVO> getData();
}
......@@ -2,6 +2,9 @@ package com.makeit.mapper.platform.elder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
......@@ -13,4 +16,5 @@ import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
*/
public interface PlatElderChildrenInfoMapper extends BaseMapper<PlatElderChildrenInfo> {
List<PlatElderChildrenInfo> list(@Param("tenantId") String tenantId, @Param("elderIds") String elderIds);
}
package com.makeit.service.platform.alarm.alarmStrategy;
import cn.hutool.core.convert.Convert;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.makeit.dto.platform.alarm.PlatAlarmCheckDTO;
import com.makeit.dto.platform.alarm.PlatAlarmConfigOffBedDTOVO;
......@@ -27,6 +28,7 @@ import java.time.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
......@@ -315,6 +317,9 @@ public class OffBedAlarm implements IAlarm {
return;
}
// PlatRoom platRoom = platAlarmCheckDTO.getPlatRoom();
log.info("离床告警配置,发出告警,设备id:{},长者名称:{},config_id:{},configL{}", platDevice.getId(), JSONUtil.toJsonStr(platElderList),
config.getId(), config.getRuleConfig());
platElderList = platElderList.stream().distinct().collect(Collectors.toList());
for (PlatElder platElder : platElderList) {
List<String> param = new ArrayList<>();
// param.add(platRoom.getName());
......
......@@ -33,6 +33,7 @@ import com.makeit.enums.report.PlatformTypeEnum;
import com.makeit.exception.BusinessException;
import com.makeit.global.aspect.tenant.TenantIdIgnore;
import com.makeit.mapper.platform.alarm.PlatAlarmRecordMapper;
import com.makeit.mapper.platform.elder.PlatElderChildrenInfoMapper;
import com.makeit.module.iot.service.IotDevicePropertiesOperateService;
import com.makeit.service.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
......@@ -67,6 +68,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Matcher;
......@@ -113,6 +115,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
private ShengwangService shengwangService;
@Autowired
private IotDevicePropertiesOperateService iotDevicePropertiesOperateService;
@Resource
private PlatElderChildrenInfoMapper platElderChildrenInfoMapper;
@Override
......@@ -321,15 +325,15 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
childrenInfoLambdaQueryWrapper.and(qw -> qw.apply("find_in_set('" + elderIds + "',elder_id)"));
List<PlatElderChildrenInfo> childrenInfoList = platElderChildrenInfoService.list(childrenInfoLambdaQueryWrapper);
if (CollectionUtils.isEmpty(childrenInfoList)) {
throw new BusinessException("子女端账号未绑定长者,长者id:"+elderIds);
throw new BusinessException("子女端账号未绑定长者,长者id:" + elderIds);
}
allChildInfoList.addAll(childrenInfoList);
Set<String> phoneSet = childrenInfoList.stream().map(PlatElderChildrenInfo::getPhone).collect(Collectors.toSet());
//告警配置和租户告警 字典一致
List<SendTypeEnum> notifyChannelList = Arrays.asList(SendTypeEnum.SMS, SendTypeEnum.VOICE_SMS, SendTypeEnum.CHILD_WECHAT);
//告警配置和租户告警 字典一致 todo SendTypeEnum.CHILD_WECHAT 公众号模板未好
List<SendTypeEnum> notifyChannelList = Arrays.asList(SendTypeEnum.SMS, SendTypeEnum.VOICE_SMS);
List<MsgSendDTO.ReceiverInfo> receiverInfos = buildReceiverInfo(allChildInfoList, alarmRecord);
//发送消息
noticeByChannel(alarmConfig, alarmRecord, phoneSet,null, notifyChannelList, receiverInfos);
noticeByChannel(alarmConfig, alarmRecord, phoneSet, null, notifyChannelList, receiverInfos);
String childIdJoin = allChildInfoList.stream().map(BaseEntity::getId).collect(Collectors.joining(","));
//通知的子女
......@@ -347,10 +351,14 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
return list;
}
childInfoList.forEach(c -> {
if (StrUtil.isBlank(c.getWeChatOpenid())) {
return;
}
MsgSendDTO.ReceiverInfo receiverInfo = new MsgSendDTO.ReceiverInfo();
receiverInfo.setRegionName(alarmRecord.getRegionName());
receiverInfo.setName(c.getName());
receiverInfo.setWeChatOpenid(c.getWeChatOpenid());
list.add(receiverInfo);
});
return list;
}
......@@ -414,21 +422,33 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
*/
private void noticeByChannel(PlatAlarmConfig alarmConfig, PlatAlarmRecord alarmRecord, Set<String> phoneSet,Set<String> emailSet,
List<SendTypeEnum> notifyChannelList, List<MsgSendDTO.ReceiverInfo> receiverInfos) {
log.info("开始短信通知:{}", JSON.toJSONString(alarmConfig));
String elderName = alarmRecord.getElderName();
log.info("开始短信通知:{},老人:{}", JSON.toJSONString(alarmConfig), elderName);
if (StrUtil.isNotBlank(alarmRecord.getElderIds()) && StrUtil.isBlank(elderName)) {
List<PlatElder> platElders = platElderService.listByIds(Arrays.asList(alarmRecord.getElderIds().split(",")));
elderName = platElders.stream().map(PlatElder::getName).collect(Collectors.joining(","));
log.info("开始短信通知--通知老人:{}", elderName);
}
String notifyChannel = alarmConfig.getNotifyChannel();
if(StringUtils.isEmpty(notifyChannel)){
return;
if (StringUtils.isEmpty(notifyChannel)) {
// 微信公众号
notifyChannel = "6";
}else {
notifyChannel = notifyChannel + ",6";
}
PlatTenant platTenant = platTenantService.getById(alarmConfig.getTenantId());
if(platTenant == null){
if (platTenant == null || !"1".equals(platTenant.getStatus())) {
return;
}
String alertChannel = platTenant.getAlertChannel();
if(StringUtils.isBlank(alertChannel)){
return;
if (StringUtils.isBlank(alertChannel)) {
// 微信公众号
alertChannel = "6";
} else {
alertChannel = alertChannel + ",6";
}
String[] tenantChannels = alertChannel.split(",");
List<String> tenantChannelList = Arrays.asList(tenantChannels);
List<String> tenantChannelList = Lists.newArrayList(Arrays.asList(tenantChannels));
String[] split = notifyChannel.split(",");
for (String sendType : split) {
//租户告警渠道 没配置的 就不发送
......@@ -444,24 +464,24 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
msgSendDTO.setEmailSet(emailSet);
msgSendDTO.setOriContent(alarmRecord.getContent());
msgSendDTO.setSubject(alarmRecord.getContent());
msgSendDTO.setParam(alarmRecord.getElderName());
msgSendDTO.setParam(elderName);
msgSendDTO.setReceiverInfos(receiverInfos);
String alarmType = alarmConfig.getAlarmType();
//告警类型 数据字典 1 长者跌倒 2 呼吸异常 3 心率异常 4 行为异常 5 离床异常
if (StringUtils.equals(alarmType, "1")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRegionName());
msgSendDTO.setParam(elderName,alarmRecord.getRegionName());
}
if (StringUtils.equals(alarmType, "2")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRemark());
msgSendDTO.setParam(elderName,alarmRecord.getRemark());
}
if (StringUtils.equals(alarmType, "3")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRemark());
msgSendDTO.setParam(elderName,alarmRecord.getRemark());
}
if (StringUtils.equals(alarmType, "4")) {
msgSendDTO.setParam(alarmRecord.getElderName(),alarmRecord.getRegionName());
msgSendDTO.setParam(elderName,alarmRecord.getRegionName());
}
if (StringUtils.equals(alarmType, "5")) {
msgSendDTO.setParam(alarmRecord.getElderName(), "");
msgSendDTO.setParam(elderName, "");
}
msgSendDTO.setAlarmType(alarmConfig.getAlarmType());
//todo 小程序消息
......
package com.makeit.service.platform.elder;
import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import java.util.List;
import java.util.TreeMap;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:38
*/
public interface DeviceLogService {
void save(List<DeviceOperationLogEntity> list);
void saveEntity(TreeMap<String, AnalysisVO> statisticsMap, String id);
TreeMap<String, AnalysisVO> getData();
void fillDefaultData(TreeMap<String, AnalysisVO> statisticsMap,Integer month, Integer day);
}
package com.makeit.service.platform.elder;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.entity.platform.elder.ElderSleepAnalysisVO;
import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import java.util.List;
......@@ -17,7 +17,7 @@ import java.util.List;
*/
public interface PlatElderSleepService extends IService<PlatElderSleep> {
List<PlatElderSleepAnalysis> elderSleepSleepAnalysisTask(Integer month, Integer day);
List<ElderSleepAnalysisVO> elderSleepSleepAnalysisTask(Integer month, Integer day);
String calculateScores(long daySleepTime, long dayRestTime, long deepTime, long soberTime, long lightTime,
SaasSleepEvaluateStandardReport evaluateStandardReport);
......
package com.makeit.service.platform.elder.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.google.common.collect.Lists;
import com.makeit.dto.SaveLogDTO;
import com.makeit.exception.BusinessException;
import com.makeit.mapper.platform.auth.PlatOrgMapper;
import com.makeit.module.iot.vo.DeviceOperationLogEntity;
import com.makeit.module.iot.vo.analysis.AnalysisVO;
import com.makeit.module.iot.vo.breathe.DeviceInfoContentBreathe;
import com.makeit.service.platform.elder.DeviceLogService;
import com.makeit.utils.data.convert.JsonUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.TreeMap;
import java.util.stream.Collectors;
/**
* @author wangzy
* @description
* @createDate 2024-01-24-16:38
*/
@Service
public class DeviceLogServiceImpl implements DeviceLogService {
@Resource
private PlatOrgMapper platOrgMapper;
@Override
public void save(List<DeviceOperationLogEntity> list) {
if (CollUtil.isEmpty(list)) {
return;
}
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
List<SaveLogDTO> saveList = new ArrayList<>();
list.forEach(l -> {
SaveLogDTO saveLogDTO = new SaveLogDTO();
long timestamp = l.getTimestamp();
String time = formatLongTime(timestamp);
saveLogDTO.setReportTime(LocalDateTime.parse(time, fmt));
saveLogDTO.setCreatedTime(longToTime(timestamp));
DeviceInfoContentBreathe deviceInfoContentBreathe = JsonUtil.toObj((String) l.getContent(), DeviceInfoContentBreathe.class);
DeviceInfoContentBreathe.Properties properties = deviceInfoContentBreathe.getProperties();
saveLogDTO.setBodyMove(properties.getBodymove());
saveLogDTO.setBr(properties.getBr());
saveLogDTO.setDeviceId(deviceInfoContentBreathe.getDeviceId());
saveLogDTO.setHr(properties.getHr());
saveLogDTO.setPerson(properties.getPerson());
saveLogDTO.setMessageType(deviceInfoContentBreathe.getMessageType());
saveLogDTO.setPersonState(properties.getPersonState());
saveList.add(saveLogDTO);
});
platOrgMapper.insertBatch(saveList);
}
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
public static String formatLongTime(long time) {
return DEFAULT_FORMATTER.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()));
}
private LocalDateTime longToTime(Long longTime) {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(longTime), ZoneOffset.of("+8"));
}
@Override
public void saveEntity(TreeMap<String, AnalysisVO> statisticsMap, String id) {
List<AnalysisVO> list = new ArrayList<>();
statisticsMap.forEach((k,v) -> {
v.setCreatedTime(k);
v.setDeviceId(id);
list.add(v);
});
platOrgMapper.saveBatch(list);
}
@Override
public TreeMap<String, AnalysisVO> getData() {
List<AnalysisVO> data = platOrgMapper.getData();
LinkedHashMap<String, AnalysisVO> collect1 = data.stream().collect(Collectors.toMap(AnalysisVO::getCreatedTime, a -> a, (u, v) -> {
throw new BusinessException(String.format("Duplicate key %s", u));
}, LinkedHashMap::new));
TreeMap<String, AnalysisVO> result = new TreeMap<>();
collect1.forEach(result::put);
getDayMinute(1,10).forEach(minute -> {
boolean key = result.containsKey(minute);
if (!key) {
AnalysisVO analysisVO = buildDefaultData(minute);
result.put(minute, analysisVO);
}
});
return result;
}
public static List<String> getDayMinute(Integer month, Integer day) {
List<String> list = Lists.newArrayList();
LocalDateTime of1 = LocalDateTime.of(2024, month, day, 8, 0);
LocalDateTime now = of1.plusDays(-1);
for (int i = 0; i < 24; i++) {
int hour = now.getHour();
for (int j = 0; j < 60; j++) {
LocalDateTime of = LocalDateTime.of(2024, 1, now.getDayOfMonth(), hour, j);
list.add(DateUtil.format(of, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
}
now = now.plusHours(1);
}
list.add(DateUtil.format(of1, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
return list;
}
@Override
public void fillDefaultData(TreeMap<String, AnalysisVO> statisticsMap, Integer month, Integer day) {
List<String> dayMinute = getDayMinute(month, day);
dayMinute.forEach(minute -> {
boolean key = statisticsMap.containsKey(minute);
if (!key) {
AnalysisVO analysisVO = buildDefaultData(minute);
statisticsMap.put(minute, analysisVO);
}
});
}
private AnalysisVO buildDefaultData(String minute) {
AnalysisVO analysisVO = new AnalysisVO();
analysisVO.setTotalHr(0);
analysisVO.setAvgHr(0);
analysisVO.setMaxHr(0);
analysisVO.setMinHr(0);
analysisVO.setTotalBr(0);
analysisVO.setAvgBr(0);
analysisVO.setMaxBr(0);
analysisVO.setMinBr(0);
analysisVO.setHrBrCount(0);
analysisVO.setActionCount(0);
analysisVO.setTurnedCount(0);
analysisVO.setIsAction(false);
analysisVO.setIsMoveBed(true);
analysisVO.setIsMinuteActionFlag(false);
analysisVO.setAwakeMinuteActionFlag(false);
analysisVO.setCreatedTime(minute);
return analysisVO;
}
}
......@@ -11,13 +11,15 @@ import com.makeit.dto.platform.elder.PlatElderReportDTO;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.alarm.PlatDayDurationRecord;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.*;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.elder.PlatElderBreatheAnalysis;
import com.makeit.entity.platform.elder.PlatElderSleep;
import com.makeit.entity.platform.elder.PlatElderSleepAnalysis;
import com.makeit.entity.saas.analysis.SaasSleepEvaluateStandardReport;
import com.makeit.enums.CommonEnum;
import com.makeit.enums.platform.alarm.PlatAlarmConfigEnum;
import com.makeit.enums.report.SleepTypeEnum;
import com.makeit.module.iot.service.IotProductDeviceService;
import com.makeit.module.iot.vo.analysis.EvaluateReportVO;
import com.makeit.module.iot.vo.fall.DeviceInfoContentFall;
import com.makeit.module.iot.vo.space.DeviceInfoContentSpace;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
......@@ -134,14 +136,12 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
}
// String sleepScore = platElderSleepAnalysis.getSleepScore();
Long sleepScore = getSleepScore(platElderSleepAnalysis);
// Long sleepScore = getSleepScore(platElderSleepAnalysis);
// EvaluateReportVO evaluateReport = sleepEvaluateReportService.getByScore(sleepScore);
EvaluateReportVO evaluateReport = sleepEvaluateReportService.getByScore(sleepScore);
platElderSleepEvaluationVO.setScore(Integer.valueOf(sleepScore + ""));
platElderSleepEvaluationVO.setScore(Integer.parseInt(platElderSleepAnalysis.getSleepScore()));
platElderSleepEvaluationVO.setResult(platElderSleepAnalysis.getSleepResult());
platElderSleepEvaluationVO.setEvaluation(evaluateReport.getEvaluate());
platElderSleepEvaluationVO.setEvaluation(platElderSleepAnalysis.getSleepEvaluate());
platElderSleepEvaluationVO.setSleepDuration(Integer.valueOf(platElderSleepAnalysis.getSleepTime() + ""));
platElderSleepEvaluationVO.setRestDuration(Integer.valueOf(platElderSleepAnalysis.getRestTime() + ""));
......@@ -218,7 +218,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
.orderByAsc(PlatElderSleep::getStartSleep)
);
setWakeUp(sleepList);
// setWakeUp(sleepList);
voList = StreamUtil.map(sleepList, e -> {
PlatElderSleepDiagramVO vo = new PlatElderSleepDiagramVO();
......@@ -235,6 +235,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
return contentVO;
});
contentList = contentList.stream().filter(f -> !"resting".equals(f.getSleepType())).collect(Collectors.toList());
vo.setContentList(contentList);
return vo;
});
......@@ -242,29 +243,7 @@ public class PlatElderDayReportDayServiceImpl implements PlatElderDayReportDaySe
return voList;
}
private void setWakeUp(List<PlatElderSleep> sleepList) {
if (CollUtil.isEmpty(sleepList)) {
return;
}
List<PlatElderSleep> sleeps = sleepList.stream().filter(f -> f.getElderSleepType().equals(SleepTypeEnum.SLEEP.getType())).collect(Collectors.toList());
if (CollUtil.isEmpty(sleeps)) {
return;
}
List<PlatElderSleep> wakeUpList = sleepList.stream().filter(f -> f.getElderSleepType().equals(SleepTypeEnum.GETUP.getType())).collect(Collectors.toList());
sleeps.forEach(s -> {
List<PlatElderSleep> wakeList = wakeUpList.stream().filter(f -> f.getStartSleep().isAfter(s.getEndSleep())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(wakeList)) {
final long[] minute = {24 * 60};
wakeList.forEach(w -> {
long between = Duration.between(s.getEndSleep(), w.getStartSleep()).toMinutes();
if (between < minute[0]) {
minute[0] = between;
s.setWakeUpTime(w.getStartSleep());
}
});
}
});
}
@Override
public PlatElderHeartRespiratoryEvaluationVO heartRespiratoryEvaluation(PlatElderReportDTO platElderIdDTO) {
......
......@@ -33,11 +33,7 @@ import java.math.BigDecimal;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.*;
import java.util.stream.Collectors;
@Service
......@@ -267,9 +263,7 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
Map<Integer, Map<String, List<PlatElderSleep>>> sleepMap = sleepList.stream().collect(Collectors.groupingBy(PlatElderSleep::getElderSleepType, Collectors.groupingBy(PlatElderSleep::getHappenDate)));
Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = sleepAnalysisList.stream().collect(Collectors.toMap(PlatElderSleepAnalysis::getHappenDate, Function.identity(),(v1,v2)->v1));
// Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = StreamUtil.toMap(sleepAnalysisList, PlatElderSleepAnalysis::getHappenDate);
Map<String, PlatElderSleepAnalysis> sleepAnalysisMap = StreamUtil.toMapDep(sleepAnalysisList, PlatElderSleepAnalysis::getHappenDate);
List<LocalDate> dateList = LocalDateTimeUtils.getDateSeries(weekStartDate, weekEndDate);
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
......@@ -277,8 +271,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
List<PlatElderSleepDiagramWeekContentVO> sleep = StreamUtil.map(dateList, e -> {
PlatElderSleepDiagramWeekContentVO vo = new PlatElderSleepDiagramWeekContentVO();
vo.setDay(e);
List<PlatElderSleep> list = Optional.ofNullable(sleepMap.get(1)).map(i -> i.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>(10));
Map<String, List<PlatElderSleep>> sleepListMap = Optional.ofNullable(sleepMap.get(SleepTypeEnum.SLEEP.getType())).orElse(new HashMap<>());
List<PlatElderSleep> list = Optional.ofNullable(sleepListMap.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>());
List<PlatSleepRangeVO> sleepRecord = list.stream().flatMap(i -> i.getSleepRecord().stream()).collect(Collectors.toList());
......@@ -289,8 +283,8 @@ public class PlatElderDayReportWeekServiceImpl implements PlatElderDayReportWeek
List<PlatElderSleepDiagramWeekContentVO> rest = StreamUtil.map(dateList, e -> {
PlatElderSleepDiagramWeekContentVO vo = new PlatElderSleepDiagramWeekContentVO();
vo.setDay(e);
List<PlatElderSleep> list = Optional.ofNullable(sleepMap.get(2)).map(i -> i.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>(10));
Map<String, List<PlatElderSleep>> restListMap = Optional.ofNullable(sleepMap.get(SleepTypeEnum.RESTING.getType())).orElse(new HashMap<>());
List<PlatElderSleep> list = Optional.ofNullable(restListMap.get(dateTimeFormatter.format(e))).orElse(new ArrayList<>(10));
List<PlatSleepRangeVO> sleepRecord = list.stream().flatMap(i -> Optional.ofNullable(i.getSleepRecord()).orElse(new ArrayList<>(10)).stream()).collect(Collectors.toList());
......
package com.makeit.service.wechat;
import com.makeit.utils.third.wechat.WechatBindDTO;
import com.makeit.utils.third.wechat.WechatLoginPhoneDTO;
import com.makeit.utils.user.wechat.WechatUserInfo;
......@@ -9,4 +10,5 @@ public interface PlatElderChildrenInfoUserLoginWechatService {
void logout();
void bind(WechatBindDTO dto);
}
package com.makeit.service.wechat.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.makeit.entity.platform.elder.PlatElderChildrenInfo;
import com.makeit.entity.saas.PlatTenant;
import com.makeit.global.aspect.misc.nofill.NoFillUtil;
......@@ -12,9 +16,7 @@ import com.makeit.utils.data.id.IdGen;
import com.makeit.utils.msg.config.WxConfig;
import com.makeit.utils.old.StringUtils;
import com.makeit.utils.sys.FileUtil;
import com.makeit.utils.third.wechat.WechatLoginPhoneDTO;
import com.makeit.utils.third.wechat.WechatUtil;
import com.makeit.utils.third.wechat.WxUserInfo;
import com.makeit.utils.third.wechat.*;
import com.makeit.utils.user.TokenUtil;
import com.makeit.utils.user.wechat.WechatUserInfo;
import org.apache.commons.collections4.CollectionUtils;
......@@ -25,7 +27,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElderChildrenInfoUserLoginWechatService {
......@@ -121,6 +125,49 @@ public class PlatElderChildrenInfoUserLoginWechatServiceImpl implements PlatElde
}
@Override
public void bind(WechatBindDTO dto) {
WechatCodeDTO codeDTO = getAppid(dto);
if (StrUtil.isBlank(dto.getId()) || codeDTO == null || StrUtil.isBlank(codeDTO.getOpenid())) {
return;
}
bindToChildrenInfo(dto.getId(), codeDTO.getOpenid());
}
private WechatCodeDTO getAppid(WechatBindDTO dto) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
Map<String, Object> params = new HashMap<>(12);
params.put("appid", dto.getAppid());
params.put("secret", dto.getSecret());
params.put("code", dto.getCode());
params.put("grant_type", dto.getGrantType());
String post = "";
try {
post = HttpUtil.post(url, params);
logger.info("获取微信公众号appid:response:{},params:{}", post, dto);
} catch (Exception e) {
logger.error("获取微信公众号appid失败:response:{}", post);
}
return JSONUtil.toBean(post, WechatCodeDTO.class);
}
private void bindToChildrenInfo(String id, String weChatOpenid) {
PlatElderChildrenInfo childrenInfo = platElderChildrenInfoService.getById(id);
if (childrenInfo == null) {
return;
}
if (StrUtil.isNotBlank(childrenInfo.getOpenid())) {
List<PlatElderChildrenInfo> infoList = platElderChildrenInfoService.list(Wrappers.<PlatElderChildrenInfo>lambdaQuery()
.in(PlatElderChildrenInfo::getOpenid, childrenInfo.getOpenid()));
infoList.forEach(i -> i.setWeChatOpenid(weChatOpenid));
platElderChildrenInfoService.updateBatchById(infoList);
} else {
childrenInfo.setWeChatOpenid(weChatOpenid);
platElderChildrenInfoService.updateById(childrenInfo);
}
}
@Override
public void logout() {
TokenUtil.wechatLogout();
}
......
......@@ -8,4 +8,9 @@ public class PlatSleepRangeVO {
private String sleepType;
private String startTime;
private String endTime;
/**
* 所属睡眠区间开始时间
*/
private String belongToSleepTime;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.makeit.mapper.platform.elder.PlatElderChildrenInfoMapper">
<select id="list" parameterType="String" resultType="com.makeit.entity.platform.elder.PlatElderChildrenInfo">
select *
from plat_elder_children_info
where tenant_id = #{tenantId}
and find_in_set(#{elderIds},elder_id)
and del_flag = '0'
</select>
</mapper>
......@@ -19,4 +19,46 @@
ON T1._id COLLATE utf8mb4_general_ci = T2.id COLLATE utf8mb4_general_ci
</select>
<!-- 批量插入数据 查询主键ID注入到是实体中-->
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true">
<selectKey resultType="long" keyProperty="id" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
insert into device_info_log
(message_type,device_id,report_time,br,body_move,person_state,person,hr,created_time)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.messageType},#{item.deviceId},#{item.reportTime},#{item.br},#{item.bodyMove},
#{item.personState},#{item.person},#{item.hr},#{item.createdTime})
</foreach>
</insert>
<insert id="saveBatch" parameterType="java.util.List" useGeneratedKeys="true">
<selectKey resultType="long" keyProperty="id" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
insert into device_minute_info(total_hr, avg_hr, max_hr, min_hr, total_br, avg_br, max_br, min_br, hr_br_count,
action_count, turned_count, is_action, is_move_bed, is_minute_action_flag,
awake_minute_action_flag, br_stop_threshold, br_stop, br_stop_time, br_fast_threshold,
br_fast, br_fast_time, br_slow_threshold, br_slow, br_slow_time, hr_fast_threshold,
hr_fast, hr_fast_time, hr_slow_threshold, hr_slow, hr_slow_time, created_time,device_id)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.totalHr},#{item.avgHr},#{item.maxHr},#{item.minHr},#{item.totalBr},#{item.avgBr},#{item.maxBr},#{item.minBr},#{item.hrBrCount},
#{item.actionCount},#{item.turnedCount},#{item.isAction},#{item.isMoveBed},#{item.isMinuteActionFlag},
#{item.awakeMinuteActionFlag},#{item.brStopThreshold},#{item.brStop},#{item.brStopTime},#{item.brFastThreshold},
#{item.brFast},#{item.brFastTime},#{item.brSlowThreshold},#{item.brSlow},#{item.brSlowTime},#{item.hrFastThreshold},
#{item.hrFast},#{item.hrFastTime},#{item.hrSlowThreshold},#{item.hrSlow},#{item.hrSlowTime},#{item.createdTime},#{item.deviceId})
</foreach>
</insert>
<select id="getData" resultType="com.makeit.module.iot.vo.analysis.AnalysisVO">
select * from device_minute_info where device_id = '1732647368962203650' order by created_time
</select>
</mapper>
......@@ -115,7 +115,7 @@ iot:
clientId: fyxmb5h52iKwE2Hi
secureKey: 22fZbnH36wdHn7ZTyKKHraFw233npcez
sync:
enable: false
enable: true
mqtt:
username: admin|1693982115969
......@@ -141,8 +141,10 @@ wx:
msgDataFormat: JSON
mp:
config:
appid: wx5c73cad7aeb788c6
secret: 7c3a0665bf2adbe67a58a4d6c8017243
appid: wxa5ddf4b1355ce62a
secret: 92b990a8ce3394f41b55369f4018c596
# appid: wx5c73cad7aeb788c6
# secret: 7c3a0665bf2adbe67a58a4d6c8017243
sms:
send:
url: http://www.aozoneyun.com/message/message/send
......
......@@ -12,7 +12,7 @@ spring:
name: iot-server
datasource:
url: jdbc:mysql://124.71.100.177:3306/dev_iot_yanglao_platform?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
url: jdbc:mysql://192.168.0.29:3306/dev_iot_yanglao_platform?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true
username: jenlinks-iot
password: jenlinks-iot@123Frrd
driver-class-name: com.mysql.cj.jdbc.Driver
......@@ -139,8 +139,10 @@ wx:
msgDataFormat: JSON
mp:
config:
appid: wx5c73cad7aeb788c6
secret: 7c3a0665bf2adbe67a58a4d6c8017243
appid: wxa5ddf4b1355ce62a
secret: 92b990a8ce3394f41b55369f4018c596
# appid: wx5c73cad7aeb788c6
# secret: 7c3a0665bf2adbe67a58a4d6c8017243
sms:
send:
......
......@@ -26,7 +26,7 @@
</encoder>
</appender>
<!-- info -->
<!-- logging -->
<appender name="FILELOGGING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
......@@ -61,7 +61,7 @@
<FileNamePattern>${logback.logdir}/${logback.appname}/info/log_info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
<maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
......@@ -84,7 +84,7 @@
</FileNamePattern>
<maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
<maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
......@@ -106,7 +106,7 @@
<FileNamePattern>${logback.logdir}/${logback.appname}/warn/log_warn.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
<maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
......
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