| @@ -0,0 +1,22 @@ | |||
| package com.xueyi.system.api.digitalmans.domain.vo; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import java.io.Serial; | |||
| import java.io.Serializable; | |||
| @Data | |||
| @NoArgsConstructor | |||
| public class DashboardVo implements Serializable { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| /** | |||
| * 数字人数 | |||
| */ | |||
| private Integer digitalMans; | |||
| private Integer onlineDevices; | |||
| private Integer AlertNear7Days; | |||
| private Integer onProcessAlert; | |||
| } | |||
| @@ -0,0 +1,20 @@ | |||
| package com.xueyi.system.api.digitalmans.domain.vo; | |||
| import lombok.Data; | |||
| import lombok.NoArgsConstructor; | |||
| import java.io.Serial; | |||
| import java.io.Serializable; | |||
| @Data | |||
| @NoArgsConstructor | |||
| public class NumberOfOnlineToChartVo implements Serializable { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| private String numberOfOnline; | |||
| private String date; | |||
| } | |||
| @@ -35,4 +35,7 @@ public interface RemoteManDeviceService { | |||
| @PutMapping(value = "/manDevice/inner/info") | |||
| R<Integer> manDeviceInfoInnerUpdate(@RequestBody DmActiveVo vo); | |||
| @PostMapping(value = "/manDevice/inner/sync_numbers_of_online") | |||
| R<Integer> syncNumbersOfOnline(); | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| package com.xueyi.common.core.constant.digitalman; | |||
| public class RedisDefinitionConstants { | |||
| /** 通用-当前在线数(List) */ | |||
| public static final String GENERAL_CURRENT_NUMBER_OF_ONLINE = "general:current_number_of_online"; | |||
| } | |||
| @@ -45,4 +45,12 @@ public class DgmanTask { | |||
| }); | |||
| System.out.println("监控心跳执行完成"); | |||
| } | |||
| /** | |||
| * 触发条件:0 0 10 * * * | |||
| * 每日十点触发,收集当前在线数 | |||
| */ | |||
| public void dgmanDeviceOnlineState() { | |||
| remoteManDeviceService.syncNumbersOfOnline(); | |||
| } | |||
| } | |||
| @@ -3,6 +3,7 @@ package com.xueyi.system.digitalmans.controller; | |||
| import com.xueyi.common.core.constant.basic.BaseConstants; | |||
| import com.xueyi.common.core.constant.basic.SecurityConstants; | |||
| import com.xueyi.common.core.constant.digitalman.InitConstants; | |||
| import com.xueyi.common.core.constant.digitalman.MessageConstants; | |||
| import com.xueyi.common.core.web.result.AjaxResult; | |||
| import com.xueyi.common.core.web.result.R; | |||
| import com.xueyi.common.core.web.validate.V_A; | |||
| @@ -31,6 +32,7 @@ import com.xueyi.system.digitalmans.service.IDmDigitalmanService; | |||
| import com.xueyi.system.digitalmans.service.IDmModelService; | |||
| import com.xueyi.system.digitalmans.service.IDmSkillService; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.redis.core.RedisTemplate; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.springframework.web.bind.annotation.*; | |||
| @@ -61,6 +63,9 @@ public class DmDigitalmanController extends BaseController<DmDigitalmanQuery, Dm | |||
| @Autowired | |||
| private RemoteTransferService remoteTransferService; | |||
| @Autowired | |||
| private RedisTemplate<String, Serializable> redisTemplate; | |||
| /** 定义节点名称 */ | |||
| @Override | |||
| protected String getNodeName() { | |||
| @@ -93,6 +98,10 @@ public class DmDigitalmanController extends BaseController<DmDigitalmanQuery, Dm | |||
| if (extList != null && extList.size() > 0) { | |||
| extList.get(0).setIsOnline(Integer.parseInt(ar.get("msg").toString())); | |||
| dmDigitalmanExtService.update(extList.get(0)); | |||
| // 更新缓存 | |||
| DmManDeviceDto redisDto = (DmManDeviceDto)redisTemplate.opsForHash().get(MessageConstants.REDIS_GROUP_DEVICE_HEADER,item.getDeviceId()); | |||
| redisDto.setOnlineStatus(ar.get("msg").toString()); | |||
| redisTemplate.opsForHash().putIfAbsent(MessageConstants.REDIS_GROUP_DEVICE_HEADER,item.getDeviceId(),redisDto); | |||
| } | |||
| }); | |||
| return R.ok(); | |||
| @@ -3,6 +3,7 @@ package com.xueyi.system.digitalmans.controller; | |||
| import com.xueyi.common.cache.utils.SourceUtil; | |||
| import com.xueyi.common.core.constant.basic.SecurityConstants; | |||
| import com.xueyi.common.core.constant.digitalman.InitConstants; | |||
| import com.xueyi.common.core.constant.digitalman.MessageConstants; | |||
| import com.xueyi.common.core.utils.core.IdUtil; | |||
| import com.xueyi.common.core.web.result.AjaxResult; | |||
| import com.xueyi.common.core.web.result.R; | |||
| @@ -17,6 +18,7 @@ import com.xueyi.message.api.transfer.domain.vo.DmActiveVo; | |||
| import com.xueyi.message.api.transfer.feign.RemoteTransferService; | |||
| import com.xueyi.system.api.device.domain.dto.DmDeviceTenantMergeDto; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; | |||
| import com.xueyi.system.api.digitalmans.domain.vo.NumberOfOnlineToChartVo; | |||
| import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanService; | |||
| import com.xueyi.system.api.model.Source; | |||
| import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; | |||
| @@ -26,8 +28,11 @@ import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; | |||
| import com.xueyi.system.digitalmans.service.IDmDigitalmanExtService; | |||
| import com.xueyi.system.digitalmans.service.IDmDigitalmanService; | |||
| import com.xueyi.system.digitalmans.service.IDmManDeviceService; | |||
| import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; | |||
| import com.xueyi.system.emcs.service.IDmExceptionLogService; | |||
| import com.xueyi.system.organize.service.ISysEnterpriseService; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.redis.core.RedisTemplate; | |||
| import org.springframework.validation.annotation.Validated; | |||
| import org.springframework.web.bind.annotation.DeleteMapping; | |||
| import org.springframework.web.bind.annotation.GetMapping; | |||
| @@ -38,9 +43,13 @@ import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestParam; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import static com.xueyi.common.core.constant.digitalman.RedisDefinitionConstants.GENERAL_CURRENT_NUMBER_OF_ONLINE; | |||
| import java.io.Serializable; | |||
| import java.time.LocalDate; | |||
| import java.time.format.DateTimeFormatter; | |||
| import java.util.List; | |||
| import java.util.concurrent.TimeUnit; | |||
| /** | |||
| * 数字人设备管理管理 业务处理 | |||
| @@ -72,6 +81,12 @@ public class DmManDeviceController extends BaseController<DmManDeviceQuery, DmMa | |||
| @Autowired | |||
| RemoteTransferService remoteTransferService; | |||
| @Autowired | |||
| RedisTemplate<String,Serializable> redisTemplate; | |||
| @Autowired | |||
| IDmExceptionLogService dmExceptionLogService; | |||
| /** 定义节点名称 */ | |||
| @@ -108,6 +123,24 @@ public class DmManDeviceController extends BaseController<DmManDeviceQuery, DmMa | |||
| R<Integer> manDeviceInfoInnerUpdate(@RequestBody DmActiveVo vo) { | |||
| return R.ok(super.baseService.manDeviceInfoInnerUpdate(vo)); | |||
| } | |||
| @PostMapping(value = "/inner/sync_numbers_of_online") | |||
| R<Integer> syncNumbersOfOnline() { | |||
| LocalDate currentDate = LocalDate.now(); | |||
| DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd"); | |||
| List<Object> manDeviceDtos = (List<Object>)redisTemplate.opsForHash().values(MessageConstants.REDIS_GROUP_DEVICE_HEADER); | |||
| Long total = manDeviceDtos.stream().filter(item->(!((DmManDeviceDto)item).getOnlineStatus().isEmpty()) && | |||
| ((DmManDeviceDto)item).getOnlineStatus().equalsIgnoreCase("1")).count(); | |||
| NumberOfOnlineToChartVo vo = new NumberOfOnlineToChartVo(); | |||
| vo.setNumberOfOnline(total.toString()); | |||
| vo.setDate(currentDate.format(formatter)); | |||
| // 获取当前日期并将数据同步到redis | |||
| redisTemplate.opsForList().leftPush(GENERAL_CURRENT_NUMBER_OF_ONLINE,vo); | |||
| if (redisTemplate.opsForList().size(GENERAL_CURRENT_NUMBER_OF_ONLINE) > 150) { | |||
| redisTemplate.opsForList().rightPop(GENERAL_CURRENT_NUMBER_OF_ONLINE,1, TimeUnit.MINUTES); | |||
| } | |||
| return R.ok(Integer.parseInt(vo.getNumberOfOnline())); | |||
| } | |||
| /** | |||
| * 查询数字人设备管理列表 | |||
| */ | |||
| @@ -190,6 +223,13 @@ public class DmManDeviceController extends BaseController<DmManDeviceQuery, DmMa | |||
| return super.batchRemove(idList); | |||
| } | |||
| @GetMapping("/dashboard_data") | |||
| @RequiresPermissions(Auth.DM_MAN_DEVICE_LIST) | |||
| public AjaxResult dashboardData() { | |||
| return AjaxResult.success(super.baseService.dashboardData()); | |||
| } | |||
| /** | |||
| * 获取数字人设备管理选择框列表 | |||
| */ | |||
| @@ -4,6 +4,7 @@ import com.xueyi.common.web.entity.service.IBaseService; | |||
| import com.xueyi.message.api.transfer.domain.vo.DmActiveVo; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; | |||
| import com.xueyi.system.api.digitalmans.domain.vo.DashboardVo; | |||
| import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; | |||
| import java.util.List; | |||
| @@ -19,4 +20,6 @@ public interface IDmManDeviceService extends IBaseService<DmManDeviceQuery, DmMa | |||
| List<DmManDeviceDto> manDeviceListNotNullByTenantId(Long tenantId); | |||
| DmManDevicePo getOne(String devId); | |||
| DashboardVo dashboardData(); | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| package com.xueyi.system.digitalmans.service.impl; | |||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
| import com.github.pagehelper.Page; | |||
| import com.xueyi.common.core.constant.digitalman.InitConstants; | |||
| import com.xueyi.common.core.constant.digitalman.MessageConstants; | |||
| @@ -12,16 +13,23 @@ import com.xueyi.message.api.transfer.domain.vo.DmDeviceVo; | |||
| import com.xueyi.message.api.transfer.feign.RemoteTransferService; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; | |||
| import com.xueyi.system.api.digitalmans.domain.vo.DashboardVo; | |||
| import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; | |||
| import com.xueyi.system.digitalmans.manager.IDmManDeviceManager; | |||
| import com.xueyi.system.digitalmans.mapper.DmManDeviceMapper; | |||
| import com.xueyi.system.digitalmans.service.IDmManDeviceService; | |||
| import com.xueyi.system.emcs.domain.po.DmExceptionLogPo; | |||
| import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; | |||
| import com.xueyi.system.emcs.mapper.DmExceptionLogMapper; | |||
| import com.xueyi.system.resource.service.IDmResourcesService; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.data.redis.core.RedisTemplate; | |||
| import org.springframework.stereotype.Service; | |||
| import java.io.Serializable; | |||
| import java.time.LocalDate; | |||
| import java.time.LocalDateTime; | |||
| import java.time.format.DateTimeFormatter; | |||
| import java.util.List; | |||
| /** | |||
| @@ -46,6 +54,8 @@ public class DmManDeviceServiceImpl extends BaseServiceImpl<DmManDeviceQuery, Dm | |||
| @Autowired | |||
| RedisTemplate<String, Serializable> manDeviceDtoRedisTemplate; | |||
| @Autowired | |||
| DmExceptionLogMapper exceptionLogMapper; | |||
| /** | |||
| * 查询数字人设备管理对象列表 | 数据权限 | |||
| @@ -114,4 +124,30 @@ public class DmManDeviceServiceImpl extends BaseServiceImpl<DmManDeviceQuery, Dm | |||
| public List<DmManDeviceDto> manDeviceListNotNullByTenantId(Long tenantId) { | |||
| return super.baseManager.selectManDeviceListNotNullByTenantId(tenantId); | |||
| } | |||
| @Override | |||
| public DashboardVo dashboardData() { | |||
| DashboardVo vo = new DashboardVo(); | |||
| List<DmManDeviceDto> manDeviceDtoList = this.selectList(new DmManDeviceQuery()); | |||
| // 获取数字员工总数 | |||
| vo.setDigitalMans(manDeviceDtoList.size()); | |||
| // 获取当前在线率 | |||
| Long total = manDeviceDtoList.stream().count(); | |||
| Long onlineTotal = manDeviceDtoList.stream().filter(item->(!((DmManDeviceDto)item).getOnlineStatus().isEmpty()) && | |||
| ((DmManDeviceDto)item).getOnlineStatus().equalsIgnoreCase("1")).count(); | |||
| int percent = total == 0?0 : (int)(onlineTotal/total); | |||
| vo.setOnlineDevices(percent); | |||
| // 近七天预警 | |||
| LocalDateTime currentDate = LocalDateTime.now(); | |||
| LocalDateTime sevenDaysAgo =currentDate.minusDays(7).withHour(0).withMinute(0).withSecond(0); | |||
| DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); | |||
| vo.setAlertNear7Days(exceptionLogMapper.selectList(Wrappers.<DmExceptionLogPo>query().lambda() | |||
| .ge(DmExceptionLogPo::getCreateTime,sevenDaysAgo.format(formatter))).size()); | |||
| // 当前未解除预警数 | |||
| vo.setOnProcessAlert(exceptionLogMapper.selectList(Wrappers.<DmExceptionLogPo>query().lambda() | |||
| .eq(DmExceptionLogPo::getAlertStatus,0)).size()); | |||
| return vo; | |||
| } | |||
| } | |||