diff --git a/storeroom/pom.xml b/storeroom/pom.xml index f934c72..973c5b8 100644 --- a/storeroom/pom.xml +++ b/storeroom/pom.xml @@ -27,13 +27,20 @@ io.netty netty-all - 4.1.33.Final + 4.1.77.Final + com.ejlchina okhttps-fastjson 3.5.2 + + cn.hutool + hutool-all + 5.8.3 + + \ No newline at end of file diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyConfig.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyConfig.java index 8ec75f0..c9e7299 100644 --- a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyConfig.java +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyConfig.java @@ -11,33 +11,32 @@ public class NettyConfig { /** - * 定义一个channel,管理所有channel + * 定义一个channel组,管理所有的channel + * GlobalEventExecutor.INSTANCE 是全局的事件执行器,是一个单例 */ private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); - /** - * 存放用户信息,发送指定用户 + * 存放用户与Chanel的对应信息,用于给指定用户发送消息 */ - private static ConcurrentHashMap userChannelMap = new ConcurrentHashMap<>(); - - private NettyConfig() { + private static ConcurrentHashMap userChannelMap = new ConcurrentHashMap<>(); - } + private NettyConfig() {} /** - * 获取用户组 - * @return / + * 获取channel组 + * @return */ - public static ChannelGroup getChannelGroup(){ + public static ChannelGroup getChannelGroup() { return channelGroup; } /** * 获取用户channel map - * @return / + * @return */ public static ConcurrentHashMap getUserChannelMap(){ return userChannelMap; } + } diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyServer.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyServer.java index bbbf216..4f1e716 100644 --- a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyServer.java +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/NettyServer.java @@ -91,6 +91,8 @@ public class NettyServer { @Override protected void initChannel(SocketChannel ch) throws Exception { + + // 心跳检测(一般情况第一个设置,如果超时了,则会调用userEventTriggered方法,且会告诉你超时的类型) ch.pipeline().addLast(new IdleStateHandler(readerIdleTime, writerIdleTime, allIdleTime, TimeUnit.MINUTES)); // 流水线管理通道中的处理程序(Handler),用来处理业务 diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/ServerChannelCache.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/ServerChannelCache.java new file mode 100644 index 0000000..56b5e31 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/ServerChannelCache.java @@ -0,0 +1,50 @@ +package com.storeroom.modules.storeroom3d.config.websoket; + +import org.springframework.stereotype.Component; +import io.netty.channel.Channel; +import io.netty.util.AttributeKey; + +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class ServerChannelCache { + + + private static final ConcurrentHashMap> CACHE_MAP = new ConcurrentHashMap<>(); + private static final AttributeKey CHANNEL_ATTR_KEY = AttributeKey.valueOf("test"); + + public String getCacheId(Channel channel) { + return channel.attr(CHANNEL_ATTR_KEY).get(); + } + + public void add(String cacheId, Channel channel) { + channel.attr(CHANNEL_ATTR_KEY).set(cacheId); + HashMap hashMap = CACHE_MAP.get(cacheId); + if (hashMap == null) { + hashMap = new HashMap<>(); + } + hashMap.put(channel.id().asShortText(), channel); + CACHE_MAP.put(cacheId, hashMap); + } + + public HashMap get(String cacheId) { + if (cacheId == null) { + return null; + } + return CACHE_MAP.get(cacheId); + } + + public void remove(Channel channel) { + String cacheId = getCacheId(channel); + if (cacheId == null) { + return; + } + HashMap hashMap = CACHE_MAP.get(cacheId); + if (hashMap == null) { + hashMap = new HashMap<>(); + } + hashMap.remove(channel.id().asShortText()); + CACHE_MAP.put(cacheId, hashMap); + } +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/WebSocketHandler.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/WebSocketHandler.java index 6d25642..29b0b2d 100644 --- a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/WebSocketHandler.java +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/config/websoket/WebSocketHandler.java @@ -7,6 +7,7 @@ import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; import io.netty.util.AttributeKey; +import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -14,11 +15,17 @@ import org.springframework.stereotype.Component; @Component @ChannelHandler.Sharable +@RequiredArgsConstructor public class WebSocketHandler extends SimpleChannelInboundHandler{ private static final Logger log = LoggerFactory.getLogger(WebSocketHandler.class); + /** + * 一旦连接第一个被执行 + * @param ctx + * @throws Exception + */ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { log.info("handlerAdded 被调用"+ctx.channel().id().asLongText()); @@ -26,7 +33,12 @@ public class WebSocketHandler extends SimpleChannelInboundHandler queryAllAlarm() { + public ApiResponse queryAllAlarm(@RequestParam String storeroomId) { return ApiResponse.success(alarmInfoService.getAllAlarmInfo()); } diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/controller/SecurityDoorController.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/controller/SecurityDoorController.java new file mode 100644 index 0000000..635f51a --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/controller/SecurityDoorController.java @@ -0,0 +1,39 @@ +package com.storeroom.modules.storeroom3d.controller; + + +import com.storeroom.annotaion.rest.AnonymousPostMapping; +import com.storeroom.exception.BaseException; +import com.storeroom.modules.storeroom3d.domain.SecurityDoor; +import com.storeroom.modules.storeroom3d.service.SecurityDoorService; +import com.storeroom.utils.ApiResponse; +import com.storeroom.utils.StringUtils; +import com.storeroom.utils.enums.ResponseStatus; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/securitydoor/") +@Api(tags = "门禁日志管理") +@RequiredArgsConstructor +public class SecurityDoorController { + + private final SecurityDoorService securityDoorService; + + @ApiOperation("创建记录") + @AnonymousPostMapping("create") + public ApiResponse create(@RequestBody SecurityDoor securityDoor) { + if (StringUtils.isEmpty(securityDoor.getDeviceId()) + && StringUtils.isEmpty(securityDoor.getTid()) + && StringUtils.isEmpty(securityDoor.getAlarmMsg()) + && ObjectUtils.isEmpty(securityDoor.getAlarmLevel())) { + throw new BaseException("必填字段不能为空"); + } + securityDoorService.create(securityDoor); + return ApiResponse.success(ResponseStatus.SUCCESS); + } +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/domain/SecurityDoor.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/domain/SecurityDoor.java new file mode 100644 index 0000000..b1a0e75 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/domain/SecurityDoor.java @@ -0,0 +1,68 @@ +package com.storeroom.modules.storeroom3d.domain; + + +import com.storeroom.base.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Objects; + +@Entity +@Getter +@Setter +@Table(name = "security_door") +public class SecurityDoor extends BaseEntity implements Serializable { + + + @Id + @Column(name = "id") + @NotNull(groups = BaseEntity.Update.class) + @ApiModelProperty(value = "id", hidden = true) + private String id; + + + @Column(name = "device_id") + @ApiModelProperty(value = "设备id",hidden = true) + private String deviceId; + + @Column(name = "tid") + @ApiModelProperty(value = "标签id",hidden = true) + private String tid; + + @Column(name = "alarm_event") + @ApiModelProperty(value = "0:出门;1:进门",hidden = true) + private Integer alarmEvent; + + @Column(name = "user_id") + @ApiModelProperty(value = "用户id",hidden = true) + private Integer userId; + + + @Column(name = "alarm_level") + @ApiModelProperty(value = "0:异常;1:正常",hidden = true) + private Integer alarmLevel; + + @Column(name = "alarm_msg") + @ApiModelProperty(value = "描述",hidden = true) + private String alarmMsg; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SecurityDoor that = (SecurityDoor) o; + return Objects.equals(id, that.id) && Objects.equals(deviceId, that.deviceId) && Objects.equals(tid, that.tid) && Objects.equals(alarmEvent, that.alarmEvent) && Objects.equals(userId, that.userId) && Objects.equals(alarmLevel, that.alarmLevel) && Objects.equals(alarmMsg, that.alarmMsg); + } + + @Override + public int hashCode() { + return Objects.hash(id, deviceId, tid, alarmEvent, userId, alarmLevel, alarmMsg); + } +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/repository/SecurityDoorRepository.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/repository/SecurityDoorRepository.java new file mode 100644 index 0000000..90cdab0 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/repository/SecurityDoorRepository.java @@ -0,0 +1,9 @@ +package com.storeroom.modules.storeroom3d.repository; + + +import com.storeroom.modules.storeroom3d.domain.SecurityDoor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface SecurityDoorRepository extends JpaRepository, JpaSpecificationExecutor { +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/AlarmInfoService.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/AlarmInfoService.java index 74e5034..c9ea594 100644 --- a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/AlarmInfoService.java +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/AlarmInfoService.java @@ -4,4 +4,6 @@ public interface AlarmInfoService { Object getAllAlarmInfo(); + + Object getStoreroomDevice(String storeroomId); } diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/SecurityDoorService.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/SecurityDoorService.java new file mode 100644 index 0000000..93c7938 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/SecurityDoorService.java @@ -0,0 +1,8 @@ +package com.storeroom.modules.storeroom3d.service; + +import com.storeroom.modules.storeroom3d.domain.SecurityDoor; + +public interface SecurityDoorService { + + void create(SecurityDoor securityDoor); +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/AlarmInfoServiceImpl.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/AlarmInfoServiceImpl.java index 0dcb2e8..cbababc 100644 --- a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/AlarmInfoServiceImpl.java +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/AlarmInfoServiceImpl.java @@ -33,7 +33,7 @@ public class AlarmInfoServiceImpl implements AlarmInfoService { List alarmDtos = thirdApiService.getAllDeviceAlarm(); List alarmDtos1 = new ArrayList<>(); List alarmDtos2 = alarmDtos.stream().filter(getCurAlarmDto -> Objects.equals(getCurAlarmDto.getDevice_id(), "")).collect(Collectors.toList()); - for (int i = 0; i < alarmDtos.size(); i++) { + for (int i = 0; i < alarmDtos2.size(); i++) { for (int k = 0; k < deviceInfoList.size(); k++) { if (Objects.equals(alarmDtos.get(i).getDevice_id(), deviceInfoList.get(k).getDeviceId())) { alarmDtos1.add(alarmDtos.get(i)); @@ -45,4 +45,9 @@ public class AlarmInfoServiceImpl implements AlarmInfoService { return alarmDtos1; } + + @Override + public Object getStoreroomDevice(String storeroomId) { + return null; + } } diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/SecurityDoorServiceImpl.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/SecurityDoorServiceImpl.java new file mode 100644 index 0000000..a877ed4 --- /dev/null +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/SecurityDoorServiceImpl.java @@ -0,0 +1,23 @@ +package com.storeroom.modules.storeroom3d.service.impl; + +import com.storeroom.modules.storeroom3d.domain.SecurityDoor; +import com.storeroom.modules.storeroom3d.repository.SecurityDoorRepository; +import com.storeroom.modules.storeroom3d.service.SecurityDoorService; +import com.storeroom.utils.NanoIdUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + + +@Service +@RequiredArgsConstructor +public class SecurityDoorServiceImpl implements SecurityDoorService { + + + private final SecurityDoorRepository securityDoorRepository; + + @Override + public void create(SecurityDoor securityDoor) { + securityDoor.setId(NanoIdUtils.randomNanoId()); + securityDoorRepository.save(securityDoor); + } +} diff --git a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/ThirdApiServiceImpl.java b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/ThirdApiServiceImpl.java index 549c826..9523289 100644 --- a/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/ThirdApiServiceImpl.java +++ b/storeroom/src/main/java/com/storeroom/modules/storeroom3d/service/impl/ThirdApiServiceImpl.java @@ -138,8 +138,8 @@ public class ThirdApiServiceImpl implements ThirdApiService { } } }); - //PushServiceImpl pushService=new PushServiceImpl(); - // pushService.pushMsgToAll(result); + PushServiceImpl pushService = new PushServiceImpl(); + pushService.pushMsgToAll(result); return list; } else { throw new BaseException("访问失败" + response.getStatusLine().getStatusCode() + "");