From 8ab365fc8b4c9581ad8b847a427b78799ae5141b Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Mon, 28 Jul 2025 16:33:21 +0800 Subject: [PATCH 01/38] =?UTF-8?q?=E5=88=B6=E5=BA=A6=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=90=8E=E7=AB=AF=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sip/pom.xml | 52 -- .../monitor/config/MediaFormatConfig.java | 30 - .../dite/znpt/monitor/constant/Constants.java | 37 - .../monitor/constant/IotCacheConstants.java | 37 - .../monitor/constant/IotDictConstants.java | 20 - .../znpt/monitor/constant/IotRespMessage.java | 113 --- .../monitor/constant/dict/CameraType.java | 32 - .../monitor/constant/dict/DeviceStatus.java | 34 - .../constant/dict/SipTransferMode.java | 26 - .../constant/dict/StreamTransferMode.java | 27 - .../monitor/constant/dict/ValueAndLabel.java | 14 - .../znpt/monitor/constant/dict/YesOrNo.java | 32 - .../znpt/monitor/domain/CustomFunction.java | 14 - .../entity/DeviceVideoChannelEntity.java | 124 --- .../domain/entity/DeviceVideoEntity.java | 97 -- .../monitor/domain/entity/IpConfigEntity.java | 35 - .../domain/req/MonitorConfigAddReq.java | 14 - .../znpt/monitor/domain/req/VideoInfoReq.java | 23 - .../monitor/domain/resp/DeviceVideoResp.java | 19 - .../monitor/domain/resp/VideoInfoResp.java | 58 -- .../vo/video/DeviceVideoChannelEditReq.java | 34 - .../vo/video/DeviceVideoChannelListResp.java | 55 -- .../vo/video/DeviceVideoChannelResp.java | 43 - .../domain/vo/video/DeviceVideoEditReq.java | 29 - .../domain/vo/video/DeviceVideoListResp.java | 74 -- .../domain/vo/video/DeviceVideoNumResp.java | 24 - .../domain/vo/video/StreamMediaFormat.java | 77 -- .../domain/vo/video/StreamMediaFormatReq.java | 28 - .../vo/video/StreamMediaFormatResp.java | 31 - .../vo/video/StreamMediaServerConfigReq.java | 59 -- .../vo/video/StreamMediaServerConfigResp.java | 60 -- .../monitor/domain/vo/video/VideoPayResp.java | 24 - .../mapper/DeviceVideoChannelMapper.java | 55 -- .../monitor/mapper/DeviceVideoMapper.java | 24 - .../znpt/monitor/mapper/IpConfigMapper.java | 13 - .../mapper/StreamMediaFormatMapper.java | 12 - .../dite/znpt/monitor/media/zlm/ZlmApi.java | 1 - .../dite/znpt/monitor/media/zlm/ZlmHook.java | 135 --- .../znpt/monitor/media/zlm/ZlmService.java | 42 - .../media/zlm/cache/MediaServerCache.java | 38 - .../zlm/cache/MediaServerChannelCache.java | 54 -- .../zlm/config/StreamMediaServerConfig.java | 46 - .../znpt/monitor/media/zlm/dto/MediaItem.java | 130 --- .../monitor/media/zlm/dto/ServerConfig.java | 852 ------------------ .../monitor/media/zlm/dto/ServerInfo.java | 30 - .../monitor/media/zlm/dto/ServerItem.java | 108 --- .../media/zlm/dto/event/BaseEventReq.java | 48 - .../media/zlm/dto/event/BaseEventResp.java | 42 - .../media/zlm/dto/event/FlowReportReq.java | 26 - .../media/zlm/dto/event/HttpAccessReq.java | 29 - .../media/zlm/dto/event/HttpAccessResp.java | 34 - .../monitor/media/zlm/dto/event/PlayReq.java | 14 - .../media/zlm/dto/event/PublishReq.java | 14 - .../media/zlm/dto/event/PublishResp.java | 81 -- .../media/zlm/dto/event/RecordMp4Req.java | 48 - .../media/zlm/dto/event/RtspAuthReq.java | 30 - .../media/zlm/dto/event/RtspAuthResp.java | 30 - .../media/zlm/dto/event/RtspRealmReq.java | 14 - .../zlm/dto/event/ServerKeepaliveReq.java | 16 - .../media/zlm/dto/event/ShellLoginReq.java | 24 - .../media/zlm/dto/event/StreamChangedReq.java | 19 - .../zlm/dto/event/StreamNoneReaderReq.java | 14 - .../zlm/dto/event/StreamNotFoundReq.java | 14 - .../monitor/media/zlm/dto/req/BaseReq.java | 18 - .../media/zlm/dto/req/CloseStreamReq.java | 18 - .../media/zlm/dto/req/FFmpegSourceReq.java | 45 - .../media/zlm/dto/req/GetAllSessionReq.java | 25 - .../zlm/dto/req/GetMp4RecordFileReq.java | 24 - .../znpt/monitor/media/zlm/dto/req/IdReq.java | 20 - .../monitor/media/zlm/dto/req/KeyReq.java | 20 - .../monitor/media/zlm/dto/req/RecordReq.java | 29 - .../media/zlm/dto/req/RtpServerReq.java | 45 - .../monitor/media/zlm/dto/req/SendRtpReq.java | 53 -- .../monitor/media/zlm/dto/req/SnapReq.java | 29 - .../media/zlm/dto/req/StreamIdReq.java | 22 - .../media/zlm/dto/req/StreamProxyReq.java | 89 -- .../zlm/dto/req/StreamPusherProxyReq.java | 35 - .../monitor/media/zlm/dto/req/StreamReq.java | 32 - .../monitor/media/zlm/dto/resp/BaseResp.java | 64 -- .../media/zlm/dto/resp/CloseStreamResp.java | 25 - .../monitor/media/zlm/dto/resp/MediaResp.java | 61 -- .../media/zlm/dto/resp/Mp4RecordFileResp.java | 23 - .../media/zlm/dto/resp/OriginSock.java | 26 - .../media/zlm/dto/resp/RtpInfoResp.java | 39 - .../media/zlm/dto/resp/RtpServerResp.java | 22 - .../media/zlm/dto/resp/SessionResp.java | 41 - .../media/zlm/dto/resp/StatisticResp.java | 28 - .../media/zlm/dto/resp/ThreadsLoadResp.java | 22 - .../monitor/media/zlm/dto/resp/Track.java | 61 -- .../media/zlm/enums/MediaFormatType.java | 43 - .../monitor/media/zlm/impl/ZlmApiImpl.java | 223 ----- .../media/zlm/impl/ZlmHookService.java | 132 --- .../media/zlm/impl/ZlmServiceImpl.java | 195 ---- .../service/DeviceVideoChannelService.java | 120 --- .../monitor/service/DeviceVideoService.java | 104 --- .../znpt/monitor/service/IpConfigService.java | 27 - .../service/StreamMediaFormatService.java | 12 - .../impl/DeviceVideoChannelServiceImpl.java | 262 ------ .../service/impl/DeviceVideoServiceImpl.java | 225 ----- .../service/impl/IpConfigServiceImpl.java | 80 -- .../impl/StreamMediaFormatServiceImpl.java | 17 - .../com/dite/znpt/monitor/sip/SipLayer.java | 102 --- .../znpt/monitor/sip/config/SipConfig.java | 38 - .../sip/session/StreamSessionManager.java | 26 - .../sip/transmit/SipProcessorFactoryI.java | 11 - .../sip/transmit/SipProcessorFactoryImpl.java | 99 -- .../sip/transmit/cmd/ISipDeviceCommander.java | 50 - .../cmd/SipRequestHeaderProvider.java | 120 --- .../cmd/impl/SipDeviceCommanderImpl.java | 226 ----- .../request/ISipRequestProcessor.java | 12 - .../request/ISipRequestProcessorAbstract.java | 259 ------ .../request/impl/AckRequestProcessorImpl.java | 53 -- .../request/impl/ByeRequestProcessorImpl.java | 63 -- .../impl/MessageRequestProcessorImpl.java | 75 -- .../impl/RegisterRequestProcessorImpl.java | 158 ---- .../request/impl/message/IMessageHandler.java | 20 - .../message/query/CatalogHandlerImpl.java | 137 --- .../message/query/DeviceInfoHandlerImpl.java | 68 -- .../query/DeviceStatusHandlerImpl.java | 68 -- .../message/query/KeepaliveHandlerImpl.java | 89 -- .../response/ISipResponseProcessor.java | 13 - .../ISipResponseProcessorAbstract.java | 12 - .../impl/InviteResponseProcessorImpl.java | 1 - .../transmit/timeout/ITimeoutProcessor.java | 7 - .../timeout/impl/TimeoutProcessorImpl.java | 34 - .../DigestServerAuthenticationHelper.java | 210 ----- .../dite/znpt/monitor/sip/utils/XmlUtil.java | 95 -- .../znpt/monitor/sip/vo/DeviceAlarmVo.java | 49 - .../znpt/monitor/sip/vo/DeviceChannelVo.java | 129 --- .../dite/znpt/monitor/sip/vo/DeviceVo.java | 56 -- .../com/dite/znpt/monitor/sip/vo/HostVo.java | 12 - .../znpt/monitor/sip/vo/RecordItemVo.java | 31 - .../dite/znpt/monitor/sip/vo/RecordVo.java | 23 - .../dite/znpt/monitor/utils/DictUtils.java | 33 - .../mapper/iot/DeviceVideoChannelMapper.xml | 84 -- .../mapper/iot/DeviceVideoMapper.xml | 45 - .../resources/mapper/iot/IpConfigMapper.xml | 17 - .../znpt/web/controller/VideoController.java | 188 ---- web/src/main/resources/application-dev.yml | 68 +- 139 files changed, 34 insertions(+), 8516 deletions(-) delete mode 100644 sip/pom.xml delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java delete mode 100644 sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml delete mode 100644 sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml delete mode 100644 sip/src/main/resources/mapper/iot/IpConfigMapper.xml delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/VideoController.java diff --git a/sip/pom.xml b/sip/pom.xml deleted file mode 100644 index 7e62790..0000000 --- a/sip/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - - com.dite.znpt - parent - 1.0.0-SNAPSHOT - - sip - 1.0.0-SNAPSHOT - - - 17 - 17 - UTF-8 - - - - com.dite.znpt - core - 1.0.0-SNAPSHOT - - - - org.projectlombok - lombok - - - - - javax.sip - jain-sip-ri - 1.3.0-91 - - - - - org.dom4j - dom4j - 2.1.3 - - - org.slf4j - log4j-over-slf4j - 1.7.36 - - - - \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java b/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java deleted file mode 100644 index 2c0dd0c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.config; - -import cn.hutool.core.collection.CollUtil; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -/** - * 媒体格式配置 - * - * @author huise23 - * @since 2023-07-31 09:08:05 - */ -@Configuration -public class MediaFormatConfig { - - @Bean - public static List streamMediaFormatList() { - List formatList = CollUtil.newArrayList(); - formatList.add(new StreamMediaFormat("flv",null,"1")); - formatList.add(new StreamMediaFormat("mp4",null,"0")); - formatList.add(new StreamMediaFormat("hls",null,"0")); - formatList.add(new StreamMediaFormat("webrtc",null,"1")); - return formatList; - } - - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java deleted file mode 100644 index d1ee938..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/7/14 - */ -public class Constants { - /** - * UTF-8 字符集 - */ - public static final String UTF8 = "UTF-8"; - - /** - * GBK 字符集 - */ - public static final String GBK = "GBK"; - - /** - * 路径拼接符 / - */ - public static final String File_SEPARATOR = "/"; - - /** - * http请求 - */ - public static final String HTTP = "http://"; - - /** - * https请求 - */ - public static final String HTTPS = "https://"; - - /** - * 默认字符串分隔符 - */ - public static final String DEFAULT_DELIMITER = ","; -} \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java deleted file mode 100644 index 743494a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/8/4 - * @description 缓存key定义:key全部以iot开头 - */ -public class IotCacheConstants { - - /** - * 参数管理 cache key - */ - public static final String SYS_CONFIG_KEY = "sys_config:"; - - /** - * 字典管理 cache key - */ - public static final String SYS_DICT_KEY = "sys_dict:"; - - /** - * 图标库 cache key - */ - public static final String SYS_ICON_KEY = "sys_icon"; - - private static final String IOT_DEVICE_VIDEO_PREFIX = "vs_device_video:"; - - public static String getIotDeviceVideoKey(String deviceCode){ - return IOT_DEVICE_VIDEO_PREFIX + deviceCode; - } - - private final static String CLIENT_TRANSACTION_CACHE_PREFIX = "IOT_CLIENT_TRANSACTION_CACHE:"; - - public static String getClientTransactionCacheKey(String ssrc){ - return CLIENT_TRANSACTION_CACHE_PREFIX + ssrc; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java deleted file mode 100644 index 4e3d10d..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/8/4 - * @description 字典类型定义 - */ -public class IotDictConstants { - - /** - * 设备状态-在线 - */ - public static final String IOT_DEVICE_STATUS_ONLINE = "2"; - - /** - * 设备状态-离线 - */ - public static final String IOT_DEVICE_STATUS_OFFLINE = "3"; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java deleted file mode 100644 index 7cdf9eb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/8/4 - * @description 响应文案定义 - */ -public class IotRespMessage { - - public static final String UNKNOWN_FAIL = "未知错误"; - - public static final String ID_NOT_FOUND = "数据不存在"; - - public static final String PARAMETER_ERROR = "参数有误"; - - public static final String NO_PERMISSION = "没有访问权限"; - - public static final String PARENT_AREA_NOT_FOUND = "上级分区不存在"; - - public static final String CAR_TYPE_HAS_CARS = "该车型下仍有车辆,无法删除"; - - public static final String CAR_BRAND_HAS_CARS = "该品牌下仍有车辆,无法删除"; - - public static final String CAR_PLATE_NUMBER_EXIST = "该车牌号车辆已存在"; - - public static final String CAR_PLATE_NUMBER_NOT_EXIST = "该车牌号车辆不存在"; - - public static final String CAR_HAS_BIND_TAG_OR_SPEED_MONITOR = "车辆已绑定车载标签或速度检测仪,禁止删除"; - - public static final String CAR_FREIGHT_NOT_EXIST = "货物不存在"; - - public static final String CAR_HAS_BIND_ALARM_TEMPLATE = "该车辆已绑定其他告警模板"; - - public static final String USER_HAS_BIND_ALARM_TEMPLATE = "该人员已绑定其他告警模板"; - - public static final String REPETITION_ALARM_FOR_AREA = "该厂区分区下已有同类型告警,无法重复添加"; - - public static final String REPETITION_ALARM_NOTIFY_CONFIG = "已存在相同部门层级的告警消息推送配置"; - - public static final String DEVICE_TERMINAL_HAS_BEEN_BIND = "该标签卡已被其他人绑定"; - - public static final String DEVICE_TERMINAL_TYPE_ERROR = "标签卡类型有误"; - - public static final String DEVICE_TERMINAL_NOT_FOUND_OR_STATUS_ERROR = "标签卡未找到或状态异常"; - - public static final String DEVICE_CANNOT_EDIT = "设备未启用或已停用才可编辑"; - - public static final String VIDEO_DEVICE_CANNOT_DELETE = "视频设备禁止删除"; - - public static final String DEVICE_CANNOT_DELETE = "未启用的设备才可删除"; - - public static final String DEVICE_HAS_BIND_TO_GROUP = "设备已经绑定至该分组"; - - public static final String DEVICE_VIDEO_CANNOT_DELETE = "禁止删除在线视频设备"; - - public static final String DEVICE_VIDEO_CANNOT_SYNC = "禁止更新离线视频设备"; - - public static final String DEVICE_INACTIVE = "设备未启用"; - - public static final String CODE_HAS_BEEN_USED = "编号已被占用"; - - public static final String NAME_HAS_BEEN_USED = "名称已被占用"; - - public static final String FLAG_HAS_BEEN_USED = "标识已被占用"; - - public static final String GROUP_HAS_CHILD_CANNOT_REMOVE = "分组有下级分组,无法删除"; - - public static final String GROUP_HAS_DEVICE_CANNOT_REMOVE = "分组下有绑定设备,无法删除"; - - public static final String PRODUCT_PUBLISH_CANNOT_DELETE = "该产品已发布,不可删除"; - - public static final String PRODUCT_HAS_DEVICE_CANNOT_REMOVE = "产品下存在设备关联,需删除设备后进行操作"; - - public static final String MSG_PROTOCOL_PUBLISH_CANNOT_DELETE = "消息协议未发布,发布协议后操作"; - - public static final String CATEGORY_CANNOT_DELETE = "该产品分类信息已被产品关联,不可删除"; - - public static final String SCENE_CANNOT_DELETE = "该场景信息已被产品关联,不可删除"; - - public static final String SWITCH_PARAM_HAS_BEEN_USED = "该参数在设备服务中只能定义一个"; - - public static final String CONFIG_CANNOT_DELETE = "该配置已被通知模板关联,不可删除, 请取消关联后重试。"; - - public static final String TEMPLATE_CANNOT_DELETE = "该通知模板已被场景联动关联,不可删除, 请取消关联后操作。"; - - public static final String PROTOCOL_CANNOT_DELETE_BY_PUBLISHED = "当前协议状态为已发布,不可删除."; - - public static final String PROTOCOL_CANNOT_DELETE_WITH_PRODUCT = "该协议已被产品关联,不可删除,请删除关联后操作!"; - - public static final String PROTOCOL_CANNOT_UN_PUBLISH = "协议已被产品发布,不可取消!"; - - public static final String PROTOCOL_TYPE_CANNOT_NULL = "协议类型不能为空"; - - public static final String PROTOCOL_CLASS_NAME_CANNOT_EMPTY = "协议类型为Jar或者Local类型时,必须指定协议类名."; - - public static final String PROTOCOL_FILE_PATH_CANNOT_EMPTY = "协议类型为Jar或者Local类型时,必须上传或者指定协议文件路径."; - - public static final String DATA_ILLEGAL = "数据非法"; - - public static final String IMPORT_ERROR = "导入出错"; - - public static final String COMMON_DEVICE_ATTR_DUPLICATE_ERROR = "订阅的通用设备点位全局不唯一"; - - public static final String PROTOCOL_NOT_EXISTS = "协议不存在"; - - public static final String RULE_NOT_EXISTS = "上报规则不存在"; - - public static final String DEVICE_NOT_EXISTS = "设备不存在"; - - public static final String DATA_DATA_TREND_TIME_TYPE_NOT_EXISTS = "设备数据趋势时间类型不存在"; - public static final String DATA_DATA_TREND_DATA_TYPE_NOT_EXISTS = "设备数据趋势数据类型不存在"; - public static final String CRON_ERROR = "cron表达式输入错误:"; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java deleted file mode 100644 index a05e191..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -/** - * 摄像头类型 - * - * @author huise23 - * @since 2023-07-28 15:30:10 - */ -public enum CameraType implements ValueAndLabel { - - UNKNOWN("0","未知"), - BALLHEAD("1","球机"); - - private final String value; - private final String label; - - CameraType(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java deleted file mode 100644 index 2101f2b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -/** - * 设备状态 - * - * @author huise23 - * @since 2023-07-28 15:30:10 - */ -public enum DeviceStatus implements ValueAndLabel { - - INACTIV("1", "未启用"), - ONLINE("2", "在线"), - OFFLINE("3", "离线"), - STOP("4", "停用"); - - private final String value; - private final String label; - - DeviceStatus(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java deleted file mode 100644 index e621c06..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -public enum SipTransferMode implements ValueAndLabel { - - UDP("UDP","UDP"), - TCP("TCP","TCP"); - - private final String value; - private final String label; - - SipTransferMode(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java deleted file mode 100644 index fea526a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -public enum StreamTransferMode implements ValueAndLabel { - - UDP("UDP","UDP"), - TCP_ACTIVE("TCP-ACTIVE","TCP主动"), - TCP_PASSIVE("TCP-PASSIVE", "TCP被动"); - - private final String value; - private final String label; - - StreamTransferMode(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java deleted file mode 100644 index 88b5b1b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - - -/** - * 字典常量接口 - * - * @author huise23 - * @since 2023-07-28 15:28:55 - */ -public interface ValueAndLabel { - String getValue(); - String getLabel(); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java deleted file mode 100644 index 62889fd..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -/** - * YesOrNo - * - * @author huise23 - * @since 2023-07-28 15:30:10 - */ -public enum YesOrNo implements ValueAndLabel { - - YES("Y","是"), - NO("N", "否"); - - private final String value; - private final String label; - - YesOrNo(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java b/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java deleted file mode 100644 index bf145cc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.domain; - -/** - * @Author: cuizhibin - * @Date: 2023/1/16 14:36:36 - * @Description: - */ -public interface CustomFunction { - /** - * 执行的方法 - * @return - */ - T get(); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java deleted file mode 100644 index 4b263aa..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.dite.znpt.monitor.domain.entity; - -import com.baomidou.mybatisplus.annotation.*; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/8/11 17:29 - * @Description: - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("vs_device_video_channel") -@ApiModel(value="DeviceVideoChannelEntity", description="视频通道表") -public class DeviceVideoChannelEntity implements Serializable { - - private static final long serialVersionUID = -4175177624487756818L; - - @ApiModelProperty(value = "主键id") - @TableId(value = "channel_id", type = IdType.AUTO) - private Long channelId; - - @ApiModelProperty(value = "视频设备id") - private Long videoId; - - @ApiModelProperty(value = "通道国标编号") - private String channelCode; - - @ApiModelProperty(value = "通道名") - private String channelName; - - @ApiModelProperty(value = "生产厂商") - private String manufacture; - - @ApiModelProperty(value = "型号") - private String model; - - @ApiModelProperty(value = "设备归属") - private String owner; - - @ApiModelProperty(value = "行政区域") - private String civilCode; - - @ApiModelProperty(value = "警区") - private String block; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "是否有子设备 1有, 0没有") - private int parental; - - @ApiModelProperty(value = "父级id") - private String parentId; - - @ApiModelProperty(value = "信令安全模式 缺省为0; 0:不采用; 2: S/MIME签名方式; 3: S/ MIME加密签名同时采用方式; 4:数字摘要方式") - private int safetyWay; - - @ApiModelProperty(value = "注册方式 缺省为1;1:符合IETFRFC3261标准的认证注册模 式; 2:基于口令的双向认证注册模式; 3:基于数字证书的双向认证注册模式") - private int registerWay; - - @ApiModelProperty("证书序列号") - private String certNum; - - @ApiModelProperty("证书有效标识 缺省为0;证书有效标识:0:无效1: 有效") - private int certifiable; - - @ApiModelProperty("证书无效原因码") - private int errCode; - - @ApiModelProperty( "证书终止有效期") - private String endTime; - - @ApiModelProperty("保密属性 缺省为0; 0:不涉密, 1:涉密") - private String secrecy; - - @ApiModelProperty("IP地址") - private String ipAddress; - - @ApiModelProperty("端口号") - private int port; - - @ApiModelProperty("密码") - private String password; - - @ApiModelProperty("摄像头类型") - private String cameraType; - - @ApiModelProperty("云台控制") - private String ptzControl; - - @ApiModelProperty(value = "状态") - private String status; - - @ApiModelProperty("经度") - private double longitude; - - @ApiModelProperty("纬度") - private double latitude; - - @ApiModelProperty(value = "备注") - private String remark; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("创建人id") - @TableField(fill = FieldFill.INSERT) - private Long createBy; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("更新人id") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long updateBy; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java deleted file mode 100644 index 049e324..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.dite.znpt.monitor.domain.entity; - -import com.baomidou.mybatisplus.annotation.*; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/8/11 10:24 - * @Description: - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("vs_device_video") -@ApiModel(value="DeviceVideoEntity", description="视频设备表") -public class DeviceVideoEntity implements Serializable { - - private static final long serialVersionUID = -182441901641147882L; - - @ApiModelProperty(value = "主键id") - @TableId(value = "video_id", type = IdType.AUTO) - private Long videoId; - - @ApiModelProperty(value = "视频设备国标编码") - private String videoCode; - - @ApiModelProperty(value = "视频设备名称") - private String videoName; - - @ApiModelProperty(value = "生产厂商") - private String manufacturer; - - @ApiModelProperty(value = "型号") - private String model; - - @ApiModelProperty(value = "固件版本") - private String firmware; - - @ApiModelProperty(value = "传输协议(UDP/TCP),默认UDP") - private String transport; - - @ApiModelProperty(value = "数据流传输模式(默认UDP)") - private String streamMode; - - @ApiModelProperty(value = "设备状态") - private String status; - - @ApiModelProperty(value = "注册时间") - private LocalDateTime registerTime; - - @ApiModelProperty(value = "心跳时间") - private LocalDateTime KeepaliveTime; - - @ApiModelProperty("通道个数") - private int channelCount; - - @ApiModelProperty(value = "ip") - private String ip; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "地址") - private String hostAddress; - - @ApiModelProperty(value = "注册有效期") - private Integer expires; - - @ApiModelProperty(value = "符集, 支持 UTF-8 与 GB2312") - private String charset; - - @ApiModelProperty(value = "产品id") - private Long productId; - - @ApiModelProperty(value = "备注") - private String remark; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("创建人id") - @TableField(fill = FieldFill.INSERT) - private Long createBy; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("更新人id") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long updateBy; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java deleted file mode 100644 index 0259688..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.dite.znpt.monitor.domain.entity; - -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("vs_ip_config") -@ApiModel(value="VsIpConfigEntity对象", description="监控设备IP配置表") -public class IpConfigEntity implements Serializable { - - @ApiModelProperty("${column.comment}") - @TableId(type = IdType.AUTO) - private Long configId; - - @ApiModelProperty("ip地址") - private String ip; - - @ApiModelProperty("ip地址前三位") - private String ipTopThree; - - -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java deleted file mode 100644 index be2a92e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.domain.req; - -import lombok.Data; - -import java.util.List; - -/** - * @Date:2023/9/5 16:19 - * @Description: 视频服务配置新增对象 - */ -@Data -public class MonitorConfigAddReq { - private List ipAddresses; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java deleted file mode 100644 index 0dc809c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dite.znpt.monitor.domain.req; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * 查询视频信息参数 - * - * @author huise23 - * @since 2024-12-03 14:03:29 - */ -@Data -public class VideoInfoReq implements Serializable { - - @ApiModelProperty(value = "视频对接方式 1.摄像头直连 2.级联") - private Integer videoConnection; - - @ApiModelProperty(value = "级联分隔符(默认/)") - private String cascadeSeparator = "/"; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java deleted file mode 100644 index f8a76ae..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.monitor.domain.resp; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @Date:2023/9/7 10:26 - * @Description: - */ -@Data -public class DeviceVideoResp extends DeviceVideoEntity { - @ApiModelProperty(value = "设备状态label") - private String statusLabel; - @ApiModelProperty(value = "流传输模式label") - private String streamModeLabel; - @ApiModelProperty(value = "传输模式label") - private String transportLabel; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java deleted file mode 100644 index 7ba594c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.dite.znpt.monitor.domain.resp; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * 查询视频信息返回信息 - * - * @author huise23 - * @since 2024-12-03 14:03:29 - */ -@Data -public class VideoInfoResp implements Serializable { - - @ApiModelProperty(value = "视频设备id") - private Long videoId; - - @ApiModelProperty(value = "视频设备名称") - private String videoName; - - @ApiModelProperty(value = "通道id") - private Long channelId; - - @ApiModelProperty(value = "国标编码") - private String channelCode; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "生产厂商") - private String manufacture; - - @ApiModelProperty(value = "型号") - private String model; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty("IP地址") - private String ipAddress; - - @ApiModelProperty("端口号") - private int port; - - @ApiModelProperty(value = "云台控制label") - private String ptzControl; - - @ApiModelProperty("经度") - private double longitude; - - @ApiModelProperty("纬度") - private double latitude; - - @ApiModelProperty(value = "状态 DeviceStatus") - private String status; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java deleted file mode 100644 index 1ec735a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:12 - * @Description: - */ -@Data -@ApiModel("视频通道编辑请求") -public class DeviceVideoChannelEditReq implements Serializable { - - private static final long serialVersionUID = 719557164910393807L; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "摄像头类型") - private String cameraType; - - @ApiModelProperty(value = "云台控制,Y表示是,N表示否") - private String ptzControl; - - @ApiModelProperty(value = "描述") - private String remark; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java deleted file mode 100644 index 31234fb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:12 - * @Description: - */ -@Data -@ApiModel("视频通道列表响应") -public class DeviceVideoChannelListResp implements Serializable { - - private static final long serialVersionUID = -8053965410352257803L; - - @ApiModelProperty(value = "主键id") - private Long channelId; - - @ApiModelProperty(value = "所属产品id") - private Long productId; - - @ApiModelProperty(value = "通道国标编码") - private String channelCode; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "摄像头类型label") - private String cameraType; - - @ApiModelProperty(value = "摄像头类型") - private String cameraTypeLabel; - - @ApiModelProperty(value = "云台控制label") - private String ptzControl; - - @ApiModelProperty(value = "云台控制,Y表示是,N表示否") - private String ptzControlLabel; - - @ApiModelProperty(value = "状态") - private String status; - - @ApiModelProperty(value = "状态label") - private String statusLabel; - - @ApiModelProperty(value = "描述") - private String remark; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java deleted file mode 100644 index 1f22085..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:12 - * @Description: - */ -@Data -@ApiModel("视频通道响应") -public class DeviceVideoChannelResp implements Serializable { - - private static final long serialVersionUID = 1140851083577845760L; - - @ApiModelProperty(value = "主键id") - private Long channelId; - - @ApiModelProperty(value = "通道国标编码") - private String channelCode; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "摄像头类型") - private String cameraType; - - @ApiModelProperty(value = "云台控制,Y表示是,N表示否") - private String ptzControl; - - @ApiModelProperty(value = "状态") - private String status; - - @ApiModelProperty(value = "描述") - private String remark; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java deleted file mode 100644 index a1f2b8e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:13 - * @Description: - */ -@Data -@ApiModel("视频设备编辑请求参数") -public class DeviceVideoEditReq implements Serializable { - - private static final long serialVersionUID = -3387666090991548317L; - - @ApiModelProperty(value = "设备名称") - private String videoName; - - @ApiModelProperty(value = "所属产品") - private Long productId; - - @ApiModelProperty(value = "说明") - private String remark; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java deleted file mode 100644 index 026f873..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:13 - * @Description: - */ -@Data -@ApiModel("视频设备列表响应") -public class DeviceVideoListResp implements Serializable { - - private static final long serialVersionUID = -5568664011265192343L; - - @ApiModelProperty(value = "主键id") - private Long videoId; - - @ApiModelProperty(value = "视频设备国标编码") - private String videoCode; - - @ApiModelProperty(value = "视频设备名称") - private String videoName; - - @ApiModelProperty(value = "传输模式") - private String transport; - - @ApiModelProperty(value = "传输模式label") - private String transportLabel; - - @ApiModelProperty(value = "流传输模式") - private String streamMode; - - @ApiModelProperty(value = "流传输模式label") - private String streamModeLabel; - - @ApiModelProperty(value = "通道数量") - private Integer channelCount; - - @ApiModelProperty(value = "设备状态") - private String status; - - @ApiModelProperty(value = "设备状态label") - private String statusLabel; - - @ApiModelProperty(value = "设备ip") - private String ip; - - @ApiModelProperty(value = "设备端口") - private String port; - - @ApiModelProperty(value = "设备地址(ip+端口)") - private String hostAddress; - - @ApiModelProperty(value = "生产厂商") - private String manufacturer; - - @ApiModelProperty(value = "备注") - private String remark; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "创建时间") - private LocalDateTime createTime; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "心跳时间") - private LocalDateTime keepAliveTime; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java deleted file mode 100644 index f56b8c1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/16 9:34 - * @Description: - */ -@Data -@ApiModel("视频设备数量响应") -public class DeviceVideoNumResp { - - @ApiModelProperty(value = "设备总数量") - private Long allDevice; - - @ApiModelProperty(value = "设备在线数量") - private Long onlineDevice; - - @ApiModelProperty(value = "设备离线数量") - private Long offlineDevice; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java deleted file mode 100644 index 5c5f457..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.annotation.TableField; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.enums.MediaFormatType; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 10:25 - * @Description: - */ -@Data -@EqualsAndHashCode(callSuper = false) -@ApiModel(value = "StreamMediaFormat对象", description = "流媒体格式") -public class StreamMediaFormat implements Serializable { - - private static final long serialVersionUID = -4177962876536716643L; - - @ApiModelProperty(value = "流媒体格式") - private String mediaFormat; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "是否开启tls,1表示ture,0表示false") - private String openTls; - - @TableField(exist = false) - @ApiModelProperty(value = "WebSocket播放地址") - private String wsUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "Http播放地址") - private String httpUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "WebSocket播放地址") - private String wssUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "Http播放地址") - private String httpsUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "相对播放地址") - private String relativePath; - - public StreamMediaFormat(String mediaFormat,Integer port,String openTls){ - this.mediaFormat = mediaFormat; - this.port = port; - this.openTls = openTls; - } - - public void generateUrl(String host, String streamId, ServerConfig config, String mediaRouter) { - if("webrtc".equals(this.mediaFormat)){ - this.httpUrl = StrUtil.format("http://{}:{}/index/api/webrtc?app=rtp&stream={}&type=play", host, config.getHttpPort(), streamId); - this.httpsUrl = StrUtil.format("https://{}:{}/index/api/webrtc?app=rtp&stream={}&type=play", host, config.getHttpSslPort(), streamId); - this.relativePath = StrUtil.format("{}/index/api/webrtc?app=rtp&stream={}&type=play", mediaRouter, streamId); - return; - } - String suffix = MediaFormatType.getSuffix(this.mediaFormat); - if (config.getHttpSslPort() != null && config.getHttpSslPort() > 0) { - this.wssUrl = StrUtil.format("wss://{}:{}/rtp/{}{}", host, config.getHttpSslPort(), streamId, suffix); - this.httpsUrl = StrUtil.format("https://{}:{}/rtp/{}{}", host, config.getHttpSslPort(), streamId, suffix); - } - this.wsUrl = StrUtil.format("ws://{}:{}/rtp/{}{}", host, config.getHttpPort(), streamId, suffix); - this.httpUrl = StrUtil.format("http://{}:{}/rtp/{}{}", host, config.getHttpPort(), streamId, suffix); - this.relativePath = StrUtil.format("{}/rtp/{}{}", mediaRouter, streamId, suffix); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java deleted file mode 100644 index d3ce278..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:40 - * @Description: - */ -@Data -@ApiModel("流媒体格式请求") -public class StreamMediaFormatReq implements Serializable { - - private static final long serialVersionUID = 6627383994019834279L; - - @ApiModelProperty(value = "流媒体格式") - private String mediaFormat; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "是否开启TLS,1表示true,0表示false") - private String openTls; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java deleted file mode 100644 index ad9304b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:40 - * @Description: - */ -@Data -@ApiModel("流媒体格式响应") -public class StreamMediaFormatResp implements Serializable { - - private static final long serialVersionUID = -5714327034173930078L; - - @ApiModelProperty(value = "流媒体格式主键") - private Long formatId; - - @ApiModelProperty(value = "流媒体格式") - private String mediaFormat; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "是否开启TLS,1表示true,0表示false") - private String openTls; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java deleted file mode 100644 index 36c15fd..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:16 - * @Description: - */ -@Data -@ApiModel("流媒体服务配置请求") -public class StreamMediaServerConfigReq implements Serializable { - - private static final long serialVersionUID = -1228005085084886474L; - - @NotNull(message = "流媒体名称不能为空") - @ApiModelProperty(value = "流媒体名称") - private String mediaName; - - @ApiModelProperty(value = "流媒体服务") - private String mediaService; - - @ApiModelProperty(value = "公网 HOST") - private String publicHost; - - @ApiModelProperty(value = "API HOST") - private String apiHost; - - @ApiModelProperty(value = "API 端口") - private Integer apiPort; - - @ApiModelProperty(value = "密钥") - private Integer secretKey; - - @ApiModelProperty(value = "流ID前缀") - private String streamPrefix; - - @ApiModelProperty(value = "RTP IP") - private String rtpHost; - - @ApiModelProperty(value = "RTP 端口") - private Integer rtpPort; - - @ApiModelProperty(value = "动态端口起始值") - private Integer dynamicPortStart; - - @ApiModelProperty(value = "动态端口结束值") - private Integer dynamicPortEnd; - - @ApiModelProperty(value = "流媒体格式") - private List streamMediaFormatReqList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java deleted file mode 100644 index 6e3b185..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:16 - * @Description: - */ -@Data -@ApiModel("流媒体服务配置响应") -public class StreamMediaServerConfigResp implements Serializable { - - private static final long serialVersionUID = 3464085768355214710L; - - @ApiModelProperty(value = "'流媒体配置主键'") - private Long configId; - - @ApiModelProperty(value = "'流媒体名称'") - private String mediaName; - - @ApiModelProperty(value = "流媒体服务") - private String mediaService; - - @ApiModelProperty(value = "公网 HOST") - private String publicHost; - - @ApiModelProperty(value = "API HOST") - private String apiHost; - - @ApiModelProperty(value = "API 端口") - private Integer apiPort; - - @ApiModelProperty(value = "密钥") - private String secretKey; - - @ApiModelProperty(value = "流ID前缀") - private String streamPrefix; - - @ApiModelProperty(value = "RTP IP") - private String rtpHost; - - @ApiModelProperty(value = "RTP 端口") - private Integer rtpPort; - - @ApiModelProperty(value = "动态端口起始值") - private Integer dynamicPortStart; - - @ApiModelProperty(value = "动态端口结束值") - private Integer dynamicPortEnd; - - @ApiModelProperty(value = "流媒体格式") - private List streamMediaFormatRespList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java deleted file mode 100644 index 26809bc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Builder; -import lombok.Data; - -import java.util.List; - -/** - * 视频播放响应 - * @author huise23 - * @since 2024-11-26 14:03:41 - */ -@Data -@Builder -public class VideoPayResp { - - @ApiModelProperty(value = "播放方式") - private String mediaType; - - @ApiModelProperty(value = "流媒体播放地址") - private List streamMediaFormatList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java deleted file mode 100644 index 2c211e8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dite.znpt.monitor.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.req.VideoInfoReq; -import com.dite.znpt.monitor.domain.resp.VideoInfoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:08 - * @Description: - */ -public interface DeviceVideoChannelMapper extends BaseMapper { - - /** - * 查询视频通道列表 - * - * @param videoId 视频id - * @param keyword 插叙条件 - * @return {@link List< DeviceVideoChannelListResp>} - */ - List selectDeviceVideoChannel(@Param("videoId") Long videoId, @Param("keyword") String keyword); - - /** - * 查询所有视频通道列表 - * - * @param keyword 插叙条件 - * @return {@link List< DeviceVideoChannelListResp>} - */ - List selectAllDeviceVideoChannel(@Param("keyword") String keyword); - - /** - * 查询视频通道详情 - * - * @param channelCode 通道code - * @return {@link DeviceVideoChannelResp} - */ - DeviceVideoChannelResp getDeviceVideoChannelDetail(@Param("channelCode") String channelCode); - - /** - * 查询通道及视频信息 - * - * @param videoInfoReq 查询参数 - * @return {@link VideoInfoResp } - * @author huise23 - * @since 2024-12-03 13:54:52 - */ - List selectVideoInfoList(VideoInfoReq videoInfoReq); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java deleted file mode 100644 index cc14697..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:09 - * @Description: - */ -public interface DeviceVideoMapper extends BaseMapper { - /** - * 条件查询视频设备列表 - * @param status 是否在线 - * @param keyword 设备名称或者编码 - * @return {@link List< DeviceVideoListResp>} - */ - List selectDeviceVideoList(@Param("status") String status, @Param("keyword") String keyword, @Param("hostAddress") String hostAddress); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java deleted file mode 100644 index 1332af0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dite.znpt.monitor.mapper; - - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.entity.IpConfigEntity; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表数据库访问层 - */ -public interface IpConfigMapper extends BaseMapper { -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java deleted file mode 100644 index a3ce77a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; - -/** - * @Author: huise23 - * @Date: 2022/8/11 15:00 - * @Description: - */ -public interface StreamMediaFormatMapper extends BaseMapper { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java deleted file mode 100644 index f8604da..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java +++ /dev/null @@ -1 +0,0 @@ -package com.dite.znpt.monitor.media.zlm; import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; import com.dite.znpt.monitor.media.zlm.dto.ServerInfo; import com.dite.znpt.monitor.media.zlm.dto.req.*; import com.dite.znpt.monitor.media.zlm.dto.resp.*; import java.io.IOException; import java.util.List; /** * @Author: huise23 * @Date: 2022/8/29 10:14 * @Description: Zlm客户端启动类 */ public interface ZlmApi { /** * 获取API列表 * api: /index/api/getApiList * * @return Api列表 */ List getApiList(ServerInfo server); /** * 获取各epoll(或select)线程负载以及延时 * api: /index/api/getThreadsLoad * * @return 各epoll(或select)线程负载以及延时 */ List getThreadsLoad(ServerInfo server); /** * 获取各后台epoll(或select)线程负载以及延时 * api: /index/api/getWorkThreadsLoad * * @return 各后台epoll(或select)线程负载以及延时 */ List getWorkThreadsLoad(ServerInfo server); /** * 获取服务器配置 * api: /index/api/getServerConfig * * @return 服务器配置 */ List getServerConfig(ServerInfo server); /** * 设置服务器配置 * api: /index/api/setServerConfig * * @param config 服务器配置 * @return 操作结果 */ Integer setServerConfig(ServerInfo server, ServerConfig config); /** * 重启服务器,只有Daemon方式才能重启,否则是直接关闭! * api: /index/api/restartServer * * @return 操作结果 */ Boolean restartServer(ServerInfo server); /** * 获取流列表,可选筛选参数 * api: /index/api/getMediaList * * @param req 请求参数 * @return 操作结果 */ List getMediaList(ServerInfo server, StreamReq req); /** * 关闭流(目前所有类型的流都支持关闭) * api: /index/api/close_streams * * @param req 请求参数 * @return 操作结果 */ CloseStreamResp closeStreams(ServerInfo server, CloseStreamReq req); /** * 获取所有TcpSession列表(获取所有tcp客户端相关信息) * api: /index/api/getAllSession * * @param req 请求参数 * @return 所有TcpSession列表 */ List getAllSession(ServerInfo server, GetAllSessionReq req); /** * 断开tcp连接,比如说可以断开rtsp、rtmp播放器等 * api: /index/api/kick_session * * @param id 客户端唯一id,可以通过getAllSession接口获取 * @return 操作结果 */ Boolean kickSession(ServerInfo server, Long id); /** * 断开tcp连接,比如说可以断开rtsp、rtmp播放器等 * api: /index/api/kick_sessions * * @param req 请求参数 * @return 操作结果 */ Integer kickSession(ServerInfo server, GetAllSessionReq req); /** * 动态添加rtsp/rtmp/hls拉流代理(只支持H264/H265/aac/G711负载) * api: /index/api/addStreamProxy * * @param req 请求参数 * @return 唯一Key */ String addStreamProxy(ServerInfo server, StreamProxyReq req); /** * 关闭拉流代理 * api: /index/api/delStreamProxy * * @param key addStreamProxy接口返回的key * @return 操作结果 */ Boolean delStreamProxy(ServerInfo server, String key); /** * 通过fork FFmpeg进程的方式拉流代理,支持任意协议 * api: /index/api/addFFmpegSource * * @param req 请求参数 * @return 唯一Key */ String addFfMpegSource(ServerInfo server, FFmpegSourceReq req); /** * 关闭ffmpeg拉流代理 * api: /index/api/delFFmpegSource * * @param key addFFmpegSource接口返回的key * @return 操作结果 */ Boolean delFfMpegSource(ServerInfo server, String key); /** * 获取rtp代理时的某路ssrc rtp信息 * api: /index/api/getRtpInfo * * @param streamId RTP的ssrc,16进制字符串或者是流的id(openRtpServer接口指定) * @return 操作结果 */ RtpInfoResp getRtpInfo(ServerInfo server, String streamId); /** * 搜索文件系统,获取流对应的录像文件列表或日期文件夹列表 * api: /index/api/getMp4RecordFile * * @param req 请求参数 * @return 操作结果 */ Mp4RecordFileResp getMp4RecordFile(ServerInfo server, GetMp4RecordFileReq req); /** * 开始录制hls或MP4 * api: /index/api/startRecord * * @param req 请求参数 * @return 操作结果 */ Boolean startRecord(ServerInfo server, RecordReq req); /** * 停止录制流 * api: /index/api/stopRecord * * @param req 请求参数 * @return 操作结果 */ Boolean stopRecord(ServerInfo server, RecordReq req); /** * 获取流录制状态 * api: /index/api/isRecording * * @param req 请求参数 * @return 操作结果 */ Boolean isRecording(ServerInfo server, RecordReq req); /** * 获取截图或生成实时截图并返回 * api: /index/api/getSnap * * @param req 请求参数 * @return jpeg格式的图片,可以在浏览器直接打开 */ void getSnap(ServerInfo server, SnapReq req) throws IOException; /** * 创建GB28181 RTP接收端口,如果该端口接收数据超时,则会自动被回收(不用调用closeRtpServer接口) * api: /index/api/openRtpServer * * @param req 请求参数 * @return 接收端口,方便获取随机端口号 */ Integer openRtpServer(ServerInfo server, RtpServerReq req); /** * 关闭GB28181 RTP接收端口 * api: /index/api/closeRtpServer * * @param streamId 该端口绑定的流ID,该端口只能创建这一个流(而不是根据ssrc创建多个) * @return 是否找到记录并关闭 */ Boolean closeRtpServer(ServerInfo server, String streamId); /** * 获取openRtpServer接口创建的所有RTP服务器 * api: /index/api/listRtpServer * * @return 是否找到记录并关闭 */ List listRtpServer(ServerInfo server); /** * 作为GB28181客户端,启动ps-rtp推流,支持rtp/udp方式; * 该接口支持rtsp/rtmp等协议转ps-rtp推流。第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试。 * api: /index/api/startSendRtp * * @param req 请求参数 * @return 使用的本地端口号 */ Integer startSendRtp(ServerInfo server, SendRtpReq req); /** * 作为GB28181 Passive TCP服务器; * 该接口支持rtsp/rtmp等协议转ps-rtp被动推流。 * 调用该接口,zlm会启动tcp服务器等待连接请求, * 连接建立后,zlm会关闭tcp服务器,然后源源不断的往客户端推流。 * 第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试(不停地建立tcp监听,超时后再关闭)。 * api: /index/api/startSendRtpPassive * * @param req 请求参数 * @return 使用的本地端口号 */ Integer startSendRtpPassive(ServerInfo server, SendRtpReq req); /** * 停止GB28181 ps-rtp推流 * api: /index/api/stopSendRtp * * @param req 请求参数 * @return 操作结果 */ Boolean stopSendRtp(ServerInfo server, SendRtpReq req); /** * 获取主要对象个数统计,主要用于分析内存性能 * api: /index/api/getStatistic * * @return 操作结果 */ StatisticResp getStatistic(ServerInfo server); /** * 添加rtsp/rtmp主动推流(把本服务器的直播流推送到其他服务器去) * api: /index/api/addStreamPusherProxy * * @param req 请求参数 * @return 流的唯一标识 */ String addStreamPusherProxy(ServerInfo server, StreamPusherProxyReq req); /** * 关闭推流 * api: /index/api/delStreamPusherProxy * * @param key 流的唯一标识 * @return 操作结果 */ Boolean delStreamPusherProxy(ServerInfo server, String key); } \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java deleted file mode 100644 index a9c1b11..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.dite.znpt.monitor.media.zlm; - -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.event.*; -import com.dite.znpt.monitor.media.zlm.impl.ZlmHookService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:22 - * @Description: - */ -@Slf4j -@RestController -@RequestMapping("/index/hook") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ZlmHook { - private final ZlmHookService service; - - /** - * 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件, - * 阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_flow_report") - public BaseEventResp onFlowReport(@RequestBody FlowReportReq req) { - return service.onFlowReport(req); - } - - /** - * 访问http文件服务器上hls之外的文件时触发。 - */ - @PostMapping(value = "/on_http_access") - public HttpAccessResp onHttpAccess(@RequestBody HttpAccessReq req) { - return service.onHttpAccess(req); - } - - /** - * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件; - * 如果流不存在,那么先触发on_play事件然后触发on_stream_not_found事件。 - * 播放rtsp流时,如果该流启动了rtsp专属鉴权(on_rtsp_realm)那么将不再触发on_play事件。 - */ - @PostMapping(value = "/on_play") - public BaseEventResp onPlay(@RequestBody PlayReq req) { - return service.onPlay(req); - } - - /** - * rtsp/rtmp/rtp推流鉴权事件。 - */ - @PostMapping(value = "/on_publish") - public PublishResp onPublish(@RequestBody PublishReq req) { - return service.onPublish(req); - } - - - /** - * 录制mp4完成后通知事件;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_record_mp4") - public BaseEventResp onRecordMp4(@RequestBody RecordMp4Req req) { - return service.onRecordMp4(req); - } - - /** - * 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。 - * 需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。 - */ - @PostMapping(value = "/on_rtsp_realm") - public BaseEventResp onRtspRealm(@RequestBody RtspRealmReq req) { - return service.onRtspRealm(req); - } - - /** - * rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。 - */ - @PostMapping(value = "/on_rtsp_auth") - public RtspAuthResp onRtspAuth(@RequestBody RtspAuthReq req) { - return service.onRtspAuth(req); - } - - /** - * shell登录鉴权,ZLMediaKit提供简单的telnet调试方式 - * 使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。 - */ - @PostMapping(value = "/on_shell_login") - public BaseEventResp onShellLogin(@RequestBody ShellLoginReq req) { - return service.onShellLogin(req); - } - - /** - * rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_stream_changed") - public BaseEventResp onStreamChanged(@RequestBody StreamChangedReq req) { - return service.onStreamChanged(req); - } - - /** - * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 - */ - @PostMapping(value = "/on_stream_none_reader") - public BaseEventResp onStreamNoneReader(@RequestBody StreamNoneReaderReq req) { - return service.onStreamNoneReader(req); - } - - /** - * 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_stream_not_found") - public BaseEventResp onStreamNotFound(@RequestBody StreamNotFoundReq req) { - return service.onStreamNotFound(req); - } - - /** - * 服务器启动事件,可以用于监听服务器崩溃重启;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_server_started") - public BaseEventResp onServerStarted(@RequestBody ServerConfig req) { - return service.onServerStarted(req); - } - - /** - * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 - */ - @PostMapping(value = "/on_server_keepalive") - public BaseEventResp onServerKeepalive(@RequestBody ServerKeepaliveReq req) { - return service.onServerKeepalive(req); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java deleted file mode 100644 index b56e1e1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dite.znpt.monitor.media.zlm; - -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:39 - * @Description: 流媒体服务管理主业务 - */ -public interface ZlmService { - /** - * 点播视频 - * - * @param deviceCode 设备编码 - * @param channelCode 通道编码 - * @return 流信息 - */ - MediaItem play(String deviceCode, String channelCode); - - /** - * 失败的时候释放流媒体资源 - * - * @param deviceCode 设备编码 - * @param channelCode 通道编码 - */ - void release(String deviceCode, String channelCode); - - /** - * 失败的时候释放流媒体资源 - * - * @param media 流媒体信息 - */ - void release(MediaItem media); - - /** - * 停止点播 - * - * @param mediaServerId 流媒体服务器id,通过配置文件设置 - * @param streamId 流ID - */ - void display(String mediaServerId, String streamId); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java deleted file mode 100644 index 4f13dad..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.cache; - -import com.dite.znpt.monitor.media.zlm.dto.ServerItem; -import com.dite.znpt.service.impl.RedisService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @Author: huise23 - * @Date: 2022/8/30 15:46 - * @Description: - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MediaServerCache { - private final RedisService redisService; - private final String zlm_key = "zlm_media_server"; - - - public void putLoad(ServerItem serverItem) { - redisService.setCacheObject(zlm_key, serverItem); - } - - /** - * 获取zlm节点 - */ - public ServerItem getLoad() { - return redisService.getCacheObject(zlm_key); - } - - public void releaseSsrc(String ssrc) { - ServerItem item = getLoad(); - item.releaseSsrc(ssrc); - putLoad(item); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java deleted file mode 100644 index 27b7fbb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.cache; - -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; -import com.dite.znpt.service.impl.RedisService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @Author: huise23 - * @Date: 2022/8/30 15:46 - * @Description: - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MediaServerChannelCache { - private final RedisService redisService; - - private String getKey(String deviceCode, String channelCode) { - return StrUtil.format("zlm_media_server_channel:{}:{}", deviceCode, channelCode); - } - - private String getStreamKey(String mediaServerId, String streamId) { - return StrUtil.format("zlm_media_server_channel_stream_key:{}:{}", mediaServerId, streamId); - } - - public boolean has(String deviceCode, String channelCode) { - return redisService.hasKey(getKey(deviceCode, channelCode)); - } - - public MediaItem get(String deviceCode, String channelCode) { - return redisService.getCacheObject(getKey(deviceCode, channelCode)); - } - - public void put(String deviceCode, String channelCode, MediaItem media) { - String key = getKey(deviceCode, channelCode); - redisService.setCacheObject(key, media); - redisService.setCacheObject(getStreamKey(media.getConfig().getGeneralMediaServerId(), media.getStreamId()), key); - } - - public void delete(MediaItem media) { - redisService.deleteObject(getKey(media.getDeviceCode(), media.getChannelCode())); - redisService.deleteObject(getStreamKey(media.getConfig().getGeneralMediaServerId(), media.getStreamId())); - } - - public MediaItem getByStream(String mediaServerId, String streamId) { - String key = redisService.getCacheObject(getStreamKey(mediaServerId, streamId)); - if (StrUtil.isNotBlank(key)) { - return redisService.getCacheObject(key); - } - return null; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java deleted file mode 100644 index e2a7d07..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.config; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Data -@Configuration -@ConfigurationProperties(prefix = "zlm-config") -public class StreamMediaServerConfig { - - @ApiModelProperty(value = "'流媒体名称'") - private String mediaName; - - @ApiModelProperty(value = "流媒体服务商") - private String mediaService; - - @ApiModelProperty(value = "公网ip") - private String publicHost; - - @ApiModelProperty(value = "接口ip") - private String apiHost; - - @ApiModelProperty(value = "接口端口") - private Integer apiPort; - - @ApiModelProperty(value = "密钥") - private String secretKey; - - @ApiModelProperty(value = "流id前缀") - private String streamPrefix; - - @ApiModelProperty(value = "rtp ip") - private String rtpHost; - - @ApiModelProperty(value = "rtp 端口") - private Integer rtpPort; - - @ApiModelProperty(value = "动态端口起始值") - private String dynamicPortStart; - - @ApiModelProperty(value = "动态端口结束值") - private String dynamicPortEnd; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java deleted file mode 100644 index a39c8c4..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.media.zlm.dto.resp.RtpInfoResp; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 15:41 - * @Description: - */ -@Data -@NoArgsConstructor -@Accessors(chain = true) -public class MediaItem implements Serializable { - private static final long serialVersionUID = -6679610697837602559L; - /** - * 设备编码 - */ - private String deviceCode; - /** - * 通道编码 - */ - private String channelCode; - /** - * 节点信息ID - */ - private String configId; - /** - * 节点信息ID - */ - private ServerInfo server; - /** - * 节点格式信息 - */ - private List formatList; - /** - * 节点配置信息 - */ - private ServerConfig config; - /** - * 流ID - */ - private String streamId; - /** - * 播放流信息 - */ - private RtpInfoResp rtp; - /** - * Rtp服务监听端口 - */ - private Integer rtpPort; - /** - * SSRC源地址 - */ - private String ssrc; - /** - * rtmp播放地址 - */ - private String rtmpUrl; - /** - * rtmpSsl播放地址 - */ - private String rtmpSslUrl; - /** - * rtsp播放地址 - */ - private String rtspUrl; - /** - * rtspSsl播放地址 - */ - private String rtspSslUrl; - - /** - * rtc流地址 - */ - private String rtc; - - /** - * rtcs流地址 - */ - private String rtcs; - - /** - * 是否缓存 - */ - private Boolean isCache; - - public List getFormatList(String mediaRouter) { - if (StrUtil.isNotBlank(streamId)) { - formatList.forEach(item -> item.generateUrl(server.getApiHost(), streamId, config, mediaRouter)); - } - return formatList; - } - - public String getRtmpUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return StrUtil.format("rtmp://{}:{}/rtp/{}", server.getApiHost(), config.getRtmpPort(), streamId); - } - - public String getRtmpSslUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return config.getRtspSslPort() > 0 ? StrUtil.format("rtmps://{}:{}/rtp/{}", server.getApiHost(), config.getRtspSslPort(), streamId) : ""; - } - - - public String getRtspUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return StrUtil.format("rtsp://{}:{}/rtp/{}", server.getApiHost(), config.getRtspPort(), streamId); - } - - public String getRtspSslUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return config.getRtspSslPort() > 0 ? StrUtil.format("rtsps://{}:{}/rtp/{}", server.getApiHost(), config.getRtspSslPort(), streamId) : ""; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java deleted file mode 100644 index 62b51d7..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java +++ /dev/null @@ -1,852 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.annotation.JSONField; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.req.BaseReq; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:54 - * @Description: 服务器配置 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class ServerConfig extends BaseReq { - // ----------------------------------------------- api ----------------------------------------------- - /** - * 是否调试http api,启用调试后,会打印每次http请求的内容和回复 - * apiDebug=1 - */ - @JSONField(name = "api.apiDebug") - private Integer apiDebug; - /** - * 一些比较敏感的http api在访问时需要提供secret,否则无权限调用 - * 如果是通过127.0.0.1访问,那么可以不提供secret - * secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc - */ - @JSONField(name = "api.secret") - private String apiSecret; - /** - * 截图保存路径根目录,截图通过http api(/index/api/getSnap)生成和获取 - * snapRoot=./www/snap/ - */ - @JSONField(name = "api.snapRoot") - private String apiSnapRoot; - /** - * 默认截图图片,在启动FFmpeg截图后但是截图还未生成时,可以返回默认的预设图片 - * defaultSnap=./www/logo.png - */ - @JSONField(name = "api.defaultSnap") - private String apiDefaultSnap; - // ----------------------------------------------- ffmpeg ----------------------------------------------- - /** - * FFmpeg可执行程序路径,支持相对路径/绝对路径 - * bin=/usr/bin/ffmpeg - */ - @JSONField(name = "ffmpeg.bin") - private String ffmpegBin; - /** - * FFmpeg拉流再推流的命令模板,通过该模板可以设置再编码的一些参数 - * cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s - */ - @JSONField(name = "ffmpeg.cmd") - private String ffmpegCmd; - /** - * FFmpeg生成截图的命令,可以通过修改该配置改变截图分辨率或质量 - * snap=%s -i %s -y -f mjpeg -t 0.001 %s - */ - @JSONField(name = "ffmpeg.snap") - private String ffmpegSnap; - /** - * FFmpeg日志的路径,如果置空则不生成FFmpeg日志 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * log=./ffmpeg/ffmpeg.log - */ - @JSONField(name = "ffmpeg.log") - private String ffmpegLog; - /** - * 自动重启的时间(秒), 默认为0, 也就是不自动重启. 主要是为了避免长时间ffmpeg拉流导致的不同步现象 - * restart_sec=0 - */ - @JSONField(name = "ffmpeg.restart_sec") - private String ffmpegRestartSec; - // ----------------------------------------------- general ----------------------------------------------- - /** - * 是否启用虚拟主机 - * enableVhost=0 - */ - @JSONField(name = "general.enableVhost") - private Integer enableVhost; - /** - * 播放器或推流器在断开后会触发hook.on_flow_report事件(使用多少流量事件), - * flowThreshold参数控制触发hook.on_flow_report事件阈值,使用流量超过该阈值后才触发,单位KB - * flowThreshold=1024 - */ - @JSONField(name = "general.flowThreshold") - private Integer generalFlowThreshold; - /** - * 播放最多等待时间,单位毫秒 - * 播放在播放某个流时,如果该流不存在, - * ZLMediaKit会最多让播放器等待maxStreamWaitMS毫秒 - * 如果在这个时间内,该流注册成功,那么会立即返回播放器播放成功 - * 否则返回播放器未找到该流,该机制的目的是可以先播放再推流 - * maxStreamWaitMS=15000 - */ - @JSONField(name = "general.maxStreamWaitMS") - private Integer generalMaxStreamWaitMs; - /** - * 某个流无人观看时,触发hook.on_stream_none_reader事件的最大等待时间,单位毫秒 - * 在配合hook.on_stream_none_reader事件时,可以做到无人观看自动停止拉流或停止接收推流 - * streamNoneReaderDelayMS=20000 - */ - @JSONField(name = "general.streamNoneReaderDelayMS") - private Integer generalStreamNoneReaderDelayMs; - /** - * 是否全局添加静音aac音频,转协议时有效 - * 有些播放器在打开单视频流时不能秒开,添加静音音频可以加快秒开速度 - * addMuteAudio=1 - */ - @JSONField(name = "general.addMuteAudio") - private Integer generalAddMuteAudio; - /** - * 拉流代理时如果断流再重连成功是否删除前一次的媒体流数据,如果删除将重新开始, - * 如果不删除将会接着上一次的数据继续写(录制hls/mp4时会继续在前一个文件后面写) - * resetWhenRePlay=1 - */ - @JSONField(name = "general.resetWhenRePlay") - private Integer generalResetWhenRePlay; - /** - * 是否默认推流时转换成hls,hook接口(on_publish)中可以覆盖该设置 - * publishToHls=1 - */ - @JSONField(name = "general.publishToHls") - private Integer generalPublishToHls; - /** - * 是否默认推流时mp4录像,hook接口(on_publish)中可以覆盖该设置 - * publishToMP4=0 - */ - @JSONField(name = "general.publishToMP4") - private Integer generalPublishToMP4; - /** - * 合并写缓存大小(单位毫秒),合并写指服务器缓存一定的数据后才会一次性写入socket,这样能提高性能,但是会提高延时 - * 开启后会同时关闭TCP_NODELAY并开启MSG_MORE - * mergeWriteMS=0 - */ - @JSONField(name = "general.mergeWriteMS") - private Integer generalMergeWriteMS; - /** - * 全局的时间戳覆盖开关,在转协议时,对frame进行时间戳覆盖 - * 该开关对rtsp/rtmp/rtp推流、rtsp/rtmp/hls拉流代理转协议时生效 - * 会直接影响rtsp/rtmp/hls/mp4/flv等协议的时间戳 - * 同协议情况下不影响(例如rtsp/rtmp推流,那么播放rtsp/rtmp时不会影响时间戳) - * modifyStamp=0 - */ - @JSONField(name = "general.modifyStamp") - private Integer generalModifyStamp; - /** - * 服务器唯一id,用于触发hook时区别是哪台服务器 - * mediaServerId=your_server_id - */ - @JSONField(name = "general.mediaServerId") - private String generalMediaServerId; - /** - * 转协议是否全局开启或关闭音频 - * enable_audio=1 - */ - @JSONField(name = "general.enable_audio") - private Integer generalEnableAudio; - // ###### 以下是按需转协议的开关,在测试ZLMediaKit的接收推流性能时,请把下面开关置1 - // ###### 如果某种协议你用不到,你可以把以下开关置1以便节省资源(但是还是可以播放,只是第一个播放者体验稍微差点), - // ###### 如果某种协议你想获取最好的用户体验,请置0(第一个播放者可以秒开,且不花屏) - /** - * hls协议是否按需生成,如果hls.segNum配置为0(意味着hls录制),那么hls将一直生成(不管此开关) - * hls_demand=0 - */ - @JSONField(name = "general.hls_demand") - private Integer generalHlsDemand; - /** - * rtsp[s]协议是否按需生成 - * rtsp_demand=0 - */ - @JSONField(name = "general.rtsp_demand") - private Integer generalRtspDemand; - /** - * rtmp[s]、http[s]-flv、ws[s]-flv协议是否按需生成 - * rtmp_demand=0 - */ - @JSONField(name = "general.rtmp_demand") - private Integer generalRtmpDemand; - /** - * http[s]-ts协议是否按需生成 - * ts_demand=0 - */ - @JSONField(name = "general.ts_demand") - private Integer generalTsDemand; - /** - * http[s]-fmp4、ws[s]-fmp4协议是否按需生成 - * fmp4_demand=0 - */ - @JSONField(name = "general.fmp4_demand") - private Integer generalFmp4Demand; - /** - * 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track - * wait_track_ready_ms=10000 - */ - @JSONField(name = "general.wait_track_ready_ms") - private Integer generalWaitTrackReadyMs; - /** - * 如果流只有单Track,最多等待若干毫秒,超时后未收到其他Track的数据,则认为是单Track - * 如果协议元数据有声明特定track数,那么无此等待时间 - * wait_add_track_ms=3000 - */ - @JSONField(name = "general.wait_add_track_ms") - private Integer generalWaitAddTrackMs; - /** - * 如果track未就绪,我们先缓存帧数据,但是有最大个数限制,防止内存溢出 - * unready_frame_cache=100 - */ - @JSONField(name = "general.unready_frame_cache") - private Integer generalUnreadyFrameCache; - /** - * 推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。 - * 置0关闭此特性(推流断开会导致立即断开播放器) - * 此参数不应大于播放器超时时间 - * continue_push_ms=15000 - */ - @JSONField(name = "general.continue_push_ms") - private Integer generalContinuePushMs; - // ----------------------------------------------- hls ----------------------------------------------- - /** - * hls写文件的buf大小,调整参数可以提高文件io性能 - * fileBufSize=65536 - */ - @JSONField(name = "hls.fileBufSize") - private Integer hlsFileBufSize; - /** - * hls保存文件路径 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * filePath=./www - */ - @JSONField(name = "hls.filePath") - private String hlsFilePath; - /** - * hls最大切片时间 - * segDur=2 - */ - @JSONField(name = "hls.segDur") - private Integer hlsSegDur; - /** - * m3u8索引中,hls保留切片个数(实际保留切片个数大2~3个) - * 如果设置为0,则不删除切片,而是保存为点播 - * segNum=3 - */ - @JSONField(name = "hls.segNum") - private Integer hlsSegNum; - /** - * HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数 - * segRetain=5 - */ - @JSONField(name = "hls.segRetain") - private Integer hlsSegRetain; - /** - * 是否广播 ts 切片完成通知 - * broadcastRecordTs=0 - */ - @JSONField(name = "hls.broadcastRecordTs") - private Integer hlsBroadcastRecordTs; - /** - * 直播hls文件删除延时,单位秒,issue: #913 - * deleteDelaySec=0 - */ - @JSONField(name = "hls.deleteDelaySec") - private Integer hlsDeleteDelaySec; - /** - * 是否保留hls文件,此功能部分等效于segNum=0的情况 - * 不同的是这个保留不会在m3u8文件中体现 - * 0为不保留,不起作用 - * 1为保留,则不删除hls文件,如果开启此功能,注意磁盘大小,或者定期手动清理hls文件 - * segKeep=0 - */ - @JSONField(name = "hls.segKeep") - private Integer hlsSegKeep; - // ----------------------------------------------- hook ----------------------------------------------- - /** - * 在推流时,如果url参数匹对admin_params,那么可以不经过hook鉴权直接推流成功,播放时亦然 - * 该配置项的目的是为了开发者自己调试测试,该参数暴露后会有泄露隐私的安全隐患 - * admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc - */ - @JSONField(name = "hook.admin_params") - private String hookAdminParams; - /** - * 是否启用hook事件,启用后,推拉流都将进行鉴权 - * enable=0 - */ - @JSONField(name = "hook.enable") - private Integer hookHookEnable; - /** - * 播放器或推流器使用流量事件,置空则关闭 - * on_flow_report=https://127.0.0.1/index/hook/on_flow_report - */ - @JSONField(name = "hook.on_flow_report") - private String hookOnFlowReport; - /** - * 访问http文件鉴权事件,置空则关闭鉴权 - * on_http_access=https://127.0.0.1/index/hook/on_http_access - */ - @JSONField(name = "hook.on_http_access") - private String hookOnHttpAccess; - /** - * 播放鉴权事件,置空则关闭鉴权 - * on_play=https://127.0.0.1/index/hook/on_play - */ - @JSONField(name = "hook.on_play") - private String hookOnPlay; - /** - * 推流鉴权事件,置空则关闭鉴权 - * on_publish=https://127.0.0.1/index/hook/on_publish - */ - @JSONField(name = "hook.on_publish") - private String hookOnPublish; - /** - * 录制mp4切片完成事件 - * on_record_mp4=https://127.0.0.1/index/hook/on_record_mp4 - */ - @JSONField(name = "hook.on_record_mp4") - private String hookOnRecordMp4; - /** - * 录制 hls ts 切片完成事件 - * on_record_ts=https://127.0.0.1/index/hook/on_record_ts - */ - @JSONField(name = "hook.on_record_ts") - private String hookOnRecordTs; - /** - * rtsp播放鉴权事件,此事件中比对rtsp的用户名密码 - * on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth - */ - @JSONField(name = "hook.on_rtsp_auth") - private String hookOnRtspAuth; - /** - * rtsp播放是否开启专属鉴权事件,置空则关闭rtsp鉴权。rtsp播放鉴权还支持url方式鉴权 - * 建议开发者统一采用url参数方式鉴权,rtsp用户名密码鉴权一般在设备上用的比较多 - * 开启rtsp专属鉴权后,将不再触发on_play鉴权事件 - * on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm - */ - @JSONField(name = "hook.on_rtsp_realm") - private String hookOnRtspRealm; - /** - * 远程telnet调试鉴权事件 - * on_shell_login=https://127.0.0.1/index/hook/on_shell_login - */ - @JSONField(name = "hook.on_shell_login") - private String hookOnShellLogin; - /** - * 直播流注册或注销事件 - * on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed - */ - @JSONField(name = "hook.on_stream_changed") - private String hookOnStreamChanged; - /** - * 服务器启动报告,可以用于服务器的崩溃重启事件监听 - * on_server_started=https://127.0.0.1/index/hook/on_server_started - */ - @JSONField(name = "hook.on_server_started") - private String hookOnServerStarted; - /** - * server保活上报 - * on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive - */ - @JSONField(name = "hook.on_server_keepalive") - private String hookOnServerKeepalive; - /** - * 无人观看流事件,通过该事件,可以选择是否关闭无人观看的流。配合general.streamNoneReaderDelayMS选项一起使用 - * on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader - */ - @JSONField(name = "hook.on_stream_none_reader") - private String hookOnStreamNoneReader; - /** - * 播放时,未找到流事件,通过配合hook.on_stream_none_reader事件可以完成按需拉流 - * on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found - */ - @JSONField(name = "hook.on_stream_not_found") - private String hookOnStreamNotFound; - /** - * 发送rtp(startSendRtp)被动关闭时回调 - * on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped - */ - @JSONField(name = "hook.on_send_rtp_stopped") - private String hookOnSendRtpStopped; - /** - * hook api最大等待回复时间,单位秒 - * timeoutSec=10 - */ - @JSONField(name = "hook.timeoutSec") - private Integer hookTimeoutSec; - /** - * keepalive hook触发间隔,单位秒,float类型 - * alive_interval=10.0 - */ - @JSONField(name = "hook.alive_interval") - private Float hookAliveInterval; - /** - * hook通知失败重试次数,正整数。为0不重试,1时重试一次,以此类推 - * retry=1 - */ - @JSONField(name = "hook.retry") - private Integer hookRetry; - /** - * hook通知失败重试延时,单位秒,float型 - * retry_delay=3.0 - */ - @JSONField(name = "hook.retry_delay") - private Float hookRetryDelay; - // ----------------------------------------------- cluster ----------------------------------------------- - /** - * 设置源站拉流url模板, 格式跟printf类似,第一个%s指定app,第二个%s指定stream_id, - * 开启集群模式后,on_stream_not_found和on_stream_none_reader hook将无效. - * 溯源模式支持以下类型: - * rtmp方式: rtmp://127.0.0.1:1935/%s/%s - * rtsp方式: rtsp://127.0.0.1:554/%s/%s - * hls方式: http://127.0.0.1:80/%s/%s/hls.m3u8 - * http-ts方式: http://127.0.0.1:80/%s/%s.live.ts - * 支持多个源站,不同源站通过分号(;)分隔 - * origin_url= - */ - @JSONField(name = "cluster.origin_url") - private String clusterOriginUrl; - /** - * 溯源总超时时长,单位秒,float型;假如源站有3个,那么单次溯源超时时间为timeout_sec除以3 - * 单次溯源超时时间不要超过general.maxStreamWaitMS配置 - * timeout_sec=15 - */ - @JSONField(name = "cluster.timeout_sec") - private Integer clusterTimeoutSec; - /** - * 溯源失败尝试次数,-1时永久尝试 - * retry_count=3 - */ - @JSONField(name = "cluster.retry_count") - private Integer clusterRetryCount; - // ----------------------------------------------- http ----------------------------------------------- - /** - * http服务器字符编码,windows上默认gb2312 - * charSet=utf-8 - */ - @JSONField(name = "http.charSet") - private String httpCharSet; - /** - * http链接超时时间 - * keepAliveSecond=30 - */ - @JSONField(name = "http.keepAliveSecond") - private Integer httpKeepAliveSecond; - /** - * http请求体最大字节数,如果post的body太大,则不适合缓存body在内存 - * maxReqSize=40960 - */ - @JSONField(name = "http.maxReqSize") - private Integer httpMaxReqSize; - /** - * 404网页内容,用户可以自定义404网页 - * notFound=404 Not Found

您访问的资源不存在!


ZLMediaKit-4.0
- */ - @JSONField(name = "http.notFound") - private String httpNotFound; - /** - * http服务器监听端口 - * port=80 - */ - @JSONField(name = "http.port") - private Integer httpPort; - /** - * http文件服务器根目录 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * rootPath=./www - */ - @JSONField(name = "http.rootPath") - private String httpRootPath; - /** - * http文件服务器读文件缓存大小,单位BYTE,调整该参数可以优化文件io性能 - * sendBufSize=65536 - */ - @JSONField(name = "http.sendBufSize") - private Integer httpSendBufSize; - /** - * https服务器监听端口 - * sslport=443 - */ - @JSONField(name = "http.sslport") - private Integer httpSslPort; - /** - * 是否显示文件夹菜单,开启后可以浏览文件夹 - * dirMenu=1 - */ - @JSONField(name = "http.dirMenu") - private Integer httpDirMenu; - /** - * 虚拟目录, 虚拟目录名和文件路径使用","隔开,多个配置路径间用";"隔开 - * 例如赋值为 app_a,/path/to/a;app_b,/path/to/b 那么 - * 访问 http://127.0.0.1/app_a/file_a 对应的文件路径为 /path/to/a/file_a - * 访问 http://127.0.0.1/app_b/file_b 对应的文件路径为 /path/to/b/file_b - * 访问其他http路径,对应的文件路径还是在rootPath内 - * virtualPath= - */ - @JSONField(name = "http.virtualPath") - private String httpVirtualPath; - /** - * 禁止后缀的文件使用mmap缓存,使用“,”隔开 - * 例如赋值为 .mp4,.flv - * 那么访问后缀为.mp4与.flv 的文件不缓存 - * forbidCacheSuffix= - */ - @JSONField(name = "http.forbidCacheSuffix") - private String httpForbidCacheSuffix; - /** - * 可以把http代理前真实客户端ip放在http头中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388 - * 切勿暴露此key,否则可能导致伪造客户端ip - * forwarded_ip_header= - */ - @JSONField(name = "http.forwarded_ip_header") - private String httpForwardedIpHeader; - // ----------------------------------------------- multicast ----------------------------------------------- - /** - * rtp组播截止组播ip地址 - * addrMax=239.255.255.255 - */ - @JSONField(name = "multicast.addrMax") - private String multicastAddrMax; - /** - * rtp组播起始组播ip地址 - * addrMin=239.0.0.0 - */ - @JSONField(name = "multicast.addrMin") - private String multicastAddrMin; - /** - * 组播udp ttl - * udpTTL=64 - */ - @JSONField(name = "multicast.udpTTL") - private Integer multicastUdpTtl; - // ----------------------------------------------- record ----------------------------------------------- - /** - * mp4录制或mp4点播的应用名,通过限制应用名,可以防止随意点播 - * 点播的文件必须放置在此文件夹下 - * appName=record - */ - @JSONField(name = "record.appName") - private String recordAppName; - /** - * mp4录制写文件缓存,单位BYTE,调整参数可以提高文件io性能 - * fileBufSize=65536 - */ - @JSONField(name = "record.fileBufSize") - private Integer recordFileBufSize; - /** - * mp4录制保存、mp4点播根路径 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * filePath=./www - */ - @JSONField(name = "record.filePath") - private String recordFilePath; - /** - * mp4录制切片时间,单位秒 - * fileSecond=3600 - */ - @JSONField(name = "record.fileSecond") - private Integer recordFileSecond; - /** - * mp4点播每次流化数据量,单位毫秒, - * 减少该值可以让点播数据发送量更平滑,增大该值则更节省cpu资源 - * sampleMS=500 - */ - @JSONField(name = "record.sampleMS") - private Integer recordSampleMs; - /** - * mp4录制完成后是否进行二次关键帧索引写入头部 - * fastStart=0 - */ - @JSONField(name = "record.fastStart") - private Integer recordFastStart; - /** - * MP4点播(rtsp/rtmp/http-flv/ws-flv)是否循环播放文件 - * fileRepeat=0 - */ - @JSONField(name = "record.fileRepeat") - private Integer recordFileRepeat; - /** - * MP4录制是否当做播放器参与播放人数统计 - * mp4_as_player=0 - */ - @JSONField(name = "record.mp4_as_player") - private Integer recordMp4AsPlayer; - // ----------------------------------------------- rtmp ----------------------------------------------- - /** - * rtmp必须在此时间内完成握手,否则服务器会断开链接,单位秒 - * handshakeSecond=15 - */ - @JSONField(name = "rtmp.handshakeSecond") - private Integer rtmpHandshakeSecond; - /** - * rtmp超时时间,如果该时间内未收到客户端的数据, - * 或者tcp发送缓存超过这个时间,则会断开连接,单位秒 - * keepAliveSecond=15 - */ - @JSONField(name = "rtmp.keepAliveSecond") - private Integer rtmpKeepAliveSecond; - /** - * 在接收rtmp推流时,是否重新生成时间戳(很多推流器的时间戳着实很烂) - * modifyStamp=0 - */ - @JSONField(name = "rtmp.modifyStamp") - private Integer rtmpModifyStamp; - /** - * rtmp服务器监听端口 - * port=1935 - */ - @JSONField(name = "rtmp.port") - private Integer rtmpPort = 0; - /** - * rtmps服务器监听地址 - * sslport=0 - */ - @JSONField(name = "rtmp.sslport") - private Integer rtmpSslPort = 0; - // ----------------------------------------------- rtp ----------------------------------------------- - /** - * 音频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400 - * 加大该值会明显增加直播延时 - * audioMtuSize=600 - */ - @JSONField(name = "rtp.audioMtuSize") - private Integer rtpAudioMtuSize; - /** - * 视频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400 - * videoMtuSize=1400 - */ - @JSONField(name = "rtp.videoMtuSize") - private Integer rtpVideoMtuSize; - /** - * rtp包最大长度限制,单位KB,主要用于识别TCP上下文破坏时,获取到错误的rtp - * rtpMaxSize=10 - */ - @JSONField(name = "rtp.rtpMaxSize") - private Integer rtpMaxSize; - // ----------------------------------------------- rtp_proxy ----------------------------------------------- - /** - * 导出调试数据(包括rtp/ps/h264)至该目录,置空则关闭数据导出 - * dumpDir= - */ - @JSONField(name = "rtp_proxy.dumpDir") - private String proxyDumpDir; - /** - * udp和tcp代理服务器,支持rtp(必须是ts或ps类型)代理 - * port=10000 - */ - @JSONField(name = "rtp_proxy.port") - private Integer proxyPort; - /** - * rtp超时时间,单位秒 - * timeoutSec=15 - */ - @JSONField(name = "rtp_proxy.timeoutSec") - private Integer proxyTimeoutSec; - /** - * 随机端口范围,最少确保36个端口 - * 该范围同时限制rtsp服务器udp端口范围 - * port_range=30000-35000 - */ - @JSONField(name = "rtp_proxy.port_range") - private String proxyPortRange; - /** - * rtp h264 负载的pt - * h264_pt=98 - */ - @JSONField(name = "rtp_proxy.h264_pt") - private Integer proxyH264Pt; - /** - * rtp h265 负载的pt - * h265_pt=99 - */ - @JSONField(name = "rtp_proxy.h265_pt") - private Integer proxyH265Pt; - /** - * rtp ps 负载的pt - * ps_pt=96 - */ - @JSONField(name = "rtp_proxy.ps_pt") - private Integer proxyPsPt; - /** - * rtp ts 负载的pt - * ts_pt=33 - */ - @JSONField(name = "rtp_proxy.ts_pt") - private Integer proxyTsPt; - /** - * rtp opus 负载的pt - * opus_pt=100 - */ - @JSONField(name = "rtp_proxy.opus_pt") - private Integer proxyOpusPt; - /** - * rtp g711u 负载的pt - * g711u_pt=0 - */ - @JSONField(name = "rtp_proxy.g711u_pt") - private Integer proxyG711UPt; - /** - * rtp g711a 负载的pt - * g711a_pt=8 - */ - @JSONField(name = "rtp_proxy.g711a_pt") - private Integer proxyG711APt; - // ----------------------------------------------- rtc ----------------------------------------------- - /** - * rtc播放推流、播放超时时间 - * timeoutSec=15 - */ - @JSONField(name = "rtc.timeoutSec") - private Integer rtcTimeoutSec; - /** - * 本机对rtc客户端的可见ip,作为服务器时一般为公网ip,可有多个,用','分开,当置空时,会自动获取网卡ip - * 同时支持环境变量,以$开头,如"$EXTERN_IP"; 请参考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786 - * externIP= - */ - @JSONField(name = "rtc.externIP") - private String rtcExternIp; - /** - * rtc udp服务器监听端口号,所有rtc客户端将通过该端口传输stun/dtls/srtp/srtcp数据, - * 该端口是多线程的,同时支持客户端网络切换导致的连接迁移 - * 需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致 - * port=8000 - */ - @JSONField(name = "rtc.port") - private Integer rtcPort; - /** - * 设置remb比特率,非0时关闭twcc并开启remb。该设置在rtc推流时有效,可以控制推流画质 - * 目前已经实现twcc自动调整码率,关闭remb根据真实网络状况调整码率 - * rembBitRate=0 - */ - @JSONField(name = "rtc.rembBitRate") - private Integer rtcRembBitRate; - /** - * rtc支持的音频codec类型,在前面的优先级更高 - * 以下范例为所有支持的音频codec - * preferredCodecA=PCMU,PCMA,opus,mpeg4-generic - */ - @JSONField(name = "rtc.preferredCodecA") - private String rtcPreferredCodecA; - /** - * rtc支持的视频codec类型,在前面的优先级更高 - * 以下范例为所有支持的视频codec - * preferredCodecV=H264,H265,AV1X,VP9,VP8 - */ - @JSONField(name = "rtc.preferredCodecV") - private String rtcPreferredCodecV; - // ----------------------------------------------- srt ----------------------------------------------- - /** - * srt播放推流、播放超时时间,单位秒 - * timeoutSec=5 - */ - @JSONField(name = "srt.timeoutSec") - private Integer srtTimeoutSec; - /** - * srt udp服务器监听端口号,所有srt客户端将通过该端口传输srt数据, - * 该端口是多线程的,同时支持客户端网络切换导致的连接迁移 - * port=9000 - */ - @JSONField(name = "srt.port") - private Integer srtPort; - /** - * srt 协议中延迟缓存的估算参数,在握手阶段估算rtt ,然后latencyMul*rtt 为最大缓存时长,此参数越大,表示等待重传的时长就越大 - * latencyMul=4 - */ - @JSONField(name = "srt.latencyMul") - private Integer srtLatencyMul; - /** - * 包缓存的大小 - * pktBufSize=8192 - */ - @JSONField(name = "srt.pktBufSize") - private Integer srtPktBufSize; - // ----------------------------------------------- rtsp ----------------------------------------------- - /** - * rtsp专有鉴权方式是采用base64还是md5方式 - * authBasic=0 - */ - @JSONField(name = "rtsp.authBasic") - private Integer rtspAuthBasic; - /** - * rtsp拉流、推流代理是否是直接代理模式 - * 直接代理后支持任意编码格式,但是会导致GOP缓存无法定位到I帧,可能会导致开播花屏 - * 并且如果是tcp方式拉流,如果rtp大于mtu会导致无法使用udp方式代理 - * 假定您的拉流源地址不是264或265或AAC,那么你可以使用直接代理的方式来支持rtsp代理 - * 如果你是rtsp推拉流,但是webrtc播放,也建议关闭直接代理模式, - * 因为直接代理时,rtp中可能没有sps pps,会导致webrtc无法播放; 另外webrtc也不支持Single NAL Unit Packets类型rtp - * 默认开启rtsp直接代理,rtmp由于没有这些问题,是强制开启直接代理的 - * directProxy=1 - */ - @JSONField(name = "rtsp.directProxy") - private Integer rtspDirectProxy; - /** - * rtsp必须在此时间内完成握手,否则服务器会断开链接,单位秒 - * handshakeSecond=15 - */ - @JSONField(name = "rtsp.handshakeSecond") - private Integer rtspHandshakeSecond; - /** - * rtsp超时时间,如果该时间内未收到客户端的数据, - * 或者tcp发送缓存超过这个时间,则会断开连接,单位秒 - * keepAliveSecond=15 - */ - @JSONField(name = "rtsp.keepAliveSecond") - private Integer rtspKeepAliveSecond; - /** - * rtsp服务器监听地址 - * port=554 - */ - @JSONField(name = "rtsp.port") - private Integer rtspPort = 0; - /** - * rtsps服务器监听地址 - * sslport=0 - */ - @JSONField(name = "rtsp.sslport") - private Integer rtspSslPort = 0; - // ----------------------------------------------- shell ----------------------------------------------- - /** - * 调试telnet服务器接受最大bufffer大小 - * maxReqSize=1024 - */ - @JSONField(name = "shell.maxReqSize") - private Integer shellMaxReqSize; - /** - * 调试telnet服务器监听端口 - * port=0 - */ - @JSONField(name = "shell.port") - private Integer shellPort; - - public void refreshHook(String ip, String port, StreamMediaServerConfig server) { - String host = ip + ":" + port; - this.hookOnFlowReport = StrUtil.format("http://{}/index/hook/on_flow_report", host); - this.hookOnHttpAccess = StrUtil.format("http://{}/index/hook/on_http_access", host); - this.hookOnPlay = StrUtil.format("http://{}/index/hook/on_play", host); - this.hookOnPublish = StrUtil.format("http://{}/index/hook/on_publish", host); - this.hookOnRecordMp4 = StrUtil.format("http://{}/index/hook/on_record_mp4", host); - this.hookOnRecordTs = StrUtil.format("http://{}/index/hook/on_record_ts", host); - this.hookOnRtspAuth = StrUtil.format("http://{}/index/hook/on_rtsp_auth", host); - this.hookOnRtspRealm = StrUtil.format("http://{}/index/hook/on_rtsp_realm", host); - this.hookOnShellLogin = StrUtil.format("http://{}/index/hook/on_shell_login", host); - this.hookOnStreamChanged = StrUtil.format("http://{}/index/hook/on_stream_changed", host); - this.hookOnStreamNoneReader = StrUtil.format("http://{}/index/hook/on_stream_none_reader", host); - this.hookOnStreamNotFound = StrUtil.format("http://{}/index/hook/on_stream_not_found", host); - this.hookOnServerStarted = StrUtil.format("http://{}/index/hook/on_server_started", host); - this.hookOnServerKeepalive = StrUtil.format("http://{}/index/hook/on_server_keepalive", host); -// this.hookOnSendRtpStopped = StrUtil.format("http://{}/index/hook/on_send_rtp_stopped", host); - this.hookOnSendRtpStopped = ""; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java deleted file mode 100644 index 143b1fc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:50 - * @Description: 节点基础信息 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class ServerInfo implements Serializable { - /** - * 节点地址 - */ - private String apiHost; - /** - * 节点端口 - */ - private Integer apiPort; - /** - * 节点秘钥 - */ - private String secretKey; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java deleted file mode 100644 index d590d3f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:50 - * @Description: 节点信息 - */ -@Data -@NoArgsConstructor -public class ServerItem implements Serializable { - - private static final long serialVersionUID = 2460404295026548536L; - /** - * 播流最大并发个数 - */ - public static final Integer MAX_PLAY_COUNT = 10000; - /** - * 节点信息ID - */ - private String configId; - /** - * 流ID前缀 - */ - private String streamPrefix; - /** - * 节点信息ID - */ - private ServerInfo server; - /** - * 节点格式信息 - */ - private List formatList; - /** - * 节点配置信息 - */ - private ServerConfig config; - /** - * 当前流信息 - */ - private List media; - /** - * 节点状态是否正常 - */ - private Boolean status; - /** - * 流媒体服务器已用的会话句柄 - */ - private Set usedSn; - - public ServerItem(StreamMediaServerConfig server, List formatList) { - this.streamPrefix = server.getStreamPrefix(); - this.server = new ServerInfo(server.getApiHost(), server.getApiPort(), server.getSecretKey()); - this.formatList = formatList; - this.status = false; - this.usedSn = new HashSet<>(); - } - - public String genPlaySsrc(String channelCode) { - if (this.usedSn.size() >= MAX_PLAY_COUNT) { - throw new ServiceException("ssrc已经用完!"); - } - int sn; - for (sn = 0; sn < MAX_PLAY_COUNT; sn++) { - if (!this.usedSn.contains(sn)) { - this.usedSn.add(sn); - break; - } - } - //return StrUtil.format("0{}{}", StrUtil.blankToDefault(streamPrefix, channelCode.substring(3, 8)), NumberUtil.decimalFormat("0000", sn)); - return channelCode; - } - - public void releaseSsrc(String ssrc) { - try { - Integer sn = NumberUtil.parseInt(ssrc.substring(6)); - usedSn.remove(sn); - } catch (Exception ignored) { - } - } - - public void setMedia(List media) { - this.media = media; - if (CollUtil.isNotEmpty(media)) { - media.forEach(item -> { - try { - Integer sn = NumberUtil.parseInt(StrUtil.isBlank(streamPrefix) ? item.getStream().substring(6) : item.getStream().replace("0" + streamPrefix, "")); - usedSn.add(sn); - } catch (Exception ignored) { - } - }); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java deleted file mode 100644 index a4125ae..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:24 - * @Description: - */ -@Data -public class BaseEventReq { - /** - * 服务器id,通过配置文件设置 - */ - private String mediaServerId; - /** - * 流应用名 - */ - private String app; - /** - * TCP链接唯一ID - */ - private String id; - /** - * 播放器ip - */ - private String ip; - /** - * 播放url参数 - */ - private String params; - /** - * 播放器端口号 - */ - private Integer port; - /** - * 播放的协议,可能是rtsp、rtmp、http - */ - private String schema; - /** - * 流ID - */ - private String stream; - /** - * 流虚拟主机 - */ - private String vhost; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java deleted file mode 100644 index 04b573f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:33 - * @Description: 请求响应基类 - */ -@Data -@Accessors(chain = true) -public class BaseEventResp { - /** - * code == 0时代表完全成功 - */ - private Integer code; - /** - * 失败提示 - */ - private String msg; - /** - * 失败具体原因 - */ - private String err; - /** - * 该rtsp流是否需要rtsp专有鉴权,空字符串代码不需要鉴权 - */ - private String realm; - /** - * 是否关闭推流或拉流 - */ - private Boolean close; - - public BaseEventResp setSuccess(){ - return this.setCode(0).setMsg("success").setErr(""); - } - - public static BaseEventResp success() { - return new BaseEventResp().setSuccess(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java deleted file mode 100644 index 1661a94..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:04 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class FlowReportReq extends BaseEventReq { - /** - * tcp链接维持时间,单位秒 - */ - private Integer duration; - /** - * true为播放器,false为推流器 - */ - private Boolean player; - /** - * 耗费上下行流量总和,单位字节 - */ - private Integer totalBytes; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java deleted file mode 100644 index dfae6d6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import cn.hutool.core.lang.Dict; -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:10 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class HttpAccessReq extends BaseEventReq { - /** - * http客户端请求header - */ - private Dict header; - /** - * 访问路径是文件还是目录 - */ - @JSONField(name = "is_dir") - private Boolean isDir; - /** - * 请求访问的文件或目录 - */ - private String path; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java deleted file mode 100644 index 51424d8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:15 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class HttpAccessResp extends BaseEventResp { - /** - * 该客户端能访问或被禁止的顶端目录,如果为空字符串,则表述为当前目录 - */ - private String path; - /** - * 本次授权结果的有效期,单位秒 - */ - private Integer second; - /** - * 服务器id,通过配置文件设置 - */ - private String mediaServerId; - - public static HttpAccessResp success() { - HttpAccessResp resp = new HttpAccessResp(); - resp.setSuccess(); - return resp.setSecond(600).setPath(""); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java deleted file mode 100644 index 2531052..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:19 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class PlayReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java deleted file mode 100644 index de324dc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:57 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class PublishReq extends BaseEventReq{ -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java deleted file mode 100644 index f16d943..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:27 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class PublishResp extends BaseEventResp { - /** - * 是否转换成hls协议 - */ - @JSONField(name = "enable_hls") - private Boolean enableHls; - /** - * 是否允许mp4录制 - */ - @JSONField(name = "enable_mp4") - private Boolean enableMp4; - /** - * 是否转rtsp协议 - */ - @JSONField(name = "enable_rtsp") - private Boolean enableRtsp; - /** - * 是否转rtmp/flv协议 - */ - @JSONField(name = "enable_rtmp") - private Boolean enableRtmp; - /** - * 是否转http-ts/ws-ts协议 - */ - @JSONField(name = "enable_ts") - private Boolean enableTs; - /** - * 是否转http-fmp4/ws-fmp4协议 - */ - @JSONField(name = "enable_fmp4") - private Boolean enableFmp4; - /** - * 转协议时是否开启音频 - */ - @JSONField(name = "enable_audio") - private Boolean enableAudio; - /** - * 转协议时,无音频是否添加静音aac音频 - */ - @JSONField(name = "add_mute_audio") - private Boolean addMuteAudio; - /** - * mp4录制文件保存根目录,置空使用默认 - */ - @JSONField(name = "mp4_save_path") - private String mp4SavePath; - /** - * mp4录制切片大小,单位秒 - */ - @JSONField(name = "mp4_max_second") - private Integer mp4MaxSecond; - /** - * hls文件保存保存根目录,置空使用默认 - */ - @JSONField(name = "hls_save_path") - private String hlsSavePath; - /** - * 断连续推延时,单位毫秒,置空使用配置文件默认值 - */ - @JSONField(name = "continue_push_ms") - private Long continuePushMs; - - public static PublishResp success() { - PublishResp resp = new PublishResp(); - resp.setSuccess(); - return resp; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java deleted file mode 100644 index 50142ec..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:32 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RecordMp4Req extends BaseEventReq { - /** - * 文件名 - */ - @JSONField(name = "file_name") - private String fileName; - /** - * 文件绝对路径 - */ - @JSONField(name = "file_path") - private String filePath; - /** - * 文件大小,单位字节 - */ - @JSONField(name = "file_size") - private Integer fileSize; - /** - * 文件所在目录路径 - */ - private String folder; - /** - * 开始录制时间戳 - */ - @JSONField(name = "start_time") - private Integer startTime; - /** - * 录制时长,单位秒 - */ - @JSONField(name = "time_len") - private Integer timeLen; - /** - * http/rtsp/rtmp点播相对url路径 - */ - private String url; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java deleted file mode 100644 index bcb51e5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:35 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RtspAuthReq extends BaseEventReq { - /** - * 请求的密码是否必须为明文(base64鉴权需要明文密码) - */ - @JSONField(name = "must_no_encrypt") - private Boolean mustNoEncrypt; - /** - * rtsp播放鉴权加密realm - */ - private String realm; - /** - * 播放用户名 - */ - @JSONField(name = "user_name") - private String userName; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java deleted file mode 100644 index 2021549..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:35 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class RtspAuthResp extends BaseEventResp { - /** - * 用户密码 - */ - private String passwd; - /** - * 用户密码是否已加密 - */ - private Boolean encrypted; - - public static RtspAuthResp success() { - RtspAuthResp resp = new RtspAuthResp(); - resp.setSuccess(); - return resp.setEncrypted(false); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java deleted file mode 100644 index 8d6547f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:33 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RtspRealmReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java deleted file mode 100644 index d023328..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.dite.znpt.monitor.media.zlm.dto.resp.StatisticResp; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:43 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class ServerKeepaliveReq extends BaseEventReq { - private StatisticResp data; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java deleted file mode 100644 index 86016eb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:37 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class ShellLoginReq extends BaseEventReq { - /** - * 终端登录用户密码 - */ - private String passwd; - /** - * 终端登录用户名 - */ - @JSONField(name = "user_name") - private String userName; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java deleted file mode 100644 index cd90632..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:38 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamChangedReq extends MediaResp { - /** - * 流注册或注销 - */ - private Boolean regist; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java deleted file mode 100644 index 65e34bf..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:40 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamNoneReaderReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java deleted file mode 100644 index 0ead9cc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:42 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamNotFoundReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java deleted file mode 100644 index 445aef0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:33 - * @Description: 请求响应基类 - */ -@Data -public class BaseReq implements Serializable { - /** - * api操作密钥(配置文件配置),如果操作ip是127.0.0.1,则不需要此参数 - */ - private String secret; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java deleted file mode 100644 index 2eb3044..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:51 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class CloseStreamReq extends StreamReq { - /** - * 是否强制关闭(有人在观看是否还关闭) - */ - private Integer force; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java deleted file mode 100644 index 54de5d0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:26 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class FFmpegSourceReq extends BaseReq { - /** - * FFmpeg拉流地址,支持任意协议或格式(只要FFmpeg支持即可) - */ - @JSONField(name = "src_url") - private String srcUrl; - /** - * FFmpeg rtmp推流地址,一般都是推给自己,例如rtmp://127.0.0.1/live/stream_form_ffmpeg - */ - @JSONField(name = "dst_url") - private String dstUrl; - /** - * FFmpeg推流成功超时时间 - */ - @JSONField(name = "timeout_ms") - private Integer timeoutMs; - /** - * 是否开启hls录制 - */ - @JSONField(name = "enable_hls") - private Integer enableHls; - /** - * 是否开启mp4录制 - */ - @JSONField(name = "enable_mp4") - private Integer enableMp4; - /** - * 配置文件中FFmpeg命令参数模板key(非内容),置空则采用默认模板:ffmpeg.cmd - */ - @JSONField(name = "ffmpeg_cmd_key") - private String ffmpegCmdKey; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java deleted file mode 100644 index dd01aa5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:21 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class GetAllSessionReq extends BaseReq{ - /** - *筛选本机端口,例如筛选rtsp链接:554 - */ - @JSONField(name = "local_port") - private Integer localPort; - /** - *筛选客户端ip - */ - @JSONField(name = "peer_ip") - private String peerIp; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java deleted file mode 100644 index 6b05d35..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:04 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class GetMp4RecordFileReq extends StreamReq { - /** - * 流的录像日期,格式为2020-02-01,如果不是完整的日期,那么是搜索录像文件夹列表,否则搜索对应日期下的mp4文件列表 - */ - private String period; - /** - * 自定义搜索路径,与startRecord方法中的customized_path一样,默认为配置文件的路径 - */ - @JSONField(name = "customized_path") - private String customizedPath; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java deleted file mode 100644 index 82c454d..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:24 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@AllArgsConstructor -public class IdReq extends BaseReq { - /** - * 客户端唯一id,可以通过getAllSession接口获取 - */ - private Long id; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java deleted file mode 100644 index 91ebcd9..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:30 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@AllArgsConstructor -public class KeyReq extends BaseReq { - /** - * addStreamProxy接口返回的key - */ - private String key; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java deleted file mode 100644 index 4e3dc21..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:11 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RecordReq extends StreamReq { - /** - * 0为hls,1为mp4 - */ - private Integer type; - /** - * 录像保存目录 - */ - @JSONField(name = "customized_path") - private String customizedPath; - /** - * mp4录像切片时间大小,单位秒,置0则采用配置项 - */ - @JSONField(name = "max_second") - private Integer maxSecond; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java deleted file mode 100644 index a7003e7..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:17 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public class RtpServerReq extends BaseReq { - /** - * 接收端口,0则为随机端口 - */ - private Integer port; - /** - * 启用UDP监听的同时是否监听TCP端口 - */ - @JSONField(name = "enable_tcp") - private Integer enableTcp; - /** - * 该端口绑定的流ID,该端口只能创建这一个流(而不是根据ssrc创建多个) - */ - @JSONField(name = "stream_id") - private String streamId; - - public RtpServerReq(Integer port, Integer enableTcp, String streamId) { - this.port = port; - this.enableTcp = enableTcp; - this.streamId = streamId; - } - - public RtpServerReq(Integer enableTcp, String streamId) { - this(0, enableTcp, streamId); - } - - public RtpServerReq(String streamId) { - this(1, streamId); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java deleted file mode 100644 index 20807df..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:23 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class SendRtpReq extends StreamReq { - /** - * 推流的rtp的ssrc,指定不同的ssrc可以同时推流到多个服务器 - */ - private String ssrc; - /** - * 目标ip或域名 - */ - @JSONField(name = "dst_url") - private String dstUrl; - /** - * 目标端口 - */ - @JSONField(name = "dst_port") - private Integer dstPort; - /** - * 是否为udp模式,否则为tcp模式 - */ - @JSONField(name = "is_udp") - private Integer isUdp; - /** - * 使用的本机端口,为0或不传时默认为随机端口 - */ - @JSONField(name = "src_port") - private Integer srcPort; - /** - * 使用的本机端口,为0或不传时默认为随机端口 - */ - private Integer pt; - /** - * 发送时,rtp的负载类型。为1时,负载为ps;为0时,为es;不传时默认为1 - */ - @JSONField(name = "use_ps") - private Integer usePs; - /** - * 当use_ps 为0时,有效。为1时,发送音频;为0时,发送视频;不传时默认为0 - */ - @JSONField(name = "only_audio") - private Integer onlyAudio; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java deleted file mode 100644 index 548cfd7..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:14 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class SnapReq extends BaseReq { - /** - * 需要截图的url,可以是本机的,也可以是远程主机的 - */ - private String url; - /** - * 截图失败超时时间,防止FFmpeg一直等待截图 - */ - @JSONField(name = "timeout_sec") - private Integer timeoutSec; - /** - * 截图的过期时间,该时间内产生的截图都会作为缓存返回 - */ - @JSONField(name = "expire_sec") - private Integer expireSec; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java deleted file mode 100644 index a53d2dc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:30 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@AllArgsConstructor -public class StreamIdReq extends BaseReq { - /** - * RTP的ssrc,16进制字符串或者是流的id(openRtpServer接口指定) - */ - @JSONField(name = "stream_id") - private String streamId; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java deleted file mode 100644 index 8481f0a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:19 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamProxyReq extends StreamReq { - /** - * 拉流地址,例如rtmp://live.hkstv.hk.lxdns.com/live/hks2 Y - */ - private String url; - /** - * 拉流重试次数,默认为-1无限重试 - */ - @JSONField(name = "retry_count") - private Integer retryCount; - /** - * rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 - */ - @JSONField(name = "rtp_type") - private Integer rtpType; - /** - * 拉流超时时间,单位秒,float类型 - */ - @JSONField(name = "timeout_sec") - private Integer timeoutSec; - /** - * 是否转换成hls协议 - */ - @JSONField(name = "enable_hls") - private Integer enableHls; - /** - * 是否允许mp4录制 - */ - @JSONField(name = "enable_mp4") - private Integer enableMp4; - /** - * 是否转rtsp协议 - */ - @JSONField(name = "enable_rtsp") - private Integer enableRtsp; - /** - * 是否转rtmp/flv协议 - */ - @JSONField(name = "enable_rtmp") - private Integer enableRtmp; - /** - * 是否转http-ts/ws-ts协议 - */ - @JSONField(name = "enable_ts") - private Integer enableTs; - /** - * 是否转http-fmp4/ws-fmp4协议 - */ - @JSONField(name = "enable_fmp4") - private Integer enableFmp4; - /** - * 转协议时是否开启音频 - */ - @JSONField(name = "enable_audio") - private Integer enableAudio; - /** - * 转协议时,无音频是否添加静音aac音频 - */ - @JSONField(name = "add_mute_audio") - private Integer addMuteAudio; - /** - * mp4录制文件保存根目录,置空使用默认 - */ - @JSONField(name = "mp4_save_path") - private String mp4SavePath; - /** - * mp4录制切片大小,单位秒 - */ - @JSONField(name = "mp4_max_second") - private Integer mp4MaxSecond; - /** - * hls文件保存保存根目录,置空使用默认 - */ - @JSONField(name = "hls_save_path") - private String hlsSavePath; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java deleted file mode 100644 index 6729ba1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:50 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamPusherProxyReq extends StreamReq { - /** - * 目标转推url,带参数需要自行url转义 - */ - @JSONField(name = "dst_url") - private String dstUrl; - /** - * 转推失败重试次数,默认无限重试 - */ - @JSONField(name = "retry_count") - private Integer retryCount; - /** - * rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 - */ - @JSONField(name = "rtp_type") - private Integer rtpType; - /** - * 拉流超时时间,单位秒,float类型 - */ - @JSONField(name = "timeout_sec") - private Float timeoutSec; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java deleted file mode 100644 index 404369a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:05 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class StreamReq extends BaseReq { - /** - * 协议,例如 rtsp或rtmp - */ - private String schema; - /** - * 筛选虚拟主机,例如__defaultVhost__ - */ - private String vhost; - /** - * 筛选应用名,例如 live - */ - private String app; - /** - * 筛选流id,例如 test - */ - private String stream; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java deleted file mode 100644 index d6cfa48..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import lombok.Data; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:33 - * @Description: 请求响应基类 - */ -@Data -public class BaseResp { - /** - * code == 0时代表完全成功 - */ - private Integer code; - /** - * 失败提示 - */ - private String msg; - /** - * 失败具体原因 - */ - private String result; - /** - * 返回数据 - */ - private String data; - /** - * 配置项变更个数 - */ - private Integer changed; - /** - * false:未录制,true:正在录制 - */ - private Boolean status; - /** - * 接收端口,方便获取随机端口号 - */ - private Integer port; - /** - * 是否找到记录并关闭 - */ - private Integer hit; - - public String getMsg() { - return StrUtil.format("{}:{}", code, msg); - } - - public Boolean isSuccess() { - return code == 0; - } - - public T getData(Class clazz) { - return JSON.parseObject(data, clazz); - } - - public List getList(Class clazz) { - return JSON.parseArray(data, clazz); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java deleted file mode 100644 index aa0bf8e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:59 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class CloseStreamResp extends BaseResp { - /** - * 筛选命中的流个数 - */ - @JSONField(name = "count_hit") - private Integer countHit; - /** - * 被关闭的流个数,可能小于count_hit - */ - @JSONField(name = "count_closed") - private Integer countClosed; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java deleted file mode 100644 index 942b099..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.dite.znpt.monitor.media.zlm.dto.event.BaseEventReq; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:18 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class MediaResp extends BaseEventReq implements Serializable { - private static final long serialVersionUID = -8710934021370904914L; - - /** - * 本协议观看人数 - */ - private Integer readerCount; - /** - * 观看总人数,包括hls/rtsp/rtmp/http-flv/ws-flv - */ - private Integer totalReaderCount; - /** - * 客户端和服务器网络信息,可能为null类型 - */ - private OriginSock originSock; - /** - * 产生源类型,包括 unknown = 0, rtmp_push = 1, rtsp_push = 2, rtp_push = 3, pull = 4, ffmpeg_pull = 5, mp4_vod = 6, device_chn = 7 - */ - private Integer originType; - /** - * 产生源类型 - */ - private String originTypeStr; - /** - * 产生源的url - */ - private String originUrl; - /** - * GMT unix系统时间戳,单位秒 - */ - private Long createStamp; - /** - * 存活时间,单位秒 - */ - private Long aliveSecond; - /** - * 数据产生速度,单位byte/s - */ - private Long bytesSpeed; - /** - * 音视频轨道 - */ - private List tracks; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java deleted file mode 100644 index f39ea4f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import lombok.Data; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:08 - * @Description: - */ -@Data -public class Mp4RecordFileResp { - /** - * 文件列表 - */ - private List paths; - /** - * 根路径 - */ - private String rootPath; -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java deleted file mode 100644 index 5ca64f3..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:20 - * @Description: - */ -@Data -public class OriginSock implements Serializable { - private static final long serialVersionUID = 5628294142872524316L; - - private String identifier; - @JSONField(name = "local_ip") - private String localIp; - @JSONField(name = "local_port") - private Integer localPort; - @JSONField(name = "peer_ip") - private String peerIp; - @JSONField(name = "peer_port") - private Integer peerPort; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java deleted file mode 100644 index b8654a5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:32 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RtpInfoResp extends BaseResp { - /** - * 是否存在 - */ - private Boolean exist; - /** - * 推流客户端ip - */ - @JSONField(name = "peer_ip") - private String peerIp; - /** - * 客户端端口号 - */ - @JSONField(name = "peer_port") - private Integer peerPort; - /** - * 本地监听的网卡ip - */ - @JSONField(name = "local_ip") - private String localIp; - /** - * 本地监听端口号 - */ - @JSONField(name = "local_port") - private Integer localPort; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java deleted file mode 100644 index 1a5267f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:22 - * @Description: - */ -@Data -public class RtpServerResp { - /** - * 绑定的端口号 - */ - private Integer port; - /** - * 绑定的流ID - */ - @JSONField(name = "stream_id") - private String streamId; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java deleted file mode 100644 index eaf6119..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:04 - * @Description: - */ -@Data -public class SessionResp { - /** - * 该tcp链接唯一id - */ - private Long id; - /** - * 本机网卡ip - */ - @JSONField(name = "local_ip") - private String localIp; - /** - * 本机端口号 (这是个rtmp播放器或推流器) - */ - @JSONField(name = "local_port") - private Integer localPort; - /** - * 客户端ip - */ - @JSONField(name = "peer_ip") - private String peerIp; - /** - * 客户端端口号 - */ - @JSONField(name = "peer_port") - private Integer peerPort; - /** - * 客户端TCPSession typeid - */ - private String typeid; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java deleted file mode 100644 index f464784..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:47 - * @Description: - */ -@Data -public class StatisticResp { - private Integer Buffer; - private Integer BufferLikeString; - private Integer BufferList; - private Integer BufferRaw; - private Integer Frame; - private Integer FrameImp; - private Integer MediaSource; - private Integer MultiMediaSourceMuxer; - private Integer RtmpPacket; - private Integer RtpPacket; - private Integer Socket; - private Integer TcpClient; - private Integer TcpServer; - private Integer TcpSession; - private Integer UdpServer; - private Integer UdpSession; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java deleted file mode 100644 index 9c0257e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import lombok.Data; - - - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:40 - * @Description: 各epoll(或select)线程负载以及延时 - */ -@Data -public class ThreadsLoadResp { - /** - * 该线程延时 - */ - private Integer delay; - /** - * 该线程负载 - */ - private Integer load; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java deleted file mode 100644 index e7307aa..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:25 - * @Description: - */ -@Data -public class Track implements Serializable { - private static final long serialVersionUID = 5317048895056912057L; - /** - * 音频通道数 - */ - private Integer channels; - /** - * H264 = 0, H265 = 1, AAC = 2, G711A = 3, G711U = 4 - */ - @JSONField(name = "codec_id") - private Integer codecId; - /** - * 编码类型名称 - */ - @JSONField(name = "codec_id_name") - private String codecIdName; - /** - * Video = 0, Audio = 1 - */ - @JSONField(name = "codec_type") - private Integer codecType; - /** - * 轨道是否准备就绪 - */ - private Boolean ready; - /** - * 音频采样位数 - */ - @JSONField(name = "sample_bit") - private Integer sampleBit; - /** - * 音频采样率 - */ - @JSONField(name = "sample_rate") - private Integer sampleRate; - /** - * 视频fps - */ - private Integer fps; - /** - * 视频高 - */ - private Integer height; - /** - * 视频宽 - */ - private Integer width; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java deleted file mode 100644 index 215715c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.enums; - -import lombok.Getter; - -/** - * @Author: huise23 - * @Date: 2022/8/31 10:29 - * @Description: - */ -@Getter -public enum MediaFormatType { - /** - * FLV - */ - flv(".live.flv"), - /** - * MP4 - */ - mp4(".live.mp4"), - /** - * HLS - */ - hls("/hls.m3u8"), - /** - * RTS - */ - rts(".live.ts"); - - private final String suffix; - - MediaFormatType(String suffix) { - this.suffix = suffix; - } - - public static String getSuffix(String name) { - for (MediaFormatType value : MediaFormatType.values()) { - if (value.name().equals(name)) { - return value.getSuffix(); - } - } - return ""; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java deleted file mode 100644 index f1e20ce..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.impl; - -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.BooleanUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson.JSON; -import com.dite.znpt.monitor.media.zlm.ZlmApi; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.ServerInfo; -import com.dite.znpt.monitor.media.zlm.dto.req.*; -import com.dite.znpt.monitor.media.zlm.dto.resp.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:22 - * @Description: - */ -@Service -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ZlmApiImpl implements ZlmApi { - private final HttpServletResponse response; - - public V post(ServerInfo server, String url, T req, Class clazz) { - url = StrUtil.format("http://{}:{}/index/api/{}", server.getApiHost(), server.getApiPort(), url); - log.info("ZLM:" + url); - log.info("REQ:" + req); - req.setSecret(server.getSecretKey()); - String respStr = HttpUtil.post(url, JSON.toJSONString(req)); - V resp = JSON.parseObject(respStr, clazz); - if (resp.isSuccess()) { - return resp; - } - throw new RuntimeException(resp.getMsg()); - } - - public BaseResp post(ServerInfo server, String url, T req) { - return post(server, url, req, BaseResp.class); - } - - public V post(ServerInfo server, String url, Class clazz) { - return post(server, url, new BaseReq(), clazz); - } - - public BaseResp post(ServerInfo server, String url) { - return post(server, url, new BaseReq()); - } - - @Override - public List getApiList(ServerInfo server) { - return post(server, "getApiList").getList(String.class); - } - - @Override - public List getThreadsLoad(ServerInfo server) { - return post(server, "getThreadsLoad").getList(ThreadsLoadResp.class); - } - - @Override - public List getWorkThreadsLoad(ServerInfo server) { - return post(server, "getWorkThreadsLoad").getList(ThreadsLoadResp.class); - } - - @Override - public List getServerConfig(ServerInfo server) { - return post(server, "getServerConfig").getList(ServerConfig.class); - } - -// public static void main(String[] args) { -// ZlmApi zlmApi = new ZlmApiImpl(null); -// ServerInfo server = new ServerInfo("10.12.1.41", 8819, "035c73f7-bb6b-4889-a715-d9eb2d1925cc"); -// List config = zlmApi.getMediaList(server,new StreamReq()); -// System.out.println(JSONUtil.toJsonPrettyStr(config)); -// for (MediaResp mediaResp : config) { -// zlmApi.closeRtpServer(server,mediaResp.getStream() ); -// } -// } - - @Override - public Integer setServerConfig(ServerInfo server, ServerConfig config) { - BaseResp req = post(server, "setServerConfig", config); - return req.getChanged(); - } - - @Override - public Boolean restartServer(ServerInfo server) { - BaseResp req = post(server, "restartServer"); - return req.isSuccess(); - } - - @Override - public List getMediaList(ServerInfo server, StreamReq req) { - return post(server, "getMediaList", req).getList(MediaResp.class); - } - - @Override - public CloseStreamResp closeStreams(ServerInfo server, CloseStreamReq req) { - return post(server, "close_streams", req, CloseStreamResp.class); - } - - @Override - public List getAllSession(ServerInfo server, GetAllSessionReq req) { - return post(server, "getAllSession", req).getList(SessionResp.class); - } - - @Override - public Boolean kickSession(ServerInfo server, Long id) { - return post(server, "kick_session", new IdReq(id)).isSuccess(); - } - - @Override - public Integer kickSession(ServerInfo server, GetAllSessionReq req) { - return post(server, "kick_sessions", req, CloseStreamResp.class).getCountHit(); - } - - @Override - public String addStreamProxy(ServerInfo server, StreamProxyReq req) { - return post(server, "addStreamProxy", req).getData(Dict.class).getStr("key"); - } - - @Override - public Boolean delStreamProxy(ServerInfo server, String key) { - return post(server, "delStreamProxy", new KeyReq(key)).getData(Dict.class).getBool("flag"); - } - - @Override - public String addFfMpegSource(ServerInfo server, FFmpegSourceReq req) { - return post(server, "addFFmpegSource", req).getData(Dict.class).getStr("key"); - } - - @Override - public Boolean delFfMpegSource(ServerInfo server, String key) { - return post(server, "delFFmpegSource", new KeyReq(key)).getData(Dict.class).getBool("flag"); - } - - @Override - public RtpInfoResp getRtpInfo(ServerInfo server, String streamId) { - return post(server, "getRtpInfo", new StreamIdReq(streamId), RtpInfoResp.class); - } - - @Override - public Mp4RecordFileResp getMp4RecordFile(ServerInfo server, GetMp4RecordFileReq req) { - return post(server, "getMp4RecordFile", req).getData(Mp4RecordFileResp.class); - } - - @Override - public Boolean startRecord(ServerInfo server, RecordReq req) { - return BooleanUtil.toBoolean(post(server, "startRecord", req).getResult()); - } - - @Override - public Boolean stopRecord(ServerInfo server, RecordReq req) { - return BooleanUtil.toBoolean(post(server, "stopRecord", req).getResult()); - } - - @Override - public Boolean isRecording(ServerInfo server, RecordReq req) { - return post(server, "isRecording", req).getStatus(); - } - - @Override - public void getSnap(ServerInfo server, SnapReq req) throws IOException { - String url = StrUtil.format("http://{}:{}/index/api/getSnap", server.getApiHost(), server.getApiPort()); - req.setSecret(server.getSecretKey()); - url += "?" + HttpUtil.toParams(JSON.parseObject(JSON.toJSONString(req))); - HttpUtil.download(url, response.getOutputStream(), true); - } - - @Override - public Integer openRtpServer(ServerInfo server, RtpServerReq req) { - return post(server, "openRtpServer", req).getPort(); - } - - @Override - public Boolean closeRtpServer(ServerInfo server, String streamId) { - BaseResp closeRtpServer = post(server, "closeRtpServer", new StreamIdReq(streamId)); - return closeRtpServer.getHit() == 1; - } - - @Override - public List listRtpServer(ServerInfo server) { - return post(server, "listRtpServer").getList(RtpServerResp.class); - } - - @Override - public Integer startSendRtp(ServerInfo server, SendRtpReq req) { - return post(server, "startSendRtp", req, RtpInfoResp.class).getLocalPort(); - } - - @Override - public Integer startSendRtpPassive(ServerInfo server, SendRtpReq req) { - return post(server, "startSendRtpPassive", req, RtpInfoResp.class).getLocalPort(); - } - - @Override - public Boolean stopSendRtp(ServerInfo server, SendRtpReq req) { - return post(server, "stopSendRtp", req).isSuccess(); - } - - @Override - public StatisticResp getStatistic(ServerInfo server) { - return post(server, "getStatistic").getData(StatisticResp.class); - } - - @Override - public String addStreamPusherProxy(ServerInfo server, StreamPusherProxyReq req) { - return post(server, "addStreamPusherProxy", req).getData(Dict.class).getStr("key"); - } - - @Override - public Boolean delStreamPusherProxy(ServerInfo server, String key) { - return post(server, "delStreamPusherProxy", new KeyReq(key)).getData(Dict.class).getBool("flag"); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java deleted file mode 100644 index 2bc7a2e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.impl; - -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.event.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:32 - * @Description: - */ -@Service -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ZlmHookService { - private final ZlmService zlmService; - - /** - * TODO 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件, - * 阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。 - */ - public BaseEventResp onFlowReport(FlowReportReq req) { - log.debug("[ZLM] onFlowReport : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 访问http文件服务器上hls之外的文件时触发。 - */ - public HttpAccessResp onHttpAccess(HttpAccessReq req) { - log.debug("[ZLM] onHttpAccess : {}", req); - return HttpAccessResp.success(); - } - - /** - * TODO 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件; - * 如果流不存在,那么先触发on_play事件然后触发on_stream_not_found事件。 - * 播放rtsp流时,如果该流启动了rtsp专属鉴权(on_rtsp_realm)那么将不再触发on_play事件。 - */ - public BaseEventResp onPlay(PlayReq req) { - log.debug("[ZLM] onPlay : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO rtsp/rtmp/rtp推流鉴权事件。 - */ - public PublishResp onPublish(PublishReq req) { - System.out.println("[ZLM] 接收到推流信息"); - log.info("[ZLM] onPublish : {}", req); - return PublishResp.success(); - } - - /** - * TODO 录制mp4完成后通知事件;此事件对回复不敏感。 - */ - public BaseEventResp onRecordMp4(RecordMp4Req req) { - log.debug("[ZLM] onRecordMp4 : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。 - * 需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。 - */ - public BaseEventResp onRtspRealm(RtspRealmReq req) { - log.debug("[ZLM] onRtspRealm : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。 - */ - public RtspAuthResp onRtspAuth(RtspAuthReq req) { - log.debug("[ZLM] onRtspAuth : {}", req); - return RtspAuthResp.success(); - } - - /** - * TODO shell登录鉴权,ZLMediaKit提供简单的telnet调试方式 - * 使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。 - */ - public BaseEventResp onShellLogin(ShellLoginReq req) { - log.debug("[ZLM] onShellLogin : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 - */ - public BaseEventResp onStreamChanged(StreamChangedReq req) { - log.info("[ZLM] onStreamChanged 流信息 : {}", req); - return BaseEventResp.success(); - } - - /** - * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 - */ - public BaseEventResp onStreamNoneReader(StreamNoneReaderReq req) { - log.debug("[ZLM] onStreamNoneReader : {}", req); - zlmService.display(req.getMediaServerId(), req.getStream()); - return BaseEventResp.success().setClose(false); - } - - /** - * TODO 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 - */ - public BaseEventResp onStreamNotFound(StreamNotFoundReq req) { - log.debug("[ZLM] onStreamNotFound : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 服务器启动事件,可以用于监听服务器崩溃重启;此事件对回复不敏感。 - */ - public BaseEventResp onServerStarted(ServerConfig req) { - log.debug("[ZLM] onServerStarted : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 服务器定时上报时间,上报间隔可配置,默认10s上报一次 - */ - public BaseEventResp onServerKeepalive(ServerKeepaliveReq req) { - log.debug("[ZLM] onServerKeepalive : {}", req); - return BaseEventResp.success(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java deleted file mode 100644 index b4b52de..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.media.zlm.ZlmApi; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.media.zlm.cache.MediaServerCache; -import com.dite.znpt.monitor.media.zlm.cache.MediaServerChannelCache; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.ServerItem; -import com.dite.znpt.monitor.media.zlm.dto.req.RtpServerReq; -import com.dite.znpt.monitor.media.zlm.dto.req.StreamReq; -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import com.dite.znpt.monitor.media.zlm.dto.resp.RtpInfoResp; -import com.dite.znpt.monitor.service.StreamMediaFormatService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import java.util.List; - -import static com.dite.znpt.monitor.config.MediaFormatConfig.streamMediaFormatList; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:40 - * @Description: - */ -@Service -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -@EnableScheduling -public class ZlmServiceImpl implements ZlmService, ApplicationRunner { - private final StreamMediaFormatService formatService; - private final ZlmApi zlmApi; - private final MediaServerCache serverCache; - private final MediaServerChannelCache channelCache; - private final Environment environment; - private final StreamMediaServerConfig zlmConfig; - - @Value("${spring.profiles.active:dev}") - private String activeProfile; - @Value("${server.host:''}") - private String serverHost; - @Value("${server.port:''}") - private String serverPort; - - private String profile = "dev"; - - /** - * 系统启动加载服务器 - */ - @Override - public void run(ApplicationArguments args) throws Exception { - //TODO 媒体格式注入 - List formatList = streamMediaFormatList(); - ServerItem item = new ServerItem(zlmConfig, formatList); - try { - // 开发环境不去修改多媒体配置 -// if (!StrUtil.equalsIgnoreCase(activeProfile, profile)) { -// String host = StrUtil.blankToDefault(serverHost, IpUtils.getHostIp()); -// String port = StrUtil.blankToDefault(serverPort, environment.getProperty("server.port")); -// ServerConfig config = new ServerConfig(); -// config.refreshHook(host, port, zlmConfig); -// zlmApi.setServerConfig(item.getServer(), config); -// } - List configList = zlmApi.getServerConfig(item.getServer()); - item.setConfig(configList.get(0)); - item.setStatus(true); - } catch (Exception e) { - log.error("流服务器节点配置错误:", e); - item.setStatus(false); - } - //初始化参数 - serverCache.putLoad(item); - } - -// @Scheduled(cron = "*/10 * * * * ?") - public void heartbeat1() { - log.debug("开始心跳检查..."); - ServerItem item = serverCache.getLoad(); - // 获取服务器流信息 - try { - List media = zlmApi.getMediaList(item.getServer(), new StreamReq()); - item.setMedia(media); - item.setStatus(true); - } catch (Exception e) { - log.error("流服务器节点丢失:", e); - item.setStatus(false); - } - serverCache.putLoad(item); - } - - @Override - public MediaItem play(String deviceCode, String channelCode) { - // 获取通道信息 - MediaItem media; - if (channelCache.has(deviceCode, channelCode)) { - media = channelCache.get(deviceCode, channelCode); - } else { - media = new MediaItem().setDeviceCode(deviceCode).setChannelCode(channelCode); - } - media.setIsCache(true); - // 检查节点是否正常 - if (!checkServer(media.getConfigId())) { - // 获取负载最小的节点 - ServerItem server = serverCache.getLoad(); - if (!server.getStatus()) { - throw new ServiceException("无正常的流媒体节点可用!"); - } - media.setSsrc(server.genPlaySsrc(channelCode)); - media.setConfigId(server.getConfigId()); - media.setConfig(server.getConfig()); - media.setServer(server.getServer()); - media.setFormatList(server.getFormatList()); - media.setIsCache(false); - serverCache.putLoad(server); - } - // 检查播放流是否正常 - if (StrUtil.isNotBlank(media.getStreamId())) { - RtpInfoResp rtp = zlmApi.getRtpInfo(media.getServer(), media.getStreamId()); - if (rtp.getExist()) { - media.setRtp(rtp); - media.setIsCache(true); - return media; - } - } - // 不正常,需要重新拉流 - Integer rtpPort = zlmApi.openRtpServer(media.getServer(), new RtpServerReq(media.getSsrc())); - media.setRtpPort(rtpPort); - media.setStreamId(media.getSsrc()); - // 缓存链接信息 - channelCache.put(deviceCode, channelCode, media); - media.setIsCache(false); - return media; - } - - @Override - public void release(String deviceCode, String channelCode) { - // 获取通道信息 - MediaItem media = channelCache.get(deviceCode, channelCode); - release(media); - } - - @Override - public void release(MediaItem media) { - if (ObjectUtil.isNull(media)) { - return; - } - try { - List list = zlmApi.getMediaList(media.getServer(), new StreamReq().setStream(media.getStreamId())); - if (!CollUtil.isEmpty(list) && list.get(0).getTotalReaderCount() > 0) { - // 当前还有观看者 不释放资源 - return; - } - zlmApi.closeRtpServer(media.getServer(), media.getStreamId()); - } catch (Exception e) { - log.error("流媒体服务器调用失败:", e); - } - // 释放SSRC句柄 - serverCache.releaseSsrc(media.getSsrc()); - // 删除链接信息 - channelCache.delete(media); - } - - @Override - public void display(String mediaServerId, String streamId) { - // 获取通道信息 - MediaItem media = channelCache.getByStream(mediaServerId, streamId); - release(media); - } - - /** - * 检查节点是否正常 - */ - private boolean checkServer(String configId) { - if (ObjectUtil.isNull(configId)) { - return false; - } - ServerItem item = serverCache.getLoad(); - return ObjectUtil.isNotNull(item) && item.getStatus(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java deleted file mode 100644 index 6632114..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.req.VideoInfoReq; -import com.dite.znpt.monitor.domain.resp.VideoInfoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; -import com.dite.znpt.monitor.domain.vo.video.VideoPayResp; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:10 - * @Description: - */ -public interface DeviceVideoChannelService extends IService { - /** - * 查询视频通道列表 - * - * @param videoId 视频id - * @param keyword 查询条件 - * @return {@link PageResult < DeviceVideoChannelListResp >} - */ - PageResult selectDeviceVideoChannel(Long videoId, String keyword); - - /** - * 查询所有视频通道列表 - * - * @param keyword 查询条件 - * @return {@link PageResult< DeviceVideoChannelListResp>} - */ - PageResult selectAllDeviceVideoChannel(String keyword); - - /** - * 查询视频通道详情 - * - * @param channelCode - * @return {@link DeviceVideoChannelResp} - */ - DeviceVideoChannelResp getDeviceVideoChannelDetail(String channelCode); - - /** - * 编辑视频设备通道 - * - * @param channelId - * @param req - * @return - */ - void editDeviceVideoChannel(Long channelId, DeviceVideoChannelEditReq req); - - /** - * 根据通道id删除通道信息 - * - * @param channelIds - * @return {@link boolean} - */ - Result removeByChannelIds(List channelIds); - - /** - * 根据通道编码查询通道信息 - * - * @param channelCode 通道编码 - * @return 通道信息 - */ - DeviceVideoChannelEntity getByCode(String channelCode); - - /** - * 根据设备id查询设备通道 - * @param videoId 设备id - * @return {@link List< DeviceVideoChannelEntity>} - */ - List selectDeviceVideoChannelByVideoCode(Long videoId); - - /** - * 播放直播视频 - * - * @param channelCode - * @return - */ - VideoPayResp play(String channelCode); - - /** - * 是否在线 - * - * @param channelCode - * @return - */ - boolean isOnline(String channelCode); - - /** - * 停止播放直播 - * - * @param channelCode - * @return - */ - void stop(String channelCode); - - /** - * 下线视频设备下的所有通道 - * @param videoId - * @return - */ - void offlineByVideoId(Long videoId); - - /** - * 查询通道及视频信息 - * - * @param videoInfoReq 查询参数 - * @return {@link VideoInfoResp } - * @author huise23 - * @since 2024-12-03 13:54:52 - */ - List selectVideoInfoList(VideoInfoReq videoInfoReq); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java deleted file mode 100644 index 79ac330..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoNumResp; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:09 - * @Description: - */ -public interface DeviceVideoService extends IService { - - /** - * 查询视频设备列表 - * - * @param status 状态 - * @param keyword 设备编码或者设备名称 - * @return {@link PageResult< DeviceVideoListResp>} - */ - PageResult selectDeviceVideoList(String status, String keyword, String hostAddress); - - /** - * 查询视频设备数量 - * - * @return {@link DeviceVideoNumResp} - */ - DeviceVideoNumResp countDeviceVideoNum(); - - /** - * 编辑视频设备信息 - * - * @param videoId 视频设备id - * @param req 视频设备信息 - * @return - */ - void editDeviceVideo(Long videoId, DeviceVideoEditReq req); - - /** - * 删除视频设备 - * - * @param videoId 视频设备id - * @return - */ - Result removeByVideoId(Long videoId); - - /** - * 根据端口和host查询设备 - * - * @param host 地址 - * @param port 端口 - * @return 设备 - */ - DeviceVideoEntity getDeviceByHostAndPort(String host, int port); - - /** - * 设备离线 - * - * @param videoCode videoCode - */ - void offline(String videoCode); - - /** - * 上线设备 - * @param entity - * @return - */ - void online(DeviceVideoEntity entity); - - /** - * 判断是否注册已经失效 - * @param entity 设备信息 - * @return {@link boolean} - */ - boolean expire(DeviceVideoEntity entity); - - /** - * 根据 videoCode 获取设备 - * - * @param videoCode videoCode - * @return 设备 - */ - DeviceVideoEntity getByCode(String videoCode); - - /** - * 根据 videoCode 获取设备 - * - * @param channelCode - * @return 设备 - */ - DeviceVideoEntity getByChannelCode(String channelCode); - - /** - * 查询设备状态 - * @param videoId - * @return - */ - void queryDeviceStatus(Long videoId); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java b/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java deleted file mode 100644 index 11a53d1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.monitor.domain.entity.IpConfigEntity; -import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; - -import java.util.List; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表服务接口 - */ -public interface IpConfigService extends IService { - - /** - * 新增ip配置 - * @param req - */ - void configAdd(MonitorConfigAddReq req); - - /** - * 查询ip配置 - * @return - */ - List configList(); -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java b/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java deleted file mode 100644 index fa959bc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:58 - * @Description: - */ -public interface StreamMediaFormatService extends IService { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java deleted file mode 100644 index 931a754..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.constant.IotRespMessage; -import com.dite.znpt.monitor.constant.dict.CameraType; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.constant.dict.YesOrNo; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.req.VideoInfoReq; -import com.dite.znpt.monitor.domain.resp.VideoInfoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; -import com.dite.znpt.monitor.domain.vo.video.VideoPayResp; -import com.dite.znpt.monitor.mapper.DeviceVideoChannelMapper; -import com.dite.znpt.monitor.media.zlm.ZlmApi; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.media.zlm.cache.MediaServerChannelCache; -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; -import com.dite.znpt.monitor.media.zlm.dto.req.StreamReq; -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.utils.DictUtils; -import com.dite.znpt.util.PageUtil; -import com.github.pagehelper.PageInfo; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:10 - * @Description: - */ -@Service -public class DeviceVideoChannelServiceImpl extends ServiceImpl implements DeviceVideoChannelService { - - @Resource - private MediaServerChannelCache channelCache; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - @Resource - private ZlmService zlmService; - - @Resource - private ZlmApi zlmApi; - - @Resource - private SipConfig sipConfig; - - /** - * 查询视频通道列表 - * - * @param videoId 视频id - * @param keyword 查询条件 - * @return {@link PageResult < DeviceVideoChannelListResp >} - */ - @Override - public PageResult selectDeviceVideoChannel(Long videoId, String keyword) { - PageUtil.startPage(); - List list = this.baseMapper.selectDeviceVideoChannel(videoId, keyword); - return buildPageResult(list); - } - - /** - * 查询所有视频通道列表 - * - * @param keyword 查询条件 - * @return {@link PageResult< DeviceVideoChannelListResp>} - */ - @Override - public PageResult selectAllDeviceVideoChannel(String keyword) { - PageUtil.startPage(); - List list = this.baseMapper.selectAllDeviceVideoChannel(keyword); - return buildPageResult(list); - } - - private PageResult buildPageResult(List list) { - if (CollectionUtil.isEmpty(list)) { - return PageResult.ok(list, 0); - } - long total = new PageInfo<>(list).getTotal(); - list.stream().peek(resp -> { - resp.setCameraTypeLabel(DictUtils.getDictLabel(CameraType.class, resp.getCameraType())); - resp.setPtzControlLabel(DictUtils.getDictLabel(YesOrNo.class, resp.getPtzControl())); - resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); - }).collect(Collectors.toList()); - return PageResult.ok(list, total); - } - - /** - * 查询视频通道详情 - * - * @param channelCode - * @return {@link DeviceVideoChannelResp} - */ - @Override - public DeviceVideoChannelResp getDeviceVideoChannelDetail(String channelCode) { - return this.baseMapper.getDeviceVideoChannelDetail(channelCode); - } - - /** - * 编辑视频设备通道 - * - * @param channelId - * @param req - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void editDeviceVideoChannel(Long channelId, DeviceVideoChannelEditReq req) { - DeviceVideoChannelEntity entity = this.getById(channelId); - BeanUtil.copyProperties(req, entity); - entity.setUpdateTime(LocalDateTime.now()); - this.updateById(entity); - } - - /** - * 根据通道id删除通道信息 - * - * @param channelIds - * @return {@link boolean} - */ - @Transactional(rollbackFor = Exception.class) - @Override - public Result removeByChannelIds(List channelIds) { - List list = this.listByIds(channelIds); - List ids = list.stream().map(DeviceVideoChannelEntity::getChannelId).collect(Collectors.toList()); - if (ids.size() == list.size()) { - return Result.ok(this.removeByIds(ids)); - } else { - return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_DELETE); - } - } - - @Override - public DeviceVideoChannelEntity getByCode(String channelCode) { - return super.getOne(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class) - .eq(DeviceVideoChannelEntity::getChannelCode, channelCode) - .orderByDesc(DeviceVideoChannelEntity::getCreateTime) - .last("limit 1")); - } - - /** - * 根据设备国标编码查询设备通道 - * - * @param videoId 设备id - * @return {@link List< DeviceVideoChannelEntity>} - */ - @Override - public List selectDeviceVideoChannelByVideoCode(Long videoId) { - return this.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId, videoId)); - } - - /** - * 播放视频 - * - * @param channelCode - * @return - */ - @Override - public VideoPayResp play(String channelCode) { - DeviceVideoChannelEntity channelEntity = Optional.ofNullable(this.getByCode(channelCode)).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - DeviceVideoEntity videoEntity = Optional.ofNullable(deviceVideoService.getById(channelEntity.getVideoId())).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - MediaItem mediaItem = zlmService.play(videoEntity.getVideoCode(), channelEntity.getChannelCode()); - if (!mediaItem.getIsCache()) { - sipDeviceCommander.playStreamCmd(videoEntity, channelEntity.getChannelCode(), mediaItem.getSsrc(), mediaItem.getRtpPort(), mediaItem.getServer().getApiHost()); - } - return VideoPayResp.builder() - .mediaType(sipConfig.getMediaType()) - .streamMediaFormatList(mediaItem.getFormatList(sipConfig.getMediaRouter())) - .build(); - } - - /** - * 是否在线 - * - * @param channelCode - * @return - */ - @Override - public boolean isOnline(String channelCode) { - DeviceVideoChannelEntity channelEntity = this.getByCode(channelCode); - return Objects.nonNull(channelEntity) && channelEntity.getStatus().equals(DeviceStatus.ONLINE.getValue()); - } - - /** - * 停止播放直播 - * - * @param channelCode - * @return - */ - @Override - public void stop(String channelCode) { - DeviceVideoChannelEntity channelEntity = Optional.ofNullable(this.getByCode(channelCode)).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - DeviceVideoEntity videoEntity = Optional.ofNullable(deviceVideoService.getById(channelEntity.getVideoId())).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - MediaItem mediaItem = channelCache.get(videoEntity.getVideoCode(), channelEntity.getChannelCode()); - if (null != mediaItem) { - List list = zlmApi.getMediaList(mediaItem.getServer(), new StreamReq().setStream(mediaItem.getStreamId())); - if (CollectionUtil.isNotEmpty(list) && list.get(0).getTotalReaderCount() <= 1) { - // 当只有一个人观看时,想设备发送停止推流命令 - sipDeviceCommander.stopStreamCmd(mediaItem.getSsrc()); - } - zlmService.release(videoEntity.getVideoCode(), channelEntity.getChannelCode()); - } - } - - /** - * 下线视频设备下的所有通道 - * - * @param videoId - * @return - */ - @Override - public void offlineByVideoId(Long videoId) { - List list = this.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId, videoId)); - if (ObjectUtil.isNotNull(list)) { - this.updateBatchById( - list.stream().peek(entity -> { - entity.setUpdateTime(LocalDateTime.now()); - entity.setStatus(DeviceStatus.OFFLINE.getValue()); - }).collect(Collectors.toList()) - ); - } - } - - /** - * 查询通道及视频信息 - * - * @param videoInfoReq 查询参数 - * @return {@link VideoInfoResp } - * @author huise23 - * @since 2024-12-03 13:54:52 - */ - @Override - public List selectVideoInfoList(VideoInfoReq videoInfoReq) { - return this.baseMapper.selectVideoInfoList(videoInfoReq); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java deleted file mode 100644 index 8c00abb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.http.HttpStatus; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.constant.IotCacheConstants; -import com.dite.znpt.monitor.constant.IotDictConstants; -import com.dite.znpt.monitor.constant.IotRespMessage; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.constant.dict.SipTransferMode; -import com.dite.znpt.monitor.constant.dict.StreamTransferMode; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoNumResp; -import com.dite.znpt.monitor.mapper.DeviceVideoMapper; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.utils.DictUtils; -import com.dite.znpt.service.impl.RedisService; -import com.github.pagehelper.PageInfo; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:11 - * @Description: - */ -@Slf4j -@Service -public class DeviceVideoServiceImpl extends ServiceImpl implements DeviceVideoService { - - @Resource - private RedisService redisService; - - @Resource - private DeviceVideoChannelService deviceVideoChannelService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - /** - * 查询视频设备列表 - * - * @param status 状态 - * @param keyword 设备编码或者设备名称 - * @return {@link List < DeviceVideoListResp >} - */ - @Override - public PageResult selectDeviceVideoList(String status, String keyword, String hostAddress) { - List deviceVideoListResps = this.baseMapper.selectDeviceVideoList(status, keyword,hostAddress); - int total = (int) new PageInfo(deviceVideoListResps).getTotal(); - deviceVideoListResps = deviceVideoListResps.stream().peek(resp -> { - resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); - resp.setStreamModeLabel(DictUtils.getDictLabel(StreamTransferMode.class, resp.getStreamMode())); - resp.setTransportLabel(DictUtils.getDictLabel(SipTransferMode.class, resp.getTransport())); - }).collect(Collectors.toList()); - return PageResult.ok(deviceVideoListResps,total); - } - - /** - * 查询视频设备数量 - * - * @param - * @return {@link DeviceVideoNumResp} - */ - @Override - public DeviceVideoNumResp countDeviceVideoNum() { - DeviceVideoNumResp deviceVideoNumResp = new DeviceVideoNumResp(); - List deviceVideoList = this.baseMapper.selectDeviceVideoList(null, null,null); - deviceVideoNumResp.setAllDevice(deviceVideoList.stream().count()); - deviceVideoNumResp.setOnlineDevice(deviceVideoList.stream().filter(item -> IotDictConstants.IOT_DEVICE_STATUS_ONLINE.equals(item.getStatus())).count()); - deviceVideoNumResp.setOfflineDevice(deviceVideoList.stream().filter(item -> IotDictConstants.IOT_DEVICE_STATUS_OFFLINE.equals(item.getStatus())).count()); - return deviceVideoNumResp; - } - - /** - * 编辑视频设备信息 - * - * @param videoId 视频设备id - * @param req 视频设备信息 - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void editDeviceVideo(Long videoId, DeviceVideoEditReq req) { - DeviceVideoEntity entity = this.getById(videoId); - if (null == entity) { - throw new ServiceException(IotRespMessage.ID_NOT_FOUND); - } - BeanUtil.copyProperties(req, entity); - this.updateById(entity); - } - - /** - * 删除视频设备 - * - * @param videoId 视频设备id - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public Result removeByVideoId(Long videoId) { - DeviceVideoEntity entity = this.getById(videoId); - if (null == entity) { - throw new ServiceException(IotRespMessage.ID_NOT_FOUND); - } - if (!DeviceStatus.OFFLINE.getValue().equals(entity.getStatus())) { - return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_DELETE); - } - Result result = Result.ok(); - List list = deviceVideoChannelService.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId,videoId)); - List channelIds = list.stream().map(DeviceVideoChannelEntity::getChannelId).collect(Collectors.toList()); - if(CollectionUtil.isNotEmpty(channelIds)){ - result = deviceVideoChannelService.removeByChannelIds(channelIds); - } - if (HttpStatus.HTTP_OK == result.getCode()) { - return this.removeById(videoId) ? Result.ok() : Result.error(); - } else { - return result; - } - } - - @Override - public DeviceVideoEntity getDeviceByHostAndPort(String host, int port) { - return super.getOne(Wrappers.lambdaQuery(DeviceVideoEntity.class) - .eq(DeviceVideoEntity::getIp, host) - .eq(DeviceVideoEntity::getPort, port) -// .orderByDesc(DeviceVideoEntity::getCreateTime) - .last("limit 1")); - } - - @Transactional(rollbackFor = Exception.class) - @Override - public void offline(String videoCode) { - DeviceVideoEntity entity = this.getByCode(videoCode); - entity.setStatus(DeviceStatus.OFFLINE.getValue()); -// entity.setUpdateTime(LocalDateTime.now()); - this.updateById(entity); - deviceVideoChannelService.offlineByVideoId(entity.getVideoId()); - - } - - /** - * 上线设备 - * - * @param entity - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void online(DeviceVideoEntity entity) { - log.info("[设备上线] deviceId:{}->{}:{}",entity.getVideoCode(), entity.getIp(), entity.getPort()); - String deviceCacheKey = IotCacheConstants.getIotDeviceVideoKey(entity.getVideoCode()); - entity.setStatus(DeviceStatus.ONLINE.getValue()); - if(entity.getVideoId() == null){ - // 设备首次上线 - if(redisService.hasKey(deviceCacheKey)){ - // 脏数据 - redisService.deleteObject(deviceCacheKey); - } - this.save(entity); - } else { - entity.setUpdateTime(LocalDateTime.now()); - this.updateById(entity); - } - sipDeviceCommander.queryDeviceInfo(entity); - sipDeviceCommander.queryCatalog(entity); - } - - @Override - public boolean expire(DeviceVideoEntity entity) { - LocalDateTime expireDateTime = entity.getRegisterTime().plus(entity.getExpires(), ChronoUnit.MILLIS); - return expireDateTime.isBefore(LocalDateTime.now()); - } - - @Override - public DeviceVideoEntity getByCode(String videoCode) { - return super.getOne(Wrappers.lambdaQuery(DeviceVideoEntity.class) - .eq(DeviceVideoEntity::getVideoCode, videoCode) - .orderByDesc(DeviceVideoEntity::getCreateTime) - .last("limit 1")); - } - - /** - * 根据 videoCode 获取设备 - * - * @param channelCode - * @return 设备 - */ - @Override - public DeviceVideoEntity getByChannelCode(String channelCode) { - DeviceVideoChannelEntity channelEntity = Optional.ofNullable(deviceVideoChannelService.getByCode(channelCode)).orElseThrow(()-> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - return this.getById(channelEntity.getVideoId()); - } - - /** - * 查询设备状态 - * - * @param videoId - * @return - */ - @Override - public void queryDeviceStatus(Long videoId) { - DeviceVideoEntity entity = Optional.ofNullable(this.getById(videoId)).orElseThrow( () -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - sipDeviceCommander.queryDeviceStatus(entity); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java deleted file mode 100644 index 0d33fa6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import cn.hutool.core.util.NumberUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.domain.entity.IpConfigEntity; -import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; -import com.dite.znpt.monitor.mapper.IpConfigMapper; -import com.dite.znpt.monitor.service.IpConfigService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表服务实现类 - */ -@Service -public class IpConfigServiceImpl extends ServiceImpl implements IpConfigService { - - - @Override - @Transactional(rollbackFor = Exception.class) - public void configAdd(MonitorConfigAddReq req) { - //先删除再新增--全量新增 - final List configAdds = req.getIpAddresses().stream().map(this::BuildConfigEntity).collect(Collectors.toList()); - //校验是否有重复的--用前三位来判断重复 - checkDup(configAdds); - deleteConfig(); - this.saveBatch(configAdds); - } - - - - @Override - public List configList() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - final List ifConfigs = this.list(wrapper); - return ifConfigs.stream().map(t->t.getIp()).collect(Collectors.toList()); - } - - private void deleteConfig(){ - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.remove(wrapper); - } - - private void checkDup(List configAdds) { - final List ipTopThreeList = configAdds.stream().map(t -> t.getIpTopThree()).collect(Collectors.toList()); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(IpConfigEntity::getIpTopThree,ipTopThreeList) - .last("limit 1"); - final IpConfigEntity one = this.getOne(wrapper); - if(one != null){ - throw new ServiceException("与现有视频地址重复,请重新选择!"); - } - } - - private IpConfigEntity BuildConfigEntity( String ip) { - IpConfigEntity entity = new IpConfigEntity(); - final String[] ipArray = ip.split("\\."); - ipValidate(ipArray); - entity.setIp(ip); - entity.setIpTopThree(ipArray[0]+"."+ipArray[1]+"."+ipArray[2]); - return entity; - } - - private void ipValidate(String[] ipArray) { - if(ipArray.length!=4){ - throw new ServiceException("ip地址长度不对"); - } - for (int i = 0; i < 4; i++) { - if(! (NumberUtil.isInteger(ipArray[i]) || (i==3 && "*".equals(ipArray[i])))){ - throw new ServiceException("ip地址为非数字"); - } - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java deleted file mode 100644 index 06aaa50..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.mapper.StreamMediaFormatMapper; -import com.dite.znpt.monitor.service.StreamMediaFormatService; -import org.springframework.stereotype.Service; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:59 - * @Description: - */ -@Service -public class StreamMediaFormatServiceImpl extends ServiceImpl implements StreamMediaFormatService { - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java deleted file mode 100644 index f10f7d8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.dite.znpt.monitor.sip; - -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryI; -import gov.nist.javax.sip.SipProviderImpl; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.bridge.SLF4JBridgeHandler; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.DependsOn; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import javax.sip.*; -import java.util.Properties; -import java.util.TooManyListenersException; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:20 - * @Description: - */ -@Slf4j -@Component -public class SipLayer { - - @Resource - private SipConfig sipConfig; - - @Resource - private SipProcessorFactoryI sipProcessorFactory; - - private SipStack sipStack; - - private SipFactory sipFactory; - - @Bean("sipFactory") - SipFactory createSipFactory() { - sipFactory = SipFactory.getInstance(); - sipFactory.setPathName("gov.nist"); - return sipFactory; - } - - @Bean("sipStack") - @DependsOn({"sipFactory"}) - SipStack createSipStack() throws PeerUnavailableException { - Properties properties = new Properties(); - properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP"); - properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getIp()); - /** - * 完整配置参考 gov.nist.javax.sip.SipStackImpl,需要下载源码 - * gov/nist/javax/sip/SipStackImpl.class - */ - if (log.isDebugEnabled()) { - properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true"); - } - // 接收所有notify请求,即使没有订阅 - properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); - // 为_NULL _对话框传递_终止的_事件 - properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true"); - // 会话清理策略 - properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal"); - // 处理由该服务器处理的基于底层TCP的保持生存超时 - properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "60"); - - /** - * sip_server_log.log 和 sip_debug_log.log public static final int TRACE_NONE = - * 0; public static final int TRACE_MESSAGES = 16; public static final int - * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32; - */ - if (log.isDebugEnabled()) { - properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); - } -// sip日志等级 - properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "ERROR"); - sipStack = sipFactory.createSipStack(properties); - - return sipStack; - } - - @Bean(name = "tcpSipProvider") - @DependsOn("sipStack") - SipProviderImpl startTcpListener() throws InvalidArgumentException, TransportNotSupportedException, ObjectInUseException, TooManyListenersException { - ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "TCP"); - SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); - tcpSipProvider.setDialogErrorsAutomaticallyHandled(); - tcpSipProvider.addSipListener(sipProcessorFactory); - log.info("[Sip Server] TCP 启动成功 {}:{}", sipConfig.getIp(), sipConfig.getPort()); - return tcpSipProvider; - } - - @Bean(name = "udpSipProvider") - @DependsOn("sipStack") - SipProviderImpl startUdpListener() throws InvalidArgumentException, TransportNotSupportedException, ObjectInUseException, TooManyListenersException { - ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "UDP"); - SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint); - udpSipProvider.addSipListener(sipProcessorFactory); - log.info("[Sip Server] UDP 启动成功 {}:{}", sipConfig.getIp(), sipConfig.getPort()); - return udpSipProvider; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java b/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java deleted file mode 100644 index 86d475f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dite.znpt.monitor.sip.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:59 - * @Description: - */ -@Data -@Configuration -@ConfigurationProperties(prefix = "sip-config") -public class SipConfig { - - String name; - - String ip; - - Integer port; - - String charset; - - String domain; - - String id; - - String password; - - String mediaType = "mp4"; - - /** - * zlm播放地址路由 - */ - String mediaRouter = "/zlm"; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java b/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java deleted file mode 100644 index 48d758d..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.sip.session; - -import org.springframework.stereotype.Component; - -import javax.sip.ClientTransaction; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @Author: huise23 - * @Date: 2022/8/29 16:52 - * @Description: 视频流session管理器,管理视频预览、预览回放的通信句柄 - */ -@Component -public class StreamSessionManager { - - private ConcurrentHashMap sessionMap = new ConcurrentHashMap<>(); - - public void put(String ssrc, ClientTransaction transaction){ - sessionMap.put(ssrc, transaction); - } - - public ClientTransaction get(String ssrc){ - return sessionMap.get(ssrc); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java deleted file mode 100644 index ad1c041..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit; - -import javax.sip.SipListener; - -/** - * @Author: huise23 - * @Date: 2022/8/29 16:52 - * @Description: - */ -public interface SipProcessorFactoryI extends SipListener { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java deleted file mode 100644 index b450e7e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit; - - -import cn.hutool.json.JSONUtil; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.response.ISipResponseProcessor; -import com.dite.znpt.monitor.sip.transmit.timeout.ITimeoutProcessor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import javax.sip.*; -import javax.sip.header.CSeqHeader; -import javax.sip.message.Response; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:44 - * @Description: - */ -@Slf4j -@Component -public class SipProcessorFactoryImpl implements SipProcessorFactoryI { - - private static Map requestProcessorMap = new ConcurrentHashMap<>(); - - private static Map responseProcessorMap = new ConcurrentHashMap<>(); - - private static ITimeoutProcessor timeoutProcessor; - - public void addRequestProcessor(String method, ISipRequestProcessor processor) { - requestProcessorMap.put(method, processor); - } - - public void addResponseProcessor(String method, ISipResponseProcessor processor) { - responseProcessorMap.put(method, processor); - } - - public void addTimeoutProcessor(ITimeoutProcessor processor) { - timeoutProcessor = processor; - } - - @Override - @Async - public void processRequest(RequestEvent requestEvent) { - log.info("requestEvent:"+ JSONUtil.toJsonStr(requestEvent.getRequest())); - String method = requestEvent.getRequest().getMethod(); - ISipRequestProcessor sipRequestProcessor = requestProcessorMap.get(method); - if (sipRequestProcessor == null) { - log.warn("不支持方法{}的request", method); - return; - } - sipRequestProcessor.process(requestEvent); - } - - @Override - @Async - public void processResponse(ResponseEvent responseEvent) { - Response response = responseEvent.getResponse(); - int status = response.getStatusCode(); - if ((status >= 200 && status < 300) || status == Response.UNAUTHORIZED) { - CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); - String method = cseqHeader.getMethod(); - ISipResponseProcessor sipResponseProcessor = responseProcessorMap.get(method); - if (sipResponseProcessor == null) { - log.warn("不支持方法{}的response", method); - return; - } - sipResponseProcessor.process(responseEvent); - } else if ((status >= 100) && (status < 200)) { - // 增加其它无需回复的响应,如101、180等 - } else { - //未完成 接收到失败的response响应!status:400,message:Bad Request - log.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()); - } - } - - @Override - public void processTimeout(TimeoutEvent timeoutEvent) { - // TODO Auto-generated method stub - } - - @Override - public void processIOException(IOExceptionEvent exceptionEvent) { - // TODO Auto-generated method stub - } - - @Override - public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) { - // TODO Auto-generated method stub - } - - @Override - public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) { - // TODO Auto-generated method stub - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java deleted file mode 100644 index 7ace5f6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.cmd; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; - -/** - * @Author: huise23 - * @Date: 2022/8/30 8:46 - * @Description: - */ -public interface ISipDeviceCommander { - - /** - * 查询目录列表 - * @param entity - * @return {@link boolean} - */ - boolean queryCatalog(DeviceVideoEntity entity); - - /** - * 查询设备信息 - * @param entity - * @return {@link boolean} - */ - boolean queryDeviceInfo(DeviceVideoEntity entity); - - /** - * 查询设备状态 - * @param entity - * @return {@link boolean} - */ - boolean queryDeviceStatus(DeviceVideoEntity entity); - - /** - * 请求预览视频流 - * - * @param entity - * @param channelCode - * @param ssrc - * @param ssrcPort - * @return {@link String} - */ - void playStreamCmd(DeviceVideoEntity entity, String channelCode, String ssrc, Integer ssrcPort, String mediaIp); - - /** - * 停止视频流 - * @param ssrc - * @return - */ - void stopStreamCmd(String ssrc); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java deleted file mode 100644 index 383c7c8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.cmd; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.sip.config.SipConfig; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.PeerUnavailableException; -import javax.sip.SipFactory; -import javax.sip.SipProvider; -import javax.sip.address.Address; -import javax.sip.address.SipURI; -import javax.sip.header.*; -import javax.sip.message.Request; -import java.security.SecureRandom; -import java.text.ParseException; -import java.util.ArrayList; - -/** - * 摄像头命令request构造器 - * - * @author yun11 - * @date 2023/05/11 - */ -@Component -public class SipRequestHeaderProvider { - - @Resource - private SipConfig sipConfig; - - @Resource - private SipFactory sipFactory; - - @Resource - @Qualifier(value="tcpSipProvider") - private SipProvider tcpSipProvider; - - @Resource - @Qualifier(value="udpSipProvider") - private SipProvider udpSipProvider; - - /** - * 创建Message信令请求报文 - * @param device - * @param content - * @param viaTag - * @param fromTag - * @param toTag - * @return {@link Request} - */ - public Request createMessageRequest(DeviceVideoEntity device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException, PeerUnavailableException { - Request request = null; - // sipuri - SipURI requestUri = sipFactory.createAddressFactory().createSipURI(device.getVideoCode(), device.getHostAddress()); - // via - ArrayList viaHeaders = new ArrayList(); - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); - viaHeader.setRPort(); - viaHeaders.add(viaHeader); - // from - SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain()); - Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI); - FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag); - // to - SipURI toSipUri = sipFactory.createAddressFactory().createSipURI(device.getVideoCode(), device.getHostAddress()); - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipUri); - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); - // callid - CallIdHeader callIdHeader = "TCP".equals(device.getTransport()) ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); - // Forwards - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); - // ceq - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(Long.valueOf(Math.abs(new SecureRandom().nextInt(Integer.MAX_VALUE)) - 1000), Request.MESSAGE); - - request = sipFactory.createMessageFactory().createRequest(requestUri, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, - toHeader, viaHeaders, maxForwards); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); - request.setContent(content, contentTypeHeader); - return request; - } - - public Request createInviteRequest(DeviceVideoEntity entity, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { - Request request = null; - //请求行 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, entity.getHostAddress()); - //via - ArrayList viaHeaders = new ArrayList(); - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), entity.getTransport(), viaTag); - viaHeader.setRPort(); - viaHeaders.add(viaHeader); - //from - SipURI fromSipUri = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain()); - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipUri); - //必须要有标记,否则无法创建会话,无法回应ack - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); - //to - SipURI toSipUri = sipFactory.createAddressFactory().createSipURI(channelId, entity.getHostAddress()); - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipUri); - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); - - //Forwards - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); - - //ceq - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(Long.valueOf(Math.abs(new SecureRandom().nextInt(Integer.MAX_VALUE)) - 1000), Request.INVITE); - request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); - - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - // Subject - SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); - request.addHeader(subjectHeader); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); - request.setContent(content, contentTypeHeader); - return request; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java deleted file mode 100644 index 72672fc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.cmd.impl; - -import cn.hutool.core.util.SerializeUtil; -import com.dite.znpt.monitor.constant.IotCacheConstants; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.sip.transmit.cmd.SipRequestHeaderProvider; -import com.dite.znpt.service.impl.RedisService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.ClientTransaction; -import javax.sip.InvalidArgumentException; -import javax.sip.SipException; -import javax.sip.SipProvider; -import javax.sip.address.SipURI; -import javax.sip.header.CallIdHeader; -import javax.sip.header.ViaHeader; -import javax.sip.message.Request; -import java.text.ParseException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @Author: huise23 - * @Date: 2022/8/30 8:50 - * @Description: - */ -@Slf4j -@Component -public class SipDeviceCommanderImpl implements ISipDeviceCommander { - - private final static Pattern VIA_HEADER_PATTERN = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\\:(\\d+)"); - @Resource - @Qualifier(value="tcpSipProvider") - private SipProvider tcpSipProvider; - - @Resource - @Qualifier(value="udpSipProvider") - private SipProvider udpSipProvider; - - @Resource - private SipRequestHeaderProvider sipRequestHeaderProvider; - - @Resource - private ZlmService zlmService; - - @Resource - private RedisService redisService; - - /** - * 查询目录列表 - * @param entity - * @return {@link boolean} - */ - @Override - public boolean queryCatalog(DeviceVideoEntity entity) { - try { - StringBuffer content = new StringBuffer(200); - String charset = entity.getCharset(); - content.append("\r\n"); - content.append("\r\n"); - content.append(" Catalog\r\n"); - content.append(" " + (int)((Math.random()*9+1)*100000) + "\r\n"); - content.append(" " + entity.getVideoCode() + "\r\n"); - content.append("\r\n"); - - String tag = String.valueOf(System.nanoTime()); - Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, null); - transmitRequest(entity.getTransport(), request); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } - - /** - * 查询设备信息 - * @param entity - * @return {@link boolean} - */ - @Override - public boolean queryDeviceInfo(DeviceVideoEntity entity) { - try { - StringBuffer content = new StringBuffer(200); - String charset = entity.getCharset(); - content.append("\r\n"); - content.append("\r\n"); - content.append("DeviceInfo\r\n"); - content.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); - content.append("" + entity.getVideoCode() + "\r\n"); - content.append("\r\n"); - String tag = String.valueOf(System.nanoTime()); - Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, null); - transmitRequest(entity.getTransport(), request); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } - - /** - * 查询设备状态 - * @param entity - * @return {@link boolean} - */ - @Override - public boolean queryDeviceStatus(DeviceVideoEntity entity) { - try { - StringBuffer content = new StringBuffer(200); - content.append("\r\n"); - content.append("\r\n"); - content.append("DeviceStatus\r\n"); - content.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); - content.append("" + entity.getVideoCode() + "\r\n"); - content.append("\r\n"); - String tag = String.valueOf(System.nanoTime()); - Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, tag); - transmitRequest(entity.getTransport(), request); - return true; - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } - - /** - * 请求预览视频流 - * - * @param entity - * @param channelCode 流传输协议 - * @param ssrc - * @param ssrcPort - * @return {@link String} - */ - @Override - public void playStreamCmd(DeviceVideoEntity entity, String channelCode, String ssrc, Integer ssrcPort, String mediaIp){ - try { - String streamMode = entity.getStreamMode().toUpperCase(); - StringBuffer content = new StringBuffer(200); - content.append("v=0\r\n"); - content.append("o=" + channelCode + " 0 0 IN IP4 " + mediaIp + "\r\n"); - content.append("s=Play\r\n"); - content.append("c=IN IP4 " + mediaIp + "\r\n"); - content.append("t=0 0\r\n"); - if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video " + ssrcPort + " TCP/RTP/AVP 96 97 98 99\r\n"); - }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video " + ssrcPort + " TCP/RTP/AVP 96 97 98 99\r\n"); - }else if("UDP".equals(streamMode)) { - content.append("m=video " + ssrcPort + " RTP/AVP 96 97 98 99\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - content.append("a=rtpmap:99 H265/90000\r\n"); - if ("TCP-PASSIVE".equals(streamMode)) { // tcp被动模式 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp主动模式 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - content.append("y=" + ssrc + "\r\n");//ssrc - String tm = Long.toString(System.currentTimeMillis()); - CallIdHeader callIdHeader = "TCP".equals(entity.getTransport()) ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); - Request request = sipRequestHeaderProvider.createInviteRequest(entity, channelCode, content.toString(), null, "FromInvt" + tm, null, ssrc, callIdHeader); - ClientTransaction clientTransaction = transmitRequest(entity.getTransport(), request); - System.out.println("-----------------------------------------------------------"); - redisService.setCacheObject(IotCacheConstants.getClientTransactionCacheKey(ssrc), SerializeUtil.serialize(clientTransaction)); - } catch (ParseException | InvalidArgumentException | SipException e) { - System.out.println("[zlm]拉流失败"); - zlmService.release(entity.getVideoCode(), channelCode); - e.printStackTrace(); - } - } - - /** - * 停止视频流 - * - * @param ssrc - * @return - */ - @Override - public void stopStreamCmd(String ssrc) { - try { - ClientTransaction transaction = redisService.hasKey(ssrc) ? SerializeUtil.deserialize(redisService.getCacheObject(ssrc)) : null; - if ( null == transaction || null == transaction.getDialog()) { - return; - } - Request byeRequest = transaction.getDialog().createRequest(Request.BYE); - SipURI byeURI = (SipURI) byeRequest.getRequestURI(); - String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString(); - - Matcher matcher = VIA_HEADER_PATTERN.matcher(vh); - if (VIA_HEADER_PATTERN.matcher(vh).find()) { - byeURI.setHost(matcher.group(1)); - } - ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); - String protocol = viaHeader.getTransport().toUpperCase(); - ClientTransaction clientTransaction = null; - if("TCP".equals(protocol)) { - clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); - } else if("UDP".equals(protocol)) { - clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); - } - transaction.getDialog().sendRequest(clientTransaction); - redisService.deleteObject(ssrc); - } catch (SipException | ParseException e) { - e.printStackTrace(); - } - } - - private ClientTransaction transmitRequest(String transport, Request request) throws SipException { - ClientTransaction clientTransaction = "TCP".equals(transport) ? tcpSipProvider.getNewClientTransaction(request) : udpSipProvider.getNewClientTransaction(request); - clientTransaction.sendRequest(); - return clientTransaction; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java deleted file mode 100644 index 14ad459..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request; - -import javax.sip.RequestEvent; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:46 - * @Description: - */ -public interface ISipRequestProcessor { - void process(RequestEvent event); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java deleted file mode 100644 index 20d7e99..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request; - -import gov.nist.javax.sip.SipProviderImpl; -import gov.nist.javax.sip.SipStackImpl; -import gov.nist.javax.sip.message.SIPRequest; -import gov.nist.javax.sip.stack.SIPServerTransaction; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ArrayUtils; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; - -import javax.sip.*; -import javax.sip.address.Address; -import javax.sip.address.AddressFactory; -import javax.sip.address.SipURI; -import javax.sip.header.ContentTypeHeader; -import javax.sip.header.ExpiresHeader; -import javax.sip.header.HeaderFactory; -import javax.sip.header.ViaHeader; -import javax.sip.message.MessageFactory; -import javax.sip.message.Request; -import javax.sip.message.Response; -import java.io.ByteArrayInputStream; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:48 - * @Description: - */ - -@Slf4j -public abstract class ISipRequestProcessorAbstract { - - @Autowired - @Qualifier(value="tcpSipProvider") - private SipProviderImpl tcpSipProvider; - - @Autowired - @Qualifier(value="udpSipProvider") - private SipProviderImpl udpSipProvider; - - /** - * 根据 RequestEvent 获取 ServerTransaction - * @param evt - * @return - */ - public ServerTransaction getServerTransaction(RequestEvent evt) { - Request request = evt.getRequest(); - ServerTransaction serverTransaction = evt.getServerTransaction(); - // 判断TCP还是UDP - boolean isTcp = false; - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - String transport = reqViaHeader.getTransport(); - if ("TCP".equals(transport)) { - isTcp = true; - } - - if (serverTransaction == null) { - try { - if (isTcp) { - SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); - if (serverTransaction == null) { - serverTransaction = tcpSipProvider.getNewServerTransaction(request); - } - } else { - SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); - if (serverTransaction == null) { - serverTransaction = udpSipProvider.getNewServerTransaction(request); - } - } - } catch (TransactionAlreadyExistsException e) { - log.error(e.getMessage()); - } catch (TransactionUnavailableException e) { - log.error(e.getMessage()); - } - } - return serverTransaction; - } - - public AddressFactory getAddressFactory() { - try { - return SipFactory.getInstance().createAddressFactory(); - } catch (PeerUnavailableException e) { - e.printStackTrace(); - } - return null; - } - - public HeaderFactory getHeaderFactory() { - try { - return SipFactory.getInstance().createHeaderFactory(); - } catch (PeerUnavailableException e) { - e.printStackTrace(); - } - return null; - } - - public MessageFactory getMessageFactory() { - try { - return SipFactory.getInstance().createMessageFactory(); - } catch (PeerUnavailableException e) { - e.printStackTrace(); - } - return null; - } - - /*** - * 回复状态码 - * 100 trying - * 200 OK - * 400 - * 404 - * @param evt - * @throws SipException - * @throws InvalidArgumentException - * @throws ParseException - */ - public void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); - ServerTransaction serverTransaction = getServerTransaction(evt); - if (serverTransaction == null) { - log.warn("回复失败:{}", response); - return; - } - serverTransaction.sendResponse(response); - if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { - if (serverTransaction.getDialog() != null) { - serverTransaction.getDialog().delete(); - } - } - } - - public void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); - response.setReasonPhrase(msg); - ServerTransaction serverTransaction = getServerTransaction(evt); - serverTransaction.sendResponse(response); - if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { - if (serverTransaction.getDialog() != null) { - serverTransaction.getDialog().delete(); - } - } - } - - /** - * 回复带sdp的200 - * @param evt - * @param sdp - * @param sipServerCode SIP服务国标编码 - * @param serverIp SIP服务ip - * @param sipServerPort SIP服务端口 - * @return - */ - public void responseSdpAck(RequestEvent evt, String sdp, String sipServerCode, String serverIp, Integer sipServerPort) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); - SipFactory sipFactory = SipFactory.getInstance(); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); - response.setContent(sdp, contentTypeHeader); - - // 兼容国标中的使用编码@域名作为RequestURI的情况 - SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); - if (sipURI.getPort() == -1) { - sipURI = sipFactory.createAddressFactory().createSipURI(sipServerCode, serverIp+":" + sipServerPort); - } - log.debug("responseSdpAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); - - Address concatAddress = sipFactory.createAddressFactory().createAddress( - sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() - )); - response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - getServerTransaction(evt).sendResponse(response); - } - - /** - * 回复带xml的200 - * @param evt - * @param xml - * @param sipServerCode SIP服务国标编码 - * @param serverIp SIP服务ip - * @param sipServerPort SIP服务端口 - * @throws SipException - * @throws InvalidArgumentException - * @throws ParseException - */ - public Response responseXmlAck(RequestEvent evt, String xml, String sipServerCode, String serverIp, Integer sipServerPort) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); - SipFactory sipFactory = SipFactory.getInstance(); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); - response.setContent(xml, contentTypeHeader); - - // 兼容国标中的使用编码@域名作为RequestURI的情况 - SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); - if (sipURI.getPort() == -1) { - sipURI = sipFactory.createAddressFactory().createSipURI(sipServerCode, serverIp + ":" + sipServerPort); - } - log.debug("responseXmlAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); - - Address concatAddress = sipFactory.createAddressFactory().createAddress( - sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() - )); - response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - response.addHeader(evt.getRequest().getHeader(ExpiresHeader.NAME)); - getServerTransaction(evt).sendResponse(response); - return response; - } - - public Element getRootElement(RequestEvent evt) throws DocumentException { - return getRootElement(evt, "gb2312"); - } - - public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { - if (charset == null) { - charset = "gb2312"; - } - Request request = evt.getRequest(); - SAXReader reader = new SAXReader(); - reader.setEncoding(charset); - // 对海康出现的未转义字符做处理。 - String[] destStrArray = new String[]{"<",">","&","'","""}; - char despChar = '&'; // 或许可扩展兼容其他字符 - byte destBye = (byte) despChar; - List result = new ArrayList<>(); - byte[] rawContent = request.getRawContent(); - if (rawContent == null) { - return null; - } - for (int i = 0; i < rawContent.length; i++) { - if (rawContent[i] == destBye) { - boolean resul = false; - for (String destStr : destStrArray) { - if (i + destStr.length() <= rawContent.length) { - byte[] bytes = Arrays.copyOfRange(rawContent, i, i + destStr.length()); - resul = resul || (Arrays.equals(bytes,destStr.getBytes())); - } - } - if (resul) { - result.add(rawContent[i]); - } - }else { - result.add(rawContent[i]); - } - } - Byte[] bytes = new Byte[0]; - byte[] bytesResult = ArrayUtils.toPrimitive(result.toArray(bytes)); - - Document xml = reader.read(new ByteArrayInputStream(bytesResult)); - return xml.getRootElement(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java deleted file mode 100644 index 4fdfe4c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import gov.nist.javax.sip.header.CSeq; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.Dialog; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Request; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:54 - * @Description: - */ -@Slf4j -@Component -public class AckRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - private final String METHOD = "ACK"; - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - - - @Override - public void process(RequestEvent evt) { - Request request = evt.getRequest(); - Dialog dialog = evt.getDialog(); - try { - log.info("接收到bye请求:{}", getRootElement(evt)); - CSeq csReq = (CSeq) request.getHeader(CSeq.NAME); - Request ackRequest = dialog.createAck(csReq.getSeqNumber()); - dialog.sendAck(ackRequest); - log.info("send ack : " + ackRequest.toString()); - } catch (SipException | InvalidArgumentException | DocumentException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java deleted file mode 100644 index a872d5f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.*; -import javax.sip.address.SipURI; -import javax.sip.header.FromHeader; -import javax.sip.header.HeaderAddress; -import javax.sip.message.Response; -import java.text.ParseException; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:55 - * @Description: - */ -@Slf4j -@Component -public class ByeRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - private final String METHOD = "BYE"; - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private ZlmService zlmService; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - @Override - public void process(RequestEvent evt) { - try { - responseAck(evt, Response.OK); - Dialog dialog = evt.getDialog(); - if (dialog == null) { - return; - } - if (dialog.getState().equals(DialogState.TERMINATED)) { - String channelCode = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); - DeviceVideoEntity videoEntity = deviceVideoService.getByChannelCode(channelCode); - zlmService.release(videoEntity.getVideoCode(), channelCode); - } - } catch (SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java deleted file mode 100644 index 674bbf6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import com.dite.znpt.monitor.sip.utils.XmlUtil; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.RequestEvent; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @Author: huise23 - * @Date: 2022/8/29 18:43 - * @Description: - */ -@Slf4j -@Component -public class MessageRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - private final String METHOD = "MESSAGE"; - - public Map messageHandlerMap = new ConcurrentHashMap<>(); - - public void addHandler(String cmdType, IMessageHandler messageHandler) { - messageHandlerMap.put(cmdType, messageHandler); - } - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Resource - private DeviceVideoService deviceVideoService; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - - @Override - public void process(RequestEvent event) { - try { - Element rootElement = getRootElement(event); - String cmd = XmlUtil.getText(rootElement,"CmdType"); - log.info("接收到message请求:{}", cmd); - IMessageHandler messageHandler = messageHandlerMap.get(cmd); - if(null == messageHandler){ - log.info("不支持的消息类型:{}", cmd); - return; - } - String videoCode = rootElement.element("DeviceID").getText(); - DeviceVideoEntity entity = deviceVideoService.getByCode(videoCode); - if(null == entity){ - log.info("设备未注册,国标编码:{}", videoCode); - return; - } - messageHandler.process(entity, event); - - } catch (DocumentException e) { - e.printStackTrace(); - } - } - - - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java deleted file mode 100644 index da11e57..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.service.IpConfigService; -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.utils.DigestServerAuthenticationHelper; -import gov.nist.javax.sip.address.AddressImpl; -import gov.nist.javax.sip.address.SipUri; -import gov.nist.javax.sip.header.Expires; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.header.*; -import javax.sip.message.Request; -import javax.sip.message.Response; -import java.security.NoSuchAlgorithmException; -import java.text.ParseException; -import java.time.LocalDateTime; -import java.util.Calendar; -import java.util.List; -import java.util.Locale; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:53 - * @Description: - */ -@Slf4j -@Component -public class RegisterRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - public final String METHOD = "REGISTER"; - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Resource - private SipConfig sipConfig; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - @Resource - private IpConfigService ipConfigService; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - - @Override - public synchronized void process(RequestEvent evt) { - try { - log.info("收到注册请求,开始处理"); - Request request = evt.getRequest(); - Response response; - // 注册标志 - boolean registerFlag = false; - AuthorizationHeader authorHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - - String password = sipConfig.getPassword(); - if (StrUtil.isNotBlank(password)) { - // 未携带授权头或者密码错误 回复401 - if (authorHeader == null && StrUtil.isNotEmpty(sipConfig.getPassword())) { - log.info("未携带授权头或者密码错误,回复401"); - response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request); - new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain()); - getServerTransaction(evt).sendResponse(response); - return; - } - // 校验密码是否正确 - boolean passwordCorrect = new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request, sipConfig.getPassword()); - if (!passwordCorrect) { - response = getMessageFactory().createResponse(Response.FORBIDDEN, request); - response.setReasonPhrase("wrong password"); - log.info("[注册请求] 密码/SIP服务器ID错误, 回复403"); - getServerTransaction(evt).sendResponse(response); - return; - } - } - // 携带授权头并且密码正确 - response = getMessageFactory().createResponse(Response.OK, request); - // 添加date头 - response.addHeader(getHeaderFactory().createDateHeader(Calendar.getInstance(Locale.ENGLISH))); - ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); - // 添加Contact头 - response.addHeader(request.getHeader(ContactHeader.NAME)); - // 添加Expires头 - response.addHeader(request.getExpires()); - // 获取到通信地址等信息 - FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); - ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - AddressImpl address = (AddressImpl) fromHeader.getAddress(); - SipUri uri = (SipUri) address.getURI(); - String videoCode = uri.getUser(); - DeviceVideoEntity entity = deviceVideoService.getByCode(videoCode); - log.info("entity:"+JSONUtil.toJsonStr(entity)); - if (expiresHeader != null && expiresHeader.getExpires() == 0) { - // 注册失败 - registerFlag = false; - } else { - // 注册成功 - registerFlag = true; - if (entity == null) { - entity = new DeviceVideoEntity(); - entity.setStreamMode("UDP"); - entity.setVideoCode(videoCode); - entity.setVideoCode(DeviceStatus.OFFLINE.getValue()); - } - entity.setVideoCode(videoCode); - entity.setExpires(expiresHeader.getExpires()); - - String ip = viaHeader.getHost(); - int rPort = viaHeader.getRPort(); - // 解析本地地址替代 - if (ObjectUtils.isEmpty(ip) || rPort == -1) { - ip = viaHeader.getHost(); - rPort = viaHeader.getPort(); - } - entity.setIp(ip); - entity.setPort(rPort); - entity.setHostAddress(ip.concat(":").concat(String.valueOf(rPort))); - // 判断TCP还是UDP - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - entity.setTransport("TCP".equals(reqViaHeader.getTransport()) ? "TCP" : "UDP"); - entity.setCharset("GB2312"); - } - getServerTransaction(evt).sendResponse(response); - if(registerFlag){ - entity.setRegisterTime(LocalDateTime.now()); - deviceVideoService.online(entity); - }else{ - deviceVideoService.offline(videoCode); - } - } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) { - e.printStackTrace(); - } - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java deleted file mode 100644 index 36db6b6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; - -import javax.sip.RequestEvent; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:48 - * @Description: - */ -public interface IMessageHandler { - - /** - * 处理消息 - * @param evt - * @return - */ - void process(DeviceVideoEntity entity, RequestEvent evt); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java deleted file mode 100644 index bd28287..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import com.dite.znpt.monitor.sip.utils.XmlUtil; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Response; -import java.text.ParseException; -import java.time.LocalDateTime; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:33 - * @Description: - */ -@Slf4j -@Component -public class CatalogHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "Catalog"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private DeviceVideoChannelService deviceVideoChannelService; - - @Override - public void afterPropertiesSet(){ - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - Element rootElement = getRootElement(evt); - log.info("接收到catalog消息"); - Element deviceChannelElement = rootElement.element("DeviceList"); - Element sumNumElement = rootElement.element("SumNum"); - Element snElement = rootElement.element("SN"); - if (snElement == null || sumNumElement == null || deviceChannelElement == null) { - log.info("报文异常:{},{},{}", deviceChannelElement.getText(), sumNumElement.getText(), snElement.getText()); - responseAck(evt, Response.BAD_REQUEST); - return; - } - Iterator deviceListIterator = deviceChannelElement.elementIterator(); - if (deviceListIterator != null) { - List channelEntityList = deviceVideoChannelService.selectDeviceVideoChannelByVideoCode(entity.getVideoId()); - Map channelCodeMapEntity = channelEntityList.stream().collect(Collectors.toMap(k->k.getChannelCode(), v->v)); - // 遍历DeviceList - while (deviceListIterator.hasNext()) { - Element itemDevice = deviceListIterator.next(); - Element channelDeviceElement = itemDevice.element("DeviceID"); - - int parental = NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Parental")) ? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Parental")): 0; - String parentId = XmlUtil.getText(itemDevice, "ParentID"); - if (channelDeviceElement == null || parental != 0 || StrUtil.isEmpty(parentId)) { - continue; - } - String channelCode = channelDeviceElement.getText(); - DeviceVideoChannelEntity channelEntity = channelCodeMapEntity.containsKey(channelCode) ? channelCodeMapEntity.get(channelCode) : new DeviceVideoChannelEntity(); - channelEntity.setChannelCode(channelCode); - channelEntity.setVideoId(entity.getVideoId()); - channelEntity.setChannelName( ObjectUtil.isNotEmpty(itemDevice.element("Name")) ? itemDevice.element("Name").getText(): ""); - channelEntity.setManufacture(XmlUtil.getText(itemDevice,"Manufacturer")); - channelEntity.setModel(XmlUtil.getText(itemDevice,"Model")); - channelEntity.setOwner(XmlUtil.getText(itemDevice,"Owner")); - channelEntity.setCivilCode(XmlUtil.getText(itemDevice,"CivilCode")); - channelEntity.setBlock(XmlUtil.getText(itemDevice,"Block")); - channelEntity.setAddress(XmlUtil.getText(itemDevice,"Address")); - channelEntity.setParental(parental); - channelEntity.setParentId(parentId); - channelEntity.setSafetyWay(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"SafetyWay")) ? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"SafetyWay")):0); - channelEntity.setRegisterWay(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"RegisterWay"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"RegisterWay")): 1); - channelEntity.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); - channelEntity.setCertifiable(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Certifiable"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Certifiable")): 0); - channelEntity.setErrCode(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"ErrCode"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"ErrCode")): 0); - channelEntity.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); - channelEntity.setEndTime(XmlUtil.getText(itemDevice,"EndTime")); - channelEntity.setSecrecy(XmlUtil.getText(itemDevice,"Secrecy")); - channelEntity.setIpAddress(XmlUtil.getText(itemDevice,"IPAddress")); - channelEntity.setPort(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Port"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Port")): 0); - channelEntity.setPassword(XmlUtil.getText(itemDevice,"Password")); - Element statusElement = itemDevice.element("Status"); - String status = statusElement != null && "OFF".equals(statusElement.getText())? DeviceStatus.OFFLINE.getValue() : DeviceStatus.ONLINE.getValue(); - channelEntity.setStatus(status); - channelEntity.setLongitude(NumberUtil.isDouble(XmlUtil.getText(itemDevice,"Longitude"))?NumberUtil.parseDouble(XmlUtil.getText(itemDevice,"Longitude")): 0.00); - channelEntity.setLatitude(NumberUtil.isDouble(XmlUtil.getText(itemDevice,"Latitude"))?NumberUtil.parseDouble(XmlUtil.getText(itemDevice,"Latitude")): 0.00); - channelEntity.setUpdateTime(LocalDateTime.now()); - channelEntityList.add(channelEntity); - } - deviceVideoChannelService.saveOrUpdateBatch(channelEntityList); - - entity.setChannelCount(channelEntityList.size()); - entity.setUpdateTime(LocalDateTime.now()); - deviceVideoService.updateById(entity); - - responseAck(evt, Response.OK); - } - } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java deleted file mode 100644 index 7e44cb4..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import com.dite.znpt.monitor.sip.utils.XmlUtil; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Response; -import java.text.ParseException; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:34 - * @Description: blog.csdn.net/Marvin1311/article/details/98845468 - */ -@Slf4j -@Component -public class DeviceInfoHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "DeviceInfo"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Resource - private DeviceVideoService deviceVideoService; - - @Override - public void afterPropertiesSet() { - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - Element rootElement = getRootElement(evt); - log.info("接收到deviceInfo消息"); - entity.setVideoName(XmlUtil.getText(rootElement,"DeviceName")); - entity.setManufacturer(XmlUtil.getText(rootElement,"Manufacturer")); - entity.setModel(XmlUtil.getText(rootElement,"Model")); - entity.setFirmware(XmlUtil.getText(rootElement,"Firmware")); - entity.setUpdateTime(LocalDateTime.now()); - deviceVideoService.updateById(entity); - responseAck(evt, Response.OK); - } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java deleted file mode 100644 index 8a28193..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Response; -import java.text.ParseException; -import java.util.Objects; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:34 - * @Description: - */ -@Slf4j -@Component -public class DeviceStatusHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "DeviceStatus"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Override - public void afterPropertiesSet() { - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - - @Resource - private DeviceVideoService deviceVideoService; - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - Element rootElement = getRootElement(evt); - log.info("接收到DeviceStatus消息"); - responseAck(evt, Response.OK); - Element onlineElement = rootElement.element("Online"); - String text = onlineElement.getText(); - if (Objects.equals(text.trim().toUpperCase(), "ONLINE")) { - deviceVideoService.online(entity); - }else { - deviceVideoService.offline(entity.getVideoCode()); - } - } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java deleted file mode 100644 index 47927b8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import com.alibaba.fastjson.JSON; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.header.ViaHeader; -import javax.sip.message.Response; -import java.text.ParseException; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:35 - * @Description: - */ -@Slf4j -@Component -public class KeepaliveHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "Keepalive"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Resource - private DeviceVideoService deviceVideoService; - - @Override - public void afterPropertiesSet() { - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - log.info("接收到keepalive消息"); - // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息 - // 获取到通信地址等信息 - ViaHeader viaHeader = (ViaHeader) evt.getRequest().getHeader(ViaHeader.NAME); - log.info("viaHeader:{}", JSON.toJSONString(viaHeader)); - String ip = viaHeader.getHost(); - int rPort = viaHeader.getRPort(); - // 解析本地地址替代 - if (ObjectUtils.isEmpty(ip) || rPort == -1) { - ip = viaHeader.getHost(); - rPort = viaHeader.getPort(); - } - log.info("port:{}",rPort); - if (entity.getPort() != rPort) { - entity.setPort(rPort); - entity.setHostAddress(ip.concat(":").concat(String.valueOf(rPort))); - } - entity.setKeepaliveTime(LocalDateTime.now()); - // 回复200 OK - responseAck(evt, Response.OK); - if (DeviceStatus.ONLINE.getValue().equals(entity.getStatus())) { - entity.setUpdateTime(LocalDateTime.now()); - deviceVideoService.updateById(entity); - }else { - // 对于已经离线的设备判断他的注册是否已经过期 - if (deviceVideoService.expire(entity)){ - deviceVideoService.online(entity); - } - } - } catch (SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java deleted file mode 100644 index 255e4c2..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.response; - - -import javax.sip.ResponseEvent; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:47 - * @Description: - */ -public interface ISipResponseProcessor { - void process(ResponseEvent evt); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java deleted file mode 100644 index 30e3a4e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.response; - -import org.springframework.beans.factory.InitializingBean; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:59 - * @Description: - */ -public abstract class ISipResponseProcessorAbstract implements InitializingBean, ISipResponseProcessor{ - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java deleted file mode 100644 index bb82e96..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java +++ /dev/null @@ -1 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.response.impl; import com.dite.znpt.monitor.sip.config.SipConfig; import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; import com.dite.znpt.monitor.sip.transmit.response.ISipResponseProcessorAbstract; import gov.nist.javax.sip.ResponseEventExt; import gov.nist.javax.sip.stack.SIPDialog; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.sdp.SdpFactory; import javax.sdp.SdpParseException; import javax.sdp.SessionDescription; import javax.sip.InvalidArgumentException; import javax.sip.ResponseEvent; import javax.sip.SipException; import javax.sip.SipFactory; import javax.sip.address.Address; import javax.sip.address.SipURI; import javax.sip.header.CSeqHeader; import javax.sip.message.Request; import javax.sip.message.Response; import java.text.ParseException; /** * @Description:处理INVITE响应 * @author: swwheihei * @date: 2020年5月3日 下午4:43:52 */ @Slf4j @Component public class InviteResponseProcessorImpl extends ISipResponseProcessorAbstract { private final String method = "INVITE"; @Resource private SipConfig sipConfig; @Resource private SipFactory sipFactory; @Resource private SipProcessorFactoryImpl sipProcessorFactory; @Override public void afterPropertiesSet(){ sipProcessorFactory.addResponseProcessor(method, this); } /** * 处理invite响应 * @param evt 响应消息 */ @Override public void process(ResponseEvent evt) { try { Response response = evt.getResponse(); int statusCode = response.getStatusCode(); // trying不会回复 if (statusCode == Response.TRYING) { } // 成功响应 // 下发ack if (statusCode == Response.OK) { ResponseEventExt event = (ResponseEventExt)evt; SIPDialog dialog = (SIPDialog)evt.getDialog(); CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); Request reqAck = dialog.createAck(cseq.getSeqNumber()); SipURI requestUri = (SipURI) reqAck.getRequestURI(); String contentString = new String(response.getRawContent()); // jainSip不支持y=字段, 移除以解析。 int ssrcIndex = contentString.indexOf("y="); // 检查是否有y字段 SessionDescription sdp; if (ssrcIndex >= 0) { //ssrc规定长度为10字节,不取余下长度以避免后续还有“f=”字段 String substring = contentString.substring(0, contentString.indexOf("y=")); sdp = SdpFactory.getInstance().createSessionDescription(substring); } else { sdp = SdpFactory.getInstance().createSessionDescription(contentString); } requestUri.setUser(sdp.getOrigin().getUsername()); requestUri.setHost(event.getRemoteIpAddress()); requestUri.setPort(event.getRemotePort()); reqAck.setRequestURI(requestUri); Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); reqAck.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); log.info("[invite回复ack] {}-> {}:{} ",requestUri, event.getRemoteIpAddress(), event.getRemotePort()); dialog.sendAck(reqAck); } } catch (InvalidArgumentException | SipException e) { e.printStackTrace(); } catch (ParseException e) { throw new RuntimeException(e); } catch (SdpParseException e) { throw new RuntimeException(e); } } } \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java deleted file mode 100644 index 36e1201..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.timeout; - -import javax.sip.TimeoutEvent; - -public interface ITimeoutProcessor { - void process(TimeoutEvent event); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java deleted file mode 100644 index a750ef1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.timeout.impl; - -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.timeout.ITimeoutProcessor; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.sip.TimeoutEvent; -import javax.sip.header.CallIdHeader; - -/** - * @author huise23 - */ -@Component -public class TimeoutProcessorImpl implements InitializingBean, ITimeoutProcessor { - - @Autowired - private SipProcessorFactoryImpl sipProcessorFactory; - - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addTimeoutProcessor(this); - } - - @Override - public void process(TimeoutEvent event) { - CallIdHeader callIdHeader = event.getClientTransaction().getDialog().getCallId(); - String callId = callIdHeader.getCallId(); - // TODO - - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java deleted file mode 100644 index ce07ee5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java +++ /dev/null @@ -1,210 +0,0 @@ -/* -* Conditions Of Use -* -* This software was developed by employees of the National Institute of -* Standards and Technology (NIST), an agency of the Federal Government. -* Pursuant to title 15 Untied States Code Section 105, works of NIST -* employees are not subject to copyright protection in the United States -* and are considered to be in the public domain. As a result, a formal -* license is not needed to use the software. -* -* This software is provided by NIST as a service and is expressly -* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED -* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT -* AND DATA ACCURACY. NIST does not warrant or make any representations -* regarding the use of the software or the results thereof, including but -* not limited to the correctness, accuracy, reliability or usefulness of -* the software. -* -* Permission to use this software is contingent upon your acceptance -* of the terms of this agreement -* -* . -* -*/ -package com.dite.znpt.monitor.sip.utils; - -import gov.nist.core.InternalErrorHandler; - -import javax.sip.address.URI; -import javax.sip.header.AuthorizationHeader; -import javax.sip.header.HeaderFactory; -import javax.sip.header.WWWAuthenticateHeader; -import javax.sip.message.Request; -import javax.sip.message.Response; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Date; -import java.util.Random; - -/** - * Implements the HTTP digest authentication method server side functionality. - * - * @author M. Ranganathan - * @author Marc Bednarek - */ - -public class DigestServerAuthenticationHelper { - - private MessageDigest messageDigest; - - public static final String DEFAULT_ALGORITHM = "MD5"; - public static final String DEFAULT_SCHEME = "Digest"; - - - - - /** to hex converter */ - private static final char[] toHex = { '0', '1', '2', '3', '4', '5', '6', - '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - - /** - * Default constructor. - * @throws NoSuchAlgorithmException - */ - public DigestServerAuthenticationHelper() - throws NoSuchAlgorithmException { - messageDigest = MessageDigest.getInstance(DEFAULT_ALGORITHM); - } - - public static String toHexString(byte b[]) { - int pos = 0; - char[] c = new char[b.length * 2]; - for (int i = 0; i < b.length; i++) { - c[pos++] = toHex[(b[i] >> 4) & 0x0F]; - c[pos++] = toHex[b[i] & 0x0f]; - } - return new String(c); - } - - /** - * Generate the challenge string. - * - * @return a generated nonce. - */ - private String generateNonce() { - // Get the time of day and run MD5 over it. - Date date = new Date(); - long time = date.getTime(); - Random rand = new Random(); - long pad = rand.nextLong(); - String nonceString = (new Long(time)).toString() - + (new Long(pad)).toString(); - byte mdbytes[] = messageDigest.digest(nonceString.getBytes()); - // Convert the mdbytes array into a hex string. - return toHexString(mdbytes); - } - - public Response generateChallenge(HeaderFactory headerFactory, Response response, String realm) { - try { - WWWAuthenticateHeader proxyAuthenticate = headerFactory - .createWWWAuthenticateHeader(DEFAULT_SCHEME); - proxyAuthenticate.setParameter("realm", realm); - proxyAuthenticate.setParameter("nonce", generateNonce()); - proxyAuthenticate.setParameter("opaque", ""); - proxyAuthenticate.setParameter("stale", "FALSE"); - proxyAuthenticate.setParameter("algorithm", DEFAULT_ALGORITHM); - response.setHeader(proxyAuthenticate); - } catch (Exception ex) { - InternalErrorHandler.handleException(ex); - } - return response; - } - /** - * Authenticate the inbound request. - * - * @param request - the request to authenticate. - * @param hashedPassword -- the MD5 hashed string of username:realm:plaintext password. - * - * @return true if authentication succeded and false otherwise. - */ - public boolean doAuthenticateHashedPassword(Request request, String hashedPassword) { - AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - if ( authHeader == null ) return false; - String realm = authHeader.getRealm(); - String username = authHeader.getUsername(); - - if ( username == null || realm == null ) { - return false; - } - - String nonce = authHeader.getNonce(); - URI uri = authHeader.getURI(); - if (uri == null) { - return false; - } - - - - String A2 = request.getMethod().toUpperCase() + ":" + uri.toString(); - String HA1 = hashedPassword; - - - byte[] mdbytes = messageDigest.digest(A2.getBytes()); - String HA2 = toHexString(mdbytes); - - String cnonce = authHeader.getCNonce(); - String KD = HA1 + ":" + nonce; - if (cnonce != null) { - KD += ":" + cnonce; - } - KD += ":" + HA2; - mdbytes = messageDigest.digest(KD.getBytes()); - String mdString = toHexString(mdbytes); - String response = authHeader.getResponse(); - - - return mdString.equals(response); - } - - /** - * Authenticate the inbound request given plain text password. - * - * @param request - the request to authenticate. - * @param pass -- the plain text password. - * - * @return true if authentication succeded and false otherwise. - */ - public boolean doAuthenticatePlainTextPassword(Request request, String pass) { - AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - if ( authHeader == null ) return false; - String realm = authHeader.getRealm(); - String username = authHeader.getUsername(); - - - if ( username == null || realm == null ) { - return false; - } - - - String nonce = authHeader.getNonce(); - URI uri = authHeader.getURI(); - if (uri == null) { - return false; - } - - - String A1 = username + ":" + realm + ":" + pass; - String A2 = request.getMethod().toUpperCase() + ":" + uri.toString(); - byte mdbytes[] = messageDigest.digest(A1.getBytes()); - String HA1 = toHexString(mdbytes); - - - mdbytes = messageDigest.digest(A2.getBytes()); - String HA2 = toHexString(mdbytes); - - String cnonce = authHeader.getCNonce(); - String KD = HA1 + ":" + nonce; - if (cnonce != null) { - KD += ":" + cnonce; - } - KD += ":" + HA2; - mdbytes = messageDigest.digest(KD.getBytes()); - String mdString = toHexString(mdbytes); - String response = authHeader.getResponse(); - return mdString.equals(response); - - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java deleted file mode 100644 index 934490a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.dite.znpt.monitor.sip.utils; - -import lombok.extern.slf4j.Slf4j; -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import java.io.StringReader; -import java.util.*; - -/** - * 基于dom4j的工具包 - * - * - */ -@Slf4j -public class XmlUtil -{ - /** - * 解析XML为Document对象 - * - * @param xml 被解析的XMl - * @return Document - */ - public static Element parseXml(String xml){ - Document document = null; - // - StringReader sr = new StringReader(xml); - SAXReader saxReader = new SAXReader(); - try{ - document = saxReader.read(sr); - }catch (DocumentException e){ - log.error("解析失败", e); - } - return null == document ? null : document.getRootElement(); - } - - /** - * 获取element对象的text的值 - * - * @param em 节点的对象 - * @param tag 节点的tag - * @return 节点 - */ - public static String getText(Element em, String tag){ - if (null == em){ - return null; - } - Element e = em.element(tag); - // - return null == e ? null : e.getText(); - } - - /** - * 递归解析xml节点,适用于 多节点数据 - * - * @param node node - * @param nodeName nodeName - * @return List> - */ - public static List> listNodes(Element node, String nodeName){ - if (null == node){ - return null; - } - // 初始化返回 - List> listMap = new ArrayList>(); - // 首先获取当前节点的所有属性节点 - List list = node.attributes(); - - Map map = null; - // 遍历属性节点 - for (Attribute attribute : list){ - if (nodeName.equals(node.getName())){ - if (null == map){ - map = new HashMap(); - listMap.add(map); - } - // 取到的节点属性放到map中 - map.put(attribute.getName(), attribute.getValue()); - } - - } - // 遍历当前节点下的所有节点 ,nodeName 要解析的节点名称 - // 使用递归 - Iterator iterator = node.elementIterator(); - while (iterator.hasNext()){ - Element e = iterator.next(); - listMap.addAll(listNodes(e, nodeName)); - } - return listMap; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java deleted file mode 100644 index 59023bb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -@Data -public class DeviceAlarmVo { - - /** - * 设备Id - */ - private String deviceId; - - /** - * 报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级 警情- - */ - private String alarmPriorit; - - /** - * 报警方式 , 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警, - * 7其他报警;可以为直接组合如12为电话报警或 设备报警- - */ - private String alarmMethod; - - /** - * 报警时间 - */ - private String alarmTime; - - /** - * 报警内容描述 - */ - private String alarmDescription; - - /** - * 经度 - */ - private double longitude; - - /** - * 纬度 - */ - private double latitude; - - /** - * 报警类型 - */ - private String alarmType; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java deleted file mode 100644 index 4e56103..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -@Data -public class DeviceChannelVo { - - /** - * 通道id - */ - private String channelId; - - /** - * 通道名 - */ - private String name; - - /** - * 生产厂商 - */ - private String manufacture; - - /** - * 型号 - */ - private String model; - - /** - * 设备归属 - */ - private String owner; - - /** - * 行政区域 - */ - private String civilCode; - - /** - * 警区 - */ - private String block; - - /** - * 安装地址 - */ - private String address; - - /** - * 是否有子设备 1有, 0没有 - */ - private int parental; - - /** - * 父级id - */ - private String parentId; - - /** - * 信令安全模式 缺省为0; 0:不采用; 2: S/MIME签名方式; 3: S/ MIME加密签名同时采用方式; 4:数字摘要方式 - */ - private int safetyWay; - - /** - * 注册方式 缺省为1;1:符合IETFRFC3261标准的认证注册模 式; 2:基于口令的双向认证注册模式; 3:基于数字证书的双向认证注册模式 - */ - private int registerWay; - - /** - * 证书序列号 - */ - private String certNum; - - /** - * 证书有效标识 缺省为0;证书有效标识:0:无效1: 有效 - */ - private int certifiable; - - /** - * 证书无效原因码 - */ - private int errCode; - - /** - * 证书终止有效期 - */ - private String endTime; - - /** - * 保密属性 缺省为0; 0:不涉密, 1:涉密 - */ - private String secrecy; - - /** - * IP地址 - */ - private String ipAddress; - - /** - * 端口号 - */ - private int port; - - /** - * 密码 - */ - private String password; - - /** - * 在线/离线 - * 1在线,0离线 - * 默认在线 - * 信令: - * ON - * OFF - * 遇到过NVR下的IPC下发信令可以推流, 但是 Status 响应 OFF - */ - private int status; - - /** - * 经度 - */ - private double longitude; - - /** - * 纬度 - */ - private double latitude; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java deleted file mode 100644 index 6e7f47b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -import java.util.Map; - -@Data -public class DeviceVo { - - /** - * 设备Id - */ - private String deviceId; - - /** - * 设备名 - */ - private String name; - - /** - * 生产厂商 - */ - private String manufacturer; - - /** - * 型号 - */ - private String model; - - /** - * 固件版本 - */ - private String firmware; - - /** - * 传输协议 - * UDP/TCP - */ - private String transport; - - /** - * wan地址 - */ - private HostVo hostVo; - - /** - * 在线 - */ - private int online; - - /** - * 通道列表 - */ - private Map channelMap; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java deleted file mode 100644 index fdda095..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -@Data -public class HostVo { - - private String ip; - private int port; - private String address; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java deleted file mode 100644 index a9111b0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -/** - * @Description:设备录像 - * @author: - * @date: - */ -@Data -public class RecordItemVo { - - private String deviceId; - - private String name; - - private String filePath; - - private String address; - - private String startTime; - - private String endTime; - - private int secrecy; - - private String type; - - private String recorderId; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java deleted file mode 100644 index f2ba518..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -import java.util.List; - -/** - * @Description:设备录像信息 - * @author: - * @date: - */ -@Data -public class RecordVo { - - private String deviceId; - - private String name; - - private int sumNum; - - private List recordItemVoList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java b/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java deleted file mode 100644 index d50f84a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dite.znpt.monitor.utils; - -import com.dite.znpt.monitor.constant.dict.ValueAndLabel; - -import java.util.Arrays; - -/** - * 字典工具类 - * - * @author huise23 - * @since 2023-07-28 15:38:41 - */ -public class DictUtils { - - /** - * 通用方法,根据传入的枚举类和value返回对应的label值 - * - * @param enumClass 枚举类 - * @param value 值 - * @return {@link String } - * @author huise23 - * @since 2023-07-28 15:40:07 - */ - public static & ValueAndLabel> String getDictLabel(Class enumClass, String value) { - final String label = Arrays.stream(enumClass.getEnumConstants()) - .filter(enumItem -> enumItem.getValue().equals(value)) - .map(t->t.getLabel()) - .findFirst() - .orElse(null); - return label; - } - -} diff --git a/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml b/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml deleted file mode 100644 index c43f856..0000000 --- a/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - dvc.channel_id, dvc.channel_code, dvc.channel_name, dvc.address, dvc.camera_type, dvc.ptz_control, dvc.status, dvc.remark - - - - - - - - - - - - - - diff --git a/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml b/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml deleted file mode 100644 index b0820c3..0000000 --- a/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - dv.video_id, dv.video_code, dv.video_name, dv.transport, dv.stream_mode, dv.channel_count, dv.status, dv.register_time, - dv.keepalive_time, dv.channel_count, dv.ip, dv.port,dv.host_address, dv.manufacturer, dv.remark, dv.create_time - - - - - - diff --git a/sip/src/main/resources/mapper/iot/IpConfigMapper.xml b/sip/src/main/resources/mapper/iot/IpConfigMapper.xml deleted file mode 100644 index 339afe7..0000000 --- a/sip/src/main/resources/mapper/iot/IpConfigMapper.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - ic.config_id, ic.ip - - - - - diff --git a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java deleted file mode 100644 index 2eef147..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.dite.znpt.web.controller; - -import cn.hutool.core.bean.BeanUtil; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.monitor.constant.IotRespMessage; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.constant.dict.SipTransferMode; -import com.dite.znpt.monitor.constant.dict.StreamTransferMode; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; -import com.dite.znpt.monitor.domain.resp.DeviceVideoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.service.IpConfigService; -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.utils.DictUtils; -import com.dite.znpt.util.PageUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/8 10:39 - * @Description: - */ -@Api(tags = "视频管理") -@RestController -@RequestMapping("/monitoring/video") -public class VideoController { - - @Resource - private SipConfig sipConfig; - - @Resource - private StreamMediaServerConfig streamMediaServerConfigService; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private IpConfigService ipConfigService; - - @Resource - private DeviceVideoChannelService deviceVideoChannelService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - @ApiOperation(value = "获取信令服务器配置信息", notes = "iot:video:sip:view", httpMethod = "GET") - @GetMapping("/sipServerConfig") - public Result getSipServerConfig(){ - return Result.ok(BeanUtil.copyProperties(sipConfig, SipConfig.class)); - } - - @ApiOperation(value = "获取流媒体服务配置信息", notes = "iot:video:media:view", httpMethod = "GET") - @GetMapping("/streamMediaServerConfig") - public Result getStreamMediaServerConfig(){ - return Result.ok(BeanUtil.copyProperties(streamMediaServerConfigService, StreamMediaServerConfig.class)); - } - - @ApiOperation(value = "查询监控IP配置列表", notes = "iot:config:list", httpMethod = "GET") - @GetMapping("/config/list") - public Result> configList(){ - PageUtil.startPage(); - return Result.ok(ipConfigService.configList()); - } - - @ApiOperation(value = "配置监控IP列表,每次全量传ip列表", notes = "iot:config:add", httpMethod = "POST") - @PostMapping("/config/add") - public Result configAdd(@RequestBody MonitorConfigAddReq req){ - ipConfigService.configAdd(req); - return Result.ok(); - } - - @ApiOperation(value = "分页查询视频设备列表", notes = "iot:video:list", httpMethod = "GET") - @GetMapping("/device/page") - public PageResult pageDevice( - @RequestParam(value = "status", required = false) String status, - @RequestParam(value = "keyword", required = false) String keyword, - @RequestParam(value = "hostAddress", required = false) String hostAddress){ - PageUtil.startPage(); - return deviceVideoService.selectDeviceVideoList(status, keyword,hostAddress); - } - - @ApiOperation(value = "查看视频设备数量", notes = "iot:video:list", httpMethod = "GET") - @GetMapping("/device/count") - public Result countDevice(){ - return Result.ok(deviceVideoService.countDeviceVideoNum()); - } - - @ApiOperation(value = "查看视频设备详情", notes = "iot:video:view", httpMethod = "GET") - @GetMapping("/device/{videoId}") - public Result viewDevice(@PathVariable("videoId") Long videoId){ - final DeviceVideoEntity entity = deviceVideoService.getById(videoId); - final DeviceVideoResp resp = BeanUtil.copyProperties(entity, DeviceVideoResp.class); - resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); - resp.setStreamModeLabel(DictUtils.getDictLabel(StreamTransferMode.class, resp.getStreamMode())); - resp.setTransportLabel(DictUtils.getDictLabel(SipTransferMode.class, resp.getTransport())); - return Result.ok(resp); - } - - @ApiOperation(value = "编辑视频设备", notes = "iot:video:edit", httpMethod = "PUT") - @PutMapping("/device/{videoId}") - public Result editDevice(@PathVariable("videoId") Long videoId, @RequestBody DeviceVideoEditReq req){ - deviceVideoService.editDeviceVideo(videoId, req); - return Result.ok(); - } - - @ApiOperation(value = "更新视频设备", notes = "iot:video:sync", httpMethod = "PUT") - @PutMapping("/device/sync/{videoId}") - public Result syncDevice(@PathVariable("videoId") Long videoId){ - DeviceVideoEntity entity = deviceVideoService.getById(videoId); - if(DeviceStatus.ONLINE.getValue().equals(entity.getStatus())){ - sipDeviceCommander.queryCatalog(entity); - return Result.ok(); - }else { - return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_SYNC); - } - } - - @ApiOperation(value = "删除视频设备", notes = "iot:video:delete", httpMethod = "DELETE") - @DeleteMapping("/device/{videoId}") - public Result deleteDevice(@PathVariable("videoId") Long videoId){ - return deviceVideoService.removeByVideoId(videoId); - } - - @ApiOperation(value = "分页查询视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") - @GetMapping("/channel/page/{videoId}") - public PageResult pageChannel(@PathVariable("videoId") Long videoId, @RequestParam(value = "keyword", required = false) String keyword){ - return deviceVideoChannelService.selectDeviceVideoChannel(videoId, keyword); - } - - @ApiOperation(value = "分页查询所有视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") - @GetMapping("/channel/page") - public PageResult pageAllChannel(@RequestParam(value = "keyword", required = false) String keyword){ - return deviceVideoChannelService.selectAllDeviceVideoChannel(keyword); - } - - @ApiOperation(value = "查看视频通道", notes = "iot:video:channel:view", httpMethod = "GET") - @GetMapping("/channel/{channelCode}") - public Result viewChannel(@PathVariable("channelCode") String channelCode){ - return Result.ok(deviceVideoChannelService.getDeviceVideoChannelDetail(channelCode)); - } - - @ApiOperation(value = "编辑视频通道", notes = "iot:video:channel:edit", httpMethod = "PUT") - @PutMapping("/channel/{channelId}") - public Result editChannel(@PathVariable("channelId") Long channelId, @RequestBody DeviceVideoChannelEditReq req){ - deviceVideoChannelService.editDeviceVideoChannel(channelId, req); - return Result.ok(); - } - - @ApiOperation(value = "删除视频通道", notes = "iot:video:channel:delete", httpMethod = "DELETE") - @DeleteMapping("/channel/{channelId}") - public Result deleteChannel(@PathVariable("channelId") Long channelId){ - return deviceVideoChannelService.removeByChannelIds(Arrays.asList(channelId)); - } - - @ApiOperation(value = "播放直播视频", notes = "iot:video:play", httpMethod = "GET") - @GetMapping("/play/live/{channelCode}") - public Result play(@PathVariable("channelCode") String channelCode){ - return Result.ok(deviceVideoChannelService.play(channelCode)); - } - - @ApiOperation(value = "查询视频设备是否在线", notes = "iot:video:isOnline", httpMethod = "GET") - @GetMapping("/channel/isOnline/{channelCode}") - public Result isOnline(@PathVariable("channelCode") String channelCode){ - return Result.ok(deviceVideoChannelService.isOnline(channelCode)); - } - - @ApiOperation(value = "停止播放直播", notes = "iot:video:stop", httpMethod = "GET") - @GetMapping("/stop/live/{channelCode}") - public Result stop(@PathVariable("channelCode") String channelCode){ - deviceVideoChannelService.stop(channelCode); - return Result.ok(); - } -} diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index b21b663..b2ab175 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -8,7 +8,7 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://39.99.201.243:3306/znpt_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://39.99.201.243:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: BUw8YW6%@^8q druid: @@ -99,39 +99,39 @@ sa-token: # 是否输出操作日志 is-log: true -sip-config: - name: 信令服务 - ip: 127.0.0.1 - port: 1074 - charset: gb2312 - domain: 3402000000 - id: 34020000002000000001 - password: 123456 - mediaType: mp4 - -zlm-config: - # 流媒体名称 - mediaName: 媒体服务 - # 流媒体服务商 - mediaService: ZLMdia - # 公网ip - publicHost: - # 接口ip - apiHost: 127.0.0.1 - # 接口端口 - apiPort: 8080 - # 密钥 - secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G - # 流id前缀 - streamPrefix: - # rtp ip - rtpHost: 127.0.0.1 - # rtp 端口 - rtpPort: 8080 - # 动态端口起始值 - dynamicPortStart: 30150 - # 动态端口结束值 - dynamicPortEnd: 30185 +#sip-config: +# name: 信令服务 +# ip: 127.0.0.1 +# port: 1074 +# charset: gb2312 +# domain: 3402000000 +# id: 34020000002000000001 +# password: 123456 +# mediaType: mp4 +# +#zlm-config: +# # 流媒体名称 +# mediaName: 媒体服务 +# # 流媒体服务商 +# mediaService: ZLMdia +# # 公网ip +# publicHost: +# # 接口ip +# apiHost: 127.0.0.1 +# # 接口端口 +# apiPort: 8080 +# # 密钥 +# secretKey: 6Q76ivvVOQDsnnfOSKbtVzcYpbgy4n1G +# # 流id前缀 +# streamPrefix: +# # rtp ip +# rtpHost: 127.0.0.1 +# # rtp 端口 +# rtpPort: 8080 +# # 动态端口起始值 +# dynamicPortStart: 30150 +# # 动态端口结束值 +# dynamicPortEnd: 30185 upload: # 此处仅定义总的父路径,细节定义到 FilePathEnum From d18690a3e84345c02c46bd5129695bfe044eb0be Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Mon, 28 Jul 2025 18:13:35 +0800 Subject: [PATCH 02/38] =?UTF-8?q?=E5=88=B6=E5=BA=A6=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=90=8E=E7=AB=AF=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/config/SwaggerConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java b/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java index 5f30e05..d8a0536 100644 --- a/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java +++ b/core/src/main/java/com/dite/znpt/config/SwaggerConfig.java @@ -38,7 +38,6 @@ public class SwaggerConfig { .enable(true)//开启Swagger文档 .select() .apis(RequestHandlerSelectors.basePackage("com.dite")) - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build() .globalRequestParameters(parameters); From 2b94b8846bb7b7877c63b20736e76c9d0daf7055 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Tue, 29 Jul 2025 19:44:34 +0800 Subject: [PATCH 03/38] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=88=B6=E5=BA=A6?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=B8=AD=E4=B8=8E=E6=8A=95=E7=A5=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/domain/vo/UserResp.java | 4 +++- .../java/com/dite/znpt/service/impl/UserServiceImpl.java | 9 +++++---- web/src/main/resources/application-dev.yml | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java index db10ead..d461435 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/UserResp.java @@ -19,7 +19,7 @@ public class UserResp extends UserReq implements Serializable{ @Serial private static final long serialVersionUID = -2831232930040845716L; - @ApiModelProperty("用户名") + @ApiModelProperty("用户id") private String userId; @ApiModelProperty("所属部门") @@ -39,6 +39,8 @@ public class UserResp extends UserReq implements Serializable{ @ApiModelProperty("在职状态描述") private String userStatusLabel; + @ApiModelProperty("用户姓名") + private String userName; diff --git a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java index 7b1bc01..cd4c41d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/UserServiceImpl.java @@ -88,9 +88,9 @@ public class UserServiceImpl extends ServiceImpl impleme @Override public List list(UserListReq req) { return this.baseMapper.queryBySelective(req).stream().map(resp -> { - resp.setUserTypeLabel(UserTypeEnum.getDescByCode(resp.getUserType())); - resp.setUserStatusLabel(UserStatusEnum.getDescByCode(resp.getUserStatus())); - return resp; + resp.setUserTypeLabel(UserTypeEnum.getDescByCode(resp.getUserType())); + resp.setUserStatusLabel(UserStatusEnum.getDescByCode(resp.getUserStatus())); + return resp; }).collect(Collectors.toList()); } @@ -107,7 +107,8 @@ public class UserServiceImpl extends ServiceImpl impleme UserEntity entity = this.getById(userId); UserResp userResp= Converts.INSTANCE.toUserResp(entity); if(StrUtil.isNotBlank(userResp.getDeptId())){ - userResp.setUserId(deptService.getById(userResp.getDeptId()).getDeptName()); + userResp.setUserName(entity.getName()); + userResp.setDeptName(deptService.getById(userResp.getDeptId()).getDeptName()); } userResp.setUserTypeLabel(UserTypeEnum.getDescByCode(userResp.getUserType())); userResp.setUserStatusLabel(UserStatusEnum.getDescByCode(userResp.getUserStatus())); diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index b2ab175..2268475 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -2,13 +2,14 @@ server: # 服务器的HTTP端口,默认为8080 port: 8888 + address : 0.0.0.0 # 监听所有网络接口 # 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://39.99.201.243:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://39.99.201.243:3306/test01?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: BUw8YW6%@^8q druid: From d10cd352b0bb159411f645999f9cfc6599fcdd69 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Tue, 29 Jul 2025 20:11:46 +0800 Subject: [PATCH 04/38] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=88=B6=E5=BA=A6?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=B8=AD=E4=B8=8E=E6=8A=95=E7=A5=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E6=96=B9=E6=B3=95=E5=B9=B6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/dto/RegulationConfirmDTO.java | 14 + .../domain/dto/RegulationDiscussionDTO.java | 20 + .../entity/RegulationConfirmationEntity.java | 96 +++++ .../domain/entity/RegulationDraftEntity.java | 106 +++++ .../znpt/domain/entity/RegulationEntity.java | 105 +++++ .../entity/RegulationProposalEntity.java | 156 +++++++ .../mapper/RegulationConfirmationMapper.java | 14 + .../znpt/mapper/RegulationDraftMapper.java | 12 + .../dite/znpt/mapper/RegulationMapper.java | 14 + .../RegulationConfirmationService.java | 66 +++ .../dite/znpt/service/RegulationService.java | 85 ++++ .../RegulationConfirmationServiceImpl.java | 184 ++++++++ .../service/impl/RegulationServiceImpl.java | 257 +++++++++++ doc/regulation_api_test.md | 403 ++++++++++++++++++ doc/regulation_module_readme.md | 224 ++++++++++ doc/regulation_tables.sql | 128 ++++++ doc/regulation_test_data.sql | 35 ++ .../web/controller/RegulationController.java | 77 ++++ 18 files changed, 1996 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java create mode 100644 core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/RegulationDraftEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/RegulationProposalEntity.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/RegulationConfirmationMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java create mode 100644 core/src/main/java/com/dite/znpt/service/RegulationService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java create mode 100644 doc/regulation_api_test.md create mode 100644 doc/regulation_module_readme.md create mode 100644 doc/regulation_tables.sql create mode 100644 doc/regulation_test_data.sql create mode 100644 web/src/main/java/com/dite/znpt/web/controller/RegulationController.java diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java new file mode 100644 index 0000000..3cd0cd2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java @@ -0,0 +1,14 @@ +package com.dite.znpt.domain.dto; + +import lombok.Data; + +/** + * 制度确认DTO + * @author wangna + * @date 2025/07/29 + */ +@Data +public class RegulationConfirmDTO { + + private Boolean agreeTerms; // 是否同意条款 +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java new file mode 100644 index 0000000..7eead61 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java @@ -0,0 +1,20 @@ +package com.dite.znpt.domain.dto; + +import lombok.Data; +import java.time.LocalDateTime; + +/** + * 制度讨论DTO + * @author wangna + * @date 2025/07/29 + */ +@Data +public class RegulationDiscussionDTO { + + private String id; + private String regulationId; + private String authorId; + private String authorName; + private String content; + private LocalDateTime createTime; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java new file mode 100644 index 0000000..1787517 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java @@ -0,0 +1,96 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度确认实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("regulation_confirmation") +@ApiModel(value="RegulationConfirmationEntity对象", description="制度确认") +public class RegulationConfirmationEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("确认ID") + @ApiModelProperty("确认ID") + @TableId(value = "confirmation_id", type = IdType.ASSIGN_UUID) + private String confirmationId; + + @ExcelProperty("制度ID") + @ApiModelProperty("制度ID") + @TableField("regulation_id") + private String regulationId; + + @ExcelProperty("制度标题") + @ApiModelProperty("制度标题") + @TableField("regulation_title") + private String regulationTitle; + + @ExcelProperty("确认人ID") + @ApiModelProperty("确认人ID") + @TableField("confirmer_id") + private String confirmerId; + + @ExcelProperty("确认人姓名") + @ApiModelProperty("确认人姓名") + @TableField("confirmer_name") + private String confirmerName; + + @ExcelProperty("确认人部门") + @ApiModelProperty("确认人部门") + @TableField("confirmer_dept") + private String confirmerDept; + + @ExcelProperty("确认状态") + @ApiModelProperty("确认状态:PENDING-待确认,CONFIRMED-已确认,DECLINED-已拒绝") + @TableField("status") + private String status; + + @ExcelProperty("确认时间") + @ApiModelProperty("确认时间") + @TableField("confirm_time") + private LocalDateTime confirmTime; + + @ExcelProperty("确认意见") + @ApiModelProperty("确认意见") + @TableField("confirm_comment") + private String confirmComment; + + @ExcelProperty("阅读时长(秒)") + @ApiModelProperty("阅读时长(秒)") + @TableField("read_duration") + private Integer readDuration; + + @ExcelProperty("IP地址") + @ApiModelProperty("IP地址") + @TableField("ip_address") + private String ipAddress; + + @ExcelProperty("用户代理") + @ApiModelProperty("用户代理") + @TableField("user_agent") + private String userAgent; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ExcelProperty("删除标志(0代表存在,1代表删除)") + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationDraftEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationDraftEntity.java new file mode 100644 index 0000000..aaf7805 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationDraftEntity.java @@ -0,0 +1,106 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度草案实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("regulation_draft") +@ApiModel(value="RegulationDraftEntity对象", description="制度草案") +public class RegulationDraftEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("草案ID") + @ApiModelProperty("草案ID") + @TableId(value = "draft_id", type = IdType.ASSIGN_UUID) + private String draftId; + + @ExcelProperty("制度标题") + @ApiModelProperty("制度标题") + @TableField("title") + private String title; + + @ExcelProperty("制度内容") + @ApiModelProperty("制度内容") + @TableField("content") + private String content; + + @ExcelProperty("制度类型") + @ApiModelProperty("制度类型") + @TableField("regulation_type") + private String regulationType; + + @ExcelProperty("草案状态") + @ApiModelProperty("草案状态:DRAFT-草稿,REVIEWING-审核中,APPROVED-已通过,REJECTED-已拒绝") + @TableField("status") + private String status; + + @ExcelProperty("创建人ID") + @ApiModelProperty("创建人ID") + @TableField("creator_id") + private String creatorId; + + @ExcelProperty("创建人姓名") + @ApiModelProperty("创建人姓名") + @TableField("creator_name") + private String creatorName; + + @ExcelProperty("审核人ID") + @ApiModelProperty("审核人ID") + @TableField("reviewer_id") + private String reviewerId; + + @ExcelProperty("审核人姓名") + @ApiModelProperty("审核人姓名") + @TableField("reviewer_name") + private String reviewerName; + + @ExcelProperty("审核时间") + @ApiModelProperty("审核时间") + @TableField("review_time") + private LocalDateTime reviewTime; + + @ExcelProperty("审核意见") + @ApiModelProperty("审核意见") + @TableField("review_comment") + private String reviewComment; + + @ExcelProperty("适用范围") + @ApiModelProperty("适用范围") + @TableField("scope") + private String scope; + + @ExcelProperty("制度级别") + @ApiModelProperty("制度级别:HIGH-高级,MEDIUM-中级,LOW-低级") + @TableField("level") + private String level; + + @ExcelProperty("版本号") + @ApiModelProperty("版本号") + @TableField("version") + private String version; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ExcelProperty("删除标志(0代表存在,1代表删除)") + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java new file mode 100644 index 0000000..8d305b4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java @@ -0,0 +1,105 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度规范仓库实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("regulation") +@ApiModel(value="RegulationEntity对象", description="制度规范仓库") +public class RegulationEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("制度ID") + @ApiModelProperty("制度ID") + @TableId(value = "regulation_id", type = IdType.ASSIGN_UUID) + private String regulationId; + + @ExcelProperty("制度标题") + @ApiModelProperty("制度标题") + @TableField("title") + private String title; + + @ExcelProperty("制度内容") + @ApiModelProperty("制度内容") + @TableField("content") + private String content; + + @ExcelProperty("制度类型") + @ApiModelProperty("制度类型") + @TableField("regulation_type") + private String regulationType; + + @ExcelProperty("制度状态") + @ApiModelProperty("制度状态:DRAFT-草案,PUBLISHED-已发布,ARCHIVED-已归档") + @TableField("status") + private String status; + + @ExcelProperty("发布人ID") + @ApiModelProperty("发布人ID") + @TableField("publisher_id") + private String publisherId; + + @ExcelProperty("发布人姓名") + @ApiModelProperty("发布人姓名") + @TableField("publisher_name") + private String publisherName; + + @ExcelProperty("发布时间") + @ApiModelProperty("发布时间") + @TableField("publish_time") + private LocalDateTime publishTime; + + @ExcelProperty("生效时间") + @ApiModelProperty("生效时间") + @TableField("effective_time") + private LocalDateTime effectiveTime; + + @ExcelProperty("失效时间") + @ApiModelProperty("失效时间") + @TableField("expire_time") + private LocalDateTime expireTime; + + @ExcelProperty("适用范围") + @ApiModelProperty("适用范围") + @TableField("scope") + private String scope; + + @ExcelProperty("制度级别") + @ApiModelProperty("制度级别:HIGH-高级,MEDIUM-中级,LOW-低级") + @TableField("level") + private String level; + + @ExcelProperty("版本号") + @ApiModelProperty("版本号") + @TableField("version") + private String version; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ExcelProperty("删除标志(0代表存在,1代表删除)") + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; + + @TableField(exist = false) + @ApiModelProperty("当前用户确认状态:pending-待确认,confirmed-已确认") + private String confirmStatus; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationProposalEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationProposalEntity.java new file mode 100644 index 0000000..bbf8c25 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationProposalEntity.java @@ -0,0 +1,156 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度提案实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("regulation_proposal") +@ApiModel(value="RegulationProposalEntity对象", description="制度提案") +public class RegulationProposalEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("提案ID") + @ApiModelProperty("提案ID") + @TableId(value = "proposal_id", type = IdType.ASSIGN_UUID) + private String proposalId; + + @ExcelProperty("提案标题") + @ApiModelProperty("提案标题") + @TableField("title") + private String title; + + @ExcelProperty("提案内容") + @ApiModelProperty("提案内容") + @TableField("content") + private String content; + + @ExcelProperty("提案类型") + @ApiModelProperty("提案类型") + @TableField("proposal_type") + private String proposalType; + + @ExcelProperty("提案状态") + @ApiModelProperty("提案状态:SUBMITTED-已提交,DISCUSSING-讨论中,APPROVED-已通过,REJECTED-已拒绝,CONVERTED-已转为草案") + @TableField("status") + private String status; + + @ExcelProperty("提案人ID") + @ApiModelProperty("提案人ID") + @TableField("proposer_id") + private String proposerId; + + @ExcelProperty("提案人姓名") + @ApiModelProperty("提案人姓名") + @TableField("proposer_name") + private String proposerName; + + @ExcelProperty("提案人部门") + @ApiModelProperty("提案人部门") + @TableField("proposer_dept") + private String proposerDept; + + @ExcelProperty("讨论组ID") + @ApiModelProperty("讨论组ID") + @TableField("discussion_group_id") + private String discussionGroupId; + + @ExcelProperty("讨论组名称") + @ApiModelProperty("讨论组名称") + @TableField("discussion_group_name") + private String discussionGroupName; + + @ExcelProperty("讨论开始时间") + @ApiModelProperty("讨论开始时间") + @TableField("discussion_start_time") + private LocalDateTime discussionStartTime; + + @ExcelProperty("讨论结束时间") + @ApiModelProperty("讨论结束时间") + @TableField("discussion_end_time") + private LocalDateTime discussionEndTime; + + @ExcelProperty("讨论状态") + @ApiModelProperty("讨论状态:NOT_STARTED-未开始,DISCUSSING-讨论中,FINISHED-已结束") + @TableField("discussion_status") + private String discussionStatus; + + @ExcelProperty("支持人数") + @ApiModelProperty("支持人数") + @TableField("support_count") + private Integer supportCount; + + @ExcelProperty("反对人数") + @ApiModelProperty("反对人数") + @TableField("oppose_count") + private Integer opposeCount; + + @ExcelProperty("总参与人数") + @ApiModelProperty("总参与人数") + @TableField("total_participants") + private Integer totalParticipants; + + @ExcelProperty("审核人ID") + @ApiModelProperty("审核人ID") + @TableField("reviewer_id") + private String reviewerId; + + @ExcelProperty("审核人姓名") + @ApiModelProperty("审核人姓名") + @TableField("reviewer_name") + private String reviewerName; + + @ExcelProperty("审核时间") + @ApiModelProperty("审核时间") + @TableField("review_time") + private LocalDateTime reviewTime; + + @ExcelProperty("审核意见") + @ApiModelProperty("审核意见") + @TableField("review_comment") + private String reviewComment; + + @ExcelProperty("转为草案ID") + @ApiModelProperty("转为草案ID") + @TableField("converted_draft_id") + private String convertedDraftId; + + @ExcelProperty("适用范围") + @ApiModelProperty("适用范围") + @TableField("scope") + private String scope; + + @ExcelProperty("制度级别") + @ApiModelProperty("制度级别:HIGH-高级,MEDIUM-中级,LOW-低级") + @TableField("level") + private String level; + + @ExcelProperty("紧急程度") + @ApiModelProperty("紧急程度:HIGH-高,MEDIUM-中,LOW-低") + @TableField("urgency_level") + private String urgencyLevel; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ExcelProperty("删除标志(0代表存在,1代表删除)") + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationConfirmationMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationConfirmationMapper.java new file mode 100644 index 0000000..ac6846c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationConfirmationMapper.java @@ -0,0 +1,14 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.RegulationConfirmationEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度确认Mapper接口 + */ +@Mapper +public interface RegulationConfirmationMapper extends BaseMapper { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java new file mode 100644 index 0000000..075e3ae --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.RegulationDraftEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 制度草案Mapper接口 + */ +@Mapper +public interface RegulationDraftMapper extends BaseMapper { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java new file mode 100644 index 0000000..8005192 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java @@ -0,0 +1,14 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.RegulationEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度规范仓库Mapper接口 + */ +@Mapper +public interface RegulationMapper extends BaseMapper { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java b/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java new file mode 100644 index 0000000..1654993 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java @@ -0,0 +1,66 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.RegulationConfirmationEntity; +import com.dite.znpt.domain.Result; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度确认Service接口 + */ +public interface RegulationConfirmationService extends IService { + + /** + * 确认制度 + * @param confirmation 确认信息 + * @return 结果 + */ + Result confirmRegulation(RegulationConfirmationEntity confirmation); + + /** + * 获取确认记录 + * @param regulationId 制度ID + * @return 结果 + */ + Result getConfirmationRecords(String regulationId); + + /** + * 获取用户确认记录 + * @param confirmerId 确认人ID + * @param regulationId 制度ID + * @return 结果 + */ + Result getUserConfirmationRecord(String confirmerId, String regulationId); + + /** + * 取消确认 + * @param confirmationId 确认ID + * @return 结果 + */ + Result cancelConfirmation(String confirmationId); + + /** + * 获取确认统计 + * @param regulationId 制度ID + * @return 结果 + */ + Result getConfirmationStatistics(String regulationId); + + /** + * 批量创建确认任务 + * @param regulationId 制度ID + * @param userIds 用户ID列表 + * @return 结果 + */ + Result createConfirmationTasks(String regulationId, String[] userIds); + + /** + * 获取待确认列表 + * @param confirmerId 确认人ID + * @param page 页码 + * @param pageSize 页大小 + * @return 结果 + */ + Result getPendingConfirmations(String confirmerId, Integer page, Integer pageSize); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationService.java b/core/src/main/java/com/dite/znpt/service/RegulationService.java new file mode 100644 index 0000000..dc22557 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RegulationService.java @@ -0,0 +1,85 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.RegulationEntity; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.dto.RegulationDiscussionDTO; +import com.dite.znpt.domain.dto.RegulationConfirmDTO; + +/** + * @author wangna + * @date 2025/07/29 + * @Description: 制度规范仓库Service接口 + */ +public interface RegulationService extends IService { + + /** + * 获取制度列表 + * @param page 页码 + * @param pageSize 页大小 + * @param status 状态 + * @param type 类型 + * @return 结果 + */ + Result getRegulationList(Integer page, Integer pageSize, String status, String type); + + /** + * 创建制度提案 + * @param regulation 制度信息 + * @return 结果 + */ + Result createRegulationProposal(RegulationEntity regulation); + + /** + * 更新制度提案 + * @param regulation 制度信息 + * @return 结果 + */ + Result updateRegulationProposal(RegulationEntity regulation); + + /** + * 获取制度详情 + * @param regulationId 制度ID + * @return 结果 + */ + Result getRegulationDetail(String regulationId); + + /** + * 获取讨论列表 + * @param regulationId 制度ID + * @return 结果 + */ + Result getRegulationDiscussions(String regulationId); + + /** + * 创建讨论 + * @param discussion 讨论信息 + * @return 结果 + */ + Result createDiscussion(RegulationDiscussionDTO discussion); + + /** + * 发布制度 + * @param regulationId 制度ID + * @return 结果 + */ + Result publishRegulation(String regulationId); + + /** + * 获取已发布制度列表 + * @param page 页码 + * @param size 页大小 + * @return 结果 + */ + Result getPublishedRegulations(Integer page, Integer size); + + /** + * 确认制度知晓 + * @param regulationId 制度ID + * @param confirm 确认信息 + * @return 结果 + */ + Result confirmRegulation(String regulationId, RegulationConfirmDTO confirm); + + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java new file mode 100644 index 0000000..bf5385a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java @@ -0,0 +1,184 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.RegulationConfirmationEntity; +import com.dite.znpt.mapper.RegulationConfirmationMapper; +import com.dite.znpt.service.RegulationConfirmationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * @author wangna + * @date 2025/07/28 + * @Description: 制度确认服务实现类 + */ +@Service +@RequiredArgsConstructor +public class RegulationConfirmationServiceImpl extends ServiceImpl implements RegulationConfirmationService { + + @Override + @Transactional(rollbackFor = Exception.class) + public Result confirmRegulation(RegulationConfirmationEntity confirmation) { + try { + // 检查是否已经确认 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationConfirmationEntity::getConfirmerId, confirmation.getConfirmerId()) + .eq(RegulationConfirmationEntity::getRegulationId, confirmation.getRegulationId()) + .eq(RegulationConfirmationEntity::getDelFlag, "0"); + + RegulationConfirmationEntity existingConfirmation = this.getOne(wrapper); + if (existingConfirmation != null) { + return Result.error("您已经确认过该制度"); + } + + confirmation.setConfirmTime(LocalDateTime.now()); + confirmation.setDelFlag("0"); + this.save(confirmation); + return Result.ok("制度确认成功"); + } catch (Exception e) { + return Result.error("制度确认失败:" + e.getMessage()); + } + } + + @Override + public Result getConfirmationRecords(String regulationId) { + try { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationConfirmationEntity::getRegulationId, regulationId) + .eq(RegulationConfirmationEntity::getDelFlag, "0") + .orderByDesc(RegulationConfirmationEntity::getConfirmTime); + + List confirmations = this.list(wrapper); + return Result.ok(confirmations); + } catch (Exception e) { + return Result.error("获取确认记录失败:" + e.getMessage()); + } + } + + @Override + public Result getUserConfirmationRecord(String confirmerId, String regulationId) { + try { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationConfirmationEntity::getConfirmerId, confirmerId) + .eq(RegulationConfirmationEntity::getRegulationId, regulationId) + .eq(RegulationConfirmationEntity::getDelFlag, "0"); + + RegulationConfirmationEntity confirmation = this.getOne(wrapper); + return Result.ok(confirmation); + } catch (Exception e) { + return Result.error("获取用户确认记录失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result cancelConfirmation(String confirmationId) { + try { + RegulationConfirmationEntity confirmation = this.getById(confirmationId); + if (confirmation == null) { + return Result.error("确认记录不存在"); + } + + confirmation.setDelFlag("1"); + this.updateById(confirmation); + return Result.ok("确认取消成功"); + } catch (Exception e) { + return Result.error("确认取消失败:" + e.getMessage()); + } + } + + @Override + public Result getConfirmationStatistics(String regulationId) { + try { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationConfirmationEntity::getRegulationId, regulationId) + .eq(RegulationConfirmationEntity::getDelFlag, "0"); + + List confirmations = this.list(wrapper); + + int confirmedCount = 0; + int declinedCount = 0; + int pendingCount = 0; + + for (RegulationConfirmationEntity confirmation : confirmations) { + switch (confirmation.getStatus()) { + case "CONFIRMED": + confirmedCount++; + break; + case "DECLINED": + declinedCount++; + break; + case "PENDING": + pendingCount++; + break; + } + } + + int totalConfirmations = confirmedCount + declinedCount + pendingCount; + double confirmRate = totalConfirmations > 0 ? (double) confirmedCount / totalConfirmations * 100 : 0; + + return Result.okM(Map.of( + "regulationId", regulationId, + "totalConfirmations", totalConfirmations, + "confirmedCount", confirmedCount, + "declinedCount", declinedCount, + "pendingCount", pendingCount, + "confirmRate", confirmRate + ), "确认统计"); + } catch (Exception e) { + return Result.error("获取确认统计失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createConfirmationTasks(String regulationId, String[] userIds) { + try { + for (String userId : userIds) { + // 检查是否已经存在确认任务 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationConfirmationEntity::getConfirmerId, userId) + .eq(RegulationConfirmationEntity::getRegulationId, regulationId) + .eq(RegulationConfirmationEntity::getDelFlag, "0"); + + RegulationConfirmationEntity existingTask = this.getOne(wrapper); + if (existingTask == null) { + RegulationConfirmationEntity task = new RegulationConfirmationEntity(); + task.setRegulationId(regulationId); + task.setConfirmerId(userId); + task.setStatus("PENDING"); + task.setDelFlag("0"); + this.save(task); + } + } + return Result.okM("确认任务创建成功"); + } catch (Exception e) { + return Result.error("确认任务创建失败:" + e.getMessage()); + } + } + + @Override + public Result getPendingConfirmations(String confirmerId, Integer page, Integer pageSize) { + try { + Page pageParam = new Page<>(page, pageSize); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationConfirmationEntity::getConfirmerId, confirmerId) + .eq(RegulationConfirmationEntity::getStatus, "PENDING") + .eq(RegulationConfirmationEntity::getDelFlag, "0") + .orderByDesc(RegulationConfirmationEntity::getCreateTime); + + Page result = this.page(pageParam, wrapper); + return Result.ok(result); + } catch (Exception e) { + return Result.error("获取待确认列表失败:" + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java new file mode 100644 index 0000000..836bb5f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java @@ -0,0 +1,257 @@ +package com.dite.znpt.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.RegulationEntity; +import com.dite.znpt.domain.entity.RegulationConfirmationEntity; +import com.dite.znpt.domain.dto.RegulationDiscussionDTO; +import com.dite.znpt.domain.dto.RegulationConfirmDTO; +import com.dite.znpt.domain.vo.UserResp; +import com.dite.znpt.mapper.RegulationMapper; +import com.dite.znpt.service.RegulationConfirmationService; +import com.dite.znpt.service.RegulationService; +import com.dite.znpt.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.dite.znpt.mapper.RegulationDraftMapper; +import com.dite.znpt.domain.entity.RegulationDraftEntity; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; +import java.time.LocalDateTime; + + +/** + * @author wangna + * @date 2025/07/29 + * @Description: 制度规范仓库服务实现类 + */ +@Service +@RequiredArgsConstructor +public class RegulationServiceImpl extends ServiceImpl implements RegulationService { + + private final RegulationConfirmationService regulationConfirmationService; + private final UserService userService; + + @Autowired + private RegulationDraftMapper regulationDraftMapper; + + /** + * 每天凌晨1点自动将公示期(10天)已到的草案变为已发布 + */ + @Scheduled(cron = "0 0 1 * * ?") + public void autoPublishDrafts() { + LocalDateTime tenDaysAgo = LocalDateTime.now().minusDays(10); + List drafts = regulationDraftMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(RegulationDraftEntity::getStatus, "DRAFT") + .le(RegulationDraftEntity::getCreateTime, tenDaysAgo) + ); + for (RegulationDraftEntity draft : drafts) { + draft.setStatus("PUBLISHED"); + regulationDraftMapper.updateById(draft); + } + } + + @Override + public Result getRegulationList(Integer page, Integer pageSize, String status, String type) { + try { + Page pageParam = new Page<>(page, pageSize); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationEntity::getDelFlag, "0"); + + if (status != null && !status.isEmpty()) { + wrapper.eq(RegulationEntity::getStatus, status); + } + + if (type != null && !type.isEmpty()) { + wrapper.eq(RegulationEntity::getRegulationType, type); + } + + wrapper.orderByDesc(RegulationEntity::getCreateTime); + + Page result = this.page(pageParam, wrapper); + return Result.ok(result); + } catch (Exception e) { + return Result.error("获取制度列表失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createRegulationProposal(RegulationEntity regulation) { + try { + // 设置初始状态为草稿 + regulation.setStatus("DRAFT"); + regulation.setDelFlag("0"); + + // 设置创建时间和更新时间 + LocalDateTime now = LocalDateTime.now(); + regulation.setCreateTime(now); + regulation.setUpdateTime(now); + + // 设置创建人信息 + String userId = StpUtil.getLoginIdAsString(); + regulation.setCreateBy(userId); + regulation.setUpdateBy(userId); + + // 获取当前用户信息 + UserResp user = userService.detail(userId); + if (user != null) { + regulation.setPublisherId(userId); + regulation.setPublisherName(user.getName()); + } + + // 保存制度 + this.save(regulation); + return Result.okM("制度提案创建成功"); + } catch (Exception e) { + return Result.error("制度提案创建失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result updateRegulationProposal(RegulationEntity regulation) { + try { + RegulationEntity existing = this.getById(regulation.getRegulationId()); + if (existing == null) { + return Result.error("制度不存在"); + } + + regulation.setUpdateTime(LocalDateTime.now()); + regulation.setUpdateBy(StpUtil.getLoginIdAsString()); + this.updateById(regulation); + return Result.okM("制度提案更新成功"); + } catch (Exception e) { + return Result.error("制度提案更新失败:" + e.getMessage()); + } + } + + @Override + public Result getRegulationDetail(String regulationId) { + try { + RegulationEntity regulation = this.getById(regulationId); + if (regulation == null) { + return Result.error("制度不存在"); + } + return Result.ok(regulation); + } catch (Exception e) { + return Result.error("获取制度详情失败:" + e.getMessage()); + } + } + + @Override + public Result getRegulationDiscussions(String regulationId) { + try { + // 这里应该调用讨论服务获取讨论列表 + // 暂时返回模拟数据 + return Result.ok("讨论列表功能待实现"); + } catch (Exception e) { + return Result.error("获取讨论列表失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createDiscussion(RegulationDiscussionDTO discussion) { + try { + // 设置讨论信息 + discussion.setId(java.util.UUID.randomUUID().toString()); + discussion.setAuthorId(StpUtil.getLoginIdAsString()); + + UserResp user = userService.detail(discussion.getAuthorId()); + if (user != null) { + discussion.setAuthorName(user.getName()); + } + + discussion.setCreateTime(LocalDateTime.now()); + + // 这里应该保存讨论到数据库 + // 暂时返回成功 + return Result.okM("评论发表成功"); + } catch (Exception e) { + return Result.error("评论发表失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result publishRegulation(String regulationId) { + try { + RegulationEntity regulation = this.getById(regulationId); + if (regulation == null) { + return Result.error("制度不存在"); + } + + regulation.setStatus("PUBLISHED"); + regulation.setPublishTime(LocalDateTime.now()); + regulation.setUpdateTime(LocalDateTime.now()); + regulation.setUpdateBy(StpUtil.getLoginIdAsString()); + + this.updateById(regulation); + return Result.okM("制度发布成功"); + } catch (Exception e) { + return Result.error("制度发布失败:" + e.getMessage()); + } + } + + @Override + public Result getPublishedRegulations(Integer page, Integer size) { + try { + String userId = cn.dev33.satoken.stp.StpUtil.getLoginIdAsString(); + Page pageParam = new Page<>(page, size); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationEntity::getDelFlag, "0"); + wrapper.eq(RegulationEntity::getStatus, "PUBLISHED"); + wrapper.orderByDesc(RegulationEntity::getPublishTime); + Page result = this.page(pageParam, wrapper); + // 查询当前用户所有确认记录 + java.util.List confirmedIds = regulationConfirmationService.lambdaQuery() + .eq(RegulationConfirmationEntity::getConfirmerId, userId) + .eq(RegulationConfirmationEntity::getStatus, "CONFIRMED") + .eq(RegulationConfirmationEntity::getDelFlag, "0") + .list() + .stream() + .map(RegulationConfirmationEntity::getRegulationId) + .toList(); + for (RegulationEntity reg : result.getRecords()) { + reg.setConfirmStatus(confirmedIds.contains(reg.getRegulationId()) ? "confirmed" : "pending"); + } + return Result.ok(result); + } catch (Exception e) { + return Result.error("获取已发布制度列表失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result confirmRegulation(String regulationId, RegulationConfirmDTO confirm) { + try { + if (!confirm.getAgreeTerms()) { + return Result.error("必须同意条款才能确认"); + } + + String userId = StpUtil.getLoginIdAsString(); + UserResp user = userService.detail(userId); + + RegulationConfirmationEntity confirmation = new RegulationConfirmationEntity(); + confirmation.setRegulationId(regulationId); + confirmation.setConfirmerId(userId); + confirmation.setConfirmerName(user != null ? user.getName() : null); + confirmation.setConfirmerDept(user != null ? user.getDeptName() : null); + confirmation.setStatus("CONFIRMED"); + confirmation.setConfirmTime(LocalDateTime.now()); + confirmation.setDelFlag("0"); + + return regulationConfirmationService.confirmRegulation(confirmation); + } catch (Exception e) { + return Result.error("确认制度失败:" + e.getMessage()); + } + } + +} \ No newline at end of file diff --git a/doc/regulation_api_test.md b/doc/regulation_api_test.md new file mode 100644 index 0000000..e3dd50f --- /dev/null +++ b/doc/regulation_api_test.md @@ -0,0 +1,403 @@ +# 制度模块API测试文档 + +## 1. 获取制度列表 (流程管理页面) + +### 请求信息 +- **URL**: `GET /api/regulation?page=1&size=10` +- **Method**: GET + +### 请求参数 +- `page`: 页码,从1开始(必填) +- `size`: 每页数量(必填) + +### 响应格式 +```json +{ + "status": 200, + "data": { + "records": [ + { + "regulationId": "reg001", + "title": "员工考勤管理制度优化提案", + "content": "建议优化考勤管理制度,增加弹性工作时间,提高员工工作积极性...", + "regulationType": "人事制度", + "status": "VOTING", + "publisherId": "2", + "publisherName": "张三", + "publishTime": "2024-01-01T12:00:00", + "effectiveTime": "2024-01-01T12:00:00", + "expireTime": "2024-01-08T12:00:00", + "scope": "全体员工", + "level": "MEDIUM", + "version": "1.0", + "remark": "需要与人事部门协调实施", + "createBy": "admin", + "updateBy": "admin", + "createTime": "2024-01-01 10:00:00", + "updateTime": "2024-01-01 12:00:00", + "page": 1, + "pageSize": 10, + "delFlag": "0", + "voteFor": 15, + "voteAgainst": 3, + "voteAbstain": 2 + } + ], + "total": 4, + "size": 10, + "current": 1, + "pages": 1 + } +} +``` + +## 2. 创建制度提案 + +### 请求信息 +- **URL**: `POST /api/regulation/proposal` +- **Content-Type**: `application/json` + +### 请求参数 +```json +{ + "title": "员工考勤管理制度优化提案", + "content": "建议优化考勤管理制度,增加弹性工作时间...", + "regulationType": "人事制度", + "scope": "全体员工", + "level": "MEDIUM", + "remark": "需要与人事部门协调实施" +} +``` + +### 响应格式 +```json +{ + "status": 200, + "data": { + "regulationId": "reg005", + "title": "员工考勤管理制度优化提案", + "content": "建议优化考勤管理制度,增加弹性工作时间...", + "regulationType": "人事制度", + "status": "DRAFT", + "publisherId": "1", + "publisherName": "当前用户", + "publishTime": "2024-01-25T10:30:00", + "effectiveTime": "2024-01-25T10:30:00", + "expireTime": "2025-01-25T10:30:00", + "scope": "全体员工", + "level": "MEDIUM", + "version": "1.0", + "remark": "需要与人事部门协调实施", + "createBy": "admin", + "updateBy": "admin", + "createTime": "2024-01-25 10:30:00", + "updateTime": "2024-01-25 10:30:00", + "page": 1, + "pageSize": 10, + "delFlag": "0" + } +} +``` + +## 3. 更新制度提案 + +### 请求信息 +- **URL**: `PUT /api/regulation/proposal/{regulationId}` +- **Content-Type**: `application/json` + +### 请求参数 +```json +{ + "title": "员工考勤管理制度优化提案", + "content": "建议优化考勤管理制度,增加弹性工作时间...", + "regulationType": "人事制度", + "scope": "全体员工", + "level": "MEDIUM", + "remark": "需要与人事部门协调实施" +} +``` + +### 响应格式 +```json +{ + "status": 200, + "message": "制度提案更新成功" +} +``` + +## 4. 删除制度提案 + +### 请求信息 +- **URL**: `DELETE /api/regulation/proposal/{regulationId}` +- **Method**: DELETE + +### 响应格式 +```json +{ + "status": 200, + "data": { + "success": true + } +} +``` + +## 5. 获取制度详情 + +### 请求信息 +- **URL**: `GET /api/regulation/{regulationId}` +- **Method**: GET + +### 响应格式 +```json +{ + "status": 200, + "data": { + "regulationId": "reg001", + "title": "员工考勤管理制度优化提案", + "content": "建议优化考勤管理制度,增加弹性工作时间...", + "regulationType": "人事制度", + "status": "VOTING", + "publisherId": "1", + "publisherName": "张三", + "publishTime": "2024-01-01T12:00:00", + "effectiveTime": "2024-01-01T12:00:00", + "expireTime": "2024-01-08T12:00:00", + "scope": "全体员工", + "level": "MEDIUM", + "version": "1.0", + "remark": "需要与人事部门协调实施", + "createBy": "admin", + "updateBy": "admin", + "createTime": "2024-01-01 10:00:00", + "updateTime": "2024-01-01 12:00:00", + "page": 1, + "pageSize": 10, + "delFlag": "0", + "voteFor": 15, + "voteAgainst": 3, + "voteAbstain": 2 + } +} +``` + +## 6. 获取讨论列表 + +### 请求信息 +- **URL**: `GET /api/regulation/{regulationId}/discussions` +- **Method**: GET + +### 响应格式 +```json +{ + "status": 200, + "data": [ + { + "id": "1", + "regulationId": "reg001", + "authorId": "2", + "authorName": "李四", + "content": "这个提案很有建设性,建议增加一些具体的实施细则。", + "createTime": "2024-01-01 11:00:00" + }, + { + "id": "2", + "regulationId": "reg001", + "authorId": "3", + "authorName": "王五", + "content": "同意这个提案,但需要考虑实施成本。", + "createTime": "2024-01-01 14:30:00" + } + ] +} +``` + +## 7. 发表评论 + +### 请求信息 +- **URL**: `POST /api/regulation/{regulationId}/discussions` +- **Content-Type**: `application/json` + +### 请求参数 +```json +{ + "content": "这个提案很有建设性,建议增加一些具体的实施细则。" +} +``` + +### 响应格式 +```json +{ + "status": 200, + "data": { + "id": "3", + "regulationId": "reg001", + "authorId": "1", + "authorName": "当前用户", + "content": "这个提案很有建设性,建议增加一些具体的实施细则。", + "createTime": "2024-01-25 10:30:00" + } +} +``` + +## 8. 提交投票 + +### 请求信息 +- **URL**: `POST /api/regulation/{regulationId}/vote` +- **Content-Type**: `application/json` + +### 请求参数 +```json +{ + "voteType": "FOR", // FOR: 赞成, AGAINST: 反对, ABSTAIN: 弃权 + "reason": "这个提案很有建设性" // 可选 +} +``` + +### 响应格式 +```json +{ + "status": 200, + "data": { + "success": true + } +} +``` + +## 9. 获取投票结果 + +### 请求信息 +- **URL**: `GET /api/regulation/{regulationId}/vote-result` +- **Method**: GET + +### 响应格式 +```json +{ + "status": 200, + "data": { + "regulationId": "reg001", + "voteFor": 15, + "voteAgainst": 3, + "voteAbstain": 2, + "totalVotes": 20, + "approvalRate": 0.75 + } +} +``` + +## 10. 发布制度 + +### 请求信息 +- **URL**: `POST /api/regulation/{regulationId}/publish` +- **Method**: POST + +### 响应格式 +```json +{ + "status": 200, + "data": { + "success": true + } +} +``` + +## 11. 获取已发布制度列表 + +### 请求信息 +- **URL**: `GET /api/regulation/published?page=1&size=10` +- **Method**: GET + +### 请求参数 +- `page`: 页码(必填) +- `size`: 页大小(必填) + +### 响应格式 +```json +{ + "status": 200, + "data": { + "records": [ + { + "regulationId": "reg002", + "title": "财务报销流程简化提案", + "content": "建议简化财务报销流程,提高工作效率...", + "regulationType": "财务制度", + "status": "PUBLISHED", + "publisherId": "2", + "publisherName": "李四", + "publishTime": "2024-01-15T14:30:00", + "effectiveTime": "2024-01-15T14:30:00", + "expireTime": "2024-12-31T23:59:59", + "scope": "财务部门及相关员工", + "level": "HIGH", + "version": "1.0", + "remark": "已获得财务部门支持", + "createBy": "admin", + "updateBy": "admin", + "createTime": "2024-01-15 14:30:00", + "updateTime": "2024-01-15 14:30:00", + "confirmStatus": "pending" // pending: 待确认, confirmed: 已确认 + } + ], + "total": 2, + "size": 10, + "current": 1, + "pages": 1 + } +} +``` + +## 12. 确认制度知晓 + +### 请求信息 +- **URL**: `POST /api/regulation/{regulationId}/confirm` +- **Content-Type**: `application/json` + +### 请求参数 +```json +{ + "agreeTerms": true +} +``` + +### 响应格式 +```json +{ + "status": 200, + "data": { + "success": true + } +} +``` + +## 13. 批量确认制度 + +### 请求信息 +- **URL**: `POST /api/regulation/confirm-all` +- **Method**: POST + +### 响应格式 +```json +{ + "status": 200, + "data": { + "success": true, + "confirmedCount": 5 + } +} +``` + +## 测试步骤 + +1. **执行建表语句**: 运行 `regulation_tables.sql` +2. **插入测试数据**: 运行 `regulation_test_data.sql` +3. **启动应用**: 确保后端服务正常运行 +4. **测试接口**: 使用Postman或其他工具测试上述接口 + +## 注意事项 + +1. 所有接口都需要用户登录认证 +2. ID字段使用UUID自动生成,无需手动设置 +3. 创建时间和更新时间会自动设置 +4. 创建人和更新人会从当前登录用户获取 +5. 制度状态包括:DRAFT(草稿)、VOTING(投票中)、PUBLISHED(已发布)、ARCHIVED(已归档) +6. 投票类型:FOR(赞成)、AGAINST(反对)、ABSTAIN(弃权) \ No newline at end of file diff --git a/doc/regulation_module_readme.md b/doc/regulation_module_readme.md new file mode 100644 index 0000000..3fe0bf3 --- /dev/null +++ b/doc/regulation_module_readme.md @@ -0,0 +1,224 @@ +# 制度模块说明文档 + +## 概述 + +制度模块是一个完整的企业制度管理系统,包含制度规范仓库、制度草案、个人制度提案等功能,支持讨论、投票、发布等完整的制度管理流程。 + +## 功能模块 + +### 1. 制度规范仓库 (RegulationEntity) + +**功能描述:** 存储正式发布的制度,支持全员知晓承诺的确认 + +**主要功能:** +- 制度发布管理 +- 制度版本控制 +- 制度状态管理(草案、已发布、已归档) +- 制度生效时间管理 +- 制度适用范围管理 + +**核心字段:** +- `regulation_id`: 制度ID +- `title`: 制度标题 +- `content`: 制度内容 +- `status`: 制度状态 +- `publisher_id`: 发布人ID +- `publish_time`: 发布时间 +- `effective_time`: 生效时间 +- `expire_time`: 失效时间 + +### 2. 制度草案 (RegulationDraftEntity) + +**功能描述:** 制度草案管理,包含讨论、投票、发布过程 + +**主要功能:** +- 草案创建和编辑 +- 审核流程管理 +- 投票系统 +- 投票结果统计 +- 草案状态跟踪 + +**核心字段:** +- `draft_id`: 草案ID +- `status`: 草案状态(草稿、审核中、已通过、已拒绝) +- `vote_status`: 投票状态 +- `approve_votes`: 赞成票数 +- `reject_votes`: 反对票数 +- `pass_threshold`: 通过阈值 + +### 3. 制度提案 (RegulationProposalEntity) + +**功能描述:** 个人制度提案,支持小组讨论 + +**主要功能:** +- 提案提交 +- 讨论组管理 +- 讨论结果统计 +- 提案审核 +- 提案转为草案 + +**核心字段:** +- `proposal_id`: 提案ID +- `proposer_id`: 提案人ID +- `discussion_group_id`: 讨论组ID +- `discussion_status`: 讨论状态 +- `support_count`: 支持人数 +- `oppose_count`: 反对人数 + +### 4. 制度投票 (RegulationVoteEntity) + +**功能描述:** 投票系统,支持对草案和提案进行投票 + +**主要功能:** +- 投票记录管理 +- 投票选项(赞成、反对、弃权) +- 投票统计 +- 防重复投票 + +**核心字段:** +- `vote_id`: 投票ID +- `related_id`: 关联ID(草案或提案) +- `related_type`: 关联类型 +- `vote_option`: 投票选项 +- `voter_id`: 投票人ID + +### 5. 制度确认 (RegulationConfirmationEntity) + +**功能描述:** 全员知晓承诺的确认系统 + +**主要功能:** +- 确认任务创建 +- 确认状态管理 +- 确认统计 +- 阅读时长记录 + +**核心字段:** +- `confirmation_id`: 确认ID +- `regulation_id`: 制度ID +- `confirmer_id`: 确认人ID +- `status`: 确认状态 +- `read_duration`: 阅读时长 + +## 业务流程 + +### 制度发布流程 + +1. **提案阶段** + - 个人提交制度提案 + - 进行小组讨论 + - 讨论结果统计 + +2. **草案阶段** + - 提案转为草案 + - 草案审核 + - 投票表决 + - 投票结果统计 + +3. **发布阶段** + - 通过投票的草案转为正式制度 + - 制度发布 + - 全员确认 + +### 投票流程 + +1. **开始投票** + - 设置投票时间 + - 设置通过阈值 + - 通知相关人员 + +2. **投票进行** + - 用户参与投票 + - 实时统计投票结果 + - 防重复投票 + +3. **投票结束** + - 统计最终结果 + - 判断是否通过 + - 更新相关状态 + +### 确认流程 + +1. **创建确认任务** + - 批量创建确认任务 + - 通知相关人员 + +2. **确认进行** + - 用户阅读制度 + - 确认知晓 + - 记录阅读时长 + +3. **确认统计** + - 统计确认情况 + - 生成确认报告 + +## 技术实现 + +### 数据库设计 + +- 采用MyBatis Plus框架 +- 支持软删除 +- 包含审计字段(创建人、创建时间、更新人、更新时间) +- 合理的索引设计 + +### 服务层设计 + +- 采用Service接口 + 实现类的设计模式 +- 支持事务管理 +- 统一的异常处理 +- 统一的返回结果格式 + +### 核心特性 + +- **防重复操作**: 投票和确认都支持防重复机制 +- **状态管理**: 完整的状态流转管理 +- **统计功能**: 支持各种统计和报表功能 +- **扩展性**: 模块化设计,易于扩展 + +## 使用说明 + +### 1. 数据库初始化 + +执行 `doc/regulation_tables.sql` 创建相关数据表。 + +### 2. 服务调用示例 + +```java +// 发布制度 +RegulationEntity regulation = new RegulationEntity(); +regulation.setTitle("员工手册"); +regulation.setContent("员工手册内容..."); +regulationService.publishRegulation(regulation); + +// 创建草案 +RegulationDraftEntity draft = new RegulationDraftEntity(); +draft.setTitle("新制度草案"); +draftService.createDraft(draft); + +// 提交提案 +RegulationProposalEntity proposal = new RegulationProposalEntity(); +proposal.setTitle("制度改进提案"); +proposalService.submitProposal(proposal); + +// 投票 +RegulationVoteEntity vote = new RegulationVoteEntity(); +vote.setVoteOption("APPROVE"); +voteService.vote(vote); + +// 确认制度 +RegulationConfirmationEntity confirmation = new RegulationConfirmationEntity(); +confirmationService.confirmRegulation(confirmation); +``` + +## 注意事项 + +1. **数据一致性**: 所有操作都支持事务管理,确保数据一致性 +2. **权限控制**: 需要配合权限系统使用,控制用户操作权限 +3. **性能优化**: 大数据量时需要考虑分页和索引优化 +4. **日志记录**: 重要操作需要记录操作日志 + +## 扩展建议 + +1. **消息通知**: 集成消息系统,支持邮件、短信通知 +2. **工作流**: 集成工作流引擎,支持更复杂的审批流程 +3. **文档管理**: 集成文档管理系统,支持附件上传 +4. **报表系统**: 集成报表系统,支持更丰富的统计报表 \ No newline at end of file diff --git a/doc/regulation_tables.sql b/doc/regulation_tables.sql new file mode 100644 index 0000000..dbce1b9 --- /dev/null +++ b/doc/regulation_tables.sql @@ -0,0 +1,128 @@ +-- 制度模块数据库表创建脚本 +-- @author wangna +-- @date 2025/07/28 + +-- 制度规范仓库表 +CREATE TABLE `regulation` ( + `regulation_id` varchar(64) NOT NULL COMMENT '制度ID', + `title` varchar(255) NOT NULL COMMENT '制度标题', + `content` text COMMENT '制度内容', + `regulation_type` varchar(50) DEFAULT NULL COMMENT '制度类型', + `status` varchar(20) DEFAULT 'DRAFT' COMMENT '制度状态:DRAFT-草案,PUBLISHED-已发布,ARCHIVED-已归档', + `publisher_id` varchar(64) DEFAULT NULL COMMENT '发布人ID', + `publisher_name` varchar(100) DEFAULT NULL COMMENT '发布人姓名', + `publish_time` datetime DEFAULT NULL COMMENT '发布时间', + `effective_time` datetime DEFAULT NULL COMMENT '生效时间', + `expire_time` datetime DEFAULT NULL COMMENT '失效时间', + `scope` varchar(255) DEFAULT NULL COMMENT '适用范围', + `level` varchar(20) DEFAULT 'MEDIUM' COMMENT '制度级别:HIGH-高级,MEDIUM-中级,LOW-低级', + `version` varchar(20) DEFAULT '1.0' COMMENT '版本号', + `remark` text COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`regulation_id`), + KEY `idx_status` (`status`), + KEY `idx_type` (`regulation_type`), + KEY `idx_publisher` (`publisher_id`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度规范仓库'; + +-- 制度草案表 +CREATE TABLE `regulation_draft` ( + `draft_id` varchar(64) NOT NULL COMMENT '草案ID', + `title` varchar(255) NOT NULL COMMENT '制度标题', + `content` text COMMENT '制度内容', + `regulation_type` varchar(50) DEFAULT NULL COMMENT '制度类型', + `status` varchar(20) DEFAULT 'DRAFT' COMMENT '草案状态:DRAFT-草稿,REVIEWING-审核中,APPROVED-已通过,REJECTED-已拒绝', + `creator_id` varchar(64) DEFAULT NULL COMMENT '创建人ID', + `creator_name` varchar(100) DEFAULT NULL COMMENT '创建人姓名', + `reviewer_id` varchar(64) DEFAULT NULL COMMENT '审核人ID', + `reviewer_name` varchar(100) DEFAULT NULL COMMENT '审核人姓名', + `review_time` datetime DEFAULT NULL COMMENT '审核时间', + `review_comment` text COMMENT '审核意见', + `scope` varchar(255) DEFAULT NULL COMMENT '适用范围', + `level` varchar(20) DEFAULT 'MEDIUM' COMMENT '制度级别:HIGH-高级,MEDIUM-中级,LOW-低级', + `version` varchar(20) DEFAULT '1.0' COMMENT '版本号', + `remark` text COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`draft_id`), + KEY `idx_status` (`status`), + KEY `idx_creator` (`creator_id`), + KEY `idx_reviewer` (`reviewer_id`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度草案'; + +-- 制度提案表 +CREATE TABLE `regulation_proposal` ( + `proposal_id` varchar(64) NOT NULL COMMENT '提案ID', + `title` varchar(255) NOT NULL COMMENT '提案标题', + `content` text COMMENT '提案内容', + `proposal_type` varchar(50) DEFAULT NULL COMMENT '提案类型', + `status` varchar(20) DEFAULT 'SUBMITTED' COMMENT '提案状态:SUBMITTED-已提交,DISCUSSING-讨论中,APPROVED-已通过,REJECTED-已拒绝,CONVERTED-已转为草案', + `proposer_id` varchar(64) DEFAULT NULL COMMENT '提案人ID', + `proposer_name` varchar(100) DEFAULT NULL COMMENT '提案人姓名', + `proposer_dept` varchar(100) DEFAULT NULL COMMENT '提案人部门', + `discussion_group_id` varchar(64) DEFAULT NULL COMMENT '讨论组ID', + `discussion_group_name` varchar(100) DEFAULT NULL COMMENT '讨论组名称', + `discussion_start_time` datetime DEFAULT NULL COMMENT '讨论开始时间', + `discussion_end_time` datetime DEFAULT NULL COMMENT '讨论结束时间', + `discussion_status` varchar(20) DEFAULT 'NOT_STARTED' COMMENT '讨论状态:NOT_STARTED-未开始,DISCUSSING-讨论中,FINISHED-已结束', + `support_count` int DEFAULT 0 COMMENT '支持人数', + `oppose_count` int DEFAULT 0 COMMENT '反对人数', + `total_participants` int DEFAULT 0 COMMENT '总参与人数', + `reviewer_id` varchar(64) DEFAULT NULL COMMENT '审核人ID', + `reviewer_name` varchar(100) DEFAULT NULL COMMENT '审核人姓名', + `review_time` datetime DEFAULT NULL COMMENT '审核时间', + `review_comment` text COMMENT '审核意见', + `converted_draft_id` varchar(64) DEFAULT NULL COMMENT '转为草案ID', + `scope` varchar(255) DEFAULT NULL COMMENT '适用范围', + `level` varchar(20) DEFAULT 'MEDIUM' COMMENT '制度级别:HIGH-高级,MEDIUM-中级,LOW-低级', + `urgency_level` varchar(20) DEFAULT 'MEDIUM' COMMENT '紧急程度:HIGH-高,MEDIUM-中,LOW-低', + `remark` text COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`proposal_id`), + KEY `idx_status` (`status`), + KEY `idx_proposer` (`proposer_id`), + KEY `idx_reviewer` (`reviewer_id`), + KEY `idx_discussion_status` (`discussion_status`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度提案'; + +-- 制度确认表 +CREATE TABLE `regulation_confirmation` ( + `confirmation_id` varchar(64) NOT NULL COMMENT '确认ID', + `regulation_id` varchar(64) NOT NULL COMMENT '制度ID', + `regulation_title` varchar(255) DEFAULT NULL COMMENT '制度标题', + `confirmer_id` varchar(64) NOT NULL COMMENT '确认人ID', + `confirmer_name` varchar(100) DEFAULT NULL COMMENT '确认人姓名', + `confirmer_dept` varchar(100) DEFAULT NULL COMMENT '确认人部门', + `status` varchar(20) DEFAULT 'PENDING' COMMENT '确认状态:PENDING-待确认,CONFIRMED-已确认,DECLINED-已拒绝', + `confirm_time` datetime DEFAULT NULL COMMENT '确认时间', + `confirm_comment` text COMMENT '确认意见', + `read_duration` int DEFAULT 0 COMMENT '阅读时长(秒)', + `ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址', + `user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理', + `remark` text COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`confirmation_id`), + UNIQUE KEY `uk_confirmer_regulation` (`confirmer_id`, `regulation_id`), + KEY `idx_regulation` (`regulation_id`), + KEY `idx_confirmer` (`confirmer_id`), + KEY `idx_status` (`status`), + KEY `idx_confirm_time` (`confirm_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度确认'; \ No newline at end of file diff --git a/doc/regulation_test_data.sql b/doc/regulation_test_data.sql new file mode 100644 index 0000000..ad9567e --- /dev/null +++ b/doc/regulation_test_data.sql @@ -0,0 +1,35 @@ +-- 制度模块测试数据 +-- @author wangna +-- @date 2025/07/29 + +-- 插入测试用户数据(如果不存在) +INSERT INTO `sys_user` (`user_id`, `username`, `nickname`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `login_ip`, `login_date`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES +('1', 'admin', '管理员', 'admin@example.com', '13800138000', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '管理员', '0'), +('2', 'user1', '张三', 'zhangsan@example.com', '13800138001', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '普通用户', '0'), +('3', 'user2', '李四', 'lisi@example.com', '13800138002', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '普通用户', '0'), +('4', 'user3', '王五', 'wangwu@example.com', '13800138003', '0', '', '$2a$10$7JB720yubVSOfvVWdBYoOeymFwJ9WxqHhqjqKqKqKqKqKqKqKqKqK', '0', '127.0.0.1', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', 'admin', '2024-01-01 00:00:00', '普通用户', '0') +ON DUPLICATE KEY UPDATE `update_time` = NOW(); + +-- 插入测试制度数据(符合前端API格式) +INSERT INTO `regulation` (`regulation_id`, `title`, `content`, `regulation_type`, `status`, `publisher_id`, `publisher_name`, `publish_time`, `effective_time`, `expire_time`, `scope`, `level`, `version`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES +('reg001', '员工考勤管理制度优化提案', '建议优化考勤管理制度,增加弹性工作时间,提高员工工作积极性...', '人事制度', 'VOTING', '2', '张三', '2024-01-01 12:00:00', '2024-01-01 12:00:00', '2024-01-08 12:00:00', '全体员工', 'MEDIUM', '1.0', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 12:00:00', '需要与人事部门协调实施', '0'), +('reg002', '财务报销流程简化提案', '建议简化财务报销流程,提高工作效率,减少审批环节...', '财务制度', 'PUBLISHED', '3', '李四', '2024-01-15 14:30:00', '2024-01-15 14:30:00', '2024-12-31 23:59:59', '财务部门及相关员工', 'HIGH', '1.0', 'admin', '2024-01-15 14:00:00', 'admin', '2024-01-15 14:30:00', '已获得财务部门支持', '0'), +('reg003', '技术管理制度', '为规范技术管理流程,提高技术管理水平,特制定本制度...', '技术制度', 'DRAFT', '2', '张三', NULL, NULL, NULL, '技术部门', 'MEDIUM', '1.0', 'admin', '2024-01-25 16:00:00', 'admin', '2024-01-25 16:00:00', '技术管理制度草案', '0'), +('reg004', '项目管理制度', '为规范项目管理流程,提高项目执行效率,特制定本制度...', '项目制度', 'ARCHIVED', '1', '管理员', '2024-01-10 11:00:00', '2024-01-11 00:00:00', '2024-12-31 23:59:59', '项目部门', 'MEDIUM', '1.0', 'admin', '2024-01-10 10:00:00', 'admin', '2024-01-10 11:00:00', '项目管理规范', '0'), +('reg005', '远程办公管理制度', '随着远程办公的普及,需要制定相应的管理制度来规范远程办公行为...', '人事制度', 'DRAFT', '2', '张三', NULL, NULL, NULL, '全体员工', 'HIGH', '1.0', 'admin', '2024-01-27 10:00:00', 'admin', '2024-01-27 10:00:00', '远程办公管理提案', '0'), +('reg006', '数据安全管理制度', '为保护公司数据安全,防止数据泄露,需要制定数据安全管理制度...', '安全制度', 'PENDING', '2', '张三', NULL, NULL, NULL, '全体员工', 'HIGH', '1.0', 'admin', '2024-01-28 09:00:00', 'admin', '2024-01-28 09:00:00', '数据安全管理提案', '0'); + +-- 插入制度草案数据 +INSERT INTO `regulation_draft` (`draft_id`, `regulation_id`, `title`, `content`, `draft_type`, `status`, `creator_id`, `creator_name`, `reviewer_id`, `reviewer_name`, `vote_status`, `vote_start_time`, `vote_end_time`, `approval_status`, `approval_time`, `approval_comment`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES +('draft_001', 'reg003', '技术管理制度', '为规范技术管理流程,提高技术管理水平,特制定本制度...', '技术制度', 'DRAFT', '2', '张三', '1', '管理员', 'PENDING', NULL, NULL, 'PENDING', NULL, NULL, 'admin', '2024-01-25 16:00:00', 'admin', '2024-01-25 16:00:00', '技术管理制度草案', '0'), +('draft_002', 'reg005', '远程办公管理制度', '随着远程办公的普及,需要制定相应的管理制度来规范远程办公行为...', '人事制度', 'REVIEWING', '2', '张三', '1', '管理员', 'VOTING', '2024-01-26 09:00:00', '2024-01-28 18:00:00', 'PENDING', NULL, NULL, 'admin', '2024-01-26 08:00:00', 'admin', '2024-01-26 09:00:00', '远程办公管理制度草案', '0'); + +-- 插入制度提案数据 +INSERT INTO `regulation_proposal` (`proposal_id`, `regulation_id`, `title`, `description`, `proposal_type`, `status`, `proposer_id`, `proposer_name`, `proposer_dept`, `reviewer_id`, `reviewer_name`, `review_status`, `review_time`, `review_comment`, `priority`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES +('proposal_001', 'reg001', '员工考勤管理制度优化提案', '建议优化考勤管理制度,增加弹性工作时间,提高员工工作积极性...', '人事制度', 'APPROVED', '2', '张三', '技术部', '1', '管理员', 'APPROVED', '2024-01-27 14:00:00', '同意提案,可以开始制定制度', 'HIGH', 'admin', '2024-01-27 10:00:00', 'admin', '2024-01-27 14:00:00', '员工考勤管理提案', '0'), +('proposal_002', 'reg006', '数据安全管理制度', '为保护公司数据安全,防止数据泄露,需要制定数据安全管理制度...', '安全制度', 'PENDING', '2', '张三', '技术部', '1', '管理员', 'PENDING', NULL, NULL, 'HIGH', 'admin', '2024-01-28 09:00:00', 'admin', '2024-01-28 09:00:00', '数据安全管理提案', '0'); + +-- 插入制度确认数据 +INSERT INTO `regulation_confirmation` (`confirmation_id`, `regulation_id`, `confirmer_id`, `confirmer_name`, `confirmer_dept`, `status`, `confirm_time`, `confirm_comment`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES +('confirm_001', 'reg002', '2', '张三', '技术部', 'CONFIRMED', '2024-01-16 10:00:00', '已阅读并确认知晓', 'admin', '2024-01-16 10:00:00', 'admin', '2024-01-16 10:00:00', '财务报销制度确认', '0'), +('confirm_002', 'reg002', '3', '李四', '财务部', 'CONFIRMED', '2024-01-21 15:00:00', '已阅读并确认知晓', 'admin', '2024-01-21 15:00:00', 'admin', '2024-01-21 15:00:00', '财务报销制度确认', '0'); \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java new file mode 100644 index 0000000..be4074d --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java @@ -0,0 +1,77 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.RegulationEntity; +import com.dite.znpt.domain.dto.RegulationDiscussionDTO; +import com.dite.znpt.domain.dto.RegulationConfirmDTO; +import com.dite.znpt.service.RegulationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@Api(tags = "制度规范") +@RestController +@RequestMapping("/regulation") +public class RegulationController { + + @Autowired + private RegulationService regulationService; + + @ApiOperation(value = "获取制度列表", httpMethod = "GET") + @GetMapping + public Result getRegulationList(@RequestParam int page, @RequestParam int size) { + return regulationService.getRegulationList(page, size, null, null); + } + + @ApiOperation(value = "创建制度提案", httpMethod = "POST") + @PostMapping("/proposal") + public Result createRegulationProposal(@RequestBody RegulationEntity regulation) { + return regulationService.createRegulationProposal(regulation); + } + + @ApiOperation(value = "更新制度提案", httpMethod = "PUT") + @PutMapping("/proposal/{regulationId}") + public Result updateRegulationProposal(@PathVariable String regulationId, @RequestBody RegulationEntity regulation) { + regulation.setRegulationId(regulationId); + return regulationService.updateRegulationProposal(regulation); + } + + @ApiOperation(value = "获取制度详情", httpMethod = "GET") + @GetMapping("/{regulationId}") + public Result getRegulationDetail(@PathVariable String regulationId) { + return regulationService.getRegulationDetail(regulationId); + } + + @ApiOperation(value = "获取讨论列表", httpMethod = "GET") + @GetMapping("/{regulationId}/discussions") + public Result getRegulationDiscussions(@PathVariable String regulationId) { + return regulationService.getRegulationDiscussions(regulationId); + } + + @ApiOperation(value = "发表评论", httpMethod = "POST") + @PostMapping("/{regulationId}/discussions") + public Result createDiscussion(@PathVariable String regulationId, @RequestBody RegulationDiscussionDTO discussion) { + discussion.setRegulationId(regulationId); + return regulationService.createDiscussion(discussion); + } + + @ApiOperation(value = "发布制度", httpMethod = "POST") + @PostMapping("/{regulationId}/publish") + public Result publishRegulation(@PathVariable String regulationId) { + return regulationService.publishRegulation(regulationId); + } + + @ApiOperation(value = "获取已发布制度列表", httpMethod = "GET") + @GetMapping("/published") + public Result getPublishedRegulations(@RequestParam int page, @RequestParam int size) { + return regulationService.getPublishedRegulations(page, size); + } + + @ApiOperation(value = "确认制度知晓", httpMethod = "POST") + @PostMapping("/{regulationId}/confirm") + public Result confirmRegulation(@PathVariable String regulationId, @RequestBody RegulationConfirmDTO confirm) { + return regulationService.confirmRegulation(regulationId, confirm); + } + +} \ No newline at end of file From 641266e549668778e87ed401add79eb6374d33c6 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Wed, 30 Jul 2025 09:24:22 +0800 Subject: [PATCH 05/38] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=AE=A8=E8=AE=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dto/RegulationDiscussionDTO.java | 20 -- .../dite/znpt/service/RegulationService.java | 31 -- .../service/impl/RegulationServiceImpl.java | 177 ++++------ doc/regulation_api_test.md | 306 ++++++++++++------ doc/regulation_module_readme.md | 15 +- doc/regulation_tables.sql | 28 +- doc/regulation_test_data.sql | 18 +- .../web/controller/RegulationController.java | 40 +-- 8 files changed, 327 insertions(+), 308 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java deleted file mode 100644 index 7eead61..0000000 --- a/core/src/main/java/com/dite/znpt/domain/dto/RegulationDiscussionDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.domain.dto; - -import lombok.Data; -import java.time.LocalDateTime; - -/** - * 制度讨论DTO - * @author wangna - * @date 2025/07/29 - */ -@Data -public class RegulationDiscussionDTO { - - private String id; - private String regulationId; - private String authorId; - private String authorName; - private String content; - private LocalDateTime createTime; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationService.java b/core/src/main/java/com/dite/znpt/service/RegulationService.java index dc22557..5ad0ae0 100644 --- a/core/src/main/java/com/dite/znpt/service/RegulationService.java +++ b/core/src/main/java/com/dite/znpt/service/RegulationService.java @@ -3,7 +3,6 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.RegulationEntity; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.dto.RegulationDiscussionDTO; import com.dite.znpt.domain.dto.RegulationConfirmDTO; /** @@ -44,35 +43,6 @@ public interface RegulationService extends IService { */ Result getRegulationDetail(String regulationId); - /** - * 获取讨论列表 - * @param regulationId 制度ID - * @return 结果 - */ - Result getRegulationDiscussions(String regulationId); - - /** - * 创建讨论 - * @param discussion 讨论信息 - * @return 结果 - */ - Result createDiscussion(RegulationDiscussionDTO discussion); - - /** - * 发布制度 - * @param regulationId 制度ID - * @return 结果 - */ - Result publishRegulation(String regulationId); - - /** - * 获取已发布制度列表 - * @param page 页码 - * @param size 页大小 - * @return 结果 - */ - Result getPublishedRegulations(Integer page, Integer size); - /** * 确认制度知晓 * @param regulationId 制度ID @@ -81,5 +51,4 @@ public interface RegulationService extends IService { */ Result confirmRegulation(String regulationId, RegulationConfirmDTO confirm); - } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java index 836bb5f..868576a 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java @@ -1,22 +1,21 @@ package com.dite.znpt.service.impl; -import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.RegulationEntity; import com.dite.znpt.domain.entity.RegulationConfirmationEntity; -import com.dite.znpt.domain.dto.RegulationDiscussionDTO; import com.dite.znpt.domain.dto.RegulationConfirmDTO; import com.dite.znpt.domain.vo.UserResp; import com.dite.znpt.mapper.RegulationMapper; -import com.dite.znpt.service.RegulationConfirmationService; import com.dite.znpt.service.RegulationService; +import com.dite.znpt.service.RegulationConfirmationService; import com.dite.znpt.service.UserService; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; + import com.dite.znpt.mapper.RegulationDraftMapper; import com.dite.znpt.domain.entity.RegulationDraftEntity; import org.springframework.scheduling.annotation.Scheduled; @@ -24,14 +23,12 @@ import org.springframework.beans.factory.annotation.Autowired; import java.util.List; import java.time.LocalDateTime; - /** * @author wangna * @date 2025/07/29 - * @Description: 制度规范仓库服务实现类 + * @Description: 制度规范仓库Service实现类 */ @Service -@RequiredArgsConstructor public class RegulationServiceImpl extends ServiceImpl implements RegulationService { private final RegulationConfirmationService regulationConfirmationService; @@ -57,24 +54,44 @@ public class RegulationServiceImpl extends ServiceImpl pageParam = new Page<>(page, pageSize); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationEntity::getDelFlag, "0"); if (status != null && !status.isEmpty()) { wrapper.eq(RegulationEntity::getStatus, status); } - if (type != null && !type.isEmpty()) { wrapper.eq(RegulationEntity::getRegulationType, type); } - + wrapper.eq(RegulationEntity::getDelFlag, "0"); wrapper.orderByDesc(RegulationEntity::getCreateTime); Page result = this.page(pageParam, wrapper); + + // 如果是获取已发布的制度,需要添加确认状态 + if (status != null && "PUBLISHED".equals(status)) { + String userId = cn.dev33.satoken.stp.StpUtil.getLoginIdAsString(); + java.util.List confirmedIds = regulationConfirmationService.lambdaQuery() + .eq(RegulationConfirmationEntity::getConfirmerId, userId) + .eq(RegulationConfirmationEntity::getStatus, "CONFIRMED") + .eq(RegulationConfirmationEntity::getDelFlag, "0") + .list() + .stream() + .map(RegulationConfirmationEntity::getRegulationId) + .toList(); + for (RegulationEntity reg : result.getRecords()) { + reg.setConfirmStatus(confirmedIds.contains(reg.getRegulationId()) ? "confirmed" : "pending"); + } + } + return Result.ok(result); } catch (Exception e) { return Result.error("获取制度列表失败:" + e.getMessage()); @@ -85,28 +102,14 @@ public class RegulationServiceImpl extends ServiceImpl pageParam = new Page<>(page, size); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationEntity::getDelFlag, "0"); - wrapper.eq(RegulationEntity::getStatus, "PUBLISHED"); - wrapper.orderByDesc(RegulationEntity::getPublishTime); - Page result = this.page(pageParam, wrapper); - // 查询当前用户所有确认记录 - java.util.List confirmedIds = regulationConfirmationService.lambdaQuery() - .eq(RegulationConfirmationEntity::getConfirmerId, userId) - .eq(RegulationConfirmationEntity::getStatus, "CONFIRMED") + // 检查是否已经确认过 + RegulationConfirmationEntity existingConfirmation = regulationConfirmationService.lambdaQuery() + .eq(RegulationConfirmationEntity::getRegulationId, regulationId) + .eq(RegulationConfirmationEntity::getConfirmerId, cn.dev33.satoken.stp.StpUtil.getLoginIdAsString()) .eq(RegulationConfirmationEntity::getDelFlag, "0") - .list() - .stream() - .map(RegulationConfirmationEntity::getRegulationId) - .toList(); - for (RegulationEntity reg : result.getRecords()) { - reg.setConfirmStatus(confirmedIds.contains(reg.getRegulationId()) ? "confirmed" : "pending"); - } - return Result.ok(result); - } catch (Exception e) { - return Result.error("获取已发布制度列表失败:" + e.getMessage()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Result confirmRegulation(String regulationId, RegulationConfirmDTO confirm) { - try { - if (!confirm.getAgreeTerms()) { - return Result.error("必须同意条款才能确认"); + .one(); + + if (existingConfirmation != null) { + return Result.error("您已经确认过该制度"); } - String userId = StpUtil.getLoginIdAsString(); - UserResp user = userService.detail(userId); - + // 创建确认记录 RegulationConfirmationEntity confirmation = new RegulationConfirmationEntity(); + confirmation.setConfirmationId(java.util.UUID.randomUUID().toString()); confirmation.setRegulationId(regulationId); - confirmation.setConfirmerId(userId); - confirmation.setConfirmerName(user != null ? user.getName() : null); - confirmation.setConfirmerDept(user != null ? user.getDeptName() : null); + confirmation.setConfirmerId(cn.dev33.satoken.stp.StpUtil.getLoginIdAsString()); + + UserResp user = userService.detail(cn.dev33.satoken.stp.StpUtil.getLoginIdAsString()); + if (user != null) { + confirmation.setConfirmerName(user.getName()); + confirmation.setConfirmerDept(user.getDeptName()); + } + confirmation.setStatus("CONFIRMED"); confirmation.setConfirmTime(LocalDateTime.now()); + confirmation.setCreateTime(LocalDateTime.now()); + confirmation.setCreateBy(cn.dev33.satoken.stp.StpUtil.getLoginIdAsString()); + confirmation.setUpdateTime(LocalDateTime.now()); + confirmation.setUpdateBy(cn.dev33.satoken.stp.StpUtil.getLoginIdAsString()); confirmation.setDelFlag("0"); - return regulationConfirmationService.confirmRegulation(confirmation); + regulationConfirmationService.save(confirmation); + return Result.okM("制度确认成功"); } catch (Exception e) { - return Result.error("确认制度失败:" + e.getMessage()); + return Result.error("制度确认失败:" + e.getMessage()); } } diff --git a/doc/regulation_api_test.md b/doc/regulation_api_test.md index e3dd50f..d91afe6 100644 --- a/doc/regulation_api_test.md +++ b/doc/regulation_api_test.md @@ -180,66 +180,7 @@ } ``` -## 6. 获取讨论列表 - -### 请求信息 -- **URL**: `GET /api/regulation/{regulationId}/discussions` -- **Method**: GET - -### 响应格式 -```json -{ - "status": 200, - "data": [ - { - "id": "1", - "regulationId": "reg001", - "authorId": "2", - "authorName": "李四", - "content": "这个提案很有建设性,建议增加一些具体的实施细则。", - "createTime": "2024-01-01 11:00:00" - }, - { - "id": "2", - "regulationId": "reg001", - "authorId": "3", - "authorName": "王五", - "content": "同意这个提案,但需要考虑实施成本。", - "createTime": "2024-01-01 14:30:00" - } - ] -} -``` - -## 7. 发表评论 - -### 请求信息 -- **URL**: `POST /api/regulation/{regulationId}/discussions` -- **Content-Type**: `application/json` - -### 请求参数 -```json -{ - "content": "这个提案很有建设性,建议增加一些具体的实施细则。" -} -``` - -### 响应格式 -```json -{ - "status": 200, - "data": { - "id": "3", - "regulationId": "reg001", - "authorId": "1", - "authorName": "当前用户", - "content": "这个提案很有建设性,建议增加一些具体的实施细则。", - "createTime": "2024-01-25 10:30:00" - } -} -``` - -## 8. 提交投票 +## 6. 提交投票 ### 请求信息 - **URL**: `POST /api/regulation/{regulationId}/vote` @@ -263,7 +204,7 @@ } ``` -## 9. 获取投票结果 +## 7. 获取投票结果 ### 请求信息 - **URL**: `GET /api/regulation/{regulationId}/vote-result` @@ -284,7 +225,7 @@ } ``` -## 10. 发布制度 +## 8. 发布制度 ### 请求信息 - **URL**: `POST /api/regulation/{regulationId}/publish` @@ -294,21 +235,19 @@ ```json { "status": 200, - "data": { - "success": true - } + "message": "制度发布成功" } ``` -## 11. 获取已发布制度列表 +## 9. 获取已发布制度列表 ### 请求信息 - **URL**: `GET /api/regulation/published?page=1&size=10` - **Method**: GET ### 请求参数 -- `page`: 页码(必填) -- `size`: 页大小(必填) +- `page`: 页码(默认1) +- `size`: 页大小(默认10) ### 响应格式 ```json @@ -317,36 +256,22 @@ "data": { "records": [ { - "regulationId": "reg002", - "title": "财务报销流程简化提案", - "content": "建议简化财务报销流程,提高工作效率...", - "regulationType": "财务制度", + "regulationId": "reg001", + "title": "员工考勤管理制度", + "content": "规范员工考勤管理...", "status": "PUBLISHED", - "publisherId": "2", - "publisherName": "李四", - "publishTime": "2024-01-15T14:30:00", - "effectiveTime": "2024-01-15T14:30:00", - "expireTime": "2024-12-31T23:59:59", - "scope": "财务部门及相关员工", - "level": "HIGH", - "version": "1.0", - "remark": "已获得财务部门支持", - "createBy": "admin", - "updateBy": "admin", - "createTime": "2024-01-15 14:30:00", - "updateTime": "2024-01-15 14:30:00", - "confirmStatus": "pending" // pending: 待确认, confirmed: 已确认 + "publishTime": "2024-01-01T12:00:00", + "confirmStatus": "pending" } ], - "total": 2, + "total": 1, "size": 10, - "current": 1, - "pages": 1 + "current": 1 } } ``` -## 12. 确认制度知晓 +## 10. 确认制度知晓 ### 请求信息 - **URL**: `POST /api/regulation/{regulationId}/confirm` @@ -355,7 +280,7 @@ ### 请求参数 ```json { - "agreeTerms": true + "confirmComment": "已阅读并同意遵守该制度" } ``` @@ -363,29 +288,216 @@ ```json { "status": 200, - "data": { - "success": true - } + "message": "制度确认成功" } ``` -## 13. 批量确认制度 +## 11. 批量确认制度 ### 请求信息 - **URL**: `POST /api/regulation/confirm-all` - **Method**: POST +### 响应格式 +```json +{ + "status": 200, + "message": "批量确认成功" +} +``` + +--- + +# 制度类型管理API + +## 1. 获取制度类型列表 + +### 请求信息 +- **URL**: `GET /api/regulation-type?parentId=type_001` +- **Method**: GET + +### 请求参数 +- `parentId`: 父类型ID(可选) + +### 响应格式 +```json +{ + "status": 200, + "data": [ + { + "typeId": "type_005", + "typeName": "考勤管理", + "typeCode": "ATTENDANCE", + "description": "员工考勤相关制度", + "parentId": "type_001", + "level": 2, + "sortOrder": 1, + "isEnabled": "1", + "icon": "clock-circle", + "color": "#1890ff", + "remark": "考勤管理子类型", + "createTime": "2024-01-01 10:00:00", + "updateTime": "2024-01-01 10:00:00" + } + ] +} +``` + +## 2. 获取制度类型树 + +### 请求信息 +- **URL**: `GET /api/regulation-type/tree` +- **Method**: GET + +### 响应格式 +```json +{ + "status": 200, + "data": [ + { + "typeId": "type_001", + "typeName": "人事制度", + "typeCode": "HR", + "description": "人力资源管理相关制度", + "parentId": null, + "level": 1, + "sortOrder": 1, + "isEnabled": "1", + "icon": "user", + "color": "#1890ff", + "children": [ + { + "typeId": "type_005", + "typeName": "考勤管理", + "typeCode": "ATTENDANCE", + "description": "员工考勤相关制度", + "parentId": "type_001", + "level": 2, + "sortOrder": 1, + "isEnabled": "1", + "icon": "clock-circle", + "color": "#1890ff" + } + ] + } + ] +} +``` + +## 3. 创建制度类型 + +### 请求信息 +- **URL**: `POST /api/regulation-type` +- **Content-Type**: `application/json` + +### 请求参数 +```json +{ + "typeName": "新制度类型", + "typeCode": "NEW_TYPE", + "description": "新制度类型描述", + "parentId": "type_001", + "level": 2, + "sortOrder": 3, + "isEnabled": "1", + "icon": "star", + "color": "#f5222d", + "remark": "新制度类型备注" +} +``` + +### 响应格式 +```json +{ + "status": 200, + "message": "制度类型创建成功" +} +``` + +## 4. 更新制度类型 + +### 请求信息 +- **URL**: `PUT /api/regulation-type/type_001` +- **Content-Type**: `application/json` + +### 请求参数 +```json +{ + "typeName": "更新后的制度类型", + "typeCode": "UPDATED_TYPE", + "description": "更新后的描述", + "icon": "star", + "color": "#f5222d" +} +``` + +### 响应格式 +```json +{ + "status": 200, + "message": "制度类型更新成功" +} +``` + +## 5. 删除制度类型 + +### 请求信息 +- **URL**: `DELETE /api/regulation-type/type_001` +- **Method**: DELETE + +### 响应格式 +```json +{ + "status": 200, + "message": "制度类型删除成功" +} +``` + +## 6. 获取制度类型详情 + +### 请求信息 +- **URL**: `GET /api/regulation-type/type_001` +- **Method**: GET + ### 响应格式 ```json { "status": 200, "data": { - "success": true, - "confirmedCount": 5 + "typeId": "type_001", + "typeName": "人事制度", + "typeCode": "HR", + "description": "人力资源管理相关制度", + "parentId": null, + "level": 1, + "sortOrder": 1, + "isEnabled": "1", + "icon": "user", + "color": "#1890ff", + "remark": "人事管理相关制度", + "createTime": "2024-01-01 10:00:00", + "updateTime": "2024-01-01 10:00:00" } } ``` +## 7. 启用/禁用制度类型 + +### 请求信息 +- **URL**: `PUT /api/regulation-type/type_001/status?isEnabled=0` +- **Method**: PUT + +### 请求参数 +- `isEnabled`: 是否启用(1-启用,0-禁用) + +### 响应格式 +```json +{ + "status": 200, + "message": "制度类型禁用成功" +} +``` + ## 测试步骤 1. **执行建表语句**: 运行 `regulation_tables.sql` diff --git a/doc/regulation_module_readme.md b/doc/regulation_module_readme.md index 3fe0bf3..496356f 100644 --- a/doc/regulation_module_readme.md +++ b/doc/regulation_module_readme.md @@ -2,7 +2,7 @@ ## 概述 -制度模块是一个完整的企业制度管理系统,包含制度规范仓库、制度草案、个人制度提案等功能,支持讨论、投票、发布等完整的制度管理流程。 +制度模块是一个完整的企业制度管理系统,包含制度规范仓库、制度草案、个人制度提案等功能,支持投票、发布等完整的制度管理流程。 ## 功能模块 @@ -29,7 +29,7 @@ ### 2. 制度草案 (RegulationDraftEntity) -**功能描述:** 制度草案管理,包含讨论、投票、发布过程 +**功能描述:** 制度草案管理,包含投票、发布过程 **主要功能:** - 草案创建和编辑 @@ -48,22 +48,19 @@ ### 3. 制度提案 (RegulationProposalEntity) -**功能描述:** 个人制度提案,支持小组讨论 +**功能描述:** 个人制度提案,支持审核和转为草案 **主要功能:** - 提案提交 -- 讨论组管理 -- 讨论结果统计 - 提案审核 - 提案转为草案 **核心字段:** - `proposal_id`: 提案ID - `proposer_id`: 提案人ID -- `discussion_group_id`: 讨论组ID -- `discussion_status`: 讨论状态 -- `support_count`: 支持人数 -- `oppose_count`: 反对人数 +- `status`: 提案状态 +- `reviewer_id`: 审核人ID +- `converted_draft_id`: 转为草案ID ### 4. 制度投票 (RegulationVoteEntity) diff --git a/doc/regulation_tables.sql b/doc/regulation_tables.sql index dbce1b9..053dfcf 100644 --- a/doc/regulation_tables.sql +++ b/doc/regulation_tables.sql @@ -125,4 +125,30 @@ CREATE TABLE `regulation_confirmation` ( KEY `idx_confirmer` (`confirmer_id`), KEY `idx_status` (`status`), KEY `idx_confirm_time` (`confirm_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度确认'; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度确认'; + +-- 制度类型表 +CREATE TABLE `regulation_type` ( + `type_id` varchar(64) NOT NULL COMMENT '类型ID', + `type_name` varchar(100) NOT NULL COMMENT '类型名称', + `type_code` varchar(50) NOT NULL COMMENT '类型编码', + `description` text COMMENT '类型描述', + `parent_id` varchar(64) DEFAULT NULL COMMENT '父类型ID', + `level` int DEFAULT 1 COMMENT '层级(1-一级,2-二级,3-三级)', + `sort_order` int DEFAULT 0 COMMENT '排序号', + `is_enabled` char(1) DEFAULT '1' COMMENT '是否启用(0-禁用,1-启用)', + `icon` varchar(100) DEFAULT NULL COMMENT '图标', + `color` varchar(20) DEFAULT NULL COMMENT '颜色', + `remark` text COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`type_id`), + UNIQUE KEY `uk_type_code` (`type_code`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_level` (`level`), + KEY `idx_sort_order` (`sort_order`), + KEY `idx_is_enabled` (`is_enabled`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='制度类型'; \ No newline at end of file diff --git a/doc/regulation_test_data.sql b/doc/regulation_test_data.sql index ad9567e..80fed49 100644 --- a/doc/regulation_test_data.sql +++ b/doc/regulation_test_data.sql @@ -30,6 +30,18 @@ INSERT INTO `regulation_proposal` (`proposal_id`, `regulation_id`, `title`, `des ('proposal_002', 'reg006', '数据安全管理制度', '为保护公司数据安全,防止数据泄露,需要制定数据安全管理制度...', '安全制度', 'PENDING', '2', '张三', '技术部', '1', '管理员', 'PENDING', NULL, NULL, 'HIGH', 'admin', '2024-01-28 09:00:00', 'admin', '2024-01-28 09:00:00', '数据安全管理提案', '0'); -- 插入制度确认数据 -INSERT INTO `regulation_confirmation` (`confirmation_id`, `regulation_id`, `confirmer_id`, `confirmer_name`, `confirmer_dept`, `status`, `confirm_time`, `confirm_comment`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES -('confirm_001', 'reg002', '2', '张三', '技术部', 'CONFIRMED', '2024-01-16 10:00:00', '已阅读并确认知晓', 'admin', '2024-01-16 10:00:00', 'admin', '2024-01-16 10:00:00', '财务报销制度确认', '0'), -('confirm_002', 'reg002', '3', '李四', '财务部', 'CONFIRMED', '2024-01-21 15:00:00', '已阅读并确认知晓', 'admin', '2024-01-21 15:00:00', 'admin', '2024-01-21 15:00:00', '财务报销制度确认', '0'); \ No newline at end of file +INSERT INTO `regulation_confirmation` (`confirmation_id`, `regulation_id`, `regulation_title`, `confirmer_id`, `confirmer_name`, `confirmer_dept`, `status`, `confirm_time`, `confirm_comment`, `read_duration`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `del_flag`) VALUES +('confirm_001', 'reg001', '员工考勤管理制度', '2', '李四', '技术部', 'CONFIRMED', '2024-01-02 10:00:00', '已阅读并同意遵守该制度', 120, 'admin', '2024-01-02 10:00:00', 'admin', '2024-01-02 10:00:00', '员工考勤制度确认', '0'), +('confirm_002', 'reg001', '员工考勤管理制度', '3', '王五', '人事部', 'CONFIRMED', '2024-01-02 14:30:00', '已确认知晓', 90, 'admin', '2024-01-02 14:30:00', 'admin', '2024-01-02 14:30:00', '员工考勤制度确认', '0'), +('confirm_003', 'reg002', '财务报销流程简化提案', '1', '张三', '财务部', 'PENDING', NULL, NULL, 0, 'admin', '2024-01-15 15:00:00', 'admin', '2024-01-15 15:00:00', '财务制度确认', '0'); + +-- 插入制度类型数据 +INSERT INTO `regulation_type` (`type_id`, `type_name`, `type_code`, `description`, `parent_id`, `level`, `sort_order`, `is_enabled`, `icon`, `color`, `remark`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`) VALUES +('type_001', '人事制度', 'HR', '人力资源管理相关制度', NULL, 1, 1, '1', 'user', '#1890ff', '人事管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '人事制度类型', '0'), +('type_002', '财务制度', 'FINANCE', '财务管理相关制度', NULL, 1, 2, '1', 'dollar', '#52c41a', '财务管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '财务制度类型', '0'), +('type_003', '安全制度', 'SAFETY', '安全管理相关制度', NULL, 1, 3, '1', 'shield', '#faad14', '安全管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '安全制度类型', '0'), +('type_004', '设备制度', 'EQUIPMENT', '设备管理相关制度', NULL, 1, 4, '1', 'tool', '#722ed1', '设备管理相关制度', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '设备制度类型', '0'), +('type_005', '考勤管理', 'ATTENDANCE', '员工考勤相关制度', 'type_001', 2, 1, '1', 'clock-circle', '#1890ff', '考勤管理子类型', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '考勤管理子类型', '0'), +('type_006', '薪酬管理', 'SALARY', '员工薪酬相关制度', 'type_001', 2, 2, '1', 'wallet', '#1890ff', '薪酬管理子类型', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '薪酬管理子类型', '0'), +('type_007', '报销管理', 'EXPENSE', '费用报销相关制度', 'type_002', 2, 1, '1', 'file-text', '#52c41a', '报销管理子类型', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '报销管理子类型', '0'), +('type_008', '预算管理', 'BUDGET', '预算管理相关制度', 'type_002', 2, 2, '1', 'calculator', '#52c41a', '预算管理子类型', 'admin', '2024-01-01 10:00:00', 'admin', '2024-01-01 10:00:00', '预算管理子类型', '0'); \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java index be4074d..aa7cfcd 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java @@ -2,7 +2,6 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.RegulationEntity; -import com.dite.znpt.domain.dto.RegulationDiscussionDTO; import com.dite.znpt.domain.dto.RegulationConfirmDTO; import com.dite.znpt.service.RegulationService; import io.swagger.annotations.Api; @@ -10,7 +9,12 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -@Api(tags = "制度规范") +/** + * @author wangna + * @date 2025/07/29 + * @Description: 制度规范仓库Controller + */ +@Api(tags = "制度管理") @RestController @RequestMapping("/regulation") public class RegulationController { @@ -20,8 +24,11 @@ public class RegulationController { @ApiOperation(value = "获取制度列表", httpMethod = "GET") @GetMapping - public Result getRegulationList(@RequestParam int page, @RequestParam int size) { - return regulationService.getRegulationList(page, size, null, null); + public Result getRegulationList(@RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "10") int size, + @RequestParam(required = false) String status, + @RequestParam(required = false) String type) { + return regulationService.getRegulationList(page, size, status, type); } @ApiOperation(value = "创建制度提案", httpMethod = "POST") @@ -43,31 +50,6 @@ public class RegulationController { return regulationService.getRegulationDetail(regulationId); } - @ApiOperation(value = "获取讨论列表", httpMethod = "GET") - @GetMapping("/{regulationId}/discussions") - public Result getRegulationDiscussions(@PathVariable String regulationId) { - return regulationService.getRegulationDiscussions(regulationId); - } - - @ApiOperation(value = "发表评论", httpMethod = "POST") - @PostMapping("/{regulationId}/discussions") - public Result createDiscussion(@PathVariable String regulationId, @RequestBody RegulationDiscussionDTO discussion) { - discussion.setRegulationId(regulationId); - return regulationService.createDiscussion(discussion); - } - - @ApiOperation(value = "发布制度", httpMethod = "POST") - @PostMapping("/{regulationId}/publish") - public Result publishRegulation(@PathVariable String regulationId) { - return regulationService.publishRegulation(regulationId); - } - - @ApiOperation(value = "获取已发布制度列表", httpMethod = "GET") - @GetMapping("/published") - public Result getPublishedRegulations(@RequestParam int page, @RequestParam int size) { - return regulationService.getPublishedRegulations(page, size); - } - @ApiOperation(value = "确认制度知晓", httpMethod = "POST") @PostMapping("/{regulationId}/confirm") public Result confirmRegulation(@PathVariable String regulationId, @RequestBody RegulationConfirmDTO confirm) { From 4b46233805eadfa1c41452d6c11d044109bcef2a Mon Sep 17 00:00:00 2001 From: "Mr.j" <2221464500@qq.com> Date: Wed, 30 Jul 2025 09:43:02 +0800 Subject: [PATCH 06/38] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=9F=B9=E8=AE=AD?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/TrainingCertificateEntity.java | 71 ++ .../entity/TrainingInteractionEntity.java | 65 ++ .../domain/entity/TrainingMaterialEntity.java | 70 ++ .../domain/entity/TrainingPlanEntity.java | 96 ++ .../domain/entity/TrainingRecordEntity.java | 92 ++ .../znpt/domain/vo/TrainingMaterialResp.java | 36 + .../znpt/domain/vo/TrainingPlanListReq.java | 36 + .../znpt/domain/vo/TrainingPlanListResp.java | 69 ++ .../dite/znpt/domain/vo/TrainingPlanReq.java | 63 ++ .../dite/znpt/domain/vo/TrainingPlanResp.java | 76 ++ .../znpt/domain/vo/TrainingRecordResp.java | 51 ++ .../mapper/TrainingCertificateMapper.java | 15 + .../mapper/TrainingInteractionMapper.java | 15 + .../znpt/mapper/TrainingMaterialMapper.java | 15 + .../dite/znpt/mapper/TrainingPlanMapper.java | 27 + .../znpt/mapper/TrainingRecordMapper.java | 15 + .../znpt/service/TrainingPlanService.java | 78 ++ .../znpt/service/TrainingRecordService.java | 13 + .../service/impl/TrainingPlanServiceImpl.java | 123 +++ .../impl/TrainingRecordServiceImpl.java | 17 + .../resources/mapper/TrainingPlanMapper.xml | 50 + doc/aesDemo.html | 459 ---------- sip/pom.xml | 52 -- .../monitor/config/MediaFormatConfig.java | 30 - .../dite/znpt/monitor/constant/Constants.java | 37 - .../monitor/constant/IotCacheConstants.java | 37 - .../monitor/constant/IotDictConstants.java | 20 - .../znpt/monitor/constant/IotRespMessage.java | 113 --- .../monitor/constant/dict/CameraType.java | 32 - .../monitor/constant/dict/DeviceStatus.java | 34 - .../constant/dict/SipTransferMode.java | 26 - .../constant/dict/StreamTransferMode.java | 27 - .../monitor/constant/dict/ValueAndLabel.java | 14 - .../znpt/monitor/constant/dict/YesOrNo.java | 32 - .../znpt/monitor/domain/CustomFunction.java | 14 - .../entity/DeviceVideoChannelEntity.java | 124 --- .../domain/entity/DeviceVideoEntity.java | 97 -- .../monitor/domain/entity/IpConfigEntity.java | 35 - .../domain/req/MonitorConfigAddReq.java | 14 - .../znpt/monitor/domain/req/VideoInfoReq.java | 23 - .../monitor/domain/resp/DeviceVideoResp.java | 19 - .../monitor/domain/resp/VideoInfoResp.java | 58 -- .../vo/video/DeviceVideoChannelEditReq.java | 34 - .../vo/video/DeviceVideoChannelListResp.java | 55 -- .../vo/video/DeviceVideoChannelResp.java | 43 - .../domain/vo/video/DeviceVideoEditReq.java | 29 - .../domain/vo/video/DeviceVideoListResp.java | 74 -- .../domain/vo/video/DeviceVideoNumResp.java | 24 - .../domain/vo/video/StreamMediaFormat.java | 77 -- .../domain/vo/video/StreamMediaFormatReq.java | 28 - .../vo/video/StreamMediaFormatResp.java | 31 - .../vo/video/StreamMediaServerConfigReq.java | 59 -- .../vo/video/StreamMediaServerConfigResp.java | 60 -- .../monitor/domain/vo/video/VideoPayResp.java | 24 - .../mapper/DeviceVideoChannelMapper.java | 55 -- .../monitor/mapper/DeviceVideoMapper.java | 24 - .../znpt/monitor/mapper/IpConfigMapper.java | 13 - .../mapper/StreamMediaFormatMapper.java | 12 - .../dite/znpt/monitor/media/zlm/ZlmApi.java | 1 - .../dite/znpt/monitor/media/zlm/ZlmHook.java | 135 --- .../znpt/monitor/media/zlm/ZlmService.java | 42 - .../media/zlm/cache/MediaServerCache.java | 38 - .../zlm/cache/MediaServerChannelCache.java | 54 -- .../zlm/config/StreamMediaServerConfig.java | 46 - .../znpt/monitor/media/zlm/dto/MediaItem.java | 130 --- .../monitor/media/zlm/dto/ServerConfig.java | 852 ------------------ .../monitor/media/zlm/dto/ServerInfo.java | 30 - .../monitor/media/zlm/dto/ServerItem.java | 108 --- .../media/zlm/dto/event/BaseEventReq.java | 48 - .../media/zlm/dto/event/BaseEventResp.java | 42 - .../media/zlm/dto/event/FlowReportReq.java | 26 - .../media/zlm/dto/event/HttpAccessReq.java | 29 - .../media/zlm/dto/event/HttpAccessResp.java | 34 - .../monitor/media/zlm/dto/event/PlayReq.java | 14 - .../media/zlm/dto/event/PublishReq.java | 14 - .../media/zlm/dto/event/PublishResp.java | 81 -- .../media/zlm/dto/event/RecordMp4Req.java | 48 - .../media/zlm/dto/event/RtspAuthReq.java | 30 - .../media/zlm/dto/event/RtspAuthResp.java | 30 - .../media/zlm/dto/event/RtspRealmReq.java | 14 - .../zlm/dto/event/ServerKeepaliveReq.java | 16 - .../media/zlm/dto/event/ShellLoginReq.java | 24 - .../media/zlm/dto/event/StreamChangedReq.java | 19 - .../zlm/dto/event/StreamNoneReaderReq.java | 14 - .../zlm/dto/event/StreamNotFoundReq.java | 14 - .../monitor/media/zlm/dto/req/BaseReq.java | 18 - .../media/zlm/dto/req/CloseStreamReq.java | 18 - .../media/zlm/dto/req/FFmpegSourceReq.java | 45 - .../media/zlm/dto/req/GetAllSessionReq.java | 25 - .../zlm/dto/req/GetMp4RecordFileReq.java | 24 - .../znpt/monitor/media/zlm/dto/req/IdReq.java | 20 - .../monitor/media/zlm/dto/req/KeyReq.java | 20 - .../monitor/media/zlm/dto/req/RecordReq.java | 29 - .../media/zlm/dto/req/RtpServerReq.java | 45 - .../monitor/media/zlm/dto/req/SendRtpReq.java | 53 -- .../monitor/media/zlm/dto/req/SnapReq.java | 29 - .../media/zlm/dto/req/StreamIdReq.java | 22 - .../media/zlm/dto/req/StreamProxyReq.java | 89 -- .../zlm/dto/req/StreamPusherProxyReq.java | 35 - .../monitor/media/zlm/dto/req/StreamReq.java | 32 - .../monitor/media/zlm/dto/resp/BaseResp.java | 64 -- .../media/zlm/dto/resp/CloseStreamResp.java | 25 - .../monitor/media/zlm/dto/resp/MediaResp.java | 61 -- .../media/zlm/dto/resp/Mp4RecordFileResp.java | 23 - .../media/zlm/dto/resp/OriginSock.java | 26 - .../media/zlm/dto/resp/RtpInfoResp.java | 39 - .../media/zlm/dto/resp/RtpServerResp.java | 22 - .../media/zlm/dto/resp/SessionResp.java | 41 - .../media/zlm/dto/resp/StatisticResp.java | 28 - .../media/zlm/dto/resp/ThreadsLoadResp.java | 22 - .../monitor/media/zlm/dto/resp/Track.java | 61 -- .../media/zlm/enums/MediaFormatType.java | 43 - .../monitor/media/zlm/impl/ZlmApiImpl.java | 223 ----- .../media/zlm/impl/ZlmHookService.java | 132 --- .../media/zlm/impl/ZlmServiceImpl.java | 195 ---- .../service/DeviceVideoChannelService.java | 120 --- .../monitor/service/DeviceVideoService.java | 104 --- .../znpt/monitor/service/IpConfigService.java | 27 - .../service/StreamMediaFormatService.java | 12 - .../impl/DeviceVideoChannelServiceImpl.java | 262 ------ .../service/impl/DeviceVideoServiceImpl.java | 225 ----- .../service/impl/IpConfigServiceImpl.java | 80 -- .../impl/StreamMediaFormatServiceImpl.java | 17 - .../com/dite/znpt/monitor/sip/SipLayer.java | 102 --- .../znpt/monitor/sip/config/SipConfig.java | 38 - .../sip/session/StreamSessionManager.java | 26 - .../sip/transmit/SipProcessorFactoryI.java | 11 - .../sip/transmit/SipProcessorFactoryImpl.java | 99 -- .../sip/transmit/cmd/ISipDeviceCommander.java | 50 - .../cmd/SipRequestHeaderProvider.java | 120 --- .../cmd/impl/SipDeviceCommanderImpl.java | 226 ----- .../request/ISipRequestProcessor.java | 12 - .../request/ISipRequestProcessorAbstract.java | 259 ------ .../request/impl/AckRequestProcessorImpl.java | 53 -- .../request/impl/ByeRequestProcessorImpl.java | 63 -- .../impl/MessageRequestProcessorImpl.java | 75 -- .../impl/RegisterRequestProcessorImpl.java | 158 ---- .../request/impl/message/IMessageHandler.java | 20 - .../message/query/CatalogHandlerImpl.java | 137 --- .../message/query/DeviceInfoHandlerImpl.java | 68 -- .../query/DeviceStatusHandlerImpl.java | 68 -- .../message/query/KeepaliveHandlerImpl.java | 89 -- .../response/ISipResponseProcessor.java | 13 - .../ISipResponseProcessorAbstract.java | 12 - .../impl/InviteResponseProcessorImpl.java | 1 - .../transmit/timeout/ITimeoutProcessor.java | 7 - .../timeout/impl/TimeoutProcessorImpl.java | 34 - .../DigestServerAuthenticationHelper.java | 210 ----- .../dite/znpt/monitor/sip/utils/XmlUtil.java | 95 -- .../znpt/monitor/sip/vo/DeviceAlarmVo.java | 49 - .../znpt/monitor/sip/vo/DeviceChannelVo.java | 129 --- .../dite/znpt/monitor/sip/vo/DeviceVo.java | 56 -- .../com/dite/znpt/monitor/sip/vo/HostVo.java | 12 - .../znpt/monitor/sip/vo/RecordItemVo.java | 31 - .../dite/znpt/monitor/sip/vo/RecordVo.java | 23 - .../dite/znpt/monitor/utils/DictUtils.java | 33 - .../mapper/iot/DeviceVideoChannelMapper.xml | 84 -- .../mapper/iot/DeviceVideoMapper.xml | 45 - .../resources/mapper/iot/IpConfigMapper.xml | 17 - .../controller/TrainingPlanController.java | 79 ++ .../znpt/web/controller/VideoController.java | 188 ---- web/src/main/resources/application-dev.yml | 2 +- 162 files changed, 1173 insertions(+), 8942 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/TrainingPlanService.java create mode 100644 core/src/main/java/com/dite/znpt/service/TrainingRecordService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java create mode 100644 core/src/main/resources/mapper/TrainingPlanMapper.xml delete mode 100644 doc/aesDemo.html delete mode 100644 sip/pom.xml delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java delete mode 100644 sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java delete mode 100644 sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml delete mode 100644 sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml delete mode 100644 sip/src/main/resources/mapper/iot/IpConfigMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java new file mode 100644 index 0000000..b597ffd --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java @@ -0,0 +1,71 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训证书表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("training_certificate") +@ApiModel(value="TrainingCertificateEntity对象", description="培训证书表") +public class TrainingCertificateEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty("证书ID") + @ApiModelProperty("证书ID") + @TableId(value = "certificate_id", type = IdType.ASSIGN_UUID) + private String certificateId; + + @ExcelProperty("培训记录ID") + @ApiModelProperty("培训记录ID") + @TableField("record_id") + private String recordId; + + @ExcelProperty("证书编号") + @ApiModelProperty("证书编号") + @TableField("certificate_code") + private String certificateCode; + + @ExcelProperty("证书名称") + @ApiModelProperty("证书名称") + @TableField("certificate_name") + private String certificateName; + + @ExcelProperty("发证日期") + @ApiModelProperty("发证日期") + @TableField("issue_date") + private LocalDate issueDate; + + @ExcelProperty("有效期至") + @ApiModelProperty("有效期至") + @TableField("valid_until") + private LocalDate validUntil; + + @ExcelProperty("证书文件路径") + @ApiModelProperty("证书文件路径") + @TableField("certificate_path") + private String certificatePath; + + @ExcelProperty("状态") + @ApiModelProperty("状态:VALID-有效,EXPIRED-已过期,REVOKED-已撤销") + @TableField("status") + private String status; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java new file mode 100644 index 0000000..f8a0d0a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java @@ -0,0 +1,65 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训互动记录表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("training_interaction") +@ApiModel(value="TrainingInteractionEntity对象", description="培训互动记录表") +public class TrainingInteractionEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty("互动记录ID") + @ApiModelProperty("互动记录ID") + @TableId(value = "interaction_id", type = IdType.ASSIGN_UUID) + private String interactionId; + + @ExcelProperty("培训计划ID") + @ApiModelProperty("培训计划ID") + @TableField("plan_id") + private String planId; + + @ExcelProperty("用户ID") + @ApiModelProperty("用户ID") + @TableField("user_id") + private String userId; + + @ExcelProperty("用户姓名") + @ApiModelProperty("用户姓名") + @TableField("user_name") + private String userName; + + @ExcelProperty("互动类型") + @ApiModelProperty("互动类型:QUESTION-提问,ANSWER-回答,COMMENT-评论,LIKE-点赞") + @TableField("interaction_type") + private String interactionType; + + @ExcelProperty("互动内容") + @ApiModelProperty("互动内容") + @TableField("content") + private String content; + + @ExcelProperty("父级互动ID") + @ApiModelProperty("父级互动ID(用于回复)") + @TableField("parent_id") + private String parentId; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java new file mode 100644 index 0000000..5ccb74e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java @@ -0,0 +1,70 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训材料表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("training_material") +@ApiModel(value="TrainingMaterialEntity对象", description="培训材料表") +public class TrainingMaterialEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty("培训材料ID") + @ApiModelProperty("培训材料ID") + @TableId(value = "material_id", type = IdType.ASSIGN_UUID) + private String materialId; + + @ExcelProperty("培训计划ID") + @ApiModelProperty("培训计划ID") + @TableField("plan_id") + private String planId; + + @ExcelProperty("材料名称") + @ApiModelProperty("材料名称") + @TableField("material_name") + private String materialName; + + @ExcelProperty("材料类型") + @ApiModelProperty("材料类型:DOCUMENT-文档,VIDEO-视频,AUDIO-音频,IMAGE-图片") + @TableField("material_type") + private String materialType; + + @ExcelProperty("材料路径") + @ApiModelProperty("材料路径") + @TableField("material_path") + private String materialPath; + + @ExcelProperty("材料大小") + @ApiModelProperty("材料大小(字节)") + @TableField("material_size") + private Long materialSize; + + @ExcelProperty("材料描述") + @ApiModelProperty("材料描述") + @TableField("description") + private String description; + + @ExcelProperty("排序") + @ApiModelProperty("排序") + @TableField("sort_order") + private Integer sortOrder; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java new file mode 100644 index 0000000..5c705fe --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java @@ -0,0 +1,96 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("training_plan") +@ApiModel(value="TrainingPlanEntity对象", description="培训计划表") +public class TrainingPlanEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty("培训计划ID") + @ApiModelProperty("培训计划ID") + @TableId(value = "plan_id", type = IdType.ASSIGN_UUID) + private String planId; + + @ExcelProperty("培训计划名称") + @ApiModelProperty("培训计划名称") + @TableField("plan_name") + private String planName; + + @ExcelProperty("培训类型") + @ApiModelProperty("培训类型:SAFETY-安全教育,SKILL-技能培训,CULTURE-企业文化") + @TableField("training_type") + private String trainingType; + + @ExcelProperty("培训级别") + @ApiModelProperty("培训级别:SITE-现场级,DEPARTMENT-部门级,COMPANY-公司级") + @TableField("training_level") + private String trainingLevel; + + @ExcelProperty("培训内容") + @ApiModelProperty("培训内容") + @TableField("training_content") + private String trainingContent; + + @ExcelProperty("培训讲师") + @ApiModelProperty("培训讲师") + @TableField("trainer") + private String trainer; + + @ExcelProperty("培训地点") + @ApiModelProperty("培训地点") + @TableField("training_location") + private String trainingLocation; + + @ExcelProperty("培训开始时间") + @ApiModelProperty("培训开始时间") + @TableField("start_time") + private LocalDateTime startTime; + + @ExcelProperty("培训结束时间") + @ApiModelProperty("培训结束时间") + @TableField("end_time") + private LocalDateTime endTime; + + @ExcelProperty("培训状态") + @ApiModelProperty("培训状态:DRAFT-草稿,PUBLISHED-已发布,IN_PROGRESS-进行中,COMPLETED-已完成,CANCELLED-已取消") + @TableField("status") + private String status; + + @ExcelProperty("最大参训人数") + @ApiModelProperty("最大参训人数") + @TableField("max_participants") + private Integer maxParticipants; + + @ExcelProperty("培训要求") + @ApiModelProperty("培训要求") + @TableField("requirements") + private String requirements; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java new file mode 100644 index 0000000..81d6f86 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java @@ -0,0 +1,92 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训记录表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("training_record") +@ApiModel(value="TrainingRecordEntity对象", description="培训记录表") +public class TrainingRecordEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty("培训记录ID") + @ApiModelProperty("培训记录ID") + @TableId(value = "record_id", type = IdType.ASSIGN_UUID) + private String recordId; + + @ExcelProperty("培训计划ID") + @ApiModelProperty("培训计划ID") + @TableField("plan_id") + private String planId; + + @ExcelProperty("参训人员ID") + @ApiModelProperty("参训人员ID") + @TableField("user_id") + private String userId; + + @ExcelProperty("参训人员姓名") + @ApiModelProperty("参训人员姓名") + @TableField("user_name") + private String userName; + + @ExcelProperty("部门ID") + @ApiModelProperty("部门ID") + @TableField("dept_id") + private String deptId; + + @ExcelProperty("部门名称") + @ApiModelProperty("部门名称") + @TableField("dept_name") + private String deptName; + + @ExcelProperty("出勤状态") + @ApiModelProperty("出勤状态:PENDING-待确认,PRESENT-出席,ABSENT-缺席,LATE-迟到") + @TableField("attendance_status") + private String attendanceStatus; + + @ExcelProperty("签到时间") + @ApiModelProperty("签到时间") + @TableField("sign_in_time") + private LocalDateTime signInTime; + + @ExcelProperty("签退时间") + @ApiModelProperty("签退时间") + @TableField("sign_out_time") + private LocalDateTime signOutTime; + + @ExcelProperty("培训成绩") + @ApiModelProperty("培训成绩") + @TableField("score") + private BigDecimal score; + + @ExcelProperty("培训反馈") + @ApiModelProperty("培训反馈") + @TableField("feedback") + private String feedback; + + @ExcelProperty("证书ID") + @ApiModelProperty("证书ID") + @TableField("certificate_id") + private String certificateId; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java new file mode 100644 index 0000000..226da82 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训材料响应VO + */ +@Data +@ApiModel(value="TrainingMaterialResp对象", description="培训材料响应") +public class TrainingMaterialResp { + + @ApiModelProperty("培训材料ID") + private String materialId; + + @ApiModelProperty("材料名称") + private String materialName; + + @ApiModelProperty("材料类型") + private String materialType; + + @ApiModelProperty("材料路径") + private String materialPath; + + @ApiModelProperty("材料大小") + private Long materialSize; + + @ApiModelProperty("材料描述") + private String description; + + @ApiModelProperty("排序") + private Integer sortOrder; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java new file mode 100644 index 0000000..73c91a4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划列表请求VO + */ +@Data +@ApiModel(value="TrainingPlanListReq对象", description="培训计划列表请求") +public class TrainingPlanListReq { + + @ApiModelProperty("培训计划名称") + private String planName; + + @ApiModelProperty("培训类型") + private String trainingType; + + @ApiModelProperty("培训级别") + private String trainingLevel; + + @ApiModelProperty("培训状态") + private String status; + + @ApiModelProperty("培训讲师") + private String trainer; + + @ApiModelProperty("开始时间") + private String startTime; + + @ApiModelProperty("结束时间") + private String endTime; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java new file mode 100644 index 0000000..255c784 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java @@ -0,0 +1,69 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划列表响应VO + */ +@Data +@ApiModel(value="TrainingPlanListResp对象", description="培训计划列表响应") +public class TrainingPlanListResp { + + @ApiModelProperty("培训计划ID") + private String planId; + + @ApiModelProperty("培训计划名称") + private String planName; + + @ApiModelProperty("培训类型") + private String trainingType; + + @ApiModelProperty("培训级别") + private String trainingLevel; + + @ApiModelProperty("培训内容") + private String trainingContent; + + @ApiModelProperty("培训讲师") + private String trainer; + + @ApiModelProperty("培训地点") + private String trainingLocation; + + @ApiModelProperty("培训开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("培训结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + @ApiModelProperty("培训状态") + private String status; + + @ApiModelProperty("最大参训人数") + private Integer maxParticipants; + + @ApiModelProperty("当前参训人数") + private Integer currentParticipants; + + @ApiModelProperty("培训要求") + private String requirements; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @ApiModelProperty("创建人") + private String createBy; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java new file mode 100644 index 0000000..c120521 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java @@ -0,0 +1,63 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划请求VO + */ +@Data +@ApiModel(value="TrainingPlanReq对象", description="培训计划请求") +public class TrainingPlanReq { + + @ApiModelProperty("培训计划名称") + @NotBlank(message = "培训计划名称不能为空") + private String planName; + + @ApiModelProperty("培训类型") + @NotBlank(message = "培训类型不能为空") + private String trainingType; + + @ApiModelProperty("培训级别") + @NotBlank(message = "培训级别不能为空") + private String trainingLevel; + + @ApiModelProperty("培训内容") + private String trainingContent; + + @ApiModelProperty("培训讲师") + private String trainer; + + @ApiModelProperty("培训地点") + private String trainingLocation; + + @ApiModelProperty("培训开始时间") + @NotNull(message = "培训开始时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("培训结束时间") + @NotNull(message = "培训结束时间不能为空") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + @ApiModelProperty("培训状态") + private String status; + + @ApiModelProperty("最大参训人数") + private Integer maxParticipants; + + @ApiModelProperty("培训要求") + private String requirements; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java new file mode 100644 index 0000000..297f959 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java @@ -0,0 +1,76 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划响应VO + */ +@Data +@ApiModel(value="TrainingPlanResp对象", description="培训计划响应") +public class TrainingPlanResp { + + @ApiModelProperty("培训计划ID") + private String planId; + + @ApiModelProperty("培训计划名称") + private String planName; + + @ApiModelProperty("培训类型") + private String trainingType; + + @ApiModelProperty("培训级别") + private String trainingLevel; + + @ApiModelProperty("培训内容") + private String trainingContent; + + @ApiModelProperty("培训讲师") + private String trainer; + + @ApiModelProperty("培训地点") + private String trainingLocation; + + @ApiModelProperty("培训开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("培训结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + @ApiModelProperty("培训状态") + private String status; + + @ApiModelProperty("最大参训人数") + private Integer maxParticipants; + + @ApiModelProperty("当前参训人数") + private Integer currentParticipants; + + @ApiModelProperty("培训要求") + private String requirements; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @ApiModelProperty("创建人") + private String createBy; + + @ApiModelProperty("培训材料列表") + private List materials; + + @ApiModelProperty("培训记录列表") + private List records; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java new file mode 100644 index 0000000..2cccd41 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java @@ -0,0 +1,51 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训记录响应VO + */ +@Data +@ApiModel(value="TrainingRecordResp对象", description="培训记录响应") +public class TrainingRecordResp { + + @ApiModelProperty("培训记录ID") + private String recordId; + + @ApiModelProperty("参训人员ID") + private String userId; + + @ApiModelProperty("参训人员姓名") + private String userName; + + @ApiModelProperty("部门ID") + private String deptId; + + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("出勤状态") + private String attendanceStatus; + + @ApiModelProperty("签到时间") + private LocalDateTime signInTime; + + @ApiModelProperty("签退时间") + private LocalDateTime signOutTime; + + @ApiModelProperty("培训成绩") + private BigDecimal score; + + @ApiModelProperty("培训反馈") + private String feedback; + + @ApiModelProperty("证书ID") + private String certificateId; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java new file mode 100644 index 0000000..57d2fc1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java @@ -0,0 +1,15 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TrainingCertificateEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训证书表Mapper接口 + */ +@Mapper +public interface TrainingCertificateMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java new file mode 100644 index 0000000..df2391a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java @@ -0,0 +1,15 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TrainingInteractionEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训互动记录表Mapper接口 + */ +@Mapper +public interface TrainingInteractionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java new file mode 100644 index 0000000..70a3c72 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java @@ -0,0 +1,15 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TrainingMaterialEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训材料表Mapper接口 + */ +@Mapper +public interface TrainingMaterialMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java new file mode 100644 index 0000000..e1b2063 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java @@ -0,0 +1,27 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TrainingPlanEntity; +import com.dite.znpt.domain.vo.TrainingPlanListReq; +import com.dite.znpt.domain.vo.TrainingPlanListResp; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划表Mapper接口 + */ +@Mapper +public interface TrainingPlanMapper extends BaseMapper { + + /** + * 查询培训计划列表 + * + * @param req 查询条件 + * @return 培训计划列表 + */ + List listTrainingPlanListResp(@Param("req") TrainingPlanListReq req); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java new file mode 100644 index 0000000..a7f3371 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java @@ -0,0 +1,15 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TrainingRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训记录表Mapper接口 + */ +@Mapper +public interface TrainingRecordMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/TrainingPlanService.java b/core/src/main/java/com/dite/znpt/service/TrainingPlanService.java new file mode 100644 index 0000000..b181b2a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/TrainingPlanService.java @@ -0,0 +1,78 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TrainingPlanEntity; +import com.dite.znpt.domain.vo.TrainingPlanListReq; +import com.dite.znpt.domain.vo.TrainingPlanListResp; +import com.dite.znpt.domain.vo.TrainingPlanReq; +import com.dite.znpt.domain.vo.TrainingPlanResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划表服务接口 + */ +public interface TrainingPlanService extends IService { + + /** + * 分页查询培训计划列表 + * + * @param req 查询条件 + * @return 培训计划列表 + */ + List page(TrainingPlanListReq req); + + /** + * 查询培训计划列表 + * + * @param req 查询条件 + * @return 培训计划列表 + */ + List list(TrainingPlanListReq req); + + /** + * 查询培训计划详情 + * + * @param planId 培训计划ID + * @return 培训计划详情 + */ + TrainingPlanResp detail(String planId); + + /** + * 新增培训计划 + * + * @param req 培训计划信息 + */ + void save(TrainingPlanReq req); + + /** + * 更新培训计划 + * + * @param planId 培训计划ID + * @param req 培训计划信息 + */ + void update(String planId, TrainingPlanReq req); + + /** + * 删除培训计划 + * + * @param planId 培训计划ID + */ + void deleteById(String planId); + + /** + * 发布培训计划 + * + * @param planId 培训计划ID + */ + void publish(String planId); + + /** + * 取消培训计划 + * + * @param planId 培训计划ID + */ + void cancel(String planId); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/TrainingRecordService.java b/core/src/main/java/com/dite/znpt/service/TrainingRecordService.java new file mode 100644 index 0000000..1df11b3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/TrainingRecordService.java @@ -0,0 +1,13 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TrainingRecordEntity; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训记录表服务接口 + */ +public interface TrainingRecordService extends IService { + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java new file mode 100644 index 0000000..cee73ee --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java @@ -0,0 +1,123 @@ +package com.dite.znpt.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import com.dite.znpt.domain.entity.TrainingPlanEntity; +import com.dite.znpt.domain.vo.TrainingPlanListReq; +import com.dite.znpt.domain.vo.TrainingPlanListResp; +import com.dite.znpt.domain.vo.TrainingPlanReq; +import com.dite.znpt.domain.vo.TrainingPlanResp; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.TrainingPlanMapper; +import com.dite.znpt.service.TrainingPlanService; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class TrainingPlanServiceImpl extends ServiceImpl implements TrainingPlanService { + + @Override + public List page(TrainingPlanListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public List list(TrainingPlanListReq req) { + return this.baseMapper.listTrainingPlanListResp(req); + } + + @Override + public TrainingPlanResp detail(String planId) { + TrainingPlanEntity entity = this.baseMapper.selectById(planId); + if (entity == null) { + throw new ServiceException("培训计划不存在"); + } + return BeanUtil.copyProperties(entity, TrainingPlanResp.class); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void save(TrainingPlanReq req) { + TrainingPlanEntity entity = BeanUtil.copyProperties(req, TrainingPlanEntity.class); + entity.setStatus("DRAFT"); + entity.setCreateBy(StpUtil.getLoginIdAsString()); + this.baseMapper.insert(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(String planId, TrainingPlanReq req) { + TrainingPlanEntity entity = this.baseMapper.selectById(planId); + if (entity == null) { + throw new ServiceException("培训计划不存在"); + } + + BeanUtil.copyProperties(req, entity); + entity.setUpdateBy(StpUtil.getLoginIdAsString()); + this.baseMapper.updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(String planId) { + TrainingPlanEntity entity = this.baseMapper.selectById(planId); + if (entity == null) { + throw new ServiceException("培训计划不存在"); + } + + // 检查是否可以删除 + if ("PUBLISHED".equals(entity.getStatus()) || "IN_PROGRESS".equals(entity.getStatus())) { + throw new ServiceException("已发布或进行中的培训计划不能删除"); + } + + this.baseMapper.deleteById(planId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void publish(String planId) { + TrainingPlanEntity entity = this.baseMapper.selectById(planId); + if (entity == null) { + throw new ServiceException("培训计划不存在"); + } + + if (!"DRAFT".equals(entity.getStatus())) { + throw new ServiceException("只有草稿状态的培训计划才能发布"); + } + + entity.setStatus("PUBLISHED"); + entity.setUpdateBy(StpUtil.getLoginIdAsString()); + this.baseMapper.updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancel(String planId) { + TrainingPlanEntity entity = this.baseMapper.selectById(planId); + if (entity == null) { + throw new ServiceException("培训计划不存在"); + } + + if ("COMPLETED".equals(entity.getStatus()) || "CANCELLED".equals(entity.getStatus())) { + throw new ServiceException("已完成或已取消的培训计划不能取消"); + } + + entity.setStatus("CANCELLED"); + entity.setUpdateBy(StpUtil.getLoginIdAsString()); + this.baseMapper.updateById(entity); + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java new file mode 100644 index 0000000..5da01f7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java @@ -0,0 +1,17 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.TrainingRecordEntity; +import com.dite.znpt.mapper.TrainingRecordMapper; +import com.dite.znpt.service.TrainingRecordService; +import org.springframework.stereotype.Service; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训记录表服务实现类 + */ +@Service +public class TrainingRecordServiceImpl extends ServiceImpl implements TrainingRecordService { + +} \ No newline at end of file diff --git a/core/src/main/resources/mapper/TrainingPlanMapper.xml b/core/src/main/resources/mapper/TrainingPlanMapper.xml new file mode 100644 index 0000000..fdfcddf --- /dev/null +++ b/core/src/main/resources/mapper/TrainingPlanMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + \ No newline at end of file diff --git a/doc/aesDemo.html b/doc/aesDemo.html deleted file mode 100644 index 6f84f51..0000000 --- a/doc/aesDemo.html +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - AES加密解密工具 - - - - - - - -
- -
-

- AES加密解密工具 -

-

- 使用先进的AES加密算法保护您的数据安全,支持多种加密模式和密钥长度 -

-
- - -
- -
-

- 加密 -

-
-
- - -
- -
- -
- - -
-
- -
- -
-
- - -
-
- - -
-
-
- - - - -
-
- - -
-

- 解密 -

-
-
- - -
- -
- - -
- -
- -
-
- - -
-
- - -
-
-
- - - - -
-
-
- - -
-

- 结果 -

-
-
- -
- - -
-
-
- -
- - -
-
-
-
- - -
- - 操作成功 -
-
- - - - - \ No newline at end of file diff --git a/sip/pom.xml b/sip/pom.xml deleted file mode 100644 index 7e62790..0000000 --- a/sip/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - - com.dite.znpt - parent - 1.0.0-SNAPSHOT - - sip - 1.0.0-SNAPSHOT - - - 17 - 17 - UTF-8 - - - - com.dite.znpt - core - 1.0.0-SNAPSHOT - - - - org.projectlombok - lombok - - - - - javax.sip - jain-sip-ri - 1.3.0-91 - - - - - org.dom4j - dom4j - 2.1.3 - - - org.slf4j - log4j-over-slf4j - 1.7.36 - - - - \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java b/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java deleted file mode 100644 index 2c0dd0c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/config/MediaFormatConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.config; - -import cn.hutool.core.collection.CollUtil; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -/** - * 媒体格式配置 - * - * @author huise23 - * @since 2023-07-31 09:08:05 - */ -@Configuration -public class MediaFormatConfig { - - @Bean - public static List streamMediaFormatList() { - List formatList = CollUtil.newArrayList(); - formatList.add(new StreamMediaFormat("flv",null,"1")); - formatList.add(new StreamMediaFormat("mp4",null,"0")); - formatList.add(new StreamMediaFormat("hls",null,"0")); - formatList.add(new StreamMediaFormat("webrtc",null,"1")); - return formatList; - } - - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java deleted file mode 100644 index d1ee938..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/Constants.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/7/14 - */ -public class Constants { - /** - * UTF-8 字符集 - */ - public static final String UTF8 = "UTF-8"; - - /** - * GBK 字符集 - */ - public static final String GBK = "GBK"; - - /** - * 路径拼接符 / - */ - public static final String File_SEPARATOR = "/"; - - /** - * http请求 - */ - public static final String HTTP = "http://"; - - /** - * https请求 - */ - public static final String HTTPS = "https://"; - - /** - * 默认字符串分隔符 - */ - public static final String DEFAULT_DELIMITER = ","; -} \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java deleted file mode 100644 index 743494a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/IotCacheConstants.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/8/4 - * @description 缓存key定义:key全部以iot开头 - */ -public class IotCacheConstants { - - /** - * 参数管理 cache key - */ - public static final String SYS_CONFIG_KEY = "sys_config:"; - - /** - * 字典管理 cache key - */ - public static final String SYS_DICT_KEY = "sys_dict:"; - - /** - * 图标库 cache key - */ - public static final String SYS_ICON_KEY = "sys_icon"; - - private static final String IOT_DEVICE_VIDEO_PREFIX = "vs_device_video:"; - - public static String getIotDeviceVideoKey(String deviceCode){ - return IOT_DEVICE_VIDEO_PREFIX + deviceCode; - } - - private final static String CLIENT_TRANSACTION_CACHE_PREFIX = "IOT_CLIENT_TRANSACTION_CACHE:"; - - public static String getClientTransactionCacheKey(String ssrc){ - return CLIENT_TRANSACTION_CACHE_PREFIX + ssrc; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java deleted file mode 100644 index 4e3d10d..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/IotDictConstants.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/8/4 - * @description 字典类型定义 - */ -public class IotDictConstants { - - /** - * 设备状态-在线 - */ - public static final String IOT_DEVICE_STATUS_ONLINE = "2"; - - /** - * 设备状态-离线 - */ - public static final String IOT_DEVICE_STATUS_OFFLINE = "3"; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java b/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java deleted file mode 100644 index 7cdf9eb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/IotRespMessage.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.dite.znpt.monitor.constant; - -/** - * @author yunp - * @since 2022/8/4 - * @description 响应文案定义 - */ -public class IotRespMessage { - - public static final String UNKNOWN_FAIL = "未知错误"; - - public static final String ID_NOT_FOUND = "数据不存在"; - - public static final String PARAMETER_ERROR = "参数有误"; - - public static final String NO_PERMISSION = "没有访问权限"; - - public static final String PARENT_AREA_NOT_FOUND = "上级分区不存在"; - - public static final String CAR_TYPE_HAS_CARS = "该车型下仍有车辆,无法删除"; - - public static final String CAR_BRAND_HAS_CARS = "该品牌下仍有车辆,无法删除"; - - public static final String CAR_PLATE_NUMBER_EXIST = "该车牌号车辆已存在"; - - public static final String CAR_PLATE_NUMBER_NOT_EXIST = "该车牌号车辆不存在"; - - public static final String CAR_HAS_BIND_TAG_OR_SPEED_MONITOR = "车辆已绑定车载标签或速度检测仪,禁止删除"; - - public static final String CAR_FREIGHT_NOT_EXIST = "货物不存在"; - - public static final String CAR_HAS_BIND_ALARM_TEMPLATE = "该车辆已绑定其他告警模板"; - - public static final String USER_HAS_BIND_ALARM_TEMPLATE = "该人员已绑定其他告警模板"; - - public static final String REPETITION_ALARM_FOR_AREA = "该厂区分区下已有同类型告警,无法重复添加"; - - public static final String REPETITION_ALARM_NOTIFY_CONFIG = "已存在相同部门层级的告警消息推送配置"; - - public static final String DEVICE_TERMINAL_HAS_BEEN_BIND = "该标签卡已被其他人绑定"; - - public static final String DEVICE_TERMINAL_TYPE_ERROR = "标签卡类型有误"; - - public static final String DEVICE_TERMINAL_NOT_FOUND_OR_STATUS_ERROR = "标签卡未找到或状态异常"; - - public static final String DEVICE_CANNOT_EDIT = "设备未启用或已停用才可编辑"; - - public static final String VIDEO_DEVICE_CANNOT_DELETE = "视频设备禁止删除"; - - public static final String DEVICE_CANNOT_DELETE = "未启用的设备才可删除"; - - public static final String DEVICE_HAS_BIND_TO_GROUP = "设备已经绑定至该分组"; - - public static final String DEVICE_VIDEO_CANNOT_DELETE = "禁止删除在线视频设备"; - - public static final String DEVICE_VIDEO_CANNOT_SYNC = "禁止更新离线视频设备"; - - public static final String DEVICE_INACTIVE = "设备未启用"; - - public static final String CODE_HAS_BEEN_USED = "编号已被占用"; - - public static final String NAME_HAS_BEEN_USED = "名称已被占用"; - - public static final String FLAG_HAS_BEEN_USED = "标识已被占用"; - - public static final String GROUP_HAS_CHILD_CANNOT_REMOVE = "分组有下级分组,无法删除"; - - public static final String GROUP_HAS_DEVICE_CANNOT_REMOVE = "分组下有绑定设备,无法删除"; - - public static final String PRODUCT_PUBLISH_CANNOT_DELETE = "该产品已发布,不可删除"; - - public static final String PRODUCT_HAS_DEVICE_CANNOT_REMOVE = "产品下存在设备关联,需删除设备后进行操作"; - - public static final String MSG_PROTOCOL_PUBLISH_CANNOT_DELETE = "消息协议未发布,发布协议后操作"; - - public static final String CATEGORY_CANNOT_DELETE = "该产品分类信息已被产品关联,不可删除"; - - public static final String SCENE_CANNOT_DELETE = "该场景信息已被产品关联,不可删除"; - - public static final String SWITCH_PARAM_HAS_BEEN_USED = "该参数在设备服务中只能定义一个"; - - public static final String CONFIG_CANNOT_DELETE = "该配置已被通知模板关联,不可删除, 请取消关联后重试。"; - - public static final String TEMPLATE_CANNOT_DELETE = "该通知模板已被场景联动关联,不可删除, 请取消关联后操作。"; - - public static final String PROTOCOL_CANNOT_DELETE_BY_PUBLISHED = "当前协议状态为已发布,不可删除."; - - public static final String PROTOCOL_CANNOT_DELETE_WITH_PRODUCT = "该协议已被产品关联,不可删除,请删除关联后操作!"; - - public static final String PROTOCOL_CANNOT_UN_PUBLISH = "协议已被产品发布,不可取消!"; - - public static final String PROTOCOL_TYPE_CANNOT_NULL = "协议类型不能为空"; - - public static final String PROTOCOL_CLASS_NAME_CANNOT_EMPTY = "协议类型为Jar或者Local类型时,必须指定协议类名."; - - public static final String PROTOCOL_FILE_PATH_CANNOT_EMPTY = "协议类型为Jar或者Local类型时,必须上传或者指定协议文件路径."; - - public static final String DATA_ILLEGAL = "数据非法"; - - public static final String IMPORT_ERROR = "导入出错"; - - public static final String COMMON_DEVICE_ATTR_DUPLICATE_ERROR = "订阅的通用设备点位全局不唯一"; - - public static final String PROTOCOL_NOT_EXISTS = "协议不存在"; - - public static final String RULE_NOT_EXISTS = "上报规则不存在"; - - public static final String DEVICE_NOT_EXISTS = "设备不存在"; - - public static final String DATA_DATA_TREND_TIME_TYPE_NOT_EXISTS = "设备数据趋势时间类型不存在"; - public static final String DATA_DATA_TREND_DATA_TYPE_NOT_EXISTS = "设备数据趋势数据类型不存在"; - public static final String CRON_ERROR = "cron表达式输入错误:"; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java deleted file mode 100644 index a05e191..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/CameraType.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -/** - * 摄像头类型 - * - * @author huise23 - * @since 2023-07-28 15:30:10 - */ -public enum CameraType implements ValueAndLabel { - - UNKNOWN("0","未知"), - BALLHEAD("1","球机"); - - private final String value; - private final String label; - - CameraType(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java deleted file mode 100644 index 2101f2b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/DeviceStatus.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -/** - * 设备状态 - * - * @author huise23 - * @since 2023-07-28 15:30:10 - */ -public enum DeviceStatus implements ValueAndLabel { - - INACTIV("1", "未启用"), - ONLINE("2", "在线"), - OFFLINE("3", "离线"), - STOP("4", "停用"); - - private final String value; - private final String label; - - DeviceStatus(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java deleted file mode 100644 index e621c06..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/SipTransferMode.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -public enum SipTransferMode implements ValueAndLabel { - - UDP("UDP","UDP"), - TCP("TCP","TCP"); - - private final String value; - private final String label; - - SipTransferMode(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java deleted file mode 100644 index fea526a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/StreamTransferMode.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -public enum StreamTransferMode implements ValueAndLabel { - - UDP("UDP","UDP"), - TCP_ACTIVE("TCP-ACTIVE","TCP主动"), - TCP_PASSIVE("TCP-PASSIVE", "TCP被动"); - - private final String value; - private final String label; - - StreamTransferMode(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java deleted file mode 100644 index 88b5b1b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/ValueAndLabel.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - - -/** - * 字典常量接口 - * - * @author huise23 - * @since 2023-07-28 15:28:55 - */ -public interface ValueAndLabel { - String getValue(); - String getLabel(); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java b/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java deleted file mode 100644 index 62889fd..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/constant/dict/YesOrNo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dite.znpt.monitor.constant.dict; - -/** - * YesOrNo - * - * @author huise23 - * @since 2023-07-28 15:30:10 - */ -public enum YesOrNo implements ValueAndLabel { - - YES("Y","是"), - NO("N", "否"); - - private final String value; - private final String label; - - YesOrNo(String value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String getValue() { - return value; - } - - @Override - public String getLabel() { - return label; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java b/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java deleted file mode 100644 index bf145cc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/CustomFunction.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.domain; - -/** - * @Author: cuizhibin - * @Date: 2023/1/16 14:36:36 - * @Description: - */ -public interface CustomFunction { - /** - * 执行的方法 - * @return - */ - T get(); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java deleted file mode 100644 index 4b263aa..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoChannelEntity.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.dite.znpt.monitor.domain.entity; - -import com.baomidou.mybatisplus.annotation.*; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/8/11 17:29 - * @Description: - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("vs_device_video_channel") -@ApiModel(value="DeviceVideoChannelEntity", description="视频通道表") -public class DeviceVideoChannelEntity implements Serializable { - - private static final long serialVersionUID = -4175177624487756818L; - - @ApiModelProperty(value = "主键id") - @TableId(value = "channel_id", type = IdType.AUTO) - private Long channelId; - - @ApiModelProperty(value = "视频设备id") - private Long videoId; - - @ApiModelProperty(value = "通道国标编号") - private String channelCode; - - @ApiModelProperty(value = "通道名") - private String channelName; - - @ApiModelProperty(value = "生产厂商") - private String manufacture; - - @ApiModelProperty(value = "型号") - private String model; - - @ApiModelProperty(value = "设备归属") - private String owner; - - @ApiModelProperty(value = "行政区域") - private String civilCode; - - @ApiModelProperty(value = "警区") - private String block; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "是否有子设备 1有, 0没有") - private int parental; - - @ApiModelProperty(value = "父级id") - private String parentId; - - @ApiModelProperty(value = "信令安全模式 缺省为0; 0:不采用; 2: S/MIME签名方式; 3: S/ MIME加密签名同时采用方式; 4:数字摘要方式") - private int safetyWay; - - @ApiModelProperty(value = "注册方式 缺省为1;1:符合IETFRFC3261标准的认证注册模 式; 2:基于口令的双向认证注册模式; 3:基于数字证书的双向认证注册模式") - private int registerWay; - - @ApiModelProperty("证书序列号") - private String certNum; - - @ApiModelProperty("证书有效标识 缺省为0;证书有效标识:0:无效1: 有效") - private int certifiable; - - @ApiModelProperty("证书无效原因码") - private int errCode; - - @ApiModelProperty( "证书终止有效期") - private String endTime; - - @ApiModelProperty("保密属性 缺省为0; 0:不涉密, 1:涉密") - private String secrecy; - - @ApiModelProperty("IP地址") - private String ipAddress; - - @ApiModelProperty("端口号") - private int port; - - @ApiModelProperty("密码") - private String password; - - @ApiModelProperty("摄像头类型") - private String cameraType; - - @ApiModelProperty("云台控制") - private String ptzControl; - - @ApiModelProperty(value = "状态") - private String status; - - @ApiModelProperty("经度") - private double longitude; - - @ApiModelProperty("纬度") - private double latitude; - - @ApiModelProperty(value = "备注") - private String remark; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("创建人id") - @TableField(fill = FieldFill.INSERT) - private Long createBy; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("更新人id") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long updateBy; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java deleted file mode 100644 index 049e324..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/DeviceVideoEntity.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.dite.znpt.monitor.domain.entity; - -import com.baomidou.mybatisplus.annotation.*; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/8/11 10:24 - * @Description: - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("vs_device_video") -@ApiModel(value="DeviceVideoEntity", description="视频设备表") -public class DeviceVideoEntity implements Serializable { - - private static final long serialVersionUID = -182441901641147882L; - - @ApiModelProperty(value = "主键id") - @TableId(value = "video_id", type = IdType.AUTO) - private Long videoId; - - @ApiModelProperty(value = "视频设备国标编码") - private String videoCode; - - @ApiModelProperty(value = "视频设备名称") - private String videoName; - - @ApiModelProperty(value = "生产厂商") - private String manufacturer; - - @ApiModelProperty(value = "型号") - private String model; - - @ApiModelProperty(value = "固件版本") - private String firmware; - - @ApiModelProperty(value = "传输协议(UDP/TCP),默认UDP") - private String transport; - - @ApiModelProperty(value = "数据流传输模式(默认UDP)") - private String streamMode; - - @ApiModelProperty(value = "设备状态") - private String status; - - @ApiModelProperty(value = "注册时间") - private LocalDateTime registerTime; - - @ApiModelProperty(value = "心跳时间") - private LocalDateTime KeepaliveTime; - - @ApiModelProperty("通道个数") - private int channelCount; - - @ApiModelProperty(value = "ip") - private String ip; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "地址") - private String hostAddress; - - @ApiModelProperty(value = "注册有效期") - private Integer expires; - - @ApiModelProperty(value = "符集, 支持 UTF-8 与 GB2312") - private String charset; - - @ApiModelProperty(value = "产品id") - private Long productId; - - @ApiModelProperty(value = "备注") - private String remark; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("创建人id") - @TableField(fill = FieldFill.INSERT) - private Long createBy; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("更新人id") - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long updateBy; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java b/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java deleted file mode 100644 index 0259688..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/entity/IpConfigEntity.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.dite.znpt.monitor.domain.entity; - -import java.io.Serializable; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("vs_ip_config") -@ApiModel(value="VsIpConfigEntity对象", description="监控设备IP配置表") -public class IpConfigEntity implements Serializable { - - @ApiModelProperty("${column.comment}") - @TableId(type = IdType.AUTO) - private Long configId; - - @ApiModelProperty("ip地址") - private String ip; - - @ApiModelProperty("ip地址前三位") - private String ipTopThree; - - -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java deleted file mode 100644 index be2a92e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/req/MonitorConfigAddReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.domain.req; - -import lombok.Data; - -import java.util.List; - -/** - * @Date:2023/9/5 16:19 - * @Description: 视频服务配置新增对象 - */ -@Data -public class MonitorConfigAddReq { - private List ipAddresses; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java deleted file mode 100644 index 0dc809c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/req/VideoInfoReq.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dite.znpt.monitor.domain.req; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * 查询视频信息参数 - * - * @author huise23 - * @since 2024-12-03 14:03:29 - */ -@Data -public class VideoInfoReq implements Serializable { - - @ApiModelProperty(value = "视频对接方式 1.摄像头直连 2.级联") - private Integer videoConnection; - - @ApiModelProperty(value = "级联分隔符(默认/)") - private String cascadeSeparator = "/"; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java deleted file mode 100644 index f8a76ae..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/DeviceVideoResp.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.monitor.domain.resp; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @Date:2023/9/7 10:26 - * @Description: - */ -@Data -public class DeviceVideoResp extends DeviceVideoEntity { - @ApiModelProperty(value = "设备状态label") - private String statusLabel; - @ApiModelProperty(value = "流传输模式label") - private String streamModeLabel; - @ApiModelProperty(value = "传输模式label") - private String transportLabel; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java deleted file mode 100644 index 7ba594c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/resp/VideoInfoResp.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.dite.znpt.monitor.domain.resp; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * 查询视频信息返回信息 - * - * @author huise23 - * @since 2024-12-03 14:03:29 - */ -@Data -public class VideoInfoResp implements Serializable { - - @ApiModelProperty(value = "视频设备id") - private Long videoId; - - @ApiModelProperty(value = "视频设备名称") - private String videoName; - - @ApiModelProperty(value = "通道id") - private Long channelId; - - @ApiModelProperty(value = "国标编码") - private String channelCode; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "生产厂商") - private String manufacture; - - @ApiModelProperty(value = "型号") - private String model; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty("IP地址") - private String ipAddress; - - @ApiModelProperty("端口号") - private int port; - - @ApiModelProperty(value = "云台控制label") - private String ptzControl; - - @ApiModelProperty("经度") - private double longitude; - - @ApiModelProperty("纬度") - private double latitude; - - @ApiModelProperty(value = "状态 DeviceStatus") - private String status; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java deleted file mode 100644 index 1ec735a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelEditReq.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:12 - * @Description: - */ -@Data -@ApiModel("视频通道编辑请求") -public class DeviceVideoChannelEditReq implements Serializable { - - private static final long serialVersionUID = 719557164910393807L; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "摄像头类型") - private String cameraType; - - @ApiModelProperty(value = "云台控制,Y表示是,N表示否") - private String ptzControl; - - @ApiModelProperty(value = "描述") - private String remark; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java deleted file mode 100644 index 31234fb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelListResp.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:12 - * @Description: - */ -@Data -@ApiModel("视频通道列表响应") -public class DeviceVideoChannelListResp implements Serializable { - - private static final long serialVersionUID = -8053965410352257803L; - - @ApiModelProperty(value = "主键id") - private Long channelId; - - @ApiModelProperty(value = "所属产品id") - private Long productId; - - @ApiModelProperty(value = "通道国标编码") - private String channelCode; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "摄像头类型label") - private String cameraType; - - @ApiModelProperty(value = "摄像头类型") - private String cameraTypeLabel; - - @ApiModelProperty(value = "云台控制label") - private String ptzControl; - - @ApiModelProperty(value = "云台控制,Y表示是,N表示否") - private String ptzControlLabel; - - @ApiModelProperty(value = "状态") - private String status; - - @ApiModelProperty(value = "状态label") - private String statusLabel; - - @ApiModelProperty(value = "描述") - private String remark; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java deleted file mode 100644 index 1f22085..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoChannelResp.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:12 - * @Description: - */ -@Data -@ApiModel("视频通道响应") -public class DeviceVideoChannelResp implements Serializable { - - private static final long serialVersionUID = 1140851083577845760L; - - @ApiModelProperty(value = "主键id") - private Long channelId; - - @ApiModelProperty(value = "通道国标编码") - private String channelCode; - - @ApiModelProperty(value = "通道名称") - private String channelName; - - @ApiModelProperty(value = "安装位置") - private String address; - - @ApiModelProperty(value = "摄像头类型") - private String cameraType; - - @ApiModelProperty(value = "云台控制,Y表示是,N表示否") - private String ptzControl; - - @ApiModelProperty(value = "状态") - private String status; - - @ApiModelProperty(value = "描述") - private String remark; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java deleted file mode 100644 index a1f2b8e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoEditReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:13 - * @Description: - */ -@Data -@ApiModel("视频设备编辑请求参数") -public class DeviceVideoEditReq implements Serializable { - - private static final long serialVersionUID = -3387666090991548317L; - - @ApiModelProperty(value = "设备名称") - private String videoName; - - @ApiModelProperty(value = "所属产品") - private Long productId; - - @ApiModelProperty(value = "说明") - private String remark; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java deleted file mode 100644 index 026f873..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoListResp.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:13 - * @Description: - */ -@Data -@ApiModel("视频设备列表响应") -public class DeviceVideoListResp implements Serializable { - - private static final long serialVersionUID = -5568664011265192343L; - - @ApiModelProperty(value = "主键id") - private Long videoId; - - @ApiModelProperty(value = "视频设备国标编码") - private String videoCode; - - @ApiModelProperty(value = "视频设备名称") - private String videoName; - - @ApiModelProperty(value = "传输模式") - private String transport; - - @ApiModelProperty(value = "传输模式label") - private String transportLabel; - - @ApiModelProperty(value = "流传输模式") - private String streamMode; - - @ApiModelProperty(value = "流传输模式label") - private String streamModeLabel; - - @ApiModelProperty(value = "通道数量") - private Integer channelCount; - - @ApiModelProperty(value = "设备状态") - private String status; - - @ApiModelProperty(value = "设备状态label") - private String statusLabel; - - @ApiModelProperty(value = "设备ip") - private String ip; - - @ApiModelProperty(value = "设备端口") - private String port; - - @ApiModelProperty(value = "设备地址(ip+端口)") - private String hostAddress; - - @ApiModelProperty(value = "生产厂商") - private String manufacturer; - - @ApiModelProperty(value = "备注") - private String remark; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "创建时间") - private LocalDateTime createTime; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @ApiModelProperty(value = "心跳时间") - private LocalDateTime keepAliveTime; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java deleted file mode 100644 index f56b8c1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/DeviceVideoNumResp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/16 9:34 - * @Description: - */ -@Data -@ApiModel("视频设备数量响应") -public class DeviceVideoNumResp { - - @ApiModelProperty(value = "设备总数量") - private Long allDevice; - - @ApiModelProperty(value = "设备在线数量") - private Long onlineDevice; - - @ApiModelProperty(value = "设备离线数量") - private Long offlineDevice; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java deleted file mode 100644 index 5c5f457..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormat.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.annotation.TableField; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.enums.MediaFormatType; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 10:25 - * @Description: - */ -@Data -@EqualsAndHashCode(callSuper = false) -@ApiModel(value = "StreamMediaFormat对象", description = "流媒体格式") -public class StreamMediaFormat implements Serializable { - - private static final long serialVersionUID = -4177962876536716643L; - - @ApiModelProperty(value = "流媒体格式") - private String mediaFormat; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "是否开启tls,1表示ture,0表示false") - private String openTls; - - @TableField(exist = false) - @ApiModelProperty(value = "WebSocket播放地址") - private String wsUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "Http播放地址") - private String httpUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "WebSocket播放地址") - private String wssUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "Http播放地址") - private String httpsUrl; - - @TableField(exist = false) - @ApiModelProperty(value = "相对播放地址") - private String relativePath; - - public StreamMediaFormat(String mediaFormat,Integer port,String openTls){ - this.mediaFormat = mediaFormat; - this.port = port; - this.openTls = openTls; - } - - public void generateUrl(String host, String streamId, ServerConfig config, String mediaRouter) { - if("webrtc".equals(this.mediaFormat)){ - this.httpUrl = StrUtil.format("http://{}:{}/index/api/webrtc?app=rtp&stream={}&type=play", host, config.getHttpPort(), streamId); - this.httpsUrl = StrUtil.format("https://{}:{}/index/api/webrtc?app=rtp&stream={}&type=play", host, config.getHttpSslPort(), streamId); - this.relativePath = StrUtil.format("{}/index/api/webrtc?app=rtp&stream={}&type=play", mediaRouter, streamId); - return; - } - String suffix = MediaFormatType.getSuffix(this.mediaFormat); - if (config.getHttpSslPort() != null && config.getHttpSslPort() > 0) { - this.wssUrl = StrUtil.format("wss://{}:{}/rtp/{}{}", host, config.getHttpSslPort(), streamId, suffix); - this.httpsUrl = StrUtil.format("https://{}:{}/rtp/{}{}", host, config.getHttpSslPort(), streamId, suffix); - } - this.wsUrl = StrUtil.format("ws://{}:{}/rtp/{}{}", host, config.getHttpPort(), streamId, suffix); - this.httpUrl = StrUtil.format("http://{}:{}/rtp/{}{}", host, config.getHttpPort(), streamId, suffix); - this.relativePath = StrUtil.format("{}/rtp/{}{}", mediaRouter, streamId, suffix); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java deleted file mode 100644 index d3ce278..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatReq.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:40 - * @Description: - */ -@Data -@ApiModel("流媒体格式请求") -public class StreamMediaFormatReq implements Serializable { - - private static final long serialVersionUID = 6627383994019834279L; - - @ApiModelProperty(value = "流媒体格式") - private String mediaFormat; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "是否开启TLS,1表示true,0表示false") - private String openTls; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java deleted file mode 100644 index ad9304b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaFormatResp.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:40 - * @Description: - */ -@Data -@ApiModel("流媒体格式响应") -public class StreamMediaFormatResp implements Serializable { - - private static final long serialVersionUID = -5714327034173930078L; - - @ApiModelProperty(value = "流媒体格式主键") - private Long formatId; - - @ApiModelProperty(value = "流媒体格式") - private String mediaFormat; - - @ApiModelProperty(value = "端口") - private Integer port; - - @ApiModelProperty(value = "是否开启TLS,1表示true,0表示false") - private String openTls; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java deleted file mode 100644 index 36c15fd..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigReq.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:16 - * @Description: - */ -@Data -@ApiModel("流媒体服务配置请求") -public class StreamMediaServerConfigReq implements Serializable { - - private static final long serialVersionUID = -1228005085084886474L; - - @NotNull(message = "流媒体名称不能为空") - @ApiModelProperty(value = "流媒体名称") - private String mediaName; - - @ApiModelProperty(value = "流媒体服务") - private String mediaService; - - @ApiModelProperty(value = "公网 HOST") - private String publicHost; - - @ApiModelProperty(value = "API HOST") - private String apiHost; - - @ApiModelProperty(value = "API 端口") - private Integer apiPort; - - @ApiModelProperty(value = "密钥") - private Integer secretKey; - - @ApiModelProperty(value = "流ID前缀") - private String streamPrefix; - - @ApiModelProperty(value = "RTP IP") - private String rtpHost; - - @ApiModelProperty(value = "RTP 端口") - private Integer rtpPort; - - @ApiModelProperty(value = "动态端口起始值") - private Integer dynamicPortStart; - - @ApiModelProperty(value = "动态端口结束值") - private Integer dynamicPortEnd; - - @ApiModelProperty(value = "流媒体格式") - private List streamMediaFormatReqList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java deleted file mode 100644 index 6e3b185..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/StreamMediaServerConfigResp.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:16 - * @Description: - */ -@Data -@ApiModel("流媒体服务配置响应") -public class StreamMediaServerConfigResp implements Serializable { - - private static final long serialVersionUID = 3464085768355214710L; - - @ApiModelProperty(value = "'流媒体配置主键'") - private Long configId; - - @ApiModelProperty(value = "'流媒体名称'") - private String mediaName; - - @ApiModelProperty(value = "流媒体服务") - private String mediaService; - - @ApiModelProperty(value = "公网 HOST") - private String publicHost; - - @ApiModelProperty(value = "API HOST") - private String apiHost; - - @ApiModelProperty(value = "API 端口") - private Integer apiPort; - - @ApiModelProperty(value = "密钥") - private String secretKey; - - @ApiModelProperty(value = "流ID前缀") - private String streamPrefix; - - @ApiModelProperty(value = "RTP IP") - private String rtpHost; - - @ApiModelProperty(value = "RTP 端口") - private Integer rtpPort; - - @ApiModelProperty(value = "动态端口起始值") - private Integer dynamicPortStart; - - @ApiModelProperty(value = "动态端口结束值") - private Integer dynamicPortEnd; - - @ApiModelProperty(value = "流媒体格式") - private List streamMediaFormatRespList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java b/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java deleted file mode 100644 index 26809bc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/domain/vo/video/VideoPayResp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.domain.vo.video; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Builder; -import lombok.Data; - -import java.util.List; - -/** - * 视频播放响应 - * @author huise23 - * @since 2024-11-26 14:03:41 - */ -@Data -@Builder -public class VideoPayResp { - - @ApiModelProperty(value = "播放方式") - private String mediaType; - - @ApiModelProperty(value = "流媒体播放地址") - private List streamMediaFormatList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java deleted file mode 100644 index 2c211e8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoChannelMapper.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dite.znpt.monitor.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.req.VideoInfoReq; -import com.dite.znpt.monitor.domain.resp.VideoInfoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:08 - * @Description: - */ -public interface DeviceVideoChannelMapper extends BaseMapper { - - /** - * 查询视频通道列表 - * - * @param videoId 视频id - * @param keyword 插叙条件 - * @return {@link List< DeviceVideoChannelListResp>} - */ - List selectDeviceVideoChannel(@Param("videoId") Long videoId, @Param("keyword") String keyword); - - /** - * 查询所有视频通道列表 - * - * @param keyword 插叙条件 - * @return {@link List< DeviceVideoChannelListResp>} - */ - List selectAllDeviceVideoChannel(@Param("keyword") String keyword); - - /** - * 查询视频通道详情 - * - * @param channelCode 通道code - * @return {@link DeviceVideoChannelResp} - */ - DeviceVideoChannelResp getDeviceVideoChannelDetail(@Param("channelCode") String channelCode); - - /** - * 查询通道及视频信息 - * - * @param videoInfoReq 查询参数 - * @return {@link VideoInfoResp } - * @author huise23 - * @since 2024-12-03 13:54:52 - */ - List selectVideoInfoList(VideoInfoReq videoInfoReq); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java deleted file mode 100644 index cc14697..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/DeviceVideoMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:09 - * @Description: - */ -public interface DeviceVideoMapper extends BaseMapper { - /** - * 条件查询视频设备列表 - * @param status 是否在线 - * @param keyword 设备名称或者编码 - * @return {@link List< DeviceVideoListResp>} - */ - List selectDeviceVideoList(@Param("status") String status, @Param("keyword") String keyword, @Param("hostAddress") String hostAddress); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java deleted file mode 100644 index 1332af0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/IpConfigMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dite.znpt.monitor.mapper; - - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.entity.IpConfigEntity; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表数据库访问层 - */ -public interface IpConfigMapper extends BaseMapper { -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java b/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java deleted file mode 100644 index a3ce77a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/mapper/StreamMediaFormatMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; - -/** - * @Author: huise23 - * @Date: 2022/8/11 15:00 - * @Description: - */ -public interface StreamMediaFormatMapper extends BaseMapper { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java deleted file mode 100644 index f8604da..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmApi.java +++ /dev/null @@ -1 +0,0 @@ -package com.dite.znpt.monitor.media.zlm; import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; import com.dite.znpt.monitor.media.zlm.dto.ServerInfo; import com.dite.znpt.monitor.media.zlm.dto.req.*; import com.dite.znpt.monitor.media.zlm.dto.resp.*; import java.io.IOException; import java.util.List; /** * @Author: huise23 * @Date: 2022/8/29 10:14 * @Description: Zlm客户端启动类 */ public interface ZlmApi { /** * 获取API列表 * api: /index/api/getApiList * * @return Api列表 */ List getApiList(ServerInfo server); /** * 获取各epoll(或select)线程负载以及延时 * api: /index/api/getThreadsLoad * * @return 各epoll(或select)线程负载以及延时 */ List getThreadsLoad(ServerInfo server); /** * 获取各后台epoll(或select)线程负载以及延时 * api: /index/api/getWorkThreadsLoad * * @return 各后台epoll(或select)线程负载以及延时 */ List getWorkThreadsLoad(ServerInfo server); /** * 获取服务器配置 * api: /index/api/getServerConfig * * @return 服务器配置 */ List getServerConfig(ServerInfo server); /** * 设置服务器配置 * api: /index/api/setServerConfig * * @param config 服务器配置 * @return 操作结果 */ Integer setServerConfig(ServerInfo server, ServerConfig config); /** * 重启服务器,只有Daemon方式才能重启,否则是直接关闭! * api: /index/api/restartServer * * @return 操作结果 */ Boolean restartServer(ServerInfo server); /** * 获取流列表,可选筛选参数 * api: /index/api/getMediaList * * @param req 请求参数 * @return 操作结果 */ List getMediaList(ServerInfo server, StreamReq req); /** * 关闭流(目前所有类型的流都支持关闭) * api: /index/api/close_streams * * @param req 请求参数 * @return 操作结果 */ CloseStreamResp closeStreams(ServerInfo server, CloseStreamReq req); /** * 获取所有TcpSession列表(获取所有tcp客户端相关信息) * api: /index/api/getAllSession * * @param req 请求参数 * @return 所有TcpSession列表 */ List getAllSession(ServerInfo server, GetAllSessionReq req); /** * 断开tcp连接,比如说可以断开rtsp、rtmp播放器等 * api: /index/api/kick_session * * @param id 客户端唯一id,可以通过getAllSession接口获取 * @return 操作结果 */ Boolean kickSession(ServerInfo server, Long id); /** * 断开tcp连接,比如说可以断开rtsp、rtmp播放器等 * api: /index/api/kick_sessions * * @param req 请求参数 * @return 操作结果 */ Integer kickSession(ServerInfo server, GetAllSessionReq req); /** * 动态添加rtsp/rtmp/hls拉流代理(只支持H264/H265/aac/G711负载) * api: /index/api/addStreamProxy * * @param req 请求参数 * @return 唯一Key */ String addStreamProxy(ServerInfo server, StreamProxyReq req); /** * 关闭拉流代理 * api: /index/api/delStreamProxy * * @param key addStreamProxy接口返回的key * @return 操作结果 */ Boolean delStreamProxy(ServerInfo server, String key); /** * 通过fork FFmpeg进程的方式拉流代理,支持任意协议 * api: /index/api/addFFmpegSource * * @param req 请求参数 * @return 唯一Key */ String addFfMpegSource(ServerInfo server, FFmpegSourceReq req); /** * 关闭ffmpeg拉流代理 * api: /index/api/delFFmpegSource * * @param key addFFmpegSource接口返回的key * @return 操作结果 */ Boolean delFfMpegSource(ServerInfo server, String key); /** * 获取rtp代理时的某路ssrc rtp信息 * api: /index/api/getRtpInfo * * @param streamId RTP的ssrc,16进制字符串或者是流的id(openRtpServer接口指定) * @return 操作结果 */ RtpInfoResp getRtpInfo(ServerInfo server, String streamId); /** * 搜索文件系统,获取流对应的录像文件列表或日期文件夹列表 * api: /index/api/getMp4RecordFile * * @param req 请求参数 * @return 操作结果 */ Mp4RecordFileResp getMp4RecordFile(ServerInfo server, GetMp4RecordFileReq req); /** * 开始录制hls或MP4 * api: /index/api/startRecord * * @param req 请求参数 * @return 操作结果 */ Boolean startRecord(ServerInfo server, RecordReq req); /** * 停止录制流 * api: /index/api/stopRecord * * @param req 请求参数 * @return 操作结果 */ Boolean stopRecord(ServerInfo server, RecordReq req); /** * 获取流录制状态 * api: /index/api/isRecording * * @param req 请求参数 * @return 操作结果 */ Boolean isRecording(ServerInfo server, RecordReq req); /** * 获取截图或生成实时截图并返回 * api: /index/api/getSnap * * @param req 请求参数 * @return jpeg格式的图片,可以在浏览器直接打开 */ void getSnap(ServerInfo server, SnapReq req) throws IOException; /** * 创建GB28181 RTP接收端口,如果该端口接收数据超时,则会自动被回收(不用调用closeRtpServer接口) * api: /index/api/openRtpServer * * @param req 请求参数 * @return 接收端口,方便获取随机端口号 */ Integer openRtpServer(ServerInfo server, RtpServerReq req); /** * 关闭GB28181 RTP接收端口 * api: /index/api/closeRtpServer * * @param streamId 该端口绑定的流ID,该端口只能创建这一个流(而不是根据ssrc创建多个) * @return 是否找到记录并关闭 */ Boolean closeRtpServer(ServerInfo server, String streamId); /** * 获取openRtpServer接口创建的所有RTP服务器 * api: /index/api/listRtpServer * * @return 是否找到记录并关闭 */ List listRtpServer(ServerInfo server); /** * 作为GB28181客户端,启动ps-rtp推流,支持rtp/udp方式; * 该接口支持rtsp/rtmp等协议转ps-rtp推流。第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试。 * api: /index/api/startSendRtp * * @param req 请求参数 * @return 使用的本地端口号 */ Integer startSendRtp(ServerInfo server, SendRtpReq req); /** * 作为GB28181 Passive TCP服务器; * 该接口支持rtsp/rtmp等协议转ps-rtp被动推流。 * 调用该接口,zlm会启动tcp服务器等待连接请求, * 连接建立后,zlm会关闭tcp服务器,然后源源不断的往客户端推流。 * 第一次推流失败会直接返回错误,成功一次后,后续失败也将无限重试(不停地建立tcp监听,超时后再关闭)。 * api: /index/api/startSendRtpPassive * * @param req 请求参数 * @return 使用的本地端口号 */ Integer startSendRtpPassive(ServerInfo server, SendRtpReq req); /** * 停止GB28181 ps-rtp推流 * api: /index/api/stopSendRtp * * @param req 请求参数 * @return 操作结果 */ Boolean stopSendRtp(ServerInfo server, SendRtpReq req); /** * 获取主要对象个数统计,主要用于分析内存性能 * api: /index/api/getStatistic * * @return 操作结果 */ StatisticResp getStatistic(ServerInfo server); /** * 添加rtsp/rtmp主动推流(把本服务器的直播流推送到其他服务器去) * api: /index/api/addStreamPusherProxy * * @param req 请求参数 * @return 流的唯一标识 */ String addStreamPusherProxy(ServerInfo server, StreamPusherProxyReq req); /** * 关闭推流 * api: /index/api/delStreamPusherProxy * * @param key 流的唯一标识 * @return 操作结果 */ Boolean delStreamPusherProxy(ServerInfo server, String key); } \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java deleted file mode 100644 index a9c1b11..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmHook.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.dite.znpt.monitor.media.zlm; - -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.event.*; -import com.dite.znpt.monitor.media.zlm.impl.ZlmHookService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:22 - * @Description: - */ -@Slf4j -@RestController -@RequestMapping("/index/hook") -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ZlmHook { - private final ZlmHookService service; - - /** - * 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件, - * 阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_flow_report") - public BaseEventResp onFlowReport(@RequestBody FlowReportReq req) { - return service.onFlowReport(req); - } - - /** - * 访问http文件服务器上hls之外的文件时触发。 - */ - @PostMapping(value = "/on_http_access") - public HttpAccessResp onHttpAccess(@RequestBody HttpAccessReq req) { - return service.onHttpAccess(req); - } - - /** - * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件; - * 如果流不存在,那么先触发on_play事件然后触发on_stream_not_found事件。 - * 播放rtsp流时,如果该流启动了rtsp专属鉴权(on_rtsp_realm)那么将不再触发on_play事件。 - */ - @PostMapping(value = "/on_play") - public BaseEventResp onPlay(@RequestBody PlayReq req) { - return service.onPlay(req); - } - - /** - * rtsp/rtmp/rtp推流鉴权事件。 - */ - @PostMapping(value = "/on_publish") - public PublishResp onPublish(@RequestBody PublishReq req) { - return service.onPublish(req); - } - - - /** - * 录制mp4完成后通知事件;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_record_mp4") - public BaseEventResp onRecordMp4(@RequestBody RecordMp4Req req) { - return service.onRecordMp4(req); - } - - /** - * 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。 - * 需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。 - */ - @PostMapping(value = "/on_rtsp_realm") - public BaseEventResp onRtspRealm(@RequestBody RtspRealmReq req) { - return service.onRtspRealm(req); - } - - /** - * rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。 - */ - @PostMapping(value = "/on_rtsp_auth") - public RtspAuthResp onRtspAuth(@RequestBody RtspAuthReq req) { - return service.onRtspAuth(req); - } - - /** - * shell登录鉴权,ZLMediaKit提供简单的telnet调试方式 - * 使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。 - */ - @PostMapping(value = "/on_shell_login") - public BaseEventResp onShellLogin(@RequestBody ShellLoginReq req) { - return service.onShellLogin(req); - } - - /** - * rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_stream_changed") - public BaseEventResp onStreamChanged(@RequestBody StreamChangedReq req) { - return service.onStreamChanged(req); - } - - /** - * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 - */ - @PostMapping(value = "/on_stream_none_reader") - public BaseEventResp onStreamNoneReader(@RequestBody StreamNoneReaderReq req) { - return service.onStreamNoneReader(req); - } - - /** - * 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_stream_not_found") - public BaseEventResp onStreamNotFound(@RequestBody StreamNotFoundReq req) { - return service.onStreamNotFound(req); - } - - /** - * 服务器启动事件,可以用于监听服务器崩溃重启;此事件对回复不敏感。 - */ - @PostMapping(value = "/on_server_started") - public BaseEventResp onServerStarted(@RequestBody ServerConfig req) { - return service.onServerStarted(req); - } - - /** - * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 - */ - @PostMapping(value = "/on_server_keepalive") - public BaseEventResp onServerKeepalive(@RequestBody ServerKeepaliveReq req) { - return service.onServerKeepalive(req); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java deleted file mode 100644 index b56e1e1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/ZlmService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dite.znpt.monitor.media.zlm; - -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:39 - * @Description: 流媒体服务管理主业务 - */ -public interface ZlmService { - /** - * 点播视频 - * - * @param deviceCode 设备编码 - * @param channelCode 通道编码 - * @return 流信息 - */ - MediaItem play(String deviceCode, String channelCode); - - /** - * 失败的时候释放流媒体资源 - * - * @param deviceCode 设备编码 - * @param channelCode 通道编码 - */ - void release(String deviceCode, String channelCode); - - /** - * 失败的时候释放流媒体资源 - * - * @param media 流媒体信息 - */ - void release(MediaItem media); - - /** - * 停止点播 - * - * @param mediaServerId 流媒体服务器id,通过配置文件设置 - * @param streamId 流ID - */ - void display(String mediaServerId, String streamId); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java deleted file mode 100644 index 4f13dad..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerCache.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.cache; - -import com.dite.znpt.monitor.media.zlm.dto.ServerItem; -import com.dite.znpt.service.impl.RedisService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @Author: huise23 - * @Date: 2022/8/30 15:46 - * @Description: - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MediaServerCache { - private final RedisService redisService; - private final String zlm_key = "zlm_media_server"; - - - public void putLoad(ServerItem serverItem) { - redisService.setCacheObject(zlm_key, serverItem); - } - - /** - * 获取zlm节点 - */ - public ServerItem getLoad() { - return redisService.getCacheObject(zlm_key); - } - - public void releaseSsrc(String ssrc) { - ServerItem item = getLoad(); - item.releaseSsrc(ssrc); - putLoad(item); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java deleted file mode 100644 index 27b7fbb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/cache/MediaServerChannelCache.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.cache; - -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; -import com.dite.znpt.service.impl.RedisService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @Author: huise23 - * @Date: 2022/8/30 15:46 - * @Description: - */ -@Component -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class MediaServerChannelCache { - private final RedisService redisService; - - private String getKey(String deviceCode, String channelCode) { - return StrUtil.format("zlm_media_server_channel:{}:{}", deviceCode, channelCode); - } - - private String getStreamKey(String mediaServerId, String streamId) { - return StrUtil.format("zlm_media_server_channel_stream_key:{}:{}", mediaServerId, streamId); - } - - public boolean has(String deviceCode, String channelCode) { - return redisService.hasKey(getKey(deviceCode, channelCode)); - } - - public MediaItem get(String deviceCode, String channelCode) { - return redisService.getCacheObject(getKey(deviceCode, channelCode)); - } - - public void put(String deviceCode, String channelCode, MediaItem media) { - String key = getKey(deviceCode, channelCode); - redisService.setCacheObject(key, media); - redisService.setCacheObject(getStreamKey(media.getConfig().getGeneralMediaServerId(), media.getStreamId()), key); - } - - public void delete(MediaItem media) { - redisService.deleteObject(getKey(media.getDeviceCode(), media.getChannelCode())); - redisService.deleteObject(getStreamKey(media.getConfig().getGeneralMediaServerId(), media.getStreamId())); - } - - public MediaItem getByStream(String mediaServerId, String streamId) { - String key = redisService.getCacheObject(getStreamKey(mediaServerId, streamId)); - if (StrUtil.isNotBlank(key)) { - return redisService.getCacheObject(key); - } - return null; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java deleted file mode 100644 index e2a7d07..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/config/StreamMediaServerConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.config; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Data -@Configuration -@ConfigurationProperties(prefix = "zlm-config") -public class StreamMediaServerConfig { - - @ApiModelProperty(value = "'流媒体名称'") - private String mediaName; - - @ApiModelProperty(value = "流媒体服务商") - private String mediaService; - - @ApiModelProperty(value = "公网ip") - private String publicHost; - - @ApiModelProperty(value = "接口ip") - private String apiHost; - - @ApiModelProperty(value = "接口端口") - private Integer apiPort; - - @ApiModelProperty(value = "密钥") - private String secretKey; - - @ApiModelProperty(value = "流id前缀") - private String streamPrefix; - - @ApiModelProperty(value = "rtp ip") - private String rtpHost; - - @ApiModelProperty(value = "rtp 端口") - private Integer rtpPort; - - @ApiModelProperty(value = "动态端口起始值") - private String dynamicPortStart; - - @ApiModelProperty(value = "动态端口结束值") - private String dynamicPortEnd; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java deleted file mode 100644 index a39c8c4..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/MediaItem.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.media.zlm.dto.resp.RtpInfoResp; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 15:41 - * @Description: - */ -@Data -@NoArgsConstructor -@Accessors(chain = true) -public class MediaItem implements Serializable { - private static final long serialVersionUID = -6679610697837602559L; - /** - * 设备编码 - */ - private String deviceCode; - /** - * 通道编码 - */ - private String channelCode; - /** - * 节点信息ID - */ - private String configId; - /** - * 节点信息ID - */ - private ServerInfo server; - /** - * 节点格式信息 - */ - private List formatList; - /** - * 节点配置信息 - */ - private ServerConfig config; - /** - * 流ID - */ - private String streamId; - /** - * 播放流信息 - */ - private RtpInfoResp rtp; - /** - * Rtp服务监听端口 - */ - private Integer rtpPort; - /** - * SSRC源地址 - */ - private String ssrc; - /** - * rtmp播放地址 - */ - private String rtmpUrl; - /** - * rtmpSsl播放地址 - */ - private String rtmpSslUrl; - /** - * rtsp播放地址 - */ - private String rtspUrl; - /** - * rtspSsl播放地址 - */ - private String rtspSslUrl; - - /** - * rtc流地址 - */ - private String rtc; - - /** - * rtcs流地址 - */ - private String rtcs; - - /** - * 是否缓存 - */ - private Boolean isCache; - - public List getFormatList(String mediaRouter) { - if (StrUtil.isNotBlank(streamId)) { - formatList.forEach(item -> item.generateUrl(server.getApiHost(), streamId, config, mediaRouter)); - } - return formatList; - } - - public String getRtmpUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return StrUtil.format("rtmp://{}:{}/rtp/{}", server.getApiHost(), config.getRtmpPort(), streamId); - } - - public String getRtmpSslUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return config.getRtspSslPort() > 0 ? StrUtil.format("rtmps://{}:{}/rtp/{}", server.getApiHost(), config.getRtspSslPort(), streamId) : ""; - } - - - public String getRtspUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return StrUtil.format("rtsp://{}:{}/rtp/{}", server.getApiHost(), config.getRtspPort(), streamId); - } - - public String getRtspSslUrl() { - if (StrUtil.isBlank(streamId)) { - return ""; - } - return config.getRtspSslPort() > 0 ? StrUtil.format("rtsps://{}:{}/rtp/{}", server.getApiHost(), config.getRtspSslPort(), streamId) : ""; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java deleted file mode 100644 index 62b51d7..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerConfig.java +++ /dev/null @@ -1,852 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.annotation.JSONField; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.req.BaseReq; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:54 - * @Description: 服务器配置 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class ServerConfig extends BaseReq { - // ----------------------------------------------- api ----------------------------------------------- - /** - * 是否调试http api,启用调试后,会打印每次http请求的内容和回复 - * apiDebug=1 - */ - @JSONField(name = "api.apiDebug") - private Integer apiDebug; - /** - * 一些比较敏感的http api在访问时需要提供secret,否则无权限调用 - * 如果是通过127.0.0.1访问,那么可以不提供secret - * secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc - */ - @JSONField(name = "api.secret") - private String apiSecret; - /** - * 截图保存路径根目录,截图通过http api(/index/api/getSnap)生成和获取 - * snapRoot=./www/snap/ - */ - @JSONField(name = "api.snapRoot") - private String apiSnapRoot; - /** - * 默认截图图片,在启动FFmpeg截图后但是截图还未生成时,可以返回默认的预设图片 - * defaultSnap=./www/logo.png - */ - @JSONField(name = "api.defaultSnap") - private String apiDefaultSnap; - // ----------------------------------------------- ffmpeg ----------------------------------------------- - /** - * FFmpeg可执行程序路径,支持相对路径/绝对路径 - * bin=/usr/bin/ffmpeg - */ - @JSONField(name = "ffmpeg.bin") - private String ffmpegBin; - /** - * FFmpeg拉流再推流的命令模板,通过该模板可以设置再编码的一些参数 - * cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s - */ - @JSONField(name = "ffmpeg.cmd") - private String ffmpegCmd; - /** - * FFmpeg生成截图的命令,可以通过修改该配置改变截图分辨率或质量 - * snap=%s -i %s -y -f mjpeg -t 0.001 %s - */ - @JSONField(name = "ffmpeg.snap") - private String ffmpegSnap; - /** - * FFmpeg日志的路径,如果置空则不生成FFmpeg日志 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * log=./ffmpeg/ffmpeg.log - */ - @JSONField(name = "ffmpeg.log") - private String ffmpegLog; - /** - * 自动重启的时间(秒), 默认为0, 也就是不自动重启. 主要是为了避免长时间ffmpeg拉流导致的不同步现象 - * restart_sec=0 - */ - @JSONField(name = "ffmpeg.restart_sec") - private String ffmpegRestartSec; - // ----------------------------------------------- general ----------------------------------------------- - /** - * 是否启用虚拟主机 - * enableVhost=0 - */ - @JSONField(name = "general.enableVhost") - private Integer enableVhost; - /** - * 播放器或推流器在断开后会触发hook.on_flow_report事件(使用多少流量事件), - * flowThreshold参数控制触发hook.on_flow_report事件阈值,使用流量超过该阈值后才触发,单位KB - * flowThreshold=1024 - */ - @JSONField(name = "general.flowThreshold") - private Integer generalFlowThreshold; - /** - * 播放最多等待时间,单位毫秒 - * 播放在播放某个流时,如果该流不存在, - * ZLMediaKit会最多让播放器等待maxStreamWaitMS毫秒 - * 如果在这个时间内,该流注册成功,那么会立即返回播放器播放成功 - * 否则返回播放器未找到该流,该机制的目的是可以先播放再推流 - * maxStreamWaitMS=15000 - */ - @JSONField(name = "general.maxStreamWaitMS") - private Integer generalMaxStreamWaitMs; - /** - * 某个流无人观看时,触发hook.on_stream_none_reader事件的最大等待时间,单位毫秒 - * 在配合hook.on_stream_none_reader事件时,可以做到无人观看自动停止拉流或停止接收推流 - * streamNoneReaderDelayMS=20000 - */ - @JSONField(name = "general.streamNoneReaderDelayMS") - private Integer generalStreamNoneReaderDelayMs; - /** - * 是否全局添加静音aac音频,转协议时有效 - * 有些播放器在打开单视频流时不能秒开,添加静音音频可以加快秒开速度 - * addMuteAudio=1 - */ - @JSONField(name = "general.addMuteAudio") - private Integer generalAddMuteAudio; - /** - * 拉流代理时如果断流再重连成功是否删除前一次的媒体流数据,如果删除将重新开始, - * 如果不删除将会接着上一次的数据继续写(录制hls/mp4时会继续在前一个文件后面写) - * resetWhenRePlay=1 - */ - @JSONField(name = "general.resetWhenRePlay") - private Integer generalResetWhenRePlay; - /** - * 是否默认推流时转换成hls,hook接口(on_publish)中可以覆盖该设置 - * publishToHls=1 - */ - @JSONField(name = "general.publishToHls") - private Integer generalPublishToHls; - /** - * 是否默认推流时mp4录像,hook接口(on_publish)中可以覆盖该设置 - * publishToMP4=0 - */ - @JSONField(name = "general.publishToMP4") - private Integer generalPublishToMP4; - /** - * 合并写缓存大小(单位毫秒),合并写指服务器缓存一定的数据后才会一次性写入socket,这样能提高性能,但是会提高延时 - * 开启后会同时关闭TCP_NODELAY并开启MSG_MORE - * mergeWriteMS=0 - */ - @JSONField(name = "general.mergeWriteMS") - private Integer generalMergeWriteMS; - /** - * 全局的时间戳覆盖开关,在转协议时,对frame进行时间戳覆盖 - * 该开关对rtsp/rtmp/rtp推流、rtsp/rtmp/hls拉流代理转协议时生效 - * 会直接影响rtsp/rtmp/hls/mp4/flv等协议的时间戳 - * 同协议情况下不影响(例如rtsp/rtmp推流,那么播放rtsp/rtmp时不会影响时间戳) - * modifyStamp=0 - */ - @JSONField(name = "general.modifyStamp") - private Integer generalModifyStamp; - /** - * 服务器唯一id,用于触发hook时区别是哪台服务器 - * mediaServerId=your_server_id - */ - @JSONField(name = "general.mediaServerId") - private String generalMediaServerId; - /** - * 转协议是否全局开启或关闭音频 - * enable_audio=1 - */ - @JSONField(name = "general.enable_audio") - private Integer generalEnableAudio; - // ###### 以下是按需转协议的开关,在测试ZLMediaKit的接收推流性能时,请把下面开关置1 - // ###### 如果某种协议你用不到,你可以把以下开关置1以便节省资源(但是还是可以播放,只是第一个播放者体验稍微差点), - // ###### 如果某种协议你想获取最好的用户体验,请置0(第一个播放者可以秒开,且不花屏) - /** - * hls协议是否按需生成,如果hls.segNum配置为0(意味着hls录制),那么hls将一直生成(不管此开关) - * hls_demand=0 - */ - @JSONField(name = "general.hls_demand") - private Integer generalHlsDemand; - /** - * rtsp[s]协议是否按需生成 - * rtsp_demand=0 - */ - @JSONField(name = "general.rtsp_demand") - private Integer generalRtspDemand; - /** - * rtmp[s]、http[s]-flv、ws[s]-flv协议是否按需生成 - * rtmp_demand=0 - */ - @JSONField(name = "general.rtmp_demand") - private Integer generalRtmpDemand; - /** - * http[s]-ts协议是否按需生成 - * ts_demand=0 - */ - @JSONField(name = "general.ts_demand") - private Integer generalTsDemand; - /** - * http[s]-fmp4、ws[s]-fmp4协议是否按需生成 - * fmp4_demand=0 - */ - @JSONField(name = "general.fmp4_demand") - private Integer generalFmp4Demand; - /** - * 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track - * wait_track_ready_ms=10000 - */ - @JSONField(name = "general.wait_track_ready_ms") - private Integer generalWaitTrackReadyMs; - /** - * 如果流只有单Track,最多等待若干毫秒,超时后未收到其他Track的数据,则认为是单Track - * 如果协议元数据有声明特定track数,那么无此等待时间 - * wait_add_track_ms=3000 - */ - @JSONField(name = "general.wait_add_track_ms") - private Integer generalWaitAddTrackMs; - /** - * 如果track未就绪,我们先缓存帧数据,但是有最大个数限制,防止内存溢出 - * unready_frame_cache=100 - */ - @JSONField(name = "general.unready_frame_cache") - private Integer generalUnreadyFrameCache; - /** - * 推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。 - * 置0关闭此特性(推流断开会导致立即断开播放器) - * 此参数不应大于播放器超时时间 - * continue_push_ms=15000 - */ - @JSONField(name = "general.continue_push_ms") - private Integer generalContinuePushMs; - // ----------------------------------------------- hls ----------------------------------------------- - /** - * hls写文件的buf大小,调整参数可以提高文件io性能 - * fileBufSize=65536 - */ - @JSONField(name = "hls.fileBufSize") - private Integer hlsFileBufSize; - /** - * hls保存文件路径 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * filePath=./www - */ - @JSONField(name = "hls.filePath") - private String hlsFilePath; - /** - * hls最大切片时间 - * segDur=2 - */ - @JSONField(name = "hls.segDur") - private Integer hlsSegDur; - /** - * m3u8索引中,hls保留切片个数(实际保留切片个数大2~3个) - * 如果设置为0,则不删除切片,而是保存为点播 - * segNum=3 - */ - @JSONField(name = "hls.segNum") - private Integer hlsSegNum; - /** - * HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数 - * segRetain=5 - */ - @JSONField(name = "hls.segRetain") - private Integer hlsSegRetain; - /** - * 是否广播 ts 切片完成通知 - * broadcastRecordTs=0 - */ - @JSONField(name = "hls.broadcastRecordTs") - private Integer hlsBroadcastRecordTs; - /** - * 直播hls文件删除延时,单位秒,issue: #913 - * deleteDelaySec=0 - */ - @JSONField(name = "hls.deleteDelaySec") - private Integer hlsDeleteDelaySec; - /** - * 是否保留hls文件,此功能部分等效于segNum=0的情况 - * 不同的是这个保留不会在m3u8文件中体现 - * 0为不保留,不起作用 - * 1为保留,则不删除hls文件,如果开启此功能,注意磁盘大小,或者定期手动清理hls文件 - * segKeep=0 - */ - @JSONField(name = "hls.segKeep") - private Integer hlsSegKeep; - // ----------------------------------------------- hook ----------------------------------------------- - /** - * 在推流时,如果url参数匹对admin_params,那么可以不经过hook鉴权直接推流成功,播放时亦然 - * 该配置项的目的是为了开发者自己调试测试,该参数暴露后会有泄露隐私的安全隐患 - * admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc - */ - @JSONField(name = "hook.admin_params") - private String hookAdminParams; - /** - * 是否启用hook事件,启用后,推拉流都将进行鉴权 - * enable=0 - */ - @JSONField(name = "hook.enable") - private Integer hookHookEnable; - /** - * 播放器或推流器使用流量事件,置空则关闭 - * on_flow_report=https://127.0.0.1/index/hook/on_flow_report - */ - @JSONField(name = "hook.on_flow_report") - private String hookOnFlowReport; - /** - * 访问http文件鉴权事件,置空则关闭鉴权 - * on_http_access=https://127.0.0.1/index/hook/on_http_access - */ - @JSONField(name = "hook.on_http_access") - private String hookOnHttpAccess; - /** - * 播放鉴权事件,置空则关闭鉴权 - * on_play=https://127.0.0.1/index/hook/on_play - */ - @JSONField(name = "hook.on_play") - private String hookOnPlay; - /** - * 推流鉴权事件,置空则关闭鉴权 - * on_publish=https://127.0.0.1/index/hook/on_publish - */ - @JSONField(name = "hook.on_publish") - private String hookOnPublish; - /** - * 录制mp4切片完成事件 - * on_record_mp4=https://127.0.0.1/index/hook/on_record_mp4 - */ - @JSONField(name = "hook.on_record_mp4") - private String hookOnRecordMp4; - /** - * 录制 hls ts 切片完成事件 - * on_record_ts=https://127.0.0.1/index/hook/on_record_ts - */ - @JSONField(name = "hook.on_record_ts") - private String hookOnRecordTs; - /** - * rtsp播放鉴权事件,此事件中比对rtsp的用户名密码 - * on_rtsp_auth=https://127.0.0.1/index/hook/on_rtsp_auth - */ - @JSONField(name = "hook.on_rtsp_auth") - private String hookOnRtspAuth; - /** - * rtsp播放是否开启专属鉴权事件,置空则关闭rtsp鉴权。rtsp播放鉴权还支持url方式鉴权 - * 建议开发者统一采用url参数方式鉴权,rtsp用户名密码鉴权一般在设备上用的比较多 - * 开启rtsp专属鉴权后,将不再触发on_play鉴权事件 - * on_rtsp_realm=https://127.0.0.1/index/hook/on_rtsp_realm - */ - @JSONField(name = "hook.on_rtsp_realm") - private String hookOnRtspRealm; - /** - * 远程telnet调试鉴权事件 - * on_shell_login=https://127.0.0.1/index/hook/on_shell_login - */ - @JSONField(name = "hook.on_shell_login") - private String hookOnShellLogin; - /** - * 直播流注册或注销事件 - * on_stream_changed=https://127.0.0.1/index/hook/on_stream_changed - */ - @JSONField(name = "hook.on_stream_changed") - private String hookOnStreamChanged; - /** - * 服务器启动报告,可以用于服务器的崩溃重启事件监听 - * on_server_started=https://127.0.0.1/index/hook/on_server_started - */ - @JSONField(name = "hook.on_server_started") - private String hookOnServerStarted; - /** - * server保活上报 - * on_server_keepalive=https://127.0.0.1/index/hook/on_server_keepalive - */ - @JSONField(name = "hook.on_server_keepalive") - private String hookOnServerKeepalive; - /** - * 无人观看流事件,通过该事件,可以选择是否关闭无人观看的流。配合general.streamNoneReaderDelayMS选项一起使用 - * on_stream_none_reader=https://127.0.0.1/index/hook/on_stream_none_reader - */ - @JSONField(name = "hook.on_stream_none_reader") - private String hookOnStreamNoneReader; - /** - * 播放时,未找到流事件,通过配合hook.on_stream_none_reader事件可以完成按需拉流 - * on_stream_not_found=https://127.0.0.1/index/hook/on_stream_not_found - */ - @JSONField(name = "hook.on_stream_not_found") - private String hookOnStreamNotFound; - /** - * 发送rtp(startSendRtp)被动关闭时回调 - * on_send_rtp_stopped=https://127.0.0.1/index/hook/on_send_rtp_stopped - */ - @JSONField(name = "hook.on_send_rtp_stopped") - private String hookOnSendRtpStopped; - /** - * hook api最大等待回复时间,单位秒 - * timeoutSec=10 - */ - @JSONField(name = "hook.timeoutSec") - private Integer hookTimeoutSec; - /** - * keepalive hook触发间隔,单位秒,float类型 - * alive_interval=10.0 - */ - @JSONField(name = "hook.alive_interval") - private Float hookAliveInterval; - /** - * hook通知失败重试次数,正整数。为0不重试,1时重试一次,以此类推 - * retry=1 - */ - @JSONField(name = "hook.retry") - private Integer hookRetry; - /** - * hook通知失败重试延时,单位秒,float型 - * retry_delay=3.0 - */ - @JSONField(name = "hook.retry_delay") - private Float hookRetryDelay; - // ----------------------------------------------- cluster ----------------------------------------------- - /** - * 设置源站拉流url模板, 格式跟printf类似,第一个%s指定app,第二个%s指定stream_id, - * 开启集群模式后,on_stream_not_found和on_stream_none_reader hook将无效. - * 溯源模式支持以下类型: - * rtmp方式: rtmp://127.0.0.1:1935/%s/%s - * rtsp方式: rtsp://127.0.0.1:554/%s/%s - * hls方式: http://127.0.0.1:80/%s/%s/hls.m3u8 - * http-ts方式: http://127.0.0.1:80/%s/%s.live.ts - * 支持多个源站,不同源站通过分号(;)分隔 - * origin_url= - */ - @JSONField(name = "cluster.origin_url") - private String clusterOriginUrl; - /** - * 溯源总超时时长,单位秒,float型;假如源站有3个,那么单次溯源超时时间为timeout_sec除以3 - * 单次溯源超时时间不要超过general.maxStreamWaitMS配置 - * timeout_sec=15 - */ - @JSONField(name = "cluster.timeout_sec") - private Integer clusterTimeoutSec; - /** - * 溯源失败尝试次数,-1时永久尝试 - * retry_count=3 - */ - @JSONField(name = "cluster.retry_count") - private Integer clusterRetryCount; - // ----------------------------------------------- http ----------------------------------------------- - /** - * http服务器字符编码,windows上默认gb2312 - * charSet=utf-8 - */ - @JSONField(name = "http.charSet") - private String httpCharSet; - /** - * http链接超时时间 - * keepAliveSecond=30 - */ - @JSONField(name = "http.keepAliveSecond") - private Integer httpKeepAliveSecond; - /** - * http请求体最大字节数,如果post的body太大,则不适合缓存body在内存 - * maxReqSize=40960 - */ - @JSONField(name = "http.maxReqSize") - private Integer httpMaxReqSize; - /** - * 404网页内容,用户可以自定义404网页 - * notFound=404 Not Found

您访问的资源不存在!


ZLMediaKit-4.0
- */ - @JSONField(name = "http.notFound") - private String httpNotFound; - /** - * http服务器监听端口 - * port=80 - */ - @JSONField(name = "http.port") - private Integer httpPort; - /** - * http文件服务器根目录 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * rootPath=./www - */ - @JSONField(name = "http.rootPath") - private String httpRootPath; - /** - * http文件服务器读文件缓存大小,单位BYTE,调整该参数可以优化文件io性能 - * sendBufSize=65536 - */ - @JSONField(name = "http.sendBufSize") - private Integer httpSendBufSize; - /** - * https服务器监听端口 - * sslport=443 - */ - @JSONField(name = "http.sslport") - private Integer httpSslPort; - /** - * 是否显示文件夹菜单,开启后可以浏览文件夹 - * dirMenu=1 - */ - @JSONField(name = "http.dirMenu") - private Integer httpDirMenu; - /** - * 虚拟目录, 虚拟目录名和文件路径使用","隔开,多个配置路径间用";"隔开 - * 例如赋值为 app_a,/path/to/a;app_b,/path/to/b 那么 - * 访问 http://127.0.0.1/app_a/file_a 对应的文件路径为 /path/to/a/file_a - * 访问 http://127.0.0.1/app_b/file_b 对应的文件路径为 /path/to/b/file_b - * 访问其他http路径,对应的文件路径还是在rootPath内 - * virtualPath= - */ - @JSONField(name = "http.virtualPath") - private String httpVirtualPath; - /** - * 禁止后缀的文件使用mmap缓存,使用“,”隔开 - * 例如赋值为 .mp4,.flv - * 那么访问后缀为.mp4与.flv 的文件不缓存 - * forbidCacheSuffix= - */ - @JSONField(name = "http.forbidCacheSuffix") - private String httpForbidCacheSuffix; - /** - * 可以把http代理前真实客户端ip放在http头中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388 - * 切勿暴露此key,否则可能导致伪造客户端ip - * forwarded_ip_header= - */ - @JSONField(name = "http.forwarded_ip_header") - private String httpForwardedIpHeader; - // ----------------------------------------------- multicast ----------------------------------------------- - /** - * rtp组播截止组播ip地址 - * addrMax=239.255.255.255 - */ - @JSONField(name = "multicast.addrMax") - private String multicastAddrMax; - /** - * rtp组播起始组播ip地址 - * addrMin=239.0.0.0 - */ - @JSONField(name = "multicast.addrMin") - private String multicastAddrMin; - /** - * 组播udp ttl - * udpTTL=64 - */ - @JSONField(name = "multicast.udpTTL") - private Integer multicastUdpTtl; - // ----------------------------------------------- record ----------------------------------------------- - /** - * mp4录制或mp4点播的应用名,通过限制应用名,可以防止随意点播 - * 点播的文件必须放置在此文件夹下 - * appName=record - */ - @JSONField(name = "record.appName") - private String recordAppName; - /** - * mp4录制写文件缓存,单位BYTE,调整参数可以提高文件io性能 - * fileBufSize=65536 - */ - @JSONField(name = "record.fileBufSize") - private Integer recordFileBufSize; - /** - * mp4录制保存、mp4点播根路径 - * 可以为相对(相对于本可执行程序目录)或绝对路径 - * filePath=./www - */ - @JSONField(name = "record.filePath") - private String recordFilePath; - /** - * mp4录制切片时间,单位秒 - * fileSecond=3600 - */ - @JSONField(name = "record.fileSecond") - private Integer recordFileSecond; - /** - * mp4点播每次流化数据量,单位毫秒, - * 减少该值可以让点播数据发送量更平滑,增大该值则更节省cpu资源 - * sampleMS=500 - */ - @JSONField(name = "record.sampleMS") - private Integer recordSampleMs; - /** - * mp4录制完成后是否进行二次关键帧索引写入头部 - * fastStart=0 - */ - @JSONField(name = "record.fastStart") - private Integer recordFastStart; - /** - * MP4点播(rtsp/rtmp/http-flv/ws-flv)是否循环播放文件 - * fileRepeat=0 - */ - @JSONField(name = "record.fileRepeat") - private Integer recordFileRepeat; - /** - * MP4录制是否当做播放器参与播放人数统计 - * mp4_as_player=0 - */ - @JSONField(name = "record.mp4_as_player") - private Integer recordMp4AsPlayer; - // ----------------------------------------------- rtmp ----------------------------------------------- - /** - * rtmp必须在此时间内完成握手,否则服务器会断开链接,单位秒 - * handshakeSecond=15 - */ - @JSONField(name = "rtmp.handshakeSecond") - private Integer rtmpHandshakeSecond; - /** - * rtmp超时时间,如果该时间内未收到客户端的数据, - * 或者tcp发送缓存超过这个时间,则会断开连接,单位秒 - * keepAliveSecond=15 - */ - @JSONField(name = "rtmp.keepAliveSecond") - private Integer rtmpKeepAliveSecond; - /** - * 在接收rtmp推流时,是否重新生成时间戳(很多推流器的时间戳着实很烂) - * modifyStamp=0 - */ - @JSONField(name = "rtmp.modifyStamp") - private Integer rtmpModifyStamp; - /** - * rtmp服务器监听端口 - * port=1935 - */ - @JSONField(name = "rtmp.port") - private Integer rtmpPort = 0; - /** - * rtmps服务器监听地址 - * sslport=0 - */ - @JSONField(name = "rtmp.sslport") - private Integer rtmpSslPort = 0; - // ----------------------------------------------- rtp ----------------------------------------------- - /** - * 音频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400 - * 加大该值会明显增加直播延时 - * audioMtuSize=600 - */ - @JSONField(name = "rtp.audioMtuSize") - private Integer rtpAudioMtuSize; - /** - * 视频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400 - * videoMtuSize=1400 - */ - @JSONField(name = "rtp.videoMtuSize") - private Integer rtpVideoMtuSize; - /** - * rtp包最大长度限制,单位KB,主要用于识别TCP上下文破坏时,获取到错误的rtp - * rtpMaxSize=10 - */ - @JSONField(name = "rtp.rtpMaxSize") - private Integer rtpMaxSize; - // ----------------------------------------------- rtp_proxy ----------------------------------------------- - /** - * 导出调试数据(包括rtp/ps/h264)至该目录,置空则关闭数据导出 - * dumpDir= - */ - @JSONField(name = "rtp_proxy.dumpDir") - private String proxyDumpDir; - /** - * udp和tcp代理服务器,支持rtp(必须是ts或ps类型)代理 - * port=10000 - */ - @JSONField(name = "rtp_proxy.port") - private Integer proxyPort; - /** - * rtp超时时间,单位秒 - * timeoutSec=15 - */ - @JSONField(name = "rtp_proxy.timeoutSec") - private Integer proxyTimeoutSec; - /** - * 随机端口范围,最少确保36个端口 - * 该范围同时限制rtsp服务器udp端口范围 - * port_range=30000-35000 - */ - @JSONField(name = "rtp_proxy.port_range") - private String proxyPortRange; - /** - * rtp h264 负载的pt - * h264_pt=98 - */ - @JSONField(name = "rtp_proxy.h264_pt") - private Integer proxyH264Pt; - /** - * rtp h265 负载的pt - * h265_pt=99 - */ - @JSONField(name = "rtp_proxy.h265_pt") - private Integer proxyH265Pt; - /** - * rtp ps 负载的pt - * ps_pt=96 - */ - @JSONField(name = "rtp_proxy.ps_pt") - private Integer proxyPsPt; - /** - * rtp ts 负载的pt - * ts_pt=33 - */ - @JSONField(name = "rtp_proxy.ts_pt") - private Integer proxyTsPt; - /** - * rtp opus 负载的pt - * opus_pt=100 - */ - @JSONField(name = "rtp_proxy.opus_pt") - private Integer proxyOpusPt; - /** - * rtp g711u 负载的pt - * g711u_pt=0 - */ - @JSONField(name = "rtp_proxy.g711u_pt") - private Integer proxyG711UPt; - /** - * rtp g711a 负载的pt - * g711a_pt=8 - */ - @JSONField(name = "rtp_proxy.g711a_pt") - private Integer proxyG711APt; - // ----------------------------------------------- rtc ----------------------------------------------- - /** - * rtc播放推流、播放超时时间 - * timeoutSec=15 - */ - @JSONField(name = "rtc.timeoutSec") - private Integer rtcTimeoutSec; - /** - * 本机对rtc客户端的可见ip,作为服务器时一般为公网ip,可有多个,用','分开,当置空时,会自动获取网卡ip - * 同时支持环境变量,以$开头,如"$EXTERN_IP"; 请参考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786 - * externIP= - */ - @JSONField(name = "rtc.externIP") - private String rtcExternIp; - /** - * rtc udp服务器监听端口号,所有rtc客户端将通过该端口传输stun/dtls/srtp/srtcp数据, - * 该端口是多线程的,同时支持客户端网络切换导致的连接迁移 - * 需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致 - * port=8000 - */ - @JSONField(name = "rtc.port") - private Integer rtcPort; - /** - * 设置remb比特率,非0时关闭twcc并开启remb。该设置在rtc推流时有效,可以控制推流画质 - * 目前已经实现twcc自动调整码率,关闭remb根据真实网络状况调整码率 - * rembBitRate=0 - */ - @JSONField(name = "rtc.rembBitRate") - private Integer rtcRembBitRate; - /** - * rtc支持的音频codec类型,在前面的优先级更高 - * 以下范例为所有支持的音频codec - * preferredCodecA=PCMU,PCMA,opus,mpeg4-generic - */ - @JSONField(name = "rtc.preferredCodecA") - private String rtcPreferredCodecA; - /** - * rtc支持的视频codec类型,在前面的优先级更高 - * 以下范例为所有支持的视频codec - * preferredCodecV=H264,H265,AV1X,VP9,VP8 - */ - @JSONField(name = "rtc.preferredCodecV") - private String rtcPreferredCodecV; - // ----------------------------------------------- srt ----------------------------------------------- - /** - * srt播放推流、播放超时时间,单位秒 - * timeoutSec=5 - */ - @JSONField(name = "srt.timeoutSec") - private Integer srtTimeoutSec; - /** - * srt udp服务器监听端口号,所有srt客户端将通过该端口传输srt数据, - * 该端口是多线程的,同时支持客户端网络切换导致的连接迁移 - * port=9000 - */ - @JSONField(name = "srt.port") - private Integer srtPort; - /** - * srt 协议中延迟缓存的估算参数,在握手阶段估算rtt ,然后latencyMul*rtt 为最大缓存时长,此参数越大,表示等待重传的时长就越大 - * latencyMul=4 - */ - @JSONField(name = "srt.latencyMul") - private Integer srtLatencyMul; - /** - * 包缓存的大小 - * pktBufSize=8192 - */ - @JSONField(name = "srt.pktBufSize") - private Integer srtPktBufSize; - // ----------------------------------------------- rtsp ----------------------------------------------- - /** - * rtsp专有鉴权方式是采用base64还是md5方式 - * authBasic=0 - */ - @JSONField(name = "rtsp.authBasic") - private Integer rtspAuthBasic; - /** - * rtsp拉流、推流代理是否是直接代理模式 - * 直接代理后支持任意编码格式,但是会导致GOP缓存无法定位到I帧,可能会导致开播花屏 - * 并且如果是tcp方式拉流,如果rtp大于mtu会导致无法使用udp方式代理 - * 假定您的拉流源地址不是264或265或AAC,那么你可以使用直接代理的方式来支持rtsp代理 - * 如果你是rtsp推拉流,但是webrtc播放,也建议关闭直接代理模式, - * 因为直接代理时,rtp中可能没有sps pps,会导致webrtc无法播放; 另外webrtc也不支持Single NAL Unit Packets类型rtp - * 默认开启rtsp直接代理,rtmp由于没有这些问题,是强制开启直接代理的 - * directProxy=1 - */ - @JSONField(name = "rtsp.directProxy") - private Integer rtspDirectProxy; - /** - * rtsp必须在此时间内完成握手,否则服务器会断开链接,单位秒 - * handshakeSecond=15 - */ - @JSONField(name = "rtsp.handshakeSecond") - private Integer rtspHandshakeSecond; - /** - * rtsp超时时间,如果该时间内未收到客户端的数据, - * 或者tcp发送缓存超过这个时间,则会断开连接,单位秒 - * keepAliveSecond=15 - */ - @JSONField(name = "rtsp.keepAliveSecond") - private Integer rtspKeepAliveSecond; - /** - * rtsp服务器监听地址 - * port=554 - */ - @JSONField(name = "rtsp.port") - private Integer rtspPort = 0; - /** - * rtsps服务器监听地址 - * sslport=0 - */ - @JSONField(name = "rtsp.sslport") - private Integer rtspSslPort = 0; - // ----------------------------------------------- shell ----------------------------------------------- - /** - * 调试telnet服务器接受最大bufffer大小 - * maxReqSize=1024 - */ - @JSONField(name = "shell.maxReqSize") - private Integer shellMaxReqSize; - /** - * 调试telnet服务器监听端口 - * port=0 - */ - @JSONField(name = "shell.port") - private Integer shellPort; - - public void refreshHook(String ip, String port, StreamMediaServerConfig server) { - String host = ip + ":" + port; - this.hookOnFlowReport = StrUtil.format("http://{}/index/hook/on_flow_report", host); - this.hookOnHttpAccess = StrUtil.format("http://{}/index/hook/on_http_access", host); - this.hookOnPlay = StrUtil.format("http://{}/index/hook/on_play", host); - this.hookOnPublish = StrUtil.format("http://{}/index/hook/on_publish", host); - this.hookOnRecordMp4 = StrUtil.format("http://{}/index/hook/on_record_mp4", host); - this.hookOnRecordTs = StrUtil.format("http://{}/index/hook/on_record_ts", host); - this.hookOnRtspAuth = StrUtil.format("http://{}/index/hook/on_rtsp_auth", host); - this.hookOnRtspRealm = StrUtil.format("http://{}/index/hook/on_rtsp_realm", host); - this.hookOnShellLogin = StrUtil.format("http://{}/index/hook/on_shell_login", host); - this.hookOnStreamChanged = StrUtil.format("http://{}/index/hook/on_stream_changed", host); - this.hookOnStreamNoneReader = StrUtil.format("http://{}/index/hook/on_stream_none_reader", host); - this.hookOnStreamNotFound = StrUtil.format("http://{}/index/hook/on_stream_not_found", host); - this.hookOnServerStarted = StrUtil.format("http://{}/index/hook/on_server_started", host); - this.hookOnServerKeepalive = StrUtil.format("http://{}/index/hook/on_server_keepalive", host); -// this.hookOnSendRtpStopped = StrUtil.format("http://{}/index/hook/on_send_rtp_stopped", host); - this.hookOnSendRtpStopped = ""; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java deleted file mode 100644 index 143b1fc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerInfo.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:50 - * @Description: 节点基础信息 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class ServerInfo implements Serializable { - /** - * 节点地址 - */ - private String apiHost; - /** - * 节点端口 - */ - private Integer apiPort; - /** - * 节点秘钥 - */ - private String secretKey; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java deleted file mode 100644 index d590d3f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/ServerItem.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:50 - * @Description: 节点信息 - */ -@Data -@NoArgsConstructor -public class ServerItem implements Serializable { - - private static final long serialVersionUID = 2460404295026548536L; - /** - * 播流最大并发个数 - */ - public static final Integer MAX_PLAY_COUNT = 10000; - /** - * 节点信息ID - */ - private String configId; - /** - * 流ID前缀 - */ - private String streamPrefix; - /** - * 节点信息ID - */ - private ServerInfo server; - /** - * 节点格式信息 - */ - private List formatList; - /** - * 节点配置信息 - */ - private ServerConfig config; - /** - * 当前流信息 - */ - private List media; - /** - * 节点状态是否正常 - */ - private Boolean status; - /** - * 流媒体服务器已用的会话句柄 - */ - private Set usedSn; - - public ServerItem(StreamMediaServerConfig server, List formatList) { - this.streamPrefix = server.getStreamPrefix(); - this.server = new ServerInfo(server.getApiHost(), server.getApiPort(), server.getSecretKey()); - this.formatList = formatList; - this.status = false; - this.usedSn = new HashSet<>(); - } - - public String genPlaySsrc(String channelCode) { - if (this.usedSn.size() >= MAX_PLAY_COUNT) { - throw new ServiceException("ssrc已经用完!"); - } - int sn; - for (sn = 0; sn < MAX_PLAY_COUNT; sn++) { - if (!this.usedSn.contains(sn)) { - this.usedSn.add(sn); - break; - } - } - //return StrUtil.format("0{}{}", StrUtil.blankToDefault(streamPrefix, channelCode.substring(3, 8)), NumberUtil.decimalFormat("0000", sn)); - return channelCode; - } - - public void releaseSsrc(String ssrc) { - try { - Integer sn = NumberUtil.parseInt(ssrc.substring(6)); - usedSn.remove(sn); - } catch (Exception ignored) { - } - } - - public void setMedia(List media) { - this.media = media; - if (CollUtil.isNotEmpty(media)) { - media.forEach(item -> { - try { - Integer sn = NumberUtil.parseInt(StrUtil.isBlank(streamPrefix) ? item.getStream().substring(6) : item.getStream().replace("0" + streamPrefix, "")); - usedSn.add(sn); - } catch (Exception ignored) { - } - }); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java deleted file mode 100644 index a4125ae..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventReq.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:24 - * @Description: - */ -@Data -public class BaseEventReq { - /** - * 服务器id,通过配置文件设置 - */ - private String mediaServerId; - /** - * 流应用名 - */ - private String app; - /** - * TCP链接唯一ID - */ - private String id; - /** - * 播放器ip - */ - private String ip; - /** - * 播放url参数 - */ - private String params; - /** - * 播放器端口号 - */ - private Integer port; - /** - * 播放的协议,可能是rtsp、rtmp、http - */ - private String schema; - /** - * 流ID - */ - private String stream; - /** - * 流虚拟主机 - */ - private String vhost; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java deleted file mode 100644 index 04b573f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/BaseEventResp.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:33 - * @Description: 请求响应基类 - */ -@Data -@Accessors(chain = true) -public class BaseEventResp { - /** - * code == 0时代表完全成功 - */ - private Integer code; - /** - * 失败提示 - */ - private String msg; - /** - * 失败具体原因 - */ - private String err; - /** - * 该rtsp流是否需要rtsp专有鉴权,空字符串代码不需要鉴权 - */ - private String realm; - /** - * 是否关闭推流或拉流 - */ - private Boolean close; - - public BaseEventResp setSuccess(){ - return this.setCode(0).setMsg("success").setErr(""); - } - - public static BaseEventResp success() { - return new BaseEventResp().setSuccess(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java deleted file mode 100644 index 1661a94..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/FlowReportReq.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:04 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class FlowReportReq extends BaseEventReq { - /** - * tcp链接维持时间,单位秒 - */ - private Integer duration; - /** - * true为播放器,false为推流器 - */ - private Boolean player; - /** - * 耗费上下行流量总和,单位字节 - */ - private Integer totalBytes; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java deleted file mode 100644 index dfae6d6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import cn.hutool.core.lang.Dict; -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:10 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class HttpAccessReq extends BaseEventReq { - /** - * http客户端请求header - */ - private Dict header; - /** - * 访问路径是文件还是目录 - */ - @JSONField(name = "is_dir") - private Boolean isDir; - /** - * 请求访问的文件或目录 - */ - private String path; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java deleted file mode 100644 index 51424d8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/HttpAccessResp.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:15 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class HttpAccessResp extends BaseEventResp { - /** - * 该客户端能访问或被禁止的顶端目录,如果为空字符串,则表述为当前目录 - */ - private String path; - /** - * 本次授权结果的有效期,单位秒 - */ - private Integer second; - /** - * 服务器id,通过配置文件设置 - */ - private String mediaServerId; - - public static HttpAccessResp success() { - HttpAccessResp resp = new HttpAccessResp(); - resp.setSuccess(); - return resp.setSecond(600).setPath(""); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java deleted file mode 100644 index 2531052..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PlayReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:19 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class PlayReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java deleted file mode 100644 index de324dc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:57 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class PublishReq extends BaseEventReq{ -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java deleted file mode 100644 index f16d943..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/PublishResp.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:27 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class PublishResp extends BaseEventResp { - /** - * 是否转换成hls协议 - */ - @JSONField(name = "enable_hls") - private Boolean enableHls; - /** - * 是否允许mp4录制 - */ - @JSONField(name = "enable_mp4") - private Boolean enableMp4; - /** - * 是否转rtsp协议 - */ - @JSONField(name = "enable_rtsp") - private Boolean enableRtsp; - /** - * 是否转rtmp/flv协议 - */ - @JSONField(name = "enable_rtmp") - private Boolean enableRtmp; - /** - * 是否转http-ts/ws-ts协议 - */ - @JSONField(name = "enable_ts") - private Boolean enableTs; - /** - * 是否转http-fmp4/ws-fmp4协议 - */ - @JSONField(name = "enable_fmp4") - private Boolean enableFmp4; - /** - * 转协议时是否开启音频 - */ - @JSONField(name = "enable_audio") - private Boolean enableAudio; - /** - * 转协议时,无音频是否添加静音aac音频 - */ - @JSONField(name = "add_mute_audio") - private Boolean addMuteAudio; - /** - * mp4录制文件保存根目录,置空使用默认 - */ - @JSONField(name = "mp4_save_path") - private String mp4SavePath; - /** - * mp4录制切片大小,单位秒 - */ - @JSONField(name = "mp4_max_second") - private Integer mp4MaxSecond; - /** - * hls文件保存保存根目录,置空使用默认 - */ - @JSONField(name = "hls_save_path") - private String hlsSavePath; - /** - * 断连续推延时,单位毫秒,置空使用配置文件默认值 - */ - @JSONField(name = "continue_push_ms") - private Long continuePushMs; - - public static PublishResp success() { - PublishResp resp = new PublishResp(); - resp.setSuccess(); - return resp; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java deleted file mode 100644 index 50142ec..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RecordMp4Req.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:32 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RecordMp4Req extends BaseEventReq { - /** - * 文件名 - */ - @JSONField(name = "file_name") - private String fileName; - /** - * 文件绝对路径 - */ - @JSONField(name = "file_path") - private String filePath; - /** - * 文件大小,单位字节 - */ - @JSONField(name = "file_size") - private Integer fileSize; - /** - * 文件所在目录路径 - */ - private String folder; - /** - * 开始录制时间戳 - */ - @JSONField(name = "start_time") - private Integer startTime; - /** - * 录制时长,单位秒 - */ - @JSONField(name = "time_len") - private Integer timeLen; - /** - * http/rtsp/rtmp点播相对url路径 - */ - private String url; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java deleted file mode 100644 index bcb51e5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthReq.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:35 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RtspAuthReq extends BaseEventReq { - /** - * 请求的密码是否必须为明文(base64鉴权需要明文密码) - */ - @JSONField(name = "must_no_encrypt") - private Boolean mustNoEncrypt; - /** - * rtsp播放鉴权加密realm - */ - private String realm; - /** - * 播放用户名 - */ - @JSONField(name = "user_name") - private String userName; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java deleted file mode 100644 index 2021549..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspAuthResp.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:35 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class RtspAuthResp extends BaseEventResp { - /** - * 用户密码 - */ - private String passwd; - /** - * 用户密码是否已加密 - */ - private Boolean encrypted; - - public static RtspAuthResp success() { - RtspAuthResp resp = new RtspAuthResp(); - resp.setSuccess(); - return resp.setEncrypted(false); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java deleted file mode 100644 index 8d6547f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/RtspRealmReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:33 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RtspRealmReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java deleted file mode 100644 index d023328..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ServerKeepaliveReq.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.dite.znpt.monitor.media.zlm.dto.resp.StatisticResp; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:43 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class ServerKeepaliveReq extends BaseEventReq { - private StatisticResp data; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java deleted file mode 100644 index 86016eb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/ShellLoginReq.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:37 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class ShellLoginReq extends BaseEventReq { - /** - * 终端登录用户密码 - */ - private String passwd; - /** - * 终端登录用户名 - */ - @JSONField(name = "user_name") - private String userName; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java deleted file mode 100644 index cd90632..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamChangedReq.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:38 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamChangedReq extends MediaResp { - /** - * 流注册或注销 - */ - private Boolean regist; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java deleted file mode 100644 index 65e34bf..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNoneReaderReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:40 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamNoneReaderReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java deleted file mode 100644 index 0ead9cc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/event/StreamNotFoundReq.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.event; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/30 9:42 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamNotFoundReq extends BaseEventReq { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java deleted file mode 100644 index 445aef0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/BaseReq.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:33 - * @Description: 请求响应基类 - */ -@Data -public class BaseReq implements Serializable { - /** - * api操作密钥(配置文件配置),如果操作ip是127.0.0.1,则不需要此参数 - */ - private String secret; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java deleted file mode 100644 index 2eb3044..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/CloseStreamReq.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:51 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class CloseStreamReq extends StreamReq { - /** - * 是否强制关闭(有人在观看是否还关闭) - */ - private Integer force; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java deleted file mode 100644 index 54de5d0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/FFmpegSourceReq.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:26 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class FFmpegSourceReq extends BaseReq { - /** - * FFmpeg拉流地址,支持任意协议或格式(只要FFmpeg支持即可) - */ - @JSONField(name = "src_url") - private String srcUrl; - /** - * FFmpeg rtmp推流地址,一般都是推给自己,例如rtmp://127.0.0.1/live/stream_form_ffmpeg - */ - @JSONField(name = "dst_url") - private String dstUrl; - /** - * FFmpeg推流成功超时时间 - */ - @JSONField(name = "timeout_ms") - private Integer timeoutMs; - /** - * 是否开启hls录制 - */ - @JSONField(name = "enable_hls") - private Integer enableHls; - /** - * 是否开启mp4录制 - */ - @JSONField(name = "enable_mp4") - private Integer enableMp4; - /** - * 配置文件中FFmpeg命令参数模板key(非内容),置空则采用默认模板:ffmpeg.cmd - */ - @JSONField(name = "ffmpeg_cmd_key") - private String ffmpegCmdKey; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java deleted file mode 100644 index dd01aa5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetAllSessionReq.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:21 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class GetAllSessionReq extends BaseReq{ - /** - *筛选本机端口,例如筛选rtsp链接:554 - */ - @JSONField(name = "local_port") - private Integer localPort; - /** - *筛选客户端ip - */ - @JSONField(name = "peer_ip") - private String peerIp; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java deleted file mode 100644 index 6b05d35..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/GetMp4RecordFileReq.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:04 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class GetMp4RecordFileReq extends StreamReq { - /** - * 流的录像日期,格式为2020-02-01,如果不是完整的日期,那么是搜索录像文件夹列表,否则搜索对应日期下的mp4文件列表 - */ - private String period; - /** - * 自定义搜索路径,与startRecord方法中的customized_path一样,默认为配置文件的路径 - */ - @JSONField(name = "customized_path") - private String customizedPath; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java deleted file mode 100644 index 82c454d..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/IdReq.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:24 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@AllArgsConstructor -public class IdReq extends BaseReq { - /** - * 客户端唯一id,可以通过getAllSession接口获取 - */ - private Long id; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java deleted file mode 100644 index 91ebcd9..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/KeyReq.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:30 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@AllArgsConstructor -public class KeyReq extends BaseReq { - /** - * addStreamProxy接口返回的key - */ - private String key; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java deleted file mode 100644 index 4e3dc21..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RecordReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:11 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RecordReq extends StreamReq { - /** - * 0为hls,1为mp4 - */ - private Integer type; - /** - * 录像保存目录 - */ - @JSONField(name = "customized_path") - private String customizedPath; - /** - * mp4录像切片时间大小,单位秒,置0则采用配置项 - */ - @JSONField(name = "max_second") - private Integer maxSecond; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java deleted file mode 100644 index a7003e7..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/RtpServerReq.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:17 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@NoArgsConstructor -public class RtpServerReq extends BaseReq { - /** - * 接收端口,0则为随机端口 - */ - private Integer port; - /** - * 启用UDP监听的同时是否监听TCP端口 - */ - @JSONField(name = "enable_tcp") - private Integer enableTcp; - /** - * 该端口绑定的流ID,该端口只能创建这一个流(而不是根据ssrc创建多个) - */ - @JSONField(name = "stream_id") - private String streamId; - - public RtpServerReq(Integer port, Integer enableTcp, String streamId) { - this.port = port; - this.enableTcp = enableTcp; - this.streamId = streamId; - } - - public RtpServerReq(Integer enableTcp, String streamId) { - this(0, enableTcp, streamId); - } - - public RtpServerReq(String streamId) { - this(1, streamId); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java deleted file mode 100644 index 20807df..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SendRtpReq.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:23 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class SendRtpReq extends StreamReq { - /** - * 推流的rtp的ssrc,指定不同的ssrc可以同时推流到多个服务器 - */ - private String ssrc; - /** - * 目标ip或域名 - */ - @JSONField(name = "dst_url") - private String dstUrl; - /** - * 目标端口 - */ - @JSONField(name = "dst_port") - private Integer dstPort; - /** - * 是否为udp模式,否则为tcp模式 - */ - @JSONField(name = "is_udp") - private Integer isUdp; - /** - * 使用的本机端口,为0或不传时默认为随机端口 - */ - @JSONField(name = "src_port") - private Integer srcPort; - /** - * 使用的本机端口,为0或不传时默认为随机端口 - */ - private Integer pt; - /** - * 发送时,rtp的负载类型。为1时,负载为ps;为0时,为es;不传时默认为1 - */ - @JSONField(name = "use_ps") - private Integer usePs; - /** - * 当use_ps 为0时,有效。为1时,发送音频;为0时,发送视频;不传时默认为0 - */ - @JSONField(name = "only_audio") - private Integer onlyAudio; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java deleted file mode 100644 index 548cfd7..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/SnapReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:14 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class SnapReq extends BaseReq { - /** - * 需要截图的url,可以是本机的,也可以是远程主机的 - */ - private String url; - /** - * 截图失败超时时间,防止FFmpeg一直等待截图 - */ - @JSONField(name = "timeout_sec") - private Integer timeoutSec; - /** - * 截图的过期时间,该时间内产生的截图都会作为缓存返回 - */ - @JSONField(name = "expire_sec") - private Integer expireSec; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java deleted file mode 100644 index a53d2dc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamIdReq.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:30 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@AllArgsConstructor -public class StreamIdReq extends BaseReq { - /** - * RTP的ssrc,16进制字符串或者是流的id(openRtpServer接口指定) - */ - @JSONField(name = "stream_id") - private String streamId; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java deleted file mode 100644 index 8481f0a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamProxyReq.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:19 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamProxyReq extends StreamReq { - /** - * 拉流地址,例如rtmp://live.hkstv.hk.lxdns.com/live/hks2 Y - */ - private String url; - /** - * 拉流重试次数,默认为-1无限重试 - */ - @JSONField(name = "retry_count") - private Integer retryCount; - /** - * rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 - */ - @JSONField(name = "rtp_type") - private Integer rtpType; - /** - * 拉流超时时间,单位秒,float类型 - */ - @JSONField(name = "timeout_sec") - private Integer timeoutSec; - /** - * 是否转换成hls协议 - */ - @JSONField(name = "enable_hls") - private Integer enableHls; - /** - * 是否允许mp4录制 - */ - @JSONField(name = "enable_mp4") - private Integer enableMp4; - /** - * 是否转rtsp协议 - */ - @JSONField(name = "enable_rtsp") - private Integer enableRtsp; - /** - * 是否转rtmp/flv协议 - */ - @JSONField(name = "enable_rtmp") - private Integer enableRtmp; - /** - * 是否转http-ts/ws-ts协议 - */ - @JSONField(name = "enable_ts") - private Integer enableTs; - /** - * 是否转http-fmp4/ws-fmp4协议 - */ - @JSONField(name = "enable_fmp4") - private Integer enableFmp4; - /** - * 转协议时是否开启音频 - */ - @JSONField(name = "enable_audio") - private Integer enableAudio; - /** - * 转协议时,无音频是否添加静音aac音频 - */ - @JSONField(name = "add_mute_audio") - private Integer addMuteAudio; - /** - * mp4录制文件保存根目录,置空使用默认 - */ - @JSONField(name = "mp4_save_path") - private String mp4SavePath; - /** - * mp4录制切片大小,单位秒 - */ - @JSONField(name = "mp4_max_second") - private Integer mp4MaxSecond; - /** - * hls文件保存保存根目录,置空使用默认 - */ - @JSONField(name = "hls_save_path") - private String hlsSavePath; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java deleted file mode 100644 index 6729ba1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamPusherProxyReq.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:50 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class StreamPusherProxyReq extends StreamReq { - /** - * 目标转推url,带参数需要自行url转义 - */ - @JSONField(name = "dst_url") - private String dstUrl; - /** - * 转推失败重试次数,默认无限重试 - */ - @JSONField(name = "retry_count") - private Integer retryCount; - /** - * rtsp拉流时,拉流方式,0:tcp,1:udp,2:组播 - */ - @JSONField(name = "rtp_type") - private Integer rtpType; - /** - * 拉流超时时间,单位秒,float类型 - */ - @JSONField(name = "timeout_sec") - private Float timeoutSec; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java deleted file mode 100644 index 404369a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/req/StreamReq.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.req; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:05 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -public class StreamReq extends BaseReq { - /** - * 协议,例如 rtsp或rtmp - */ - private String schema; - /** - * 筛选虚拟主机,例如__defaultVhost__ - */ - private String vhost; - /** - * 筛选应用名,例如 live - */ - private String app; - /** - * 筛选流id,例如 test - */ - private String stream; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java deleted file mode 100644 index d6cfa48..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/BaseResp.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import lombok.Data; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:33 - * @Description: 请求响应基类 - */ -@Data -public class BaseResp { - /** - * code == 0时代表完全成功 - */ - private Integer code; - /** - * 失败提示 - */ - private String msg; - /** - * 失败具体原因 - */ - private String result; - /** - * 返回数据 - */ - private String data; - /** - * 配置项变更个数 - */ - private Integer changed; - /** - * false:未录制,true:正在录制 - */ - private Boolean status; - /** - * 接收端口,方便获取随机端口号 - */ - private Integer port; - /** - * 是否找到记录并关闭 - */ - private Integer hit; - - public String getMsg() { - return StrUtil.format("{}:{}", code, msg); - } - - public Boolean isSuccess() { - return code == 0; - } - - public T getData(Class clazz) { - return JSON.parseObject(data, clazz); - } - - public List getList(Class clazz) { - return JSON.parseArray(data, clazz); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java deleted file mode 100644 index aa0bf8e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/CloseStreamResp.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:59 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class CloseStreamResp extends BaseResp { - /** - * 筛选命中的流个数 - */ - @JSONField(name = "count_hit") - private Integer countHit; - /** - * 被关闭的流个数,可能小于count_hit - */ - @JSONField(name = "count_closed") - private Integer countClosed; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java deleted file mode 100644 index 942b099..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/MediaResp.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.dite.znpt.monitor.media.zlm.dto.event.BaseEventReq; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:18 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class MediaResp extends BaseEventReq implements Serializable { - private static final long serialVersionUID = -8710934021370904914L; - - /** - * 本协议观看人数 - */ - private Integer readerCount; - /** - * 观看总人数,包括hls/rtsp/rtmp/http-flv/ws-flv - */ - private Integer totalReaderCount; - /** - * 客户端和服务器网络信息,可能为null类型 - */ - private OriginSock originSock; - /** - * 产生源类型,包括 unknown = 0, rtmp_push = 1, rtsp_push = 2, rtp_push = 3, pull = 4, ffmpeg_pull = 5, mp4_vod = 6, device_chn = 7 - */ - private Integer originType; - /** - * 产生源类型 - */ - private String originTypeStr; - /** - * 产生源的url - */ - private String originUrl; - /** - * GMT unix系统时间戳,单位秒 - */ - private Long createStamp; - /** - * 存活时间,单位秒 - */ - private Long aliveSecond; - /** - * 数据产生速度,单位byte/s - */ - private Long bytesSpeed; - /** - * 音视频轨道 - */ - private List tracks; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java deleted file mode 100644 index f39ea4f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Mp4RecordFileResp.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import lombok.Data; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:08 - * @Description: - */ -@Data -public class Mp4RecordFileResp { - /** - * 文件列表 - */ - private List paths; - /** - * 根路径 - */ - private String rootPath; -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java deleted file mode 100644 index 5ca64f3..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/OriginSock.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:20 - * @Description: - */ -@Data -public class OriginSock implements Serializable { - private static final long serialVersionUID = 5628294142872524316L; - - private String identifier; - @JSONField(name = "local_ip") - private String localIp; - @JSONField(name = "local_port") - private Integer localPort; - @JSONField(name = "peer_ip") - private String peerIp; - @JSONField(name = "peer_port") - private Integer peerPort; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java deleted file mode 100644 index b8654a5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpInfoResp.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:32 - * @Description: - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class RtpInfoResp extends BaseResp { - /** - * 是否存在 - */ - private Boolean exist; - /** - * 推流客户端ip - */ - @JSONField(name = "peer_ip") - private String peerIp; - /** - * 客户端端口号 - */ - @JSONField(name = "peer_port") - private Integer peerPort; - /** - * 本地监听的网卡ip - */ - @JSONField(name = "local_ip") - private String localIp; - /** - * 本地监听端口号 - */ - @JSONField(name = "local_port") - private Integer localPort; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java deleted file mode 100644 index 1a5267f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/RtpServerResp.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:22 - * @Description: - */ -@Data -public class RtpServerResp { - /** - * 绑定的端口号 - */ - private Integer port; - /** - * 绑定的流ID - */ - @JSONField(name = "stream_id") - private String streamId; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java deleted file mode 100644 index eaf6119..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/SessionResp.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/29 12:04 - * @Description: - */ -@Data -public class SessionResp { - /** - * 该tcp链接唯一id - */ - private Long id; - /** - * 本机网卡ip - */ - @JSONField(name = "local_ip") - private String localIp; - /** - * 本机端口号 (这是个rtmp播放器或推流器) - */ - @JSONField(name = "local_port") - private Integer localPort; - /** - * 客户端ip - */ - @JSONField(name = "peer_ip") - private String peerIp; - /** - * 客户端端口号 - */ - @JSONField(name = "peer_port") - private Integer peerPort; - /** - * 客户端TCPSession typeid - */ - private String typeid; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java deleted file mode 100644 index f464784..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/StatisticResp.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import lombok.Data; - -/** - * @Author: huise23 - * @Date: 2022/8/29 13:47 - * @Description: - */ -@Data -public class StatisticResp { - private Integer Buffer; - private Integer BufferLikeString; - private Integer BufferList; - private Integer BufferRaw; - private Integer Frame; - private Integer FrameImp; - private Integer MediaSource; - private Integer MultiMediaSourceMuxer; - private Integer RtmpPacket; - private Integer RtpPacket; - private Integer Socket; - private Integer TcpClient; - private Integer TcpServer; - private Integer TcpSession; - private Integer UdpServer; - private Integer UdpSession; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java deleted file mode 100644 index 9c0257e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/ThreadsLoadResp.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import lombok.Data; - - - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:40 - * @Description: 各epoll(或select)线程负载以及延时 - */ -@Data -public class ThreadsLoadResp { - /** - * 该线程延时 - */ - private Integer delay; - /** - * 该线程负载 - */ - private Integer load; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java deleted file mode 100644 index e7307aa..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/dto/resp/Track.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.dto.resp; - -import com.alibaba.fastjson.annotation.JSONField; -import lombok.Data; - -import java.io.Serializable; - -/** - * @Author: huise23 - * @Date: 2022/8/29 11:25 - * @Description: - */ -@Data -public class Track implements Serializable { - private static final long serialVersionUID = 5317048895056912057L; - /** - * 音频通道数 - */ - private Integer channels; - /** - * H264 = 0, H265 = 1, AAC = 2, G711A = 3, G711U = 4 - */ - @JSONField(name = "codec_id") - private Integer codecId; - /** - * 编码类型名称 - */ - @JSONField(name = "codec_id_name") - private String codecIdName; - /** - * Video = 0, Audio = 1 - */ - @JSONField(name = "codec_type") - private Integer codecType; - /** - * 轨道是否准备就绪 - */ - private Boolean ready; - /** - * 音频采样位数 - */ - @JSONField(name = "sample_bit") - private Integer sampleBit; - /** - * 音频采样率 - */ - @JSONField(name = "sample_rate") - private Integer sampleRate; - /** - * 视频fps - */ - private Integer fps; - /** - * 视频高 - */ - private Integer height; - /** - * 视频宽 - */ - private Integer width; -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java deleted file mode 100644 index 215715c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/enums/MediaFormatType.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.enums; - -import lombok.Getter; - -/** - * @Author: huise23 - * @Date: 2022/8/31 10:29 - * @Description: - */ -@Getter -public enum MediaFormatType { - /** - * FLV - */ - flv(".live.flv"), - /** - * MP4 - */ - mp4(".live.mp4"), - /** - * HLS - */ - hls("/hls.m3u8"), - /** - * RTS - */ - rts(".live.ts"); - - private final String suffix; - - MediaFormatType(String suffix) { - this.suffix = suffix; - } - - public static String getSuffix(String name) { - for (MediaFormatType value : MediaFormatType.values()) { - if (value.name().equals(name)) { - return value.getSuffix(); - } - } - return ""; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java deleted file mode 100644 index f1e20ce..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmApiImpl.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.impl; - -import cn.hutool.core.lang.Dict; -import cn.hutool.core.util.BooleanUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson.JSON; -import com.dite.znpt.monitor.media.zlm.ZlmApi; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.ServerInfo; -import com.dite.znpt.monitor.media.zlm.dto.req.*; -import com.dite.znpt.monitor.media.zlm.dto.resp.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/29 10:22 - * @Description: - */ -@Service -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ZlmApiImpl implements ZlmApi { - private final HttpServletResponse response; - - public V post(ServerInfo server, String url, T req, Class clazz) { - url = StrUtil.format("http://{}:{}/index/api/{}", server.getApiHost(), server.getApiPort(), url); - log.info("ZLM:" + url); - log.info("REQ:" + req); - req.setSecret(server.getSecretKey()); - String respStr = HttpUtil.post(url, JSON.toJSONString(req)); - V resp = JSON.parseObject(respStr, clazz); - if (resp.isSuccess()) { - return resp; - } - throw new RuntimeException(resp.getMsg()); - } - - public BaseResp post(ServerInfo server, String url, T req) { - return post(server, url, req, BaseResp.class); - } - - public V post(ServerInfo server, String url, Class clazz) { - return post(server, url, new BaseReq(), clazz); - } - - public BaseResp post(ServerInfo server, String url) { - return post(server, url, new BaseReq()); - } - - @Override - public List getApiList(ServerInfo server) { - return post(server, "getApiList").getList(String.class); - } - - @Override - public List getThreadsLoad(ServerInfo server) { - return post(server, "getThreadsLoad").getList(ThreadsLoadResp.class); - } - - @Override - public List getWorkThreadsLoad(ServerInfo server) { - return post(server, "getWorkThreadsLoad").getList(ThreadsLoadResp.class); - } - - @Override - public List getServerConfig(ServerInfo server) { - return post(server, "getServerConfig").getList(ServerConfig.class); - } - -// public static void main(String[] args) { -// ZlmApi zlmApi = new ZlmApiImpl(null); -// ServerInfo server = new ServerInfo("10.12.1.41", 8819, "035c73f7-bb6b-4889-a715-d9eb2d1925cc"); -// List config = zlmApi.getMediaList(server,new StreamReq()); -// System.out.println(JSONUtil.toJsonPrettyStr(config)); -// for (MediaResp mediaResp : config) { -// zlmApi.closeRtpServer(server,mediaResp.getStream() ); -// } -// } - - @Override - public Integer setServerConfig(ServerInfo server, ServerConfig config) { - BaseResp req = post(server, "setServerConfig", config); - return req.getChanged(); - } - - @Override - public Boolean restartServer(ServerInfo server) { - BaseResp req = post(server, "restartServer"); - return req.isSuccess(); - } - - @Override - public List getMediaList(ServerInfo server, StreamReq req) { - return post(server, "getMediaList", req).getList(MediaResp.class); - } - - @Override - public CloseStreamResp closeStreams(ServerInfo server, CloseStreamReq req) { - return post(server, "close_streams", req, CloseStreamResp.class); - } - - @Override - public List getAllSession(ServerInfo server, GetAllSessionReq req) { - return post(server, "getAllSession", req).getList(SessionResp.class); - } - - @Override - public Boolean kickSession(ServerInfo server, Long id) { - return post(server, "kick_session", new IdReq(id)).isSuccess(); - } - - @Override - public Integer kickSession(ServerInfo server, GetAllSessionReq req) { - return post(server, "kick_sessions", req, CloseStreamResp.class).getCountHit(); - } - - @Override - public String addStreamProxy(ServerInfo server, StreamProxyReq req) { - return post(server, "addStreamProxy", req).getData(Dict.class).getStr("key"); - } - - @Override - public Boolean delStreamProxy(ServerInfo server, String key) { - return post(server, "delStreamProxy", new KeyReq(key)).getData(Dict.class).getBool("flag"); - } - - @Override - public String addFfMpegSource(ServerInfo server, FFmpegSourceReq req) { - return post(server, "addFFmpegSource", req).getData(Dict.class).getStr("key"); - } - - @Override - public Boolean delFfMpegSource(ServerInfo server, String key) { - return post(server, "delFFmpegSource", new KeyReq(key)).getData(Dict.class).getBool("flag"); - } - - @Override - public RtpInfoResp getRtpInfo(ServerInfo server, String streamId) { - return post(server, "getRtpInfo", new StreamIdReq(streamId), RtpInfoResp.class); - } - - @Override - public Mp4RecordFileResp getMp4RecordFile(ServerInfo server, GetMp4RecordFileReq req) { - return post(server, "getMp4RecordFile", req).getData(Mp4RecordFileResp.class); - } - - @Override - public Boolean startRecord(ServerInfo server, RecordReq req) { - return BooleanUtil.toBoolean(post(server, "startRecord", req).getResult()); - } - - @Override - public Boolean stopRecord(ServerInfo server, RecordReq req) { - return BooleanUtil.toBoolean(post(server, "stopRecord", req).getResult()); - } - - @Override - public Boolean isRecording(ServerInfo server, RecordReq req) { - return post(server, "isRecording", req).getStatus(); - } - - @Override - public void getSnap(ServerInfo server, SnapReq req) throws IOException { - String url = StrUtil.format("http://{}:{}/index/api/getSnap", server.getApiHost(), server.getApiPort()); - req.setSecret(server.getSecretKey()); - url += "?" + HttpUtil.toParams(JSON.parseObject(JSON.toJSONString(req))); - HttpUtil.download(url, response.getOutputStream(), true); - } - - @Override - public Integer openRtpServer(ServerInfo server, RtpServerReq req) { - return post(server, "openRtpServer", req).getPort(); - } - - @Override - public Boolean closeRtpServer(ServerInfo server, String streamId) { - BaseResp closeRtpServer = post(server, "closeRtpServer", new StreamIdReq(streamId)); - return closeRtpServer.getHit() == 1; - } - - @Override - public List listRtpServer(ServerInfo server) { - return post(server, "listRtpServer").getList(RtpServerResp.class); - } - - @Override - public Integer startSendRtp(ServerInfo server, SendRtpReq req) { - return post(server, "startSendRtp", req, RtpInfoResp.class).getLocalPort(); - } - - @Override - public Integer startSendRtpPassive(ServerInfo server, SendRtpReq req) { - return post(server, "startSendRtpPassive", req, RtpInfoResp.class).getLocalPort(); - } - - @Override - public Boolean stopSendRtp(ServerInfo server, SendRtpReq req) { - return post(server, "stopSendRtp", req).isSuccess(); - } - - @Override - public StatisticResp getStatistic(ServerInfo server) { - return post(server, "getStatistic").getData(StatisticResp.class); - } - - @Override - public String addStreamPusherProxy(ServerInfo server, StreamPusherProxyReq req) { - return post(server, "addStreamPusherProxy", req).getData(Dict.class).getStr("key"); - } - - @Override - public Boolean delStreamPusherProxy(ServerInfo server, String key) { - return post(server, "delStreamPusherProxy", new KeyReq(key)).getData(Dict.class).getBool("flag"); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java deleted file mode 100644 index 2bc7a2e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmHookService.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.impl; - -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.event.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:32 - * @Description: - */ -@Service -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -public class ZlmHookService { - private final ZlmService zlmService; - - /** - * TODO 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件, - * 阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。 - */ - public BaseEventResp onFlowReport(FlowReportReq req) { - log.debug("[ZLM] onFlowReport : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 访问http文件服务器上hls之外的文件时触发。 - */ - public HttpAccessResp onHttpAccess(HttpAccessReq req) { - log.debug("[ZLM] onHttpAccess : {}", req); - return HttpAccessResp.success(); - } - - /** - * TODO 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件; - * 如果流不存在,那么先触发on_play事件然后触发on_stream_not_found事件。 - * 播放rtsp流时,如果该流启动了rtsp专属鉴权(on_rtsp_realm)那么将不再触发on_play事件。 - */ - public BaseEventResp onPlay(PlayReq req) { - log.debug("[ZLM] onPlay : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO rtsp/rtmp/rtp推流鉴权事件。 - */ - public PublishResp onPublish(PublishReq req) { - System.out.println("[ZLM] 接收到推流信息"); - log.info("[ZLM] onPublish : {}", req); - return PublishResp.success(); - } - - /** - * TODO 录制mp4完成后通知事件;此事件对回复不敏感。 - */ - public BaseEventResp onRecordMp4(RecordMp4Req req) { - log.debug("[ZLM] onRecordMp4 : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。 - * 需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。 - */ - public BaseEventResp onRtspRealm(RtspRealmReq req) { - log.debug("[ZLM] onRtspRealm : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。 - */ - public RtspAuthResp onRtspAuth(RtspAuthReq req) { - log.debug("[ZLM] onRtspAuth : {}", req); - return RtspAuthResp.success(); - } - - /** - * TODO shell登录鉴权,ZLMediaKit提供简单的telnet调试方式 - * 使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。 - */ - public BaseEventResp onShellLogin(ShellLoginReq req) { - log.debug("[ZLM] onShellLogin : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 - */ - public BaseEventResp onStreamChanged(StreamChangedReq req) { - log.info("[ZLM] onStreamChanged 流信息 : {}", req); - return BaseEventResp.success(); - } - - /** - * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 - */ - public BaseEventResp onStreamNoneReader(StreamNoneReaderReq req) { - log.debug("[ZLM] onStreamNoneReader : {}", req); - zlmService.display(req.getMediaServerId(), req.getStream()); - return BaseEventResp.success().setClose(false); - } - - /** - * TODO 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 - */ - public BaseEventResp onStreamNotFound(StreamNotFoundReq req) { - log.debug("[ZLM] onStreamNotFound : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 服务器启动事件,可以用于监听服务器崩溃重启;此事件对回复不敏感。 - */ - public BaseEventResp onServerStarted(ServerConfig req) { - log.debug("[ZLM] onServerStarted : {}", req); - return BaseEventResp.success(); - } - - /** - * TODO 服务器定时上报时间,上报间隔可配置,默认10s上报一次 - */ - public BaseEventResp onServerKeepalive(ServerKeepaliveReq req) { - log.debug("[ZLM] onServerKeepalive : {}", req); - return BaseEventResp.success(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java deleted file mode 100644 index b4b52de..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/media/zlm/impl/ZlmServiceImpl.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.dite.znpt.monitor.media.zlm.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.media.zlm.ZlmApi; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.media.zlm.cache.MediaServerCache; -import com.dite.znpt.monitor.media.zlm.cache.MediaServerChannelCache; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; -import com.dite.znpt.monitor.media.zlm.dto.ServerConfig; -import com.dite.znpt.monitor.media.zlm.dto.ServerItem; -import com.dite.znpt.monitor.media.zlm.dto.req.RtpServerReq; -import com.dite.znpt.monitor.media.zlm.dto.req.StreamReq; -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import com.dite.znpt.monitor.media.zlm.dto.resp.RtpInfoResp; -import com.dite.znpt.monitor.service.StreamMediaFormatService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import java.util.List; - -import static com.dite.znpt.monitor.config.MediaFormatConfig.streamMediaFormatList; - -/** - * @Author: huise23 - * @Date: 2022/8/30 10:40 - * @Description: - */ -@Service -@Slf4j -@RequiredArgsConstructor(onConstructor = @__(@Autowired)) -@EnableScheduling -public class ZlmServiceImpl implements ZlmService, ApplicationRunner { - private final StreamMediaFormatService formatService; - private final ZlmApi zlmApi; - private final MediaServerCache serverCache; - private final MediaServerChannelCache channelCache; - private final Environment environment; - private final StreamMediaServerConfig zlmConfig; - - @Value("${spring.profiles.active:dev}") - private String activeProfile; - @Value("${server.host:''}") - private String serverHost; - @Value("${server.port:''}") - private String serverPort; - - private String profile = "dev"; - - /** - * 系统启动加载服务器 - */ - @Override - public void run(ApplicationArguments args) throws Exception { - //TODO 媒体格式注入 - List formatList = streamMediaFormatList(); - ServerItem item = new ServerItem(zlmConfig, formatList); - try { - // 开发环境不去修改多媒体配置 -// if (!StrUtil.equalsIgnoreCase(activeProfile, profile)) { -// String host = StrUtil.blankToDefault(serverHost, IpUtils.getHostIp()); -// String port = StrUtil.blankToDefault(serverPort, environment.getProperty("server.port")); -// ServerConfig config = new ServerConfig(); -// config.refreshHook(host, port, zlmConfig); -// zlmApi.setServerConfig(item.getServer(), config); -// } - List configList = zlmApi.getServerConfig(item.getServer()); - item.setConfig(configList.get(0)); - item.setStatus(true); - } catch (Exception e) { - log.error("流服务器节点配置错误:", e); - item.setStatus(false); - } - //初始化参数 - serverCache.putLoad(item); - } - -// @Scheduled(cron = "*/10 * * * * ?") - public void heartbeat1() { - log.debug("开始心跳检查..."); - ServerItem item = serverCache.getLoad(); - // 获取服务器流信息 - try { - List media = zlmApi.getMediaList(item.getServer(), new StreamReq()); - item.setMedia(media); - item.setStatus(true); - } catch (Exception e) { - log.error("流服务器节点丢失:", e); - item.setStatus(false); - } - serverCache.putLoad(item); - } - - @Override - public MediaItem play(String deviceCode, String channelCode) { - // 获取通道信息 - MediaItem media; - if (channelCache.has(deviceCode, channelCode)) { - media = channelCache.get(deviceCode, channelCode); - } else { - media = new MediaItem().setDeviceCode(deviceCode).setChannelCode(channelCode); - } - media.setIsCache(true); - // 检查节点是否正常 - if (!checkServer(media.getConfigId())) { - // 获取负载最小的节点 - ServerItem server = serverCache.getLoad(); - if (!server.getStatus()) { - throw new ServiceException("无正常的流媒体节点可用!"); - } - media.setSsrc(server.genPlaySsrc(channelCode)); - media.setConfigId(server.getConfigId()); - media.setConfig(server.getConfig()); - media.setServer(server.getServer()); - media.setFormatList(server.getFormatList()); - media.setIsCache(false); - serverCache.putLoad(server); - } - // 检查播放流是否正常 - if (StrUtil.isNotBlank(media.getStreamId())) { - RtpInfoResp rtp = zlmApi.getRtpInfo(media.getServer(), media.getStreamId()); - if (rtp.getExist()) { - media.setRtp(rtp); - media.setIsCache(true); - return media; - } - } - // 不正常,需要重新拉流 - Integer rtpPort = zlmApi.openRtpServer(media.getServer(), new RtpServerReq(media.getSsrc())); - media.setRtpPort(rtpPort); - media.setStreamId(media.getSsrc()); - // 缓存链接信息 - channelCache.put(deviceCode, channelCode, media); - media.setIsCache(false); - return media; - } - - @Override - public void release(String deviceCode, String channelCode) { - // 获取通道信息 - MediaItem media = channelCache.get(deviceCode, channelCode); - release(media); - } - - @Override - public void release(MediaItem media) { - if (ObjectUtil.isNull(media)) { - return; - } - try { - List list = zlmApi.getMediaList(media.getServer(), new StreamReq().setStream(media.getStreamId())); - if (!CollUtil.isEmpty(list) && list.get(0).getTotalReaderCount() > 0) { - // 当前还有观看者 不释放资源 - return; - } - zlmApi.closeRtpServer(media.getServer(), media.getStreamId()); - } catch (Exception e) { - log.error("流媒体服务器调用失败:", e); - } - // 释放SSRC句柄 - serverCache.releaseSsrc(media.getSsrc()); - // 删除链接信息 - channelCache.delete(media); - } - - @Override - public void display(String mediaServerId, String streamId) { - // 获取通道信息 - MediaItem media = channelCache.getByStream(mediaServerId, streamId); - release(media); - } - - /** - * 检查节点是否正常 - */ - private boolean checkServer(String configId) { - if (ObjectUtil.isNull(configId)) { - return false; - } - ServerItem item = serverCache.getLoad(); - return ObjectUtil.isNotNull(item) && item.getStatus(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java deleted file mode 100644 index 6632114..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoChannelService.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.req.VideoInfoReq; -import com.dite.znpt.monitor.domain.resp.VideoInfoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; -import com.dite.znpt.monitor.domain.vo.video.VideoPayResp; - -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:10 - * @Description: - */ -public interface DeviceVideoChannelService extends IService { - /** - * 查询视频通道列表 - * - * @param videoId 视频id - * @param keyword 查询条件 - * @return {@link PageResult < DeviceVideoChannelListResp >} - */ - PageResult selectDeviceVideoChannel(Long videoId, String keyword); - - /** - * 查询所有视频通道列表 - * - * @param keyword 查询条件 - * @return {@link PageResult< DeviceVideoChannelListResp>} - */ - PageResult selectAllDeviceVideoChannel(String keyword); - - /** - * 查询视频通道详情 - * - * @param channelCode - * @return {@link DeviceVideoChannelResp} - */ - DeviceVideoChannelResp getDeviceVideoChannelDetail(String channelCode); - - /** - * 编辑视频设备通道 - * - * @param channelId - * @param req - * @return - */ - void editDeviceVideoChannel(Long channelId, DeviceVideoChannelEditReq req); - - /** - * 根据通道id删除通道信息 - * - * @param channelIds - * @return {@link boolean} - */ - Result removeByChannelIds(List channelIds); - - /** - * 根据通道编码查询通道信息 - * - * @param channelCode 通道编码 - * @return 通道信息 - */ - DeviceVideoChannelEntity getByCode(String channelCode); - - /** - * 根据设备id查询设备通道 - * @param videoId 设备id - * @return {@link List< DeviceVideoChannelEntity>} - */ - List selectDeviceVideoChannelByVideoCode(Long videoId); - - /** - * 播放直播视频 - * - * @param channelCode - * @return - */ - VideoPayResp play(String channelCode); - - /** - * 是否在线 - * - * @param channelCode - * @return - */ - boolean isOnline(String channelCode); - - /** - * 停止播放直播 - * - * @param channelCode - * @return - */ - void stop(String channelCode); - - /** - * 下线视频设备下的所有通道 - * @param videoId - * @return - */ - void offlineByVideoId(Long videoId); - - /** - * 查询通道及视频信息 - * - * @param videoInfoReq 查询参数 - * @return {@link VideoInfoResp } - * @author huise23 - * @since 2024-12-03 13:54:52 - */ - List selectVideoInfoList(VideoInfoReq videoInfoReq); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java b/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java deleted file mode 100644 index 79ac330..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/DeviceVideoService.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoNumResp; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:09 - * @Description: - */ -public interface DeviceVideoService extends IService { - - /** - * 查询视频设备列表 - * - * @param status 状态 - * @param keyword 设备编码或者设备名称 - * @return {@link PageResult< DeviceVideoListResp>} - */ - PageResult selectDeviceVideoList(String status, String keyword, String hostAddress); - - /** - * 查询视频设备数量 - * - * @return {@link DeviceVideoNumResp} - */ - DeviceVideoNumResp countDeviceVideoNum(); - - /** - * 编辑视频设备信息 - * - * @param videoId 视频设备id - * @param req 视频设备信息 - * @return - */ - void editDeviceVideo(Long videoId, DeviceVideoEditReq req); - - /** - * 删除视频设备 - * - * @param videoId 视频设备id - * @return - */ - Result removeByVideoId(Long videoId); - - /** - * 根据端口和host查询设备 - * - * @param host 地址 - * @param port 端口 - * @return 设备 - */ - DeviceVideoEntity getDeviceByHostAndPort(String host, int port); - - /** - * 设备离线 - * - * @param videoCode videoCode - */ - void offline(String videoCode); - - /** - * 上线设备 - * @param entity - * @return - */ - void online(DeviceVideoEntity entity); - - /** - * 判断是否注册已经失效 - * @param entity 设备信息 - * @return {@link boolean} - */ - boolean expire(DeviceVideoEntity entity); - - /** - * 根据 videoCode 获取设备 - * - * @param videoCode videoCode - * @return 设备 - */ - DeviceVideoEntity getByCode(String videoCode); - - /** - * 根据 videoCode 获取设备 - * - * @param channelCode - * @return 设备 - */ - DeviceVideoEntity getByChannelCode(String channelCode); - - /** - * 查询设备状态 - * @param videoId - * @return - */ - void queryDeviceStatus(Long videoId); - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java b/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java deleted file mode 100644 index 11a53d1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/IpConfigService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.monitor.domain.entity.IpConfigEntity; -import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; - -import java.util.List; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表服务接口 - */ -public interface IpConfigService extends IService { - - /** - * 新增ip配置 - * @param req - */ - void configAdd(MonitorConfigAddReq req); - - /** - * 查询ip配置 - * @return - */ - List configList(); -} - diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java b/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java deleted file mode 100644 index fa959bc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/StreamMediaFormatService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:58 - * @Description: - */ -public interface StreamMediaFormatService extends IService { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java deleted file mode 100644 index 931a754..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoChannelServiceImpl.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ObjectUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.constant.IotRespMessage; -import com.dite.znpt.monitor.constant.dict.CameraType; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.constant.dict.YesOrNo; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.req.VideoInfoReq; -import com.dite.znpt.monitor.domain.resp.VideoInfoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelResp; -import com.dite.znpt.monitor.domain.vo.video.VideoPayResp; -import com.dite.znpt.monitor.mapper.DeviceVideoChannelMapper; -import com.dite.znpt.monitor.media.zlm.ZlmApi; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.media.zlm.cache.MediaServerChannelCache; -import com.dite.znpt.monitor.media.zlm.dto.MediaItem; -import com.dite.znpt.monitor.media.zlm.dto.req.StreamReq; -import com.dite.znpt.monitor.media.zlm.dto.resp.MediaResp; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.utils.DictUtils; -import com.dite.znpt.util.PageUtil; -import com.github.pagehelper.PageInfo; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:10 - * @Description: - */ -@Service -public class DeviceVideoChannelServiceImpl extends ServiceImpl implements DeviceVideoChannelService { - - @Resource - private MediaServerChannelCache channelCache; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - @Resource - private ZlmService zlmService; - - @Resource - private ZlmApi zlmApi; - - @Resource - private SipConfig sipConfig; - - /** - * 查询视频通道列表 - * - * @param videoId 视频id - * @param keyword 查询条件 - * @return {@link PageResult < DeviceVideoChannelListResp >} - */ - @Override - public PageResult selectDeviceVideoChannel(Long videoId, String keyword) { - PageUtil.startPage(); - List list = this.baseMapper.selectDeviceVideoChannel(videoId, keyword); - return buildPageResult(list); - } - - /** - * 查询所有视频通道列表 - * - * @param keyword 查询条件 - * @return {@link PageResult< DeviceVideoChannelListResp>} - */ - @Override - public PageResult selectAllDeviceVideoChannel(String keyword) { - PageUtil.startPage(); - List list = this.baseMapper.selectAllDeviceVideoChannel(keyword); - return buildPageResult(list); - } - - private PageResult buildPageResult(List list) { - if (CollectionUtil.isEmpty(list)) { - return PageResult.ok(list, 0); - } - long total = new PageInfo<>(list).getTotal(); - list.stream().peek(resp -> { - resp.setCameraTypeLabel(DictUtils.getDictLabel(CameraType.class, resp.getCameraType())); - resp.setPtzControlLabel(DictUtils.getDictLabel(YesOrNo.class, resp.getPtzControl())); - resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); - }).collect(Collectors.toList()); - return PageResult.ok(list, total); - } - - /** - * 查询视频通道详情 - * - * @param channelCode - * @return {@link DeviceVideoChannelResp} - */ - @Override - public DeviceVideoChannelResp getDeviceVideoChannelDetail(String channelCode) { - return this.baseMapper.getDeviceVideoChannelDetail(channelCode); - } - - /** - * 编辑视频设备通道 - * - * @param channelId - * @param req - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void editDeviceVideoChannel(Long channelId, DeviceVideoChannelEditReq req) { - DeviceVideoChannelEntity entity = this.getById(channelId); - BeanUtil.copyProperties(req, entity); - entity.setUpdateTime(LocalDateTime.now()); - this.updateById(entity); - } - - /** - * 根据通道id删除通道信息 - * - * @param channelIds - * @return {@link boolean} - */ - @Transactional(rollbackFor = Exception.class) - @Override - public Result removeByChannelIds(List channelIds) { - List list = this.listByIds(channelIds); - List ids = list.stream().map(DeviceVideoChannelEntity::getChannelId).collect(Collectors.toList()); - if (ids.size() == list.size()) { - return Result.ok(this.removeByIds(ids)); - } else { - return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_DELETE); - } - } - - @Override - public DeviceVideoChannelEntity getByCode(String channelCode) { - return super.getOne(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class) - .eq(DeviceVideoChannelEntity::getChannelCode, channelCode) - .orderByDesc(DeviceVideoChannelEntity::getCreateTime) - .last("limit 1")); - } - - /** - * 根据设备国标编码查询设备通道 - * - * @param videoId 设备id - * @return {@link List< DeviceVideoChannelEntity>} - */ - @Override - public List selectDeviceVideoChannelByVideoCode(Long videoId) { - return this.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId, videoId)); - } - - /** - * 播放视频 - * - * @param channelCode - * @return - */ - @Override - public VideoPayResp play(String channelCode) { - DeviceVideoChannelEntity channelEntity = Optional.ofNullable(this.getByCode(channelCode)).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - DeviceVideoEntity videoEntity = Optional.ofNullable(deviceVideoService.getById(channelEntity.getVideoId())).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - MediaItem mediaItem = zlmService.play(videoEntity.getVideoCode(), channelEntity.getChannelCode()); - if (!mediaItem.getIsCache()) { - sipDeviceCommander.playStreamCmd(videoEntity, channelEntity.getChannelCode(), mediaItem.getSsrc(), mediaItem.getRtpPort(), mediaItem.getServer().getApiHost()); - } - return VideoPayResp.builder() - .mediaType(sipConfig.getMediaType()) - .streamMediaFormatList(mediaItem.getFormatList(sipConfig.getMediaRouter())) - .build(); - } - - /** - * 是否在线 - * - * @param channelCode - * @return - */ - @Override - public boolean isOnline(String channelCode) { - DeviceVideoChannelEntity channelEntity = this.getByCode(channelCode); - return Objects.nonNull(channelEntity) && channelEntity.getStatus().equals(DeviceStatus.ONLINE.getValue()); - } - - /** - * 停止播放直播 - * - * @param channelCode - * @return - */ - @Override - public void stop(String channelCode) { - DeviceVideoChannelEntity channelEntity = Optional.ofNullable(this.getByCode(channelCode)).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - DeviceVideoEntity videoEntity = Optional.ofNullable(deviceVideoService.getById(channelEntity.getVideoId())).orElseThrow(() -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - MediaItem mediaItem = channelCache.get(videoEntity.getVideoCode(), channelEntity.getChannelCode()); - if (null != mediaItem) { - List list = zlmApi.getMediaList(mediaItem.getServer(), new StreamReq().setStream(mediaItem.getStreamId())); - if (CollectionUtil.isNotEmpty(list) && list.get(0).getTotalReaderCount() <= 1) { - // 当只有一个人观看时,想设备发送停止推流命令 - sipDeviceCommander.stopStreamCmd(mediaItem.getSsrc()); - } - zlmService.release(videoEntity.getVideoCode(), channelEntity.getChannelCode()); - } - } - - /** - * 下线视频设备下的所有通道 - * - * @param videoId - * @return - */ - @Override - public void offlineByVideoId(Long videoId) { - List list = this.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId, videoId)); - if (ObjectUtil.isNotNull(list)) { - this.updateBatchById( - list.stream().peek(entity -> { - entity.setUpdateTime(LocalDateTime.now()); - entity.setStatus(DeviceStatus.OFFLINE.getValue()); - }).collect(Collectors.toList()) - ); - } - } - - /** - * 查询通道及视频信息 - * - * @param videoInfoReq 查询参数 - * @return {@link VideoInfoResp } - * @author huise23 - * @since 2024-12-03 13:54:52 - */ - @Override - public List selectVideoInfoList(VideoInfoReq videoInfoReq) { - return this.baseMapper.selectVideoInfoList(videoInfoReq); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java deleted file mode 100644 index 8c00abb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/DeviceVideoServiceImpl.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.http.HttpStatus; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.constant.IotCacheConstants; -import com.dite.znpt.monitor.constant.IotDictConstants; -import com.dite.znpt.monitor.constant.IotRespMessage; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.constant.dict.SipTransferMode; -import com.dite.znpt.monitor.constant.dict.StreamTransferMode; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoNumResp; -import com.dite.znpt.monitor.mapper.DeviceVideoMapper; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.utils.DictUtils; -import com.dite.znpt.service.impl.RedisService; -import com.github.pagehelper.PageInfo; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -/** - * @Author: huise23 - * @Date: 2022/8/11 18:11 - * @Description: - */ -@Slf4j -@Service -public class DeviceVideoServiceImpl extends ServiceImpl implements DeviceVideoService { - - @Resource - private RedisService redisService; - - @Resource - private DeviceVideoChannelService deviceVideoChannelService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - /** - * 查询视频设备列表 - * - * @param status 状态 - * @param keyword 设备编码或者设备名称 - * @return {@link List < DeviceVideoListResp >} - */ - @Override - public PageResult selectDeviceVideoList(String status, String keyword, String hostAddress) { - List deviceVideoListResps = this.baseMapper.selectDeviceVideoList(status, keyword,hostAddress); - int total = (int) new PageInfo(deviceVideoListResps).getTotal(); - deviceVideoListResps = deviceVideoListResps.stream().peek(resp -> { - resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); - resp.setStreamModeLabel(DictUtils.getDictLabel(StreamTransferMode.class, resp.getStreamMode())); - resp.setTransportLabel(DictUtils.getDictLabel(SipTransferMode.class, resp.getTransport())); - }).collect(Collectors.toList()); - return PageResult.ok(deviceVideoListResps,total); - } - - /** - * 查询视频设备数量 - * - * @param - * @return {@link DeviceVideoNumResp} - */ - @Override - public DeviceVideoNumResp countDeviceVideoNum() { - DeviceVideoNumResp deviceVideoNumResp = new DeviceVideoNumResp(); - List deviceVideoList = this.baseMapper.selectDeviceVideoList(null, null,null); - deviceVideoNumResp.setAllDevice(deviceVideoList.stream().count()); - deviceVideoNumResp.setOnlineDevice(deviceVideoList.stream().filter(item -> IotDictConstants.IOT_DEVICE_STATUS_ONLINE.equals(item.getStatus())).count()); - deviceVideoNumResp.setOfflineDevice(deviceVideoList.stream().filter(item -> IotDictConstants.IOT_DEVICE_STATUS_OFFLINE.equals(item.getStatus())).count()); - return deviceVideoNumResp; - } - - /** - * 编辑视频设备信息 - * - * @param videoId 视频设备id - * @param req 视频设备信息 - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void editDeviceVideo(Long videoId, DeviceVideoEditReq req) { - DeviceVideoEntity entity = this.getById(videoId); - if (null == entity) { - throw new ServiceException(IotRespMessage.ID_NOT_FOUND); - } - BeanUtil.copyProperties(req, entity); - this.updateById(entity); - } - - /** - * 删除视频设备 - * - * @param videoId 视频设备id - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public Result removeByVideoId(Long videoId) { - DeviceVideoEntity entity = this.getById(videoId); - if (null == entity) { - throw new ServiceException(IotRespMessage.ID_NOT_FOUND); - } - if (!DeviceStatus.OFFLINE.getValue().equals(entity.getStatus())) { - return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_DELETE); - } - Result result = Result.ok(); - List list = deviceVideoChannelService.list(Wrappers.lambdaQuery(DeviceVideoChannelEntity.class).eq(DeviceVideoChannelEntity::getVideoId,videoId)); - List channelIds = list.stream().map(DeviceVideoChannelEntity::getChannelId).collect(Collectors.toList()); - if(CollectionUtil.isNotEmpty(channelIds)){ - result = deviceVideoChannelService.removeByChannelIds(channelIds); - } - if (HttpStatus.HTTP_OK == result.getCode()) { - return this.removeById(videoId) ? Result.ok() : Result.error(); - } else { - return result; - } - } - - @Override - public DeviceVideoEntity getDeviceByHostAndPort(String host, int port) { - return super.getOne(Wrappers.lambdaQuery(DeviceVideoEntity.class) - .eq(DeviceVideoEntity::getIp, host) - .eq(DeviceVideoEntity::getPort, port) -// .orderByDesc(DeviceVideoEntity::getCreateTime) - .last("limit 1")); - } - - @Transactional(rollbackFor = Exception.class) - @Override - public void offline(String videoCode) { - DeviceVideoEntity entity = this.getByCode(videoCode); - entity.setStatus(DeviceStatus.OFFLINE.getValue()); -// entity.setUpdateTime(LocalDateTime.now()); - this.updateById(entity); - deviceVideoChannelService.offlineByVideoId(entity.getVideoId()); - - } - - /** - * 上线设备 - * - * @param entity - * @return - */ - @Transactional(rollbackFor = Exception.class) - @Override - public void online(DeviceVideoEntity entity) { - log.info("[设备上线] deviceId:{}->{}:{}",entity.getVideoCode(), entity.getIp(), entity.getPort()); - String deviceCacheKey = IotCacheConstants.getIotDeviceVideoKey(entity.getVideoCode()); - entity.setStatus(DeviceStatus.ONLINE.getValue()); - if(entity.getVideoId() == null){ - // 设备首次上线 - if(redisService.hasKey(deviceCacheKey)){ - // 脏数据 - redisService.deleteObject(deviceCacheKey); - } - this.save(entity); - } else { - entity.setUpdateTime(LocalDateTime.now()); - this.updateById(entity); - } - sipDeviceCommander.queryDeviceInfo(entity); - sipDeviceCommander.queryCatalog(entity); - } - - @Override - public boolean expire(DeviceVideoEntity entity) { - LocalDateTime expireDateTime = entity.getRegisterTime().plus(entity.getExpires(), ChronoUnit.MILLIS); - return expireDateTime.isBefore(LocalDateTime.now()); - } - - @Override - public DeviceVideoEntity getByCode(String videoCode) { - return super.getOne(Wrappers.lambdaQuery(DeviceVideoEntity.class) - .eq(DeviceVideoEntity::getVideoCode, videoCode) - .orderByDesc(DeviceVideoEntity::getCreateTime) - .last("limit 1")); - } - - /** - * 根据 videoCode 获取设备 - * - * @param channelCode - * @return 设备 - */ - @Override - public DeviceVideoEntity getByChannelCode(String channelCode) { - DeviceVideoChannelEntity channelEntity = Optional.ofNullable(deviceVideoChannelService.getByCode(channelCode)).orElseThrow(()-> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - return this.getById(channelEntity.getVideoId()); - } - - /** - * 查询设备状态 - * - * @param videoId - * @return - */ - @Override - public void queryDeviceStatus(Long videoId) { - DeviceVideoEntity entity = Optional.ofNullable(this.getById(videoId)).orElseThrow( () -> new ServiceException(IotRespMessage.ID_NOT_FOUND)); - sipDeviceCommander.queryDeviceStatus(entity); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java deleted file mode 100644 index 0d33fa6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/IpConfigServiceImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import cn.hutool.core.util.NumberUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.monitor.domain.entity.IpConfigEntity; -import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; -import com.dite.znpt.monitor.mapper.IpConfigMapper; -import com.dite.znpt.monitor.service.IpConfigService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * @Date: 2023/09/05 16:39 - * @Description: 监控设备IP配置表服务实现类 - */ -@Service -public class IpConfigServiceImpl extends ServiceImpl implements IpConfigService { - - - @Override - @Transactional(rollbackFor = Exception.class) - public void configAdd(MonitorConfigAddReq req) { - //先删除再新增--全量新增 - final List configAdds = req.getIpAddresses().stream().map(this::BuildConfigEntity).collect(Collectors.toList()); - //校验是否有重复的--用前三位来判断重复 - checkDup(configAdds); - deleteConfig(); - this.saveBatch(configAdds); - } - - - - @Override - public List configList() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - final List ifConfigs = this.list(wrapper); - return ifConfigs.stream().map(t->t.getIp()).collect(Collectors.toList()); - } - - private void deleteConfig(){ - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - this.remove(wrapper); - } - - private void checkDup(List configAdds) { - final List ipTopThreeList = configAdds.stream().map(t -> t.getIpTopThree()).collect(Collectors.toList()); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(IpConfigEntity::getIpTopThree,ipTopThreeList) - .last("limit 1"); - final IpConfigEntity one = this.getOne(wrapper); - if(one != null){ - throw new ServiceException("与现有视频地址重复,请重新选择!"); - } - } - - private IpConfigEntity BuildConfigEntity( String ip) { - IpConfigEntity entity = new IpConfigEntity(); - final String[] ipArray = ip.split("\\."); - ipValidate(ipArray); - entity.setIp(ip); - entity.setIpTopThree(ipArray[0]+"."+ipArray[1]+"."+ipArray[2]); - return entity; - } - - private void ipValidate(String[] ipArray) { - if(ipArray.length!=4){ - throw new ServiceException("ip地址长度不对"); - } - for (int i = 0; i < 4; i++) { - if(! (NumberUtil.isInteger(ipArray[i]) || (i==3 && "*".equals(ipArray[i])))){ - throw new ServiceException("ip地址为非数字"); - } - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java b/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java deleted file mode 100644 index 06aaa50..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/service/impl/StreamMediaFormatServiceImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dite.znpt.monitor.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.monitor.domain.vo.video.StreamMediaFormat; -import com.dite.znpt.monitor.mapper.StreamMediaFormatMapper; -import com.dite.znpt.monitor.service.StreamMediaFormatService; -import org.springframework.stereotype.Service; - -/** - * @Author: huise23 - * @Date: 2022/8/11 14:59 - * @Description: - */ -@Service -public class StreamMediaFormatServiceImpl extends ServiceImpl implements StreamMediaFormatService { - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java b/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java deleted file mode 100644 index f10f7d8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/SipLayer.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.dite.znpt.monitor.sip; - -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryI; -import gov.nist.javax.sip.SipProviderImpl; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.bridge.SLF4JBridgeHandler; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.DependsOn; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import javax.sip.*; -import java.util.Properties; -import java.util.TooManyListenersException; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:20 - * @Description: - */ -@Slf4j -@Component -public class SipLayer { - - @Resource - private SipConfig sipConfig; - - @Resource - private SipProcessorFactoryI sipProcessorFactory; - - private SipStack sipStack; - - private SipFactory sipFactory; - - @Bean("sipFactory") - SipFactory createSipFactory() { - sipFactory = SipFactory.getInstance(); - sipFactory.setPathName("gov.nist"); - return sipFactory; - } - - @Bean("sipStack") - @DependsOn({"sipFactory"}) - SipStack createSipStack() throws PeerUnavailableException { - Properties properties = new Properties(); - properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP"); - properties.setProperty("javax.sip.IP_ADDRESS", sipConfig.getIp()); - /** - * 完整配置参考 gov.nist.javax.sip.SipStackImpl,需要下载源码 - * gov/nist/javax/sip/SipStackImpl.class - */ - if (log.isDebugEnabled()) { - properties.setProperty("gov.nist.javax.sip.LOG_MESSAGE_CONTENT", "true"); - } - // 接收所有notify请求,即使没有订阅 - properties.setProperty("gov.nist.javax.sip.DELIVER_UNSOLICITED_NOTIFY", "true"); - // 为_NULL _对话框传递_终止的_事件 - properties.setProperty("gov.nist.javax.sip.DELIVER_TERMINATED_EVENT_FOR_NULL_DIALOG", "true"); - // 会话清理策略 - properties.setProperty("gov.nist.javax.sip.RELEASE_REFERENCES_STRATEGY", "Normal"); - // 处理由该服务器处理的基于底层TCP的保持生存超时 - properties.setProperty("gov.nist.javax.sip.RELIABLE_CONNECTION_KEEP_ALIVE_TIMEOUT", "60"); - - /** - * sip_server_log.log 和 sip_debug_log.log public static final int TRACE_NONE = - * 0; public static final int TRACE_MESSAGES = 16; public static final int - * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32; - */ - if (log.isDebugEnabled()) { - properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); - } -// sip日志等级 - properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "ERROR"); - sipStack = sipFactory.createSipStack(properties); - - return sipStack; - } - - @Bean(name = "tcpSipProvider") - @DependsOn("sipStack") - SipProviderImpl startTcpListener() throws InvalidArgumentException, TransportNotSupportedException, ObjectInUseException, TooManyListenersException { - ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "TCP"); - SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); - tcpSipProvider.setDialogErrorsAutomaticallyHandled(); - tcpSipProvider.addSipListener(sipProcessorFactory); - log.info("[Sip Server] TCP 启动成功 {}:{}", sipConfig.getIp(), sipConfig.getPort()); - return tcpSipProvider; - } - - @Bean(name = "udpSipProvider") - @DependsOn("sipStack") - SipProviderImpl startUdpListener() throws InvalidArgumentException, TransportNotSupportedException, ObjectInUseException, TooManyListenersException { - ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getIp(), sipConfig.getPort(), "UDP"); - SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint); - udpSipProvider.addSipListener(sipProcessorFactory); - log.info("[Sip Server] UDP 启动成功 {}:{}", sipConfig.getIp(), sipConfig.getPort()); - return udpSipProvider; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java b/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java deleted file mode 100644 index 86d475f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/config/SipConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dite.znpt.monitor.sip.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:59 - * @Description: - */ -@Data -@Configuration -@ConfigurationProperties(prefix = "sip-config") -public class SipConfig { - - String name; - - String ip; - - Integer port; - - String charset; - - String domain; - - String id; - - String password; - - String mediaType = "mp4"; - - /** - * zlm播放地址路由 - */ - String mediaRouter = "/zlm"; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java b/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java deleted file mode 100644 index 48d758d..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/session/StreamSessionManager.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dite.znpt.monitor.sip.session; - -import org.springframework.stereotype.Component; - -import javax.sip.ClientTransaction; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @Author: huise23 - * @Date: 2022/8/29 16:52 - * @Description: 视频流session管理器,管理视频预览、预览回放的通信句柄 - */ -@Component -public class StreamSessionManager { - - private ConcurrentHashMap sessionMap = new ConcurrentHashMap<>(); - - public void put(String ssrc, ClientTransaction transaction){ - sessionMap.put(ssrc, transaction); - } - - public ClientTransaction get(String ssrc){ - return sessionMap.get(ssrc); - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java deleted file mode 100644 index ad1c041..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryI.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit; - -import javax.sip.SipListener; - -/** - * @Author: huise23 - * @Date: 2022/8/29 16:52 - * @Description: - */ -public interface SipProcessorFactoryI extends SipListener { -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java deleted file mode 100644 index b450e7e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/SipProcessorFactoryImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit; - - -import cn.hutool.json.JSONUtil; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.response.ISipResponseProcessor; -import com.dite.znpt.monitor.sip.transmit.timeout.ITimeoutProcessor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import javax.sip.*; -import javax.sip.header.CSeqHeader; -import javax.sip.message.Response; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:44 - * @Description: - */ -@Slf4j -@Component -public class SipProcessorFactoryImpl implements SipProcessorFactoryI { - - private static Map requestProcessorMap = new ConcurrentHashMap<>(); - - private static Map responseProcessorMap = new ConcurrentHashMap<>(); - - private static ITimeoutProcessor timeoutProcessor; - - public void addRequestProcessor(String method, ISipRequestProcessor processor) { - requestProcessorMap.put(method, processor); - } - - public void addResponseProcessor(String method, ISipResponseProcessor processor) { - responseProcessorMap.put(method, processor); - } - - public void addTimeoutProcessor(ITimeoutProcessor processor) { - timeoutProcessor = processor; - } - - @Override - @Async - public void processRequest(RequestEvent requestEvent) { - log.info("requestEvent:"+ JSONUtil.toJsonStr(requestEvent.getRequest())); - String method = requestEvent.getRequest().getMethod(); - ISipRequestProcessor sipRequestProcessor = requestProcessorMap.get(method); - if (sipRequestProcessor == null) { - log.warn("不支持方法{}的request", method); - return; - } - sipRequestProcessor.process(requestEvent); - } - - @Override - @Async - public void processResponse(ResponseEvent responseEvent) { - Response response = responseEvent.getResponse(); - int status = response.getStatusCode(); - if ((status >= 200 && status < 300) || status == Response.UNAUTHORIZED) { - CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); - String method = cseqHeader.getMethod(); - ISipResponseProcessor sipResponseProcessor = responseProcessorMap.get(method); - if (sipResponseProcessor == null) { - log.warn("不支持方法{}的response", method); - return; - } - sipResponseProcessor.process(responseEvent); - } else if ((status >= 100) && (status < 200)) { - // 增加其它无需回复的响应,如101、180等 - } else { - //未完成 接收到失败的response响应!status:400,message:Bad Request - log.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()); - } - } - - @Override - public void processTimeout(TimeoutEvent timeoutEvent) { - // TODO Auto-generated method stub - } - - @Override - public void processIOException(IOExceptionEvent exceptionEvent) { - // TODO Auto-generated method stub - } - - @Override - public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) { - // TODO Auto-generated method stub - } - - @Override - public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) { - // TODO Auto-generated method stub - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java deleted file mode 100644 index 7ace5f6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/ISipDeviceCommander.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.cmd; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; - -/** - * @Author: huise23 - * @Date: 2022/8/30 8:46 - * @Description: - */ -public interface ISipDeviceCommander { - - /** - * 查询目录列表 - * @param entity - * @return {@link boolean} - */ - boolean queryCatalog(DeviceVideoEntity entity); - - /** - * 查询设备信息 - * @param entity - * @return {@link boolean} - */ - boolean queryDeviceInfo(DeviceVideoEntity entity); - - /** - * 查询设备状态 - * @param entity - * @return {@link boolean} - */ - boolean queryDeviceStatus(DeviceVideoEntity entity); - - /** - * 请求预览视频流 - * - * @param entity - * @param channelCode - * @param ssrc - * @param ssrcPort - * @return {@link String} - */ - void playStreamCmd(DeviceVideoEntity entity, String channelCode, String ssrc, Integer ssrcPort, String mediaIp); - - /** - * 停止视频流 - * @param ssrc - * @return - */ - void stopStreamCmd(String ssrc); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java deleted file mode 100644 index 383c7c8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/SipRequestHeaderProvider.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.cmd; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.sip.config.SipConfig; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.PeerUnavailableException; -import javax.sip.SipFactory; -import javax.sip.SipProvider; -import javax.sip.address.Address; -import javax.sip.address.SipURI; -import javax.sip.header.*; -import javax.sip.message.Request; -import java.security.SecureRandom; -import java.text.ParseException; -import java.util.ArrayList; - -/** - * 摄像头命令request构造器 - * - * @author yun11 - * @date 2023/05/11 - */ -@Component -public class SipRequestHeaderProvider { - - @Resource - private SipConfig sipConfig; - - @Resource - private SipFactory sipFactory; - - @Resource - @Qualifier(value="tcpSipProvider") - private SipProvider tcpSipProvider; - - @Resource - @Qualifier(value="udpSipProvider") - private SipProvider udpSipProvider; - - /** - * 创建Message信令请求报文 - * @param device - * @param content - * @param viaTag - * @param fromTag - * @param toTag - * @return {@link Request} - */ - public Request createMessageRequest(DeviceVideoEntity device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException, PeerUnavailableException { - Request request = null; - // sipuri - SipURI requestUri = sipFactory.createAddressFactory().createSipURI(device.getVideoCode(), device.getHostAddress()); - // via - ArrayList viaHeaders = new ArrayList(); - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); - viaHeader.setRPort(); - viaHeaders.add(viaHeader); - // from - SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain()); - Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI); - FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, fromTag); - // to - SipURI toSipUri = sipFactory.createAddressFactory().createSipURI(device.getVideoCode(), device.getHostAddress()); - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipUri); - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); - // callid - CallIdHeader callIdHeader = "TCP".equals(device.getTransport()) ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); - // Forwards - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); - // ceq - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(Long.valueOf(Math.abs(new SecureRandom().nextInt(Integer.MAX_VALUE)) - 1000), Request.MESSAGE); - - request = sipFactory.createMessageFactory().createRequest(requestUri, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, - toHeader, viaHeaders, maxForwards); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); - request.setContent(content, contentTypeHeader); - return request; - } - - public Request createInviteRequest(DeviceVideoEntity entity, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { - Request request = null; - //请求行 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, entity.getHostAddress()); - //via - ArrayList viaHeaders = new ArrayList(); - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), entity.getTransport(), viaTag); - viaHeader.setRPort(); - viaHeaders.add(viaHeader); - //from - SipURI fromSipUri = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain()); - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipUri); - //必须要有标记,否则无法创建会话,无法回应ack - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); - //to - SipURI toSipUri = sipFactory.createAddressFactory().createSipURI(channelId, entity.getHostAddress()); - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipUri); - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); - - //Forwards - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); - - //ceq - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(Long.valueOf(Math.abs(new SecureRandom().nextInt(Integer.MAX_VALUE)) - 1000), Request.INVITE); - request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); - - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - // Subject - SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); - request.addHeader(subjectHeader); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); - request.setContent(content, contentTypeHeader); - return request; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java deleted file mode 100644 index 72672fc..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/cmd/impl/SipDeviceCommanderImpl.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.cmd.impl; - -import cn.hutool.core.util.SerializeUtil; -import com.dite.znpt.monitor.constant.IotCacheConstants; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.sip.transmit.cmd.SipRequestHeaderProvider; -import com.dite.znpt.service.impl.RedisService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.ClientTransaction; -import javax.sip.InvalidArgumentException; -import javax.sip.SipException; -import javax.sip.SipProvider; -import javax.sip.address.SipURI; -import javax.sip.header.CallIdHeader; -import javax.sip.header.ViaHeader; -import javax.sip.message.Request; -import java.text.ParseException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @Author: huise23 - * @Date: 2022/8/30 8:50 - * @Description: - */ -@Slf4j -@Component -public class SipDeviceCommanderImpl implements ISipDeviceCommander { - - private final static Pattern VIA_HEADER_PATTERN = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\\:(\\d+)"); - @Resource - @Qualifier(value="tcpSipProvider") - private SipProvider tcpSipProvider; - - @Resource - @Qualifier(value="udpSipProvider") - private SipProvider udpSipProvider; - - @Resource - private SipRequestHeaderProvider sipRequestHeaderProvider; - - @Resource - private ZlmService zlmService; - - @Resource - private RedisService redisService; - - /** - * 查询目录列表 - * @param entity - * @return {@link boolean} - */ - @Override - public boolean queryCatalog(DeviceVideoEntity entity) { - try { - StringBuffer content = new StringBuffer(200); - String charset = entity.getCharset(); - content.append("\r\n"); - content.append("\r\n"); - content.append(" Catalog\r\n"); - content.append(" " + (int)((Math.random()*9+1)*100000) + "\r\n"); - content.append(" " + entity.getVideoCode() + "\r\n"); - content.append("\r\n"); - - String tag = String.valueOf(System.nanoTime()); - Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, null); - transmitRequest(entity.getTransport(), request); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } - - /** - * 查询设备信息 - * @param entity - * @return {@link boolean} - */ - @Override - public boolean queryDeviceInfo(DeviceVideoEntity entity) { - try { - StringBuffer content = new StringBuffer(200); - String charset = entity.getCharset(); - content.append("\r\n"); - content.append("\r\n"); - content.append("DeviceInfo\r\n"); - content.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); - content.append("" + entity.getVideoCode() + "\r\n"); - content.append("\r\n"); - String tag = String.valueOf(System.nanoTime()); - Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, null); - transmitRequest(entity.getTransport(), request); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } - - /** - * 查询设备状态 - * @param entity - * @return {@link boolean} - */ - @Override - public boolean queryDeviceStatus(DeviceVideoEntity entity) { - try { - StringBuffer content = new StringBuffer(200); - content.append("\r\n"); - content.append("\r\n"); - content.append("DeviceStatus\r\n"); - content.append("" + (int)((Math.random()*9+1)*100000) + "\r\n"); - content.append("" + entity.getVideoCode() + "\r\n"); - content.append("\r\n"); - String tag = String.valueOf(System.nanoTime()); - Request request = sipRequestHeaderProvider.createMessageRequest(entity, content.toString(), tag, tag, tag); - transmitRequest(entity.getTransport(), request); - return true; - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } - - /** - * 请求预览视频流 - * - * @param entity - * @param channelCode 流传输协议 - * @param ssrc - * @param ssrcPort - * @return {@link String} - */ - @Override - public void playStreamCmd(DeviceVideoEntity entity, String channelCode, String ssrc, Integer ssrcPort, String mediaIp){ - try { - String streamMode = entity.getStreamMode().toUpperCase(); - StringBuffer content = new StringBuffer(200); - content.append("v=0\r\n"); - content.append("o=" + channelCode + " 0 0 IN IP4 " + mediaIp + "\r\n"); - content.append("s=Play\r\n"); - content.append("c=IN IP4 " + mediaIp + "\r\n"); - content.append("t=0 0\r\n"); - if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video " + ssrcPort + " TCP/RTP/AVP 96 97 98 99\r\n"); - }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video " + ssrcPort + " TCP/RTP/AVP 96 97 98 99\r\n"); - }else if("UDP".equals(streamMode)) { - content.append("m=video " + ssrcPort + " RTP/AVP 96 97 98 99\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - content.append("a=rtpmap:99 H265/90000\r\n"); - if ("TCP-PASSIVE".equals(streamMode)) { // tcp被动模式 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp主动模式 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - content.append("y=" + ssrc + "\r\n");//ssrc - String tm = Long.toString(System.currentTimeMillis()); - CallIdHeader callIdHeader = "TCP".equals(entity.getTransport()) ? tcpSipProvider.getNewCallId() : udpSipProvider.getNewCallId(); - Request request = sipRequestHeaderProvider.createInviteRequest(entity, channelCode, content.toString(), null, "FromInvt" + tm, null, ssrc, callIdHeader); - ClientTransaction clientTransaction = transmitRequest(entity.getTransport(), request); - System.out.println("-----------------------------------------------------------"); - redisService.setCacheObject(IotCacheConstants.getClientTransactionCacheKey(ssrc), SerializeUtil.serialize(clientTransaction)); - } catch (ParseException | InvalidArgumentException | SipException e) { - System.out.println("[zlm]拉流失败"); - zlmService.release(entity.getVideoCode(), channelCode); - e.printStackTrace(); - } - } - - /** - * 停止视频流 - * - * @param ssrc - * @return - */ - @Override - public void stopStreamCmd(String ssrc) { - try { - ClientTransaction transaction = redisService.hasKey(ssrc) ? SerializeUtil.deserialize(redisService.getCacheObject(ssrc)) : null; - if ( null == transaction || null == transaction.getDialog()) { - return; - } - Request byeRequest = transaction.getDialog().createRequest(Request.BYE); - SipURI byeURI = (SipURI) byeRequest.getRequestURI(); - String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString(); - - Matcher matcher = VIA_HEADER_PATTERN.matcher(vh); - if (VIA_HEADER_PATTERN.matcher(vh).find()) { - byeURI.setHost(matcher.group(1)); - } - ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); - String protocol = viaHeader.getTransport().toUpperCase(); - ClientTransaction clientTransaction = null; - if("TCP".equals(protocol)) { - clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); - } else if("UDP".equals(protocol)) { - clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); - } - transaction.getDialog().sendRequest(clientTransaction); - redisService.deleteObject(ssrc); - } catch (SipException | ParseException e) { - e.printStackTrace(); - } - } - - private ClientTransaction transmitRequest(String transport, Request request) throws SipException { - ClientTransaction clientTransaction = "TCP".equals(transport) ? tcpSipProvider.getNewClientTransaction(request) : udpSipProvider.getNewClientTransaction(request); - clientTransaction.sendRequest(); - return clientTransaction; - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java deleted file mode 100644 index 14ad459..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request; - -import javax.sip.RequestEvent; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:46 - * @Description: - */ -public interface ISipRequestProcessor { - void process(RequestEvent event); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java deleted file mode 100644 index 20d7e99..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/ISipRequestProcessorAbstract.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request; - -import gov.nist.javax.sip.SipProviderImpl; -import gov.nist.javax.sip.SipStackImpl; -import gov.nist.javax.sip.message.SIPRequest; -import gov.nist.javax.sip.stack.SIPServerTransaction; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ArrayUtils; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; - -import javax.sip.*; -import javax.sip.address.Address; -import javax.sip.address.AddressFactory; -import javax.sip.address.SipURI; -import javax.sip.header.ContentTypeHeader; -import javax.sip.header.ExpiresHeader; -import javax.sip.header.HeaderFactory; -import javax.sip.header.ViaHeader; -import javax.sip.message.MessageFactory; -import javax.sip.message.Request; -import javax.sip.message.Response; -import java.io.ByteArrayInputStream; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:48 - * @Description: - */ - -@Slf4j -public abstract class ISipRequestProcessorAbstract { - - @Autowired - @Qualifier(value="tcpSipProvider") - private SipProviderImpl tcpSipProvider; - - @Autowired - @Qualifier(value="udpSipProvider") - private SipProviderImpl udpSipProvider; - - /** - * 根据 RequestEvent 获取 ServerTransaction - * @param evt - * @return - */ - public ServerTransaction getServerTransaction(RequestEvent evt) { - Request request = evt.getRequest(); - ServerTransaction serverTransaction = evt.getServerTransaction(); - // 判断TCP还是UDP - boolean isTcp = false; - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - String transport = reqViaHeader.getTransport(); - if ("TCP".equals(transport)) { - isTcp = true; - } - - if (serverTransaction == null) { - try { - if (isTcp) { - SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); - if (serverTransaction == null) { - serverTransaction = tcpSipProvider.getNewServerTransaction(request); - } - } else { - SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); - if (serverTransaction == null) { - serverTransaction = udpSipProvider.getNewServerTransaction(request); - } - } - } catch (TransactionAlreadyExistsException e) { - log.error(e.getMessage()); - } catch (TransactionUnavailableException e) { - log.error(e.getMessage()); - } - } - return serverTransaction; - } - - public AddressFactory getAddressFactory() { - try { - return SipFactory.getInstance().createAddressFactory(); - } catch (PeerUnavailableException e) { - e.printStackTrace(); - } - return null; - } - - public HeaderFactory getHeaderFactory() { - try { - return SipFactory.getInstance().createHeaderFactory(); - } catch (PeerUnavailableException e) { - e.printStackTrace(); - } - return null; - } - - public MessageFactory getMessageFactory() { - try { - return SipFactory.getInstance().createMessageFactory(); - } catch (PeerUnavailableException e) { - e.printStackTrace(); - } - return null; - } - - /*** - * 回复状态码 - * 100 trying - * 200 OK - * 400 - * 404 - * @param evt - * @throws SipException - * @throws InvalidArgumentException - * @throws ParseException - */ - public void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); - ServerTransaction serverTransaction = getServerTransaction(evt); - if (serverTransaction == null) { - log.warn("回复失败:{}", response); - return; - } - serverTransaction.sendResponse(response); - if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { - if (serverTransaction.getDialog() != null) { - serverTransaction.getDialog().delete(); - } - } - } - - public void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); - response.setReasonPhrase(msg); - ServerTransaction serverTransaction = getServerTransaction(evt); - serverTransaction.sendResponse(response); - if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) { - if (serverTransaction.getDialog() != null) { - serverTransaction.getDialog().delete(); - } - } - } - - /** - * 回复带sdp的200 - * @param evt - * @param sdp - * @param sipServerCode SIP服务国标编码 - * @param serverIp SIP服务ip - * @param sipServerPort SIP服务端口 - * @return - */ - public void responseSdpAck(RequestEvent evt, String sdp, String sipServerCode, String serverIp, Integer sipServerPort) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); - SipFactory sipFactory = SipFactory.getInstance(); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); - response.setContent(sdp, contentTypeHeader); - - // 兼容国标中的使用编码@域名作为RequestURI的情况 - SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); - if (sipURI.getPort() == -1) { - sipURI = sipFactory.createAddressFactory().createSipURI(sipServerCode, serverIp+":" + sipServerPort); - } - log.debug("responseSdpAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); - - Address concatAddress = sipFactory.createAddressFactory().createAddress( - sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() - )); - response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - getServerTransaction(evt).sendResponse(response); - } - - /** - * 回复带xml的200 - * @param evt - * @param xml - * @param sipServerCode SIP服务国标编码 - * @param serverIp SIP服务ip - * @param sipServerPort SIP服务端口 - * @throws SipException - * @throws InvalidArgumentException - * @throws ParseException - */ - public Response responseXmlAck(RequestEvent evt, String xml, String sipServerCode, String serverIp, Integer sipServerPort) throws SipException, InvalidArgumentException, ParseException { - Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); - SipFactory sipFactory = SipFactory.getInstance(); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); - response.setContent(xml, contentTypeHeader); - - // 兼容国标中的使用编码@域名作为RequestURI的情况 - SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); - if (sipURI.getPort() == -1) { - sipURI = sipFactory.createAddressFactory().createSipURI(sipServerCode, serverIp + ":" + sipServerPort); - } - log.debug("responseXmlAck SipURI: {}:{}", sipURI.getHost(), sipURI.getPort()); - - Address concatAddress = sipFactory.createAddressFactory().createAddress( - sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() - )); - response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - response.addHeader(evt.getRequest().getHeader(ExpiresHeader.NAME)); - getServerTransaction(evt).sendResponse(response); - return response; - } - - public Element getRootElement(RequestEvent evt) throws DocumentException { - return getRootElement(evt, "gb2312"); - } - - public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { - if (charset == null) { - charset = "gb2312"; - } - Request request = evt.getRequest(); - SAXReader reader = new SAXReader(); - reader.setEncoding(charset); - // 对海康出现的未转义字符做处理。 - String[] destStrArray = new String[]{"<",">","&","'","""}; - char despChar = '&'; // 或许可扩展兼容其他字符 - byte destBye = (byte) despChar; - List result = new ArrayList<>(); - byte[] rawContent = request.getRawContent(); - if (rawContent == null) { - return null; - } - for (int i = 0; i < rawContent.length; i++) { - if (rawContent[i] == destBye) { - boolean resul = false; - for (String destStr : destStrArray) { - if (i + destStr.length() <= rawContent.length) { - byte[] bytes = Arrays.copyOfRange(rawContent, i, i + destStr.length()); - resul = resul || (Arrays.equals(bytes,destStr.getBytes())); - } - } - if (resul) { - result.add(rawContent[i]); - } - }else { - result.add(rawContent[i]); - } - } - Byte[] bytes = new Byte[0]; - byte[] bytesResult = ArrayUtils.toPrimitive(result.toArray(bytes)); - - Document xml = reader.read(new ByteArrayInputStream(bytesResult)); - return xml.getRootElement(); - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java deleted file mode 100644 index 4fdfe4c..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/AckRequestProcessorImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import gov.nist.javax.sip.header.CSeq; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.Dialog; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Request; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:54 - * @Description: - */ -@Slf4j -@Component -public class AckRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - private final String METHOD = "ACK"; - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - - - @Override - public void process(RequestEvent evt) { - Request request = evt.getRequest(); - Dialog dialog = evt.getDialog(); - try { - log.info("接收到bye请求:{}", getRootElement(evt)); - CSeq csReq = (CSeq) request.getHeader(CSeq.NAME); - Request ackRequest = dialog.createAck(csReq.getSeqNumber()); - dialog.sendAck(ackRequest); - log.info("send ack : " + ackRequest.toString()); - } catch (SipException | InvalidArgumentException | DocumentException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java deleted file mode 100644 index a872d5f..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/ByeRequestProcessorImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.media.zlm.ZlmService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.*; -import javax.sip.address.SipURI; -import javax.sip.header.FromHeader; -import javax.sip.header.HeaderAddress; -import javax.sip.message.Response; -import java.text.ParseException; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:55 - * @Description: - */ -@Slf4j -@Component -public class ByeRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - private final String METHOD = "BYE"; - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private ZlmService zlmService; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - @Override - public void process(RequestEvent evt) { - try { - responseAck(evt, Response.OK); - Dialog dialog = evt.getDialog(); - if (dialog == null) { - return; - } - if (dialog.getState().equals(DialogState.TERMINATED)) { - String channelCode = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); - DeviceVideoEntity videoEntity = deviceVideoService.getByChannelCode(channelCode); - zlmService.release(videoEntity.getVideoCode(), channelCode); - } - } catch (SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java deleted file mode 100644 index 674bbf6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/MessageRequestProcessorImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import com.dite.znpt.monitor.sip.utils.XmlUtil; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.RequestEvent; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @Author: huise23 - * @Date: 2022/8/29 18:43 - * @Description: - */ -@Slf4j -@Component -public class MessageRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - private final String METHOD = "MESSAGE"; - - public Map messageHandlerMap = new ConcurrentHashMap<>(); - - public void addHandler(String cmdType, IMessageHandler messageHandler) { - messageHandlerMap.put(cmdType, messageHandler); - } - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Resource - private DeviceVideoService deviceVideoService; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - - @Override - public void process(RequestEvent event) { - try { - Element rootElement = getRootElement(event); - String cmd = XmlUtil.getText(rootElement,"CmdType"); - log.info("接收到message请求:{}", cmd); - IMessageHandler messageHandler = messageHandlerMap.get(cmd); - if(null == messageHandler){ - log.info("不支持的消息类型:{}", cmd); - return; - } - String videoCode = rootElement.element("DeviceID").getText(); - DeviceVideoEntity entity = deviceVideoService.getByCode(videoCode); - if(null == entity){ - log.info("设备未注册,国标编码:{}", videoCode); - return; - } - messageHandler.process(entity, event); - - } catch (DocumentException e) { - e.printStackTrace(); - } - } - - - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java deleted file mode 100644 index da11e57..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/RegisterRequestProcessorImpl.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.service.IpConfigService; -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessor; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.utils.DigestServerAuthenticationHelper; -import gov.nist.javax.sip.address.AddressImpl; -import gov.nist.javax.sip.address.SipUri; -import gov.nist.javax.sip.header.Expires; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.header.*; -import javax.sip.message.Request; -import javax.sip.message.Response; -import java.security.NoSuchAlgorithmException; -import java.text.ParseException; -import java.time.LocalDateTime; -import java.util.Calendar; -import java.util.List; -import java.util.Locale; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:53 - * @Description: - */ -@Slf4j -@Component -public class RegisterRequestProcessorImpl extends ISipRequestProcessorAbstract implements InitializingBean, ISipRequestProcessor { - - public final String METHOD = "REGISTER"; - - @Resource - private SipProcessorFactoryImpl sipProcessorFactory; - - @Resource - private SipConfig sipConfig; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - @Resource - private IpConfigService ipConfigService; - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addRequestProcessor(METHOD, this); - } - - @Override - public synchronized void process(RequestEvent evt) { - try { - log.info("收到注册请求,开始处理"); - Request request = evt.getRequest(); - Response response; - // 注册标志 - boolean registerFlag = false; - AuthorizationHeader authorHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - - String password = sipConfig.getPassword(); - if (StrUtil.isNotBlank(password)) { - // 未携带授权头或者密码错误 回复401 - if (authorHeader == null && StrUtil.isNotEmpty(sipConfig.getPassword())) { - log.info("未携带授权头或者密码错误,回复401"); - response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request); - new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain()); - getServerTransaction(evt).sendResponse(response); - return; - } - // 校验密码是否正确 - boolean passwordCorrect = new DigestServerAuthenticationHelper().doAuthenticatePlainTextPassword(request, sipConfig.getPassword()); - if (!passwordCorrect) { - response = getMessageFactory().createResponse(Response.FORBIDDEN, request); - response.setReasonPhrase("wrong password"); - log.info("[注册请求] 密码/SIP服务器ID错误, 回复403"); - getServerTransaction(evt).sendResponse(response); - return; - } - } - // 携带授权头并且密码正确 - response = getMessageFactory().createResponse(Response.OK, request); - // 添加date头 - response.addHeader(getHeaderFactory().createDateHeader(Calendar.getInstance(Locale.ENGLISH))); - ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); - // 添加Contact头 - response.addHeader(request.getHeader(ContactHeader.NAME)); - // 添加Expires头 - response.addHeader(request.getExpires()); - // 获取到通信地址等信息 - FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); - ViaHeader viaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - AddressImpl address = (AddressImpl) fromHeader.getAddress(); - SipUri uri = (SipUri) address.getURI(); - String videoCode = uri.getUser(); - DeviceVideoEntity entity = deviceVideoService.getByCode(videoCode); - log.info("entity:"+JSONUtil.toJsonStr(entity)); - if (expiresHeader != null && expiresHeader.getExpires() == 0) { - // 注册失败 - registerFlag = false; - } else { - // 注册成功 - registerFlag = true; - if (entity == null) { - entity = new DeviceVideoEntity(); - entity.setStreamMode("UDP"); - entity.setVideoCode(videoCode); - entity.setVideoCode(DeviceStatus.OFFLINE.getValue()); - } - entity.setVideoCode(videoCode); - entity.setExpires(expiresHeader.getExpires()); - - String ip = viaHeader.getHost(); - int rPort = viaHeader.getRPort(); - // 解析本地地址替代 - if (ObjectUtils.isEmpty(ip) || rPort == -1) { - ip = viaHeader.getHost(); - rPort = viaHeader.getPort(); - } - entity.setIp(ip); - entity.setPort(rPort); - entity.setHostAddress(ip.concat(":").concat(String.valueOf(rPort))); - // 判断TCP还是UDP - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - entity.setTransport("TCP".equals(reqViaHeader.getTransport()) ? "TCP" : "UDP"); - entity.setCharset("GB2312"); - } - getServerTransaction(evt).sendResponse(response); - if(registerFlag){ - entity.setRegisterTime(LocalDateTime.now()); - deviceVideoService.online(entity); - }else{ - deviceVideoService.offline(videoCode); - } - } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) { - e.printStackTrace(); - } - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java deleted file mode 100644 index 36db6b6..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/IMessageHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; - -import javax.sip.RequestEvent; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:48 - * @Description: - */ -public interface IMessageHandler { - - /** - * 处理消息 - * @param evt - * @return - */ - void process(DeviceVideoEntity entity, RequestEvent evt); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java deleted file mode 100644 index bd28287..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/CatalogHandlerImpl.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.domain.entity.DeviceVideoChannelEntity; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import com.dite.znpt.monitor.sip.utils.XmlUtil; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Response; -import java.text.ParseException; -import java.time.LocalDateTime; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:33 - * @Description: - */ -@Slf4j -@Component -public class CatalogHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "Catalog"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private DeviceVideoChannelService deviceVideoChannelService; - - @Override - public void afterPropertiesSet(){ - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - Element rootElement = getRootElement(evt); - log.info("接收到catalog消息"); - Element deviceChannelElement = rootElement.element("DeviceList"); - Element sumNumElement = rootElement.element("SumNum"); - Element snElement = rootElement.element("SN"); - if (snElement == null || sumNumElement == null || deviceChannelElement == null) { - log.info("报文异常:{},{},{}", deviceChannelElement.getText(), sumNumElement.getText(), snElement.getText()); - responseAck(evt, Response.BAD_REQUEST); - return; - } - Iterator deviceListIterator = deviceChannelElement.elementIterator(); - if (deviceListIterator != null) { - List channelEntityList = deviceVideoChannelService.selectDeviceVideoChannelByVideoCode(entity.getVideoId()); - Map channelCodeMapEntity = channelEntityList.stream().collect(Collectors.toMap(k->k.getChannelCode(), v->v)); - // 遍历DeviceList - while (deviceListIterator.hasNext()) { - Element itemDevice = deviceListIterator.next(); - Element channelDeviceElement = itemDevice.element("DeviceID"); - - int parental = NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Parental")) ? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Parental")): 0; - String parentId = XmlUtil.getText(itemDevice, "ParentID"); - if (channelDeviceElement == null || parental != 0 || StrUtil.isEmpty(parentId)) { - continue; - } - String channelCode = channelDeviceElement.getText(); - DeviceVideoChannelEntity channelEntity = channelCodeMapEntity.containsKey(channelCode) ? channelCodeMapEntity.get(channelCode) : new DeviceVideoChannelEntity(); - channelEntity.setChannelCode(channelCode); - channelEntity.setVideoId(entity.getVideoId()); - channelEntity.setChannelName( ObjectUtil.isNotEmpty(itemDevice.element("Name")) ? itemDevice.element("Name").getText(): ""); - channelEntity.setManufacture(XmlUtil.getText(itemDevice,"Manufacturer")); - channelEntity.setModel(XmlUtil.getText(itemDevice,"Model")); - channelEntity.setOwner(XmlUtil.getText(itemDevice,"Owner")); - channelEntity.setCivilCode(XmlUtil.getText(itemDevice,"CivilCode")); - channelEntity.setBlock(XmlUtil.getText(itemDevice,"Block")); - channelEntity.setAddress(XmlUtil.getText(itemDevice,"Address")); - channelEntity.setParental(parental); - channelEntity.setParentId(parentId); - channelEntity.setSafetyWay(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"SafetyWay")) ? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"SafetyWay")):0); - channelEntity.setRegisterWay(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"RegisterWay"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"RegisterWay")): 1); - channelEntity.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); - channelEntity.setCertifiable(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Certifiable"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Certifiable")): 0); - channelEntity.setErrCode(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"ErrCode"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"ErrCode")): 0); - channelEntity.setCertNum(XmlUtil.getText(itemDevice,"CertNum")); - channelEntity.setEndTime(XmlUtil.getText(itemDevice,"EndTime")); - channelEntity.setSecrecy(XmlUtil.getText(itemDevice,"Secrecy")); - channelEntity.setIpAddress(XmlUtil.getText(itemDevice,"IPAddress")); - channelEntity.setPort(NumberUtil.isInteger(XmlUtil.getText(itemDevice,"Port"))? NumberUtil.parseInt(XmlUtil.getText(itemDevice,"Port")): 0); - channelEntity.setPassword(XmlUtil.getText(itemDevice,"Password")); - Element statusElement = itemDevice.element("Status"); - String status = statusElement != null && "OFF".equals(statusElement.getText())? DeviceStatus.OFFLINE.getValue() : DeviceStatus.ONLINE.getValue(); - channelEntity.setStatus(status); - channelEntity.setLongitude(NumberUtil.isDouble(XmlUtil.getText(itemDevice,"Longitude"))?NumberUtil.parseDouble(XmlUtil.getText(itemDevice,"Longitude")): 0.00); - channelEntity.setLatitude(NumberUtil.isDouble(XmlUtil.getText(itemDevice,"Latitude"))?NumberUtil.parseDouble(XmlUtil.getText(itemDevice,"Latitude")): 0.00); - channelEntity.setUpdateTime(LocalDateTime.now()); - channelEntityList.add(channelEntity); - } - deviceVideoChannelService.saveOrUpdateBatch(channelEntityList); - - entity.setChannelCount(channelEntityList.size()); - entity.setUpdateTime(LocalDateTime.now()); - deviceVideoService.updateById(entity); - - responseAck(evt, Response.OK); - } - } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java deleted file mode 100644 index 7e44cb4..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceInfoHandlerImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import com.dite.znpt.monitor.sip.utils.XmlUtil; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Response; -import java.text.ParseException; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:34 - * @Description: blog.csdn.net/Marvin1311/article/details/98845468 - */ -@Slf4j -@Component -public class DeviceInfoHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "DeviceInfo"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Resource - private DeviceVideoService deviceVideoService; - - @Override - public void afterPropertiesSet() { - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - Element rootElement = getRootElement(evt); - log.info("接收到deviceInfo消息"); - entity.setVideoName(XmlUtil.getText(rootElement,"DeviceName")); - entity.setManufacturer(XmlUtil.getText(rootElement,"Manufacturer")); - entity.setModel(XmlUtil.getText(rootElement,"Model")); - entity.setFirmware(XmlUtil.getText(rootElement,"Firmware")); - entity.setUpdateTime(LocalDateTime.now()); - deviceVideoService.updateById(entity); - responseAck(evt, Response.OK); - } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java deleted file mode 100644 index 8a28193..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/DeviceStatusHandlerImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import lombok.extern.slf4j.Slf4j; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.message.Response; -import java.text.ParseException; -import java.util.Objects; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:34 - * @Description: - */ -@Slf4j -@Component -public class DeviceStatusHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "DeviceStatus"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Override - public void afterPropertiesSet() { - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - - @Resource - private DeviceVideoService deviceVideoService; - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - Element rootElement = getRootElement(evt); - log.info("接收到DeviceStatus消息"); - responseAck(evt, Response.OK); - Element onlineElement = rootElement.element("Online"); - String text = onlineElement.getText(); - if (Objects.equals(text.trim().toUpperCase(), "ONLINE")) { - deviceVideoService.online(entity); - }else { - deviceVideoService.offline(entity.getVideoCode()); - } - } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java deleted file mode 100644 index 47927b8..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/request/impl/message/query/KeepaliveHandlerImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.request.impl.message.query; - -import com.alibaba.fastjson.JSON; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.sip.transmit.request.ISipRequestProcessorAbstract; -import com.dite.znpt.monitor.sip.transmit.request.impl.MessageRequestProcessorImpl; -import com.dite.znpt.monitor.sip.transmit.request.impl.message.IMessageHandler; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import javax.sip.InvalidArgumentException; -import javax.sip.RequestEvent; -import javax.sip.SipException; -import javax.sip.header.ViaHeader; -import javax.sip.message.Response; -import java.text.ParseException; -import java.time.LocalDateTime; - -/** - * @Author: huise23 - * @Date: 2022/9/1 13:35 - * @Description: - */ -@Slf4j -@Component -public class KeepaliveHandlerImpl extends ISipRequestProcessorAbstract implements InitializingBean, IMessageHandler { - - private final static String CMD_TYPE = "Keepalive"; - - @Resource - private MessageRequestProcessorImpl messageRequestProcessor; - - @Resource - private DeviceVideoService deviceVideoService; - - @Override - public void afterPropertiesSet() { - messageRequestProcessor.addHandler(CMD_TYPE, this); - } - - /** - * 处理消息 - * - * @param evt - * @param entity - * @return - */ - @Override - public void process(DeviceVideoEntity entity, RequestEvent evt) { - try { - log.info("接收到keepalive消息"); - // 判断RPort是否改变,改变则说明路由nat信息变化,修改设备信息 - // 获取到通信地址等信息 - ViaHeader viaHeader = (ViaHeader) evt.getRequest().getHeader(ViaHeader.NAME); - log.info("viaHeader:{}", JSON.toJSONString(viaHeader)); - String ip = viaHeader.getHost(); - int rPort = viaHeader.getRPort(); - // 解析本地地址替代 - if (ObjectUtils.isEmpty(ip) || rPort == -1) { - ip = viaHeader.getHost(); - rPort = viaHeader.getPort(); - } - log.info("port:{}",rPort); - if (entity.getPort() != rPort) { - entity.setPort(rPort); - entity.setHostAddress(ip.concat(":").concat(String.valueOf(rPort))); - } - entity.setKeepaliveTime(LocalDateTime.now()); - // 回复200 OK - responseAck(evt, Response.OK); - if (DeviceStatus.ONLINE.getValue().equals(entity.getStatus())) { - entity.setUpdateTime(LocalDateTime.now()); - deviceVideoService.updateById(entity); - }else { - // 对于已经离线的设备判断他的注册是否已经过期 - if (deviceVideoService.expire(entity)){ - deviceVideoService.online(entity); - } - } - } catch (SipException | InvalidArgumentException | ParseException e) { - e.printStackTrace(); - } - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java deleted file mode 100644 index 255e4c2..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.response; - - -import javax.sip.ResponseEvent; - -/** - * @Author: huise23 - * @Date: 2022/8/10 16:47 - * @Description: - */ -public interface ISipResponseProcessor { - void process(ResponseEvent evt); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java deleted file mode 100644 index 30e3a4e..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/ISipResponseProcessorAbstract.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.response; - -import org.springframework.beans.factory.InitializingBean; - -/** - * @Author: huise23 - * @Date: 2022/8/29 17:59 - * @Description: - */ -public abstract class ISipResponseProcessorAbstract implements InitializingBean, ISipResponseProcessor{ - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java deleted file mode 100644 index bb82e96..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/response/impl/InviteResponseProcessorImpl.java +++ /dev/null @@ -1 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.response.impl; import com.dite.znpt.monitor.sip.config.SipConfig; import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; import com.dite.znpt.monitor.sip.transmit.response.ISipResponseProcessorAbstract; import gov.nist.javax.sip.ResponseEventExt; import gov.nist.javax.sip.stack.SIPDialog; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.sdp.SdpFactory; import javax.sdp.SdpParseException; import javax.sdp.SessionDescription; import javax.sip.InvalidArgumentException; import javax.sip.ResponseEvent; import javax.sip.SipException; import javax.sip.SipFactory; import javax.sip.address.Address; import javax.sip.address.SipURI; import javax.sip.header.CSeqHeader; import javax.sip.message.Request; import javax.sip.message.Response; import java.text.ParseException; /** * @Description:处理INVITE响应 * @author: swwheihei * @date: 2020年5月3日 下午4:43:52 */ @Slf4j @Component public class InviteResponseProcessorImpl extends ISipResponseProcessorAbstract { private final String method = "INVITE"; @Resource private SipConfig sipConfig; @Resource private SipFactory sipFactory; @Resource private SipProcessorFactoryImpl sipProcessorFactory; @Override public void afterPropertiesSet(){ sipProcessorFactory.addResponseProcessor(method, this); } /** * 处理invite响应 * @param evt 响应消息 */ @Override public void process(ResponseEvent evt) { try { Response response = evt.getResponse(); int statusCode = response.getStatusCode(); // trying不会回复 if (statusCode == Response.TRYING) { } // 成功响应 // 下发ack if (statusCode == Response.OK) { ResponseEventExt event = (ResponseEventExt)evt; SIPDialog dialog = (SIPDialog)evt.getDialog(); CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); Request reqAck = dialog.createAck(cseq.getSeqNumber()); SipURI requestUri = (SipURI) reqAck.getRequestURI(); String contentString = new String(response.getRawContent()); // jainSip不支持y=字段, 移除以解析。 int ssrcIndex = contentString.indexOf("y="); // 检查是否有y字段 SessionDescription sdp; if (ssrcIndex >= 0) { //ssrc规定长度为10字节,不取余下长度以避免后续还有“f=”字段 String substring = contentString.substring(0, contentString.indexOf("y=")); sdp = SdpFactory.getInstance().createSessionDescription(substring); } else { sdp = SdpFactory.getInstance().createSessionDescription(contentString); } requestUri.setUser(sdp.getOrigin().getUsername()); requestUri.setHost(event.getRemoteIpAddress()); requestUri.setPort(event.getRemotePort()); reqAck.setRequestURI(requestUri); Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); reqAck.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); log.info("[invite回复ack] {}-> {}:{} ",requestUri, event.getRemoteIpAddress(), event.getRemotePort()); dialog.sendAck(reqAck); } } catch (InvalidArgumentException | SipException e) { e.printStackTrace(); } catch (ParseException e) { throw new RuntimeException(e); } catch (SdpParseException e) { throw new RuntimeException(e); } } } \ No newline at end of file diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java deleted file mode 100644 index 36e1201..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/ITimeoutProcessor.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.timeout; - -import javax.sip.TimeoutEvent; - -public interface ITimeoutProcessor { - void process(TimeoutEvent event); -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java b/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java deleted file mode 100644 index a750ef1..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/transmit/timeout/impl/TimeoutProcessorImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dite.znpt.monitor.sip.transmit.timeout.impl; - -import com.dite.znpt.monitor.sip.transmit.SipProcessorFactoryImpl; -import com.dite.znpt.monitor.sip.transmit.timeout.ITimeoutProcessor; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.sip.TimeoutEvent; -import javax.sip.header.CallIdHeader; - -/** - * @author huise23 - */ -@Component -public class TimeoutProcessorImpl implements InitializingBean, ITimeoutProcessor { - - @Autowired - private SipProcessorFactoryImpl sipProcessorFactory; - - - @Override - public void afterPropertiesSet() { - sipProcessorFactory.addTimeoutProcessor(this); - } - - @Override - public void process(TimeoutEvent event) { - CallIdHeader callIdHeader = event.getClientTransaction().getDialog().getCallId(); - String callId = callIdHeader.getCallId(); - // TODO - - } -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java deleted file mode 100644 index ce07ee5..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/DigestServerAuthenticationHelper.java +++ /dev/null @@ -1,210 +0,0 @@ -/* -* Conditions Of Use -* -* This software was developed by employees of the National Institute of -* Standards and Technology (NIST), an agency of the Federal Government. -* Pursuant to title 15 Untied States Code Section 105, works of NIST -* employees are not subject to copyright protection in the United States -* and are considered to be in the public domain. As a result, a formal -* license is not needed to use the software. -* -* This software is provided by NIST as a service and is expressly -* provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED -* OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT -* AND DATA ACCURACY. NIST does not warrant or make any representations -* regarding the use of the software or the results thereof, including but -* not limited to the correctness, accuracy, reliability or usefulness of -* the software. -* -* Permission to use this software is contingent upon your acceptance -* of the terms of this agreement -* -* . -* -*/ -package com.dite.znpt.monitor.sip.utils; - -import gov.nist.core.InternalErrorHandler; - -import javax.sip.address.URI; -import javax.sip.header.AuthorizationHeader; -import javax.sip.header.HeaderFactory; -import javax.sip.header.WWWAuthenticateHeader; -import javax.sip.message.Request; -import javax.sip.message.Response; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Date; -import java.util.Random; - -/** - * Implements the HTTP digest authentication method server side functionality. - * - * @author M. Ranganathan - * @author Marc Bednarek - */ - -public class DigestServerAuthenticationHelper { - - private MessageDigest messageDigest; - - public static final String DEFAULT_ALGORITHM = "MD5"; - public static final String DEFAULT_SCHEME = "Digest"; - - - - - /** to hex converter */ - private static final char[] toHex = { '0', '1', '2', '3', '4', '5', '6', - '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - - /** - * Default constructor. - * @throws NoSuchAlgorithmException - */ - public DigestServerAuthenticationHelper() - throws NoSuchAlgorithmException { - messageDigest = MessageDigest.getInstance(DEFAULT_ALGORITHM); - } - - public static String toHexString(byte b[]) { - int pos = 0; - char[] c = new char[b.length * 2]; - for (int i = 0; i < b.length; i++) { - c[pos++] = toHex[(b[i] >> 4) & 0x0F]; - c[pos++] = toHex[b[i] & 0x0f]; - } - return new String(c); - } - - /** - * Generate the challenge string. - * - * @return a generated nonce. - */ - private String generateNonce() { - // Get the time of day and run MD5 over it. - Date date = new Date(); - long time = date.getTime(); - Random rand = new Random(); - long pad = rand.nextLong(); - String nonceString = (new Long(time)).toString() - + (new Long(pad)).toString(); - byte mdbytes[] = messageDigest.digest(nonceString.getBytes()); - // Convert the mdbytes array into a hex string. - return toHexString(mdbytes); - } - - public Response generateChallenge(HeaderFactory headerFactory, Response response, String realm) { - try { - WWWAuthenticateHeader proxyAuthenticate = headerFactory - .createWWWAuthenticateHeader(DEFAULT_SCHEME); - proxyAuthenticate.setParameter("realm", realm); - proxyAuthenticate.setParameter("nonce", generateNonce()); - proxyAuthenticate.setParameter("opaque", ""); - proxyAuthenticate.setParameter("stale", "FALSE"); - proxyAuthenticate.setParameter("algorithm", DEFAULT_ALGORITHM); - response.setHeader(proxyAuthenticate); - } catch (Exception ex) { - InternalErrorHandler.handleException(ex); - } - return response; - } - /** - * Authenticate the inbound request. - * - * @param request - the request to authenticate. - * @param hashedPassword -- the MD5 hashed string of username:realm:plaintext password. - * - * @return true if authentication succeded and false otherwise. - */ - public boolean doAuthenticateHashedPassword(Request request, String hashedPassword) { - AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - if ( authHeader == null ) return false; - String realm = authHeader.getRealm(); - String username = authHeader.getUsername(); - - if ( username == null || realm == null ) { - return false; - } - - String nonce = authHeader.getNonce(); - URI uri = authHeader.getURI(); - if (uri == null) { - return false; - } - - - - String A2 = request.getMethod().toUpperCase() + ":" + uri.toString(); - String HA1 = hashedPassword; - - - byte[] mdbytes = messageDigest.digest(A2.getBytes()); - String HA2 = toHexString(mdbytes); - - String cnonce = authHeader.getCNonce(); - String KD = HA1 + ":" + nonce; - if (cnonce != null) { - KD += ":" + cnonce; - } - KD += ":" + HA2; - mdbytes = messageDigest.digest(KD.getBytes()); - String mdString = toHexString(mdbytes); - String response = authHeader.getResponse(); - - - return mdString.equals(response); - } - - /** - * Authenticate the inbound request given plain text password. - * - * @param request - the request to authenticate. - * @param pass -- the plain text password. - * - * @return true if authentication succeded and false otherwise. - */ - public boolean doAuthenticatePlainTextPassword(Request request, String pass) { - AuthorizationHeader authHeader = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME); - if ( authHeader == null ) return false; - String realm = authHeader.getRealm(); - String username = authHeader.getUsername(); - - - if ( username == null || realm == null ) { - return false; - } - - - String nonce = authHeader.getNonce(); - URI uri = authHeader.getURI(); - if (uri == null) { - return false; - } - - - String A1 = username + ":" + realm + ":" + pass; - String A2 = request.getMethod().toUpperCase() + ":" + uri.toString(); - byte mdbytes[] = messageDigest.digest(A1.getBytes()); - String HA1 = toHexString(mdbytes); - - - mdbytes = messageDigest.digest(A2.getBytes()); - String HA2 = toHexString(mdbytes); - - String cnonce = authHeader.getCNonce(); - String KD = HA1 + ":" + nonce; - if (cnonce != null) { - KD += ":" + cnonce; - } - KD += ":" + HA2; - mdbytes = messageDigest.digest(KD.getBytes()); - String mdString = toHexString(mdbytes); - String response = authHeader.getResponse(); - return mdString.equals(response); - - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java b/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java deleted file mode 100644 index 934490a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/utils/XmlUtil.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.dite.znpt.monitor.sip.utils; - -import lombok.extern.slf4j.Slf4j; -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import java.io.StringReader; -import java.util.*; - -/** - * 基于dom4j的工具包 - * - * - */ -@Slf4j -public class XmlUtil -{ - /** - * 解析XML为Document对象 - * - * @param xml 被解析的XMl - * @return Document - */ - public static Element parseXml(String xml){ - Document document = null; - // - StringReader sr = new StringReader(xml); - SAXReader saxReader = new SAXReader(); - try{ - document = saxReader.read(sr); - }catch (DocumentException e){ - log.error("解析失败", e); - } - return null == document ? null : document.getRootElement(); - } - - /** - * 获取element对象的text的值 - * - * @param em 节点的对象 - * @param tag 节点的tag - * @return 节点 - */ - public static String getText(Element em, String tag){ - if (null == em){ - return null; - } - Element e = em.element(tag); - // - return null == e ? null : e.getText(); - } - - /** - * 递归解析xml节点,适用于 多节点数据 - * - * @param node node - * @param nodeName nodeName - * @return List> - */ - public static List> listNodes(Element node, String nodeName){ - if (null == node){ - return null; - } - // 初始化返回 - List> listMap = new ArrayList>(); - // 首先获取当前节点的所有属性节点 - List list = node.attributes(); - - Map map = null; - // 遍历属性节点 - for (Attribute attribute : list){ - if (nodeName.equals(node.getName())){ - if (null == map){ - map = new HashMap(); - listMap.add(map); - } - // 取到的节点属性放到map中 - map.put(attribute.getName(), attribute.getValue()); - } - - } - // 遍历当前节点下的所有节点 ,nodeName 要解析的节点名称 - // 使用递归 - Iterator iterator = node.elementIterator(); - while (iterator.hasNext()){ - Element e = iterator.next(); - listMap.addAll(listNodes(e, nodeName)); - } - return listMap; - } - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java deleted file mode 100644 index 59023bb..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceAlarmVo.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -@Data -public class DeviceAlarmVo { - - /** - * 设备Id - */ - private String deviceId; - - /** - * 报警级别, 1为一级警情, 2为二级警情, 3为三级警情, 4为四级 警情- - */ - private String alarmPriorit; - - /** - * 报警方式 , 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警, - * 7其他报警;可以为直接组合如12为电话报警或 设备报警- - */ - private String alarmMethod; - - /** - * 报警时间 - */ - private String alarmTime; - - /** - * 报警内容描述 - */ - private String alarmDescription; - - /** - * 经度 - */ - private double longitude; - - /** - * 纬度 - */ - private double latitude; - - /** - * 报警类型 - */ - private String alarmType; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java deleted file mode 100644 index 4e56103..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceChannelVo.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -@Data -public class DeviceChannelVo { - - /** - * 通道id - */ - private String channelId; - - /** - * 通道名 - */ - private String name; - - /** - * 生产厂商 - */ - private String manufacture; - - /** - * 型号 - */ - private String model; - - /** - * 设备归属 - */ - private String owner; - - /** - * 行政区域 - */ - private String civilCode; - - /** - * 警区 - */ - private String block; - - /** - * 安装地址 - */ - private String address; - - /** - * 是否有子设备 1有, 0没有 - */ - private int parental; - - /** - * 父级id - */ - private String parentId; - - /** - * 信令安全模式 缺省为0; 0:不采用; 2: S/MIME签名方式; 3: S/ MIME加密签名同时采用方式; 4:数字摘要方式 - */ - private int safetyWay; - - /** - * 注册方式 缺省为1;1:符合IETFRFC3261标准的认证注册模 式; 2:基于口令的双向认证注册模式; 3:基于数字证书的双向认证注册模式 - */ - private int registerWay; - - /** - * 证书序列号 - */ - private String certNum; - - /** - * 证书有效标识 缺省为0;证书有效标识:0:无效1: 有效 - */ - private int certifiable; - - /** - * 证书无效原因码 - */ - private int errCode; - - /** - * 证书终止有效期 - */ - private String endTime; - - /** - * 保密属性 缺省为0; 0:不涉密, 1:涉密 - */ - private String secrecy; - - /** - * IP地址 - */ - private String ipAddress; - - /** - * 端口号 - */ - private int port; - - /** - * 密码 - */ - private String password; - - /** - * 在线/离线 - * 1在线,0离线 - * 默认在线 - * 信令: - * ON - * OFF - * 遇到过NVR下的IPC下发信令可以推流, 但是 Status 响应 OFF - */ - private int status; - - /** - * 经度 - */ - private double longitude; - - /** - * 纬度 - */ - private double latitude; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java deleted file mode 100644 index 6e7f47b..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/DeviceVo.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -import java.util.Map; - -@Data -public class DeviceVo { - - /** - * 设备Id - */ - private String deviceId; - - /** - * 设备名 - */ - private String name; - - /** - * 生产厂商 - */ - private String manufacturer; - - /** - * 型号 - */ - private String model; - - /** - * 固件版本 - */ - private String firmware; - - /** - * 传输协议 - * UDP/TCP - */ - private String transport; - - /** - * wan地址 - */ - private HostVo hostVo; - - /** - * 在线 - */ - private int online; - - /** - * 通道列表 - */ - private Map channelMap; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java deleted file mode 100644 index fdda095..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/HostVo.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -@Data -public class HostVo { - - private String ip; - private int port; - private String address; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java deleted file mode 100644 index a9111b0..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordItemVo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -/** - * @Description:设备录像 - * @author: - * @date: - */ -@Data -public class RecordItemVo { - - private String deviceId; - - private String name; - - private String filePath; - - private String address; - - private String startTime; - - private String endTime; - - private int secrecy; - - private String type; - - private String recorderId; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java b/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java deleted file mode 100644 index f2ba518..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/sip/vo/RecordVo.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dite.znpt.monitor.sip.vo; - -import lombok.Data; - -import java.util.List; - -/** - * @Description:设备录像信息 - * @author: - * @date: - */ -@Data -public class RecordVo { - - private String deviceId; - - private String name; - - private int sumNum; - - private List recordItemVoList; - -} diff --git a/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java b/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java deleted file mode 100644 index d50f84a..0000000 --- a/sip/src/main/java/com/dite/znpt/monitor/utils/DictUtils.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dite.znpt.monitor.utils; - -import com.dite.znpt.monitor.constant.dict.ValueAndLabel; - -import java.util.Arrays; - -/** - * 字典工具类 - * - * @author huise23 - * @since 2023-07-28 15:38:41 - */ -public class DictUtils { - - /** - * 通用方法,根据传入的枚举类和value返回对应的label值 - * - * @param enumClass 枚举类 - * @param value 值 - * @return {@link String } - * @author huise23 - * @since 2023-07-28 15:40:07 - */ - public static & ValueAndLabel> String getDictLabel(Class enumClass, String value) { - final String label = Arrays.stream(enumClass.getEnumConstants()) - .filter(enumItem -> enumItem.getValue().equals(value)) - .map(t->t.getLabel()) - .findFirst() - .orElse(null); - return label; - } - -} diff --git a/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml b/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml deleted file mode 100644 index c43f856..0000000 --- a/sip/src/main/resources/mapper/iot/DeviceVideoChannelMapper.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - dvc.channel_id, dvc.channel_code, dvc.channel_name, dvc.address, dvc.camera_type, dvc.ptz_control, dvc.status, dvc.remark - - - - - - - - - - - - - - diff --git a/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml b/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml deleted file mode 100644 index b0820c3..0000000 --- a/sip/src/main/resources/mapper/iot/DeviceVideoMapper.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - dv.video_id, dv.video_code, dv.video_name, dv.transport, dv.stream_mode, dv.channel_count, dv.status, dv.register_time, - dv.keepalive_time, dv.channel_count, dv.ip, dv.port,dv.host_address, dv.manufacturer, dv.remark, dv.create_time - - - - - - diff --git a/sip/src/main/resources/mapper/iot/IpConfigMapper.xml b/sip/src/main/resources/mapper/iot/IpConfigMapper.xml deleted file mode 100644 index 339afe7..0000000 --- a/sip/src/main/resources/mapper/iot/IpConfigMapper.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - ic.config_id, ic.ip - - - - - diff --git a/web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java b/web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java new file mode 100644 index 0000000..67892d5 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java @@ -0,0 +1,79 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.TrainingPlanListReq; +import com.dite.znpt.domain.vo.TrainingPlanReq; +import com.dite.znpt.service.TrainingPlanService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * @author huise23 + * @date 2025/01/01 00:00 + * @Description: 培训计划控制器 + */ +@Api(tags = "培训..........................................计划管理") +@RestController +@RequestMapping("/training/plan") +public class TrainingPlanController { + + @Resource + private TrainingPlanService trainingPlanService; + + @ApiOperation(value = "分页查询培训计划列表", httpMethod = "GET") + @GetMapping("/page") + public Result page(TrainingPlanListReq req) { + return Result.ok(trainingPlanService.page(req)); + } + + @ApiOperation(value = "查询培训计划列表", httpMethod = "GET") + @GetMapping("/list") + public Result list(TrainingPlanListReq req) { + return Result.ok(trainingPlanService.list(req)); + } + + @ApiOperation(value = "查询培训计划详情", httpMethod = "GET") + @GetMapping("/detail/{planId}") + public Result detail(@PathVariable String planId) { + return Result.ok(trainingPlanService.detail(planId)); + } + + @ApiOperation(value = "新增培训计划", httpMethod = "POST") + @PostMapping + public Result save(@Valid @RequestBody TrainingPlanReq req) { + trainingPlanService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "更新培训计划", httpMethod = "PUT") + @PutMapping("/{planId}") + public Result update(@PathVariable String planId, @Valid @RequestBody TrainingPlanReq req) { + trainingPlanService.update(planId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除培训计划", httpMethod = "DELETE") + @DeleteMapping("/{planId}") + public Result delete(@PathVariable String planId) { + trainingPlanService.deleteById(planId); + return Result.ok(); + } + + @ApiOperation(value = "发布培训计划", httpMethod = "PUT") + @PutMapping("/{planId}/publish") + public Result publish(@PathVariable String planId) { + trainingPlanService.publish(planId); + return Result.ok(); + } + + @ApiOperation(value = "取消培训计划", httpMethod = "PUT") + @PutMapping("/{planId}/cancel") + public Result cancel(@PathVariable String planId) { + trainingPlanService.cancel(planId); + return Result.ok(); + } +} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java index 2eef147..e69de29 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java @@ -1,188 +0,0 @@ -package com.dite.znpt.web.controller; - -import cn.hutool.core.bean.BeanUtil; -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.monitor.constant.IotRespMessage; -import com.dite.znpt.monitor.constant.dict.DeviceStatus; -import com.dite.znpt.monitor.constant.dict.SipTransferMode; -import com.dite.znpt.monitor.constant.dict.StreamTransferMode; -import com.dite.znpt.monitor.domain.entity.DeviceVideoEntity; -import com.dite.znpt.monitor.domain.req.MonitorConfigAddReq; -import com.dite.znpt.monitor.domain.resp.DeviceVideoResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoChannelListResp; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoEditReq; -import com.dite.znpt.monitor.domain.vo.video.DeviceVideoListResp; -import com.dite.znpt.monitor.media.zlm.config.StreamMediaServerConfig; -import com.dite.znpt.monitor.service.DeviceVideoChannelService; -import com.dite.znpt.monitor.service.DeviceVideoService; -import com.dite.znpt.monitor.service.IpConfigService; -import com.dite.znpt.monitor.sip.config.SipConfig; -import com.dite.znpt.monitor.sip.transmit.cmd.ISipDeviceCommander; -import com.dite.znpt.monitor.utils.DictUtils; -import com.dite.znpt.util.PageUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; - -/** - * @Author: huise23 - * @Date: 2022/8/8 10:39 - * @Description: - */ -@Api(tags = "视频管理") -@RestController -@RequestMapping("/monitoring/video") -public class VideoController { - - @Resource - private SipConfig sipConfig; - - @Resource - private StreamMediaServerConfig streamMediaServerConfigService; - - @Resource - private DeviceVideoService deviceVideoService; - - @Resource - private IpConfigService ipConfigService; - - @Resource - private DeviceVideoChannelService deviceVideoChannelService; - - @Resource - private ISipDeviceCommander sipDeviceCommander; - - @ApiOperation(value = "获取信令服务器配置信息", notes = "iot:video:sip:view", httpMethod = "GET") - @GetMapping("/sipServerConfig") - public Result getSipServerConfig(){ - return Result.ok(BeanUtil.copyProperties(sipConfig, SipConfig.class)); - } - - @ApiOperation(value = "获取流媒体服务配置信息", notes = "iot:video:media:view", httpMethod = "GET") - @GetMapping("/streamMediaServerConfig") - public Result getStreamMediaServerConfig(){ - return Result.ok(BeanUtil.copyProperties(streamMediaServerConfigService, StreamMediaServerConfig.class)); - } - - @ApiOperation(value = "查询监控IP配置列表", notes = "iot:config:list", httpMethod = "GET") - @GetMapping("/config/list") - public Result> configList(){ - PageUtil.startPage(); - return Result.ok(ipConfigService.configList()); - } - - @ApiOperation(value = "配置监控IP列表,每次全量传ip列表", notes = "iot:config:add", httpMethod = "POST") - @PostMapping("/config/add") - public Result configAdd(@RequestBody MonitorConfigAddReq req){ - ipConfigService.configAdd(req); - return Result.ok(); - } - - @ApiOperation(value = "分页查询视频设备列表", notes = "iot:video:list", httpMethod = "GET") - @GetMapping("/device/page") - public PageResult pageDevice( - @RequestParam(value = "status", required = false) String status, - @RequestParam(value = "keyword", required = false) String keyword, - @RequestParam(value = "hostAddress", required = false) String hostAddress){ - PageUtil.startPage(); - return deviceVideoService.selectDeviceVideoList(status, keyword,hostAddress); - } - - @ApiOperation(value = "查看视频设备数量", notes = "iot:video:list", httpMethod = "GET") - @GetMapping("/device/count") - public Result countDevice(){ - return Result.ok(deviceVideoService.countDeviceVideoNum()); - } - - @ApiOperation(value = "查看视频设备详情", notes = "iot:video:view", httpMethod = "GET") - @GetMapping("/device/{videoId}") - public Result viewDevice(@PathVariable("videoId") Long videoId){ - final DeviceVideoEntity entity = deviceVideoService.getById(videoId); - final DeviceVideoResp resp = BeanUtil.copyProperties(entity, DeviceVideoResp.class); - resp.setStatusLabel(DictUtils.getDictLabel(DeviceStatus.class, resp.getStatus())); - resp.setStreamModeLabel(DictUtils.getDictLabel(StreamTransferMode.class, resp.getStreamMode())); - resp.setTransportLabel(DictUtils.getDictLabel(SipTransferMode.class, resp.getTransport())); - return Result.ok(resp); - } - - @ApiOperation(value = "编辑视频设备", notes = "iot:video:edit", httpMethod = "PUT") - @PutMapping("/device/{videoId}") - public Result editDevice(@PathVariable("videoId") Long videoId, @RequestBody DeviceVideoEditReq req){ - deviceVideoService.editDeviceVideo(videoId, req); - return Result.ok(); - } - - @ApiOperation(value = "更新视频设备", notes = "iot:video:sync", httpMethod = "PUT") - @PutMapping("/device/sync/{videoId}") - public Result syncDevice(@PathVariable("videoId") Long videoId){ - DeviceVideoEntity entity = deviceVideoService.getById(videoId); - if(DeviceStatus.ONLINE.getValue().equals(entity.getStatus())){ - sipDeviceCommander.queryCatalog(entity); - return Result.ok(); - }else { - return Result.error(IotRespMessage.DEVICE_VIDEO_CANNOT_SYNC); - } - } - - @ApiOperation(value = "删除视频设备", notes = "iot:video:delete", httpMethod = "DELETE") - @DeleteMapping("/device/{videoId}") - public Result deleteDevice(@PathVariable("videoId") Long videoId){ - return deviceVideoService.removeByVideoId(videoId); - } - - @ApiOperation(value = "分页查询视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") - @GetMapping("/channel/page/{videoId}") - public PageResult pageChannel(@PathVariable("videoId") Long videoId, @RequestParam(value = "keyword", required = false) String keyword){ - return deviceVideoChannelService.selectDeviceVideoChannel(videoId, keyword); - } - - @ApiOperation(value = "分页查询所有视频通道列表", notes = "iot:video:channel:list", httpMethod = "GET") - @GetMapping("/channel/page") - public PageResult pageAllChannel(@RequestParam(value = "keyword", required = false) String keyword){ - return deviceVideoChannelService.selectAllDeviceVideoChannel(keyword); - } - - @ApiOperation(value = "查看视频通道", notes = "iot:video:channel:view", httpMethod = "GET") - @GetMapping("/channel/{channelCode}") - public Result viewChannel(@PathVariable("channelCode") String channelCode){ - return Result.ok(deviceVideoChannelService.getDeviceVideoChannelDetail(channelCode)); - } - - @ApiOperation(value = "编辑视频通道", notes = "iot:video:channel:edit", httpMethod = "PUT") - @PutMapping("/channel/{channelId}") - public Result editChannel(@PathVariable("channelId") Long channelId, @RequestBody DeviceVideoChannelEditReq req){ - deviceVideoChannelService.editDeviceVideoChannel(channelId, req); - return Result.ok(); - } - - @ApiOperation(value = "删除视频通道", notes = "iot:video:channel:delete", httpMethod = "DELETE") - @DeleteMapping("/channel/{channelId}") - public Result deleteChannel(@PathVariable("channelId") Long channelId){ - return deviceVideoChannelService.removeByChannelIds(Arrays.asList(channelId)); - } - - @ApiOperation(value = "播放直播视频", notes = "iot:video:play", httpMethod = "GET") - @GetMapping("/play/live/{channelCode}") - public Result play(@PathVariable("channelCode") String channelCode){ - return Result.ok(deviceVideoChannelService.play(channelCode)); - } - - @ApiOperation(value = "查询视频设备是否在线", notes = "iot:video:isOnline", httpMethod = "GET") - @GetMapping("/channel/isOnline/{channelCode}") - public Result isOnline(@PathVariable("channelCode") String channelCode){ - return Result.ok(deviceVideoChannelService.isOnline(channelCode)); - } - - @ApiOperation(value = "停止播放直播", notes = "iot:video:stop", httpMethod = "GET") - @GetMapping("/stop/live/{channelCode}") - public Result stop(@PathVariable("channelCode") String channelCode){ - deviceVideoChannelService.stop(channelCode); - return Result.ok(); - } -} diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index b21b663..1d8c3aa 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -8,7 +8,7 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://39.99.201.243:3306/znpt_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://39.99.201.243:3306/test01?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: BUw8YW6%@^8q druid: From 72af3aa203ea5069d2ec81c0202d790bd8a595c8 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Wed, 30 Jul 2025 16:17:42 +0800 Subject: [PATCH 07/38] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=B6=E5=BA=A6?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95=E5=B7=B2=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/dto/RegulationConfirmDTO.java | 6 +- .../entity/RegulationConfirmationEntity.java | 34 +-- .../znpt/domain/entity/RegulationEntity.java | 10 - .../RegulationConfirmationService.java | 56 +---- .../dite/znpt/service/RegulationService.java | 11 +- .../RegulationConfirmationServiceImpl.java | 170 +-------------- .../service/impl/RegulationServiceImpl.java | 87 ++++---- doc/regulation_api_test.md | 202 +----------------- doc/regulation_tables.sql | 67 +++--- doc/regulation_test_data.sql | 18 +- .../web/controller/RegulationController.java | 11 +- 11 files changed, 88 insertions(+), 584 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java index 3cd0cd2..63b99e1 100644 --- a/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java +++ b/core/src/main/java/com/dite/znpt/domain/dto/RegulationConfirmDTO.java @@ -1,6 +1,8 @@ package com.dite.znpt.domain.dto; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; /** * 制度确认DTO @@ -8,7 +10,9 @@ import lombok.Data; * @date 2025/07/29 */ @Data +@NoArgsConstructor +@AllArgsConstructor public class RegulationConfirmDTO { - private Boolean agreeTerms; // 是否同意条款 + private Boolean agreeTerms = true; // 是否同意条款,默认为true } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java index 1787517..aad8e25 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationConfirmationEntity.java @@ -20,7 +20,7 @@ import java.time.LocalDateTime; @EqualsAndHashCode(callSuper = false) @TableName("regulation_confirmation") @ApiModel(value="RegulationConfirmationEntity对象", description="制度确认") -public class RegulationConfirmationEntity extends AuditableEntity implements Serializable { +public class RegulationConfirmationEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -34,11 +34,6 @@ public class RegulationConfirmationEntity extends AuditableEntity implements Ser @TableField("regulation_id") private String regulationId; - @ExcelProperty("制度标题") - @ApiModelProperty("制度标题") - @TableField("regulation_title") - private String regulationTitle; - @ExcelProperty("确认人ID") @ApiModelProperty("确认人ID") @TableField("confirmer_id") @@ -55,7 +50,7 @@ public class RegulationConfirmationEntity extends AuditableEntity implements Ser private String confirmerDept; @ExcelProperty("确认状态") - @ApiModelProperty("确认状态:PENDING-待确认,CONFIRMED-已确认,DECLINED-已拒绝") + @ApiModelProperty("确认状态:CONFIRMED-已确认") @TableField("status") private String status; @@ -64,31 +59,6 @@ public class RegulationConfirmationEntity extends AuditableEntity implements Ser @TableField("confirm_time") private LocalDateTime confirmTime; - @ExcelProperty("确认意见") - @ApiModelProperty("确认意见") - @TableField("confirm_comment") - private String confirmComment; - - @ExcelProperty("阅读时长(秒)") - @ApiModelProperty("阅读时长(秒)") - @TableField("read_duration") - private Integer readDuration; - - @ExcelProperty("IP地址") - @ApiModelProperty("IP地址") - @TableField("ip_address") - private String ipAddress; - - @ExcelProperty("用户代理") - @ApiModelProperty("用户代理") - @TableField("user_agent") - private String userAgent; - - @ExcelProperty("备注") - @ApiModelProperty("备注") - @TableField("remark") - private String remark; - @ExcelProperty("删除标志(0代表存在,1代表删除)") @ApiModelProperty("删除标志(0代表存在,1代表删除)") @TableField("del_flag") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java index 8d305b4..00f93ac 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java @@ -49,16 +49,6 @@ public class RegulationEntity extends AuditableEntity implements Serializable { @TableField("status") private String status; - @ExcelProperty("发布人ID") - @ApiModelProperty("发布人ID") - @TableField("publisher_id") - private String publisherId; - - @ExcelProperty("发布人姓名") - @ApiModelProperty("发布人姓名") - @TableField("publisher_name") - private String publisherName; - @ExcelProperty("发布时间") @ApiModelProperty("发布时间") @TableField("publish_time") diff --git a/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java b/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java index 1654993..f92847b 100644 --- a/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java +++ b/core/src/main/java/com/dite/znpt/service/RegulationConfirmationService.java @@ -2,7 +2,6 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.RegulationConfirmationEntity; -import com.dite.znpt.domain.Result; /** * @author wangna @@ -10,57 +9,6 @@ import com.dite.znpt.domain.Result; * @Description: 制度确认Service接口 */ public interface RegulationConfirmationService extends IService { - - /** - * 确认制度 - * @param confirmation 确认信息 - * @return 结果 - */ - Result confirmRegulation(RegulationConfirmationEntity confirmation); - - /** - * 获取确认记录 - * @param regulationId 制度ID - * @return 结果 - */ - Result getConfirmationRecords(String regulationId); - - /** - * 获取用户确认记录 - * @param confirmerId 确认人ID - * @param regulationId 制度ID - * @return 结果 - */ - Result getUserConfirmationRecord(String confirmerId, String regulationId); - - /** - * 取消确认 - * @param confirmationId 确认ID - * @return 结果 - */ - Result cancelConfirmation(String confirmationId); - - /** - * 获取确认统计 - * @param regulationId 制度ID - * @return 结果 - */ - Result getConfirmationStatistics(String regulationId); - - /** - * 批量创建确认任务 - * @param regulationId 制度ID - * @param userIds 用户ID列表 - * @return 结果 - */ - Result createConfirmationTasks(String regulationId, String[] userIds); - - /** - * 获取待确认列表 - * @param confirmerId 确认人ID - * @param page 页码 - * @param pageSize 页大小 - * @return 结果 - */ - Result getPendingConfirmations(String confirmerId, Integer page, Integer pageSize); + // 继承自IService的方法已经足够使用 + // 包括:save, update, remove, list, page, lambdaQuery等 } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationService.java b/core/src/main/java/com/dite/znpt/service/RegulationService.java index 5ad0ae0..27a9f90 100644 --- a/core/src/main/java/com/dite/znpt/service/RegulationService.java +++ b/core/src/main/java/com/dite/znpt/service/RegulationService.java @@ -29,13 +29,6 @@ public interface RegulationService extends IService { */ Result createRegulationProposal(RegulationEntity regulation); - /** - * 更新制度提案 - * @param regulation 制度信息 - * @return 结果 - */ - Result updateRegulationProposal(RegulationEntity regulation); - /** * 获取制度详情 * @param regulationId 制度ID @@ -46,9 +39,7 @@ public interface RegulationService extends IService { /** * 确认制度知晓 * @param regulationId 制度ID - * @param confirm 确认信息 * @return 结果 */ - Result confirmRegulation(String regulationId, RegulationConfirmDTO confirm); - + Result confirmRegulation(String regulationId); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java index bf5385a..c153e8f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationConfirmationServiceImpl.java @@ -1,19 +1,10 @@ package com.dite.znpt.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.RegulationConfirmationEntity; import com.dite.znpt.mapper.RegulationConfirmationMapper; import com.dite.znpt.service.RegulationConfirmationService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; /** * @author wangna @@ -21,164 +12,7 @@ import java.util.Map; * @Description: 制度确认服务实现类 */ @Service -@RequiredArgsConstructor public class RegulationConfirmationServiceImpl extends ServiceImpl implements RegulationConfirmationService { - - @Override - @Transactional(rollbackFor = Exception.class) - public Result confirmRegulation(RegulationConfirmationEntity confirmation) { - try { - // 检查是否已经确认 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationConfirmationEntity::getConfirmerId, confirmation.getConfirmerId()) - .eq(RegulationConfirmationEntity::getRegulationId, confirmation.getRegulationId()) - .eq(RegulationConfirmationEntity::getDelFlag, "0"); - - RegulationConfirmationEntity existingConfirmation = this.getOne(wrapper); - if (existingConfirmation != null) { - return Result.error("您已经确认过该制度"); - } - - confirmation.setConfirmTime(LocalDateTime.now()); - confirmation.setDelFlag("0"); - this.save(confirmation); - return Result.ok("制度确认成功"); - } catch (Exception e) { - return Result.error("制度确认失败:" + e.getMessage()); - } - } - - @Override - public Result getConfirmationRecords(String regulationId) { - try { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationConfirmationEntity::getRegulationId, regulationId) - .eq(RegulationConfirmationEntity::getDelFlag, "0") - .orderByDesc(RegulationConfirmationEntity::getConfirmTime); - - List confirmations = this.list(wrapper); - return Result.ok(confirmations); - } catch (Exception e) { - return Result.error("获取确认记录失败:" + e.getMessage()); - } - } - - @Override - public Result getUserConfirmationRecord(String confirmerId, String regulationId) { - try { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationConfirmationEntity::getConfirmerId, confirmerId) - .eq(RegulationConfirmationEntity::getRegulationId, regulationId) - .eq(RegulationConfirmationEntity::getDelFlag, "0"); - - RegulationConfirmationEntity confirmation = this.getOne(wrapper); - return Result.ok(confirmation); - } catch (Exception e) { - return Result.error("获取用户确认记录失败:" + e.getMessage()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Result cancelConfirmation(String confirmationId) { - try { - RegulationConfirmationEntity confirmation = this.getById(confirmationId); - if (confirmation == null) { - return Result.error("确认记录不存在"); - } - - confirmation.setDelFlag("1"); - this.updateById(confirmation); - return Result.ok("确认取消成功"); - } catch (Exception e) { - return Result.error("确认取消失败:" + e.getMessage()); - } - } - - @Override - public Result getConfirmationStatistics(String regulationId) { - try { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationConfirmationEntity::getRegulationId, regulationId) - .eq(RegulationConfirmationEntity::getDelFlag, "0"); - - List confirmations = this.list(wrapper); - - int confirmedCount = 0; - int declinedCount = 0; - int pendingCount = 0; - - for (RegulationConfirmationEntity confirmation : confirmations) { - switch (confirmation.getStatus()) { - case "CONFIRMED": - confirmedCount++; - break; - case "DECLINED": - declinedCount++; - break; - case "PENDING": - pendingCount++; - break; - } - } - - int totalConfirmations = confirmedCount + declinedCount + pendingCount; - double confirmRate = totalConfirmations > 0 ? (double) confirmedCount / totalConfirmations * 100 : 0; - - return Result.okM(Map.of( - "regulationId", regulationId, - "totalConfirmations", totalConfirmations, - "confirmedCount", confirmedCount, - "declinedCount", declinedCount, - "pendingCount", pendingCount, - "confirmRate", confirmRate - ), "确认统计"); - } catch (Exception e) { - return Result.error("获取确认统计失败:" + e.getMessage()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Result createConfirmationTasks(String regulationId, String[] userIds) { - try { - for (String userId : userIds) { - // 检查是否已经存在确认任务 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationConfirmationEntity::getConfirmerId, userId) - .eq(RegulationConfirmationEntity::getRegulationId, regulationId) - .eq(RegulationConfirmationEntity::getDelFlag, "0"); - - RegulationConfirmationEntity existingTask = this.getOne(wrapper); - if (existingTask == null) { - RegulationConfirmationEntity task = new RegulationConfirmationEntity(); - task.setRegulationId(regulationId); - task.setConfirmerId(userId); - task.setStatus("PENDING"); - task.setDelFlag("0"); - this.save(task); - } - } - return Result.okM("确认任务创建成功"); - } catch (Exception e) { - return Result.error("确认任务创建失败:" + e.getMessage()); - } - } - - @Override - public Result getPendingConfirmations(String confirmerId, Integer page, Integer pageSize) { - try { - Page pageParam = new Page<>(page, pageSize); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationConfirmationEntity::getConfirmerId, confirmerId) - .eq(RegulationConfirmationEntity::getStatus, "PENDING") - .eq(RegulationConfirmationEntity::getDelFlag, "0") - .orderByDesc(RegulationConfirmationEntity::getCreateTime); - - Page result = this.page(pageParam, wrapper); - return Result.ok(result); - } catch (Exception e) { - return Result.error("获取待确认列表失败:" + e.getMessage()); - } - } + // 继承自ServiceImpl的方法已经足够使用 + // 包括:save, update, remove, list, page, lambdaQuery等 } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java index 868576a..82d1442 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java @@ -1,5 +1,6 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -12,15 +13,10 @@ import com.dite.znpt.mapper.RegulationMapper; import com.dite.znpt.service.RegulationService; import com.dite.znpt.service.RegulationConfirmationService; import com.dite.znpt.service.UserService; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.dite.znpt.mapper.RegulationDraftMapper; -import com.dite.znpt.domain.entity.RegulationDraftEntity; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.beans.factory.annotation.Autowired; -import java.util.List; import java.time.LocalDateTime; /** @@ -34,8 +30,10 @@ public class RegulationServiceImpl extends ServiceImpl drafts = regulationDraftMapper.selectList( - new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() - .eq(RegulationDraftEntity::getStatus, "DRAFT") - .le(RegulationDraftEntity::getCreateTime, tenDaysAgo) - ); - for (RegulationDraftEntity draft : drafts) { + + // 查询需要自动发布的制度(状态为DRAFT且创建时间超过10天) + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(RegulationEntity::getStatus, "DRAFT"); + wrapper.le(RegulationEntity::getCreateTime, tenDaysAgo); + wrapper.eq(RegulationEntity::getDelFlag, "0"); + + java.util.List drafts = this.list(wrapper); + + for (RegulationEntity draft : drafts) { + // 更新制度状态和发布信息 draft.setStatus("PUBLISHED"); - regulationDraftMapper.updateById(draft); + draft.setPublishTime(LocalDateTime.now()); + draft.setEffectiveTime(LocalDateTime.now()); // 设置生效时间为当前时间 + draft.setUpdateTime(LocalDateTime.now()); + draft.setUpdateBy("系统自动发布"); + + this.updateById(draft); + } + + if (!drafts.isEmpty()) { + System.out.println("自动发布完成,共发布 " + drafts.size() + " 个制度"); } - } - - public RegulationServiceImpl(RegulationConfirmationService regulationConfirmationService, UserService userService) { - this.regulationConfirmationService = regulationConfirmationService; - this.userService = userService; } @Override @@ -78,7 +85,7 @@ public class RegulationServiceImpl extends ServiceImpl confirmedIds = regulationConfirmationService.lambdaQuery() .eq(RegulationConfirmationEntity::getConfirmerId, userId) .eq(RegulationConfirmationEntity::getStatus, "CONFIRMED") @@ -105,9 +112,12 @@ public class RegulationServiceImpl extends ServiceImpl Date: Thu, 31 Jul 2025 15:04:46 +0800 Subject: [PATCH 08/38] =?UTF-8?q?=E5=88=B6=E5=BA=A6=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=8C=89=E9=9C=80=E6=B1=82=E4=BF=AE=E6=94=B9=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E4=B8=94=E9=80=9A=E8=BF=87=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/RegulationEntity.java | 6 +- .../znpt/mapper/RegulationDraftMapper.java | 12 -- .../dite/znpt/mapper/RegulationMapper.java | 13 ++ .../znpt/mapper/RegulationTypeMapper.java | 24 +++ .../dite/znpt/service/RegulationService.java | 22 ++- .../znpt/service/RegulationTypeService.java | 43 +++++ .../dite/znpt/service/RoleMenuService.java | 2 - .../service/impl/RegulationServiceImpl.java | 162 ++++++++++++++---- .../impl/RegulationTypeServiceImpl.java | 125 ++++++++++++++ .../web/controller/RegulationController.java | 25 ++- .../controller/RegulationTypeController.java | 50 ++++++ 11 files changed, 436 insertions(+), 48 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/RegulationTypeService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java index 00f93ac..25f144f 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java @@ -45,7 +45,7 @@ public class RegulationEntity extends AuditableEntity implements Serializable { private String regulationType; @ExcelProperty("制度状态") - @ApiModelProperty("制度状态:DRAFT-草案,PUBLISHED-已发布,ARCHIVED-已归档") + @ApiModelProperty("制度状态:DRAFT-草案,APPROVED-已公示,PUBLISHED-已发布,ARCHIVED-已归档") @TableField("status") private String status; @@ -92,4 +92,8 @@ public class RegulationEntity extends AuditableEntity implements Serializable { @TableField(exist = false) @ApiModelProperty("当前用户确认状态:pending-待确认,confirmed-已确认") private String confirmStatus; + + @TableField(exist = false) + @ApiModelProperty("创建人姓名") + private String createByName; } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java deleted file mode 100644 index 075e3ae..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/RegulationDraftMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.RegulationDraftEntity; -import org.apache.ibatis.annotations.Mapper; - -/** - * 制度草案Mapper接口 - */ -@Mapper -public interface RegulationDraftMapper extends BaseMapper { -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java index 8005192..8b5d072 100644 --- a/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java @@ -1,8 +1,10 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.dite.znpt.domain.entity.RegulationEntity; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * @author wangna @@ -11,4 +13,15 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface RegulationMapper extends BaseMapper { + + /** + * 分页查询制度列表(包含创建人姓名) + * @param page 分页参数 + * @param status 状态 + * @param type 类型 + * @return 分页结果 + */ + Page selectRegulationListWithCreator(Page page, + @Param("status") String status, + @Param("type") String type); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java new file mode 100644 index 0000000..1065361 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java @@ -0,0 +1,24 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dite.znpt.domain.entity.RegulationTypeEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 制度类型Mapper接口 + * @author wangna + * @date 2025/07/29 + */ +@Mapper +public interface RegulationTypeMapper extends BaseMapper { + + /** + * 分页查询制度类型列表(包含创建人姓名) + * @param page 分页参数 + * @param typeName 类型名称 + * @return 分页结果 + */ + Page selectRegulationTypeListWithCreator(Page page, @Param("typeName") String typeName); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationService.java b/core/src/main/java/com/dite/znpt/service/RegulationService.java index 27a9f90..27cfe85 100644 --- a/core/src/main/java/com/dite/znpt/service/RegulationService.java +++ b/core/src/main/java/com/dite/znpt/service/RegulationService.java @@ -3,7 +3,6 @@ package com.dite.znpt.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.RegulationEntity; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.dto.RegulationConfirmDTO; /** * @author wangna @@ -29,6 +28,20 @@ public interface RegulationService extends IService { */ Result createRegulationProposal(RegulationEntity regulation); + /** + * 更新制度提案 + * @param regulation 制度信息 + * @return 结果 + */ + Result updateRegulationProposal(RegulationEntity regulation); + + /** + * 删除制度提案 + * @param regulationId 制度ID + * @return 结果 + */ + Result deleteRegulationProposal(String regulationId); + /** * 获取制度详情 * @param regulationId 制度ID @@ -42,4 +55,11 @@ public interface RegulationService extends IService { * @return 结果 */ Result confirmRegulation(String regulationId); + + /** + * 公示制度 + * @param regulationId 制度ID + * @return 结果 + */ + Result approveRegulation(String regulationId); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java new file mode 100644 index 0000000..cba5e41 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java @@ -0,0 +1,43 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.RegulationTypeEntity; +import com.dite.znpt.domain.Result; + +/** + * 制度类型Service接口 + * @author wangna + * @date 2025/07/29 + */ +public interface RegulationTypeService extends IService { + + /** + * 获取制度类型列表 + * @param page 页码 + * @param size 页大小 + * @param typeName 类型名称 + * @return 结果 + */ + Result getRegulationTypes(Integer page, Integer size, String typeName); + + /** + * 创建制度类型 + * @param regulationType 制度类型信息 + * @return 结果 + */ + Result createRegulationType(RegulationTypeEntity regulationType); + + /** + * 更新制度类型 + * @param regulationType 制度类型信息 + * @return 结果 + */ + Result updateRegulationType(RegulationTypeEntity regulationType); + + /** + * 删除制度类型 + * @param typeId 类型ID + * @return 结果 + */ + Result deleteRegulationType(String typeId); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RoleMenuService.java b/core/src/main/java/com/dite/znpt/service/RoleMenuService.java index f7f150b..aa837f5 100644 --- a/core/src/main/java/com/dite/znpt/service/RoleMenuService.java +++ b/core/src/main/java/com/dite/znpt/service/RoleMenuService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.RoleMenuEntity; import com.dite.znpt.domain.vo.RoleMenuReq; -import java.util.List; /** * @author Bear.G @@ -12,6 +11,5 @@ import java.util.List; * @description */ public interface RoleMenuService extends IService { - void bindRoleMenu(RoleMenuReq req); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java index 82d1442..bdc09c6 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.RegulationEntity; import com.dite.znpt.domain.entity.RegulationConfirmationEntity; -import com.dite.znpt.domain.dto.RegulationConfirmDTO; import com.dite.znpt.domain.vo.UserResp; import com.dite.znpt.mapper.RegulationMapper; import com.dite.znpt.service.RegulationService; @@ -36,52 +35,45 @@ public class RegulationServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(RegulationEntity::getStatus, "DRAFT"); - wrapper.le(RegulationEntity::getCreateTime, tenDaysAgo); + wrapper.eq(RegulationEntity::getStatus, "APPROVED"); + wrapper.le(RegulationEntity::getUpdateTime, tenDaysAgo); wrapper.eq(RegulationEntity::getDelFlag, "0"); - java.util.List drafts = this.list(wrapper); + java.util.List approvedRegulations = this.list(wrapper); - for (RegulationEntity draft : drafts) { + for (RegulationEntity regulation : approvedRegulations) { // 更新制度状态和发布信息 - draft.setStatus("PUBLISHED"); - draft.setPublishTime(LocalDateTime.now()); - draft.setEffectiveTime(LocalDateTime.now()); // 设置生效时间为当前时间 - draft.setUpdateTime(LocalDateTime.now()); - draft.setUpdateBy("系统自动发布"); + regulation.setStatus("PUBLISHED"); + regulation.setPublishTime(LocalDateTime.now()); + regulation.setEffectiveTime(LocalDateTime.now()); // 设置生效时间为当前时间 + regulation.setUpdateTime(LocalDateTime.now()); + regulation.setUpdateBy("系统自动发布"); - this.updateById(draft); + this.updateById(regulation); } - if (!drafts.isEmpty()) { - System.out.println("自动发布完成,共发布 " + drafts.size() + " 个制度"); + if (!approvedRegulations.isEmpty()) { + System.out.println("自动发布完成,共发布 " + approvedRegulations.size() + " 个制度"); } } @Override + @Transactional(readOnly = true) public Result getRegulationList(Integer page, Integer pageSize, String status, String type) { try { Page pageParam = new Page<>(page, pageSize); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (status != null && !status.isEmpty()) { - wrapper.eq(RegulationEntity::getStatus, status); - } - if (type != null && !type.isEmpty()) { - wrapper.eq(RegulationEntity::getRegulationType, type); - } - wrapper.eq(RegulationEntity::getDelFlag, "0"); - wrapper.orderByDesc(RegulationEntity::getCreateTime); - - Page result = this.page(pageParam, wrapper); + // 使用关联查询获取创建人姓名 + Page result = this.baseMapper.selectRegulationListWithCreator(pageParam, status, type); // 如果是获取已发布的制度,需要添加确认状态 if (status != null && "PUBLISHED".equals(status)) { @@ -113,11 +105,10 @@ public class RegulationServiceImpl extends ServiceImpl implements RegulationTypeService { + + @Autowired + private RegulationMapper regulationMapper; + + @Override + @Transactional(readOnly = true) + public Result getRegulationTypes(Integer page, Integer size, String typeName) { + try { + Page pageParam = new Page<>(page, size); + + // 使用连表查询获取创建人姓名 + Page result = this.baseMapper.selectRegulationTypeListWithCreator(pageParam, typeName); + + return Result.ok(result); + } catch (Exception e) { + return Result.error("获取制度类型列表失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result createRegulationType(RegulationTypeEntity regulationType) { + try { + regulationType.setTypeId(java.util.UUID.randomUUID().toString()); + regulationType.setCreateTime(LocalDateTime.now()); + String userId = StpUtil.getLoginIdAsString(); + regulationType.setCreateBy(userId); + regulationType.setUpdateTime(LocalDateTime.now()); + regulationType.setUpdateBy(userId); + regulationType.setDelFlag("0"); + + // 如果没有设置排序顺序,设置为当前最大值+1 + if (regulationType.getSortOrder() == null) { + Integer maxSortOrder = this.lambdaQuery() + .eq(RegulationTypeEntity::getDelFlag, "0") + .orderByDesc(RegulationTypeEntity::getSortOrder) + .last("LIMIT 1") + .oneOpt() + .map(RegulationTypeEntity::getSortOrder) + .orElse(0); + regulationType.setSortOrder(maxSortOrder + 1); + } + + this.save(regulationType); + return Result.okM("制度类型创建成功"); + } catch (Exception e) { + return Result.error("制度类型创建失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result updateRegulationType(RegulationTypeEntity regulationType) { + try { + RegulationTypeEntity existing = this.getById(regulationType.getTypeId()); + if (existing == null) { + return Result.error("制度类型不存在"); + } + + regulationType.setUpdateTime(LocalDateTime.now()); + regulationType.setUpdateBy(cn.dev33.satoken.stp.StpUtil.getLoginIdAsString()); + + this.updateById(regulationType); + return Result.okM("制度类型更新成功"); + } catch (Exception e) { + return Result.error("制度类型更新失败:" + e.getMessage()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result deleteRegulationType(String typeId) { + try { + RegulationTypeEntity regulationType = this.getById(typeId); + if (regulationType == null) { + return Result.error("制度类型不存在"); + } + + // 检查是否有制度使用此类型 + String typeName = regulationType.getTypeName(); + + // 检查制度表中是否有使用此类型的记录(包括所有状态) + long regulationCount = regulationMapper.selectCount( + new LambdaQueryWrapper() + .eq(RegulationEntity::getRegulationType, typeName) + .eq(RegulationEntity::getDelFlag, "0") + ); + // 如果有制度使用此类型,则不允许删除 + if (regulationCount > 0) { + return Result.error("该制度类型正在被使用,无法删除。请先删除或修改使用该类型的制度。"); + } + + regulationType.setDelFlag("1"); + this.updateById(regulationType); + return Result.okM("制度类型删除成功"); + } catch (Exception e) { + return Result.error("制度类型删除失败:" + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java index 262b8b4..e51639f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java @@ -2,7 +2,6 @@ package com.dite.znpt.web.controller; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.RegulationEntity; -import com.dite.znpt.domain.dto.RegulationConfirmDTO; import com.dite.znpt.service.RegulationService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -37,6 +36,19 @@ public class RegulationController { return regulationService.createRegulationProposal(regulation); } + @ApiOperation(value = "更新制度提案", httpMethod = "PUT") + @PutMapping("/proposal/{regulationId}") + public Result updateRegulationProposal(@PathVariable String regulationId, @RequestBody RegulationEntity regulation) { + regulation.setRegulationId(regulationId); + return regulationService.updateRegulationProposal(regulation); + } + + @ApiOperation(value = "删除制度提案", httpMethod = "DELETE") + @DeleteMapping("/proposal/{regulationId}") + public Result deleteRegulationProposal(@PathVariable String regulationId) { + return regulationService.deleteRegulationProposal(regulationId); + } + @ApiOperation(value = "获取制度详情", httpMethod = "GET") @GetMapping("/{regulationId}") public Result getRegulationDetail(@PathVariable String regulationId) { @@ -49,4 +61,15 @@ public class RegulationController { return regulationService.confirmRegulation(regulationId); } + /** + * 点击确认公示后原本的制度草案就会进入十天公示期 + * @param regulationId + * @return + */ + @ApiOperation(value = "公示制度", httpMethod = "POST") + @PostMapping("/{regulationId}/approve") + public Result approveRegulation(@PathVariable String regulationId) { + return regulationService.approveRegulation(regulationId); + } + } \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java new file mode 100644 index 0000000..6d1c230 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java @@ -0,0 +1,50 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.RegulationTypeEntity; +import com.dite.znpt.service.RegulationTypeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 制度类型Controller + * @author wangna + * @date 2025/07/29 + */ +@Api(tags = "制度类型管理") +@RestController +@RequestMapping("/regulation/types") +public class RegulationTypeController { + + @Autowired + private RegulationTypeService regulationTypeService; + + @ApiOperation(value = "获取制度类型列表", httpMethod = "GET") + @GetMapping + public Result getRegulationTypes(@RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "10") int size, + @RequestParam(required = false) String typeName) { + return regulationTypeService.getRegulationTypes(page, size, typeName); + } + + @ApiOperation(value = "创建制度类型", httpMethod = "POST") + @PostMapping + public Result createRegulationType(@RequestBody RegulationTypeEntity regulationType) { + return regulationTypeService.createRegulationType(regulationType); + } + + @ApiOperation(value = "更新制度类型", httpMethod = "PUT") + @PutMapping("/{typeId}") + public Result updateRegulationType(@PathVariable String typeId, @RequestBody RegulationTypeEntity regulationType) { + regulationType.setTypeId(typeId); + return regulationTypeService.updateRegulationType(regulationType); + } + + @ApiOperation(value = "删除制度类型", httpMethod = "DELETE") + @DeleteMapping("/{typeId}") + public Result deleteRegulationType(@PathVariable String typeId) { + return regulationTypeService.deleteRegulationType(typeId); + } +} \ No newline at end of file From 023455be47af895680f0ac1f45b28409818a1a21 Mon Sep 17 00:00:00 2001 From: "Mr.j" <2221464500@qq.com> Date: Fri, 1 Aug 2025 09:42:08 +0800 Subject: [PATCH 09/38] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E6=A8=A1=E5=9D=97=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E4=BB=A5=E5=8F=8A=E8=AE=BE=E5=A4=87=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/config/Schedule.java | 2 +- .../znpt/domain/entity/EquipmentEntity.java | 80 ++++ .../dite/znpt/domain/vo/EquipmentListReq.java | 115 +++++ .../dite/znpt/domain/vo/EquipmentResp.java | 92 ++++ .../com/dite/znpt/enums/HealthStatusEnum.java | 53 +++ .../dite/znpt/enums/LocationStatusEnum.java | 55 +++ .../com/dite/znpt/mapper/EquipmentMapper.java | 10 +- .../dite/znpt/service/EquipmentService.java | 7 +- .../service/impl/EquipmentServiceImpl.java | 395 ++++++++++++++++-- .../java/com/dite/znpt/util/PageUtil.java | 4 + .../main/resources/mapper/EquipmentMapper.xml | 31 -- pom.xml | 107 +++-- web/pom.xml | 6 +- .../znpt/web/controller/CommonController.java | 25 +- .../web/controller/EquipmentController.java | 13 +- 15 files changed, 837 insertions(+), 158 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java delete mode 100644 core/src/main/resources/mapper/EquipmentMapper.xml diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java index 8d5d41d..711884c 100644 --- a/core/src/main/java/com/dite/znpt/config/Schedule.java +++ b/core/src/main/java/com/dite/znpt/config/Schedule.java @@ -41,7 +41,7 @@ public class Schedule { List list = imageService.lambdaQuery().eq(ImageEntity::getPreTreatment, "0") .isNotNull(ImageEntity::getPartId) .isNotNull(ImageEntity::getProjectId).list(); - List partIds = list.stream().map(ImageEntity::getPartId).toList(); + List partIds = list.stream().map(ImageEntity::getPartId).collect(Collectors.toList()); Map partRespMap = partService.listInfos(partIds).stream().collect(Collectors.toMap(PartResp::getPartId, Function.identity())); // 预处理 List successList = new ArrayList<>(); diff --git a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java index 098ae58..9138370 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java @@ -9,6 +9,8 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; /** * @author Bear.G @@ -27,6 +29,9 @@ public class EquipmentEntity extends AuditableEntity implements Serializable { @TableId(type = IdType.ASSIGN_ID) private String equipmentId; + @ApiModelProperty("资产编号") + private String assetCode; + @ApiModelProperty("设备名称") private String equipmentName; @@ -45,6 +50,81 @@ public class EquipmentEntity extends AuditableEntity implements Serializable { @ApiModelProperty("设备序列号") private String equipmentSn; + @ApiModelProperty("品牌") + private String brand; + + @ApiModelProperty("配置规格/参数") + private String specification; + + @ApiModelProperty("位置状态") + private String locationStatus; + + @ApiModelProperty("设备当前物理位置") + private String physicalLocation; + + @ApiModelProperty("负责人") + private String responsiblePerson; + + @ApiModelProperty("健康状态") + private String healthStatus; + + @ApiModelProperty("采购时间") + private LocalDateTime purchaseTime; + + @ApiModelProperty("入库时间") + private LocalDateTime inStockTime; + + @ApiModelProperty("启用时间") + private LocalDateTime activationTime; + + @ApiModelProperty("预计报废时间") + private LocalDateTime expectedScrapTime; + + @ApiModelProperty("实际报废时间") + private LocalDateTime actualScrapTime; + + @ApiModelProperty("状态变更时间") + private LocalDateTime statusChangeTime; + + @ApiModelProperty("采购订单") + private String purchaseOrder; + + @ApiModelProperty("供应商名称") + private String supplierName; + + @ApiModelProperty("采购价格") + private BigDecimal purchasePrice; + + @ApiModelProperty("当前净值") + private BigDecimal currentNetValue; + + @ApiModelProperty("折旧方法") + private String depreciationMethod; + + @ApiModelProperty("折旧年限") + private Integer depreciationYears; + + @ApiModelProperty("残值") + private BigDecimal salvageValue; + + @ApiModelProperty("保修截止日期") + private LocalDateTime warrantyExpireDate; + + @ApiModelProperty("上次维护日期") + private LocalDateTime lastMaintenanceDate; + + @ApiModelProperty("下次维护日期") + private LocalDateTime nextMaintenanceDate; + + @ApiModelProperty("维护人员") + private String maintenancePerson; + + @ApiModelProperty("库存条码") + private String inventoryBarcode; + + @ApiModelProperty("资产备注") + private String assetRemark; + @ApiModelProperty("当前使用记录id") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String useRecordId; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java index 36d9cfc..cfeb779 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java @@ -6,6 +6,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDateTime; /** * @author Bear.G @@ -26,4 +27,118 @@ public class EquipmentListReq implements Serializable { @ApiModelProperty("设备状态,0-空闲中,1-使用,3-保养中,4-维修中,5-已报废") private String equipmentStatus; + + @ApiModelProperty("设备序列号") + private String equipmentSn; + + @ApiModelProperty("资产编号") + private String assetCode; + + @ApiModelProperty("品牌") + private String brand; + + @ApiModelProperty("位置状态") + private String locationStatus; + + @ApiModelProperty("健康状态") + private String healthStatus; + + @ApiModelProperty("负责人") + private String responsiblePerson; + + @ApiModelProperty("使用状态,0-空闲中,1-使用中") + private String useStatus; + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("设备型号") + private String equipmentModel; + + @ApiModelProperty("配置规格/参数") + private String specification; + + @ApiModelProperty("设备当前物理位置") + private String physicalLocation; + + @ApiModelProperty("供应商名称") + private String supplierName; + + @ApiModelProperty("维护人员") + private String maintenancePerson; + + @ApiModelProperty("库存条码") + private String inventoryBarcode; + + @ApiModelProperty("资产备注") + private String assetRemark; + + @ApiModelProperty("采购时间开始") + private LocalDateTime purchaseTimeStart; + + @ApiModelProperty("采购时间结束") + private LocalDateTime purchaseTimeEnd; + + @ApiModelProperty("入库时间开始") + private LocalDateTime inStockTimeStart; + + @ApiModelProperty("入库时间结束") + private LocalDateTime inStockTimeEnd; + + @ApiModelProperty("启用时间开始") + private LocalDateTime activationTimeStart; + + @ApiModelProperty("启用时间结束") + private LocalDateTime activationTimeEnd; + + @ApiModelProperty("预计报废时间开始") + private LocalDateTime expectedScrapTimeStart; + + @ApiModelProperty("预计报废时间结束") + private LocalDateTime expectedScrapTimeEnd; + + @ApiModelProperty("保修截止日期开始") + private LocalDateTime warrantyExpireDateStart; + + @ApiModelProperty("保修截止日期结束") + private LocalDateTime warrantyExpireDateEnd; + + @ApiModelProperty("上次维护日期开始") + private LocalDateTime lastMaintenanceDateStart; + + @ApiModelProperty("上次维护日期结束") + private LocalDateTime lastMaintenanceDateEnd; + + @ApiModelProperty("下次维护日期开始") + private LocalDateTime nextMaintenanceDateStart; + + @ApiModelProperty("下次维护日期结束") + private LocalDateTime nextMaintenanceDateEnd; + + @ApiModelProperty("创建时间开始") + private LocalDateTime createTimeStart; + + @ApiModelProperty("创建时间结束") + private LocalDateTime createTimeEnd; + + @ApiModelProperty("更新时间开始") + private LocalDateTime updateTimeStart; + + @ApiModelProperty("更新时间结束") + private LocalDateTime updateTimeEnd; + + @ApiModelProperty("当前页码") + private Integer page = 1; + + @ApiModelProperty("每页大小") + private Integer pageSize = 10; + + @ApiModelProperty("排序字段") + private String orderBy; + + @ApiModelProperty("排序方向") + private String orderDirection = "desc"; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java index 335a532..1200c27 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java @@ -6,6 +6,8 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; /** * @author Bear.G @@ -21,6 +23,9 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("设备ID") private String equipmentId; + @ApiModelProperty("资产编号") + private String assetCode; + @ApiModelProperty("设备名称") private String equipmentName; @@ -36,6 +41,12 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("设备SN") private String equipmentSn; + @ApiModelProperty("品牌") + private String brand; + + @ApiModelProperty("配置规格/参数") + private String specification; + @ApiModelProperty("设备状态, 枚举:EquipmentStatusEnum") private String equipmentStatus; @@ -45,6 +56,81 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("设备使用状态,0-空闲中,1-使用中") private String useStatus; + @ApiModelProperty("位置状态") + private String locationStatus; + + @ApiModelProperty("位置状态描述") + private String locationStatusLabel; + + @ApiModelProperty("设备当前物理位置") + private String physicalLocation; + + @ApiModelProperty("负责人") + private String responsiblePerson; + + @ApiModelProperty("健康状态") + private String healthStatus; + + @ApiModelProperty("健康状态描述") + private String healthStatusLabel; + + @ApiModelProperty("采购时间") + private LocalDateTime purchaseTime; + + @ApiModelProperty("入库时间") + private LocalDateTime inStockTime; + + @ApiModelProperty("启用时间") + private LocalDateTime activationTime; + + @ApiModelProperty("预计报废时间") + private LocalDateTime expectedScrapTime; + + @ApiModelProperty("实际报废时间") + private LocalDateTime actualScrapTime; + + @ApiModelProperty("状态变更时间") + private LocalDateTime statusChangeTime; + + @ApiModelProperty("采购订单") + private String purchaseOrder; + + @ApiModelProperty("供应商名称") + private String supplierName; + + @ApiModelProperty("采购价格") + private BigDecimal purchasePrice; + + @ApiModelProperty("当前净值") + private BigDecimal currentNetValue; + + @ApiModelProperty("折旧方法") + private String depreciationMethod; + + @ApiModelProperty("折旧年限") + private Integer depreciationYears; + + @ApiModelProperty("残值") + private BigDecimal salvageValue; + + @ApiModelProperty("保修截止日期") + private LocalDateTime warrantyExpireDate; + + @ApiModelProperty("上次维护日期") + private LocalDateTime lastMaintenanceDate; + + @ApiModelProperty("下次维护日期") + private LocalDateTime nextMaintenanceDate; + + @ApiModelProperty("维护人员") + private String maintenancePerson; + + @ApiModelProperty("库存条码") + private String inventoryBarcode; + + @ApiModelProperty("资产备注") + private String assetRemark; + @ApiModelProperty("项目id") private String projectId; @@ -56,4 +142,10 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("使用人") private String name; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; } diff --git a/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java new file mode 100644 index 0000000..53521ab --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java @@ -0,0 +1,53 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/31/周四 15:30 + * @description 设备健康状态枚举 + */ +@Getter +public enum HealthStatusEnum { + EXCELLENT("excellent", "优秀"), + GOOD("good", "良好"), + NORMAL("normal", "一般"), + POOR("poor", "较差"), + BAD("bad", "差"); + + private final String code; + private final String desc; + + HealthStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public static HealthStatusEnum getByCode(String code) { + for (HealthStatusEnum e : HealthStatusEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } + + public static String getDescByCode(String code) { + HealthStatusEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll() { + List list = new ArrayList<>(HealthStatusEnum.values().length); + for (HealthStatusEnum e : HealthStatusEnum.values()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java new file mode 100644 index 0000000..8f95140 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java @@ -0,0 +1,55 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/31/周四 15:30 + * @description 设备位置状态枚举 + */ +@Getter +public enum LocationStatusEnum { + IN_STOCK("in_stock", "库存中"), + ALLOCATED("allocated", "已分配"), + REPAIR("repair", "维修中"), + SCRAP("scrap", "待报废"), + SCRAPPED("scrapped", "已报废"), + BORROWED("borrowed", "外借中"), + LOST("lost", "丢失"); + + private final String code; + private final String desc; + + LocationStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public static LocationStatusEnum getByCode(String code) { + for (LocationStatusEnum e : LocationStatusEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } + + public static String getDescByCode(String code) { + LocationStatusEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll() { + List list = new ArrayList<>(LocationStatusEnum.values().length); + for (LocationStatusEnum e : LocationStatusEnum.values()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java b/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java index a0d170f..7d3fe18 100644 --- a/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java @@ -2,20 +2,14 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.EquipmentEntity; -import com.dite.znpt.domain.vo.EquipmentListReq; -import com.dite.znpt.domain.vo.EquipmentResp; -import org.apache.ibatis.annotations.Param; - -import java.util.List; +import org.apache.ibatis.annotations.Mapper; /** * @author Bear.G * @date 2025/7/23/周三 17:38 * @description */ +@Mapper public interface EquipmentMapper extends BaseMapper { - List selectEquipmentResp(@Param("req") EquipmentListReq req); - - EquipmentResp getEquipmentRespByEquipmentId(@Param("equipmentId") String equipmentId); } diff --git a/core/src/main/java/com/dite/znpt/service/EquipmentService.java b/core/src/main/java/com/dite/znpt/service/EquipmentService.java index 5c21c21..37e3d0c 100644 --- a/core/src/main/java/com/dite/znpt/service/EquipmentService.java +++ b/core/src/main/java/com/dite/znpt/service/EquipmentService.java @@ -1,13 +1,11 @@ package com.dite.znpt.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.EquipmentEntity; import com.dite.znpt.domain.vo.EquipmentListReq; import com.dite.znpt.domain.vo.EquipmentReq; import com.dite.znpt.domain.vo.EquipmentResp; -import com.dite.znpt.domain.vo.EquipmentUseRecordReq; - -import java.util.List; /** * @author Bear.G @@ -15,8 +13,7 @@ import java.util.List; * @description */ public interface EquipmentService extends IService { - List page(EquipmentListReq req); - List list(EquipmentListReq req); + IPage page(EquipmentListReq req); EquipmentResp detail(String equipmentId); void save(EquipmentReq req); void update(String equipmentId, EquipmentReq req); diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java index 8b6b013..a86c73d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java @@ -1,94 +1,359 @@ package com.dite.znpt.service.impl; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.EquipmentEntity; -import com.dite.znpt.domain.entity.EquipmentUseRecordEntity; import com.dite.znpt.domain.vo.EquipmentListReq; import com.dite.znpt.domain.vo.EquipmentReq; import com.dite.znpt.domain.vo.EquipmentResp; -import com.dite.znpt.domain.vo.EquipmentUseRecordReq; import com.dite.znpt.enums.EquipmentStatusEnum; import com.dite.znpt.enums.EquipmentTypeEnum; +import com.dite.znpt.enums.HealthStatusEnum; +import com.dite.znpt.enums.LocationStatusEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.EquipmentMapper; import com.dite.znpt.service.EquipmentService; -import com.dite.znpt.service.EquipmentUseRecordService; -import com.dite.znpt.service.ProjectService; -import com.dite.znpt.service.UserService; -import com.dite.znpt.util.PageUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; -import javax.annotation.Resource; -import java.time.LocalDateTime; import java.util.List; +import java.util.stream.Collectors; /** * @author Bear.G * @date 2025/7/23/周三 17:39 * @description */ +@Slf4j @Service public class EquipmentServiceImpl extends ServiceImpl implements EquipmentService { - @Resource - private EquipmentUseRecordService equipmentUseRecordService; - - @Resource - private UserService userService; - - @Resource - private ProjectService projectService; - @Override - public List page(EquipmentListReq req) { - PageUtil.startPage(); - return this.list(req); - } - - @Override - public List list(EquipmentListReq req) { - List list = this.baseMapper.selectEquipmentResp(req); - list.forEach(resp -> { - resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(resp.getEquipmentType())); - resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(resp.getEquipmentStatus())); - }); - return list; + public IPage page(EquipmentListReq req) { + log.info("开始执行设备分页查询,请求参数: {}", req); + + // 创建分页对象 + Page page = new Page<>(req.getPage(), req.getPageSize()); + + // 构建查询条件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(EquipmentEntity::getDelFlag, "0"); + + // 添加搜索条件并记录日志 + int conditionCount = 0; + + if (StringUtils.hasText(req.getEquipmentName())) { + queryWrapper.like(EquipmentEntity::getEquipmentName, req.getEquipmentName()); + log.info("添加设备名称查询条件: {}", req.getEquipmentName()); + conditionCount++; + } + if (StringUtils.hasText(req.getEquipmentType())) { + queryWrapper.eq(EquipmentEntity::getEquipmentType, req.getEquipmentType()); + log.info("添加设备类型查询条件: {}", req.getEquipmentType()); + conditionCount++; + } + if (StringUtils.hasText(req.getEquipmentStatus())) { + queryWrapper.eq(EquipmentEntity::getEquipmentStatus, req.getEquipmentStatus()); + log.info("添加设备状态查询条件: {}", req.getEquipmentStatus()); + conditionCount++; + } + if (StringUtils.hasText(req.getEquipmentSn())) { + queryWrapper.like(EquipmentEntity::getEquipmentSn, req.getEquipmentSn()); + log.info("添加设备序列号查询条件: {}", req.getEquipmentSn()); + conditionCount++; + } + if (StringUtils.hasText(req.getAssetCode())) { + queryWrapper.like(EquipmentEntity::getAssetCode, req.getAssetCode()); + log.info("添加资产编号查询条件: {}", req.getAssetCode()); + conditionCount++; + } + if (StringUtils.hasText(req.getBrand())) { + queryWrapper.like(EquipmentEntity::getBrand, req.getBrand()); + log.info("添加品牌查询条件: {}", req.getBrand()); + conditionCount++; + } + if (StringUtils.hasText(req.getLocationStatus())) { + queryWrapper.eq(EquipmentEntity::getLocationStatus, req.getLocationStatus()); + log.info("添加位置状态查询条件: {}", req.getLocationStatus()); + conditionCount++; + } + if (StringUtils.hasText(req.getHealthStatus())) { + queryWrapper.eq(EquipmentEntity::getHealthStatus, req.getHealthStatus()); + log.info("添加健康状态查询条件: {}", req.getHealthStatus()); + conditionCount++; + } + if (StringUtils.hasText(req.getResponsiblePerson())) { + queryWrapper.like(EquipmentEntity::getResponsiblePerson, req.getResponsiblePerson()); + log.info("添加负责人查询条件: {}", req.getResponsiblePerson()); + conditionCount++; + } + if (StringUtils.hasText(req.getUseStatus())) { + queryWrapper.eq(EquipmentEntity::getUseStatus, req.getUseStatus()); + log.info("添加使用状态查询条件: {}", req.getUseStatus()); + conditionCount++; + } + + // 新增查询条件 + if (StringUtils.hasText(req.getEquipmentModel())) { + queryWrapper.like(EquipmentEntity::getEquipmentModel, req.getEquipmentModel()); + log.info("添加设备型号查询条件: {}", req.getEquipmentModel()); + conditionCount++; + } + if (StringUtils.hasText(req.getSpecification())) { + queryWrapper.like(EquipmentEntity::getSpecification, req.getSpecification()); + log.info("添加配置规格查询条件: {}", req.getSpecification()); + conditionCount++; + } + if (StringUtils.hasText(req.getPhysicalLocation())) { + queryWrapper.like(EquipmentEntity::getPhysicalLocation, req.getPhysicalLocation()); + log.info("添加物理位置查询条件: {}", req.getPhysicalLocation()); + conditionCount++; + } + if (StringUtils.hasText(req.getSupplierName())) { + queryWrapper.like(EquipmentEntity::getSupplierName, req.getSupplierName()); + log.info("添加供应商名称查询条件: {}", req.getSupplierName()); + conditionCount++; + } + if (StringUtils.hasText(req.getMaintenancePerson())) { + queryWrapper.like(EquipmentEntity::getMaintenancePerson, req.getMaintenancePerson()); + log.info("添加维护人员查询条件: {}", req.getMaintenancePerson()); + conditionCount++; + } + if (StringUtils.hasText(req.getInventoryBarcode())) { + queryWrapper.like(EquipmentEntity::getInventoryBarcode, req.getInventoryBarcode()); + log.info("添加库存条码查询条件: {}", req.getInventoryBarcode()); + conditionCount++; + } + if (StringUtils.hasText(req.getAssetRemark())) { + queryWrapper.like(EquipmentEntity::getAssetRemark, req.getAssetRemark()); + log.info("添加资产备注查询条件: {}", req.getAssetRemark()); + conditionCount++; + } + + // 时间范围查询 + if (req.getPurchaseTimeStart() != null) { + queryWrapper.ge(EquipmentEntity::getPurchaseTime, req.getPurchaseTimeStart()); + log.info("添加采购时间开始查询条件: {}", req.getPurchaseTimeStart()); + conditionCount++; + } + if (req.getPurchaseTimeEnd() != null) { + queryWrapper.le(EquipmentEntity::getPurchaseTime, req.getPurchaseTimeEnd()); + log.info("添加采购时间结束查询条件: {}", req.getPurchaseTimeEnd()); + conditionCount++; + } + if (req.getInStockTimeStart() != null) { + queryWrapper.ge(EquipmentEntity::getInStockTime, req.getInStockTimeStart()); + conditionCount++; + } + if (req.getInStockTimeEnd() != null) { + queryWrapper.le(EquipmentEntity::getInStockTime, req.getInStockTimeEnd()); + conditionCount++; + } + if (req.getActivationTimeStart() != null) { + queryWrapper.ge(EquipmentEntity::getActivationTime, req.getActivationTimeStart()); + conditionCount++; + } + if (req.getActivationTimeEnd() != null) { + queryWrapper.le(EquipmentEntity::getActivationTime, req.getActivationTimeEnd()); + conditionCount++; + } + if (req.getExpectedScrapTimeStart() != null) { + queryWrapper.ge(EquipmentEntity::getExpectedScrapTime, req.getExpectedScrapTimeStart()); + conditionCount++; + } + if (req.getExpectedScrapTimeEnd() != null) { + queryWrapper.le(EquipmentEntity::getExpectedScrapTime, req.getExpectedScrapTimeEnd()); + conditionCount++; + } + if (req.getWarrantyExpireDateStart() != null) { + queryWrapper.ge(EquipmentEntity::getWarrantyExpireDate, req.getWarrantyExpireDateStart()); + conditionCount++; + } + if (req.getWarrantyExpireDateEnd() != null) { + queryWrapper.le(EquipmentEntity::getWarrantyExpireDate, req.getWarrantyExpireDateEnd()); + conditionCount++; + } + if (req.getLastMaintenanceDateStart() != null) { + queryWrapper.ge(EquipmentEntity::getLastMaintenanceDate, req.getLastMaintenanceDateStart()); + conditionCount++; + } + if (req.getLastMaintenanceDateEnd() != null) { + queryWrapper.le(EquipmentEntity::getLastMaintenanceDate, req.getLastMaintenanceDateEnd()); + conditionCount++; + } + if (req.getNextMaintenanceDateStart() != null) { + queryWrapper.ge(EquipmentEntity::getNextMaintenanceDate, req.getNextMaintenanceDateStart()); + conditionCount++; + } + if (req.getNextMaintenanceDateEnd() != null) { + queryWrapper.le(EquipmentEntity::getNextMaintenanceDate, req.getNextMaintenanceDateEnd()); + conditionCount++; + } + if (req.getCreateTimeStart() != null) { + queryWrapper.ge(EquipmentEntity::getCreateTime, req.getCreateTimeStart()); + conditionCount++; + } + if (req.getCreateTimeEnd() != null) { + queryWrapper.le(EquipmentEntity::getCreateTime, req.getCreateTimeEnd()); + conditionCount++; + } + if (req.getUpdateTimeStart() != null) { + queryWrapper.ge(EquipmentEntity::getUpdateTime, req.getUpdateTimeStart()); + conditionCount++; + } + if (req.getUpdateTimeEnd() != null) { + queryWrapper.le(EquipmentEntity::getUpdateTime, req.getUpdateTimeEnd()); + conditionCount++; + } + + log.info("总共添加了 {} 个查询条件", conditionCount); + + // 排序处理 + if (StringUtils.hasText(req.getOrderBy())) { + String orderBy = req.getOrderBy(); + String orderDirection = "desc".equalsIgnoreCase(req.getOrderDirection()) ? "desc" : "asc"; + + switch (orderBy.toLowerCase()) { + case "equipment_name": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getEquipmentName); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getEquipmentName); + } + break; + case "equipment_sn": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getEquipmentSn); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getEquipmentSn); + } + break; + case "asset_code": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getAssetCode); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getAssetCode); + } + break; + case "equipment_type": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getEquipmentType); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getEquipmentType); + } + break; + case "equipment_status": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getEquipmentStatus); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getEquipmentStatus); + } + break; + case "brand": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getBrand); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getBrand); + } + break; + case "responsible_person": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getResponsiblePerson); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getResponsiblePerson); + } + break; + case "purchase_time": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getPurchaseTime); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getPurchaseTime); + } + break; + case "purchase_price": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getPurchasePrice); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getPurchasePrice); + } + break; + case "update_time": + if ("desc".equals(orderDirection)) { + queryWrapper.orderByDesc(EquipmentEntity::getUpdateTime); + } else { + queryWrapper.orderByAsc(EquipmentEntity::getUpdateTime); + } + break; + default: + // 默认按创建时间倒序 + queryWrapper.orderByDesc(EquipmentEntity::getCreateTime); + break; + } + log.info("添加排序条件: {} {}", orderBy, orderDirection); + } else { + // 默认按创建时间倒序 + queryWrapper.orderByDesc(EquipmentEntity::getCreateTime); + log.info("使用默认排序: 按创建时间倒序"); + } + + log.info("执行分页查询,SQL条件: {}", queryWrapper.getTargetSql()); + + // 执行分页查询 + IPage equipmentPage = this.page(page, queryWrapper); + + log.info("查询完成,总记录数: {}, 当前页记录数: {}", equipmentPage.getTotal(), equipmentPage.getRecords().size()); + + // 转换为响应对象 + List equipmentRespList = equipmentPage.getRecords().stream() + .map(this::convertToResp) + .collect(Collectors.toList()); + + // 创建响应分页对象 + Page respPage = new Page<>(equipmentPage.getCurrent(), equipmentPage.getSize(), equipmentPage.getTotal()); + respPage.setRecords(equipmentRespList); + + return respPage; } @Override public EquipmentResp detail(String equipmentId) { - EquipmentResp resp = this.baseMapper.getEquipmentRespByEquipmentId(equipmentId); - resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(resp.getEquipmentType())); - resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(resp.getEquipmentStatus())); - return resp; + EquipmentEntity equipment = this.getById(equipmentId); + if (equipment == null) { + throw new ServiceException(Message.EQUIPMENT_ID_NOT_EXIST); + } + return convertToResp(equipment); } @Transactional(rollbackFor = Exception.class) @Override public void save(EquipmentReq req) { EquipmentEntity entity = Converts.INSTANCE.toEquipmentUseRecordEntity(req); - if(null != getByEquipmentSn(entity.getEquipmentSn())){ + if (getByEquipmentSn(entity.getEquipmentSn()) != null) { throw new ServiceException(Message.EQUIPMENT_SN_EXIST); } this.save(entity); } - private EquipmentEntity getByEquipmentSn(String equipmentSn){ - return this.getOne(Wrappers.lambdaQuery(EquipmentEntity.class).eq(EquipmentEntity::getEquipmentSn, equipmentSn)); + private EquipmentEntity getByEquipmentSn(String equipmentSn) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(EquipmentEntity::getEquipmentSn, equipmentSn); + return this.getOne(queryWrapper); } @Transactional(rollbackFor = Exception.class) @Override public void update(String equipmentId, EquipmentReq req) { EquipmentEntity equipment = this.getById(equipmentId); - if(null == equipment){ + if (equipment == null) { throw new ServiceException(Message.EQUIPMENT_ID_NOT_EXIST); } - if(!equipment.getEquipmentSn().equals(req.getEquipmentSn()) && null != getByEquipmentSn(req.getEquipmentSn())){ + if (!equipment.getEquipmentSn().equals(req.getEquipmentSn()) && getByEquipmentSn(req.getEquipmentSn()) != null) { throw new ServiceException(Message.EQUIPMENT_SN_EXIST); } EquipmentEntity entity = Converts.INSTANCE.toEquipmentUseRecordEntity(req); @@ -100,9 +365,57 @@ public class EquipmentServiceImpl extends ServiceImpl - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index fcdc462..72077c0 100644 --- a/pom.xml +++ b/pom.xml @@ -1,54 +1,53 @@ - - - 4.0.0 - - com.dite.znpt - parent - 1.0.0-SNAPSHOT - - - 17 - - - core - sip - web - flowable - - pom - - - - - - org.springframework.boot - spring-boot-starter-parent - 2.7.18 - pom - import - - - - cn.hutool - hutool-all - 5.8.24 - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 17 - 17 - - - - - - + + + 4.0.0 + + com.dite.znpt + parent + 1.0.0-SNAPSHOT + + + 17 + + + core + web + flowable + + pom + + + + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + pom + import + + + + cn.hutool + hutool-all + 5.8.24 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 17 + 17 + + + + + + diff --git a/web/pom.xml b/web/pom.xml index c6d6423..0eadebf 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -20,11 +20,6 @@ - - com.dite.znpt - sip - 1.0.0-SNAPSHOT - com.dite.znpt core @@ -55,6 +50,7 @@ + diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index 5371ed3..ee57378 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -1,11 +1,11 @@ package com.dite.znpt.web.controller; import com.dite.znpt.constant.Message; -import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.ImageService; +import com.dite.znpt.domain.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -15,9 +15,9 @@ import javax.annotation.Resource; import java.io.IOException; /** - * @Author: gaoxiong - * @Date: 2025/4/29 23:06 - * @Description: + * @author Bear.G + * @date 2025/7/24/周四 14:35 + * @description */ @Api(tags = "公共信息") @RestController @@ -175,5 +175,22 @@ public class CommonController { return Result.ok(EquipmentTypeEnum.listAll()); } + @ApiOperation(value = "查询设备状态", httpMethod = "GET") + @GetMapping("/list/equipment-status") + public Result listEquipmentStatus(){ + return Result.ok(EquipmentStatusEnum.listAll()); + } + + @ApiOperation(value = "查询设备位置状态", httpMethod = "GET") + @GetMapping("/list/location-status") + public Result listLocationStatus(){ + return Result.ok(LocationStatusEnum.listAll()); + } + + @ApiOperation(value = "查询设备健康状态", httpMethod = "GET") + @GetMapping("/list/health-status") + public Result listHealthStatus(){ + return Result.ok(HealthStatusEnum.listAll()); + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java index b3318b5..ac76d30 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java @@ -1,5 +1,6 @@ package com.dite.znpt.web.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.EquipmentListReq; @@ -12,14 +13,13 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.List; /** * @author Bear.G * @date 2025/7/23/周三 17:41 * @description */ -@Api(tags = "设备信息") +@Api(tags = "设备信息----------------------------") @RestController @RequestMapping("/equipment") public class EquipmentController { @@ -30,13 +30,8 @@ public class EquipmentController { @ApiOperation(value = "分页查询设备信息列表", httpMethod = "GET") @GetMapping("/page") public PageResult page(EquipmentListReq req) { - return PageResult.ok(equipmentService.page(req)); - } - - @ApiOperation(value = "查询设备信息列表", httpMethod = "GET") - @GetMapping("/list") - public Result> list(EquipmentListReq req) { - return Result.ok(equipmentService.list(req)); + IPage page = equipmentService.page(req); + return PageResult.ok(page.getRecords(), page.getTotal()); } @ApiOperation(value = "查询设备信息详情", httpMethod = "GET") From 8fe29807a89f0f6f6168b7cef69225a81e064539 Mon Sep 17 00:00:00 2001 From: "Mr.j" <2221464500@qq.com> Date: Fri, 1 Aug 2025 11:21:44 +0800 Subject: [PATCH 10/38] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E6=A8=A1=E5=9D=97=E6=89=8B=E5=8A=A8=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/converts/EquipmentConverts.java | 24 +++++ .../com/dite/znpt/domain/vo/EquipmentReq.java | 102 +++++++++++++++++- .../service/impl/EquipmentServiceImpl.java | 6 +- 3 files changed, 126 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java diff --git a/core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java b/core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java new file mode 100644 index 0000000..f2f09d3 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java @@ -0,0 +1,24 @@ +package com.dite.znpt.converts; + +import com.dite.znpt.domain.entity.EquipmentEntity; +import com.dite.znpt.domain.vo.EquipmentReq; +import org.mapstruct.Mapper; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.factory.Mappers; + +/** + * 设备信息转换器 + * @author Bear.G + * @date 2025/1/1 + */ +@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) +public interface EquipmentConverts { + EquipmentConverts INSTANCE = Mappers.getMapper(EquipmentConverts.class); + + /** + * 将EquipmentReq转换为EquipmentEntity + * @param req 设备请求对象 + * @return 设备实体对象 + */ + EquipmentEntity toEquipmentEntity(EquipmentReq req); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java index db16ba9..947c006 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java @@ -8,6 +8,8 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; /** * @author Bear.G @@ -22,7 +24,7 @@ public class EquipmentReq implements Serializable { @ApiModelProperty("设备名称") @NotBlank(message = "设备名称不能为空") - @Size(max = 100, message = "设备名称长度不能超过100个字") + @Size(max = 200, message = "设备名称长度不能超过200个字") private String equipmentName; @ApiModelProperty("设备类型, 枚举:EquipmentTypeEnum") @@ -31,11 +33,105 @@ public class EquipmentReq implements Serializable { @ApiModelProperty("设备型号") @NotBlank(message = "设备型号不能为空") - @Size(max = 50, message = "设备型号长度不能超过50个字") + @Size(max = 200, message = "设备型号长度不能超过200个字") private String equipmentModel; @ApiModelProperty("设备SN") @NotBlank(message = "设备SN不能为空") - @Size(max = 50, message = "设备SN长度不能超过50个字") + @Size(max = 100, message = "设备SN长度不能超过100个字") private String equipmentSn; + + @ApiModelProperty("资产编号") + @Size(max = 50, message = "资产编号长度不能超过50个字") + private String assetCode; + + @ApiModelProperty("品牌") + @Size(max = 100, message = "品牌长度不能超过100个字") + private String brand; + + @ApiModelProperty("配置规格/参数") + @Size(max = 500, message = "配置规格长度不能超过500个字") + private String specification; + + @ApiModelProperty("设备状态,枚举:EquipmentStatusEnum") + private String equipmentStatus; + + @ApiModelProperty("使用状态,0-空闲中,1-使用中") + private String useStatus; + + @ApiModelProperty("位置状态") + private String locationStatus; + + @ApiModelProperty("设备当前物理位置") + @Size(max = 200, message = "物理位置长度不能超过200个字") + private String physicalLocation; + + @ApiModelProperty("负责人") + @Size(max = 100, message = "负责人长度不能超过100个字") + private String responsiblePerson; + + @ApiModelProperty("健康状态") + private String healthStatus; + + @ApiModelProperty("采购时间") + private LocalDateTime purchaseTime; + + @ApiModelProperty("入库时间") + private LocalDateTime inStockTime; + + @ApiModelProperty("启用时间") + private LocalDateTime activationTime; + + @ApiModelProperty("预计报废时间") + private LocalDateTime expectedScrapTime; + + @ApiModelProperty("实际报废时间") + private LocalDateTime actualScrapTime; + + @ApiModelProperty("状态变更时间") + private LocalDateTime statusChangeTime; + + @ApiModelProperty("采购订单") + @Size(max = 100, message = "采购订单长度不能超过100个字") + private String purchaseOrder; + + @ApiModelProperty("供应商名称") + @Size(max = 200, message = "供应商名称长度不能超过200个字") + private String supplierName; + + @ApiModelProperty("采购价格") + private BigDecimal purchasePrice; + + @ApiModelProperty("当前净值") + private BigDecimal currentNetValue; + + @ApiModelProperty("折旧方法") + private String depreciationMethod; + + @ApiModelProperty("折旧年限") + private Integer depreciationYears; + + @ApiModelProperty("残值") + private BigDecimal salvageValue; + + @ApiModelProperty("保修截止日期") + private LocalDateTime warrantyExpireDate; + + @ApiModelProperty("上次维护日期") + private LocalDateTime lastMaintenanceDate; + + @ApiModelProperty("下次维护日期") + private LocalDateTime nextMaintenanceDate; + + @ApiModelProperty("维护人员") + @Size(max = 100, message = "维护人员长度不能超过100个字") + private String maintenancePerson; + + @ApiModelProperty("库存条码") + @Size(max = 100, message = "库存条码长度不能超过100个字") + private String inventoryBarcode; + + @ApiModelProperty("资产备注") + @Size(max = 1000, message = "资产备注长度不能超过1000个字") + private String assetRemark; } diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java index a86c73d..cdb1f64 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; -import com.dite.znpt.converts.Converts; +import com.dite.znpt.converts.EquipmentConverts; import com.dite.znpt.domain.entity.EquipmentEntity; import com.dite.znpt.domain.vo.EquipmentListReq; import com.dite.znpt.domain.vo.EquipmentReq; @@ -333,7 +333,7 @@ public class EquipmentServiceImpl extends ServiceImpl Date: Fri, 1 Aug 2025 15:14:05 +0800 Subject: [PATCH 11/38] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E6=A8=A1=E5=9D=97=E7=BC=96=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=EF=BC=8C=E6=9F=A5=E7=9C=8B=E8=AF=A6=E6=83=85?= =?UTF-8?q?=EF=BC=8C=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CustomLocalDateTimeDeserializer.java | 20 +- .../znpt/domain/entity/EquipmentEntity.java | 57 ++++++ .../dite/znpt/domain/vo/EquipmentListReq.java | 12 ++ .../com/dite/znpt/domain/vo/EquipmentReq.java | 72 ++++++++ .../dite/znpt/domain/vo/EquipmentResp.java | 57 ++++++ .../service/impl/EquipmentServiceImpl.java | 171 +++++++++++++++++- 6 files changed, 382 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java b/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java index 9e3e1e6..5d748f0 100644 --- a/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java +++ b/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java @@ -10,11 +10,27 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CustomLocalDateTimeDeserializer extends JsonDeserializer { - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter FORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter FORMATTER2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String date = p.getText(); - return LocalDateTimeUtil.parse(date, FORMATTER); + if (date == null || date.trim().isEmpty()) { + return null; + } + + try { + // 尝试第一种格式 yyyy-MM-dd HH:mm:ss + return LocalDateTimeUtil.parse(date, FORMATTER1); + } catch (Exception e1) { + try { + // 尝试第二种格式 yyyy/MM/dd HH:mm + return LocalDateTimeUtil.parse(date, FORMATTER2); + } catch (Exception e2) { + // 如果都失败,尝试自动解析 + return LocalDateTimeUtil.parse(date); + } + } } } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java index 9138370..6609199 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java @@ -125,6 +125,63 @@ public class EquipmentEntity extends AuditableEntity implements Serializable { @ApiModelProperty("资产备注") private String assetRemark; + @ApiModelProperty("使用部门/人") + private String usingDepartment; + + @ApiModelProperty("领用时间") + private LocalDateTime borrowingTime; + + @ApiModelProperty("归还时间") + private LocalDateTime returnTime; + + @ApiModelProperty("出库时间") + private LocalDateTime outStockTime; + + @ApiModelProperty("总使用时间") + private String totalUsageTime; + + @ApiModelProperty("折旧率") + private BigDecimal depreciationRate; + + @ApiModelProperty("折旧方法说明") + private String depreciationMethodDesc; + + @ApiModelProperty("发票") + private String invoice; + + @ApiModelProperty("发票状态") + private String invoiceStatus; + + @ApiModelProperty("附件") + private String attachments; + + @ApiModelProperty("照片") + private String photos; + + @ApiModelProperty("条码") + private String barcode; + + @ApiModelProperty("导入人") + private String importer; + + @ApiModelProperty("盘库时间/状态1") + private String inventoryTimeStatus1; + + @ApiModelProperty("盘库时间/状态2") + private String inventoryTimeStatus2; + + @ApiModelProperty("盘库时间/状态3") + private String inventoryTimeStatus3; + + @ApiModelProperty("盘点时间/状态1") + private String inventoryCheckTimeStatus1; + + @ApiModelProperty("盘点时间/状态2") + private String inventoryCheckTimeStatus2; + + @ApiModelProperty("盘点时间/状态3") + private String inventoryCheckTimeStatus3; + @ApiModelProperty("当前使用记录id") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String useRecordId; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java index cfeb779..1747ea6 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java @@ -76,6 +76,18 @@ public class EquipmentListReq implements Serializable { @ApiModelProperty("资产备注") private String assetRemark; + @ApiModelProperty("使用部门/人") + private String usingDepartment; + + @ApiModelProperty("发票") + private String invoice; + + @ApiModelProperty("条码") + private String barcode; + + @ApiModelProperty("导入人") + private String importer; + @ApiModelProperty("采购时间开始") private LocalDateTime purchaseTimeStart; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java index 947c006..430d19f 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java @@ -134,4 +134,76 @@ public class EquipmentReq implements Serializable { @ApiModelProperty("资产备注") @Size(max = 1000, message = "资产备注长度不能超过1000个字") private String assetRemark; + + @ApiModelProperty("使用部门/人") + @Size(max = 200, message = "使用部门/人长度不能超过200个字") + private String usingDepartment; + + @ApiModelProperty("领用时间") + private LocalDateTime borrowingTime; + + @ApiModelProperty("归还时间") + private LocalDateTime returnTime; + + @ApiModelProperty("出库时间") + private LocalDateTime outStockTime; + + @ApiModelProperty("总使用时间") + @Size(max = 100, message = "总使用时间长度不能超过100个字") + private String totalUsageTime; + + @ApiModelProperty("折旧率") + private BigDecimal depreciationRate; + + @ApiModelProperty("折旧方法说明") + @Size(max = 500, message = "折旧方法说明长度不能超过500个字") + private String depreciationMethodDesc; + + @ApiModelProperty("发票") + @Size(max = 100, message = "发票长度不能超过100个字") + private String invoice; + + @ApiModelProperty("发票状态") + @Size(max = 50, message = "发票状态长度不能超过50个字") + private String invoiceStatus; + + @ApiModelProperty("附件") + @Size(max = 500, message = "附件长度不能超过500个字") + private String attachments; + + @ApiModelProperty("照片") + @Size(max = 500, message = "照片长度不能超过500个字") + private String photos; + + @ApiModelProperty("条码") + @Size(max = 100, message = "条码长度不能超过100个字") + private String barcode; + + @ApiModelProperty("导入人") + @Size(max = 100, message = "导入人长度不能超过100个字") + private String importer; + + @ApiModelProperty("盘库时间/状态1") + @Size(max = 100, message = "盘库时间/状态1长度不能超过100个字") + private String inventoryTimeStatus1; + + @ApiModelProperty("盘库时间/状态2") + @Size(max = 100, message = "盘库时间/状态2长度不能超过100个字") + private String inventoryTimeStatus2; + + @ApiModelProperty("盘库时间/状态3") + @Size(max = 100, message = "盘库时间/状态3长度不能超过100个字") + private String inventoryTimeStatus3; + + @ApiModelProperty("盘点时间/状态1") + @Size(max = 100, message = "盘点时间/状态1长度不能超过100个字") + private String inventoryCheckTimeStatus1; + + @ApiModelProperty("盘点时间/状态2") + @Size(max = 100, message = "盘点时间/状态2长度不能超过100个字") + private String inventoryCheckTimeStatus2; + + @ApiModelProperty("盘点时间/状态3") + @Size(max = 100, message = "盘点时间/状态3长度不能超过100个字") + private String inventoryCheckTimeStatus3; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java index 1200c27..9125499 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java @@ -131,6 +131,63 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("资产备注") private String assetRemark; + @ApiModelProperty("使用部门/人") + private String usingDepartment; + + @ApiModelProperty("领用时间") + private LocalDateTime borrowingTime; + + @ApiModelProperty("归还时间") + private LocalDateTime returnTime; + + @ApiModelProperty("出库时间") + private LocalDateTime outStockTime; + + @ApiModelProperty("总使用时间") + private String totalUsageTime; + + @ApiModelProperty("折旧率") + private BigDecimal depreciationRate; + + @ApiModelProperty("折旧方法说明") + private String depreciationMethodDesc; + + @ApiModelProperty("发票") + private String invoice; + + @ApiModelProperty("发票状态") + private String invoiceStatus; + + @ApiModelProperty("附件") + private String attachments; + + @ApiModelProperty("照片") + private String photos; + + @ApiModelProperty("条码") + private String barcode; + + @ApiModelProperty("导入人") + private String importer; + + @ApiModelProperty("盘库时间/状态1") + private String inventoryTimeStatus1; + + @ApiModelProperty("盘库时间/状态2") + private String inventoryTimeStatus2; + + @ApiModelProperty("盘库时间/状态3") + private String inventoryTimeStatus3; + + @ApiModelProperty("盘点时间/状态1") + private String inventoryCheckTimeStatus1; + + @ApiModelProperty("盘点时间/状态2") + private String inventoryCheckTimeStatus2; + + @ApiModelProperty("盘点时间/状态3") + private String inventoryCheckTimeStatus3; + @ApiModelProperty("项目id") private String projectId; diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java index cdb1f64..0e385a2 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java @@ -1,11 +1,12 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; -import com.dite.znpt.converts.EquipmentConverts; +// 移除EquipmentConverts导入,使用手动转换 import com.dite.znpt.domain.entity.EquipmentEntity; import com.dite.znpt.domain.vo.EquipmentListReq; import com.dite.znpt.domain.vo.EquipmentReq; @@ -22,8 +23,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; +import com.dite.znpt.constant.Constants; /** * @author Bear.G @@ -43,7 +46,7 @@ public class EquipmentServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(EquipmentEntity::getDelFlag, "0"); + // 不需要手动添加 del_flag 条件,@TableLogic 注解会自动处理 // 添加搜索条件并记录日志 int conditionCount = 0; @@ -136,6 +139,28 @@ public class EquipmentServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(EquipmentEntity::getEquipmentId, equipmentId) + .set(EquipmentEntity::getEquipmentStatus, "scrap") + .set(EquipmentEntity::getLocationStatus, "scrapped") + .set(EquipmentEntity::getActualScrapTime, LocalDateTime.now()) + .set(EquipmentEntity::getStatusChangeTime, LocalDateTime.now()); + + boolean updateResult = this.update(updateWrapper); + if (!updateResult) { + log.error("设备状态更新失败,设备ID: {}", equipmentId); + throw new ServiceException("设备状态更新失败,请稍后重试"); + } + + // 执行软删除 - 使用 MyBatis-Plus 的逻辑删除方法 + boolean deleteResult = this.removeById(equipmentId); + + if (deleteResult) { + log.info("设备删除成功,设备ID: {}, 设备名称: {}", equipmentId, equipment.getEquipmentName()); + } else { + log.error("设备删除失败,设备ID: {}", equipmentId); + throw new ServiceException("设备删除失败,请稍后重试"); + } + } + + /** + * 将EquipmentReq转换为EquipmentEntity + */ + private EquipmentEntity convertToEntity(EquipmentReq req) { + EquipmentEntity entity = new EquipmentEntity(); + entity.setAssetCode(req.getAssetCode()); + entity.setEquipmentName(req.getEquipmentName()); + entity.setEquipmentModel(req.getEquipmentModel()); + entity.setEquipmentType(req.getEquipmentType()); + entity.setEquipmentStatus(req.getEquipmentStatus()); + entity.setUseStatus(req.getUseStatus()); + entity.setEquipmentSn(req.getEquipmentSn()); + entity.setBrand(req.getBrand()); + entity.setSpecification(req.getSpecification()); + entity.setLocationStatus(req.getLocationStatus()); + entity.setPhysicalLocation(req.getPhysicalLocation()); + entity.setResponsiblePerson(req.getResponsiblePerson()); + entity.setHealthStatus(req.getHealthStatus()); + entity.setPurchaseTime(req.getPurchaseTime()); + entity.setInStockTime(req.getInStockTime()); + entity.setActivationTime(req.getActivationTime()); + entity.setExpectedScrapTime(req.getExpectedScrapTime()); + entity.setActualScrapTime(req.getActualScrapTime()); + entity.setStatusChangeTime(req.getStatusChangeTime()); + entity.setPurchaseOrder(req.getPurchaseOrder()); + entity.setSupplierName(req.getSupplierName()); + entity.setPurchasePrice(req.getPurchasePrice()); + entity.setCurrentNetValue(req.getCurrentNetValue()); + entity.setDepreciationMethod(req.getDepreciationMethod()); + entity.setDepreciationYears(req.getDepreciationYears()); + entity.setSalvageValue(req.getSalvageValue()); + entity.setWarrantyExpireDate(req.getWarrantyExpireDate()); + entity.setLastMaintenanceDate(req.getLastMaintenanceDate()); + entity.setNextMaintenanceDate(req.getNextMaintenanceDate()); + entity.setMaintenancePerson(req.getMaintenancePerson()); + entity.setInventoryBarcode(req.getInventoryBarcode()); + entity.setAssetRemark(req.getAssetRemark()); + + // 新增字段转换 + entity.setUsingDepartment(req.getUsingDepartment()); + entity.setBorrowingTime(req.getBorrowingTime()); + entity.setReturnTime(req.getReturnTime()); + entity.setOutStockTime(req.getOutStockTime()); + entity.setTotalUsageTime(req.getTotalUsageTime()); + entity.setDepreciationRate(req.getDepreciationRate()); + entity.setDepreciationMethodDesc(req.getDepreciationMethodDesc()); + entity.setInvoice(req.getInvoice()); + entity.setInvoiceStatus(req.getInvoiceStatus()); + entity.setAttachments(req.getAttachments()); + entity.setPhotos(req.getPhotos()); + entity.setBarcode(req.getBarcode()); + entity.setImporter(req.getImporter()); + entity.setInventoryTimeStatus1(req.getInventoryTimeStatus1()); + entity.setInventoryTimeStatus2(req.getInventoryTimeStatus2()); + entity.setInventoryTimeStatus3(req.getInventoryTimeStatus3()); + entity.setInventoryCheckTimeStatus1(req.getInventoryCheckTimeStatus1()); + entity.setInventoryCheckTimeStatus2(req.getInventoryCheckTimeStatus2()); + entity.setInventoryCheckTimeStatus3(req.getInventoryCheckTimeStatus3()); + + return entity; } /** @@ -413,6 +552,28 @@ public class EquipmentServiceImpl extends ServiceImpl Date: Fri, 1 Aug 2025 17:18:01 +0800 Subject: [PATCH 12/38] =?UTF-8?q?=E5=88=B6=E5=BA=A6=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=8C=89=E9=9C=80=E6=B1=82=E4=BF=AE=E6=94=B9=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E4=B8=94=E9=80=9A=E8=BF=87=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/mapper/RegulationMapper.java | 6 +++++- .../dite/znpt/mapper/RegulationTypeMapper.java | 7 ++++++- .../com/dite/znpt/service/RegulationService.java | 4 +++- .../dite/znpt/service/RegulationTypeService.java | 4 +++- .../znpt/service/impl/RegulationServiceImpl.java | 4 ++-- .../service/impl/RegulationTypeServiceImpl.java | 16 +++++++++------- .../web/controller/RegulationController.java | 6 ++++-- .../web/controller/RegulationTypeController.java | 6 ++++-- 8 files changed, 36 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java index 8b5d072..dc23993 100644 --- a/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationMapper.java @@ -19,9 +19,13 @@ public interface RegulationMapper extends BaseMapper { * @param page 分页参数 * @param status 状态 * @param type 类型 + * @param title 提案标题 + * @param proposer 提案人 * @return 分页结果 */ Page selectRegulationListWithCreator(Page page, @Param("status") String status, - @Param("type") String type); + @Param("type") String type, + @Param("title") String title, + @Param("proposer") String proposer); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java index 1065361..5f7cfb8 100644 --- a/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java @@ -18,7 +18,12 @@ public interface RegulationTypeMapper extends BaseMapper { * 分页查询制度类型列表(包含创建人姓名) * @param page 分页参数 * @param typeName 类型名称 + * @param status 状态 + * @param remark 备注 * @return 分页结果 */ - Page selectRegulationTypeListWithCreator(Page page, @Param("typeName") String typeName); + Page selectRegulationTypeListWithCreator(Page page, + @Param("typeName") String typeName, + @Param("status") String status, + @Param("remark") String remark); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationService.java b/core/src/main/java/com/dite/znpt/service/RegulationService.java index 27cfe85..b24957f 100644 --- a/core/src/main/java/com/dite/znpt/service/RegulationService.java +++ b/core/src/main/java/com/dite/znpt/service/RegulationService.java @@ -17,9 +17,11 @@ public interface RegulationService extends IService { * @param pageSize 页大小 * @param status 状态 * @param type 类型 + * @param title 提案标题 + * @param proposer 提案人 * @return 结果 */ - Result getRegulationList(Integer page, Integer pageSize, String status, String type); + Result getRegulationList(Integer page, Integer pageSize, String status, String type, String title, String proposer); /** * 创建制度提案 diff --git a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java index cba5e41..c5b8715 100644 --- a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java +++ b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java @@ -16,9 +16,11 @@ public interface RegulationTypeService extends IService { * @param page 页码 * @param size 页大小 * @param typeName 类型名称 + * @param status 状态 + * @param remark 备注 * @return 结果 */ - Result getRegulationTypes(Integer page, Integer size, String typeName); + Result getRegulationTypes(Integer page, Integer size, String typeName, String status, String remark); /** * 创建制度类型 diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java index bdc09c6..cf52e5f 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java @@ -68,12 +68,12 @@ public class RegulationServiceImpl extends ServiceImpl pageParam = new Page<>(page, pageSize); // 使用关联查询获取创建人姓名 - Page result = this.baseMapper.selectRegulationListWithCreator(pageParam, status, type); + Page result = this.baseMapper.selectRegulationListWithCreator(pageParam, status, type, title, proposer); // 如果是获取已发布的制度,需要添加确认状态 if (status != null && "PUBLISHED".equals(status)) { diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java index 5a7fd17..1a3616e 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java @@ -5,12 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.RegulationTypeEntity; import com.dite.znpt.domain.entity.RegulationEntity; -import com.dite.znpt.mapper.RegulationTypeMapper; +import com.dite.znpt.domain.entity.RegulationTypeEntity; import com.dite.znpt.mapper.RegulationMapper; +import com.dite.znpt.mapper.RegulationTypeMapper; import com.dite.znpt.service.RegulationTypeService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,17 +23,20 @@ import java.time.LocalDateTime; @Service public class RegulationTypeServiceImpl extends ServiceImpl implements RegulationTypeService { - @Autowired - private RegulationMapper regulationMapper; + private final RegulationMapper regulationMapper; + + public RegulationTypeServiceImpl(RegulationMapper regulationMapper) { + this.regulationMapper = regulationMapper; + } @Override @Transactional(readOnly = true) - public Result getRegulationTypes(Integer page, Integer size, String typeName) { + public Result getRegulationTypes(Integer page, Integer size, String typeName, String status, String remark) { try { Page pageParam = new Page<>(page, size); // 使用连表查询获取创建人姓名 - Page result = this.baseMapper.selectRegulationTypeListWithCreator(pageParam, typeName); + Page result = this.baseMapper.selectRegulationTypeListWithCreator(pageParam, typeName, status, remark); return Result.ok(result); } catch (Exception e) { diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java index e51639f..c27dc10 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java @@ -26,8 +26,10 @@ public class RegulationController { public Result getRegulationList(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(required = false) String status, - @RequestParam(required = false) String type) { - return regulationService.getRegulationList(page, size, status, type); + @RequestParam(required = false) String type, + @RequestParam(required = false) String title, + @RequestParam(required = false) String proposer) { + return regulationService.getRegulationList(page, size, status, type, title, proposer); } @ApiOperation(value = "创建制度提案", httpMethod = "POST") diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java index 6d1c230..1862cad 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java @@ -25,8 +25,10 @@ public class RegulationTypeController { @GetMapping public Result getRegulationTypes(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size, - @RequestParam(required = false) String typeName) { - return regulationTypeService.getRegulationTypes(page, size, typeName); + @RequestParam(required = false) String typeName, + @RequestParam(required = false) String status, + @RequestParam(required = false) String remark) { + return regulationTypeService.getRegulationTypes(page, size, typeName, status, remark); } @ApiOperation(value = "创建制度类型", httpMethod = "POST") From a50dbd89ced3253720a7b3bbc34b3a77a4210577 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Mon, 4 Aug 2025 17:24:13 +0800 Subject: [PATCH 13/38] =?UTF-8?q?=E5=88=B6=E5=BA=A6=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dto/RegulationTypeRequest.java | 27 +++++++++ .../domain/entity/RegulationTypeEntity.java | 59 +++++++++++++++++++ .../resources/mapper/RegulationTypeMapper.xml | 32 ++++++++++ pom.xml | 1 - 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java create mode 100644 core/src/main/resources/mapper/RegulationTypeMapper.xml diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java new file mode 100644 index 0000000..0c99771 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java @@ -0,0 +1,27 @@ +package com.dite.znpt.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/07/29 + * @Description: 制度类型请求DTO + */ +@Data +@ApiModel(value = "RegulationTypeRequest", description = "制度类型请求") +public class RegulationTypeRequest { + + @ApiModelProperty("类型名称") + private String typeName; + + @ApiModelProperty("排序顺序") + private Integer sortOrder; + + @ApiModelProperty("是否启用") + private String isEnabled; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java new file mode 100644 index 0000000..1057ff8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java @@ -0,0 +1,59 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; + +/** + * @author wangna + * @date 2025/07/29 + * @Description: 制度类型实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("regulation_type") +@ApiModel(value="RegulationTypeEntity对象", description="制度类型") +public class RegulationTypeEntity extends AuditableEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("类型ID") + @ApiModelProperty("类型ID") + @TableId(value = "type_id", type = IdType.ASSIGN_UUID) + private String typeId; + + @ExcelProperty("类型名称") + @ApiModelProperty("类型名称") + @TableField("type_name") + private String typeName; + + @ExcelProperty("状态") + @ApiModelProperty("状态:ENABLED-启用,DISABLED-禁用") + @TableField("status") + private String status; + + @ExcelProperty("排序顺序") + @ApiModelProperty("排序顺序") + @TableField("sort_order") + private Integer sortOrder; + + @ExcelProperty("备注") + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ExcelProperty("删除标志(0代表存在,1代表删除)") + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; + + @TableField(exist = false) + @ApiModelProperty("创建人姓名") + private String createByName; +} \ No newline at end of file diff --git a/core/src/main/resources/mapper/RegulationTypeMapper.xml b/core/src/main/resources/mapper/RegulationTypeMapper.xml new file mode 100644 index 0000000..7ce5f6b --- /dev/null +++ b/core/src/main/resources/mapper/RegulationTypeMapper.xml @@ -0,0 +1,32 @@ + + + + + + rt.type_id, rt.type_name, rt.status, rt.sort_order, rt.remark, rt.del_flag, + rt.create_by, rt.create_time, rt.update_by, rt.update_time + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index fcdc462..4991235 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,6 @@ core - sip web flowable From 075d1daf02db000c9ce2c301669fa8ea84edbbe6 Mon Sep 17 00:00:00 2001 From: "Mr.j" <2221464500@qq.com> Date: Mon, 4 Aug 2025 17:46:42 +0800 Subject: [PATCH 14/38] Revert "Merge branch 'jgq' into master" This reverts commit d4883a7fb2a502e46f62e238e6adfa9faadd7db8, reversing changes made to 258806b499187bd356dc12ff694fc05b169b88b3. --- .../CustomLocalDateTimeDeserializer.java | 20 +- .../java/com/dite/znpt/config/Schedule.java | 2 +- .../dite/znpt/converts/EquipmentConverts.java | 24 - .../znpt/domain/entity/EquipmentEntity.java | 137 ----- .../entity/TrainingCertificateEntity.java | 71 --- .../entity/TrainingInteractionEntity.java | 65 -- .../domain/entity/TrainingMaterialEntity.java | 70 --- .../domain/entity/TrainingPlanEntity.java | 96 --- .../domain/entity/TrainingRecordEntity.java | 92 --- .../dite/znpt/domain/vo/EquipmentListReq.java | 127 ---- .../com/dite/znpt/domain/vo/EquipmentReq.java | 174 +----- .../dite/znpt/domain/vo/EquipmentResp.java | 149 ----- .../znpt/domain/vo/TrainingMaterialResp.java | 36 -- .../znpt/domain/vo/TrainingPlanListReq.java | 36 -- .../znpt/domain/vo/TrainingPlanListResp.java | 69 --- .../dite/znpt/domain/vo/TrainingPlanReq.java | 63 -- .../dite/znpt/domain/vo/TrainingPlanResp.java | 76 --- .../znpt/domain/vo/TrainingRecordResp.java | 51 -- .../com/dite/znpt/enums/HealthStatusEnum.java | 53 -- .../dite/znpt/enums/LocationStatusEnum.java | 55 -- .../com/dite/znpt/mapper/EquipmentMapper.java | 10 +- .../mapper/TrainingCertificateMapper.java | 15 - .../mapper/TrainingInteractionMapper.java | 15 - .../znpt/mapper/TrainingMaterialMapper.java | 15 - .../dite/znpt/mapper/TrainingPlanMapper.java | 27 - .../znpt/mapper/TrainingRecordMapper.java | 15 - .../dite/znpt/service/EquipmentService.java | 7 +- .../znpt/service/TrainingPlanService.java | 78 --- .../znpt/service/TrainingRecordService.java | 13 - .../service/impl/EquipmentServiceImpl.java | 562 ++---------------- .../service/impl/TrainingPlanServiceImpl.java | 123 ---- .../impl/TrainingRecordServiceImpl.java | 17 - .../java/com/dite/znpt/util/PageUtil.java | 4 - .../main/resources/mapper/EquipmentMapper.xml | 31 + .../resources/mapper/TrainingPlanMapper.xml | 50 -- doc/aesDemo.html | 459 ++++++++++++++ pom.xml | 107 ++-- web/pom.xml | 6 +- .../znpt/web/controller/CommonController.java | 25 +- .../web/controller/EquipmentController.java | 13 +- .../controller/TrainingPlanController.java | 79 --- .../znpt/web/controller/VideoController.java | 0 42 files changed, 625 insertions(+), 2512 deletions(-) delete mode 100644 core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java delete mode 100644 core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java delete mode 100644 core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java delete mode 100644 core/src/main/java/com/dite/znpt/service/TrainingPlanService.java delete mode 100644 core/src/main/java/com/dite/znpt/service/TrainingRecordService.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java delete mode 100644 core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java create mode 100644 core/src/main/resources/mapper/EquipmentMapper.xml delete mode 100644 core/src/main/resources/mapper/TrainingPlanMapper.xml create mode 100644 doc/aesDemo.html delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java delete mode 100644 web/src/main/java/com/dite/znpt/web/controller/VideoController.java diff --git a/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java b/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java index 5d748f0..9e3e1e6 100644 --- a/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java +++ b/core/src/main/java/com/dite/znpt/config/CustomLocalDateTimeDeserializer.java @@ -10,27 +10,11 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CustomLocalDateTimeDeserializer extends JsonDeserializer { - private static final DateTimeFormatter FORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - private static final DateTimeFormatter FORMATTER2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String date = p.getText(); - if (date == null || date.trim().isEmpty()) { - return null; - } - - try { - // 尝试第一种格式 yyyy-MM-dd HH:mm:ss - return LocalDateTimeUtil.parse(date, FORMATTER1); - } catch (Exception e1) { - try { - // 尝试第二种格式 yyyy/MM/dd HH:mm - return LocalDateTimeUtil.parse(date, FORMATTER2); - } catch (Exception e2) { - // 如果都失败,尝试自动解析 - return LocalDateTimeUtil.parse(date); - } - } + return LocalDateTimeUtil.parse(date, FORMATTER); } } diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java index a9b73f1..6e38623 100644 --- a/core/src/main/java/com/dite/znpt/config/Schedule.java +++ b/core/src/main/java/com/dite/znpt/config/Schedule.java @@ -41,7 +41,7 @@ public class Schedule { List list = imageService.lambdaQuery().eq(ImageEntity::getPreTreatment, "0") .isNotNull(ImageEntity::getPartId) .isNotNull(ImageEntity::getProjectId).list(); - List partIds = list.stream().map(ImageEntity::getPartId).collect(Collectors.toList()); + List partIds = list.stream().map(ImageEntity::getPartId).toList(); Map partRespMap = partService.listInfos(partIds).stream().collect(Collectors.toMap(PartResp::getPartId, Function.identity())); // 预处理 List successList = new ArrayList<>(); diff --git a/core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java b/core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java deleted file mode 100644 index f2f09d3..0000000 --- a/core/src/main/java/com/dite/znpt/converts/EquipmentConverts.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dite.znpt.converts; - -import com.dite.znpt.domain.entity.EquipmentEntity; -import com.dite.znpt.domain.vo.EquipmentReq; -import org.mapstruct.Mapper; -import org.mapstruct.NullValuePropertyMappingStrategy; -import org.mapstruct.factory.Mappers; - -/** - * 设备信息转换器 - * @author Bear.G - * @date 2025/1/1 - */ -@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) -public interface EquipmentConverts { - EquipmentConverts INSTANCE = Mappers.getMapper(EquipmentConverts.class); - - /** - * 将EquipmentReq转换为EquipmentEntity - * @param req 设备请求对象 - * @return 设备实体对象 - */ - EquipmentEntity toEquipmentEntity(EquipmentReq req); -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java index 6609199..098ae58 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/EquipmentEntity.java @@ -9,8 +9,6 @@ import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; /** * @author Bear.G @@ -29,9 +27,6 @@ public class EquipmentEntity extends AuditableEntity implements Serializable { @TableId(type = IdType.ASSIGN_ID) private String equipmentId; - @ApiModelProperty("资产编号") - private String assetCode; - @ApiModelProperty("设备名称") private String equipmentName; @@ -50,138 +45,6 @@ public class EquipmentEntity extends AuditableEntity implements Serializable { @ApiModelProperty("设备序列号") private String equipmentSn; - @ApiModelProperty("品牌") - private String brand; - - @ApiModelProperty("配置规格/参数") - private String specification; - - @ApiModelProperty("位置状态") - private String locationStatus; - - @ApiModelProperty("设备当前物理位置") - private String physicalLocation; - - @ApiModelProperty("负责人") - private String responsiblePerson; - - @ApiModelProperty("健康状态") - private String healthStatus; - - @ApiModelProperty("采购时间") - private LocalDateTime purchaseTime; - - @ApiModelProperty("入库时间") - private LocalDateTime inStockTime; - - @ApiModelProperty("启用时间") - private LocalDateTime activationTime; - - @ApiModelProperty("预计报废时间") - private LocalDateTime expectedScrapTime; - - @ApiModelProperty("实际报废时间") - private LocalDateTime actualScrapTime; - - @ApiModelProperty("状态变更时间") - private LocalDateTime statusChangeTime; - - @ApiModelProperty("采购订单") - private String purchaseOrder; - - @ApiModelProperty("供应商名称") - private String supplierName; - - @ApiModelProperty("采购价格") - private BigDecimal purchasePrice; - - @ApiModelProperty("当前净值") - private BigDecimal currentNetValue; - - @ApiModelProperty("折旧方法") - private String depreciationMethod; - - @ApiModelProperty("折旧年限") - private Integer depreciationYears; - - @ApiModelProperty("残值") - private BigDecimal salvageValue; - - @ApiModelProperty("保修截止日期") - private LocalDateTime warrantyExpireDate; - - @ApiModelProperty("上次维护日期") - private LocalDateTime lastMaintenanceDate; - - @ApiModelProperty("下次维护日期") - private LocalDateTime nextMaintenanceDate; - - @ApiModelProperty("维护人员") - private String maintenancePerson; - - @ApiModelProperty("库存条码") - private String inventoryBarcode; - - @ApiModelProperty("资产备注") - private String assetRemark; - - @ApiModelProperty("使用部门/人") - private String usingDepartment; - - @ApiModelProperty("领用时间") - private LocalDateTime borrowingTime; - - @ApiModelProperty("归还时间") - private LocalDateTime returnTime; - - @ApiModelProperty("出库时间") - private LocalDateTime outStockTime; - - @ApiModelProperty("总使用时间") - private String totalUsageTime; - - @ApiModelProperty("折旧率") - private BigDecimal depreciationRate; - - @ApiModelProperty("折旧方法说明") - private String depreciationMethodDesc; - - @ApiModelProperty("发票") - private String invoice; - - @ApiModelProperty("发票状态") - private String invoiceStatus; - - @ApiModelProperty("附件") - private String attachments; - - @ApiModelProperty("照片") - private String photos; - - @ApiModelProperty("条码") - private String barcode; - - @ApiModelProperty("导入人") - private String importer; - - @ApiModelProperty("盘库时间/状态1") - private String inventoryTimeStatus1; - - @ApiModelProperty("盘库时间/状态2") - private String inventoryTimeStatus2; - - @ApiModelProperty("盘库时间/状态3") - private String inventoryTimeStatus3; - - @ApiModelProperty("盘点时间/状态1") - private String inventoryCheckTimeStatus1; - - @ApiModelProperty("盘点时间/状态2") - private String inventoryCheckTimeStatus2; - - @ApiModelProperty("盘点时间/状态3") - private String inventoryCheckTimeStatus3; - @ApiModelProperty("当前使用记录id") @TableField(updateStrategy = FieldStrategy.ALWAYS) private String useRecordId; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java deleted file mode 100644 index b597ffd..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/TrainingCertificateEntity.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.dite.znpt.domain.entity; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDate; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训证书表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("training_certificate") -@ApiModel(value="TrainingCertificateEntity对象", description="培训证书表") -public class TrainingCertificateEntity extends AuditableEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @ExcelProperty("证书ID") - @ApiModelProperty("证书ID") - @TableId(value = "certificate_id", type = IdType.ASSIGN_UUID) - private String certificateId; - - @ExcelProperty("培训记录ID") - @ApiModelProperty("培训记录ID") - @TableField("record_id") - private String recordId; - - @ExcelProperty("证书编号") - @ApiModelProperty("证书编号") - @TableField("certificate_code") - private String certificateCode; - - @ExcelProperty("证书名称") - @ApiModelProperty("证书名称") - @TableField("certificate_name") - private String certificateName; - - @ExcelProperty("发证日期") - @ApiModelProperty("发证日期") - @TableField("issue_date") - private LocalDate issueDate; - - @ExcelProperty("有效期至") - @ApiModelProperty("有效期至") - @TableField("valid_until") - private LocalDate validUntil; - - @ExcelProperty("证书文件路径") - @ApiModelProperty("证书文件路径") - @TableField("certificate_path") - private String certificatePath; - - @ExcelProperty("状态") - @ApiModelProperty("状态:VALID-有效,EXPIRED-已过期,REVOKED-已撤销") - @TableField("status") - private String status; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java deleted file mode 100644 index f8a0d0a..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/TrainingInteractionEntity.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.dite.znpt.domain.entity; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.io.Serializable; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训互动记录表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("training_interaction") -@ApiModel(value="TrainingInteractionEntity对象", description="培训互动记录表") -public class TrainingInteractionEntity extends AuditableEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @ExcelProperty("互动记录ID") - @ApiModelProperty("互动记录ID") - @TableId(value = "interaction_id", type = IdType.ASSIGN_UUID) - private String interactionId; - - @ExcelProperty("培训计划ID") - @ApiModelProperty("培训计划ID") - @TableField("plan_id") - private String planId; - - @ExcelProperty("用户ID") - @ApiModelProperty("用户ID") - @TableField("user_id") - private String userId; - - @ExcelProperty("用户姓名") - @ApiModelProperty("用户姓名") - @TableField("user_name") - private String userName; - - @ExcelProperty("互动类型") - @ApiModelProperty("互动类型:QUESTION-提问,ANSWER-回答,COMMENT-评论,LIKE-点赞") - @TableField("interaction_type") - private String interactionType; - - @ExcelProperty("互动内容") - @ApiModelProperty("互动内容") - @TableField("content") - private String content; - - @ExcelProperty("父级互动ID") - @ApiModelProperty("父级互动ID(用于回复)") - @TableField("parent_id") - private String parentId; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java deleted file mode 100644 index 5ccb74e..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/TrainingMaterialEntity.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.dite.znpt.domain.entity; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.io.Serializable; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训材料表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("training_material") -@ApiModel(value="TrainingMaterialEntity对象", description="培训材料表") -public class TrainingMaterialEntity extends AuditableEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @ExcelProperty("培训材料ID") - @ApiModelProperty("培训材料ID") - @TableId(value = "material_id", type = IdType.ASSIGN_UUID) - private String materialId; - - @ExcelProperty("培训计划ID") - @ApiModelProperty("培训计划ID") - @TableField("plan_id") - private String planId; - - @ExcelProperty("材料名称") - @ApiModelProperty("材料名称") - @TableField("material_name") - private String materialName; - - @ExcelProperty("材料类型") - @ApiModelProperty("材料类型:DOCUMENT-文档,VIDEO-视频,AUDIO-音频,IMAGE-图片") - @TableField("material_type") - private String materialType; - - @ExcelProperty("材料路径") - @ApiModelProperty("材料路径") - @TableField("material_path") - private String materialPath; - - @ExcelProperty("材料大小") - @ApiModelProperty("材料大小(字节)") - @TableField("material_size") - private Long materialSize; - - @ExcelProperty("材料描述") - @ApiModelProperty("材料描述") - @TableField("description") - private String description; - - @ExcelProperty("排序") - @ApiModelProperty("排序") - @TableField("sort_order") - private Integer sortOrder; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java deleted file mode 100644 index 5c705fe..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/TrainingPlanEntity.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.dite.znpt.domain.entity; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("training_plan") -@ApiModel(value="TrainingPlanEntity对象", description="培训计划表") -public class TrainingPlanEntity extends AuditableEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @ExcelProperty("培训计划ID") - @ApiModelProperty("培训计划ID") - @TableId(value = "plan_id", type = IdType.ASSIGN_UUID) - private String planId; - - @ExcelProperty("培训计划名称") - @ApiModelProperty("培训计划名称") - @TableField("plan_name") - private String planName; - - @ExcelProperty("培训类型") - @ApiModelProperty("培训类型:SAFETY-安全教育,SKILL-技能培训,CULTURE-企业文化") - @TableField("training_type") - private String trainingType; - - @ExcelProperty("培训级别") - @ApiModelProperty("培训级别:SITE-现场级,DEPARTMENT-部门级,COMPANY-公司级") - @TableField("training_level") - private String trainingLevel; - - @ExcelProperty("培训内容") - @ApiModelProperty("培训内容") - @TableField("training_content") - private String trainingContent; - - @ExcelProperty("培训讲师") - @ApiModelProperty("培训讲师") - @TableField("trainer") - private String trainer; - - @ExcelProperty("培训地点") - @ApiModelProperty("培训地点") - @TableField("training_location") - private String trainingLocation; - - @ExcelProperty("培训开始时间") - @ApiModelProperty("培训开始时间") - @TableField("start_time") - private LocalDateTime startTime; - - @ExcelProperty("培训结束时间") - @ApiModelProperty("培训结束时间") - @TableField("end_time") - private LocalDateTime endTime; - - @ExcelProperty("培训状态") - @ApiModelProperty("培训状态:DRAFT-草稿,PUBLISHED-已发布,IN_PROGRESS-进行中,COMPLETED-已完成,CANCELLED-已取消") - @TableField("status") - private String status; - - @ExcelProperty("最大参训人数") - @ApiModelProperty("最大参训人数") - @TableField("max_participants") - private Integer maxParticipants; - - @ExcelProperty("培训要求") - @ApiModelProperty("培训要求") - @TableField("requirements") - private String requirements; - - @ExcelProperty("备注") - @ApiModelProperty("备注") - @TableField("remark") - private String remark; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java deleted file mode 100644 index 81d6f86..0000000 --- a/core/src/main/java/com/dite/znpt/domain/entity/TrainingRecordEntity.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.dite.znpt.domain.entity; - -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.dite.znpt.domain.AuditableEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训记录表实体类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("training_record") -@ApiModel(value="TrainingRecordEntity对象", description="培训记录表") -public class TrainingRecordEntity extends AuditableEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @ExcelProperty("培训记录ID") - @ApiModelProperty("培训记录ID") - @TableId(value = "record_id", type = IdType.ASSIGN_UUID) - private String recordId; - - @ExcelProperty("培训计划ID") - @ApiModelProperty("培训计划ID") - @TableField("plan_id") - private String planId; - - @ExcelProperty("参训人员ID") - @ApiModelProperty("参训人员ID") - @TableField("user_id") - private String userId; - - @ExcelProperty("参训人员姓名") - @ApiModelProperty("参训人员姓名") - @TableField("user_name") - private String userName; - - @ExcelProperty("部门ID") - @ApiModelProperty("部门ID") - @TableField("dept_id") - private String deptId; - - @ExcelProperty("部门名称") - @ApiModelProperty("部门名称") - @TableField("dept_name") - private String deptName; - - @ExcelProperty("出勤状态") - @ApiModelProperty("出勤状态:PENDING-待确认,PRESENT-出席,ABSENT-缺席,LATE-迟到") - @TableField("attendance_status") - private String attendanceStatus; - - @ExcelProperty("签到时间") - @ApiModelProperty("签到时间") - @TableField("sign_in_time") - private LocalDateTime signInTime; - - @ExcelProperty("签退时间") - @ApiModelProperty("签退时间") - @TableField("sign_out_time") - private LocalDateTime signOutTime; - - @ExcelProperty("培训成绩") - @ApiModelProperty("培训成绩") - @TableField("score") - private BigDecimal score; - - @ExcelProperty("培训反馈") - @ApiModelProperty("培训反馈") - @TableField("feedback") - private String feedback; - - @ExcelProperty("证书ID") - @ApiModelProperty("证书ID") - @TableField("certificate_id") - private String certificateId; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java index 1747ea6..36d9cfc 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentListReq.java @@ -6,7 +6,6 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.time.LocalDateTime; /** * @author Bear.G @@ -27,130 +26,4 @@ public class EquipmentListReq implements Serializable { @ApiModelProperty("设备状态,0-空闲中,1-使用,3-保养中,4-维修中,5-已报废") private String equipmentStatus; - - @ApiModelProperty("设备序列号") - private String equipmentSn; - - @ApiModelProperty("资产编号") - private String assetCode; - - @ApiModelProperty("品牌") - private String brand; - - @ApiModelProperty("位置状态") - private String locationStatus; - - @ApiModelProperty("健康状态") - private String healthStatus; - - @ApiModelProperty("负责人") - private String responsiblePerson; - - @ApiModelProperty("使用状态,0-空闲中,1-使用中") - private String useStatus; - - @ApiModelProperty("项目ID") - private String projectId; - - @ApiModelProperty("用户ID") - private String userId; - - @ApiModelProperty("设备型号") - private String equipmentModel; - - @ApiModelProperty("配置规格/参数") - private String specification; - - @ApiModelProperty("设备当前物理位置") - private String physicalLocation; - - @ApiModelProperty("供应商名称") - private String supplierName; - - @ApiModelProperty("维护人员") - private String maintenancePerson; - - @ApiModelProperty("库存条码") - private String inventoryBarcode; - - @ApiModelProperty("资产备注") - private String assetRemark; - - @ApiModelProperty("使用部门/人") - private String usingDepartment; - - @ApiModelProperty("发票") - private String invoice; - - @ApiModelProperty("条码") - private String barcode; - - @ApiModelProperty("导入人") - private String importer; - - @ApiModelProperty("采购时间开始") - private LocalDateTime purchaseTimeStart; - - @ApiModelProperty("采购时间结束") - private LocalDateTime purchaseTimeEnd; - - @ApiModelProperty("入库时间开始") - private LocalDateTime inStockTimeStart; - - @ApiModelProperty("入库时间结束") - private LocalDateTime inStockTimeEnd; - - @ApiModelProperty("启用时间开始") - private LocalDateTime activationTimeStart; - - @ApiModelProperty("启用时间结束") - private LocalDateTime activationTimeEnd; - - @ApiModelProperty("预计报废时间开始") - private LocalDateTime expectedScrapTimeStart; - - @ApiModelProperty("预计报废时间结束") - private LocalDateTime expectedScrapTimeEnd; - - @ApiModelProperty("保修截止日期开始") - private LocalDateTime warrantyExpireDateStart; - - @ApiModelProperty("保修截止日期结束") - private LocalDateTime warrantyExpireDateEnd; - - @ApiModelProperty("上次维护日期开始") - private LocalDateTime lastMaintenanceDateStart; - - @ApiModelProperty("上次维护日期结束") - private LocalDateTime lastMaintenanceDateEnd; - - @ApiModelProperty("下次维护日期开始") - private LocalDateTime nextMaintenanceDateStart; - - @ApiModelProperty("下次维护日期结束") - private LocalDateTime nextMaintenanceDateEnd; - - @ApiModelProperty("创建时间开始") - private LocalDateTime createTimeStart; - - @ApiModelProperty("创建时间结束") - private LocalDateTime createTimeEnd; - - @ApiModelProperty("更新时间开始") - private LocalDateTime updateTimeStart; - - @ApiModelProperty("更新时间结束") - private LocalDateTime updateTimeEnd; - - @ApiModelProperty("当前页码") - private Integer page = 1; - - @ApiModelProperty("每页大小") - private Integer pageSize = 10; - - @ApiModelProperty("排序字段") - private String orderBy; - - @ApiModelProperty("排序方向") - private String orderDirection = "desc"; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java index 430d19f..db16ba9 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentReq.java @@ -8,8 +8,6 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; /** * @author Bear.G @@ -24,7 +22,7 @@ public class EquipmentReq implements Serializable { @ApiModelProperty("设备名称") @NotBlank(message = "设备名称不能为空") - @Size(max = 200, message = "设备名称长度不能超过200个字") + @Size(max = 100, message = "设备名称长度不能超过100个字") private String equipmentName; @ApiModelProperty("设备类型, 枚举:EquipmentTypeEnum") @@ -33,177 +31,11 @@ public class EquipmentReq implements Serializable { @ApiModelProperty("设备型号") @NotBlank(message = "设备型号不能为空") - @Size(max = 200, message = "设备型号长度不能超过200个字") + @Size(max = 50, message = "设备型号长度不能超过50个字") private String equipmentModel; @ApiModelProperty("设备SN") @NotBlank(message = "设备SN不能为空") - @Size(max = 100, message = "设备SN长度不能超过100个字") + @Size(max = 50, message = "设备SN长度不能超过50个字") private String equipmentSn; - - @ApiModelProperty("资产编号") - @Size(max = 50, message = "资产编号长度不能超过50个字") - private String assetCode; - - @ApiModelProperty("品牌") - @Size(max = 100, message = "品牌长度不能超过100个字") - private String brand; - - @ApiModelProperty("配置规格/参数") - @Size(max = 500, message = "配置规格长度不能超过500个字") - private String specification; - - @ApiModelProperty("设备状态,枚举:EquipmentStatusEnum") - private String equipmentStatus; - - @ApiModelProperty("使用状态,0-空闲中,1-使用中") - private String useStatus; - - @ApiModelProperty("位置状态") - private String locationStatus; - - @ApiModelProperty("设备当前物理位置") - @Size(max = 200, message = "物理位置长度不能超过200个字") - private String physicalLocation; - - @ApiModelProperty("负责人") - @Size(max = 100, message = "负责人长度不能超过100个字") - private String responsiblePerson; - - @ApiModelProperty("健康状态") - private String healthStatus; - - @ApiModelProperty("采购时间") - private LocalDateTime purchaseTime; - - @ApiModelProperty("入库时间") - private LocalDateTime inStockTime; - - @ApiModelProperty("启用时间") - private LocalDateTime activationTime; - - @ApiModelProperty("预计报废时间") - private LocalDateTime expectedScrapTime; - - @ApiModelProperty("实际报废时间") - private LocalDateTime actualScrapTime; - - @ApiModelProperty("状态变更时间") - private LocalDateTime statusChangeTime; - - @ApiModelProperty("采购订单") - @Size(max = 100, message = "采购订单长度不能超过100个字") - private String purchaseOrder; - - @ApiModelProperty("供应商名称") - @Size(max = 200, message = "供应商名称长度不能超过200个字") - private String supplierName; - - @ApiModelProperty("采购价格") - private BigDecimal purchasePrice; - - @ApiModelProperty("当前净值") - private BigDecimal currentNetValue; - - @ApiModelProperty("折旧方法") - private String depreciationMethod; - - @ApiModelProperty("折旧年限") - private Integer depreciationYears; - - @ApiModelProperty("残值") - private BigDecimal salvageValue; - - @ApiModelProperty("保修截止日期") - private LocalDateTime warrantyExpireDate; - - @ApiModelProperty("上次维护日期") - private LocalDateTime lastMaintenanceDate; - - @ApiModelProperty("下次维护日期") - private LocalDateTime nextMaintenanceDate; - - @ApiModelProperty("维护人员") - @Size(max = 100, message = "维护人员长度不能超过100个字") - private String maintenancePerson; - - @ApiModelProperty("库存条码") - @Size(max = 100, message = "库存条码长度不能超过100个字") - private String inventoryBarcode; - - @ApiModelProperty("资产备注") - @Size(max = 1000, message = "资产备注长度不能超过1000个字") - private String assetRemark; - - @ApiModelProperty("使用部门/人") - @Size(max = 200, message = "使用部门/人长度不能超过200个字") - private String usingDepartment; - - @ApiModelProperty("领用时间") - private LocalDateTime borrowingTime; - - @ApiModelProperty("归还时间") - private LocalDateTime returnTime; - - @ApiModelProperty("出库时间") - private LocalDateTime outStockTime; - - @ApiModelProperty("总使用时间") - @Size(max = 100, message = "总使用时间长度不能超过100个字") - private String totalUsageTime; - - @ApiModelProperty("折旧率") - private BigDecimal depreciationRate; - - @ApiModelProperty("折旧方法说明") - @Size(max = 500, message = "折旧方法说明长度不能超过500个字") - private String depreciationMethodDesc; - - @ApiModelProperty("发票") - @Size(max = 100, message = "发票长度不能超过100个字") - private String invoice; - - @ApiModelProperty("发票状态") - @Size(max = 50, message = "发票状态长度不能超过50个字") - private String invoiceStatus; - - @ApiModelProperty("附件") - @Size(max = 500, message = "附件长度不能超过500个字") - private String attachments; - - @ApiModelProperty("照片") - @Size(max = 500, message = "照片长度不能超过500个字") - private String photos; - - @ApiModelProperty("条码") - @Size(max = 100, message = "条码长度不能超过100个字") - private String barcode; - - @ApiModelProperty("导入人") - @Size(max = 100, message = "导入人长度不能超过100个字") - private String importer; - - @ApiModelProperty("盘库时间/状态1") - @Size(max = 100, message = "盘库时间/状态1长度不能超过100个字") - private String inventoryTimeStatus1; - - @ApiModelProperty("盘库时间/状态2") - @Size(max = 100, message = "盘库时间/状态2长度不能超过100个字") - private String inventoryTimeStatus2; - - @ApiModelProperty("盘库时间/状态3") - @Size(max = 100, message = "盘库时间/状态3长度不能超过100个字") - private String inventoryTimeStatus3; - - @ApiModelProperty("盘点时间/状态1") - @Size(max = 100, message = "盘点时间/状态1长度不能超过100个字") - private String inventoryCheckTimeStatus1; - - @ApiModelProperty("盘点时间/状态2") - @Size(max = 100, message = "盘点时间/状态2长度不能超过100个字") - private String inventoryCheckTimeStatus2; - - @ApiModelProperty("盘点时间/状态3") - @Size(max = 100, message = "盘点时间/状态3长度不能超过100个字") - private String inventoryCheckTimeStatus3; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java index 9125499..335a532 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/EquipmentResp.java @@ -6,8 +6,6 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; /** * @author Bear.G @@ -23,9 +21,6 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("设备ID") private String equipmentId; - @ApiModelProperty("资产编号") - private String assetCode; - @ApiModelProperty("设备名称") private String equipmentName; @@ -41,12 +36,6 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("设备SN") private String equipmentSn; - @ApiModelProperty("品牌") - private String brand; - - @ApiModelProperty("配置规格/参数") - private String specification; - @ApiModelProperty("设备状态, 枚举:EquipmentStatusEnum") private String equipmentStatus; @@ -56,138 +45,6 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("设备使用状态,0-空闲中,1-使用中") private String useStatus; - @ApiModelProperty("位置状态") - private String locationStatus; - - @ApiModelProperty("位置状态描述") - private String locationStatusLabel; - - @ApiModelProperty("设备当前物理位置") - private String physicalLocation; - - @ApiModelProperty("负责人") - private String responsiblePerson; - - @ApiModelProperty("健康状态") - private String healthStatus; - - @ApiModelProperty("健康状态描述") - private String healthStatusLabel; - - @ApiModelProperty("采购时间") - private LocalDateTime purchaseTime; - - @ApiModelProperty("入库时间") - private LocalDateTime inStockTime; - - @ApiModelProperty("启用时间") - private LocalDateTime activationTime; - - @ApiModelProperty("预计报废时间") - private LocalDateTime expectedScrapTime; - - @ApiModelProperty("实际报废时间") - private LocalDateTime actualScrapTime; - - @ApiModelProperty("状态变更时间") - private LocalDateTime statusChangeTime; - - @ApiModelProperty("采购订单") - private String purchaseOrder; - - @ApiModelProperty("供应商名称") - private String supplierName; - - @ApiModelProperty("采购价格") - private BigDecimal purchasePrice; - - @ApiModelProperty("当前净值") - private BigDecimal currentNetValue; - - @ApiModelProperty("折旧方法") - private String depreciationMethod; - - @ApiModelProperty("折旧年限") - private Integer depreciationYears; - - @ApiModelProperty("残值") - private BigDecimal salvageValue; - - @ApiModelProperty("保修截止日期") - private LocalDateTime warrantyExpireDate; - - @ApiModelProperty("上次维护日期") - private LocalDateTime lastMaintenanceDate; - - @ApiModelProperty("下次维护日期") - private LocalDateTime nextMaintenanceDate; - - @ApiModelProperty("维护人员") - private String maintenancePerson; - - @ApiModelProperty("库存条码") - private String inventoryBarcode; - - @ApiModelProperty("资产备注") - private String assetRemark; - - @ApiModelProperty("使用部门/人") - private String usingDepartment; - - @ApiModelProperty("领用时间") - private LocalDateTime borrowingTime; - - @ApiModelProperty("归还时间") - private LocalDateTime returnTime; - - @ApiModelProperty("出库时间") - private LocalDateTime outStockTime; - - @ApiModelProperty("总使用时间") - private String totalUsageTime; - - @ApiModelProperty("折旧率") - private BigDecimal depreciationRate; - - @ApiModelProperty("折旧方法说明") - private String depreciationMethodDesc; - - @ApiModelProperty("发票") - private String invoice; - - @ApiModelProperty("发票状态") - private String invoiceStatus; - - @ApiModelProperty("附件") - private String attachments; - - @ApiModelProperty("照片") - private String photos; - - @ApiModelProperty("条码") - private String barcode; - - @ApiModelProperty("导入人") - private String importer; - - @ApiModelProperty("盘库时间/状态1") - private String inventoryTimeStatus1; - - @ApiModelProperty("盘库时间/状态2") - private String inventoryTimeStatus2; - - @ApiModelProperty("盘库时间/状态3") - private String inventoryTimeStatus3; - - @ApiModelProperty("盘点时间/状态1") - private String inventoryCheckTimeStatus1; - - @ApiModelProperty("盘点时间/状态2") - private String inventoryCheckTimeStatus2; - - @ApiModelProperty("盘点时间/状态3") - private String inventoryCheckTimeStatus3; - @ApiModelProperty("项目id") private String projectId; @@ -199,10 +56,4 @@ public class EquipmentResp implements Serializable { @ApiModelProperty("使用人") private String name; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java deleted file mode 100644 index 226da82..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TrainingMaterialResp.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训材料响应VO - */ -@Data -@ApiModel(value="TrainingMaterialResp对象", description="培训材料响应") -public class TrainingMaterialResp { - - @ApiModelProperty("培训材料ID") - private String materialId; - - @ApiModelProperty("材料名称") - private String materialName; - - @ApiModelProperty("材料类型") - private String materialType; - - @ApiModelProperty("材料路径") - private String materialPath; - - @ApiModelProperty("材料大小") - private Long materialSize; - - @ApiModelProperty("材料描述") - private String description; - - @ApiModelProperty("排序") - private Integer sortOrder; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java deleted file mode 100644 index 73c91a4..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListReq.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划列表请求VO - */ -@Data -@ApiModel(value="TrainingPlanListReq对象", description="培训计划列表请求") -public class TrainingPlanListReq { - - @ApiModelProperty("培训计划名称") - private String planName; - - @ApiModelProperty("培训类型") - private String trainingType; - - @ApiModelProperty("培训级别") - private String trainingLevel; - - @ApiModelProperty("培训状态") - private String status; - - @ApiModelProperty("培训讲师") - private String trainer; - - @ApiModelProperty("开始时间") - private String startTime; - - @ApiModelProperty("结束时间") - private String endTime; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java deleted file mode 100644 index 255c784..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanListResp.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.dite.znpt.domain.vo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划列表响应VO - */ -@Data -@ApiModel(value="TrainingPlanListResp对象", description="培训计划列表响应") -public class TrainingPlanListResp { - - @ApiModelProperty("培训计划ID") - private String planId; - - @ApiModelProperty("培训计划名称") - private String planName; - - @ApiModelProperty("培训类型") - private String trainingType; - - @ApiModelProperty("培训级别") - private String trainingLevel; - - @ApiModelProperty("培训内容") - private String trainingContent; - - @ApiModelProperty("培训讲师") - private String trainer; - - @ApiModelProperty("培训地点") - private String trainingLocation; - - @ApiModelProperty("培训开始时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime startTime; - - @ApiModelProperty("培训结束时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime endTime; - - @ApiModelProperty("培训状态") - private String status; - - @ApiModelProperty("最大参训人数") - private Integer maxParticipants; - - @ApiModelProperty("当前参训人数") - private Integer currentParticipants; - - @ApiModelProperty("培训要求") - private String requirements; - - @ApiModelProperty("备注") - private String remark; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @ApiModelProperty("创建人") - private String createBy; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java deleted file mode 100644 index c120521..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanReq.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dite.znpt.domain.vo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划请求VO - */ -@Data -@ApiModel(value="TrainingPlanReq对象", description="培训计划请求") -public class TrainingPlanReq { - - @ApiModelProperty("培训计划名称") - @NotBlank(message = "培训计划名称不能为空") - private String planName; - - @ApiModelProperty("培训类型") - @NotBlank(message = "培训类型不能为空") - private String trainingType; - - @ApiModelProperty("培训级别") - @NotBlank(message = "培训级别不能为空") - private String trainingLevel; - - @ApiModelProperty("培训内容") - private String trainingContent; - - @ApiModelProperty("培训讲师") - private String trainer; - - @ApiModelProperty("培训地点") - private String trainingLocation; - - @ApiModelProperty("培训开始时间") - @NotNull(message = "培训开始时间不能为空") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime startTime; - - @ApiModelProperty("培训结束时间") - @NotNull(message = "培训结束时间不能为空") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime endTime; - - @ApiModelProperty("培训状态") - private String status; - - @ApiModelProperty("最大参训人数") - private Integer maxParticipants; - - @ApiModelProperty("培训要求") - private String requirements; - - @ApiModelProperty("备注") - private String remark; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java deleted file mode 100644 index 297f959..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TrainingPlanResp.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.dite.znpt.domain.vo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划响应VO - */ -@Data -@ApiModel(value="TrainingPlanResp对象", description="培训计划响应") -public class TrainingPlanResp { - - @ApiModelProperty("培训计划ID") - private String planId; - - @ApiModelProperty("培训计划名称") - private String planName; - - @ApiModelProperty("培训类型") - private String trainingType; - - @ApiModelProperty("培训级别") - private String trainingLevel; - - @ApiModelProperty("培训内容") - private String trainingContent; - - @ApiModelProperty("培训讲师") - private String trainer; - - @ApiModelProperty("培训地点") - private String trainingLocation; - - @ApiModelProperty("培训开始时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime startTime; - - @ApiModelProperty("培训结束时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime endTime; - - @ApiModelProperty("培训状态") - private String status; - - @ApiModelProperty("最大参训人数") - private Integer maxParticipants; - - @ApiModelProperty("当前参训人数") - private Integer currentParticipants; - - @ApiModelProperty("培训要求") - private String requirements; - - @ApiModelProperty("备注") - private String remark; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @ApiModelProperty("创建人") - private String createBy; - - @ApiModelProperty("培训材料列表") - private List materials; - - @ApiModelProperty("培训记录列表") - private List records; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java deleted file mode 100644 index 2cccd41..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/TrainingRecordResp.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.dite.znpt.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训记录响应VO - */ -@Data -@ApiModel(value="TrainingRecordResp对象", description="培训记录响应") -public class TrainingRecordResp { - - @ApiModelProperty("培训记录ID") - private String recordId; - - @ApiModelProperty("参训人员ID") - private String userId; - - @ApiModelProperty("参训人员姓名") - private String userName; - - @ApiModelProperty("部门ID") - private String deptId; - - @ApiModelProperty("部门名称") - private String deptName; - - @ApiModelProperty("出勤状态") - private String attendanceStatus; - - @ApiModelProperty("签到时间") - private LocalDateTime signInTime; - - @ApiModelProperty("签退时间") - private LocalDateTime signOutTime; - - @ApiModelProperty("培训成绩") - private BigDecimal score; - - @ApiModelProperty("培训反馈") - private String feedback; - - @ApiModelProperty("证书ID") - private String certificateId; -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java deleted file mode 100644 index 53521ab..0000000 --- a/core/src/main/java/com/dite/znpt/enums/HealthStatusEnum.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.dite.znpt.enums; - -import cn.hutool.json.JSONObject; -import lombok.Getter; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Bear.G - * @date 2025/7/31/周四 15:30 - * @description 设备健康状态枚举 - */ -@Getter -public enum HealthStatusEnum { - EXCELLENT("excellent", "优秀"), - GOOD("good", "良好"), - NORMAL("normal", "一般"), - POOR("poor", "较差"), - BAD("bad", "差"); - - private final String code; - private final String desc; - - HealthStatusEnum(String code, String desc) { - this.code = code; - this.desc = desc; - } - - public static HealthStatusEnum getByCode(String code) { - for (HealthStatusEnum e : HealthStatusEnum.values()) { - if (e.code.equals(code)) { - return e; - } - } - return null; - } - - public static String getDescByCode(String code) { - HealthStatusEnum e = getByCode(code); - return null == e ? null : e.desc; - } - - public static List listAll() { - List list = new ArrayList<>(HealthStatusEnum.values().length); - for (HealthStatusEnum e : HealthStatusEnum.values()) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set(e.code, e.desc); - list.add(jsonObject); - } - return list; - } -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java b/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java deleted file mode 100644 index 8f95140..0000000 --- a/core/src/main/java/com/dite/znpt/enums/LocationStatusEnum.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dite.znpt.enums; - -import cn.hutool.json.JSONObject; -import lombok.Getter; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Bear.G - * @date 2025/7/31/周四 15:30 - * @description 设备位置状态枚举 - */ -@Getter -public enum LocationStatusEnum { - IN_STOCK("in_stock", "库存中"), - ALLOCATED("allocated", "已分配"), - REPAIR("repair", "维修中"), - SCRAP("scrap", "待报废"), - SCRAPPED("scrapped", "已报废"), - BORROWED("borrowed", "外借中"), - LOST("lost", "丢失"); - - private final String code; - private final String desc; - - LocationStatusEnum(String code, String desc) { - this.code = code; - this.desc = desc; - } - - public static LocationStatusEnum getByCode(String code) { - for (LocationStatusEnum e : LocationStatusEnum.values()) { - if (e.code.equals(code)) { - return e; - } - } - return null; - } - - public static String getDescByCode(String code) { - LocationStatusEnum e = getByCode(code); - return null == e ? null : e.desc; - } - - public static List listAll() { - List list = new ArrayList<>(LocationStatusEnum.values().length); - for (LocationStatusEnum e : LocationStatusEnum.values()) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set(e.code, e.desc); - list.add(jsonObject); - } - return list; - } -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java b/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java index 7d3fe18..a0d170f 100644 --- a/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/EquipmentMapper.java @@ -2,14 +2,20 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.EquipmentEntity; -import org.apache.ibatis.annotations.Mapper; +import com.dite.znpt.domain.vo.EquipmentListReq; +import com.dite.znpt.domain.vo.EquipmentResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author Bear.G * @date 2025/7/23/周三 17:38 * @description */ -@Mapper public interface EquipmentMapper extends BaseMapper { + List selectEquipmentResp(@Param("req") EquipmentListReq req); + + EquipmentResp getEquipmentRespByEquipmentId(@Param("equipmentId") String equipmentId); } diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java deleted file mode 100644 index 57d2fc1..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/TrainingCertificateMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.TrainingCertificateEntity; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训证书表Mapper接口 - */ -@Mapper -public interface TrainingCertificateMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java deleted file mode 100644 index df2391a..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/TrainingInteractionMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.TrainingInteractionEntity; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训互动记录表Mapper接口 - */ -@Mapper -public interface TrainingInteractionMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java deleted file mode 100644 index 70a3c72..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/TrainingMaterialMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.TrainingMaterialEntity; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训材料表Mapper接口 - */ -@Mapper -public interface TrainingMaterialMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java deleted file mode 100644 index e1b2063..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/TrainingPlanMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.TrainingPlanEntity; -import com.dite.znpt.domain.vo.TrainingPlanListReq; -import com.dite.znpt.domain.vo.TrainingPlanListResp; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划表Mapper接口 - */ -@Mapper -public interface TrainingPlanMapper extends BaseMapper { - - /** - * 查询培训计划列表 - * - * @param req 查询条件 - * @return 培训计划列表 - */ - List listTrainingPlanListResp(@Param("req") TrainingPlanListReq req); -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java b/core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java deleted file mode 100644 index a7f3371..0000000 --- a/core/src/main/java/com/dite/znpt/mapper/TrainingRecordMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.dite.znpt.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.dite.znpt.domain.entity.TrainingRecordEntity; -import org.apache.ibatis.annotations.Mapper; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训记录表Mapper接口 - */ -@Mapper -public interface TrainingRecordMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/EquipmentService.java b/core/src/main/java/com/dite/znpt/service/EquipmentService.java index 37e3d0c..5c21c21 100644 --- a/core/src/main/java/com/dite/znpt/service/EquipmentService.java +++ b/core/src/main/java/com/dite/znpt/service/EquipmentService.java @@ -1,11 +1,13 @@ package com.dite.znpt.service; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.EquipmentEntity; import com.dite.znpt.domain.vo.EquipmentListReq; import com.dite.znpt.domain.vo.EquipmentReq; import com.dite.znpt.domain.vo.EquipmentResp; +import com.dite.znpt.domain.vo.EquipmentUseRecordReq; + +import java.util.List; /** * @author Bear.G @@ -13,7 +15,8 @@ import com.dite.znpt.domain.vo.EquipmentResp; * @description */ public interface EquipmentService extends IService { - IPage page(EquipmentListReq req); + List page(EquipmentListReq req); + List list(EquipmentListReq req); EquipmentResp detail(String equipmentId); void save(EquipmentReq req); void update(String equipmentId, EquipmentReq req); diff --git a/core/src/main/java/com/dite/znpt/service/TrainingPlanService.java b/core/src/main/java/com/dite/znpt/service/TrainingPlanService.java deleted file mode 100644 index b181b2a..0000000 --- a/core/src/main/java/com/dite/znpt/service/TrainingPlanService.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.dite.znpt.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.TrainingPlanEntity; -import com.dite.znpt.domain.vo.TrainingPlanListReq; -import com.dite.znpt.domain.vo.TrainingPlanListResp; -import com.dite.znpt.domain.vo.TrainingPlanReq; -import com.dite.znpt.domain.vo.TrainingPlanResp; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划表服务接口 - */ -public interface TrainingPlanService extends IService { - - /** - * 分页查询培训计划列表 - * - * @param req 查询条件 - * @return 培训计划列表 - */ - List page(TrainingPlanListReq req); - - /** - * 查询培训计划列表 - * - * @param req 查询条件 - * @return 培训计划列表 - */ - List list(TrainingPlanListReq req); - - /** - * 查询培训计划详情 - * - * @param planId 培训计划ID - * @return 培训计划详情 - */ - TrainingPlanResp detail(String planId); - - /** - * 新增培训计划 - * - * @param req 培训计划信息 - */ - void save(TrainingPlanReq req); - - /** - * 更新培训计划 - * - * @param planId 培训计划ID - * @param req 培训计划信息 - */ - void update(String planId, TrainingPlanReq req); - - /** - * 删除培训计划 - * - * @param planId 培训计划ID - */ - void deleteById(String planId); - - /** - * 发布培训计划 - * - * @param planId 培训计划ID - */ - void publish(String planId); - - /** - * 取消培训计划 - * - * @param planId 培训计划ID - */ - void cancel(String planId); -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/TrainingRecordService.java b/core/src/main/java/com/dite/znpt/service/TrainingRecordService.java deleted file mode 100644 index 1df11b3..0000000 --- a/core/src/main/java/com/dite/znpt/service/TrainingRecordService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dite.znpt.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.dite.znpt.domain.entity.TrainingRecordEntity; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训记录表服务接口 - */ -public interface TrainingRecordService extends IService { - -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java index 0e385a2..8b6b013 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/EquipmentServiceImpl.java @@ -1,387 +1,97 @@ package com.dite.znpt.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; -// 移除EquipmentConverts导入,使用手动转换 +import com.dite.znpt.converts.Converts; import com.dite.znpt.domain.entity.EquipmentEntity; +import com.dite.znpt.domain.entity.EquipmentUseRecordEntity; import com.dite.znpt.domain.vo.EquipmentListReq; import com.dite.znpt.domain.vo.EquipmentReq; import com.dite.znpt.domain.vo.EquipmentResp; +import com.dite.znpt.domain.vo.EquipmentUseRecordReq; import com.dite.znpt.enums.EquipmentStatusEnum; import com.dite.znpt.enums.EquipmentTypeEnum; -import com.dite.znpt.enums.HealthStatusEnum; -import com.dite.znpt.enums.LocationStatusEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.EquipmentMapper; import com.dite.znpt.service.EquipmentService; -import lombok.extern.slf4j.Slf4j; +import com.dite.znpt.service.EquipmentUseRecordService; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.UserService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.StringUtils; +import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; -import java.util.stream.Collectors; -import com.dite.znpt.constant.Constants; /** * @author Bear.G * @date 2025/7/23/周三 17:39 * @description */ -@Slf4j @Service public class EquipmentServiceImpl extends ServiceImpl implements EquipmentService { + @Resource + private EquipmentUseRecordService equipmentUseRecordService; + + @Resource + private UserService userService; + + @Resource + private ProjectService projectService; + @Override - public IPage page(EquipmentListReq req) { - log.info("开始执行设备分页查询,请求参数: {}", req); - - // 创建分页对象 - Page page = new Page<>(req.getPage(), req.getPageSize()); - - // 构建查询条件 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - // 不需要手动添加 del_flag 条件,@TableLogic 注解会自动处理 - - // 添加搜索条件并记录日志 - int conditionCount = 0; - - if (StringUtils.hasText(req.getEquipmentName())) { - queryWrapper.like(EquipmentEntity::getEquipmentName, req.getEquipmentName()); - log.info("添加设备名称查询条件: {}", req.getEquipmentName()); - conditionCount++; - } - if (StringUtils.hasText(req.getEquipmentType())) { - queryWrapper.eq(EquipmentEntity::getEquipmentType, req.getEquipmentType()); - log.info("添加设备类型查询条件: {}", req.getEquipmentType()); - conditionCount++; - } - if (StringUtils.hasText(req.getEquipmentStatus())) { - queryWrapper.eq(EquipmentEntity::getEquipmentStatus, req.getEquipmentStatus()); - log.info("添加设备状态查询条件: {}", req.getEquipmentStatus()); - conditionCount++; - } - if (StringUtils.hasText(req.getEquipmentSn())) { - queryWrapper.like(EquipmentEntity::getEquipmentSn, req.getEquipmentSn()); - log.info("添加设备序列号查询条件: {}", req.getEquipmentSn()); - conditionCount++; - } - if (StringUtils.hasText(req.getAssetCode())) { - queryWrapper.like(EquipmentEntity::getAssetCode, req.getAssetCode()); - log.info("添加资产编号查询条件: {}", req.getAssetCode()); - conditionCount++; - } - if (StringUtils.hasText(req.getBrand())) { - queryWrapper.like(EquipmentEntity::getBrand, req.getBrand()); - log.info("添加品牌查询条件: {}", req.getBrand()); - conditionCount++; - } - if (StringUtils.hasText(req.getLocationStatus())) { - queryWrapper.eq(EquipmentEntity::getLocationStatus, req.getLocationStatus()); - log.info("添加位置状态查询条件: {}", req.getLocationStatus()); - conditionCount++; - } - if (StringUtils.hasText(req.getHealthStatus())) { - queryWrapper.eq(EquipmentEntity::getHealthStatus, req.getHealthStatus()); - log.info("添加健康状态查询条件: {}", req.getHealthStatus()); - conditionCount++; - } - if (StringUtils.hasText(req.getResponsiblePerson())) { - queryWrapper.like(EquipmentEntity::getResponsiblePerson, req.getResponsiblePerson()); - log.info("添加负责人查询条件: {}", req.getResponsiblePerson()); - conditionCount++; - } - if (StringUtils.hasText(req.getUseStatus())) { - queryWrapper.eq(EquipmentEntity::getUseStatus, req.getUseStatus()); - log.info("添加使用状态查询条件: {}", req.getUseStatus()); - conditionCount++; - } - - // 新增查询条件 - if (StringUtils.hasText(req.getEquipmentModel())) { - queryWrapper.like(EquipmentEntity::getEquipmentModel, req.getEquipmentModel()); - log.info("添加设备型号查询条件: {}", req.getEquipmentModel()); - conditionCount++; - } - if (StringUtils.hasText(req.getSpecification())) { - queryWrapper.like(EquipmentEntity::getSpecification, req.getSpecification()); - log.info("添加配置规格查询条件: {}", req.getSpecification()); - conditionCount++; - } - if (StringUtils.hasText(req.getPhysicalLocation())) { - queryWrapper.like(EquipmentEntity::getPhysicalLocation, req.getPhysicalLocation()); - log.info("添加物理位置查询条件: {}", req.getPhysicalLocation()); - conditionCount++; - } - if (StringUtils.hasText(req.getSupplierName())) { - queryWrapper.like(EquipmentEntity::getSupplierName, req.getSupplierName()); - log.info("添加供应商名称查询条件: {}", req.getSupplierName()); - conditionCount++; - } - if (StringUtils.hasText(req.getMaintenancePerson())) { - queryWrapper.like(EquipmentEntity::getMaintenancePerson, req.getMaintenancePerson()); - log.info("添加维护人员查询条件: {}", req.getMaintenancePerson()); - conditionCount++; - } - if (StringUtils.hasText(req.getInventoryBarcode())) { - queryWrapper.like(EquipmentEntity::getInventoryBarcode, req.getInventoryBarcode()); - log.info("添加库存条码查询条件: {}", req.getInventoryBarcode()); - conditionCount++; - } - if (StringUtils.hasText(req.getAssetRemark())) { - queryWrapper.like(EquipmentEntity::getAssetRemark, req.getAssetRemark()); - log.info("添加资产备注查询条件: {}", req.getAssetRemark()); - conditionCount++; - } - - // 新增字段查询条件 - if (StringUtils.hasText(req.getUsingDepartment())) { - queryWrapper.like(EquipmentEntity::getUsingDepartment, req.getUsingDepartment()); - log.info("添加使用部门/人查询条件: {}", req.getUsingDepartment()); - conditionCount++; - } - if (StringUtils.hasText(req.getInvoice())) { - queryWrapper.like(EquipmentEntity::getInvoice, req.getInvoice()); - log.info("添加发票查询条件: {}", req.getInvoice()); - conditionCount++; - } - if (StringUtils.hasText(req.getBarcode())) { - queryWrapper.like(EquipmentEntity::getBarcode, req.getBarcode()); - log.info("添加条码查询条件: {}", req.getBarcode()); - conditionCount++; - } - if (StringUtils.hasText(req.getImporter())) { - queryWrapper.like(EquipmentEntity::getImporter, req.getImporter()); - log.info("添加导入人查询条件: {}", req.getImporter()); - conditionCount++; - } - - // 时间范围查询 - if (req.getPurchaseTimeStart() != null) { - queryWrapper.ge(EquipmentEntity::getPurchaseTime, req.getPurchaseTimeStart()); - log.info("添加采购时间开始查询条件: {}", req.getPurchaseTimeStart()); - conditionCount++; - } - if (req.getPurchaseTimeEnd() != null) { - queryWrapper.le(EquipmentEntity::getPurchaseTime, req.getPurchaseTimeEnd()); - log.info("添加采购时间结束查询条件: {}", req.getPurchaseTimeEnd()); - conditionCount++; - } - if (req.getInStockTimeStart() != null) { - queryWrapper.ge(EquipmentEntity::getInStockTime, req.getInStockTimeStart()); - conditionCount++; - } - if (req.getInStockTimeEnd() != null) { - queryWrapper.le(EquipmentEntity::getInStockTime, req.getInStockTimeEnd()); - conditionCount++; - } - if (req.getActivationTimeStart() != null) { - queryWrapper.ge(EquipmentEntity::getActivationTime, req.getActivationTimeStart()); - conditionCount++; - } - if (req.getActivationTimeEnd() != null) { - queryWrapper.le(EquipmentEntity::getActivationTime, req.getActivationTimeEnd()); - conditionCount++; - } - if (req.getExpectedScrapTimeStart() != null) { - queryWrapper.ge(EquipmentEntity::getExpectedScrapTime, req.getExpectedScrapTimeStart()); - conditionCount++; - } - if (req.getExpectedScrapTimeEnd() != null) { - queryWrapper.le(EquipmentEntity::getExpectedScrapTime, req.getExpectedScrapTimeEnd()); - conditionCount++; - } - if (req.getWarrantyExpireDateStart() != null) { - queryWrapper.ge(EquipmentEntity::getWarrantyExpireDate, req.getWarrantyExpireDateStart()); - conditionCount++; - } - if (req.getWarrantyExpireDateEnd() != null) { - queryWrapper.le(EquipmentEntity::getWarrantyExpireDate, req.getWarrantyExpireDateEnd()); - conditionCount++; - } - if (req.getLastMaintenanceDateStart() != null) { - queryWrapper.ge(EquipmentEntity::getLastMaintenanceDate, req.getLastMaintenanceDateStart()); - conditionCount++; - } - if (req.getLastMaintenanceDateEnd() != null) { - queryWrapper.le(EquipmentEntity::getLastMaintenanceDate, req.getLastMaintenanceDateEnd()); - conditionCount++; - } - if (req.getNextMaintenanceDateStart() != null) { - queryWrapper.ge(EquipmentEntity::getNextMaintenanceDate, req.getNextMaintenanceDateStart()); - conditionCount++; - } - if (req.getNextMaintenanceDateEnd() != null) { - queryWrapper.le(EquipmentEntity::getNextMaintenanceDate, req.getNextMaintenanceDateEnd()); - conditionCount++; - } - if (req.getCreateTimeStart() != null) { - queryWrapper.ge(EquipmentEntity::getCreateTime, req.getCreateTimeStart()); - conditionCount++; - } - if (req.getCreateTimeEnd() != null) { - queryWrapper.le(EquipmentEntity::getCreateTime, req.getCreateTimeEnd()); - conditionCount++; - } - if (req.getUpdateTimeStart() != null) { - queryWrapper.ge(EquipmentEntity::getUpdateTime, req.getUpdateTimeStart()); - conditionCount++; - } - if (req.getUpdateTimeEnd() != null) { - queryWrapper.le(EquipmentEntity::getUpdateTime, req.getUpdateTimeEnd()); - conditionCount++; - } - - log.info("总共添加了 {} 个查询条件", conditionCount); - - // 排序处理 - if (StringUtils.hasText(req.getOrderBy())) { - String orderBy = req.getOrderBy(); - String orderDirection = "desc".equalsIgnoreCase(req.getOrderDirection()) ? "desc" : "asc"; - - switch (orderBy.toLowerCase()) { - case "equipment_name": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getEquipmentName); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getEquipmentName); - } - break; - case "equipment_sn": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getEquipmentSn); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getEquipmentSn); - } - break; - case "asset_code": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getAssetCode); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getAssetCode); - } - break; - case "equipment_type": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getEquipmentType); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getEquipmentType); - } - break; - case "equipment_status": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getEquipmentStatus); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getEquipmentStatus); - } - break; - case "brand": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getBrand); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getBrand); - } - break; - case "responsible_person": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getResponsiblePerson); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getResponsiblePerson); - } - break; - case "purchase_time": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getPurchaseTime); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getPurchaseTime); - } - break; - case "purchase_price": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getPurchasePrice); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getPurchasePrice); - } - break; - case "update_time": - if ("desc".equals(orderDirection)) { - queryWrapper.orderByDesc(EquipmentEntity::getUpdateTime); - } else { - queryWrapper.orderByAsc(EquipmentEntity::getUpdateTime); - } - break; - default: - // 默认按创建时间倒序 - queryWrapper.orderByDesc(EquipmentEntity::getCreateTime); - break; - } - log.info("添加排序条件: {} {}", orderBy, orderDirection); - } else { - // 默认按创建时间倒序 - queryWrapper.orderByDesc(EquipmentEntity::getCreateTime); - log.info("使用默认排序: 按创建时间倒序"); - } - - log.info("执行分页查询,SQL条件: {}", queryWrapper.getTargetSql()); - - // 执行分页查询 - IPage equipmentPage = this.page(page, queryWrapper); - - log.info("查询完成,总记录数: {}, 当前页记录数: {}", equipmentPage.getTotal(), equipmentPage.getRecords().size()); - - // 转换为响应对象 - List equipmentRespList = equipmentPage.getRecords().stream() - .map(this::convertToResp) - .collect(Collectors.toList()); - - // 创建响应分页对象 - Page respPage = new Page<>(equipmentPage.getCurrent(), equipmentPage.getSize(), equipmentPage.getTotal()); - respPage.setRecords(equipmentRespList); - - return respPage; + public List page(EquipmentListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public List list(EquipmentListReq req) { + List list = this.baseMapper.selectEquipmentResp(req); + list.forEach(resp -> { + resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(resp.getEquipmentType())); + resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(resp.getEquipmentStatus())); + }); + return list; } @Override public EquipmentResp detail(String equipmentId) { - EquipmentEntity equipment = this.getById(equipmentId); - if (equipment == null) { - throw new ServiceException(Message.EQUIPMENT_ID_NOT_EXIST); - } - return convertToResp(equipment); + EquipmentResp resp = this.baseMapper.getEquipmentRespByEquipmentId(equipmentId); + resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(resp.getEquipmentType())); + resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(resp.getEquipmentStatus())); + return resp; } @Transactional(rollbackFor = Exception.class) @Override public void save(EquipmentReq req) { - EquipmentEntity entity = convertToEntity(req); - if (getByEquipmentSn(entity.getEquipmentSn()) != null) { + EquipmentEntity entity = Converts.INSTANCE.toEquipmentUseRecordEntity(req); + if(null != getByEquipmentSn(entity.getEquipmentSn())){ throw new ServiceException(Message.EQUIPMENT_SN_EXIST); } this.save(entity); } - private EquipmentEntity getByEquipmentSn(String equipmentSn) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(EquipmentEntity::getEquipmentSn, equipmentSn); - return this.getOne(queryWrapper); + private EquipmentEntity getByEquipmentSn(String equipmentSn){ + return this.getOne(Wrappers.lambdaQuery(EquipmentEntity.class).eq(EquipmentEntity::getEquipmentSn, equipmentSn)); } @Transactional(rollbackFor = Exception.class) @Override public void update(String equipmentId, EquipmentReq req) { EquipmentEntity equipment = this.getById(equipmentId); - if (equipment == null) { + if(null == equipment){ throw new ServiceException(Message.EQUIPMENT_ID_NOT_EXIST); } - if (!equipment.getEquipmentSn().equals(req.getEquipmentSn()) && getByEquipmentSn(req.getEquipmentSn()) != null) { + if(!equipment.getEquipmentSn().equals(req.getEquipmentSn()) && null != getByEquipmentSn(req.getEquipmentSn())){ throw new ServiceException(Message.EQUIPMENT_SN_EXIST); } - EquipmentEntity entity = convertToEntity(req); + EquipmentEntity entity = Converts.INSTANCE.toEquipmentUseRecordEntity(req); entity.setEquipmentId(equipmentId); this.updateById(entity); } @@ -389,194 +99,10 @@ public class EquipmentServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(EquipmentEntity::getEquipmentId, equipmentId) - .set(EquipmentEntity::getEquipmentStatus, "scrap") - .set(EquipmentEntity::getLocationStatus, "scrapped") - .set(EquipmentEntity::getActualScrapTime, LocalDateTime.now()) - .set(EquipmentEntity::getStatusChangeTime, LocalDateTime.now()); - - boolean updateResult = this.update(updateWrapper); - if (!updateResult) { - log.error("设备状态更新失败,设备ID: {}", equipmentId); - throw new ServiceException("设备状态更新失败,请稍后重试"); - } - - // 执行软删除 - 使用 MyBatis-Plus 的逻辑删除方法 - boolean deleteResult = this.removeById(equipmentId); - - if (deleteResult) { - log.info("设备删除成功,设备ID: {}, 设备名称: {}", equipmentId, equipment.getEquipmentName()); - } else { - log.error("设备删除失败,设备ID: {}", equipmentId); - throw new ServiceException("设备删除失败,请稍后重试"); - } - } - - /** - * 将EquipmentReq转换为EquipmentEntity - */ - private EquipmentEntity convertToEntity(EquipmentReq req) { - EquipmentEntity entity = new EquipmentEntity(); - entity.setAssetCode(req.getAssetCode()); - entity.setEquipmentName(req.getEquipmentName()); - entity.setEquipmentModel(req.getEquipmentModel()); - entity.setEquipmentType(req.getEquipmentType()); - entity.setEquipmentStatus(req.getEquipmentStatus()); - entity.setUseStatus(req.getUseStatus()); - entity.setEquipmentSn(req.getEquipmentSn()); - entity.setBrand(req.getBrand()); - entity.setSpecification(req.getSpecification()); - entity.setLocationStatus(req.getLocationStatus()); - entity.setPhysicalLocation(req.getPhysicalLocation()); - entity.setResponsiblePerson(req.getResponsiblePerson()); - entity.setHealthStatus(req.getHealthStatus()); - entity.setPurchaseTime(req.getPurchaseTime()); - entity.setInStockTime(req.getInStockTime()); - entity.setActivationTime(req.getActivationTime()); - entity.setExpectedScrapTime(req.getExpectedScrapTime()); - entity.setActualScrapTime(req.getActualScrapTime()); - entity.setStatusChangeTime(req.getStatusChangeTime()); - entity.setPurchaseOrder(req.getPurchaseOrder()); - entity.setSupplierName(req.getSupplierName()); - entity.setPurchasePrice(req.getPurchasePrice()); - entity.setCurrentNetValue(req.getCurrentNetValue()); - entity.setDepreciationMethod(req.getDepreciationMethod()); - entity.setDepreciationYears(req.getDepreciationYears()); - entity.setSalvageValue(req.getSalvageValue()); - entity.setWarrantyExpireDate(req.getWarrantyExpireDate()); - entity.setLastMaintenanceDate(req.getLastMaintenanceDate()); - entity.setNextMaintenanceDate(req.getNextMaintenanceDate()); - entity.setMaintenancePerson(req.getMaintenancePerson()); - entity.setInventoryBarcode(req.getInventoryBarcode()); - entity.setAssetRemark(req.getAssetRemark()); - - // 新增字段转换 - entity.setUsingDepartment(req.getUsingDepartment()); - entity.setBorrowingTime(req.getBorrowingTime()); - entity.setReturnTime(req.getReturnTime()); - entity.setOutStockTime(req.getOutStockTime()); - entity.setTotalUsageTime(req.getTotalUsageTime()); - entity.setDepreciationRate(req.getDepreciationRate()); - entity.setDepreciationMethodDesc(req.getDepreciationMethodDesc()); - entity.setInvoice(req.getInvoice()); - entity.setInvoiceStatus(req.getInvoiceStatus()); - entity.setAttachments(req.getAttachments()); - entity.setPhotos(req.getPhotos()); - entity.setBarcode(req.getBarcode()); - entity.setImporter(req.getImporter()); - entity.setInventoryTimeStatus1(req.getInventoryTimeStatus1()); - entity.setInventoryTimeStatus2(req.getInventoryTimeStatus2()); - entity.setInventoryTimeStatus3(req.getInventoryTimeStatus3()); - entity.setInventoryCheckTimeStatus1(req.getInventoryCheckTimeStatus1()); - entity.setInventoryCheckTimeStatus2(req.getInventoryCheckTimeStatus2()); - entity.setInventoryCheckTimeStatus3(req.getInventoryCheckTimeStatus3()); - - return entity; - } - - /** - * 转换为响应对象 - */ - private EquipmentResp convertToResp(EquipmentEntity entity) { - EquipmentResp resp = new EquipmentResp(); - resp.setEquipmentId(entity.getEquipmentId()); - resp.setAssetCode(entity.getAssetCode()); - resp.setEquipmentName(entity.getEquipmentName()); - resp.setEquipmentType(entity.getEquipmentType()); - resp.setEquipmentTypeLabel(EquipmentTypeEnum.getDescByCode(entity.getEquipmentType())); - resp.setEquipmentModel(entity.getEquipmentModel()); - resp.setEquipmentSn(entity.getEquipmentSn()); - resp.setBrand(entity.getBrand()); - resp.setSpecification(entity.getSpecification()); - resp.setEquipmentStatus(entity.getEquipmentStatus()); - resp.setEquipmentStatusLabel(EquipmentStatusEnum.getDescByCode(entity.getEquipmentStatus())); - resp.setUseStatus(entity.getUseStatus()); - resp.setLocationStatus(entity.getLocationStatus()); - resp.setLocationStatusLabel(LocationStatusEnum.getDescByCode(entity.getLocationStatus())); - resp.setPhysicalLocation(entity.getPhysicalLocation()); - resp.setResponsiblePerson(entity.getResponsiblePerson()); - resp.setHealthStatus(entity.getHealthStatus()); - resp.setHealthStatusLabel(HealthStatusEnum.getDescByCode(entity.getHealthStatus())); - resp.setPurchaseTime(entity.getPurchaseTime()); - resp.setInStockTime(entity.getInStockTime()); - resp.setActivationTime(entity.getActivationTime()); - resp.setExpectedScrapTime(entity.getExpectedScrapTime()); - resp.setActualScrapTime(entity.getActualScrapTime()); - resp.setStatusChangeTime(entity.getStatusChangeTime()); - resp.setPurchaseOrder(entity.getPurchaseOrder()); - resp.setSupplierName(entity.getSupplierName()); - resp.setPurchasePrice(entity.getPurchasePrice()); - resp.setCurrentNetValue(entity.getCurrentNetValue()); - resp.setDepreciationMethod(entity.getDepreciationMethod()); - resp.setDepreciationYears(entity.getDepreciationYears()); - resp.setSalvageValue(entity.getSalvageValue()); - resp.setWarrantyExpireDate(entity.getWarrantyExpireDate()); - resp.setLastMaintenanceDate(entity.getLastMaintenanceDate()); - resp.setNextMaintenanceDate(entity.getNextMaintenanceDate()); - resp.setMaintenancePerson(entity.getMaintenancePerson()); - resp.setInventoryBarcode(entity.getInventoryBarcode()); - resp.setAssetRemark(entity.getAssetRemark()); - - // 新增字段转换 - resp.setUsingDepartment(entity.getUsingDepartment()); - resp.setBorrowingTime(entity.getBorrowingTime()); - resp.setReturnTime(entity.getReturnTime()); - resp.setOutStockTime(entity.getOutStockTime()); - resp.setTotalUsageTime(entity.getTotalUsageTime()); - resp.setDepreciationRate(entity.getDepreciationRate()); - resp.setDepreciationMethodDesc(entity.getDepreciationMethodDesc()); - resp.setInvoice(entity.getInvoice()); - resp.setInvoiceStatus(entity.getInvoiceStatus()); - resp.setAttachments(entity.getAttachments()); - resp.setPhotos(entity.getPhotos()); - resp.setBarcode(entity.getBarcode()); - resp.setImporter(entity.getImporter()); - resp.setInventoryTimeStatus1(entity.getInventoryTimeStatus1()); - resp.setInventoryTimeStatus2(entity.getInventoryTimeStatus2()); - resp.setInventoryTimeStatus3(entity.getInventoryTimeStatus3()); - resp.setInventoryCheckTimeStatus1(entity.getInventoryCheckTimeStatus1()); - resp.setInventoryCheckTimeStatus2(entity.getInventoryCheckTimeStatus2()); - resp.setInventoryCheckTimeStatus3(entity.getInventoryCheckTimeStatus3()); - - resp.setCreateTime(entity.getCreateTime()); - resp.setUpdateTime(entity.getUpdateTime()); - - return resp; + this.removeById(equipmentId); } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java deleted file mode 100644 index cee73ee..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/TrainingPlanServiceImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.dite.znpt.service.impl; - -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -import com.dite.znpt.domain.entity.TrainingPlanEntity; -import com.dite.znpt.domain.vo.TrainingPlanListReq; -import com.dite.znpt.domain.vo.TrainingPlanListResp; -import com.dite.znpt.domain.vo.TrainingPlanReq; -import com.dite.znpt.domain.vo.TrainingPlanResp; -import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.mapper.TrainingPlanMapper; -import com.dite.znpt.service.TrainingPlanService; -import com.dite.znpt.util.PageUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划表服务实现类 - */ -@Service -@RequiredArgsConstructor -public class TrainingPlanServiceImpl extends ServiceImpl implements TrainingPlanService { - - @Override - public List page(TrainingPlanListReq req) { - PageUtil.startPage(); - return this.list(req); - } - - @Override - public List list(TrainingPlanListReq req) { - return this.baseMapper.listTrainingPlanListResp(req); - } - - @Override - public TrainingPlanResp detail(String planId) { - TrainingPlanEntity entity = this.baseMapper.selectById(planId); - if (entity == null) { - throw new ServiceException("培训计划不存在"); - } - return BeanUtil.copyProperties(entity, TrainingPlanResp.class); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void save(TrainingPlanReq req) { - TrainingPlanEntity entity = BeanUtil.copyProperties(req, TrainingPlanEntity.class); - entity.setStatus("DRAFT"); - entity.setCreateBy(StpUtil.getLoginIdAsString()); - this.baseMapper.insert(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void update(String planId, TrainingPlanReq req) { - TrainingPlanEntity entity = this.baseMapper.selectById(planId); - if (entity == null) { - throw new ServiceException("培训计划不存在"); - } - - BeanUtil.copyProperties(req, entity); - entity.setUpdateBy(StpUtil.getLoginIdAsString()); - this.baseMapper.updateById(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteById(String planId) { - TrainingPlanEntity entity = this.baseMapper.selectById(planId); - if (entity == null) { - throw new ServiceException("培训计划不存在"); - } - - // 检查是否可以删除 - if ("PUBLISHED".equals(entity.getStatus()) || "IN_PROGRESS".equals(entity.getStatus())) { - throw new ServiceException("已发布或进行中的培训计划不能删除"); - } - - this.baseMapper.deleteById(planId); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void publish(String planId) { - TrainingPlanEntity entity = this.baseMapper.selectById(planId); - if (entity == null) { - throw new ServiceException("培训计划不存在"); - } - - if (!"DRAFT".equals(entity.getStatus())) { - throw new ServiceException("只有草稿状态的培训计划才能发布"); - } - - entity.setStatus("PUBLISHED"); - entity.setUpdateBy(StpUtil.getLoginIdAsString()); - this.baseMapper.updateById(entity); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void cancel(String planId) { - TrainingPlanEntity entity = this.baseMapper.selectById(planId); - if (entity == null) { - throw new ServiceException("培训计划不存在"); - } - - if ("COMPLETED".equals(entity.getStatus()) || "CANCELLED".equals(entity.getStatus())) { - throw new ServiceException("已完成或已取消的培训计划不能取消"); - } - - entity.setStatus("CANCELLED"); - entity.setUpdateBy(StpUtil.getLoginIdAsString()); - this.baseMapper.updateById(entity); - } -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java deleted file mode 100644 index 5da01f7..0000000 --- a/core/src/main/java/com/dite/znpt/service/impl/TrainingRecordServiceImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dite.znpt.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.dite.znpt.domain.entity.TrainingRecordEntity; -import com.dite.znpt.mapper.TrainingRecordMapper; -import com.dite.znpt.service.TrainingRecordService; -import org.springframework.stereotype.Service; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训记录表服务实现类 - */ -@Service -public class TrainingRecordServiceImpl extends ServiceImpl implements TrainingRecordService { - -} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/util/PageUtil.java b/core/src/main/java/com/dite/znpt/util/PageUtil.java index a2716cb..5654106 100644 --- a/core/src/main/java/com/dite/znpt/util/PageUtil.java +++ b/core/src/main/java/com/dite/znpt/util/PageUtil.java @@ -18,10 +18,6 @@ public class PageUtil extends PageHelper { PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); } - public static void startPage(Integer pageNum, Integer pageSize) { - PageHelper.startPage(pageNum, pageSize); - } - public static void clearPage() { PageHelper.clearPage(); } diff --git a/core/src/main/resources/mapper/EquipmentMapper.xml b/core/src/main/resources/mapper/EquipmentMapper.xml new file mode 100644 index 0000000..cf8beda --- /dev/null +++ b/core/src/main/resources/mapper/EquipmentMapper.xml @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/TrainingPlanMapper.xml b/core/src/main/resources/mapper/TrainingPlanMapper.xml deleted file mode 100644 index fdfcddf..0000000 --- a/core/src/main/resources/mapper/TrainingPlanMapper.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/doc/aesDemo.html b/doc/aesDemo.html new file mode 100644 index 0000000..6f84f51 --- /dev/null +++ b/doc/aesDemo.html @@ -0,0 +1,459 @@ + + + + + + AES加密解密工具 + + + + + + + +
+ +
+

+ AES加密解密工具 +

+

+ 使用先进的AES加密算法保护您的数据安全,支持多种加密模式和密钥长度 +

+
+ + +
+ +
+

+ 加密 +

+
+
+ + +
+ +
+ +
+ + +
+
+ +
+ +
+
+ + +
+
+ + +
+
+
+ + + + +
+
+ + +
+

+ 解密 +

+
+
+ + +
+ +
+ + +
+ +
+ +
+
+ + +
+
+ + +
+
+
+ + + + +
+
+
+ + +
+

+ 结果 +

+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+ + +
+ + 操作成功 +
+
+ + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 72077c0..fcdc462 100644 --- a/pom.xml +++ b/pom.xml @@ -1,53 +1,54 @@ - - - 4.0.0 - - com.dite.znpt - parent - 1.0.0-SNAPSHOT - - - 17 - - - core - web - flowable - - pom - - - - - - org.springframework.boot - spring-boot-starter-parent - 2.7.18 - pom - import - - - - cn.hutool - hutool-all - 5.8.24 - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 17 - 17 - - - - - - + + + 4.0.0 + + com.dite.znpt + parent + 1.0.0-SNAPSHOT + + + 17 + + + core + sip + web + flowable + + pom + + + + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + pom + import + + + + cn.hutool + hutool-all + 5.8.24 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 17 + 17 + + + + + + diff --git a/web/pom.xml b/web/pom.xml index 0eadebf..c6d6423 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -20,6 +20,11 @@ + + com.dite.znpt + sip + 1.0.0-SNAPSHOT + com.dite.znpt core @@ -50,7 +55,6 @@ - diff --git a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java index ee57378..5371ed3 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/CommonController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/CommonController.java @@ -1,11 +1,11 @@ package com.dite.znpt.web.controller; import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.ImageWorkReq; import com.dite.znpt.enums.*; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.service.ImageService; -import com.dite.znpt.domain.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -15,9 +15,9 @@ import javax.annotation.Resource; import java.io.IOException; /** - * @author Bear.G - * @date 2025/7/24/周四 14:35 - * @description + * @Author: gaoxiong + * @Date: 2025/4/29 23:06 + * @Description: */ @Api(tags = "公共信息") @RestController @@ -175,22 +175,5 @@ public class CommonController { return Result.ok(EquipmentTypeEnum.listAll()); } - @ApiOperation(value = "查询设备状态", httpMethod = "GET") - @GetMapping("/list/equipment-status") - public Result listEquipmentStatus(){ - return Result.ok(EquipmentStatusEnum.listAll()); - } - - @ApiOperation(value = "查询设备位置状态", httpMethod = "GET") - @GetMapping("/list/location-status") - public Result listLocationStatus(){ - return Result.ok(LocationStatusEnum.listAll()); - } - - @ApiOperation(value = "查询设备健康状态", httpMethod = "GET") - @GetMapping("/list/health-status") - public Result listHealthStatus(){ - return Result.ok(HealthStatusEnum.listAll()); - } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java index ac76d30..b3318b5 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java @@ -1,6 +1,5 @@ package com.dite.znpt.web.controller; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.dite.znpt.domain.PageResult; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.vo.EquipmentListReq; @@ -13,13 +12,14 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; /** * @author Bear.G * @date 2025/7/23/周三 17:41 * @description */ -@Api(tags = "设备信息----------------------------") +@Api(tags = "设备信息") @RestController @RequestMapping("/equipment") public class EquipmentController { @@ -30,8 +30,13 @@ public class EquipmentController { @ApiOperation(value = "分页查询设备信息列表", httpMethod = "GET") @GetMapping("/page") public PageResult page(EquipmentListReq req) { - IPage page = equipmentService.page(req); - return PageResult.ok(page.getRecords(), page.getTotal()); + return PageResult.ok(equipmentService.page(req)); + } + + @ApiOperation(value = "查询设备信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(EquipmentListReq req) { + return Result.ok(equipmentService.list(req)); } @ApiOperation(value = "查询设备信息详情", httpMethod = "GET") diff --git a/web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java b/web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java deleted file mode 100644 index 67892d5..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/TrainingPlanController.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.dite.znpt.web.controller; - -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.TrainingPlanListReq; -import com.dite.znpt.domain.vo.TrainingPlanReq; -import com.dite.znpt.service.TrainingPlanService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import javax.validation.Valid; - -/** - * @author huise23 - * @date 2025/01/01 00:00 - * @Description: 培训计划控制器 - */ -@Api(tags = "培训..........................................计划管理") -@RestController -@RequestMapping("/training/plan") -public class TrainingPlanController { - - @Resource - private TrainingPlanService trainingPlanService; - - @ApiOperation(value = "分页查询培训计划列表", httpMethod = "GET") - @GetMapping("/page") - public Result page(TrainingPlanListReq req) { - return Result.ok(trainingPlanService.page(req)); - } - - @ApiOperation(value = "查询培训计划列表", httpMethod = "GET") - @GetMapping("/list") - public Result list(TrainingPlanListReq req) { - return Result.ok(trainingPlanService.list(req)); - } - - @ApiOperation(value = "查询培训计划详情", httpMethod = "GET") - @GetMapping("/detail/{planId}") - public Result detail(@PathVariable String planId) { - return Result.ok(trainingPlanService.detail(planId)); - } - - @ApiOperation(value = "新增培训计划", httpMethod = "POST") - @PostMapping - public Result save(@Valid @RequestBody TrainingPlanReq req) { - trainingPlanService.save(req); - return Result.ok(); - } - - @ApiOperation(value = "更新培训计划", httpMethod = "PUT") - @PutMapping("/{planId}") - public Result update(@PathVariable String planId, @Valid @RequestBody TrainingPlanReq req) { - trainingPlanService.update(planId, req); - return Result.ok(); - } - - @ApiOperation(value = "删除培训计划", httpMethod = "DELETE") - @DeleteMapping("/{planId}") - public Result delete(@PathVariable String planId) { - trainingPlanService.deleteById(planId); - return Result.ok(); - } - - @ApiOperation(value = "发布培训计划", httpMethod = "PUT") - @PutMapping("/{planId}/publish") - public Result publish(@PathVariable String planId) { - trainingPlanService.publish(planId); - return Result.ok(); - } - - @ApiOperation(value = "取消培训计划", httpMethod = "PUT") - @PutMapping("/{planId}/cancel") - public Result cancel(@PathVariable String planId) { - trainingPlanService.cancel(planId); - return Result.ok(); - } -} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/VideoController.java b/web/src/main/java/com/dite/znpt/web/controller/VideoController.java deleted file mode 100644 index e69de29..0000000 From 6ceda40d18a749e09c1c676a1c9d22fe40fe7c13 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Mon, 4 Aug 2025 19:32:38 +0800 Subject: [PATCH 15/38] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=A6=82=E5=88=9D?= =?UTF-8?q?=EF=BC=8C=E4=BD=86=E5=8F=91=E7=8E=B0=E5=85=B6=E4=BB=96bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/RegulationEntity.java | 6 +++- .../domain/entity/RegulationTypeEntity.java | 10 +++--- .../znpt/service/RegulationTypeService.java | 2 +- .../service/impl/RegulationServiceImpl.java | 5 +++ .../impl/RegulationTypeServiceImpl.java | 2 +- .../resources/mapper/RegulationMapper.xml | 32 +++++++++++++++++++ .../resources/mapper/RegulationTypeMapper.xml | 10 +++--- 7 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 core/src/main/resources/mapper/RegulationMapper.xml diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java index 25f144f..6dd36f1 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java @@ -42,7 +42,7 @@ public class RegulationEntity extends AuditableEntity implements Serializable { @ExcelProperty("制度类型") @ApiModelProperty("制度类型") @TableField("regulation_type") - private String regulationType; + private String type; @ExcelProperty("制度状态") @ApiModelProperty("制度状态:DRAFT-草案,APPROVED-已公示,PUBLISHED-已发布,ARCHIVED-已归档") @@ -96,4 +96,8 @@ public class RegulationEntity extends AuditableEntity implements Serializable { @TableField(exist = false) @ApiModelProperty("创建人姓名") private String createByName; + + @TableField(exist = false) + @ApiModelProperty("制度类型") + private String regulationType; } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java index 1057ff8..eb8154c 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java @@ -33,10 +33,10 @@ public class RegulationTypeEntity extends AuditableEntity implements Serializabl @TableField("type_name") private String typeName; - @ExcelProperty("状态") - @ApiModelProperty("状态:ENABLED-启用,DISABLED-禁用") - @TableField("status") - private String status; + @ExcelProperty("是否启用") + @ApiModelProperty("是否启用(1-启用,0-禁用)") + @TableField("is_enabled") + private String isEnabled; @ExcelProperty("排序顺序") @ApiModelProperty("排序顺序") @@ -55,5 +55,5 @@ public class RegulationTypeEntity extends AuditableEntity implements Serializabl @TableField(exist = false) @ApiModelProperty("创建人姓名") - private String createByName; + private String createrName; } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java index c5b8715..e221f60 100644 --- a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java +++ b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java @@ -16,7 +16,7 @@ public interface RegulationTypeService extends IService { * @param page 页码 * @param size 页大小 * @param typeName 类型名称 - * @param status 状态 + * @param status 是否启用(1-启用,0-禁用) * @param remark 备注 * @return 结果 */ diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java index cf52e5f..f0cb608 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java @@ -203,6 +203,11 @@ public class RegulationServiceImpl extends ServiceImpl() - .eq(RegulationEntity::getRegulationType, typeName) + .eq(RegulationEntity::getType, typeName) .eq(RegulationEntity::getDelFlag, "0") ); // 如果有制度使用此类型,则不允许删除 diff --git a/core/src/main/resources/mapper/RegulationMapper.xml b/core/src/main/resources/mapper/RegulationMapper.xml new file mode 100644 index 0000000..d3b6177 --- /dev/null +++ b/core/src/main/resources/mapper/RegulationMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/RegulationTypeMapper.xml b/core/src/main/resources/mapper/RegulationTypeMapper.xml index 7ce5f6b..53211ec 100644 --- a/core/src/main/resources/mapper/RegulationTypeMapper.xml +++ b/core/src/main/resources/mapper/RegulationTypeMapper.xml @@ -3,24 +3,24 @@ - rt.type_id, rt.type_name, rt.status, rt.sort_order, rt.remark, rt.del_flag, + rt.type_id, rt.type_name, rt.is_enabled, rt.sort_order, rt.remark, rt.del_flag, rt.create_by, rt.create_time, rt.update_by, rt.update_time - select - - from project_daily_report a - - - and a.report_id like concat ('%', #{reportId}, '%') - - - and a.project_id like concat ('%', #{projectId}, '%') - - - and a.report_date = #{reportDate} - - - and a.submit_user like concat ('%', #{submitUser}, '%') - - - - - diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java deleted file mode 100644 index b49bf8f..0000000 --- a/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.dite.znpt.web.controller; - -import com.dite.znpt.domain.PageResult; -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.vo.ProjectDailyReportListReq; -import com.dite.znpt.domain.vo.ProjectDailyReportReq; -import com.dite.znpt.domain.vo.ProjectDailyReportResp; -import com.dite.znpt.service.ProjectDailyReportService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -/** - * @author huise23 - * @date 2025/07/27 19:51 - */ -@Api(tags = "项目日报信息") -@RestController -@RequestMapping("/project-daily-report") -public class ProjectDailyReportController { - @Resource - private ProjectDailyReportService projectDailyReportService; - - @ApiOperation(value = "获取项目日报信息列表", httpMethod = "GET") - @GetMapping("/list") - public PageResult list(ProjectDailyReportListReq projectDailyReportReq) { - return PageResult.ok(projectDailyReportService.selectList(projectDailyReportReq)); - } - - @ApiOperation(value = "根据项目日报信息Id获取详细信息", httpMethod = "GET") - @GetMapping("/{reportId}") - public Result getInfo(@PathVariable String reportId) { - return Result.ok(projectDailyReportService.selectById(reportId)); - } - - @ApiOperation(value = "获取登录人当日日报", httpMethod = "GET") - @GetMapping("/my-today/{projectId}") - public Result myToday(@PathVariable String projectId) { - return Result.ok(projectDailyReportService.myToday(projectId)); - } - - @ApiOperation(value = "新增项目日报信息", httpMethod = "POST") - @PostMapping - public Result add(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { - projectDailyReportService.saveData(projectDailyReportReq); - return Result.ok(); - } - - @ApiOperation(value = "修改项目日报信息", httpMethod = "PUT") - @PutMapping - public Result edit(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { - projectDailyReportService.updateData(projectDailyReportReq); - return Result.ok(); - } - - @ApiOperation(value = "删除项目日报信息", httpMethod = "DELETE") - @DeleteMapping("/{reportId}") - public Result remove(@PathVariable String reportId) { - projectDailyReportService.deleteById(reportId); - return Result.ok(); - } -} - From 3717cbc4cec3698b9b6ea1abfcd42c54aca7c07d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Mon, 28 Jul 2025 18:19:42 +0800 Subject: [PATCH 19/38] =?UTF-8?q?=E6=8B=9B=E6=8A=95=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/BiddingInfoEntity.java | 62 ++++++++++++++ .../znpt/domain/entity/OutbidInfoEntity.java | 54 +++++++++++++ .../znpt/domain/entity/TenderInfoEntity.java | 63 +++++++++++++++ .../dite/znpt/domain/vo/BiddingInfoReq.java | 55 +++++++++++++ .../dite/znpt/domain/vo/BiddingInfoResp.java | 23 ++++++ .../dite/znpt/domain/vo/OutbidInfoReq.java | 46 +++++++++++ .../dite/znpt/domain/vo/OutbidInfoResp.java | 29 +++++++ .../dite/znpt/domain/vo/TenderInfoReq.java | 54 +++++++++++++ .../dite/znpt/domain/vo/TenderInfoResp.java | 36 +++++++++ .../com/dite/znpt/enums/ProjectTypeEnum.java | 49 +++++++++++ .../dite/znpt/mapper/BiddingInfoMapper.java | 12 +++ .../dite/znpt/mapper/OutbidInfoMapper.java | 12 +++ .../dite/znpt/mapper/TenderInfoMapper.java | 12 +++ .../dite/znpt/service/BiddingInfoService.java | 24 ++++++ .../dite/znpt/service/OutbidInfoService.java | 27 +++++++ .../dite/znpt/service/TenderInfoService.java | 25 ++++++ .../service/impl/BiddingInfoServiceImpl.java | 51 ++++++++++++ .../service/impl/OutbidInfoServiceImpl.java | 61 ++++++++++++++ .../service/impl/TenderInfoServiceImpl.java | 55 +++++++++++++ .../resources/mapper/BiddingInfoMapper.xml | 5 ++ .../resources/mapper/OutbidInfoMapper.xml | 5 ++ core/src/main/resources/mapper/UserMapper.xml | 3 +- .../resources/mapper/tenderInfoMapper.xml | 5 ++ .../web/controller/BiddingInfoController.java | 68 ++++++++++++++++ .../web/controller/OutbidInfoController.java | 81 +++++++++++++++++++ .../web/controller/TenderInfoController.java | 75 +++++++++++++++++ 26 files changed, 990 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/BiddingInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/OutbidInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/TenderInfoService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java create mode 100644 core/src/main/resources/mapper/BiddingInfoMapper.xml create mode 100644 core/src/main/resources/mapper/OutbidInfoMapper.xml create mode 100644 core/src/main/resources/mapper/tenderInfoMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java create mode 100644 web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java new file mode 100644 index 0000000..126f8df --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java @@ -0,0 +1,62 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:42 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("bidding_info") +@ApiModel(value="BiddingInfoEntity对象", description="招标信息表") +public class BiddingInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -2451841606051749490L; + + @ApiModelProperty("招标信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String biddingInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; + + @ApiModelProperty("招标金额") + private BigDecimal biddingAmount; + + @ApiModelProperty("招标截止时间") + private String biddingDeadline; + + @ApiModelProperty("招标信息录入时间") + private LocalDateTime infoEntryTime; + + @ApiModelProperty("招标信息来源") + private String source; + + @ApiModelProperty("招标信息来源网址") + private String sourceWebsite; + + @ApiModelProperty("招标文件") + private String biddingFile; + + @ApiModelProperty("状态:0-待报名,1-已报名") + private String status; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java new file mode 100644 index 0000000..b36f8b2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:44 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("outbid_info") +@ApiModel(value="OutbidInfoEntity对象", description="中标通知信息表") +public class OutbidInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 6941283868242292970L; + + @ApiModelProperty("中标通知信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String outbidId; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; + + @ApiModelProperty("中标金额,单位元,精确到分") + private BigDecimal outbidAmount; + + @ApiModelProperty("工期,单位天") + private Integer duration; + + @ApiModelProperty("中标通知日期") + private LocalDateTime outbidNotifyDate; + + @ApiModelProperty("中标通知文件") + private String outbidFile; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableLogic(value = "0", delval = "1") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java new file mode 100644 index 0000000..d7b9dd4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java @@ -0,0 +1,63 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Bear.G + * @date 2025/7/28/周一 15:47 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("tender_info") +@ApiModel(value="TenderInfoEntity对象", description="投标信息表") +public class TenderInfoEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -5677009089047831619L; + + @ApiModelProperty("投标信息id") + @TableId(type = IdType.ASSIGN_UUID) + private String tenderInfoId; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; + + @ApiModelProperty("投标金额") + private BigDecimal tenderAmount; + + @ApiModelProperty("项目地址") + private String projectAddress; + + @ApiModelProperty("项目类型") + private String projectType; + + @ApiModelProperty("项目描述") + private String projectDescription; + + @ApiModelProperty("投标负责人") + private String tenderManager; + + @ApiModelProperty("投标负责人手机号") + private String tenderManagerPhone; + + @ApiModelProperty("投标文件") + private String tenderFile; + + @ApiModelProperty("删除标志(0代表存在 1代表删除)") + @TableLogic(value = "0", delval = "1") + private String delFlag; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java new file mode 100644 index 0000000..6d428e1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java @@ -0,0 +1,55 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:18 + * @description + */ +@Data +@ApiModel("招标信息请求实体") +public class BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 6967025339487392364L; + + @ApiModelProperty("招标项目") + @Size(max = 50, message = "招标项目不能超过50个字符") + private String biddingProject; + + @ApiModelProperty("招标公司") + @Size(max = 50, message = "招标公司不能超过50个字符") + private String biddingCompany; + + @ApiModelProperty("招标金额") + private BigDecimal biddingAmount; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("招标截止时间") + private LocalDateTime biddingDeadline; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("信息录入时间") + private LocalDateTime infoEntryTime; + + @ApiModelProperty("信息来源") + @Size(max = 50, message = "信息来源不能超过50个字符") + private String source; + + @ApiModelProperty("信息来源网址") + @Size(max = 500, message = "信息来源网址不能超过500个字符") + private String sourceWebsite; + + @ApiModelProperty("招标文件") + @Size(max = 200, message = "招标文件不能超过200个字符") + private String biddingFile; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java new file mode 100644 index 0000000..5419c65 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java @@ -0,0 +1,23 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:17 + * @description + */ +@Data +@ApiModel("招标信息响应实体") +public class BiddingInfoResp extends BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = 2750666223381829115L; + + @ApiModelProperty("招标信息id") + private String biddingInfoId; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java new file mode 100644 index 0000000..dba74e2 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java @@ -0,0 +1,46 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author Bear.G + * @date 2025/7/28/周一 17:05 + * @description + */ +@Data +@ApiModel("中标信息请求实体") +public class OutbidInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -1781661335173747275L; + + @ApiModelProperty("中标信息ID") + @NotBlank(message = "中标信息ID不能为空") + private String biddingInfoId; + + @ApiModelProperty("中标金额") + private BigDecimal outBidAmount; + + @ApiModelProperty("工期") + private Integer duration; + + @ApiModelProperty("中标通知日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime outbidNotifyDate; + + @ApiModelProperty("中标通知文件") + @Size(max = 200, message = "中标通知文件长度不能超过200") + private String outbidNoticeFile; + + @ApiModelProperty("状态:0-已通知,1-已签约") + private String status; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java new file mode 100644 index 0000000..bfc0710 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java @@ -0,0 +1,29 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/28/周一 17:36 + * @description + */ +@Data +@ApiModel("中标信息响应实体") +public class OutbidInfoResp extends OutbidInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -718886028432322862L; + + @ApiModelProperty("中标信息ID") + private String outbidInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java new file mode 100644 index 0000000..a65a217 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:23 + * @description + */ +@Data +@ApiModel("投标信息请求实体") +public class TenderInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -5653933337345116548L; + + @ApiModelProperty("招标信息id") + @NotBlank(message = "招标信息id不能为空") + private String biddingInfoId; + + @ApiModelProperty("投标金额") + private BigDecimal tenderAmount; + + @ApiModelProperty("项目地址") + @Size(max = 500, message = "项目地址不能超过500个字符") + private String projectAddress; + + @ApiModelProperty("项目类型,枚举:ProjectTypeEnum") + private String projectType; + + @ApiModelProperty("招标负责人") + @Size(min = 32, max = 32, message = "招标负责人长度必须为32个字符") + private String tenderManager; + + @Size(min = 11, max = 11, message = "招标负责人联系方式长度必须为11个字符") + @ApiModelProperty("招标负责人联系方式") + private String tenderManagerPhone; + + @Size(max = 100, message = "投标文件不能超过100个字符") + @ApiModelProperty("投标文件") + private String tenderFile; + + @Size(max = 500, message = "项目描述不能超过500个字符") + @ApiModelProperty("项目描述") + private String projectDescription; + +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java new file mode 100644 index 0000000..0c37898 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -0,0 +1,36 @@ +package com.dite.znpt.domain.vo; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:50 + * @description + */ + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:49 + * @description + */ +@Data +@ApiModel("投标信息响应实体") +public class TenderInfoResp extends BiddingInfoReq implements Serializable { + @Serial + private static final long serialVersionUID = -8445413467535624096L; + + @ApiModelProperty("投标标信息ID") + private String tenderInfoId; + + @ApiModelProperty("招标项目") + private String biddingProject; + + @ApiModelProperty("招标公司") + private String biddingCompany; + +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java new file mode 100644 index 0000000..c5e19b4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectTypeEnum.java @@ -0,0 +1,49 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:35 + * @description + */ +@Getter +@AllArgsConstructor +public enum ProjectTypeEnum { + BLADE_CHECK("blade_check", "风电叶片检查"), + OPERATION("operation", "风电运维"), + INSTALL("install", "风电安装"), + OTHER("other", "其他"); + + private final String code; + private final String desc; + + public static ProjectTypeEnum getByCode(String code){ + for (ProjectTypeEnum e : ProjectTypeEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + ProjectTypeEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(ProjectTypeEnum.values().length); + for (ProjectTypeEnum e : ProjectTypeEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(String.valueOf(e.code), e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java new file mode 100644 index 0000000..3bd2a4c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.BiddingInfoEntity; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:06 + * @description + */ +public interface BiddingInfoMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java new file mode 100644 index 0000000..3448a05 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.OutbidInfoEntity; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:11 + * @description + */ +public interface OutbidInfoMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java new file mode 100644 index 0000000..86dc3f5 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java @@ -0,0 +1,12 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.TenderInfoEntity; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:08 + * @description + */ +public interface TenderInfoMapper extends BaseMapper { +} diff --git a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java new file mode 100644 index 0000000..5084b09 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java @@ -0,0 +1,24 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:06 + * @description + */ +public interface BiddingInfoService extends IService { + + List page(String projectName); + List list(String projectName); + void save(BiddingInfoReq req); + void update(String biddingInfoId, BiddingInfoReq req); + void apply(String biddingInfoId); + void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file); +} diff --git a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java new file mode 100644 index 0000000..9044ee4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java @@ -0,0 +1,27 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:11 + * @description + */ +public interface OutbidInfoService extends IService { + + List page(String projectName); + List list(String projectName); + OutbidInfoResp detail(String outbidInfoId); + void save(OutbidInfoReq req); + void update(String outbidInfoId, OutbidInfoReq req); + void deleteById(String outbidInfoId); + void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file); + void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response); +} diff --git a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java new file mode 100644 index 0000000..0a2c539 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java @@ -0,0 +1,25 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:09 + * @description + */ +public interface TenderInfoService extends IService { + List page(String projectName); + List list(String projectName); + TenderInfoResp detail(String tenderInfoId); + void save(TenderInfoReq req); + void update(String tenderInfoId, TenderInfoReq req); + void deleteById(String tenderInfoId); + void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file); + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java new file mode 100644 index 0000000..95cddfe --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.mapper.BiddingInfoMapper; +import com.dite.znpt.service.BiddingInfoService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:07 + * @description + */ +@Service +public class BiddingInfoServiceImpl extends ServiceImpl implements BiddingInfoService { + + @Override + public List page(String projectName) { + return List.of(); + } + + @Override + public List list(String projectName) { + return List.of(); + } + + @Override + public void save(BiddingInfoReq req) { + + } + + @Override + public void update(String biddingInfoId, BiddingInfoReq req) { + + } + + @Override + public void apply(String biddingInfoId) { + + } + + @Override + public void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file) { + + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java new file mode 100644 index 0000000..2cff12f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java @@ -0,0 +1,61 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.mapper.OutbidInfoMapper; +import com.dite.znpt.service.OutbidInfoService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:12 + * @description + */ +@Service +public class OutbidInfoServiceImpl extends ServiceImpl implements OutbidInfoService { + @Override + public List page(String projectName) { + return List.of(); + } + + @Override + public List list(String projectName) { + return List.of(); + } + + @Override + public OutbidInfoResp detail(String outbidInfoId) { + return null; + } + + @Override + public void save(OutbidInfoReq req) { + + } + + @Override + public void update(String outbidInfoId, OutbidInfoReq req) { + + } + + @Override + public void deleteById(String outbidInfoId) { + + } + + @Override + public void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file) { + + } + + @Override + public void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response) { + + } +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java new file mode 100644 index 0000000..c98302f --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java @@ -0,0 +1,55 @@ +package com.dite.znpt.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.mapper.TenderInfoMapper; +import com.dite.znpt.service.TenderInfoService; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:09 + * @description + */ +@Service +public class TenderInfoServiceImpl extends ServiceImpl implements TenderInfoService { + @Override + public List page(String projectName) { + return null; + } + + @Override + public List list(String projectName) { + return List.of(); + } + + @Override + public TenderInfoResp detail(String tenderInfoId) { + return null; + } + + @Override + public void save(TenderInfoReq req) { + + } + + @Override + public void update(String tenderInfoId, TenderInfoReq req) { + + } + + @Override + public void deleteById(String tenderInfoId) { + + } + + @Override + public void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file) { + + } +} diff --git a/core/src/main/resources/mapper/BiddingInfoMapper.xml b/core/src/main/resources/mapper/BiddingInfoMapper.xml new file mode 100644 index 0000000..4133f08 --- /dev/null +++ b/core/src/main/resources/mapper/BiddingInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/OutbidInfoMapper.xml b/core/src/main/resources/mapper/OutbidInfoMapper.xml new file mode 100644 index 0000000..8620795 --- /dev/null +++ b/core/src/main/resources/mapper/OutbidInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/UserMapper.xml b/core/src/main/resources/mapper/UserMapper.xml index d61f50d..36b314a 100644 --- a/core/src/main/resources/mapper/UserMapper.xml +++ b/core/src/main/resources/mapper/UserMapper.xml @@ -16,7 +16,7 @@ LEFT JOIN role r ON ur.role_id = r.role_id LEFT JOIN user_post up ON up.user_id = u.user_id LEFT JOIN post p ON p.post_id = up.post_id - + WHERE u.del_flag = '0' AND u.user_code LIKE concat ('%', #{userCode}, '%') @@ -38,7 +38,6 @@ AND u.user_Type = #{userType} - GROUP BY u.user_id, u.account, u.status, u.name, u.user_code, u.user_type, u.user_status, d.dept_name, u.mobile, u.create_time diff --git a/core/src/main/resources/mapper/tenderInfoMapper.xml b/core/src/main/resources/mapper/tenderInfoMapper.xml new file mode 100644 index 0000000..5d8a983 --- /dev/null +++ b/core/src/main/resources/mapper/tenderInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java new file mode 100644 index 0000000..03160c6 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java @@ -0,0 +1,68 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.BiddingInfoReq; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.service.BiddingInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:07 + * @description + */ +@Api(tags = "招标信息") +@RestController +@RequestMapping("/bidding-info") +public class BiddingInfoController { + + @Resource + private BiddingInfoService biddingInfoService; + + @ApiOperation(value = "分页查询招标信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName) { + return PageResult.ok(biddingInfoService.page(projectName)); + } + + @ApiOperation(value = "查询招标信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(String projectName) { + return Result.ok(biddingInfoService.list(projectName)); + } + + @ApiOperation(value = "新增招标信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody BiddingInfoReq req){ + biddingInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "编辑招标小心", httpMethod = "POST") + @PutMapping + public Result edit(@PathVariable String biddingInfoId, @Validated @RequestBody BiddingInfoReq req){ + biddingInfoService.update(biddingInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "报名", httpMethod = "PUT") + public Result apply(@PathVariable String biddingInfoId){ + biddingInfoService.apply(biddingInfoId); + return Result.ok(); + } + + @ApiOperation(value = "上传招标信息文件", httpMethod = "POST") + @PostMapping("/upload-bidding-info-file/{biddingInfoId}") + public Result uploadBiddingInfoFile(@PathVariable String biddingInfoId, @RequestParam("file") MultipartFile file) { + biddingInfoService.uploadBiddingInfoFile(biddingInfoId, file); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java new file mode 100644 index 0000000..b450d5e --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java @@ -0,0 +1,81 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.OutbidInfoReq; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.service.OutbidInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:13 + * @description + */ +@Api(tags = "中标通知信息") +@RestController +@RequestMapping("/outbid-info") +public class OutbidInfoController { + @Resource + private OutbidInfoService outbidInfoService; + + @ApiOperation(value = "分页查询中标通知信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName){ + return PageResult.ok(outbidInfoService.page(projectName)); + } + + @ApiOperation(value = "查询中标通知信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result list(String projectName){ + return Result.ok(outbidInfoService.list(projectName)); + } + + @ApiOperation(value = "根据中标通知信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/detail/{outbidInfoId}") + public Result detail(@PathVariable String outbidInfoId){ + return Result.ok(outbidInfoService.detail(outbidInfoId)); + } + + @ApiOperation(value = "新增中标通知信息", httpMethod = "POST") + @PostMapping + public Result add(@RequestBody OutbidInfoReq req){ + outbidInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "根据中标通知信息Id更新信息", httpMethod = "PUT") + @PutMapping("/{outbidInfoId}") + public Result update(@PathVariable String outbidInfoId, @RequestBody OutbidInfoReq req){ + outbidInfoService.update(outbidInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "根据中标通知信息Id删除信息", httpMethod = "DELETE") + @DeleteMapping("/{outbidInfoId}") + public Result delete(@PathVariable String outbidInfoId){ + outbidInfoService.deleteById(outbidInfoId); + return Result.ok(); + } + + @ApiOperation(value = "上传中标通知信息文件", httpMethod = "POST") + @PostMapping("/upload-outbid-info-file/{outBidInfoId}") + public Result uploadTenderInfoFile(@PathVariable String outBidInfoId, @RequestParam("file") MultipartFile file) { + outbidInfoService.uploadOutbidInfoFile(outBidInfoId, file); + return Result.ok(); + } + + @ApiOperation(value = "下载中标通知信息文件", httpMethod = "POST") + @PostMapping("/download-outbid-info-file/{outBidInfoId}") + public Result downLoadTenderInfoFile(@PathVariable String outBidInfoId, HttpServletResponse response) { + outbidInfoService.downLoadTenderInfoFile(outBidInfoId, response); + return Result.ok(); + } +} diff --git a/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java new file mode 100644 index 0000000..63adfea --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java @@ -0,0 +1,75 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.TenderInfoReq; +import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.service.TenderInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/7/28/周一 16:10 + * @description + */ +@Api(tags = "投标信息") +@RestController +@RequestMapping("/tender-info") +public class TenderInfoController { + + @Resource + private TenderInfoService tenderInfoService; + + @ApiOperation(value = "分页查询投标信息列表", httpMethod = "GET") + @GetMapping("/page") + public PageResult page(String projectName){ + return PageResult.ok(tenderInfoService.page(projectName)); + } + + @ApiOperation(value = "查询投标信息列表", httpMethod = "GET") + @GetMapping("/list") + public Result> list(String projectName){ + return Result.ok(tenderInfoService.list(projectName)); + } + + @ApiOperation(value = "根据投标信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/detail/{tenderInfoId}") + public Result detail(@PathVariable String tenderInfoId){ + return Result.ok(tenderInfoService.detail(tenderInfoId)); + } + + @ApiOperation(value = "新增投标信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody TenderInfoReq req) { + tenderInfoService.save(req); + return Result.ok(); + } + + @ApiOperation(value = "修改投标信息", httpMethod = "PUT") + @PutMapping("/{tenderInfoId}") + public Result edit(@PathVariable String tenderInfoId, @Validated @RequestBody TenderInfoReq req) { + tenderInfoService.update(tenderInfoId, req); + return Result.ok(); + } + + @ApiOperation(value = "删除投标信息", httpMethod = "DELETE") + @DeleteMapping("/{tenderInfoId}") + public Result delete(@PathVariable String tenderInfoId) { + tenderInfoService.deleteById(tenderInfoId); + return Result.ok(); + } + + @ApiOperation(value = "上传投标信息文件", httpMethod = "POST") + @PostMapping("/upload-tender-info-file/{tenderInfoId}") + public Result uploadTenderInfoFile(@PathVariable String tenderInfoId, @RequestParam("file") MultipartFile file) { + tenderInfoService.uploadBiddingInfoFile(tenderInfoId, file); + return Result.ok(); + } +} From 6c698b5256f384232813aa899680f51ddfe75c76 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 28 Jul 2025 23:35:44 +0800 Subject: [PATCH 20/38] =?UTF-8?q?=E6=8B=9B=E6=8A=95=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 4 ++ .../java/com/dite/znpt/converts/Converts.java | 3 + .../znpt/domain/entity/BiddingInfoEntity.java | 4 +- .../znpt/domain/entity/OutbidInfoEntity.java | 2 +- .../znpt/domain/entity/TenderInfoEntity.java | 2 +- .../dite/znpt/domain/vo/BiddingInfoReq.java | 2 +- .../dite/znpt/domain/vo/BiddingInfoResp.java | 5 ++ .../dite/znpt/domain/vo/OutbidInfoReq.java | 3 +- .../dite/znpt/domain/vo/OutbidInfoResp.java | 3 + .../dite/znpt/domain/vo/TenderInfoReq.java | 3 +- .../dite/znpt/domain/vo/TenderInfoResp.java | 8 ++- .../dite/znpt/mapper/BiddingInfoMapper.java | 6 ++ .../dite/znpt/mapper/OutbidInfoMapper.java | 7 +++ .../dite/znpt/mapper/TenderInfoMapper.java | 8 +++ .../dite/znpt/service/BiddingInfoService.java | 2 +- .../dite/znpt/service/OutbidInfoService.java | 5 +- .../dite/znpt/service/TenderInfoService.java | 2 +- .../service/impl/BiddingInfoServiceImpl.java | 58 +++++++++++++++---- .../service/impl/OutbidInfoServiceImpl.java | 57 ++++++++++++++---- .../service/impl/TenderInfoServiceImpl.java | 54 ++++++++++++++--- .../resources/mapper/BiddingInfoMapper.xml | 10 ++++ .../resources/mapper/OutbidInfoMapper.xml | 19 ++++++ .../resources/mapper/TenderInfoMapper.xml | 28 +++++++++ .../resources/mapper/tenderInfoMapper.xml | 5 -- .../web/controller/BiddingInfoController.java | 16 ++--- .../web/controller/OutbidInfoController.java | 18 +++--- .../web/controller/TenderInfoController.java | 8 +-- 27 files changed, 271 insertions(+), 71 deletions(-) create mode 100644 core/src/main/resources/mapper/TenderInfoMapper.xml delete mode 100644 core/src/main/resources/mapper/tenderInfoMapper.xml diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 842c55e..6380daa 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -79,4 +79,8 @@ public class Message implements Serializable { public static final String EQUIPMENT_USE_RECORD_STATUS_ERROR = "设备使用记录状态不合法"; public static final String EQUIPMENT_IS_USED = "设备已被使用"; public static final String EQUIPMENT_IS_RETURN = "设备已归还"; + public static final String DAILY_REPORT_EXISTS = "当日已提交日报"; + public static final String BIDDING_INFO_ID_IS_NOT_EXIST = "招标信息id不存在"; + public static final String TENDER_INFO_ID_IS_NOT_EXIST = "投标信息id不存在"; + public static final String OUTBID_INFO_ID_IS_NOT_EXIST = "中标信息id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index b373e0f..8d0f2d0 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -124,5 +124,8 @@ public interface Converts { EquipmentEntity toEquipmentUseRecordEntity(EquipmentReq req); EquipmentUseRecordEntity toEquipmentUseRecordEntity(EquipmentUseRecordReq req); + BiddingInfoEntity toBiddingInfoReq (BiddingInfoReq req); + TenderInfoEntity toTenderInfoEntity (TenderInfoReq req); + OutbidInfoEntity toOutbidInfoEntity (OutbidInfoReq req); } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java index 126f8df..acfd702 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BiddingInfoEntity.java @@ -53,8 +53,8 @@ public class BiddingInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("招标信息来源网址") private String sourceWebsite; - @ApiModelProperty("招标文件") - private String biddingFile; + @ApiModelProperty("招标文件id") + private String biddingFileId; @ApiModelProperty("状态:0-待报名,1-已报名") private String status; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java index b36f8b2..43b359a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java @@ -46,7 +46,7 @@ public class OutbidInfoEntity extends AuditableEntity implements Serializable { private LocalDateTime outbidNotifyDate; @ApiModelProperty("中标通知文件") - private String outbidFile; + private String outbidNoticeFileId; @ApiModelProperty("删除标志(0代表存在 1代表删除)") @TableLogic(value = "0", delval = "1") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java index d7b9dd4..29ad3e4 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/TenderInfoEntity.java @@ -55,7 +55,7 @@ public class TenderInfoEntity extends AuditableEntity implements Serializable { private String tenderManagerPhone; @ApiModelProperty("投标文件") - private String tenderFile; + private String tenderFileId; @ApiModelProperty("删除标志(0代表存在 1代表删除)") @TableLogic(value = "0", delval = "1") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java index 6d428e1..45a399c 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java @@ -51,5 +51,5 @@ public class BiddingInfoReq implements Serializable { @ApiModelProperty("招标文件") @Size(max = 200, message = "招标文件不能超过200个字符") - private String biddingFile; + private String biddingFileId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java index 5419c65..6c5f44a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java @@ -20,4 +20,9 @@ public class BiddingInfoResp extends BiddingInfoReq implements Serializable { @ApiModelProperty("招标信息id") private String biddingInfoId; + + @ApiModelProperty("招标文件地址") + private String attachPath; + + } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java index dba74e2..619e0c2 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java @@ -38,8 +38,7 @@ public class OutbidInfoReq implements Serializable { private LocalDateTime outbidNotifyDate; @ApiModelProperty("中标通知文件") - @Size(max = 200, message = "中标通知文件长度不能超过200") - private String outbidNoticeFile; + private String outbidNoticeFileId; @ApiModelProperty("状态:0-已通知,1-已签约") private String status; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java index bfc0710..8669008 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java @@ -26,4 +26,7 @@ public class OutbidInfoResp extends OutbidInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + + @ApiModelProperty("中标通知文件地址") + private String attachPath; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java index a65a217..30f7f53 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoReq.java @@ -43,9 +43,8 @@ public class TenderInfoReq implements Serializable { @ApiModelProperty("招标负责人联系方式") private String tenderManagerPhone; - @Size(max = 100, message = "投标文件不能超过100个字符") @ApiModelProperty("投标文件") - private String tenderFile; + private String tenderFileId; @Size(max = 500, message = "项目描述不能超过500个字符") @ApiModelProperty("项目描述") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java index 0c37898..6f6c1a5 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -20,7 +20,7 @@ import java.io.Serializable; */ @Data @ApiModel("投标信息响应实体") -public class TenderInfoResp extends BiddingInfoReq implements Serializable { +public class TenderInfoResp extends TenderInfoReq implements Serializable { @Serial private static final long serialVersionUID = -8445413467535624096L; @@ -33,4 +33,10 @@ public class TenderInfoResp extends BiddingInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + @ApiModelProperty("投标文件地址") + private String attachPath; + + @ApiModelProperty("投标负责人姓名") + private String tenderManagerName; + } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java index 3bd2a4c..58e377f 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BiddingInfoMapper.java @@ -2,6 +2,10 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.BiddingInfoEntity; +import com.dite.znpt.domain.vo.BiddingInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author Bear.G @@ -9,4 +13,6 @@ import com.dite.znpt.domain.entity.BiddingInfoEntity; * @description */ public interface BiddingInfoMapper extends BaseMapper { + + List listBiddingInfoResp(@Param("projectName") String projectName); } diff --git a/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java index 3448a05..4c51729 100644 --- a/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/OutbidInfoMapper.java @@ -2,6 +2,10 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.OutbidInfoEntity; +import com.dite.znpt.domain.vo.OutbidInfoResp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author Bear.G @@ -9,4 +13,7 @@ import com.dite.znpt.domain.entity.OutbidInfoEntity; * @description */ public interface OutbidInfoMapper extends BaseMapper { + List listOutbidInfoResp(@Param("projectName") String projectName); + + OutbidInfoResp getOutbidInfoResp(@Param("outbidInfoId") String outbidInfoId); } diff --git a/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java index 86dc3f5..a3f004c 100644 --- a/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/TenderInfoMapper.java @@ -2,6 +2,11 @@ package com.dite.znpt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.TenderInfoEntity; +import com.dite.znpt.domain.vo.TenderInfoResp; +import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; /** * @author Bear.G @@ -9,4 +14,7 @@ import com.dite.znpt.domain.entity.TenderInfoEntity; * @description */ public interface TenderInfoMapper extends BaseMapper { + List listTenderInfoResp(@Param("projectName") String projectName); + + TenderInfoResp getTenderInfoResp(@Param("tenderInfoId") String tenderInfoId); } diff --git a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java index 5084b09..9ede904 100644 --- a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java @@ -19,6 +19,6 @@ public interface BiddingInfoService extends IService { List list(String projectName); void save(BiddingInfoReq req); void update(String biddingInfoId, BiddingInfoReq req); + void uploadBiddingInfoFile(String biddingInfoId, String biddingFileId); void apply(String biddingInfoId); - void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file); } diff --git a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java index 9044ee4..4aa02b4 100644 --- a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.OutbidInfoEntity; import com.dite.znpt.domain.vo.OutbidInfoReq; import com.dite.znpt.domain.vo.OutbidInfoResp; -import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -22,6 +21,6 @@ public interface OutbidInfoService extends IService { void save(OutbidInfoReq req); void update(String outbidInfoId, OutbidInfoReq req); void deleteById(String outbidInfoId); - void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file); - void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response); + void uploadOutbidNoticeFile(String outBidInfoId, String outbidFileId); + void downLoadOutbidNoticeFile(String outbidFileId, HttpServletResponse response) throws Exception; } diff --git a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java index 0a2c539..dc185ce 100644 --- a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java @@ -20,6 +20,6 @@ public interface TenderInfoService extends IService { void save(TenderInfoReq req); void update(String tenderInfoId, TenderInfoReq req); void deleteById(String tenderInfoId); - void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file); + void uploadBiddingInfoFile(String tenderInfoId, String tenderFileId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java index 95cddfe..43f9498 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BiddingInfoServiceImpl.java @@ -1,14 +1,22 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.BiddingInfoEntity; import com.dite.znpt.domain.vo.BiddingInfoReq; import com.dite.znpt.domain.vo.BiddingInfoResp; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.BiddingInfoMapper; +import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.BiddingInfoService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.List; /** @@ -19,33 +27,61 @@ import java.util.List; @Service public class BiddingInfoServiceImpl extends ServiceImpl implements BiddingInfoService { + @Resource + private AttachInfoService attachInfoService; @Override public List page(String projectName) { - return List.of(); + PageUtil.startPage(); + return this.list(projectName); } @Override public List list(String projectName) { - return List.of(); + return this.baseMapper.listBiddingInfoResp(projectName); } + @Transactional(rollbackFor = Exception.class) @Override public void save(BiddingInfoReq req) { - + BiddingInfoEntity entity = Converts.INSTANCE.toBiddingInfoReq(req); + this.save(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void update(String biddingInfoId, BiddingInfoReq req) { - + BiddingInfoEntity biddingInfo = this.getById(biddingInfoId); + if(null ==biddingInfo){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + BiddingInfoEntity entity = Converts.INSTANCE.toBiddingInfoReq(req); + entity.setBiddingInfoId(biddingInfoId); + this.updateById(entity); } + @Transactional(rollbackFor = Exception.class) + @Override + public void uploadBiddingInfoFile(String biddingInfoId, String biddingFileId) { + BiddingInfoEntity entity = this.getById(biddingInfoId); + if(null ==entity){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + AttachInfoEntity attachInfo = attachInfoService.getById(biddingFileId); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + entity.setBiddingFileId(biddingFileId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) @Override public void apply(String biddingInfoId) { - - } - - @Override - public void uploadBiddingInfoFile(String biddingInfoId, MultipartFile file) { - + BiddingInfoEntity entity = this.getById(biddingInfoId); + if(null ==entity){ + throw new ServiceException(Message.BIDDING_INFO_ID_IS_NOT_EXIST); + } + entity.setStatus("1"); + this.updateById(entity); } } diff --git a/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java index 2cff12f..1dea161 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/OutbidInfoServiceImpl.java @@ -1,14 +1,23 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.OutbidInfoEntity; import com.dite.znpt.domain.vo.OutbidInfoReq; import com.dite.znpt.domain.vo.OutbidInfoResp; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.OutbidInfoMapper; +import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.OutbidInfoService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -19,43 +28,71 @@ import java.util.List; */ @Service public class OutbidInfoServiceImpl extends ServiceImpl implements OutbidInfoService { + + @Resource + private AttachInfoService attachInfoService; @Override public List page(String projectName) { - return List.of(); + PageUtil.startPage(); + return this.list(projectName); } @Override public List list(String projectName) { - return List.of(); + return this.baseMapper.listOutbidInfoResp(projectName); } @Override public OutbidInfoResp detail(String outbidInfoId) { - return null; + return this.baseMapper.getOutbidInfoResp(outbidInfoId); } + @Transactional(rollbackFor = Exception.class) @Override public void save(OutbidInfoReq req) { - + OutbidInfoEntity entity = Converts.INSTANCE.toOutbidInfoEntity(req); + this.save(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void update(String outbidInfoId, OutbidInfoReq req) { - + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + OutbidInfoEntity entity = Converts.INSTANCE.toOutbidInfoEntity(req); + entity.setOutbidId(outbidInfoId); + this.updateById(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String outbidInfoId) { - + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + this.removeById(outbidInfoId); } @Override - public void uploadOutbidInfoFile(String outbidInfoId, MultipartFile file) { - + public void uploadOutbidNoticeFile(String outbidInfoId, String outbidNoticeFileId) { + OutbidInfoEntity outbidInfo = this.getById(outbidInfoId); + if(null == outbidInfo){ + throw new ServiceException(Message.OUTBID_INFO_ID_IS_NOT_EXIST); + } + AttachInfoEntity attachInfo = attachInfoService.getById(outbidNoticeFileId); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + outbidInfo.setOutbidNoticeFileId(outbidNoticeFileId); + this.updateById(outbidInfo); } @Override - public void downLoadTenderInfoFile(String outbidInfoId, HttpServletResponse response) { - + public void downLoadOutbidNoticeFile(String outbidNoticeFileId, HttpServletResponse response) throws Exception { + attachInfoService.download(outbidNoticeFileId, response); } + } diff --git a/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java index c98302f..948bef1 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/TenderInfoServiceImpl.java @@ -1,14 +1,23 @@ package com.dite.znpt.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Constants; +import com.dite.znpt.constant.Message; +import com.dite.znpt.converts.Converts; +import com.dite.znpt.domain.entity.AttachInfoEntity; import com.dite.znpt.domain.entity.TenderInfoEntity; import com.dite.znpt.domain.vo.TenderInfoReq; import com.dite.znpt.domain.vo.TenderInfoResp; +import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.TenderInfoMapper; +import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.TenderInfoService; +import com.dite.znpt.util.PageUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import java.util.List; /** @@ -18,38 +27,67 @@ import java.util.List; */ @Service public class TenderInfoServiceImpl extends ServiceImpl implements TenderInfoService { + + @Resource + private AttachInfoService attachInfoService; @Override public List page(String projectName) { - return null; + PageUtil.startPage(); + return this.list(projectName); } @Override public List list(String projectName) { - return List.of(); + return this.baseMapper.listTenderInfoResp(projectName); } @Override public TenderInfoResp detail(String tenderInfoId) { - return null; + return this.baseMapper.getTenderInfoResp(tenderInfoId); } + @Transactional(rollbackFor = Exception.class) @Override public void save(TenderInfoReq req) { - + TenderInfoEntity entity = Converts.INSTANCE.toTenderInfoEntity(req); + this.save(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void update(String tenderInfoId, TenderInfoReq req) { - + TenderInfoEntity tenderInfo = this.getById(tenderInfoId); + if(null ==tenderInfo){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + TenderInfoEntity entity = Converts.INSTANCE.toTenderInfoEntity(req); + entity.setTenderInfoId(tenderInfoId); + this.updateById(entity); } + @Transactional(rollbackFor = Exception.class) @Override public void deleteById(String tenderInfoId) { - + TenderInfoEntity tenderInfo = this.getById(tenderInfoId); + if(null ==tenderInfo){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + this.removeById(tenderInfoId); } - @Override - public void uploadBiddingInfoFile(String tenderInfoId, MultipartFile file) { + @Transactional(rollbackFor = Exception.class) + @Override + public void uploadBiddingInfoFile(String tenderInfoId, String tenderFileId) { + TenderInfoEntity entity = this.getById(tenderInfoId); + if(null == entity){ + throw new ServiceException(Message.TENDER_INFO_ID_IS_NOT_EXIST); + } + AttachInfoEntity attachInfo = attachInfoService.getById(tenderInfoId); + if(null == attachInfo || !Constants.DEL_FLAG_0.equals(attachInfo.getDelFlag())){ + throw new ServiceException(Message.ATTACH_INFO_IS_NOT_EXIST); + } + entity.setTenderFileId(tenderFileId); + this.updateById(entity); } } diff --git a/core/src/main/resources/mapper/BiddingInfoMapper.xml b/core/src/main/resources/mapper/BiddingInfoMapper.xml index 4133f08..9672a96 100644 --- a/core/src/main/resources/mapper/BiddingInfoMapper.xml +++ b/core/src/main/resources/mapper/BiddingInfoMapper.xml @@ -2,4 +2,14 @@ + \ No newline at end of file diff --git a/core/src/main/resources/mapper/OutbidInfoMapper.xml b/core/src/main/resources/mapper/OutbidInfoMapper.xml index 8620795..5cccaa5 100644 --- a/core/src/main/resources/mapper/OutbidInfoMapper.xml +++ b/core/src/main/resources/mapper/OutbidInfoMapper.xml @@ -2,4 +2,23 @@ + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/TenderInfoMapper.xml b/core/src/main/resources/mapper/TenderInfoMapper.xml new file mode 100644 index 0000000..6f83a25 --- /dev/null +++ b/core/src/main/resources/mapper/TenderInfoMapper.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/mapper/tenderInfoMapper.xml b/core/src/main/resources/mapper/tenderInfoMapper.xml deleted file mode 100644 index 5d8a983..0000000 --- a/core/src/main/resources/mapper/tenderInfoMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java index 03160c6..b3d5d7f 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BiddingInfoController.java @@ -46,23 +46,23 @@ public class BiddingInfoController { return Result.ok(); } - @ApiOperation(value = "编辑招标小心", httpMethod = "POST") + @ApiOperation(value = "编辑招标消息",httpMethod = "POST") @PutMapping public Result edit(@PathVariable String biddingInfoId, @Validated @RequestBody BiddingInfoReq req){ biddingInfoService.update(biddingInfoId, req); return Result.ok(); } + @ApiOperation(value = "上传招标文件",httpMethod = "PUT", notes = "上传附件调用新增附件信息接口:/attach-info/biddingInfo,userDefinedPath = {biddingInfoId}") + @PutMapping("/{biddingInfoId}/upload-bidding-info_file/{biddingFileId}") + public Result uploadBiddingInfoFile(@PathVariable String biddingInfoId, @PathVariable String biddingFileId){ + biddingInfoService.uploadBiddingInfoFile(biddingInfoId, biddingFileId); + return Result.ok(); + } @ApiOperation(value = "报名", httpMethod = "PUT") + @PutMapping("/apply/{biddingInfoId}") public Result apply(@PathVariable String biddingInfoId){ biddingInfoService.apply(biddingInfoId); return Result.ok(); } - - @ApiOperation(value = "上传招标信息文件", httpMethod = "POST") - @PostMapping("/upload-bidding-info-file/{biddingInfoId}") - public Result uploadBiddingInfoFile(@PathVariable String biddingInfoId, @RequestParam("file") MultipartFile file) { - biddingInfoService.uploadBiddingInfoFile(biddingInfoId, file); - return Result.ok(); - } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java index b450d5e..95896bc 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/OutbidInfoController.java @@ -6,10 +6,8 @@ import com.dite.znpt.domain.vo.OutbidInfoReq; import com.dite.znpt.domain.vo.OutbidInfoResp; import com.dite.znpt.service.OutbidInfoService; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -44,14 +42,14 @@ public class OutbidInfoController { return Result.ok(outbidInfoService.detail(outbidInfoId)); } - @ApiOperation(value = "新增中标通知信息", httpMethod = "POST") + @ApiOperation(value = "新增中标通知信息", httpMethod = "POST", notes = "上传附件调用新增附件信息接口:/attach-info/outbidInfo,userDefinedPath = {outbidInfoId}") @PostMapping public Result add(@RequestBody OutbidInfoReq req){ outbidInfoService.save(req); return Result.ok(); } - @ApiOperation(value = "根据中标通知信息Id更新信息", httpMethod = "PUT") + @ApiOperation(value = "根据中标通知信息Id更新信息", httpMethod = "PUT", notes = "上传附件调用新增附件信息接口:/attach-info/outbidInfo,userDefinedPath = {outbidInfoId}") @PutMapping("/{outbidInfoId}") public Result update(@PathVariable String outbidInfoId, @RequestBody OutbidInfoReq req){ outbidInfoService.update(outbidInfoId, req); @@ -66,16 +64,16 @@ public class OutbidInfoController { } @ApiOperation(value = "上传中标通知信息文件", httpMethod = "POST") - @PostMapping("/upload-outbid-info-file/{outBidInfoId}") - public Result uploadTenderInfoFile(@PathVariable String outBidInfoId, @RequestParam("file") MultipartFile file) { - outbidInfoService.uploadOutbidInfoFile(outBidInfoId, file); + @PostMapping("/{outBidInfoId}/upload-outbid-info-file/{outbidNoticeFileId}") + public Result uploadOutbidNoticeFile(@PathVariable String outBidInfoId, @PathVariable String outbidNoticeFileId) { + outbidInfoService.uploadOutbidNoticeFile(outBidInfoId, outbidNoticeFileId); return Result.ok(); } @ApiOperation(value = "下载中标通知信息文件", httpMethod = "POST") - @PostMapping("/download-outbid-info-file/{outBidInfoId}") - public Result downLoadTenderInfoFile(@PathVariable String outBidInfoId, HttpServletResponse response) { - outbidInfoService.downLoadTenderInfoFile(outBidInfoId, response); + @PostMapping("/download-outbid-info-file/{outbidNoticeFileId}") + public Result downLoadOutbidNoticeFile(@PathVariable String outbidNoticeFileId, HttpServletResponse response) throws Exception { + outbidInfoService.downLoadOutbidNoticeFile(outbidNoticeFileId, response); return Result.ok(); } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java index 63adfea..5f8ea3a 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/TenderInfoController.java @@ -66,10 +66,10 @@ public class TenderInfoController { return Result.ok(); } - @ApiOperation(value = "上传投标信息文件", httpMethod = "POST") - @PostMapping("/upload-tender-info-file/{tenderInfoId}") - public Result uploadTenderInfoFile(@PathVariable String tenderInfoId, @RequestParam("file") MultipartFile file) { - tenderInfoService.uploadBiddingInfoFile(tenderInfoId, file); + @ApiOperation(value = "上传投标信息文件", httpMethod = "POST", notes = "上传附件调用新增附件信息接口:/attach-info/tenderInfo,userDefinedPath = {tenderInfoId}") + @PostMapping("/{tenderInfoId}/upload-tender-info-file/{tenderFileId}") + public Result uploadTenderInfoFile(@PathVariable String tenderInfoId, @PathVariable String tenderFileId) { + tenderInfoService.uploadBiddingInfoFile(tenderInfoId, tenderFileId); return Result.ok(); } } From 8db8dec22b7fec0af3614995794b7d479307e3cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Tue, 29 Jul 2025 15:41:04 +0800 Subject: [PATCH 21/38] =?UTF-8?q?=E6=8B=9B=E6=8A=95=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 2 + .../znpt/domain/entity/AttachInfoEntity.java | 4 + .../znpt/domain/entity/OutbidInfoEntity.java | 5 +- .../dite/znpt/domain/vo/AttachInfoReq.java | 3 + .../dite/znpt/domain/vo/AttachInfoResp.java | 3 + .../dite/znpt/domain/vo/BiddingInfoReq.java | 6 +- .../dite/znpt/domain/vo/BiddingInfoResp.java | 3 + .../dite/znpt/domain/vo/OutbidInfoReq.java | 2 +- .../dite/znpt/domain/vo/OutbidInfoResp.java | 3 + .../dite/znpt/domain/vo/TenderInfoResp.java | 3 + .../znpt/enums/AttachBusinessTypeEnum.java | 4 + .../dite/znpt/service/BiddingInfoService.java | 1 - .../dite/znpt/service/OutbidInfoService.java | 1 - .../dite/znpt/service/TenderInfoService.java | 2 - .../service/impl/AttachInfoServiceImpl.java | 2 + .../service/impl/BiddingInfoServiceImpl.java | 3 + .../service/impl/OutbidInfoServiceImpl.java | 57 ++++++++++---- .../service/impl/TenderInfoServiceImpl.java | 76 ++++++++++++++----- .../resources/mapper/BiddingInfoMapper.xml | 2 +- .../resources/mapper/OutbidInfoMapper.xml | 4 +- .../resources/mapper/TenderInfoMapper.xml | 4 +- .../web/controller/BiddingInfoController.java | 3 +- .../web/controller/OutbidInfoController.java | 7 -- .../web/controller/TenderInfoController.java | 12 +-- 24 files changed, 146 insertions(+), 66 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index 6380daa..8e6398a 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -82,5 +82,7 @@ public class Message implements Serializable { public static final String DAILY_REPORT_EXISTS = "当日已提交日报"; public static final String BIDDING_INFO_ID_IS_NOT_EXIST = "招标信息id不存在"; public static final String TENDER_INFO_ID_IS_NOT_EXIST = "投标信息id不存在"; + public static final String TENDER_INFO_IS_EXIST = "招标[{}]已存中投信息存在"; public static final String OUTBID_INFO_ID_IS_NOT_EXIST = "中标信息id不存在"; + public static final String OUTBID_INFO_IS_EXIST = "招标[{}]已存中标信息存在"; } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java index 5e1fb8c..ad09e56 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/AttachInfoEntity.java @@ -43,6 +43,10 @@ public class AttachInfoEntity extends AuditableEntity implements Serializable { @TableField("business_type") private String businessType; + @ApiModelProperty("文件名") + @TableField("file_name") + private String fileName; + @ApiModelProperty("文件类型") @TableField("file_type") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java index 43b359a..61230b8 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/OutbidInfoEntity.java @@ -31,7 +31,7 @@ public class OutbidInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("中标通知信息id") @TableId(type = IdType.ASSIGN_UUID) - private String outbidId; + private String outbidInfoId; @ApiModelProperty("招标信息id") private String biddingInfoId; @@ -48,6 +48,9 @@ public class OutbidInfoEntity extends AuditableEntity implements Serializable { @ApiModelProperty("中标通知文件") private String outbidNoticeFileId; + @ApiModelProperty("状态") + private String status; + @ApiModelProperty("删除标志(0代表存在 1代表删除)") @TableLogic(value = "0", delval = "1") private String delFlag; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java index 11d8200..be5ce0d 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoReq.java @@ -24,6 +24,9 @@ public class AttachInfoReq implements Serializable { @ApiModelProperty("自定义路径") private String userDefinedPath; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("文件类型") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java index 027fea6..b56a7f7 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/AttachInfoResp.java @@ -32,6 +32,9 @@ public class AttachInfoResp implements Serializable { @ApiModelProperty("附件路径") private String attachPath; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("文件类型") private String fileType; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java index 45a399c..25e17fe 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoReq.java @@ -46,10 +46,6 @@ public class BiddingInfoReq implements Serializable { private String source; @ApiModelProperty("信息来源网址") - @Size(max = 500, message = "信息来源网址不能超过500个字符") + @Size(max = 100, message = "信息来源网址不能超过100个字符") private String sourceWebsite; - - @ApiModelProperty("招标文件") - @Size(max = 200, message = "招标文件不能超过200个字符") - private String biddingFileId; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java index 6c5f44a..64a1797 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/BiddingInfoResp.java @@ -21,6 +21,9 @@ public class BiddingInfoResp extends BiddingInfoReq implements Serializable { @ApiModelProperty("招标信息id") private String biddingInfoId; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("招标文件地址") private String attachPath; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java index 619e0c2..16386fa 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoReq.java @@ -28,7 +28,7 @@ public class OutbidInfoReq implements Serializable { private String biddingInfoId; @ApiModelProperty("中标金额") - private BigDecimal outBidAmount; + private BigDecimal outbidAmount; @ApiModelProperty("工期") private Integer duration; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java index 8669008..bfac3a3 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/OutbidInfoResp.java @@ -27,6 +27,9 @@ public class OutbidInfoResp extends OutbidInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + @ApiModelProperty("文件名称") + private String fileName; + @ApiModelProperty("中标通知文件地址") private String attachPath; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java index 6f6c1a5..97e8028 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -32,6 +32,9 @@ public class TenderInfoResp extends TenderInfoReq implements Serializable { @ApiModelProperty("招标公司") private String biddingCompany; + + @ApiModelProperty("文件名称") + private String fileName; @ApiModelProperty("投标文件地址") private String attachPath; diff --git a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java index 4e008b3..1be8f4b 100644 --- a/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java +++ b/core/src/main/java/com/dite/znpt/enums/AttachBusinessTypeEnum.java @@ -19,6 +19,10 @@ public enum AttachBusinessTypeEnum { DEFECT_MARK_PIC("defect_mark_pic", "缺陷标注图片"), REPORT("report", "报告"), PROJECT_BUDGE("project_budge", "预算文件"), + PROJECT_DAILY_REPORT("project_daily_report", "项目日报文件"), + BIDDING_INFO("bidding_info", "招标信息"), + TENDER_INFO("tender_info", "投标信息"), + OUTBID_INFO("outbid_info", "中标信息"), ; private final String code; private final String desc; diff --git a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java index 9ede904..b7dc2e3 100644 --- a/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/BiddingInfoService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.BiddingInfoEntity; import com.dite.znpt.domain.vo.BiddingInfoReq; import com.dite.znpt.domain.vo.BiddingInfoResp; -import org.springframework.web.multipart.MultipartFile; import java.util.List; diff --git a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java index 4aa02b4..0325149 100644 --- a/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/OutbidInfoService.java @@ -21,6 +21,5 @@ public interface OutbidInfoService extends IService { void save(OutbidInfoReq req); void update(String outbidInfoId, OutbidInfoReq req); void deleteById(String outbidInfoId); - void uploadOutbidNoticeFile(String outBidInfoId, String outbidFileId); void downLoadOutbidNoticeFile(String outbidFileId, HttpServletResponse response) throws Exception; } diff --git a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java index dc185ce..a767f49 100644 --- a/core/src/main/java/com/dite/znpt/service/TenderInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/TenderInfoService.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.dite.znpt.domain.entity.TenderInfoEntity; import com.dite.znpt.domain.vo.TenderInfoReq; import com.dite.znpt.domain.vo.TenderInfoResp; -import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -20,6 +19,5 @@ public interface TenderInfoService extends IService { void save(TenderInfoReq req); void update(String tenderInfoId, TenderInfoReq req); void deleteById(String tenderInfoId); - void uploadBiddingInfoFile(String tenderInfoId, String tenderFileId); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index 93c77dd..b063242 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -81,9 +81,11 @@ public class AttachInfoServiceImpl extends ServiceImpl implements OutbidInfoService { + @Resource + private BiddingInfoService biddingInfoService; + @Resource private AttachInfoService attachInfoService; + @Override public List page(String projectName) { PageUtil.startPage(); @@ -51,7 +57,22 @@ public class OutbidInfoServiceImpl extends ServiceImpl listByBiddingInfoId(String biddingInfoId){ + return this.list(Wrappers.lambdaQuery().eq(OutbidInfoEntity::getBiddingInfoId, biddingInfoId)); } @Transactional(rollbackFor = Exception.class) @@ -61,9 +82,26 @@ public class OutbidInfoServiceImpl extends ServiceImpl implements TenderInfoService { + @Resource + private UserService userService; + @Resource private AttachInfoService attachInfoService; + @Override public List page(String projectName) { PageUtil.startPage(); @@ -50,19 +59,64 @@ public class TenderInfoServiceImpl extends ServiceImpl listByBiddingInfoId(String biddingInfoId){ + return this.list(Wrappers.lambdaQuery().eq(TenderInfoEntity::getBiddingInfoId, biddingInfoId)); } @Transactional(rollbackFor = Exception.class) @@ -73,21 +127,9 @@ public class TenderInfoServiceImpl extends ServiceImpl - SELECT oi.outbid_info_id, oi.bidding_info_id, bi.bidding_project, bi.bidding_company, oi.outbid_amount, oi.outbid_notify_date, oi.outbid_notice_file_id, oi.status, ai.attach_path + SELECT oi.outbid_info_id, oi.bidding_info_id, bi.bidding_project, bi.bidding_company, oi.outbid_amount, oi.outbid_notify_date, oi.outbid_notice_file_id, oi.status, ai.file_name, ai.attach_path FROM outbid_info oi LEFT JOIN bidding_info bi ON oi.bidding_info_id = bi.bidding_info_id LEFT JOIN attach_info ai ON oi.outbid_notice_file_id = ai.attach_id @@ -15,7 +15,7 @@ SELECT ti.tender_info_id, ti.bidding_info_id, bi.bidding_project, bi.bidding_company, ti.tender_amount, ti.project_address,ti.project_type, ti.tender_manager, u.name AS 'tenderManagerName', - ti.tender_manager_phone, ti.project_description, ti.tender_file_id, ai.attach_path + ti.tender_manager_phone, ti.project_description, ti.tender_file_id, ai.file_name, ai.attach_path FROM tender_info ti LEFT JOIN bidding_info bi ON ti.bidding_info_id = bi.bidding_info_id LEFT JOIN user u ON ti.tender_manager = u.user_id @@ -18,7 +18,7 @@ diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java index c27dc10..19e770b 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java @@ -28,8 +28,9 @@ public class RegulationController { @RequestParam(required = false) String status, @RequestParam(required = false) String type, @RequestParam(required = false) String title, - @RequestParam(required = false) String proposer) { - return regulationService.getRegulationList(page, size, status, type, title, proposer); + @RequestParam(required = false) String proposer, + @RequestParam(required = false) String confirmStatus) { + return regulationService.getRegulationList(page, size, status, type, title, proposer, confirmStatus); } @ApiOperation(value = "创建制度提案", httpMethod = "POST") From ec5cca1dabf65f09b66721c6ec9680e1e92098cb Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Tue, 5 Aug 2025 11:00:08 +0800 Subject: [PATCH 26/38] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=BF=98=E6=9C=AA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/config/Schedule.java | 14 + .../com/dite/znpt/config/WebMvcConfig.java | 12 + .../entity/AutoExpirationConfigEntity.java | 84 +++++ .../domain/entity/ExpirationResultEntity.java | 85 +++++ .../mapper/AutoExpirationConfigMapper.java | 14 + .../znpt/mapper/ExpirationResultMapper.java | 14 + .../znpt/service/AutoExpirationService.java | 61 ++++ .../impl/AutoExpirationServiceImpl.java | 341 ++++++++++++++++++ .../service/job/AutoExpirationJobService.java | 14 + .../impl/AutoExpirationJobServiceImpl.java | 31 ++ doc/auto_expiration_readme.md | 138 +++++++ doc/auto_expiration_tables.sql | 51 +++ web/pom.xml | 10 +- .../controller/AutoExpirationController.java | 178 +++++++++ .../web/controller/EquipmentController.java | 1 + web/src/main/resources/application.yml | 1 + web/src/main/resources/logback.xml | 8 +- 17 files changed, 1048 insertions(+), 9 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/AutoExpirationService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java create mode 100644 core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java create mode 100644 core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java create mode 100644 doc/auto_expiration_readme.md create mode 100644 doc/auto_expiration_tables.sql create mode 100644 web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java index 6e38623..6b3c65a 100644 --- a/core/src/main/java/com/dite/znpt/config/Schedule.java +++ b/core/src/main/java/com/dite/znpt/config/Schedule.java @@ -7,6 +7,7 @@ import com.dite.znpt.domain.vo.PartResp; import com.dite.znpt.enums.FilePathEnum; import com.dite.znpt.service.ImageService; import com.dite.znpt.service.PartService; +import com.dite.znpt.service.job.AutoExpirationJobService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -26,6 +27,7 @@ public class Schedule { private final ImageService imageService; private final PartService partService; private final ExtUtilConfig extUtilConfig; + private final AutoExpirationJobService autoExpirationJobService; /** * 功能描述:图像预处理,持续运行 @@ -67,4 +69,16 @@ public class Schedule { } imageService.updateBatchById(successList); } + + /** + * 功能描述:自动到期检测,每天凌晨2点执行 + * + * @author System + * @date 2025/1/1 + **/ + @Scheduled(cron = "0 0 2 * * ?") + public void autoExpirationCheck() { + log.info("开始执行自动到期检测定时任务..."); + autoExpirationJobService.executeAutoExpirationJob(); + } } diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java index c09ff82..718f7ff 100644 --- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java +++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java @@ -2,10 +2,14 @@ package com.dite.znpt.config; import cn.hutool.core.collection.ListUtil; import com.dite.znpt.enums.FilePathEnum; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -28,6 +32,14 @@ public class WebMvcConfig implements WebMvcConfigurer { } } + /** + * 配置HTTP消息转换器,确保UTF-8编码 + */ + @Override + public void configureMessageConverters(List> converters) { + converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); + } + // @Override // public void addInterceptors(InterceptorRegistry registry) { // // 注册 Sa-Token 拦截器,定义详细认证规则 diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java new file mode 100644 index 0000000..7d9f608 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java @@ -0,0 +1,84 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测配置实体 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("auto_expiration_config") +@ApiModel(value="AutoExpirationConfigEntity对象", description="自动到期检测配置") +public class AutoExpirationConfigEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("配置ID") + @TableId(value = "config_id", type = IdType.ASSIGN_UUID) + private String configId; + + @ApiModelProperty("表名") + @TableField("table_name") + private String tableName; + + @ApiModelProperty("表描述") + @TableField("table_desc") + private String tableDesc; + + @ApiModelProperty("主键字段") + @TableField("primary_key_field") + private String primaryKeyField; + + @ApiModelProperty("到期时间字段") + @TableField("expire_date_field") + private String expireDateField; + + @ApiModelProperty("关联用户字段") + @TableField("user_id_field") + private String userIdField; + + @ApiModelProperty("用户姓名字段") + @TableField("user_name_field") + private String userNameField; + + @ApiModelProperty("业务名称字段") + @TableField("business_name_field") + private String businessNameField; + + @ApiModelProperty("提前提醒天数") + @TableField("remind_days") + private Integer remindDays; + + @ApiModelProperty("是否启用(0-禁用,1-启用)") + @TableField("enabled") + private String enabled; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; + + /** + * 保存前处理 + */ + public void preSave() { + // 可以在这里添加保存前的逻辑处理 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java new file mode 100644 index 0000000..fb2fc23 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java @@ -0,0 +1,85 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author System + * @date 2025/1/1 + * @description 到期检测结果实体 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("expiration_result") +@ApiModel(value="ExpirationResultEntity对象", description="到期检测结果") +public class ExpirationResultEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("结果ID") + @TableId(value = "result_id", type = IdType.ASSIGN_UUID) + private String resultId; + + @ApiModelProperty("配置ID") + @TableField("config_id") + private String configId; + + @ApiModelProperty("表名") + @TableField("table_name") + private String tableName; + + @ApiModelProperty("业务ID") + @TableField("business_id") + private String businessId; + + @ApiModelProperty("业务名称") + @TableField("business_name") + private String businessName; + + @ApiModelProperty("关联用户ID") + @TableField("user_id") + private String userId; + + @ApiModelProperty("关联用户姓名") + @TableField("user_name") + private String userName; + + @ApiModelProperty("到期日期") + @TableField("expire_date") + private LocalDate expireDate; + + @ApiModelProperty("剩余天数") + @TableField("remaining_days") + private Integer remainingDays; + + @ApiModelProperty("状态(0-正常,1-即将到期,2-已到期)") + @TableField("status") + private String status; + + @ApiModelProperty("检测时间") + @TableField("check_time") + private java.time.LocalDateTime checkTime; + + @ApiModelProperty("删除标志(0代表存在,1代表删除)") + @TableField("del_flag") + private String delFlag; + + /** + * 保存前处理 + */ + public void preSave() { + // 可以在这里添加保存前的逻辑处理 + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java b/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java new file mode 100644 index 0000000..5ea8531 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java @@ -0,0 +1,14 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.AutoExpirationConfigEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测配置Mapper + */ +@Mapper +public interface AutoExpirationConfigMapper extends BaseMapper { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java b/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java new file mode 100644 index 0000000..b6d3991 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java @@ -0,0 +1,14 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ExpirationResultEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author System + * @date 2025/1/1 + * @description 到期检测结果Mapper + */ +@Mapper +public interface ExpirationResultMapper extends BaseMapper { +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java b/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java new file mode 100644 index 0000000..35d2b76 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java @@ -0,0 +1,61 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.AutoExpirationConfigEntity; +import com.dite.znpt.domain.entity.ExpirationResultEntity; + +import java.util.List; +import java.util.Map; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测服务接口 + */ +public interface AutoExpirationService extends IService { + + /** + * 执行自动到期检测 + */ + void executeAutoExpirationCheck(); + + /** + * 获取到期检测结果 + * @param status 状态筛选 + * @return 检测结果列表 + */ + List getExpirationResults(String status); + + /** + * 获取统计信息 + * @return 统计信息 + */ + Map getStatistics(); + + /** + * 手动检测指定表 + * @param tableName 表名 + */ + void checkTableExpiration(String tableName); + + /** + * 检查表是否已配置到期检测 + * @param tableName 表名 + * @return 配置信息,如果未配置返回null + */ + AutoExpirationConfigEntity getTableConfig(String tableName); + + /** + * 批量检查多个表的配置状态 + * @param tableNames 表名列表 + * @return 配置状态映射 + */ + Map getTablesConfigStatus(List tableNames); + + /** + * 智能配置表检测 + * @param tableName 表名 + * @return 配置结果 + */ + AutoExpirationConfigEntity autoConfigureTable(String tableName); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java new file mode 100644 index 0000000..ffa2ba7 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java @@ -0,0 +1,341 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.domain.entity.AutoExpirationConfigEntity; +import com.dite.znpt.domain.entity.ExpirationResultEntity; +import com.dite.znpt.mapper.AutoExpirationConfigMapper; +import com.dite.znpt.mapper.ExpirationResultMapper; +import com.dite.znpt.service.AutoExpirationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测服务实现类 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class AutoExpirationServiceImpl extends ServiceImpl implements AutoExpirationService { + + @Autowired + private ExpirationResultMapper expirationResultMapper; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Override + public void executeAutoExpirationCheck() { + log.info("开始执行自动到期检测..."); + + // 获取所有启用的配置 + List configs = lambdaQuery() + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .list(); + + if (CollUtil.isEmpty(configs)) { + log.info("没有找到启用的到期检测配置"); + return; + } + + // 清空之前的检测结果 + expirationResultMapper.delete(null); + + // 逐个检测每个配置的表 + for (AutoExpirationConfigEntity config : configs) { + try { + checkTableExpiration(config); + } catch (Exception e) { + log.error("检测表 {} 时发生错误: {}", config.getTableName(), e.getMessage(), e); + } + } + + log.info("自动到期检测完成,共检测 {} 个表", configs.size()); + } + + @Override + public List getExpirationResults(String status) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ExpirationResultEntity::getDelFlag, "0"); + + if (StrUtil.isNotBlank(status)) { + wrapper.eq(ExpirationResultEntity::getStatus, status); + } + + wrapper.orderByDesc(ExpirationResultEntity::getExpireDate); + + return expirationResultMapper.selectList(wrapper); + } + + @Override + public Map getStatistics() { + Map statistics = new HashMap<>(); + + // 统计各状态的数量 + List allResults = expirationResultMapper.selectList(null); + + long normalCount = allResults.stream() + .filter(r -> "0".equals(r.getStatus())) + .count(); + long expiringCount = allResults.stream() + .filter(r -> "1".equals(r.getStatus())) + .count(); + long expiredCount = allResults.stream() + .filter(r -> "2".equals(r.getStatus())) + .count(); + + statistics.put("total", allResults.size()); + statistics.put("normal", normalCount); + statistics.put("expiring", expiringCount); + statistics.put("expired", expiredCount); + + return statistics; + } + + @Override + public void checkTableExpiration(String tableName) { + AutoExpirationConfigEntity config = lambdaQuery() + .eq(AutoExpirationConfigEntity::getTableName, tableName) + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .one(); + + if (config == null) { + throw new RuntimeException("未找到表 " + tableName + " 的配置信息"); + } + + checkTableExpiration(config); + } + + /** + * 检测指定配置的表 + */ + private void checkTableExpiration(AutoExpirationConfigEntity config) { + log.info("开始检测表: {}", config.getTableName()); + + // 构建查询SQL + String sql = buildQuerySql(config); + + try { + List> results = jdbcTemplate.queryForList(sql); + + for (Map row : results) { + processExpirationResult(config, row); + } + + log.info("表 {} 检测完成,共处理 {} 条记录", config.getTableName(), results.size()); + + } catch (Exception e) { + log.error("检测表 {} 时发生错误: {}", config.getTableName(), e.getMessage(), e); + } + } + + /** + * 构建查询SQL + */ + private String buildQuerySql(AutoExpirationConfigEntity config) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT "); + sql.append(config.getPrimaryKeyField()).append(" as business_id, "); + sql.append(config.getExpireDateField()).append(" as expire_date "); + + if (StrUtil.isNotBlank(config.getUserIdField())) { + sql.append(", ").append(config.getUserIdField()).append(" as user_id "); + } + if (StrUtil.isNotBlank(config.getUserNameField())) { + sql.append(", ").append(config.getUserNameField()).append(" as user_name "); + } + if (StrUtil.isNotBlank(config.getBusinessNameField())) { + sql.append(", ").append(config.getBusinessNameField()).append(" as business_name "); + } + + sql.append(" FROM ").append(config.getTableName()); + sql.append(" WHERE ").append(config.getExpireDateField()).append(" IS NOT NULL"); + + return sql.toString(); + } + + /** + * 处理到期检测结果 + */ + private void processExpirationResult(AutoExpirationConfigEntity config, Map row) { + try { + ExpirationResultEntity result = new ExpirationResultEntity(); + result.preSave(); + + result.setConfigId(config.getConfigId()); + result.setTableName(config.getTableName()); + result.setBusinessId(String.valueOf(row.get("business_id"))); + result.setBusinessName(String.valueOf(row.get("business_name"))); + result.setUserId(String.valueOf(row.get("user_id"))); + result.setUserName(String.valueOf(row.get("user_name"))); + + // 处理到期日期 + Object expireDateObj = row.get("expire_date"); + if (expireDateObj != null) { + LocalDate expireDate = parseDate(expireDateObj); + result.setExpireDate(expireDate); + + // 计算剩余天数和状态 + LocalDate today = LocalDate.now(); + long remainingDays = ChronoUnit.DAYS.between(today, expireDate); + result.setRemainingDays((int) remainingDays); + + // 设置状态 + if (remainingDays < 0) { + result.setStatus("2"); // 已到期 + } else if (remainingDays <= config.getRemindDays()) { + result.setStatus("1"); // 即将到期 + } else { + result.setStatus("0"); // 正常 + } + } + + result.setCheckTime(LocalDateTime.now()); + result.setDelFlag("0"); + + expirationResultMapper.insert(result); + + } catch (Exception e) { + log.error("处理检测结果时发生错误: {}", e.getMessage(), e); + } + } + + /** + * 解析日期 + */ + private LocalDate parseDate(Object dateObj) { + if (dateObj instanceof LocalDate) { + return (LocalDate) dateObj; + } else if (dateObj instanceof java.sql.Date) { + return ((java.sql.Date) dateObj).toLocalDate(); + } else if (dateObj instanceof java.util.Date) { + // 使用 DateUtil.toLocalDateTime 然后转换为 LocalDate + return DateUtil.toLocalDateTime((java.util.Date) dateObj).toLocalDate(); + } else { + return LocalDate.parse(dateObj.toString()); + } + } + + @Override + public AutoExpirationConfigEntity getTableConfig(String tableName) { + return lambdaQuery() + .eq(AutoExpirationConfigEntity::getTableName, tableName) + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .one(); + } + + @Override + public Map getTablesConfigStatus(List tableNames) { + Map statusMap = new HashMap<>(); + + if (CollUtil.isEmpty(tableNames)) { + return statusMap; + } + + // 查询所有已配置的表 + List configs = lambdaQuery() + .in(AutoExpirationConfigEntity::getTableName, tableNames) + .eq(AutoExpirationConfigEntity::getEnabled, "1") + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .list(); + + // 构建已配置的表名集合 + Set configuredTables = configs.stream() + .map(AutoExpirationConfigEntity::getTableName) + .collect(Collectors.toSet()); + + // 为每个表设置配置状态 + for (String tableName : tableNames) { + statusMap.put(tableName, configuredTables.contains(tableName)); + } + + return statusMap; + } + + @Override + public AutoExpirationConfigEntity autoConfigureTable(String tableName) { + // 检查是否已配置 + AutoExpirationConfigEntity existingConfig = getTableConfig(tableName); + if (existingConfig != null) { + log.info("表 {} 已存在配置", tableName); + return existingConfig; + } + + // 根据表名生成默认配置 + AutoExpirationConfigEntity config = generateDefaultConfig(tableName); + + try { + config.preSave(); + save(config); + log.info("为表 {} 自动创建配置", tableName); + return config; + } catch (Exception e) { + log.error("自动配置表 {} 失败: {}", tableName, e.getMessage(), e); + throw new RuntimeException("自动配置失败: " + e.getMessage()); + } + } + + /** + * 根据表名生成默认配置 + */ + private AutoExpirationConfigEntity generateDefaultConfig(String tableName) { + AutoExpirationConfigEntity config = new AutoExpirationConfigEntity(); + config.setConfigId("config-" + System.currentTimeMillis()); + config.setTableName(tableName); + config.setEnabled("1"); + config.setDelFlag("0"); + config.setRemindDays(30); + config.setRemark("自动配置的到期检测"); + + // 根据表名设置默认字段 + switch (tableName) { + case "certification": + config.setTableDesc("证书到期检测"); + config.setPrimaryKeyField("certification_id"); + config.setExpireDateField("validity_date_end"); + config.setUserIdField("user_id"); + config.setBusinessNameField("certification_name"); + break; + case "insurance_info": + config.setTableDesc("保险到期检测"); + config.setPrimaryKeyField("insurance_id"); + config.setExpireDateField("expire_date"); + config.setUserIdField("user_id"); + config.setBusinessNameField("insurance_name"); + break; + case "regulation": + config.setTableDesc("规章制度到期检测"); + config.setPrimaryKeyField("regulation_id"); + config.setExpireDateField("expire_date"); + config.setUserIdField("create_by"); + config.setBusinessNameField("regulation_name"); + break; + default: + // 通用配置 + config.setTableDesc(tableName + "到期检测"); + config.setPrimaryKeyField("id"); + config.setExpireDateField("expire_date"); + config.setUserIdField("user_id"); + config.setBusinessNameField("name"); + break; + } + + return config; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java b/core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java new file mode 100644 index 0000000..dba4ee1 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java @@ -0,0 +1,14 @@ +package com.dite.znpt.service.job; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测定时任务服务接口 + */ +public interface AutoExpirationJobService { + + /** + * 执行自动到期检测任务 + */ + void executeAutoExpirationJob(); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java b/core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java new file mode 100644 index 0000000..a0bd57b --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java @@ -0,0 +1,31 @@ +package com.dite.znpt.service.job.impl; + +import com.dite.znpt.service.AutoExpirationService; +import com.dite.znpt.service.job.AutoExpirationJobService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author System + * @date 2025/1/1 + * @description 自动到期检测定时任务服务实现类 + */ +@Slf4j +@Service +public class AutoExpirationJobServiceImpl implements AutoExpirationJobService { + + @Autowired + private AutoExpirationService autoExpirationService; + + @Override + public void executeAutoExpirationJob() { + log.info("开始执行自动到期检测定时任务..."); + try { + autoExpirationService.executeAutoExpirationCheck(); + log.info("自动到期检测定时任务执行完成"); + } catch (Exception e) { + log.error("自动到期检测定时任务执行失败: {}", e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/doc/auto_expiration_readme.md b/doc/auto_expiration_readme.md new file mode 100644 index 0000000..c3a0041 --- /dev/null +++ b/doc/auto_expiration_readme.md @@ -0,0 +1,138 @@ +# 自动到期检测功能使用说明 + +## 功能概述 + +自动到期检测功能是一个智能的到期时间监控系统,能够自动检测数据库中各种表格的到期时间字段,并提供到期提醒功能。 + +## 主要特性 + +1. **自动检测**: 系统会自动扫描配置的表格,检测其中的到期时间字段 +2. **灵活配置**: 可以配置任意表格的到期检测规则 +3. **智能提醒**: 支持提前提醒天数配置 +4. **状态管理**: 自动计算剩余天数并设置状态(正常/即将到期/已到期) +5. **定时执行**: 每天凌晨2点自动执行检测任务 + +## 数据库表结构 + +### 1. 自动到期检测配置表 (auto_expiration_config) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| config_id | varchar(64) | 配置ID | +| table_name | varchar(100) | 表名 | +| table_desc | varchar(200) | 表描述 | +| primary_key_field | varchar(100) | 主键字段 | +| expire_date_field | varchar(100) | 到期时间字段 | +| user_id_field | varchar(100) | 关联用户字段 | +| user_name_field | varchar(100) | 用户姓名字段 | +| business_name_field | varchar(100) | 业务名称字段 | +| remind_days | int | 提前提醒天数 | +| enabled | varchar(1) | 是否启用(0-禁用,1-启用) | + +### 2. 到期检测结果表 (expiration_result) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| result_id | varchar(64) | 结果ID | +| table_name | varchar(100) | 表名 | +| business_id | varchar(64) | 业务ID | +| business_name | varchar(200) | 业务名称 | +| user_id | varchar(64) | 关联用户ID | +| user_name | varchar(100) | 关联用户姓名 | +| expire_date | date | 到期日期 | +| remaining_days | int | 剩余天数 | +| status | varchar(1) | 状态(0-正常,1-即将到期,2-已到期) | + +## API接口 + +### 1. 手动执行到期检测 +``` +POST /auto-expiration/execute +``` + +### 2. 获取到期检测结果 +``` +GET /auto-expiration/results?status=1 +``` +参数说明: +- status: 状态筛选(0-正常,1-即将到期,2-已到期) + +### 3. 获取统计信息 +``` +GET /auto-expiration/statistics +``` + +### 4. 检测指定表 +``` +POST /auto-expiration/check-table/{tableName} +``` + +### 5. 保存配置 +``` +POST /auto-expiration/config +``` + +### 6. 获取所有配置 +``` +GET /auto-expiration/configs +``` + +### 7. 删除配置 +``` +DELETE /auto-expiration/config/{configId} +``` + +## 配置示例 + +### 人员资质证书检测配置 +```json +{ + "tableName": "certification", + "tableDesc": "人员资质证书", + "primaryKeyField": "certification_id", + "expireDateField": "validity_date_end", + "userIdField": "user_id", + "businessNameField": "certification_name", + "remindDays": 30, + "enabled": "1" +} +``` + +### 人员保险检测配置 +```json +{ + "tableName": "insurance_info", + "tableDesc": "人员保险", + "primaryKeyField": "insurance_info_id", + "expireDateField": "expire_date", + "userIdField": "user_id", + "userNameField": "name", + "businessNameField": "insurance_type_name", + "remindDays": 30, + "enabled": "1" +} +``` + +## 使用步骤 + +1. **创建数据库表**: 执行 `auto_expiration_tables.sql` 创建必要的表结构 +2. **配置检测规则**: 通过API或直接插入数据配置需要检测的表格 +3. **启动定时任务**: 系统会自动在每天凌晨2点执行检测 +4. **查看检测结果**: 通过API接口查看检测结果和统计信息 + +## 扩展说明 + +系统支持检测任意表格的到期时间字段,只需要在配置表中添加相应的配置即可。支持的字段类型包括: +- LocalDate +- LocalDateTime +- Date +- Timestamp + +系统会自动识别并处理这些日期类型。 + +## 注意事项 + +1. 确保配置的字段名在目标表中存在 +2. 到期时间字段不能为空 +3. 建议为检测结果表添加适当的索引以提高查询性能 +4. 可以根据业务需要调整提前提醒天数 \ No newline at end of file diff --git a/doc/auto_expiration_tables.sql b/doc/auto_expiration_tables.sql new file mode 100644 index 0000000..793373c --- /dev/null +++ b/doc/auto_expiration_tables.sql @@ -0,0 +1,51 @@ +-- 自动到期检测配置表 +CREATE TABLE `auto_expiration_config` ( + `config_id` varchar(64) NOT NULL COMMENT '配置ID', + `table_name` varchar(100) NOT NULL COMMENT '表名', + `table_desc` varchar(200) DEFAULT NULL COMMENT '表描述', + `primary_key_field` varchar(100) NOT NULL COMMENT '主键字段', + `expire_date_field` varchar(100) NOT NULL COMMENT '到期时间字段', + `user_id_field` varchar(100) DEFAULT NULL COMMENT '关联用户字段', + `user_name_field` varchar(100) DEFAULT NULL COMMENT '用户姓名字段', + `business_name_field` varchar(100) DEFAULT NULL COMMENT '业务名称字段', + `remind_days` int(11) DEFAULT 30 COMMENT '提前提醒天数', + `enabled` varchar(1) DEFAULT '1' COMMENT '是否启用(0-禁用,1-启用)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `del_flag` varchar(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`config_id`), + UNIQUE KEY `uk_table_name` (`table_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自动到期检测配置表'; + +-- 到期检测结果表 +CREATE TABLE `expiration_result` ( + `result_id` varchar(64) NOT NULL COMMENT '结果ID', + `config_id` varchar(64) DEFAULT NULL COMMENT '配置ID', + `table_name` varchar(100) NOT NULL COMMENT '表名', + `business_id` varchar(64) NOT NULL COMMENT '业务ID', + `business_name` varchar(200) DEFAULT NULL COMMENT '业务名称', + `user_id` varchar(64) DEFAULT NULL COMMENT '关联用户ID', + `user_name` varchar(100) DEFAULT NULL COMMENT '关联用户姓名', + `expire_date` date NOT NULL COMMENT '到期日期', + `remaining_days` int(11) DEFAULT NULL COMMENT '剩余天数', + `status` varchar(1) DEFAULT '0' COMMENT '状态(0-正常,1-即将到期,2-已到期)', + `check_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '检测时间', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `del_flag` varchar(1) DEFAULT '0' COMMENT '删除标志(0代表存在,1代表删除)', + PRIMARY KEY (`result_id`), + KEY `idx_table_name` (`table_name`), + KEY `idx_status` (`status`), + KEY `idx_expire_date` (`expire_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='到期检测结果表'; + +-- 插入示例配置数据 +INSERT INTO `auto_expiration_config` (`config_id`, `table_name`, `table_desc`, `primary_key_field`, `expire_date_field`, `user_id_field`, `user_name_field`, `business_name_field`, `remind_days`, `enabled`, `remark`) VALUES +('1', 'certification', '人员资质证书', 'certification_id', 'validity_date_end', 'user_id', NULL, 'certification_name', 30, '1', '人员资质证书到期检测'), +('2', 'insurance_info', '人员保险', 'insurance_info_id', 'expire_date', 'user_id', 'name', 'insurance_type_name', 30, '1', '人员保险到期检测'), +('3', 'regulation', '制度管理', 'regulation_id', 'expire_time', NULL, NULL, 'regulation_name', 30, '1', '制度到期检测'); \ No newline at end of file diff --git a/web/pom.xml b/web/pom.xml index c6d6423..4dd81fc 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -20,11 +20,11 @@ - - com.dite.znpt - sip - 1.0.0-SNAPSHOT - + + + + + com.dite.znpt core diff --git a/web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java b/web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java new file mode 100644 index 0000000..9b27a29 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java @@ -0,0 +1,178 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.AutoExpirationConfigEntity; +import com.dite.znpt.domain.entity.ExpirationResultEntity; +import com.dite.znpt.service.AutoExpirationService; +import com.dite.znpt.service.job.AutoExpirationJobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @author wangna + * @date 2025/08/05 + * @description 自动到期检测控制器 + */ +@Slf4j +@RestController +@RequestMapping("/auto-expiration") +@Api(tags = "自动到期检测") +public class AutoExpirationController { + + @Autowired + private AutoExpirationService autoExpirationService; + + @Autowired + private AutoExpirationJobService autoExpirationJobService; + + @PostMapping("/execute") + @ApiOperation("手动执行到期检测") + public Result executeExpirationCheck() { + try { + autoExpirationService.executeAutoExpirationCheck(); + return Result.okM("到期检测执行成功"); + } catch (Exception e) { + log.error("执行到期检测失败: {}", e.getMessage(), e); + return Result.error("执行到期检测失败: " + e.getMessage()); + } + } + + @GetMapping("/results") + @ApiOperation("获取到期检测结果") + public Result> getExpirationResults( + @ApiParam("状态筛选:0-正常,1-即将到期,2-已到期") @RequestParam(required = false) String status) { + try { + List results = autoExpirationService.getExpirationResults(status); + return Result.ok(results); + } catch (Exception e) { + log.error("获取到期检测结果失败: {}", e.getMessage(), e); + return Result.error("获取到期检测结果失败: " + e.getMessage()); + } + } + + @GetMapping("/statistics") + @ApiOperation("获取统计信息") + public Result> getStatistics() { + try { + Map statistics = autoExpirationService.getStatistics(); + return Result.ok(statistics); + } catch (Exception e) { + log.error("获取统计信息失败: {}", e.getMessage(), e); + return Result.error("获取统计信息失败: " + e.getMessage()); + } + } + + @PostMapping("/check-table/{tableName}") + @ApiOperation("检测指定表") + public Result checkTableExpiration(@PathVariable String tableName) { + try { + autoExpirationService.checkTableExpiration(tableName); + return Result.okM("表 " + tableName + " 检测完成"); + } catch (Exception e) { + log.error("检测表 {} 失败: {}", tableName, e.getMessage(), e); + return Result.error("检测表失败: " + e.getMessage()); + } + } + + @PostMapping("/config") + @ApiOperation("保存配置") + public Result saveConfig(@RequestBody AutoExpirationConfigEntity config) { + try { + // 检查是否已存在相同表的配置 + AutoExpirationConfigEntity existingConfig = autoExpirationService.lambdaQuery() + .eq(AutoExpirationConfigEntity::getTableName, config.getTableName()) + .eq(AutoExpirationConfigEntity::getDelFlag, "0") + .one(); + + if (existingConfig != null) { + // 如果存在,更新配置 + config.setConfigId(existingConfig.getConfigId()); + config.setCreateTime(existingConfig.getCreateTime()); + config.setCreateBy(existingConfig.getCreateBy()); + log.info("更新已存在的配置: {}", config.getTableName()); + } else { + // 如果不存在,生成新的配置ID + config.setConfigId("config-" + System.currentTimeMillis()); + log.info("创建新配置: {}", config.getTableName()); + } + + config.preSave(); + autoExpirationService.saveOrUpdate(config); + return Result.ok(config); + } catch (Exception e) { + log.error("保存配置失败: {}", e.getMessage(), e); + return Result.error("保存配置失败: " + e.getMessage()); + } + } + + @GetMapping("/configs") + @ApiOperation("获取所有配置") + public Result> getConfigs() { + try { + List configs = autoExpirationService.list(); + return Result.ok(configs); + } catch (Exception e) { + log.error("获取配置失败: {}", e.getMessage(), e); + return Result.error("获取配置失败: " + e.getMessage()); + } + } + + @DeleteMapping("/config/{configId}") + @ApiOperation("删除配置") + public Result deleteConfig(@PathVariable String configId) { + try { + autoExpirationService.removeById(configId); + return Result.okM("配置删除成功"); + } catch (Exception e) { + log.error("删除配置失败: {}", e.getMessage(), e); + return Result.error("删除配置失败: " + e.getMessage()); + } + } + + @GetMapping("/check-table/{tableName}") + @ApiOperation("检查表是否已配置到期检测") + public Result checkTableConfig(@PathVariable String tableName) { + try { + AutoExpirationConfigEntity config = autoExpirationService.getTableConfig(tableName); + if (config != null) { + return Result.ok(config); + } else { + return Result.ok(null); + } + } catch (Exception e) { + log.error("检查表配置失败: {}", e.getMessage(), e); + return Result.error("检查表配置失败: " + e.getMessage()); + } + } + + @PostMapping("/check-tables") + @ApiOperation("批量检查多个表的配置状态") + public Result> checkTablesConfig(@RequestBody List tableNames) { + try { + Map statusMap = autoExpirationService.getTablesConfigStatus(tableNames); + return Result.ok(statusMap); + } catch (Exception e) { + log.error("批量检查表配置失败: {}", e.getMessage(), e); + return Result.error("批量检查表配置失败: " + e.getMessage()); + } + } + + @PostMapping("/auto-config/{tableName}") + @ApiOperation("智能配置表检测") + public Result autoConfigureTable(@PathVariable String tableName) { + try { + AutoExpirationConfigEntity config = autoExpirationService.autoConfigureTable(tableName); + return Result.ok(config); + } catch (Exception e) { + log.error("智能配置表失败: {}", e.getMessage(), e); + return Result.error("智能配置表失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java index b3318b5..238e447 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/EquipmentController.java @@ -65,4 +65,5 @@ public class EquipmentController { equipmentService.deleteById(equipmentId); return Result.ok(); } + } diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index 694c057..7adbb7d 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -22,6 +22,7 @@ spring: allow-circular-references: true allow-bean-definition-overriding: true + # flowable相关表 flowable: # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用) diff --git a/web/src/main/resources/logback.xml b/web/src/main/resources/logback.xml index 5f99223..c99788b 100644 --- a/web/src/main/resources/logback.xml +++ b/web/src/main/resources/logback.xml @@ -7,7 +7,7 @@ - + ${log.pattern} @@ -24,7 +24,7 @@ 10mb 200mb - + ${log.pattern} @@ -48,7 +48,7 @@ 10mb 300mb - + ${log.pattern} @@ -72,7 +72,7 @@ 10mb 500mb - + ${log.pattern} From 0a446e5f661ea1b1569193a18bb8be03533d1a53 Mon Sep 17 00:00:00 2001 From: gaoxiong Date: Mon, 28 Jul 2025 23:35:44 +0800 Subject: [PATCH 27/38] =?UTF-8?q?=E6=8B=9B=E6=8A=95=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/domain/vo/TenderInfoResp.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java index 97e8028..82551fd 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -42,4 +42,10 @@ public class TenderInfoResp extends TenderInfoReq implements Serializable { @ApiModelProperty("投标负责人姓名") private String tenderManagerName; + @ApiModelProperty("投标文件地址") + private String attachPath; + + @ApiModelProperty("投标负责人姓名") + private String tenderManagerName; + } \ No newline at end of file From b818eec318a749ff9d1f3508f9b2083a404aff5e Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Sun, 3 Aug 2025 17:43:06 +0800 Subject: [PATCH 28/38] =?UTF-8?q?1.=E6=89=B9=E9=87=8F=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9B=BE=E5=83=8F=E6=A0=A1=E9=AA=8C=E9=83=A8=E4=BB=B6id?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/service/impl/ImageServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java index 7e86363..c997492 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ImageServiceImpl.java @@ -141,10 +141,13 @@ public class ImageServiceImpl extends ServiceImpl impl if (StrUtil.isEmpty(imageSource) || Objects.isNull(ImageSourceEnum.getByCode(imageSource))) { throw new ServiceException(Message.IMAGE_SOURCE_IS_NOT_EXIST); } - PartResp partResp = partService.detail(partId); if(null == files || files.length == 0){ throw new ServiceException(Message.IMAGE_IS_EMPTY); } + PartResp partResp = partService.detail(partId); + if (Objects.isNull(partResp)) { + throw new ServiceException(Message.PART_ID_IS_NOT_EXIST); + } List list = new ArrayList<>(files.length); File temCategory = new File(FilePathEnum.IMAGE_TEMP.getFileAbsolutePathPrefix()); if (!temCategory.exists()) { From ffbf766ceee6b4cf8d7a43efc0405d012a86481c Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 5 Aug 2025 20:23:46 +0800 Subject: [PATCH 29/38] =?UTF-8?q?1.=E6=89=8B=E5=8A=A8=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E5=A4=B9=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E5=88=B0=E9=A1=B9=E7=9B=AE(=E5=8D=95=E5=BC=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/service/impl/PartServiceImpl.java | 2 +- .../com/dite/znpt/web/controller/ImageController.java | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java index 43e9b92..4f6ef6a 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/PartServiceImpl.java @@ -99,7 +99,7 @@ public class PartServiceImpl extends ServiceImpl impleme if(StrUtil.isNotEmpty(turbine.getProjectId())){ ProjectEntity project = projectService.getById(turbine.getProjectId()); if(null != project){ - resp.setProjectId(resp.getProjectId()); + resp.setProjectId(project.getProjectId()); resp.setProjectName(project.getProjectName()); } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java index 1f28c39..5a147d1 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/ImageController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/ImageController.java @@ -61,11 +61,16 @@ public class ImageController { return Result.ok(imageService.uploadProjectBatch(projectId, imageSource, collectReq, files)); } + @ApiOperation(value = "手动批量上传文件夹图像到项目(单张)", httpMethod = "POST") + @PostMapping("/{projectId}/{imageSource}/upload") + public Result uploadProject(@PathVariable String projectId, @PathVariable String imageSource, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { + return Result.ok(imageService.uploadProjectBatch(projectId, imageSource, collectReq, new MultipartFile[]{file}).get(0)); + } + @ApiOperation(value = "上传图像", httpMethod = "POST") @PostMapping("/{imageSource}/upload/{partId}") public Result uploadOutWork(@PathVariable String imageSource, @PathVariable String partId, ImageCollectReq collectReq, @RequestParam("file") MultipartFile file) { - MultipartFile[] files = {file}; - return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, files).get(0)); + return Result.ok(imageService.batchUploadDefectImage(partId, imageSource, collectReq, new MultipartFile[]{file}).get(0)); } @ApiOperation(value = "设置信息", httpMethod = "POST") From 8c3da0878e2b505ce060c2a56debc44dce1207b9 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 5 Aug 2025 20:27:44 +0800 Subject: [PATCH 30/38] =?UTF-8?q?=E5=90=88=E5=B9=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/dite/znpt/domain/vo/TenderInfoResp.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java index 82551fd..97e8028 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/TenderInfoResp.java @@ -42,10 +42,4 @@ public class TenderInfoResp extends TenderInfoReq implements Serializable { @ApiModelProperty("投标负责人姓名") private String tenderManagerName; - @ApiModelProperty("投标文件地址") - private String attachPath; - - @ApiModelProperty("投标负责人姓名") - private String tenderManagerName; - } \ No newline at end of file From ade816ab3f8daf7b307b59e8d86146c96dfe5427 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Tue, 5 Aug 2025 20:31:52 +0800 Subject: [PATCH 31/38] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=87=8D=E6=96=B0=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/domain/entity/ProjectEntity.java | 17 +- .../domain/entity/ProjectMemberEntity.java | 99 ++++ .../znpt/domain/vo/ProjectDetailResp.java | 180 ++++++++ .../znpt/domain/vo/ProjectKanbanDataResp.java | 107 +++++ .../domain/vo/ProjectKanbanStatsResp.java | 81 ++++ .../znpt/domain/vo/ProjectMemberListReq.java | 45 ++ .../dite/znpt/domain/vo/ProjectMemberReq.java | 62 +++ .../znpt/domain/vo/ProjectMemberResp.java | 83 ++++ .../dite/znpt/enums/ProjectJobCodeEnum.java | 72 +++ .../dite/znpt/enums/ProjectRoleTypeEnum.java | 53 +++ .../dite/znpt/mapper/ProjectMemberMapper.java | 54 +++ .../znpt/service/ProjectMemberService.java | 107 +++++ .../impl/ProjectMemberServiceImpl.java | 431 ++++++++++++++++++ .../resources/mapper/ProjectMemberMapper.xml | 314 +++++++++++++ doc/project_member_extended_data.sql | 107 +++++ doc/project_member_tables.sql | 137 ++++++ doc/project_member_test_data.sql | 53 +++ .../controller/ProjectMemberController.java | 153 +++++++ web/src/main/resources/application-dev.yml | 5 + 19 files changed, 2155 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ProjectMemberEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanStatsResp.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectJobCodeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/enums/ProjectRoleTypeEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/ProjectMemberService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java create mode 100644 core/src/main/resources/mapper/ProjectMemberMapper.xml create mode 100644 doc/project_member_extended_data.sql create mode 100644 doc/project_member_tables.sql create mode 100644 doc/project_member_test_data.sql create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 0060dc2..718558f 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -91,24 +91,31 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @TableField("turbine_model") private String turbineModel; - @ApiModelProperty("施工人员id") + // 人员管理已迁移到 project_member 表 + // 以下字段保留用于向后兼容,但建议使用 ProjectMemberService 进行人员管理 + @ApiModelProperty("施工人员id(已废弃,请使用ProjectMemberService)") @TableField("constructor_ids") + @Deprecated private String constructorIds; - @ApiModelProperty("安全员id") + @ApiModelProperty("安全员id(已废弃,请使用ProjectMemberService)") @TableField("auditor_id") + @Deprecated private String auditorId; - @ApiModelProperty("质量员id") + @ApiModelProperty("质量员id(已废弃,请使用ProjectMemberService)") @TableField("quality_officer_id") + @Deprecated private String qualityOfficerId; - @ApiModelProperty("项目经理id") + @ApiModelProperty("项目经理id(已废弃,请使用ProjectMemberService)") @TableField("project_manager_id") + @Deprecated private String projectManagerId; - @ApiModelProperty("施工组长id") + @ApiModelProperty("施工组长id(已废弃,请使用ProjectMemberService)") @TableField("construct_team_leader_id") + @Deprecated private String constructTeamLeaderId; @ApiModelProperty("技术方案图片,多个用逗号隔开") diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectMemberEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectMemberEntity.java new file mode 100644 index 0000000..d3cc17a --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectMemberEntity.java @@ -0,0 +1,99 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员关联表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_member") +@ApiModel(value="ProjectMemberEntity对象", description="项目人员关联表") +public class ProjectMemberEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("关联ID") + @TableId(value = "member_id", type = IdType.ASSIGN_UUID) + private String memberId; + + @ApiModelProperty("项目ID") + @TableField("project_id") + private String projectId; + + @ApiModelProperty("机组ID(可选,关联到具体机组)") + @TableField("turbine_id") + private String turbineId; + + @ApiModelProperty("任务组ID(可选,关联到具体任务组)") + @TableField("task_group_id") + private String taskGroupId; + + @ApiModelProperty("任务ID(可选,关联到具体任务)") + @TableField("task_id") + private String taskId; + + @ApiModelProperty("用户ID") + @TableField("user_id") + private String userId; + + @ApiModelProperty("项目角色类型:PROJECT_MANAGER-项目经理,SAFETY_OFFICER-安全员,QUALITY_OFFICER-质量员,CONSTRUCTOR-施工人员,TEAM_LEADER-施工组长") + @TableField("role_type") + private String roleType; + + @ApiModelProperty("具体岗位代码(如:GROUND_SERVICE-地勤,DRIVER-司机,ASCENDING-登高等)") + @TableField("job_code") + private String jobCode; + + @ApiModelProperty("岗位描述") + @TableField("job_desc") + private String jobDesc; + + @ApiModelProperty("加入时间") + @TableField("join_date") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + @TableField("leave_date") + private LocalDate leaveDate; + + @ApiModelProperty("状态:ACTIVE-在职,INACTIVE-离职,SUSPENDED-暂停") + @TableField("status") + private String status; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + // 非数据库字段,用于显示 + @TableField(exist = false) + @ApiModelProperty("用户姓名") + private String userName; + + @TableField(exist = false) + @ApiModelProperty("用户账号") + private String userAccount; + + @TableField(exist = false) + @ApiModelProperty("角色类型描述") + private String roleTypeDesc; + + @TableField(exist = false) + @ApiModelProperty("岗位代码描述") + private String jobCodeDesc; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java new file mode 100644 index 0000000..2266301 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java @@ -0,0 +1,180 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目详情响应VO + */ +@Data +@ApiModel(value="ProjectDetailResp对象", description="项目详情响应") +public class ProjectDetailResp { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("项目封面") + private String coverUrl; + + @ApiModelProperty("风场名称") + private String farmName; + + @ApiModelProperty("风场地址") + private String farmAddress; + + @ApiModelProperty("委托单位") + private String client; + + @ApiModelProperty("委托单位联系人") + private String clientContact; + + @ApiModelProperty("委托单位联系电话") + private String clientPhone; + + @ApiModelProperty("检查单位") + private String inspectionUnit; + + @ApiModelProperty("检查单位联系人") + private String inspectionContact; + + @ApiModelProperty("检查单位联系电话") + private String inspectionPhone; + + @ApiModelProperty("项目规模") + private String scale; + + @ApiModelProperty("总工期(天数)") + private Integer duration; + + @ApiModelProperty("风机型号") + private String turbineModel; + + @ApiModelProperty("项目状态") + private Integer status; + + @ApiModelProperty("项目状态描述") + private String statusLabel; + + @ApiModelProperty("开始时间") + private LocalDate startDate; + + @ApiModelProperty("结束时间") + private LocalDate endDate; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + + // 项目人员信息(从新关联表获取) + @ApiModelProperty("项目人员列表") + private List projectMembers; + + // 项目机组信息 + @ApiModelProperty("项目机组列表") + private List turbines; + + // 项目任务信息 + @ApiModelProperty("项目任务列表") + private List tasks; + + // 项目预算信息 + @ApiModelProperty("项目预算列表") + private List budgets; + + // 项目日报信息 + @ApiModelProperty("项目日报列表") + private List dailyReports; + + @Data + @ApiModel(value="TurbineInfo对象", description="机组信息") + public static class TurbineInfo { + @ApiModelProperty("机组ID") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("机组编码") + private String turbineCode; + + @ApiModelProperty("机组状态") + private Integer status; + + @ApiModelProperty("机组状态描述") + private String statusLabel; + } + + @Data + @ApiModel(value="TaskInfo对象", description="任务信息") + public static class TaskInfo { + @ApiModelProperty("任务ID") + private String taskId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("任务状态") + private Integer status; + + @ApiModelProperty("任务状态描述") + private String statusLabel; + + @ApiModelProperty("计划开始时间") + private LocalDate planStartDate; + + @ApiModelProperty("计划结束时间") + private LocalDate planEndDate; + + @ApiModelProperty("实际开始时间") + private LocalDate actualStartDate; + + @ApiModelProperty("实际结束时间") + private LocalDate actualEndDate; + } + + @Data + @ApiModel(value="BudgetInfo对象", description="预算信息") + public static class BudgetInfo { + @ApiModelProperty("预算ID") + private String budgetId; + + @ApiModelProperty("预算名称") + private String budgetName; + + @ApiModelProperty("预算类型") + private String budgetType; + + @ApiModelProperty("预算金额(万元)") + private Double budgetAmount; + + @ApiModelProperty("预算说明") + private String budgetDesc; + } + + @Data + @ApiModel(value="DailyReportInfo对象", description="日报信息") + public static class DailyReportInfo { + @ApiModelProperty("日报ID") + private String reportId; + + @ApiModelProperty("日报日期") + private LocalDate reportDate; + + @ApiModelProperty("日报提交人") + private String submitUserName; + + @ApiModelProperty("创建时间") + private String createTime; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java new file mode 100644 index 0000000..f80c696 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java @@ -0,0 +1,107 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目看板数据响应VO + */ +@Data +@ApiModel(value="ProjectKanbanDataResp对象", description="项目看板数据响应") +public class ProjectKanbanDataResp { + + @ApiModelProperty("待施工项目列表") + private List pendingProjects; + + @ApiModelProperty("施工中项目列表") + private List inProgressProjects; + + @ApiModelProperty("已完工项目列表") + private List completedProjects; + + @ApiModelProperty("已审核项目列表") + private List auditedProjects; + + @ApiModelProperty("已验收项目列表") + private List acceptedProjects; + + @Data + @ApiModel(value="ProjectKanbanItem对象", description="项目看板项目项") + public static class ProjectKanbanItem { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("项目封面") + private String coverUrl; + + @ApiModelProperty("风场名称") + private String farmName; + + @ApiModelProperty("风场地址") + private String farmAddress; + + @ApiModelProperty("项目规模") + private String scale; + + @ApiModelProperty("总工期(天数)") + private Integer duration; + + @ApiModelProperty("风机型号") + private String turbineModel; + + @ApiModelProperty("项目状态") + private Integer status; + + @ApiModelProperty("项目状态描述") + private String statusLabel; + + @ApiModelProperty("开始时间") + private LocalDate startDate; + + @ApiModelProperty("结束时间") + private LocalDate endDate; + + @ApiModelProperty("项目经理") + private String projectManagerName; + + @ApiModelProperty("安全员") + private String safetyOfficerName; + + @ApiModelProperty("质量员") + private String qualityOfficerName; + + @ApiModelProperty("施工组长") + private String constructionTeamLeaderName; + + @ApiModelProperty("施工人员") + private String constructorNames; + + @ApiModelProperty("机组数量") + private Long turbineCount; + + @ApiModelProperty("任务数量") + private Long taskCount; + + @ApiModelProperty("已完成任务数量") + private Long completedTaskCount; + + @ApiModelProperty("项目进度百分比") + private Integer progressPercentage; + + @ApiModelProperty("创建时间") + private String createTime; + + @ApiModelProperty("更新时间") + private String updateTime; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanStatsResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanStatsResp.java new file mode 100644 index 0000000..fe2f6f0 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanStatsResp.java @@ -0,0 +1,81 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目看板统计数据响应VO + */ +@Data +@ApiModel(value="ProjectKanbanStatsResp对象", description="项目看板统计数据响应") +public class ProjectKanbanStatsResp { + + @ApiModelProperty("总项目数") + private Long totalProjectsCount; + + @ApiModelProperty("待施工项目数") + private Long pendingProjectCount; + + @ApiModelProperty("施工中项目数") + private Long inProgressProjectCount; + + @ApiModelProperty("已完工项目数") + private Long completedProjectCount; + + @ApiModelProperty("已审核项目数") + private Long auditedProjectCount; + + @ApiModelProperty("已验收项目数") + private Long acceptedProjectCount; + + @ApiModelProperty("总机组数") + private Long totalTurbineCount; + + @ApiModelProperty("待施工机组数") + private Long pendingTurbineCount; + + @ApiModelProperty("施工中机组数") + private Long inProgressTurbineCount; + + @ApiModelProperty("已完工机组数") + private Long completedTurbineCount; + + @ApiModelProperty("已审核机组数") + private Long auditedTurbineCount; + + @ApiModelProperty("已验收机组数") + private Long acceptedTurbineCount; + + @ApiModelProperty("总任务数") + private Long totalTaskCount; + + @ApiModelProperty("未开始任务数") + private Long pendingTaskCount; + + @ApiModelProperty("进行中任务数") + private Long inProgressTaskCount; + + @ApiModelProperty("已完成任务数") + private Long completedTaskCount; + + @ApiModelProperty("总人员数") + private Long totalMemberCount; + + @ApiModelProperty("项目经理数") + private Long projectManagerCount; + + @ApiModelProperty("安全员数") + private Long safetyOfficerCount; + + @ApiModelProperty("质量员数") + private Long qualityOfficerCount; + + @ApiModelProperty("施工人员数") + private Long constructorCount; + + @ApiModelProperty("施工组长数") + private Long teamLeaderCount; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java new file mode 100644 index 0000000..92eda45 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberListReq.java @@ -0,0 +1,45 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员查询请求VO + */ +@Data +@ApiModel(value="ProjectMemberListReq对象", description="项目人员查询请求") +public class ProjectMemberListReq { + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("机组ID") + private String turbineId; + + @ApiModelProperty("任务组ID") + private String taskGroupId; + + @ApiModelProperty("任务ID") + private String taskId; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("角色类型") + private String roleType; + + @ApiModelProperty("岗位代码") + private String jobCode; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("用户姓名(模糊查询)") + private String userName; + + @ApiModelProperty("用户账号(模糊查询)") + private String userAccount; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java new file mode 100644 index 0000000..d2ffb17 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberReq.java @@ -0,0 +1,62 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员请求VO + */ +@Data +@ApiModel(value="ProjectMemberReq对象", description="项目人员请求") +public class ProjectMemberReq { + + @ApiModelProperty("关联ID(更新时必填)") + private String memberId; + + @NotBlank(message = "项目ID不能为空") + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("机组ID(可选)") + private String turbineId; + + @ApiModelProperty("任务组ID(可选)") + private String taskGroupId; + + @ApiModelProperty("任务ID(可选)") + private String taskId; + + @NotBlank(message = "用户ID不能为空") + @ApiModelProperty("用户ID") + private String userId; + + @NotBlank(message = "角色类型不能为空") + @ApiModelProperty("角色类型") + private String roleType; + + @ApiModelProperty("岗位代码") + private String jobCode; + + @ApiModelProperty("岗位描述") + private String jobDesc; + + @NotNull(message = "加入时间不能为空") + @ApiModelProperty("加入时间") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + private LocalDate leaveDate; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java new file mode 100644 index 0000000..a633545 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectMemberResp.java @@ -0,0 +1,83 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员响应VO + */ +@Data +@ApiModel(value="ProjectMemberResp对象", description="项目人员响应") +public class ProjectMemberResp { + + @ApiModelProperty("关联ID") + private String memberId; + + @ApiModelProperty("项目ID") + private String projectId; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("机组ID") + private String turbineId; + + @ApiModelProperty("机组名称") + private String turbineName; + + @ApiModelProperty("任务组ID") + private String taskGroupId; + + @ApiModelProperty("任务组名称") + private String taskGroupName; + + @ApiModelProperty("任务ID") + private String taskId; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("用户姓名") + private String userName; + + @ApiModelProperty("用户账号") + private String userAccount; + + @ApiModelProperty("用户头像") + private String userAvatar; + + @ApiModelProperty("角色类型") + private String roleType; + + @ApiModelProperty("角色类型描述") + private String roleTypeDesc; + + @ApiModelProperty("岗位代码") + private String jobCode; + + @ApiModelProperty("岗位代码描述") + private String jobCodeDesc; + + @ApiModelProperty("岗位描述") + private String jobDesc; + + @ApiModelProperty("加入时间") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + private LocalDate leaveDate; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectJobCodeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectJobCodeEnum.java new file mode 100644 index 0000000..fd50316 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectJobCodeEnum.java @@ -0,0 +1,72 @@ +package com.dite.znpt.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目岗位代码枚举 + */ +@Getter +@AllArgsConstructor +public enum ProjectJobCodeEnum { + + // 地勤相关岗位 + GROUND_SERVICE("GROUND_SERVICE", "地勤"), + GROUND_SERVICE_LEADER("GROUND_SERVICE_LEADER", "地勤组长"), + + // 司机相关岗位 + DRIVER("DRIVER", "司机"), + DRIVER_LEADER("DRIVER_LEADER", "司机组长"), + + // 登高相关岗位 + ASCENDING("ASCENDING", "登高"), + ASCENDING_LEADER("ASCENDING_LEADER", "登高组长"), + + // 防雷相关岗位 + ANTI_THUNDER("ANTI_THUNDER", "防雷"), + ANTI_THUNDER_LEADER("ANTI_THUNDER_LEADER", "防雷组长"), + + // 外部工作相关岗位 + OUT_WORK("OUT_WORK", "外部工作"), + OUT_WORK_LEADER("OUT_WORK_LEADER", "外部工作组长"), + + // 管理岗位 + PROJECT_MANAGER("PROJECT_MANAGER", "项目经理"), + SAFETY_MANAGER("SAFETY_MANAGER", "安全经理"), + QUALITY_MANAGER("QUALITY_MANAGER", "质量经理"), + SITE_MANAGER("SITE_MANAGER", "现场经理"), + + // 其他岗位 + TECHNICIAN("TECHNICIAN", "技术员"), + SUPERVISOR("SUPERVISOR", "监理"), + COORDINATOR("COORDINATOR", "协调员"); + + private final String code; + private final String desc; + + /** + * 根据代码获取描述 + */ + public static String getDescByCode(String code) { + for (ProjectJobCodeEnum jobCode : values()) { + if (jobCode.getCode().equals(code)) { + return jobCode.getDesc(); + } + } + return ""; + } + + /** + * 根据代码获取枚举 + */ + public static ProjectJobCodeEnum getByCode(String code) { + for (ProjectJobCodeEnum jobCode : values()) { + if (jobCode.getCode().equals(code)) { + return jobCode; + } + } + return null; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/enums/ProjectRoleTypeEnum.java b/core/src/main/java/com/dite/znpt/enums/ProjectRoleTypeEnum.java new file mode 100644 index 0000000..a750a4c --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/ProjectRoleTypeEnum.java @@ -0,0 +1,53 @@ +package com.dite.znpt.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目角色类型枚举 + */ +@Getter +@AllArgsConstructor +public enum ProjectRoleTypeEnum { + + PROJECT_MANAGER("PROJECT_MANAGER", "项目经理"), + SAFETY_OFFICER("SAFETY_OFFICER", "安全员"), + QUALITY_OFFICER("QUALITY_OFFICER", "质量员"), + CONSTRUCTOR("CONSTRUCTOR", "施工人员"), + TEAM_LEADER("TEAM_LEADER", "施工组长"), + SENIOR_PROJECT_MANAGER("SENIOR_PROJECT_MANAGER", "大项目经理"), + REMOTE_ADVISOR("REMOTE_ADVISOR", "项目远程顾问"), + EXTERNAL_COLLABORATOR("EXTERNAL_COLLABORATOR", "外部协作者"), + FINANCIAL_MANAGER("FINANCIAL_MANAGER", "财务经理"), + BUSINESS_MANAGER("BUSINESS_MANAGER", "商务经理"), + SITE_MANAGER("SITE_MANAGER", "现场经理"); + + private final String code; + private final String desc; + + /** + * 根据代码获取描述 + */ + public static String getDescByCode(String code) { + for (ProjectRoleTypeEnum roleType : values()) { + if (roleType.getCode().equals(code)) { + return roleType.getDesc(); + } + } + return ""; + } + + /** + * 根据代码获取枚举 + */ + public static ProjectRoleTypeEnum getByCode(String code) { + for (ProjectRoleTypeEnum roleType : values()) { + if (roleType.getCode().equals(code)) { + return roleType; + } + } + return null; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java new file mode 100644 index 0000000..d514e90 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectMemberMapper.java @@ -0,0 +1,54 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectMemberEntity; +import com.dite.znpt.domain.vo.ProjectMemberListReq; +import com.dite.znpt.domain.vo.ProjectMemberResp; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员关联表Mapper接口 + */ +@Mapper +public interface ProjectMemberMapper extends BaseMapper { + + /** + * 根据条件查询项目人员列表 + */ + List queryBySelective(ProjectMemberListReq req); + + /** + * 根据项目ID查询项目人员列表 + */ + List queryByProjectId(@Param("projectId") String projectId); + + /** + * 根据机组ID查询机组人员列表 + */ + List queryByTurbineId(@Param("turbineId") String turbineId); + + /** + * 根据任务组ID查询任务组人员列表 + */ + List queryByTaskGroupId(@Param("taskGroupId") String taskGroupId); + + /** + * 根据任务ID查询任务人员列表 + */ + List queryByTaskId(@Param("taskId") String taskId); + + /** + * 根据用户ID查询用户参与的项目列表 + */ + List queryByUserId(@Param("userId") String userId); + + /** + * 根据项目ID和角色类型查询人员列表 + */ + List queryByProjectIdAndRoleType(@Param("projectId") String projectId, @Param("roleType") String roleType); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java new file mode 100644 index 0000000..9004093 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectMemberService.java @@ -0,0 +1,107 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectMemberEntity; +import com.dite.znpt.domain.vo.*; + +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员关联表服务接口 + */ +public interface ProjectMemberService extends IService { + + /** + * 查询项目人员列表 + */ + List selectList(ProjectMemberListReq req); + + /** + * 根据项目ID查询项目人员列表 + */ + List selectByProjectId(String projectId); + + /** + * 根据机组ID查询机组人员列表 + */ + List selectByTurbineId(String turbineId); + + /** + * 根据任务组ID查询任务组人员列表 + */ + List selectByTaskGroupId(String taskGroupId); + + /** + * 根据任务ID查询任务人员列表 + */ + List selectByTaskId(String taskId); + + /** + * 根据用户ID查询用户参与的项目列表 + */ + List selectByUserId(String userId); + + /** + * 根据项目ID和角色类型查询人员列表 + */ + List selectByProjectIdAndRoleType(String projectId, String roleType); + + /** + * 新增项目人员 + */ + void saveData(ProjectMemberReq req); + + /** + * 更新项目人员 + */ + void updateData(ProjectMemberReq req); + + /** + * 删除项目人员 + */ + void deleteById(String memberId); + + /** + * 批量添加项目人员 + */ + void batchAddMembers(List reqList); + + /** + * 根据项目ID删除所有项目人员 + */ + void deleteByProjectId(String projectId); + + /** + * 根据机组ID删除所有机组人员 + */ + void deleteByTurbineId(String turbineId); + + /** + * 根据任务组ID删除所有任务组人员 + */ + void deleteByTaskGroupId(String taskGroupId); + + /** + * 根据任务ID删除所有任务人员 + */ + void deleteByTaskId(String taskId); + + // ========================== 项目看板相关方法 ========================== + + /** + * 获取项目看板统计数据 + */ + ProjectKanbanStatsResp getProjectKanbanStats(); + + /** + * 获取项目看板数据 + */ + ProjectKanbanDataResp getProjectKanbanData(); + + /** + * 获取项目详情 + */ + ProjectDetailResp getProjectDetail(String projectId); +} \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java new file mode 100644 index 0000000..08f8ab8 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -0,0 +1,431 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dite.znpt.constant.Message; +import com.dite.znpt.domain.entity.ProjectMemberEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.entity.TurbineEntity; +import com.dite.znpt.domain.entity.ProjectTaskEntity; +import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import com.dite.znpt.domain.vo.ProjectMemberListReq; +import com.dite.znpt.domain.vo.ProjectMemberReq; +import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; +import com.dite.znpt.domain.vo.ProjectKanbanDataResp; +import com.dite.znpt.domain.vo.ProjectDetailResp; +import com.dite.znpt.enums.ProjectJobCodeEnum; +import com.dite.znpt.enums.ProjectRoleTypeEnum; +import com.dite.znpt.enums.ProjectStatusEnum; +import com.dite.znpt.enums.ProjectTaskStateEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.ProjectMemberMapper; +import com.dite.znpt.service.ProjectMemberService; +import com.dite.znpt.service.UserService; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.TurbineService; +import com.dite.znpt.service.ProjectTaskService; +import com.dite.znpt.service.ProjectBudgetInfoService; +import com.dite.znpt.service.ProjectDailyReportService; +import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员关联表服务实现类 + */ +@Service +@RequiredArgsConstructor +public class ProjectMemberServiceImpl extends ServiceImpl implements ProjectMemberService { + + private final UserService userService; + + // 添加其他服务依赖 + private final ProjectService projectService; + private final TurbineService turbineService; + private final ProjectTaskService projectTaskService; + private final ProjectBudgetInfoService projectBudgetInfoService; + private final ProjectDailyReportService projectDailyReportService; + + @Override + public List selectList(ProjectMemberListReq req) { + PageUtil.startPage(); + List list = this.baseMapper.queryBySelective(req); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByProjectId(String projectId) { + List list = this.baseMapper.queryByProjectId(projectId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByTurbineId(String turbineId) { + List list = this.baseMapper.queryByTurbineId(turbineId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByTaskGroupId(String taskGroupId) { + List list = this.baseMapper.queryByTaskGroupId(taskGroupId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByTaskId(String taskId) { + List list = this.baseMapper.queryByTaskId(taskId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByUserId(String userId) { + List list = this.baseMapper.queryByUserId(userId); + enrichMemberInfo(list); + return list; + } + + @Override + public List selectByProjectIdAndRoleType(String projectId, String roleType) { + List list = this.baseMapper.queryByProjectIdAndRoleType(projectId, roleType); + enrichMemberInfo(list); + return list; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveData(ProjectMemberReq req) { + // 验证用户是否存在 + UserEntity user = userService.getById(req.getUserId()); + if (user == null) { + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + + // 检查是否已存在相同的关联 + boolean exists = lambdaQuery() + .eq(ProjectMemberEntity::getProjectId, req.getProjectId()) + .eq(ProjectMemberEntity::getUserId, req.getUserId()) + .eq(StrUtil.isNotEmpty(req.getTurbineId()), ProjectMemberEntity::getTurbineId, req.getTurbineId()) + .eq(StrUtil.isNotEmpty(req.getTaskGroupId()), ProjectMemberEntity::getTaskGroupId, req.getTaskGroupId()) + .eq(StrUtil.isNotEmpty(req.getTaskId()), ProjectMemberEntity::getTaskId, req.getTaskId()) + .eq(ProjectMemberEntity::getRoleType, req.getRoleType()) + .exists(); + + if (exists) { + throw new ServiceException("该用户在此项目中已存在相同角色"); + } + + ProjectMemberEntity entity = BeanUtil.copyProperties(req, ProjectMemberEntity.class); + if (StrUtil.isEmpty(entity.getStatus())) { + entity.setStatus("ACTIVE"); + } + save(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateData(ProjectMemberReq req) { + if (StrUtil.isEmpty(req.getMemberId())) { + throw new ServiceException("关联ID不能为空"); + } + + ProjectMemberEntity entity = getById(req.getMemberId()); + if (entity == null) { + throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); + } + + BeanUtil.copyProperties(req, entity); + updateById(entity); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteById(String memberId) { + removeById(memberId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchAddMembers(List reqList) { + if (CollUtil.isEmpty(reqList)) { + return; + } + + for (ProjectMemberReq req : reqList) { + saveData(req); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByProjectId(String projectId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getProjectId, projectId) + .remove(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTurbineId(String turbineId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getTurbineId, turbineId) + .remove(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskGroupId(String taskGroupId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getTaskGroupId, taskGroupId) + .remove(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskId(String taskId) { + lambdaUpdate() + .eq(ProjectMemberEntity::getTaskId, taskId) + .remove(); + } + + /** + * 丰富成员信息(用户信息、角色描述、岗位描述) + */ + private void enrichMemberInfo(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + + // 获取所有用户ID + List userIds = list.stream() + .map(ProjectMemberResp::getUserId) + .distinct() + .collect(Collectors.toList()); + + // 查询用户信息 + Map userMap = userService.listByIds(userIds) + .stream() + .collect(Collectors.toMap(UserEntity::getUserId, Function.identity())); + + // 填充用户信息和描述 + list.forEach(member -> { + // 填充用户信息 + UserEntity user = userMap.get(member.getUserId()); + if (user != null) { + member.setUserName(user.getName()); + member.setUserAccount(user.getAccount()); + member.setUserAvatar(user.getAvatar()); + } + + // 填充角色类型描述 + member.setRoleTypeDesc(ProjectRoleTypeEnum.getDescByCode(member.getRoleType())); + + // 填充岗位代码描述 + if (StrUtil.isNotEmpty(member.getJobCode())) { + member.setJobCodeDesc(ProjectJobCodeEnum.getDescByCode(member.getJobCode())); + } + }); + } + + // ========================== 项目看板相关方法实现 ========================== + + @Override + public ProjectKanbanStatsResp getProjectKanbanStats() { + ProjectKanbanStatsResp resp = new ProjectKanbanStatsResp(); + + // 统计项目数量 + resp.setTotalProjectsCount(projectService.count()); + resp.setPendingProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 0).count()); + resp.setInProgressProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 1).count()); + resp.setCompletedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 2).count()); + resp.setAuditedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 3).count()); + resp.setAcceptedProjectCount(projectService.lambdaQuery().eq(ProjectEntity::getStatus, 4).count()); + + // 统计机组数量 + resp.setTotalTurbineCount(turbineService.count()); + resp.setPendingTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 0).count()); + resp.setInProgressTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 1).count()); + resp.setCompletedTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 2).count()); + resp.setAuditedTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 3).count()); + resp.setAcceptedTurbineCount(turbineService.lambdaQuery().eq(TurbineEntity::getStatus, 4).count()); + + // 统计任务数量 + resp.setTotalTaskCount(projectTaskService.count()); + resp.setPendingTaskCount(projectTaskService.lambdaQuery().eq(ProjectTaskEntity::getStatus, 0).count()); + resp.setInProgressTaskCount(projectTaskService.lambdaQuery().eq(ProjectTaskEntity::getStatus, 1).count()); + resp.setCompletedTaskCount(projectTaskService.lambdaQuery().eq(ProjectTaskEntity::getStatus, 2).count()); + + // 统计人员数量 + resp.setTotalMemberCount(this.count()); + resp.setProjectManagerCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "PROJECT_MANAGER").count()); + resp.setSafetyOfficerCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "SAFETY_OFFICER").count()); + resp.setQualityOfficerCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "QUALITY_OFFICER").count()); + resp.setConstructorCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "CONSTRUCTOR").count()); + resp.setTeamLeaderCount(this.lambdaQuery().eq(ProjectMemberEntity::getRoleType, "TEAM_LEADER").count()); + + return resp; + } + + @Override + public ProjectKanbanDataResp getProjectKanbanData() { + ProjectKanbanDataResp resp = new ProjectKanbanDataResp(); + + // 获取各状态的项目列表 + resp.setPendingProjects(getProjectKanbanItems(0)); + resp.setInProgressProjects(getProjectKanbanItems(1)); + resp.setCompletedProjects(getProjectKanbanItems(2)); + resp.setAuditedProjects(getProjectKanbanItems(3)); + resp.setAcceptedProjects(getProjectKanbanItems(4)); + + return resp; + } + + @Override + public ProjectDetailResp getProjectDetail(String projectId) { + // 获取项目基本信息 + ProjectEntity project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException(Message.PROJECT_ID_IS_NOT_EXIST); + } + + ProjectDetailResp resp = new ProjectDetailResp(); + BeanUtil.copyProperties(project, resp); + resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus())); + + // 获取项目人员信息 + resp.setProjectMembers(selectByProjectId(projectId)); + + // 获取项目机组信息 + List turbines = turbineService.lambdaQuery() + .eq(TurbineEntity::getProjectId, projectId) + .list(); + resp.setTurbines(turbines.stream().map(turbine -> { + ProjectDetailResp.TurbineInfo info = new ProjectDetailResp.TurbineInfo(); + BeanUtil.copyProperties(turbine, info); + info.setStatusLabel(ProjectStatusEnum.getDescByCode(info.getStatus())); + return info; + }).collect(Collectors.toList())); + + // 获取项目任务信息 + List tasks = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, projectId) + .list(); + resp.setTasks(tasks.stream().map(task -> { + ProjectDetailResp.TaskInfo info = new ProjectDetailResp.TaskInfo(); + BeanUtil.copyProperties(task, info); + info.setStatusLabel(ProjectTaskStateEnum.getDescByCode(info.getStatus())); + return info; + }).collect(Collectors.toList())); + + // 获取项目预算信息 + List budgets = projectBudgetInfoService.lambdaQuery() + .eq(ProjectBudgetInfoEntity::getProjectId, projectId) + .list(); + resp.setBudgets(budgets.stream().map(budget -> { + ProjectDetailResp.BudgetInfo info = new ProjectDetailResp.BudgetInfo(); + BeanUtil.copyProperties(budget, info); + return info; + }).collect(Collectors.toList())); + + // 获取项目日报信息 + List dailyReports = projectDailyReportService.lambdaQuery() + .eq(ProjectDailyReportEntity::getProjectId, projectId) + .orderByDesc(ProjectDailyReportEntity::getReportDate) + .last("LIMIT 10") + .list(); + resp.setDailyReports(dailyReports.stream().map(report -> { + ProjectDetailResp.DailyReportInfo info = new ProjectDetailResp.DailyReportInfo(); + BeanUtil.copyProperties(report, info); + // 获取提交人姓名 + UserEntity user = userService.getById(report.getSubmitUser()); + info.setSubmitUserName(user != null ? user.getName() : ""); + return info; + }).collect(Collectors.toList())); + + return resp; + } + + /** + * 获取项目看板项目项列表 + */ + private List getProjectKanbanItems(Integer status) { + List projects = projectService.lambdaQuery() + .eq(ProjectEntity::getStatus, status) + .orderByDesc(ProjectEntity::getCreateTime) + .list(); + + return projects.stream().map(project -> { + ProjectKanbanDataResp.ProjectKanbanItem item = new ProjectKanbanDataResp.ProjectKanbanItem(); + BeanUtil.copyProperties(project, item); + item.setStatusLabel(ProjectStatusEnum.getDescByCode(item.getStatus())); + + // 获取项目人员信息 + List members = selectByProjectId(project.getProjectId()); + + // 按角色类型分组,并去重用户名 + Map memberNames = members.stream() + .collect(Collectors.groupingBy( + ProjectMemberResp::getRoleType, + Collectors.mapping( + ProjectMemberResp::getUserName, + Collectors.collectingAndThen( + Collectors.toSet(), // 使用Set去重 + set -> String.join(",", set) + ) + ) + )); + + item.setProjectManagerName(memberNames.get("PROJECT_MANAGER")); + item.setSafetyOfficerName(memberNames.get("SAFETY_OFFICER")); + item.setQualityOfficerName(memberNames.get("QUALITY_OFFICER")); + item.setConstructionTeamLeaderName(memberNames.get("TEAM_LEADER")); + item.setConstructorNames(memberNames.get("CONSTRUCTOR")); + + // 统计机组数量 + Long turbineCount = turbineService.lambdaQuery() + .eq(TurbineEntity::getProjectId, project.getProjectId()) + .count(); + item.setTurbineCount(turbineCount); + + // 统计任务数量 + Long taskCount = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, project.getProjectId()) + .count(); + item.setTaskCount(taskCount); + + // 统计已完成任务数量 + Long completedTaskCount = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, project.getProjectId()) + .eq(ProjectTaskEntity::getStatus, 2) + .count(); + item.setCompletedTaskCount(completedTaskCount); + + // 计算项目进度百分比 + if (taskCount > 0) { + item.setProgressPercentage((int) (completedTaskCount * 100 / taskCount)); + } else { + item.setProgressPercentage(0); + } + + return item; + }).collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/core/src/main/resources/mapper/ProjectMemberMapper.xml b/core/src/main/resources/mapper/ProjectMemberMapper.xml new file mode 100644 index 0000000..f8925d6 --- /dev/null +++ b/core/src/main/resources/mapper/ProjectMemberMapper.xml @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/project_member_extended_data.sql b/doc/project_member_extended_data.sql new file mode 100644 index 0000000..e11968c --- /dev/null +++ b/doc/project_member_extended_data.sql @@ -0,0 +1,107 @@ +-- ============================================= +-- 项目人员表扩展测试数据 +-- 使用多个真实用户ID和项目ID,使用UUID()生成member_id +-- @author AI Assistant +-- @date 2025/01/27 +-- ============================================= + +-- 清空现有数据(可选) +-- DELETE FROM project_member WHERE project_id IN ('0b71a1259c49918c6595c9720ad1db5d', '7f321271c13483aa31cb743d604603a5', '8e0da59bd0c640b5b65dccd72606ea39', '96e0debf78187300f144d7f3450a2477', 'bbd28ed8627d6bd9fd8fa7476af6242a', 'd446d998d7c40005bf9af53ac264ef6e', 'd6c5b8408a42a8390297751756ecff23', 'eb64015cf2d0b40574c1d6f476876822', 'fb7e3b731ee496cec46ca1db64117676'); + +-- 插入项目人员测试数据 +INSERT INTO project_member ( + member_id, + project_id, + user_id, + role_type, + job_code, + job_desc, + join_date, + status, + remark +) VALUES +-- 项目1: 0b71a1259c49918c6595c9720ad1db5d +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0ab4a72af4184a1614d4c25a5bb65ece', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-15', 'ACTIVE', '项目总负责人'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0bc98a66761915e31fbf86e468d6ba20', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-15', 'ACTIVE', '负责项目安全管理'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '149c94f937a7d36cda70a81f343d090a', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-15', 'ACTIVE', '负责项目质量管理'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '15129b4764ced7900ef5d51c20cefa35', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-15', 'ACTIVE', '负责现场施工管理'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1632433c2073532a074b0079cca5eb18', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-15', 'ACTIVE', '负责地面施工工作'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1995a0da943d188506548bd42a2ee39d', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-15', 'ACTIVE', '负责设备运输和人员接送'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1b2641edb4c9a8f14658edaa8e6a36e3', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-15', 'ACTIVE', '负责高空作业'), +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '1d476bc4de6d71f6a43497d943adec9c', 'CONSTRUCTOR', 'ANTI_THUNDER', '防雷人员', '2025-01-15', 'ACTIVE', '负责防雷设施安装'), + +-- 项目2: 7f321271c13483aa31cb743d604603a5 +(UUID(), '7f321271c13483aa31cb743d604603a5', '1dae46a6ecbc2408c8b137187fc13d06', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-16', 'ACTIVE', '项目总负责人'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '1f319a6f25b65ebd50711707e5e08d1a', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-16', 'ACTIVE', '负责项目安全管理'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '22ff9d065f3ad826f5e22ba18a20248c', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-16', 'ACTIVE', '负责项目质量管理'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '2fd0581e10f4c4f70e5148de3d61bc06', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-16', 'ACTIVE', '负责现场施工管理'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '3042cb085eb41721faa8f4d985921424', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-16', 'ACTIVE', '负责地面施工工作'), +(UUID(), '7f321271c13483aa31cb743d604603a5', '3169163eb58fff961955179fbdc22507', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-16', 'ACTIVE', '负责设备运输和人员接送'), + +-- 项目3: 8e0da59bd0c640b5b65dccd72606ea39 +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '324afaf4e89213b6f5fcf1fa57663940', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-17', 'ACTIVE', '项目总负责人'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '375f87a103e5bcad6e6a402177044891', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-17', 'ACTIVE', '负责项目安全管理'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '3b5f2db9bac776be536d893f726deeba', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-17', 'ACTIVE', '负责项目质量管理'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '44d335410542c5fd4989780dd11dca66', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-17', 'ACTIVE', '负责现场施工管理'), +(UUID(), '8e0da59bd0c640b5b65dccd72606ea39', '4e171ce81c18183bc8f06da8bd47a3d8', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-17', 'ACTIVE', '负责地面施工工作'), + +-- 项目4: 96e0debf78187300f144d7f3450a2477 +(UUID(), '96e0debf78187300f144d7f3450a2477', '0ab4a72af4184a1614d4c25a5bb65ece', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-18', 'ACTIVE', '项目总负责人'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '0bc98a66761915e31fbf86e468d6ba20', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-18', 'ACTIVE', '负责项目安全管理'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '149c94f937a7d36cda70a81f343d090a', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-18', 'ACTIVE', '负责项目质量管理'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '15129b4764ced7900ef5d51c20cefa35', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-18', 'ACTIVE', '负责高空作业'), +(UUID(), '96e0debf78187300f144d7f3450a2477', '1632433c2073532a074b0079cca5eb18', 'CONSTRUCTOR', 'ANTI_THUNDER', '防雷人员', '2025-01-18', 'ACTIVE', '负责防雷设施安装'), + +-- 项目5: bbd28ed8627d6bd9fd8fa7476af6242a +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1995a0da943d188506548bd42a2ee39d', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-19', 'ACTIVE', '项目总负责人'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1b2641edb4c9a8f14658edaa8e6a36e3', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-19', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1d476bc4de6d71f6a43497d943adec9c', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-19', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1dae46a6ecbc2408c8b137187fc13d06', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-19', 'ACTIVE', '负责现场施工管理'), +(UUID(), 'bbd28ed8627d6bd9fd8fa7476af6242a', '1f319a6f25b65ebd50711707e5e08d1a', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-19', 'ACTIVE', '负责地面施工工作'), + +-- 项目6: d446d998d7c40005bf9af53ac264ef6e +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '22ff9d065f3ad826f5e22ba18a20248c', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-20', 'ACTIVE', '项目总负责人'), +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '2fd0581e10f4c4f70e5148de3d61bc06', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-20', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '3042cb085eb41721faa8f4d985921424', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-20', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'd446d998d7c40005bf9af53ac264ef6e', '3169163eb58fff961955179fbdc22507', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-20', 'ACTIVE', '负责设备运输和人员接送'), + +-- 项目7: d6c5b8408a42a8390297751756ecff23 +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '324afaf4e89213b6f5fcf1fa57663940', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-21', 'ACTIVE', '项目总负责人'), +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '375f87a103e5bcad6e6a402177044891', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-21', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '3b5f2db9bac776be536d893f726deeba', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-21', 'ACTIVE', '负责高空作业'), +(UUID(), 'd6c5b8408a42a8390297751756ecff23', '44d335410542c5fd4989780dd11dca66', 'CONSTRUCTOR', 'ANTI_THUNDER', '防雷人员', '2025-01-21', 'ACTIVE', '负责防雷设施安装'), + +-- 项目8: eb64015cf2d0b40574c1d6f476876822 +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '4e171ce81c18183bc8f06da8bd47a3d8', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-22', 'ACTIVE', '项目总负责人'), +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '0ab4a72af4184a1614d4c25a5bb65ece', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-22', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '0bc98a66761915e31fbf86e468d6ba20', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-22', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'eb64015cf2d0b40574c1d6f476876822', '149c94f937a7d36cda70a81f343d090a', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-22', 'ACTIVE', '负责现场施工管理'), + +-- 项目9: fb7e3b731ee496cec46ca1db64117676 +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '15129b4764ced7900ef5d51c20cefa35', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-23', 'ACTIVE', '项目总负责人'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1632433c2073532a074b0079cca5eb18', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-23', 'ACTIVE', '负责项目安全管理'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1995a0da943d188506548bd42a2ee39d', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-23', 'ACTIVE', '负责项目质量管理'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1b2641edb4c9a8f14658edaa8e6a36e3', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-23', 'ACTIVE', '负责地面施工工作'), +(UUID(), 'fb7e3b731ee496cec46ca1db64117676', '1d476bc4de6d71f6a43497d943adec9c', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-23', 'ACTIVE', '负责设备运输和人员接送'); + +-- ============================================= +-- 查询示例 +-- ============================================= + +-- 查询所有项目的在职人员 +-- SELECT * FROM project_member WHERE status = 'ACTIVE'; + +-- 查询特定项目的所有人员 +-- SELECT * FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND status = 'ACTIVE'; + +-- 查询所有项目经理 +-- SELECT * FROM project_member WHERE role_type = 'PROJECT_MANAGER' AND status = 'ACTIVE'; + +-- 按项目统计人员数量 +-- SELECT project_id, COUNT(*) as member_count FROM project_member WHERE status = 'ACTIVE' GROUP BY project_id; + +-- 按角色类型统计人员数量 +-- SELECT role_type, COUNT(*) as count FROM project_member WHERE status = 'ACTIVE' GROUP BY role_type; + +-- 查询特定用户参与的所有项目 +-- SELECT DISTINCT project_id FROM project_member WHERE user_id = '0ab4a72af4184a1614d4c25a5bb65ece' AND status = 'ACTIVE'; \ No newline at end of file diff --git a/doc/project_member_tables.sql b/doc/project_member_tables.sql new file mode 100644 index 0000000..b30097e --- /dev/null +++ b/doc/project_member_tables.sql @@ -0,0 +1,137 @@ +-- ============================================= +-- 项目人员关联表 +-- 用于管理项目、机组、任务组、任务的人员关系 +-- @author wangna +-- @date 2025/08/05 +-- ============================================= + +-- 项目人员关联表 +CREATE TABLE `project_member` ( + `member_id` varchar(64) NOT NULL COMMENT '关联ID', + `project_id` varchar(64) NOT NULL COMMENT '项目ID', + `turbine_id` varchar(64) DEFAULT NULL COMMENT '机组ID(可选,关联到具体机组)', + `task_group_id` varchar(64) DEFAULT NULL COMMENT '任务组ID(可选,关联到具体任务组)', + `task_id` varchar(64) DEFAULT NULL COMMENT '任务ID(可选,关联到具体任务)', + `user_id` varchar(64) NOT NULL COMMENT '用户ID', + `role_type` varchar(50) NOT NULL COMMENT '项目角色类型', + `job_code` varchar(50) DEFAULT NULL COMMENT '具体岗位代码', + `job_desc` varchar(500) DEFAULT NULL COMMENT '岗位描述', + `join_date` date NOT NULL COMMENT '加入时间', + `leave_date` date DEFAULT NULL COMMENT '离开时间', + `status` varchar(20) DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE-在职,INACTIVE-离职,SUSPENDED-暂停', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`member_id`), + KEY `idx_project_id` (`project_id`), + KEY `idx_turbine_id` (`turbine_id`), + KEY `idx_task_group_id` (`task_group_id`), + KEY `idx_task_id` (`task_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_role_type` (`role_type`), + KEY `idx_status` (`status`), + UNIQUE KEY `uk_project_user_role` (`project_id`, `user_id`, `role_type`, `turbine_id`, `task_group_id`, `task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目人员关联表'; + +-- 添加复合索引以提高查询性能 +CREATE INDEX `idx_project_member_composite` ON `project_member` (`project_id`, `status`, `role_type`); +CREATE INDEX `idx_project_member_user_status` ON `project_member` (`user_id`, `status`); +CREATE INDEX `idx_project_member_turbine_status` ON `project_member` (`turbine_id`, `status`); +CREATE INDEX `idx_project_member_task_status` ON `project_member` (`task_id`, `status`); + +-- ============================================= +-- 数据迁移脚本(可选) +-- 将现有项目的人员数据迁移到新表 +-- ============================================= + +-- 迁移项目经理数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + project_manager_id as user_id, + 'PROJECT_MANAGER' as role_type, + 'PROJECT_MANAGER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE project_manager_id IS NOT NULL AND project_manager_id != ''; + +-- 迁移安全员数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + auditor_id as user_id, + 'SAFETY_OFFICER' as role_type, + 'SAFETY_MANAGER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE auditor_id IS NOT NULL AND auditor_id != ''; + +-- 迁移质量员数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + quality_officer_id as user_id, + 'QUALITY_OFFICER' as role_type, + 'QUALITY_MANAGER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE quality_officer_id IS NOT NULL AND quality_officer_id != ''; + +-- 迁移施工组长数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, join_date, status, create_time) +SELECT + UUID() as member_id, + project_id, + construct_team_leader_id as user_id, + 'TEAM_LEADER' as role_type, + 'TEAM_LEADER' as job_code, + create_time as join_date, + 'ACTIVE' as status, + create_time +FROM project +WHERE construct_team_leader_id IS NOT NULL AND construct_team_leader_id != ''; + +-- 迁移施工人员数据(需要处理逗号分隔的多个ID) +-- 注意:这个脚本需要根据实际情况调整,因为constructor_ids是逗号分隔的字符串 +-- 建议在应用层处理这个迁移逻辑 + +-- ============================================= +-- 示例数据插入 +-- ============================================= + +-- 插入示例项目人员数据 +INSERT INTO project_member (member_id, project_id, user_id, role_type, job_code, job_desc, join_date, status, remark) VALUES +('pm001', 'project001', 'user001', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-01', 'ACTIVE', '项目负责人'), +('pm002', 'project001', 'user002', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-01', 'ACTIVE', '负责项目安全'), +('pm003', 'project001', 'user003', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-01', 'ACTIVE', '负责项目质量'), +('pm004', 'project001', 'user004', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-01', 'ACTIVE', '地勤工作'), +('pm005', 'project001', 'user005', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-01', 'ACTIVE', '负责运输'), +('pm006', 'project001', 'user006', 'CONSTRUCTOR', 'ASCENDING', '登高人员', '2025-01-01', 'ACTIVE', '高空作业'); + +-- ============================================= +-- 查询示例 +-- ============================================= + +-- 查询项目所有人员 +-- SELECT * FROM project_member WHERE project_id = 'project001' AND status = 'ACTIVE'; + +-- 查询项目的项目经理 +-- SELECT * FROM project_member WHERE project_id = 'project001' AND role_type = 'PROJECT_MANAGER' AND status = 'ACTIVE'; + +-- 查询用户参与的所有项目 +-- SELECT DISTINCT project_id FROM project_member WHERE user_id = 'user001' AND status = 'ACTIVE'; + +-- 查询机组人员 +-- SELECT * FROM project_member WHERE turbine_id = 'turbine001' AND status = 'ACTIVE'; +CREATE INDEX `idx_project_member_task_status` ON `project_member` (`task_id`, `status`); \ No newline at end of file diff --git a/doc/project_member_test_data.sql b/doc/project_member_test_data.sql new file mode 100644 index 0000000..92fa0fb --- /dev/null +++ b/doc/project_member_test_data.sql @@ -0,0 +1,53 @@ +-- ============================================= +-- 项目人员表测试数据 +-- 基于项目ID: 0b71a1259c49918c6595c9720ad1db5d +-- 使用真实用户ID,使用UUID()生成member_id +-- @author AI Assistant +-- @date 2025/01/27 +-- ============================================= + +-- 清空现有数据(可选) +-- DELETE FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d'; + +-- 插入项目人员测试数据 +INSERT INTO project_member ( + member_id, + project_id, + user_id, + role_type, + job_code, + job_desc, + join_date, + status, + remark +) VALUES +-- 项目经理 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '008ecfac153be83890c42f9fed0a48cd', 'PROJECT_MANAGER', 'PROJECT_MANAGER', '项目经理', '2025-01-15', 'ACTIVE', '项目总负责人'), + +-- 安全员 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '014d6fd83182ac03d05967e16748ab80', 'SAFETY_OFFICER', 'SAFETY_MANAGER', '安全经理', '2025-01-15', 'ACTIVE', '负责项目安全管理'), + +-- 质量员 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0465342288d0637398b64ca73da76090', 'QUALITY_OFFICER', 'QUALITY_MANAGER', '质量经理', '2025-01-15', 'ACTIVE', '负责项目质量管理'), + +-- 施工组长 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '008ecfac153be83890c42f9fed0a48cd', 'TEAM_LEADER', 'SITE_MANAGER', '现场经理', '2025-01-15', 'ACTIVE', '负责现场施工管理'), + +-- 地勤人员 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '014d6fd83182ac03d05967e16748ab80', 'CONSTRUCTOR', 'GROUND_SERVICE', '地勤人员', '2025-01-15', 'ACTIVE', '负责地面施工工作'), + +-- 司机 +(UUID(), '0b71a1259c49918c6595c9720ad1db5d', '0465342288d0637398b64ca73da76090', 'CONSTRUCTOR', 'DRIVER', '司机', '2025-01-15', 'ACTIVE', '负责设备运输和人员接送'); + +-- ============================================= +-- 查询示例 +-- ============================================= + +-- 查询项目所有在职人员 +-- SELECT * FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND status = 'ACTIVE'; + +-- 查询项目的项目经理 +-- SELECT * FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND role_type = 'PROJECT_MANAGER' AND status = 'ACTIVE'; + +-- 按角色类型统计人员数量 +-- SELECT role_type, COUNT(*) as count FROM project_member WHERE project_id = '0b71a1259c49918c6595c9720ad1db5d' AND status = 'ACTIVE' GROUP BY role_type; \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java new file mode 100644 index 0000000..85d786a --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectMemberController.java @@ -0,0 +1,153 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ProjectMemberListReq; +import com.dite.znpt.domain.vo.ProjectMemberReq; +import com.dite.znpt.domain.vo.ProjectMemberResp; +import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; +import com.dite.znpt.domain.vo.ProjectKanbanDataResp; +import com.dite.znpt.domain.vo.ProjectDetailResp; +import com.dite.znpt.service.ProjectMemberService; +import com.dite.znpt.util.PageUtil; +import com.dite.znpt.util.ValidationGroup; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author wangna + * @date 2025/08/05 + * @Description: 项目人员管理Controller + */ +@Api(tags = "项目人员管理") +@RestController +@RequestMapping("/project-member") +public class ProjectMemberController { + + @Resource + private ProjectMemberService projectMemberService; + + @ApiOperation(value = "查询项目人员列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ProjectMemberListReq req) { + PageUtil.startPage(); + return PageResult.ok(projectMemberService.selectList(req)); + } + + @ApiOperation(value = "根据项目ID查询项目人员", httpMethod = "GET") + @GetMapping("/project/{projectId}") + public Result> getByProjectId(@PathVariable String projectId) { + return Result.ok(projectMemberService.selectByProjectId(projectId)); + } + + @ApiOperation(value = "根据机组ID查询机组人员", httpMethod = "GET") + @GetMapping("/turbine/{turbineId}") + public Result> getByTurbineId(@PathVariable String turbineId) { + return Result.ok(projectMemberService.selectByTurbineId(turbineId)); + } + + @ApiOperation(value = "根据任务组ID查询任务组人员", httpMethod = "GET") + @GetMapping("/task-group/{taskGroupId}") + public Result> getByTaskGroupId(@PathVariable String taskGroupId) { + return Result.ok(projectMemberService.selectByTaskGroupId(taskGroupId)); + } + + @ApiOperation(value = "根据任务ID查询任务人员", httpMethod = "GET") + @GetMapping("/task/{taskId}") + public Result> getByTaskId(@PathVariable String taskId) { + return Result.ok(projectMemberService.selectByTaskId(taskId)); + } + + @ApiOperation(value = "根据用户ID查询用户参与的项目", httpMethod = "GET") + @GetMapping("/user/{userId}") + public Result> getByUserId(@PathVariable String userId) { + return Result.ok(projectMemberService.selectByUserId(userId)); + } + + @ApiOperation(value = "根据项目ID和角色类型查询人员", httpMethod = "GET") + @GetMapping("/project/{projectId}/role/{roleType}") + public Result> getByProjectIdAndRoleType(@PathVariable String projectId, @PathVariable String roleType) { + return Result.ok(projectMemberService.selectByProjectIdAndRoleType(projectId, roleType)); + } + + @ApiOperation(value = "新增项目人员", httpMethod = "POST") + @PostMapping + public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectMemberReq req) { + projectMemberService.saveData(req); + return Result.ok(); + } + + @ApiOperation(value = "修改项目人员", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated(ValidationGroup.Update.class) @RequestBody ProjectMemberReq req) { + projectMemberService.updateData(req); + return Result.ok(); + } + + @ApiOperation(value = "删除项目人员", httpMethod = "DELETE") + @DeleteMapping("/{memberId}") + public Result remove(@PathVariable String memberId) { + projectMemberService.deleteById(memberId); + return Result.ok(); + } + + @ApiOperation(value = "批量添加项目人员", httpMethod = "POST") + @PostMapping("/batch") + public Result batchAdd(@RequestBody List reqList) { + projectMemberService.batchAddMembers(reqList); + return Result.ok(); + } + + @ApiOperation(value = "根据项目ID删除所有项目人员", httpMethod = "DELETE") + @DeleteMapping("/project/{projectId}") + public Result removeByProjectId(@PathVariable String projectId) { + projectMemberService.deleteByProjectId(projectId); + return Result.ok(); + } + + @ApiOperation(value = "根据机组ID删除所有机组人员", httpMethod = "DELETE") + @DeleteMapping("/turbine/{turbineId}") + public Result removeByTurbineId(@PathVariable String turbineId) { + projectMemberService.deleteByTurbineId(turbineId); + return Result.ok(); + } + + @ApiOperation(value = "根据任务组ID删除所有任务组人员", httpMethod = "DELETE") + @DeleteMapping("/task-group/{taskGroupId}") + public Result removeByTaskGroupId(@PathVariable String taskGroupId) { + projectMemberService.deleteByTaskGroupId(taskGroupId); + return Result.ok(); + } + + @ApiOperation(value = "根据任务ID删除所有任务人员", httpMethod = "DELETE") + @DeleteMapping("/task/{taskId}") + public Result removeByTaskId(@PathVariable String taskId) { + projectMemberService.deleteByTaskId(taskId); + return Result.ok(); + } + + // ========================== 项目看板相关接口 ========================== + + @ApiOperation(value = "获取项目看板统计数据", httpMethod = "GET") + @GetMapping("/kanban/stats") + public Result getProjectKanbanStats() { + return Result.ok(projectMemberService.getProjectKanbanStats()); + } + + @ApiOperation(value = "获取项目看板数据", httpMethod = "GET") + @GetMapping("/kanban/data") + public Result getProjectKanbanData() { + return Result.ok(projectMemberService.getProjectKanbanData()); + } + + @ApiOperation(value = "获取项目详情", httpMethod = "GET") + @GetMapping("/project/{projectId}/detail") + public Result getProjectDetail(@PathVariable String projectId) { + return Result.ok(projectMemberService.getProjectDetail(projectId)); + } +} \ No newline at end of file diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index 2268475..497aa0b 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -3,6 +3,11 @@ server: # 服务器的HTTP端口,默认为8080 port: 8888 address : 0.0.0.0 # 监听所有网络接口 + servlet: + encoding: + enabled: true + charset: UTF-8 + force: true # 数据源配置 spring: From 4c85f9197c8b066d5d9806f6a57a76dab314f2f0 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Tue, 5 Aug 2025 21:02:41 +0800 Subject: [PATCH 32/38] =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dite/znpt/web/controller/RegulationTypeController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java index 6d1c230..b83cd26 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationTypeController.java @@ -25,8 +25,10 @@ public class RegulationTypeController { @GetMapping public Result getRegulationTypes(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size, - @RequestParam(required = false) String typeName) { - return regulationTypeService.getRegulationTypes(page, size, typeName); + @RequestParam(required = false) String typeName, + @RequestParam (required = false) String status, + @RequestParam (required = false) String remark){ + return regulationTypeService.getRegulationTypes(page, size, typeName,status,remark); } @ApiOperation(value = "创建制度类型", httpMethod = "POST") From 9b963d43f54769e7bf5b380875a2973ba1907b9c Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 5 Aug 2025 21:38:54 +0800 Subject: [PATCH 33/38] =?UTF-8?q?=E8=A2=AB=E5=88=A0=E9=99=A4=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dite/znpt/domain/AuditableEntity.java | 9 -- .../entity/ProjectDailyReportEntity.java | 52 +++++++ .../znpt/domain/entity/ProjectEntity.java | 17 ++- .../domain/vo/ProjectBudgetInfoImportReq.java | 38 ----- .../domain/vo/ProjectDailyReportListReq.java | 39 +++++ .../znpt/domain/vo/ProjectDailyReportReq.java | 47 ++++++ .../domain/vo/ProjectDailyReportResp.java | 23 +++ .../znpt/mapper/ProjectDailyReportMapper.java | 18 +++ .../dite/znpt/service/AttachInfoService.java | 2 +- .../service/ProjectDailyReportService.java | 74 ++++++++++ .../service/impl/AttachInfoServiceImpl.java | 5 +- .../impl/AudioFileInfoServiceImpl.java | 4 +- .../impl/ProjectDailyReportServiceImpl.java | 138 ++++++++++++++++++ .../znpt/service/impl/ProjectServiceImpl.java | 11 +- .../service/impl/ProjectTaskServiceImpl.java | 3 +- .../impl/RegulationTypeServiceImpl.java | 6 +- .../mapper/ProjectDailyReportMapper.xml | 30 ++++ .../ProjectDailyReportController.java | 66 +++++++++ 18 files changed, 513 insertions(+), 69 deletions(-) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java delete mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/ProjectDailyReportServiceImpl.java create mode 100644 core/src/main/resources/mapper/ProjectDailyReportMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java diff --git a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java index 0eb68a1..094855a 100644 --- a/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/AuditableEntity.java @@ -1,20 +1,16 @@ package com.dite.znpt.domain; import com.alibaba.excel.annotation.ExcelIgnore; -import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; import java.io.Serial; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.List; /** * @description: 统一定义顶层Entity实体审计 基类 @@ -41,11 +37,6 @@ public class AuditableEntity implements Serializable { @ApiModelProperty(value = "修改人id", hidden = true) private LocalDateTime updateTime; - @ExcelIgnore - @ApiModelProperty(value = "id集合", example = "[]", notes = "id集合") - @TableField(exist = false) - private List idList; - @ExcelIgnore @ApiModelProperty(value = "当前页", example = "1", notes = "0") @TableField(exist = false) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java new file mode 100644 index 0000000..f995b26 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectDailyReportEntity.java @@ -0,0 +1,52 @@ +package com.dite.znpt.domain.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表实体类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("project_daily_report") +@ApiModel(value="ProjectDailyReportEntity对象", description="项目日报信息表") +public class ProjectDailyReportEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -88597301057742621L; + + @ExcelProperty("主键") + @ApiModelProperty("主键") + @TableId(value = "report_id", type = IdType.ASSIGN_ID) + private String reportId; + + @ExcelProperty("项目id") + @ApiModelProperty("项目id") + @TableField("project_id") + private String projectId; + + @ExcelProperty("日报日期") + @ApiModelProperty("日报日期") + @TableField("report_date") + private LocalDate reportDate; + + @ExcelProperty("日报提交人") + @ApiModelProperty("日报提交人") + @TableField("submit_user") + private String submitUser; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java index 2230887..718558f 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectEntity.java @@ -1,18 +1,19 @@ package com.dite.znpt.domain.entity; -import java.io.Serializable; -import java.time.LocalDate; -import java.time.LocalDateTime; - -import com.baomidou.mybatisplus.annotation.*; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.dite.znpt.domain.AuditableEntity; -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import com.alibaba.excel.annotation.ExcelProperty; + +import java.io.Serializable; +import java.time.LocalDate; /** * @author huise23 @@ -165,7 +166,7 @@ public class ProjectEntity extends AuditableEntity implements Serializable { @ApiModelProperty(value = "开始时间") private LocalDate startDate; - +// 施工人员,安全经理,项目经理,商务,财务,高级管理员,项目远程顾问外部协作者,质量经理、现场经理及工作组长。 @ApiModelProperty(value = "结束时间") private LocalDate endDate; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java deleted file mode 100644 index 18d93a7..0000000 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoImportReq.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dite.znpt.domain.vo; - -import com.alibaba.excel.annotation.ExcelProperty; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.io.Serializable; -/** - * @author huise23 - * @date 2025/07/17 21:58 - * @Description: 项目预算信息表导入请求类 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@ApiModel(value="ProjectBudgetInfo导入请求对象", description="项目预算信息表") -public class ProjectBudgetInfoImportReq implements Serializable { - - @Serial - private static final long serialVersionUID = 580212651388155611L; - - - @ExcelProperty(value = "项目名称") - private String projectName; - - @ExcelProperty(value = "预算名称") - private String budgetName; - - @ExcelProperty(value = "预算类型") - private String budgetType; - - @ExcelProperty(value = "预算金额(万元)") - private Double budgetAmount; - - @ExcelProperty(value = "预算说明") - private String budgetDesc; -} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java new file mode 100644 index 0000000..17aff44 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportListReq.java @@ -0,0 +1,39 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息请求实体 + */ +@Data +@ApiModel("项目日报信息列表请求实体") +public class ProjectDailyReportListReq implements Serializable { + + @Serial + private static final long serialVersionUID = 913060537944500760L; + + @ApiModelProperty("查询关键字") + private String keyword; + + @ApiModelProperty("项目日报信息Id") + private String reportId; + + @ApiModelProperty("项目id") + private String projectId; + + @ApiModelProperty("日报日期") + private LocalDate reportDate; + + @ApiModelProperty("日报提交人") + private String submitUser; + +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java new file mode 100644 index 0000000..53b2aad --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportReq.java @@ -0,0 +1,47 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表请求类 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ProjectDailyReport请求对象", description="项目日报信息表") +public class ProjectDailyReportReq implements Serializable { + + @Serial + private static final long serialVersionUID = -35936236241363317L; + + @ApiModelProperty("主键") + private String reportId; + + @NotNull(message = "项目id不能为空") + @ApiModelProperty("项目id") + private String projectId; + + @NotNull(message = "日报日期不能为空") + @ApiModelProperty("日报日期") + private LocalDate reportDate; + + @NotBlank(message = "日报提交人不能为空") + @Size(max = 32, message = "日报提交人长度不能超过32字符") + @ApiModelProperty("日报提交人") + private String submitUser; + + @NotBlank(message = "日报附件id不能为空") + @ApiModelProperty("日报附件id") + private String reportAttachId; +} + diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java new file mode 100644 index 0000000..c41bdff --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDailyReportResp.java @@ -0,0 +1,23 @@ +package com.dite.znpt.domain.vo; + +import com.dite.znpt.domain.entity.AttachInfoEntity; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息响应实体 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("项目日报信息响应实体") +public class ProjectDailyReportResp extends ProjectDailyReportEntity { + + @ApiModelProperty("日报附件") + private AttachInfoEntity reportAttach; +} + diff --git a/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java b/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java new file mode 100644 index 0000000..be32858 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/ProjectDailyReportMapper.java @@ -0,0 +1,18 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import com.dite.znpt.domain.vo.ProjectDailyReportListReq; +import com.dite.znpt.domain.vo.ProjectDailyReportResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表数据库访问层 + */ +public interface ProjectDailyReportMapper extends BaseMapper { + List queryBySelective(ProjectDailyReportListReq projectDailyReportReq); +} + diff --git a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java index 3c4987f..d8cdeb6 100644 --- a/core/src/main/java/com/dite/znpt/service/AttachInfoService.java +++ b/core/src/main/java/com/dite/znpt/service/AttachInfoService.java @@ -23,7 +23,7 @@ public interface AttachInfoService extends IService { * @author huise23 * @date 2025/04/11 23:17 **/ - List listByBusinessIds(List businessIds, String businessType); + List listByBusinessIds(List businessIds, AttachBusinessTypeEnum businessType); /** * 功能描述:新增附件信息 diff --git a/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java b/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java new file mode 100644 index 0000000..e11a964 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/ProjectDailyReportService.java @@ -0,0 +1,74 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.ProjectDailyReportEntity; +import com.dite.znpt.domain.vo.ProjectDailyReportListReq; +import com.dite.znpt.domain.vo.ProjectDailyReportReq; +import com.dite.znpt.domain.vo.ProjectDailyReportResp; + +import java.util.List; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + * @Description: 项目日报信息表服务接口 + */ +public interface ProjectDailyReportService extends IService { + + /** + * 功能描述:查询项目日报信息列表 + * + * @param projectDailyReportReq 项目日报信息 + * @return {@link List }<{@link ProjectDailyReportResp }> + * @author huise23 + * @date 2025/07/27 19:51 + **/ + List selectList(ProjectDailyReportListReq projectDailyReportReq); + + /** + * 功能描述:查询单条项目日报信息 + * + * @param reportId 项目日报信息Id + * @return {@link ProjectDailyReportResp } + * @author huise23 + * @date 2025/07/27 19:51 + **/ + ProjectDailyReportResp selectById(String reportId); + + /** + * 功能描述:新增项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + void saveData(ProjectDailyReportReq projectDailyReportReq); + + /** + * 功能描述:更新项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + void updateData(ProjectDailyReportReq projectDailyReportReq); + + /** + * 功能描述:删除项目日报信息 + * + * @param reportId 项目日报信息Id + * @author huise23 + * @date 2025/07/27 19:51 + **/ + void deleteById(String reportId); + + /** + * 功能描述:我今天 + * + * @return {@link ProjectDailyReportResp } + * @author cuizhibin + * @date 2025/07/27 19:53 + **/ + ProjectDailyReportResp myToday(String projectId); +} + diff --git a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java index b063242..7236292 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AttachInfoServiceImpl.java @@ -30,6 +30,7 @@ import java.net.URLEncoder; import java.rmi.ServerException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -51,9 +52,9 @@ public class AttachInfoServiceImpl extends ServiceImpl listByBusinessIds(List businessIds, String businessType) { + public List listByBusinessIds(List businessIds, AttachBusinessTypeEnum businessType) { return lambdaQuery().in(AttachInfoEntity::getBusinessId, businessIds) - .eq(StrUtil.isNotEmpty(businessType), AttachInfoEntity::getBusinessType, businessType) + .eq(Objects.nonNull(businessType), AttachInfoEntity::getBusinessType, businessType.getCode()) .list(); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java index 42ee984..bcb1811 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/AudioFileInfoServiceImpl.java @@ -19,6 +19,7 @@ import com.dite.znpt.service.PartService; import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; @@ -98,6 +99,7 @@ public class AudioFileInfoServiceImpl extends ServiceImpl batchUpload(String imageId, MultipartFile[] files) { ImageEntity image = imageMapper.selectById(imageId); if(null == image){ @@ -120,7 +122,7 @@ public class AudioFileInfoServiceImpl extends ServiceImpl implements ProjectDailyReportService { + + private final AttachInfoService attachInfoService; + + /** + * 功能描述:查询项目日报信息列表 + * + * @param projectDailyReportReq 项目日报信息信息 + * @return {@link List }<{@link ProjectDailyReportResp }> + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public List selectList(ProjectDailyReportListReq projectDailyReportReq) { + PageUtil.startPage(); + List respList= this.baseMapper.queryBySelective(projectDailyReportReq); + if (CollUtil.isNotEmpty(respList)) { + List reportIds = respList.stream().map(ProjectDailyReportResp::getReportId).toList(); + Map attachMap = attachInfoService.listByBusinessIds(reportIds, AttachBusinessTypeEnum.PROJECT_DAILY_REPORT) + .stream().collect(Collectors.toMap(AttachInfoEntity::getBusinessId, Function.identity())); + respList.forEach(resp -> { + resp.setReportAttach(attachMap.get(resp.getReportId())); + }); + } + return respList; + } + + /** + * 功能描述:查询单条项目日报信息 + * + * @param reportId 项目日报信息Id + * @return {@link ProjectDailyReportResp } + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public ProjectDailyReportResp selectById(String reportId) { + ProjectDailyReportListReq projectDailyReportReq = new ProjectDailyReportListReq(); + projectDailyReportReq.setReportId(reportId); + + List list = selectList(projectDailyReportReq); + return CollUtil.isNotEmpty(list) ? CollUtil.getFirst(list) : new ProjectDailyReportResp(); + } + + /** + * 功能描述:新增项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public void saveData(ProjectDailyReportReq projectDailyReportReq) { + ProjectDailyReportResp myToday = myToday(projectDailyReportReq.getProjectId()); + if (Objects.nonNull(myToday)) { + throw new ServiceException(Message.DAILY_REPORT_EXISTS); + } + ProjectDailyReportEntity entity = BeanUtil.copyProperties(projectDailyReportReq, ProjectDailyReportEntity.class); + save(entity); + attachInfoService.updateBusinessIdByAttachIds(entity.getReportId(), ListUtil.of(projectDailyReportReq.getReportAttachId()), AttachBusinessTypeEnum.PROJECT_DAILY_REPORT); + } + + /** + * 功能描述:更新项目日报信息 + * + * @param projectDailyReportReq 项目日报信息 + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public void updateData(ProjectDailyReportReq projectDailyReportReq) { + ProjectDailyReportEntity entity = BeanUtil.copyProperties(projectDailyReportReq, ProjectDailyReportEntity.class); + updateById(entity); + attachInfoService.updateBusinessIdByAttachIds(entity.getReportId(), ListUtil.of(projectDailyReportReq.getReportAttachId()), AttachBusinessTypeEnum.PROJECT_DAILY_REPORT); + } + + /** + * 功能描述:删除项目日报信息 + * + * @param reportId 项目日报信息Id + * @author huise23 + * @date 2025/07/27 19:51 + **/ + @Override + public void deleteById(String reportId) { + removeById(reportId); + } + + @Override + public ProjectDailyReportResp myToday(String projectId) { + ProjectDailyReportListReq req = new ProjectDailyReportListReq(); + req.setProjectId(projectId); + req.setSubmitUser(StpUtil.getLoginIdAsString()); + req.setReportDate(LocalDate.now()); + List list = selectList(req); + if (CollUtil.isNotEmpty(list)){ + return CollUtil.getFirst(list); + } + return null; + } + +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java index faf5a4a..c7b3038 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectServiceImpl.java @@ -5,20 +5,20 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; import com.dite.znpt.converts.Converts; -import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.entity.ProjectEntity; +import com.dite.znpt.domain.entity.UserEntity; import com.dite.znpt.domain.vo.ProjectListReq; import com.dite.znpt.domain.vo.ProjectListResp; import com.dite.znpt.domain.vo.ProjectReq; import com.dite.znpt.domain.vo.ProjectResp; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.exception.ServiceException; -import com.dite.znpt.service.UserService; -import com.dite.znpt.service.ProjectService; import com.dite.znpt.mapper.ProjectMapper; -import org.springframework.stereotype.Service; -import lombok.RequiredArgsConstructor; +import com.dite.znpt.service.ProjectService; +import com.dite.znpt.service.UserService; import com.dite.znpt.util.PageUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; @@ -59,6 +59,7 @@ public class ProjectServiceImpl extends ServiceImpl list= this.baseMapper.queryBySelective(req); list.forEach(resp -> { resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus())); +// 判断人员类型 }); return list; } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java index 16939d8..1bc85e5 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectTaskServiceImpl.java @@ -20,7 +20,6 @@ import com.dite.znpt.mapper.ProjectTaskGroupMapper; import com.dite.znpt.mapper.ProjectTaskMapper; import com.dite.znpt.service.AttachInfoService; import com.dite.znpt.service.ProjectTaskService; -import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,7 +54,7 @@ public class ProjectTaskServiceImpl extends ServiceImpl projectTaskList = this.baseMapper.queryBySelective(projectTaskReq); Map> attachMap; if (!BooleanUtil.isTrue(projectTaskReq.getIsExport())) { - attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), null) + attachMap = attachInfoService.listByBusinessIds(projectTaskList.stream().map(ProjectTaskResp::getTaskId).collect(Collectors.toList()), AttachBusinessTypeEnum.PROJECT_TASK) .stream().collect(Collectors.groupingBy(AttachInfoEntity::getBusinessId)); } else { attachMap = new HashMap<>(); diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java index 09a8c85..d29fcf7 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java @@ -5,10 +5,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.RegulationTypeEntity; import com.dite.znpt.domain.entity.RegulationEntity; -import com.dite.znpt.mapper.RegulationTypeMapper; +import com.dite.znpt.domain.entity.RegulationTypeEntity; import com.dite.znpt.mapper.RegulationMapper; +import com.dite.znpt.mapper.RegulationTypeMapper; import com.dite.znpt.service.RegulationTypeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -29,7 +29,7 @@ public class RegulationTypeServiceImpl extends ServiceImpl pageParam = new Page<>(page, size); diff --git a/core/src/main/resources/mapper/ProjectDailyReportMapper.xml b/core/src/main/resources/mapper/ProjectDailyReportMapper.xml new file mode 100644 index 0000000..3102523 --- /dev/null +++ b/core/src/main/resources/mapper/ProjectDailyReportMapper.xml @@ -0,0 +1,30 @@ + + + + + + a.report_id, a.project_id, a.report_date, a.submit_user, + a.update_by, a.create_time, a.create_by, a.update_time + + + + + diff --git a/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java b/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java new file mode 100644 index 0000000..b49bf8f --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/ProjectDailyReportController.java @@ -0,0 +1,66 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.ProjectDailyReportListReq; +import com.dite.znpt.domain.vo.ProjectDailyReportReq; +import com.dite.znpt.domain.vo.ProjectDailyReportResp; +import com.dite.znpt.service.ProjectDailyReportService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author huise23 + * @date 2025/07/27 19:51 + */ +@Api(tags = "项目日报信息") +@RestController +@RequestMapping("/project-daily-report") +public class ProjectDailyReportController { + @Resource + private ProjectDailyReportService projectDailyReportService; + + @ApiOperation(value = "获取项目日报信息列表", httpMethod = "GET") + @GetMapping("/list") + public PageResult list(ProjectDailyReportListReq projectDailyReportReq) { + return PageResult.ok(projectDailyReportService.selectList(projectDailyReportReq)); + } + + @ApiOperation(value = "根据项目日报信息Id获取详细信息", httpMethod = "GET") + @GetMapping("/{reportId}") + public Result getInfo(@PathVariable String reportId) { + return Result.ok(projectDailyReportService.selectById(reportId)); + } + + @ApiOperation(value = "获取登录人当日日报", httpMethod = "GET") + @GetMapping("/my-today/{projectId}") + public Result myToday(@PathVariable String projectId) { + return Result.ok(projectDailyReportService.myToday(projectId)); + } + + @ApiOperation(value = "新增项目日报信息", httpMethod = "POST") + @PostMapping + public Result add(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { + projectDailyReportService.saveData(projectDailyReportReq); + return Result.ok(); + } + + @ApiOperation(value = "修改项目日报信息", httpMethod = "PUT") + @PutMapping + public Result edit(@Validated @RequestBody ProjectDailyReportReq projectDailyReportReq) { + projectDailyReportService.updateData(projectDailyReportReq); + return Result.ok(); + } + + @ApiOperation(value = "删除项目日报信息", httpMethod = "DELETE") + @DeleteMapping("/{reportId}") + public Result remove(@PathVariable String reportId) { + projectDailyReportService.deleteById(reportId); + return Result.ok(); + } +} + From 28ebad996640ab6fd65858e7e57a2ef5cfb8f0f9 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Tue, 5 Aug 2025 21:42:16 +0800 Subject: [PATCH 34/38] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/resources/mapper/ImageMapper.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index b46c08c..3c1a334 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -30,6 +30,7 @@ and i.review_state = #{reviewState} + order by i.create_time desc From bce91a49512bc4e43e3d8b80953b81fef1c1155b Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Wed, 6 Aug 2025 09:21:21 +0800 Subject: [PATCH 35/38] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8E=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E9=94=99=E8=AF=AF=EF=BC=8C=E7=89=88=E6=9C=AC=E5=9B=9E?= =?UTF-8?q?=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ProjectMemberServiceImpl.java | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index 08f8ab8..8c51d1d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -5,38 +5,20 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dite.znpt.constant.Message; -import com.dite.znpt.domain.entity.ProjectMemberEntity; -import com.dite.znpt.domain.entity.UserEntity; -import com.dite.znpt.domain.entity.ProjectEntity; -import com.dite.znpt.domain.entity.TurbineEntity; -import com.dite.znpt.domain.entity.ProjectTaskEntity; -import com.dite.znpt.domain.entity.ProjectBudgetInfoEntity; -import com.dite.znpt.domain.entity.ProjectDailyReportEntity; -import com.dite.znpt.domain.vo.ProjectMemberListReq; -import com.dite.znpt.domain.vo.ProjectMemberReq; -import com.dite.znpt.domain.vo.ProjectMemberResp; -import com.dite.znpt.domain.vo.ProjectKanbanStatsResp; -import com.dite.znpt.domain.vo.ProjectKanbanDataResp; -import com.dite.znpt.domain.vo.ProjectDetailResp; +import com.dite.znpt.domain.entity.*; +import com.dite.znpt.domain.vo.*; import com.dite.znpt.enums.ProjectJobCodeEnum; import com.dite.znpt.enums.ProjectRoleTypeEnum; import com.dite.znpt.enums.ProjectStatusEnum; import com.dite.znpt.enums.ProjectTaskStateEnum; import com.dite.znpt.exception.ServiceException; import com.dite.znpt.mapper.ProjectMemberMapper; -import com.dite.znpt.service.ProjectMemberService; -import com.dite.znpt.service.UserService; -import com.dite.znpt.service.ProjectService; -import com.dite.znpt.service.TurbineService; -import com.dite.znpt.service.ProjectTaskService; -import com.dite.znpt.service.ProjectBudgetInfoService; -import com.dite.znpt.service.ProjectDailyReportService; +import com.dite.znpt.service.*; import com.dite.znpt.util.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.function.Function; From f2d2800f79a302e036d9aed09b6ed93a208b45e3 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Wed, 6 Aug 2025 09:38:41 +0800 Subject: [PATCH 36/38] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E5=90=8E=E5=87=BA=E7=8E=B0=E7=9A=84=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/mapper/RegulationTypeMapper.java | 7 ++++++- .../dite/znpt/service/impl/RegulationTypeServiceImpl.java | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java index 1065361..801d72e 100644 --- a/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/RegulationTypeMapper.java @@ -18,7 +18,12 @@ public interface RegulationTypeMapper extends BaseMapper { * 分页查询制度类型列表(包含创建人姓名) * @param page 分页参数 * @param typeName 类型名称 + * @param status 是否启用(1-启用,0-禁用) + * @param remark 备注 * @return 分页结果 */ - Page selectRegulationTypeListWithCreator(Page page, @Param("typeName") String typeName); + Page selectRegulationTypeListWithCreator(Page page, + @Param("typeName") String typeName, + @Param("status") String status, + @Param("remark") String remark); } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java index d29fcf7..2641a04 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationTypeServiceImpl.java @@ -34,7 +34,7 @@ public class RegulationTypeServiceImpl extends ServiceImpl pageParam = new Page<>(page, size); // 使用连表查询获取创建人姓名 - Page result = this.baseMapper.selectRegulationTypeListWithCreator(pageParam, typeName); + Page result = this.baseMapper.selectRegulationTypeListWithCreator(pageParam, typeName, status, remark); return Result.ok(result); } catch (Exception e) { From 5aa29cc3dd515466e8db8d9cebcceeba421ff455 Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 6 Aug 2025 13:41:17 +0800 Subject: [PATCH 37/38] =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E4=BC=A0=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java | 4 ++++ core/src/main/resources/mapper/ImageMapper.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java index cadbfbf..72cc8ce 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageListResp.java @@ -106,4 +106,8 @@ public class ImageListResp implements Serializable { @ApiModelProperty("项目id") private String projectId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("上传时间") + private LocalDateTime createTime; } diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 3c1a334..1e707ca 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -6,7 +6,7 @@ i.image_id, i.image_name, i.part_id, p.part_name, i.image_resolution, i.focal_distance, i.shooting_time, i.camera_manufacturer, i.camera_model, i.GPS, ic.weather, ic.humidness, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, ic.shooting_method, ic.shooting_distance,ic.collector_name, i.image_type, i.image_path, ic.image_source, i.review_state, i.image_type_label, - i.pre_image_path, i.project_id, i.pre_treatment + i.pre_image_path, i.project_id, i.pre_treatment, i.create_time, i.create_by FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id LEFT JOIN part p ON i.part_id = p.part_id From 4befd2d588fbe408385f708aa4ef84138db8dadf Mon Sep 17 00:00:00 2001 From: cuizhibin Date: Wed, 6 Aug 2025 13:43:19 +0800 Subject: [PATCH 38/38] =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E4=BC=A0=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java | 6 ++++++ core/src/main/resources/mapper/ImageMapper.xml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java index 3b628f1..e5600d7 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ImageResp.java @@ -1,11 +1,13 @@ package com.dite.znpt.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.List; /** @@ -60,4 +62,8 @@ public class ImageResp implements Serializable { @ApiModelProperty("项目id") private String projectId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("上传时间") + private LocalDateTime createTime; } diff --git a/core/src/main/resources/mapper/ImageMapper.xml b/core/src/main/resources/mapper/ImageMapper.xml index 1e707ca..450f26a 100644 --- a/core/src/main/resources/mapper/ImageMapper.xml +++ b/core/src/main/resources/mapper/ImageMapper.xml @@ -79,7 +79,7 @@ i.focal_distance35, i.x_resolution, i.y_resolution, i.resolution_units, i.shooting_time, i.camera_manufacturer, i.camera_model, i.latitude, i.latitude, i.altitude, ic.collect_id, ic.weather, CONCAT(ic.temperature_min, '℃', '~',temperature_max, '℃') AS temperature, ic.wind_level, ic.shooting_method, ic.shooting_distance, ic.collector_name, ic.image_source, i.review_state, i.image_type, i.image_type_label, - i.pre_treatment, i.project_id + i.pre_treatment, i.project_id, i.create_time FROM image i LEFT JOIN image_collect ic ON i.collect_id = ic.collect_id WHERE i.image_id = #{imageId}