From 8cd210fd20a28bc17c890dbaaf294afda54f3355 Mon Sep 17 00:00:00 2001 From: dannyxu Date: Fri, 25 Sep 2026 22:18:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai-xuebao-common/pom.xml | 149 ++ ai-xuebao-es/pom.xml | 60 + ai-xuebao-framework/pom.xml | 64 + ai-xuebao-generator/pom.xml | 40 + .../net/hzvtc/generator/config/GenConfig.java | 73 + .../generator/controller/GenController.java | 194 ++ .../net/hzvtc/generator/domain/GenTable.java | 365 ++++ .../generator/domain/GenTableColumn.java | 350 +++ .../mapper/GenTableColumnMapper.java | 60 + .../generator/mapper/GenTableMapper.java | 83 + .../service/GenTableColumnService.java | 44 + .../service/GenTableColumnServiceImpl.java | 64 + .../generator/service/GenTableService.java | 121 ++ .../service/GenTableServiceImpl.java | 447 ++++ .../net/hzvtc/generator/util/GenUtils.java | 259 +++ .../generator/util/VelocityInitializer.java | 35 + .../hzvtc/generator/util/VelocityUtils.java | 334 +++ .../src/main/resources/generator.yml | 10 + .../mapper/generator/GenTableColumnMapper.xml | 136 ++ .../mapper/generator/GenTableMapper.xml | 318 +++ .../main/resources/vm/java/controller.java.vm | 108 + .../src/main/resources/vm/java/domain.java.vm | 89 + .../src/main/resources/vm/java/mapper.java.vm | 91 + .../main/resources/vm/java/service.java.vm | 61 + .../resources/vm/java/serviceImpl.java.vm | 162 ++ .../main/resources/vm/java/sub-domain.java.vm | 73 + .../src/main/resources/vm/js/api.js.vm | 44 + .../src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 482 +++++ .../src/main/resources/vm/vue/index.vue.vm | 573 +++++ .../resources/vm/vue/v3/index-tree.vue.vm | 464 ++++ .../src/main/resources/vm/vue/v3/index.vue.vm | 670 ++++++ .../src/main/resources/vm/vue/v3/readme.txt | 1 + .../main/resources/vm/xml/mapper.xml.old.vm | 136 ++ .../src/main/resources/vm/xml/mapper.xml.vm | 159 ++ ai-xuebao-quartz/pom.xml | 42 + .../hzvtc/quartz/config/ScheduleConfig.java | 57 + .../quartz/controller/SysJobController.java | 158 ++ .../controller/SysJobLogController.java | 82 + .../java/net/hzvtc/quartz/domain/SysJob.java | 172 ++ .../net/hzvtc/quartz/domain/SysJobLog.java | 156 ++ .../hzvtc/quartz/mapper/SysJobLogMapper.java | 64 + .../net/hzvtc/quartz/mapper/SysJobMapper.java | 67 + .../quartz/service/SysJobLogService.java | 56 + .../hzvtc/quartz/service/SysJobService.java | 102 + .../service/impl/SysJobLogServiceImpl.java | 81 + .../service/impl/SysJobServiceImpl.java | 230 ++ .../task/BirdLeaveArriveCalcYearTask.java | 16 + .../java/net/hzvtc/quartz/task/DemoTask.java | 24 + .../quartz/task/DeviceConnectionTask.java | 15 + .../java/net/hzvtc/quartz/task/EmailTask.java | 20 + .../quartz/task/LevelOneSpeciesDailyTask.java | 21 + .../task/ResultRecordDailyStatTask.java | 19 + .../task/SpeciesWinterPeriodStatTask.java | 15 + .../hzvtc/quartz/util/AbstractQuartzJob.java | 97 + .../java/net/hzvtc/quartz/util/CronUtils.java | 63 + .../net/hzvtc/quartz/util/JobInvokeUtil.java | 182 ++ .../QuartzDisallowConcurrentExecution.java | 21 + .../hzvtc/quartz/util/QuartzJobExecution.java | 19 + .../net/hzvtc/quartz/util/ScheduleUtils.java | 134 ++ .../mapper/quartz/SysJobLogMapper.xml | 102 + .../resources/mapper/quartz/SysJobMapper.xml | 111 + ai-xuebao-system/pom.xml | 78 + .../java/net/hzvtc/app/domain/AppUpgrade.java | 113 + .../hzvtc/app/mapper/AppUpgradeMapper.java | 7 + .../hzvtc/app/service/AppUpgradeService.java | 7 + .../service/impl/AppUpgradeServiceImpl.java | 32 + .../controller/ProtectedAreaController.java | 147 ++ .../ProtectedAreaSpeciesController.java | 156 ++ .../ProtectedCareSpeciesController.java | 58 + .../SpeciesAbnormalInfoController.java | 80 + .../controller/WinteringPeriodController.java | 97 + .../net/hzvtc/area/domain/ProtectedArea.java | 118 + .../area/domain/ProtectedAreaSpecies.java | 69 + .../area/domain/ProtectedCareSpecies.java | 53 + .../area/domain/SpeciesAbnormalInfo.java | 88 + .../hzvtc/area/domain/WinteringPeriod.java | 75 + .../area/mapper/ProtectedAreaMapper.java | 80 + .../mapper/ProtectedAreaSpeciesMapper.java | 81 + .../mapper/ProtectedCareSpeciesMapper.java | 50 + .../mapper/SpeciesAbnormalInfoMapper.java | 64 + .../area/mapper/WinteringPeriodMapper.java | 63 + .../area/service/ProtectedAreaService.java | 80 + .../service/ProtectedAreaSpeciesService.java | 80 + .../service/ProtectedCareSpeciesService.java | 44 + .../service/SpeciesAbnormalInfoService.java | 68 + .../area/service/WinteringPeriodService.java | 65 + .../impl/ProtectedAreaServiceImpl.java | 229 ++ .../impl/ProtectedAreaSpeciesServiceImpl.java | 319 +++ .../impl/ProtectedCareSpeciesServiceImpl.java | 92 + .../impl/SpeciesAbnormalInfoServiceImpl.java | 267 +++ .../impl/WinteringPeriodServiceImpl.java | 120 ++ .../controller/BirdCatalogueController.java | 112 + .../bird/controller/BirdFamilyController.java | 111 + .../controller/BirdFlyingInfoController.java | 96 + .../bird/controller/BirdGenusController.java | 113 + .../BirdLeaveArriveInfoController.java | 98 + .../bird/controller/BirdMediaController.java | 103 + .../controller/BirdSpeciesController.java | 162 ++ .../net/hzvtc/bird/domain/BirdCatalogue.java | 58 + .../net/hzvtc/bird/domain/BirdFamily.java | 70 + .../net/hzvtc/bird/domain/BirdFlyingInfo.java | 81 + .../java/net/hzvtc/bird/domain/BirdGenus.java | 75 + .../bird/domain/BirdLeaveArriveInfo.java | 91 + .../java/net/hzvtc/bird/domain/BirdMedia.java | 72 + .../net/hzvtc/bird/domain/BirdSpecies.java | 170 ++ .../bird/mapper/BirdCatalogueMapper.java | 65 + .../hzvtc/bird/mapper/BirdFamilyMapper.java | 65 + .../bird/mapper/BirdFlyingInfoMapper.java | 63 + .../hzvtc/bird/mapper/BirdGenusMapper.java | 65 + .../mapper/BirdLeaveArriveInfoMapper.java | 69 + .../hzvtc/bird/mapper/BirdMediaMapper.java | 65 + .../hzvtc/bird/mapper/BirdSpeciesMapper.java | 78 + .../bird/service/BirdCatalogueService.java | 67 + .../hzvtc/bird/service/BirdFamilyService.java | 67 + .../bird/service/BirdFlyingInfoService.java | 63 + .../hzvtc/bird/service/BirdGenusService.java | 67 + .../service/BirdLeaveArriveInfoService.java | 63 + .../hzvtc/bird/service/BirdMediaService.java | 68 + .../bird/service/BirdSpeciesService.java | 88 + .../impl/BirdCatalogueServiceImpl.java | 153 ++ .../service/impl/BirdFamilyServiceImpl.java | 165 ++ .../impl/BirdFlyingInfoServiceImpl.java | 92 + .../service/impl/BirdGenusServiceImpl.java | 170 ++ .../impl/BirdLeaveArriveInfoServiceImpl.java | 155 ++ .../service/impl/BirdMediaServiceImpl.java | 152 ++ .../service/impl/BirdSpeciesServiceImpl.java | 296 +++ .../controller/FavoriteMediaController.java | 106 + .../check/controller/MediaItemController.java | 24 + .../controller/ResultMediaController.java | 97 + .../controller/ResultRecordController.java | 159 ++ .../ResultRecordDetailsController.java | 139 ++ .../data/check/domain/FavoriteMedia.java | 66 + .../hzvtc/data/check/domain/MediaItem.java | 113 + .../hzvtc/data/check/domain/ResultMedia.java | 101 + .../hzvtc/data/check/domain/ResultRecord.java | 70 + .../check/domain/ResultRecordDetails.java | 108 + .../check/mapper/FavoriteMediaMapper.java | 68 + .../data/check/mapper/MediaItemMapper.java | 61 + .../data/check/mapper/ResultMediaMapper.java | 63 + .../mapper/ResultRecordDetailsMapper.java | 103 + .../data/check/mapper/ResultRecordMapper.java | 68 + .../check/service/FavoriteMediaService.java | 70 + .../data/check/service/MediaItemService.java | 64 + .../check/service/ResultMediaService.java | 68 + .../service/ResultRecordDetailsService.java | 98 + .../check/service/ResultRecordService.java | 89 + .../impl/FavoriteMediaServiceImpl.java | 126 ++ .../service/impl/MediaItemServiceImpl.java | 126 ++ .../service/impl/ResultMediaServiceImpl.java | 167 ++ .../impl/ResultRecordDetailsServiceImpl.java | 348 +++ .../service/impl/ResultRecordServiceImpl.java | 811 +++++++ .../controller/TableStatInfoController.java | 81 + .../hzvtc/data/job/domain/TableStatInfo.java | 46 + .../data/job/mapper/TableStatInfoMapper.java | 53 + .../job/service/TableStatInfoService.java | 53 + .../impl/TableStatInfoServiceImpl.java | 76 + .../controller/DeviceInfoController.java | 172 ++ .../controller/DeviceItemController.java | 97 + .../controller/DevicePersonController.java | 33 + .../controller/HeatmapInfoController.java | 97 + .../net/hzvtc/device/domain/DeviceInfo.java | 105 + .../net/hzvtc/device/domain/DeviceItem.java | 293 +++ .../net/hzvtc/device/domain/DevicePerson.java | 31 + .../net/hzvtc/device/domain/HeatmapInfo.java | 90 + .../hzvtc/device/mapper/DeviceInfoMapper.java | 110 + .../hzvtc/device/mapper/DeviceItemMapper.java | 61 + .../device/mapper/DevicePersonMapper.java | 17 + .../device/mapper/HeatmapInfoMapper.java | 61 + .../device/service/DeviceInfoService.java | 117 + .../device/service/DeviceItemService.java | 61 + .../device/service/DevicePersonService.java | 17 + .../device/service/HeatmapInfoService.java | 65 + .../service/impl/DeviceInfoServiceImpl.java | 564 +++++ .../service/impl/DeviceItemServiceImpl.java | 87 + .../service/impl/DevicePersonServiceImpl.java | 43 + .../service/impl/HeatmapInfoServiceImpl.java | 128 ++ .../controller/BirdRealTimeController.java | 104 + .../echart/domain/vo/BirdStatDataVo.java | 56 + .../hzvtc/echart/domain/vo/DeviceInfoVo.java | 12 + .../echart/mapper/BirdDataStatMapper.java | 54 + .../echart/service/BirdDataStatService.java | 62 + .../service/impl/BirdDataStatServiceImpl.java | 592 +++++ .../net/hzvtc/email/service/EmailService.java | 7 + .../email/service/impl/EmailServiceImpl.java | 59 + .../controller/MediaFileInfoController.java | 149 ++ .../controller/MediaFileItemController.java | 98 + .../net/hzvtc/file/domain/MediaFileInfo.java | 94 + .../net/hzvtc/file/domain/MediaFileItem.java | 79 + .../file/mapper/MediaFileInfoMapper.java | 63 + .../file/mapper/MediaFileItemMapper.java | 65 + .../file/service/MediaFileInfoService.java | 94 + .../file/service/MediaFileItemService.java | 63 + .../impl/MediaFileInfoServiceImpl.java | 1907 +++++++++++++++++ .../impl/MediaFileItemServiceImpl.java | 92 + .../hzvtc/gis/grid/AreaGridController.java | 23 + .../net/hzvtc/gis/grid/domain/AreaGrid.java | 16 + .../hzvtc/gis/grid/mapper/AreaGridMapper.java | 12 + .../gis/grid/service/AreaGridService.java | 17 + .../service/impl/AreaGridServiceImpl.java | 66 + .../consumer/VideoInferMessageConsumer.java | 49 + .../producer/VideoFileMessageProducer.java | 39 + .../ObservationFilesController.java | 98 + .../controller/ObservationsController.java | 115 + .../naturalist/domain/ObservationFiles.java | 79 + .../hzvtc/naturalist/domain/Observations.java | 95 + .../mapper/ObservationFilesMapper.java | 61 + .../naturalist/mapper/ObservationsMapper.java | 61 + .../service/ObservationFilesService.java | 61 + .../service/ObservationsService.java | 70 + .../impl/ObservationFilesServiceImpl.java | 87 + .../service/impl/ObservationsServiceImpl.java | 243 +++ .../controller/CameraOnvifController.java | 46 + .../onvif/controller/CameraOnvifTest.java | 42 + .../onvif/service/CameraOnvifService.java | 14 + .../service/impl/CameraOnvifServiceImpl.java | 197 ++ .../WebSocketConfigurationWithSTOMP.java | 25 + .../WebSocketConfigurationWithSockJS.java | 33 + .../hzvtc/sys/config/WebSocketSupport.java | 8 + .../controller/MessageReadInfoController.java | 86 + .../net/hzvtc/system/domain/MenuInSys.java | 67 + .../hzvtc/system/domain/MessageReadInfo.java | 65 + .../hzvtc/system/domain/NoticeFileInfo.java | 51 + .../hzvtc/system/domain/NoticeReadDept.java | 53 + .../net/hzvtc/system/domain/NoticeReader.java | 68 + .../net/hzvtc/system/domain/RoleInArea.java | 12 + .../net/hzvtc/system/domain/SysConfig.java | 113 + .../hzvtc/system/domain/SysLogininfor.java | 144 ++ .../net/hzvtc/system/domain/SysNotice.java | 85 + .../net/hzvtc/system/domain/SysOperLog.java | 255 +++ .../java/net/hzvtc/system/domain/SysPost.java | 124 ++ .../net/hzvtc/system/domain/SysRoleDept.java | 46 + .../net/hzvtc/system/domain/SysRoleMenu.java | 47 + .../hzvtc/system/domain/SysUserOnline.java | 113 + .../net/hzvtc/system/domain/SysUserPost.java | 31 + .../net/hzvtc/system/domain/SysUserRole.java | 47 + .../system/domain/vo/DocStateCountVO.java | 11 + .../net/hzvtc/system/domain/vo/MessageVo.java | 23 + .../net/hzvtc/system/domain/vo/MetaVo.java | 106 + .../net/hzvtc/system/domain/vo/RouterVo.java | 63 + .../hzvtc/system/mapper/MenuInSysMapper.java | 61 + .../system/mapper/MessageReadInfoMapper.java | 63 + .../system/mapper/NoticeFileInfoMapper.java | 59 + .../system/mapper/NoticeReadDeptMapper.java | 49 + .../system/mapper/NoticeReaderMapper.java | 40 + .../hzvtc/system/mapper/SysConfigMapper.java | 68 + .../hzvtc/system/mapper/SysDeptMapper.java | 143 ++ .../system/mapper/SysDictDataMapper.java | 98 + .../system/mapper/SysDictTypeMapper.java | 86 + .../system/mapper/SysLogininforMapper.java | 42 + .../hzvtc/system/mapper/SysMenuMapper.java | 118 + .../hzvtc/system/mapper/SysNoticeMapper.java | 73 + .../hzvtc/system/mapper/SysOperLogMapper.java | 48 + .../hzvtc/system/mapper/SysPostMapper.java | 99 + .../system/mapper/SysRoleDeptMapper.java | 44 + .../hzvtc/system/mapper/SysRoleMapper.java | 107 + .../system/mapper/SysRoleMenuMapper.java | 53 + .../hzvtc/system/mapper/SysUserMapper.java | 133 ++ .../system/mapper/SysUserPostMapper.java | 46 + .../system/mapper/SysUserRoleMapper.java | 63 + .../system/service/MenuInSysService.java | 61 + .../service/MessageReadInfoService.java | 61 + .../system/service/NoticeFileInfoService.java | 56 + .../system/service/NoticeReadDeptService.java | 47 + .../system/service/NoticeReaderService.java | 39 + .../system/service/SysConfigService.java | 90 + .../hzvtc/system/service/SysDeptService.java | 143 ++ .../system/service/SysDictDataService.java | 63 + .../system/service/SysDictTypeService.java | 99 + .../system/service/SysLogininforService.java | 40 + .../hzvtc/system/service/SysMenuService.java | 136 ++ .../system/service/SysNoticeService.java | 74 + .../system/service/SysOperLogService.java | 48 + .../hzvtc/system/service/SysPostService.java | 100 + .../hzvtc/system/service/SysRoleService.java | 176 ++ .../system/service/SysUserOnlineService.java | 47 + .../hzvtc/system/service/SysUserService.java | 209 ++ .../service/impl/MenuInSysServiceImpl.java | 87 + .../impl/MessageReadInfoServiceImpl.java | 94 + .../impl/NoticeFileInfoServiceImpl.java | 83 + .../impl/NoticeReadDeptServiceImpl.java | 70 + .../service/impl/NoticeReaderServiceImpl.java | 55 + .../service/impl/SysConfigServiceImpl.java | 205 ++ .../service/impl/SysDeptServiceImpl.java | 448 ++++ .../service/impl/SysDictDataServiceImpl.java | 114 + .../service/impl/SysDictTypeServiceImpl.java | 203 ++ .../impl/SysLogininforServiceImpl.java | 61 + .../service/impl/SysMenuServiceImpl.java | 477 +++++ .../service/impl/SysNoticeServiceImpl.java | 258 +++ .../service/impl/SysOperLogServiceImpl.java | 71 + .../service/impl/SysPostServiceImpl.java | 164 ++ .../service/impl/SysRoleServiceImpl.java | 403 ++++ .../impl/SysUserOnlineServiceImpl.java | 86 + .../service/impl/SysUserServiceImpl.java | 500 +++++ .../api/service/SpeciesInfoApiService.java | 23 + .../impl/SpeciesInfoApiServiceImpl.java | 285 +++ .../controller/BirdWebPageStatController.java | 86 + .../SpeciesDailyInhabitController.java | 70 + .../SpeciesDailyStatController.java | 206 ++ .../SpeciesInhabitStatController.java | 97 + .../SpeciesLocationInfoController.java | 96 + .../SpeciesWinterPeriodController.java | 96 + .../web/stat/domain/SpeciesDailyInhabit.java | 76 + .../web/stat/domain/SpeciesDailyStat.java | 75 + .../web/stat/domain/SpeciesInhabitStat.java | 71 + .../web/stat/domain/SpeciesLocationInfo.java | 69 + .../web/stat/domain/SpeciesWinterPeriod.java | 96 + .../stat/mapper/BirdWebPageStatMapper.java | 39 + .../mapper/SpeciesDailyInhabitMapper.java | 46 + .../stat/mapper/SpeciesDailyStatMapper.java | 80 + .../stat/mapper/SpeciesInhabitStatMapper.java | 61 + .../mapper/SpeciesLocationInfoMapper.java | 61 + .../mapper/SpeciesWinterPeriodMapper.java | 63 + .../stat/service/BirdWebPageStatService.java | 34 + .../service/SpeciesDailyInhabitService.java | 51 + .../stat/service/SpeciesDailyStatService.java | 98 + .../service/SpeciesInhabitStatService.java | 61 + .../service/SpeciesLocationInfoService.java | 61 + .../service/SpeciesWinterPeriodService.java | 63 + .../impl/BirdWebPageStatServiceImpl.java | 473 ++++ .../impl/SpeciesDailyInhabitServiceImpl.java | 141 ++ .../impl/SpeciesDailyStatServiceImpl.java | 1366 ++++++++++++ .../impl/SpeciesInhabitStatServiceImpl.java | 87 + .../impl/SpeciesLocationInfoServiceImpl.java | 87 + .../impl/SpeciesWinterPeriodServiceImpl.java | 149 ++ .../resources/mapper/app/AppUpgradeMapper.xml | 27 + .../mapper/area/ProtectedAreaMapper.xml | 267 +++ .../area/ProtectedAreaSpeciesMapper.xml | 229 ++ .../area/ProtectedCareSpeciesMapper.xml | 60 + .../mapper/area/SpeciesAbnormalInfoMapper.xml | 155 ++ .../mapper/area/WinteringPeriodMapper.xml | 90 + .../mapper/birdInfo/BirdCatalogueMapper.xml | 90 + .../mapper/birdInfo/BirdFamilyMapper.xml | 96 + .../mapper/birdInfo/BirdFlyingInfoMapper.xml | 91 + .../mapper/birdInfo/BirdGenusMapper.xml | 96 + .../birdInfo/BirdLeaveArriveInfoMapper.xml | 127 ++ .../mapper/birdInfo/BirdMediaMapper.xml | 114 + .../mapper/birdInfo/BirdSpeciesMapper.xml | 292 +++ .../mapper/dataCheck/FavoriteMediaMapper.xml | 104 + .../mapper/dataCheck/MediaItemMapper.xml | 102 + .../mapper/dataCheck/ResultMediaMapper.xml | 478 +++++ .../dataCheck/ResultRecordDetailsMapper.xml | 555 +++++ .../mapper/dataCheck/ResultRecordMapper.xml | 118 + .../mapper/device/DeviceInfoMapper.xml | 403 ++++ .../mapper/device/DeviceItemMapper.xml | 197 ++ .../mapper/device/DevicePersonMapper.xml | 47 + .../mapper/device/HeatmapInfoMapper.xml | 93 + .../mapper/echart/BirdDataStatMapper.xml | 629 ++++++ .../mapper/file/MediaFileInfoMapper.xml | 89 + .../mapper/file/MediaFileItemMapper.xml | 102 + .../resources/mapper/grid/AreaGridMapper.xml | 30 + .../mapper/job/TableStatInfoMapper.xml | 48 + .../naturalist/ObservationFilesMapper.xml | 87 + .../mapper/naturalist/ObservationsMapper.xml | 94 + .../mapper/stat/BirdWebPageStatMapper.xml | 491 +++++ .../mapper/stat/SpeciesDailyInhabitMapper.xml | 198 ++ .../mapper/stat/SpeciesDailyStatMapper.xml | 545 +++++ .../mapper/stat/SpeciesInhabitStatMapper.xml | 101 + .../mapper/stat/SpeciesLocationInfoMapper.xml | 78 + .../mapper/stat/SpeciesWinterPeriodMapper.xml | 125 ++ .../mapper/system/MenuInSysMapper.xml | 69 + .../mapper/system/MessageReadInfoMapper.xml | 73 + .../mapper/system/NoticeFileInfoMapper.xml | 78 + .../mapper/system/NoticeReadDeptMapper.xml | 69 + .../mapper/system/NoticeReaderMapper.xml | 40 + .../mapper/system/SysConfigMapper.xml | 123 ++ .../resources/mapper/system/SysDeptMapper.xml | 367 ++++ .../mapper/system/SysDictDataMapper.xml | 154 ++ .../mapper/system/SysDictTypeMapper.xml | 107 + .../mapper/system/SysLogininforMapper.xml | 57 + .../resources/mapper/system/SysMenuMapper.xml | 272 +++ .../mapper/system/SysNoticeMapper.xml | 165 ++ .../mapper/system/SysOperLogMapper.xml | 98 + .../resources/mapper/system/SysPostMapper.xml | 122 ++ .../mapper/system/SysRoleDeptMapper.xml | 34 + .../resources/mapper/system/SysRoleMapper.xml | 174 ++ .../mapper/system/SysRoleMenuMapper.xml | 73 + .../resources/mapper/system/SysUserMapper.xml | 324 +++ .../mapper/system/SysUserPostMapper.xml | 39 + .../mapper/system/SysUserRoleMapper.xml | 52 + pom.xml | 301 +++ 381 files changed, 47550 insertions(+) create mode 100644 ai-xuebao-common/pom.xml create mode 100644 ai-xuebao-es/pom.xml create mode 100644 ai-xuebao-framework/pom.xml create mode 100644 ai-xuebao-generator/pom.xml create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/config/GenConfig.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/controller/GenController.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTable.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTableColumn.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableColumnMapper.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableMapper.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnService.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnServiceImpl.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableService.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableServiceImpl.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/GenUtils.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityInitializer.java create mode 100644 ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityUtils.java create mode 100644 ai-xuebao-generator/src/main/resources/generator.yml create mode 100644 ai-xuebao-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 ai-xuebao-generator/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 ai-xuebao-generator/src/main/resources/vm/java/controller.java.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/java/domain.java.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/java/mapper.java.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/java/service.java.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/java/sub-domain.java.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/js/api.js.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/sql/sql.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/vue/index.vue.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/vue/v3/index.vue.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/vue/v3/readme.txt create mode 100644 ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.old.vm create mode 100644 ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 ai-xuebao-quartz/pom.xml create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/config/ScheduleConfig.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobController.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobLogController.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJob.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJobLog.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobLogMapper.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobMapper.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobLogService.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobService.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobLogServiceImpl.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobServiceImpl.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/BirdLeaveArriveCalcYearTask.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DemoTask.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DeviceConnectionTask.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/EmailTask.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/LevelOneSpeciesDailyTask.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/ResultRecordDailyStatTask.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/SpeciesWinterPeriodStatTask.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/AbstractQuartzJob.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/CronUtils.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/JobInvokeUtil.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzDisallowConcurrentExecution.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzJobExecution.java create mode 100644 ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/ScheduleUtils.java create mode 100644 ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml create mode 100644 ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml create mode 100644 ai-xuebao-system/pom.xml create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/app/domain/AppUpgrade.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/app/mapper/AppUpgradeMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/app/service/AppUpgradeService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/app/service/impl/AppUpgradeServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaSpeciesController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedCareSpeciesController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/controller/SpeciesAbnormalInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/controller/WinteringPeriodController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedArea.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedAreaSpecies.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedCareSpecies.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/domain/SpeciesAbnormalInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/domain/WinteringPeriod.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaSpeciesMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedCareSpeciesMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/SpeciesAbnormalInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/WinteringPeriodMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaSpeciesService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedCareSpeciesService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/SpeciesAbnormalInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/WinteringPeriodService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaSpeciesServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedCareSpeciesServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/SpeciesAbnormalInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/WinteringPeriodServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdCatalogueController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFamilyController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFlyingInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdGenusController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdLeaveArriveInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdMediaController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdSpeciesController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdCatalogue.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFamily.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFlyingInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdGenus.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdLeaveArriveInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdMedia.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdSpecies.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdCatalogueMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFamilyMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFlyingInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdGenusMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdLeaveArriveInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdMediaMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdSpeciesMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdCatalogueService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFamilyService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFlyingInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdGenusService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdLeaveArriveInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdMediaService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdSpeciesService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdCatalogueServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFamilyServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFlyingInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdGenusServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdLeaveArriveInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdMediaServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdSpeciesServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/FavoriteMediaController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/MediaItemController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultMediaController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordDetailsController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/FavoriteMedia.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/MediaItem.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultMedia.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecord.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecordDetails.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/FavoriteMediaMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/MediaItemMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultMediaMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordDetailsMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/FavoriteMediaService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/MediaItemService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultMediaService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordDetailsService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/FavoriteMediaServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/MediaItemServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultMediaServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordDetailsServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/job/controller/TableStatInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/job/domain/TableStatInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/job/mapper/TableStatInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/TableStatInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/impl/TableStatInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceItemController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DevicePersonController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/controller/HeatmapInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceItem.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DevicePerson.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/domain/HeatmapInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceItemMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DevicePersonMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/HeatmapInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceItemService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/DevicePersonService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/HeatmapInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceItemServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DevicePersonServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/HeatmapInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/echart/controller/BirdRealTimeController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/BirdStatDataVo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/DeviceInfoVo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/echart/mapper/BirdDataStatMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/echart/service/BirdDataStatService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/echart/service/impl/BirdDataStatServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/email/service/EmailService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/email/service/impl/EmailServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileItemController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileItem.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileItemMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileItemService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileItemServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/AreaGridController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/domain/AreaGrid.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/mapper/AreaGridMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/AreaGridService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/impl/AreaGridServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/consumer/VideoInferMessageConsumer.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/producer/VideoFileMessageProducer.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationFilesController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationsController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/ObservationFiles.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/Observations.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationFilesMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationsMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationFilesService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationsService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationFilesServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationsServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifTest.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/CameraOnvifService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/impl/CameraOnvifServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSTOMP.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSockJS.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketSupport.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/controller/MessageReadInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MenuInSys.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MessageReadInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeFileInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReadDept.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReader.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/RoleInArea.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysConfig.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysLogininfor.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysNotice.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysOperLog.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysPost.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleDept.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleMenu.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserOnline.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserPost.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserRole.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/DocStateCountVO.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MessageVo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MetaVo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/RouterVo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MenuInSysMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MessageReadInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeFileInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReadDeptMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReaderMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysConfigMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDeptMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictDataMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictTypeMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysLogininforMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysMenuMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysNoticeMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysOperLogMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysPostMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleDeptMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMenuMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserPostMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserRoleMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/MenuInSysService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/MessageReadInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeFileInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReadDeptService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReaderService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysConfigService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDeptService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictDataService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictTypeService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysLogininforService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysMenuService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysNoticeService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysOperLogService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysPostService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysRoleService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserOnlineService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MenuInSysServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MessageReadInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeFileInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReadDeptServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReaderServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysConfigServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDeptServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictDataServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysLogininforServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysMenuServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysNoticeServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysOperLogServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysPostServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysRoleServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserOnlineServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/SpeciesInfoApiService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/impl/SpeciesInfoApiServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/BirdWebPageStatController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyInhabitController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyStatController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesInhabitStatController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesLocationInfoController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesWinterPeriodController.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyInhabit.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyStat.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesInhabitStat.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesLocationInfo.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesWinterPeriod.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/BirdWebPageStatMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyInhabitMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyStatMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesInhabitStatMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesLocationInfoMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesWinterPeriodMapper.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/BirdWebPageStatService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyInhabitService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyStatService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesInhabitStatService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesLocationInfoService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesWinterPeriodService.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/BirdWebPageStatServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyInhabitServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyStatServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesInhabitStatServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesLocationInfoServiceImpl.java create mode 100644 ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesWinterPeriodServiceImpl.java create mode 100644 ai-xuebao-system/src/main/resources/mapper/app/AppUpgradeMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaSpeciesMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/area/ProtectedCareSpeciesMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/area/SpeciesAbnormalInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/area/WinteringPeriodMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdCatalogueMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFamilyMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFlyingInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdGenusMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdLeaveArriveInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdMediaMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdSpeciesMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/dataCheck/FavoriteMediaMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/dataCheck/MediaItemMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultMediaMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordDetailsMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/device/DeviceInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/device/DeviceItemMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/device/DevicePersonMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/device/HeatmapInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/echart/BirdDataStatMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/file/MediaFileInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/file/MediaFileItemMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/grid/AreaGridMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/job/TableStatInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationFilesMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationsMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/stat/BirdWebPageStatMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyInhabitMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyStatMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/stat/SpeciesInhabitStatMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/stat/SpeciesLocationInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/stat/SpeciesWinterPeriodMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/MenuInSysMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/MessageReadInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/NoticeFileInfoMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/NoticeReadDeptMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/NoticeReaderMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysConfigMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysDeptMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysDictDataMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysDictTypeMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysLogininforMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysMenuMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysNoticeMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysOperLogMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysPostMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysUserPostMapper.xml create mode 100644 ai-xuebao-system/src/main/resources/mapper/system/SysUserRoleMapper.xml create mode 100644 pom.xml diff --git a/ai-xuebao-common/pom.xml b/ai-xuebao-common/pom.xml new file mode 100644 index 0000000..bb076fd --- /dev/null +++ b/ai-xuebao-common/pom.xml @@ -0,0 +1,149 @@ + + + + aibird + net.hzvtc + 1.2.0 + + 4.0.0 + + ai-xuebao-common + + + common通用工具 + + + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.alibaba + fastjson + + + + + commons-io + commons-io + + + + + commons-fileupload + commons-fileupload + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + io.jsonwebtoken + jjwt + + + + + javax.xml.bind + jaxb-api + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + eu.bitwalker + UserAgentUtils + + + + + javax.servlet + javax.servlet-api + + + + org.projectlombok + lombok + 1.18.20 + provided + + + + com.belerweb + pinyin4j + 2.5.1 + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + \ No newline at end of file diff --git a/ai-xuebao-es/pom.xml b/ai-xuebao-es/pom.xml new file mode 100644 index 0000000..991c4eb --- /dev/null +++ b/ai-xuebao-es/pom.xml @@ -0,0 +1,60 @@ + + + + aibird + net.hzvtc + 1.2.0 + + 4.0.0 + ai-xuebao-es + + springboot-elasticsearch-service + + + + co.elastic.clients + elasticsearch-java + 8.14.3 + + + org.elasticsearch.client + elasticsearch-rest-client + 8.14.3 + + + org.projectlombok + lombok + 1.18.20 + provided + + + com.fasterxml.jackson.core + jackson-databind + 2.13.4 + + + org.springframework + spring-context + 5.3.29 + + + com.alibaba + fastjson + + + net.hzvtc + ai-xuebao-common + + + net.hzvtc + ai-xuebao-system + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.13.4 + + + \ No newline at end of file diff --git a/ai-xuebao-framework/pom.xml b/ai-xuebao-framework/pom.xml new file mode 100644 index 0000000..a153f8c --- /dev/null +++ b/ai-xuebao-framework/pom.xml @@ -0,0 +1,64 @@ + + + + aibird + net.hzvtc + 1.2.0 + + 4.0.0 + + ai-xuebao-framework + + + framework框架核心 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.alibaba + druid-spring-boot-starter + + + + + com.github.penggle + kaptcha + + + javax.servlet-api + javax.servlet + + + + + + + com.github.oshi + oshi-core + + + + + net.hzvtc + ai-xuebao-system + + + + + \ No newline at end of file diff --git a/ai-xuebao-generator/pom.xml b/ai-xuebao-generator/pom.xml new file mode 100644 index 0000000..b57369b --- /dev/null +++ b/ai-xuebao-generator/pom.xml @@ -0,0 +1,40 @@ + + + + aibird + net.hzvtc + 1.2.0 + + 4.0.0 + + ai-xuebao-generator + + + generator代码生成 + + + + + + + org.apache.velocity + velocity-engine-core + + + + + commons-collections + commons-collections + + + + + net.hzvtc + ai-xuebao-common + + + + + \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/config/GenConfig.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/config/GenConfig.java new file mode 100644 index 0000000..43907db --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/config/GenConfig.java @@ -0,0 +1,73 @@ +package net.hzvtc.generator.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author admin + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = { "classpath:generator.yml" }) +public class GenConfig +{ + /** 作者 */ + public static String author; + + /** 生成包路径 */ + public static String packageName; + + /** 自动去除表前缀,默认是false */ + public static boolean autoRemovePre; + + /** 表前缀(类名不会包含表前缀) */ + public static String tablePrefix; + + public static String getAuthor() + { + return author; + } + + @Value("${author}") + public void setAuthor(String author) + { + GenConfig.author = author; + } + + public static String getPackageName() + { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) + { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() + { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) + { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() + { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) + { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/controller/GenController.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/controller/GenController.java new file mode 100644 index 0000000..c63d307 --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/controller/GenController.java @@ -0,0 +1,194 @@ +package net.hzvtc.generator.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.core.text.Convert; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.generator.domain.GenTable; +import net.hzvtc.generator.domain.GenTableColumn; +import net.hzvtc.generator.service.GenTableColumnService; +import net.hzvtc.generator.service.GenTableService; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 代码生成 操作处理 + * + * @author admin + */ +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController { + @Autowired + private GenTableService genTableService; + + @Autowired + private GenTableColumnService genTableColumnService; + + /** + * 查询代码生成列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable) { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 修改代码生成业务 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @GetMapping(value = "/{talbleId}") + public AjaxResult getInfo(@PathVariable Long talbleId) { + GenTable table = genTableService.selectGenTableById(talbleId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return AjaxResult.success(map); + } + + /** + * 查询数据库列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable) { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 查询数据表字段列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping(value = "/column/{talbleId}") + public TableDataInfo columnList(Long tableId) { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return AjaxResult.success(); + } + + /** + * 修改保存代码生成业务 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return AjaxResult.success(); + } + + /** + * 删除代码生成 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) { + genTableService.deleteGenTableByIds(tableIds); + return AjaxResult.success(); + } + + /** + * 预览代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException { + Map dataMap = genTableService.previewCode(tableId); + return AjaxResult.success(dataMap); + } + + /** + * 生成代码(下载方式) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) { + genTableService.generatorCode(tableName); + return AjaxResult.success(); + } + + /** + * 同步数据库 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) { + genTableService.synchDb(tableName); + return AjaxResult.success(); + } + + /** + * 批量生成代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"AiBirdSys.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTable.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTable.java new file mode 100644 index 0000000..0cf01ca --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTable.java @@ -0,0 +1,365 @@ +package net.hzvtc.generator.domain; + +import net.hzvtc.common.constant.GenConstants; +import net.hzvtc.common.core.domain.BaseEntity; +import net.hzvtc.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.ibatis.type.Alias; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 业务表 gen_table + * + * @author admin + */ +@Alias("GenTable") +public class GenTable extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + private Long tableId; + + /** + * 表名称 + */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** + * 表描述 + */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** + * 关联父表的表名 + */ + private String subTableName; + + /** + * 本表关联父表的外键名 + */ + private String subTableFkName; + + /** + * 实体类名称(首字母大写) + */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** + * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) + */ + private String tplCategory; + + /** + * 生成包路径 + */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** + * 生成模块名 + */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** + * 生成业务名 + */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** + * 生成功能名 + */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** + * 生成作者 + */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + + /** + * 生成路径(不填默认项目路径) + */ + private String genPath; + + /** + * 主键信息 + */ + private GenTableColumn pkColumn; + + /** + * 子表信息 + */ + private GenTable subTable; + + /** + * 表列信息 + */ + @Valid + private List columns; + + /** + * 其它生成选项 + */ + private String options; + + /** + * 树编码字段 + */ + private String treeCode; + + /** + * 树父编码字段 + */ + private String treeParentCode; + + /** + * 树名称字段 + */ + private String treeName; + + /** + * 上级菜单ID字段 + */ + private String parentMenuId; + + /** + * 上级菜单名称字段 + */ + private String parentMenuName; + + public static boolean isSub(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + + public static boolean isTree(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public static boolean isCrud(String tplCategory) { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) { + if (isTree(tplCategory)) { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } + + public Long getTableId() { + return tableId; + } + + public void setTableId(Long tableId) { + this.tableId = tableId; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getTableComment() { + return tableComment; + } + + public void setTableComment(String tableComment) { + this.tableComment = tableComment; + } + + public String getSubTableName() { + return subTableName; + } + + public void setSubTableName(String subTableName) { + this.subTableName = subTableName; + } + + public String getSubTableFkName() { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) { + this.subTableFkName = subTableFkName; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getTplCategory() { + return tplCategory; + } + + public void setTplCategory(String tplCategory) { + this.tplCategory = tplCategory; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getBusinessName() { + return businessName; + } + + public void setBusinessName(String businessName) { + this.businessName = businessName; + } + + public String getFunctionName() { + return functionName; + } + + public void setFunctionName(String functionName) { + this.functionName = functionName; + } + + public String getFunctionAuthor() { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) { + this.functionAuthor = functionAuthor; + } + + public String getGenType() { + return genType; + } + + public void setGenType(String genType) { + this.genType = genType; + } + + public String getGenPath() { + return genPath; + } + + public void setGenPath(String genPath) { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() { + return subTable; + } + + public void setSubTable(GenTable subTable) { + this.subTable = subTable; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public String getOptions() { + return options; + } + + public void setOptions(String options) { + this.options = options; + } + + public String getTreeCode() { + return treeCode; + } + + public void setTreeCode(String treeCode) { + this.treeCode = treeCode; + } + + public String getTreeParentCode() { + return treeParentCode; + } + + public void setTreeParentCode(String treeParentCode) { + this.treeParentCode = treeParentCode; + } + + public String getTreeName() { + return treeName; + } + + public void setTreeName(String treeName) { + this.treeName = treeName; + } + + public String getParentMenuId() { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) { + this.parentMenuId = parentMenuId; + } + + public String getParentMenuName() { + return parentMenuName; + } + + public void setParentMenuName(String parentMenuName) { + this.parentMenuName = parentMenuName; + } + + public boolean isSub() { + return isSub(tplCategory); + } + + public boolean isTree() { + return isTree(tplCategory); + } + + public boolean isCrud() { + return isCrud(tplCategory); + } + + public boolean isSuperColumn(String javaField) { + return isSuperColumn(tplCategory, javaField); + } +} \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTableColumn.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTableColumn.java new file mode 100644 index 0000000..2c5b86a --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/domain/GenTableColumn.java @@ -0,0 +1,350 @@ +package net.hzvtc.generator.domain; + +import net.hzvtc.common.core.domain.BaseEntity; +import net.hzvtc.common.utils.StringUtils; +import org.apache.ibatis.type.Alias; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author admin + */ +@Alias("GenTableColumn") +public class GenTableColumn extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + private Long columnId; + + /** + * 归属表编号 + */ + private Long tableId; + + /** + * 列名称 + */ + private String columnName; + + /** + * 列描述 + */ + private String columnComment; + + /** + * 列类型 + */ + private String columnType; + + /** + * JAVA类型 + */ + private String javaType; + + /** + * JAVA字段名 + */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** + * 是否主键(1是) + */ + private String isPk; + + /** + * 是否自增(1是) + */ + private String isIncrement; + + /** + * 是否必填(1是) + */ + private String isRequired; + + /** + * 是否为插入字段(1是) + */ + private String isInsert; + + /** + * 是否编辑字段(1是) + */ + private String isEdit; + + /** + * 是否列表字段(1是) + */ + private String isList; + + /** + * 是否查询字段(1是) + */ + private String isQuery; + + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ + private String queryType; + + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ + private String htmlType; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 排序 + */ + private Integer sort; + + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public static boolean isUsableColumn(String javaField) { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public Long getColumnId() { + return columnId; + } + + public void setColumnId(Long columnId) { + this.columnId = columnId; + } + + public Long getTableId() { + return tableId; + } + + public void setTableId(Long tableId) { + this.tableId = tableId; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getColumnComment() { + return columnComment; + } + + public void setColumnComment(String columnComment) { + this.columnComment = columnComment; + } + + public String getColumnType() { + return columnType; + } + + public void setColumnType(String columnType) { + this.columnType = columnType; + } + + public String getJavaType() { + return javaType; + } + + public void setJavaType(String javaType) { + this.javaType = javaType; + } + + public String getJavaField() { + return javaField; + } + + public void setJavaField(String javaField) { + this.javaField = javaField; + } + + public String getCapJavaField() { + return StringUtils.capitalize(javaField); + } + + public String getIsPk() { + return isPk; + } + + public void setIsPk(String isPk) { + this.isPk = isPk; + } + + public boolean isPk() { + return isPk(isPk); + } + + public boolean isPk(String isPk) { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() { + return isIncrement(isIncrement); + } + + public boolean isIncrement(String isIncrement) { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public String getIsRequired() { + return isRequired; + } + + public void setIsRequired(String isRequired) { + this.isRequired = isRequired; + } + + public boolean isRequired() { + return isRequired(isRequired); + } + + public boolean isRequired(String isRequired) { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public String getIsInsert() { + return isInsert; + } + + public void setIsInsert(String isInsert) { + this.isInsert = isInsert; + } + + public boolean isInsert() { + return isInsert(isInsert); + } + + public boolean isInsert(String isInsert) { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public String getIsEdit() { + return isEdit; + } + + public void setIsEdit(String isEdit) { + this.isEdit = isEdit; + } + + public boolean isEdit() { + return isInsert(isEdit); + } + + public boolean isEdit(String isEdit) { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public String getIsList() { + return isList; + } + + public void setIsList(String isList) { + this.isList = isList; + } + + public boolean isList() { + return isList(isList); + } + + public boolean isList(String isList) { + return isList != null && StringUtils.equals("1", isList); + } + + public String getIsQuery() { + return isQuery; + } + + public void setIsQuery(String isQuery) { + this.isQuery = isQuery; + } + + public boolean isQuery() { + return isQuery(isQuery); + } + + public boolean isQuery(String isQuery) { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public String getQueryType() { + return queryType; + } + + public void setQueryType(String queryType) { + this.queryType = queryType; + } + + public String getHtmlType() { + return htmlType; + } + + public void setHtmlType(String htmlType) { + this.htmlType = htmlType; + } + + public String getDictType() { + return dictType; + } + + public void setDictType(String dictType) { + this.dictType = dictType; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public boolean isSuperColumn() { + return isSuperColumn(javaField); + } + + public boolean isUsableColumn() { + return isUsableColumn(javaField); + } + + public String readConverterExp() { + String remarks = StringUtils.substringBetween(columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } else { + return columnComment; + } + } +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableColumnMapper.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..6118e55 --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,60 @@ +package net.hzvtc.generator.mapper; + +import java.util.List; +import net.hzvtc.generator.domain.GenTableColumn; + +/** + * 业务字段 数据层 + * + * @author admin + */ +public interface GenTableColumnMapper +{ + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @return 列信息 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段 + * + * @param genTableColumns 列数据 + * @return 结果 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 批量删除业务字段 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableMapper.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableMapper.java new file mode 100644 index 0000000..34a983f --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/mapper/GenTableMapper.java @@ -0,0 +1,83 @@ +package net.hzvtc.generator.mapper; + +import java.util.List; +import net.hzvtc.generator.domain.GenTable; + +/** + * 业务 数据层 + * + * @author admin + */ +public interface GenTableMapper +{ + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 新增业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int insertGenTable(GenTable genTable); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int updateGenTable(GenTable genTable); + + /** + * 批量删除业务 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableByIds(Long[] ids); +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnService.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnService.java new file mode 100644 index 0000000..b7c200a --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnService.java @@ -0,0 +1,44 @@ +package net.hzvtc.generator.service; + +import net.hzvtc.generator.domain.GenTableColumn; + +import java.util.List; + +/** + * 业务字段 服务层 + * + * @author admin + */ +public interface GenTableColumnService { + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(String ids); +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnServiceImpl.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..d6d54b0 --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableColumnServiceImpl.java @@ -0,0 +1,64 @@ +package net.hzvtc.generator.service; + +import net.hzvtc.common.core.text.Convert; +import net.hzvtc.generator.domain.GenTableColumn; +import net.hzvtc.generator.mapper.GenTableColumnMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 业务字段 服务层实现 + * + * @author admin + */ +@Service +public class GenTableColumnServiceImpl implements GenTableColumnService { + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** + * 删除业务字段对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteGenTableColumnByIds(String ids) { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableService.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableService.java new file mode 100644 index 0000000..a4b51f7 --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableService.java @@ -0,0 +1,121 @@ +package net.hzvtc.generator.service; + +import net.hzvtc.generator.domain.GenTable; + +import java.util.List; +import java.util.Map; + +/** + * 业务 服务层 + * + * @author admin + */ +public interface GenTableService { + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + * @return 结果 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + public void importGenTable(List tableList); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + public Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + public byte[] downloadCode(String tableName); + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return 数据 + */ + public void generatorCode(String tableName); + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + public void synchDb(String tableName); + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + public void validateEdit(GenTable genTable); +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableServiceImpl.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableServiceImpl.java new file mode 100644 index 0000000..5bdd24d --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/service/GenTableServiceImpl.java @@ -0,0 +1,447 @@ +package net.hzvtc.generator.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.constant.GenConstants; +import net.hzvtc.common.core.text.CharsetKit; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.generator.domain.GenTable; +import net.hzvtc.generator.domain.GenTableColumn; +import net.hzvtc.generator.mapper.GenTableColumnMapper; +import net.hzvtc.generator.mapper.GenTableMapper; +import net.hzvtc.generator.util.GenUtils; +import net.hzvtc.generator.util.VelocityInitializer; +import net.hzvtc.generator.util.VelocityUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 业务 服务层实现 + * + * @author admin + */ +@Service +public class GenTableServiceImpl implements GenTableService { + private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Resource + private GenTableMapper genTableMapper; + + @Resource + private GenTableColumnMapper genTableColumnMapper; + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) { + GenTable genTable = genTableMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + @Override + public List selectGenTableList(GenTable genTable) { + return genTableMapper.selectGenTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + @Override + public List selectDbTableList(GenTable genTable) { + return genTableMapper.selectDbTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) { + return genTableMapper.selectDbTableListByNames(tableNames); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() { + return genTableMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + @Override + @Transactional + public void updateGenTable(GenTable genTable) { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableMapper.updateGenTable(genTable); + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { + genTableColumnMapper.updateGenTableColumn(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + @Override + @Transactional + public void importGenTable(List tableList) { + String operName = SecurityUtils.getUsername(); + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableMapper.insertGenTable(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + } + } + } catch (Exception e) { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = genTableMapper.selectGenTableById(tableId); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(String tableName) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + */ + @Override + public void generatorCode(String tableName) { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } catch (IOException e) { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + @Override + @Transactional + public void synchDb(String tableName) { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) { + // 如果是列表,继续保留字典类型 + column.setDictType(prevColumn.getDictType()); + } + genTableColumnMapper.updateGenTableColumn(column); + } else { + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(String tableName, ZipOutputStream zip) { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSONObject.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { + throw new ServiceException("树编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { + throw new ServiceException("树父编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { + throw new ServiceException("树名称字段不能为空"); + } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { + if (StringUtils.isEmpty(genTable.getSubTableName())) { + throw new ServiceException("关联子表的表名不能为空"); + } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { + throw new ServiceException("子表关联的外键名不能为空"); + } + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) { + for (GenTableColumn column : table.getSubTable().getColumns()) { + if (column.isPk()) { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 设置主子表信息 + * + * @param table 业务表信息 + */ + public void setSubTable(GenTable table) { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) { + JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } +} \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/GenUtils.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/GenUtils.java new file mode 100644 index 0000000..1af72b3 --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/GenUtils.java @@ -0,0 +1,259 @@ +package net.hzvtc.generator.util; + +import java.util.Arrays; + +import net.hzvtc.common.constant.GenConstants; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.generator.domain.GenTable; +import net.hzvtc.generator.domain.GenTableColumn; +import org.apache.commons.lang3.RegExUtils; +import net.hzvtc.generator.config.GenConfig; + +/** + * 代码生成器 工具类 + * + * @author admin + */ +public class GenUtils +{ + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, String operName) + { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) + { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); + return moduleName; + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); + return businessName; + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) + { + return RegExUtils.replaceAll(text, "(?:表|AiBirdSys)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityInitializer.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityInitializer.java new file mode 100644 index 0000000..de9361b --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityInitializer.java @@ -0,0 +1,35 @@ +package net.hzvtc.generator.util; + +import java.util.Properties; + +import net.hzvtc.common.constant.Constants; +import org.apache.velocity.app.Velocity; + +/** + * VelocityEngine工厂 + * + * @author admin + */ +public class VelocityInitializer +{ + /** + * 初始化vm方法 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityUtils.java b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityUtils.java new file mode 100644 index 0000000..dda0489 --- /dev/null +++ b/ai-xuebao-generator/src/main/java/net/hzvtc/generator/util/VelocityUtils.java @@ -0,0 +1,334 @@ +package net.hzvtc.generator.util; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.constant.GenConstants; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.generator.domain.GenTable; +import net.hzvtc.generator.domain.GenTableColumn; +import org.apache.velocity.VelocityContext; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 模板处理工具类 + * + * @author admin + */ +public class VelocityUtils { + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + templates.add("vm/sql/sql.vm"); + templates.add("vm/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } else if (GenConstants.TPL_SUB.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } else if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.js.vm")) { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + String basePackage = StringUtils.substring(packageName, 0, lastIndex); + return basePackage; + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) { + dicts.add("'" + column.getDictType() + "'"); + } + } + return StringUtils.join(dicts, ", "); + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/ai-xuebao-generator/src/main/resources/generator.yml b/ai-xuebao-generator/src/main/resources/generator.yml new file mode 100644 index 0000000..d9af4bb --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/generator.yml @@ -0,0 +1,10 @@ +# 代码生成 +gen: + # 作者 + author: admin + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: net.hzvtc.system + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ai-xuebao-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..fe99aa6 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * + from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ai-xuebao-generator/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..fb098b5 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, + table_name, + table_comment, + sub_table_name, + sub_table_fk_name, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + options, + create_by, + create_time, + update_by, + update_time, + remark + from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/resources/vm/java/controller.java.vm b/ai-xuebao-generator/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..19e1cd8 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,108 @@ +package ${packageName}.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.${ClassName}Service; +import net.hzvtc.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import net.hzvtc.common.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController { + @Autowired + private ${ClassName}Service ${className}Service; + +/** + * 查询${functionName}列表 + */ +@PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") +@GetMapping("/list") + #if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } + #elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return AjaxResult.success(list); + } + #end + + /** + * 导出${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { + return AjaxResult.success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 删除${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/ai-xuebao-generator/src/main/resources/vm/java/domain.java.vm b/ai-xuebao-generator/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..1002752 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,89 @@ +package ${packageName}.domain; + +import lombok.Data; + #foreach ($import in $importList) + import ${import}; + #end +import net.hzvtc.common.annotation.Excel; + #if($table.crud || $table.sub) + #elseif($table.tree) + #end +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) + #set($Entity="BaseEntity") +#elseif($table.tree) + #set($Entity="TreeEntity") +#end +@Data +@Alias("${ClassName}") +public class ${ClassName} extends ${Entity} + { +private static final long serialVersionUID=1L; + +#foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ + #if($column.list) + #set($parentheseIndex=$column.columnComment.indexOf("(")) + #if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) + #else + #set($comment=$column.columnComment) + #end + #if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + #elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") + #else + @Excel(name = "${comment}") + #end + #end + private $column.javaType $column.javaField; + + #end +#end +#if($table.sub) +/** $table.subTable.functionName信息 */ +private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + #end +#end + +#if($table.sub) + +#end +@Override +public String toString(){ + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + #foreach ($column in $columns) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + .append("${column.javaField}",get${AttrName}()) + #end + #if($table.sub) + .append("${subclassName}List",get${subClassName}List()) + #end + .toString(); + } + } diff --git a/ai-xuebao-generator/src/main/resources/vm/java/mapper.java.vm b/ai-xuebao-generator/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..7e7d7c2 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/ai-xuebao-generator/src/main/resources/vm/java/service.java.vm b/ai-xuebao-generator/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..b29a128 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,61 @@ +package ${packageName}.service; + +import java.util.List; + +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Service { + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/ai-xuebao-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ai-xuebao-generator/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..8872184 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,162 @@ +package ${packageName}.service.impl; + +import java.util.List; + #foreach ($column in $columns) + #if($column.javaField == 'createTime' || $column.javaField == 'updateTime') + import net.hzvtc.common.utils.DateUtils; + #break + #end + #end +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + #if($table.sub) + import java.util.ArrayList; + + import net.hzvtc.common.utils.StringUtils; + import org.springframework.transaction.annotation.Transactional; + import ${packageName}.domain.${subClassName}; + #end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.${ClassName}Service; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements ${ClassName}Service { + @Resource + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int insert${ClassName}(${ClassName} ${className}) { + #foreach ($column in $columns) + #if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); + #end + #end + #if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; + #else + return ${className}Mapper.insert${ClassName}(${className}); + #end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int update${ClassName}(${ClassName} ${className}) { + #foreach ($column in $columns) + #if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); + #end + #end + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()) + ; + insert${subClassName}(${className}); + #end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) { + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); + #end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); + #end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + #if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} :${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) { + ${className}Mapper.batch${subClassName}(list); + } + } + } + #end +} diff --git a/ai-xuebao-generator/src/main/resources/vm/java/sub-domain.java.vm b/ai-xuebao-generator/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..bac332d --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,73 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import net.hzvtc.common.annotation.Excel; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/ai-xuebao-generator/src/main/resources/vm/js/api.js.vm b/ai-xuebao-generator/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/ai-xuebao-generator/src/main/resources/vm/sql/sql.vm b/ai-xuebao-generator/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..1da1f1b --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ai-xuebao-generator/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..385be92 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,482 @@ + + + diff --git a/ai-xuebao-generator/src/main/resources/vm/vue/index.vue.vm b/ai-xuebao-generator/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..6da537b --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,573 @@ + + + diff --git a/ai-xuebao-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/ai-xuebao-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..d57bbdf --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,464 @@ + + + diff --git a/ai-xuebao-generator/src/main/resources/vm/vue/v3/index.vue.vm b/ai-xuebao-generator/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..3b4929f --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,670 @@ + + + diff --git a/ai-xuebao-generator/src/main/resources/vm/vue/v3/readme.txt b/ai-xuebao-generator/src/main/resources/vm/vue/v3/readme.txt new file mode 100644 index 0000000..b2d1d6e --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +���ʹ�õ���trainning-kpi-Vue3ǰ�ˣ���ô��Ҫ����һ�´�Ŀ¼��ģ��index.vue.vm��index-tree.vue.vm�ļ����ϼ�vueĿ¼�� \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.old.vm b/ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.old.vm new file mode 100644 index 0000000..6364a9d --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.old.vm @@ -0,0 +1,136 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.vm b/ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..2440833 --- /dev/null +++ b/ai-xuebao-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,159 @@ + + + + + + #foreach ($column in $columns) + + #end + + #if($table.sub) + + + + + + + #foreach ($column in $subTable.columns) + + #end + + #end + + + select * + from ${tableName} + + + + + + + + insert into ${tableName} + ( + #foreach($column in $columns) + #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, + #end + #end + ) values ( + #foreach($column in $columns) + #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, + #end + #end + ) + + + + update ${tableName} + set + #foreach($column in $columns) + #if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, + #end + #end + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete + from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + + #if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete + from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName} + (#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()) + ,#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField + }#if($foreach.count != $subTable.columns.size()),#end#end) + + + #end + \ No newline at end of file diff --git a/ai-xuebao-quartz/pom.xml b/ai-xuebao-quartz/pom.xml new file mode 100644 index 0000000..3200045 --- /dev/null +++ b/ai-xuebao-quartz/pom.xml @@ -0,0 +1,42 @@ + + + + aibird + net.hzvtc + 1.2.0 + + 4.0.0 + + ai-xuebao-quartz + + + quartz定时任务 + + + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + net.hzvtc + ai-xuebao-common + + + net.hzvtc + ai-xuebao-system + + + \ No newline at end of file diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/config/ScheduleConfig.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/config/ScheduleConfig.java new file mode 100644 index 0000000..a494c13 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/config/ScheduleConfig.java @@ -0,0 +1,57 @@ +package net.hzvtc.quartz.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import javax.sql.DataSource; +import java.util.Properties; + +/** + * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) + * + * @author admin + */ +@Configuration +public class ScheduleConfig +{ + @Bean + public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) + { + SchedulerFactoryBean factory = new SchedulerFactoryBean(); + factory.setDataSource(dataSource); + + // quartz参数 + Properties prop = new Properties(); + prop.put("org.quartz.scheduler.instanceName", "AiBirdSysScheduler"); + prop.put("org.quartz.scheduler.instanceId", "AUTO"); + // 线程池配置 + prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); + prop.put("org.quartz.threadPool.threadCount", "20"); + prop.put("org.quartz.threadPool.threadPriority", "5"); + // JobStore配置 + prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); + // 集群配置 + prop.put("org.quartz.jobStore.isClustered", "true"); + prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); + prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); + prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); + + // sqlserver 启用 + // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); + prop.put("org.quartz.jobStore.misfireThreshold", "12000"); + prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); + factory.setQuartzProperties(prop); + + factory.setSchedulerName("AiBirdSysScheduler"); + // 延时启动 + factory.setStartupDelay(1); + factory.setApplicationContextSchedulerContextKey("applicationContextKey"); + // 可选,QuartzScheduler + // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 + factory.setOverwriteExistingJobs(true); + // 设置自动启动,默认为true + factory.setAutoStartup(true); + + return factory; + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobController.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobController.java new file mode 100644 index 0000000..003afd4 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobController.java @@ -0,0 +1,158 @@ +package net.hzvtc.quartz.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.exception.job.TaskException; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.quartz.domain.SysJob; +import net.hzvtc.quartz.service.SysJobService; +import net.hzvtc.quartz.util.CronUtils; +import net.hzvtc.quartz.util.ScheduleUtils; +import net.hzvtc.web.stat.service.SpeciesDailyStatService; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 调度任务信息操作处理 + * + * @author admin + */ +@RestController +@RequestMapping("/monitor/job") +public class SysJobController extends BaseController { + @Autowired + private SysJobService jobService; + + @Autowired + private SpeciesDailyStatService speciesDailyStatService; + + /** + * 查询定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJob sysJob) { + startPage(); + List list = jobService.selectJobList(sysJob); + return getDataTable(list); + } + + /** + * 导出定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "定时任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJob sysJob) { + List list = jobService.selectJobList(sysJob); + ExcelUtil util = new ExcelUtil(SysJob.class); + util.exportExcel(response, list, "定时任务"); + } + + /** + * 获取定时任务详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) { + return AjaxResult.success(jobService.selectJobById(jobId)); + } + + /** + * 新增定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:add')") + @Log(title = "定时任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException { + if (!CronUtils.isValid(job.getCronExpression())) { + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS})) { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.HTTP, Constants.HTTPS})) { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setCreateBy(getUsername()); + return toAjax(jobService.insertJob(job)); + } + + /** + * 修改定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException { + if (!CronUtils.isValid(job.getCronExpression())) { + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS})) { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.HTTP, Constants.HTTPS})) { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setUpdateBy(getUsername()); + return toAjax(jobService.updateJob(job)); + } + + /** + * 定时任务状态修改 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException { + SysJob newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toAjax(jobService.changeStatus(newJob)); + } + + /** + * 定时任务立即执行一次 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody SysJob job) throws SchedulerException { + jobService.run(job); + return AjaxResult.success(); + } + + /** + * 删除定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException { + jobService.deleteJobByIds(jobIds); + return AjaxResult.success(); + } + + @GetMapping("/doAllStatTask") + public AjaxResult doAllStatTask() { + speciesDailyStatService.calculateAllResultRecord(); + return AjaxResult.success(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobLogController.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobLogController.java new file mode 100644 index 0000000..edff2ae --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/controller/SysJobLogController.java @@ -0,0 +1,82 @@ +package net.hzvtc.quartz.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.quartz.domain.SysJobLog; +import net.hzvtc.quartz.service.SysJobLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 调度日志操作处理 + * + * @author admin + */ +@RestController +@RequestMapping("/monitor/jobLog") +public class SysJobLogController extends BaseController { + @Autowired + private SysJobLogService jobLogService; + + /** + * 查询定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJobLog sysJobLog) { + startPage(); + List list = jobLogService.selectJobLogList(sysJobLog); + return getDataTable(list); + } + + /** + * 导出定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "任务调度日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJobLog sysJobLog) { + List list = jobLogService.selectJobLogList(sysJobLog); + ExcelUtil util = new ExcelUtil(SysJobLog.class); + util.exportExcel(response, list, "调度日志"); + } + + /** + * 根据调度编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long jobLogId) { + return AjaxResult.success(jobLogService.selectJobLogById(jobLogId)); + } + + + /** + * 删除定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobLogIds}") + public AjaxResult remove(@PathVariable Long[] jobLogIds) { + return toAjax(jobLogService.deleteJobLogByIds(jobLogIds)); + } + + /** + * 清空定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "调度日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() { + jobLogService.cleanJobLog(); + return AjaxResult.success(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJob.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJob.java new file mode 100644 index 0000000..d3aee3b --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJob.java @@ -0,0 +1,172 @@ +package net.hzvtc.quartz.domain; + +import java.util.Date; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import net.hzvtc.common.constant.ScheduleConstants; +import net.hzvtc.common.core.domain.BaseEntity; +import net.hzvtc.common.utils.StringUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonFormat; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.annotation.Excel.ColumnType; +import net.hzvtc.quartz.util.CronUtils; + +/** + * 定时任务调度表 sys_job + * + * @author admin + */ +public class SysJob extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @Excel(name = "任务序号", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** cron执行表达式 */ + @Excel(name = "执行表达式 ") + private String cronExpression; + + /** cron计划策略 */ + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 是否并发执行(0允许 1禁止) */ + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + private String concurrent; + + /** 任务状态(0正常 1暂停) */ + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + private String status; + + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "调用目标字符串不能为空") + @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符") + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJobLog.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJobLog.java new file mode 100644 index 0000000..dc8857c --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/domain/SysJobLog.java @@ -0,0 +1,156 @@ +package net.hzvtc.quartz.domain; + +import java.util.Date; + +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import net.hzvtc.common.annotation.Excel; + +/** + * 定时任务调度日志表 sys_job_log + * + * @author admin + */ +public class SysJobLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "日志序号") + private Long jobLogId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** 日志信息 */ + @Excel(name = "日志信息") + private String jobMessage; + + /** 执行状态(0正常 1失败) */ + @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败") + private String status; + + /** 异常信息 */ + @Excel(name = "异常信息") + private String exceptionInfo; + + /** 开始时间 */ + private Date startTime; + + /** 停止时间 */ + private Date stopTime; + + public Long getJobLogId() + { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) + { + this.jobLogId = jobLogId; + } + + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() + { + return jobMessage; + } + + public void setJobMessage(String jobMessage) + { + this.jobMessage = jobMessage; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getExceptionInfo() + { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) + { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStopTime() + { + return stopTime; + } + + public void setStopTime(Date stopTime) + { + this.stopTime = stopTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("stopTime", getStopTime()) + .toString(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobLogMapper.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobLogMapper.java new file mode 100644 index 0000000..2393d56 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobLogMapper.java @@ -0,0 +1,64 @@ +package net.hzvtc.quartz.mapper; + +import java.util.List; +import net.hzvtc.quartz.domain.SysJobLog; + +/** + * 调度任务日志信息 数据层 + * + * @author admin + */ +public interface SysJobLogMapper +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 查询所有调度任务日志 + * + * @return 调度任务日志列表 + */ + public List selectJobLogAll(); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + * @return 结果 + */ + public int insertJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobMapper.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobMapper.java new file mode 100644 index 0000000..1195c63 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/mapper/SysJobMapper.java @@ -0,0 +1,67 @@ +package net.hzvtc.quartz.mapper; + +import java.util.List; +import net.hzvtc.quartz.domain.SysJob; + +/** + * 调度任务信息 数据层 + * + * @author admin + */ +public interface SysJobMapper +{ + /** + * 查询调度任务日志集合 + * + * @param job 调度信息 + * @return 操作日志集合 + */ + public List selectJobList(SysJob job); + + /** + * 查询所有调度任务 + * + * @return 调度任务列表 + */ + public List selectJobAll(); + + /** + * 通过调度ID查询调度任务信息 + * + * @param jobId 调度ID + * @return 角色对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 通过调度ID删除调度任务信息 + * + * @param jobId 调度ID + * @return 结果 + */ + public int deleteJobById(Long jobId); + + /** + * 批量删除调度任务信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 修改调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int updateJob(SysJob job); + + /** + * 新增调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int insertJob(SysJob job); +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobLogService.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobLogService.java new file mode 100644 index 0000000..78f305f --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobLogService.java @@ -0,0 +1,56 @@ +package net.hzvtc.quartz.service; + +import net.hzvtc.quartz.domain.SysJobLog; + +import java.util.List; + +/** + * 定时任务调度日志信息信息 服务层 + * + * @author admin + */ +public interface SysJobLogService { + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + public void addJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的日志ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobService.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobService.java new file mode 100644 index 0000000..ded3ae7 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/SysJobService.java @@ -0,0 +1,102 @@ +package net.hzvtc.quartz.service; + +import net.hzvtc.common.exception.job.TaskException; +import net.hzvtc.quartz.domain.SysJob; +import org.quartz.SchedulerException; + +import java.util.List; + +/** + * 定时任务调度信息信息 服务层 + * + * @author admin + */ +public interface SysJobService { + /** + * 获取quartz调度器的计划任务 + * + * @param job 调度信息 + * @return 调度任务集合 + */ + public List selectJobList(SysJob job); + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 暂停任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int pauseJob(SysJob job) throws SchedulerException; + + /** + * 恢复任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int resumeJob(SysJob job) throws SchedulerException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(SysJob job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(SysJob job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public void run(SysJob job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobLogServiceImpl.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 0000000..fbbacaa --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,81 @@ +package net.hzvtc.quartz.service.impl; + +import net.hzvtc.quartz.domain.SysJobLog; +import net.hzvtc.quartz.mapper.SysJobLogMapper; +import net.hzvtc.quartz.service.SysJobLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 定时任务调度日志信息 服务层 + * + * @author admin + */ +@Service +public class SysJobLogServiceImpl implements SysJobLogService { + @Autowired + private SysJobLogMapper jobLogMapper; + + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + @Override + public List selectJobLogList(SysJobLog jobLog) { + return jobLogMapper.selectJobLogList(jobLog); + } + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + @Override + public SysJobLog selectJobLogById(Long jobLogId) { + return jobLogMapper.selectJobLogById(jobLogId); + } + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + @Override + public void addJobLog(SysJobLog jobLog) { + jobLogMapper.insertJobLog(jobLog); + } + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteJobLogByIds(Long[] logIds) { + return jobLogMapper.deleteJobLogByIds(logIds); + } + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + */ + @Override + public int deleteJobLogById(Long jobId) { + return jobLogMapper.deleteJobLogById(jobId); + } + + /** + * 清空任务日志 + */ + @Override + public void cleanJobLog() { + jobLogMapper.cleanJobLog(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobServiceImpl.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobServiceImpl.java new file mode 100644 index 0000000..3e19921 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/service/impl/SysJobServiceImpl.java @@ -0,0 +1,230 @@ +package net.hzvtc.quartz.service.impl; + +import net.hzvtc.common.constant.ScheduleConstants; +import net.hzvtc.common.exception.job.TaskException; +import net.hzvtc.quartz.domain.SysJob; +import net.hzvtc.quartz.mapper.SysJobMapper; +import net.hzvtc.quartz.service.SysJobService; +import net.hzvtc.quartz.util.CronUtils; +import net.hzvtc.quartz.util.ScheduleUtils; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * 定时任务调度信息 服务层 + * + * @author admin + */ +@Service +public class SysJobServiceImpl implements SysJobService { + @Autowired + private Scheduler scheduler; + + @Autowired + private SysJobMapper jobMapper; + + /** + * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) + */ + @PostConstruct + public void init() throws SchedulerException, TaskException { + scheduler.clear(); + List jobList = jobMapper.selectJobAll(); + for (SysJob job : jobList) { + ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 获取quartz调度器的计划任务列表 + * + * @param job 调度信息 + * @return + */ + @Override + public List selectJobList(SysJob job) { + return jobMapper.selectJobList(job); + } + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + @Override + public SysJob selectJobById(Long jobId) { + return jobMapper.selectJobById(jobId); + } + + /** + * 暂停任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int pauseJob(SysJob job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(SysJob job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(SysJob job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Long[] jobIds) throws SchedulerException { + for (Long jobId : jobIds) { + SysJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(SysJob job) throws SchedulerException { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) { + rows = resumeJob(job); + } else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void run(SysJob job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + SysJob properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap); + } + + /** + * 新增任务 + * + * @param job 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(SysJob job) throws SchedulerException, TaskException { + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(SysJob job) throws SchedulerException, TaskException { + SysJob properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) { + return CronUtils.isValid(cronExpression); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/BirdLeaveArriveCalcYearTask.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/BirdLeaveArriveCalcYearTask.java new file mode 100644 index 0000000..743872c --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/BirdLeaveArriveCalcYearTask.java @@ -0,0 +1,16 @@ +package net.hzvtc.quartz.task; + +import net.hzvtc.bird.service.BirdLeaveArriveInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("birdLeaveArriveCalcYearTask") +public class BirdLeaveArriveCalcYearTask { + @Autowired + private BirdLeaveArriveInfoService birdLeaveArriveInfoService; + + public void calc() { + birdLeaveArriveInfoService.calcBirdLeaveArriveInfoByParam(); + } + +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DemoTask.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DemoTask.java new file mode 100644 index 0000000..4f993da --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DemoTask.java @@ -0,0 +1,24 @@ +package net.hzvtc.quartz.task; + +import net.hzvtc.common.utils.StringUtils; +import org.springframework.stereotype.Component; + +/** + * 定时任务调度测试 + * + * @author admin + */ +@Component("demoTask") +public class DemoTask { + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) { + System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); + } + + public void ryParams(String params) { + System.out.println("执行有参方法:" + params); + } + + public void ryNoParams() { + System.out.println("执行无参方法"); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DeviceConnectionTask.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DeviceConnectionTask.java new file mode 100644 index 0000000..9c1dc90 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/DeviceConnectionTask.java @@ -0,0 +1,15 @@ +package net.hzvtc.quartz.task; + +import net.hzvtc.device.service.DeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("DeviceConnectionTask") +public class DeviceConnectionTask { + @Autowired + private DeviceInfoService deviceInfoService; + + public void checkDeviceConnection() { + deviceInfoService.updateDeviceConnectState(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/EmailTask.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/EmailTask.java new file mode 100644 index 0000000..cc47cc8 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/EmailTask.java @@ -0,0 +1,20 @@ +package net.hzvtc.quartz.task; + +import net.hzvtc.data.check.service.ResultRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("emailTask") +public class EmailTask { + @Autowired + private ResultRecordService resultRecordService; + + public void sendDailyStatReportEmail() { + resultRecordService.sendBirdDataStatEmail(); + } + + public void sendWeeklyStatReportEmail() { + resultRecordService.sendBirdDataWeeklyStatEmail(); + } + +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/LevelOneSpeciesDailyTask.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/LevelOneSpeciesDailyTask.java new file mode 100644 index 0000000..af11116 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/LevelOneSpeciesDailyTask.java @@ -0,0 +1,21 @@ +package net.hzvtc.quartz.task; + +import net.hzvtc.area.service.SpeciesAbnormalInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +//国家1类保护动物 +@Component("levelOneSpeciesDailyTask") +public class LevelOneSpeciesDailyTask { + @Autowired + private SpeciesAbnormalInfoService speciesAbnormalInfoService; + + public void getAllLevelOneSpeciesResult() { + speciesAbnormalInfoService.getAllLevelOneSpecieResult(); + } + + public void getDailyLevelOneSpeciesResult() { +// speciesAbnormalInfoService.getDailyLevelOneSpecieResult(); + speciesAbnormalInfoService.getSpeciesAbnormalInfoListForJob(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/ResultRecordDailyStatTask.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/ResultRecordDailyStatTask.java new file mode 100644 index 0000000..b61b760 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/ResultRecordDailyStatTask.java @@ -0,0 +1,19 @@ +package net.hzvtc.quartz.task; + +import net.hzvtc.web.stat.service.SpeciesDailyStatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("resultRecordDailyStatTask") +public class ResultRecordDailyStatTask { + @Autowired + private SpeciesDailyStatService speciesDailyStatService; + + public void doDailyStatTask() { + speciesDailyStatService.calculateDailyResultRecord(null); + } + + public void doAllStatTask() { + speciesDailyStatService.calculateAllResultRecord(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/SpeciesWinterPeriodStatTask.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/SpeciesWinterPeriodStatTask.java new file mode 100644 index 0000000..e88a72b --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/task/SpeciesWinterPeriodStatTask.java @@ -0,0 +1,15 @@ +package net.hzvtc.quartz.task; + +import net.hzvtc.web.stat.service.SpeciesWinterPeriodService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("speciesWinterPeriodStatTask") +public class SpeciesWinterPeriodStatTask { + @Autowired + private SpeciesWinterPeriodService speciesWinterPeriodService; + + public void doTask() { + speciesWinterPeriodService.calcSpeciesWinterPeriodByParam(); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/AbstractQuartzJob.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/AbstractQuartzJob.java new file mode 100644 index 0000000..56bdae6 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/AbstractQuartzJob.java @@ -0,0 +1,97 @@ +package net.hzvtc.quartz.util; + +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.constant.ScheduleConstants; +import net.hzvtc.common.utils.ExceptionUtil; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanUtils; +import net.hzvtc.common.utils.spring.SpringUtils; +import net.hzvtc.quartz.domain.SysJob; +import net.hzvtc.quartz.domain.SysJobLog; +import net.hzvtc.quartz.service.SysJobLogService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; + +/** + * 抽象quartz调用 + * + * @author admin + */ +public abstract class AbstractQuartzJob implements Job { + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + SysJob sysJob = new SysJob(); + BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + try { + before(context, sysJob); + if (sysJob != null) { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } catch (Exception e) { + log.error("任务执行异常 - :", e); + after(context, sysJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void before(JobExecutionContext context, SysJob sysJob) { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); + sysJobLog.setStartTime(startTime); + sysJobLog.setStopTime(new Date()); + long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) { + sysJobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } else { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(SysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/CronUtils.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/CronUtils.java new file mode 100644 index 0000000..2c98ddc --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/CronUtils.java @@ -0,0 +1,63 @@ +package net.hzvtc.quartz.util; + +import java.text.ParseException; +import java.util.Date; +import org.quartz.CronExpression; + +/** + * cron表达式工具类 + * + * @author admin + * + */ +public class CronUtils +{ + /** + * 返回一个布尔值代表一个给定的Cron表达式的有效性 + * + * @param cronExpression Cron表达式 + * @return boolean 表达式是否有效 + */ + public static boolean isValid(String cronExpression) + { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/JobInvokeUtil.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/JobInvokeUtil.java new file mode 100644 index 0000000..c949bdc --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/JobInvokeUtil.java @@ -0,0 +1,182 @@ +package net.hzvtc.quartz.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.spring.SpringUtils; +import net.hzvtc.quartz.domain.SysJob; + +/** + * 任务执行工具 + * + * @author admin + */ +public class JobInvokeUtil +{ + /** + * 执行方法 + * + * @param sysJob 系统任务 + */ + public static void invokeMethod(SysJob sysJob) throws Exception + { + String invokeTarget = sysJob.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) + { + Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getDeclaredMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,以'或"开头 + if (StringUtils.startsWithAny(str, "'", "\"")) + { + classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); + } + // boolean布尔类型,等于true或者false + else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,以L结尾 + else if (StringUtils.endsWith(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); + } + // double浮点类型,以D结尾 + else if (StringUtils.endsWith(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); + } + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzDisallowConcurrentExecution.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000..fe748e3 --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,21 @@ +package net.hzvtc.quartz.util; + +import net.hzvtc.quartz.domain.SysJob; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; + +/** + * 定时任务处理(禁止并发执行) + * + * @author admin + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzJobExecution.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzJobExecution.java new file mode 100644 index 0000000..07b922d --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/QuartzJobExecution.java @@ -0,0 +1,19 @@ +package net.hzvtc.quartz.util; + +import net.hzvtc.quartz.domain.SysJob; +import org.quartz.JobExecutionContext; + +/** + * 定时任务处理(允许并发执行) + * + * @author admin + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/ScheduleUtils.java b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/ScheduleUtils.java new file mode 100644 index 0000000..590204c --- /dev/null +++ b/ai-xuebao-quartz/src/main/java/net/hzvtc/quartz/util/ScheduleUtils.java @@ -0,0 +1,134 @@ +package net.hzvtc.quartz.util; + +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.constant.ScheduleConstants; +import net.hzvtc.common.exception.job.TaskException; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.quartz.domain.SysJob; +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; + +/** + * 定时任务工具类 + * + * @author admin + * + */ +public class ScheduleUtils +{ + /** + * 得到quartz任务类 + * + * @param sysJob 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(SysJob sysJob) + { + boolean isConcurrent = "0".equals(sysJob.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException + { + Class jobClass = getQuartzJobClass(job); + // 构建job信息 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + scheduler.scheduleJob(jobDetail, trigger); + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", TaskException.Code.CONFIG_ERROR); + } + } + + /** + * 检查包名是否为白名单配置 + * + * @param invokeTarget 目标字符串 + * @return 结果 + */ + public static boolean whiteList(String invokeTarget) + { + String packageName = StringUtils.substringBefore(invokeTarget, "("); + int count = StringUtils.countMatches(packageName, "."); + if (count > 1) + { + if (!StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR)) + { + return false; + } + } + return true; + } +} diff --git a/ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml b/ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml new file mode 100644 index 0000000..9c62072 --- /dev/null +++ b/ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + select job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + from sys_job_log + + + + + + + + + + delete + from sys_job_log + where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml b/ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml new file mode 100644 index 0000000..ac03dd7 --- /dev/null +++ b/ai-xuebao-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark + from sys_job + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ai-xuebao-system/pom.xml b/ai-xuebao-system/pom.xml new file mode 100644 index 0000000..7f59a94 --- /dev/null +++ b/ai-xuebao-system/pom.xml @@ -0,0 +1,78 @@ + + + + aibird + net.hzvtc + 1.2.0 + + 4.0.0 + + ai-xuebao-system + + + system系统模块 + + + + + org.springframework.boot + spring-boot-starter-websocket + 3.2.1 + + + org.springframework.kafka + spring-kafka + 2.8.11 + + + net.hzvtc + ai-xuebao-common + + + org.projectlombok + lombok + 1.18.20 + provided + + + com.sun.mail + javax.mail + 1.6.2 + + + + io.swagger + swagger-annotations + 1.6.2 + compile + + + org.apache.poi + poi-ooxml + 5.2.2 + + + org.apache.poi + ooxml-schemas + 1.4 + + + org.onvif + onvif-java-lib + 0.0.1-SNAPSHOT + + + org.apache.httpcomponents + httpclient + 4.5.14 + + + org.apache.httpcomponents + httpmime + 4.5.14 + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/app/domain/AppUpgrade.java b/ai-xuebao-system/src/main/java/net/hzvtc/app/domain/AppUpgrade.java new file mode 100644 index 0000000..3ad8b18 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/app/domain/AppUpgrade.java @@ -0,0 +1,113 @@ +package net.hzvtc.app.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * app在线更新对象 app_upgrade + * + * @author admin + * @date 2023-05-19 + */ +@Data +@Alias("AppUpgrade") +public class AppUpgrade { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 代码 + */ + @Excel(name = "代码") + private int code; + + /** + * 更新状态 + */ + @Excel(name = "更新状态") + private int updateStatus; + + /** + * 版本代码 + */ + @Excel(name = "版本代码") + private int versionCode; + + /** + * 版本名称 + */ + @Excel(name = "版本名称") + private String versionName; + + /** + * 上传时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "上传时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date uploadTime; + + /** + * 更新内容 + */ + @Excel(name = "更新内容") + private String modifyContent; + + /** + * 下载链接 + */ + @Excel(name = "下载链接") + private String downloadUrl; + + /** + * 文件大小 + */ + @Excel(name = "文件大小") + private int apkSize; + + /** + * md5值 + */ + @Excel(name = "md5值") + private String apkMd5; + + /** + * 消息 + */ + @Excel(name = "消息") + private String msg; + + /** + * 是否删除 + */ + @Excel(name = "是否删除") + private int isDeleted; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("code", getCode()) + .append("updateStatus", getUpdateStatus()) + .append("versionCode", getVersionCode()) + .append("versionName", getVersionName()) + .append("uploadTime", getUploadTime()) + .append("modifyContent", getModifyContent()) + .append("downloadUrl", getDownloadUrl()) + .append("apkSize", getApkSize()) + .append("apkMd5", getApkMd5()) + .append("msg", getMsg()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/app/mapper/AppUpgradeMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/app/mapper/AppUpgradeMapper.java new file mode 100644 index 0000000..bdde1c3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/app/mapper/AppUpgradeMapper.java @@ -0,0 +1,7 @@ +package net.hzvtc.app.mapper; + +import net.hzvtc.app.domain.AppUpgrade; + +public interface AppUpgradeMapper { + AppUpgrade getLastAppUpgradeInfo(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/app/service/AppUpgradeService.java b/ai-xuebao-system/src/main/java/net/hzvtc/app/service/AppUpgradeService.java new file mode 100644 index 0000000..21e6f5a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/app/service/AppUpgradeService.java @@ -0,0 +1,7 @@ +package net.hzvtc.app.service; + +import net.hzvtc.app.domain.AppUpgrade; + +public interface AppUpgradeService { + AppUpgrade getLastAppUpgradeInfo(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/app/service/impl/AppUpgradeServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/app/service/impl/AppUpgradeServiceImpl.java new file mode 100644 index 0000000..51a895f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/app/service/impl/AppUpgradeServiceImpl.java @@ -0,0 +1,32 @@ +package net.hzvtc.app.service.impl; + +import net.hzvtc.app.domain.AppUpgrade; +import net.hzvtc.app.mapper.AppUpgradeMapper; +import net.hzvtc.app.service.AppUpgradeService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class AppUpgradeServiceImpl implements AppUpgradeService { + @Resource + private AppUpgradeMapper appUpgradeMapper; + + @Override + public AppUpgrade getLastAppUpgradeInfo() { + AppUpgrade data = appUpgradeMapper.getLastAppUpgradeInfo(); +// JSONObject obj = new JSONObject(); +// obj.put("Code", data.getCode()); +// obj.put("Msg", data.getMsg()); +// obj.put("UpdateStatus", data.getUpdateStatus()); +// obj.put("VersionCode", data.getVersionCode()); +// obj.put("VersionName", data.getVersionName()); +// obj.put("UploadTime", data.getUploadTime()); +// obj.put("ModifyContent", data.getModifyContent()); +// obj.put("DownloadUrl", data.getDownloadUrl()); +// obj.put("ApkSize", data.getApkSize()); +// obj.put("ApkMd5", data.getApkMd5()); +// System.out.println(obj.get("ModifyContent")); + return data; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaController.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaController.java new file mode 100644 index 0000000..eab1c1d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaController.java @@ -0,0 +1,147 @@ +package net.hzvtc.area.controller; + +import net.hzvtc.area.domain.ProtectedArea; +import net.hzvtc.area.service.ProtectedAreaService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.file.FileUploadUtils; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Set; + +/** + * 保护区Controller + * + * @author admin + * @date 2022-07-20 + */ +@RestController +@RequestMapping("/area/protectedArea") +public class ProtectedAreaController extends BaseController { + @Autowired + private ProtectedAreaService protectedAreaService; + + @GetMapping("/listForPortal") + public AjaxResult getProtectedAreaListForPortal() { + return AjaxResult.success(protectedAreaService.getProtectedAreaListForPortal()); + } + + /** + * 查询保护区列表 + */ +// @PreAuthorize("@ss.hasPermi('area:protectedArea:list')") + @GetMapping("/list") + public TableDataInfo list(ProtectedArea protectedArea) { + startPage(); + List list = protectedAreaService.selectProtectedAreaList(protectedArea); + return getDataTable(list); + } + + /** + * 导出保护区列表 + */ + @PreAuthorize("@ss.hasPermi('area:protectedArea:export')") + @Log(title = "保护区", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProtectedArea protectedArea) { + List list = protectedAreaService.selectProtectedAreaList(protectedArea); + ExcelUtil util = new ExcelUtil(ProtectedArea.class); + util.exportExcel(response, list, "保护区数据"); + } + + @GetMapping("/treeList") + public AjaxResult getTreeList() { + return AjaxResult.success(protectedAreaService.getProtectedAreaTreeList()); + } + + /** + * 获取保护区详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + if (checkAreaIsLegal(id)) { + return AjaxResult.success(protectedAreaService.selectProtectedAreaById(id)); + } else { + return AjaxResult.error(403, "非法访问未授权的保护区数据,请联系管理员开通权限!"); + } + } + + private boolean checkAreaIsLegal(Long areaId) { + if (SecurityUtils.getLoginUser().getUser().isAdmin()) { + return true; + } + Set ids = SecurityUtils.getLoginUser().getAreaIds(); + if (ids == null || ids.size() == 0) { + return false; + } else { + return ids.contains(areaId); + } + } + + /** + * 新增保护区 + */ + @PreAuthorize("@ss.hasPermi('area:protectedArea:add')") + @Log(title = "保护区", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProtectedArea protectedArea) { + return toAjax(protectedAreaService.insertProtectedArea(protectedArea)); + } + + /** + * 修改保护区 + */ + @PreAuthorize("@ss.hasPermi('area:protectedArea:edit')") + @Log(title = "保护区", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProtectedArea protectedArea) { + return toAjax(protectedAreaService.updateProtectedArea(protectedArea)); + } + + /** + * 删除保护区 + */ + @PreAuthorize("@ss.hasPermi('area:protectedArea:remove')") + @Log(title = "保护区", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(protectedAreaService.deleteProtectedAreaByIds(ids)); + } + + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil<>(ProtectedArea.class); + List list = util.importExcel(file.getInputStream()); + String message = protectedAreaService.importData(list, updateSupport); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(ProtectedArea.class); + util.importTemplateExcel(response, "保护区信息"); + } + + @PostMapping("/upload") + public AjaxResult uploadFile(MultipartFile file) { + + String baseDir = FileUploadUtils.getDefaultBaseDir() + "/" + "bgimg" + "/" + SecurityUtils.getDeptId(); + try { + String filePath = FileUploadUtils.upload(baseDir, file); + return AjaxResult.success(filePath); + } catch (Exception ex) { + ex.printStackTrace(); + return AjaxResult.error(ex.getMessage()); + } + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaSpeciesController.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaSpeciesController.java new file mode 100644 index 0000000..7df5449 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedAreaSpeciesController.java @@ -0,0 +1,156 @@ +package net.hzvtc.area.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.area.domain.ProtectedAreaSpecies; +import net.hzvtc.area.service.ProtectedAreaSpeciesService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.data.check.service.ResultRecordDetailsService; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 保护区物种Controller + * + * @author admin + * @date 2022-07-20 + */ +@Slf4j +@RestController +@RequestMapping("/area/areaSpecies") +public class ProtectedAreaSpeciesController extends BaseController { + @Autowired + private ProtectedAreaSpeciesService protectedAreaSpeciesService; + @Autowired + private ResultRecordDetailsService resultRecordDetailsService; + + /** + * 查询保护区物种列表 + */ + @PreAuthorize("@ss.hasPermi('area:areaSpecies:list')") + @GetMapping("/list") + public TableDataInfo list(ProtectedAreaSpecies protectedAreaSpecies) { + startPage(); + List list = protectedAreaSpeciesService.selectProtectedAreaSpeciesList(protectedAreaSpecies); + return getDataTable(list); + } + + /** + * 导出保护区物种列表 + */ + @PreAuthorize("@ss.hasPermi('area:areaSpecies:export')") + @Log(title = "保护区物种", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProtectedAreaSpecies protectedAreaSpecies) { + List list = protectedAreaSpeciesService.selectProtectedAreaSpeciesList(protectedAreaSpecies); + ExcelUtil util = new ExcelUtil(ProtectedAreaSpecies.class); + util.exportExcel(response, list, "保护区物种数据"); + } + + /** + * 获取保护区物种详细信息 + */ + @PreAuthorize("@ss.hasPermi('area:areaSpecies:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(protectedAreaSpeciesService.selectProtectedAreaSpeciesById(id)); + } + + /** + * 新增保护区物种 + */ + @PreAuthorize("@ss.hasPermi('area:areaSpecies:add')") + @Log(title = "保护区物种", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProtectedAreaSpecies protectedAreaSpecies) { + return toAjax(protectedAreaSpeciesService.batchInsertProtectedAreaSpecies(protectedAreaSpecies)); + } + + /** + * 修改保护区物种 + */ + @PreAuthorize("@ss.hasPermi('area:areaSpecies:edit')") + @Log(title = "保护区物种", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProtectedAreaSpecies protectedAreaSpecies) { + return toAjax(protectedAreaSpeciesService.updateProtectedAreaSpecies(protectedAreaSpecies)); + } + + /** + * 删除保护区物种 + */ + @PreAuthorize("@ss.hasPermi('area:areaSpecies:remove')") + @Log(title = "保护区物种", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(protectedAreaSpeciesService.deleteProtectedAreaSpeciesByIds(ids)); + } + + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil<>(ProtectedAreaSpecies.class); + List list = util.importExcel(file.getInputStream()); + String message = protectedAreaSpeciesService.importData(list, updateSupport); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(ProtectedAreaSpecies.class); + util.importTemplateExcel(response, "保护区鸟类信息"); + } + + @PostMapping("/listSpeciesByParam") + public AjaxResult getSpeciesListByAreacode(@RequestBody JSONObject obj) { + return AjaxResult.success(protectedAreaSpeciesService.getProtectedAreaSpeciesListByParam(obj)); + } + + @PostMapping("/querySpeciesByQuery") + public TableDataInfo querySpeciesListByQuery(@RequestBody JSONObject obj) { +// Integer pageNum = obj.getInteger("pageNum"); +// Integer pageSize = obj.getInteger("pageSize"); +// startPage(pageNum, pageSize); + // List list = protectedAreaSpeciesService.getProtectedAreaSpeciesByQuery(obj); + return protectedAreaSpeciesService.getProtectedAreaSpeciesByQuery(obj); + } + + @PostMapping("/querySpeciesByParam") + public TableDataInfo getBirdResultMediasByParam(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + Integer pageSize = params.getInteger("pageSize"); + startPage(pageNum, pageSize); + List list = resultRecordDetailsService.querySpeciesRecordListByParam(params); + return getDataTable(list); + } + + @PostMapping("/queryVideoListByParam") + public TableDataInfo getBirdVidelByParam(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + Integer pageSize = params.getInteger("pageSize"); + startPage(pageNum, pageSize); + List list = resultRecordDetailsService.getResultMediaVideoListByParam(params); + return getDataTable(list); + } + + @PostMapping("/areaSpeciesByParam") + public AjaxResult getProtectedAreaSpeciesByParam(@RequestBody JSONObject params) { + return AjaxResult.success(protectedAreaSpeciesService.getProtectedAreaSpeciesListByParams(params)); + } + + @PostMapping("/changeSpeciesInArea") + public AjaxResult changeProtectedAreaSpeciesByParam(@RequestBody JSONObject params) { + return AjaxResult.success(protectedAreaSpeciesService.changeProtectedAreaSpeciesByParam(params)); + } + +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedCareSpeciesController.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedCareSpeciesController.java new file mode 100644 index 0000000..85e3c05 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/ProtectedCareSpeciesController.java @@ -0,0 +1,58 @@ +package net.hzvtc.area.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.ProtectedCareSpecies; +import net.hzvtc.area.service.ProtectedCareSpeciesService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.enums.BusinessType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + * 保护区关注鸟类Controller + * + * @author admin + * @date 2023-08-16 + */ +@RestController +@RequestMapping("/area/care") +public class ProtectedCareSpeciesController extends BaseController { + @Autowired + private ProtectedCareSpeciesService protectedCareSpeciesService; + + /** + * 查询保护区关注鸟类列表 + */ + @PostMapping("/list") + public AjaxResult list(@RequestBody JSONObject params) { + return AjaxResult.success(protectedCareSpeciesService.selectProtectedCareSpeciesList(params)); + } + + /** + * 获取保护区关注鸟类详细信息 + */ + @PreAuthorize("@ss.hasPermi('area:care:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(protectedCareSpeciesService.selectProtectedCareSpeciesById(id)); + } + + /** + * 新增保护区关注鸟类 + */ + @PreAuthorize("@ss.hasPermi('area:care:add')") + @Log(title = "保护区关注鸟类", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProtectedCareSpecies protectedCareSpecies) { + return toAjax(protectedCareSpeciesService.insertProtectedCareSpecies(protectedCareSpecies)); + } + + @PostMapping("/changeCareSpeciesInArea") + public AjaxResult changeProtectedAreaCareSpeciesByParam(@RequestBody JSONObject params) { + return AjaxResult.success(protectedCareSpeciesService.changeProtectedAreaCareSpeciesByParam(params)); + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/SpeciesAbnormalInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/SpeciesAbnormalInfoController.java new file mode 100644 index 0000000..45ae8d7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/SpeciesAbnormalInfoController.java @@ -0,0 +1,80 @@ +package net.hzvtc.area.controller; + +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.area.service.SpeciesAbnormalInfoService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 关键物种与异常事件报警Controller + * + * @author admin + * @date 2023-03-10 + */ +@RestController +@RequestMapping("/area/abnormalInfo") +public class SpeciesAbnormalInfoController extends BaseController { + @Autowired + private SpeciesAbnormalInfoService speciesAbnormalInfoService; + + /** + * 查询关键物种与异常事件报警列表 + */ + + @GetMapping("/list") + public TableDataInfo list(SpeciesAbnormalInfo speciesAbnormalInfo) { + startPage(); + List list = speciesAbnormalInfoService.selectSpeciesAbnormalInfoList(speciesAbnormalInfo); + return getDataTable(list); + } + + /** + * 导出关键物种与异常事件报警列表 + */ + @Log(title = "关键物种与异常事件报警", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SpeciesAbnormalInfo speciesAbnormalInfo) { + List list = speciesAbnormalInfoService.selectSpeciesAbnormalInfoList(speciesAbnormalInfo); + ExcelUtil util = new ExcelUtil(SpeciesAbnormalInfo.class); + util.exportExcel(response, list, "关键物种与异常事件报警数据"); + } + + /** + * 获取关键物种与异常事件报警详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(speciesAbnormalInfoService.selectSpeciesAbnormalInfoById(id)); + } + + /** + * 新增关键物种与异常事件报警 + */ + @PreAuthorize("@ss.hasPermi('area:abnormalInfo:add')") + @Log(title = "关键物种与异常事件报警", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SpeciesAbnormalInfo speciesAbnormalInfo) { + return toAjax(speciesAbnormalInfoService.insertSpeciesAbnormalInfo(speciesAbnormalInfo)); + } + + + /** + * 删除关键物种与异常事件报警 + */ + @PreAuthorize("@ss.hasPermi('area:abnormalInfo:remove')") + @Log(title = "关键物种与异常事件报警", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(speciesAbnormalInfoService.deleteSpeciesAbnormalInfoByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/WinteringPeriodController.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/WinteringPeriodController.java new file mode 100644 index 0000000..8629437 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/controller/WinteringPeriodController.java @@ -0,0 +1,97 @@ +package net.hzvtc.area.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.WinteringPeriod; +import net.hzvtc.area.service.WinteringPeriodService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 越冬期Controller + * + * @author admin + * @date 2022-09-13 + */ +@RestController +@RequestMapping("/area/winterperiod") +public class WinteringPeriodController extends BaseController { + @Autowired + private WinteringPeriodService winteringPeriodService; + + /** + * 查询越冬期列表 + */ + @PreAuthorize("@ss.hasPermi('area:winterperiod:list')") + @GetMapping("/list") + public TableDataInfo list(WinteringPeriod winteringPeriod) { + startPage(); + List list = winteringPeriodService.selectWinteringPeriodList(winteringPeriod); + return getDataTable(list); + } + + /** + * 导出越冬期列表 + */ + @PreAuthorize("@ss.hasPermi('area:winterperiod:export')") + @Log(title = "越冬期", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, WinteringPeriod winteringPeriod) { + List list = winteringPeriodService.selectWinteringPeriodList(winteringPeriod); + ExcelUtil util = new ExcelUtil(WinteringPeriod.class); + util.exportExcel(response, list, "越冬期数据"); + } + + /** + * 获取越冬期详细信息 + */ + @PreAuthorize("@ss.hasPermi('area:winterperiod:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(winteringPeriodService.selectWinteringPeriodById(id)); + } + + /** + * 新增越冬期 + */ + @PreAuthorize("@ss.hasPermi('area:winterperiod:add')") + @Log(title = "越冬期", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody WinteringPeriod winteringPeriod) { + return toAjax(winteringPeriodService.insertWinteringPeriod(winteringPeriod)); + } + + /** + * 修改越冬期 + */ + @PreAuthorize("@ss.hasPermi('area:winterperiod:edit')") + @Log(title = "越冬期", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody WinteringPeriod winteringPeriod) { + return toAjax(winteringPeriodService.updateWinteringPeriod(winteringPeriod)); + } + + /** + * 删除越冬期 + */ + @PreAuthorize("@ss.hasPermi('area:winterperiod:remove')") + @Log(title = "越冬期", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(winteringPeriodService.deleteWinteringPeriodByIds(ids)); + } + + @PostMapping("/chartList") + public AjaxResult getWinterPeriodChartData(@RequestBody JSONObject obj) { + return AjaxResult.success(winteringPeriodService.getWinteringPeriodDataList(obj)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedArea.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedArea.java new file mode 100644 index 0000000..506848b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedArea.java @@ -0,0 +1,118 @@ +package net.hzvtc.area.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import net.hzvtc.device.domain.DeviceInfo; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.List; + +/** + * 保护区对象 protected_area + * + * @author admin + * @date 2022-07-20 + */ +@Data +@Alias("ProtectedArea") +public class ProtectedArea extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 保护区id + */ + private Long id; + + @Excel(name = "保护区编号") + private String code; + + /** + * 保护区名称 + */ + @Excel(name = "保护区名称") + private String name; + + @Excel(name = "简称") + private String shortName; + + @Excel(name = "大屏地址") + private String url; + + /** + * 保护区所在省份 + */ + @Excel(name = "所在省份") + private String province; + + @Excel(name = "所在省份名称") + private String provinceName; + + /** + * 保护区级别 + */ + @Excel(name = "级别", readConverterExp = "1=国家级,2=省级,3=市县级") + private String areaLevel; + + /** + * 经度 + */ + @Excel(name = "经度") + private String lon; + + /** + * 维度 + */ + @Excel(name = "维度") + private String lat; + + @Excel(name = "联系人") + private String manager; + + @Excel(name = "联系电话") + private String telephone; + + @Excel(name = "是否需要发邮件") + private int sendEmail = 0; + + @Excel(name = "电子邮件") + private String email; + + private int picWidth; + + private int picHeight; + + private int picNum; + + private String bannerFile; + + private String gisFile; + /** + * 保护区简介 + */ + @Excel(name = "保护区简介") + private String introduction; + + private List deviceList; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("province", getProvince()) + .append("areaLevel", getAreaLevel()) + .append("introduction", getIntroduction()) + .append("lon", getLon()) + .append("lat", getLat()) + .append("isDeleted", getIsDeleted()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .toString(); + } + + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedAreaSpecies.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedAreaSpecies.java new file mode 100644 index 0000000..ffcad3d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedAreaSpecies.java @@ -0,0 +1,69 @@ +package net.hzvtc.area.domain; + +import lombok.Data; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.List; + +/** + * 保护区物种对象 protected_area_species + * + * @author admin + * @date 2022-07-20 + */ +@Data +@Alias("ProtectedAreaSpecies") +public class ProtectedAreaSpecies extends BaseEntity { + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 物种id + */ + private Long speciesId; + + @Excel(name = "物种名称") + private String speciesName; + + /** + * 保护区id + */ + private Long areaId; + + @Excel(name = "保护区名称") + private String areaName; + + private int position = 0; + + private BirdSpecies birdSpecies; + + /** + * 是否常见 + */ + @Excel(name = "是否常见", readConverterExp = "1=是,0=否") + private int isCommon; + + private int isSpecial; + + private List ids; + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("speciesId", getSpeciesId()) + .append("areaId", getAreaId()) + .append("isCommon", getIsCommon()) + .append("createTime", getCreateTime()) + .append("isDelete", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedCareSpecies.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedCareSpecies.java new file mode 100644 index 0000000..3944cdf --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/ProtectedCareSpecies.java @@ -0,0 +1,53 @@ +package net.hzvtc.area.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 保护区关注鸟类对象 protected_care_species + * + * @author admin + * @date 2023-08-16 + */ +@Data +@Alias("ProtectedCareSpecies") +public class ProtectedCareSpecies { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 鸟类ID + */ + @Excel(name = "鸟类ID") + private Long speciesId; + + /** + * 保护区ID + */ + @Excel(name = "保护区ID") + private Long areaId; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date createTime; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("speciesId", getSpeciesId()) + .append("areaId", getAreaId()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/SpeciesAbnormalInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/SpeciesAbnormalInfo.java new file mode 100644 index 0000000..a052089 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/SpeciesAbnormalInfo.java @@ -0,0 +1,88 @@ +package net.hzvtc.area.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.data.check.domain.ResultMedia; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 关键物种与异常事件报警对象 species_abnormal_info + * + * @author admin + * @date 2023-03-10 + */ +@Data +@Alias("SpeciesAbnormalInfo") +public class SpeciesAbnormalInfo { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 设备来源 + */ + @Excel(name = "设备来源") + private Long deviceId; + + private String deviceName; + + private Long areaId; + + private String areaName; + + /** + * 发生时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "发生时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date happenTime; + + /** + * 物种ID + */ + @Excel(name = "物种ID") + private Long speciesId; + + private String speciesName; + + private String speciesImageUrl; + + private int count; + + private int type; + + /** + * 媒体ID + */ + private Long mediaId; + + private Long recordId; + + private String mediaUrl; + + private ResultMedia resultMedia; + + + private int isDeleted; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("deviceId", getDeviceId()) + .append("happenTime", getHappenTime()) + .append("speciesId", getSpeciesId()) + .append("mediaId", getMediaId()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/WinteringPeriod.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/WinteringPeriod.java new file mode 100644 index 0000000..1ae1e5b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/domain/WinteringPeriod.java @@ -0,0 +1,75 @@ +package net.hzvtc.area.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 越冬期对象 wintering_period + * + * @author admin + * @date 2022-09-13 + */ +@Data +@Alias("WinteringPeriod") +public class WinteringPeriod { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 保护区id + */ + @Excel(name = "保护区id") + private Long protectedAreaId; + + @Excel(name = "保护区名称") + private String protectedAreaName; + + /** + * 年份 + */ + @Excel(name = "年份") + private String year; + + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date startTime; + + /** + * 结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date endTime; + + /** + * 鸟类数量 + */ + @Excel(name = "鸟类数量") + private int amount; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("protectedAreaId", getProtectedAreaId()) + .append("year", getYear()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("amount", getAmount()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaMapper.java new file mode 100644 index 0000000..84d5993 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaMapper.java @@ -0,0 +1,80 @@ +package net.hzvtc.area.mapper; + +import net.hzvtc.area.domain.ProtectedArea; + +import java.util.List; +import java.util.Map; + +/** + * 保护区Mapper接口 + * + * @author admin + * @date 2022-07-20 + */ +public interface ProtectedAreaMapper { + /** + * 查询保护区 + * + * @param id 保护区主键 + * @return 保护区 + */ + public ProtectedArea selectProtectedAreaById(Long id); + + ProtectedArea selectProtectedAreaByCode(String code); + + ProtectedArea selectProtectedAreaByName(String name); + + /** + * 查询保护区列表 + * + * @param protectedArea 保护区 + * @return 保护区集合 + */ + public List selectProtectedAreaList(ProtectedArea protectedArea); + + public List getProtectedAreaTreeList(Map params); + + public List getAllProtectedAreaList(); + + public List getProtectedAreaListByUserId(Map params); + + List getProtectedAreaEmailList(); + + List getAreaIdsByUserId(Long userId); + + List getAreaListForSelect(); + + List getAreaListByUserId(Long userId); + + /** + * 新增保护区 + * + * @param protectedArea 保护区 + * @return 结果 + */ + public int insertProtectedArea(ProtectedArea protectedArea); + + /** + * 修改保护区 + * + * @param protectedArea 保护区 + * @return 结果 + */ + public int updateProtectedArea(ProtectedArea protectedArea); + + /** + * 删除保护区 + * + * @param id 保护区主键 + * @return 结果 + */ + public int deleteProtectedAreaById(Long id); + + /** + * 批量删除保护区 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteProtectedAreaByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaSpeciesMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaSpeciesMapper.java new file mode 100644 index 0000000..70ba037 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedAreaSpeciesMapper.java @@ -0,0 +1,81 @@ +package net.hzvtc.area.mapper; + +import net.hzvtc.area.domain.ProtectedAreaSpecies; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; +import java.util.Map; + +/** + * 保护区物种Mapper接口 + * + * @author admin + * @date 2022-07-20 + */ +public interface ProtectedAreaSpeciesMapper { + /** + * 查询保护区物种 + * + * @param id 保护区物种主键 + * @return 保护区物种 + */ + ProtectedAreaSpecies selectProtectedAreaSpeciesById(Long id); + + ProtectedAreaSpecies selectProtectedAreaSpeciesByParam(ProtectedAreaSpecies param); + + /** + * 查询保护区物种列表 + * + * @param protectedAreaSpecies 保护区物种 + * @return 保护区物种集合 + */ + List selectProtectedAreaSpeciesList(ProtectedAreaSpecies protectedAreaSpecies); + + List getProtectedAreaSpeciesListByParams(Map map); + + List getProtectedAreaSpeciesListByParam(Map map); + + List getProtectedAreaSpeciesByQuery(Map map); + + List getProtectedAreaSpeciesIdsByParam(Map map); + + List getProtectedAreaSpeciesListByAreaId(Map map); + + /** + * 新增保护区物种 + * + * @param protectedAreaSpecies 保护区物种 + * @return 结果 + */ + int insertProtectedAreaSpecies(ProtectedAreaSpecies protectedAreaSpecies); + + int batchInsertProtectedAreaSpecies(List list); + + /** + * 修改保护区物种 + * + * @param protectedAreaSpecies 保护区物种 + * @return 结果 + */ + int updateProtectedAreaSpecies(ProtectedAreaSpecies protectedAreaSpecies); + + void batchUpdateProtectedAreaSpecies(Map map); + + /** + * 删除保护区物种 + * + * @param id 保护区物种主键 + * @return 结果 + */ + int deleteProtectedAreaSpeciesById(Long id); + + /** + * 批量删除保护区物种 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteProtectedAreaSpeciesByIds(Long[] ids); + + int deleteProtectedAreaSpeciesByParam(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedCareSpeciesMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedCareSpeciesMapper.java new file mode 100644 index 0000000..77b5dc8 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/ProtectedCareSpeciesMapper.java @@ -0,0 +1,50 @@ +package net.hzvtc.area.mapper; + +import net.hzvtc.area.domain.ProtectedCareSpecies; + +import java.util.List; +import java.util.Map; + +/** + * 保护区关注鸟类Mapper接口 + * + * @author admin + * @date 2023-08-16 + */ +public interface ProtectedCareSpeciesMapper { + /** + * 查询保护区关注鸟类 + * + * @param id 保护区关注鸟类主键 + * @return 保护区关注鸟类 + */ + public ProtectedCareSpecies selectProtectedCareSpeciesById(Long id); + + /** + * 查询保护区关注鸟类列表 + * + * @param map 保护区关注鸟类 + * @return 保护区关注鸟类集合 + */ + List selectProtectedCareSpeciesList(Map map); + + List getProtectedCareSpeciesByParam(Map map); + + /** + * 新增保护区关注鸟类 + * + * @param protectedCareSpecies 保护区关注鸟类 + * @return 结果 + */ + int insertProtectedCareSpecies(ProtectedCareSpecies protectedCareSpecies); + + + /** + * 删除保护区关注鸟类 + * + * @param map 保护区关注鸟类主键 + * @return 结果 + */ + public int deleteProtectedCareSpeciesById(Map map); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/SpeciesAbnormalInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/SpeciesAbnormalInfoMapper.java new file mode 100644 index 0000000..7e2192d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/SpeciesAbnormalInfoMapper.java @@ -0,0 +1,64 @@ +package net.hzvtc.area.mapper; + +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.system.domain.vo.MessageVo; + +import java.util.List; +import java.util.Map; + +/** + * 关键物种与异常事件报警Mapper接口 + * + * @author admin + * @date 2023-03-10 + */ +public interface SpeciesAbnormalInfoMapper { + /** + * 查询关键物种与异常事件报警 + * + * @param id 关键物种与异常事件报警主键 + * @return 关键物种与异常事件报警 + */ + public SpeciesAbnormalInfo selectSpeciesAbnormalInfoById(Long id); + + /** + * 查询关键物种与异常事件报警列表 + * + * @param speciesAbnormalInfo 关键物种与异常事件报警 + * @return 关键物种与异常事件报警集合 + */ + public List selectSpeciesAbnormalInfoList(SpeciesAbnormalInfo speciesAbnormalInfo); + + SpeciesAbnormalInfo getLatestSpeciesAbnormalInfo(Long userId); + + int getSpeciesAbnormalInfoCountByUserId(Map map); + + /** + * 新增关键物种与异常事件报警 + * + * @param speciesAbnormalInfo 关键物种与异常事件报警 + * @return 结果 + */ + public int insertSpeciesAbnormalInfo(SpeciesAbnormalInfo speciesAbnormalInfo); + + int batchInsertSpeciesAbnormalInfo(List list); + + /** + * 删除关键物种与异常事件报警 + * + * @param id 关键物种与异常事件报警主键 + * @return 结果 + */ + public int deleteSpeciesAbnormalInfoById(Long id); + + + /** + * 批量删除关键物种与异常事件报警 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSpeciesAbnormalInfoByIds(Long[] ids); + + List getSpeciesAbnormalInfoListByParam(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/WinteringPeriodMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/WinteringPeriodMapper.java new file mode 100644 index 0000000..1ffcd90 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/mapper/WinteringPeriodMapper.java @@ -0,0 +1,63 @@ +package net.hzvtc.area.mapper; + +import net.hzvtc.area.domain.WinteringPeriod; + +import java.util.List; + +/** + * 越冬期Mapper接口 + * + * @author admin + * @date 2022-09-13 + */ +public interface WinteringPeriodMapper { + /** + * 查询越冬期 + * + * @param id 越冬期主键 + * @return 越冬期 + */ + public WinteringPeriod selectWinteringPeriodById(Long id); + + /** + * 查询越冬期列表 + * + * @param winteringPeriod 越冬期 + * @return 越冬期集合 + */ + public List selectWinteringPeriodList(WinteringPeriod winteringPeriod); + + List getWinteringPeriodDataList(WinteringPeriod param); + + /** + * 新增越冬期 + * + * @param winteringPeriod 越冬期 + * @return 结果 + */ + public int insertWinteringPeriod(WinteringPeriod winteringPeriod); + + /** + * 修改越冬期 + * + * @param winteringPeriod 越冬期 + * @return 结果 + */ + public int updateWinteringPeriod(WinteringPeriod winteringPeriod); + + /** + * 删除越冬期 + * + * @param id 越冬期主键 + * @return 结果 + */ + public int deleteWinteringPeriodById(Long id); + + /** + * 批量删除越冬期 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteWinteringPeriodByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaService.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaService.java new file mode 100644 index 0000000..fc214e2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaService.java @@ -0,0 +1,80 @@ +package net.hzvtc.area.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.ProtectedArea; + +import java.util.List; + +/** + * 保护区Service接口 + * + * @author admin + * @date 2022-07-20 + */ +public interface ProtectedAreaService { + /** + * 查询保护区 + * + * @param id 保护区主键 + * @return 保护区 + */ + public ProtectedArea selectProtectedAreaById(Long id); + + ProtectedArea selectProtectedAreaByName(String name); + + public List getProtectedAreaListForPortal(); + + /** + * 查询保护区列表 + * + * @param protectedArea 保护区 + * @return 保护区集合 + */ + public List selectProtectedAreaList(ProtectedArea protectedArea); + + public List getProtectedAreaTreeList(); + + /** + * 新增保护区 + * + * @param protectedArea 保护区 + * @return 结果 + */ + public int insertProtectedArea(ProtectedArea protectedArea); + + /** + * 修改保护区 + * + * @param protectedArea 保护区 + * @return 结果 + */ + public int updateProtectedArea(ProtectedArea protectedArea); + + /** + * 批量删除保护区 + * + * @param ids 需要删除的保护区主键集合 + * @return 结果 + */ + public int deleteProtectedAreaByIds(Long[] ids); + + /** + * 删除保护区信息 + * + * @param id 保护区主键 + * @return 结果 + */ + public int deleteProtectedAreaById(Long id); + + String importData(List list, boolean updateSupport); + + List getProtectedAreaEmailList(); + + ProtectedArea selectProtectedAreaByCode(String code); + + List getAreaListForSelect(); + + List getAreaIdsByUserId(Long userId); + + List getAreaListByUserId(Long userId); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaSpeciesService.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaSpeciesService.java new file mode 100644 index 0000000..d6ac36f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedAreaSpeciesService.java @@ -0,0 +1,80 @@ +package net.hzvtc.area.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.ProtectedAreaSpecies; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; +import java.util.Map; + +/** + * 保护区物种Service接口 + * + * @author admin + * @date 2022-07-20 + */ +public interface ProtectedAreaSpeciesService { + /** + * 查询保护区物种 + * + * @param id 保护区物种主键 + * @return 保护区物种 + */ + ProtectedAreaSpecies selectProtectedAreaSpeciesById(Long id); + + /** + * 查询保护区物种列表 + * + * @param protectedAreaSpecies 保护区物种 + * @return 保护区物种集合 + */ + List selectProtectedAreaSpeciesList(ProtectedAreaSpecies protectedAreaSpecies); + + /** + * 新增保护区物种 + * + * @param protectedAreaSpecies 保护区物种 + * @return 结果 + */ + int batchInsertProtectedAreaSpecies(ProtectedAreaSpecies protectedAreaSpecies); + + int insertProtectedAreaSpecies(ProtectedAreaSpecies protectedAreaSpecies); + + + /** + * 修改保护区物种 + * + * @param protectedAreaSpecies 保护区物种 + * @return 结果 + */ + int updateProtectedAreaSpecies(ProtectedAreaSpecies protectedAreaSpecies); + + /** + * 批量删除保护区物种 + * + * @param ids 需要删除的保护区物种主键集合 + * @return 结果 + */ + int deleteProtectedAreaSpeciesByIds(Long[] ids); + + List getProtectedAreaSpeciesListByParam(JSONObject obj); + + /** + * 删除保护区物种信息 + * + * @param id 保护区物种主键 + * @return 结果 + */ + int deleteProtectedAreaSpeciesById(Long id); + + String importData(List list, boolean updateSupport); + + TableDataInfo getProtectedAreaSpeciesByQuery(JSONObject param); + + List getProtectedAreaSpeciesListByParams(JSONObject param); + + int changeProtectedAreaSpeciesByParam(JSONObject param); + + List getProtectedAreaSpeciesListByAreaId(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedCareSpeciesService.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedCareSpeciesService.java new file mode 100644 index 0000000..0bfb3a3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/ProtectedCareSpeciesService.java @@ -0,0 +1,44 @@ +package net.hzvtc.area.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.ProtectedCareSpecies; + +import java.util.List; +import java.util.Map; + +/** + * 保护区关注鸟类Service接口 + * + * @author admin + * @date 2023-08-16 + */ +public interface ProtectedCareSpeciesService { + /** + * 查询保护区关注鸟类 + * + * @param id 保护区关注鸟类主键 + * @return 保护区关注鸟类 + */ + public ProtectedCareSpecies selectProtectedCareSpeciesById(Long id); + + /** + * 查询保护区关注鸟类列表 + * + * @param param 保护区关注鸟类 + * @return 保护区关注鸟类集合 + */ + public List selectProtectedCareSpeciesList(JSONObject param); + + /** + * 新增保护区关注鸟类 + * + * @param protectedCareSpecies 保护区关注鸟类 + * @return 结果 + */ + public int insertProtectedCareSpecies(ProtectedCareSpecies protectedCareSpecies); + + + int changeProtectedAreaCareSpeciesByParam(JSONObject param); + + List getProtectedCareSpeciesByParam(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/SpeciesAbnormalInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/SpeciesAbnormalInfoService.java new file mode 100644 index 0000000..4b4e59e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/SpeciesAbnormalInfoService.java @@ -0,0 +1,68 @@ +package net.hzvtc.area.service; + +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.system.domain.vo.MessageVo; + +import java.util.List; +import java.util.Map; + +/** + * 关键物种与异常事件报警Service接口 + * + * @author admin + * @date 2023-03-10 + */ +public interface SpeciesAbnormalInfoService { + /** + * 查询关键物种与异常事件报警 + * + * @param id 关键物种与异常事件报警主键 + * @return 关键物种与异常事件报警 + */ + public SpeciesAbnormalInfo selectSpeciesAbnormalInfoById(Long id); + + /** + * 查询关键物种与异常事件报警列表 + * + * @param speciesAbnormalInfo 关键物种与异常事件报警 + * @return 关键物种与异常事件报警集合 + */ + public List selectSpeciesAbnormalInfoList(SpeciesAbnormalInfo speciesAbnormalInfo); + + /** + * 新增关键物种与异常事件报警 + * + * @param speciesAbnormalInfo 关键物种与异常事件报警 + * @return 结果 + */ + public int insertSpeciesAbnormalInfo(SpeciesAbnormalInfo speciesAbnormalInfo); + + /** + * 批量删除关键物种与异常事件报警 + * + * @param ids 需要删除的关键物种与异常事件报警主键集合 + * @return 结果 + */ + public int deleteSpeciesAbnormalInfoByIds(Long[] ids); + + /** + * 删除关键物种与异常事件报警信息 + * + * @param id 关键物种与异常事件报警主键 + * @return 结果 + */ + public int deleteSpeciesAbnormalInfoById(Long id); + + void getDailyLevelOneSpecieResult(); + + void getAllLevelOneSpecieResult(); + + SpeciesAbnormalInfo getLatestSpeciesAbnormalInfo(Long userId); + + int getSpeciesAbnormalInfoCountByUserId(Map map); + + List getSpeciesAbnormalInfoListByParam(); + + void getSpeciesAbnormalInfoListForJob(); +} + diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/WinteringPeriodService.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/WinteringPeriodService.java new file mode 100644 index 0000000..b2dcb7b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/WinteringPeriodService.java @@ -0,0 +1,65 @@ +package net.hzvtc.area.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.WinteringPeriod; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; + +/** + * 越冬期Service接口 + * + * @author admin + * @date 2022-09-13 + */ +public interface WinteringPeriodService { + /** + * 查询越冬期 + * + * @param id 越冬期主键 + * @return 越冬期 + */ + public WinteringPeriod selectWinteringPeriodById(Long id); + + /** + * 查询越冬期列表 + * + * @param winteringPeriod 越冬期 + * @return 越冬期集合 + */ + public List selectWinteringPeriodList(WinteringPeriod winteringPeriod); + + /** + * 新增越冬期 + * + * @param winteringPeriod 越冬期 + * @return 结果 + */ + public int insertWinteringPeriod(WinteringPeriod winteringPeriod); + + /** + * 修改越冬期 + * + * @param winteringPeriod 越冬期 + * @return 结果 + */ + public int updateWinteringPeriod(WinteringPeriod winteringPeriod); + + /** + * 批量删除越冬期 + * + * @param ids 需要删除的越冬期主键集合 + * @return 结果 + */ + public int deleteWinteringPeriodByIds(Long[] ids); + + /** + * 删除越冬期信息 + * + * @param id 越冬期主键 + * @return 结果 + */ + public int deleteWinteringPeriodById(Long id); + + List getWinteringPeriodDataList(JSONObject param); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaServiceImpl.java new file mode 100644 index 0000000..2eea95f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaServiceImpl.java @@ -0,0 +1,229 @@ +package net.hzvtc.area.service.impl; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.area.domain.ProtectedArea; +import net.hzvtc.area.mapper.ProtectedAreaMapper; +import net.hzvtc.area.service.ProtectedAreaService; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * 保护区Service业务层处理 + * + * @author admin + * @date 2022-07-20 + */ +@Slf4j +@Service +public class ProtectedAreaServiceImpl implements ProtectedAreaService { + // private static final Logger log = LoggerFactory.getLogger(ProtectedAreaServiceImpl.class); + @Autowired + protected Validator validator; + @Resource + private ProtectedAreaMapper protectedAreaMapper; + + /** + * 查询保护区 + * + * @param id 保护区主键 + * @return 保护区 + */ + @Override + public ProtectedArea selectProtectedAreaById(Long id) { + return protectedAreaMapper.selectProtectedAreaById(id); + } + + @Override + public ProtectedArea selectProtectedAreaByName(String name) { + return protectedAreaMapper.selectProtectedAreaByName(name); + } + + @Override + public List getProtectedAreaListForPortal() { + Long userId = SecurityUtils.getUserId(); + if (userId <= 1L) { + return protectedAreaMapper.getAllProtectedAreaList(); + } else { + Map map = new HashMap<>(); + map.put("userId", userId); + return protectedAreaMapper.getProtectedAreaListByUserId(map); + } + } + + /** + * 查询保护区列表 + * + * @param protectedArea 保护区 + * @return 保护区 + */ + @Override + public List selectProtectedAreaList(ProtectedArea protectedArea) { + Long userId = SecurityUtils.getUserId(); + if (userId > 1L) { + protectedArea.setId(userId); + } else { + protectedArea.setId(null); + } + return protectedAreaMapper.selectProtectedAreaList(protectedArea); + } + + @Override + public List getProtectedAreaTreeList() { + Map map = new HashMap<>(); + Long userId = SecurityUtils.getUserId(); + if (userId > 1L) { + map.put("userId", userId); + } + return protectedAreaMapper.getProtectedAreaTreeList(map); + } + + /** + * 新增保护区 + * + * @param protectedArea 保护区 + * @return 结果 + */ + @Override + public int insertProtectedArea(ProtectedArea protectedArea) { + protectedArea.setCreateTime(DateUtils.getNowDate()); + if (protectedArea.getShortName() == null || protectedArea.getShortName().isEmpty()) { + protectedArea.setShortName(protectedArea.getName()); + } + return protectedAreaMapper.insertProtectedArea(protectedArea); + } + + /** + * 修改保护区 + * + * @param protectedArea 保护区 + * @return 结果 + */ + @Override + public int updateProtectedArea(ProtectedArea protectedArea) { + if (protectedArea.getShortName() == null || protectedArea.getShortName().isEmpty()) { + protectedArea.setShortName(protectedArea.getName()); + } + return protectedAreaMapper.updateProtectedArea(protectedArea); + } + + /** + * 批量删除保护区 + * + * @param ids 需要删除的保护区主键 + * @return 结果 + */ + @Override + public int deleteProtectedAreaByIds(Long[] ids) { + return protectedAreaMapper.deleteProtectedAreaByIds(ids); + } + + /** + * 删除保护区信息 + * + * @param id 保护区主键 + * @return 结果 + */ + @Override + public int deleteProtectedAreaById(Long id) { + return protectedAreaMapper.deleteProtectedAreaById(id); + } + + @Override + public String importData(List list, boolean updateSupport) { + if (StringUtils.isNull(list) || list.size() == 0) { + throw new ServiceException("导入保护区数据不能为空!"); + } + AtomicInteger[] successNum = {new AtomicInteger()}; + int[] failureNum = {0}; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + list.forEach(data -> { + try { + ProtectedArea protectedArea = protectedAreaMapper.selectProtectedAreaByName(data.getName()); + if (Objects.isNull(protectedArea)) { + BeanValidators.validateWithException(validator, data); + data.setIsDeleted(0); + insertProtectedArea(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、保护区 " + data.getName() + " 导入成功"); + } else if (updateSupport) { + BeanValidators.validateWithException(validator, data); + data.setId(protectedArea.getId()); + updateProtectedArea(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、保护区 " + data.getName() + " 更新成功"); + } else { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、保护区 " + data.getName() + " 已存在"); + } + + } catch (Exception e) { + failureNum[0]++; + String msg = "
" + failureNum + "、保护区 " + data.getName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + }); + if (failureNum[0] > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum[0] + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getProtectedAreaEmailList() { + return protectedAreaMapper.getProtectedAreaEmailList(); + } + + @Override + public ProtectedArea selectProtectedAreaByCode(String code) { + return protectedAreaMapper.selectProtectedAreaByCode(code); + } + + @Override + public List getAreaListForSelect() { + return protectedAreaMapper.getAreaListForSelect(); + } + + @Override + public List getAreaIdsByUserId(Long userId) { + return protectedAreaMapper.getAreaIdsByUserId(userId); + } + + @Override + public List getAreaListByUserId(Long userId) { + if (userId <= 1L) { + userId = null; + } + List list = protectedAreaMapper.getAreaListByUserId(userId); + List objectList = list.stream().map((item -> { + JSONObject obj = new JSONObject(); + obj.put("id", item.getId()); + obj.put("name", item.getName()); + obj.put("provinceName", item.getProvinceName()); + obj.put("code", item.getProvince()); + obj.put("lat", item.getLat()); + obj.put("lon", item.getLon()); + return obj; + })).collect(Collectors.toList()); + return objectList; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaSpeciesServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaSpeciesServiceImpl.java new file mode 100644 index 0000000..39897b5 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedAreaSpeciesServiceImpl.java @@ -0,0 +1,319 @@ +package net.hzvtc.area.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageInfo; +import net.hzvtc.area.domain.ProtectedArea; +import net.hzvtc.area.domain.ProtectedAreaSpecies; +import net.hzvtc.area.mapper.ProtectedAreaSpeciesMapper; +import net.hzvtc.area.service.ProtectedAreaService; +import net.hzvtc.area.service.ProtectedAreaSpeciesService; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.bird.service.BirdSpeciesService; +import net.hzvtc.common.constant.HttpStatus; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.common.utils.PageUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 保护区物种Service业务层处理 + * + * @author admin + * @date 2022-07-20 + */ +@Service +public class ProtectedAreaSpeciesServiceImpl implements ProtectedAreaSpeciesService { + private static final Logger log = LoggerFactory.getLogger(ProtectedAreaServiceImpl.class); + @Autowired + protected Validator validator; + @Resource + private ProtectedAreaSpeciesMapper protectedAreaSpeciesMapper; + @Autowired + private ProtectedAreaService protectedAreaService; + @Autowired + private BirdSpeciesService birdSpeciesService; + + /** + * 查询保护区物种 + * + * @param id 保护区物种主键 + * @return 保护区物种 + */ + @Override + public ProtectedAreaSpecies selectProtectedAreaSpeciesById(Long id) { + return protectedAreaSpeciesMapper.selectProtectedAreaSpeciesById(id); + } + + /** + * 查询保护区物种列表 + * + * @param protectedAreaSpecies 保护区物种 + * @return 保护区物种 + */ + @Override + public List selectProtectedAreaSpeciesList(ProtectedAreaSpecies protectedAreaSpecies) { + return protectedAreaSpeciesMapper.selectProtectedAreaSpeciesList(protectedAreaSpecies); + } + + /** + * 新增保护区物种 + * + * @param species 保护区物种 + * @return 结果 + */ + @Override + @Transactional + public int batchInsertProtectedAreaSpecies(ProtectedAreaSpecies species) { + species.setCreateTime(DateUtils.getNowDate()); + Map map = new HashMap<>(); + map.put("areaId", species.getAreaId()); + map.put("list", species.getIds()); + List birdIds = protectedAreaSpeciesMapper.getProtectedAreaSpeciesListByParams(map); + if (birdIds != null && birdIds.size() > 0) { + map.clear(); + map.put("isCommon", species.getIsCommon()); + map.put("list", birdIds); + map.put("areaId", species.getAreaId()); + protectedAreaSpeciesMapper.batchUpdateProtectedAreaSpecies(map); + } + List newIds = listRemove(species.getIds(), birdIds); + if (newIds != null && newIds.size() > 0) { + List list = new ArrayList<>(); + newIds.stream().forEach(id -> { + ProtectedAreaSpecies data = new ProtectedAreaSpecies(); + data.setAreaId(species.getAreaId()); + data.setIsCommon(species.getIsCommon()); + data.setIsDeleted(0); + data.setCreateTime(species.getCreateTime()); + data.setSpeciesId(id); + list.add(data); + }); + return protectedAreaSpeciesMapper.batchInsertProtectedAreaSpecies(list); + } else { + return 1; + } + + } + + @Override + public int insertProtectedAreaSpecies(ProtectedAreaSpecies protectedAreaSpecies) { + return protectedAreaSpeciesMapper.insertProtectedAreaSpecies(protectedAreaSpecies); + } + + private List listRemove(List fromList, List toList) { + HashSet hs1 = new HashSet(fromList); + HashSet hs2 = new HashSet(toList); + hs1.removeAll(hs2); + List list = new ArrayList(); + list.addAll(hs1); + return list; + } + + /** + * 修改保护区物种 + * + * @param protectedAreaSpecies 保护区物种 + * @return 结果 + */ + @Override + public int updateProtectedAreaSpecies(ProtectedAreaSpecies protectedAreaSpecies) { + return protectedAreaSpeciesMapper.updateProtectedAreaSpecies(protectedAreaSpecies); + } + + /** + * 批量删除保护区物种 + * + * @param ids 需要删除的保护区物种主键 + * @return 结果 + */ + @Override + public int deleteProtectedAreaSpeciesByIds(Long[] ids) { + return protectedAreaSpeciesMapper.deleteProtectedAreaSpeciesByIds(ids); + } + + @Override + public List getProtectedAreaSpeciesListByParam(JSONObject obj) { + Map map = new HashMap<>(); + Integer isCommon = obj.getInteger("isCommon"); + if (isCommon != null) { + map.put("isCommon", isCommon); + } + String code = obj.getString("code"); + if (code != null && !code.isEmpty()) { + map.put("code", code); + } + Long areaId = obj.getLong("areaId"); + map.put("areaId", areaId); + return protectedAreaSpeciesMapper.getProtectedAreaSpeciesListByParam(map); + } + + /** + * 删除保护区物种信息 + * + * @param id 保护区物种主键 + * @return 结果 + */ + @Override + public int deleteProtectedAreaSpeciesById(Long id) { + return protectedAreaSpeciesMapper.deleteProtectedAreaSpeciesById(id); + } + + @Override + public String importData(List list, boolean updateSupport) { + if (StringUtils.isNull(list) || list.size() == 0) { + throw new ServiceException("导入保护区鸟类不能为空!"); + } + AtomicInteger[] successNum = {new AtomicInteger()}; + int[] failureNum = {0}; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + list.forEach(data -> { + try { + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByName(data.getAreaName()); + BirdSpecies birdSpecies = birdSpeciesService.selectBirdSpeciesByName(data.getSpeciesName()); + if (Objects.isNull(protectedArea)) { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、保护区 " + data.getAreaName() + " 不存在"); + } else if (Objects.isNull(birdSpecies)) { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟类 " + data.getSpeciesName() + " 不存在"); + } else { + ProtectedAreaSpecies param = new ProtectedAreaSpecies(); + param.setAreaId(protectedArea.getId()); + param.setSpeciesId(birdSpecies.getId()); + ProtectedAreaSpecies areaSpecies = protectedAreaSpeciesMapper.selectProtectedAreaSpeciesByParam(param); + if (Objects.isNull(areaSpecies)) { + BeanValidators.validateWithException(validator, data); + data.setIsDeleted(0); + data.setAreaId(protectedArea.getId()); + data.setSpeciesId(birdSpecies.getId()); + data.setCreateTime(new Date()); + insertProtectedAreaSpecies(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟类 " + data.getSpeciesName() + " 导入成功"); + } else if (updateSupport) { + BeanValidators.validateWithException(validator, data); + data.setId(areaSpecies.getId()); + data.setIsDeleted(0); + data.setAreaId(protectedArea.getId()); + data.setSpeciesId(birdSpecies.getId()); + updateProtectedAreaSpecies(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟类 " + data.getSpeciesName() + " 更新成功"); + } else { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟类 " + data.getSpeciesName() + " 已存在"); + } + } + + + } catch (Exception e) { + failureNum[0]++; + String msg = "
" + failureNum + "、鸟类 " + data.getSpeciesName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + }); + if (failureNum[0] > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum[0] + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public TableDataInfo getProtectedAreaSpeciesByQuery(JSONObject param) { + Map map = new HashMap<>(); + String areaName = ""; + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + if (areaId != null) { + areaName = protectedAreaService.selectProtectedAreaById(areaId).getName(); + } + String name = param.getString("name"); + map.put("name", name); + Integer pageNum = param.getInteger("pageNum"); + Integer pageSize = param.getInteger("pageSize"); + PageUtils.startPage(pageNum, pageSize); + List birdSpecies = birdSpeciesService.getBirdSpeciesListByQuery(map); + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setTotal(new PageInfo(birdSpecies).getTotal()); + List ids = protectedAreaSpeciesMapper.getProtectedAreaSpeciesIdsByParam(map); + if (birdSpecies == null) { + rspData.setRows(new ArrayList<>()); + return rspData; + } + List list = new ArrayList<>(); + for (BirdSpecies item : birdSpecies) { + ProtectedAreaSpecies data = new ProtectedAreaSpecies(); + data.setSpeciesId(item.getId()); + data.setBirdSpecies(item); + if (ids.contains(item.getId())) { + data.setAreaName(areaName); + } else { + data.setAreaName("当前未监测到"); + } + list.add(data); + } + + rspData.setRows(list); + + return rspData; + } + + @Override + public List getProtectedAreaSpeciesListByParams(JSONObject param) { + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + String str = param.getString("list"); + List list = JSON.parseArray(str, Long.class); + map.put("list", list); + return protectedAreaSpeciesMapper.getProtectedAreaSpeciesListByParams(map); + } + + @Override + public int changeProtectedAreaSpeciesByParam(JSONObject param) { + Long id = param.getLong("id"); + int val = param.getInteger("val"); + Long areaId = param.getLong("areaId"); + if (val == 0) { + Map map = new HashMap<>(); + map.put("areaId", areaId); + map.put("speciesId", id); + return protectedAreaSpeciesMapper.deleteProtectedAreaSpeciesByParam(map); + } else { + ProtectedAreaSpecies data = new ProtectedAreaSpecies(); + data.setIsCommon(1); + data.setSpeciesId(id); + data.setAreaId(areaId); + data.setCreateTime(new Date()); + data.setPosition(99); + data.setIsDeleted(0); + return protectedAreaSpeciesMapper.insertProtectedAreaSpecies(data); + } + } + + @Override + public List getProtectedAreaSpeciesListByAreaId(Map map) { + return protectedAreaSpeciesMapper.getProtectedAreaSpeciesListByAreaId(map); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedCareSpeciesServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedCareSpeciesServiceImpl.java new file mode 100644 index 0000000..f10de99 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/ProtectedCareSpeciesServiceImpl.java @@ -0,0 +1,92 @@ +package net.hzvtc.area.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.ProtectedCareSpecies; +import net.hzvtc.area.mapper.ProtectedCareSpeciesMapper; +import net.hzvtc.area.service.ProtectedCareSpeciesService; +import net.hzvtc.common.utils.DateUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 保护区关注鸟类Service业务层处理 + * + * @author admin + * @date 2023-08-16 + */ +@Service +public class ProtectedCareSpeciesServiceImpl implements ProtectedCareSpeciesService { + @Resource + private ProtectedCareSpeciesMapper protectedCareSpeciesMapper; + + /** + * 查询保护区关注鸟类 + * + * @param id 保护区关注鸟类主键 + * @return 保护区关注鸟类 + */ + @Override + public ProtectedCareSpecies selectProtectedCareSpeciesById(Long id) { + return protectedCareSpeciesMapper.selectProtectedCareSpeciesById(id); + } + + /** + * 查询保护区关注鸟类列表 + * + * @param param 保护区关注鸟类 + * @return 保护区关注鸟类 + */ + @Override + public List selectProtectedCareSpeciesList(JSONObject param) { + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + String str = param.getString("list"); + List list = JSON.parseArray(str, Long.class); + map.put("list", list); + return protectedCareSpeciesMapper.selectProtectedCareSpeciesList(param); + } + + /** + * 新增保护区关注鸟类 + * + * @param protectedCareSpecies 保护区关注鸟类 + * @return 结果 + */ + @Override + public int insertProtectedCareSpecies(ProtectedCareSpecies protectedCareSpecies) { + protectedCareSpecies.setCreateTime(DateUtils.getNowDate()); + return protectedCareSpeciesMapper.insertProtectedCareSpecies(protectedCareSpecies); + } + + + @Override + public int changeProtectedAreaCareSpeciesByParam(JSONObject param) { + Long id = param.getLong("id"); + int val = param.getInteger("val"); + Long areaId = param.getLong("areaId"); + if (val == 0) { + Map map = new HashMap<>(); + map.put("areaId", areaId); + map.put("speciesId", id); + return protectedCareSpeciesMapper.deleteProtectedCareSpeciesById(map); + } else { + ProtectedCareSpecies data = new ProtectedCareSpecies(); + data.setSpeciesId(id); + data.setAreaId(areaId); + data.setCreateTime(new Date()); + return protectedCareSpeciesMapper.insertProtectedCareSpecies(data); + } + } + + @Override + public List getProtectedCareSpeciesByParam(Map map) { + return protectedCareSpeciesMapper.getProtectedCareSpeciesByParam(map); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/SpeciesAbnormalInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/SpeciesAbnormalInfoServiceImpl.java new file mode 100644 index 0000000..e6a8746 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/SpeciesAbnormalInfoServiceImpl.java @@ -0,0 +1,267 @@ +package net.hzvtc.area.service.impl; + +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.area.mapper.SpeciesAbnormalInfoMapper; +import net.hzvtc.area.service.ProtectedCareSpeciesService; +import net.hzvtc.area.service.SpeciesAbnormalInfoService; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.data.check.service.ResultRecordDetailsService; +import net.hzvtc.data.check.service.ResultRecordService; +import net.hzvtc.data.job.domain.TableStatInfo; +import net.hzvtc.data.job.service.TableStatInfoService; +import net.hzvtc.system.domain.vo.MessageVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 关键物种与异常事件报警Service业务层处理 + * + * @author admin + * @date 2023-03-10 + */ +@Service +@Slf4j +public class SpeciesAbnormalInfoServiceImpl implements SpeciesAbnormalInfoService { + @Resource + private SpeciesAbnormalInfoMapper speciesAbnormalInfoMapper; + + @Autowired + private ResultRecordDetailsService resultRecordDetailsService; + + @Autowired + private TableStatInfoService tableStatInfoService; + + @Autowired + private ResultRecordService resultRecordService; + + @Autowired + private ProtectedCareSpeciesService careSpeciesService; + + /** + * 查询关键物种与异常事件报警 + * + * @param id 关键物种与异常事件报警主键 + * @return 关键物种与异常事件报警 + */ + @Override + public SpeciesAbnormalInfo selectSpeciesAbnormalInfoById(Long id) { + return speciesAbnormalInfoMapper.selectSpeciesAbnormalInfoById(id); + } + + /** + * 查询关键物种与异常事件报警列表 + * + * @param speciesAbnormalInfo 关键物种与异常事件报警 + * @return 关键物种与异常事件报警 + */ + @Override + public List selectSpeciesAbnormalInfoList(SpeciesAbnormalInfo speciesAbnormalInfo) { + return speciesAbnormalInfoMapper.selectSpeciesAbnormalInfoList(speciesAbnormalInfo); + } + + /** + * 新增关键物种与异常事件报警 + * + * @param speciesAbnormalInfo 关键物种与异常事件报警 + * @return 结果 + */ + @Override + public int insertSpeciesAbnormalInfo(SpeciesAbnormalInfo speciesAbnormalInfo) { + return speciesAbnormalInfoMapper.insertSpeciesAbnormalInfo(speciesAbnormalInfo); + } + + + /** + * 批量删除关键物种与异常事件报警 + * + * @param ids 需要删除的关键物种与异常事件报警主键 + * @return 结果 + */ + @Override + public int deleteSpeciesAbnormalInfoByIds(Long[] ids) { + return speciesAbnormalInfoMapper.deleteSpeciesAbnormalInfoByIds(ids); + } + + /** + * 删除关键物种与异常事件报警信息 + * + * @param id 关键物种与异常事件报警主键 + * @return 结果 + */ + @Override + public int deleteSpeciesAbnormalInfoById(Long id) { + return speciesAbnormalInfoMapper.deleteSpeciesAbnormalInfoById(id); + } + + @Override + public void getDailyLevelOneSpecieResult() { + Map map = new HashMap<>(); + DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + map.put("happenTime", fmDate.format(LocalDate.now())); + List list = resultRecordDetailsService.getLevelOneSpeciesLitByParam(map); + if (list != null && list.size() > 0) { + list.forEach(item -> item.setType(1)); + speciesAbnormalInfoMapper.batchInsertSpeciesAbnormalInfo(list); + } + list = resultRecordDetailsService.getCrOrEnSpeciesLitByParam(map); + if (list != null && list.size() > 0) { + list.forEach(item -> item.setType(2)); + speciesAbnormalInfoMapper.batchInsertSpeciesAbnormalInfo(list); + } + } + + @Override + public void getAllLevelOneSpecieResult() { + Map map = new HashMap<>(); + List list = resultRecordDetailsService.getLevelOneSpeciesLitByParam(map); + if (list != null && list.size() > 0) { + speciesAbnormalInfoMapper.batchInsertSpeciesAbnormalInfo(list); + } + } + + @Override + public SpeciesAbnormalInfo getLatestSpeciesAbnormalInfo(Long userId) { + return speciesAbnormalInfoMapper.getLatestSpeciesAbnormalInfo(userId); + } + + @Override + public int getSpeciesAbnormalInfoCountByUserId(Map map) { + return speciesAbnormalInfoMapper.getSpeciesAbnormalInfoCountByUserId(map); + } + + @Override + public List getSpeciesAbnormalInfoListByParam() { + Map map = new HashMap<>(); + Long userId = SecurityUtils.getUserId(); + map.put("readerId", userId); + if (userId <= 1L) { + userId = null; + } + map.put("userId", userId); + return speciesAbnormalInfoMapper.getSpeciesAbnormalInfoListByParam(map); + } + + @Override + @Transactional + public void getSpeciesAbnormalInfoListForJob() { + TableStatInfo param = new TableStatInfo(); + param.setType(0); + Long miniId = null; + List list = tableStatInfoService.selectTableStatInfoList(param); + Map map = new HashMap<>(); + if (list == null || list.isEmpty()) { + map.put("recordTime", new Date()); + } else { + Long id = list.get(0).getTableId(); + map.put("recordId", id); + } + + List ids = resultRecordService.getResultRecordIdsByParam(map); + if (ids == null || ids.isEmpty()) { + return; + } + + if (list == null || list.isEmpty()) { + TableStatInfo data = new TableStatInfo(); + data.setType(0); + data.setTableId(ids.get(0)); + tableStatInfoService.insertTableStatInfo(data); + } else { + TableStatInfo data = list.get(0); + data.setTableId(ids.get(0)); + tableStatInfoService.updateTableStatInfo(data); + } +// log.info("========={}", ids.size()); + miniId = ids.get(ids.size() - 1); + + map.clear(); + map.put("list", ids); + List speciesList = new ArrayList<>(); + //鸟类物种ICUN红色名录等级为濒危或极危 + List nlist = resultRecordDetailsService.getCrOrEnSpeciesLitByParam(map); + if (nlist != null && nlist.size() > 0) { + + nlist.forEach(item -> { + if (!containsItem(speciesList, item)) { + item.setType(2); + speciesList.add(item); + } + }); + } + //鸟类物种在保护区内首次被监测到,此前从未出现过 + + nlist = resultRecordDetailsService.getSpeciesDateListByParam(map); + map.clear(); + map.put("recordId", miniId); + nlist.forEach(item -> { + if (!containsItem(speciesList, item)) { + map.put("speciesId", item.getSpeciesId()); + map.put("areaId", item.getAreaId()); + List subIds = resultRecordDetailsService.checkIsNewSpeciesByParam(map); + if (subIds == null || subIds.isEmpty()) { + if (!containsItem(speciesList, item)) { + item.setType(3); + speciesList.add(item); + } + } + } + }); + + //用户自定义筛选的其他鸟类物种 + map.clear(); + map.put("list", ids); + nlist.forEach(item -> { + if (!containsItem(speciesList, item)) { + map.put("speciesId", item.getSpeciesId()); + map.put("areaId", item.getAreaId()); + List subIds = careSpeciesService.getProtectedCareSpeciesByParam(map); + if (subIds != null && !subIds.isEmpty()) { + if (!containsItem(speciesList, item)) { + item.setType(4); + speciesList.add(item); + } + } + } + }); + + + //鸟类物种为国家一级保护动物 + map.clear(); + map.put("list", ids); + nlist = resultRecordDetailsService.getLevelOneSpeciesLitByParam(map); + if (nlist != null && nlist.size() > 0) { + nlist.forEach(item -> { + if (!containsItem(speciesList, item)) { + item.setType(1); + speciesList.add(item); + } + }); + } + if (speciesList.size() > 0) { + speciesAbnormalInfoMapper.batchInsertSpeciesAbnormalInfo(speciesList); + } + } + + private boolean containsItem(List list, SpeciesAbnormalInfo item) { + if (list == null || list.size() == 0) { + return false; + } + List slist = list.stream().filter(sitem -> + ((sitem.getRecordId().longValue() == item.getRecordId().longValue()) && (sitem.getSpeciesId().longValue() == item.getSpeciesId().longValue())) + ).collect(Collectors.toList()); +// log.info("====================size============{}", slist.size()); + if (slist == null || slist.size() == 0) { + return false; + } else { + return true; + } + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/WinteringPeriodServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/WinteringPeriodServiceImpl.java new file mode 100644 index 0000000..869acf9 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/area/service/impl/WinteringPeriodServiceImpl.java @@ -0,0 +1,120 @@ +package net.hzvtc.area.service.impl; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.ProtectedArea; +import net.hzvtc.area.domain.WinteringPeriod; +import net.hzvtc.area.mapper.WinteringPeriodMapper; +import net.hzvtc.area.service.ProtectedAreaService; +import net.hzvtc.area.service.WinteringPeriodService; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 越冬期Service业务层处理 + * + * @author admin + * @date 2022-09-13 + */ +@Service +public class WinteringPeriodServiceImpl implements WinteringPeriodService { + @Resource + private WinteringPeriodMapper winteringPeriodMapper; + + @Autowired + private ProtectedAreaService protectedAreaService; + + /** + * 查询越冬期 + * + * @param id 越冬期主键 + * @return 越冬期 + */ + @Override + public WinteringPeriod selectWinteringPeriodById(Long id) { + return winteringPeriodMapper.selectWinteringPeriodById(id); + } + + /** + * 查询越冬期列表 + * + * @param winteringPeriod 越冬期 + * @return 越冬期 + */ + @Override + public List selectWinteringPeriodList(WinteringPeriod winteringPeriod) { + return winteringPeriodMapper.selectWinteringPeriodList(winteringPeriod); + } + + /** + * 新增越冬期 + * + * @param winteringPeriod 越冬期 + * @return 结果 + */ + @Override + public int insertWinteringPeriod(WinteringPeriod winteringPeriod) { + return winteringPeriodMapper.insertWinteringPeriod(winteringPeriod); + } + + /** + * 修改越冬期 + * + * @param winteringPeriod 越冬期 + * @return 结果 + */ + @Override + public int updateWinteringPeriod(WinteringPeriod winteringPeriod) { + return winteringPeriodMapper.updateWinteringPeriod(winteringPeriod); + } + + /** + * 批量删除越冬期 + * + * @param ids 需要删除的越冬期主键 + * @return 结果 + */ + @Override + public int deleteWinteringPeriodByIds(Long[] ids) { + return winteringPeriodMapper.deleteWinteringPeriodByIds(ids); + } + + /** + * 删除越冬期信息 + * + * @param id 越冬期主键 + * @return 结果 + */ + @Override + public int deleteWinteringPeriodById(Long id) { + return winteringPeriodMapper.deleteWinteringPeriodById(id); + } + + @Override + public List getWinteringPeriodDataList(JSONObject param) { + String areaCode = param.getString("areaCode"); + if (areaCode != null) { + ProtectedArea data = protectedAreaService.selectProtectedAreaByCode(areaCode); + WinteringPeriod winteringPeriod = new WinteringPeriod(); + winteringPeriod.setProtectedAreaId(data.getId()); + List list = winteringPeriodMapper.getWinteringPeriodDataList(winteringPeriod); + Collections.reverse(list); + SimpleDateFormat df = new SimpleDateFormat("yyyy"); + List datalist = list.stream().map(item -> { + BirdStatDataVo statDataVo = new BirdStatDataVo(); + statDataVo.setValue(item.getAmount()); + String code = df.format(item.getStartTime()) + "-" + df.format(item.getEndTime()); + statDataVo.setCode(code); + return statDataVo; + }).collect(Collectors.toList()); + return datalist; + } + return null; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdCatalogueController.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdCatalogueController.java new file mode 100644 index 0000000..041515c --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdCatalogueController.java @@ -0,0 +1,112 @@ +package net.hzvtc.bird.controller; + +import net.hzvtc.bird.domain.BirdCatalogue; +import net.hzvtc.bird.service.BirdCatalogueService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鸟类目Controller + * + * @author admin + * @date 2022-07-16 + */ +@RestController +@RequestMapping("/birdInfo/catalogue") +public class BirdCatalogueController extends BaseController { + @Autowired + private BirdCatalogueService birdCatalogueService; + + /** + * 查询鸟类目列表 + */ +// @PreAuthorize("@ss.hasPermi('birdInfo:catalogue:list')") + @GetMapping("/list") + public TableDataInfo list(BirdCatalogue birdCatalogue) { + startPage(); + List list = birdCatalogueService.selectBirdCatalogueList(birdCatalogue); + return getDataTable(list); + } + + @GetMapping("/selectList") + public AjaxResult getBirdCatalogueSelectList() { + return AjaxResult.success(birdCatalogueService.getBirdCatalogueSelectList()); + } + + /** + * 导出鸟类目列表 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:catalogue:export')") + @Log(title = "鸟类目", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BirdCatalogue birdCatalogue) { + List list = birdCatalogueService.selectBirdCatalogueList(birdCatalogue); + ExcelUtil util = new ExcelUtil(BirdCatalogue.class); + util.exportExcel(response, list, "鸟类目数据"); + } + + @Log(title = "鸟类目", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil(BirdCatalogue.class); + List list = util.importExcel(file.getInputStream()); + String message = birdCatalogueService.importData(list, updateSupport); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(BirdCatalogue.class); + util.importTemplateExcel(response, "鸟类目数据"); + } + + /** + * 获取鸟类目详细信息 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:catalogue:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(birdCatalogueService.selectBirdCatalogueById(id)); + } + + /** + * 新增鸟类目 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:catalogue:add')") + @Log(title = "鸟类目", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BirdCatalogue birdCatalogue) { + return toAjax(birdCatalogueService.insertBirdCatalogue(birdCatalogue)); + } + + /** + * 修改鸟类目 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:catalogue:edit')") + @Log(title = "鸟类目", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BirdCatalogue birdCatalogue) { + return toAjax(birdCatalogueService.updateBirdCatalogue(birdCatalogue)); + } + + /** + * 删除鸟类目 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:catalogue:remove')") + @Log(title = "鸟类目", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(birdCatalogueService.deleteBirdCatalogueByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFamilyController.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFamilyController.java new file mode 100644 index 0000000..3256cf9 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFamilyController.java @@ -0,0 +1,111 @@ +package net.hzvtc.bird.controller; + +import net.hzvtc.bird.domain.BirdFamily; +import net.hzvtc.bird.service.BirdFamilyService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鸟类科Controller + * + * @author admin + * @date 2022-07-16 + */ +@RestController +@RequestMapping("/birdInfo/family") +public class BirdFamilyController extends BaseController { + @Autowired + private BirdFamilyService birdFamilyService; + + /** + * 查询鸟类科列表 + */ +// @PreAuthorize("@ss.hasPermi('birdInfo:family:list')") + @GetMapping("/list") + public TableDataInfo list(BirdFamily birdFamily) { + startPage(); + List list = birdFamilyService.selectBirdFamilyList(birdFamily); + return getDataTable(list); + } + + @GetMapping("/listByCataId") + public AjaxResult getBirdFamilyListByCatalogueId(@RequestParam(name = "id") Long id) { + return AjaxResult.success(birdFamilyService.getBirdFamilyListByCataId(id)); + } + + /** + * 导出鸟类科列表 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:family:export')") + @Log(title = "鸟类科", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BirdFamily birdFamily) { + List list = birdFamilyService.selectBirdFamilyList(birdFamily); + ExcelUtil util = new ExcelUtil(BirdFamily.class); + util.exportExcel(response, list, "鸟类科数据"); + } + + /** + * 获取鸟类科详细信息 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:family:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(birdFamilyService.selectBirdFamilyById(id)); + } + + /** + * 新增鸟类科 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:family:add')") + @Log(title = "鸟类科", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BirdFamily birdFamily) { + return toAjax(birdFamilyService.insertBirdFamily(birdFamily)); + } + + /** + * 修改鸟类科 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:family:edit')") + @Log(title = "鸟类科", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BirdFamily birdFamily) { + return toAjax(birdFamilyService.updateBirdFamily(birdFamily)); + } + + /** + * 删除鸟类科 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:family:remove')") + @Log(title = "鸟类科", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(birdFamilyService.deleteBirdFamilyByIds(ids)); + } + + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil(BirdFamily.class); + List list = util.importExcel(file.getInputStream()); + String message = birdFamilyService.importData(list, updateSupport); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(BirdFamily.class); + util.importTemplateExcel(response, "鸟类科数据"); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFlyingInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFlyingInfoController.java new file mode 100644 index 0000000..777f8cd --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdFlyingInfoController.java @@ -0,0 +1,96 @@ +package net.hzvtc.bird.controller; + +import net.hzvtc.bird.domain.BirdFlyingInfo; +import net.hzvtc.bird.service.BirdFlyingInfoService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鸟类越冬飞行路线图Controller + * + * @author admin + * @date 2022-07-30 + */ +@RestController +@RequestMapping("/birdInfo/flyingInfo") +public class BirdFlyingInfoController extends BaseController { + @Autowired + private BirdFlyingInfoService birdFlyingInfoService; + + @GetMapping("/allList") + public AjaxResult getAll() { + return AjaxResult.success(birdFlyingInfoService.getAllBirdFlyingInfoList()); + } + + /** + * 查询鸟类越冬飞行路线图列表 + */ +// @PreAuthorize("@ss.hasPermi('birdInfo:flyingInfo:list')") + @GetMapping("/list") + public TableDataInfo list(BirdFlyingInfo birdFlyingInfo) { + startPage(); + List list = birdFlyingInfoService.selectBirdFlyingInfoList(birdFlyingInfo); + return getDataTable(list); + } + + /** + * 导出鸟类越冬飞行路线图列表 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:flyingInfo:export')") + @Log(title = "鸟类越冬飞行路线图", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BirdFlyingInfo birdFlyingInfo) { + List list = birdFlyingInfoService.selectBirdFlyingInfoList(birdFlyingInfo); + ExcelUtil util = new ExcelUtil(BirdFlyingInfo.class); + util.exportExcel(response, list, "鸟类越冬飞行路线图数据"); + } + + /** + * 获取鸟类越冬飞行路线图详细信息 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:flyingInfo:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(birdFlyingInfoService.selectBirdFlyingInfoById(id)); + } + + /** + * 新增鸟类越冬飞行路线图 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:flyingInfo:add')") + @Log(title = "鸟类越冬飞行路线图", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BirdFlyingInfo birdFlyingInfo) { + return toAjax(birdFlyingInfoService.insertBirdFlyingInfo(birdFlyingInfo)); + } + + /** + * 修改鸟类越冬飞行路线图 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:flyingInfo:edit')") + @Log(title = "鸟类越冬飞行路线图", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BirdFlyingInfo birdFlyingInfo) { + return toAjax(birdFlyingInfoService.updateBirdFlyingInfo(birdFlyingInfo)); + } + + /** + * 删除鸟类越冬飞行路线图 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:flyingInfo:remove')") + @Log(title = "鸟类越冬飞行路线图", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(birdFlyingInfoService.deleteBirdFlyingInfoByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdGenusController.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdGenusController.java new file mode 100644 index 0000000..3d8fea2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdGenusController.java @@ -0,0 +1,113 @@ +package net.hzvtc.bird.controller; + +import net.hzvtc.bird.domain.BirdGenus; +import net.hzvtc.bird.service.BirdGenusService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鸟类属Controller + * + * @author admin + * @date 2022-07-18 + */ +@RestController +@RequestMapping("/birdInfo/genus") +public class BirdGenusController extends BaseController { + @Autowired + private BirdGenusService birdGenusService; + + /** + * 查询鸟类属列表 + */ +// @PreAuthorize("@ss.hasPermi('birdInfo:genus:list')") + @GetMapping("/list") + public TableDataInfo list(BirdGenus birdGenus) { + startPage(); + List list = birdGenusService.selectBirdGenusList(birdGenus); + return getDataTable(list); + } + + + @GetMapping("/listByFamilyId") + public AjaxResult getBirdFamilyListByCatalogueId(@RequestParam(name = "id") Long id) { + return AjaxResult.success(birdGenusService.getBirdGenusListByFamilyId(id)); + } + + + /** + * 导出鸟类属列表 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:genus:export')") + @Log(title = "鸟类属", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BirdGenus birdGenus) { + List list = birdGenusService.selectBirdGenusList(birdGenus); + ExcelUtil util = new ExcelUtil(BirdGenus.class); + util.exportExcel(response, list, "鸟类属数据"); + } + + /** + * 获取鸟类属详细信息 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:genus:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(birdGenusService.selectBirdGenusById(id)); + } + + /** + * 新增鸟类属 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:genus:add')") + @Log(title = "鸟类属", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BirdGenus birdGenus) { + return toAjax(birdGenusService.insertBirdGenus(birdGenus)); + } + + /** + * 修改鸟类属 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:genus:edit')") + @Log(title = "鸟类属", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BirdGenus birdGenus) { + return toAjax(birdGenusService.updateBirdGenus(birdGenus)); + } + + /** + * 删除鸟类属 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:genus:remove')") + @Log(title = "鸟类属", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(birdGenusService.deleteBirdGenusByIds(ids)); + } + + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil(BirdGenus.class); + List list = util.importExcel(file.getInputStream()); + String message = birdGenusService.importData(list, updateSupport); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(BirdGenus.class); + util.importTemplateExcel(response, "鸟类科数据"); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdLeaveArriveInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdLeaveArriveInfoController.java new file mode 100644 index 0000000..ac30f47 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdLeaveArriveInfoController.java @@ -0,0 +1,98 @@ +package net.hzvtc.bird.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.bird.domain.BirdLeaveArriveInfo; +import net.hzvtc.bird.service.BirdLeaveArriveInfoService; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.common.core.page.TableDataInfo; + +/** + * 候鸟飞离和抵达时间Controller + * + * @author admin + * @date 2023-03-27 + */ +@RestController +@RequestMapping("/bird/leaveArrive") +public class BirdLeaveArriveInfoController extends BaseController { + @Autowired + private BirdLeaveArriveInfoService birdLeaveArriveInfoService; + +/** + * 查询候鸟飞离和抵达时间列表 + */ +@PreAuthorize("@ss.hasPermi('bird:leaveArrive:list')") +@GetMapping("/list") + public TableDataInfo list(BirdLeaveArriveInfo birdLeaveArriveInfo) { + startPage(); + List list = birdLeaveArriveInfoService.selectBirdLeaveArriveInfoList(birdLeaveArriveInfo); + return getDataTable(list); + } + + /** + * 导出候鸟飞离和抵达时间列表 + */ + @PreAuthorize("@ss.hasPermi('bird:leaveArrive:export')") + @Log(title = "候鸟飞离和抵达时间", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BirdLeaveArriveInfo birdLeaveArriveInfo) { + List list = birdLeaveArriveInfoService.selectBirdLeaveArriveInfoList(birdLeaveArriveInfo); + ExcelUtil util = new ExcelUtil(BirdLeaveArriveInfo. class); + util.exportExcel(response, list, "候鸟飞离和抵达时间数据"); + } + + /** + * 获取候鸟飞离和抵达时间详细信息 + */ + @PreAuthorize("@ss.hasPermi('bird:leaveArrive:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(birdLeaveArriveInfoService.selectBirdLeaveArriveInfoById(id)); + } + + /** + * 新增候鸟飞离和抵达时间 + */ + @PreAuthorize("@ss.hasPermi('bird:leaveArrive:add')") + @Log(title = "候鸟飞离和抵达时间", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BirdLeaveArriveInfo birdLeaveArriveInfo) { + return toAjax(birdLeaveArriveInfoService.insertBirdLeaveArriveInfo(birdLeaveArriveInfo)); + } + + /** + * 修改候鸟飞离和抵达时间 + */ + @PreAuthorize("@ss.hasPermi('bird:leaveArrive:edit')") + @Log(title = "候鸟飞离和抵达时间", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BirdLeaveArriveInfo birdLeaveArriveInfo) { + return toAjax(birdLeaveArriveInfoService.updateBirdLeaveArriveInfo(birdLeaveArriveInfo)); + } + + /** + * 删除候鸟飞离和抵达时间 + */ + @PreAuthorize("@ss.hasPermi('bird:leaveArrive:remove')") + @Log(title = "候鸟飞离和抵达时间", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(birdLeaveArriveInfoService.deleteBirdLeaveArriveInfoByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdMediaController.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdMediaController.java new file mode 100644 index 0000000..5c689d8 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdMediaController.java @@ -0,0 +1,103 @@ +package net.hzvtc.bird.controller; + +import net.hzvtc.bird.domain.BirdMedia; +import net.hzvtc.bird.service.BirdMediaService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鸟类媒体Controller + * + * @author admin + * @date 2022-07-19 + */ +@RestController +@RequestMapping("/birdInfo/media") +public class BirdMediaController extends BaseController { + @Autowired + private BirdMediaService birdMediaService; + + /** + * 查询鸟类媒体列表 + */ +// @PreAuthorize("@ss.hasPermi('birdInfo:media:list')") + @GetMapping("/list") + public TableDataInfo list(BirdMedia birdMedia) { + startPage(); + List list = birdMediaService.selectBirdMediaList(birdMedia); + return getDataTable(list); + } + + /** + * 导出鸟类媒体列表 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:media:export')") + @Log(title = "鸟类媒体", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BirdMedia birdMedia) { + List list = birdMediaService.selectBirdMediaList(birdMedia); + ExcelUtil util = new ExcelUtil(BirdMedia.class); + util.exportExcel(response, list, "鸟类媒体数据"); + } + + /** + * 获取鸟类媒体详细信息 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:media:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(birdMediaService.selectBirdMediaById(id)); + } + + /** + * 新增鸟类媒体 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:media:add')") + @Log(title = "鸟类媒体", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BirdMedia birdMedia) { + return toAjax(birdMediaService.insertBirdMedia(birdMedia)); + } + + /** + * 修改鸟类媒体 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:media:edit')") + @Log(title = "鸟类媒体", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BirdMedia birdMedia) { + return toAjax(birdMediaService.updateBirdMedia(birdMedia)); + } + + /** + * 删除鸟类媒体 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:media:remove')") + @Log(title = "鸟类媒体", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(birdMediaService.deleteBirdMediaByIds(ids)); + } + + @PostMapping("/upload") + public AjaxResult upload(MultipartFile file) { + return birdMediaService.uploadFile(file); + } + + @GetMapping("/listForPage") + public AjaxResult listByParam(BirdMedia birdMedia) { + return AjaxResult.success(birdMediaService.selectBirdMediaList(birdMedia)); + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdSpeciesController.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdSpeciesController.java new file mode 100644 index 0000000..9ed35c2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/controller/BirdSpeciesController.java @@ -0,0 +1,162 @@ +package net.hzvtc.bird.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.bird.service.BirdSpeciesService; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.data.check.domain.ResultMedia; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 鸟类种类Controller + * + * @author admin + * @date 2022-07-18 + */ +@Slf4j +@RestController +@RequestMapping("/birdInfo/species") +public class BirdSpeciesController extends BaseController { + @Autowired + private BirdSpeciesService birdSpeciesService; + + /** + * 查询鸟类种类列表 + */ +// @PreAuthorize("@ss.hasPermi('birdInfo:species:list')") + @GetMapping("/list") + public TableDataInfo list(BirdSpecies birdSpecies) { + startPage(); + List list = birdSpeciesService.selectBirdSpeciesList(birdSpecies); + return getDataTable(list); + } + + /** + * 导出鸟类种类列表 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:species:export')") + @Log(title = "鸟类种类", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, BirdSpecies birdSpecies) { + List list = birdSpeciesService.selectBirdSpeciesList(birdSpecies); + ExcelUtil util = new ExcelUtil<>(BirdSpecies.class); + util.exportExcel(response, list, "鸟类种类数据"); + } + + /** + * 获取鸟类种类详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(birdSpeciesService.selectBirdSpeciesById(id)); + } + + /** + * 新增鸟类种类 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:species:add')") + @Log(title = "鸟类种类", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody BirdSpecies birdSpecies) { + return toAjax(birdSpeciesService.insertBirdSpecies(birdSpecies)); + } + + /** + * 修改鸟类种类 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:species:edit')") + @Log(title = "鸟类种类", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody BirdSpecies birdSpecies) { + return toAjax(birdSpeciesService.updateBirdSpecies(birdSpecies)); + } + + /** + * 删除鸟类种类 + */ + @PreAuthorize("@ss.hasPermi('birdInfo:species:remove')") + @Log(title = "鸟类种类", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(birdSpeciesService.deleteBirdSpeciesByIds(ids)); + } + + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil<>(BirdSpecies.class); + List list = util.importExcel(file.getInputStream()); + String message = birdSpeciesService.importData(list, updateSupport); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(BirdSpecies.class); + util.importTemplateExcel(response, "鸟类数据"); + } + + @PostMapping("/birdResultMedias") + public TableDataInfo getBirdResultMediasByParam(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + Integer pageSize = params.getInteger("pageSize"); + startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 10 : pageSize); + List list = birdSpeciesService.getResultMediaListByParam(params); + return getDataTable(list); + } + + @PostMapping("/birdResultAudioMedias") + public TableDataInfo getBirdResultAudioMediasByParam(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + Integer pageSize = params.getInteger("pageSize"); + startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 10 : pageSize); + List list = birdSpeciesService.getResultAudioMediaListByParam(params); + return getDataTable(list); + } + + @PostMapping("/birdMediaesByParam") + public TableDataInfo getSpeciesResultMediasByParam(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + pageNum = pageNum == null ? 1 : pageNum; + Integer pageSize = params.getInteger("pageSize"); + pageSize = pageSize == null ? 10 : pageSize; + startPage(pageNum, pageSize); + return getDataTable(birdSpeciesService.getBirdMediaListByParam(params)); + } + + @PostMapping("/birdMediaesForPageByParam") + public TableDataInfo getSpeciesResultMediasForPageFirstByParam(@RequestBody JSONObject params) { + return getDataTable(birdSpeciesService.getBirdMediaListByParam(params)); + } + + @Log(title = "监测结果附件导出", businessType = BusinessType.EXPORT) + @PostMapping("/mediaExport") + public void export(HttpServletResponse response, @RequestBody JSONObject params) { + List list = birdSpeciesService.getResultMediaListByParam(params); + ExcelUtil util = new ExcelUtil<>(ResultMedia.class); + util.exportExcel(response, list, "监测媒体数据"); + } + + @Log(title = "media数据恢复", businessType = BusinessType.UPDATE) + @PostMapping("/media/recovery") + public AjaxResult recoverBirdMediaByParam(@RequestBody JSONObject params) { + return AjaxResult.success(birdSpeciesService.recoverResultMediaStateByParam(params)); + } + + @PostMapping("/updateSysSpeciesCode") + public AjaxResult updateSysSpeciesCode() { + return AjaxResult.success(birdSpeciesService.updateSysSpeciesCode()); + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdCatalogue.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdCatalogue.java new file mode 100644 index 0000000..a57436b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdCatalogue.java @@ -0,0 +1,58 @@ +package net.hzvtc.bird.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 鸟类目对象 bird_catalogue + * + * @author admin + * @date 2022-07-16 + */ +@Data +@Alias("BirdCatalogue") +public class BirdCatalogue extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 名称 + */ + @Excel(name = "名称") + private String name; + + /** + * 学名(拉丁文名) + */ + @Excel(name = "学名") + private String scientificName; + + /** + * 英文名称 + */ + @Excel(name = "英文名称") + private String englishName; + + @Excel(name = "描述") + private String description; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("scientificName", getScientificName()) + .append("englishName", getEnglishName()) + .append("description", getDescription()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFamily.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFamily.java new file mode 100644 index 0000000..4fb3c0d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFamily.java @@ -0,0 +1,70 @@ +package net.hzvtc.bird.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 鸟类科对象 bird_family + * + * @author admin + * @date 2022-07-16 + */ +@Data +@Alias("BirdFamily") +public class BirdFamily extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 科id + */ + private Long id; + + /** + * 科名 + */ + @Excel(name = "科名") + private String familyName; + + /** + * 学名(拉丁文名) + */ + @Excel(name = "学名") + private String scientificName; + + /** + * 英文名称 + */ + @Excel(name = "英文名称") + private String englishName; + + /** + * 描述 + */ + @Excel(name = "描述") + private String description; + + /** + * 所属目名 + */ + private Long catalogueId; + + @Excel(name = "所属类目") + private String catalogueName; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("familyName", getFamilyName()) + .append("scientificName", getScientificName()) + .append("englishName", getEnglishName()) + .append("description", getDescription()) + .append("catalogueId", getCatalogueId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFlyingInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFlyingInfo.java new file mode 100644 index 0000000..e3f0dde --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdFlyingInfo.java @@ -0,0 +1,81 @@ +package net.hzvtc.bird.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 鸟类越冬飞行路线图对象 bird_flying_info + * + * @author admin + * @date 2022-07-30 + */ +@Data +@Alias("BirdFlyingInfo") +public class BirdFlyingInfo extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 物种名称 + */ + private Long speciesId; + + /** + * 起飞点 + */ + @Excel(name = "起飞点") + private String source; + + /** + * 起飞点经度 + */ + @Excel(name = "起飞点经度") + private String sourceLongitude; + + /** + * 起飞点维度 + */ + @Excel(name = "起飞点维度") + private String sourceLatitude; + + /** + * 目的地 + */ + @Excel(name = "目的地") + private String target; + + /** + * 目的地经度 + */ + @Excel(name = "目的地经度") + private String targetLongitude; + + /** + * 目的地维度 + */ + @Excel(name = "目的地维度") + private String targetLatitude; + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("speciesId", getSpeciesId()) + .append("source", getSource()) + .append("sourceLongitude", getSourceLongitude()) + .append("sourceLatitude", getSourceLatitude()) + .append("target", getTarget()) + .append("targetLongitude", getTargetLongitude()) + .append("targetLatitude", getTargetLatitude()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdGenus.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdGenus.java new file mode 100644 index 0000000..9be92ce --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdGenus.java @@ -0,0 +1,75 @@ +package net.hzvtc.bird.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 鸟类属对象 bird_genus + * + * @author admin + * @date 2022-07-18 + */ +@Data +@Alias("BirdGenus") +public class BirdGenus extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 属名 + */ + @Excel(name = "属名") + private String name; + + /** + * 拉丁文名 + */ + @Excel(name = "拉丁文名") + private String scientificName; + + /** + * 英文名称 + */ + @Excel(name = "英文名称") + private String englishName; + + private Long catalogueId; + + /** + * 所属科id + */ + private Long familyId; + + /** + * 描述 + */ + @Excel(name = "描述") + private String description; + + /** + * 所属科名 + */ + @Excel(name = "所属科名") + private String familyName; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("scientificName", getScientificName()) + .append("englishName", getEnglishName()) + .append("familyId", getFamilyId()) + .append("description", getDescription()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdLeaveArriveInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdLeaveArriveInfo.java new file mode 100644 index 0000000..c17dc06 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdLeaveArriveInfo.java @@ -0,0 +1,91 @@ +package net.hzvtc.bird.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 候鸟飞离和抵达时间对象 bird_leave_arrive_info + * + * @author admin + * @date 2022-11-01 + */ +@Data +@Alias("BirdLeaveArriveInfo") +public class BirdLeaveArriveInfo { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 保护区ID + */ + @Excel(name = "保护区ID") + private Long areaId; + + private String name; + + /** + * 物种ID + */ + @Excel(name = "物种ID") + private Long speciesId; + + /** + * 统计年度 + */ + @Excel(name = "统计年度") + private int statYear; + + /** + * 飞离日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "飞离日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date leaveDate; + + private String strLeaveDate; + + /** + * 到达日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "到达日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date arriveDate; + + private String strArriveDate; + /** + * 删除标记 + */ + @Excel(name = "删除标记") + private int isDeleted = 0; + + public long getDiffDay() { + if (arriveDate == null || leaveDate == null) { + return 0; + } else { + return (leaveDate.getTime() - arriveDate.getTime()) / 24 / 3600 / 1000; + } + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("areaId", getAreaId()) + .append("speciesId", getSpeciesId()) + .append("statYear", getStatYear()) + .append("leaveDate", getLeaveDate()) + .append("arriveDate", getArriveDate()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdMedia.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdMedia.java new file mode 100644 index 0000000..92b01b9 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdMedia.java @@ -0,0 +1,72 @@ +package net.hzvtc.bird.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 鸟类媒体对象 bird_media + * + * @author admin + * @date 2022-07-19 + */ +@Data +@Alias("BirdMedia") +public class BirdMedia extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 物种id + */ + @Excel(name = "物种id") + private Long speciesId; + + /** + * 名称 + */ + @Excel(name = "名称") + private String name; + + /** + * 类型 + */ + @Excel(name = "类型") + private String mediaType; + + /** + * url + */ + @Excel(name = "url") + private String url; + + /** + * 备注 + */ + @Excel(name = "备注") + private String description; + + private Integer pcShow = 0; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("speciesId", getSpeciesId()) + .append("name", getName()) + .append("mediaType", getMediaType()) + .append("url", getUrl()) + .append("description", getDescription()) + .append("isDeleted", getIsDeleted()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdSpecies.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdSpecies.java new file mode 100644 index 0000000..b20ee17 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/domain/BirdSpecies.java @@ -0,0 +1,170 @@ +package net.hzvtc.bird.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.List; + +/** + * 鸟类种类对象 bird_species + * + * @author admin + * @date 2022-07-18 + */ +@Data +@Alias("BirdSpecies") +@EqualsAndHashCode(callSuper = false) +public class BirdSpecies extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 物种 + */ + private Long id; + + /** + * 中文名称 + */ + @Excel(name = "中文名称") + private String name; + + /** + * 物种学名(拉丁文名) + */ + @Excel(name = "物种学名") + private String scientificName; + + /** + * 物种英文名称 + */ + @Excel(name = "物种英文名称") + private String englishName; + + /** + * 形态描述 + */ + @Excel(name = "形态描述") + private String morphology; + + /** + * 生境信息 + */ + @Excel(name = "生境信息") + private String habitat; + + /** + * 鸣声描述 + */ + @Excel(name = "鸣声描述") + private String voice; + + /** + * 分布范围 + */ + @Excel(name = "分布范围") + private String distribution; + + /** + * 国外分布 + */ + @Excel(name = "国外分布") + private String overseasDistribution; + + /** + * 国内分布 + */ + @Excel(name = "国内分布") + private String domesticDistribution; + + /** + * 鸟种类头像图片url + */ + private String avatar; + + /** + * 国家保护等级 + */ + @Excel(name = "国家保护等级", readConverterExp = "0=无保护等级,1=国家一级保护动物,2=国家二级保护动物") + private String protectLevel; + + private String protectLevelName; + + /** + * iucn红色名录 + */ + @Excel(name = "iucn红色名录", readConverterExp = "EX=绝灭,EW=野外灭绝,CR=极危,EN=濒危,VU=易危,NT=近危,LC=无危,DD=数据缺乏,NE=未评估") + private String iucn; + + private String iucnName; + + + /** + * 居留类型 + */ + @Excel(name = "居留类型", readConverterExp = "1=留鸟,2=夏侯鸟,3=冬候鸟,4=旅鸟,5=迷鸟") + private String residenceType; + + @Excel(name = "所属类型", readConverterExp = "") + private String speciesType; + + private String speciesTypeName; + + /** + * 目id + */ + private Long catalogueId; + + private String catalogueName; + + /** + * 科id + */ + private Long familyId; + + private String familyName; + + private Integer position; + + /** + * 属id + */ + private Long genusId; + + @Excel(name = "鸟类属") + private String genusName; + + private List mediaList; + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("scientificName", getScientificName()) + .append("englishName", getEnglishName()) + .append("morphology", getMorphology()) + .append("habitat", getHabitat()) + .append("voice", getVoice()) + .append("distribution", getDistribution()) + .append("overseasDistribution", getOverseasDistribution()) + .append("domesticDistribution", getDomesticDistribution()) + .append("avatar", getAvatar()) + .append("protectLevel", getProtectLevel()) + .append("iucn", getIucn()) + .append("residenceType", getResidenceType()) + .append("isDeleted", getIsDeleted()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("catalogueId", getCatalogueId()) + .append("familyId", getFamilyId()) + .append("genusId", getGenusId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdCatalogueMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdCatalogueMapper.java new file mode 100644 index 0000000..6733d34 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdCatalogueMapper.java @@ -0,0 +1,65 @@ +package net.hzvtc.bird.mapper; + +import net.hzvtc.bird.domain.BirdCatalogue; + +import java.util.List; + +/** + * 鸟类目Mapper接口 + * + * @author admin + * @date 2022-07-16 + */ +public interface BirdCatalogueMapper { + /** + * 查询鸟类目 + * + * @param id 鸟类目主键 + * @return 鸟类目 + */ + public BirdCatalogue selectBirdCatalogueById(Long id); + + public BirdCatalogue selectBirdCatalogueByName(String name); + + /** + * 查询鸟类目列表 + * + * @param birdCatalogue 鸟类目 + * @return 鸟类目集合 + */ + public List selectBirdCatalogueList(BirdCatalogue birdCatalogue); + + List getBirdCatalogueSelectList(); + + /** + * 新增鸟类目 + * + * @param birdCatalogue 鸟类目 + * @return 结果 + */ + public int insertBirdCatalogue(BirdCatalogue birdCatalogue); + + /** + * 修改鸟类目 + * + * @param birdCatalogue 鸟类目 + * @return 结果 + */ + public int updateBirdCatalogue(BirdCatalogue birdCatalogue); + + /** + * 删除鸟类目 + * + * @param id 鸟类目主键 + * @return 结果 + */ + public int deleteBirdCatalogueById(Long id); + + /** + * 批量删除鸟类目 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteBirdCatalogueByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFamilyMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFamilyMapper.java new file mode 100644 index 0000000..50bc58f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFamilyMapper.java @@ -0,0 +1,65 @@ +package net.hzvtc.bird.mapper; + +import net.hzvtc.bird.domain.BirdFamily; + +import java.util.List; + +/** + * 鸟类科Mapper接口 + * + * @author admin + * @date 2022-07-16 + */ +public interface BirdFamilyMapper { + /** + * 查询鸟类科 + * + * @param id 鸟类科主键 + * @return 鸟类科 + */ + public BirdFamily selectBirdFamilyById(Long id); + + public BirdFamily selectBirdFamilyByName(String name); + + /** + * 查询鸟类科列表 + * + * @param birdFamily 鸟类科 + * @return 鸟类科集合 + */ + public List selectBirdFamilyList(BirdFamily birdFamily); + + List getBirdFamilyListByCataId(Long catalogueId); + + /** + * 新增鸟类科 + * + * @param birdFamily 鸟类科 + * @return 结果 + */ + public int insertBirdFamily(BirdFamily birdFamily); + + /** + * 修改鸟类科 + * + * @param birdFamily 鸟类科 + * @return 结果 + */ + public int updateBirdFamily(BirdFamily birdFamily); + + /** + * 删除鸟类科 + * + * @param id 鸟类科主键 + * @return 结果 + */ + public int deleteBirdFamilyById(Long id); + + /** + * 批量删除鸟类科 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteBirdFamilyByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFlyingInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFlyingInfoMapper.java new file mode 100644 index 0000000..f9b1191 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdFlyingInfoMapper.java @@ -0,0 +1,63 @@ +package net.hzvtc.bird.mapper; + +import net.hzvtc.bird.domain.BirdFlyingInfo; + +import java.util.List; + +/** + * 鸟类越冬飞行路线图Mapper接口 + * + * @author admin + * @date 2022-07-30 + */ +public interface BirdFlyingInfoMapper { + /** + * 查询鸟类越冬飞行路线图 + * + * @param id 鸟类越冬飞行路线图主键 + * @return 鸟类越冬飞行路线图 + */ + public BirdFlyingInfo selectBirdFlyingInfoById(Long id); + + /** + * 查询鸟类越冬飞行路线图列表 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 鸟类越冬飞行路线图集合 + */ + public List selectBirdFlyingInfoList(BirdFlyingInfo birdFlyingInfo); + + public List getAllBirdFlyingInfoList(); + + /** + * 新增鸟类越冬飞行路线图 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 结果 + */ + public int insertBirdFlyingInfo(BirdFlyingInfo birdFlyingInfo); + + /** + * 修改鸟类越冬飞行路线图 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 结果 + */ + public int updateBirdFlyingInfo(BirdFlyingInfo birdFlyingInfo); + + /** + * 删除鸟类越冬飞行路线图 + * + * @param id 鸟类越冬飞行路线图主键 + * @return 结果 + */ + public int deleteBirdFlyingInfoById(Long id); + + /** + * 批量删除鸟类越冬飞行路线图 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteBirdFlyingInfoByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdGenusMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdGenusMapper.java new file mode 100644 index 0000000..a9b8890 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdGenusMapper.java @@ -0,0 +1,65 @@ +package net.hzvtc.bird.mapper; + +import net.hzvtc.bird.domain.BirdGenus; + +import java.util.List; + +/** + * 鸟类属Mapper接口 + * + * @author admin + * @date 2022-07-18 + */ +public interface BirdGenusMapper { + /** + * 查询鸟类属 + * + * @param id 鸟类属主键 + * @return 鸟类属 + */ + public BirdGenus selectBirdGenusById(Long id); + + public BirdGenus selectBirdGenusByName(String name); + + /** + * 查询鸟类属列表 + * + * @param birdGenus 鸟类属 + * @return 鸟类属集合 + */ + public List selectBirdGenusList(BirdGenus birdGenus); + + List getBirdGenusListByFamilyId(Long familyId); + + /** + * 新增鸟类属 + * + * @param birdGenus 鸟类属 + * @return 结果 + */ + public int insertBirdGenus(BirdGenus birdGenus); + + /** + * 修改鸟类属 + * + * @param birdGenus 鸟类属 + * @return 结果 + */ + public int updateBirdGenus(BirdGenus birdGenus); + + /** + * 删除鸟类属 + * + * @param id 鸟类属主键 + * @return 结果 + */ + public int deleteBirdGenusById(Long id); + + /** + * 批量删除鸟类属 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteBirdGenusByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdLeaveArriveInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdLeaveArriveInfoMapper.java new file mode 100644 index 0000000..cfe7e8e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdLeaveArriveInfoMapper.java @@ -0,0 +1,69 @@ +package net.hzvtc.bird.mapper; + +import net.hzvtc.bird.domain.BirdLeaveArriveInfo; + +import java.util.List; +import java.util.Map; + +/** + * 候鸟飞离和抵达时间Mapper接口 + * + * @author admin + * @date 2023-03-27 + */ +public interface BirdLeaveArriveInfoMapper { + /** + * 查询候鸟飞离和抵达时间 + * + * @param id 候鸟飞离和抵达时间主键 + * @return 候鸟飞离和抵达时间 + */ + BirdLeaveArriveInfo selectBirdLeaveArriveInfoById(Long id); + + /** + * 查询候鸟飞离和抵达时间列表 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 候鸟飞离和抵达时间集合 + */ + List selectBirdLeaveArriveInfoList(BirdLeaveArriveInfo birdLeaveArriveInfo); + + List getBirdArrivalDateByParam(Map param); + + List getBirdLeaveDateByParam(Map param); + + + /** + * 新增候鸟飞离和抵达时间 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 结果 + */ + int insertBirdLeaveArriveInfo(BirdLeaveArriveInfo birdLeaveArriveInfo); + + int batchInsertBirdLeaveArriveInfo(List list); + + /** + * 修改候鸟飞离和抵达时间 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 结果 + */ + int updateBirdLeaveArriveInfo(BirdLeaveArriveInfo birdLeaveArriveInfo); + + /** + * 删除候鸟飞离和抵达时间 + * + * @param id 候鸟飞离和抵达时间主键 + * @return 结果 + */ + int deleteBirdLeaveArriveInfoById(Long id); + + /** + * 批量删除候鸟飞离和抵达时间 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteBirdLeaveArriveInfoByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdMediaMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdMediaMapper.java new file mode 100644 index 0000000..2decca9 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdMediaMapper.java @@ -0,0 +1,65 @@ +package net.hzvtc.bird.mapper; + +import java.util.List; +import net.hzvtc.bird.domain.BirdMedia; + +/** + * 鸟类媒体Mapper接口 + * + * @author admin + * @date 2022-07-19 + */ +public interface BirdMediaMapper +{ + /** + * 查询鸟类媒体 + * + * @param id 鸟类媒体主键 + * @return 鸟类媒体 + */ + public BirdMedia selectBirdMediaById(Long id); + + /** + * 查询鸟类媒体列表 + * + * @param birdMedia 鸟类媒体 + * @return 鸟类媒体集合 + */ + public List selectBirdMediaList(BirdMedia birdMedia); + + /** + * 新增鸟类媒体 + * + * @param birdMedia 鸟类媒体 + * @return 结果 + */ + public int insertBirdMedia(BirdMedia birdMedia); + + /** + * 修改鸟类媒体 + * + * @param birdMedia 鸟类媒体 + * @return 结果 + */ + public int updateBirdMedia(BirdMedia birdMedia); + + /** + * 删除鸟类媒体 + * + * @param id 鸟类媒体主键 + * @return 结果 + */ + public int deleteBirdMediaById(Long id); + + /** + * 批量删除鸟类媒体 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteBirdMediaByIds(Long[] ids); + + String getBirdIconImageBySpeciesId(Long speciesId); + + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdSpeciesMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdSpeciesMapper.java new file mode 100644 index 0000000..5fb4676 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/mapper/BirdSpeciesMapper.java @@ -0,0 +1,78 @@ +package net.hzvtc.bird.mapper; + +import net.hzvtc.bird.domain.BirdSpecies; + +import java.util.List; +import java.util.Map; + +/** + * 鸟类种类Mapper接口 + * + * @author admin + * @date 2022-07-18 + */ +public interface BirdSpeciesMapper { + /** + * 查询鸟类种类 + * + * @param id 鸟类种类主键 + * @return 鸟类种类 + */ + BirdSpecies selectBirdSpeciesById(Long id); + + BirdSpecies selectBirdSpeciesByName(String name); + + /** + * 查询鸟类种类列表 + * + * @param birdSpecies 鸟类种类 + * @return 鸟类种类集合 + */ + List selectBirdSpeciesList(BirdSpecies birdSpecies); + + List getBirdSpeciesListByQuery(Map map); + + /** + * 新增鸟类种类 + * + * @param birdSpecies 鸟类种类 + * @return 结果 + */ + int insertBirdSpecies(BirdSpecies birdSpecies); + + /** + * 修改鸟类种类 + * + * @param birdSpecies 鸟类种类 + * @return 结果 + */ + int updateBirdSpecies(BirdSpecies birdSpecies); + + /** + * 删除鸟类种类 + * + * @param id 鸟类种类主键 + * @return 结果 + */ + int deleteBirdSpeciesById(Long id); + + /** + * 批量删除鸟类种类 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteBirdSpeciesByIds(Long[] ids); + + List getBirdSpeciesInfoByName(String name); + + BirdSpecies selectBirdSpeciesForEsById(Long id); + + List getSpeciesSelectListByParam(Map param); + + String getSpeciesNameById(Long id); + + int deleteSysSpeciesCode(); + + int insertSysSpeciesCode(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdCatalogueService.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdCatalogueService.java new file mode 100644 index 0000000..84ce4c3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdCatalogueService.java @@ -0,0 +1,67 @@ +package net.hzvtc.bird.service; + +import net.hzvtc.bird.domain.BirdCatalogue; + +import java.util.List; + +/** + * 鸟类目Service接口 + * + * @author admin + * @date 2022-07-16 + */ +public interface BirdCatalogueService { + /** + * 查询鸟类目 + * + * @param id 鸟类目主键 + * @return 鸟类目 + */ + public BirdCatalogue selectBirdCatalogueById(Long id); + + public BirdCatalogue selectBirdCatalogueByName(String name); + + /** + * 查询鸟类目列表 + * + * @param birdCatalogue 鸟类目 + * @return 鸟类目集合 + */ + public List selectBirdCatalogueList(BirdCatalogue birdCatalogue); + + List getBirdCatalogueSelectList(); + + /** + * 新增鸟类目 + * + * @param birdCatalogue 鸟类目 + * @return 结果 + */ + public int insertBirdCatalogue(BirdCatalogue birdCatalogue); + + /** + * 修改鸟类目 + * + * @param birdCatalogue 鸟类目 + * @return 结果 + */ + public int updateBirdCatalogue(BirdCatalogue birdCatalogue); + + /** + * 批量删除鸟类目 + * + * @param ids 需要删除的鸟类目主键集合 + * @return 结果 + */ + public int deleteBirdCatalogueByIds(Long[] ids); + + /** + * 删除鸟类目信息 + * + * @param id 鸟类目主键 + * @return 结果 + */ + public int deleteBirdCatalogueById(Long id); + + public String importData(List list, boolean isUpdateSupport); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFamilyService.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFamilyService.java new file mode 100644 index 0000000..d553313 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFamilyService.java @@ -0,0 +1,67 @@ +package net.hzvtc.bird.service; + +import net.hzvtc.bird.domain.BirdFamily; + +import java.util.List; + +/** + * 鸟类科Service接口 + * + * @author admin + * @date 2022-07-16 + */ +public interface BirdFamilyService { + /** + * 查询鸟类科 + * + * @param id 鸟类科主键 + * @return 鸟类科 + */ + public BirdFamily selectBirdFamilyById(Long id); + + /** + * 查询鸟类科列表 + * + * @param birdFamily 鸟类科 + * @return 鸟类科集合 + */ + public List selectBirdFamilyList(BirdFamily birdFamily); + + List getBirdFamilyListByCataId(Long catalogueId); + + /** + * 新增鸟类科 + * + * @param birdFamily 鸟类科 + * @return 结果 + */ + public int insertBirdFamily(BirdFamily birdFamily); + + /** + * 修改鸟类科 + * + * @param birdFamily 鸟类科 + * @return 结果 + */ + public int updateBirdFamily(BirdFamily birdFamily); + + /** + * 批量删除鸟类科 + * + * @param ids 需要删除的鸟类科主键集合 + * @return 结果 + */ + public int deleteBirdFamilyByIds(Long[] ids); + + /** + * 删除鸟类科信息 + * + * @param id 鸟类科主键 + * @return 结果 + */ + public int deleteBirdFamilyById(Long id); + + public String importData(List list, boolean isUpdateSupport); + + public BirdFamily selectBirdFamilyByName(String name); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFlyingInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFlyingInfoService.java new file mode 100644 index 0000000..5cabec7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdFlyingInfoService.java @@ -0,0 +1,63 @@ +package net.hzvtc.bird.service; + +import net.hzvtc.bird.domain.BirdFlyingInfo; + +import java.util.List; + +/** + * 鸟类越冬飞行路线图Service接口 + * + * @author admin + * @date 2022-07-30 + */ +public interface BirdFlyingInfoService { + /** + * 查询鸟类越冬飞行路线图 + * + * @param id 鸟类越冬飞行路线图主键 + * @return 鸟类越冬飞行路线图 + */ + public BirdFlyingInfo selectBirdFlyingInfoById(Long id); + + /** + * 查询鸟类越冬飞行路线图列表 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 鸟类越冬飞行路线图集合 + */ + public List selectBirdFlyingInfoList(BirdFlyingInfo birdFlyingInfo); + + public List getAllBirdFlyingInfoList(); + + /** + * 新增鸟类越冬飞行路线图 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 结果 + */ + public int insertBirdFlyingInfo(BirdFlyingInfo birdFlyingInfo); + + /** + * 修改鸟类越冬飞行路线图 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 结果 + */ + public int updateBirdFlyingInfo(BirdFlyingInfo birdFlyingInfo); + + /** + * 批量删除鸟类越冬飞行路线图 + * + * @param ids 需要删除的鸟类越冬飞行路线图主键集合 + * @return 结果 + */ + public int deleteBirdFlyingInfoByIds(Long[] ids); + + /** + * 删除鸟类越冬飞行路线图信息 + * + * @param id 鸟类越冬飞行路线图主键 + * @return 结果 + */ + public int deleteBirdFlyingInfoById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdGenusService.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdGenusService.java new file mode 100644 index 0000000..df172bc --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdGenusService.java @@ -0,0 +1,67 @@ +package net.hzvtc.bird.service; + +import net.hzvtc.bird.domain.BirdGenus; + +import java.util.List; + +/** + * 鸟类属Service接口 + * + * @author admin + * @date 2022-07-18 + */ +public interface BirdGenusService { + /** + * 查询鸟类属 + * + * @param id 鸟类属主键 + * @return 鸟类属 + */ + public BirdGenus selectBirdGenusById(Long id); + + /** + * 查询鸟类属列表 + * + * @param birdGenus 鸟类属 + * @return 鸟类属集合 + */ + public List selectBirdGenusList(BirdGenus birdGenus); + + /** + * 新增鸟类属 + * + * @param birdGenus 鸟类属 + * @return 结果 + */ + public int insertBirdGenus(BirdGenus birdGenus); + + /** + * 修改鸟类属 + * + * @param birdGenus 鸟类属 + * @return 结果 + */ + public int updateBirdGenus(BirdGenus birdGenus); + + /** + * 批量删除鸟类属 + * + * @param ids 需要删除的鸟类属主键集合 + * @return 结果 + */ + public int deleteBirdGenusByIds(Long[] ids); + + /** + * 删除鸟类属信息 + * + * @param id 鸟类属主键 + * @return 结果 + */ + public int deleteBirdGenusById(Long id); + + List getBirdGenusListByFamilyId(Long familyId); + + public String importData(List list, boolean isUpdateSupport); + + public BirdGenus selectBirdGenusByName(String name); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdLeaveArriveInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdLeaveArriveInfoService.java new file mode 100644 index 0000000..dcb8996 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdLeaveArriveInfoService.java @@ -0,0 +1,63 @@ +package net.hzvtc.bird.service; + +import net.hzvtc.bird.domain.BirdLeaveArriveInfo; + +import java.util.List; + +/** + * 候鸟飞离和抵达时间Service接口 + * + * @author admin + * @date 2023-03-27 + */ +public interface BirdLeaveArriveInfoService { + /** + * 查询候鸟飞离和抵达时间 + * + * @param id 候鸟飞离和抵达时间主键 + * @return 候鸟飞离和抵达时间 + */ + public BirdLeaveArriveInfo selectBirdLeaveArriveInfoById(Long id); + + /** + * 查询候鸟飞离和抵达时间列表 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 候鸟飞离和抵达时间集合 + */ + public List selectBirdLeaveArriveInfoList(BirdLeaveArriveInfo birdLeaveArriveInfo); + + /** + * 新增候鸟飞离和抵达时间 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 结果 + */ + public int insertBirdLeaveArriveInfo(BirdLeaveArriveInfo birdLeaveArriveInfo); + + /** + * 修改候鸟飞离和抵达时间 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 结果 + */ + public int updateBirdLeaveArriveInfo(BirdLeaveArriveInfo birdLeaveArriveInfo); + + /** + * 批量删除候鸟飞离和抵达时间 + * + * @param ids 需要删除的候鸟飞离和抵达时间主键集合 + * @return 结果 + */ + public int deleteBirdLeaveArriveInfoByIds(Long[] ids); + + /** + * 删除候鸟飞离和抵达时间信息 + * + * @param id 候鸟飞离和抵达时间主键 + * @return 结果 + */ + public int deleteBirdLeaveArriveInfoById(Long id); + + void calcBirdLeaveArriveInfoByParam(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdMediaService.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdMediaService.java new file mode 100644 index 0000000..6d039f7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdMediaService.java @@ -0,0 +1,68 @@ +package net.hzvtc.bird.service; + +import net.hzvtc.bird.domain.BirdMedia; +import net.hzvtc.common.core.domain.AjaxResult; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 鸟类媒体Service接口 + * + * @author admin + * @date 2022-07-19 + */ +public interface BirdMediaService { + /** + * 查询鸟类媒体 + * + * @param id 鸟类媒体主键 + * @return 鸟类媒体 + */ + public BirdMedia selectBirdMediaById(Long id); + + /** + * 查询鸟类媒体列表 + * + * @param birdMedia 鸟类媒体 + * @return 鸟类媒体集合 + */ + public List selectBirdMediaList(BirdMedia birdMedia); + + /** + * 新增鸟类媒体 + * + * @param birdMedia 鸟类媒体 + * @return 结果 + */ + public int insertBirdMedia(BirdMedia birdMedia); + + /** + * 修改鸟类媒体 + * + * @param birdMedia 鸟类媒体 + * @return 结果 + */ + public int updateBirdMedia(BirdMedia birdMedia); + + /** + * 批量删除鸟类媒体 + * + * @param ids 需要删除的鸟类媒体主键集合 + * @return 结果 + */ + public int deleteBirdMediaByIds(Long[] ids); + + /** + * 删除鸟类媒体信息 + * + * @param id 鸟类媒体主键 + * @return 结果 + */ + public int deleteBirdMediaById(Long id); + + public AjaxResult uploadFile(MultipartFile file); + + String getBirdIconImageBySpeciesId(Long speciesId); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdSpeciesService.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdSpeciesService.java new file mode 100644 index 0000000..70bbdd2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/BirdSpeciesService.java @@ -0,0 +1,88 @@ +package net.hzvtc.bird.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.data.check.domain.ResultMedia; + +import java.util.List; +import java.util.Map; + +/** + * 鸟类种类Service接口 + * + * @author admin + * @date 2022-07-18 + */ +public interface BirdSpeciesService { + /** + * 查询鸟类种类 + * + * @param id 鸟类种类主键 + * @return 鸟类种类 + */ + public BirdSpecies selectBirdSpeciesById(Long id); + + public BirdSpecies selectBirdSpeciesByName(String name); + + /** + * 查询鸟类种类列表 + * + * @param birdSpecies 鸟类种类 + * @return 鸟类种类集合 + */ + public List selectBirdSpeciesList(BirdSpecies birdSpecies); + + /** + * 新增鸟类种类 + * + * @param birdSpecies 鸟类种类 + * @return 结果 + */ + public int insertBirdSpecies(BirdSpecies birdSpecies); + + /** + * 修改鸟类种类 + * + * @param birdSpecies 鸟类种类 + * @return 结果 + */ + public int updateBirdSpecies(BirdSpecies birdSpecies); + + /** + * 批量删除鸟类种类 + * + * @param ids 需要删除的鸟类种类主键集合 + * @return 结果 + */ + public int deleteBirdSpeciesByIds(Long[] ids); + + /** + * 删除鸟类种类信息 + * + * @param id 鸟类种类主键 + * @return 结果 + */ + public int deleteBirdSpeciesById(Long id); + + String importData(List list, boolean updateSupport); + + List getResultMediaListByParam(JSONObject jsonObject); + + int recoverResultMediaStateByParam(JSONObject jsonObject); + + List getResultAudioMediaListByParam(JSONObject jsonObject); + + List getBirdMediaListByParam(JSONObject jsonObject); + + List getBirdSpeciesListByQuery(Map map); + + Long getBirdSpeciesInfoIdByName(String name); + + BirdSpecies selectBirdSpeciesForEsById(Long id); + + List getSpeciesSelectListByParam(Map param); + + String getSpeciesNameById(Long id); + + int updateSysSpeciesCode(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdCatalogueServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdCatalogueServiceImpl.java new file mode 100644 index 0000000..4161e01 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdCatalogueServiceImpl.java @@ -0,0 +1,153 @@ +package net.hzvtc.bird.service.impl; + +import net.hzvtc.bird.domain.BirdCatalogue; +import net.hzvtc.bird.mapper.BirdCatalogueMapper; +import net.hzvtc.bird.service.BirdCatalogueService; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 鸟类目Service业务层处理 + * + * @author admin + * @date 2022-07-16 + */ +@Service +public class BirdCatalogueServiceImpl implements BirdCatalogueService { + private static final Logger log = LoggerFactory.getLogger(BirdCatalogueServiceImpl.class); + @Autowired + protected Validator validator; + @Resource + private BirdCatalogueMapper birdCatalogueMapper; + + /** + * 查询鸟类目 + * + * @param id 鸟类目主键 + * @return 鸟类目 + */ + @Override + public BirdCatalogue selectBirdCatalogueById(Long id) { + return birdCatalogueMapper.selectBirdCatalogueById(id); + } + + @Override + public BirdCatalogue selectBirdCatalogueByName(String name) { + return birdCatalogueMapper.selectBirdCatalogueByName(name); + } + + /** + * 查询鸟类目列表 + * + * @param birdCatalogue 鸟类目 + * @return 鸟类目 + */ + @Override + public List selectBirdCatalogueList(BirdCatalogue birdCatalogue) { + return birdCatalogueMapper.selectBirdCatalogueList(birdCatalogue); + } + + @Override + public List getBirdCatalogueSelectList() { + return birdCatalogueMapper.getBirdCatalogueSelectList(); + } + + /** + * 新增鸟类目 + * + * @param birdCatalogue 鸟类目 + * @return 结果 + */ + @Override + public int insertBirdCatalogue(BirdCatalogue birdCatalogue) { + return birdCatalogueMapper.insertBirdCatalogue(birdCatalogue); + } + + /** + * 修改鸟类目 + * + * @param birdCatalogue 鸟类目 + * @return 结果 + */ + @Override + public int updateBirdCatalogue(BirdCatalogue birdCatalogue) { + return birdCatalogueMapper.updateBirdCatalogue(birdCatalogue); + } + + /** + * 批量删除鸟类目 + * + * @param ids 需要删除的鸟类目主键 + * @return 结果 + */ + @Override + public int deleteBirdCatalogueByIds(Long[] ids) { + return birdCatalogueMapper.deleteBirdCatalogueByIds(ids); + } + + /** + * 删除鸟类目信息 + * + * @param id 鸟类目主键 + * @return 结果 + */ + @Override + public int deleteBirdCatalogueById(Long id) { + return birdCatalogueMapper.deleteBirdCatalogueById(id); + } + + @Override + public String importData(List list, boolean isUpdateSupport) { + if (StringUtils.isNull(list) || list.size() == 0) { + throw new ServiceException("导入鸟类目数据不能为空!"); + } + AtomicInteger[] successNum = {new AtomicInteger()}; + int[] failureNum = {0}; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + list.forEach(data -> { + try { + BirdCatalogue catalogue = birdCatalogueMapper.selectBirdCatalogueByName(data.getName()); + if (Objects.isNull(catalogue)) { + BeanValidators.validateWithException(validator, data); + data.setIsDeleted(0); + insertBirdCatalogue(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟类目 " + data.getName() + " 导入成功"); + } else if (isUpdateSupport) { + BeanValidators.validateWithException(validator, data); + data.setId(catalogue.getId()); + updateBirdCatalogue(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟类目 " + data.getName() + " 更新成功"); + } else { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟类目 " + data.getName() + " 已存在"); + } + } catch (Exception e) { + failureNum[0]++; + String msg = "
" + failureNum + "、鸟类目 " + data.getName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + }); + if (failureNum[0] > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum[0] + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFamilyServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFamilyServiceImpl.java new file mode 100644 index 0000000..c3ba571 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFamilyServiceImpl.java @@ -0,0 +1,165 @@ +package net.hzvtc.bird.service.impl; + +import net.hzvtc.bird.domain.BirdCatalogue; +import net.hzvtc.bird.domain.BirdFamily; +import net.hzvtc.bird.mapper.BirdFamilyMapper; +import net.hzvtc.bird.service.BirdCatalogueService; +import net.hzvtc.bird.service.BirdFamilyService; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 鸟类科Service业务层处理 + * + * @author admin + * @date 2022-07-16 + */ +@Service +public class BirdFamilyServiceImpl implements BirdFamilyService { + private static final Logger log = LoggerFactory.getLogger(BirdFamilyServiceImpl.class); + @Autowired + protected Validator validator; + @Resource + private BirdFamilyMapper birdFamilyMapper; + @Autowired + private BirdCatalogueService catalogueService; + + /** + * 查询鸟类科 + * + * @param id 鸟类科主键 + * @return 鸟类科 + */ + @Override + public BirdFamily selectBirdFamilyById(Long id) { + return birdFamilyMapper.selectBirdFamilyById(id); + } + + /** + * 查询鸟类科列表 + * + * @param birdFamily 鸟类科 + * @return 鸟类科 + */ + @Override + public List selectBirdFamilyList(BirdFamily birdFamily) { + return birdFamilyMapper.selectBirdFamilyList(birdFamily); + } + + @Override + public List getBirdFamilyListByCataId(Long catalogueId) { + return birdFamilyMapper.getBirdFamilyListByCataId(catalogueId); + } + + /** + * 新增鸟类科 + * + * @param birdFamily 鸟类科 + * @return 结果 + */ + @Override + public int insertBirdFamily(BirdFamily birdFamily) { + return birdFamilyMapper.insertBirdFamily(birdFamily); + } + + /** + * 修改鸟类科 + * + * @param birdFamily 鸟类科 + * @return 结果 + */ + @Override + public int updateBirdFamily(BirdFamily birdFamily) { + return birdFamilyMapper.updateBirdFamily(birdFamily); + } + + /** + * 批量删除鸟类科 + * + * @param ids 需要删除的鸟类科主键 + * @return 结果 + */ + @Override + public int deleteBirdFamilyByIds(Long[] ids) { + return birdFamilyMapper.deleteBirdFamilyByIds(ids); + } + + /** + * 删除鸟类科信息 + * + * @param id 鸟类科主键 + * @return 结果 + */ + @Override + public int deleteBirdFamilyById(Long id) { + return birdFamilyMapper.deleteBirdFamilyById(id); + } + + @Override + public String importData(List list, boolean isUpdateSupport) { + if (StringUtils.isNull(list) || list.size() == 0) { + throw new ServiceException("导入鸟类科数据不能为空!"); + } + AtomicInteger[] successNum = {new AtomicInteger()}; + int[] failureNum = {0}; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + list.forEach(data -> { + try { + BirdFamily birdFamily = birdFamilyMapper.selectBirdFamilyByName(data.getFamilyName()); + BirdCatalogue birdCatalogue = catalogueService.selectBirdCatalogueByName(data.getCatalogueName()); + if (Objects.isNull(birdCatalogue)) { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟目 " + data.getFamilyName() + " 不存在"); + } else { + if (Objects.isNull(birdFamily)) { + BeanValidators.validateWithException(validator, data); + data.setIsDeleted(0); + data.setCatalogueId(birdCatalogue.getId()); + insertBirdFamily(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟科 " + data.getFamilyName() + " 导入成功"); + } else if (isUpdateSupport) { + BeanValidators.validateWithException(validator, data); + data.setId(birdFamily.getId()); + data.setCatalogueId(birdCatalogue.getId()); + updateBirdFamily(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟科 " + data.getFamilyName() + " 更新成功"); + } else { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟科 " + data.getFamilyName() + " 已存在"); + } + } + } catch (Exception e) { + failureNum[0]++; + String msg = "
" + failureNum + "、鸟科 " + data.getFamilyName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + }); + if (failureNum[0] > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum[0] + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public BirdFamily selectBirdFamilyByName(String name) { + return birdFamilyMapper.selectBirdFamilyByName(name); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFlyingInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFlyingInfoServiceImpl.java new file mode 100644 index 0000000..e6c4dd7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdFlyingInfoServiceImpl.java @@ -0,0 +1,92 @@ +package net.hzvtc.bird.service.impl; + +import net.hzvtc.bird.domain.BirdFlyingInfo; +import net.hzvtc.bird.mapper.BirdFlyingInfoMapper; +import net.hzvtc.bird.service.BirdFlyingInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 鸟类越冬飞行路线图Service业务层处理 + * + * @author admin + * @date 2022-07-30 + */ +@Service +public class BirdFlyingInfoServiceImpl implements BirdFlyingInfoService { + @Resource + private BirdFlyingInfoMapper birdFlyingInfoMapper; + + /** + * 查询鸟类越冬飞行路线图 + * + * @param id 鸟类越冬飞行路线图主键 + * @return 鸟类越冬飞行路线图 + */ + @Override + public BirdFlyingInfo selectBirdFlyingInfoById(Long id) { + return birdFlyingInfoMapper.selectBirdFlyingInfoById(id); + } + + /** + * 查询鸟类越冬飞行路线图列表 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 鸟类越冬飞行路线图 + */ + @Override + public List selectBirdFlyingInfoList(BirdFlyingInfo birdFlyingInfo) { + return birdFlyingInfoMapper.selectBirdFlyingInfoList(birdFlyingInfo); + } + + @Override + public List getAllBirdFlyingInfoList() { + return birdFlyingInfoMapper.getAllBirdFlyingInfoList(); + } + + /** + * 新增鸟类越冬飞行路线图 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 结果 + */ + @Override + public int insertBirdFlyingInfo(BirdFlyingInfo birdFlyingInfo) { + return birdFlyingInfoMapper.insertBirdFlyingInfo(birdFlyingInfo); + } + + /** + * 修改鸟类越冬飞行路线图 + * + * @param birdFlyingInfo 鸟类越冬飞行路线图 + * @return 结果 + */ + @Override + public int updateBirdFlyingInfo(BirdFlyingInfo birdFlyingInfo) { + return birdFlyingInfoMapper.updateBirdFlyingInfo(birdFlyingInfo); + } + + /** + * 批量删除鸟类越冬飞行路线图 + * + * @param ids 需要删除的鸟类越冬飞行路线图主键 + * @return 结果 + */ + @Override + public int deleteBirdFlyingInfoByIds(Long[] ids) { + return birdFlyingInfoMapper.deleteBirdFlyingInfoByIds(ids); + } + + /** + * 删除鸟类越冬飞行路线图信息 + * + * @param id 鸟类越冬飞行路线图主键 + * @return 结果 + */ + @Override + public int deleteBirdFlyingInfoById(Long id) { + return birdFlyingInfoMapper.deleteBirdFlyingInfoById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdGenusServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdGenusServiceImpl.java new file mode 100644 index 0000000..871a567 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdGenusServiceImpl.java @@ -0,0 +1,170 @@ +package net.hzvtc.bird.service.impl; + +import net.hzvtc.bird.domain.BirdFamily; +import net.hzvtc.bird.domain.BirdGenus; +import net.hzvtc.bird.mapper.BirdGenusMapper; +import net.hzvtc.bird.service.BirdFamilyService; +import net.hzvtc.bird.service.BirdGenusService; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 鸟类属Service业务层处理 + * + * @author admin + * @date 2022-07-18 + */ +@Service +public class BirdGenusServiceImpl implements BirdGenusService { + private static final Logger log = LoggerFactory.getLogger(BirdGenusServiceImpl.class); + @Autowired + protected Validator validator; + @Resource + private BirdGenusMapper birdGenusMapper; + @Autowired + private BirdFamilyService familyService; + + /** + * 查询鸟类属 + * + * @param id 鸟类属主键 + * @return 鸟类属 + */ + @Override + public BirdGenus selectBirdGenusById(Long id) { + BirdGenus data = birdGenusMapper.selectBirdGenusById(id); + if (data.getFamilyId() != null) { + BirdFamily birdFamily = familyService.selectBirdFamilyById(data.getFamilyId()); + data.setCatalogueId(birdFamily.getCatalogueId()); + } + return data; + } + + /** + * 查询鸟类属列表 + * + * @param birdGenus 鸟类属 + * @return 鸟类属 + */ + @Override + public List selectBirdGenusList(BirdGenus birdGenus) { + return birdGenusMapper.selectBirdGenusList(birdGenus); + } + + /** + * 新增鸟类属 + * + * @param birdGenus 鸟类属 + * @return 结果 + */ + @Override + public int insertBirdGenus(BirdGenus birdGenus) { + return birdGenusMapper.insertBirdGenus(birdGenus); + } + + /** + * 修改鸟类属 + * + * @param birdGenus 鸟类属 + * @return 结果 + */ + @Override + public int updateBirdGenus(BirdGenus birdGenus) { + return birdGenusMapper.updateBirdGenus(birdGenus); + } + + /** + * 批量删除鸟类属 + * + * @param ids 需要删除的鸟类属主键 + * @return 结果 + */ + @Override + public int deleteBirdGenusByIds(Long[] ids) { + return birdGenusMapper.deleteBirdGenusByIds(ids); + } + + /** + * 删除鸟类属信息 + * + * @param id 鸟类属主键 + * @return 结果 + */ + @Override + public int deleteBirdGenusById(Long id) { + return birdGenusMapper.deleteBirdGenusById(id); + } + + @Override + public List getBirdGenusListByFamilyId(Long familyId) { + return birdGenusMapper.getBirdGenusListByFamilyId(familyId); + } + + @Override + public String importData(List list, boolean isUpdateSupport) { + if (StringUtils.isNull(list) || list.size() == 0) { + throw new ServiceException("导入鸟类属数据不能为空!"); + } + AtomicInteger[] successNum = {new AtomicInteger()}; + int[] failureNum = {0}; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + list.forEach(data -> { + try { + BirdGenus birdGenus = birdGenusMapper.selectBirdGenusByName(data.getName()); + BirdFamily birdFamily = familyService.selectBirdFamilyByName(data.getFamilyName()); + if (Objects.isNull(birdFamily)) { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟科 " + data.getFamilyName() + " 不存在"); + } else { + if (Objects.isNull(birdGenus)) { + BeanValidators.validateWithException(validator, data); + data.setIsDeleted(0); + data.setFamilyId(birdFamily.getId()); + insertBirdGenus(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟属 " + data.getFamilyName() + " 导入成功"); + } else if (isUpdateSupport) { + BeanValidators.validateWithException(validator, data); + data.setId(birdGenus.getId()); + data.setFamilyId(birdFamily.getId()); + updateBirdGenus(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟属 " + data.getFamilyName() + " 更新成功"); + } else { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟属 " + data.getFamilyName() + " 已存在"); + } + } + } catch (Exception e) { + failureNum[0]++; + String msg = "
" + failureNum + "、鸟属 " + data.getFamilyName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + }); + if (failureNum[0] > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum[0] + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public BirdGenus selectBirdGenusByName(String name) { + return birdGenusMapper.selectBirdGenusByName(name); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdLeaveArriveInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdLeaveArriveInfoServiceImpl.java new file mode 100644 index 0000000..28ccff7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdLeaveArriveInfoServiceImpl.java @@ -0,0 +1,155 @@ +package net.hzvtc.bird.service.impl; + +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.bird.domain.BirdLeaveArriveInfo; +import net.hzvtc.bird.mapper.BirdLeaveArriveInfoMapper; +import net.hzvtc.bird.service.BirdLeaveArriveInfoService; +import net.hzvtc.data.check.service.ResultRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 候鸟飞离和抵达时间Service业务层处理 + * + * @author admin + * @date 2023-03-27 + */ +@Service +@Slf4j +public class BirdLeaveArriveInfoServiceImpl implements BirdLeaveArriveInfoService { + @Resource + private BirdLeaveArriveInfoMapper birdLeaveArriveInfoMapper; + + + @Autowired + private ResultRecordService resultRecordService; + + /** + * 查询候鸟飞离和抵达时间 + * + * @param id 候鸟飞离和抵达时间主键 + * @return 候鸟飞离和抵达时间 + */ + @Override + public BirdLeaveArriveInfo selectBirdLeaveArriveInfoById(Long id) { + return birdLeaveArriveInfoMapper.selectBirdLeaveArriveInfoById(id); + } + + /** + * 查询候鸟飞离和抵达时间列表 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 候鸟飞离和抵达时间 + */ + @Override + public List selectBirdLeaveArriveInfoList(BirdLeaveArriveInfo birdLeaveArriveInfo) { + return birdLeaveArriveInfoMapper.selectBirdLeaveArriveInfoList(birdLeaveArriveInfo); + } + + /** + * 新增候鸟飞离和抵达时间 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 结果 + */ + @Override + public int insertBirdLeaveArriveInfo(BirdLeaveArriveInfo birdLeaveArriveInfo) { + return birdLeaveArriveInfoMapper.insertBirdLeaveArriveInfo(birdLeaveArriveInfo); + } + + /** + * 修改候鸟飞离和抵达时间 + * + * @param birdLeaveArriveInfo 候鸟飞离和抵达时间 + * @return 结果 + */ + @Override + public int updateBirdLeaveArriveInfo(BirdLeaveArriveInfo birdLeaveArriveInfo) { + return birdLeaveArriveInfoMapper.updateBirdLeaveArriveInfo(birdLeaveArriveInfo); + } + + /** + * 批量删除候鸟飞离和抵达时间 + * + * @param ids 需要删除的候鸟飞离和抵达时间主键 + * @return 结果 + */ + @Override + public int deleteBirdLeaveArriveInfoByIds(Long[] ids) { + return birdLeaveArriveInfoMapper.deleteBirdLeaveArriveInfoByIds(ids); + } + + /** + * 删除候鸟飞离和抵达时间信息 + * + * @param id 候鸟飞离和抵达时间主键 + * @return 结果 + */ + @Override + public int deleteBirdLeaveArriveInfoById(Long id) { + return birdLeaveArriveInfoMapper.deleteBirdLeaveArriveInfoById(id); + } + + @Override + public void calcBirdLeaveArriveInfoByParam() { + Integer statYear = LocalDate.now().getYear() - 1; + Map map = new HashMap<>(); + List areaIds = resultRecordService.getResultAreaListByParam(map); + List allList = new ArrayList<>(); + areaIds.stream().forEach(areaId -> { + map.put("areaId", areaId); + map.put("statYear", statYear + 1); + List leaveList = birdLeaveArriveInfoMapper.getBirdLeaveDateByParam(map); + + map.put("statYear", statYear); + List arriveList = birdLeaveArriveInfoMapper.getBirdArrivalDateByParam(map); + + leaveList = concatList(leaveList, arriveList); + if (leaveList != null) { + leaveList.forEach(item -> { + item.setAreaId(areaId); + item.setStatYear(statYear); + item.setIsDeleted(0); + }); + allList.addAll(leaveList); + } + }); + if (!allList.isEmpty()) { + birdLeaveArriveInfoMapper.batchInsertBirdLeaveArriveInfo(allList); + } + } + + private List concatList(List leaveList, List arriveList) { + if (leaveList == null || leaveList.isEmpty()) { + return arriveList; + } else if (arriveList == null || arriveList.isEmpty()) { + return leaveList; + } + + leaveList.forEach(item -> { + List sameList = arriveList.stream().filter(aitem -> aitem.getSpeciesId() == item.getSpeciesId()).collect(Collectors.toList()); + + if (!sameList.isEmpty()) { + item.setArriveDate(sameList.get(0).getArriveDate()); + } + }); + + + leaveList.forEach(item -> { + List sameList = leaveList.stream().filter(aitem -> aitem.getSpeciesId() == item.getSpeciesId()).collect(Collectors.toList()); + if (sameList == null || sameList.size() == 0) { + leaveList.add(item); + } + }); + return leaveList; + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdMediaServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdMediaServiceImpl.java new file mode 100644 index 0000000..189c3fb --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdMediaServiceImpl.java @@ -0,0 +1,152 @@ +package net.hzvtc.bird.service.impl; + +import lombok.RequiredArgsConstructor; +import net.hzvtc.bird.domain.BirdMedia; +import net.hzvtc.bird.mapper.BirdMediaMapper; +import net.hzvtc.bird.service.BirdMediaService; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.redis.RedisCache; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.common.utils.file.FileUploadUtils; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.List; + +/** + * 鸟类媒体Service业务层处理 + * + * @author admin + * @date 2022-07-19 + */ +@Service +@RequiredArgsConstructor +public class BirdMediaServiceImpl implements BirdMediaService { + @Resource + private BirdMediaMapper birdMediaMapper; + + private final RedisCache redisCache; + + /** + * 查询鸟类媒体 + * + * @param id 鸟类媒体主键 + * @return 鸟类媒体 + */ + @Override + public BirdMedia selectBirdMediaById(Long id) { + return birdMediaMapper.selectBirdMediaById(id); + } + + /** + * 查询鸟类媒体列表 + * + * @param birdMedia 鸟类媒体 + * @return 鸟类媒体 + */ + @Override + public List selectBirdMediaList(BirdMedia birdMedia) { + return birdMediaMapper.selectBirdMediaList(birdMedia); + } + + /** + * 新增鸟类媒体 + * + * @param birdMedia 鸟类媒体 + * @return 结果 + */ + @Override + public int insertBirdMedia(BirdMedia birdMedia) { + birdMedia.setCreateTime(DateUtils.getNowDate()); + return birdMediaMapper.insertBirdMedia(birdMedia); + } + + /** + * 修改鸟类媒体 + * + * @param birdMedia 鸟类媒体 + * @return 结果 + */ + @Override + public int updateBirdMedia(BirdMedia birdMedia) { + return birdMediaMapper.updateBirdMedia(birdMedia); + } + + /** + * 批量删除鸟类媒体 + * + * @param ids 需要删除的鸟类媒体主键 + * @return 结果 + */ + @Override + public int deleteBirdMediaByIds(Long[] ids) { + return birdMediaMapper.deleteBirdMediaByIds(ids); + } + + /** + * 删除鸟类媒体信息 + * + * @param id 鸟类媒体主键 + * @return 结果 + */ + @Override + public int deleteBirdMediaById(Long id) { + return birdMediaMapper.deleteBirdMediaById(id); + } + + @Override + public AjaxResult uploadFile(MultipartFile file) { + String fileName = file.getOriginalFilename(); + String mediaType = getMediaType(fileName); + String baseDir = FileUploadUtils.getBirdMediaPath() + "/" + mediaType; + try { + BirdMedia data = new BirdMedia(); + String path = FileUploadUtils.upload(baseDir, file); + data.setMediaType(mediaType); + data.setName(removeFileExt(fileName)); + data.setUrl(path); + return AjaxResult.success(data); + } catch (IOException e) { + return AjaxResult.error(e.getMessage()); + } + } + + @Override + public String getBirdIconImageBySpeciesId(Long speciesId) { + String key = "birdIcon_" + speciesId; + String str = redisCache.getCacheObject(key); + if (str == null) { + str = birdMediaMapper.getBirdIconImageBySpeciesId(speciesId); + redisCache.setCacheObject(key, str); + } + return str; + } + + private String removeFileExt(String fileName) { + int pos = fileName.lastIndexOf("."); + if (pos == -1) { + return fileName; + } else { + return fileName.substring(0, pos); + } + } + + private String getMediaType(String fileName) { + int pos = fileName.lastIndexOf("."); + if (pos == -1) { + return ""; + } + String ext = fileName.substring(pos + 1); + if (ext.equalsIgnoreCase("png") || ext.equalsIgnoreCase("jpg") || ext.equalsIgnoreCase("jpeg")) { + return "images"; + } else if (ext.equalsIgnoreCase("mp3") || ext.equalsIgnoreCase("wav")) { + return "audio"; + } else if (ext.equalsIgnoreCase("mp4") || ext.equalsIgnoreCase("mkv") || ext.equalsIgnoreCase("m4v") || ext.equalsIgnoreCase("wmv")) { + return "video"; + } else { + return "file"; + } + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdSpeciesServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdSpeciesServiceImpl.java new file mode 100644 index 0000000..2b87a4e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/bird/service/impl/BirdSpeciesServiceImpl.java @@ -0,0 +1,296 @@ +package net.hzvtc.bird.service.impl; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.bird.domain.BirdGenus; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.bird.mapper.BirdSpeciesMapper; +import net.hzvtc.bird.service.BirdGenusService; +import net.hzvtc.bird.service.BirdSpeciesService; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.service.ResultMediaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 鸟类种类Service业务层处理 + * + * @author admin + * @date 2022-07-18 + */ +@Service +public class BirdSpeciesServiceImpl implements BirdSpeciesService { + private static final Logger log = LoggerFactory.getLogger(BirdSpeciesServiceImpl.class); + @Autowired + protected Validator validator; + @Resource + private BirdSpeciesMapper birdSpeciesMapper; + @Autowired + private BirdGenusService genusService; + @Autowired + private ResultMediaService resultMediaService; + + /** + * 查询鸟类种类 + * + * @param id 鸟类种类主键 + * @return 鸟类种类 + */ + @Override + public BirdSpecies selectBirdSpeciesById(Long id) { + return birdSpeciesMapper.selectBirdSpeciesById(id); + } + + @Override + public BirdSpecies selectBirdSpeciesByName(String name) { + return birdSpeciesMapper.selectBirdSpeciesByName(name); + } + + /** + * 查询鸟类种类列表 + * + * @param birdSpecies 鸟类种类 + * @return 鸟类种类 + */ + @Override + public List selectBirdSpeciesList(BirdSpecies birdSpecies) { + return birdSpeciesMapper.selectBirdSpeciesList(birdSpecies); + } + + /** + * 新增鸟类种类 + * + * @param birdSpecies 鸟类种类 + * @return 结果 + */ + @Override + public int insertBirdSpecies(BirdSpecies birdSpecies) { + birdSpecies.setCreateTime(DateUtils.getNowDate()); + birdSpecies.setIsDeleted(0); + birdSpecies.setCreateBy("admin"); + return birdSpeciesMapper.insertBirdSpecies(birdSpecies); + } + + /** + * 修改鸟类种类 + * + * @param birdSpecies 鸟类种类 + * @return 结果 + */ + @Override + public int updateBirdSpecies(BirdSpecies birdSpecies) { + birdSpecies.setUpdateTime(DateUtils.getNowDate()); + birdSpecies.setUpdateBy(SecurityUtils.getUsername()); + return birdSpeciesMapper.updateBirdSpecies(birdSpecies); + } + + /** + * 批量删除鸟类种类 + * + * @param ids 需要删除的鸟类种类主键 + * @return 结果 + */ + @Override + public int deleteBirdSpeciesByIds(Long[] ids) { + return birdSpeciesMapper.deleteBirdSpeciesByIds(ids); + } + + /** + * 删除鸟类种类信息 + * + * @param id 鸟类种类主键 + * @return 结果 + */ + @Override + public int deleteBirdSpeciesById(Long id) { + return birdSpeciesMapper.deleteBirdSpeciesById(id); + } + + @Override + public String importData(List list, boolean updateSupport) { + if (StringUtils.isNull(list) || list.size() == 0) { + throw new ServiceException("导入鸟类数据不能为空!"); + } + AtomicInteger[] successNum = {new AtomicInteger()}; + int[] failureNum = {0}; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + list.forEach(data -> { + try { + BirdSpecies birdSpecies = birdSpeciesMapper.selectBirdSpeciesByName(data.getName()); + BirdGenus birdGenus = genusService.selectBirdGenusByName(data.getGenusName()); + if (Objects.isNull(birdGenus)) { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟属 " + data.getGenusName() + " 不存在"); + } else { + if (Objects.isNull(birdSpecies)) { + BeanValidators.validateWithException(validator, data); + data.setIsDeleted(0); + data.setGenusId(birdGenus.getId()); + data.setFamilyId(birdGenus.getFamilyId()); + insertBirdSpecies(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟类 " + data.getName() + " 导入成功"); + } else if (updateSupport) { + BeanValidators.validateWithException(validator, data); + data.setId(birdSpecies.getId()); + data.setGenusId(birdGenus.getId()); + data.setFamilyId(birdGenus.getFamilyId()); + updateBirdSpecies(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、鸟类 " + data.getName() + " 更新成功"); + } else { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、鸟类 " + data.getName() + " 已存在"); + } + } + } catch (Exception e) { + failureNum[0]++; + String msg = "
" + failureNum + "、鸟类 " + data.getName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + }); + if (failureNum[0] > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum[0] + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getResultMediaListByParam(JSONObject jsonObject) { + Long mediaId = jsonObject.getLong("mediaId"); + if (mediaId != null) { + List list = new ArrayList<>(); + ResultMedia data = resultMediaService.getResultMediaListById(mediaId); + list.add(data); + return list; + } else { + return resultMediaService.getResultMediaListByParam(createQueryParameter(jsonObject)); + } + } + + @Override + public int recoverResultMediaStateByParam(JSONObject jsonObject) { + return resultMediaService.recoverResultMediaStateByParam(createQueryParameter(jsonObject)); + } + + private Map createQueryParameter(JSONObject jsonObject) { + Map map = new HashMap<>(); + Long mediaId = jsonObject.getLong("mediaId"); + map.put("mediaId", mediaId); + + Long areaId = jsonObject.getLong("areaId"); + map.put("areaId", areaId); + + String mediaType = jsonObject.getString("mediaType"); + map.put("mediaType", mediaType); + + Long speciesId = jsonObject.getLong("speciesId"); + map.put("speciesId", speciesId); + + Long deviceId = jsonObject.getLong("deviceId"); + map.put("deviceId", deviceId); + + String mediaTypes = jsonObject.getString("mediaTypes"); + if (mediaTypes != null && !mediaTypes.isEmpty()) { + String[] arr = mediaTypes.split(","); + map.put("mediaTypes", arr); + } + Integer isDeleted = jsonObject.getInteger("isDeleted"); + map.put("isDeleted", isDeleted); + String dateFrom = jsonObject.getString("dateFrom"); + map.put("dateFrom", dateFrom); + String dateTo = jsonObject.getString("dateTo"); + map.put("dateTo", dateTo); + Integer limit = jsonObject.getInteger("limit"); + map.put("limit", limit); + Integer isCommon = jsonObject.getInteger("isCommon"); + map.put("isCommon", isCommon); +// log.info("======map==={}", map); + return map; + } + + @Override + public List getResultAudioMediaListByParam(JSONObject jsonObject) { + return resultMediaService.getResultAudioMediaListByParam(createQueryParameter(jsonObject)); + } + + @Override + public List getBirdMediaListByParam(JSONObject jsonObject) { + Map map = createQueryParameter(jsonObject); + String dateFrom = jsonObject.getString("dateFrom"); + String dateTo = jsonObject.getString("dateTo"); + +// if (dateFrom == null && dateTo == null) { +// LocalDate localDate = LocalDate.now(); +// dateTo = localDate.toString(); +// localDate = localDate.plusDays(-7); +// dateFrom = localDate.toString(); +// } + if (SecurityUtils.getDeptId() == 0) { + map.put("userId", SecurityUtils.getUserId()); + } + map.put("dateFrom", dateFrom); + map.put("dateTo", dateTo); + Integer recordType = jsonObject.getInteger("recordType"); + map.put("recordType", recordType); + Integer recordTypeNot = jsonObject.getInteger("recordTypeNot"); + map.put("recordTypeNot", recordTypeNot); + Integer pageLimit = jsonObject.getInteger("pageLimit"); + map.put("pageLimit", pageLimit); + return resultMediaService.getBirdMediaListByParam(map); + } + + @Override + public List getBirdSpeciesListByQuery(Map map) { + return birdSpeciesMapper.getBirdSpeciesListByQuery(map); + } + + @Override + public Long getBirdSpeciesInfoIdByName(String name) { + List list = birdSpeciesMapper.getBirdSpeciesInfoByName(name); + if (list != null && !list.isEmpty()) { + return list.get(0).getId(); + } + return null; + } + + @Override + public BirdSpecies selectBirdSpeciesForEsById(Long id) { + return birdSpeciesMapper.selectBirdSpeciesForEsById(id); + } + + @Override + public List getSpeciesSelectListByParam(Map param) { + return birdSpeciesMapper.getSpeciesSelectListByParam(param); + } + + @Override + public String getSpeciesNameById(Long id) { + return birdSpeciesMapper.getSpeciesNameById(id); + } + + @Override + @Transactional + public int updateSysSpeciesCode() { + birdSpeciesMapper.deleteSysSpeciesCode(); + birdSpeciesMapper.insertSysSpeciesCode(); + return 1; + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/FavoriteMediaController.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/FavoriteMediaController.java new file mode 100644 index 0000000..1bf990b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/FavoriteMediaController.java @@ -0,0 +1,106 @@ +package net.hzvtc.data.check.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.data.check.domain.FavoriteMedia; +import net.hzvtc.data.check.service.FavoriteMediaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 收藏的视频Controller + * + * @author admin + * @date 2024-06-18 + */ +@RestController +@RequestMapping("/media/favorite") +public class FavoriteMediaController extends BaseController { + @Autowired + private FavoriteMediaService favoriteMediaService; + + /** + * 查询收藏的视频列表 + */ + @PreAuthorize("@ss.hasPermi('media:favorite:list')") + @GetMapping("/list") + public TableDataInfo list(FavoriteMedia favoriteMedia) { + startPage(); + List list = favoriteMediaService.selectFavoriteMediaList(favoriteMedia); + return getDataTable(list); + } + + /** + * 导出收藏的视频列表 + */ + @PreAuthorize("@ss.hasPermi('media:favorite:export')") + @Log(title = "收藏的视频", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, FavoriteMedia favoriteMedia) { + List list = favoriteMediaService.selectFavoriteMediaList(favoriteMedia); + ExcelUtil util = new ExcelUtil<>(FavoriteMedia.class); + util.exportExcel(response, list, "收藏的视频数据"); + } + + /** + * 获取收藏的视频详细信息 + */ + @PreAuthorize("@ss.hasPermi('media:favorite:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(favoriteMediaService.selectFavoriteMediaById(id)); + } + + /** + * 新增收藏的视频 + */ + @PreAuthorize("@ss.hasPermi('media:favorite:add')") + @Log(title = "收藏的视频", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody FavoriteMedia favoriteMedia) { + return toAjax(favoriteMediaService.insertFavoriteMedia(favoriteMedia)); + } + + /** + * 修改收藏的视频 + */ + @PreAuthorize("@ss.hasPermi('media:favorite:edit')") + @Log(title = "收藏的视频", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody FavoriteMedia favoriteMedia) { + return toAjax(favoriteMediaService.updateFavoriteMedia(favoriteMedia)); + } + + /** + * 删除收藏的视频 + */ + @PreAuthorize("@ss.hasPermi('media:favorite:remove')") + @Log(title = "收藏的视频", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(favoriteMediaService.deleteFavoriteMediaByIds(ids)); + } + + @GetMapping(value = "/byMediaId/{id}") + public AjaxResult getFavoriteIdByMediaId(@PathVariable("id") Long id) { + return AjaxResult.success(favoriteMediaService.getFavoriteMediaByMediaId(id)); + } + + @GetMapping(value = "/getHeartId/{id}") + public AjaxResult getHeartIdByMediaId(@PathVariable("id") Long id) { + return AjaxResult.success(favoriteMediaService.getHeartMediaByMediaId(id)); + } + + @PostMapping("/handle") + public AjaxResult handleAction(@RequestBody FavoriteMedia favoriteMedia) { + return AjaxResult.success(favoriteMediaService.handleAction(favoriteMedia)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/MediaItemController.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/MediaItemController.java new file mode 100644 index 0000000..63aa003 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/MediaItemController.java @@ -0,0 +1,24 @@ +package net.hzvtc.data.check.controller; + +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.data.check.service.MediaItemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/dataCheck/mediaItem") +public class MediaItemController extends BaseController { + @Autowired + private MediaItemService mediaItemService; + + + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(mediaItemService.selectMediaItemById(id)); + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultMediaController.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultMediaController.java new file mode 100644 index 0000000..0d32597 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultMediaController.java @@ -0,0 +1,97 @@ +package net.hzvtc.data.check.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.service.ResultMediaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 监测结果附件Controller + * + * @author admin + * @date 2023-01-11 + */ +@RestController +@RequestMapping("/dataCheck/resultMedia") +public class ResultMediaController extends BaseController { + @Autowired + private ResultMediaService resultMediaService; + + /** + * 查询监测结果附件列表 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:resultMedia:list')") + @GetMapping("/list") + public TableDataInfo list(ResultMedia resultMedia) { + startPage(); + List list = resultMediaService.selectResultMediaListByParam(resultMedia); + return getDataTable(list); + } + + /** + * 导出监测结果附件列表 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:resultMedia:export')") + @Log(title = "监测结果附件", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ResultMedia resultMedia) { + List list = resultMediaService.selectResultMediaList(resultMedia); + ExcelUtil util = new ExcelUtil(ResultMedia.class); + util.exportExcel(response, list, "监测媒体数据"); + } + + + /** + * 新增监测结果附件 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:resultMedia:add')") + @Log(title = "监测结果附件", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ResultMedia resultMedia) { + return toAjax(resultMediaService.insertResultMedia(resultMedia)); + } + + + /** + * 删除监测结果附件 + */ +// @PreAuthorize("@ss.hasPermi('dataCheck:resultMedia:remove')") + @Log(title = "监测结果附件", businessType = BusinessType.DELETE) + @DeleteMapping("/{mediaIds}") + public AjaxResult remove(@PathVariable Long[] mediaIds) { + return toAjax(resultMediaService.deleteResultMediaByMediaIds(mediaIds)); + } + + @PostMapping("/updateStatus") + public AjaxResult updateStatus(@RequestBody ResultMedia param) { + return AjaxResult.success(resultMediaService.updateResultMediaStatusByParam(param)); + } + + @PostMapping("/favoriteList") + public AjaxResult getFavoriteList(@RequestBody JSONObject object) { + return AjaxResult.success(resultMediaService.getFavoriteVideoListByParam(object)); + } + + @GetMapping("/mediaStatInfo") + public JSONObject getStatAmount() { + return resultMediaService.getResultMediaStatByParam(); + } + + @GetMapping("/mediaListByItemId") + public AjaxResult getResultMediaListByItemId(Long itemId){ + return AjaxResult.success(resultMediaService.getResultMediaListByItemId(itemId)); + } + + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordController.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordController.java new file mode 100644 index 0000000..f688f5a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordController.java @@ -0,0 +1,159 @@ +package net.hzvtc.data.check.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.file.FileUtils; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.data.check.domain.ResultRecord; +import net.hzvtc.data.check.service.ResultRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 监测结果记录Controller + * + * @author admin + * @date 2022-08-22 + */ +@Slf4j +@RestController +@RequestMapping("/dataCheck/checkRecord") +public class ResultRecordController extends BaseController { + @Autowired + private ResultRecordService resultRecordService; + + /** + * 查询监测结果记录列表 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:checkRecord:list')") + @GetMapping("/list") + public TableDataInfo list(ResultRecord resultRecord) { + startPage(); + List list = resultRecordService.selectResultRecordList(resultRecord); + return getDataTable(list); + } + + /** + * 导出监测结果记录列表 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:checkRecord:export')") + @Log(title = "监测结果记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ResultRecord resultRecord) { + List list = resultRecordService.selectResultRecordList(resultRecord); + ExcelUtil util = new ExcelUtil(ResultRecord.class); + util.exportExcel(response, list, "监测结果记录数据"); + } + + /** + * 获取监测结果记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:checkRecord:query')") + @GetMapping(value = "/{recordId}") + public AjaxResult getInfo(@PathVariable("recordId") Long recordId) { + return AjaxResult.success(resultRecordService.selectResultRecordByRecordId(recordId)); + } + + /** + * 新增监测结果记录 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:checkRecord:add')") + @Log(title = "监测结果记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ResultRecord resultRecord) { + return toAjax(resultRecordService.insertResultRecord(resultRecord)); + } + + /** + * 修改监测结果记录 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:checkRecord:edit')") + @Log(title = "监测结果记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ResultRecord resultRecord) { + return toAjax(resultRecordService.updateResultRecord(resultRecord)); + } + + /** + * 删除监测结果记录 + */ + @PreAuthorize("@ss.hasPermi('dataCheck:checkRecord:remove')") + @Log(title = "监测结果记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{recordIds}") + public AjaxResult remove(@PathVariable Long[] recordIds) { + return toAjax(resultRecordService.deleteResultRecordByRecordIds(recordIds)); + } + + @PostMapping("/getBirdStatData") + public AjaxResult getBirdStatData(@RequestBody JSONObject object) { + return AjaxResult.success(resultRecordService.getBirdDataStatByParam(object)); + } + + @PostMapping("/getBirdWeeklyStatData") + public AjaxResult getBirdWeeklyStatData(@RequestBody JSONObject object) { + return AjaxResult.success(resultRecordService.getBirdDataWeeklyStatByParam(object)); + } + + + @PostMapping("/sendEmail") + public AjaxResult sendEmail(@RequestBody JSONObject object) { + return AjaxResult.success(resultRecordService.sendBirdDataStatEmail(object)); + } + + @PostMapping("/sendWeeklyEmail") + public AjaxResult sendWeeklyEmail(@RequestBody JSONObject object) { + return AjaxResult.success(resultRecordService.sendBirdDataWeeklyStatEmail(object)); + } + + @PostMapping("/downloadReport") + public void downloadReport(@RequestParam Map params, HttpServletResponse response, HttpServletRequest request) { + JSONObject obj = new JSONObject(); + obj.put("areaId", params.get("areaId")); + obj.put("calcDate", params.get("calcDate")); + String filePath = resultRecordService.getBirdDataStatFileByParam(obj); +// System.out.println("========filePath============" + filePath); + if (filePath != null) { + try { + String realFileName = System.currentTimeMillis() + ".xlsx"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + @PostMapping("/downloadWeeklyReport") + public void downloadWeeklyReport(@RequestParam Map params, HttpServletResponse response, HttpServletRequest request) { + JSONObject obj = new JSONObject(); + obj.put("areaId", params.get("areaId")); + obj.put("calcDate", params.get("calcDate")); + String filePath = resultRecordService.getBirdDataWeeklyStatFileByParam(obj); + if (filePath != null) { + try { + String realFileName = System.currentTimeMillis() + ".xlsx"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordDetailsController.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordDetailsController.java new file mode 100644 index 0000000..3fd5168 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/controller/ResultRecordDetailsController.java @@ -0,0 +1,139 @@ +package net.hzvtc.data.check.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.data.check.domain.ResultRecordDetails; +import net.hzvtc.data.check.service.ResultRecordDetailsService; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 监测记录详细信息Controller + * + * @author admin + * @date 2022-08-22 + */ +@RestController +@RequestMapping("/dataCheck/checkDetails") +public class ResultRecordDetailsController extends BaseController { + @Autowired + private ResultRecordDetailsService resultRecordDetailsService; + + /** + * 查询监测记录详细信息列表 + */ +// @PreAuthorize("@ss.hasPermi('dataCheck:checkDetails:list')") + @GetMapping("/list") + public TableDataInfo list(ResultRecordDetails resultRecordDetails) { + startPage(); + List list = resultRecordDetailsService.selectResultRecordDetailsList(resultRecordDetails); + return getDataTable(list); + } + + /** + * 导出监测记录详细信息列表 + */ +// @PreAuthorize("@ss.hasPermi('dataCheck:checkDetails:export')") + @Log(title = "监测记录详细信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ResultRecordDetails resultRecordDetails) { + List list = resultRecordDetailsService.selectResultRecordDetailsList(resultRecordDetails); + ExcelUtil util = new ExcelUtil<>(ResultRecordDetails.class); + util.exportExcel(response, list, "监测记录详细信息数据"); + } + + /** + * 获取监测记录详细信息详细信息 + */ +// @PreAuthorize("@ss.hasPermi('dataCheck:checkDetails:query')") + @GetMapping(value = "/{detailsId}") + public AjaxResult getInfo(@PathVariable("detailsId") Long detailsId) { + return AjaxResult.success(resultRecordDetailsService.selectResultRecordDetailsByDetailsId(detailsId)); + } + + /** + * 新增监测记录详细信息 + */ +// @PreAuthorize("@ss.hasPermi('dataCheck:checkDetails:add')") + @Log(title = "监测记录详细信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ResultRecordDetails resultRecordDetails) { + return toAjax(resultRecordDetailsService.insertResultRecordDetails(resultRecordDetails)); + } + + /** + * 修改监测记录详细信息 + */ +// @PreAuthorize("@ss.hasPermi('dataCheck:checkDetails:edit')") + @Log(title = "监测记录详细信息", businessType = BusinessType.UPDATE) + @PutMapping + public Long edit(@RequestBody ResultRecordDetails resultRecordDetails) { + return resultRecordDetailsService.updateResultRecordDetails(resultRecordDetails); + } + + /** + * 删除监测记录详细信息 + */ +// @PreAuthorize("@ss.hasPermi('dataCheck:checkDetails:remove')") + @Log(title = "监测记录详细信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{detailsIds}") + public AjaxResult remove(@PathVariable Long[] detailsIds) { + return toAjax(resultRecordDetailsService.deleteResultRecordDetailsByDetailsIds(detailsIds)); + } + + + @GetMapping("/areaSpeciesListByParam") + public AjaxResult getSpeciesListByParam() { + return AjaxResult.success(resultRecordDetailsService.getSpeciesListByParam()); + } + + @PostMapping("/updateCheckState") + public AjaxResult updateCheckedState(@RequestBody JSONObject params) { + Long id = params.getLong("id"); + return AjaxResult.success(resultRecordDetailsService.updateResultRecordDetailsCheckState(id)); + } + + @PostMapping("/delRecordDetails") + public AjaxResult delRecordDetails(@RequestBody JSONObject obj) { + return AjaxResult.success(resultRecordDetailsService.deleteResultRecordDetails(obj)); + } + + @GetMapping("/speciesListByUserId") + public AjaxResult getSpeciesListByUserId(Long areaId) { + return AjaxResult.success(resultRecordDetailsService.getSpeciesListByUserId(areaId)); + } + + @PostMapping("/speciesMediaList") + public TableDataInfo getSpeciesMediaListByParam(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + Integer pageSize = params.getInteger("pageSize"); + startPage(pageNum == null ? 1 : pageNum, pageSize == null ? 10 : pageSize); + List list = resultRecordDetailsService.getSpeciesMediaListByParam(params); + return getDataTable(list); + } + + @PostMapping("/speciesHourAmount") + public JSONArray getSpeciesHourAmountListByParam(@RequestBody JSONObject params) { + return resultRecordDetailsService.getSpeciesHourAmountListByParam(params); + } + + @PostMapping("/speciesAudioAmountListByParam") + public JSONObject getSpeciesAudioAmountReportByParam(@RequestBody JSONObject param) { + return resultRecordDetailsService.getSpeciesAudioAmountReportByParam(param); + } + + @PostMapping("/modifyDetailsByParam") + public AjaxResult modifyDetailsByParam(@RequestBody ResultRecordDetails data) { + return AjaxResult.success(resultRecordDetailsService.modifyRecordDetails(data)); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/FavoriteMedia.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/FavoriteMedia.java new file mode 100644 index 0000000..8c469f4 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/FavoriteMedia.java @@ -0,0 +1,66 @@ +package net.hzvtc.data.check.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.io.Serializable; +import java.util.Date; + +/** + * 收藏的视频对象 favorite_media + * + * @author admin + * @date 2024-06-18 + */ +@Data +@Alias("FavoriteMedia") +public class FavoriteMedia implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 视频ID + */ + @Excel(name = "视频ID") + private Long mediaId; + + private Long detailId; + + /** + * 用户ID + */ + private Long userId; + + /** + * $column.columnComment + */ + private Date createDate; + + private Long speciesId; + + private Integer type = 0; + + /** + * $column.columnComment + */ + private int isDeleted; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("mediaId", getMediaId()) + .append("userId", getUserId()) + .append("createDate", getCreateDate()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/MediaItem.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/MediaItem.java new file mode 100644 index 0000000..2b496ba --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/MediaItem.java @@ -0,0 +1,113 @@ +package net.hzvtc.data.check.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.io.Serializable; + +/** + * 视频(图像)状态参数对象 media_item + * + * @author admin + * @date 2024-06-18 + */ +@Data +@Alias("MediaItem") +public class MediaItem implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 相机ID + */ + @Excel(name = "相机ID") + private Long deviceId; + + /** + * 相机电压 + */ + @Excel(name = "相机电压") + private double cameraVolt; + + /** + * 太阳能电压 + */ + @Excel(name = "太阳能电压") + private double solarVolt; + + /** + * 外接电压 + */ + @Excel(name = "外接电压") + private double extraVolt; + + /** + * 温度 + */ + @Excel(name = "温度") + private double temperature; + + /** + * 湿度 + */ + @Excel(name = "湿度") + private double humidity; + + /** + * 大气压 + */ + @Excel(name = "大气压") + private double atmosphere; + + /** + * 维度 + */ + @Excel(name = "维度") + private String lat; + + /** + * 经度 + */ + @Excel(name = "经度") + private String lon; + + private String memory; + + private int ontime; + + private int nstatus; + + private String astatus; + + private double elevation; + /** + * $column.columnComment + */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long parentId; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("deviceId", getDeviceId()) + .append("cameraVolt", getCameraVolt()) + .append("solarVolt", getSolarVolt()) + .append("extraVolt", getExtraVolt()) + .append("temperature", getTemperature()) + .append("humidity", getHumidity()) + .append("atmosphere", getAtmosphere()) + .append("lat", getLat()) + .append("lon", getLon()) + .append("parentId", getParentId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultMedia.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultMedia.java new file mode 100644 index 0000000..7a66bc7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultMedia.java @@ -0,0 +1,101 @@ +package net.hzvtc.data.check.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; +import java.util.List; + +/** + * 监测结果媒体对象 result_media + * + * @author admin + * @date 2022-10-24 + */ +@Data +@Alias("ResultMedia") +public class ResultMedia extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long mediaId; + + private Long areaId; + + private String areaName; + + /** + * 设备id + */ + @Excel(name = "设备id") + private Long deviceId; + @Excel(name = "设备名称") + private String deviceName; + /** + * 类型 + */ + @Excel(name = "类型") + private Integer mediaType; + /** + * 媒体url + */ + @Excel(name = "媒体url") + private String mediaUrl; + /** + * 元数据url,如xml或json格式 + */ + @Excel(name = "视频及声音URL") + private String metaUrl; + + private List speciesList; + /** + * 时间 + */ + @JsonFormat(pattern = "yyyy年MM月dd日 HH:mm:ss") + @Excel(name = "时间", width = 30, dateFormat = "yyyy年MM月dd日 HH时mm分ss秒") + private Date time; + private Integer width; + private Integer height; + private Long speciesId; + private String speciesName; + private Integer limit; + private int isDeleted; + private Long itemId; + private String version; + + public String getMediaTypeName() { + if (mediaType == null) { + return null; + } else if (mediaType == 1) { + return "audio"; + } else if (mediaType == 2) { + return "image"; + } else if (mediaType == 3) { + return "video"; + } else if (mediaType == 4) { + return "real"; + } else { + return ""; + } + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("mediaId", getMediaId()) + .append("deviceId", getDeviceId()) + .append("mediaType", getMediaType()) + .append("mediaUrl", getMediaUrl()) + .append("metaUrl", getMetaUrl()) + .append("time", getTime()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecord.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecord.java new file mode 100644 index 0000000..37192d3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecord.java @@ -0,0 +1,70 @@ +package net.hzvtc.data.check.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; +import java.util.List; + +/** + * 监测结果记录对象 result_record + * + * @author admin + * @date 2022-08-22 + */ +@Data +@Alias("ResultRecord") +public class ResultRecord extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long recordId; + + /** + * 设备id + */ + @Excel(name = "设备id") + private Long deviceId; + + @Excel(name = "设备名称") + private String deviceName; + + /** + * 保护区Id + */ + private Long areaId; + + /** + * 监测时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "监测时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date recordTime; + + /** + * 监测类型 + */ + @Excel(name = "监测类型") + private String recordType; + + private String version; + + private List list; + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("recordId", getRecordId()) + .append("deviceId", getDeviceId()) + .append("recordTime", getRecordTime()) + .append("recordType", getRecordType()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecordDetails.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecordDetails.java new file mode 100644 index 0000000..93c9fb5 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/domain/ResultRecordDetails.java @@ -0,0 +1,108 @@ +package net.hzvtc.data.check.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.io.Serializable; + +/** + * 监测记录详细信息对象 result_record_details + * + * @author admin + * @date 2022-08-22 + */ +@Data +@Alias("ResultRecordDetails") +public class ResultRecordDetails implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long detailsId; + + /** + * 记录id + */ + @Excel(name = "记录id") + private Long recordId; + + /** + * 物种id + */ + @Excel(name = "物种id") + private Long speciesId; + + @Excel(name = "物种名称") + private String speciesName; + + /** + * 生境 + */ + @Excel(name = "生境") + private String habitat; + + /** + * 数量 + */ + @Excel(name = "数量") + private Integer count; + + /** + * 位置 + */ + @Excel(name = "位置") + private String location; + + /** + * 置信度 + */ + @Excel(name = "置信度") + private double confidence; + + /** + * 媒体id + */ + @Excel(name = "媒体id") + private Long mediaId; + + /** + * 位置横坐标 + */ + @Excel(name = "位置横坐标") + private String locationSiteX; + + /** + * 位置纵坐标 + */ + @Excel(name = "位置纵坐标") + private String locationSiteY; + + private boolean checked; + + private int isDeleted = 0; + + private String boundbox; + + private ResultMedia resultMedia; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("detailsId", getDetailsId()) + .append("recordId", getRecordId()) + .append("speciesId", getSpeciesId()) + .append("habitat", getHabitat()) + .append("count", getCount()) + .append("location", getLocation()) + .append("confidence", getConfidence()) + .append("mediaId", getMediaId()) + .append("locationSiteX", getLocationSiteX()) + .append("locationSiteY", getLocationSiteY()) + .toString(); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/FavoriteMediaMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/FavoriteMediaMapper.java new file mode 100644 index 0000000..51dc5a2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/FavoriteMediaMapper.java @@ -0,0 +1,68 @@ +package net.hzvtc.data.check.mapper; + +import net.hzvtc.data.check.domain.FavoriteMedia; + +import java.util.List; +import java.util.Map; + +/** + * 收藏的视频Mapper接口 + * + * @author admin + * @date 2024-06-18 + */ +public interface FavoriteMediaMapper { + /** + * 查询收藏的视频 + * + * @param id 收藏的视频主键 + * @return 收藏的视频 + */ + public FavoriteMedia selectFavoriteMediaById(Long id); + + /** + * 查询收藏的视频列表 + * + * @param favoriteMedia 收藏的视频 + * @return 收藏的视频集合 + */ + public List selectFavoriteMediaList(FavoriteMedia favoriteMedia); + + /** + * 新增收藏的视频 + * + * @param favoriteMedia 收藏的视频 + * @return 结果 + */ + public int insertFavoriteMedia(FavoriteMedia favoriteMedia); + + /** + * 修改收藏的视频 + * + * @param favoriteMedia 收藏的视频 + * @return 结果 + */ + public int updateFavoriteMedia(FavoriteMedia favoriteMedia); + + /** + * 删除收藏的视频 + * + * @param id 收藏的视频主键 + * @return 结果 + */ + public int deleteFavoriteMediaById(Long id); + + /** + * 批量删除收藏的视频 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteFavoriteMediaByIds(Long[] ids); + + Long getFavoriteMediaByMediaId(FavoriteMedia data); + + int deleteFavoriteMediaByMediaId(Long mediaId); + + List getFavoriteMediaAmountByParam(Map param); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/MediaItemMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/MediaItemMapper.java new file mode 100644 index 0000000..f02ab9a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/MediaItemMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.data.check.mapper; + +import java.util.List; +import net.hzvtc.data.check.domain.MediaItem; + +/** + * 视频(图像)状态参数Mapper接口 + * + * @author admin + * @date 2024-06-18 + */ +public interface MediaItemMapper +{ + /** + * 查询视频(图像)状态参数 + * + * @param id 视频(图像)状态参数主键 + * @return 视频(图像)状态参数 + */ + public MediaItem selectMediaItemById(Long id); + + /** + * 查询视频(图像)状态参数列表 + * + * @param mediaItem 视频(图像)状态参数 + * @return 视频(图像)状态参数集合 + */ + public List selectMediaItemList(MediaItem mediaItem); + + /** + * 新增视频(图像)状态参数 + * + * @param mediaItem 视频(图像)状态参数 + * @return 结果 + */ + public int insertMediaItem(MediaItem mediaItem); + + /** + * 修改视频(图像)状态参数 + * + * @param mediaItem 视频(图像)状态参数 + * @return 结果 + */ + public int updateMediaItem(MediaItem mediaItem); + + /** + * 删除视频(图像)状态参数 + * + * @param id 视频(图像)状态参数主键 + * @return 结果 + */ + public int deleteMediaItemById(Long id); + + /** + * 批量删除视频(图像)状态参数 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMediaItemByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultMediaMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultMediaMapper.java new file mode 100644 index 0000000..cd5e538 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultMediaMapper.java @@ -0,0 +1,63 @@ +package net.hzvtc.data.check.mapper; + +import net.hzvtc.data.check.domain.ResultMedia; + +import java.util.List; +import java.util.Map; + +/** + * 监测结果媒体Mapper接口 + * + * @author admin + * @date 2022-10-24 + */ +public interface ResultMediaMapper { + + /** + * 查询监测结果媒体列表 + * + * @param resultMedia 监测结果媒体 + * @return 监测结果媒体集合 + */ + List selectResultMediaList(ResultMedia resultMedia); + + List selectResultMediaListByParam(ResultMedia resultMedia); + + List getResultMediaListByParam(Map map); + + List getResultAudioMediaListByParam(Map map); + + ResultMedia getResultMediaListById(Long id); + + List getBirdMediaListByParam(Map map); + + List getSpeciesMediaListForQuery(Map map); + + List getVideoMediaListByParam(Map map); + + List getFavoriteVideoListByParam(Map map); + + Integer getResultMediaStatAmountByParam(Map map); + + int deleteResultRealMediaByParam(Long deviceId); + + int insertResultMedia(ResultMedia data); + + int batchInsertResultMedia(List list); + + int deleteResultMediaByMediaIds(Long[] mediaIds); + + ResultMedia getResultInfoForStatByParam(Map map); + + int getResultMediaAmountByParam(Map map); + + List getResultMediaDeviceListByParam(Map map); + + int updateResultMediaStatusByParam(ResultMedia param); + + int recoverResultMediaStateByParam(Map map); + + int deleteResultMediaById(Long mediaId); + + List getResultMediaListByItemId(Long itemId); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordDetailsMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordDetailsMapper.java new file mode 100644 index 0000000..ae0ef06 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordDetailsMapper.java @@ -0,0 +1,103 @@ +package net.hzvtc.data.check.mapper; + +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.data.check.domain.ResultRecordDetails; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; +import java.util.Map; + +/** + * 监测记录详细信息Mapper接口 + * + * @author admin + * @date 2022-08-22 + */ +public interface ResultRecordDetailsMapper { + /** + * 查询监测记录详细信息 + * + * @param detailsId 监测记录详细信息主键 + * @return 监测记录详细信息 + */ + public ResultRecordDetails selectResultRecordDetailsByDetailsId(Long detailsId); + + /** + * 查询监测记录详细信息列表 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 监测记录详细信息集合 + */ + public List selectResultRecordDetailsList(ResultRecordDetails resultRecordDetails); + + /** + * 新增监测记录详细信息 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 结果 + */ + public int insertResultRecordDetails(ResultRecordDetails resultRecordDetails); + + /** + * 修改监测记录详细信息 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 结果 + */ + int updateResultRecordDetails(ResultRecordDetails resultRecordDetails); + + int batchInsertResultRecordDetails(List list); + + List checkResultRecordsByParam(ResultRecordDetails param); + + int updateResultRecordDetailsCheckState(Long id); + + /** + * 删除监测记录详细信息 + * + * @param detailsId 监测记录详细信息主键 + * @return 结果 + */ + public int deleteResultRecordDetailsByDetailsId(Long detailsId); + + /** + * 批量删除监测记录详细信息 + * + * @param detailsIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteResultRecordDetailsByDetailsIds(Long[] detailsIds); + + List querySpeciesRecordListByParam(Map map); + + List getSpeciesMediaListByParam(Map map); + + List getResultMediaVideoListByParam(Map map); + + List getSpeciesListByParam(); + + List getSpeciesListByUserId(Map map); + + List getSpeciesDateListByParam(Map map); + + List checkIsNewSpeciesByParam(Map map); + + List getLevelOneSpeciesLitByParam(Map map); + + List getCrOrEnSpeciesLitByParam(Map map); + + List getSpeciesHourAmountListByParam(Map map); + + List getSpeciesAudioAmountReportByParam(Map map); + + long getRecordDetailCountByDeviceId(long deviceId); + + List getResultMediaByMediaId(Long mediaId); + + List getBirdSpeciesListByMediaId(Long mediaId); + + int deleteByMediaId(Long mediaId); + + Long getSpeciesIdByPram(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordMapper.java new file mode 100644 index 0000000..dc8cb6b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/mapper/ResultRecordMapper.java @@ -0,0 +1,68 @@ +package net.hzvtc.data.check.mapper; + +import net.hzvtc.data.check.domain.ResultRecord; + +import java.util.List; +import java.util.Map; + +/** + * 监测结果记录Mapper接口 + * + * @author admin + * @date 2022-08-22 + */ +public interface ResultRecordMapper { + /** + * 查询监测结果记录 + * + * @param recordId 监测结果记录主键 + * @return 监测结果记录 + */ + public ResultRecord selectResultRecordByRecordId(Long recordId); + + /** + * 查询监测结果记录列表 + * + * @param resultRecord 监测结果记录 + * @return 监测结果记录集合 + */ + public List selectResultRecordList(ResultRecord resultRecord); + + List getResultAreaListByParam(Map map); + + List getResultRecordIdsByParam(Map map); + + /** + * 新增监测结果记录 + * + * @param resultRecord 监测结果记录 + * @return 结果 + */ + public int insertResultRecord(ResultRecord resultRecord); + + /** + * 修改监测结果记录 + * + * @param resultRecord 监测结果记录 + * @return 结果 + */ + public int updateResultRecord(ResultRecord resultRecord); + + /** + * 删除监测结果记录 + * + * @param recordId 监测结果记录主键 + * @return 结果 + */ + public int deleteResultRecordByRecordId(Long recordId); + + /** + * 批量删除监测结果记录 + * + * @param recordIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteResultRecordByRecordIds(Long[] recordIds); + + List getCurrentDateResultRecordList(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/FavoriteMediaService.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/FavoriteMediaService.java new file mode 100644 index 0000000..edab690 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/FavoriteMediaService.java @@ -0,0 +1,70 @@ +package net.hzvtc.data.check.service; + +import net.hzvtc.data.check.domain.FavoriteMedia; + +import java.util.List; +import java.util.Map; + +/** + * 收藏的视频Service接口 + * + * @author admin + * @date 2024-06-18 + */ +public interface FavoriteMediaService { + /** + * 查询收藏的视频 + * + * @param id 收藏的视频主键 + * @return 收藏的视频 + */ + public FavoriteMedia selectFavoriteMediaById(Long id); + + /** + * 查询收藏的视频列表 + * + * @param favoriteMedia 收藏的视频 + * @return 收藏的视频集合 + */ + public List selectFavoriteMediaList(FavoriteMedia favoriteMedia); + + /** + * 新增收藏的视频 + * + * @param favoriteMedia 收藏的视频 + * @return 结果 + */ + public int insertFavoriteMedia(FavoriteMedia favoriteMedia); + + /** + * 修改收藏的视频 + * + * @param favoriteMedia 收藏的视频 + * @return 结果 + */ + public int updateFavoriteMedia(FavoriteMedia favoriteMedia); + + /** + * 批量删除收藏的视频 + * + * @param ids 需要删除的收藏的视频主键集合 + * @return 结果 + */ + public int deleteFavoriteMediaByIds(Long[] ids); + + /** + * 删除收藏的视频信息 + * + * @param id 收藏的视频主键 + * @return 结果 + */ + public int deleteFavoriteMediaById(Long id); + + Long getFavoriteMediaByMediaId(Long id); + + Long getHeartMediaByMediaId(Long id); + + Long handleAction(FavoriteMedia favoriteMedia); + + List getFavoriteMediaListByParam(Map param); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/MediaItemService.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/MediaItemService.java new file mode 100644 index 0000000..8ef63d6 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/MediaItemService.java @@ -0,0 +1,64 @@ +package net.hzvtc.data.check.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.data.check.domain.MediaItem; + +import java.util.List; + +/** + * 视频(图像)状态参数Service接口 + * + * @author admin + * @date 2024-06-18 + */ +public interface MediaItemService { + /** + * 查询视频(图像)状态参数 + * + * @param id 视频(图像)状态参数主键 + * @return 视频(图像)状态参数 + */ + public MediaItem selectMediaItemById(Long id); + + /** + * 查询视频(图像)状态参数列表 + * + * @param mediaItem 视频(图像)状态参数 + * @return 视频(图像)状态参数集合 + */ + public List selectMediaItemList(MediaItem mediaItem); + + /** + * 新增视频(图像)状态参数 + * + * @param mediaItem 视频(图像)状态参数 + * @return 结果 + */ + public int insertMediaItem(MediaItem mediaItem); + + /** + * 修改视频(图像)状态参数 + * + * @param mediaItem 视频(图像)状态参数 + * @return 结果 + */ + public int updateMediaItem(MediaItem mediaItem); + + /** + * 批量删除视频(图像)状态参数 + * + * @param ids 需要删除的视频(图像)状态参数主键集合 + * @return 结果 + */ + public int deleteMediaItemByIds(Long[] ids); + + /** + * 删除视频(图像)状态参数信息 + * + * @param id 视频(图像)状态参数主键 + * @return 结果 + */ + int deleteMediaItemById(Long id); + + Long parserJsonObject(JSONObject jsonObject); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultMediaService.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultMediaService.java new file mode 100644 index 0000000..93101fc --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultMediaService.java @@ -0,0 +1,68 @@ +package net.hzvtc.data.check.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.data.check.domain.ResultMedia; + +import java.util.List; +import java.util.Map; + +/** + * 监测结果媒体Service接口 + * + * @author admin + * @date 2022-10-24 + */ +public interface ResultMediaService { + + /** + * 查询监测结果媒体列表 + * + * @param resultMedia 监测结果媒体 + * @return 监测结果媒体集合 + */ + List selectResultMediaList(ResultMedia resultMedia); + + List getResultMediaListByParam(Map map); + + List getResultAudioMediaListByParam(Map map); + + List getBirdMediaListByParam(Map map); + + List selectResultMediaListByParam(ResultMedia resultMedia); + + List getSpeciesMediaListForQuery(JSONObject object); + + int deleteResultRealMediaByParam(Long deviceId); + + int insertResultMedia(ResultMedia data); + + ResultMedia getResultMediaListById(Long id); + + /** + * 批量删除监测结果附件 + * + * @param mediaIds 需要删除的监测结果附件主键集合 + * @return 结果 + */ + int deleteResultMediaByMediaIds(Long[] mediaIds); + + ResultMedia getResultInfoForStatByParam(Map map); + + int updateResultMediaStatusByParam(ResultMedia param); + + int recoverResultMediaStateByParam(Map map); + + List getVideoMediaListByParam(Map map); + + int getResultMediaAmountByParam(Map map); + + List getResultMediaDeviceListByParam(Map map); + + List getFavoriteVideoListByParam(JSONObject object); + + JSONObject getResultMediaStatByParam(); + + List getResultMediaListByItemId(Long itemId); + + int batchInsertResultMedia(List list); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordDetailsService.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordDetailsService.java new file mode 100644 index 0000000..b336996 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordDetailsService.java @@ -0,0 +1,98 @@ +package net.hzvtc.data.check.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.data.check.domain.ResultRecordDetails; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; +import java.util.Map; + +/** + * 监测记录详细信息Service接口 + * + * @author admin + * @date 2022-08-22 + */ +public interface ResultRecordDetailsService { + /** + * 查询监测记录详细信息 + * + * @param detailsId 监测记录详细信息主键 + * @return 监测记录详细信息 + */ + public ResultRecordDetails selectResultRecordDetailsByDetailsId(Long detailsId); + + /** + * 查询监测记录详细信息列表 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 监测记录详细信息集合 + */ + public List selectResultRecordDetailsList(ResultRecordDetails resultRecordDetails); + + /** + * 新增监测记录详细信息 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 结果 + */ + public int insertResultRecordDetails(ResultRecordDetails resultRecordDetails); + + /** + * 修改监测记录详细信息 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 结果 + */ + Long updateResultRecordDetails(ResultRecordDetails resultRecordDetails); + + /** + * 批量删除监测记录详细信息 + * + * @param detailsIds 需要删除的监测记录详细信息主键集合 + * @return 结果 + */ + public int deleteResultRecordDetailsByDetailsIds(Long[] detailsIds); + + int deleteResultRecordDetails(JSONObject obj); + + /** + * 删除监测记录详细信息信息 + * + * @param detailsId 监测记录详细信息主键 + * @return 结果 + */ + public int deleteResultRecordDetailsByDetailsId(Long detailsId); + + List querySpeciesRecordListByParam(JSONObject obj); + + List getSpeciesMediaListByParam(JSONObject obj); + + List getResultMediaVideoListByParam(JSONObject obj); + + JSONArray getSpeciesHourAmountListByParam(JSONObject param); + + List getSpeciesListByParam(); + + int updateResultRecordDetailsCheckState(Long id); + + List getLevelOneSpeciesLitByParam(Map map); + + List getCrOrEnSpeciesLitByParam(Map map); + + List getSpeciesListByUserId(Long areaId); + + List getSpeciesDateListByParam(Map map); + + List checkIsNewSpeciesByParam(Map map); + + JSONObject getSpeciesAudioAmountReportByParam(JSONObject param); + + long getRecordDetailCountByDeviceId(long deviceId); + + int modifyRecordDetails(ResultRecordDetails data); + + int batchInsertResultRecordDetails(List list); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordService.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordService.java new file mode 100644 index 0000000..c015658 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/ResultRecordService.java @@ -0,0 +1,89 @@ +package net.hzvtc.data.check.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.data.check.domain.ResultRecord; + +import java.util.List; +import java.util.Map; + +/** + * 监测结果记录Service接口 + * + * @author admin + * @date 2022-08-22 + */ +public interface ResultRecordService { + /** + * 查询监测结果记录 + * + * @param recordId 监测结果记录主键 + * @return 监测结果记录 + */ + ResultRecord selectResultRecordByRecordId(Long recordId); + + /** + * 查询监测结果记录列表 + * + * @param resultRecord 监测结果记录 + * @return 监测结果记录集合 + */ + List selectResultRecordList(ResultRecord resultRecord); + + /** + * 新增监测结果记录 + * + * @param resultRecord 监测结果记录 + * @return 结果 + */ + int insertResultRecord(ResultRecord resultRecord); + + /** + * 修改监测结果记录 + * + * @param resultRecord 监测结果记录 + * @return 结果 + */ + int updateResultRecord(ResultRecord resultRecord); + + /** + * 批量删除监测结果记录 + * + * @param recordIds 需要删除的监测结果记录主键集合 + * @return 结果 + */ + int deleteResultRecordByRecordIds(Long[] recordIds); + + /** + * 删除监测结果记录信息 + * + * @param recordId 监测结果记录主键 + * @return 结果 + */ + int deleteResultRecordByRecordId(Long recordId); + + JSONObject getBirdDataStatByParam(JSONObject param); + + String getBirdDataStatFileByParam(JSONObject param); + + void sendBirdDataStatEmail(); + + void sendBirdDataWeeklyStatEmail(); + + boolean sendBirdDataStatEmail(JSONObject param); + + boolean sendBirdDataWeeklyStatEmail(JSONObject param); + + JSONObject getBirdDataWeeklyStatByParam(JSONObject param); + + String getBirdDataWeeklyStatFileByParam(JSONObject param); + + String getBirdDataMonthlyStatFileByParam(JSONObject param); + + List getResultAreaListByParam(Map map); + + List getResultRecordIdsByParam(Map map); + + List getCurrentDateResultRecordList(JSONObject param); +} + + diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/FavoriteMediaServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/FavoriteMediaServiceImpl.java new file mode 100644 index 0000000..53a8d02 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/FavoriteMediaServiceImpl.java @@ -0,0 +1,126 @@ +package net.hzvtc.data.check.service.impl; + +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.data.check.domain.FavoriteMedia; +import net.hzvtc.data.check.mapper.FavoriteMediaMapper; +import net.hzvtc.data.check.service.FavoriteMediaService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 收藏的视频Service业务层处理 + * + * @author admin + * @date 2024-06-18 + */ +@Service +public class FavoriteMediaServiceImpl implements FavoriteMediaService { + @Resource + private FavoriteMediaMapper favoriteMediaMapper; + + /** + * 查询收藏的视频 + * + * @param id 收藏的视频主键 + * @return 收藏的视频 + */ + @Override + public FavoriteMedia selectFavoriteMediaById(Long id) { + return favoriteMediaMapper.selectFavoriteMediaById(id); + } + + /** + * 查询收藏的视频列表 + * + * @param favoriteMedia 收藏的视频 + * @return 收藏的视频 + */ + @Override + public List selectFavoriteMediaList(FavoriteMedia favoriteMedia) { + return favoriteMediaMapper.selectFavoriteMediaList(favoriteMedia); + } + + /** + * 新增收藏的视频 + * + * @param favoriteMedia 收藏的视频 + * @return 结果 + */ + @Override + public int insertFavoriteMedia(FavoriteMedia favoriteMedia) { + return favoriteMediaMapper.insertFavoriteMedia(favoriteMedia); + } + + /** + * 修改收藏的视频 + * + * @param favoriteMedia 收藏的视频 + * @return 结果 + */ + @Override + public int updateFavoriteMedia(FavoriteMedia favoriteMedia) { + return favoriteMediaMapper.updateFavoriteMedia(favoriteMedia); + } + + /** + * 批量删除收藏的视频 + * + * @param ids 需要删除的收藏的视频主键 + * @return 结果 + */ + @Override + public int deleteFavoriteMediaByIds(Long[] ids) { + return favoriteMediaMapper.deleteFavoriteMediaByIds(ids); + } + + /** + * 删除收藏的视频信息 + * + * @param id 收藏的视频主键 + * @return 结果 + */ + @Override + public int deleteFavoriteMediaById(Long id) { + return favoriteMediaMapper.deleteFavoriteMediaById(id); + } + + @Override + public Long getFavoriteMediaByMediaId(Long id) { + FavoriteMedia data = new FavoriteMedia(); + data.setType(0); + data.setMediaId(id); + return favoriteMediaMapper.getFavoriteMediaByMediaId(data); + } + + @Override + public Long getHeartMediaByMediaId(Long id) { + FavoriteMedia data = new FavoriteMedia(); + data.setType(1); + data.setUserId(SecurityUtils.getUserId()); + data.setMediaId(id); + return favoriteMediaMapper.getFavoriteMediaByMediaId(data); + } + + @Override + public Long handleAction(FavoriteMedia favoriteMedia) { + if (favoriteMedia.getId() == null || favoriteMedia.getId() == 0L) { + favoriteMedia.setUserId(SecurityUtils.getUserId()); + favoriteMedia.setCreateDate(new Date()); + favoriteMedia.setIsDeleted(0); + favoriteMediaMapper.insertFavoriteMedia(favoriteMedia); + return favoriteMedia.getId(); + } else { + favoriteMediaMapper.deleteFavoriteMediaByMediaId(favoriteMedia.getMediaId()); + return 0L; + } + } + + @Override + public List getFavoriteMediaListByParam(Map param) { + return favoriteMediaMapper.getFavoriteMediaAmountByParam(param); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/MediaItemServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/MediaItemServiceImpl.java new file mode 100644 index 0000000..ec85c01 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/MediaItemServiceImpl.java @@ -0,0 +1,126 @@ +package net.hzvtc.data.check.service.impl; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.core.redis.RedisCache; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.data.check.domain.MediaItem; +import net.hzvtc.data.check.mapper.MediaItemMapper; +import net.hzvtc.data.check.service.MediaItemService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 视频(图像)状态参数Service业务层处理 + * + * @author admin + * @date 2024-06-18 + */ +@Service +public class MediaItemServiceImpl implements MediaItemService { + @Resource + private MediaItemMapper mediaItemMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 查询视频(图像)状态参数 + * + * @param id 视频(图像)状态参数主键 + * @return 视频(图像)状态参数 + */ + @Override + public MediaItem selectMediaItemById(Long id) { + String key = "media_item_" + id; + MediaItem data = redisCache.getCacheObject(key); + if (data == null) { + data = mediaItemMapper.selectMediaItemById(id); + redisCache.setCacheObject(key, data); + } + return data; + } + + /** + * 查询视频(图像)状态参数列表 + * + * @param mediaItem 视频(图像)状态参数 + * @return 视频(图像)状态参数 + */ + @Override + public List selectMediaItemList(MediaItem mediaItem) { + return mediaItemMapper.selectMediaItemList(mediaItem); + } + + /** + * 新增视频(图像)状态参数 + * + * @param mediaItem 视频(图像)状态参数 + * @return 结果 + */ + @Override + public int insertMediaItem(MediaItem mediaItem) { + return mediaItemMapper.insertMediaItem(mediaItem); + } + + /** + * 修改视频(图像)状态参数 + * + * @param mediaItem 视频(图像)状态参数 + * @return 结果 + */ + @Override + public int updateMediaItem(MediaItem mediaItem) { + return mediaItemMapper.updateMediaItem(mediaItem); + } + + /** + * 批量删除视频(图像)状态参数 + * + * @param ids 需要删除的视频(图像)状态参数主键 + * @return 结果 + */ + @Override + public int deleteMediaItemByIds(Long[] ids) { + return mediaItemMapper.deleteMediaItemByIds(ids); + } + + /** + * 删除视频(图像)状态参数信息 + * + * @param id 视频(图像)状态参数主键 + * @return 结果 + */ + @Override + public int deleteMediaItemById(Long id) { + return mediaItemMapper.deleteMediaItemById(id); + } + + @Override + public Long parserJsonObject(JSONObject jsonObject) { + MediaItem data = new MediaItem(); + JSONObject obj = jsonObject.getJSONObject("device"); + data.setDeviceId(jsonObject.getLong("id")); + data.setCameraVolt(obj.getDouble("Battery1")); + data.setSolarVolt(obj.getDouble("SPower")); + data.setExtraVolt(obj.getDouble("EPower")); + data.setMemory(obj.getString("Memory")); + data.setOntime(obj.getInteger("ONTime")); + data.setNstatus(obj.getInteger(("NStatus"))); + data.setAstatus(obj.getString("AStatus")); + JSONObject gpsObj = StringUtils.parseWGS84Coordinate(obj.getString("GP")); + if (gpsObj != null) { + data.setLon(gpsObj.getString("longitude")); + data.setLat(gpsObj.getString("latitude")); + data.setElevation(gpsObj.getDouble("altitude")); + } + obj = jsonObject.getJSONObject("data"); + data.setTemperature(obj.getDouble("D_Temperature")); + data.setHumidity(obj.getDouble("D_Humidity")); + data.setAtmosphere(obj.getDouble("D_Atmos")); + mediaItemMapper.insertMediaItem(data); + return data.getId(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultMediaServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultMediaServiceImpl.java new file mode 100644 index 0000000..6054f35 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultMediaServiceImpl.java @@ -0,0 +1,167 @@ +package net.hzvtc.data.check.service.impl; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.mapper.ResultMediaMapper; +import net.hzvtc.data.check.service.ResultMediaService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 监测结果媒体Service业务层处理 + * + * @author admin + * @date 2022-10-24 + */ +@Service +public class ResultMediaServiceImpl implements ResultMediaService { + @Resource + private ResultMediaMapper resultMediaMapper; + + + /** + * 查询监测结果媒体列表 + * + * @param resultMedia 监测结果媒体 + * @return 监测结果媒体 + */ + @Override + public List selectResultMediaList(ResultMedia resultMedia) { + return resultMediaMapper.selectResultMediaList(resultMedia); + } + + @Override + public List getResultMediaListByParam(Map map) { + return resultMediaMapper.getResultMediaListByParam(map); + } + + @Override + public List getResultAudioMediaListByParam(Map map) { + return resultMediaMapper.getResultAudioMediaListByParam(map); + } + + @Override + public List getBirdMediaListByParam(Map map) { + return resultMediaMapper.getBirdMediaListByParam(map); + } + + @Override + public List selectResultMediaListByParam(ResultMedia resultMedia) { +// if (resultMedia == null) { +// resultMedia = new ResultMedia(); +// } + return resultMediaMapper.selectResultMediaListByParam(resultMedia); + } + + @Override + public List getSpeciesMediaListForQuery(JSONObject object) { + Map map = new HashMap<>(); + Long areaId = object.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = object.getLong("deviceId"); + map.put("deviceId", deviceId); + String dateFrom = object.getString("dateFrom"); + map.put("dateFrom", dateFrom); + String dateTo = object.getString("dateTo"); + map.put("dateTo", dateTo); + String mediaTypes = object.getString("mediaTypes"); + if (mediaTypes != null && !mediaTypes.isEmpty()) { + String arrs[] = mediaTypes.split(","); + int[] arr = Arrays.asList(arrs).stream().mapToInt(Integer::parseInt).toArray(); + map.put("mediaTypes", arr); + } + Integer limit = object.getInteger("limit"); + map.put("limit", limit); + return resultMediaMapper.getSpeciesMediaListForQuery(map); + } + + @Override + public int deleteResultRealMediaByParam(Long deviceId) { + return resultMediaMapper.deleteResultRealMediaByParam(deviceId); + } + + @Override + public int insertResultMedia(ResultMedia data) { + return resultMediaMapper.insertResultMedia(data); + } + + @Override + public ResultMedia getResultMediaListById(Long id) { + return resultMediaMapper.getResultMediaListById(id); + } + + /** + * 批量删除监测结果附件 + * + * @param mediaIds 需要删除的监测结果附件主键 + * @return 结果 + */ + @Override + public int deleteResultMediaByMediaIds(Long[] mediaIds) { + return resultMediaMapper.deleteResultMediaByMediaIds(mediaIds); + } + + @Override + public ResultMedia getResultInfoForStatByParam(Map map) { + return resultMediaMapper.getResultInfoForStatByParam(map); + } + + @Override + public int updateResultMediaStatusByParam(ResultMedia param) { + return resultMediaMapper.updateResultMediaStatusByParam(param); + } + + @Override + public int recoverResultMediaStateByParam(Map map) { + return resultMediaMapper.recoverResultMediaStateByParam(map); + } + + @Override + public List getVideoMediaListByParam(Map map) { + return resultMediaMapper.getVideoMediaListByParam(map); + } + + @Override + public int getResultMediaAmountByParam(Map map) { + return resultMediaMapper.getResultMediaAmountByParam(map); + } + + @Override + public List getResultMediaDeviceListByParam(Map map) { + return resultMediaMapper.getResultMediaDeviceListByParam(map); + } + + @Override + public List getFavoriteVideoListByParam(JSONObject object) { + Map map = new HashMap<>(); + return resultMediaMapper.getFavoriteVideoListByParam(map); + } + + @Override + public JSONObject getResultMediaStatByParam() { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + map.put("mediaType", 3); + Integer count = resultMediaMapper.getResultMediaStatAmountByParam(map); + result.put("videoAmount", count == null ? 0 : count); + map.put("mediaType", 2); + count = resultMediaMapper.getResultMediaStatAmountByParam(map); + result.put("imageAmount", count == null ? 0 : count); + return result; + } + + @Override + public List getResultMediaListByItemId(Long itemId) { + return resultMediaMapper.getResultMediaListByItemId(itemId); + } + + @Override + public int batchInsertResultMedia(List list) { + return resultMediaMapper.batchInsertResultMedia(list); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordDetailsServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordDetailsServiceImpl.java new file mode 100644 index 0000000..8b41d8f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordDetailsServiceImpl.java @@ -0,0 +1,348 @@ +package net.hzvtc.data.check.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.data.check.domain.ResultRecordDetails; +import net.hzvtc.data.check.mapper.ResultMediaMapper; +import net.hzvtc.data.check.mapper.ResultRecordDetailsMapper; +import net.hzvtc.data.check.service.ResultRecordDetailsService; +import net.hzvtc.device.service.DeviceInfoService; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.web.stat.service.SpeciesDailyStatService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 监测记录详细信息Service业务层处理 + * + * @author admin + * @date 2022-08-22 + */ +@Service +@RequiredArgsConstructor +public class ResultRecordDetailsServiceImpl implements ResultRecordDetailsService { + @Resource + private ResultRecordDetailsMapper resultRecordDetailsMapper; + @Resource + private ResultMediaMapper resultMediaMapper; + // @Autowired +// private ProtectedAreaService protectedAreaService; +// @Autowired + private final SpeciesDailyStatService speciesDailyStatService; + + private final DeviceInfoService deviceInfoService; + + + /** + * 查询监测记录详细信息 + * + * @param detailsId 监测记录详细信息主键 + * @return 监测记录详细信息 + */ + @Override + public ResultRecordDetails selectResultRecordDetailsByDetailsId(Long detailsId) { + return resultRecordDetailsMapper.selectResultRecordDetailsByDetailsId(detailsId); + } + + /** + * 查询监测记录详细信息列表 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 监测记录详细信息 + */ + @Override + public List selectResultRecordDetailsList(ResultRecordDetails resultRecordDetails) { + return resultRecordDetailsMapper.selectResultRecordDetailsList(resultRecordDetails); + } + + /** + * 新增监测记录详细信息 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 结果 + */ + @Override + public int insertResultRecordDetails(ResultRecordDetails resultRecordDetails) { + return resultRecordDetailsMapper.insertResultRecordDetails(resultRecordDetails); + } + + /** + * 修改监测记录详细信息 + * + * @param resultRecordDetails 监测记录详细信息 + * @return 结果 + */ + @Override + public Long updateResultRecordDetails(ResultRecordDetails resultRecordDetails) { + resultRecordDetailsMapper.updateResultRecordDetails(resultRecordDetails); + return 1L; +// if (resultRecordDetails.getDetailsId() == 0) { +// resultRecordDetails.setHabitat(""); +// resultRecordDetails.setIsDeleted(0); +// resultRecordDetailsMapper.insertResultRecordDetails(resultRecordDetails); +// return resultRecordDetails.getDetailsId(); +// } else { +// List list = resultRecordDetailsMapper.checkResultRecordsByParam(resultRecordDetails); +// if (list == null || list.isEmpty()) { +// if (resultRecordDetails.getCount() == null) { +// resultRecordDetails.setCount(1); +// } +// resultRecordDetailsMapper.updateResultRecordDetails(resultRecordDetails); +// return 1L; +// } else { +// resultRecordDetailsMapper.deleteResultRecordDetailsByDetailsId(resultRecordDetails.getDetailsId()); +// return 1L; +// } +// } + } + + /** + * 批量删除监测记录详细信息 + * + * @param detailsIds 需要删除的监测记录详细信息主键 + * @return 结果 + */ + @Override + public int deleteResultRecordDetailsByDetailsIds(Long[] detailsIds) { + return resultRecordDetailsMapper.deleteResultRecordDetailsByDetailsIds(detailsIds); + } + + @Override + @Transactional + public int deleteResultRecordDetails(JSONObject obj) { + Long id = obj.getLong("id"); + Long mediaId = obj.getLong("mediaId"); + if (id != null) { + int count = resultRecordDetailsMapper.deleteResultRecordDetailsByDetailsId(id); + List list = resultRecordDetailsMapper.getResultMediaByMediaId(mediaId); + if (list == null || list.isEmpty()) { + resultMediaMapper.deleteResultMediaById(mediaId); + } + return count; + } else { + resultMediaMapper.deleteResultMediaById(mediaId); + return resultRecordDetailsMapper.deleteByMediaId(mediaId); + } + } + + /** + * 删除监测记录详细信息信息 + * + * @param detailsId 监测记录详细信息主键 + * @return 结果 + */ + @Override + public int deleteResultRecordDetailsByDetailsId(Long detailsId) { + return resultRecordDetailsMapper.deleteResultRecordDetailsByDetailsId(detailsId); + } + + @Override + public List querySpeciesRecordListByParam(JSONObject obj) { + Map map = new HashMap<>(); + +// if (SecurityUtils.getUserId() > 1L) { +// map.put("deptId", SecurityUtils.getDeptId()); +// map.put("ancestors", deviceInfoService.getAncestorsById(SecurityUtils.getDeptId())); +// } + + Long speciesId = obj.getLong("speciesId"); + map.put("speciesId", speciesId); + String dateFrom = obj.getString("dateFrom"); + String dateTo = obj.getString("dateTo"); + map.put("dateFrom", dateFrom); + map.put("dateTo", dateTo); + Long deviceId = obj.getLong("deviceId"); + map.put("deviceId", deviceId); + String mediaType = obj.getString("mediaType"); + map.put("mediaType", mediaType); + String mediaTypes = obj.getString("mediaTypes"); + if (mediaTypes != null && !mediaTypes.isEmpty()) { + String[] arr = mediaTypes.split(","); + map.put("mediaTypes", arr); + } + return resultRecordDetailsMapper.querySpeciesRecordListByParam(map); + } + + @Override + public List getSpeciesMediaListByParam(JSONObject obj) { + Map map = new HashMap<>(); + Long areaId = obj.getLong("areaId"); + map.put("areaId", areaId); + Integer mediaType = obj.getInteger("mediaType"); + map.put("mediaType", mediaType); + Long deviceId = obj.getLong("deviceId"); + map.put("deviceId", deviceId); + String dateFrom = obj.getString("dateFrom"); + map.put("dateFrom", dateFrom); + String dateTo = obj.getString("dateTo"); + map.put("dateTo", dateTo); + return resultRecordDetailsMapper.getSpeciesMediaListByParam(map); + } + + @Override + public List getResultMediaVideoListByParam(JSONObject obj) { + Map map = new HashMap<>(); + Long areaId = obj.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = obj.getLong("deviceId"); + map.put("deviceId", deviceId); + String dateFrom = obj.getString("dateFrom"); + map.put("dateFrom", dateFrom); + String dateTo = obj.getString("dateTo"); + map.put("dateTo", dateTo); + return resultRecordDetailsMapper.getResultMediaVideoListByParam(map); + } + + @Override + public JSONArray getSpeciesHourAmountListByParam(JSONObject param) { + JSONArray result = new JSONArray(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + if (deviceId == null && areaId == null) { + return result; + } + Integer recordTypeNot = param.getInteger("recordTypeNot"); + map.put("recordTypeNot", recordTypeNot); + Integer recordType = param.getInteger("recordType"); + map.put("recordType", recordType); + Integer calcYear = param.getInteger("calcYear"); + if (calcYear == null) { + calcYear = LocalDate.now().getYear(); + } + map.put("calcYear", calcYear); + for (int i = 0; i < 4; i++) { + JSONObject obj = new JSONObject(); + obj.put("name", (i + 1) + "季度"); + obj.put("code", i + 1); + map.put("monthFrom", i * 3 + 1); + map.put("monthTo", i * 3 + 3); + List list = resultRecordDetailsMapper.getSpeciesHourAmountListByParam(map); + obj.put("list", list); + result.add(obj); + } + return result; + } + + @Override + public List getSpeciesListByParam() { +// Long areaId = obj.getLong("areaId"); +// if (areaId == null) { +// return null; +// } + return resultRecordDetailsMapper.getSpeciesListByParam(); + } + + @Override + public int updateResultRecordDetailsCheckState(Long id) { + return resultRecordDetailsMapper.updateResultRecordDetailsCheckState(id); + } + + @Override + public List getLevelOneSpeciesLitByParam(Map map) { + return resultRecordDetailsMapper.getLevelOneSpeciesLitByParam(map); + } + + @Override + public List getCrOrEnSpeciesLitByParam(Map map) { + return resultRecordDetailsMapper.getCrOrEnSpeciesLitByParam(map); + } + + @Override + public List getSpeciesListByUserId(Long areaId) { + Map map = new HashMap<>(); + if (areaId != null) { + map.put("areaId", areaId); + } else { + Long userId = SecurityUtils.getUserId(); + if (userId == null) { + userId = 0L; + } else if (userId <= 1L) { + userId = null; + } + map.put("userId", userId); + } + return resultRecordDetailsMapper.getSpeciesListByUserId(map); + } + + @Override + public List getSpeciesDateListByParam(Map map) { + return resultRecordDetailsMapper.getSpeciesDateListByParam(map); + } + + @Override + public List checkIsNewSpeciesByParam(Map map) { + return resultRecordDetailsMapper.checkIsNewSpeciesByParam(map); + } + + @Override + public JSONObject getSpeciesAudioAmountReportByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Long areaId = param.getLong("areaId"); + Long deviceId = param.getLong("deviceId"); + if (areaId == null && deviceId == null) { + return result; + } + Map map = new HashMap<>(); + map.put("areaId", areaId); + map.put("deviceId", deviceId); + Integer calcYear = param.getInteger("calcYear"); + map.put("calcYear", calcYear); + Integer calcMonth = param.getInteger("calcMonth"); + map.put("calcMonth", calcMonth); + Integer monthFrom = param.getInteger("monthFrom"); + map.put("monthFrom", monthFrom); + Integer monthTo = param.getInteger("monthTo"); + map.put("monthTo", monthTo); + List list = resultRecordDetailsMapper.getSpeciesAudioAmountReportByParam(map); + result.put("list", list); + result.put("catalogueAmount", speciesDailyStatService.getBirdCatalogueAmount()); + result.put("familyAmount", speciesDailyStatService.getBirdFamilyAmount()); + result.put("genusAmount", speciesDailyStatService.getBirdGenusAmount()); + return result; + } + + @Override + public long getRecordDetailCountByDeviceId(long deviceId) { + return resultRecordDetailsMapper.getRecordDetailCountByDeviceId(deviceId); + } + + @Override + public int modifyRecordDetails(ResultRecordDetails data) { + resultRecordDetailsMapper.deleteByMediaId(data.getMediaId()); + String arr[] = data.getSpeciesName().split(","); + List list = new ArrayList<>(); + for (String str : arr) { + ResultRecordDetails item = new ResultRecordDetails(); + item.setRecordId(data.getRecordId()); + item.setMediaId(data.getMediaId()); + item.setCount(1); + item.setHabitat("1"); + item.setLocation(""); + item.setSpeciesId(Long.parseLong(str)); + item.setIsDeleted(0); + list.add(item); + } + if (!list.isEmpty()) { + return resultRecordDetailsMapper.batchInsertResultRecordDetails(list); + } + return 0; + } + + @Override + public int batchInsertResultRecordDetails(List list) { + return resultRecordDetailsMapper.batchInsertResultRecordDetails(list); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordServiceImpl.java new file mode 100644 index 0000000..c4e7657 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/check/service/impl/ResultRecordServiceImpl.java @@ -0,0 +1,811 @@ +package net.hzvtc.data.check.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.area.domain.ProtectedArea; +import net.hzvtc.area.service.ProtectedAreaService; +import net.hzvtc.common.config.AiBirdSysConfig; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.domain.ResultRecord; +import net.hzvtc.data.check.mapper.ResultRecordMapper; +import net.hzvtc.data.check.service.ResultMediaService; +import net.hzvtc.data.check.service.ResultRecordService; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.echart.service.BirdDataStatService; +import net.hzvtc.email.service.EmailService; +import org.apache.commons.io.IOUtils; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.nio.file.Path; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 监测结果记录Service业务层处理 + * + * @author admin + * @date 2022-08-22 + */ +@Slf4j +@Service +public class ResultRecordServiceImpl implements ResultRecordService { + @Resource + private ResultRecordMapper resultRecordMapper; + + @Autowired + private BirdDataStatService birdDataStatService; + + @Autowired + private ProtectedAreaService protectedAreaService; + + @Value("${hzvtc.dailyReportFilePath}") + private String dailyReportFilePath; + + @Value("${hzvtc.dailyReportFileOutPath}") + private String dailyReportFileOutPath; + + @Autowired + private EmailService emailService; + @Autowired + private ResultMediaService resultMediaService; + + /** + * 查询监测结果记录 + * + * @param recordId 监测结果记录主键 + * @return 监测结果记录 + */ + @Override + public ResultRecord selectResultRecordByRecordId(Long recordId) { + return resultRecordMapper.selectResultRecordByRecordId(recordId); + } + + /** + * 查询监测结果记录列表 + * + * @param resultRecord 监测结果记录 + * @return 监测结果记录 + */ + @Override + public List selectResultRecordList(ResultRecord resultRecord) { + return resultRecordMapper.selectResultRecordList(resultRecord); + } + + /** + * 新增监测结果记录 + * + * @param resultRecord 监测结果记录 + * @return 结果 + */ + @Override + public int insertResultRecord(ResultRecord resultRecord) { + return resultRecordMapper.insertResultRecord(resultRecord); + } + + /** + * 修改监测结果记录 + * + * @param resultRecord 监测结果记录 + * @return 结果 + */ + @Override + public int updateResultRecord(ResultRecord resultRecord) { + return resultRecordMapper.updateResultRecord(resultRecord); + } + + /** + * 批量删除监测结果记录 + * + * @param recordIds 需要删除的监测结果记录主键 + * @return 结果 + */ + @Override + public int deleteResultRecordByRecordIds(Long[] recordIds) { + return resultRecordMapper.deleteResultRecordByRecordIds(recordIds); + } + + /** + * 删除监测结果记录信息 + * + * @param recordId 监测结果记录主键 + * @return 结果 + */ + @Override + public int deleteResultRecordByRecordId(Long recordId) { + return resultRecordMapper.deleteResultRecordByRecordId(recordId); + } + + @Override + public JSONObject getBirdDataStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + map.put("calcDate", df.format(new Date())); + } else { + map.put("calcDate", calcDate); + } + String birdCode = param.getString("birdCode"); + if (birdCode != null && !birdCode.isEmpty()) { + map.put("birdCode", birdCode); + } + + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + + String isCommon = param.getString("isCommon"); + if (isCommon != null && !isCommon.isEmpty()) { + map.put("isCommon", Integer.parseInt(isCommon)); + } else { + map.put("isCommon", 1); + } + map.put("limit", 8); + + result.put("deviceData", birdDataStatService.getBirdCountInfoListByDevice(map)); + + //list = birdDataStatService.getBirdCountInfoListBySpeciesId(map); + result.put("speciesData", birdDataStatService.getBirdCountInfoListBySpeciesId(map)); + + + //list = birdDataStatService.getBirdCountInfoListByHabit(map); + result.put("habitatData", birdDataStatService.getBirdCountInfoListByHabit(map)); + + ResultMedia media = new ResultMedia(); + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaById(areaId); + media.setAreaId(areaId); + if (protectedArea.getPicWidth() > 0) { + media.setWidth(protectedArea.getPicWidth()); + } else { + media.setWidth(100); + } + if (protectedArea.getPicHeight() > 0) { + media.setHeight(protectedArea.getPicHeight()); + } else { + media.setHeight(100); + } + if (protectedArea.getPicNum() > 0) { + media.setLimit(protectedArea.getPicNum()); + } else { + media.setLimit(8); + } + media.setMediaType(2); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + try { + media.setTime(df.parse(calcDate)); + } catch (Exception ex) { + log.error(ex.getMessage()); + } + //map.put("time", calcDate); + + List mediaList = resultMediaService.selectResultMediaList(media); + result.put("mediaList", mediaList); +// emailService.sendSimpleEmail("邮件测试", "这是一封测试邮件", "935195927@qq.com"); + return result; + } + + @Override + public String getBirdDataStatFileByParam(JSONObject param) { + try { + Long areaId = param.getLong("areaId"); + String areaCode = ""; + String areaName = ""; + + if (areaId != null) { + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaById(areaId); + areaCode = protectedArea.getCode(); + areaName = protectedArea.getName(); + } else { + return "500"; + } + + // XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(dailyReportFilePath + "daily_report_" + areaCode + ".xlsx")); + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(dailyReportFilePath + "daily_report_tmpl.xlsx")); + XSSFSheet sheet = xssfWorkbook.getSheetAt(0); + sheet.getRow(1).getCell(1).setCellValue(areaName + "鸟类监测日报"); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + sheet.getRow(2).getCell(1).setCellValue("日期:" + calcDate); + sheet.getRow(4).getCell(1).setCellValue(areaName + "每日鸟类智慧监测数据,包含鸟类监测总数,关键鸟类生境分布和关键物种分时监测数量"); + JSONObject result = getBirdDataStatByParam(param); + // int baseDiffRow = 0; + JSONArray array = result.getJSONArray("deviceData"); + int[] sum = {0, 0, 0}; + if (array != null) { + AtomicInteger starRow = new AtomicInteger(8); + // +// int len = array.size(); +// if (len > 4) { +// int diff = len - 4; +// baseDiffRow += diff; +// sheet.shiftRows(8, sheet.getLastRowNum(), diff); +// for (int i = 0; i < diff; i++) { +// Row newRow = sheet.createRow(8 + i); +// for (int j = 0; j < 5; j++) { +// newRow.createCell(j); +// } +// } +// } +// List list; +// if (array.size() > 4) { +// list = array.subList(0, 4); +// } else { +// list = array.subList(0, array.size()); +// } + + array.stream().forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + int[] value = {0, 0, 0}; +// int[] data2 = {0}; +// int[] data3 = {0}; + if (subarray != null) { + subarray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + int hour = element.getHour(); + int count = element.getCount(); + if (hour <= 12) { + if (value[0] < count) { + value[0] = count; + } + } else { + if (value[1] < count) { + value[1] = count; + } + } + value[2] = value[0] > value[1] ? value[0] : value[1]; + }); + } + + for (int i = 0; i < sum.length; i++) { + sum[i] += value[i]; + } + for (int i = 0; i < value.length; i++) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(value[i]); + } + + starRow.getAndIncrement(); + }); + int cell = 2; + for (int i = 0; i < sum.length; i++) { + sheet.getRow(28).getCell(cell++).setCellValue(sum[i]); + } + for (int i = 0; i < 20 - array.size(); i++) { + XSSFRow row = sheet.getRow(8 + array.size() + i); + row.setZeroHeight(true); + } + } + + array = result.getJSONArray("habitatData"); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(32); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + array.stream().forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + int[] value = {0, 0, 0, 0, 0}; + + JSONArray subArray = obj.getJSONArray("list"); + if (subArray != null) { + subArray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + String code = element.getCode(); + if ("ground".equals(code)) { + value[0] = element.getCount(); + } else if ("shoreside".equals(code)) { + value[1] = element.getCount(); + } else if ("water".equals(code)) { + value[2] = element.getCount(); + } else if ("tree".equals(code)) { + value[3] = element.getCount(); + } else { + value[4] = element.getCount(); + } + }); + } + for (int i = 0; i < value.length; i++) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(value[i]); + } + + starRow.getAndIncrement(); + }); + } + + + array = result.getJSONArray("speciesData"); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(43); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + int[] value = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + JSONArray subArray = obj.getJSONArray("list"); + if (subArray != null) { + subArray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + int hour = element.getHour(); + int index = hour - 8; + if (index >= 0 && index <= 11) { + value[index] = element.getCount(); + } + }); + } + for (int i = 0; i < value.length; i++) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(value[i]); + } + //int max = Collections.max(Arrays.asList(value)); + Arrays.sort(value); + int max = value[value.length - 1]; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + + starRow.getAndIncrement(); + }); + } + array = result.getJSONArray("mediaList"); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(51); +// AtomicInteger count = new AtomicInteger(); +// AtomicInteger col = new AtomicInteger(1); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + array.stream().forEach(data -> { + ResultMedia obj = (ResultMedia) data; + String path = obj.getMediaUrl(); + if (path != null && !path.isEmpty()) { + try { + //InputStream is = new FileInputStream(AiBirdSysConfig.getBirdImagePath() + path); + InputStream is = getFileInputStream(AiBirdSysConfig.getBirdImagePath() + path); + if (is != null) { + byte[] bytes = IOUtils.toByteArray(is); + int pictureIdx = xssfWorkbook.addPicture(bytes, xssfWorkbook.PICTURE_TYPE_JPEG); + is.close(); + CreationHelper helper = xssfWorkbook.getCreationHelper(); + ClientAnchor anchor = helper.createClientAnchor(); + Drawing drawing = sheet.createDrawingPatriarch(); + sheet.getRow(starRow.get()).setHeightInPoints(obj.getHeight()); + anchor.setCol1(1); + anchor.setRow1(starRow.get()); + Picture pict = drawing.createPicture(anchor, pictureIdx); + pict.resize(); + starRow.getAndIncrement(); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }); + } + String outfile = dailyReportFileOutPath + areaName + "鸟类监测日报(日期" + calcDate + ")" + ".xlsx"; + FileOutputStream fileOut = new FileOutputStream(outfile); + xssfWorkbook.write(fileOut); + xssfWorkbook.close(); + fileOut.close(); +// emailService.sendEmailWithAttachment("这个是一份带附件的测试邮件", "附件为文件,请查收", outfile, "935195927@qq.com"); + return outfile; + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + private InputStream getFileInputStream(String filePath) { + try { + File file = new File(filePath); + Path path = file.toPath().toRealPath(); + boolean flag = !path.equals(file.toPath()); + if (flag) { + InputStream is = new FileInputStream(path.toFile()); + return is; + } else { + InputStream is = new FileInputStream(filePath); + return is; + } + } catch (Exception ex) { + + } + + return null; + + } + + @Override + public void sendBirdDataStatEmail() { + List list = protectedAreaService.getProtectedAreaEmailList(); + JSONObject obj = new JSONObject(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String calcDate = df.format(new Date()); + obj.put("calcDate", calcDate); + if (list != null && list.size() > 0) { + list.forEach(data -> { + obj.put("areaCode", data.getCode()); + obj.put("areaId", data.getId()); + String filePath = getBirdDataStatFileByParam(obj); + if (filePath != null && !filePath.isEmpty()) { + emailService.sendEmailWithAttachment(data.getName() + "鸟类监测日报,检测时间:" + calcDate, "附件为鸟类监测日报,请查收", filePath, data.getEmail()); + } + }); + } + } + + @Override + public void sendBirdDataWeeklyStatEmail() { + List list = protectedAreaService.getProtectedAreaEmailList(); + JSONObject obj = new JSONObject(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String calcDate = df.format(new Date()); + obj.put("calcDate", calcDate); + if (list != null && list.size() > 0) { + list.forEach(data -> { + obj.put("areaCode", data.getCode()); + obj.put("areaId", data.getId()); + String dateBegin = DateUtils.getFirstDayOfWeek(calcDate); + String dateEnd = DateUtils.getLastDayOfWeek(calcDate); + String filePath = getBirdDataWeeklyStatFileByParam(obj); + if (filePath != null && !filePath.isEmpty()) { + emailService.sendEmailWithAttachment(data.getName() + "鸟类监测周报,检测时间:" + dateBegin + "~" + dateEnd, "附件为鸟类监测周报,检测时间为:" + dateBegin + "~" + dateEnd + ",请查收!", filePath, data.getEmail()); + } + }); + } + } + + @Override + public boolean sendBirdDataStatEmail(JSONObject param) { + String areaId = param.getString("areaId"); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + ProtectedArea data = null; + if (areaId != null && !areaId.isEmpty()) { + data = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + + } else { + return false; + } + + String filePath = getBirdDataStatFileByParam(param); + + if (filePath != null && !filePath.isEmpty()) { + emailService.sendEmailWithAttachment(data.getName() + "鸟类监测日报,检测时间:" + calcDate, "附件为鸟类监测日报,请查收", filePath, data.getEmail()); + return true; + } else { + return false; + } + } + + @Override + public boolean sendBirdDataWeeklyStatEmail(JSONObject param) { + String areaId = param.getString("areaId"); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + String areaCode = ""; + ProtectedArea data = null; + if (areaId != null && !areaId.isEmpty()) { + data = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + areaCode = data.getCode(); + } else { + return false; + } + param.put("areaCode", areaCode); + String dateBegin = DateUtils.getFirstDayOfWeek(calcDate); + String dateEnd = DateUtils.getLastDayOfWeek(calcDate); + + String filePath = getBirdDataWeeklyStatFileByParam(param); + if (filePath != null && !filePath.isEmpty()) { + emailService.sendEmailWithAttachment(data.getName() + "鸟类监测周报,检测时间:" + dateBegin + "~" + dateEnd, "附件为鸟类监测周报,检测时间为:" + dateBegin + "~" + dateEnd + ",请查收!", filePath, data.getEmail()); + return true; + } else { + return false; + } + } + + @Override + public JSONObject getBirdDataWeeklyStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap(); + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + } + map.put("dateBegin", DateUtils.getFirstDayOfWeek(calcDate)); + map.put("dateEnd", DateUtils.getLastDayOfWeek(calcDate)); + String areaId = param.getString("areaId"); + if (areaId != null && !areaId.isEmpty()) { + map.put("areaId", Long.parseLong(areaId)); + } + map.put("isCommon", param.getInteger("isCommon")); + result.put("areaData", birdDataStatService.getBirdWeeklyStatByDeviceParam(map)); + + + //List list = birdDataStatService.getBirdWeeklyStatBySpecies(map); + result.put("speciesData", birdDataStatService.getBirdWeeklyStatBySpecies(map)); + + //List list = birdDataStatService.getBirdWeeklyStatByHabit(map); + result.put("habitatData", birdDataStatService.getBirdWeeklyStatByHabit(map)); + + return result; + } + + + private int getBirdCount(String count) { + if (count != null && !count.isEmpty()) { + return Integer.parseInt(count); + } else { + return 0; + } + } + + @Override + public String getBirdDataWeeklyStatFileByParam(JSONObject param) { + try { + String areaId = param.getString("areaId"); +// String areaCode = param.getString("areaCode"); + String areaName = ""; + +// if (areaCode == null || areaCode.isEmpty()) { +// +// } + if (areaId != null && !areaId.isEmpty()) { + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); +// areaCode = protectedArea.getCode(); + areaName = protectedArea.getName(); + } else { + return "500"; + } + + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(dailyReportFilePath + "weekly_report_tmpl.xlsx")); + XSSFSheet sheet = xssfWorkbook.getSheetAt(0); + sheet.getRow(1).getCell(1).setCellValue(areaName + "鸟类监测周报"); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + String dateBegin = DateUtils.getFirstDayOfWeek(calcDate); + String dateEnd = DateUtils.getLastDayOfWeek(calcDate); + + //SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + sheet.getRow(2).getCell(1).setCellValue("日期:" + dateBegin + "~" + dateEnd); + sheet.getRow(4).getCell(1).setCellValue(areaName + "每周鸟类智慧监测数据,包含鸟类监测总数,关键鸟类生境分布和关键物种监测数量"); + param.put("dateBegin", dateBegin); + param.put("dateEnd", dateEnd); + param.put("limit", 8); + param.put("isCommon", 1); + +// XSSFChart chart; +// XSSFDrawing drawingPatriarch = sheet.getDrawingPatriarch(); +// List charts = drawingPatriarch.getCharts(); +// CTChart ctChart = null; +// CTPlotArea plotArea = null; + + JSONObject result = getBirdDataWeeklyStatByParam(param); + JSONArray array = result.getJSONArray("areaData"); +// int baseDiffRow = 0; + if (array != null) { + int[] sum = new int[8]; + AtomicInteger starRow = new AtomicInteger(8); +// int diff = appendSheetRow(array.size(), 4, 9, sheet); +// baseDiffRow += diff; +// List list; +// if (array.size() > 4) { +// list = array.subList(0, 4); +// } else { +// list = array.subList(0, array.size()); +// } + array.stream().forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + int counts[] = new int[7]; + if (subarray != null) { + subarray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + counts[element.getWeekDay()] = element.getCount(); + }); + } + int i = 0; + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + sum[i++] += val; + } + Arrays.sort(counts); + int max = counts[counts.length - 1]; + sum[i] += max; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + int cell = 2; + starRow.set(28); + for (int val : sum) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + int start = 9 + array.size(); + log.info("============start===={}", start); + for (int i = 0; i < 20 - array.size(); i++) { + XSSFRow row = sheet.getRow(start + i); + row.setZeroHeight(true); + } + } + + + array = result.getJSONArray("speciesData"); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(43); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + // log.info("=====name==={}", obj.getString("name")); + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + int counts[] = new int[7]; + if (subarray != null) { + subarray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + counts[element.getWeekDay()] = element.getCount(); + }); + } + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + Arrays.sort(counts); + int max = counts[counts.length - 1]; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + } + + array = result.getJSONArray("habitatData"); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(67); +// int diff = appendSheetRow(array.size(), 8, 52 + baseDiffRow, sheet); +// baseDiffRow += diff; + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + int counts[] = new int[5]; + JSONArray subarray = obj.getJSONArray("list"); + if (subarray != null) { + subarray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + //counts[element.getWeekDay()] = element.getCount(); + if ("ground".equals(element.getCode())) { + counts[0] = element.getCount(); + } else if ("shoreside".equals(element.getCode())) { + counts[1] = element.getCount(); + } else if ("water".equals(element.getCode())) { + counts[2] = element.getCount(); + } else if ("tree".equals(element.getCode())) { + counts[3] = element.getCount(); + } else { + counts[4] = element.getCount(); + } + }); + } + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + starRow.getAndIncrement(); + }); + +// chart = charts.get(0); +// ctChart = chart.getCTChart(); +// plotArea = ctChart.getPlotArea(); +// CTBarSer barSer = plotArea.getBarChartArray(0).getSerArray(0); +// String formula = String.format("周报!$B$%d:$F$%d", (52 + baseDiffRow), (52 + baseDiffRow + array.size())); +// barSer.getVal().getNumRef().setF(formula); + } + String outfile = dailyReportFileOutPath + areaName + "鸟类监测周报(日期" + dateBegin + "-" + dateEnd + ")" + ".xlsx"; + FileOutputStream fileOut = new FileOutputStream(outfile); + xssfWorkbook.write(fileOut); + xssfWorkbook.close(); + fileOut.close(); +// emailService.sendEmailWithAttachment("这个是一份带附件的测试邮件", "附件为文件,请查收", outfile, "935195927@qq.com"); + return outfile; + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + @Override + public String getBirdDataMonthlyStatFileByParam(JSONObject param) { + return null; + } + + @Override + public List getResultAreaListByParam(Map map) { + return resultRecordMapper.getResultAreaListByParam(map); + } + + @Override + public List getResultRecordIdsByParam(Map map) { + return resultRecordMapper.getResultRecordIdsByParam(map); + } + + @Override + public List getCurrentDateResultRecordList(JSONObject param) { + Long areaId = param.getLong("areaId"); + if (areaId == null) { + return null; + } + Map map = new HashMap(); + map.put("areaId", areaId); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = LocalDate.now().toString(); + } + map.put("calcDate", calcDate); +// map.put("calcDate", "2023-10-14"); + return resultRecordMapper.getCurrentDateResultRecordList(map); + } + + private int appendSheetRow(int len, int size, int startRow, XSSFSheet sheet) { + //int len = array.size(); + int diff = 0; + if (len > size) { + diff = len - size; + sheet.shiftRows(startRow, sheet.getLastRowNum(), diff); + for (int i = 0; i < diff; i++) { + Row newRow = sheet.createRow(startRow + i); +// for (int j = 0; j < 10; j++) { +// newRow.createCell(j); +// } + sheet.copyRows(startRow - 1, startRow - 1, startRow + i, new CellCopyPolicy()); + } + + } + return diff; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/job/controller/TableStatInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/controller/TableStatInfoController.java new file mode 100644 index 0000000..14d264f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/controller/TableStatInfoController.java @@ -0,0 +1,81 @@ +package net.hzvtc.data.job.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.data.job.domain.TableStatInfo; +import net.hzvtc.data.job.service.TableStatInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * job生成数据Controller + * + * @author admin + * @date 2023-08-17 + */ +@RestController +@RequestMapping("/stat/tableStat") +public class TableStatInfoController extends BaseController { + @Autowired + private TableStatInfoService tableStatInfoService; + + /** + * 查询job生成数据列表 + */ + @PreAuthorize("@ss.hasPermi('stat:tableStat:list')") + @GetMapping("/list") + public TableDataInfo list(TableStatInfo tableStatInfo) { + startPage(); + List list = tableStatInfoService.selectTableStatInfoList(tableStatInfo); + return getDataTable(list); + } + + /** + * 导出job生成数据列表 + */ + @PreAuthorize("@ss.hasPermi('stat:tableStat:export')") + @Log(title = "job生成数据", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TableStatInfo tableStatInfo) { + List list = tableStatInfoService.selectTableStatInfoList(tableStatInfo); + ExcelUtil util = new ExcelUtil(TableStatInfo.class); + util.exportExcel(response, list, "job生成数据数据"); + } + + /** + * 获取job生成数据详细信息 + */ + @PreAuthorize("@ss.hasPermi('stat:tableStat:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(tableStatInfoService.selectTableStatInfoById(id)); + } + + /** + * 新增job生成数据 + */ + @PreAuthorize("@ss.hasPermi('stat:tableStat:add')") + @Log(title = "job生成数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TableStatInfo tableStatInfo) { + return toAjax(tableStatInfoService.insertTableStatInfo(tableStatInfo)); + } + + /** + * 修改job生成数据 + */ + @PreAuthorize("@ss.hasPermi('stat:tableStat:edit')") + @Log(title = "job生成数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TableStatInfo tableStatInfo) { + return toAjax(tableStatInfoService.updateTableStatInfo(tableStatInfo)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/job/domain/TableStatInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/domain/TableStatInfo.java new file mode 100644 index 0000000..f6300cf --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/domain/TableStatInfo.java @@ -0,0 +1,46 @@ +package net.hzvtc.data.job.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * job生成数据对象 table_stat_info + * + * @author admin + * @date 2023-08-17 + */ +@Data +@Alias("TableStatInfo") +public class TableStatInfo { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 目前统计Id + */ + @Excel(name = "目前统计Id") + private Long tableId; + + /** + * 类型 + */ + @Excel(name = "类型") + private int type; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("tableId", getTableId()) + .append("type", getType()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/job/mapper/TableStatInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/mapper/TableStatInfoMapper.java new file mode 100644 index 0000000..84f7d74 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/mapper/TableStatInfoMapper.java @@ -0,0 +1,53 @@ +package net.hzvtc.data.job.mapper; + +import net.hzvtc.data.job.domain.TableStatInfo; + +import java.util.List; + +/** + * job生成数据Mapper接口 + * + * @author admin + * @date 2023-08-17 + */ +public interface TableStatInfoMapper { + /** + * 查询job生成数据 + * + * @param id job生成数据主键 + * @return job生成数据 + */ + public TableStatInfo selectTableStatInfoById(Long id); + + /** + * 查询job生成数据列表 + * + * @param tableStatInfo job生成数据 + * @return job生成数据集合 + */ + public List selectTableStatInfoList(TableStatInfo tableStatInfo); + + /** + * 新增job生成数据 + * + * @param tableStatInfo job生成数据 + * @return 结果 + */ + public int insertTableStatInfo(TableStatInfo tableStatInfo); + + /** + * 修改job生成数据 + * + * @param tableStatInfo job生成数据 + * @return 结果 + */ + public int updateTableStatInfo(TableStatInfo tableStatInfo); + + /** + * 删除job生成数据 + * + * @param id job生成数据主键 + * @return 结果 + */ + public int deleteTableStatInfoById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/TableStatInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/TableStatInfoService.java new file mode 100644 index 0000000..72f1d35 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/TableStatInfoService.java @@ -0,0 +1,53 @@ +package net.hzvtc.data.job.service; + +import net.hzvtc.data.job.domain.TableStatInfo; + +import java.util.List; + +/** + * job生成数据Service接口 + * + * @author admin + * @date 2023-08-17 + */ +public interface TableStatInfoService { + /** + * 查询job生成数据 + * + * @param id job生成数据主键 + * @return job生成数据 + */ + TableStatInfo selectTableStatInfoById(Long id); + + /** + * 查询job生成数据列表 + * + * @param tableStatInfo job生成数据 + * @return job生成数据集合 + */ + List selectTableStatInfoList(TableStatInfo tableStatInfo); + + /** + * 新增job生成数据 + * + * @param tableStatInfo job生成数据 + * @return 结果 + */ + int insertTableStatInfo(TableStatInfo tableStatInfo); + + /** + * 修改job生成数据 + * + * @param tableStatInfo job生成数据 + * @return 结果 + */ + int updateTableStatInfo(TableStatInfo tableStatInfo); + + /** + * 删除job生成数据信息 + * + * @param id job生成数据主键 + * @return 结果 + */ + int deleteTableStatInfoById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/impl/TableStatInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/impl/TableStatInfoServiceImpl.java new file mode 100644 index 0000000..fc78613 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/data/job/service/impl/TableStatInfoServiceImpl.java @@ -0,0 +1,76 @@ +package net.hzvtc.data.job.service.impl; + +import net.hzvtc.data.job.domain.TableStatInfo; +import net.hzvtc.data.job.mapper.TableStatInfoMapper; +import net.hzvtc.data.job.service.TableStatInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * job生成数据Service业务层处理 + * + * @author admin + * @date 2023-08-17 + */ +@Service +public class TableStatInfoServiceImpl implements TableStatInfoService { + @Resource + private TableStatInfoMapper tableStatInfoMapper; + + /** + * 查询job生成数据 + * + * @param id job生成数据主键 + * @return job生成数据 + */ + @Override + public TableStatInfo selectTableStatInfoById(Long id) { + return tableStatInfoMapper.selectTableStatInfoById(id); + } + + /** + * 查询job生成数据列表 + * + * @param tableStatInfo job生成数据 + * @return job生成数据 + */ + @Override + public List selectTableStatInfoList(TableStatInfo tableStatInfo) { + return tableStatInfoMapper.selectTableStatInfoList(tableStatInfo); + } + + /** + * 新增job生成数据 + * + * @param tableStatInfo job生成数据 + * @return 结果 + */ + @Override + public int insertTableStatInfo(TableStatInfo tableStatInfo) { + return tableStatInfoMapper.insertTableStatInfo(tableStatInfo); + } + + /** + * 修改job生成数据 + * + * @param tableStatInfo job生成数据 + * @return 结果 + */ + @Override + public int updateTableStatInfo(TableStatInfo tableStatInfo) { + return tableStatInfoMapper.updateTableStatInfo(tableStatInfo); + } + + /** + * 删除job生成数据信息 + * + * @param id job生成数据主键 + * @return 结果 + */ + @Override + public int deleteTableStatInfoById(Long id) { + return tableStatInfoMapper.deleteTableStatInfoById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceInfoController.java new file mode 100644 index 0000000..daf24c2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceInfoController.java @@ -0,0 +1,172 @@ +package net.hzvtc.device.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.device.domain.DevicePerson; +import net.hzvtc.device.service.DeviceInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 设备Controller + * + * @author admin + * @date 2022-07-28 + */ +@RestController +@RequestMapping("/device/baseInfo") +public class DeviceInfoController extends BaseController { + @Autowired + private DeviceInfoService deviceInfoService; + + /** + * 查询设备列表 + */ +// @PreAuthorize("@ss.hasPermi('device:baseInfo:list')") + @GetMapping("/list") + public TableDataInfo list(DeviceInfo deviceInfo) { +// if (deviceInfo.getDeptId() != null) { +// if (deviceInfo.getDeptId() != 0L) { +// deviceInfo.getParams().put("ancestors",deviceInfoService.getAncestorsById(deviceInfo.getDeptId())); +// } else { +// deviceInfo.setDeptId(null); +// } +// } +// System.out.println(SecurityUtils.getLoginUser().getDeptId()); + + deviceInfo = deviceInfoService.getDeviceInfoQueryParam(deviceInfo); + startPage(); + List list = deviceInfoService.selectDeviceInfoList(deviceInfo); + return getDataTable(list); + } + + @GetMapping("/listByParam") + public AjaxResult getListByParam(DeviceInfo deviceInfo) { + return AjaxResult.success(deviceInfoService.getDeviceInfoListForPage(deviceInfo)); + } + + /** + * 导出设备列表 + */ + @PreAuthorize("@ss.hasPermi('device:baseInfo:export')") + @Log(title = "设备", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DeviceInfo deviceInfo) { + List list = deviceInfoService.selectDeviceInfoList(deviceInfo); + ExcelUtil util = new ExcelUtil<>(DeviceInfo.class); + util.exportExcel(response, list, "设备数据"); + } + + + @PostMapping("/exportPerson") + public void exportPerson(HttpServletResponse response, DeviceInfo deviceInfo) { + List list = deviceInfoService.getPersonInfoListByParam(deviceInfo); + ExcelUtil util = new ExcelUtil<>(DevicePerson.class); + util.exportExcel(response, list, "人员数据"); + } + + /** + * 获取设备详细信息 + */ + @PreAuthorize("@ss.hasPermi('device:baseInfo:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(deviceInfoService.selectDeviceInfoById(id)); + } + + /** + * 新增设备 + */ + @PreAuthorize("@ss.hasPermi('device:baseInfo:add')") + @Log(title = "设备", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DeviceInfo deviceInfo) { + return toAjax(deviceInfoService.insertDeviceInfo(deviceInfo)); + } + + /** + * 修改设备 + */ + @PreAuthorize("@ss.hasPermi('device:baseInfo:edit')") + @Log(title = "设备", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DeviceInfo deviceInfo) { + return toAjax(deviceInfoService.updateDeviceInfo(deviceInfo)); + } + + /** + * 删除设备 + */ + @PreAuthorize("@ss.hasPermi('device:baseInfo:remove')") + @Log(title = "设备", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(deviceInfoService.deleteDeviceInfoByIds(ids)); + } + + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil<>(DeviceInfo.class); + List list = util.importExcel(file.getInputStream()); + String message = deviceInfoService.importData(list, updateSupport); + return AjaxResult.success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil<>(DeviceInfo.class); + util.importTemplateExcel(response, "设备信息"); + } + + @GetMapping(value = "/list/ByUserId") + public AjaxResult getCameraListByUserId() { + return AjaxResult.success(deviceInfoService.getDeviceStatInfoByParam()); + } + + @PostMapping(value = "/list/ByParam") + public AjaxResult getCameraListByParameter(@RequestBody(required = false) JSONObject jsonObject) { + return AjaxResult.success(deviceInfoService.getDeviceInfoListByParam(jsonObject)); + } + + @GetMapping(value = "/listByDept/{deptId}") + public AjaxResult getDeviceListByDeptId(@PathVariable("deptId") Long deptId) { + return AjaxResult.success(deviceInfoService.getDeviceInfoListByDeptId(deptId)); + } + + @GetMapping("/listForSelect") + public List getDeviceListForSelect() { + return deviceInfoService.getDeviceInfoListForSel(); + } + + @GetMapping("/listForMap") + public List getDeviceListForGisMap() { + return deviceInfoService.getDeviceInfoListForGisMap(); + } + + @PostMapping("/updateRate") + public AjaxResult updateRate(@RequestBody DeviceInfo deviceInfo) { + return AjaxResult.success(deviceInfoService.updateDeviceRate(deviceInfo)); + } + + @GetMapping("/statInfo") + public AjaxResult getDeviceStatInfo(DeviceInfo deviceInfo) { + return AjaxResult.success(deviceInfoService.getDeviceStatInfoByParam(deviceInfo)); + } + + @GetMapping("/updateEvalator") + public AjaxResult updateEvalator() { + deviceInfoService.updateDeviceEvalator(); + return AjaxResult.success(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceItemController.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceItemController.java new file mode 100644 index 0000000..10e22b3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DeviceItemController.java @@ -0,0 +1,97 @@ +package net.hzvtc.device.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.device.domain.DeviceItem; +import net.hzvtc.device.service.DeviceItemService; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.common.core.page.TableDataInfo; + +/** + * 相机参数Controller + * + * @author admin + * @date 2024-08-14 + */ +@RestController +@RequestMapping("/device/item") +public class DeviceItemController extends BaseController { + @Autowired + private DeviceItemService deviceItemService; + +/** + * 查询相机参数列表 + */ +@PreAuthorize("@ss.hasPermi('item:item:list')") +@GetMapping("/list") + public TableDataInfo list(DeviceItem deviceItem) { + startPage(); + List list = deviceItemService.selectDeviceItemList(deviceItem); + return getDataTable(list); + } + /** + * 导出相机参数列表 + */ + @PreAuthorize("@ss.hasPermi('item:item:export')") + @Log(title = "相机参数", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DeviceItem deviceItem) { + List list = deviceItemService.selectDeviceItemList(deviceItem); + ExcelUtil util = new ExcelUtil(DeviceItem. class); + util.exportExcel(response, list, "相机参数数据"); + } + + /** + * 获取相机参数详细信息 + */ + @PreAuthorize("@ss.hasPermi('item:item:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(deviceItemService.selectDeviceItemById(id)); + } + + /** + * 新增相机参数 + */ + @PreAuthorize("@ss.hasPermi('item:item:add')") + @Log(title = "相机参数", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DeviceItem deviceItem) { + return toAjax(deviceItemService.insertDeviceItem(deviceItem)); + } + + /** + * 修改相机参数 + */ + @PreAuthorize("@ss.hasPermi('item:item:edit')") + @Log(title = "相机参数", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DeviceItem deviceItem) { + return toAjax(deviceItemService.updateDeviceItem(deviceItem)); + } + + /** + * 删除相机参数 + */ + @PreAuthorize("@ss.hasPermi('item:item:remove')") + @Log(title = "相机参数", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(deviceItemService.deleteDeviceItemByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DevicePersonController.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DevicePersonController.java new file mode 100644 index 0000000..2326eb0 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/DevicePersonController.java @@ -0,0 +1,33 @@ +package net.hzvtc.device.controller; + +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.device.domain.DevicePerson; +import net.hzvtc.device.service.DevicePersonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@RequestMapping("/device/person") +public class DevicePersonController extends BaseController { + @Autowired + private DevicePersonService devicePersonService; + + + @PostMapping("/add") + public AjaxResult addDevicePerson(@RequestBody DevicePerson data) { + return AjaxResult.success(devicePersonService.addDevicePerson(data)); + } + + @PostMapping("/update") + public AjaxResult updateDevicePerson(@RequestBody DevicePerson data) { + return AjaxResult.success(devicePersonService.updateDevicePerson(data)); + } + + @DeleteMapping("/{id}") + public AjaxResult deleteDevicePerson(@PathVariable Long id) { + return AjaxResult.success(devicePersonService.deleteDevicePersonById(id)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/HeatmapInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/HeatmapInfoController.java new file mode 100644 index 0000000..b9cf7ab --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/controller/HeatmapInfoController.java @@ -0,0 +1,97 @@ +package net.hzvtc.device.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.device.domain.HeatmapInfo; +import net.hzvtc.device.service.HeatmapInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 热力图配置Controller + * + * @author admin + * @date 2022-11-29 + */ +@RestController +@RequestMapping("/heatmap/heatmapInfo") +public class HeatmapInfoController extends BaseController { + @Autowired + private HeatmapInfoService heatmapInfoService; + + /** + * 查询热力图配置列表 + */ + @PreAuthorize("@ss.hasPermi('heatmap:heatmapInfo:list')") + @GetMapping("/list") + public TableDataInfo list(HeatmapInfo heatmapInfo) { + startPage(); + List list = heatmapInfoService.selectHeatmapInfoList(heatmapInfo); + return getDataTable(list); + } + + /** + * 导出热力图配置列表 + */ + @PreAuthorize("@ss.hasPermi('heatmap:heatmapInfo:export')") + @Log(title = "热力图配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, HeatmapInfo heatmapInfo) { + List list = heatmapInfoService.selectHeatmapInfoList(heatmapInfo); + ExcelUtil util = new ExcelUtil(HeatmapInfo.class); + util.exportExcel(response, list, "热力图配置数据"); + } + + /** + * 获取热力图配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('heatmap:heatmapInfo:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(heatmapInfoService.selectHeatmapInfoById(id)); + } + + /** + * 新增热力图配置 + */ + @PreAuthorize("@ss.hasPermi('heatmap:heatmapInfo:add')") + @Log(title = "热力图配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody HeatmapInfo heatmapInfo) { + return toAjax(heatmapInfoService.insertHeatmapInfo(heatmapInfo)); + } + + /** + * 修改热力图配置 + */ + @PreAuthorize("@ss.hasPermi('heatmap:heatmapInfo:edit')") + @Log(title = "热力图配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody HeatmapInfo heatmapInfo) { + return toAjax(heatmapInfoService.updateHeatmapInfo(heatmapInfo)); + } + + /** + * 删除热力图配置 + */ + @PreAuthorize("@ss.hasPermi('heatmap:heatmapInfo:remove')") + @Log(title = "热力图配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(heatmapInfoService.deleteHeatmapInfoByIds(ids)); + } + + @PostMapping("/heatmapListByParam") + public AjaxResult getBirdHeatmapList(@RequestBody JSONObject obj) { + return AjaxResult.success(heatmapInfoService.getBirdHeatmapListByParam(obj)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceInfo.java new file mode 100644 index 0000000..2f0ae2b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceInfo.java @@ -0,0 +1,105 @@ +package net.hzvtc.device.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import net.hzvtc.data.check.domain.ResultMedia; +import org.apache.ibatis.type.Alias; + +import java.util.List; + +/** + * 设备对象 device_info + * + * @author admin + * @date 2022-07-28 + */ +@Data +@Alias("DeviceInfo") +public class DeviceInfo extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 设备id + */ + private Long id; + + /** + * 设备名 + */ + @Excel(name = "设备名") + private String deviceName; + + /** + * 型号 + */ + @Excel(name = "设备PID") + private String pid; + + /** + * 序列号 + */ + @Excel(name = "设备DUID") + private String duid; + + /** + * 描述 + */ + private String description; + + /** + * 经度 + */ + @Excel(name = "经度") + private double longitude; + + /** + * 纬度 + */ + @Excel(name = "纬度") + private double latitude; + + /** + * 网格划分信息 + */ + private double evalator; + + /** + * 状态:0-异常,1-正常 + */ + @Excel(name = "状态:0-异常,1-正常") + private Integer status; + + /** + * 设备ip + */ + @Excel(name = "设备ip") + private String deviceIp; + + private double rate; + + /** + * 设备类型 + */ + @Excel(name = "设备类型", readConverterExp = "1=单机,2=网络") + private Integer deviceType; + + private Long deptId; + + private String deptName; + + private String deptFullName; + + //监测记录数 + private long recordCount; + + private ResultMedia resultMedia; + + private List manager; + + private int mainAnimal = 0; + + private Integer habitatType; + + private String habitatTypeName; +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceItem.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceItem.java new file mode 100644 index 0000000..99ee3b8 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DeviceItem.java @@ -0,0 +1,293 @@ +package net.hzvtc.device.domain; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 相机参数对象 device_item + * + * @author admin + * @date 2024-08-14 + */ +@Data +@Alias("DeviceItem") +public class DeviceItem extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 拍摄模式 + */ + @Excel(name = "拍摄模式") + private String shotMode; + + /** + * 图片大小 + */ + @Excel(name = "图片大小") + private String imageSize; + + /** + * 连拍 + */ + @Excel(name = "连拍") + private Long burstShot; + + /** + * 视频大小 + */ + @Excel(name = "视频大小") + private String videoSize; + + /** + * 视频长度(秒) + */ + @Excel(name = "视频长度(秒)") + private Long videoLength; + + /** + * 拍摄限制(次) + */ + @Excel(name = "拍摄限制(次)") + private Long shotLimit; + + /** + * 时间服务器地址 + */ + @Excel(name = "时间服务器地址") + private String timerServer; + + /** + * 时间服务器端口 + */ + @Excel(name = "时间服务器端口") + private Long timerPort; + + /** + * 存储服务器地址 + */ + @Excel(name = "存储服务器地址") + private String storeServer; + + /** + * 存储服务器端口 + */ + @Excel(name = "存储服务器端口") + private Long storePort; + + /** + * 上级设备PID + */ + @Excel(name = "上级设备PID") + private String parentId; + + /** + * 上级设备IP地址 + */ + @Excel(name = "上级设备IP地址") + private String parentIp; + + /** + * 断链时长(秒) + */ + @Excel(name = "断链时长(秒)") + private Long dislinkTime; + + /** + * 心跳间隔(秒) + */ + @Excel(name = "心跳间隔(秒)") + private Long heartbeatTime; + + /** + * PIR开关 + */ + @Excel(name = "PIR开关") + private Long pirSwitcher; + + /** + * PIR灵敏度 + */ + @Excel(name = "PIR灵敏度") + private String pirSensitivity; + + /** + * 触发时间间隔 + */ + @Excel(name = "触发时间间隔") + private String pirInterval; + + /** + * 定时拍摄 + */ + @Excel(name = "定时拍摄") + private Long shotTimer; + + /** + * 循环拍摄间隔 + */ + @Excel(name = "循环拍摄间隔") + private String shotInterval; + + /** + * 时间段1(时:分) + */ + @Excel(name = "时间段1(时:分)") + private String shotTimer1From; + + /** + * 时间段1(时:分) + */ + @Excel(name = "时间段1(时:分)") + private String shotTimer1To; + + /** + * 时间段2(时:分) + */ + @Excel(name = "时间段2(时:分)") + private String shotTimer2From; + + /** + * 时间段2(时:分) + */ + @Excel(name = "时间段2(时:分)") + private String shotTimer2To; + + /** + * 时间段3(时:分) + */ + @Excel(name = "时间段3(时:分)") + private String shotTimer3From; + + /** + * 时间段3(时:分) + */ + @Excel(name = "时间段3(时:分)") + private String shotTimer3To; + + /** + * 周重复 + */ + @Excel(name = "周重复") + private String shotTimerRepeater; + + /** + * 信息戳记 + */ + @Excel(name = "信息戳记") + private Long snapshot; + + /** + * 自动覆盖 + */ + @Excel(name = "自动覆盖") + private Long overwriter; + + /** + * 小生境 + */ + @Excel(name = "小生境") + private String habitat; + + /** + * 坡向 + */ + @Excel(name = "坡向") + private String aspect; + + /** + * 坡位 + */ + @Excel(name = "坡位") + private String slopePostion; + + /** + * 坡度 + */ + @Excel(name = "坡度") + private String gradient; + + /** + * 栖息地类型 + */ + @Excel(name = "栖息地类型") + private String habitatType; + + /** + * 干扰类型 + */ + @Excel(name = "干扰类型") + private String interfereType; + + /** + * 干扰强度 + */ + @Excel(name = "干扰强度") + private String interfereLevel; + + /** + * 在线状态 + */ + @Excel(name = "在线状态") + private Long status; + + /** + * 设备ID + */ + @Excel(name = "设备ID") + private Long pid; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("shot mode", getShotMode()) + .append("imageSize", getImageSize()) + .append("burstShot", getBurstShot()) + .append("videoSize", getVideoSize()) + .append("videoLength", getVideoLength()) + .append("shotLimit", getShotLimit()) + .append("timerServer", getTimerServer()) + .append("timerPort", getTimerPort()) + .append("storeServer", getStoreServer()) + .append("storePort", getStorePort()) + .append("parentId", getParentId()) + .append("parentIp", getParentIp()) + .append("dislinkTime", getDislinkTime()) + .append("heartbeatTime", getHeartbeatTime()) + .append("pirSwitcher", getPirSwitcher()) + .append("pirSensitivity", getPirSensitivity()) + .append("pirInterval", getPirInterval()) + .append("shotTimer", getShotTimer()) + .append("shotInterval", getShotInterval()) + .append("shotTimer1From", getShotTimer1From()) + .append("shotTimer1To", getShotTimer1To()) + .append("shotTimer2From", getShotTimer2From()) + .append("shotTimer2To", getShotTimer2To()) + .append("shotTimer3From", getShotTimer3From()) + .append("shotTimer3To", getShotTimer3To()) + .append("shotTimerRepeater", getShotTimerRepeater()) + .append("snapshot", getSnapshot()) + .append("overwriter", getOverwriter()) + .append("habitat", getHabitat()) + .append("aspect", getAspect()) + .append("slopePostion", getSlopePostion()) + .append("gradient", getGradient()) + .append("habitatType", getHabitatType()) + .append("interfereType", getInterfereType()) + .append("interfereLevel", getInterfereLevel()) + .append("status", getStatus()) + .append("pid", getPid()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DevicePerson.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DevicePerson.java new file mode 100644 index 0000000..a4ac32f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/DevicePerson.java @@ -0,0 +1,31 @@ +package net.hzvtc.device.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.ibatis.type.Alias; + +@Data +@Alias("DevicePerson") +public class DevicePerson { + @Excel(name = "id") + private Long id; + @Excel(name = "姓名") + private String name; + @Excel(name = "性别") + private int gender; + @Excel(name = "联系电话") + private String mobile; + @Excel(name = "是否发放补贴", readConverterExp = "1=是,0=否") + private int hasMoney; + @Excel(name = "是否发放装备", readConverterExp = "1=是,0=否") + private int hasTool; + private Long deptId; + @Excel(name = "地点") + private String deptName; + @Excel(name = "备注") + private String memo; + private String photo; + private Long pid; + @Excel(name = "相机编号") + private String deviceId; +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/HeatmapInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/HeatmapInfo.java new file mode 100644 index 0000000..5c41011 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/domain/HeatmapInfo.java @@ -0,0 +1,90 @@ +package net.hzvtc.device.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 热力图配置对象 heatmap_info + * + * @author admin + * @date 2022-11-29 + */ +@Data +@Alias("HeatmapInfo") +public class HeatmapInfo extends BaseEntity { + private static final Long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 名称 + */ + @Excel(name = "名称") + private String name; + + /** + * x轴坐标 + */ + @Excel(name = "x轴坐标") + private int centerX; + + /** + * y轴坐标 + */ + @Excel(name = "y轴坐标") + private int centerY; + + /** + * x坐标起点 + */ + @Excel(name = "x坐标起点") + private int startX; + + /** + * x坐标终点 + */ + @Excel(name = "x坐标终点") + private int endX; + + /** + * y坐标起点 + */ + @Excel(name = "y坐标起点") + private int startY; + + /** + * y坐标终点 + */ + @Excel(name = "y坐标终点") + private int endY; + + /** + * 外键 + */ + @Excel(name = "外键") + private Long deviceId; + + private Long areaId; + + private int count; + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("centerX", getCenterX()) + .append("centerY", getCenterY()) + .append("deviceId", getDeviceId()) + .append("isDeleted", getIsDeleted()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceInfoMapper.java new file mode 100644 index 0000000..19d9e5e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceInfoMapper.java @@ -0,0 +1,110 @@ +package net.hzvtc.device.mapper; + +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.echart.domain.vo.DeviceInfoVo; + +import java.util.List; +import java.util.Map; + +/** + * 设备Mapper接口 + * + * @author admin + * @date 2022-07-28 + */ +public interface DeviceInfoMapper { + /** + * 查询设备 + * + * @param id 设备主键 + * @return 设备 + */ + public DeviceInfo selectDeviceInfoById(Long id); + + DeviceInfo selectDeviceInfoByParam(DeviceInfo deviceInfo); + + /** + * 查询设备列表 + * + * @param deviceInfo 设备 + * @return 设备集合 + */ + List selectDeviceInfoList(DeviceInfo deviceInfo); + + + List getDeviceInfoListForPage(DeviceInfo deviceInfo); + + List getDeviceInfoListByParam(Map param); + + List getDeviceCameraInfoByAreaId(Long areaId); + + /** + * 新增设备 + * + * @param deviceInfo 设备 + * @return 结果 + */ + public int insertDeviceInfo(DeviceInfo deviceInfo); + + /** + * 修改设备 + * + * @param deviceInfo 设备 + * @return 结果 + */ + public int updateDeviceInfo(DeviceInfo deviceInfo); + + int updateDeviceRate(DeviceInfo deviceInfo); + + /** + * 删除设备 + * + * @param id 设备主键 + * @return 结果 + */ + public int deleteDeviceInfoById(Long id); + + /** + * 批量删除设备 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteDeviceInfoByIds(Long[] ids); + + List getDeviceInfoListByAreaId(Long areaId); + + List getDeviceInfoConnectionList(); + + int updateDeviceStatus(DeviceInfo data); + + List getDeviceInfoListForSel(Map param); + + List getDeviceInfoListForMap(DeviceInfo param); + + List getDeviceInfoListByDeptId(Long deptId); + + Long getDeviceIdByDuid(String pid); + + DeviceInfo getDeviceInfoForElasticById(Long id); + + List getDeviceIdListByDeptId(Map param); + + List getDeviceIdsByBoundBox(Map param); + + Integer getDeviceAmountByParam(); + + List getDeviceTypeStatByParam(Map param); + + List getDeviceStatusStatByParam(Map param); + + List getDeviceIdsInList(List list); + + Long getDeviceIdByPid(String pid); + + List getDeviceIdsByParam(DeviceInfo param); + + List getEmptyEvalatorList(); + + void updateDeviceEvalator(DeviceInfo deviceInfo); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceItemMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceItemMapper.java new file mode 100644 index 0000000..387af3a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DeviceItemMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.device.mapper; + +import java.util.List; +import net.hzvtc.device.domain.DeviceItem; + +/** + * 相机参数Mapper接口 + * + * @author admin + * @date 2024-08-14 + */ +public interface DeviceItemMapper +{ + /** + * 查询相机参数 + * + * @param id 相机参数主键 + * @return 相机参数 + */ + public DeviceItem selectDeviceItemById(Long id); + + /** + * 查询相机参数列表 + * + * @param deviceItem 相机参数 + * @return 相机参数集合 + */ + public List selectDeviceItemList(DeviceItem deviceItem); + + /** + * 新增相机参数 + * + * @param deviceItem 相机参数 + * @return 结果 + */ + public int insertDeviceItem(DeviceItem deviceItem); + + /** + * 修改相机参数 + * + * @param deviceItem 相机参数 + * @return 结果 + */ + public int updateDeviceItem(DeviceItem deviceItem); + + /** + * 删除相机参数 + * + * @param id 相机参数主键 + * @return 结果 + */ + public int deleteDeviceItemById(Long id); + + /** + * 批量删除相机参数 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteDeviceItemByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DevicePersonMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DevicePersonMapper.java new file mode 100644 index 0000000..c87e14f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/DevicePersonMapper.java @@ -0,0 +1,17 @@ +package net.hzvtc.device.mapper; + +import net.hzvtc.device.domain.DevicePerson; + +import java.util.List; + +public interface DevicePersonMapper { + int addDevicePersonInfo(DevicePerson devicePerson); + + int updateDevicePerson(DevicePerson devicePerson); + + List getDevicePersonByPid(Long pid); + + int deleteDevicePersonById(Long id); + + List getPersonInfoListByParam(List list); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/HeatmapInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/HeatmapInfoMapper.java new file mode 100644 index 0000000..c481a60 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/mapper/HeatmapInfoMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.device.mapper; + +import java.util.List; +import net.hzvtc.device.domain.HeatmapInfo; + +/** + * 热力图配置Mapper接口 + * + * @author admin + * @date 2022-11-29 + */ +public interface HeatmapInfoMapper +{ + /** + * 查询热力图配置 + * + * @param id 热力图配置主键 + * @return 热力图配置 + */ + public HeatmapInfo selectHeatmapInfoById(Long id); + + /** + * 查询热力图配置列表 + * + * @param heatmapInfo 热力图配置 + * @return 热力图配置集合 + */ + public List selectHeatmapInfoList(HeatmapInfo heatmapInfo); + + /** + * 新增热力图配置 + * + * @param heatmapInfo 热力图配置 + * @return 结果 + */ + public int insertHeatmapInfo(HeatmapInfo heatmapInfo); + + /** + * 修改热力图配置 + * + * @param heatmapInfo 热力图配置 + * @return 结果 + */ + public int updateHeatmapInfo(HeatmapInfo heatmapInfo); + + /** + * 删除热力图配置 + * + * @param id 热力图配置主键 + * @return 结果 + */ + public int deleteHeatmapInfoById(Long id); + + /** + * 批量删除热力图配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteHeatmapInfoByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceInfoService.java new file mode 100644 index 0000000..7a991df --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceInfoService.java @@ -0,0 +1,117 @@ +package net.hzvtc.device.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.device.domain.DevicePerson; + +import java.util.List; +import java.util.Map; + +/** + * 设备Service接口 + * + * @author admin + * @date 2022-07-28 + */ +public interface DeviceInfoService { + /** + * 查询设备 + * + * @param id 设备主键 + * @return 设备 + */ + public DeviceInfo selectDeviceInfoById(Long id); + + /** + * 查询设备列表 + * + * @param deviceInfo 设备 + * @return 设备集合 + */ + List selectDeviceInfoList(DeviceInfo deviceInfo); + + List getDeviceInfoListForPage(DeviceInfo deviceInfo); + + List getPersonInfoListByParam(DeviceInfo deviceInfo); + + /** + * 新增设备 + * + * @param deviceInfo 设备 + * @return 结果 + */ + int insertDeviceInfo(DeviceInfo deviceInfo); + + /** + * 修改设备 + * + * @param deviceInfo 设备 + * @return 结果 + */ + int updateDeviceInfo(DeviceInfo deviceInfo); + + /** + * 批量删除设备 + * + * @param ids 需要删除的设备主键集合 + * @return 结果 + */ + int deleteDeviceInfoByIds(Long[] ids); + + String getAncestorsById(Long id); + + /** + * 删除设备信息 + * + * @param id 设备主键 + * @return 结果 + */ + int deleteDeviceInfoById(Long id); + + String importData(List list, boolean updateSupport); + + List getDeviceInfoListByUserId(Long userId); + + List getDeviceCameraInfoByAreaId(Long areaId); + + List getDeviceStatInfoByParam(); + + List getDeviceInfoListByParam(JSONObject jsonObject); + + List getDeviceInfoListByAreaId(Long areaId); + + void updateDeviceConnectState(); + + List getDeviceInfoListForSel(); + + List getDeviceInfoListForGisMap(); + + List getDeviceInfoListByDeptId(Long deptId); + + List getPostListByUserId(Long userId); + + Long getDeviceIdByDuid(String duid); + + Long getDeviceIdByPid(String pid); + + DeviceInfo getDeviceInfoForElasticById(Long id); + + List getDeviceIdListByDeptId(Long deptId); + + List getDeviceIdsByBoundBox(Map param); + + DeviceInfo getDeviceInfoQueryParam(DeviceInfo data); + + Integer getDeviceAmountByParam(); + + int updateDeviceRate(DeviceInfo deviceInfo); + + JSONObject getDeviceStatInfoByParam(DeviceInfo deviceInfo); + + List getDeviceIdsInList(List list); + + Long parserJsonObject(JSONObject jsonObject); + + void updateDeviceEvalator(); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceItemService.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceItemService.java new file mode 100644 index 0000000..2f9e94d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DeviceItemService.java @@ -0,0 +1,61 @@ +package net.hzvtc.device.service; + +import java.util.List; + +import net.hzvtc.device.domain.DeviceItem; + +/** + * 相机参数Service接口 + * + * @author admin + * @date 2024-08-14 + */ +public interface DeviceItemService { + /** + * 查询相机参数 + * + * @param id 相机参数主键 + * @return 相机参数 + */ + public DeviceItem selectDeviceItemById(Long id); + + /** + * 查询相机参数列表 + * + * @param deviceItem 相机参数 + * @return 相机参数集合 + */ + public List selectDeviceItemList(DeviceItem deviceItem); + + /** + * 新增相机参数 + * + * @param deviceItem 相机参数 + * @return 结果 + */ + public int insertDeviceItem(DeviceItem deviceItem); + + /** + * 修改相机参数 + * + * @param deviceItem 相机参数 + * @return 结果 + */ + public int updateDeviceItem(DeviceItem deviceItem); + + /** + * 批量删除相机参数 + * + * @param ids 需要删除的相机参数主键集合 + * @return 结果 + */ + public int deleteDeviceItemByIds(Long[] ids); + + /** + * 删除相机参数信息 + * + * @param id 相机参数主键 + * @return 结果 + */ + public int deleteDeviceItemById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DevicePersonService.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DevicePersonService.java new file mode 100644 index 0000000..9c1748c --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/DevicePersonService.java @@ -0,0 +1,17 @@ +package net.hzvtc.device.service; + +import net.hzvtc.device.domain.DevicePerson; + +import java.util.List; + +public interface DevicePersonService { + int addDevicePerson(DevicePerson devicePerson); + + int updateDevicePerson(DevicePerson devicePerson); + + List getDevicePersonByPid(Long pid); + + int deleteDevicePersonById(Long id); + + List getPersonInfoListByParam(List list); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/HeatmapInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/HeatmapInfoService.java new file mode 100644 index 0000000..587b57b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/HeatmapInfoService.java @@ -0,0 +1,65 @@ +package net.hzvtc.device.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.device.domain.HeatmapInfo; + +import java.util.List; + +/** + * 热力图配置Service接口 + * + * @author admin + * @date 2022-11-29 + */ +public interface HeatmapInfoService { + /** + * 查询热力图配置 + * + * @param id 热力图配置主键 + * @return 热力图配置 + */ + HeatmapInfo selectHeatmapInfoById(Long id); + + /** + * 查询热力图配置列表 + * + * @param heatmapInfo 热力图配置 + * @return 热力图配置集合 + */ + List selectHeatmapInfoList(HeatmapInfo heatmapInfo); + + /** + * 新增热力图配置 + * + * @param heatmapInfo 热力图配置 + * @return 结果 + */ + int insertHeatmapInfo(HeatmapInfo heatmapInfo); + + /** + * 修改热力图配置 + * + * @param heatmapInfo 热力图配置 + * @return 结果 + */ + int updateHeatmapInfo(HeatmapInfo heatmapInfo); + + /** + * 批量删除热力图配置 + * + * @param ids 需要删除的热力图配置主键集合 + * @return 结果 + */ + int deleteHeatmapInfoByIds(Long[] ids); + + /** + * 删除热力图配置信息 + * + * @param id 热力图配置主键 + * @return 结果 + */ + int deleteHeatmapInfoById(Long id); + + List getBirdHeatmapListByParam(JSONObject obj); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceInfoServiceImpl.java new file mode 100644 index 0000000..8822ef8 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceInfoServiceImpl.java @@ -0,0 +1,564 @@ +package net.hzvtc.device.service.impl; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import net.hzvtc.common.core.domain.entity.SysDept; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.mapper.ResultRecordDetailsMapper; +import net.hzvtc.data.check.service.ResultMediaService; +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.device.domain.DevicePerson; +import net.hzvtc.device.mapper.DeviceInfoMapper; +import net.hzvtc.device.service.DeviceInfoService; +import net.hzvtc.device.service.DevicePersonService; +import net.hzvtc.echart.domain.vo.DeviceInfoVo; +import net.hzvtc.system.mapper.SysUserPostMapper; +import net.hzvtc.system.service.SysDeptService; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * 设备Service业务层处理 + * + * @author admin + * @date 2022-07-28 + */ +@Service +@RequiredArgsConstructor +public class DeviceInfoServiceImpl implements DeviceInfoService { + private static final Logger log = LoggerFactory.getLogger(DeviceInfoServiceImpl.class); + @Resource + protected Validator validator; + + @Resource + private DeviceInfoMapper deviceInfoMapper; + + @Resource + private SysUserPostMapper sysUserPostMapper; + + + private final ResultRecordDetailsMapper resultRecordDetailsMapper; + + private final ResultMediaService resultMediaService; + + private final SysDeptService sysDeptService; + + private final DevicePersonService devicePersonService; + +// @Autowired +// private ResultRecordDetailsService resultRecordDetailsService; + + + /** + * 查询设备 + * + * @param id 设备主键 + * @return 设备 + */ + @Override + public DeviceInfo selectDeviceInfoById(Long id) { + return deviceInfoMapper.selectDeviceInfoById(id); + } + + /** + * 查询设备列表 + * + * @param deviceInfo 设备 + * @return 设备 + */ + @Override + public List selectDeviceInfoList(DeviceInfo deviceInfo) { + List list = deviceInfoMapper.selectDeviceInfoList(deviceInfo); + Map map = new HashMap<>(); + map.put("speciesId", 1513); + for (DeviceInfo item : list) { + map.put("deviceId", item.getId()); + Long id = resultRecordDetailsMapper.getSpeciesIdByPram(map); + if (id != null) { + item.setMainAnimal(1); + } + } + return list; + } + + @Override + public String getAncestorsById(Long id) { + SysDept data = sysDeptService.selectDeptById(id); + return data.getAncestors() + "," + data.getDeptId(); + } + + @Override + public List getDeviceInfoListForPage(DeviceInfo deviceInfo) { + return deviceInfoMapper.getDeviceInfoListForPage(deviceInfo); + } + + @Override + public List getPersonInfoListByParam(DeviceInfo deviceInfo) { + List list = deviceInfoMapper.getDeviceIdsByParam(deviceInfo); + if (list == null || list.isEmpty()) { + return new ArrayList<>(); + } else { + return devicePersonService.getPersonInfoListByParam(list); + } + } + + /** + * 新增设备 + * + * @param deviceInfo 设备 + * @return 结果 + */ + @Override + @Transactional + public int insertDeviceInfo(DeviceInfo deviceInfo) { + // if (deviceInfo.getRtsp() != null && !deviceInfo.getRtsp().isEmpty()) { +// resultMediaService.insertResultMedia(createResultMedia(deviceInfo)); +// } + return deviceInfoMapper.insertDeviceInfo(deviceInfo); + } + + private ResultMedia createResultMedia(DeviceInfo deviceInfo) { + ResultMedia data = new ResultMedia(); + data.setDeviceId(deviceInfo.getId()); + data.setMediaType(4); +// data.setMediaUrl(deviceInfo.getRtsp()); + data.setTime(new Date()); + return data; + } + + /** + * 修改设备 + * + * @param deviceInfo 设备 + * @return 结果 + */ + @Override + @Transactional + public int updateDeviceInfo(DeviceInfo deviceInfo) { + return deviceInfoMapper.updateDeviceInfo(deviceInfo); +// resultMediaService.deleteResultRealMediaByParam(deviceInfo.getId()); +// if (deviceInfo.getRtsp() != null && !deviceInfo.getRtsp().isEmpty()) { +// resultMediaService.insertResultMedia(createResultMedia(deviceInfo)); +// } + + } + + /** + * 批量删除设备 + * + * @param ids 需要删除的设备主键 + * @return 结果 + */ + @Override + public int deleteDeviceInfoByIds(Long[] ids) { + return deviceInfoMapper.deleteDeviceInfoByIds(ids); + } + + /** + * 删除设备信息 + * + * @param id 设备主键 + * @return 结果 + */ + @Override + public int deleteDeviceInfoById(Long id) { + return deviceInfoMapper.deleteDeviceInfoById(id); + } + + @Override + public String importData(List list, boolean updateSupport) { + if (StringUtils.isNull(list) || list.isEmpty()) { + throw new ServiceException("导入保护区设备不能为空!"); + } + AtomicInteger[] successNum = {new AtomicInteger()}; + int[] failureNum = {0}; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + list.forEach(data -> { + try { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByName(data.getProtectedAreaName()); + + DeviceInfo param = new DeviceInfo(); + param.setDeviceName(data.getDeviceName()); + DeviceInfo deviceInfo = deviceInfoMapper.selectDeviceInfoByParam(param); + if (Objects.isNull(deviceInfo)) { + BeanValidators.validateWithException(validator, data); + data.setIsDeleted(0); + data.setCreateTime(new Date()); + insertDeviceInfo(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、设备 " + data.getDeviceName() + " 导入成功"); + } else if (updateSupport) { + BeanValidators.validateWithException(validator, data); + data.setId(deviceInfo.getId()); + updateDeviceInfo(data); + successNum[0].getAndIncrement(); + successMsg.append("
" + successNum[0] + "、设备 " + data.getDeviceName() + " 更新成功"); + } else { + failureNum[0]++; + failureMsg.append("
" + failureNum[0] + "、设备 " + data.getDeviceName() + " 已存在"); + } + + } catch (Exception e) { + failureNum[0]++; + String msg = "
" + failureNum + "、设备 " + data.getDeviceName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + }); + if (failureNum[0] > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum[0] + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getDeviceInfoListByUserId(Long userId) { + Map param = new HashMap<>(); + if (userId == 0L) { + userId = null; + } + + param.put("userId", userId); + + List list = deviceInfoMapper.getDeviceInfoListByParam(param); + return list.stream().map(item -> { +// log.info("==={}", item); + JSONObject obj = new JSONObject(); + obj.put("id", item.getId()); + obj.put("name", item.getDeviceName()); + obj.put("type", item.getDeviceType()); + obj.put("lon", item.getLongitude()); + obj.put("lat", item.getLatitude()); + return obj; + }).collect(Collectors.toList()); + } + + @Override + public List getDeviceCameraInfoByAreaId(Long areaId) { + return deviceInfoMapper.getDeviceCameraInfoByAreaId(areaId); + } + + @Override + public List getDeviceStatInfoByParam() { + Map param = new HashMap<>(); + if (SecurityUtils.getUserId() != 1L && SecurityUtils.getDeptId() == 0) { + param.put("userId", SecurityUtils.getUserId()); + } + + return deviceInfoMapper.getDeviceInfoListByParam(param); + + } + + @Override + public List getDeviceInfoListByParam(JSONObject jsonObject) { + Map param = new HashMap<>(); + if (SecurityUtils.getUserId() != 1L && SecurityUtils.getDeptId() == 0) { + param.put("userId", SecurityUtils.getUserId()); + } + if (jsonObject != null) { + Long deptId = jsonObject.getLong("deptId"); + if (deptId != null) { + param.put("ancestors", getAncestorsById(deptId)); + param.put("deptId", deptId); + } + } + + return deviceInfoMapper.getDeviceInfoListByParam(param); + } + + @Override + public List getDeviceInfoListByAreaId(Long areaId) { + return deviceInfoMapper.getDeviceInfoListByAreaId(areaId); + } + + @Override + public void updateDeviceConnectState() { + List list = deviceInfoMapper.getDeviceInfoConnectionList(); + if (list != null) { + list.forEach(item -> { +// boolean flag = isActive(item.getRtsp()); +// if (flag && item.getStatus() == 0) { +// item.setStatus(1); +// deviceInfoMapper.updateDeviceStatus(item); +// } else if (!flag && item.getStatus() == 1) { +// item.setStatus(0); +// deviceInfoMapper.updateDeviceStatus(item); +// } + }); + } + } + + @Override + public List getDeviceInfoListForSel() { + SysUser user = SecurityUtils.getLoginUser().getUser(); + Map param = new HashMap<>(); + if (user.getDeptId() != 1L) { + param.put("userId", user.getUserId()); + } + return deviceInfoMapper.getDeviceInfoListForSel(param); + } + + @Override + public List getDeviceInfoListForGisMap() { +// SysUser user = SecurityUtils.getLoginUser().getUser(); + DeviceInfo param = new DeviceInfo(); +// if (user.getUserId() > 1L) { +// param.getParams().put("ancestors", getAncestorsById(user.getDeptId())); +// } + if (SecurityUtils.getLoginUser().getDeptId() != 1) { + param.getParams().put("userId", SecurityUtils.getUserId()); + } + return deviceInfoMapper.getDeviceInfoListForMap(param); + } + + @Override + public List getDeviceInfoListByDeptId(Long deptId) { + return deviceInfoMapper.getDeviceInfoListByDeptId(deptId); + } + + @Override + public List getPostListByUserId(Long userId) { + return sysUserPostMapper.getPostListByUserId(userId); + } + + @Override + public Long getDeviceIdByDuid(String duid) { + return deviceInfoMapper.getDeviceIdByDuid(duid); + } + + @Override + public Long getDeviceIdByPid(String pid) { + Long id = deviceInfoMapper.getDeviceIdByPid(pid); + if (id == null) { + DeviceInfo data = new DeviceInfo(); + data.setPid(pid); + data.setDeviceName(pid); + data.setDuid(pid); + if (pid.startsWith("C154E")) { + data.setDeviceType(2); + } else { + data.setDeviceType(1); + } + data.setIsDeleted(0); + data.setCreateTime(new Date()); + deviceInfoMapper.insertDeviceInfo(data); + id = data.getId(); + } + return id; + } + + @Override + public DeviceInfo getDeviceInfoForElasticById(Long id) { + return deviceInfoMapper.getDeviceInfoForElasticById(id); + } + + @Override + public List getDeviceIdListByDeptId(Long deptId) { + Map param = new HashMap<>(); + param.put("deptId", deptId); + String ancestors = sysDeptService.getDeptAncestorsById(deptId); + if (ancestors == null || ancestors.isEmpty()) { + ancestors = deptId + ""; + } else { + ancestors = ancestors + "," + deptId; + } + param.put("ancestors", ancestors); + return deviceInfoMapper.getDeviceIdListByDeptId(param); + } + + @Override + public List getDeviceIdsByBoundBox(Map param) { + if (SecurityUtils.getLoginUser().getDeptId() != 1) { + param.put("userId", SecurityUtils.getUserId()); + } + return deviceInfoMapper.getDeviceIdsByBoundBox(param); + } + + @Override + public DeviceInfo getDeviceInfoQueryParam(DeviceInfo data) { + if (data == null) { + data = new DeviceInfo(); + } + if (SecurityUtils.getLoginUser().getDeptId() != 1) { + data.getParams().put("userId", SecurityUtils.getUserId()); + } + if (data.getDeptId() != null) { +// List list = sysDeptService.getSysDeptAncestorsIdsById(data.getDeptId()); + List list = sysDeptService.getDeptSubIdsById(data.getDeptId()); + data.getParams().put("list", list); + data.setDeptId(null); + } + return data; + } + + @Override + public Integer getDeviceAmountByParam() { + return deviceInfoMapper.getDeviceAmountByParam(); + } + + @Override + public int updateDeviceRate(DeviceInfo deviceInfo) { + return deviceInfoMapper.updateDeviceRate(deviceInfo); + } + + @Override + public JSONObject getDeviceStatInfoByParam(DeviceInfo deviceInfo) { + JSONObject result = new JSONObject(); + Map param = new HashMap<>(); + if (deviceInfo.getDeptId() != null) { + List list = sysDeptService.getDeptSubIdsById(deviceInfo.getDeptId()); + param.put("list", list); + } + List list = deviceInfoMapper.getDeviceTypeStatByParam(param); + result.put("data0", list); + param.put("deviceType", 1); + list = deviceInfoMapper.getDeviceStatusStatByParam(param); + result.put("data1", list); + + param.put("deviceType", 2); + list = deviceInfoMapper.getDeviceStatusStatByParam(param); + result.put("data2", list); + return result; + } + + @Override + public List getDeviceIdsInList(List list) { + return deviceInfoMapper.getDeviceIdsInList(list); + } + + @Override + public Long parserJsonObject(JSONObject jsonObject) { + String pid = jsonObject.getString("PID"); + if (pid == null || pid.isEmpty()) { + return null; + } + Long id = deviceInfoMapper.getDeviceIdByPid(pid); + if (id != null) { + return id; + } else { + DeviceInfo data = new DeviceInfo(); + data.setPid(pid); + data.setDeviceName(pid); + data.setDeviceIp(jsonObject.getString("IP")); + data.setDuid(pid); + JSONObject obj = StringUtils.parseWGS84Coordinate(jsonObject.getString("GP")); + if (obj != null) { + data.setLongitude(obj.getDouble("longitude")); + data.setLatitude(obj.getDouble("latitude")); + data.setEvalator(obj.getDouble("altitude")); + } + data.setStatus(1); + if (pid.startsWith("C154E")) { + data.setDeviceType(2); + } else { + data.setDeviceType(1); + } + data.setCreateTime(new Date()); + deviceInfoMapper.insertDeviceInfo(data); + return data.getId(); + } + } + + @Override + public void updateDeviceEvalator() { + List list = deviceInfoMapper.getEmptyEvalatorList(); + if (list != null && !list.isEmpty()) { + for (DeviceInfo item : list) { + double evalator = getEvalatorFromUrl(item); + if (evalator > 0.0) { + item.setEvalator(evalator); + deviceInfoMapper.updateDeviceEvalator(item); + } + } + } + } + + private double getEvalatorFromUrl(DeviceInfo data) { + String url = String.format("https://api.open-elevation.com/api/v1/lookup?locations=%.2f,%.2f", data.getLatitude(), data.getLongitude()); + try { + CloseableHttpClient httpClient = HttpClients.createDefault(); + RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(30000) + .setSocketTimeout(30000).setConnectTimeout(30000).build(); + + HttpGet get = new HttpGet(url); + get.setConfig(requestConfig); + get.addHeader("User-Agent", "Mozilla/5.0"); + get.setHeader("Content-Type", "application/x-www-form-urlencoded"); + CloseableHttpResponse httpResponse = httpClient.execute(get); + int code = httpResponse.getStatusLine().getStatusCode(); + if (code == 200) { + BufferedReader reader = new BufferedReader( + new InputStreamReader(httpResponse.getEntity().getContent(), StandardCharsets.UTF_8)); + String inputLine; + StringBuilder response = new StringBuilder(); + while ((inputLine = reader.readLine()) != null) { + response.append(inputLine); + } + reader.close(); + httpClient.close(); + JSONObject jsonObject = JSONObject.parseObject(response.toString()); + if (jsonObject != null) { + String result = jsonObject.getString("results"); + log.info("result={}", result); + if (result != null && !result.isEmpty()) { + jsonObject = JSONObject.parseObject(result.replaceAll("\\[|\\]", "")); + return jsonObject.getDouble("elevation"); + } + } + } else { + log.error("请求失败 url:" + url + ",错误信息为" + code); + } + } catch (Exception ex) { + log.error("doGet error", ex); + } + return 0.0; + } + + + private boolean isActive(String str) { + if (str == null || str.isEmpty()) { + return false; + } + try { + URL url = new URL(str); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + int code = connection.getResponseCode(); + if (code == 200) { + return true; + } else { + return false; + } + } catch (Exception ex) { +// ex.printStackTrace(); + return false; + } + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceItemServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceItemServiceImpl.java new file mode 100644 index 0000000..a828ee8 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DeviceItemServiceImpl.java @@ -0,0 +1,87 @@ +package net.hzvtc.device.service.impl; + +import java.util.List; +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import net.hzvtc.device.mapper.DeviceItemMapper; +import net.hzvtc.device.domain.DeviceItem; +import net.hzvtc.device.service.DeviceItemService; + +/** + * 相机参数Service业务层处理 + * + * @author admin + * @date 2024-08-14 + */ +@Service +public class DeviceItemServiceImpl implements DeviceItemService { + @Resource + private DeviceItemMapper deviceItemMapper; + + /** + * 查询相机参数 + * + * @param id 相机参数主键 + * @return 相机参数 + */ + @Override + public DeviceItem selectDeviceItemById(Long id) { + return deviceItemMapper.selectDeviceItemById(id); + } + + /** + * 查询相机参数列表 + * + * @param deviceItem 相机参数 + * @return 相机参数 + */ + @Override + public List selectDeviceItemList(DeviceItem deviceItem) { + return deviceItemMapper.selectDeviceItemList(deviceItem); + } + + /** + * 新增相机参数 + * + * @param deviceItem 相机参数 + * @return 结果 + */ + @Override + public int insertDeviceItem(DeviceItem deviceItem) { + return deviceItemMapper.insertDeviceItem(deviceItem); + } + + /** + * 修改相机参数 + * + * @param deviceItem 相机参数 + * @return 结果 + */ + @Override + public int updateDeviceItem(DeviceItem deviceItem) { + return deviceItemMapper.updateDeviceItem(deviceItem); + } + + /** + * 批量删除相机参数 + * + * @param ids 需要删除的相机参数主键 + * @return 结果 + */ + @Override + public int deleteDeviceItemByIds(Long[] ids) { + return deviceItemMapper.deleteDeviceItemByIds(ids); + } + + /** + * 删除相机参数信息 + * + * @param id 相机参数主键 + * @return 结果 + */ + @Override + public int deleteDeviceItemById(Long id) { + return deviceItemMapper.deleteDeviceItemById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DevicePersonServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DevicePersonServiceImpl.java new file mode 100644 index 0000000..99307bb --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/DevicePersonServiceImpl.java @@ -0,0 +1,43 @@ +package net.hzvtc.device.service.impl; + +import lombok.RequiredArgsConstructor; +import net.hzvtc.device.domain.DevicePerson; +import net.hzvtc.device.mapper.DevicePersonMapper; +import net.hzvtc.device.service.DevicePersonService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class DevicePersonServiceImpl implements DevicePersonService { + + @Resource + private DevicePersonMapper devicePersonMapper; + + @Override + public int addDevicePerson(DevicePerson devicePerson) { + return devicePersonMapper.addDevicePersonInfo(devicePerson); + } + + @Override + public int updateDevicePerson(DevicePerson devicePerson) { + return devicePersonMapper.updateDevicePerson(devicePerson); + } + + @Override + public List getDevicePersonByPid(Long pid) { + return devicePersonMapper.getDevicePersonByPid(pid); + } + + @Override + public int deleteDevicePersonById(Long id) { + return devicePersonMapper.deleteDevicePersonById(id); + } + + @Override + public List getPersonInfoListByParam(List list) { + return devicePersonMapper.getPersonInfoListByParam(list); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/HeatmapInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/HeatmapInfoServiceImpl.java new file mode 100644 index 0000000..3c98a42 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/device/service/impl/HeatmapInfoServiceImpl.java @@ -0,0 +1,128 @@ +package net.hzvtc.device.service.impl; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.device.domain.HeatmapInfo; +import net.hzvtc.device.mapper.HeatmapInfoMapper; +import net.hzvtc.device.service.HeatmapInfoService; +import net.hzvtc.echart.service.BirdDataStatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 热力图配置Service业务层处理 + * + * @author admin + * @date 2022-11-29 + */ +@Service +public class HeatmapInfoServiceImpl implements HeatmapInfoService { + @Resource + private HeatmapInfoMapper heatmapInfoMapper; + @Autowired + private BirdDataStatService birdDataStatService; + + /** + * 查询热力图配置 + * + * @param id 热力图配置主键 + * @return 热力图配置 + */ + @Override + public HeatmapInfo selectHeatmapInfoById(Long id) { + return heatmapInfoMapper.selectHeatmapInfoById(id); + } + + /** + * 查询热力图配置列表 + * + * @param heatmapInfo 热力图配置 + * @return 热力图配置 + */ + @Override + public List selectHeatmapInfoList(HeatmapInfo heatmapInfo) { + return heatmapInfoMapper.selectHeatmapInfoList(heatmapInfo); + } + + /** + * 新增热力图配置 + * + * @param heatmapInfo 热力图配置 + * @return 结果 + */ + @Override + public int insertHeatmapInfo(HeatmapInfo heatmapInfo) { + heatmapInfo.setCreateTime(DateUtils.getNowDate()); + return heatmapInfoMapper.insertHeatmapInfo(heatmapInfo); + } + + /** + * 修改热力图配置 + * + * @param heatmapInfo 热力图配置 + * @return 结果 + */ + @Override + public int updateHeatmapInfo(HeatmapInfo heatmapInfo) { + return heatmapInfoMapper.updateHeatmapInfo(heatmapInfo); + } + + /** + * 批量删除热力图配置 + * + * @param ids 需要删除的热力图配置主键 + * @return 结果 + */ + @Override + public int deleteHeatmapInfoByIds(Long[] ids) { + return heatmapInfoMapper.deleteHeatmapInfoByIds(ids); + } + + /** + * 删除热力图配置信息 + * + * @param id 热力图配置主键 + * @return 结果 + */ + @Override + public int deleteHeatmapInfoById(Long id) { + return heatmapInfoMapper.deleteHeatmapInfoById(id); + } + + @Override + public List getBirdHeatmapListByParam(JSONObject obj) { + Map map = new HashMap<>(); + String calcDate = obj.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + + HeatmapInfo param = new HeatmapInfo(); + param.setAreaId(obj.getLong("areaId")); + List list = heatmapInfoMapper.selectHeatmapInfoList(param); + if (list != null) { + list.forEach(item -> { + map.put("deviceId", item.getDeviceId()); + map.put("startX", item.getStartX()); + map.put("endX", item.getEndX()); + map.put("startY", item.getStartY()); + map.put("endY", item.getEndY()); + Integer count = birdDataStatService.getBirdCountForHeatMapByParam(map); + if (count == null) { + count = 0; + } + item.setCount(count); + }); + } + return list; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/echart/controller/BirdRealTimeController.java b/ai-xuebao-system/src/main/java/net/hzvtc/echart/controller/BirdRealTimeController.java new file mode 100644 index 0000000..6ad47b9 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/echart/controller/BirdRealTimeController.java @@ -0,0 +1,104 @@ +package net.hzvtc.echart.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.echart.service.BirdDataStatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/echart/real") +@Slf4j +public class BirdRealTimeController { + @Autowired + private BirdDataStatService birdRealTimeService; + + @PostMapping("/list") + public AjaxResult getBirdRealTimeList(@RequestBody JSONObject param) { + List list = birdRealTimeService.getBirdRealTimeList(param); + return AjaxResult.success(list); + } + + @PostMapping("/monthList") + public AjaxResult getBirdMonthList(@RequestBody JSONObject param) { + List list = birdRealTimeService.getBirdMonthList(param); + return AjaxResult.success(list); + } + + @GetMapping("/count") + public AjaxResult getBirdRealTimeCount(@RequestParam(name = "birdCode", required = true) String birdCode) { + long count = birdRealTimeService.getBirdRealTimeCount(birdCode); + return AjaxResult.success(count); + } + + @PostMapping("/countList") + public AjaxResult getBirdRealTimeCount(@RequestBody JSONArray array) { +// log.info("=========array===={}", array); + return AjaxResult.success(birdRealTimeService.getBirdRealTimeCount(array)); + } + + @PostMapping("/countListByCode") + public AjaxResult getBirdRealTimeAmountByArea(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdRealTimeAmountByCode(obj)); + } + + @PostMapping("/boardListByParam") + public AjaxResult getBirdBoardListByParam(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdSpeciesBoardListByParam(obj)); + } + + @PostMapping("/dailyRealCount") + public AjaxResult getBirdRealTimeDailyAmount(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdRealTimeDailyAmountByParam(obj)); + } + + @PostMapping("/weeklyCount") + public AjaxResult getBirdRealTimeWeeklyAmount(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdRealTimeWeeklyAmountByParam(obj)); + } + + @PostMapping("/yearCount") + public AjaxResult getBirdYearAmount(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdYearStatListByParam(obj)); + } + + @PostMapping("/dayCountByMonth") + public AjaxResult getBirdDailyAmount(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdDailyStatByMonth(obj)); + } + + @PostMapping("/dailyMaxAmount") + public AjaxResult getBirdDailyMaxAmount(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdMaxAmountByParam(obj)); + } + + @PostMapping("/totalBird") + public AjaxResult getBirdTotalAmount(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdTotalAmountByParam(obj)); + } + + @PostMapping("/listByHabit") + public AjaxResult getBirdAmountByHabit(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdCountInfoListByHabit(obj)); + } + + @PostMapping("/birdHabitList") + public AjaxResult getBirdHabitAmountByParam(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdHabitListByParam(obj)); + } + + @PostMapping("/realStatForPage") + public AjaxResult getBirdRealStatByParam(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdRealStatByParam(obj)); + } + + @PostMapping("/dailyBirdMaxAmount") + public AjaxResult getBirdDailyMaxAmountByParam(@RequestBody JSONObject obj) { + return AjaxResult.success(birdRealTimeService.getBirdDailyMaxAmountByParam(obj)); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/BirdStatDataVo.java b/ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/BirdStatDataVo.java new file mode 100644 index 0000000..7fb6aef --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/BirdStatDataVo.java @@ -0,0 +1,56 @@ +package net.hzvtc.echart.domain.vo; + +import lombok.Data; +import org.apache.ibatis.type.Alias; + +import java.util.List; + +@Alias("BirdStatDataVo") +@Data +public class BirdStatDataVo { + private Long id; + private Long speciesId; + private Long familyId; + private Long itemId; + private String familyName; + private String code; + private String codeName; + private String location; + private String mediaType; + private String mediaUrl; + private Long mediaId; + private Long recordId; + private String metaUrl; + private Integer hour; + private Integer count; + private Integer month; + private Integer year; + private Integer today; + private Integer yesterday; + private Integer total; + private String name; + private String ename; + private String deviceName; + private Integer weekDay; + private Integer value; + private Integer avgCount; + private String shortDate; + private String dateTime; + private boolean checked; + private String birdIcon; + private String iucnCode; + private String iucnName; + private String protectedCode; + private String protectedName; + private String residentCode; + private String residentName; + private Long catalogueId; + private String catalogueName; + private Long genusId; + private String genusName; + private String serialNumber; + private Integer videoCount; + private Integer imageCount; + private List deviceIds; + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/DeviceInfoVo.java b/ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/DeviceInfoVo.java new file mode 100644 index 0000000..afafff1 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/echart/domain/vo/DeviceInfoVo.java @@ -0,0 +1,12 @@ +package net.hzvtc.echart.domain.vo; + +import lombok.Data; +import org.apache.ibatis.type.Alias; + +@Data +@Alias("DeviceInfoVo") +public class DeviceInfoVo { + private String name; + private Integer code; + private Integer count; +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/echart/mapper/BirdDataStatMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/echart/mapper/BirdDataStatMapper.java new file mode 100644 index 0000000..1745bfc --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/echart/mapper/BirdDataStatMapper.java @@ -0,0 +1,54 @@ +package net.hzvtc.echart.mapper; + +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; +import java.util.Map; + +public interface BirdDataStatMapper { + Integer getBirdRealTimeCount(String birdCode); + + Integer getBirdRealTimeMaxCount(Map map); + + List getBirdRealTimeList(Map map); + + List getBirdCountInfoListByArea(Map map); + + List getBirdDailyMaxAmountByParam(Map map); + + List getBirdRealStatByParam(Map map); + + List getDeviceListByParam(Map map); + + List getBirdCountInfoListByDevice(Map map); + + List getBirdCountInfoListBySpeciesId(Map map); + + List getAreaBirdSpeciesByParam(Map map); + + Integer getBirdCountForHeatMapByParam(Map map); + + List getBirdCountInfoListByHabit(Map map); + + List getBirdSpeciesBoardListByParam(Map map); + + List getBirdMonthList(Map map); + + List getBirdWeeklyStatByDeviceParam(Map map); + + List getBirdWeeklyStatBySpecies(Map map); + + List getBirdWeeklyStatByHabit(Map map); + + List getBirdRealTimeStatByParam(Map map); + + List getBirdYearStatListByParam(Map map); + + List getBirdDailyStatByMonth(Map map); + + Integer getBirdMaxAmountByParam(Map map); + + Long getBirdTotalAmountByParam(Map map); + + Integer getBirdRealStatAmountByParam(Map map); +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/echart/service/BirdDataStatService.java b/ai-xuebao-system/src/main/java/net/hzvtc/echart/service/BirdDataStatService.java new file mode 100644 index 0000000..d34022a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/echart/service/BirdDataStatService.java @@ -0,0 +1,62 @@ +package net.hzvtc.echart.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; +import java.util.Map; + +public interface BirdDataStatService { + List getBirdRealTimeList(JSONObject param); + + List getBirdMonthList(JSONObject param); + + List getBirdCountInfoListByArea(Map map); + + JSONArray getBirdCountInfoListByDevice(Map map); + + JSONArray getBirdCountInfoListBySpeciesId(Map map); + + //List getBirdCountInfoListByHabit(Map map); + + JSONArray getBirdCountInfoListByHabit(Map map); + + JSONArray getBirdCountInfoListByHabit(JSONObject param); + + List getBirdHabitListByParam(JSONObject param); + + int getBirdRealTimeCount(String birdCode); + + JSONArray getBirdRealTimeCount(JSONArray array); + + JSONArray getBirdWeeklyStatByDeviceParam(Map map); + + JSONArray getBirdWeeklyStatBySpecies(Map map); + + JSONArray getBirdWeeklyStatByHabit(Map map); + + List getBirdRealTimeAmountByCode(JSONObject obj); + + JSONObject getBirdRealTimeDailyAmountByParam(JSONObject param); + + JSONObject getBirdRealTimeWeeklyAmountByParam(JSONObject param); + + JSONObject getBirdYearStatListByParam(JSONObject param); + + JSONObject getBirdDailyStatByMonth(JSONObject param); + + JSONObject getBirdMaxAmountByParam(JSONObject param); + + JSONObject getBirdTotalAmountByParam(JSONObject param); + + List getBirdRealStatByParam(JSONObject obj); + + List getBirdSpeciesBoardListByParam(JSONObject obj); + + List getBirdDailyMaxAmountByParam(JSONObject obj); + + Integer getBirdCountForHeatMapByParam(Map map); + + List getAreaBirdSpeciesByParam(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/echart/service/impl/BirdDataStatServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/echart/service/impl/BirdDataStatServiceImpl.java new file mode 100644 index 0000000..f136dac --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/echart/service/impl/BirdDataStatServiceImpl.java @@ -0,0 +1,592 @@ +package net.hzvtc.echart.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.area.domain.ProtectedArea; +import net.hzvtc.area.service.ProtectedAreaService; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.echart.mapper.BirdDataStatMapper; +import net.hzvtc.echart.service.BirdDataStatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class BirdDataStatServiceImpl implements BirdDataStatService { + @Resource + private BirdDataStatMapper birdRealTimeMapper; + @Autowired + private ProtectedAreaService protectedAreaService; + + + @Override + public List getBirdRealTimeList(JSONObject param) { + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + if (calcDate == null) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + String birdCode = param.getString("birdCode"); + map.put("birdCode", birdCode); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + return birdRealTimeMapper.getBirdRealTimeList(map); + } + + @Override + public List getBirdMonthList(JSONObject param) { + Map map = new HashMap<>(); + String year = param.getString("year"); + if (year == null || year.isEmpty()) { + year = Integer.toString(Calendar.getInstance().get(Calendar.YEAR)); + } + map.put("year", year); + String birdCode = param.getString("birdCode"); + map.put("birdCode", birdCode); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + return birdRealTimeMapper.getBirdMonthList(map); + } + + @Override + public List getBirdCountInfoListByArea(Map map) { + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + List sublist = birdRealTimeMapper.getBirdCountInfoListBySpeciesId(map); + obj.put("list", sublist); + jsonArray.add(obj); + }); + return birdRealTimeMapper.getBirdCountInfoListByArea(map); + } + + @Override + public JSONArray getBirdCountInfoListByDevice(Map map) { + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getDeviceListByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("deviceId", item.getId()); + map.put("recordType", 1); + List sublist = birdRealTimeMapper.getBirdCountInfoListByDevice(map); + if (sublist != null && !sublist.isEmpty()) { + List ids = sublist.stream().map(subItem -> subItem.getSpeciesId()).collect(Collectors.toList()); + map.put("list", ids); + map.put("recordType", 2); + List otherList = birdRealTimeMapper.getBirdCountInfoListByDevice(map); + sublist.addAll(otherList); + obj.put("list", sublist); + } else { + map.put("recordType", 2); + List otherList = birdRealTimeMapper.getBirdCountInfoListByDevice(map); + obj.put("list", otherList); + } + jsonArray.add(obj); + }); + return jsonArray; + } + + @Override + public JSONArray getBirdCountInfoListBySpeciesId(Map map) { + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + map.put("recordType", 1); + List sublist = birdRealTimeMapper.getBirdCountInfoListBySpeciesId(map); + if (sublist == null || sublist.isEmpty()) { + map.put("recordType", 2); + sublist = birdRealTimeMapper.getBirdCountInfoListBySpeciesId(map); + } + obj.put("list", sublist); + jsonArray.add(obj); + }); + return jsonArray; + } + + @Override + public JSONArray getBirdCountInfoListByHabit(Map map) { + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + map.put("recordType", 1); + List sublist = birdRealTimeMapper.getBirdCountInfoListByHabit(map); + if (sublist == null || sublist.isEmpty()) { + map.put("recordType", 2); + sublist = birdRealTimeMapper.getBirdCountInfoListByHabit(map); + } + obj.put("list", sublist); + jsonArray.add(obj); + }); + return jsonArray; + } + + @Override + public JSONArray getBirdCountInfoListByHabit(JSONObject param) { + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Integer isCommon = param.getInteger("isCommon"); + map.put("isCommon", isCommon); + Integer limit = param.getInteger("limit"); + map.put("limit", limit); + return getBirdCountInfoListByHabit(map); + } + + @Override + public List getBirdHabitListByParam(JSONObject param) { + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + return birdRealTimeMapper.getBirdCountInfoListByHabit(map); + } + + @Override + public int getBirdRealTimeCount(String birdCode) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + Map map = new HashMap<>(); + map.put("calcDate", df.format(new Date())); + map.put("birdCode", birdCode); + Integer count = birdRealTimeMapper.getBirdRealTimeMaxCount(map); + return count == null ? 0 : count; + //return birdRealTimeMapper.getBirdRealTimeCount(birdCode); + } + + @Override + public JSONArray getBirdRealTimeCount(JSONArray array) { + JSONArray arr = new JSONArray(); + array.stream().forEach(obj -> { + JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(obj));// (JSONObject) obj; + String id = jsonObject.getString("id"); + JSONObject object = new JSONObject(); + object.put("value", getBirdRealTimeCount(id)); + object.put("name", jsonObject.get("name")); + arr.add(object); + }); + return arr; + } + + @Override + public JSONArray getBirdWeeklyStatByDeviceParam(Map map) { + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getDeviceListByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("deviceId", item.getId()); + List sublist = birdRealTimeMapper.getBirdWeeklyStatByDeviceParam(map); + obj.put("list", sublist); + jsonArray.add(obj); + }); + return jsonArray; + } + + @Override + public JSONArray getBirdWeeklyStatBySpecies(Map map) { + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + List sublist = birdRealTimeMapper.getBirdWeeklyStatBySpecies(map); + obj.put("list", sublist); + jsonArray.add(obj); + }); + return jsonArray; + } + + @Override + public JSONArray getBirdWeeklyStatByHabit(Map map) { + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + List sublist = birdRealTimeMapper.getBirdWeeklyStatByHabit(map); + obj.put("list", sublist); + jsonArray.add(obj); + }); + return jsonArray; + } + + @Override + public List getBirdRealTimeAmountByCode(JSONObject obj) { + Map map = new HashMap<>(); + +// String code = obj.getString("code"); +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(code); +// if (protectedArea != null) { +// +// } + + Long areaId = obj.getLong("areaId"); + map.put("areaId", areaId); + + String calcDate = obj.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + map.put("calcDate", df.format(new Date())); + } + + Integer isCommon = obj.getInteger("isCommon"); + map.put("isCommon", isCommon); + + return birdRealTimeMapper.getBirdRealTimeStatByParam(map); + } + + @Override + public JSONObject getBirdRealTimeDailyAmountByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); +// String areaCode = param.getString("areaCode"); +// if (areaCode != null && !areaCode.isEmpty()) { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); +// map.put("areaId", protectedArea.getId()); +// } + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long birdCode = param.getLong("birdCode"); + if (birdCode != null) { + map.put("birdCode", birdCode); + } + + Integer isCommon = param.getInteger("isCommon"); + map.put("isCommon", isCommon); + + List list = birdRealTimeMapper.getBirdCountInfoListByArea(map); + if (list != null && list.size() > 0) { + JSONArray array = new JSONArray(); + Map> arealist = list.stream().collect(Collectors.groupingBy(BirdStatDataVo::getCodeName, LinkedHashMap::new, Collectors.toList())); + arealist.forEach((key, data) -> { + JSONObject obj = new JSONObject(); + obj.put("name", key); + int[] data1 = {0}; + int[] data2 = {0}; + data.stream().forEach(item -> { + if (item.getHour() <= 12) { + if (item.getCount() > data1[0]) { + data1[0] = item.getCount(); + } + } else { + if (item.getCount() > data2[0]) { + data2[0] = item.getCount(); + } + } + }); + obj.put("data1", data1[0]); + obj.put("data2", data2[0]); +// obj.put("data3", data1[0] > data2[0] ? data1[0] : data2[0]); + array.add(obj); + }); + result.put("areaData", array); + } + return result; + } + + @Override + public JSONObject getBirdRealTimeWeeklyAmountByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("dateBegin", DateUtils.getFirstDayOfWeek(calcDate)); + map.put("dateEnd", DateUtils.getLastDayOfWeek(calcDate)); +// String areaCode = param.getString("areaCode"); +// if (areaCode != null && !areaCode.isEmpty()) { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); +// if (protectedArea != null) { +// map.put("areaId", protectedArea.getId()); +// } +// } + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + + JSONArray jsonArray = new JSONArray(); + List list = birdRealTimeMapper.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + List sublist = birdRealTimeMapper.getBirdWeeklyStatBySpecies(map); + obj.put("list", sublist); + jsonArray.add(obj); + }); + + result.put("speciesData", jsonArray); + + +// List list = birdRealTimeMapper.getBirdWeeklyStatBySpecies(map); +// +// log.info("=========list================{}", list); +// if (list != null && list.size() > 0) { +// JSONArray array = new JSONArray(); +// Map> arealist = list.stream().collect(Collectors.groupingBy(BirdStatDataVo::getCodeName, LinkedHashMap::new, Collectors.toList())); +// arealist.forEach((key, data) -> { +// JSONObject obj = new JSONObject(); +// obj.put("name", key); +// data.stream().forEach(item -> { +// if (item.getWeekDay() != null) { +// String name = "data" + (item.getWeekDay() + 1); +// obj.put(name, item.getCount()); +// } +// }); +// array.add(obj); +// }); +// +// } + return result; + } + + @Override + public JSONObject getBirdYearStatListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap(); + String calcYear = param.getString("calcYear"); + if (calcYear == null || calcYear.isEmpty()) { + LocalDate currentDate = LocalDate.now(); + map.put("year", currentDate.getYear()); + } else { + map.put("year", Integer.parseInt(calcYear)); + } +// String areaCode = param.getString("areaCode"); +// if (areaCode != null && !areaCode.isEmpty()) { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); +// map.put("areaId", protectedArea.getId()); +// } + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + List list = birdRealTimeMapper.getBirdYearStatListByParam(map); + int month[] = new int[12]; + if (list != null && list.size() > 0) { + JSONArray array = new JSONArray(); + list.forEach(item -> { + if (item.getCode() != null) { + JSONObject obj = new JSONObject(); + String name = "data" + item.getCode(); + obj.put(name, item.getCount()); + array.add(obj); + month[Integer.parseInt(item.getCode())] = item.getCount(); + } + }); + result.put("yearData", array); + } + result.put("monthData", month); + return result; + } + + @Override + public JSONObject getBirdDailyStatByMonth(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap(); + int daysOfMonth = 30; + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + daysOfMonth = getDaysOfMonth(new Date()); + } else { + try { + daysOfMonth = getDaysOfMonth(df.parse(calcDate)); + } catch (Exception ex) { + daysOfMonth = 1; + } + } + map.put("calcDate", calcDate); +// String areaCode = param.getString("areaCode"); +// if (areaCode != null && !areaCode.isEmpty()) { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); +// map.put("areaId", protectedArea.getId()); +// } + + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + + result.put("daysOfMonth", daysOfMonth); + result.put("calcDate", calcDate); + int arr[] = new int[daysOfMonth]; + List list = birdRealTimeMapper.getBirdDailyStatByMonth(map); + if (list != null && list.size() > 0) { + list.forEach(item -> { + arr[Integer.parseInt(item.getCode()) - 1] = item.getCount(); + }); + } + result.put("list", arr); + return result; + } + + @Override + public JSONObject getBirdMaxAmountByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); +// String areaCode = param.getString("areaCode"); +// if (areaCode != null && !areaCode.isEmpty()) { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); +// map.put("areaId", protectedArea.getId()); +// } + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Integer amount = birdRealTimeMapper.getBirdMaxAmountByParam(map); + result.put("amount", amount == null ? 0 : amount); + return result; + } + + @Override + public JSONObject getBirdTotalAmountByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + if (areaId == null) { + String areaCode = param.getString("areaCode"); + if (areaCode != null && !areaCode.isEmpty()) { + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); + areaId = protectedArea.getId(); + } + } + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Long total = birdRealTimeMapper.getBirdTotalAmountByParam(map); + result.put("total", total == null ? 0 : total); + return result; + } + + @Override + public List getBirdRealStatByParam(JSONObject param) { + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + Long areaId = param.getLong("areaId"); + if (areaId == null) { + return null; + } + map.put("areaId", areaId); + map.put("isCommon", 1); + map.put("recordType", 1); + List list = birdRealTimeMapper.getBirdRealStatByParam(map); + list.forEach(item -> { + if (item.getCount() == 0) { + map.put("speciesId", item.getId()); + Integer count = birdRealTimeMapper.getBirdRealStatAmountByParam(map); + item.setCount(count == null ? 0 : count.intValue()); + } + }); + return list; + } + + @Override + public List getBirdSpeciesBoardListByParam(JSONObject obj) { + Map map = new HashMap<>(); + String calcDate = obj.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); +// String areaCode = obj.getString("areaCode"); +// if (areaCode != null && !areaCode.isEmpty()) { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); +// map.put("areaId", protectedArea.getId()); +// } + Long areaId = obj.getLong("areaId"); + map.put("areaId", areaId); + return birdRealTimeMapper.getBirdSpeciesBoardListByParam(map); + } + + @Override + public List getBirdDailyMaxAmountByParam(JSONObject param) { + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); +// String areaCode = param.getString("areaCode"); +// if (areaCode != null && !areaCode.isEmpty()) { +// ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaByCode(areaCode); +// map.put("areaId", protectedArea.getId()); +// } + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + return birdRealTimeMapper.getBirdDailyMaxAmountByParam(map); + } + + @Override + public Integer getBirdCountForHeatMapByParam(Map map) { + return birdRealTimeMapper.getBirdCountForHeatMapByParam(map); + } + + @Override + public List getAreaBirdSpeciesByParam(Map map) { + return birdRealTimeMapper.getAreaBirdSpeciesByParam(map); + } + + private int getDaysOfMonth(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/email/service/EmailService.java b/ai-xuebao-system/src/main/java/net/hzvtc/email/service/EmailService.java new file mode 100644 index 0000000..57d7b9d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/email/service/EmailService.java @@ -0,0 +1,7 @@ +package net.hzvtc.email.service; + +public interface EmailService { + void sendSimpleEmail(String topic, String content, String email); + + void sendEmailWithAttachment(String topic, String content, String filePath, String email); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/email/service/impl/EmailServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/email/service/impl/EmailServiceImpl.java new file mode 100644 index 0000000..cde6f84 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/email/service/impl/EmailServiceImpl.java @@ -0,0 +1,59 @@ +package net.hzvtc.email.service.impl; + +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.email.service.EmailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import javax.mail.internet.MimeMessage; +import java.io.File; + +@Slf4j +@Service +public class EmailServiceImpl implements EmailService { + @Value("${spring.mail.username}") + private String sendName; + + @Autowired + private JavaMailSender mailSender; + + @Override + public void sendSimpleEmail(String topic, String content, String email) { + try { + SimpleMailMessage mail = new SimpleMailMessage(); + mail.setFrom(sendName); + String[] receives = email.split(";"); + mail.setTo(receives); + mail.setSubject(topic); + mail.setText(content); + mailSender.send(mail); + log.info("邮件已成功发送至:" + email); + } catch (Exception ex) { + ex.printStackTrace(); + log.error("邮件发送至:" + email + "失败"); + } + } + + @Override + public void sendEmailWithAttachment(String topic, String content, String filePath, String email) { + try { + MimeMessage message = mailSender.createMimeMessage(); + MimeMessageHelper messageHelper = new MimeMessageHelper(message, true); + messageHelper.setFrom(sendName); + String[] receives = email.split(";"); + messageHelper.setTo(receives); + messageHelper.setSubject(topic); + messageHelper.setText(content); + File file = new File(filePath); + messageHelper.addAttachment(file.getName(), file); + mailSender.send(message); + log.info("带附件邮件已成功发送至:" + email); + } catch (Exception ex) { + log.error("带附件邮件发送至:" + email + "失败"); + } + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileInfoController.java new file mode 100644 index 0000000..691ff40 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileInfoController.java @@ -0,0 +1,149 @@ +package net.hzvtc.file.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.file.domain.MediaFileInfo; +import net.hzvtc.file.service.MediaFileInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 多源数据文件Controller + * + * @author admin + * @date 2024-06-04 + */ +@Slf4j +@RestController +@RequestMapping("/media/file") +public class MediaFileInfoController extends BaseController { + @Autowired + private MediaFileInfoService mediaFileInfoService; + + /** + * 查询多源数据文件列表 + */ + @PreAuthorize("@ss.hasPermi('media:file:list')") + @GetMapping("/list") + public TableDataInfo list(MediaFileInfo mediaFileInfo) { + startPage(); + List list = mediaFileInfoService.selectMediaFileInfoList(mediaFileInfo); + return getDataTable(list); + } + + /** + * 导出多源数据文件列表 + */ + @PreAuthorize("@ss.hasPermi('media:file:export')") + @Log(title = "多源数据文件", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, MediaFileInfo mediaFileInfo) { + List list = mediaFileInfoService.selectMediaFileInfoList(mediaFileInfo); + ExcelUtil util = new ExcelUtil<>(MediaFileInfo.class); + util.exportExcel(response, list, "多源数据文件数据"); + } + + /** + * 获取多源数据文件详细信息 + */ + @PreAuthorize("@ss.hasPermi('media:file:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(mediaFileInfoService.selectMediaFileInfoById(id)); + } + + /** + * 新增多源数据文件 + */ + @PreAuthorize("@ss.hasPermi('media:file:add')") + @Log(title = "多源数据文件", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody MediaFileInfo mediaFileInfo) { + return toAjax(mediaFileInfoService.insertMediaFileInfo(mediaFileInfo)); + } + + @PostMapping("/save") + public AjaxResult save(@RequestBody MediaFileInfo mediaFileInfo) { +// logger.info("==============={}", mediaFileInfo.getVersionId()); + return AjaxResult.success(mediaFileInfoService.saveMediaFileInfo(mediaFileInfo)); + } + + /** + * 修改多源数据文件 + */ + @PreAuthorize("@ss.hasPermi('media:file:edit')") + @Log(title = "多源数据文件", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody MediaFileInfo mediaFileInfo) { + return toAjax(mediaFileInfoService.updateMediaFileInfo(mediaFileInfo)); + } + + /** + * 删除多源数据文件 + */ + @PreAuthorize("@ss.hasPermi('media:file:remove')") + @Log(title = "多源数据文件", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(mediaFileInfoService.deleteMediaFileInfoByIds(ids)); + } + + @PostMapping({"/fileToDb"}) + public AjaxResult saveFileToDb(@RequestBody JSONObject object) { + try { + mediaFileInfoService.saveMediaFilesToDb(object); + } catch (Exception ex) { +// ex.printStackTrace(); + log.error("error", ex); + } + return AjaxResult.success(); + } + + @PostMapping({"/netFileToDb"}) + public AjaxResult saveNetFileToDb(@RequestBody JSONObject object) { + try { + mediaFileInfoService.saveNetFilesToDb(object); + } catch (Exception ex) { +// ex.printStackTrace(); + log.error("error", ex); + } + return AjaxResult.success(); + } + + @PostMapping({"/movFileToDb"}) + public AjaxResult saveMovFileToDb(@RequestBody JSONObject object) { + mediaFileInfoService.importMovFileToDb(object); + return AjaxResult.success(); + } + + @PostMapping({"/updateFileState"}) + public AjaxResult updateFileState(@RequestBody MediaFileInfo data) { + return AjaxResult.success(mediaFileInfoService.updateMediaFileInfoState(data)); + } + + @GetMapping("/testMessage") + public AjaxResult testMessage() { + return AjaxResult.success(mediaFileInfoService.testMessage()); + } + + @GetMapping("/testProcess") + public AjaxResult testProcess() { +// JSONObject obj = new JSONObject(); +// obj.put("filePath", "/file01"); + mediaFileInfoService.testCameraFileProcess(); + return AjaxResult.success(true); +// return AjaxResult.success(mediaFileInfoService.processInferVideoFiles(obj)); + } + + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileItemController.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileItemController.java new file mode 100644 index 0000000..55b324b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/controller/MediaFileItemController.java @@ -0,0 +1,98 @@ +package net.hzvtc.file.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.file.domain.MediaFileItem; +import net.hzvtc.file.service.MediaFileItemService; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.common.core.page.TableDataInfo; + +/** + * 多源数据文件列Controller + * + * @author admin + * @date 2024-06-04 + */ +@RestController +@RequestMapping("/media/item") +public class MediaFileItemController extends BaseController { + @Autowired + private MediaFileItemService mediaFileItemService; + +/** + * 查询多源数据文件列列表 + */ +@PreAuthorize("@ss.hasPermi('media:item:list')") +@GetMapping("/list") + public TableDataInfo list(MediaFileItem mediaFileItem) { + startPage(); + List list = mediaFileItemService.selectMediaFileItemList(mediaFileItem); + return getDataTable(list); + } + + /** + * 导出多源数据文件列列表 + */ + @PreAuthorize("@ss.hasPermi('media:item:export')") + @Log(title = "多源数据文件列", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, MediaFileItem mediaFileItem) { + List list = mediaFileItemService.selectMediaFileItemList(mediaFileItem); + ExcelUtil util = new ExcelUtil(MediaFileItem. class); + util.exportExcel(response, list, "多源数据文件列数据"); + } + + /** + * 获取多源数据文件列详细信息 + */ + @PreAuthorize("@ss.hasPermi('media:item:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(mediaFileItemService.selectMediaFileItemById(id)); + } + + /** + * 新增多源数据文件列 + */ + @PreAuthorize("@ss.hasPermi('media:item:add')") + @Log(title = "多源数据文件列", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody MediaFileItem mediaFileItem) { + return toAjax(mediaFileItemService.insertMediaFileItem(mediaFileItem)); + } + + /** + * 修改多源数据文件列 + */ + @PreAuthorize("@ss.hasPermi('media:item:edit')") + @Log(title = "多源数据文件列", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody MediaFileItem mediaFileItem) { + return toAjax(mediaFileItemService.updateMediaFileItem(mediaFileItem)); + } + + /** + * 删除多源数据文件列 + */ + @PreAuthorize("@ss.hasPermi('media:item:remove')") + @Log(title = "多源数据文件列", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(mediaFileItemService.deleteMediaFileItemByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileInfo.java new file mode 100644 index 0000000..c3436f0 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileInfo.java @@ -0,0 +1,94 @@ +package net.hzvtc.file.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; +import java.util.List; + +/** + * 多源数据文件对象 media_file_info + * + * @author admin + * @date 2024-06-04 + */ +@Data +@Alias("MediaFileInfo") +public class MediaFileInfo extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 资料类型 + */ + @Excel(name = "资料类型") + private int uploadType; + + /** + * 相机 + */ + @Excel(name = "相机") + private Long deviceId; + + private String deviceName; + + /** + * 上传用户 + */ + @Excel(name = "上传用户") + private Long userId; + + private String userName; + + //转换状态(0:初始,1:队列,2:成功,3:失败) + private int state = 0; + + /** + * 版本号 + */ + @Excel(name = "版本号") + private String version; + + private Long versionId; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date createDate; + + /** + * 是否删除 + */ + private int isDeleted; + + private List fileItems; + + private int fileAmount; + + private String remotePath; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("uploadType", getUploadType()) + .append("deviceId", getDeviceId()) + .append("userId", getUserId()) + .append("version", getVersion()) + .append("createDate", getCreateDate()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileItem.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileItem.java new file mode 100644 index 0000000..c07d142 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/domain/MediaFileItem.java @@ -0,0 +1,79 @@ +package net.hzvtc.file.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 多源数据文件列对象 media_file_item + * + * @author admin + * @date 2024-06-04 + */ +@Data +@Alias("MediaFileItem") +public class MediaFileItem extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 文件名 + */ + @Excel(name = "文件名") + private String fileName; + + /** + * 文件类型 + */ + @Excel(name = "文件类型") + private String fileType; + + /** + * 存放路径 + */ + @Excel(name = "存放路径") + private String urlPath; + + /** + * 视频首帧数据 + */ + @Excel(name = "视频首帧数据") + private String metaPath; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date time; + + /** + * 外键 + */ + @Excel(name = "外键") + private Long parentId; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("fileName", getFileName()) + .append("fileType", getFileType()) + .append("urlPath", getUrlPath()) + .append("metaPath", getMetaPath()) + .append("time", getTime()) + .append("parentId", getParentId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileInfoMapper.java new file mode 100644 index 0000000..337a06f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileInfoMapper.java @@ -0,0 +1,63 @@ +package net.hzvtc.file.mapper; + +import net.hzvtc.file.domain.MediaFileInfo; + +import java.util.List; + +/** + * 多源数据文件Mapper接口 + * + * @author admin + * @date 2024-06-04 + */ +public interface MediaFileInfoMapper { + /** + * 查询多源数据文件 + * + * @param id 多源数据文件主键 + * @return 多源数据文件 + */ + MediaFileInfo selectMediaFileInfoById(Long id); + + /** + * 查询多源数据文件列表 + * + * @param mediaFileInfo 多源数据文件 + * @return 多源数据文件集合 + */ + public List selectMediaFileInfoList(MediaFileInfo mediaFileInfo); + + /** + * 新增多源数据文件 + * + * @param mediaFileInfo 多源数据文件 + * @return 结果 + */ + public int insertMediaFileInfo(MediaFileInfo mediaFileInfo); + + /** + * 修改多源数据文件 + * + * @param mediaFileInfo 多源数据文件 + * @return 结果 + */ + public int updateMediaFileInfo(MediaFileInfo mediaFileInfo); + + int updateMediaFileInfoState(MediaFileInfo mediaFileInfo); + + /** + * 删除多源数据文件 + * + * @param id 多源数据文件主键 + * @return 结果 + */ + public int deleteMediaFileInfoById(Long id); + + /** + * 批量删除多源数据文件 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMediaFileInfoByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileItemMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileItemMapper.java new file mode 100644 index 0000000..5c16411 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/mapper/MediaFileItemMapper.java @@ -0,0 +1,65 @@ +package net.hzvtc.file.mapper; + +import net.hzvtc.file.domain.MediaFileItem; + +import java.util.List; + +/** + * 多源数据文件列Mapper接口 + * + * @author admin + * @date 2024-06-04 + */ +public interface MediaFileItemMapper { + /** + * 查询多源数据文件列 + * + * @param id 多源数据文件列主键 + * @return 多源数据文件列 + */ + MediaFileItem selectMediaFileItemById(Long id); + + /** + * 查询多源数据文件列列表 + * + * @param mediaFileItem 多源数据文件列 + * @return 多源数据文件列集合 + */ + List selectMediaFileItemList(MediaFileItem mediaFileItem); + + /** + * 新增多源数据文件列 + * + * @param mediaFileItem 多源数据文件列 + * @return 结果 + */ + int insertMediaFileItem(MediaFileItem mediaFileItem); + + /** + * 修改多源数据文件列 + * + * @param mediaFileItem 多源数据文件列 + * @return 结果 + */ + int updateMediaFileItem(MediaFileItem mediaFileItem); + + int batchInsertMediaFileItem(List list); + + /** + * 删除多源数据文件列 + * + * @param id 多源数据文件列主键 + * @return 结果 + */ + int deleteMediaFileItemById(Long id); + + /** + * 批量删除多源数据文件列 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteMediaFileItemByIds(Long[] ids); + + int getMediaFileItemAmountByPid(Long pid); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileInfoService.java new file mode 100644 index 0000000..c19e310 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileInfoService.java @@ -0,0 +1,94 @@ +package net.hzvtc.file.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.file.domain.MediaFileInfo; + +import java.util.List; + +/** + * 多源数据文件Service接口 + * + * @author admin + * @date 2024-06-04 + */ +public interface MediaFileInfoService { + /** + * 查询多源数据文件 + * + * @param id 多源数据文件主键 + * @return 多源数据文件 + */ + public MediaFileInfo selectMediaFileInfoById(Long id); + + /** + * 查询多源数据文件列表 + * + * @param mediaFileInfo 多源数据文件 + * @return 多源数据文件集合 + */ + public List selectMediaFileInfoList(MediaFileInfo mediaFileInfo); + + /** + * 新增多源数据文件 + * + * @param mediaFileInfo 多源数据文件 + * @return 结果 + */ + public int insertMediaFileInfo(MediaFileInfo mediaFileInfo); + + /** + * 修改多源数据文件 + * + * @param mediaFileInfo 多源数据文件 + * @return 结果 + */ + public int updateMediaFileInfo(MediaFileInfo mediaFileInfo); + + /** + * 批量删除多源数据文件 + * + * @param ids 需要删除的多源数据文件主键集合 + * @return 结果 + */ + public int deleteMediaFileInfoByIds(Long[] ids); + + /** + * 删除多源数据文件信息 + * + * @param id 多源数据文件主键 + * @return 结果 + */ + public int deleteMediaFileInfoById(Long id); + + int saveMediaFileInfo(MediaFileInfo mediaFileInfo); + + void saveMovFilesToDb(JSONObject jsonObject) throws Exception; + + void saveMediaFilesToDb(JSONObject jsonObject) throws Exception; + + void saveNetFilesToDb(JSONObject jsonObject) throws Exception; + + void importMovFileToDb(JSONObject jsonObject); + + boolean testMessage(); + + void processTest(); + + void testCameraFileProcess(); + + void processInferVideoFiles(JSONObject object); + + void processInferImageFiles(JSONObject object); + + void processInferJsonFiles(MediaFileInfo data); + + void cameraFileUploadProcess(JSONObject object); + + void cameraFileProcessFinished(String message); + + int updateMediaFileInfoState(MediaFileInfo mediaFileInfo); + + boolean processInferMediaFileWin(JSONObject object); + + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileItemService.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileItemService.java new file mode 100644 index 0000000..3a13ee0 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/MediaFileItemService.java @@ -0,0 +1,63 @@ +package net.hzvtc.file.service; + +import net.hzvtc.file.domain.MediaFileItem; + +import java.util.List; + +/** + * 多源数据文件列Service接口 + * + * @author admin + * @date 2024-06-04 + */ +public interface MediaFileItemService { + /** + * 查询多源数据文件列 + * + * @param id 多源数据文件列主键 + * @return 多源数据文件列 + */ + public MediaFileItem selectMediaFileItemById(Long id); + + /** + * 查询多源数据文件列列表 + * + * @param mediaFileItem 多源数据文件列 + * @return 多源数据文件列集合 + */ + public List selectMediaFileItemList(MediaFileItem mediaFileItem); + + /** + * 新增多源数据文件列 + * + * @param mediaFileItem 多源数据文件列 + * @return 结果 + */ + public int insertMediaFileItem(MediaFileItem mediaFileItem); + + /** + * 修改多源数据文件列 + * + * @param mediaFileItem 多源数据文件列 + * @return 结果 + */ + public int updateMediaFileItem(MediaFileItem mediaFileItem); + + /** + * 批量删除多源数据文件列 + * + * @param ids 需要删除的多源数据文件列主键集合 + * @return 结果 + */ + public int deleteMediaFileItemByIds(Long[] ids); + + /** + * 删除多源数据文件列信息 + * + * @param id 多源数据文件列主键 + * @return 结果 + */ + public int deleteMediaFileItemById(Long id); + + int batchInsertMediaFileItem(List list); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileInfoServiceImpl.java new file mode 100644 index 0000000..19d55ed --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileInfoServiceImpl.java @@ -0,0 +1,1907 @@ +package net.hzvtc.file.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.bird.service.BirdSpeciesService; +import net.hzvtc.common.core.domain.entity.SysDictData; +import net.hzvtc.common.core.redis.RedisCache; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.data.check.domain.MediaItem; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.domain.ResultRecord; +import net.hzvtc.data.check.domain.ResultRecordDetails; +import net.hzvtc.data.check.service.MediaItemService; +import net.hzvtc.data.check.service.ResultMediaService; +import net.hzvtc.data.check.service.ResultRecordDetailsService; +import net.hzvtc.data.check.service.ResultRecordService; +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.device.service.DeviceInfoService; +import net.hzvtc.file.domain.MediaFileInfo; +import net.hzvtc.file.domain.MediaFileItem; +import net.hzvtc.file.mapper.MediaFileInfoMapper; +import net.hzvtc.file.service.MediaFileInfoService; +import net.hzvtc.file.service.MediaFileItemService; +import net.hzvtc.msg.kafka.producer.VideoFileMessageProducer; +import net.hzvtc.system.service.SysDictDataService; +import org.apache.commons.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.annotation.Resource; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 多源数据文件Service业务层处理 + * + * @author admin + * @date 2024-06-04 + */ +@Service +@RequiredArgsConstructor +public class MediaFileInfoServiceImpl implements MediaFileInfoService { + private static final Logger log = LoggerFactory.getLogger(MediaFileInfoServiceImpl.class); + @Resource + private MediaFileInfoMapper mediaFileInfoMapper; + private final MediaFileItemService mediaFileItemService; + private final ResultMediaService resultMediaService; + private final ResultRecordService resultRecordService; + private final ResultRecordDetailsService resultRecordDetailsService; + private final BirdSpeciesService birdSpeciesService; + private final MediaItemService mediaItemService; + private final SysDictDataService sysDictDataService; + private final VideoFileMessageProducer videoFileMessageProducer; + private final RedisCache redisCache; + private final DeviceInfoService deviceInfoService; + + @Value("${hzvtc.videoBasePath}") + private String videoBasePath; + + @Value("${hzvtc.videoInferBasePath}") + private String videoInferBasePath; + + private String version; + + private String prefixPath; + + /** + * 查询多源数据文件 + * + * @param id 多源数据文件主键 + * @return 多源数据文件 + */ + @Override + public MediaFileInfo selectMediaFileInfoById(Long id) { + return mediaFileInfoMapper.selectMediaFileInfoById(id); + } + + /** + * 查询多源数据文件列表 + * + * @param mediaFileInfo 多源数据文件 + * @return 多源数据文件 + */ + @Override + public List selectMediaFileInfoList(MediaFileInfo mediaFileInfo) { + return mediaFileInfoMapper.selectMediaFileInfoList(mediaFileInfo); + } + + /** + * 新增多源数据文件 + * + * @param mediaFileInfo 多源数据文件 + * @return 结果 + */ + @Override + public int insertMediaFileInfo(MediaFileInfo mediaFileInfo) { + return mediaFileInfoMapper.insertMediaFileInfo(mediaFileInfo); + } + + /** + * 修改多源数据文件 + * + * @param mediaFileInfo 多源数据文件 + * @return 结果 + */ + @Override + public int updateMediaFileInfo(MediaFileInfo mediaFileInfo) { + return mediaFileInfoMapper.updateMediaFileInfo(mediaFileInfo); + } + + /** + * 批量删除多源数据文件 + * + * @param ids 需要删除的多源数据文件主键 + * @return 结果 + */ + @Override + public int deleteMediaFileInfoByIds(Long[] ids) { + return mediaFileInfoMapper.deleteMediaFileInfoByIds(ids); + } + + /** + * 删除多源数据文件信息 + * + * @param id 多源数据文件主键 + * @return 结果 + */ + @Override + public int deleteMediaFileInfoById(Long id) { + return mediaFileInfoMapper.deleteMediaFileInfoById(id); + } + + @Override + @Transactional + public int saveMediaFileInfo(MediaFileInfo mediaFileInfo) { + mediaFileInfo.setIsDeleted(0); + mediaFileInfo.setCreateDate(new Date()); + mediaFileInfo.setUserId(SecurityUtils.getUserId()); + mediaFileInfo.setState(1); + int count = mediaFileInfoMapper.insertMediaFileInfo(mediaFileInfo); + List list = mediaFileInfo.getFileItems(); + list.forEach(item -> { + item.setFileName(getFileName(item.getUrlPath())); + item.setFileType(getFileType(item.getUrlPath())); + item.setParentId(mediaFileInfo.getId()); + }); + mediaFileItemService.batchInsertMediaFileItem(list); + if (mediaFileInfo.getVersionId() == null || mediaFileInfo.getVersionId() == 0L) { + SysDictData data = new SysDictData(); + data.setDictLabel(mediaFileInfo.getVersion()); + data.setDictValue(mediaFileInfo.getVersion()); + data.setDictType("file_upload_version"); + data.setIsDefault("N"); + data.setStatus("0"); + sysDictDataService.insertDictData(data); + } + processInferJsonFiles(mediaFileInfo); + sendMessageToInfer(mediaFileInfo); +// mediaFileInfo.setState(1); + return count; + } + + + private String getFileType(String name) { + if (name == null || name.isEmpty()) { + return ""; + } else { + int pos = name.lastIndexOf("."); + if (pos != -1) { + return name.substring(pos); + } else { + return ""; + } + } + } + + private String getFileName(String name) { + if (name == null || name.isEmpty()) { + return ""; + } else { + int pos = name.lastIndexOf("/"); + if (pos != -1) { + return name.substring(pos + 1); + } else { + return name; + } + } + } + + //new method 2025-05-21 + @Override + public void saveMediaFilesToDb(JSONObject object) throws Exception { + String basePath = object.getString("filePath"); + version = object.getString("version"); + prefixPath = object.getString("prefixPath"); + File root = new File(basePath); + try (Stream stream = Files.walk(root.toPath())) { + List paths = stream.filter(Files::isDirectory) + .filter(path -> path.getFileName().toString().equalsIgnoreCase("Upload_que")).collect(Collectors.toList()); + for (Path path : paths) { + processUploadJsonFile(path); + } + } catch (IOException e) { + log.error("error", e); + } + } + + private void processUploadJsonFile(Path filePath) { + try (Stream stream = Files.walk(filePath)) { + stream.filter(Files::isRegularFile) // 仅处理普通文件 + .filter(path -> path.toString().endsWith(".json")) // 过滤.json后缀 + .forEach(path -> { + String fileName = path.toAbsolutePath().toString(); + try { + String input = FileUtils.readFileToString(path.toFile(), "UTF-8"); + JSONObject jsonObject = JSON.parseObject(input); + if (jsonObject != null) { + Long deviceId = deviceInfoService.parserJsonObject(jsonObject.getJSONObject("device")); + if (deviceId != null) { + jsonObject.put("id", deviceId); + Long itemId = mediaItemService.parserJsonObject(jsonObject); + JSONArray array = jsonObject.getJSONArray("file_inf"); + List list = new ArrayList<>(); + for (Object obj : array) { + ResultMedia data = new ResultMedia(); + String name = ((JSONObject) obj).getString("F_FileName"); + String time = ((JSONObject) obj).getString("F_FileTime"); + if (name.toLowerCase().endsWith(".jpg")) { + data.setMediaType(2); + data.setMetaUrl(getMediaFilePath(name, filePath)); + } else { + data.setMediaType(3); + data.setMediaUrl(getMediaFilePath(name, filePath)); + } + data.setDeviceId(deviceId); + data.setItemId(itemId); + ZonedDateTime zonedDateTime = ZonedDateTime.parse(time); + data.setTime(Date.from(zonedDateTime.toInstant())); + data.setAreaName(name); + data.setIsDeleted(0); + data.setVersion(version); + list.add(data); + } + saveToTable(list, filePath); + } + } + } catch (Exception ex) { + log.error("error", ex); + } + + }); + } catch (IOException e) { + log.error("error", e); + } + } + + private void saveToTable(List list, Path path) { + for (ResultMedia data : list) { + if (data.getMediaType() == 3) { + data.setMetaUrl(getMetaUrl(list)); + } + } + resultMediaService.batchInsertResultMedia(list); + processResultRecord(list, path); + } + + private void processResultRecord(List list, Path path) { + List details = new LinkedList<>(); + for (ResultMedia data : list) { + if (data.getMediaType() == 2) { + processXmlResult(data, path, details); + } else if (data.getMediaType() == 3) { + processJsonResult(data, path, details); + } + } + if (!details.isEmpty()) { + resultRecordDetailsService.batchInsertResultRecordDetails(details); + } + } + + private void processJsonResult(ResultMedia data, Path path, List details) { + String fileName = path.getParent() + "/json/" + removeExtension(data.getAreaName()) + ".json"; + try { + File file = new File(fileName); + if (file.exists()) { + String jsonText = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8); + JSONObject root = JSON.parseObject(jsonText); + JSONObject metaArray = root.getJSONObject("meta_array"); + Map map = new HashMap<>(); + for (Map.Entry entry : metaArray.entrySet()) { + if (!(entry.getValue() instanceof JSONObject)) { + continue; + } + JSONObject obj = (JSONObject) entry.getValue(); + String trackerId = obj.getString("tracker_id"); + String voteClassName = obj.getString("vote_class_name"); + if (voteClassName != null && !voteClassName.trim().isEmpty()) { + Double voteClassConfidence = obj.getDouble("vote_class_confidence"); + String key = voteClassName + "_" + trackerId; + JSONObject item = map.get(key); + if (item == null) { + item = new JSONObject(); + item.put("name", voteClassName); + item.put("confidence", voteClassConfidence); + } else { + Double confidence = item.getDouble("confidence"); + if (confidence < voteClassConfidence) { + item.put("confidence", voteClassConfidence); + } + } + map.put(key, item); + } + } + for (JSONObject obj : map.values()) { + ResultRecordDetails record = new ResultRecordDetails(); + record.setHabitat("0"); + record.setMediaId(data.getMediaId()); + record.setRecordId(data.getItemId()); + String name = obj.getString("name"); + Long speciesId = getSpeciesIdByName(name); + record.setSpeciesId(speciesId); + record.setConfidence(obj.getDouble("confidence")); + record.setCount(1); + details.add(record); + } + } else { + details.add(createEmptyRecord(data)); + } + } catch (Exception e) { + log.error("error", e); + } + } + + private ResultRecordDetails createEmptyRecord(ResultMedia data) { + ResultRecordDetails record = new ResultRecordDetails(); + record.setHabitat("0"); + record.setMediaId(data.getMediaId()); + record.setRecordId(data.getItemId()); + record.setCount(0); + record.setSpeciesId(0L); + record.setIsDeleted(0); + return record; + } + + private void processXmlResult(ResultMedia data, Path path, List details) { + String fileName = path.getParent() + "/xml/" + removeExtension(data.getAreaName()) + ".xml"; + + try { + File xmlFile = new File(fileName); + if (xmlFile.exists()) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(xmlFile); + doc.getDocumentElement().normalize(); + NodeList nodeList = doc.getElementsByTagName("object"); + if (nodeList == null || nodeList.getLength() == 0) { + details.add(createEmptyRecord(data)); + } else { + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + Element element = (Element) node; + String name = element.getElementsByTagName("name").item(0).getTextContent(); + ResultRecordDetails record = new ResultRecordDetails(); + record.setHabitat("0"); + record.setMediaId(data.getMediaId()); + record.setRecordId(data.getItemId()); + Long speciesId = getSpeciesIdByName(name); + record.setSpeciesId(speciesId); + record.setCount(1); + record.setBoundbox(convertXmlToJson(element, record)); + details.add(record); + } + } + } else { + details.add(createEmptyRecord(data)); + } + + } catch (Exception ex) { + log.error("error", ex); + } + } + + private String convertXmlToJson(Element element, ResultRecordDetails record) { + JSONObject json = new JSONObject(); + JSONObject bndboxJson = new JSONObject(); + Element bndbox = (Element) element.getElementsByTagName("bndbox").item(0); + bndboxJson.put("xmin", bndbox.getElementsByTagName("xmin").item(0).getTextContent()); + bndboxJson.put("ymin", bndbox.getElementsByTagName("ymin").item(0).getTextContent()); + bndboxJson.put("xmax", bndbox.getElementsByTagName("xmax").item(0).getTextContent()); + bndboxJson.put("ymax", bndbox.getElementsByTagName("ymax").item(0).getTextContent()); + String score = bndbox.getElementsByTagName("score").item(0).getTextContent(); + bndboxJson.put("score", score); + record.setConfidence(Double.parseDouble(score) / 100); + json.put("bndbox", bndboxJson); + return json.toJSONString(); + } + + private String removeExtension(String name) { + int dotIndex = name.lastIndexOf('.'); + return (dotIndex == -1) ? name : name.substring(0, dotIndex); + } + + + private String getMetaUrl(List list) { + for (ResultMedia data : list) { + if (data.getMediaType() == 2) { + return data.getMetaUrl(); + } + } + return null; + + } + + + private String getMediaFilePath(String filename, Path path) { + String name = path.getParent().toAbsolutePath() + "/DCIM/100MEDIA/" + filename; + File file = new File(name); + if (file.exists()) { + return name.replace(prefixPath, "/"); + } + return null; + } + +// private + + + @Override + public void saveMovFilesToDb(JSONObject object) throws Exception { + String basePath = object.getString("filePath"); + File dir = new File(basePath + "/DCIM/100MEDIA"); + if (dir.exists()) { +// Calendar cal = Calendar.getInstance(); + Long deviceId = object.getLong("deviceId"); + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss"); + File[] fileList = dir.listFiles(); + if (fileList == null) { + return; + } + List movFiles = new ArrayList<>(); + List jpgFiles = new ArrayList<>(); + List txtFiles = new ArrayList<>(); + List jsonFiles = new ArrayList<>(); + List txtImageFiles = new ArrayList<>(); + + for (File file : fileList) { + if (!file.isDirectory()) { + String name = file.getName(); + if (name.toLowerCase().endsWith(".mov")) { + movFiles.add(name); + } else if (name.toLowerCase().endsWith(".txt")) { + txtFiles.add(name); + } + } + } + String imageFile = basePath.replaceAll("videos_camera", "images_camera"); + dir = new File(imageFile + "/DCIM/100MEDIA"); + if (dir.exists()) { + fileList = dir.listFiles(); + for (File file : fileList) { + if (!file.isDirectory()) { + String name = file.getName(); + if (name.toLowerCase().endsWith(".jpg")) { + jpgFiles.add(name); + } else if (name.toLowerCase().endsWith(".txt")) { + txtImageFiles.add(name); + } + } + } + } + basePath = basePath.replaceAll("\\\\", "/"); + String jsonFilePath = basePath.replaceAll("/data5/file/ghy_xb/videos_camera/", "/data5/PartDataset/001_GHY/00_20240415_2023Data_02-06/data/"); + dir = new File(jsonFilePath + "/Upload_que"); + if (dir.exists()) { + fileList = dir.listFiles(); + + if (fileList != null) { + for (File file : fileList) { + if (!file.isDirectory()) { + String name = file.getName(); + if (name.toLowerCase().endsWith(".json")) { + jsonFiles.add(name); + } + } + } + } + } + for (String jsonFile : jsonFiles) { + String filePath = jsonFilePath + "/Upload_que/" + jsonFile; +// System.out.println("=====================" + filePath); + File file = new File(filePath); + if (file.exists()) { + String input = FileUtils.readFileToString(file, "UTF-8"); + JSONObject jsonObject = JSON.parseObject(input); + if (jsonObject != null) { + Long itemId = saveToJsonFile(jsonObject, deviceId); + JSONArray array = jsonObject.getJSONArray("file_inf"); + for (Object obj : array) { + String name = ((JSONObject) obj).getString("F_FileName"); +// System.out.println("=====================" + name); + String time = ((JSONObject) obj).getString("F_FileTime"); + saveToTable(name, time, basePath, movFiles, jpgFiles, txtFiles, txtImageFiles, deviceId, itemId); + } + } + } + } + } + } + + + @Override + public void saveNetFilesToDb(JSONObject object) throws Exception { + String basePath = object.getString("filePath"); + version = object.getString("version"); + prefixPath = object.getString("prefixPath"); + File root = new File(basePath); + try (Stream stream = Files.walk(root.toPath())) { + List paths = stream.filter(Files::isDirectory) + .filter(path -> path.getFileName().toString().equalsIgnoreCase("DCIM")).collect(Collectors.toList()); + for (Path path : paths) { + processDcimFile(path); + } + } catch (IOException e) { + log.error("error", e); + } + } + + private Long getDeviceIdByPid(Path path) { + String pid = path.getParent().getFileName().toString(); + return deviceInfoService.getDeviceIdByPid(pid); + } + + private void processDcimFile(Path filePath) { + Path mediaPath = filePath.resolve("100MEDIA"); + Long deviceId = getDeviceIdByPid(filePath); + Map> map = new HashMap<>(); + try (Stream stream = Files.walk(mediaPath)) { + stream.filter(Files::isRegularFile) + .forEach(path -> { + String fileName = path.getFileName().toString(); + if (fileName.toLowerCase().endsWith(".mov") || fileName.toLowerCase().endsWith(".jpg") || fileName.toLowerCase().endsWith(".mp4")) { + String[] array = fileName.split("\\."); + array = array[0].split("-"); + String key = array[0]; + List list = map.get(key); + if (list == null) { + list = new ArrayList<>(); + } + list.add(path); + map.put(key, list); + } + }); + } catch (IOException e) { + log.error("error", e); + } + processMapFile(map, deviceId, filePath); + } + + private void processMapFile(Map> map, Long deviceId, Path filePath) { + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss"); + for (String key : map.keySet()) { + try { + Date time = df.parse(key.replaceAll("_", "")); + MediaItem item = new MediaItem(); + item.setDeviceId(deviceId); + mediaItemService.insertMediaItem(item); + Long itemId = item.getId(); + List list = map.get(key); + + for (Path path : list) { + String filename = path.getFileName().toString(); + + if (filename.toLowerCase().endsWith(".jpg")) { + String metaUrl = path.toString().replace(prefixPath, "/"); + saveImageTdDB(filePath, path, deviceId, itemId, time, metaUrl, null, 2); + } else { + String metaUrl = getMateUrlFromList(list); + String mediaUrl = path.toString().replace(prefixPath, "/"); + saveImageTdDB(filePath, path, deviceId, itemId, time, metaUrl, mediaUrl, 3); + } + } + } catch (Exception e) { + log.error("error", e); + } + } + } + + private String getMateUrlFromList(List list) { + for (Path path : list) { + String fileName = path.getFileName().toString(); + if (fileName.toLowerCase().endsWith(".jpg")) { + return path.toString().replace(prefixPath, "/"); + } + } + return null; + } + + private void saveImageTdDB(Path rootPath, Path mediaPath, Long deviceId, Long itemId, Date time, String metaUrl, String mediaUrl, int mediaType) { + String fileName = mediaPath.getFileName().toString(); + ResultMedia resultMedia = new ResultMedia(); + resultMedia.setDeviceId(deviceId); + resultMedia.setVersion(version); + resultMedia.setItemId(itemId); + resultMedia.setTime(time); + resultMedia.setMediaType(mediaType); + resultMedia.setMetaUrl(metaUrl); + resultMedia.setMediaUrl(mediaUrl); + resultMediaService.insertResultMedia(resultMedia); + List details = new ArrayList<>(); + String[] array = fileName.split("\\."); + resultMedia.setAreaName(array[0]); + if (mediaType == 3) { + processJsonResult(resultMedia, rootPath, details); + } else { + processXmlResult(resultMedia, rootPath, details); + } + if (!details.isEmpty()) { + resultRecordDetailsService.batchInsertResultRecordDetails(details); + } + } + + + @Override + public void importMovFileToDb(JSONObject jsonObject) { + String startDir = jsonObject.getString("dir"); + String name = jsonObject.getString("name"); + try { + List paths = findDirectoriesByName(Paths.get(startDir), name); + // System.out.println(path.getFileName()); + // log.info("======================{}", path.toAbsolutePath().toString()); + paths.forEach(this::processFileToDb); + } catch (Exception ex) { + log.error("error", ex); + } + + } + + private void processFileToDb(Path dir) { + if (Files.isDirectory(dir)) { + Long cameraId = getCameraIdFromPath(dir); + if (cameraId == null) { + return; + } + Map recordMap = new HashMap<>(); + Map mediaMap = new HashMap<>(); + try (Stream stream = Files.walk(dir)) { + stream + .filter(Files::isRegularFile) // 过滤出文件(非目录) + .filter(path -> path.toString().endsWith(".txt")) // 过滤出以 .txt 结尾的文件 + .forEach(file -> { + String fileName = file.getFileName().toString(); +// log.info("=========process file===={}", fileName); + saveToDb(fileName, recordMap, mediaMap, cameraId, file); + }); + } catch (IOException e) { + log.error("error", e); + } + processRestMovFile(dir, recordMap, cameraId); + } + } + + private void processRestMovFile(Path dir, Map map, Long cameraId) { + List list = new ArrayList<>(map.keySet()); + String movPath = dir.getParent().toString() + "/100MEDIA"; + dir = Paths.get(movPath); + try (Stream stream = Files.walk(dir)) { + stream + .filter(Files::isRegularFile) // 过滤出文件(非目录) + .filter(path -> path.toString().toLowerCase().endsWith(".mov")) // 过滤出以 .txt 结尾的文件 + .forEach(file -> { + String fileName = file.getFileName().toString(); +// log.info("=========process rest file===={}", fileName); + if (!isFileSaved(fileName, list)) { + saveRestToDb(fileName, cameraId, file); + } + }); + } catch (IOException e) { + log.error("error", e); + } + } + + private boolean isFileSaved(String name, List list) { + name = getBaseFileName(name, ".mov"); + return list.contains(name); + } + + private String getBaseFileName(String name, String lowerSuffix) { + int pos = name.toLowerCase().lastIndexOf(lowerSuffix); + if (pos != -1) { + name = name.substring(0, pos); + } + return name; + } + + private void saveRestToDb(String fileName, Long cameraId, Path path) { + String name = getBaseFileName(fileName, ".mov"); + String[] array = name.split("_"); + int len = array.length; + if (len > 1) { + String dateTime = array[len - 2] + array[len - 1]; + dateTime = dateTime.replaceAll("T", ""); + try { + Long recordId = saveToResultRecord(name, cameraId, dateTime, null); + Long mediaId = saveToResultMedia(name, cameraId, dateTime, null, path); + ResultRecordDetails details = new ResultRecordDetails(); + details.setHabitat("0"); + details.setMediaId(mediaId); + details.setRecordId(recordId); + details.setCount(0); + details.setSpeciesId(0L); + details.setIsDeleted(0); + resultRecordDetailsService.insertResultRecordDetails(details); + } catch (Exception ex) { + log.error("error", ex); +// ex.printStackTrace(); + } + } + } + + private void saveToDb(String name, Map recordMap, Map mediaMap, Long cameraId, Path path) { + name = getBaseFileName(name, ".txt"); + String[] array = name.split("_"); + int len = array.length; + if (len >= 4) { + int count = Integer.parseInt(array[len - 1]); + String speciesName = array[len - 2]; + Long speciesId = getSpeciesIdByName(speciesName); + String fileName = getBaseFileName(array); + String dateTime = array[len - 4] + array[len - 3]; + dateTime = dateTime.replaceAll("T", ""); + try { + Long recordId = saveToResultRecord(fileName, cameraId, dateTime, recordMap); + Long mediaId = saveToResultMedia(fileName, cameraId, dateTime, mediaMap, path); + ResultRecordDetails details = new ResultRecordDetails(); + details.setHabitat("0"); + details.setMediaId(mediaId); + details.setRecordId(recordId); + details.setCount(count); + details.setSpeciesId(speciesId); + details.setIsDeleted(0); + resultRecordDetailsService.insertResultRecordDetails(details); + } catch (Exception ex) { + log.error("error", ex); +// ex.printStackTrace(); + } + } + } + + private Long saveToResultMedia(String baseFileName, Long cameraId, String dateTime, Map map, Path path) throws Exception { + Long id = null; + if (map != null) { + id = map.get(baseFileName); + } + + if (id != null) { + return id; + } else { + ResultMedia resultMedia = new ResultMedia(); + resultMedia.setIsDeleted(0); + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss"); + resultMedia.setTime(df.parse(dateTime)); + resultMedia.setMediaType(3); + if (map != null) { + String parentPath = path.getParent().getParent().toString(); +// parentPath = parentPath.replaceAll("\\\\", "/"); + String path01 = parentPath.replaceAll("/data5/file", ""); + resultMedia.setMediaUrl(path01 + "/100MEDIA/" + baseFileName + ".MOV"); + Optional firstJpgFile = findFirstJpgFileWithPrefix(path, baseFileName, 0); + firstJpgFile.ifPresent(item -> { + String str = item.toString().replaceAll("/data5/file", ""); + resultMedia.setMetaUrl(str); + }); + } else { + String path01 = path.toString().replaceAll("/data5/file", ""); + resultMedia.setMediaUrl(path01); + Optional firstJpgFile = findFirstJpgFileWithPrefix(path, baseFileName, 1); + firstJpgFile.ifPresent(item -> { + String str = item.toString().replaceAll("/data5/file", ""); + resultMedia.setMetaUrl(str); + }); + } + + + resultMedia.setDeviceId(cameraId); + resultMediaService.insertResultMedia(resultMedia); + if (map != null) { + map.put(baseFileName, resultMedia.getMediaId()); + } + return resultMedia.getMediaId(); + } + } + + private Optional findFirstJpgFileWithPrefix(Path dir, String prefix, int type) { + String parentPath = ""; + if (type == 0) { + parentPath = dir.getParent().getParent().toString().replaceAll("/002_data/", "/Raw_data/02/") + "/100MEDIA"; + } else { + parentPath = dir.getParent().toString().replaceAll("/002_data/", "/Raw_data/02/"); + } + + dir = Paths.get(parentPath); + try (Stream stream = Files.walk(dir)) { + return stream + .filter(Files::isRegularFile) // 过滤出文件(不包括目录) + .filter(path -> path.getFileName().toString().contains(prefix)) // 过滤出以指定前缀开头的文件 + .filter(path -> path.getFileName().toString().toLowerCase().endsWith(".jpg")) // 过滤出以 .jpg 结尾的文件 + .findFirst(); // 获取第一个符合条件的文件 + } catch (IOException e) { +// e.printStackTrace(); + log.error("error", e); + } + return Optional.empty(); + + } + + private Long saveToResultRecord(String baseFileName, Long cameraId, String dateTime, Map map) throws Exception { + Long id = null; + if (map != null) { + id = map.get(baseFileName); + } + if (id != null) { + return id; + } else { + ResultRecord resultRecord = new ResultRecord(); + resultRecord.setDeviceId(cameraId); + resultRecord.setRecordType("1"); + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss"); + resultRecord.setRecordTime(df.parse(dateTime)); + resultRecordService.insertResultRecord(resultRecord); + if (map != null) { + map.put(baseFileName, resultRecord.getRecordId()); + } + return resultRecord.getRecordId(); + } + } + + private String getBaseFileName(String[] array) { + array = Arrays.copyOf(array, array.length - 2); + return String.join("_", array); + } + + private Long getCameraIdFromPath(Path dir) { + Path parentPath = dir.getParent(); + try (Stream stream = Files.walk(parentPath, 1)) { + List list = stream + .filter(Files::isRegularFile) // 过滤出文件(非目录) + .filter(path -> path.toString().endsWith(".json"))// + .filter(path -> path.getFileName().toString().startsWith("C"))// + .collect(Collectors.toList() // + ); + if (!list.isEmpty()) { + String name = list.get(0).getFileName().toString(); + log.info("=========camera name==={}", name); + String[] array = name.split("\\."); + return getDeviceInfoIdByPid(array[0]); + } else { + log.info("=========camera name==is null="); + } + } catch (IOException e) { + log.error("error", e); + } + return null; + } + + private List findDirectoriesByName(Path startDir, String targetDirName) throws IOException { + List matchingDirectories = new ArrayList<>(); + + Files.walkFileTree(startDir, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + if (dir.getFileName().toString().equals(targetDirName)) { + matchingDirectories.add(dir); + } + return FileVisitResult.CONTINUE; + } + }); + + return matchingDirectories; + } + + @Override + public boolean testMessage() { + JSONObject obj = new JSONObject(); + obj.put("code", 200); + obj.put("filePath", "/test"); + obj.put("deviceId", "1794"); + obj.put("deviceName", "C1506307M00359"); + obj.put("version", "20241113001"); + videoFileMessageProducer.sendRequestMessage(obj.toString()); + return true; + } + + @Override + public void processTest() { + MediaFileInfo mediaFileInfo = new MediaFileInfo(); + mediaFileInfo.setId(38L); + mediaFileInfo.setDeviceId(1788L); + mediaFileInfo.setDeviceName("C1506307M00334"); + mediaFileInfo.setVersion("202410014001"); + mediaFileInfo.setRemotePath("/C1506307M00334/202410014001"); + processInferJsonFiles(mediaFileInfo); + sendMessageToInfer(mediaFileInfo); + } + + @Override + public void testCameraFileProcess() { + try { + JSONObject obj = new JSONObject(); + obj.put("code", 1); + obj.put("filePath", "/data5/file/xuebao/test/20231120_144856.json"); + obj.put("pid", "C1506307M00359"); + videoFileMessageProducer.sendCameraUploadRequestMessage(obj.toString()); + + Thread.sleep(1000 * 5); + obj.put("filePath", "/data5/file/xuebao/test/20231120_144856_1.JPG"); + videoFileMessageProducer.sendCameraUploadRequestMessage(obj.toString()); + + Thread.sleep(1000 * 5); + obj.put("filePath", "/data5/file/xuebao/test/20231120_144856.MOV"); + videoFileMessageProducer.sendCameraUploadRequestMessage(obj.toString()); + } catch (Exception ex) { + log.error("error", ex); + } + } + + private void sendMessageToInfer(MediaFileInfo data) { + JSONObject obj = new JSONObject(); + obj.put("code", 200); + obj.put("id", data.getId()); + obj.put("version", data.getVersion()); + obj.put("deviceId", data.getDeviceId()); + obj.put("deviceName", data.getDeviceName()); + obj.put("filePath", data.getRemotePath() + "/media"); + videoFileMessageProducer.sendRequestMessage(obj.toString()); + } + + @Override + public void processInferVideoFiles(JSONObject object) { + Integer code = object.getInteger("code"); + Long id = object.getLong("id"); + MediaFileInfo data = new MediaFileInfo(); + data.setId(id); + boolean flag = true; + if (code != 500) { + String filePath = object.getString("filePath"); + if (filePath == null || filePath.isEmpty()) { + return; + } +// object.put(); + filePath = videoBasePath + filePath; + Set extensions = new HashSet<>(); + extensions.add("jpg"); + extensions.add("jpeg"); + extensions.add("png"); +// extensions.add("gif"); +// extensions.add("bmp"); + List imageFiles = null; + String imageFilePath = ""; + if (code == 200) { + imageFilePath = filePath; + imageFiles = getFileListByParam(filePath, extensions); + } else { + imageFilePath = object.getString("originalFullPath"); + imageFiles = getFileListByParam(imageFilePath, extensions); + } + + + extensions.clear(); + extensions.add("mp4"); + List videoFiles = getFileListByParam(filePath, extensions); + SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); + String dateFormat = df.format(new Date()); + try { + Path currentDir = Paths.get(filePath); + List list = getInferJsonFilesInDirectory(currentDir); + List> valueList = new ArrayList<>(); + String finalFilePath = filePath; + String finalImageFilePath = imageFilePath; + List finalImageFiles = imageFiles; + list.forEach(path -> { +// log.info("=============file===={}", filePath.getFileName()); + List maxValues = null; + int maxLength = 0; + try (BufferedReader reader = Files.newBufferedReader(path)) { + String line; + while ((line = reader.readLine()) != null) { +// log.info("=============line===={}", line); + if (!line.isEmpty()) { + if (!line.contains("videoPathURL") && !line.contains("labelvideoPathURL")) { + JSONObject obj = JSONObject.parseObject(line); + List values = getValuesByKey(obj, "class_name"); + if (values.size() > maxLength) { + maxValues = values; + maxLength = values.size(); + } else { + valueList.add(values); + } + } + } + } + Map map = null; + if (maxValues != null) { + map = getAllClassName(maxValues, valueList); +// map.keySet().forEach(key -> { +// Integer count = map.get(key); +// log.info("===key=={},value=={}", key, count); +// }); + } +// object.put("deviceId", 1787); +// object.put("name", "C1506305M00008"); + addToTable(object, map, path.getFileName().toString(), finalImageFiles, videoFiles, finalFilePath, finalImageFilePath, dateFormat); + } catch (IOException ex) { + log.info(ex.getMessage()); +// ex.printStackTrace(); + } + }); +// return true; + } catch (Exception ex) { +// ex.printStackTrace(); + log.error("===error===", ex); +// return false; + flag = false; + } + if (flag) { + data.setState(2); + } else { + data.setState(3); + } + mediaFileInfoMapper.updateMediaFileInfoState(data); + } + } + + @Override + public void processInferImageFiles(JSONObject object) { + Long deviceId = object.getLong("deviceId"); + String deviceName = object.getString("deviceName"); + String str = object.getString("list"); + if (str.isEmpty()) { + return; + } + String filePath = object.getString("filePath"); + String originalPathRoot = videoBasePath + filePath + "/"; + SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); + String dateFormat = df.format(new Date()); + JSONArray array = JSON.parseArray(str); + for (Object obj : array) { + JSONObject item = JSON.parseObject((String) obj); + addImageFileToDb(item, deviceId, deviceName, dateFormat, originalPathRoot); + } + } + + private void addCameraImageFileToDb(JSONObject object, Long deviceId, String deviceName, String fileFullPath) { + if (object == null) { + object = new JSONObject(); + } + Path path = Paths.get(fileFullPath); + String fileName = path.getFileName().toString(); + object.put("fileName", fileName); + SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); + String dateFormat = df.format(new Date()); + object.put("version", dateFormat); + String originalPathRoot = path.toAbsolutePath().toString(); + addImageFileToDb(object, deviceId, deviceName, dateFormat, originalPathRoot); + } + + + private void addImageFileToDb(JSONObject object, Long deviceId, String deviceName, String dateFormat, String originalPathRoot) { + String fileName = object.getString("fileName"); + String key = fileName + "_" + deviceId; + String version = object.getString("version"); + JSONObject itemObject = getCachedObjectByKey(key); + Date createDate = null; + Long itemId = null; + if (itemObject != null) { + itemId = itemObject.getLong("itemId"); + String time = itemObject.getString("time"); + createDate = getFomatedDate(time); + } + String[] arr = fileName.split("\\."); + if (createDate == null) { + createDate = getMediaFileCraeteDate(arr[0]); + } + String targetPathPrefix = "/" + deviceName + "/" + dateFormat; + String newImageFile = null; + String resultPath = object.getString("result"); + boolean labeled = true; + if (resultPath != null && !resultPath.isEmpty()) { + newImageFile = "labeled_" + fileName.toLowerCase(); + boolean success = moveFileToPath(resultPath, videoInferBasePath + targetPathPrefix + "/jpg/", newImageFile, 1); + if (!success) { + return; + } + } else { + newImageFile = "nolabeled_" + fileName.toLowerCase(); + boolean success = moveFileToPath(originalPathRoot + fileName, videoInferBasePath + targetPathPrefix + "/jpg/", newImageFile, 0); + if (!success) { + return; + } + labeled = false; + } + ResultMedia resultMedia = new ResultMedia(); + resultMedia.setDeviceId(deviceId); + resultMedia.setMediaUrl(targetPathPrefix + "/" + newImageFile); + resultMedia.setTime(createDate); + resultMedia.setMediaType(2); + resultMedia.setItemId(itemId); + resultMedia.setIsDeleted(0); + resultMediaService.insertResultMedia(resultMedia); + + ResultRecord data = new ResultRecord(); + data.setDeviceId(deviceId); + data.setRecordType("1"); + data.setVersion(version); + data.setRecordTime(createDate); + data.setIsDeleted(0); + resultRecordService.insertResultRecord(data); + + ResultRecordDetails details = new ResultRecordDetails(); + details.setHabitat("0"); + details.setMediaId(resultMedia.getMediaId()); + details.setRecordId(data.getRecordId()); + details.setIsDeleted(0); + if (labeled) { +// String scores = object.getString("SCORE"); + JSONArray scores = object.getJSONArray("SCORE"); + String names = object.getString("CLASS"); + Map map = getSpeciesNameValues(names, scores); + for (String speciesName : map.keySet()) { + details.setSpeciesId(getSpeciesIdByName(speciesName)); + JSONObject obj = (JSONObject) map.get(speciesName); + Integer count = obj.getInteger("count"); + details.setCount(count); + double str = obj.getDouble("score"); + double score = Double.parseDouble(String.format("%.2f", str)); + details.setConfidence(score); + resultRecordDetailsService.insertResultRecordDetails(details); + } + } else { + details.setSpeciesId(0L); + details.setCount(0); + resultRecordDetailsService.insertResultRecordDetails(details); + } + } + + private Map getSpeciesNameValues(String names, JSONArray scores) { + Map map = new HashMap<>(); + String[] arr1 = names.split(","); +// String[] arr2 = scores.split(","); + int index = 0; + for (String name : arr1) { + JSONObject obj = (JSONObject) map.get(name); + if (obj == null) { + obj = new JSONObject(); + obj.put("count", 1); + obj.put("score", Double.parseDouble(scores.getString(index))); + map.put(name, obj); + } else { + int count = obj.getInteger("count"); + obj.put("count", count + 1); + double score = obj.getDouble("score"); + obj.put("score", (Double.parseDouble(scores.getString(index)) + score) / (count + 1)); + } + } + return map; + } + + @Override + public void processInferJsonFiles(MediaFileInfo data) { + String filePath = videoBasePath + data.getRemotePath() + "/json"; + Path currentDir = Paths.get(filePath); + try (DirectoryStream stream = Files.newDirectoryStream(currentDir, "*.json")) { + for (Path entry : stream) { + processJsonFile(entry, data.getDeviceId()); + } + } catch (IOException | DirectoryIteratorException e) { + log.error("error", e); + } + } + + @Override + public void cameraFileUploadProcess(JSONObject object) { + int code = object.getInteger("code"); + if (code == 1) { + cameraUploadFileBeforeProcessing(object); + } + } + + @Override + public void cameraFileProcessFinished(String message) { + JSONObject jsonObject = JSON.parseObject(message); + Integer code = jsonObject.getInteger("code"); + if (code == 201) { + processInferCameraImageFile(jsonObject); + } else if (code == 202) { + processInferVideoFiles(jsonObject); + } + } + + private void processInferCameraImageFile(JSONObject jsonObject) { + String deviceName = jsonObject.getString("deviceName"); + Long deviceId = jsonObject.getLong("deviceId"); + String data = jsonObject.getString("data"); + JSONObject item = null; + if (data != null && !data.isEmpty()) { + item = JSON.parseObject(data); + } + String filePath = jsonObject.getString("filePath"); + addCameraImageFileToDb(item, deviceId, deviceName, filePath); + } + + + private void cameraUploadFileBeforeProcessing(JSONObject object) { + String filePath = object.getString("filePath"); + if (filePath.isEmpty()) { + return; + } + String pid = object.getString("pid"); + Long deviceId = getDeviceInfoIdByPid(pid); + String extension = getFileExtension(filePath); + + if ("json".equalsIgnoreCase(extension)) { + processJsonFile(filePath, deviceId); + } else if ("jpg".equalsIgnoreCase(extension)) { + object.put("deviceId", deviceId); + object.put("deviceName", pid); + object.put("code", 201); + videoFileMessageProducer.sendCameraProcessRequestMessage(object.toJSONString()); + } else if ("mov".equalsIgnoreCase(extension)) { + DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + String tmpfile = "/tmpfile/" + fmDate.format(LocalDateTime.now()); + String newFilePath = videoBasePath + tmpfile; + boolean success = moveFileToPath(filePath, newFilePath, null, 0); + if (success) { + object.put("deviceId", deviceId); + object.put("deviceName", pid); + object.put("code", 202); + object.put("filePath", tmpfile); + Path path = Paths.get(filePath); + object.put("originalFullPath", path.getParent().toString()); + videoFileMessageProducer.sendCameraProcessRequestMessage(object.toJSONString()); + } + } + } + + private Long getDeviceInfoIdByPid(String pid) { + Long id = deviceInfoService.getDeviceIdByDuid(pid); + if (id == null) { + DeviceInfo data = new DeviceInfo(); + data.setDeviceName(pid); + data.setPid(pid); + data.setStatus(1); + data.setDuid(pid); + data.setDeviceName(pid); + data.setDeviceType(1); + deviceInfoService.insertDeviceInfo(data); + id = data.getId(); + } + return id; + } + + private void processJsonFile(String filePath, Long deviceId) { + Path path = Paths.get(filePath); + try { + String input = FileUtils.readFileToString(path.toFile(), "UTF-8"); + JSONObject jsonObject = JSON.parseObject(input); + if (jsonObject != null) { + String device = jsonObject.getString("device"); + if (device != null && !device.isEmpty()) { + updateDeviceInfo(device); + } else { + String fileInfo = jsonObject.getString("file_inf"); + if (fileInfo != null && !fileInfo.isEmpty()) { + processFileInfoJson(jsonObject, deviceId); + } + } + } + } catch (Exception ex) { + log.error("error", ex); + } + } + + private void updateDeviceInfo(String str) { + JSONObject object = JSON.parseObject(str); + DeviceInfo data = new DeviceInfo(); + str = object.getString("PID"); + data.setPid(str); + data.setDeviceName(str); + str = object.getString("EUID"); + data.setDuid(str); + + str = object.getString("IP"); + data.setDeviceIp(str); + + str = object.getString("GP"); + if (str != null && !str.isEmpty()) { + String[] arr = str.split(","); + if (arr.length > 4) { + data.setLongitude(getFormatDoubleValue(arr[0], 0)); + data.setLongitude(getFormatDoubleValue(arr[2], 0)); + data.setEvalator(getFormatDoubleValue(arr[4], 1)); + } + } + + data.setStatus(1); + Long id = getDeviceInfoIdByPid(data.getPid()); + if (id == null) { + deviceInfoService.insertDeviceInfo(data); + } else { + data.setId(id); + deviceInfoService.updateDeviceInfo(data); + } + //String str = jsonObject.getString("device"); + } + + private double getFormatDoubleValue(String str, int type) { + double value = Double.parseDouble(str); + if (type == 0) { + str = String.format("%.8f", value / 100.0); + } else { + str = String.format("%.2f", value); + } + + return Double.parseDouble(str); + } + + private String getFileExtension(String name) { + int pos = name.lastIndexOf('.'); + return pos != -1 ? name.substring(pos + 1).toLowerCase() : null; + } + + private void processJsonFile(Path path, Long deviceId) { + try { + String input = FileUtils.readFileToString(path.toFile(), "UTF-8"); + JSONObject jsonObject = JSON.parseObject(input); + processFileInfoJson(jsonObject, deviceId); + } catch (Exception ex) { + log.error("===error====", ex); + } + } + + private void processFileInfoJson(JSONObject jsonObject, Long deviceId) { + if (jsonObject != null) { + Long itemId = saveToJsonFile(jsonObject, deviceId); + JSONArray array = jsonObject.getJSONArray("file_inf"); + for (Object obj : array) { + JSONObject item = new JSONObject(); + String name = ((JSONObject) obj).getString("F_FileName"); + item.put("name", name); + String time = ((JSONObject) obj).getString("F_FileTime"); + item.put("time", time); + item.put("itemId", itemId); + + redisCache.setCacheObject(name + "_" + deviceId, item); + } + } + } + + + private String removeExtensionAndString(String fileName) { + + // 查找最后一个 "." 的位置 + int lastDotIndex = fileName.lastIndexOf("."); + + // 如果找到 ".",则截取 "." 之前的部分;否则返回原始文件名 + if (lastDotIndex > 0) { + return fileName.substring(0, lastDotIndex); + } else { + return fileName; + } + } + + @Override + public int updateMediaFileInfoState(MediaFileInfo mediaFileInfo) { + if (mediaFileInfo.getState() == 1) { + sendMessageToInfer(mediaFileInfo); + } + return mediaFileInfoMapper.updateMediaFileInfoState(mediaFileInfo); + } + + @Override + public boolean processInferMediaFileWin(JSONObject object) { + Long id = object.getLong("id"); + MediaFileInfo data = new MediaFileInfo(); + data.setId(id); + data.setState(2); + mediaFileInfoMapper.updateMediaFileInfoState(data); + return true; + } + + private JSONObject getCachedObjectByKey(String key) { + JSONObject itemObject = redisCache.getCacheObject(key); + if (itemObject != null) { + redisCache.deleteObject(key); + } + return itemObject; + } + + private Date getFomatedDate(String time) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000+08:00"); + try { + return sdf.parse(time); + } catch (Exception ex) { + log.error("error", ex); + } + return null; + } + + private void addToTable(JSONObject object, Map map, String fileName, List imageFileList, List videoFileList, String videoFilePath, String imageFilePath, String dateFormat) { +// log.info("file name==={}", fileName); + Long deviceId = object.getLong("deviceId"); + String objKey = fileName + ".MOV" + "_" + deviceId; + JSONObject itemObject = getCachedObjectByKey(objKey); + String[] arr = fileName.split("\\."); +// String videoFile = getVideoFileByName(videoFileList, arr[0]); +// if (videoFile == null || videoFile.isEmpty()) { +// return; +// } + + String name = object.getString("deviceName"); + String version = object.getString("version"); +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000+08:00"); + Date createDate = null; + Long itemId = null; + if (itemObject != null) { + itemId = itemObject.getLong("itemId"); + String time = itemObject.getString("time"); + createDate = getFomatedDate(time); + } + if (createDate == null) { + createDate = getMediaFileCraeteDate(arr[0]); + } + // + String metaFile = getImageFileByName(imageFileList, arr[0]); + +// if(createDate==null){ +// createDate = new Date(); +// } + String targetPathPrefix = "/" + name + "/" + dateFormat; + String newVideoFile; + if (map != null && !map.isEmpty()) { + String videoFile = getVideoFileByName(videoFileList, arr[0]); + if (videoFile != null) { + newVideoFile = videoFile.replaceAll("result", "labeled"); + boolean success = moveFileToPath(videoFilePath + "/" + videoFile, videoInferBasePath + targetPathPrefix + "/", newVideoFile, 0); + if (!success) { + return; + } + } else { + return; + } + } else { + String oldVideoFile = arr[0] + ".MOV"; + newVideoFile = "nolabeled_" + oldVideoFile; + boolean success = moveFileToPath(videoFilePath + "/" + oldVideoFile, videoInferBasePath + targetPathPrefix + "/", newVideoFile, 0); + if (!success) { + return; + } + } + + ResultMedia resultMedia = new ResultMedia(); + resultMedia.setDeviceId(deviceId); + resultMedia.setMediaUrl(targetPathPrefix + "/" + newVideoFile); + + if (metaFile != null && !metaFile.isEmpty()) { + moveFileToPath(imageFilePath + "/" + metaFile, videoInferBasePath + targetPathPrefix + "/", metaFile.toLowerCase(), 1); + resultMedia.setMetaUrl(targetPathPrefix + "/" + metaFile.toLowerCase()); + } + + resultMedia.setTime(createDate); + resultMedia.setMediaType(3); + resultMedia.setItemId(itemId); + resultMedia.setIsDeleted(0); + resultMediaService.insertResultMedia(resultMedia); + + ResultRecord data = new ResultRecord(); + data.setDeviceId(deviceId); + data.setRecordType("1"); + data.setVersion(version); + data.setRecordTime(createDate); + data.setIsDeleted(0); + resultRecordService.insertResultRecord(data); + + ResultRecordDetails details = new ResultRecordDetails(); + details.setHabitat("0"); + details.setMediaId(resultMedia.getMediaId()); + details.setRecordId(data.getRecordId()); + details.setIsDeleted(0); + + if (map == null || map.isEmpty()) { + details.setSpeciesId(0L); + details.setCount(0); + resultRecordDetailsService.insertResultRecordDetails(details); + } else { + map.keySet().forEach(key -> { + Long id = getSpeciesIdByName(key); + details.setDetailsId(null); + details.setSpeciesId(id); + details.setCount(map.get(key)); + resultRecordDetailsService.insertResultRecordDetails(details); + }); + } + } + + private boolean moveFileToPath(String filePath, String target, String newName, int type) { + Path sourcePath = Paths.get(filePath); + Path targetDirectory = Paths.get(target); + Path targetPath; + if (newName != null) { + targetPath = targetDirectory.resolve(newName); + } else { + targetPath = targetDirectory.resolve(sourcePath.getFileName()); + } + try { + if (!Files.exists(targetDirectory)) { + Files.createDirectories(targetDirectory); + } + // 移动文件到目标目录 + if (type == 0) { + Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); // 如果目标文件已存在,将其替换 + } else { + Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); // 如果目标文件已存在,将其替换 + } +// System.out.println("File moved successfully!"); + return true; + } catch (IOException e) { + log.error("error", e); +// e.printStackTrace(); + return false; + } + } + + private String getVideoFileByName(List list, String name) { + for (String str : list) { + if (str.toLowerCase().contains("_result") && str.contains(name)) { + return str; + } + } + return null; + } + + + private String getImageFileByName(List list, String name) { + for (String str : list) { + if (str.contains(name)) { + return str; + } + } + return null; + } + + + private Date getMediaFileCraeteDate(String name) { + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss"); +// String[] arr = name.split("\\."); + String[] arr1 = name.split("_"); + try { + Date date; + if (arr1.length > 2) { + date = df.parse(arr1[1] + arr1[2]); + } else { + date = df.parse(arr1[0] + arr1[1]); + } + return date; + } catch (ParseException ex) { + return new Date(); + } + } + + private Map getAllClassName(List maxValues, List> list) { + Map map = convertListToMap(maxValues); + list.forEach(item -> { + Map subMap = convertListToMap(item); + addAbsentKeyToMap(map, subMap); + }); + return map; + } + + private void addAbsentKeyToMap(Map sourceMap, Map map) { + map.keySet().forEach(key -> { + Integer value = map.get(key); + sourceMap.putIfAbsent(key, value); + }); +// return sourceMap; + } + + + private Map convertListToMap(List list) { + Map map = new HashMap<>(); + list.forEach(item -> { + map.merge(item, 1, Integer::sum); + }); + return map; + } + + private List getValuesByKey(JSONObject jsonObject, String key) { + List values = new ArrayList<>(); + + for (String currentKey : jsonObject.keySet()) { + Object value = jsonObject.get(currentKey); + + if (currentKey.equals(key)) { + values.add((String) value); + } + + if (value instanceof JSONObject) { + values.addAll(getValuesByKey((JSONObject) value, key)); + } + + if (value instanceof JSONArray) { + JSONArray array = (JSONArray) value; + for (Object element : array) { + if (element instanceof JSONObject) { + values.addAll(getValuesByKey((JSONObject) element, key)); + } + } + } + } + return values; + } + + private List getFileListByParam(String filePath, Set imageExtensions) { + + Path dir = Paths.get(filePath); + + try (DirectoryStream stream = Files.newDirectoryStream(dir, entry -> { + // 获取文件名 + String fileName = entry.getFileName().toString(); + + // 找到最后一个 '.' 的位置 + int dotIndex = fileName.lastIndexOf('.'); + + // 如果没有扩展名,跳过此文件 + if (dotIndex == -1) { + return false; + } + + // 提取扩展名并转换为小写 + String extension = fileName.substring(dotIndex + 1).toLowerCase(); + + // 仅返回图像扩展名的文件 + return imageExtensions.contains(extension); + })) { + // 遍历并打印所有符合条件的图像文件 + List list = new ArrayList<>(); + for (Path entry : stream) { + list.add(entry.getFileName().toString()); + //System.out.println(entry.getFileName()); + } + return list; + } catch (IOException e) { + log.error("====error===", e); + } + return new ArrayList<>(); + } + + private List getInferJsonFilesInDirectory(Path dir) { + List jsonFiles = new ArrayList<>(); + + try (DirectoryStream stream = Files.newDirectoryStream(dir, "*.json")) { + for (Path entry : stream) { + if (!entry.getFileName().toString().toLowerCase().contains("metadata")) { + jsonFiles.add(entry); + } + + } + } catch (IOException | DirectoryIteratorException e) { + log.info(e.getMessage()); + // throw new IOException("Failed to read directory", e); + } + + return jsonFiles; + } + + private String getNetFile(String name) { + String[] arr = name.split("_"); + return arr[0] + "_" + arr[1] + "_" + arr[2].substring(0, 4); + } + + + private void saveImageFileToTable(String basePath, String fileName, Date time, List imageFiles, List txtFiles, Long deviceId, Long itemId) { + String[] arr = fileName.split("\\."); + for (String name : imageFiles) { + if (name.contains(arr[0])) { + ResultMedia resultMedia = new ResultMedia(); + resultMedia.setIsDeleted(0); + resultMedia.setMediaId(itemId); + resultMedia.setTime(time); + resultMedia.setMediaType(2); + String path = basePath.replaceAll("/data5/file", ""); + path = path.replaceAll("videos_camera", "images_camera"); + resultMedia.setMetaUrl(path + "/DCIM/100MEDIA/" + name); + resultMedia.setDeviceId(deviceId); + resultMediaService.insertResultMedia(resultMedia); + ResultRecord resultRecord = new ResultRecord(); + resultRecord.setDeviceId(deviceId); + resultRecord.setRecordType("1"); + resultRecord.setRecordTime(resultMedia.getTime()); + resultRecordService.insertResultRecord(resultRecord); + String[] arr1 = name.split("\\."); + saveToTable(arr1[0], txtFiles, resultRecord.getRecordId(), resultMedia.getMediaId()); + } + } + } + + private void saveToTable(String fileName, String time, String basePath, List movList, List imageList, List txtList, List txtImageList, Long deviceId, Long itemId) throws Exception { + int mediaType; + String movFile = ""; + String path = basePath; + String[] arr = fileName.split("\\."); + if (fileName.toLowerCase().endsWith(".jpg")) { + mediaType = 2; + } else { + mediaType = 3; + movFile = getFileFromList(arr[0], movList); + if (movFile == null) { + return; + } + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000+08:00"); + String imgFile = getFileFromList(arr[0], imageList); + if (imgFile == null) { + return; + } + ResultMedia resultMedia = new ResultMedia(); + resultMedia.setItemId(itemId); + resultMedia.setTime(sdf.parse(time)); + resultMedia.setMediaType(mediaType); + + path = path.replaceAll("/data5/file", ""); + path = path.replaceAll("videos_camera", "images_camera"); + resultMedia.setMetaUrl(path + "/DCIM/100MEDIA/" + imgFile); + if (mediaType == 3) { + path = basePath.replaceAll("/data5/file", ""); + resultMedia.setMediaUrl(path + "/DCIM/100MEDIA/" + movFile); + } + resultMedia.setIsDeleted(0); + resultMedia.setDeviceId(deviceId); + resultMedia.setItemId(itemId); + resultMediaService.insertResultMedia(resultMedia); + ResultRecord resultRecord = new ResultRecord(); + resultRecord.setDeviceId(deviceId); + resultRecord.setRecordType("1"); + resultRecord.setRecordTime(resultMedia.getTime()); + resultRecordService.insertResultRecord(resultRecord); + if (mediaType == 3) { + saveToTable(arr[0], txtList, resultRecord.getRecordId(), resultMedia.getMediaId()); + } else { + saveToTable(arr[0], txtImageList, resultRecord.getRecordId(), resultMedia.getMediaId()); + } + + } + + private void saveToTable(String name, List list, Long recordId, Long mediaId) { + boolean flag = false; + for (String str : list) { + if (str.contains(name)) { + flag = true; + String[] arr = str.split("\\."); + String[] arr1 = arr[0].split("_"); + int len = arr1.length; + String birdName = arr1[len - 2]; + Long id = getSpeciesIdByName(birdName); + int count = Integer.parseInt(arr1[len - 1]); + ResultRecordDetails resultRecordDetails = new ResultRecordDetails(); + resultRecordDetails.setRecordId(recordId); + resultRecordDetails.setSpeciesId(id); + resultRecordDetails.setHabitat("1"); + resultRecordDetails.setCount(count); + resultRecordDetails.setMediaId(mediaId); + resultRecordDetails.setIsDeleted(0); + resultRecordDetailsService.insertResultRecordDetails(resultRecordDetails); + } + } + if (!flag) { + ResultRecordDetails resultRecordDetails = new ResultRecordDetails(); + resultRecordDetails.setRecordId(recordId); + resultRecordDetails.setSpeciesId(0L); + resultRecordDetails.setHabitat("1"); + resultRecordDetails.setCount(0); + resultRecordDetails.setMediaId(mediaId); + resultRecordDetails.setIsDeleted(0); + resultRecordDetailsService.insertResultRecordDetails(resultRecordDetails); + } + } + + private Long getSpeciesIdByName(String name) { + Long id = birdSpeciesService.getBirdSpeciesInfoIdByName(name); + if (id == null) { + BirdSpecies data = new BirdSpecies(); + data.setName(name); + data.setScientificName("unknown"); + birdSpeciesService.insertBirdSpecies(data); + return data.getId(); + } else { + return id; + } + } + + private Long saveToJsonFile(Long deviceId) { + MediaItem data = new MediaItem(); + data.setDeviceId(deviceId); + data.setCameraVolt(0.0); + data.setSolarVolt(0.0); + data.setExtraVolt(0.0); + data.setTemperature(0.0); + data.setHumidity(0.0); + data.setAtmosphere(0.0); + data.setLat(""); + mediaItemService.insertMediaItem(data); + return data.getId(); + } + + private Long saveToJsonFile(JSONObject jsonObject, Long deviceId) { + try { + MediaItem data = new MediaItem(); + data.setDeviceId(deviceId); + if (jsonObject != null) { + JSONObject object = jsonObject.getJSONObject("device"); + + String str = object.getString("Battery1"); + if (str != null && !str.isEmpty()) { + data.setCameraVolt(Double.parseDouble(str)); + } + + str = object.getString("SPower"); + if (str != null && !str.isEmpty()) { + data.setSolarVolt(Double.parseDouble(str)); + } + + str = object.getString("EPower"); + if (str != null && !str.isEmpty()) { + data.setExtraVolt(Double.parseDouble(str)); + } + + str = object.getString("GP"); + if (str != null && !str.isEmpty()) { + data.setLat(str); + } + + + object = jsonObject.getJSONObject("data"); + str = object.getString("D_Temperature"); + if (str != null && !str.isEmpty()) { + data.setTemperature(Double.parseDouble(str)); + } + + str = object.getString("D_Humidity"); + if (str != null && !str.isEmpty()) { + data.setHumidity(Double.parseDouble(str)); + } + + str = object.getString("D_Atmos"); + if (str != null && !str.isEmpty()) { + data.setAtmosphere(Double.parseDouble(str)); + } + } + mediaItemService.insertMediaItem(data); + return data.getId(); + + } catch (Exception ex) { +// ex.printStackTrace(); + log.error(ex.getMessage()); + return null; + } + } + +// private String getJpgFile(String name, List list) { +// for (String str : list) { +// if (str.contains(name)) { +// return str; +// } +// } +// return null; +// } + + private String getFileFromList(String name, List list) { + for (String str : list) { + if (str.contains(name)) { + return str; + } + } + return null; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileItemServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileItemServiceImpl.java new file mode 100644 index 0000000..eb95630 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/file/service/impl/MediaFileItemServiceImpl.java @@ -0,0 +1,92 @@ +package net.hzvtc.file.service.impl; + +import net.hzvtc.file.domain.MediaFileItem; +import net.hzvtc.file.mapper.MediaFileItemMapper; +import net.hzvtc.file.service.MediaFileItemService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 多源数据文件列Service业务层处理 + * + * @author admin + * @date 2024-06-04 + */ +@Service +public class MediaFileItemServiceImpl implements MediaFileItemService { + @Resource + private MediaFileItemMapper mediaFileItemMapper; + + /** + * 查询多源数据文件列 + * + * @param id 多源数据文件列主键 + * @return 多源数据文件列 + */ + @Override + public MediaFileItem selectMediaFileItemById(Long id) { + return mediaFileItemMapper.selectMediaFileItemById(id); + } + + /** + * 查询多源数据文件列列表 + * + * @param mediaFileItem 多源数据文件列 + * @return 多源数据文件列 + */ + @Override + public List selectMediaFileItemList(MediaFileItem mediaFileItem) { + return mediaFileItemMapper.selectMediaFileItemList(mediaFileItem); + } + + /** + * 新增多源数据文件列 + * + * @param mediaFileItem 多源数据文件列 + * @return 结果 + */ + @Override + public int insertMediaFileItem(MediaFileItem mediaFileItem) { + return mediaFileItemMapper.insertMediaFileItem(mediaFileItem); + } + + /** + * 修改多源数据文件列 + * + * @param mediaFileItem 多源数据文件列 + * @return 结果 + */ + @Override + public int updateMediaFileItem(MediaFileItem mediaFileItem) { + return mediaFileItemMapper.updateMediaFileItem(mediaFileItem); + } + + /** + * 批量删除多源数据文件列 + * + * @param ids 需要删除的多源数据文件列主键 + * @return 结果 + */ + @Override + public int deleteMediaFileItemByIds(Long[] ids) { + return mediaFileItemMapper.deleteMediaFileItemByIds(ids); + } + + /** + * 删除多源数据文件列信息 + * + * @param id 多源数据文件列主键 + * @return 结果 + */ + @Override + public int deleteMediaFileItemById(Long id) { + return mediaFileItemMapper.deleteMediaFileItemById(id); + } + + @Override + public int batchInsertMediaFileItem(List list) { + return mediaFileItemMapper.batchInsertMediaFileItem(list); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/AreaGridController.java b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/AreaGridController.java new file mode 100644 index 0000000..cbf5351 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/AreaGridController.java @@ -0,0 +1,23 @@ +package net.hzvtc.gis.grid; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.gis.grid.service.AreaGridService; +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; + +@RestController +@RequestMapping("/area/grid") +@RequiredArgsConstructor +public class AreaGridController extends BaseController { + private final AreaGridService areaGridService; + + @PostMapping("/createAreaGrid") + public AjaxResult createAreaGrid(@RequestBody JSONObject jsonObject) { + return AjaxResult.success(areaGridService.createAreaGrid(jsonObject)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/domain/AreaGrid.java b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/domain/AreaGrid.java new file mode 100644 index 0000000..b17b78f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/domain/AreaGrid.java @@ -0,0 +1,16 @@ +package net.hzvtc.gis.grid.domain; + +import lombok.Data; +import org.apache.ibatis.type.Alias; + +@Data +@Alias("AreaGrid") +public class AreaGrid { + private Long id; + private double centerLat; + private double centerLon; + private double minLat; + private double minLon; + private double maxLat; + private double maxLon; +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/mapper/AreaGridMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/mapper/AreaGridMapper.java new file mode 100644 index 0000000..7fa3d7a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/mapper/AreaGridMapper.java @@ -0,0 +1,12 @@ +package net.hzvtc.gis.grid.mapper; + +import net.hzvtc.gis.grid.domain.AreaGrid; + +import java.util.List; +import java.util.Map; + +public interface AreaGridMapper { + int batchAdd(List list); + + AreaGrid findByLocation(Map param); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/AreaGridService.java b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/AreaGridService.java new file mode 100644 index 0000000..a0ead2d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/AreaGridService.java @@ -0,0 +1,17 @@ +package net.hzvtc.gis.grid.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.gis.grid.domain.AreaGrid; + +import java.util.List; +import java.util.Map; + +public interface AreaGridService { + int batchAdd(List list); + + AreaGrid findByLocation(Map param); + + List generateGrids(double minLat, double minLon, double maxLat, double maxLon); + + int createAreaGrid(JSONObject param); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/impl/AreaGridServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/impl/AreaGridServiceImpl.java new file mode 100644 index 0000000..001ef87 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/gis/grid/service/impl/AreaGridServiceImpl.java @@ -0,0 +1,66 @@ +package net.hzvtc.gis.grid.service.impl; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import net.hzvtc.gis.grid.domain.AreaGrid; +import net.hzvtc.gis.grid.mapper.AreaGridMapper; +import net.hzvtc.gis.grid.service.AreaGridService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class AreaGridServiceImpl implements AreaGridService { + private final AreaGridMapper areaGridMapper; + + @Override + public int batchAdd(List list) { + return areaGridMapper.batchAdd(list); + } + + @Override + public AreaGrid findByLocation(Map param) { + return areaGridMapper.findByLocation(param); + } + + @Override + public List generateGrids(double minLat, double minLon, double maxLat, double maxLon) { + double meterPerLat = 111000; + double latStep = 30.0 / meterPerLat; + + List gridList = new ArrayList<>(); + + for (double lat = minLat; lat < maxLat; lat += latStep) { + double meterPerLon = 111000 * Math.cos(Math.toRadians(lat)); + double lonStep = 30.0 / meterPerLon; + + for (double lon = minLon; lon < maxLon; lon += lonStep) { + double cellMaxLat = lat + latStep; + double cellMaxLon = lon + lonStep; + AreaGrid grid = new AreaGrid(); + grid.setMinLat(lat); + grid.setMinLon(lon); + grid.setMaxLat(cellMaxLat); + grid.setMaxLon(cellMaxLon); + grid.setCenterLat((lat + cellMaxLat) / 2); + grid.setCenterLon((lon + cellMaxLon) / 2); + gridList.add(grid); + } + } + return gridList; + } + + @Override + public int createAreaGrid(JSONObject param) { + double minLat = param.getDouble("minLat"); + double minLon = param.getDouble("minLon"); + double maxLat = param.getDouble("maxLat"); + double maxLon = param.getDouble("maxLon"); + List gridList = generateGrids(minLat, minLon, maxLat, maxLon); + return batchAdd(gridList); + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/consumer/VideoInferMessageConsumer.java b/ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/consumer/VideoInferMessageConsumer.java new file mode 100644 index 0000000..07bf34c --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/consumer/VideoInferMessageConsumer.java @@ -0,0 +1,49 @@ +package net.hzvtc.msg.kafka.consumer; + +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.file.service.MediaFileInfoService; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class VideoInferMessageConsumer { + + // private final AiBirdMessageConfig messageConfig; + private final MediaFileInfoService mediaFileInfoService; + +// private final SimpMessagingTemplate simpMessagingTemplate; + + @KafkaListener(topics = "${spring.kafka.topic.FileProcessVideoResponse}") + public void onResponseVideoMessage(String message) { + log.info("=====onResponseVideoMessage======={}", message); + JSONObject obj = JSONObject.parseObject(message); + mediaFileInfoService.processInferVideoFiles(obj); +// mediaFileInfoService.processInferMediaFileWin(obj); + } + + @KafkaListener(topics = "${spring.kafka.topic.FileProcessImageResponse}") + public void onResponseImageMessage(String message) { + log.info("=======onResponseImageMessage====={}", message); + JSONObject obj = JSONObject.parseObject(message); + mediaFileInfoService.processInferImageFiles(obj); + } + + + @KafkaListener(topics = "${spring.kafka.topic.CameraUploadRequest}") + public void onCameraFileUploadMessage(String message) { + log.info("=======onCameraFileUploadMessage====={}", message); + JSONObject obj = JSONObject.parseObject(message); + mediaFileInfoService.cameraFileUploadProcess(obj); + } + + @KafkaListener(topics = "${spring.kafka.topic.CameraProcessFinishResponse}") + public void onCameraProcessFinishResponseMessage(String message) { + log.info("=======onCameraProcessFinishResponseMessage====={}", message); +// JSONObject obj = JSONObject.parseObject(message); + mediaFileInfoService.cameraFileProcessFinished(message); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/producer/VideoFileMessageProducer.java b/ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/producer/VideoFileMessageProducer.java new file mode 100644 index 0000000..109be5a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/msg/kafka/producer/VideoFileMessageProducer.java @@ -0,0 +1,39 @@ +package net.hzvtc.msg.kafka.producer; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class VideoFileMessageProducer { + @Autowired + private KafkaTemplate kafkaTemplate; + + @Value("${spring.kafka.topic.FileProcessRequest}") + private String topicName; + + @Value("${spring.kafka.topic.CameraProcessRequest}") + private String cameraProcessTopicName; + + @Value("${spring.kafka.topic.CameraUploadRequest}") + private String cameraUploadTopicName; + + + public void sendRequestMessage(String message) { + kafkaTemplate.send(topicName, message); + log.info("MessageProducer: send: message is: [{}]", message); + } + + public void sendCameraProcessRequestMessage(String message) { + kafkaTemplate.send(cameraProcessTopicName, message); + log.info("MessageProducer: send: message is: [{}]", message); + } + + public void sendCameraUploadRequestMessage(String message) { + kafkaTemplate.send(cameraUploadTopicName, message); + log.info("sendCameraUploadRequestMessage: send: message is: [{}]", message); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationFilesController.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationFilesController.java new file mode 100644 index 0000000..f741e4d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationFilesController.java @@ -0,0 +1,98 @@ +package net.hzvtc.naturalist.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.naturalist.domain.ObservationFiles; +import net.hzvtc.naturalist.service.ObservationFilesService; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.common.core.page.TableDataInfo; + +/** + * 文件列Controller + * + * @author admin + * @date 2023-04-25 + */ +@RestController +@RequestMapping("/naturalist/files") +public class ObservationFilesController extends BaseController { + @Autowired + private ObservationFilesService observationFilesService; + +/** + * 查询文件列列表 + */ +@PreAuthorize("@ss.hasPermi('naturalist:files:list')") +@GetMapping("/list") + public TableDataInfo list(ObservationFiles observationFiles) { + startPage(); + List list = observationFilesService.selectObservationFilesList(observationFiles); + return getDataTable(list); + } + + /** + * 导出文件列列表 + */ + @PreAuthorize("@ss.hasPermi('naturalist:files:export')") + @Log(title = "文件列", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ObservationFiles observationFiles) { + List list = observationFilesService.selectObservationFilesList(observationFiles); + ExcelUtil util = new ExcelUtil(ObservationFiles. class); + util.exportExcel(response, list, "文件列数据"); + } + + /** + * 获取文件列详细信息 + */ + @PreAuthorize("@ss.hasPermi('naturalist:files:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(observationFilesService.selectObservationFilesById(id)); + } + + /** + * 新增文件列 + */ + @PreAuthorize("@ss.hasPermi('naturalist:files:add')") + @Log(title = "文件列", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ObservationFiles observationFiles) { + return toAjax(observationFilesService.insertObservationFiles(observationFiles)); + } + + /** + * 修改文件列 + */ + @PreAuthorize("@ss.hasPermi('naturalist:files:edit')") + @Log(title = "文件列", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ObservationFiles observationFiles) { + return toAjax(observationFilesService.updateObservationFiles(observationFiles)); + } + + /** + * 删除文件列 + */ + @PreAuthorize("@ss.hasPermi('naturalist:files:remove')") + @Log(title = "文件列", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(observationFilesService.deleteObservationFilesByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationsController.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationsController.java new file mode 100644 index 0000000..5192b5f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/controller/ObservationsController.java @@ -0,0 +1,115 @@ +package net.hzvtc.naturalist.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.naturalist.domain.Observations; +import net.hzvtc.naturalist.service.ObservationsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 观察记录Controller + * + * @author admin + * @date 2023-04-23 + */ +@Slf4j +@RestController +@RequestMapping("/naturalist/observations") +public class ObservationsController extends BaseController { + @Autowired + private ObservationsService observationsService; + + /** + * 查询观察记录列表 + */ + @GetMapping("/list") + public TableDataInfo list(Observations observations) { + startPage(); + List list = observationsService.selectObservationsList(observations); + return getDataTable(list); + } + + + @PostMapping("/listByParam") + public TableDataInfo listByParam(@RequestBody JSONObject params) { + Integer pageNum = params.getInteger("pageNum"); + Integer pageSize = params.getInteger("pageSize"); + startPage(pageNum, pageSize); + List list = observationsService.getObservationsListByParam(params); + return getDataTable(list); + } + + /** + * 导出观察记录列表 + */ + @PreAuthorize("@ss.hasPermi('naturalist:observations:export')") + @Log(title = "观察记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, Observations observations) { + List list = observationsService.selectObservationsList(observations); + ExcelUtil util = new ExcelUtil(Observations.class); + util.exportExcel(response, list, "观察记录数据"); + } + + /** + * 获取观察记录详细信息 + */ + @PreAuthorize("@ss.hasPermi('naturalist:observations:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(observationsService.selectObservationsById(id)); + } + + /** + * 新增观察记录 + */ + @PreAuthorize("@ss.hasPermi('naturalist:observations:add')") + @Log(title = "观察记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody Observations observations) { + return toAjax(observationsService.insertObservations(observations)); + } + + /** + * 修改观察记录 + */ + @PreAuthorize("@ss.hasPermi('naturalist:observations:edit')") + @Log(title = "观察记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody Observations observations) { + return toAjax(observationsService.updateObservations(observations)); + } + + /** + * 删除观察记录 + */ + @PreAuthorize("@ss.hasPermi('naturalist:observations:remove')") + @Log(title = "观察记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(observationsService.deleteObservationsByIds(ids)); + } + + @PostMapping("/addFiles") + public AjaxResult addFile(@RequestPart("files") MultipartFile[] files, @RequestParam(name = "data") String data) { + observationsService.saveObservation(files, data); + return AjaxResult.success(true); + } + + @PostMapping("/judgeImage") + public JSONObject judgeImage(@RequestPart("file") MultipartFile uploadFile) { + return observationsService.judgeImage(uploadFile); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/ObservationFiles.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/ObservationFiles.java new file mode 100644 index 0000000..735074e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/ObservationFiles.java @@ -0,0 +1,79 @@ +package net.hzvtc.naturalist.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 文件列对象 observation_files + * + * @author admin + * @date 2023-04-25 + */ +@Data +@Alias("ObservationFiles") +public class ObservationFiles extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 文件位置 + */ + @Excel(name = "文件位置") + private String location; + + /** + * 文件类型 + */ + @Excel(name = "文件类型") + private int fileType; + + /** + * 扩展名 + */ + @Excel(name = "扩展名") + private String fileExt; + + /** + * 文件名 + */ + @Excel(name = "文件名") + private String fileName; + + /** + * pid + */ + @Excel(name = "pid") + private Long observationId; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date createDate; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("location", getLocation()) + .append("fileType", getFileType()) + .append("fileExt", getFileExt()) + .append("fileName", getFileName()) + .append("observationId", getObservationId()) + .append("createDate", getCreateDate()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/Observations.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/Observations.java new file mode 100644 index 0000000..40122e3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/domain/Observations.java @@ -0,0 +1,95 @@ +package net.hzvtc.naturalist.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.bird.domain.BirdSpecies; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import net.hzvtc.common.core.domain.entity.SysUser; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; +import java.util.List; + +/** + * 观察记录对象 observations + * + * @author admin + * @date 2023-04-23 + */ +@Data +@Alias("Observations") +public class Observations extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date observedOn; + + /** + * 经纬度 + */ + @Excel(name = "经纬度") + private String lat; + + /** + * 经纬度 + */ + @Excel(name = "经纬度") + private String lon; + + /** + * 简述 + */ + @Excel(name = "简述") + private String description; + + /** + * 疑似物种 + */ + @Excel(name = "疑似物种") + private String speciesGuess; + + private Long userId; + + private Long taxonId; + + private BirdSpecies birdSpecies; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createDate; + + private Date updateDate; + + private SysUser userInfo; + + private List filesList; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("observedOn", getObservedOn()) + .append("lat", getLat()) + .append("lon", getLon()) + .append("description", getDescription()) + .append("speciesGuess", getSpeciesGuess()) + .append("userId", getUserId()) + .append("taxonId", getTaxonId()) + .append("isDeleted", getIsDeleted()) + .append("createDate", getCreateDate()) + .append("updateDate", getUpdateDate()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationFilesMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationFilesMapper.java new file mode 100644 index 0000000..a8931dd --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationFilesMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.naturalist.mapper; + +import java.util.List; +import net.hzvtc.naturalist.domain.ObservationFiles; + +/** + * 文件列Mapper接口 + * + * @author admin + * @date 2023-04-25 + */ +public interface ObservationFilesMapper +{ + /** + * 查询文件列 + * + * @param id 文件列主键 + * @return 文件列 + */ + public ObservationFiles selectObservationFilesById(Long id); + + /** + * 查询文件列列表 + * + * @param observationFiles 文件列 + * @return 文件列集合 + */ + public List selectObservationFilesList(ObservationFiles observationFiles); + + /** + * 新增文件列 + * + * @param observationFiles 文件列 + * @return 结果 + */ + public int insertObservationFiles(ObservationFiles observationFiles); + + /** + * 修改文件列 + * + * @param observationFiles 文件列 + * @return 结果 + */ + public int updateObservationFiles(ObservationFiles observationFiles); + + /** + * 删除文件列 + * + * @param id 文件列主键 + * @return 结果 + */ + public int deleteObservationFilesById(Long id); + + /** + * 批量删除文件列 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteObservationFilesByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationsMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationsMapper.java new file mode 100644 index 0000000..aa3ba1b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/mapper/ObservationsMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.naturalist.mapper; + +import java.util.List; +import net.hzvtc.naturalist.domain.Observations; + +/** + * 观察记录Mapper接口 + * + * @author admin + * @date 2023-04-23 + */ +public interface ObservationsMapper +{ + /** + * 查询观察记录 + * + * @param id 观察记录主键 + * @return 观察记录 + */ + public Observations selectObservationsById(Long id); + + /** + * 查询观察记录列表 + * + * @param observations 观察记录 + * @return 观察记录集合 + */ + public List selectObservationsList(Observations observations); + + /** + * 新增观察记录 + * + * @param observations 观察记录 + * @return 结果 + */ + public int insertObservations(Observations observations); + + /** + * 修改观察记录 + * + * @param observations 观察记录 + * @return 结果 + */ + public int updateObservations(Observations observations); + + /** + * 删除观察记录 + * + * @param id 观察记录主键 + * @return 结果 + */ + public int deleteObservationsById(Long id); + + /** + * 批量删除观察记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteObservationsByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationFilesService.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationFilesService.java new file mode 100644 index 0000000..c44971b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationFilesService.java @@ -0,0 +1,61 @@ +package net.hzvtc.naturalist.service; + +import java.util.List; + +import net.hzvtc.naturalist.domain.ObservationFiles; + +/** + * 文件列Service接口 + * + * @author admin + * @date 2023-04-25 + */ +public interface ObservationFilesService { + /** + * 查询文件列 + * + * @param id 文件列主键 + * @return 文件列 + */ + public ObservationFiles selectObservationFilesById(Long id); + + /** + * 查询文件列列表 + * + * @param observationFiles 文件列 + * @return 文件列集合 + */ + public List selectObservationFilesList(ObservationFiles observationFiles); + + /** + * 新增文件列 + * + * @param observationFiles 文件列 + * @return 结果 + */ + public int insertObservationFiles(ObservationFiles observationFiles); + + /** + * 修改文件列 + * + * @param observationFiles 文件列 + * @return 结果 + */ + public int updateObservationFiles(ObservationFiles observationFiles); + + /** + * 批量删除文件列 + * + * @param ids 需要删除的文件列主键集合 + * @return 结果 + */ + public int deleteObservationFilesByIds(Long[] ids); + + /** + * 删除文件列信息 + * + * @param id 文件列主键 + * @return 结果 + */ + public int deleteObservationFilesById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationsService.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationsService.java new file mode 100644 index 0000000..91d811d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/ObservationsService.java @@ -0,0 +1,70 @@ +package net.hzvtc.naturalist.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.naturalist.domain.Observations; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 观察记录Service接口 + * + * @author admin + * @date 2023-04-23 + */ +public interface ObservationsService { + /** + * 查询观察记录 + * + * @param id 观察记录主键 + * @return 观察记录 + */ + public Observations selectObservationsById(Long id); + + /** + * 查询观察记录列表 + * + * @param observations 观察记录 + * @return 观察记录集合 + */ + public List selectObservationsList(Observations observations); + + List getObservationsListByParam(JSONObject params); + + /** + * 新增观察记录 + * + * @param observations 观察记录 + * @return 结果 + */ + public int insertObservations(Observations observations); + + /** + * 修改观察记录 + * + * @param observations 观察记录 + * @return 结果 + */ + public int updateObservations(Observations observations); + + /** + * 批量删除观察记录 + * + * @param ids 需要删除的观察记录主键集合 + * @return 结果 + */ + public int deleteObservationsByIds(Long[] ids); + + /** + * 删除观察记录信息 + * + * @param id 观察记录主键 + * @return 结果 + */ + public int deleteObservationsById(Long id); + + int saveObservation(MultipartFile[] files, String data); + + JSONObject judgeImage(MultipartFile uploadFile); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationFilesServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationFilesServiceImpl.java new file mode 100644 index 0000000..a8b193d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationFilesServiceImpl.java @@ -0,0 +1,87 @@ +package net.hzvtc.naturalist.service.impl; + +import java.util.List; +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import net.hzvtc.naturalist.mapper.ObservationFilesMapper; +import net.hzvtc.naturalist.domain.ObservationFiles; +import net.hzvtc.naturalist.service.ObservationFilesService; + +/** + * 文件列Service业务层处理 + * + * @author admin + * @date 2023-04-25 + */ +@Service +public class ObservationFilesServiceImpl implements ObservationFilesService { + @Resource + private ObservationFilesMapper observationFilesMapper; + + /** + * 查询文件列 + * + * @param id 文件列主键 + * @return 文件列 + */ + @Override + public ObservationFiles selectObservationFilesById(Long id) { + return observationFilesMapper.selectObservationFilesById(id); + } + + /** + * 查询文件列列表 + * + * @param observationFiles 文件列 + * @return 文件列 + */ + @Override + public List selectObservationFilesList(ObservationFiles observationFiles) { + return observationFilesMapper.selectObservationFilesList(observationFiles); + } + + /** + * 新增文件列 + * + * @param observationFiles 文件列 + * @return 结果 + */ + @Override + public int insertObservationFiles(ObservationFiles observationFiles) { + return observationFilesMapper.insertObservationFiles(observationFiles); + } + + /** + * 修改文件列 + * + * @param observationFiles 文件列 + * @return 结果 + */ + @Override + public int updateObservationFiles(ObservationFiles observationFiles) { + return observationFilesMapper.updateObservationFiles(observationFiles); + } + + /** + * 批量删除文件列 + * + * @param ids 需要删除的文件列主键 + * @return 结果 + */ + @Override + public int deleteObservationFilesByIds(Long[] ids) { + return observationFilesMapper.deleteObservationFilesByIds(ids); + } + + /** + * 删除文件列信息 + * + * @param id 文件列主键 + * @return 结果 + */ + @Override + public int deleteObservationFilesById(Long id) { + return observationFilesMapper.deleteObservationFilesById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationsServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationsServiceImpl.java new file mode 100644 index 0000000..f5fdee9 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/naturalist/service/impl/ObservationsServiceImpl.java @@ -0,0 +1,243 @@ +package net.hzvtc.naturalist.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.config.AiBirdSysConfig; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.file.FileUploadUtils; +import net.hzvtc.naturalist.domain.ObservationFiles; +import net.hzvtc.naturalist.domain.Observations; +import net.hzvtc.naturalist.mapper.ObservationsMapper; +import net.hzvtc.naturalist.service.ObservationFilesService; +import net.hzvtc.naturalist.service.ObservationsService; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * 观察记录Service业务层处理 + * + * @author admin + * @date 2023-04-23 + */ +@Service +@Slf4j +public class ObservationsServiceImpl implements ObservationsService { + @Resource + private ObservationsMapper observationsMapper; + + @Autowired + private ObservationFilesService filesService; + + @Value("${hzvtc.observationTokenUrl}") + private String observationTokenUrl; + + @Value("${hzvtc.observationImgCheckUrl}") + private String observationImgCheckUrl; + + /** + * 查询观察记录 + * + * @param id 观察记录主键 + * @return 观察记录 + */ + @Override + public Observations selectObservationsById(Long id) { + return observationsMapper.selectObservationsById(id); + } + + /** + * 查询观察记录列表 + * + * @param observations 观察记录 + * @return 观察记录 + */ + @Override + public List selectObservationsList(Observations observations) { + return observationsMapper.selectObservationsList(observations); + } + + @Override + public List getObservationsListByParam(JSONObject params) { + Observations observations = new Observations(); + return selectObservationsList(observations); + } + + /** + * 新增观察记录 + * + * @param observations 观察记录 + * @return 结果 + */ + @Override + public int insertObservations(Observations observations) { + return observationsMapper.insertObservations(observations); + } + + /** + * 修改观察记录 + * + * @param observations 观察记录 + * @return 结果 + */ + @Override + public int updateObservations(Observations observations) { + return observationsMapper.updateObservations(observations); + } + + /** + * 批量删除观察记录 + * + * @param ids 需要删除的观察记录主键 + * @return 结果 + */ + @Override + public int deleteObservationsByIds(Long[] ids) { + return observationsMapper.deleteObservationsByIds(ids); + } + + /** + * 删除观察记录信息 + * + * @param id 观察记录主键 + * @return 结果 + */ + @Override + public int deleteObservationsById(Long id) { + return observationsMapper.deleteObservationsById(id); + } + + @Override + public int saveObservation(MultipartFile[] files, String data) { + Long userId = SecurityUtils.getUserId(); + JSONObject jsonObject = JSON.parseObject(data); + Observations observations = new Observations(); + String str = jsonObject.getString("observationOn"); + if (str != null && !str.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + try { + observations.setObservedOn(df.parse(str)); + } catch (Exception ex) { + log.error(ex.getMessage()); + } + } + str = jsonObject.getString("lonlat"); + if (str != null && !str.isEmpty()) { + String arr[] = str.split(","); + observations.setLat(arr[0]); + observations.setLon(arr[1]); + } + str = jsonObject.getString("memo"); + observations.setIsDeleted(0); + observations.setCreateDate(new Date()); + observations.setDescription(str); + observations.setUserId(userId); + observations.setCreateDate(new Date()); + observationsMapper.insertObservations(observations); + Long id = observations.getId(); + String baseDir = AiBirdSysConfig.getObservationFilePath() + SecurityUtils.getUserId(); + try { + for (MultipartFile file : files) { + String path = FileUploadUtils.upload(baseDir, file); + path = path.replaceAll("\\\\", "/"); + ObservationFiles item = new ObservationFiles(); + item.setObservationId(id); + String filename = file.getOriginalFilename(); + item.setLocation(path); + item.setFileName(filename); + String ext = filename.substring(filename.lastIndexOf(".") + 1); + item.setFileExt(ext); + item.setFileType(getFileType(ext)); + item.setCreateDate(new Date()); + filesService.insertObservationFiles(item); + } + } catch (Exception ex) { + log.error(ex.getMessage()); +// ex.printStackTrace(); + } + return 1; + } + + @Override + public JSONObject judgeImage(MultipartFile uploadFile) { + JSONObject result = new JSONObject(); + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + HttpGet httpGet = new HttpGet(observationTokenUrl); + CloseableHttpResponse response = null; + try { + response = httpClient.execute(httpGet); + HttpEntity responseEntity = response.getEntity(); + if (responseEntity != null) { + JSONObject jsonObject = JSON.parseObject(EntityUtils.toString(responseEntity)); + int code = jsonObject.getInteger("code"); + if (code == 0) { + String token = jsonObject.getString("data"); + HttpPost httpPost = new HttpPost(observationImgCheckUrl); + MultipartEntityBuilder builder = MultipartEntityBuilder.create(); + builder.setCharset(java.nio.charset.Charset.forName("UTF-8")); + builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + httpPost.addHeader("AccessToken", token); + builder.addBinaryBody("file", uploadFile.getInputStream(), ContentType.MULTIPART_FORM_DATA, uploadFile.getOriginalFilename()); + HttpEntity entity = builder.build(); + httpPost.setEntity(entity); + response = httpClient.execute(httpPost); + responseEntity = response.getEntity(); + + if (responseEntity != null) { + jsonObject = JSON.parseObject(EntityUtils.toString(responseEntity)); + //System.out.println(jsonObject.toJSONString()); + code = jsonObject.getInteger("code"); + if (0 == code) { + result.put("img", jsonObject.getString("data")); + result.put("code", 200); + } else { + result.put("code", 500); + result.put("msg", "解析图片出错"); + } + } else { + result.put("code", 500); + result.put("msg", "无法获取图片解析服务"); + } + } else { + result.put("code", 500); + result.put("msg", "无法获取token服务"); + } + } + } catch (Exception ex) { + // ex.printStackTrace(); + result.put("code", 500); + result.put("msg", ex.getMessage()); + } + + return result; + } + + + private int getFileType(String ext) { + if ("jpg".equalsIgnoreCase(ext) || "jpeg".equalsIgnoreCase(ext) || "png".equalsIgnoreCase(ext)) { + return 1; + } else if ("mp3".equalsIgnoreCase(ext) || "wav".equalsIgnoreCase(ext) || "m4v".equalsIgnoreCase(ext)) { + return 2; + } else { + return 3; + } + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifController.java b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifController.java new file mode 100644 index 0000000..50f66c8 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifController.java @@ -0,0 +1,46 @@ +package net.hzvtc.onvif.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.utils.file.FileUtils; +import net.hzvtc.onvif.service.CameraOnvifService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +@RestController +@RequestMapping("/camera/onvif") +public class CameraOnvifController { + @Autowired + private CameraOnvifService cameraOnvifService; + + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(cameraOnvifService.getCameraOnvifInfo(id)); + } + + @PostMapping("/ptzOperate") + public AjaxResult cameraPtzOperator(@RequestBody JSONObject param) { + return AjaxResult.success(cameraOnvifService.cameraPtzOperateByParam(param)); + } + + @PostMapping("/downloadSnapshotfile") + public void downloadSnapshotfile(@RequestParam Map params, HttpServletResponse response, HttpServletRequest request) { + Long deviceId = Long.parseLong((String) params.get("deviceId")); + String filePath = cameraOnvifService.getSnapshotFile(deviceId); + if (filePath != null) { + try { + String realFileName = "snapshot_" + deviceId + "_" + System.currentTimeMillis() + ".jpg"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifTest.java b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifTest.java new file mode 100644 index 0000000..887e085 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/controller/CameraOnvifTest.java @@ -0,0 +1,42 @@ +package net.hzvtc.onvif.controller; + +import de.onvif.soap.OnvifDevice; +import de.onvif.soap.devices.PtzDevices; +import org.onvif.ver10.schema.FloatRange; +import org.onvif.ver10.schema.PTZStatus; +import org.onvif.ver10.schema.Profile; + +import javax.xml.soap.SOAPException; +import java.net.ConnectException; +import java.util.List; + +public class CameraOnvifTest { + public static void main(String[] args) { + try { + OnvifDevice nvt = new OnvifDevice("semi-ai.tech:10555", "admin", "whc123456"); + List profiles = nvt.getDevices().getProfiles(); + String profileToken = profiles.get(0).getToken(); + PtzDevices ptzDevices = nvt.getPtz(); + PTZStatus ptzStatus = ptzDevices.getStatus(profileToken); + + System.out.println(ptzStatus.getPosition().getPanTilt().getX()); + System.out.println(ptzStatus.getPosition().getPanTilt().getY()); + System.out.println(ptzStatus.getPosition().getZoom().getX()); + System.out.println(ptzStatus.getPosition().getZoom().getSpace()); + + FloatRange panRange = ptzDevices.getPanSpaces(profileToken); + FloatRange tiltRange = ptzDevices.getTiltSpaces(profileToken); + FloatRange zoomRange = ptzDevices.getZoomSpaces(profileToken); + + System.out.println(String.format("Pan range[max=%f,min=%f]", panRange.getMax(), panRange.getMin())); + System.out.println(String.format("Tilt range[max=%f,min=%f]", tiltRange.getMax(), tiltRange.getMin())); + System.out.println(String.format("Zoom range[max=%f,min=%f]", zoomRange.getMax(), zoomRange.getMin())); + + } catch (ConnectException e) { + System.err.println("Could not connect to NVT."); + } catch (SOAPException e) { + e.printStackTrace(); + } + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/CameraOnvifService.java b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/CameraOnvifService.java new file mode 100644 index 0000000..116ea23 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/CameraOnvifService.java @@ -0,0 +1,14 @@ +package net.hzvtc.onvif.service; + +import com.alibaba.fastjson.JSONObject; + +public interface CameraOnvifService { + JSONObject getCameraConnectInfo(Long deviceId); + + String getSnapshotFile(Long deviceId); + + JSONObject getCameraOnvifInfo(Long deviceId); + + boolean cameraPtzOperateByParam(JSONObject param); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/impl/CameraOnvifServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/impl/CameraOnvifServiceImpl.java new file mode 100644 index 0000000..461347d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/onvif/service/impl/CameraOnvifServiceImpl.java @@ -0,0 +1,197 @@ +package net.hzvtc.onvif.service.impl; + +import com.alibaba.fastjson.JSONObject; +import de.onvif.soap.OnvifDevice; +import de.onvif.soap.devices.PtzDevices; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.core.redis.RedisCache; +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.device.service.DeviceInfoService; +import net.hzvtc.onvif.service.CameraOnvifService; +import org.onvif.ver10.schema.FloatRange; +import org.onvif.ver10.schema.PTZStatus; +import org.onvif.ver10.schema.Profile; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.xml.soap.SOAPException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.ConnectException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Base64; +import java.util.List; + +@Service +@Slf4j +public class CameraOnvifServiceImpl implements CameraOnvifService { + @Autowired + private DeviceInfoService deviceInfoService; + @Autowired + private RedisCache redisCache; + private String keyPrefix = "onvif_conntected_info_"; + + @Value("${hzvtc.cameraSnapshopFilePath}") + private String cameraSnapshopFilePath; + + private boolean getSnapshotImage(String url, String username, String password, String fileName) { + boolean success = true; + InputStream in = null; + FileOutputStream out = null; +// log.info("====url======={}", url); + try { + URL imageUrl = new URL(url); + HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection(); + conn.setDoOutput(true); + conn.setReadTimeout(30000); + conn.setConnectTimeout(30000); + conn.setUseCaches(false); + conn.setAllowUserInteraction(false); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept-Charset", "UTF-8"); + conn.setRequestMethod("GET"); + String userCredentials = username.trim() + ":" + password.trim(); + String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes())); + conn.setRequestProperty("Authorization", basicAuth); + in = conn.getInputStream(); + out = new FileOutputStream(cameraSnapshopFilePath + fileName); + int c; + byte[] b = new byte[4096]; + while ((c = in.read(b)) != -1) { + out.write(b, 0, c); + } + } catch (Exception ex) { + ex.printStackTrace(); + log.error(ex.getMessage()); + success = false; + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + + } + } + if (out != null) { + try { + out.close(); + } catch (IOException e) { + + } + } + } + return success; + } + + @Override + public JSONObject getCameraConnectInfo(Long deviceId) { + JSONObject object = redisCache.getCacheObject(keyPrefix + deviceId); +// log.info("=============={}", object.getString("OnvifHost")); + if (object == null || object.getString("OnvifHost") == null || object.getString("OnvifHost").isEmpty()) { + DeviceInfo deviceInfo = deviceInfoService.selectDeviceInfoById(deviceId); + if (deviceInfo != null) { + object = new JSONObject(); +// object.put("OnvifHost", deviceInfo.getRtspOut()); +// object.put("userName", deviceInfo.getDeviceUser()); +// object.put("password", deviceInfo.getDevicePassword()); + redisCache.setCacheObject(keyPrefix + deviceId, object); + } + } + return object; + } + + private OnvifDevice connentToOnvifDevice(Long deviceId) { + JSONObject object = getCameraConnectInfo(deviceId); + if (object != null) { + try { + OnvifDevice nvt = new OnvifDevice(object.getString("OnvifHost"), object.getString("userName"), object.getString("password")); + return nvt; + } catch (ConnectException e) { + log.error("Could not connect to NVT."); + //System.err.println("Could not connect to NVT."); + } catch (SOAPException e) { + //e.printStackTrace(); + log.error(e.getMessage()); + } + } + return null; + } + + @Override + public String getSnapshotFile(Long deviceId) { + JSONObject object = getCameraConnectInfo(deviceId); + try { + OnvifDevice nvt = connentToOnvifDevice(deviceId); + List profiles = nvt.getDevices().getProfiles(); + String profileToken = profiles.get(0).getToken(); + String snapshotUrl = nvt.getMedia().getSnapshotUri(profileToken); + DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); + String filename = "camera_" + deviceId + "_" + fmDate.format(LocalDateTime.now()) + ".jpg"; + boolean success = getSnapshotImage(snapshotUrl, object.getString("userName"), object.getString("password"), filename); + if (success) { + return cameraSnapshopFilePath + filename; + } + } catch (Exception ex) { + //ex.printStackTrace(); + log.error(ex.getMessage()); + } + return null; + } + + @Override + public JSONObject getCameraOnvifInfo(Long deviceId) { + try { + OnvifDevice nvt = connentToOnvifDevice(deviceId); + JSONObject config = new JSONObject(); + List profiles = nvt.getDevices().getProfiles(); + String profileToken = profiles.get(0).getToken(); + PtzDevices ptzDevices = nvt.getPtz(); + PTZStatus ptzStatus = ptzDevices.getStatus(profileToken); + config.put("currentX", ptzStatus.getPosition().getPanTilt().getX()); + config.put("currentY", ptzStatus.getPosition().getPanTilt().getY()); + config.put("currentZoom", ptzStatus.getPosition().getZoom().getX()); + FloatRange panRange = ptzDevices.getPanSpaces(profileToken); + FloatRange tiltRange = ptzDevices.getTiltSpaces(profileToken); + FloatRange zoomRange = ptzDevices.getZoomSpaces(profileToken); + config.put("xmax", panRange.getMax()); + config.put("xmin", panRange.getMin()); + config.put("ymax", tiltRange.getMax()); + config.put("ymin", tiltRange.getMin()); + config.put("zmax", zoomRange.getMax()); + config.put("zmin", zoomRange.getMin()); + return config; + } catch (Exception ex) { + log.error(ex.getMessage()); + } + return null; + } + + @Override + public boolean cameraPtzOperateByParam(JSONObject param) { + + try { + Long deviceId = param.getLong("deviceId"); + OnvifDevice nvt = connentToOnvifDevice(deviceId); + List profiles = nvt.getDevices().getProfiles(); + String profileToken = profiles.get(0).getToken(); + PtzDevices ptzDevices = nvt.getPtz(); + float x = param.getFloat("x"); + float y = param.getFloat("y"); + float zoom = param.getFloat("zoom"); + + if (ptzDevices.isAbsoluteMoveSupported(profileToken)) { + ptzDevices.absoluteMove(profileToken, x, y, zoom); + } + return true; + } catch (Exception ex) { + ex.printStackTrace(); + log.error(ex.getMessage()); + } + return false; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSTOMP.java b/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSTOMP.java new file mode 100644 index 0000000..8db7704 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSTOMP.java @@ -0,0 +1,25 @@ +package net.hzvtc.sys.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfigurationWithSTOMP implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/websocket").setAllowedOriginPatterns("*").withSockJS(); + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + // P2P should conf a /user ; broadcast should conf a /topic + config.enableSimpleBroker("/topic", "/queue", "/user"); + config.setApplicationDestinationPrefixes("/app"); // Client to Server + config.setUserDestinationPrefix("/user"); // Server to Client + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSockJS.java b/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSockJS.java new file mode 100644 index 0000000..d38493e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketConfigurationWithSockJS.java @@ -0,0 +1,33 @@ +package net.hzvtc.sys.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean; +import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; + +@Configuration +@EnableWebSocket +public class WebSocketConfigurationWithSockJS implements WebSocketConfigurer { + @Autowired + private WebSocketSupport webSocketSupport; + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) { + webSocketHandlerRegistry.addHandler(webSocketSupport, "/sockjs/messageHandler") + .addInterceptors(new HttpSessionHandshakeInterceptor()) + .setAllowedOrigins("*") + .withSockJS(); + } + + @Bean + public ServletServerContainerFactoryBean createWebSocketContainer() { + ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean(); + container.setMaxTextMessageBufferSize(8192); + container.setMaxBinaryMessageBufferSize(8192); + return container; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketSupport.java b/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketSupport.java new file mode 100644 index 0000000..c792c85 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/sys/config/WebSocketSupport.java @@ -0,0 +1,8 @@ +package net.hzvtc.sys.config; + +import org.springframework.stereotype.Component; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +@Component +public class WebSocketSupport extends TextWebSocketHandler { +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/controller/MessageReadInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/controller/MessageReadInfoController.java new file mode 100644 index 0000000..4635726 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/controller/MessageReadInfoController.java @@ -0,0 +1,86 @@ +package net.hzvtc.system.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.system.domain.MessageReadInfo; +import net.hzvtc.system.service.MessageReadInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 信息阅读情况Controller + * + * @author admin + * @date 2023-10-20 + */ +@RestController +@RequestMapping("/system/msgread") +public class MessageReadInfoController extends BaseController { + @Autowired + private MessageReadInfoService messageReadInfoService; + + /** + * 查询信息阅读情况列表 + */ + @PreAuthorize("@ss.hasPermi('system:msgread:list')") + @GetMapping("/list") + public TableDataInfo list(MessageReadInfo messageReadInfo) { + startPage(); + List list = messageReadInfoService.selectMessageReadInfoList(messageReadInfo); + return getDataTable(list); + } + + /** + * 导出信息阅读情况列表 + */ + @Log(title = "信息阅读情况", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, MessageReadInfo messageReadInfo) { + List list = messageReadInfoService.selectMessageReadInfoList(messageReadInfo); + ExcelUtil util = new ExcelUtil(MessageReadInfo.class); + util.exportExcel(response, list, "信息阅读情况数据"); + } + + /** + * 获取信息阅读情况详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(messageReadInfoService.selectMessageReadInfoById(id)); + } + + /** + * 新增信息阅读情况 + */ + @Log(title = "信息阅读情况", businessType = BusinessType.INSERT) + @PostMapping("/addMsgReadInfo") + public AjaxResult add(@RequestBody MessageReadInfo messageReadInfo) { + return toAjax(messageReadInfoService.insertMessageReadInfo(messageReadInfo)); + } + + /** + * 修改信息阅读情况 + */ + @Log(title = "信息阅读情况", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody MessageReadInfo messageReadInfo) { + return toAjax(messageReadInfoService.updateMessageReadInfo(messageReadInfo)); + } + + /** + * 删除信息阅读情况 + */ + @Log(title = "信息阅读情况", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(messageReadInfoService.deleteMessageReadInfoByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MenuInSys.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MenuInSys.java new file mode 100644 index 0000000..ff208e5 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MenuInSys.java @@ -0,0 +1,67 @@ +package net.hzvtc.system.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 系统菜单对象 menu_in_sys + * + * @author admin + * @date 2023-10-23 + */ +@Data +@Alias("MenuInSys") +public class MenuInSys { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * menuId + */ + @Excel(name = "menuId") + private Long menuId; + + /** + * parentId + */ + @Excel(name = "parentId") + private Long parentId; + + /** + * orderNum + */ + @Excel(name = "orderNum") + private Integer orderNum; + + /** + * sysId + */ + @Excel(name = "sysId") + private Integer sysId; + + /** + * $column.columnComment + */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Integer isDeleted; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("menuId", getMenuId()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("sysId", getSysId()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MessageReadInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MessageReadInfo.java new file mode 100644 index 0000000..af518b6 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/MessageReadInfo.java @@ -0,0 +1,65 @@ +package net.hzvtc.system.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 信息阅读情况对象 message_read_info + * + * @author admin + * @date 2023-10-20 + */ +@Data +@Alias("MessageReadInfo") +public class MessageReadInfo extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 用户ID + */ + @Excel(name = "用户ID") + private Long userId; + + /** + * 消息ID + */ + @Excel(name = "消息ID") + private Long messageId; + + /** + * 时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date readDate; + + /** + * 类型 + */ + @Excel(name = "类型") + private int messageType; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("userId", getUserId()) + .append("messageId", getMessageId()) + .append("readDate", getReadDate()) + .append("messageType", getMessageType()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeFileInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeFileInfo.java new file mode 100644 index 0000000..cf17b1a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeFileInfo.java @@ -0,0 +1,51 @@ +package net.hzvtc.system.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; +/** + * 通知公告附件对象 notice_file_info + * + * @author admin + * @date 2022-05-02 + */ +@Data +@Alias("NoticeFileInfo") +public class NoticeFileInfo extends BaseEntity + { +private static final long serialVersionUID=1L; + + /** id */ + private Long id; + + /** 文件路径 */ + @Excel(name = "文件路径") + private String filePath; + + /** 文件类型 */ + @Excel(name = "文件类型") + private String fileType; + + /** 名称 */ + @Excel(name = "名称") + private String name; + + /** noticeID */ + @Excel(name = "noticeID") + private Long noticeId; + + +@Override +public String toString(){ + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id",getId()) + .append("filePath",getFilePath()) + .append("fileType",getFileType()) + .append("name",getName()) + .append("noticeId",getNoticeId()) + .toString(); + } + } diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReadDept.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReadDept.java new file mode 100644 index 0000000..ce113f5 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReadDept.java @@ -0,0 +1,53 @@ +package net.hzvtc.system.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 公告阅读范围对象 notice_read_dept + * + * @author admin + * @date 2022-05-02 + */ +@Data +@Alias("NoticeReadDept") +public class NoticeReadDept extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 部门ID + */ + @Excel(name = "部门ID") + private Long deptId; + + private String deptName; + + private String fullPath; + + private String ancestorPath; + + /** + * noticeID + */ + @Excel(name = "noticeID") + private Long noticeId; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("deptId", getDeptId()) + .append("noticeId", getNoticeId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReader.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReader.java new file mode 100644 index 0000000..bd2cf0d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/NoticeReader.java @@ -0,0 +1,68 @@ +package net.hzvtc.system.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 公告阅读人员对象 notice_reader + * + * @author admin + * @date 2022-05-02 + */ +@Data +@Alias("NoticeReader") +public class NoticeReader { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 人员ID + */ + @Excel(name = "人员ID") + private Long personId; + + private String personName; + + /** + * 部门ID + */ + @Excel(name = "部门ID") + private Long deptId; + + private String deptName; + + /** + * 阅读时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "阅读时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date readTime; + + /** + * noticeId + */ + @Excel(name = "noticeId") + private Long noticeId; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("personId", getPersonId()) + .append("deptId", getDeptId()) + .append("readTime", getReadTime()) + .append("noticeId", getNoticeId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/RoleInArea.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/RoleInArea.java new file mode 100644 index 0000000..baa9317 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/RoleInArea.java @@ -0,0 +1,12 @@ +package net.hzvtc.system.domain; + +import lombok.Data; +import org.apache.ibatis.type.Alias; + +@Alias("RoleInArea") +@Data +public class RoleInArea { + private Long id; + private Long roleId; + private Long areaId; +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysConfig.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysConfig.java new file mode 100644 index 0000000..99db732 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysConfig.java @@ -0,0 +1,113 @@ +package net.hzvtc.system.domain; + +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.annotation.Excel.ColumnType; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * 参数配置表 sys_config + * + * @author admin + */ +@Alias("SysConfig") +public class SysConfig extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 参数主键 + */ + @Excel(name = "参数主键", cellType = ColumnType.NUMERIC) + private Long configId; + + /** + * 参数名称 + */ + @Excel(name = "参数名称") + private String configName; + + /** + * 参数键名 + */ + @Excel(name = "参数键名") + private String configKey; + + /** + * 参数键值 + */ + @Excel(name = "参数键值") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + @Excel(name = "系统内置", readConverterExp = "Y=是,N=否") + private String configType; + + public Long getConfigId() { + return configId; + } + + public void setConfigId(Long configId) { + this.configId = configId; + } + + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过100个字符") + public String getConfigName() { + return configName; + } + + public void setConfigName(String configName) { + this.configName = configName; + } + + @NotBlank(message = "参数键名长度不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符") + public String getConfigKey() { + return configKey; + } + + public void setConfigKey(String configKey) { + this.configKey = configKey; + } + + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符") + public String getConfigValue() { + return configValue; + } + + public void setConfigValue(String configValue) { + this.configValue = configValue; + } + + public String getConfigType() { + return configType; + } + + public void setConfigType(String configType) { + this.configType = configType; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("configId", getConfigId()) + .append("configName", getConfigName()) + .append("configKey", getConfigKey()) + .append("configValue", getConfigValue()) + .append("configType", getConfigType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysLogininfor.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysLogininfor.java new file mode 100644 index 0000000..f6c0369 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysLogininfor.java @@ -0,0 +1,144 @@ +package net.hzvtc.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.annotation.Excel.ColumnType; +import net.hzvtc.common.core.domain.BaseEntity; + +/** + * 系统访问记录表 sys_logininfor + * + * @author admin + */ +public class SysLogininfor extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "序号", cellType = ColumnType.NUMERIC) + private Long infoId; + + /** 用户账号 */ + @Excel(name = "用户账号") + private String userName; + + /** 登录状态 0成功 1失败 */ + @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败") + private String status; + + /** 登录IP地址 */ + @Excel(name = "登录地址") + private String ipaddr; + + /** 登录地点 */ + @Excel(name = "登录地点") + private String loginLocation; + + /** 浏览器类型 */ + @Excel(name = "浏览器") + private String browser; + + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + + /** 提示消息 */ + @Excel(name = "提示消息") + private String msg; + + /** 访问时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date loginTime; + + public Long getInfoId() + { + return infoId; + } + + public void setInfoId(Long infoId) + { + this.infoId = infoId; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public Date getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Date loginTime) + { + this.loginTime = loginTime; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysNotice.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysNotice.java new file mode 100644 index 0000000..e1071c3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysNotice.java @@ -0,0 +1,85 @@ +package net.hzvtc.system.domain; + +import lombok.Data; +import net.hzvtc.common.core.domain.BaseEntity; +import net.hzvtc.common.xss.Xss; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 通知公告表 sys_notice + * + * @author admin + */ +@Data +@Alias("SysNotice") +public class SysNotice extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空") + @Size(min = 0, max = 50, message = "公告标题不能超过50个字符") + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private Integer status = 1; + + private Long createDept; + + private String createDeptName; + + private String createByName; + + private int isDeleted = 0; + + + private List deptIds; + + private List fileInfoList; + + private List deptList; + + private List readerList; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("noticeId", getNoticeId()) + .append("noticeTitle", getNoticeTitle()) + .append("noticeType", getNoticeType()) + .append("noticeContent", getNoticeContent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysOperLog.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysOperLog.java new file mode 100644 index 0000000..64c7fd2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysOperLog.java @@ -0,0 +1,255 @@ +package net.hzvtc.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.annotation.Excel.ColumnType; +import net.hzvtc.common.core.domain.BaseEntity; + +/** + * 操作日志记录表 oper_log + * + * @author admin + */ +public class SysOperLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 日志主键 */ + @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) + private Long operId; + + /** 操作模块 */ + @Excel(name = "操作模块") + private String title; + + /** 业务类型(0其它 1新增 2修改 3删除) */ + @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + private Integer businessType; + + /** 业务类型数组 */ + private Integer[] businessTypes; + + /** 请求方法 */ + @Excel(name = "请求方法") + private String method; + + /** 请求方式 */ + @Excel(name = "请求方式") + private String requestMethod; + + /** 操作类别(0其它 1后台用户 2手机端用户) */ + @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** 操作人员 */ + @Excel(name = "操作人员") + private String operName; + + /** 部门名称 */ + @Excel(name = "部门名称") + private String deptName; + + /** 请求url */ + @Excel(name = "请求地址") + private String operUrl; + + /** 操作地址 */ + @Excel(name = "操作地址") + private String operIp; + + /** 操作地点 */ + @Excel(name = "操作地点") + private String operLocation; + + /** 请求参数 */ + @Excel(name = "请求参数") + private String operParam; + + /** 返回参数 */ + @Excel(name = "返回参数") + private String jsonResult; + + /** 操作状态(0正常 1异常) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + private Integer status; + + /** 错误消息 */ + @Excel(name = "错误消息") + private String errorMsg; + + /** 操作时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date operTime; + + public Long getOperId() + { + return operId; + } + + public void setOperId(Long operId) + { + this.operId = operId; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public Integer getBusinessType() + { + return businessType; + } + + public void setBusinessType(Integer businessType) + { + this.businessType = businessType; + } + + public Integer[] getBusinessTypes() + { + return businessTypes; + } + + public void setBusinessTypes(Integer[] businessTypes) + { + this.businessTypes = businessTypes; + } + + public String getMethod() + { + return method; + } + + public void setMethod(String method) + { + this.method = method; + } + + public String getRequestMethod() + { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) + { + this.requestMethod = requestMethod; + } + + public Integer getOperatorType() + { + return operatorType; + } + + public void setOperatorType(Integer operatorType) + { + this.operatorType = operatorType; + } + + public String getOperName() + { + return operName; + } + + public void setOperName(String operName) + { + this.operName = operName; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getOperUrl() + { + return operUrl; + } + + public void setOperUrl(String operUrl) + { + this.operUrl = operUrl; + } + + public String getOperIp() + { + return operIp; + } + + public void setOperIp(String operIp) + { + this.operIp = operIp; + } + + public String getOperLocation() + { + return operLocation; + } + + public void setOperLocation(String operLocation) + { + this.operLocation = operLocation; + } + + public String getOperParam() + { + return operParam; + } + + public void setOperParam(String operParam) + { + this.operParam = operParam; + } + + public String getJsonResult() + { + return jsonResult; + } + + public void setJsonResult(String jsonResult) + { + this.jsonResult = jsonResult; + } + + public Integer getStatus() + { + return status; + } + + public void setStatus(Integer status) + { + this.status = status; + } + + public String getErrorMsg() + { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + + public Date getOperTime() + { + return operTime; + } + + public void setOperTime(Date operTime) + { + this.operTime = operTime; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysPost.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysPost.java new file mode 100644 index 0000000..e86a4c1 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysPost.java @@ -0,0 +1,124 @@ +package net.hzvtc.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.annotation.Excel.ColumnType; + +/** + * 岗位表 sys_post + * + * @author admin + */ +public class SysPost extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 岗位序号 */ + @Excel(name = "岗位序号", cellType = ColumnType.NUMERIC) + private Long postId; + + /** 岗位编码 */ + @Excel(name = "岗位编码") + private String postCode; + + /** 岗位名称 */ + @Excel(name = "岗位名称") + private String postName; + + /** 岗位排序 */ + @Excel(name = "岗位排序") + private String postSort; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 用户是否存在此岗位标识 默认不存在 */ + private boolean flag = false; + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符") + public String getPostCode() + { + return postCode; + } + + public void setPostCode(String postCode) + { + this.postCode = postCode; + } + + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符") + public String getPostName() + { + return postName; + } + + public void setPostName(String postName) + { + this.postName = postName; + } + + @NotBlank(message = "显示顺序不能为空") + public String getPostSort() + { + return postSort; + } + + public void setPostSort(String postSort) + { + this.postSort = postSort; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("postId", getPostId()) + .append("postCode", getPostCode()) + .append("postName", getPostName()) + .append("postSort", getPostSort()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleDept.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleDept.java new file mode 100644 index 0000000..81b4186 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleDept.java @@ -0,0 +1,46 @@ +package net.hzvtc.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 角色和部门关联 sys_role_dept + * + * @author admin + */ +public class SysRoleDept +{ + /** 角色ID */ + private Long roleId; + + /** 部门ID */ + private Long deptId; + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("deptId", getDeptId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleMenu.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..4791775 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysRoleMenu.java @@ -0,0 +1,47 @@ +package net.hzvtc.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author admin + */ +@Alias("SysRoleMenu") +public class SysRoleMenu { + /** + * 角色ID + */ + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("menuId", getMenuId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserOnline.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserOnline.java new file mode 100644 index 0000000..880e13f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserOnline.java @@ -0,0 +1,113 @@ +package net.hzvtc.system.domain; + +/** + * 当前在线会话 + * + * @author admin + */ +public class SysUserOnline +{ + /** 会话编号 */ + private String tokenId; + + /** 部门名称 */ + private String deptName; + + /** 用户名称 */ + private String userName; + + /** 登录IP地址 */ + private String ipaddr; + + /** 登录地址 */ + private String loginLocation; + + /** 浏览器类型 */ + private String browser; + + /** 操作系统 */ + private String os; + + /** 登录时间 */ + private Long loginTime; + + public String getTokenId() + { + return tokenId; + } + + public void setTokenId(String tokenId) + { + this.tokenId = tokenId; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserPost.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserPost.java new file mode 100644 index 0000000..732d910 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserPost.java @@ -0,0 +1,31 @@ +package net.hzvtc.system.domain; + +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 用户和岗位关联 sys_user_post + * + * @author admin + */ +@Alias("SysUserPost") +@Data +public class SysUserPost +{ + /** 用户ID */ + private Long userId; + + /** 岗位ID */ + private Long postId; + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("postId", getPostId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserRole.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserRole.java new file mode 100644 index 0000000..e9846f0 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/SysUserRole.java @@ -0,0 +1,47 @@ +package net.hzvtc.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 用户和角色关联 sys_user_role + * + * @author admin + */ +@Alias("SysUserRole") +public class SysUserRole { + /** + * 用户ID + */ + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("roleId", getRoleId()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/DocStateCountVO.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/DocStateCountVO.java new file mode 100644 index 0000000..c6c3aaa --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/DocStateCountVO.java @@ -0,0 +1,11 @@ +package net.hzvtc.system.domain.vo; + +import lombok.Data; +import org.apache.ibatis.type.Alias; + +@Alias("DocStateCountVO") +@Data +public class DocStateCountVO { + private Integer state; + private int count = 0; +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MessageVo.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MessageVo.java new file mode 100644 index 0000000..57b1b6a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MessageVo.java @@ -0,0 +1,23 @@ +package net.hzvtc.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +@Data +@Alias("MessageVo") +public class MessageVo { + private Long id; + private String title; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date time; + private String mediaUrl; + private int msgType; + private Long readId; + + public boolean isRead() { + return readId == null ? false : true; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MetaVo.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..37f25b0 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/MetaVo.java @@ -0,0 +1,106 @@ +package net.hzvtc.system.domain.vo; + +import net.hzvtc.common.utils.StringUtils; + +/** + * 路由显示信息 + * + * @author admin + */ +public class MetaVo +{ + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo() + { + } + + public MetaVo(String title, String icon) + { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) + { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) + { + this.link = link; + } + } + + public boolean isNoCache() + { + return noCache; + } + + public void setNoCache(boolean noCache) + { + this.noCache = noCache; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public String getLink() + { + return link; + } + + public void setLink(String link) + { + this.link = link; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/RouterVo.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..e790e97 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/domain/vo/RouterVo.java @@ -0,0 +1,63 @@ +package net.hzvtc.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.List; + +/** + * 路由配置信息 + * + * @author admin + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@Data +public class RouterVo { + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + + private boolean showMenu; + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MenuInSysMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MenuInSysMapper.java new file mode 100644 index 0000000..33efede --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MenuInSysMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.system.mapper; + +import java.util.List; +import net.hzvtc.system.domain.MenuInSys; + +/** + * 系统菜单Mapper接口 + * + * @author admin + * @date 2023-10-23 + */ +public interface MenuInSysMapper +{ + /** + * 查询系统菜单 + * + * @param id 系统菜单主键 + * @return 系统菜单 + */ + public MenuInSys selectMenuInSysById(Long id); + + /** + * 查询系统菜单列表 + * + * @param menuInSys 系统菜单 + * @return 系统菜单集合 + */ + public List selectMenuInSysList(MenuInSys menuInSys); + + /** + * 新增系统菜单 + * + * @param menuInSys 系统菜单 + * @return 结果 + */ + public int insertMenuInSys(MenuInSys menuInSys); + + /** + * 修改系统菜单 + * + * @param menuInSys 系统菜单 + * @return 结果 + */ + public int updateMenuInSys(MenuInSys menuInSys); + + /** + * 删除系统菜单 + * + * @param id 系统菜单主键 + * @return 结果 + */ + public int deleteMenuInSysById(Long id); + + /** + * 批量删除系统菜单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMenuInSysByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MessageReadInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MessageReadInfoMapper.java new file mode 100644 index 0000000..7a2cdba --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/MessageReadInfoMapper.java @@ -0,0 +1,63 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.system.domain.MessageReadInfo; + +import java.util.List; + +/** + * 信息阅读情况Mapper接口 + * + * @author admin + * @date 2023-10-20 + */ +public interface MessageReadInfoMapper { + /** + * 查询信息阅读情况 + * + * @param id 信息阅读情况主键 + * @return 信息阅读情况 + */ + public MessageReadInfo selectMessageReadInfoById(Long id); + + List selectMessageReadInfoListByParam(MessageReadInfo messageReadInfo); + + /** + * 查询信息阅读情况列表 + * + * @param messageReadInfo 信息阅读情况 + * @return 信息阅读情况集合 + */ + public List selectMessageReadInfoList(MessageReadInfo messageReadInfo); + + /** + * 新增信息阅读情况 + * + * @param messageReadInfo 信息阅读情况 + * @return 结果 + */ + public int insertMessageReadInfo(MessageReadInfo messageReadInfo); + + /** + * 修改信息阅读情况 + * + * @param messageReadInfo 信息阅读情况 + * @return 结果 + */ + public int updateMessageReadInfo(MessageReadInfo messageReadInfo); + + /** + * 删除信息阅读情况 + * + * @param id 信息阅读情况主键 + * @return 结果 + */ + public int deleteMessageReadInfoById(Long id); + + /** + * 批量删除信息阅读情况 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMessageReadInfoByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeFileInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeFileInfoMapper.java new file mode 100644 index 0000000..154fe73 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeFileInfoMapper.java @@ -0,0 +1,59 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.system.domain.NoticeFileInfo; + +import java.util.List; +import java.util.Map; + +/** + * 通知公告附件Mapper接口 + * + * @author admin + * @date 2022-05-02 + */ +public interface NoticeFileInfoMapper { + /** + * 查询通知公告附件 + * + * @param id 通知公告附件主键 + * @return 通知公告附件 + */ + public NoticeFileInfo selectNoticeFileInfoById(Long id); + + /** + * 查询通知公告附件列表 + * + * @param noticeFileInfo 通知公告附件 + * @return 通知公告附件集合 + */ + public List selectNoticeFileInfoList(NoticeFileInfo noticeFileInfo); + + public List getNoticeFileInfoListByPid(Long id); + + /** + * 新增通知公告附件 + * + * @param noticeFileInfo 通知公告附件 + * @return 结果 + */ + public int insertNoticeFileInfo(NoticeFileInfo noticeFileInfo); + + int batchInsertNoticeFileInfo(List list); + + + /** + * 删除通知公告附件 + * + * @param id 通知公告附件主键 + * @return 结果 + */ + public int deleteNoticeFileInfoById(Long id); + + /** + * 批量删除通知公告附件 + * + * @param map 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteNoticeFileInfoNotInIds(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReadDeptMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReadDeptMapper.java new file mode 100644 index 0000000..c5b5f1a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReadDeptMapper.java @@ -0,0 +1,49 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.system.domain.NoticeReadDept; + +import java.util.List; + +/** + * 公告阅读范围Mapper接口 + * + * @author admin + * @date 2022-05-02 + */ +public interface NoticeReadDeptMapper { + /** + * 查询公告阅读范围 + * + * @param id 公告阅读范围主键 + * @return 公告阅读范围 + */ + public NoticeReadDept selectNoticeReadDeptById(Long id); + + /** + * 查询公告阅读范围列表 + * + * @param noticeReadDept 公告阅读范围 + * @return 公告阅读范围集合 + */ + public List selectNoticeReadDeptList(NoticeReadDept noticeReadDept); + + public List getNoticeReadDeptListByPid(Long id); + + /** + * 新增公告阅读范围 + * + * @param noticeReadDept 公告阅读范围 + * @return 结果 + */ + public int insertNoticeReadDept(NoticeReadDept noticeReadDept); + + int batchInsertNoticeReadDept(List list); + + /** + * 删除公告阅读范围 + * + * @param id 公告阅读范围主键 + * @return 结果 + */ + public int deleteNoticeReadDeptByNoticeId(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReaderMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReaderMapper.java new file mode 100644 index 0000000..c51e780 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/NoticeReaderMapper.java @@ -0,0 +1,40 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.system.domain.NoticeReader; + +import java.util.List; + +/** + * 公告阅读人员Mapper接口 + * + * @author admin + * @date 2022-05-02 + */ +public interface NoticeReaderMapper { + + /** + * 查询公告阅读人员列表 + * + * @param noticeId 公告阅读人员 + * @return 公告阅读人员集合 + */ + public List selectNoticeReaderListByPid(Long noticeId); + + /** + * 新增公告阅读人员 + * + * @param noticeReader 公告阅读人员 + * @return 结果 + */ + public int insertNoticeReader(NoticeReader noticeReader); + + + /** + * 删除公告阅读人员 + * + * @param id 公告阅读人员主键 + * @return 结果 + */ + public int deleteNoticeReaderById(Long id); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysConfigMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..7213c2b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysConfigMapper.java @@ -0,0 +1,68 @@ +package net.hzvtc.system.mapper; + +import java.util.List; +import net.hzvtc.system.domain.SysConfig; + +/** + * 参数配置 数据层 + * + * @author admin + */ +public interface SysConfigMapper +{ + /** + * 查询参数配置信息 + * + * @param config 参数配置信息 + * @return 参数配置信息 + */ + public SysConfig selectConfig(SysConfig config); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(SysConfig config); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数配置信息 + */ + public SysConfig checkConfigKeyUnique(String configKey); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(SysConfig config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(SysConfig config); + + /** + * 删除参数配置 + * + * @param configId 参数ID + * @return 结果 + */ + public int deleteConfigById(Long configId); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + public int deleteConfigByIds(Long[] configIds); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDeptMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..c33237b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDeptMapper.java @@ -0,0 +1,143 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.common.core.domain.entity.SysDept; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 部门管理 数据层 + * + * @author admin + */ +public interface SysDeptMapper { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + List selectDeptList(SysDept dept); + + List selectDeptDeviceCountList(SysDept dept); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + SysDept selectDeptById(Long deptId); + + SysDept getSysDeptInfoForList(Long id); + + List getSysDeptFullPathByParam(Long deptId); + + List getSysDeptListInIds(List list); + + List getSysDeptListByParentId(Long parentId); + + List getSysDeptChildrenByParentId(Long parentId); + + List getSysDeptTreeListByIds(List list); + + List getSysDeptListByAncestors(String ancestors); + + void updateSysdeptAncestorPath(SysDept sysDept); + + /** + * 根据ID查询所有子部门 + * + * @param deptId 部门ID + * @return 部门列表 + */ + List selectChildrenDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + int hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 + */ + int checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param deptName 部门名称 + * @param parentId 父部门ID + * @return 结果 + */ + SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId); + + /** + * 新增部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + int insertDept(SysDept dept); + + /** + * 修改部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + int updateDept(SysDept dept); + + /** + * 修改所在部门正常状态 + * + * @param deptIds 部门ID组 + */ + void updateDeptStatusNormal(Long[] deptIds); + + /** + * 修改子元素关系 + * + * @param depts 子元素 + * @return 结果 + */ + int updateDeptChildren(@Param("depts") List depts); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + int deleteDeptById(Long deptId); + + String getDeptAncestorsById(Long id); + + List getDeptSubIdsById(Long deptId); + + List getDeptAreaListByDevices(List deviceIds); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictDataMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..54486cf --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictDataMapper.java @@ -0,0 +1,98 @@ +package net.hzvtc.system.mapper; + +import java.util.List; + +import net.hzvtc.common.core.domain.entity.SysDictData; +import org.apache.ibatis.annotations.Param; + +/** + * 字典表 数据层 + * + * @author admin + */ +public interface SysDictDataMapper +{ + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据 + */ + public int countDictDataByType(String dictType); + + /** + * 通过字典ID删除字典数据信息 + * + * @param dictCode 字典数据ID + * @return 结果 + */ + public int deleteDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(SysDictData dictData); + + /** + * 修改字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(SysDictData dictData); + + /** + * 同步修改字典类型 + * + * @param oldDictType 旧字典类型 + * @param newDictType 新旧字典类型 + * @return 结果 + */ + public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType); + + List getDictDataListForSel(String dictType); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictTypeMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..3637f1f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,86 @@ +package net.hzvtc.system.mapper; + +import java.util.List; + +import net.hzvtc.common.core.domain.entity.SysDictType; +import org.apache.ibatis.annotations.Mapper; + +/** + * 字典表 数据层 + * + * @author admin + */ +@Mapper +public interface SysDictTypeMapper +{ + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 通过字典ID删除字典信息 + * + * @param dictId 字典ID + * @return 结果 + */ + public int deleteDictTypeById(Long dictId); + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds); + + /** + * 新增字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(SysDictType dictType); + + /** + * 修改字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public SysDictType checkDictTypeUnique(String dictType); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysLogininforMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..7ee82d7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysLogininforMapper.java @@ -0,0 +1,42 @@ +package net.hzvtc.system.mapper; + +import java.util.List; +import net.hzvtc.system.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 数据层 + * + * @author admin + */ +public interface SysLogininforMapper +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + * + * @return 结果 + */ + public int cleanLogininfor(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysMenuMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..3c579aa --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysMenuMapper.java @@ -0,0 +1,118 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.common.core.domain.entity.SysMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 菜单表 数据层 + * + * @author admin + */ +public interface SysMenuMapper { + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuList(SysMenu menu); + + /** + * 根据用户所有权限 + * + * @return 权限列表 + */ + public List selectMenuPerms(); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuListByUserId(SysMenu menu); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public List selectMenuPermsByUserId(Long userId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + public List selectMenuTreeAll(Integer sysId); + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Map map); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int hasChildByMenuId(Long menuId); + + /** + * 新增菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(SysMenu menu); + + /** + * 修改菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(SysMenu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menuName 菜单名称 + * @param parentId 父菜单ID + * @return 结果 + */ + public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysNoticeMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..545bff1 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysNoticeMapper.java @@ -0,0 +1,73 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.system.domain.SysNotice; +import net.hzvtc.system.domain.vo.DocStateCountVO; +import net.hzvtc.system.domain.vo.MessageVo; + +import java.util.List; + +/** + * 通知公告表 数据层 + * + * @author admin + */ +public interface SysNoticeMapper { + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + SysNotice selectNoticeById(Long noticeId); + + SysNotice getNoticeForMobileById(Long noticeId); + + + public List getSysNoticeCountGroupByState(Long deptId); + + SysNotice getLastedNoticeByParam(); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + public List selectNoticeList(SysNotice notice); + + List getSysNoticePubListByParam(SysNotice notice); + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int insertNotice(SysNotice notice); + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int updateNotice(SysNotice notice); + + /** + * 批量删除公告 + * + * @param noticeId 公告ID + * @return 结果 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long[] noticeIds); + + int getUnreadAmountByUserId(Long userId); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysOperLogMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..8baed37 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysOperLogMapper.java @@ -0,0 +1,48 @@ +package net.hzvtc.system.mapper; + +import java.util.List; +import net.hzvtc.system.domain.SysOperLog; + +/** + * 操作日志 数据层 + * + * @author admin + */ +public interface SysOperLogMapper +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysPostMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..774246a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysPostMapper.java @@ -0,0 +1,99 @@ +package net.hzvtc.system.mapper; + +import java.util.List; +import net.hzvtc.system.domain.SysPost; + +/** + * 岗位信息 数据层 + * + * @author admin + */ +public interface SysPostMapper +{ + /** + * 查询岗位数据集合 + * + * @param post 岗位信息 + * @return 岗位数据集合 + */ + public List selectPostList(SysPost post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public SysPost selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public List selectPostsByUserName(String userName); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 修改岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(SysPost post); + + /** + * 新增岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(SysPost post); + + /** + * 校验岗位名称 + * + * @param postName 岗位名称 + * @return 结果 + */ + public SysPost checkPostNameUnique(String postName); + + /** + * 校验岗位编码 + * + * @param postCode 岗位编码 + * @return 结果 + */ + public SysPost checkPostCodeUnique(String postCode); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleDeptMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..62d9c64 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,44 @@ +package net.hzvtc.system.mapper; + +import java.util.List; +import net.hzvtc.system.domain.SysRoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author admin + */ +public interface SysRoleDeptMapper +{ + /** + * 通过角色ID删除角色和部门关联 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleDeptByRoleId(Long roleId); + + /** + * 批量删除角色部门关联信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteRoleDept(Long[] ids); + + /** + * 查询部门使用数量 + * + * @param deptId 部门ID + * @return 结果 + */ + public int selectCountRoleDeptByDeptId(Long deptId); + + /** + * 批量新增角色部门信息 + * + * @param roleDeptList 角色部门列表 + * @return 结果 + */ + public int batchRoleDept(List roleDeptList); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..b6308bc --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMapper.java @@ -0,0 +1,107 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.common.core.domain.entity.SysRole; + +import java.util.List; + +/** + * 角色表 数据层 + * + * @author admin + */ +public interface SysRoleMapper { + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(SysRole role); + + /** + * 根据用户ID查询角色 + * + * @param param 用户ID + * @return 角色列表 + */ + public List selectRolePermissionByUserId(SysRole param); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userName 用户名 + * @return 角色列表 + */ + public List selectRolesByUserName(String userName); + + /** + * 校验角色名称是否唯一 + * + * @param roleName 角色名称 + * @return 角色信息 + */ + public SysRole checkRoleNameUnique(String roleName); + + /** + * 校验角色权限是否唯一 + * + * @param roleKey 角色权限 + * @return 角色信息 + */ + public SysRole checkRoleKeyUnique(String roleKey); + + /** + * 修改角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(SysRole role); + + /** + * 新增角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMenuMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..8ccb31c --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,53 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.system.domain.RoleInArea; +import net.hzvtc.system.domain.SysRoleMenu; + +import java.util.List; + +/** + * 角色与菜单关联表 数据层 + * + * @author admin + */ +public interface SysRoleMenuMapper { + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + int checkMenuExistRole(Long menuId); + + /** + * 通过角色ID删除角色和菜单关联 + * + * @param roleId 角色ID + * @return 结果 + */ + int deleteRoleMenuByRoleId(Long roleId); + + /** + * 批量删除角色菜单关联信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + int deleteRoleMenu(Long[] ids); + + int deleteAreaIdByRoleId(Long roleId); + + /** + * 批量新增角色菜单信息 + * + * @param roleMenuList 角色菜单列表 + * @return 结果 + */ + int batchRoleMenu(List roleMenuList); + + int batchInsertArea(List list); + + List getRoleInAreaListByUserId(Long userId); + + List getAllAreaList(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..2f8f8f5 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserMapper.java @@ -0,0 +1,133 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.common.core.domain.entity.SysUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户表 数据层 + * + * @author admin + */ +public interface SysUserMapper { + /** + * 根据条件分页查询用户列表 + * + * @param sysUser 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser sysUser); + + /** + * 根据条件分页查询未已配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(SysUser sysUser); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + int updateUserPassword(SysUser user); + + int updateUserStatus(SysUser user); + + public int updateUserProfile(SysUser user); + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(@Param("userName") String userName, @Param("password") String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + public int checkUserNameUnique(String userName); + + /** + * 校验手机号码是否唯一 + * + * @param phonenumber 手机号码 + * @return 结果 + */ + public SysUser checkPhoneUnique(String phonenumber); + + /** + * 校验email是否唯一 + * + * @param email 用户邮箱 + * @return 结果 + */ + public SysUser checkEmailUnique(String email); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserPostMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..b86476f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserPostMapper.java @@ -0,0 +1,46 @@ +package net.hzvtc.system.mapper; + +import java.util.List; + +import net.hzvtc.system.domain.SysUserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author admin + */ +public interface SysUserPostMapper { + /** + * 通过用户ID删除用户和岗位关联 + * + * @param userId 用户ID + * @return 结果 + */ + int deleteUserPostByUserId(Long userId); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + int countUserPostById(Long postId); + + /** + * 批量删除用户和岗位关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + int deleteUserPost(Long[] ids); + + /** + * 批量新增用户岗位信息 + * + * @param userPostList 用户角色列表 + * @return 结果 + */ + int batchUserPost(List userPostList); + + List getPostListByUserId(Long userId); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserRoleMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..e6c0b0f --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,63 @@ +package net.hzvtc.system.mapper; + +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.system.domain.SysUserRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户与角色关联表 数据层 + * + * @author admin + */ +public interface SysUserRoleMapper { + /** + * 通过用户ID删除用户和角色关联 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserRoleByUserId(SysUser sysUser); + + /** + * 批量删除用户和角色关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUserRole(Long[] ids); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 批量新增用户角色信息 + * + * @param userRoleList 用户角色列表 + * @return 结果 + */ + public int batchUserRole(List userRoleList); + + /** + * 删除用户和角色关联信息 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteUserRoleInfo(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/MenuInSysService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/MenuInSysService.java new file mode 100644 index 0000000..18119e4 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/MenuInSysService.java @@ -0,0 +1,61 @@ +package net.hzvtc.system.service; + +import java.util.List; + +import net.hzvtc.system.domain.MenuInSys; + +/** + * 系统菜单Service接口 + * + * @author admin + * @date 2023-10-23 + */ +public interface MenuInSysService { + /** + * 查询系统菜单 + * + * @param id 系统菜单主键 + * @return 系统菜单 + */ + public MenuInSys selectMenuInSysById(Long id); + + /** + * 查询系统菜单列表 + * + * @param menuInSys 系统菜单 + * @return 系统菜单集合 + */ + public List selectMenuInSysList(MenuInSys menuInSys); + + /** + * 新增系统菜单 + * + * @param menuInSys 系统菜单 + * @return 结果 + */ + public int insertMenuInSys(MenuInSys menuInSys); + + /** + * 修改系统菜单 + * + * @param menuInSys 系统菜单 + * @return 结果 + */ + public int updateMenuInSys(MenuInSys menuInSys); + + /** + * 批量删除系统菜单 + * + * @param ids 需要删除的系统菜单主键集合 + * @return 结果 + */ + public int deleteMenuInSysByIds(Long[] ids); + + /** + * 删除系统菜单信息 + * + * @param id 系统菜单主键 + * @return 结果 + */ + public int deleteMenuInSysById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/MessageReadInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/MessageReadInfoService.java new file mode 100644 index 0000000..3c2a743 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/MessageReadInfoService.java @@ -0,0 +1,61 @@ +package net.hzvtc.system.service; + +import java.util.List; + +import net.hzvtc.system.domain.MessageReadInfo; + +/** + * 信息阅读情况Service接口 + * + * @author admin + * @date 2023-10-20 + */ +public interface MessageReadInfoService { + /** + * 查询信息阅读情况 + * + * @param id 信息阅读情况主键 + * @return 信息阅读情况 + */ + public MessageReadInfo selectMessageReadInfoById(Long id); + + /** + * 查询信息阅读情况列表 + * + * @param messageReadInfo 信息阅读情况 + * @return 信息阅读情况集合 + */ + public List selectMessageReadInfoList(MessageReadInfo messageReadInfo); + + /** + * 新增信息阅读情况 + * + * @param messageReadInfo 信息阅读情况 + * @return 结果 + */ + public int insertMessageReadInfo(MessageReadInfo messageReadInfo); + + /** + * 修改信息阅读情况 + * + * @param messageReadInfo 信息阅读情况 + * @return 结果 + */ + public int updateMessageReadInfo(MessageReadInfo messageReadInfo); + + /** + * 批量删除信息阅读情况 + * + * @param ids 需要删除的信息阅读情况主键集合 + * @return 结果 + */ + public int deleteMessageReadInfoByIds(Long[] ids); + + /** + * 删除信息阅读情况信息 + * + * @param id 信息阅读情况主键 + * @return 结果 + */ + public int deleteMessageReadInfoById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeFileInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeFileInfoService.java new file mode 100644 index 0000000..b8332b3 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeFileInfoService.java @@ -0,0 +1,56 @@ +package net.hzvtc.system.service; + +import net.hzvtc.system.domain.NoticeFileInfo; + +import java.util.List; +import java.util.Map; + +/** + * 通知公告附件Service接口 + * + * @author admin + * @date 2022-05-02 + */ +public interface NoticeFileInfoService { + /** + * 查询通知公告附件 + * + * @param id 通知公告附件主键 + * @return 通知公告附件 + */ + public NoticeFileInfo selectNoticeFileInfoById(Long id); + + /** + * 查询通知公告附件列表 + * + * @param noticeFileInfo 通知公告附件 + * @return 通知公告附件集合 + */ + public List selectNoticeFileInfoList(NoticeFileInfo noticeFileInfo); + + /** + * 新增通知公告附件 + * + * @param noticeFileInfo 通知公告附件 + * @return 结果 + */ + public int insertNoticeFileInfo(NoticeFileInfo noticeFileInfo); + + int batchInsertNoticeFileInfo(List list); + + /** + * 批量删除通知公告附件 + * + * @param ids 需要删除的通知公告附件主键集合 + * @return 结果 + */ + public int deleteNoticeFileInfoNotInIds(Map map); + + /** + * 删除通知公告附件信息 + * + * @param id 通知公告附件主键 + * @return 结果 + */ + public int deleteNoticeFileInfoById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReadDeptService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReadDeptService.java new file mode 100644 index 0000000..c3dfad5 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReadDeptService.java @@ -0,0 +1,47 @@ +package net.hzvtc.system.service; + +import net.hzvtc.system.domain.NoticeReadDept; + +import java.util.List; + +/** + * 公告阅读范围Service接口 + * + * @author admin + * @date 2022-05-02 + */ +public interface NoticeReadDeptService { + /** + * 查询公告阅读范围 + * + * @param id 公告阅读范围主键 + * @return 公告阅读范围 + */ + public NoticeReadDept selectNoticeReadDeptById(Long id); + + /** + * 查询公告阅读范围列表 + * + * @param noticeReadDept 公告阅读范围 + * @return 公告阅读范围集合 + */ + public List selectNoticeReadDeptList(NoticeReadDept noticeReadDept); + + /** + * 新增公告阅读范围 + * + * @param noticeReadDept 公告阅读范围 + * @return 结果 + */ + public int insertNoticeReadDept(NoticeReadDept noticeReadDept); + + int batchInsertNoticeReadDept(List list); + + /** + * 删除公告阅读范围信息 + * + * @param id 公告阅读范围主键 + * @return 结果 + */ + public int deleteNoticeReadDeptByNoticeId(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReaderService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReaderService.java new file mode 100644 index 0000000..b96e2a6 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/NoticeReaderService.java @@ -0,0 +1,39 @@ +package net.hzvtc.system.service; + +import net.hzvtc.system.domain.NoticeReader; + +import java.util.List; + +/** + * 公告阅读人员Service接口 + * + * @author admin + * @date 2022-05-02 + */ +public interface NoticeReaderService { + + /** + * 查询公告阅读人员列表 + * + * @param noticeId 公告阅读人员 + * @return 公告阅读人员集合 + */ + public List selectNoticeReaderListByPid(Long noticeId); + + /** + * 新增公告阅读人员 + * + * @param noticeReader 公告阅读人员 + * @return 结果 + */ + public int insertNoticeReader(NoticeReader noticeReader); + + + /** + * 删除公告阅读人员信息 + * + * @param id 公告阅读人员主键 + * @return 结果 + */ + public int deleteNoticeReaderById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysConfigService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysConfigService.java new file mode 100644 index 0000000..d928a44 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysConfigService.java @@ -0,0 +1,90 @@ +package net.hzvtc.system.service; + +import net.hzvtc.system.domain.SysConfig; + +import java.util.List; + +/** + * 参数配置 服务层 + * + * @author admin + */ +public interface SysConfigService { + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + public SysConfig selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + public String selectConfigByKey(String configKey); + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + public boolean selectCaptchaOnOff(); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(SysConfig config); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(SysConfig config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(SysConfig config); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + public void deleteConfigByIds(Long[] configIds); + + /** + * 加载参数缓存数据 + */ + public void loadingConfigCache(); + + /** + * 清空参数缓存数据 + */ + public void clearConfigCache(); + + /** + * 重置参数缓存数据 + */ + public void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + public String checkConfigKeyUnique(SysConfig config); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDeptService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDeptService.java new file mode 100644 index 0000000..cd817b2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDeptService.java @@ -0,0 +1,143 @@ +package net.hzvtc.system.service; + +import net.hzvtc.common.core.domain.TreeSelect; +import net.hzvtc.common.core.domain.entity.SysDept; + +import java.util.List; + +/** + * 部门管理 服务层 + * + * @author admin + */ +public interface SysDeptService { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + List selectDeptList(SysDept dept); + + List selectDeptDeviceCountList(SysDept dept); + + List getDeptList(SysDept dept); + + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + List buildDeptTree(List depts); + + List getSysDeptListInIds(List list); + + + void updateDeptAncestorPath(SysDept sysDept); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + List buildDeptTreeSelect(List depts); + + List buildDeptTreeSelectByIds(List ids); + + List buildLazyDeptTreeSelect(Long parentId); + + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + List selectDeptListByRoleId(Long roleId); + + List getSysDeptFullPathByParam(Long deptId); + + //void updateDeptFullPath(Long deptId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + SysDept selectDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + String checkDeptNameUnique(SysDept dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + int insertDept(SysDept dept); + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + int updateDept(SysDept dept); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + int deleteDeptById(Long deptId); + + String getDeptAncestorsById(Long id); + + List getSysDeptAncestorsIdsById(Long deptId); + + List getDeptSubIdsById(Long deptId); + + List getDeptAreaListByDevices(List deviceIds); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictDataService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictDataService.java new file mode 100644 index 0000000..e41dc5e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictDataService.java @@ -0,0 +1,63 @@ +package net.hzvtc.system.service; + +import net.hzvtc.common.core.domain.entity.SysDictData; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author admin + */ +public interface SysDictDataService { + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + public void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(SysDictData dictData); + + /** + * 修改保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(SysDictData dictData); + + List getDictDataListForSel(String dictType); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictTypeService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictTypeService.java new file mode 100644 index 0000000..4077730 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysDictTypeService.java @@ -0,0 +1,99 @@ +package net.hzvtc.system.service; + +import net.hzvtc.common.core.domain.entity.SysDictData; +import net.hzvtc.common.core.domain.entity.SysDictType; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author admin + */ +public interface SysDictTypeService { + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + public void deleteDictTypeByIds(Long[] dictIds); + + /** + * 加载字典缓存数据 + */ + public void loadingDictCache(); + + /** + * 清空字典缓存数据 + */ + public void clearDictCache(); + + /** + * 重置字典缓存数据 + */ + public void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(SysDictType dictType); + + /** + * 修改保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public String checkDictTypeUnique(SysDictType dictType); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysLogininforService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysLogininforService.java new file mode 100644 index 0000000..6e5babc --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysLogininforService.java @@ -0,0 +1,40 @@ +package net.hzvtc.system.service; + +import net.hzvtc.system.domain.SysLogininfor; + +import java.util.List; + +/** + * 系统访问日志情况信息 服务层 + * + * @author admin + */ +public interface SysLogininforService { + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + public void cleanLogininfor(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysMenuService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysMenuService.java new file mode 100644 index 0000000..c8070ca --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysMenuService.java @@ -0,0 +1,136 @@ +package net.hzvtc.system.service; + +import net.hzvtc.common.core.domain.TreeSelect; +import net.hzvtc.common.core.domain.entity.SysMenu; +import net.hzvtc.system.domain.vo.RouterVo; + +import java.util.List; +import java.util.Set; + +/** + * 菜单 业务层 + * + * @author admin + */ +public interface SysMenuService { + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(Long userId, Integer sysId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(SysMenu menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectMenuPermsByUserId(Long userId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Long userId, Integer sysId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(Long roleId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + public List buildMenus(List menus); + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + public List buildMenuTree(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + public List buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(SysMenu menu); + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(SysMenu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + public String checkMenuNameUnique(SysMenu menu); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysNoticeService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysNoticeService.java new file mode 100644 index 0000000..47fd6a1 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysNoticeService.java @@ -0,0 +1,74 @@ +package net.hzvtc.system.service; + +import com.alibaba.fastjson.JSONArray; +import net.hzvtc.system.domain.SysNotice; +import net.hzvtc.system.domain.vo.DocStateCountVO; +import net.hzvtc.system.domain.vo.MessageVo; + +import java.util.List; + +/** + * 公告 服务层 + * + * @author admin + */ +public interface SysNoticeService { + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + public SysNotice selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + public List selectNoticeList(SysNotice notice); + + public List getSysNoticeCountGroupByState(Long deptId); + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int insertNotice(SysNotice notice); + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int updateNotice(SysNotice notice); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long[] noticeIds); + + JSONArray getMessageCatalogueList(); + + JSONArray getUnreadMessageCatalogueList(); + + List getMessageInfoList(String title); + + SysNotice getNoticeForMobileById(Long noticeId); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysOperLogService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysOperLogService.java new file mode 100644 index 0000000..8199489 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysOperLogService.java @@ -0,0 +1,48 @@ +package net.hzvtc.system.service; + +import net.hzvtc.system.domain.SysOperLog; + +import java.util.List; + +/** + * 操作日志 服务层 + * + * @author admin + */ +public interface SysOperLogService { + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysPostService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysPostService.java new file mode 100644 index 0000000..3510702 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysPostService.java @@ -0,0 +1,100 @@ +package net.hzvtc.system.service; + +import net.hzvtc.system.domain.SysPost; + +import java.util.List; + +/** + * 岗位信息 服务层 + * + * @author admin + */ +public interface SysPostService { + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + public List selectPostList(SysPost post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public SysPost selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + public String checkPostNameUnique(SysPost post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + public String checkPostCodeUnique(SysPost post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + * @throws Exception 异常 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(SysPost post); + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(SysPost post); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysRoleService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysRoleService.java new file mode 100644 index 0000000..e2e0147 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysRoleService.java @@ -0,0 +1,176 @@ +package net.hzvtc.system.service; + +import net.hzvtc.common.core.domain.entity.SysRole; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.system.domain.SysUserRole; + +import java.util.List; +import java.util.Set; + +/** + * 角色业务层 + * + * @author admin + */ +public interface SysRoleService { + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(SysRole role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolesByUserId(SysRole param); + + /** + * 根据用户ID查询角色权限 + * + * @param sysRole 用户ID + * @return 权限列表 + */ + public Set selectRolePermissionByUserId(SysRole sysRole); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List selectRoleAll(SysRole sysRole); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public String checkRoleNameUnique(SysRole role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public String checkRoleKeyUnique(SysRole role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + public void checkRoleAllowed(SysRole role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + public void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(SysRole role); + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(SysRole role); + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRoleStatus(SysRole role); + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int authDataScope(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + public int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int insertAuthUsers(Long roleId, Long[] userIds); + + Set getAreaIdsByUserId(SysUser user); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserOnlineService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserOnlineService.java new file mode 100644 index 0000000..3a184ef --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserOnlineService.java @@ -0,0 +1,47 @@ +package net.hzvtc.system.service; + +import net.hzvtc.common.core.domain.model.LoginUser; +import net.hzvtc.system.domain.SysUserOnline; + +/** + * 在线用户 服务层 + * + * @author admin + */ +public interface SysUserOnlineService { + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + public SysUserOnline loginUserToUserOnline(LoginUser user); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserService.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserService.java new file mode 100644 index 0000000..a92ff9b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/SysUserService.java @@ -0,0 +1,209 @@ +package net.hzvtc.system.service; + +import net.hzvtc.common.core.domain.entity.SysUser; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author admin + */ +public interface SysUserService { + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser user); + + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param sysUser 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(SysUser sysUser); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserRoleGroup(String userName); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserPostGroup(String userName); + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + public String checkUserNameUnique(String userName); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public String checkPhoneUnique(SysUser user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public String checkEmailUnique(SysUser user); + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + public void checkUserAllowed(SysUser user); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + public void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + void insertUserRole(SysUser user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean registerUser(SysUser user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserAuth(Long userId, Integer sysId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserStatus(SysUser user); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserProfile(SysUser user); + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + public boolean updateUserAvatar(String userName, String avatar); + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + public int resetPwd(SysUser user); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(String userName, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId, Integer sysId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importUser(List userList, Boolean isUpdateSupport, String operName); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MenuInSysServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MenuInSysServiceImpl.java new file mode 100644 index 0000000..728bd6e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MenuInSysServiceImpl.java @@ -0,0 +1,87 @@ +package net.hzvtc.system.service.impl; + +import java.util.List; +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import net.hzvtc.system.mapper.MenuInSysMapper; +import net.hzvtc.system.domain.MenuInSys; +import net.hzvtc.system.service.MenuInSysService; + +/** + * 系统菜单Service业务层处理 + * + * @author admin + * @date 2023-10-23 + */ +@Service +public class MenuInSysServiceImpl implements MenuInSysService { + @Resource + private MenuInSysMapper menuInSysMapper; + + /** + * 查询系统菜单 + * + * @param id 系统菜单主键 + * @return 系统菜单 + */ + @Override + public MenuInSys selectMenuInSysById(Long id) { + return menuInSysMapper.selectMenuInSysById(id); + } + + /** + * 查询系统菜单列表 + * + * @param menuInSys 系统菜单 + * @return 系统菜单 + */ + @Override + public List selectMenuInSysList(MenuInSys menuInSys) { + return menuInSysMapper.selectMenuInSysList(menuInSys); + } + + /** + * 新增系统菜单 + * + * @param menuInSys 系统菜单 + * @return 结果 + */ + @Override + public int insertMenuInSys(MenuInSys menuInSys) { + return menuInSysMapper.insertMenuInSys(menuInSys); + } + + /** + * 修改系统菜单 + * + * @param menuInSys 系统菜单 + * @return 结果 + */ + @Override + public int updateMenuInSys(MenuInSys menuInSys) { + return menuInSysMapper.updateMenuInSys(menuInSys); + } + + /** + * 批量删除系统菜单 + * + * @param ids 需要删除的系统菜单主键 + * @return 结果 + */ + @Override + public int deleteMenuInSysByIds(Long[] ids) { + return menuInSysMapper.deleteMenuInSysByIds(ids); + } + + /** + * 删除系统菜单信息 + * + * @param id 系统菜单主键 + * @return 结果 + */ + @Override + public int deleteMenuInSysById(Long id) { + return menuInSysMapper.deleteMenuInSysById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MessageReadInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MessageReadInfoServiceImpl.java new file mode 100644 index 0000000..9a431ec --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/MessageReadInfoServiceImpl.java @@ -0,0 +1,94 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.system.domain.MessageReadInfo; +import net.hzvtc.system.mapper.MessageReadInfoMapper; +import net.hzvtc.system.service.MessageReadInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 信息阅读情况Service业务层处理 + * + * @author admin + * @date 2023-10-20 + */ +@Service +public class MessageReadInfoServiceImpl implements MessageReadInfoService { + @Resource + private MessageReadInfoMapper messageReadInfoMapper; + + /** + * 查询信息阅读情况 + * + * @param id 信息阅读情况主键 + * @return 信息阅读情况 + */ + @Override + public MessageReadInfo selectMessageReadInfoById(Long id) { + return messageReadInfoMapper.selectMessageReadInfoById(id); + } + + /** + * 查询信息阅读情况列表 + * + * @param messageReadInfo 信息阅读情况 + * @return 信息阅读情况 + */ + @Override + public List selectMessageReadInfoList(MessageReadInfo messageReadInfo) { + return messageReadInfoMapper.selectMessageReadInfoList(messageReadInfo); + } + + /** + * 新增信息阅读情况 + * + * @param messageReadInfo 信息阅读情况 + * @return 结果 + */ + @Override + public int insertMessageReadInfo(MessageReadInfo messageReadInfo) { + messageReadInfo.setUserId(SecurityUtils.getUserId()); + List list = messageReadInfoMapper.selectMessageReadInfoListByParam(messageReadInfo); + if (list == null || list.isEmpty()) { + return messageReadInfoMapper.insertMessageReadInfo(messageReadInfo); + } else { + return 0; + } + } + + /** + * 修改信息阅读情况 + * + * @param messageReadInfo 信息阅读情况 + * @return 结果 + */ + @Override + public int updateMessageReadInfo(MessageReadInfo messageReadInfo) { + return messageReadInfoMapper.updateMessageReadInfo(messageReadInfo); + } + + /** + * 批量删除信息阅读情况 + * + * @param ids 需要删除的信息阅读情况主键 + * @return 结果 + */ + @Override + public int deleteMessageReadInfoByIds(Long[] ids) { + return messageReadInfoMapper.deleteMessageReadInfoByIds(ids); + } + + /** + * 删除信息阅读情况信息 + * + * @param id 信息阅读情况主键 + * @return 结果 + */ + @Override + public int deleteMessageReadInfoById(Long id) { + return messageReadInfoMapper.deleteMessageReadInfoById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeFileInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeFileInfoServiceImpl.java new file mode 100644 index 0000000..8b6862b --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeFileInfoServiceImpl.java @@ -0,0 +1,83 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.system.domain.NoticeFileInfo; +import net.hzvtc.system.mapper.NoticeFileInfoMapper; +import net.hzvtc.system.service.NoticeFileInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * 通知公告附件Service业务层处理 + * + * @author admin + * @date 2022-05-02 + */ +@Service +public class NoticeFileInfoServiceImpl implements NoticeFileInfoService { + @Resource + private NoticeFileInfoMapper noticeFileInfoMapper; + + /** + * 查询通知公告附件 + * + * @param id 通知公告附件主键 + * @return 通知公告附件 + */ + @Override + public NoticeFileInfo selectNoticeFileInfoById(Long id) { + return noticeFileInfoMapper.selectNoticeFileInfoById(id); + } + + /** + * 查询通知公告附件列表 + * + * @param noticeFileInfo 通知公告附件 + * @return 通知公告附件 + */ + @Override + public List selectNoticeFileInfoList(NoticeFileInfo noticeFileInfo) { + return noticeFileInfoMapper.selectNoticeFileInfoList(noticeFileInfo); + } + + /** + * 新增通知公告附件 + * + * @param noticeFileInfo 通知公告附件 + * @return 结果 + */ + @Override + public int insertNoticeFileInfo(NoticeFileInfo noticeFileInfo) { + return noticeFileInfoMapper.insertNoticeFileInfo(noticeFileInfo); + } + + @Override + public int batchInsertNoticeFileInfo(List list) { + return noticeFileInfoMapper.batchInsertNoticeFileInfo(list); + } + + + /** + * 批量删除通知公告附件 + * + * @param map 需要删除的通知公告附件主键 + * @return 结果 + */ + @Override + public int deleteNoticeFileInfoNotInIds(Map map) { + return noticeFileInfoMapper.deleteNoticeFileInfoNotInIds(map); + } + + /** + * 删除通知公告附件信息 + * + * @param id 通知公告附件主键 + * @return 结果 + */ + @Override + public int deleteNoticeFileInfoById(Long id) { + return noticeFileInfoMapper.deleteNoticeFileInfoById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReadDeptServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReadDeptServiceImpl.java new file mode 100644 index 0000000..121d74e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReadDeptServiceImpl.java @@ -0,0 +1,70 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.system.domain.NoticeReadDept; +import net.hzvtc.system.mapper.NoticeReadDeptMapper; +import net.hzvtc.system.service.NoticeReadDeptService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 公告阅读范围Service业务层处理 + * + * @author admin + * @date 2022-05-02 + */ +@Service +public class NoticeReadDeptServiceImpl implements NoticeReadDeptService { + @Resource + private NoticeReadDeptMapper noticeReadDeptMapper; + + /** + * 查询公告阅读范围 + * + * @param id 公告阅读范围主键 + * @return 公告阅读范围 + */ + @Override + public NoticeReadDept selectNoticeReadDeptById(Long id) { + return noticeReadDeptMapper.selectNoticeReadDeptById(id); + } + + /** + * 查询公告阅读范围列表 + * + * @param noticeReadDept 公告阅读范围 + * @return 公告阅读范围 + */ + @Override + public List selectNoticeReadDeptList(NoticeReadDept noticeReadDept) { + return noticeReadDeptMapper.selectNoticeReadDeptList(noticeReadDept); + } + + /** + * 新增公告阅读范围 + * + * @param noticeReadDept 公告阅读范围 + * @return 结果 + */ + @Override + public int insertNoticeReadDept(NoticeReadDept noticeReadDept) { + return noticeReadDeptMapper.insertNoticeReadDept(noticeReadDept); + } + + @Override + public int batchInsertNoticeReadDept(List list) { + return noticeReadDeptMapper.batchInsertNoticeReadDept(list); + } + + /** + * 删除公告阅读范围信息 + * + * @param id 公告阅读范围主键 + * @return 结果 + */ + @Override + public int deleteNoticeReadDeptByNoticeId(Long id) { + return noticeReadDeptMapper.deleteNoticeReadDeptByNoticeId(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReaderServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReaderServiceImpl.java new file mode 100644 index 0000000..939d713 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/NoticeReaderServiceImpl.java @@ -0,0 +1,55 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.system.domain.NoticeReader; +import net.hzvtc.system.mapper.NoticeReaderMapper; +import net.hzvtc.system.service.NoticeReaderService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 公告阅读人员Service业务层处理 + * + * @author admin + * @date 2022-05-02 + */ +@Service +public class NoticeReaderServiceImpl implements NoticeReaderService { + @Resource + private NoticeReaderMapper noticeReaderMapper; + + + /** + * 查询公告阅读人员列表 + * + * @param noticeId 公告阅读人员 + * @return 公告阅读人员 + */ + @Override + public List selectNoticeReaderListByPid(Long noticeId) { + return noticeReaderMapper.selectNoticeReaderListByPid(noticeId); + } + + /** + * 新增公告阅读人员 + * + * @param noticeReader 公告阅读人员 + * @return 结果 + */ + @Override + public int insertNoticeReader(NoticeReader noticeReader) { + return noticeReaderMapper.insertNoticeReader(noticeReader); + } + + /** + * 删除公告阅读人员信息 + * + * @param id 公告阅读人员主键 + * @return 结果 + */ + @Override + public int deleteNoticeReaderById(Long id) { + return noticeReaderMapper.deleteNoticeReaderById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysConfigServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..9667dd7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,205 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.annotation.DataSource; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.redis.RedisCache; +import net.hzvtc.common.core.text.Convert; +import net.hzvtc.common.enums.DataSourceType; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.domain.SysConfig; +import net.hzvtc.system.mapper.SysConfigMapper; +import net.hzvtc.system.service.SysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.Collection; +import java.util.List; + +/** + * 参数配置 服务层实现 + * + * @author admin + */ +@Service +public class SysConfigServiceImpl implements SysConfigService { + @Autowired + private SysConfigMapper configMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 项目启动时,初始化参数到缓存 + */ + @PostConstruct + public void init() { + loadingConfigCache(); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DataSource(DataSourceType.MASTER) + public SysConfig selectConfigById(Long configId) { + SysConfig config = new SysConfig(); + config.setConfigId(configId); + return configMapper.selectConfig(config); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Override + public String selectConfigByKey(String configKey) { + String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey))); + if (StringUtils.isNotEmpty(configValue)) { + return configValue; + } + SysConfig config = new SysConfig(); + config.setConfigKey(configKey); + SysConfig retConfig = configMapper.selectConfig(config); + if (StringUtils.isNotNull(retConfig)) { + redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + @Override + public boolean selectCaptchaOnOff() { + String captchaOnOff = selectConfigByKey("sys.account.captchaOnOff"); + if (StringUtils.isEmpty(captchaOnOff)) { + return true; + } + return Convert.toBool(captchaOnOff); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(SysConfig config) { + return configMapper.selectConfigList(config); + } + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int insertConfig(SysConfig config) { + int row = configMapper.insertConfig(config); + if (row > 0) { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int updateConfig(SysConfig config) { + int row = configMapper.updateConfig(config); + if (row > 0) { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + @Override + public void deleteConfigByIds(Long[] configIds) { + for (Long configId : configIds) { + SysConfig config = selectConfigById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + configMapper.deleteConfigById(configId); + redisCache.deleteObject(getCacheKey(config.getConfigKey())); + } + } + + /** + * 加载参数缓存数据 + */ + @Override + public void loadingConfigCache() { + List configsList = configMapper.selectConfigList(new SysConfig()); + for (SysConfig config : configsList) { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + } + + /** + * 清空参数缓存数据 + */ + @Override + public void clearConfigCache() { + Collection keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*"); + redisCache.deleteObject(keys); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() { + clearConfigCache(); + loadingConfigCache(); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public String checkConfigKeyUnique(SysConfig config) { + Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey()); + if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + private String getCacheKey(String configKey) { + return Constants.SYS_CONFIG_KEY + configKey; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDeptServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..062c2f4 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,448 @@ +package net.hzvtc.system.service.impl; + +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.annotation.DataScope; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.domain.TreeSelect; +import net.hzvtc.common.core.domain.entity.SysDept; +import net.hzvtc.common.core.domain.entity.SysRole; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.core.text.Convert; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.Chinese2pinyin; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.spring.SpringUtils; +import net.hzvtc.system.mapper.SysDeptMapper; +import net.hzvtc.system.mapper.SysRoleMapper; +import net.hzvtc.system.service.SysDeptService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 部门管理 服务实现 + * + * @author admin + */ +@Service +@Slf4j +public class SysDeptServiceImpl implements SysDeptService { + @Resource + private SysDeptMapper deptMapper; + + @Resource + private SysRoleMapper roleMapper; + + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + @DataScope(deptAlias = "d") + public List selectDeptList(SysDept dept) { + List list = deptMapper.selectDeptList(dept); +// list.forEach(item -> { +// String str = item.getAncestors(); +// if (str != null && !str.isEmpty()) { +// List ids = Arrays.stream(str.split(",")).map(id -> Long.parseLong(id)).collect(Collectors.toList()); +// List depts = deptMapper.getSysDeptListInIds(ids); +// if (depts != null && depts.size() > 0) { +// String fullpath = depts.stream().map(data -> data.getDeptName()).collect(Collectors.joining("->")); +// item.setFullPathName(fullpath + "->" + item.getDeptName()); +// } else { +// item.setFullPathName(item.getDeptName()); +// } +// } else { +// item.setFullPathName(item.getDeptName()); +// } +// }); + return list; + } + + @Override + public List selectDeptDeviceCountList(SysDept dept) { + return deptMapper.selectDeptDeviceCountList(dept); + } + + @Override + public List getDeptList(SysDept dept) { + return deptMapper.selectDeptList(dept); + } + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + @Override + public List buildDeptTree(List depts) { + List returnList = new ArrayList<>(); + List tempList = new ArrayList<>(); + for (SysDept dept : depts) { + tempList.add(dept.getDeptId()); + } + for (Iterator iterator = depts.iterator(); iterator.hasNext(); ) { + SysDept dept = (SysDept) iterator.next(); + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(dept.getParentId())) { + recursionFn(depts, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) { + returnList = depts; + } + return returnList; + } + + @Override + public List getSysDeptListInIds(List list) { + return deptMapper.getSysDeptListInIds(list); + } + + @Override + public void updateDeptAncestorPath(SysDept sysDept) { + List list = deptMapper.selectDeptList(sysDept); + list.forEach(item -> { + String str = item.getAncestors(); + if (str != null && !str.isEmpty()) { + List ids = Arrays.stream(str.split(",")).map(id -> Long.parseLong(id)).collect(Collectors.toList()); + List depts = deptMapper.getSysDeptListInIds(ids); + if (depts != null && depts.size() > 0) { + String fullpath = depts.stream().map(data -> data.getDeptName()).collect(Collectors.joining(",")); + item.setAncestorPath(fullpath); + deptMapper.updateSysdeptAncestorPath(item); + } + } + }); + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List buildDeptTreeSelect(List depts) { + List deptTrees = buildDeptTree(depts); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + @Override + public List buildDeptTreeSelectByIds(List ids) { + List list = deptMapper.getSysDeptListInIds(ids); + list.forEach(item -> { + //allIds.add(item.getDeptId()); + String str = item.getAncestors(); + if (str != null) { + String arr[] = str.split(","); + for (String id : arr) { + ids.add(Long.parseLong(id)); + } + } + }); + list = deptMapper.getSysDeptListInIds(ids); + List deptTrees = buildDeptTree(list); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + @Override + public List buildLazyDeptTreeSelect(Long parentId) { + if (parentId == null) { + parentId = 0L; + } + List treeSelects = new ArrayList<>(); + List deptList = deptMapper.getSysDeptListByParentId(parentId); + deptList.forEach(item -> { + TreeSelect node = new TreeSelect(); + node.setId(item.getDeptId()); + node.setLabel(item.getDeptName()); + node.setFullName(item.getFullName()); + node.setAncestor(item.getAncestors()); + if (item.getAncestorPath() == null || item.getAncestorPath().isEmpty()) { + node.setFullPathName(item.getDeptName()); + } else { + node.setFullPathName(item.getAncestorPath().replaceAll(",", "->") + "->" + item.getDeptName()); + } + //node.setFullPathName(item.getAncestorPath().replaceAll(",", "->")); + if (item.getChildren() == null || item.getChildren().size() == 0) { + node.setLeaf(true); + } else { + node.setLeaf(false); + } + treeSelects.add(node); + }); + return treeSelects; + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) { + SysRole role = roleMapper.selectRoleById(roleId); + return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); + } + + @Override + public List getSysDeptFullPathByParam(Long deptId) { + return deptMapper.getSysDeptFullPathByParam(deptId); + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Override + public SysDept selectDeptById(Long deptId) { + return deptMapper.selectDeptById(deptId); + } + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public int selectNormalChildrenDeptById(Long deptId) { + return deptMapper.selectNormalChildrenDeptById(deptId); + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) { + int result = deptMapper.hasChildByDeptId(deptId); + return result > 0; + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) { + int result = deptMapper.checkDeptExistUser(deptId); + return result > 0; + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public String checkDeptNameUnique(SysDept dept) { + Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); + SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId()); + if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) { + SysDept dept = new SysDept(); + dept.setDeptId(deptId); + List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); + if (StringUtils.isEmpty(depts)) { + throw new ServiceException("没有权限访问部门数据!"); + } + } + } + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int insertDept(SysDept dept) { + if (dept.getDeptName() != null) { + Map map = Chinese2pinyin.changeChinese2Pinyin(dept.getDeptName()); + dept.setFullPinyin(map.get("fullPinyin")); + dept.setSimplePinyin(map.get("simplePinyin")); + } + + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { + throw new ServiceException("部门停用,不允许新增"); + } + String ancestors = info.getAncestors() + "," + dept.getParentId(); + String ancestorPath = info.getAncestorPath() + "," + dept.getDeptName(); + dept.setAncestors(ancestors); + dept.setAncestorPath(ancestorPath); + dept.setDeptLevel(ancestors.split(",").length); + return deptMapper.insertDept(dept); + } + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int updateDept(SysDept dept) { + SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); + if (dept.getDeptName() != null) { + Map map = Chinese2pinyin.changeChinese2Pinyin(dept.getDeptName()); + dept.setFullPinyin(map.get("fullPinyin")); + dept.setSimplePinyin(map.get("simplePinyin")); + } + SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId()); + if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) { + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + int result = deptMapper.updateDept(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals("0", dept.getAncestors())) { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(SysDept dept) { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + deptMapper.updateDeptStatusNormal(deptIds); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { + List children = deptMapper.selectChildrenDeptById(deptId); + for (SysDept child : children) { + String ancestors = child.getAncestors().replaceFirst(oldAncestors, newAncestors); + child.setAncestors(ancestors); + child.setDeptLevel(ancestors.split(",").length); + } + if (children.size() > 0) { + deptMapper.updateDeptChildren(children); + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public int deleteDeptById(Long deptId) { + return deptMapper.deleteDeptById(deptId); + } + + @Override + public String getDeptAncestorsById(Long id) { + return deptMapper.getDeptAncestorsById(id); + } + + @Override + public List getSysDeptAncestorsIdsById(Long deptId) { + String ancestor = deptMapper.getDeptAncestorsById(deptId); + if (ancestor == null || ancestor.isEmpty()) { + ancestor = String.valueOf(deptId); + } else { + ancestor += "," + deptId; + } + List list = deptMapper.getSysDeptListByAncestors(ancestor); + if (list == null) { + list = new ArrayList<>(); + list.add(deptId); + } else { + list.add(deptId); + } + return list; + } + + @Override + public List getDeptSubIdsById(Long deptId) { + return deptMapper.getDeptSubIdsById(deptId); + } + + @Override + public List getDeptAreaListByDevices(List deviceIds) { + return deptMapper.getDeptAreaListByDevices(deviceIds); + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysDept t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysDept tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, SysDept t) { + List tlist = new ArrayList<>(); + Iterator it = list.iterator(); + while (it.hasNext()) { + SysDept n = (SysDept) it.next(); + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, SysDept t) { + return getChildList(list, t).size() > 0; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictDataServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..60ef409 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,114 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.core.domain.entity.SysDictData; +import net.hzvtc.common.utils.DictUtils; +import net.hzvtc.system.mapper.SysDictDataMapper; +import net.hzvtc.system.service.SysDictDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 字典 业务层处理 + * + * @author admin + */ +@Service +public class SysDictDataServiceImpl implements SysDictDataService { + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(SysDictData dictData) { + return dictDataMapper.selectDictDataList(dictData); + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return dictDataMapper.selectDictLabel(dictType, dictValue); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public SysDictData selectDictDataById(Long dictCode) { + return dictDataMapper.selectDictDataById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) { + for (Long dictCode : dictCodes) { + SysDictData data = selectDictDataById(dictCode); + dictDataMapper.deleteDictDataById(dictCode); + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + } + + /** + * 新增保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int insertDictData(SysDictData data) { + int row = dictDataMapper.insertDictData(data); + if (row > 0) { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } + + /** + * 修改保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int updateDictData(SysDictData data) { + int row = dictDataMapper.updateDictData(data); + if (row > 0) { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } + + @Override + public List getDictDataListForSel(String dictType) { + List list = dictDataMapper.getDictDataListForSel(dictType); + if(list==null){ + list = new ArrayList<>(); + } + return list; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictTypeServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..4649079 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,203 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.domain.entity.SysDictData; +import net.hzvtc.common.core.domain.entity.SysDictType; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.DictUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.mapper.SysDictDataMapper; +import net.hzvtc.system.mapper.SysDictTypeMapper; +import net.hzvtc.system.service.SysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 字典 业务层处理 + * + * @author admin + */ +@Service +public class SysDictTypeServiceImpl implements SysDictTypeService { + @Autowired + private SysDictTypeMapper dictTypeMapper; + + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 项目启动时,初始化字典到缓存 + */ + @PostConstruct + public void init() { + loadingDictCache(); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(SysDictType dictType) { + return dictTypeMapper.selectDictTypeList(dictType); + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() { + return dictTypeMapper.selectDictTypeAll(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataByType(String dictType) { + List dictDatas = DictUtils.getDictCache(dictType); + if (StringUtils.isNotEmpty(dictDatas)) { + return dictDatas; + } + dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (StringUtils.isNotEmpty(dictDatas)) { + DictUtils.setDictCache(dictType, dictDatas); + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeById(Long dictId) { + return dictTypeMapper.selectDictTypeById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeByType(String dictType) { + return dictTypeMapper.selectDictTypeByType(dictType); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) { + for (Long dictId : dictIds) { + SysDictType dictType = selectDictTypeById(dictId); + if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + dictTypeMapper.deleteDictTypeById(dictId); + DictUtils.removeDictCache(dictType.getDictType()); + } + } + + /** + * 加载字典缓存数据 + */ + @Override + public void loadingDictCache() { + SysDictData dictData = new SysDictData(); + dictData.setStatus("0"); + Map> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType)); + for (Map.Entry> entry : dictDataMap.entrySet()) { + DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList())); + } + } + + /** + * 清空字典缓存数据 + */ + @Override + public void clearDictCache() { + DictUtils.clearDictCache(); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + clearDictCache(); + loadingDictCache(); + } + + /** + * 新增保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + public int insertDictType(SysDictType dict) { + int row = dictTypeMapper.insertDictType(dict); + if (row > 0) { + DictUtils.setDictCache(dict.getDictType(), null); + } + return row; + } + + /** + * 修改保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + @Transactional + public int updateDictType(SysDictType dict) { + SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId()); + dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType()); + int row = dictTypeMapper.updateDictType(dict); + if (row > 0) { + List dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType()); + DictUtils.setDictCache(dict.getDictType(), dictDatas); + } + return row; + } + + /** + * 校验字典类型称是否唯一 + * + * @param dict 字典类型 + * @return 结果 + */ + @Override + public String checkDictTypeUnique(SysDictType dict) { + Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId(); + SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType()); + if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysLogininforServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..3865096 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,61 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.system.domain.SysLogininfor; +import net.hzvtc.system.mapper.SysLogininforMapper; +import net.hzvtc.system.service.SysLogininforService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author admin + */ +@Service +public class SysLogininforServiceImpl implements SysLogininforService { + + @Autowired + private SysLogininforMapper logininforMapper; + + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininfor logininfor) { + logininforMapper.insertLogininfor(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininfor logininfor) { + return logininforMapper.selectLogininforList(logininfor); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) { + return logininforMapper.deleteLogininforByIds(infoIds); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() { + logininforMapper.cleanLogininfor(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysMenuServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..e967224 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,477 @@ +package net.hzvtc.system.service.impl; + +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.constant.Constants; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.domain.TreeSelect; +import net.hzvtc.common.core.domain.entity.SysMenu; +import net.hzvtc.common.core.domain.entity.SysRole; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.domain.MenuInSys; +import net.hzvtc.system.domain.vo.MetaVo; +import net.hzvtc.system.domain.vo.RouterVo; +import net.hzvtc.system.mapper.SysMenuMapper; +import net.hzvtc.system.mapper.SysRoleMapper; +import net.hzvtc.system.mapper.SysRoleMenuMapper; +import net.hzvtc.system.service.MenuInSysService; +import net.hzvtc.system.service.SysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 菜单 业务层处理 + * + * @author admin + */ +@Service +@Slf4j +public class SysMenuServiceImpl implements SysMenuService { + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; + + @Resource + private SysMenuMapper menuMapper; + + @Resource + private SysRoleMapper roleMapper; + + @Resource + private SysRoleMenuMapper roleMenuMapper; + + @Autowired + private MenuInSysService menuInSysService; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId, Integer sysId) { + SysMenu sysMenu = new SysMenu(); + sysMenu.setSysId(sysId); + return selectMenuList(sysMenu, userId); + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenu menu, Long userId) { + if (menu.getSysId() == null) { + menu.setSysId(1); + } + List menuList = null; + // 管理员显示所有菜单信息 + if (SysUser.isAdmin(userId)) { + menuList = menuMapper.selectMenuList(menu); + } else { + menu.getParams().put("userId", userId); + menuList = menuMapper.selectMenuListByUserId(menu); + } + return menuList; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + List perms = menuMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId, Integer sysId) { + List menus = null; + if (SecurityUtils.isAdmin(userId)) { + menus = menuMapper.selectMenuTreeAll(sysId); + } else { + Map map = new HashMap<>(); + map.put("userId", userId); + map.put("sysId", sysId); + menus = menuMapper.selectMenuTreeByUserId(map); + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + SysRole role = roleMapper.selectRoleById(roleId); + return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); + } + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList(); + for (SysMenu menu : menus) { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(getRouteName(menu)); + router.setPath(getRouterPath(menu)); + router.setComponent(getComponent(menu)); + router.setQuery(menu.getQuery()); + router.setShowMenu((menu.getIsShow() == 0)); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (isMenuFrame(menu)) { + router.setMeta(null); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQuery()); + childrenList.add(children); + router.setChildren(childrenList); + } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/inner"); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + String routerPath = innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(StringUtils.capitalize(routerPath)); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + @Override + public List buildMenuTree(List menus) { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (SysMenu dept : menus) { + tempList.add(dept.getMenuId()); + } + for (Iterator iterator = menus.iterator(); iterator.hasNext(); ) { + SysMenu menu = (SysMenu) iterator.next(); + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(menu.getParentId())) { + recursionFn(menus, menu); + returnList.add(menu); + } + } + if (returnList.isEmpty()) { + returnList = menus; + } + return returnList; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List buildMenuTreeSelect(List menus) { + List menuTrees = buildMenuTree(menus); + return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenu selectMenuById(Long menuId) { + return menuMapper.selectMenuById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + int result = menuMapper.hasChildByMenuId(menuId); + return result > 0 ? true : false; + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + int result = roleMenuMapper.checkMenuExistRole(menuId); + return result > 0 ? true : false; + } + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + @Transactional + public int insertMenu(SysMenu menu) { + menuMapper.insertMenu(menu); + if (!menu.getMenuType().equals("F")) { + MenuInSys data = new MenuInSys(); + data.setSysId(menu.getSysId()); + data.setMenuId(menu.getMenuId()); + data.setParentId(menu.getParentId()); + data.setOrderNum(menu.getOrderNum()); + data.setIsDeleted(0); + menuInSysService.insertMenuInSys(data); + } + return 1; + } + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenu menu) { + return menuMapper.updateMenu(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return menuMapper.deleteMenuById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public String checkMenuNameUnique(SysMenu menu) { + Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); + SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 获取路由名称 + * + * @param menu 菜单信息 + * @return 路由名称 + */ + public String getRouteName(SysMenu menu) { + String routerName = StringUtils.capitalize(menu.getPath()); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame(menu)) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + * + * @param menu 菜单信息 + * @return 路由地址 + */ + public String getRouterPath(SysMenu menu) { + String routerPath = menu.getPath(); + // 内链打开外网方式 + if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) + && UserConstants.NO_FRAME.equals(menu.getIsFrame())) { + routerPath = "/" + menu.getPath(); + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame(menu)) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + * + * @param menu 菜单信息 + * @return 组件信息 + */ + public String getComponent(SysMenu menu) { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) { + component = menu.getComponent(); + } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) { + component = UserConstants.INNER_LINK; + } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isMenuFrame(SysMenu menu) { + return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(UserConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isInnerLink(SysMenu menu) { + return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); + } + + /** + * 是否为parent_view组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isParentView(SysMenu menu) { + return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + public List getChildPerms(List list, int parentId) { + List returnList = new ArrayList(); + for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { + SysMenu t = (SysMenu) iterator.next(); + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + * + * @param list + * @param t + */ + private void recursionFn(List list, SysMenu t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysMenu tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, SysMenu t) { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + SysMenu n = (SysMenu) it.next(); + if (n.getParentId().longValue() == t.getMenuId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, SysMenu t) { + return getChildList(list, t).size() > 0 ? true : false; + } + + /** + * 内链域名特殊字符替换 + * + * @return + */ + public String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS}, + new String[]{"", ""}); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysNoticeServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..3e0781a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,258 @@ +package net.hzvtc.system.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.area.domain.SpeciesAbnormalInfo; +import net.hzvtc.area.service.SpeciesAbnormalInfoService; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.system.domain.NoticeFileInfo; +import net.hzvtc.system.domain.NoticeReadDept; +import net.hzvtc.system.domain.SysNotice; +import net.hzvtc.system.domain.vo.DocStateCountVO; +import net.hzvtc.system.domain.vo.MessageVo; +import net.hzvtc.system.mapper.SysNoticeMapper; +import net.hzvtc.system.service.NoticeFileInfoService; +import net.hzvtc.system.service.NoticeReadDeptService; +import net.hzvtc.system.service.SysNoticeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 公告 服务层实现 + * + * @author admin + */ +@Service +@Slf4j +public class SysNoticeServiceImpl implements SysNoticeService { + @Resource + private SysNoticeMapper noticeMapper; + private NoticeReadDeptService noticeReadDeptService; + private NoticeFileInfoService noticeFileInfoService; + private SpeciesAbnormalInfoService speciesAbnormalInfoService; + + @Autowired + public void setSpeciesAbnormalInfoService(SpeciesAbnormalInfoService speciesAbnormalInfoService) { + this.speciesAbnormalInfoService = speciesAbnormalInfoService; + } + + @Autowired + public void setNoticeFileInfoService(NoticeFileInfoService noticeFileInfoService) { + this.noticeFileInfoService = noticeFileInfoService; + } + + @Autowired + public void setNoticeReadDeptService(NoticeReadDeptService noticeReadDeptService) { + this.noticeReadDeptService = noticeReadDeptService; + } + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + @Override + public SysNotice selectNoticeById(Long noticeId) { + return noticeMapper.selectNoticeById(noticeId); + } + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + @Override + public List selectNoticeList(SysNotice notice) { + if (notice == null) { + notice = new SysNotice(); + } + if (notice.getCreateDept() == null) { + notice.setCreateDept(1L); + } + if (notice.getStatus() == null) { + notice.setStatus(1); + } + return noticeMapper.selectNoticeList(notice); + } + + @Override + public List getSysNoticeCountGroupByState(Long deptId) { + return noticeMapper.getSysNoticeCountGroupByState(deptId); + } + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + @Override + @Transactional + public int insertNotice(SysNotice notice) { + notice.setIsDeleted(0); + notice.setCreateTime(DateUtils.getNowDate()); + notice.setCreateDept(1L); + noticeMapper.insertNotice(notice); + saveReadDept(notice.getDeptIds(), notice.getNoticeId()); + saveFileList(notice.getFileInfoList(), notice.getNoticeId()); + return 1; + } + + + private void saveFileList(List files, Long id) { + if (files != null && !files.isEmpty()) { + files.forEach(item -> { + item.setNoticeId(id); + }); + noticeFileInfoService.batchInsertNoticeFileInfo(files); + } + } + + private void saveReadDept(List ids, Long noticeId) { + if (ids != null && !ids.isEmpty()) { + List list = new ArrayList<>(); + ids.forEach(id -> { + NoticeReadDept data = new NoticeReadDept(); + data.setDeptId(id); + data.setNoticeId(noticeId); + list.add(data); + }); + noticeReadDeptService.batchInsertNoticeReadDept(list); + } else { + NoticeReadDept data = new NoticeReadDept(); + data.setNoticeId(noticeId); + data.setDeptId(null); + noticeReadDeptService.insertNoticeReadDept(data); + } + } + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + @Override + @Transactional + public int updateNotice(SysNotice notice) { + notice.setUpdateTime(DateUtils.getNowDate()); + noticeMapper.updateNotice(notice); + Long id = notice.getNoticeId(); + noticeReadDeptService.deleteNoticeReadDeptByNoticeId(id); + saveReadDept(notice.getDeptIds(), notice.getNoticeId()); + + if (notice.getFileInfoList() != null && !notice.getFileInfoList().isEmpty()) { + List list = notice.getFileInfoList(); + List ids = list.stream().filter(item -> item.getId() != null && item.getId() != 0L).map(NoticeFileInfo::getId).collect(Collectors.toList()); + if (!ids.isEmpty()) { + Map map = new HashMap<>(); + map.put("noticeId", id); + map.put("list", ids); + noticeFileInfoService.deleteNoticeFileInfoNotInIds(map); + } + List fileList = list.stream().filter(item -> item.getId() == null || item.getId() == 0L).collect(Collectors.toList()); + saveFileList(fileList, id); + } + // + return 1; + } + + /** + * 删除公告对象 + * + * @param noticeId 公告ID + * @return 结果 + */ + @Override + public int deleteNoticeById(Long noticeId) { + return noticeMapper.deleteNoticeById(noticeId); + } + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) { + return noticeMapper.deleteNoticeByIds(noticeIds); + } + + @Override + public JSONArray getMessageCatalogueList() { + JSONArray array = new JSONArray(); + SysNotice data = noticeMapper.getLastedNoticeByParam(); + Long userId = SecurityUtils.getUserId(); + if (data != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", "通知通告"); + jsonObject.put("title", data.getNoticeTitle()); + jsonObject.put("type", 1); + jsonObject.put("date", data.getCreateTime()); + int count = noticeMapper.getUnreadAmountByUserId(userId); + jsonObject.put("num", count); + array.add(jsonObject); + } + userId = userId <= 1L ? null : userId; + SpeciesAbnormalInfo info = speciesAbnormalInfoService.getLatestSpeciesAbnormalInfo(userId); + if (info != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("title", "关键物种"); + jsonObject.put("type", 2); + jsonObject.put("content", String.format("在%s%s监测到%s%d只", info.getAreaName(), info.getDeviceName(), info.getSpeciesName(), info.getCount())); + jsonObject.put("date", info.getHappenTime()); + int count = speciesAbnormalInfoService.getSpeciesAbnormalInfoCountByUserId(null); + jsonObject.put("num", count); + array.add(jsonObject); + } + return array; + } + + @Override + public JSONArray getUnreadMessageCatalogueList() { + JSONArray array = new JSONArray(); + Long userId = SecurityUtils.getUserId(); + JSONObject jsonObject = new JSONObject(); + int count = noticeMapper.getUnreadAmountByUserId(userId); + jsonObject.put("type", 1); + jsonObject.put("num", count); + array.add(jsonObject); + Map map = new HashMap<>(); + map.put("readerId", userId); + if (userId != 1L) { + map.put("userId", userId); + } + int count1 = speciesAbnormalInfoService.getSpeciesAbnormalInfoCountByUserId(map); + jsonObject = new JSONObject(); + jsonObject.put("type", 2); + jsonObject.put("num", count1); + array.add(jsonObject); + return array; + } + + @Override + public List getMessageInfoList(String title) { + SysNotice sysNotice = new SysNotice(); + sysNotice.setNoticeTitle(title); + sysNotice.setCreateDept(SecurityUtils.getUserId()); + return noticeMapper.getSysNoticePubListByParam(sysNotice); + } + + @Override + public SysNotice getNoticeForMobileById(Long noticeId) { + return noticeMapper.getNoticeForMobileById(noticeId); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysOperLogServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..710ec77 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,71 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.system.domain.SysOperLog; +import net.hzvtc.system.mapper.SysOperLogMapper; +import net.hzvtc.system.service.SysOperLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 操作日志 服务层处理 + * + * @author admin + */ +@Service +public class SysOperLogServiceImpl implements SysOperLogService { + @Autowired + private SysOperLogMapper operLogMapper; + + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLog operLog) { + operLogMapper.insertOperlog(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(SysOperLog operLog) { + return operLogMapper.selectOperLogList(operLog); + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) { + return operLogMapper.deleteOperLogByIds(operIds); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public SysOperLog selectOperLogById(Long operId) { + return operLogMapper.selectOperLogById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() { + operLogMapper.cleanOperLog(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysPostServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..42986b2 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,164 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.domain.SysPost; +import net.hzvtc.system.mapper.SysPostMapper; +import net.hzvtc.system.mapper.SysUserPostMapper; +import net.hzvtc.system.service.SysPostService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 岗位信息 服务层处理 + * + * @author admin + */ +@Service +public class SysPostServiceImpl implements SysPostService { + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(SysPost post) { + return postMapper.selectPostList(post); + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() { + return postMapper.selectPostAll(); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public SysPost selectPostById(Long postId) { + return postMapper.selectPostById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) { + return postMapper.selectPostListByUserId(userId); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public String checkPostNameUnique(SysPost post) { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostNameUnique(post.getPostName()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public String checkPostCodeUnique(SysPost post) { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostCodeUnique(post.getPostCode()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int countUserPostById(Long postId) { + return userPostMapper.countUserPostById(postId); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) { + return postMapper.deletePostById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + * @throws Exception 异常 + */ + @Override + public int deletePostByIds(Long[] postIds) { + for (Long postId : postIds) { + SysPost post = selectPostById(postId); + if (countUserPostById(postId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName())); + } + } + return postMapper.deletePostByIds(postIds); + } + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPost post) { + return postMapper.insertPost(post); + } + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPost post) { + return postMapper.updatePost(post); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysRoleServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..9767578 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,403 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.annotation.DataScope; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.domain.entity.SysRole; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.spring.SpringUtils; +import net.hzvtc.system.domain.RoleInArea; +import net.hzvtc.system.domain.SysRoleDept; +import net.hzvtc.system.domain.SysRoleMenu; +import net.hzvtc.system.domain.SysUserRole; +import net.hzvtc.system.mapper.SysRoleDeptMapper; +import net.hzvtc.system.mapper.SysRoleMapper; +import net.hzvtc.system.mapper.SysRoleMenuMapper; +import net.hzvtc.system.mapper.SysUserRoleMapper; +import net.hzvtc.system.service.SysRoleService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 角色 业务层处理 + * + * @author admin + */ +@Service +public class SysRoleServiceImpl implements SysRoleService { + @Resource + private SysRoleMapper roleMapper; + @Resource + private SysRoleMenuMapper roleMenuMapper; + @Resource + private SysUserRoleMapper userRoleMapper; + @Resource + private SysRoleDeptMapper roleDeptMapper; + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + @DataScope(deptAlias = "d") + public List selectRoleList(SysRole role) { + return roleMapper.selectRoleList(role); + } + + /** + * 根据用户ID查询角色 + * + * @param param 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(SysRole param) { + List userRoles = roleMapper.selectRolePermissionByUserId(param); + List roles = selectRoleAll(param); + for (SysRole role : roles) { + for (SysRole userRole : userRoles) { + if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param sysRole 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(SysRole sysRole) { + List perms = roleMapper.selectRolePermissionByUserId(sysRole); + Set permsSet = new HashSet<>(); + for (SysRole perm : perms) { + if (StringUtils.isNotNull(perm)) { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll(SysRole sysRole) { + return SpringUtils.getAopProxy(this).selectRoleList(sysRole); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) { + return roleMapper.selectRoleListByUserId(userId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public SysRole selectRoleById(Long roleId) { + return roleMapper.selectRoleById(roleId); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleNameUnique(SysRole role) { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleKeyUnique(SysRole role) { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRole role) { + if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) { + throw new ServiceException("不允许操作超级管理员角色"); + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) { + SysRole role = new SysRole(); + role.setRoleId(roleId); + List roles = SpringUtils.getAopProxy(this).selectRoleList(role); + if (StringUtils.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色数据!"); + } + } + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int countUserRoleByRoleId(Long roleId) { + return userRoleMapper.countUserRoleByRoleId(roleId); + } + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int insertRole(SysRole role) { + // 新增角色信息 + roleMapper.insertRole(role); + return insertRoleMenu(role); + } + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int updateRole(SysRole role) { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); + roleMenuMapper.deleteAreaIdByRoleId(role.getRoleId()); + return insertRoleMenu(role); + } + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public int updateRoleStatus(SysRole role) { + return roleMapper.updateRole(role); + } + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int authDataScope(SysRole role) { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId()); + // 新增角色和部门信息(数据权限) + return insertRoleDept(role); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + public int insertRoleMenu(SysRole role) { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + List areaList = new ArrayList<>(); + for (Long areaId : role.getAreaIds()) { + RoleInArea data = new RoleInArea(); + data.setAreaId(areaId); + data.setRoleId(role.getRoleId()); + areaList.add(data); + } + if (areaList.size() > 0) { + roleMenuMapper.batchInsertArea(areaList); + } + if (list.size() > 0) { + rows = roleMenuMapper.batchRoleMenu(list); + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + public int insertRoleDept(SysRole role) { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) { + rows = roleDeptMapper.batchRoleDept(list); + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + @Transactional + public int deleteRoleById(Long roleId) { + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(roleId); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(roleId); + return roleMapper.deleteRoleById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + @Transactional + public int deleteRoleByIds(Long[] roleIds) { + for (Long roleId : roleIds) { + checkRoleAllowed(new SysRole(roleId)); + checkRoleDataScope(roleId); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); + } + } + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenu(roleIds); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDept(roleIds); + return roleMapper.deleteRoleByIds(roleIds); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) { + return userRoleMapper.deleteUserRoleInfo(userRole); + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) { + return userRoleMapper.deleteUserRoleInfos(roleId, userIds); + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) { + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long userId : userIds) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + return userRoleMapper.batchUserRole(list); + } + + @Override + public Set getAreaIdsByUserId(SysUser user) { + List list = null; + if (user.isAdmin()) { + list = roleMenuMapper.getAllAreaList(); + } else { + list = roleMenuMapper.getRoleInAreaListByUserId(user.getUserId()); + } + Set areaIds = new HashSet<>(); + areaIds.addAll(list); + return areaIds; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserOnlineServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserOnlineServiceImpl.java new file mode 100644 index 0000000..050486d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserOnlineServiceImpl.java @@ -0,0 +1,86 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.core.domain.model.LoginUser; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.system.domain.SysUserOnline; +import net.hzvtc.system.service.SysUserOnlineService; +import org.springframework.stereotype.Service; + +/** + * 在线用户 服务层处理 + * + * @author admin + */ +@Service +public class SysUserOnlineServiceImpl implements SysUserOnlineService { + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { + if (StringUtils.equals(ipaddr, user.getIpaddr())) { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) { + if (StringUtils.equals(userName, user.getUsername())) { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + @Override + public SysUserOnline loginUserToUserOnline(LoginUser user) { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) { + return null; + } + SysUserOnline sysUserOnline = new SysUserOnline(); + sysUserOnline.setTokenId(user.getToken()); + sysUserOnline.setUserName(user.getUsername()); + sysUserOnline.setIpaddr(user.getIpaddr()); + sysUserOnline.setLoginLocation(user.getLoginLocation()); + sysUserOnline.setBrowser(user.getBrowser()); + sysUserOnline.setOs(user.getOs()); + sysUserOnline.setLoginTime(user.getLoginTime()); + if (StringUtils.isNotNull(user.getUser().getDept())) { + sysUserOnline.setDeptName(user.getUser().getDept().getDeptName()); + } + return sysUserOnline; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..7304823 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,500 @@ +package net.hzvtc.system.service.impl; + +import net.hzvtc.common.annotation.DataScope; +import net.hzvtc.common.constant.UserConstants; +import net.hzvtc.common.core.domain.entity.SysRole; +import net.hzvtc.common.core.domain.entity.SysUser; +import net.hzvtc.common.exception.ServiceException; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.common.utils.StringUtils; +import net.hzvtc.common.utils.bean.BeanValidators; +import net.hzvtc.common.utils.spring.SpringUtils; +import net.hzvtc.system.domain.SysPost; +import net.hzvtc.system.domain.SysUserPost; +import net.hzvtc.system.domain.SysUserRole; +import net.hzvtc.system.mapper.*; +import net.hzvtc.system.service.SysConfigService; +import net.hzvtc.system.service.SysUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户 业务层处理 + * + * @author admin + */ +@Service +public class SysUserServiceImpl implements SysUserService { + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); + @Autowired + protected Validator validator; + @Resource + private SysUserMapper userMapper; + @Resource + private SysRoleMapper roleMapper; + @Resource + private SysPostMapper postMapper; + @Resource + private SysUserRoleMapper userRoleMapper; + @Resource + private SysUserPostMapper userPostMapper; + @Autowired + private SysConfigService configService; + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserList(SysUser user) { + return userMapper.selectUserList(user); + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectAllocatedList(SysUser user) { + return userMapper.selectAllocatedList(user); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUnallocatedList(SysUser user) { + return userMapper.selectUnallocatedList(user); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUser selectUserByUserName(String userName) { + return userMapper.selectUserByUserName(userName); + } + + /** + * 通过用户ID查询用户 + * + * @param sysUser 用户ID + * @return 用户对象信息 + */ + @Override + public SysUser selectUserById(SysUser sysUser) { + return userMapper.selectUserById(sysUser); + } + + /** + * 查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserRoleGroup(String userName) { + List list = roleMapper.selectRolesByUserName(userName); + if (CollectionUtils.isEmpty(list)) { + return StringUtils.EMPTY; + } + return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); + } + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserPostGroup(String userName) { + List list = postMapper.selectPostsByUserName(userName); + if (CollectionUtils.isEmpty(list)) { + return StringUtils.EMPTY; + } + return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); + } + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + @Override + public String checkUserNameUnique(String userName) { + int count = userMapper.checkUserNameUnique(userName); + if (count > 0) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public String checkPhoneUnique(SysUser user) { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public String checkEmailUnique(SysUser user) { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + @Override + public void checkUserAllowed(SysUser user) { + if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) { + SysUser user = new SysUser(); + user.setUserId(userId); + List users = SpringUtils.getAopProxy(this).selectUserList(user); + if (StringUtils.isEmpty(users)) { + throw new ServiceException("没有权限访问用户数据!"); + } + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int insertUser(SysUser user) { + // 新增用户信息 + int rows = userMapper.insertUser(user); + // 新增用户岗位关联 + insertUserPost(user); + // 新增用户与角色管理 + insertUserRole(user); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUser user) { + return userMapper.insertUser(user) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int updateUser(SysUser user) { + Long userId = user.getUserId(); + // 删除用户与角色关联 + userRoleMapper.deleteUserRoleByUserId(user); + // 新增用户与角色管理 + insertUserRole(user); + // 删除用户与岗位关联 + userPostMapper.deleteUserPostByUserId(userId); + // 新增用户与岗位管理 + insertUserPost(user); + return userMapper.updateUser(user); + } + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional + public void insertUserAuth(Long userId, Integer sysId, Long[] roleIds) { + SysUser param = new SysUser(); + param.setUserId(userId); + param.setSysId(sysId); + userRoleMapper.deleteUserRoleByUserId(param); + insertUserRole(userId, roleIds); + } + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserStatus(SysUser user) { + return userMapper.updateUserStatus(user); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(SysUser user) { + return userMapper.updateUserProfile(user); + } + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(String userName, String avatar) { + return userMapper.updateUserAvatar(userName, avatar) > 0; + } + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int resetPwd(SysUser user) { + return userMapper.updateUserPassword(user); + } + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(String userName, String password) { + return userMapper.resetUserPwd(userName, password); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + */ + @Override + public void insertUserRole(SysUser user) { + Long[] roles = user.getRoleIds(); + if (StringUtils.isNotNull(roles)) { + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long roleId : roles) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(user.getUserId()); + ur.setRoleId(roleId); + list.add(ur); + } + if (!list.isEmpty()) { + userRoleMapper.batchUserRole(list); + } + } + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + */ + public void insertUserPost(SysUser user) { + Long[] posts = user.getPostIds(); + if (StringUtils.isNotNull(posts)) { + // 新增用户与岗位管理 + List list = new ArrayList(); + for (Long postId : posts) { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + list.add(up); + } + if (!list.isEmpty()) { + userPostMapper.batchUserPost(list); + } + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserRole(Long userId, Long[] roleIds) { + if (StringUtils.isNotNull(roleIds)) { + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long roleId : roleIds) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + if (!list.isEmpty()) { + userRoleMapper.batchUserRole(list); + } + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional + public int deleteUserById(Long userId, Integer sysId) { + // 删除用户与角色关联 + SysUser param = new SysUser(); + param.setUserId(userId); + param.setSysId(sysId); + userRoleMapper.deleteUserRoleByUserId(param); + // 删除用户与岗位表 + userPostMapper.deleteUserPostByUserId(userId); + return userMapper.deleteUserById(userId); + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + @Transactional + public int deleteUserByIds(Long[] userIds) { + for (Long userId : userIds) { + checkUserAllowed(new SysUser(userId)); + checkUserDataScope(userId); + } + // 删除用户与角色关联 + userRoleMapper.deleteUserRole(userIds); + // 删除用户与岗位关联 + userPostMapper.deleteUserPost(userIds); + return userMapper.deleteUserByIds(userIds); + } + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + public String importUser(List userList, Boolean isUpdateSupport, String operName) { + if (StringUtils.isNull(userList) || userList.size() == 0) { + throw new ServiceException("导入用户数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + String password = configService.selectConfigByKey("sys.user.initPassword"); + for (SysUser user : userList) { + try { + // 验证是否存在这个用户 + SysUser u = userMapper.selectUserByUserName(user.getUserName()); + if (StringUtils.isNull(u)) { + BeanValidators.validateWithException(validator, user); + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operName); + insertUser(user); + successNum++; + successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); + } else if (isUpdateSupport) { + BeanValidators.validateWithException(validator, user); + user.setUpdateBy(operName); + updateUser(user); + successNum++; + successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); + } else { + failureNum++; + failureMsg.append("
" + failureNum + "、账号 " + user.getUserName() + " 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + } + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/SpeciesInfoApiService.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/SpeciesInfoApiService.java new file mode 100644 index 0000000..231791e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/SpeciesInfoApiService.java @@ -0,0 +1,23 @@ +package net.hzvtc.web.api.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +public interface SpeciesInfoApiService { + JSONArray getSpeciesCurrentDateStatList(JSONObject params); + + JSONObject getSpeciesStatListByParam(JSONObject params); + + JSONObject getBirdPeriodStatByParam(JSONObject object); + + JSONObject getBirdMonthStatByParam(JSONObject object); + + JSONObject getBirdYearStatByParam(JSONObject object); + + JSONObject getDeviceInfoListByParam(); + + JSONObject getTodayRecordList(); + + JSONObject getVideoMediaListByParam(JSONObject object); +} + diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/impl/SpeciesInfoApiServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/impl/SpeciesInfoApiServiceImpl.java new file mode 100644 index 0000000..ec4a72e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/api/service/impl/SpeciesInfoApiServiceImpl.java @@ -0,0 +1,285 @@ +package net.hzvtc.web.api.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.utils.SecurityUtils; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.domain.ResultRecord; +import net.hzvtc.data.check.service.ResultMediaService; +import net.hzvtc.data.check.service.ResultRecordService; +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.device.service.DeviceInfoService; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.echart.service.BirdDataStatService; +import net.hzvtc.web.api.service.SpeciesInfoApiService; +import net.hzvtc.web.stat.service.BirdWebPageStatService; +import net.hzvtc.web.stat.service.SpeciesDailyStatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +@Slf4j +@Service +public class SpeciesInfoApiServiceImpl implements SpeciesInfoApiService { + @Autowired + private BirdDataStatService birdRealTimeService; + @Autowired + private BirdWebPageStatService birdWebPageStatService; + @Autowired + private SpeciesDailyStatService speciesDailyStatService; + @Autowired + private DeviceInfoService deviceInfoService; + @Autowired + private ResultRecordService resultRecordService; + @Autowired + private ResultMediaService resultMediaService; + + @Value("${hzvtc.fileServerUrl}") + private String fileServerUrl; + + @Override + public JSONArray getSpeciesCurrentDateStatList(JSONObject params) { + if (params == null) { + params = new JSONObject(); + } + Long areaId = getAreaId(); + if (areaId == null) { + return new JSONArray(); + } else { + params.put("areaId", areaId); + List list = birdRealTimeService.getBirdRealStatByParam(params); + JSONArray array = new JSONArray(); + list.forEach(item -> { + JSONObject object = new JSONObject(); + object.put("id", item.getId()); + String url = item.getLocation(); + if (url != null) { + if (url.startsWith("/")) { + object.put("img", fileServerUrl + url); + } else { + object.put("img", fileServerUrl + "/" + url); + } + } + object.put("count", item.getCount()); + object.put("name", item.getName()); + array.add(object); + }); + return array; + } + } + + @Override + public JSONObject getSpeciesStatListByParam(JSONObject params) { + if (params == null) { + params = new JSONObject(); + } + Long areaId = getAreaId(); + if (areaId == null) { + return new JSONObject(); + } else { + params.put("areaId", areaId); + return birdWebPageStatService.getBirdDailyStatListByParam(params); + } + } + + @Override + public JSONObject getBirdPeriodStatByParam(JSONObject params) { + if (params == null) { + params = new JSONObject(); + } + Long areaId = getAreaId(); + if (areaId == null) { + return new JSONObject(); + } else { + params.put("areaId", areaId); + List list = speciesDailyStatService.getBirdPeriodStatListByParam(params); + JSONArray array = new JSONArray(); + list.forEach(item -> { + JSONObject object = new JSONObject(); + object.put("shortDate", item.getShortDate()); + object.put("dateTime", item.getDateTime()); + object.put("avgCount", item.getAvgCount()); + object.put("maxCount", item.getCount()); + array.add(object); + }); + JSONObject object = new JSONObject(); + object.put("list", array); + return object; + } + } + + @Override + public JSONObject getBirdMonthStatByParam(JSONObject params) { + if (params == null) { + params = new JSONObject(); + } + Long areaId = getAreaId(); + if (areaId == null) { + return new JSONObject(); + } else { + params.put("areaId", areaId); + List list = speciesDailyStatService.getBirdMonthStatListByParam(params); + JSONArray array = new JSONArray(); + list.forEach(item -> { + JSONObject object = new JSONObject(); + object.put("month", item.getMonth()); + object.put("avgCount", item.getAvgCount()); + object.put("maxCount", item.getCount()); + array.add(object); + }); + JSONObject object = new JSONObject(); + object.put("list", array); + return object; + } + } + + @Override + public JSONObject getBirdYearStatByParam(JSONObject param) { + Long areaId = getAreaId(); + if (areaId == null) { + return new JSONObject(); + } else { + param.put("areaId", areaId); + List list = birdWebPageStatService.getBirdStatYearInfoByParam(param); + JSONArray array = new JSONArray(); + list.forEach(item -> { + JSONObject object = new JSONObject(); + object.put("year", item.getYear()); + object.put("avgCount", item.getAvgCount()); + object.put("maxCount", item.getCount()); + array.add(object); + }); + JSONObject object = new JSONObject(); + object.put("list", array); + return object; + } + } + + @Override + public JSONObject getDeviceInfoListByParam() { + Long areaId = getAreaId(); + if (areaId == null) { + return new JSONObject(); + } + JSONArray array = new JSONArray(); + List list = deviceInfoService.getDeviceStatInfoByParam(); + list.forEach(item -> { + JSONObject object = new JSONObject(); + object.put("id", item.getId()); + object.put("name", item.getDeviceName()); + object.put("serialNumber", item.getDuid()); + array.add(object); + }); + JSONObject object = new JSONObject(); + object.put("list", array); + return object; + } + + @Override + public JSONObject getTodayRecordList() { + JSONObject param = new JSONObject(); + param.put("areaId", getAreaId()); + List list = resultRecordService.getCurrentDateResultRecordList(param); + JSONArray array = new JSONArray(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + list.forEach(item -> { + JSONObject object = new JSONObject(); + object.put("id", item.getRecordId()); + object.put("recordTime", df.format(item.getRecordTime())); + object.put("deviceId", item.getDeviceId()); + JSONArray subArray = new JSONArray(); + item.getList().forEach(subItem -> { + JSONObject obj = new JSONObject(); + obj.put("id", subItem.getDetailsId()); + obj.put("count", subItem.getCount()); + obj.put("speciesId", subItem.getSpeciesId()); + String url = subItem.getResultMedia() != null ? subItem.getResultMedia().getMediaUrl() : null; + if (url != null) { + if (url.startsWith("/")) { + obj.put("mediaUrl", fileServerUrl + url); + } else { + obj.put("mediaUrl", fileServerUrl + "/" + url); + } + } +// obj.put("habitat", subItem.getHabitat()); + subArray.add(obj); + }); + object.put("records", subArray); + array.add(object); + }); + JSONObject result = new JSONObject(); + result.put("list", array); + return result; + } + + @Override + public JSONObject getVideoMediaListByParam(JSONObject object) { + JSONObject param = new JSONObject(); + param.put("areaId", getAreaId()); + String dateFrom = object.getString("dateFrom"); + String dateTo = object.getString("dateTo"); + if (dateFrom == null || dateFrom.isEmpty() || dateTo == null || dateTo.isEmpty()) { + return new JSONObject(); + } + param.put("dateFrom", dateFrom); + param.put("dateTo", dateTo); +// String calcDate = object.getString("calcDate"); +// if (calcDate == null || calcDate.isEmpty()) { +// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); +// calcDate = df.format(new Date()); +// } +// param.put("calcDate", calcDate); + + Long speciesId = object.getLong("speciesId"); + param.put("speciesId", speciesId); + Long deviceId = object.getLong("deviceId"); + param.put("deviceId", deviceId); + List list = resultMediaService.getVideoMediaListByParam(param); + JSONArray array = new JSONArray(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + if (list != null && !list.isEmpty()) { + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("speciesName", item.getSpeciesName()); + obj.put("speciesId", item.getSpeciesId()); + obj.put("deviceId", item.getDeviceId()); + obj.put("time", df.format(item.getTime())); + String url = item.getMediaUrl(); + if (url != null) { + if (url.startsWith("/")) { + obj.put("mediaUrl", fileServerUrl + url); + } else { + obj.put("mediaUrl", fileServerUrl + "/" + url); + } + } + url = item.getMetaUrl(); + if (url != null) { + if (url.startsWith("/")) { + obj.put("imgPath", fileServerUrl + url); + } else { + obj.put("imgPath", fileServerUrl + "/" + url); + } + } + array.add(obj); + }); + } + JSONObject result = new JSONObject(); + result.put("list", array); + return result; + } + + private Long getAreaId() { + Set set = SecurityUtils.getLoginUser().getAreaIds(); + if (set == null || set.isEmpty()) { + return null; + } + List ids = new ArrayList<>(set); + return ids.get(0); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/BirdWebPageStatController.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/BirdWebPageStatController.java new file mode 100644 index 0000000..4845757 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/BirdWebPageStatController.java @@ -0,0 +1,86 @@ +package net.hzvtc.web.stat.controller; + +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.web.stat.service.BirdWebPageStatService; +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; + +@RestController +@RequestMapping("/web/page/stat") +@Slf4j +public class BirdWebPageStatController { + @Autowired + private BirdWebPageStatService birdWebPageStatService; + + @PostMapping("/birdDailyAmount") + public AjaxResult getBirdDailyStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdDailyAmountListByParam(obj)); + } + + @PostMapping("/birdDailyStat") + public AjaxResult getBirdDailyStatList(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdDailyStatListByParam(obj)); + } + + @PostMapping("/birdAudioDailyStat") + public AjaxResult getBirdAudioDailyStatList(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdAudioDailyStatListByParam(obj)); + } + + @PostMapping("/birdAudioMonthStat") + public AjaxResult getBirdAudioMonthStatList(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdAudioMonthStatListByParam(obj)); + } + + @PostMapping("/birdAudioYearStat") + public AjaxResult getBirdAudioYearStatList(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdAudioYearStatListByParam(obj)); + } + + @PostMapping("/familyDailyStat") + public AjaxResult getFamilyDailyStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdDailyFamilyListByParam(obj)); + } + + @PostMapping("/periodAudioStat") + public AjaxResult getBirdPeriodStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdPeriodStatByParam(obj)); + } + + @PostMapping("/audioMonthStat") + public AjaxResult getBirdAudioMonthStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdAudioMonthStatByParam(obj)); + } + + @PostMapping("/audioYearStat") + public AjaxResult getBirdAudioYearStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdAudioYearStatByParam(obj)); + } + + @PostMapping("/monthStat") + public AjaxResult getBirdMonthStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdMonthStatByParam(obj)); + } + + @PostMapping("/yearAmountStat") + public AjaxResult getBirdYearAmountStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdStatYearInfoByParam(obj)); + } + + @PostMapping("/winterAudioStat") + public AjaxResult getBirdWinterPeriodAudioStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getSpeciesWinterPeriodAudioAmountByParam(obj)); + } + + + @PostMapping("/birdResidentStat") + public AjaxResult getBirdResidentStat(@RequestBody JSONObject obj) { + return AjaxResult.success(birdWebPageStatService.getBirdArriveAndLeaveInfoByParam(obj)); + } + +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyInhabitController.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyInhabitController.java new file mode 100644 index 0000000..09a0f30 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyInhabitController.java @@ -0,0 +1,70 @@ +package net.hzvtc.web.stat.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.web.stat.domain.SpeciesDailyInhabit; +import net.hzvtc.web.stat.service.SpeciesDailyInhabitService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 生境数量统计Controller + * + * @author admin + * @date 2023-08-21 + */ +@RestController +@RequestMapping("/stat/inhabit") +public class SpeciesDailyInhabitController extends BaseController { + @Autowired + private SpeciesDailyInhabitService speciesDailyInhabitService; + + /** + * 查询生境数量统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabit:list')") + @GetMapping("/list") + public TableDataInfo list(SpeciesDailyInhabit speciesDailyInhabit) { + startPage(); + List list = speciesDailyInhabitService.selectSpeciesDailyInhabitList(speciesDailyInhabit); + return getDataTable(list); + } + + /** + * 导出生境数量统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabit:export')") + @Log(title = "生境数量统计", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SpeciesDailyInhabit speciesDailyInhabit) { + List list = speciesDailyInhabitService.selectSpeciesDailyInhabitList(speciesDailyInhabit); + ExcelUtil util = new ExcelUtil(SpeciesDailyInhabit.class); + util.exportExcel(response, list, "生境数量统计数据"); + } + + + /** + * 新增生境数量统计 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabit:add')") + @Log(title = "生境数量统计", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SpeciesDailyInhabit speciesDailyInhabit) { + return toAjax(speciesDailyInhabitService.insertSpeciesDailyInhabit(speciesDailyInhabit)); + } + + @PostMapping("/inhabitList") + public AjaxResult getSpeciesListByParam(@RequestBody JSONObject param) { + return AjaxResult.success(speciesDailyInhabitService.getSpeciesListByParam(param)); + } + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyStatController.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyStatController.java new file mode 100644 index 0000000..d8f1db9 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesDailyStatController.java @@ -0,0 +1,206 @@ +package net.hzvtc.web.stat.controller; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.file.FileUtils; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.web.stat.domain.SpeciesDailyStat; +import net.hzvtc.web.stat.service.SpeciesDailyStatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 物种每日统计Controller + * + * @author admin + * @date 2023-02-22 + */ +@RestController +@RequestMapping("/stat/dailystat") +public class SpeciesDailyStatController extends BaseController { + @Autowired + private SpeciesDailyStatService speciesDailyStatService; + + /** + * 查询物种每日统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:dailystat:list')") + @GetMapping("/list") + public TableDataInfo list(SpeciesDailyStat speciesDailyStat) { + startPage(); + List list = speciesDailyStatService.selectSpeciesDailyStatList(speciesDailyStat); + return getDataTable(list); + } + + /** + * 导出物种每日统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:dailystat:export')") + @Log(title = "物种每日统计", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SpeciesDailyStat speciesDailyStat) { + List list = speciesDailyStatService.selectSpeciesDailyStatList(speciesDailyStat); + ExcelUtil util = new ExcelUtil(SpeciesDailyStat.class); + util.exportExcel(response, list, "物种每日统计数据"); + } + + + /** + * 新增物种每日统计 + */ + @PreAuthorize("@ss.hasPermi('stat:dailystat:add')") + @Log(title = "物种每日统计", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SpeciesDailyStat speciesDailyStat) { + return toAjax(speciesDailyStatService.insertSpeciesDailyStat(speciesDailyStat)); + } + + @PostMapping("/periodStat") + public AjaxResult getBirdPeriodStat(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesDailyStatService.getBirdPeriodStatByParam(obj)); + } + + @PostMapping("/monthStat") + public AjaxResult getBirdMonthStat(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesDailyStatService.getBirdMonthStatByParam(obj)); + } + + @PostMapping("/weeklyReport") + public AjaxResult getBirdWeeklyStatReport(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesDailyStatService.getSpeciesWeeklyReportByParam(obj)); + } + + @PostMapping("/downloadWeeklyReport") + public void downloadWeeklyReport(@RequestParam Map params, HttpServletResponse response, HttpServletRequest request) { + String filePath = speciesDailyStatService.getBirdDataWeeklyStatFileByParam(params); + if (filePath != null) { + try { + String realFileName = System.currentTimeMillis() + ".xlsx"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + @PostMapping("/downloadMonthlyReport") + public void downloadMonthlyReport(@RequestParam Map params, HttpServletResponse response, HttpServletRequest request) { + String filePath = speciesDailyStatService.getBirdDataMonthlyStatFileByParam(params); + if (filePath != null) { + try { + String realFileName = System.currentTimeMillis() + ".xlsx"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + @PostMapping("/downloadYearlyReport") + public void downloadYearlyReport(@RequestParam Map params, HttpServletResponse response, HttpServletRequest request) { + String filePath = speciesDailyStatService.getBirdDataYearlyStatFileByParam(params); + if (filePath != null) { + try { + String realFileName = System.currentTimeMillis() + ".xlsx"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + @PostMapping("/monthlyReport") + public AjaxResult getBirdMonthlyStatReport(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesDailyStatService.getSpeciesMonthlyStatByParam(obj)); + } + + @PostMapping("/yearlyReport") + public AjaxResult getBirdYearlyStatReport(@RequestBody JSONObject obj) { + return AjaxResult.success(speciesDailyStatService.getSpeciesYearlyStatByParam(obj)); + } + + @PostMapping("/sendWeeklyEmail") + public AjaxResult sendWeeklyEmail(@RequestBody JSONObject object) { + return AjaxResult.success(speciesDailyStatService.sendBirdDataWeeklyStatEmail(object)); + } + + @PostMapping("/sendMonthlyEmail") + public AjaxResult sendMonthlyEmail(@RequestBody JSONObject object) { + return AjaxResult.success(speciesDailyStatService.sendBirdDataMonthlyStatEmail(object)); + } + + @PostMapping("/sendYearlyEmail") + public AjaxResult sendYearlyEmail(@RequestBody JSONObject object) { + return AjaxResult.success(speciesDailyStatService.sendBirdDataYearlyStatEmail(object)); + } + + @PostMapping("/areaAmountInfo") + public JSONObject getAreaStatInfoByParam(@RequestBody JSONObject object) { + return speciesDailyStatService.getAreaStatInfoByParam(object); + } + + @GetMapping("/statAmountInfo/{type}") + public JSONObject getStatInfoByParam(@PathVariable int type) { + return speciesDailyStatService.getStatInfoByParam(type); + } + + @PostMapping("/yearAmountByMonth") + public JSONObject getSpeciesYearTotalStatByParam(@RequestBody JSONObject object) { + return speciesDailyStatService.getSpeciesYearTotalStatByParam(object); + } + + @PostMapping("/statInfoByParam") + public JSONObject getSpeciesStatInfoByParam(@RequestBody JSONObject object) { + return speciesDailyStatService.getSpeciesStatInfoByParam(object); + } + + @PostMapping("/speciesMediaStatList") + public JSONObject getSpeciesMediaListByParam(@RequestBody JSONObject object) { + return speciesDailyStatService.getSpeciesMediaListByParam(object); + } + + @PostMapping("/speciesStatList") + public JSONObject getSpeciesMediaStatInfoByParam(@RequestBody JSONObject object) { + return speciesDailyStatService.getSpeciesStatListByParam(object); + } + + + @PostMapping("/speciesAmountListByParam") + public JSONObject getSpeciesAmountReportByParam(@RequestBody JSONObject param) { + return speciesDailyStatService.getSpeciesAmountReportByParam(param); + } + + @PostMapping("/winterPeriodAmountByParam") + public JSONObject getSpeciesWinterAmountByParam(@RequestBody JSONObject param) { + return speciesDailyStatService.getSpeciesWinterPeriodAmountByParam(param); + } + + @PostMapping("/speciesStatListByParam") + public JSONObject getSpeciesDailyStatByParam(@RequestBody JSONObject param) { + return speciesDailyStatService.getSpeciesDailyStatByParam(param); + } + + @PostMapping("/speciesGroupStatListByParam") + public JSONObject getSpeciesGroupStatByParam(@RequestBody JSONObject param) { + return speciesDailyStatService.getSpeciesGroupStatByParam(param); + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesInhabitStatController.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesInhabitStatController.java new file mode 100644 index 0000000..4a5515c --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesInhabitStatController.java @@ -0,0 +1,97 @@ +package net.hzvtc.web.stat.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.web.stat.domain.SpeciesInhabitStat; +import net.hzvtc.web.stat.service.SpeciesInhabitStatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 物种生境数量统计Controller + * + * @author admin + * @date 2022-11-05 + */ +@RestController +@RequestMapping("/stat/bird/inhabit") +public class SpeciesInhabitStatController extends BaseController { + @Autowired + private SpeciesInhabitStatService speciesInhabitStatService; + + /** + * 查询物种生境数量统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabitstat:list')") + @GetMapping("/list") + public TableDataInfo list(SpeciesInhabitStat speciesInhabitStat) { + startPage(); + List list = speciesInhabitStatService.selectSpeciesInhabitStatList(speciesInhabitStat); + return getDataTable(list); + } + + @GetMapping("/amount") + public AjaxResult getAmount(SpeciesInhabitStat speciesInhabitStat) { + List list = speciesInhabitStatService.selectSpeciesInhabitStatList(speciesInhabitStat); + return AjaxResult.success(list); + } + + /** + * 导出物种生境数量统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabitstat:export')") + @Log(title = "物种生境数量统计", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SpeciesInhabitStat speciesInhabitStat) { + List list = speciesInhabitStatService.selectSpeciesInhabitStatList(speciesInhabitStat); + ExcelUtil util = new ExcelUtil(SpeciesInhabitStat.class); + util.exportExcel(response, list, "物种生境数量统计数据"); + } + + /** + * 获取物种生境数量统计详细信息 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabitstat:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(speciesInhabitStatService.selectSpeciesInhabitStatById(id)); + } + + /** + * 新增物种生境数量统计 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabitstat:add')") + @Log(title = "物种生境数量统计", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SpeciesInhabitStat speciesInhabitStat) { + return toAjax(speciesInhabitStatService.insertSpeciesInhabitStat(speciesInhabitStat)); + } + + /** + * 修改物种生境数量统计 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabitstat:edit')") + @Log(title = "物种生境数量统计", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SpeciesInhabitStat speciesInhabitStat) { + return toAjax(speciesInhabitStatService.updateSpeciesInhabitStat(speciesInhabitStat)); + } + + /** + * 删除物种生境数量统计 + */ + @PreAuthorize("@ss.hasPermi('stat:inhabitstat:remove')") + @Log(title = "物种生境数量统计", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(speciesInhabitStatService.deleteSpeciesInhabitStatByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesLocationInfoController.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesLocationInfoController.java new file mode 100644 index 0000000..c803a5d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesLocationInfoController.java @@ -0,0 +1,96 @@ +package net.hzvtc.web.stat.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.web.stat.domain.SpeciesLocationInfo; +import net.hzvtc.web.stat.service.SpeciesLocationInfoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 国内鸟类分布点Controller + * + * @author admin + * @date 2022-11-06 + */ +@RestController +@RequestMapping("/stat/bird/location") +public class SpeciesLocationInfoController extends BaseController { + @Autowired + private SpeciesLocationInfoService speciesLocationInfoService; + + /** + * 查询国内鸟类分布点列表 + */ + @PreAuthorize("@ss.hasPermi('stat:birdlocation:list')") + @GetMapping("/list") + public TableDataInfo list(SpeciesLocationInfo speciesLocationInfo) { + startPage(); + List list = speciesLocationInfoService.selectSpeciesLocationInfoList(speciesLocationInfo); + return getDataTable(list); + } + + @GetMapping("/listForWeb") + public AjaxResult listForWeb(SpeciesLocationInfo speciesLocationInfo) { + return AjaxResult.success(speciesLocationInfoService.selectSpeciesLocationInfoList(speciesLocationInfo)); + } + + /** + * 导出国内鸟类分布点列表 + */ + @PreAuthorize("@ss.hasPermi('stat:birdlocation:export')") + @Log(title = "国内鸟类分布点", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SpeciesLocationInfo speciesLocationInfo) { + List list = speciesLocationInfoService.selectSpeciesLocationInfoList(speciesLocationInfo); + ExcelUtil util = new ExcelUtil(SpeciesLocationInfo.class); + util.exportExcel(response, list, "国内鸟类分布点数据"); + } + + /** + * 获取国内鸟类分布点详细信息 + */ + @PreAuthorize("@ss.hasPermi('stat:birdlocation:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(speciesLocationInfoService.selectSpeciesLocationInfoById(id)); + } + + /** + * 新增国内鸟类分布点 + */ + @PreAuthorize("@ss.hasPermi('stat:birdlocation:add')") + @Log(title = "国内鸟类分布点", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SpeciesLocationInfo speciesLocationInfo) { + return toAjax(speciesLocationInfoService.insertSpeciesLocationInfo(speciesLocationInfo)); + } + + /** + * 修改国内鸟类分布点 + */ + @PreAuthorize("@ss.hasPermi('stat:birdlocation:edit')") + @Log(title = "国内鸟类分布点", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SpeciesLocationInfo speciesLocationInfo) { + return toAjax(speciesLocationInfoService.updateSpeciesLocationInfo(speciesLocationInfo)); + } + + /** + * 删除国内鸟类分布点 + */ + @PreAuthorize("@ss.hasPermi('stat:birdlocation:remove')") + @Log(title = "国内鸟类分布点", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(speciesLocationInfoService.deleteSpeciesLocationInfoByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesWinterPeriodController.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesWinterPeriodController.java new file mode 100644 index 0000000..f42a41a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/controller/SpeciesWinterPeriodController.java @@ -0,0 +1,96 @@ +package net.hzvtc.web.stat.controller; + +import net.hzvtc.common.annotation.Log; +import net.hzvtc.common.core.controller.BaseController; +import net.hzvtc.common.core.domain.AjaxResult; +import net.hzvtc.common.core.page.TableDataInfo; +import net.hzvtc.common.enums.BusinessType; +import net.hzvtc.common.utils.poi.ExcelUtil; +import net.hzvtc.web.stat.domain.SpeciesWinterPeriod; +import net.hzvtc.web.stat.service.SpeciesWinterPeriodService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 物种越冬期数量统计Controller + * + * @author admin + * @date 2022-11-04 + */ +@RestController +@RequestMapping("/stat/bird/winter/period/count") +public class SpeciesWinterPeriodController extends BaseController { + @Autowired + private SpeciesWinterPeriodService speciesWinterPeriodService; + + /** + * 查询物种越冬期数量统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:period:list')") + @GetMapping("/list") + public TableDataInfo list(SpeciesWinterPeriod speciesWinterPeriod) { + startPage(); + List list = speciesWinterPeriodService.selectSpeciesWinterPeriodList(speciesWinterPeriod); + return getDataTable(list); + } + + @GetMapping("/amount") + public AjaxResult getAmount(SpeciesWinterPeriod speciesWinterPeriod) { + return AjaxResult.success(speciesWinterPeriodService.selectSpeciesWinterPeriodList(speciesWinterPeriod)); + } + + /** + * 导出物种越冬期数量统计列表 + */ + @PreAuthorize("@ss.hasPermi('stat:period:export')") + @Log(title = "物种越冬期数量统计", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SpeciesWinterPeriod speciesWinterPeriod) { + List list = speciesWinterPeriodService.selectSpeciesWinterPeriodList(speciesWinterPeriod); + ExcelUtil util = new ExcelUtil(SpeciesWinterPeriod.class); + util.exportExcel(response, list, "物种越冬期数量统计数据"); + } + + /** + * 获取物种越冬期数量统计详细信息 + */ + @PreAuthorize("@ss.hasPermi('stat:period:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(speciesWinterPeriodService.selectSpeciesWinterPeriodById(id)); + } + + /** + * 新增物种越冬期数量统计 + */ + @PreAuthorize("@ss.hasPermi('stat:period:add')") + @Log(title = "物种越冬期数量统计", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SpeciesWinterPeriod speciesWinterPeriod) { + return toAjax(speciesWinterPeriodService.insertSpeciesWinterPeriod(speciesWinterPeriod)); + } + + /** + * 修改物种越冬期数量统计 + */ + @PreAuthorize("@ss.hasPermi('stat:period:edit')") + @Log(title = "物种越冬期数量统计", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SpeciesWinterPeriod speciesWinterPeriod) { + return toAjax(speciesWinterPeriodService.updateSpeciesWinterPeriod(speciesWinterPeriod)); + } + + /** + * 删除物种越冬期数量统计 + */ + @PreAuthorize("@ss.hasPermi('stat:period:remove')") + @Log(title = "物种越冬期数量统计", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(speciesWinterPeriodService.deleteSpeciesWinterPeriodByIds(ids)); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyInhabit.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyInhabit.java new file mode 100644 index 0000000..0aea1a0 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyInhabit.java @@ -0,0 +1,76 @@ +package net.hzvtc.web.stat.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 生境数量统计对象 species_daily_inhabit + * + * @author admin + * @date 2023-08-21 + */ +@Data +@Alias("SpeciesDailyInhabit") +public class SpeciesDailyInhabit { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * recordId + */ + @Excel(name = "recordId") + private Long recordId; + + private Long speciesId; + + /** + * 生境 + */ + @Excel(name = "生境") + private String habitat; + + /** + * areaId + */ + @Excel(name = "areaId") + private Long areaId; + + /** + * deviceId + */ + @Excel(name = "deviceId") + private Long deviceId; + + + /** + * 统计日期 + */ + private String statDate; + + /** + * 数量 + */ + @Excel(name = "数量") + private int amount; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("recordId", getRecordId()) + .append("habitat", getHabitat()) + .append("areaId", getAreaId()) + .append("deviceId", getDeviceId()) + .append("statDate", getStatDate()) + .append("amount", getAmount()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyStat.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyStat.java new file mode 100644 index 0000000..17d2ba4 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesDailyStat.java @@ -0,0 +1,75 @@ +package net.hzvtc.web.stat.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +import java.util.Date; + +/** + * 物种每日统计对象 species_daily_stat + * + * @author admin + * @date 2023-02-22 + */ +@Data +@Alias("SpeciesDailyStat") +public class SpeciesDailyStat { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 物种ID + */ + @Excel(name = "物种ID") + private Long speciesId; + + /** + * 保护区Id + */ + @Excel(name = "保护区Id") + private Long areaId; + + private Long deviceId; + + private Long recordId; + + /** + * 统计日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "统计日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date statDate; + + /** + * 最大值 + */ + @Excel(name = "最大值") + private int maxValue; + + /** + * 平均值 + */ + @Excel(name = "平均值") + private int avgValue; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("speciesId", getSpeciesId()) + .append("areaId", getAreaId()) + .append("statDate", getStatDate()) + .append("maxValue", getMaxValue()) + .append("avgValue", getAvgValue()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesInhabitStat.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesInhabitStat.java new file mode 100644 index 0000000..0cb4ded --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesInhabitStat.java @@ -0,0 +1,71 @@ +package net.hzvtc.web.stat.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; +/** + * 物种生境数量统计对象 species_inhabit_stat + * + * @author admin + * @date 2022-11-05 + */ +@Data +@Alias("SpeciesInhabitStat") +public class SpeciesInhabitStat extends BaseEntity + { +private static final long serialVersionUID=1L; + + /** id */ + private Long id; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long statYear; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long speciesId; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long areaId; + + /** 水域数量 */ + @Excel(name = "水域数量") + private Long data1; + + /** 泥滩数量 */ + @Excel(name = "泥滩数量") + private Long data2; + + /** 草洲数量 */ + @Excel(name = "草洲数量") + private Long data3; + + /** 农田数量 */ + @Excel(name = "农田数量") + private Long data4; + + /** 其他数量 */ + @Excel(name = "其他数量") + private Long data5; + + +@Override +public String toString(){ + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id",getId()) + .append("statYear",getStatYear()) + .append("speciesId",getSpeciesId()) + .append("areaId",getAreaId()) + .append("data1",getData1()) + .append("data2",getData2()) + .append("data3",getData3()) + .append("data4",getData4()) + .append("data5",getData5()) + .toString(); + } + } diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesLocationInfo.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesLocationInfo.java new file mode 100644 index 0000000..fceb4ec --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesLocationInfo.java @@ -0,0 +1,69 @@ +package net.hzvtc.web.stat.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 国内鸟类分布点对象 species_location_info + * + * @author admin + * @date 2022-11-06 + */ +@Data +@Alias("SpeciesLocationInfo") +public class SpeciesLocationInfo extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * $column.columnComment + */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long speciesId; + + /** + * 地点 + */ + @Excel(name = "地点") + private String name; + + /** + * 经度 + */ + @Excel(name = "经度") + private String longitude; + + /** + * 维度 + */ + @Excel(name = "维度") + private String latitude; + + /** + * 备注 + */ + @Excel(name = "备注") + private String memo; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("speciesId", getSpeciesId()) + .append("name", getName()) + .append("longitude", getLongitude()) + .append("latitude", getLatitude()) + .append("memo", getMemo()) + .append("isDeleted", getIsDeleted()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesWinterPeriod.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesWinterPeriod.java new file mode 100644 index 0000000..5ffd593 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/domain/SpeciesWinterPeriod.java @@ -0,0 +1,96 @@ +package net.hzvtc.web.stat.domain; + +import lombok.Data; +import net.hzvtc.common.annotation.Excel; +import net.hzvtc.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; + +/** + * 物种越冬期数量统计对象 species_winter_period + * + * @author admin + * @date 2022-11-04 + */ +@Data +@Alias("SpeciesWinterPeriod") +public class SpeciesWinterPeriod extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 年度 + */ + @Excel(name = "年度") + private Integer year; + + /** + * 保护区 + */ + @Excel(name = "保护区") + private Long areaId; + + /** + * 物种id + */ + @Excel(name = "物种id") + private Long speciesId; + + /** + * 10月数据 + */ + @Excel(name = "10月数据") + private int data1; + + /** + * 11月 + */ + @Excel(name = "11月") + private int data2; + + /** + * 12月 + */ + @Excel(name = "12月") + private int data3; + + /** + * 1月 + */ + @Excel(name = "1月") + private int data4; + + /** + * 2月 + */ + @Excel(name = "2月") + private int data5; + + /** + * 3月 + */ + @Excel(name = "3月") + private int data6; + + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("year", getYear()) + .append("areaId", getAreaId()) + .append("speciesId", getSpeciesId()) + .append("data1", getData1()) + .append("data2", getData2()) + .append("data3", getData3()) + .append("data4", getData4()) + .append("data5", getData5()) + .append("data6", getData6()) + .toString(); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/BirdWebPageStatMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/BirdWebPageStatMapper.java new file mode 100644 index 0000000..b5e58ad --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/BirdWebPageStatMapper.java @@ -0,0 +1,39 @@ +package net.hzvtc.web.stat.mapper; + +import net.hzvtc.bird.domain.BirdLeaveArriveInfo; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; +import java.util.Map; + +public interface BirdWebPageStatMapper { + List getBirdDailyAmountListByParam(Map map); + + List getBirdDailyAmountNormalListByParam(Map map); + + List getBirdAudioDailyStatListByParam(Map map); + + List getBirdAudioMonthStatListByParam(Map map); + + List getBirdAudioYearStatListByParam(Map map); + + List getBirdDailyAmountAbnormalListByParam(Map map); + + List getBirdDailyOtherAmountListByParam(Map map); + + List getBirdDailyFamilyListByParam(Map map); + + List getBirdPeriodStatByParam(Map map); + + List getBirdAudioMonthStatByParam(Map map); + + List getBirdAudioYearStatByParam(Map map); + + List getSpeciesWinterPeriodAudioAmountByParam(Map map); + + List getBirdMonthStatByParam(Map map); + + List getBirdStatYearInfoByParam(Map map); + + List getBirdArriveAndLeaveInfoByParam(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyInhabitMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyInhabitMapper.java new file mode 100644 index 0000000..31a9d5a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyInhabitMapper.java @@ -0,0 +1,46 @@ +package net.hzvtc.web.stat.mapper; + +import net.hzvtc.web.stat.domain.SpeciesDailyInhabit; + +import java.util.List; +import java.util.Map; + +/** + * 生境数量统计Mapper接口 + * + * @author admin + * @date 2023-08-21 + */ +public interface SpeciesDailyInhabitMapper { + /** + * 查询生境数量统计列表 + * + * @param speciesDailyInhabit 生境数量统计 + * @return 生境数量统计集合 + */ + public List selectSpeciesDailyInhabitList(SpeciesDailyInhabit speciesDailyInhabit); + + /** + * 新增生境数量统计 + * + * @param speciesDailyInhabit 生境数量统计 + * @return 结果 + */ + public int insertSpeciesDailyInhabit(SpeciesDailyInhabit speciesDailyInhabit); + + List getSpeciesDailyInhabitListByParam(Map map); + + List getSpeciesDailyInhabitRealListByParam(Map map); + + int batchInsertSpeciesDailyInhabit(List list); + + List getSpeciesDailyInhabitYearAmountListByParam(Map map); + + List getSpeciesDailyInhabitWeeklyAmountListByParam(Map map); + + List getSpeciesDailyInhabitMonthlyAmountListByParam(Map map); + + List getSpeciesInhabitStatYearListByParam(Map map); + + int deleteSpeciesDailyInhabitByDate(String statDate); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyStatMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyStatMapper.java new file mode 100644 index 0000000..56445e4 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesDailyStatMapper.java @@ -0,0 +1,80 @@ +package net.hzvtc.web.stat.mapper; + +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.web.stat.domain.SpeciesDailyStat; + +import java.util.List; +import java.util.Map; + +/** + * 物种每日统计Mapper接口 + * + * @author admin + * @date 2023-02-22 + */ +public interface SpeciesDailyStatMapper { + /** + * 查询物种每日统计列表 + * + * @param speciesDailyStat 物种每日统计 + * @return 物种每日统计集合 + */ + List selectSpeciesDailyStatList(SpeciesDailyStat speciesDailyStat); + + List getSpeciesDailyStatListByParam(Map map); + + List getRecordDateListByParam(Map map); + + List getBirdPeriodStatByParam(Map map); + + List getSpeciesDailyStatByParam(Map map); + + List getSpeciesGroupStatByParam(Map map); + + List getBirdMonthStatByParam(Map map); + + List getSpeciesWinterPeriodData(Map map); + + List getSpeciesWeeklyStatByDeviceId(Map map); + + List getSpeciesMonthlyStatByDeviceId(Map map); + + List getSpeciesYearlyStatByDeviceId(Map map); + + List getSpeciesYearlyStatBySpeciesId(Map map); + + List getSpeciesWeeklyStatBySpeciesId(Map map); + + List getSpeciesYearTotalStatByParam(Map map); + + List getSpeciesStatInfoByParam(Map map); + + List getSpeciesAmountReportByParam(Map map); + + List getSpeciesMonthlyStatBySpeciesId(Map map); + + List getSpeciesWinterPeriodAmountByParam(Map map); + + + int getBirdCatalogueAmount(); + + int getBirdFamilyAmount(); + + int getBirdGenusAmount(); + + /** + * 新增物种每日统计 + * + * @param speciesDailyStat 物种每日统计 + * @return 结果 + */ + int insertSpeciesDailyStat(SpeciesDailyStat speciesDailyStat); + + int batchInsertSpeciesDailyStat(List list); + + int deleteSpeciesDailyStatByDate(String statDate); + + Integer getSpeciesAmountByParam(Map map); + + Integer getStatAmountByParam(Map map); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesInhabitStatMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesInhabitStatMapper.java new file mode 100644 index 0000000..a786a88 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesInhabitStatMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.web.stat.mapper; + +import java.util.List; +import net.hzvtc.web.stat.domain.SpeciesInhabitStat; + +/** + * 物种生境数量统计Mapper接口 + * + * @author admin + * @date 2022-11-05 + */ +public interface SpeciesInhabitStatMapper +{ + /** + * 查询物种生境数量统计 + * + * @param id 物种生境数量统计主键 + * @return 物种生境数量统计 + */ + public SpeciesInhabitStat selectSpeciesInhabitStatById(Long id); + + /** + * 查询物种生境数量统计列表 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 物种生境数量统计集合 + */ + public List selectSpeciesInhabitStatList(SpeciesInhabitStat speciesInhabitStat); + + /** + * 新增物种生境数量统计 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 结果 + */ + public int insertSpeciesInhabitStat(SpeciesInhabitStat speciesInhabitStat); + + /** + * 修改物种生境数量统计 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 结果 + */ + public int updateSpeciesInhabitStat(SpeciesInhabitStat speciesInhabitStat); + + /** + * 删除物种生境数量统计 + * + * @param id 物种生境数量统计主键 + * @return 结果 + */ + public int deleteSpeciesInhabitStatById(Long id); + + /** + * 批量删除物种生境数量统计 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSpeciesInhabitStatByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesLocationInfoMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesLocationInfoMapper.java new file mode 100644 index 0000000..65976fe --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesLocationInfoMapper.java @@ -0,0 +1,61 @@ +package net.hzvtc.web.stat.mapper; + +import java.util.List; +import net.hzvtc.web.stat.domain.SpeciesLocationInfo; + +/** + * 国内鸟类分布点Mapper接口 + * + * @author admin + * @date 2022-11-06 + */ +public interface SpeciesLocationInfoMapper +{ + /** + * 查询国内鸟类分布点 + * + * @param id 国内鸟类分布点主键 + * @return 国内鸟类分布点 + */ + public SpeciesLocationInfo selectSpeciesLocationInfoById(Long id); + + /** + * 查询国内鸟类分布点列表 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 国内鸟类分布点集合 + */ + public List selectSpeciesLocationInfoList(SpeciesLocationInfo speciesLocationInfo); + + /** + * 新增国内鸟类分布点 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 结果 + */ + public int insertSpeciesLocationInfo(SpeciesLocationInfo speciesLocationInfo); + + /** + * 修改国内鸟类分布点 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 结果 + */ + public int updateSpeciesLocationInfo(SpeciesLocationInfo speciesLocationInfo); + + /** + * 删除国内鸟类分布点 + * + * @param id 国内鸟类分布点主键 + * @return 结果 + */ + public int deleteSpeciesLocationInfoById(Long id); + + /** + * 批量删除国内鸟类分布点 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSpeciesLocationInfoByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesWinterPeriodMapper.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesWinterPeriodMapper.java new file mode 100644 index 0000000..ed06cbe --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/mapper/SpeciesWinterPeriodMapper.java @@ -0,0 +1,63 @@ +package net.hzvtc.web.stat.mapper; + +import net.hzvtc.web.stat.domain.SpeciesWinterPeriod; + +import java.util.List; + +/** + * 物种越冬期数量统计Mapper接口 + * + * @author admin + * @date 2022-11-04 + */ +public interface SpeciesWinterPeriodMapper { + /** + * 查询物种越冬期数量统计 + * + * @param id 物种越冬期数量统计主键 + * @return 物种越冬期数量统计 + */ + public SpeciesWinterPeriod selectSpeciesWinterPeriodById(Long id); + + /** + * 查询物种越冬期数量统计列表 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 物种越冬期数量统计集合 + */ + public List selectSpeciesWinterPeriodList(SpeciesWinterPeriod speciesWinterPeriod); + + /** + * 新增物种越冬期数量统计 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 结果 + */ + public int insertSpeciesWinterPeriod(SpeciesWinterPeriod speciesWinterPeriod); + + /** + * 修改物种越冬期数量统计 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 结果 + */ + public int updateSpeciesWinterPeriod(SpeciesWinterPeriod speciesWinterPeriod); + + int batchInsertSpeciesWinterPeriod(List list); + + /** + * 删除物种越冬期数量统计 + * + * @param id 物种越冬期数量统计主键 + * @return 结果 + */ + public int deleteSpeciesWinterPeriodById(Long id); + + /** + * 批量删除物种越冬期数量统计 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSpeciesWinterPeriodByIds(Long[] ids); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/BirdWebPageStatService.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/BirdWebPageStatService.java new file mode 100644 index 0000000..ef9d5c7 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/BirdWebPageStatService.java @@ -0,0 +1,34 @@ +package net.hzvtc.web.stat.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; + +import java.util.List; + +public interface BirdWebPageStatService { + JSONObject getBirdDailyAmountListByParam(JSONObject param); + + JSONObject getBirdDailyStatListByParam(JSONObject param); + + JSONObject getBirdAudioDailyStatListByParam(JSONObject param); + + List getBirdDailyFamilyListByParam(JSONObject param); + + JSONObject getBirdPeriodStatByParam(JSONObject param); + + JSONObject getBirdMonthStatByParam(JSONObject param); + + List getBirdStatYearInfoByParam(JSONObject param); + + JSONObject getBirdAudioMonthStatListByParam(JSONObject param); + + JSONObject getBirdAudioYearStatListByParam(JSONObject param); + + JSONObject getBirdArriveAndLeaveInfoByParam(JSONObject param); + + JSONObject getBirdAudioMonthStatByParam(JSONObject param); + + JSONObject getBirdAudioYearStatByParam(JSONObject param); + + JSONObject getSpeciesWinterPeriodAudioAmountByParam(JSONObject param); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyInhabitService.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyInhabitService.java new file mode 100644 index 0000000..5c4b8ef --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyInhabitService.java @@ -0,0 +1,51 @@ +package net.hzvtc.web.stat.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.web.stat.domain.SpeciesDailyInhabit; + +import java.util.List; +import java.util.Map; + +/** + * 生境数量统计Service接口 + * + * @author admin + * @date 2023-08-21 + */ +public interface SpeciesDailyInhabitService { + + /** + * 查询生境数量统计列表 + * + * @param speciesDailyInhabit 生境数量统计 + * @return 生境数量统计集合 + */ + public List selectSpeciesDailyInhabitList(SpeciesDailyInhabit speciesDailyInhabit); + + /** + * 新增生境数量统计 + * + * @param speciesDailyInhabit 生境数量统计 + * @return 结果 + */ + public int insertSpeciesDailyInhabit(SpeciesDailyInhabit speciesDailyInhabit); + + List getSpeciesDailyInhabitListByParam(Map map); + + List getSpeciesDailyInhabitRealListByParam(Map map); + + int batchInsertSpeciesDailyInhabit(List list); + + List getSpeciesDailyInhabitYearAmountListByParam(Map map); + + List getSpeciesDailyInhabitWeeklyAmountListByParam(Map map); + + List getSpeciesDailyInhabitMonthlyAmountListByParam(Map map); + + List getSpeciesInhabitStatYearListByParam(Map map); + + JSONArray getSpeciesListByParam(JSONObject param); + + int deleteSpeciesDailyInhabitByDate(String statDate); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyStatService.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyStatService.java new file mode 100644 index 0000000..d718e13 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesDailyStatService.java @@ -0,0 +1,98 @@ +package net.hzvtc.web.stat.service; + +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.web.stat.domain.SpeciesDailyStat; + +import java.util.List; +import java.util.Map; + +/** + * 物种每日统计Service接口 + * + * @author admin + * @date 2023-02-22 + */ +public interface SpeciesDailyStatService { + /** + * 查询物种每日统计列表 + * + * @param speciesDailyStat 物种每日统计 + * @return 物种每日统计集合 + */ + List selectSpeciesDailyStatList(SpeciesDailyStat speciesDailyStat); + + /** + * 新增物种每日统计 + * + * @param speciesDailyStat 物种每日统计 + * @return 结果 + */ + int insertSpeciesDailyStat(SpeciesDailyStat speciesDailyStat); + + List getSpeciesDailyStatListByParam(JSONObject object); + + List getSpeciesDailyStatListByParam(Map map); + + void calculateDailyResultRecord(String calcDate); + + void calculateAllResultRecord(); + + JSONObject getBirdPeriodStatByParam(JSONObject object); + + List getBirdPeriodStatListByParam(JSONObject object); + + JSONObject getBirdMonthStatByParam(JSONObject param); + + List getBirdMonthStatListByParam(JSONObject param); + + JSONObject getSpeciesDailyStatByParam(JSONObject param); + + JSONObject getSpeciesGroupStatByParam(JSONObject param); + + List getSpeciesWinterPeriodData(Map map); + + JSONObject getSpeciesWeeklyReportByParam(JSONObject param); + + + JSONObject getSpeciesMonthlyStatByParam(JSONObject param); + + JSONObject getSpeciesYearlyStatByParam(JSONObject param); + + String getBirdDataWeeklyStatFileByParam(Map map); + + String getBirdDataMonthlyStatFileByParam(Map map); + + String getBirdDataYearlyStatFileByParam(Map map); + + boolean sendBirdDataWeeklyStatEmail(JSONObject param); + + boolean sendBirdDataMonthlyStatEmail(JSONObject param); + + boolean sendBirdDataYearlyStatEmail(JSONObject param); + + int deleteSpeciesDailyStatByDate(String statDate); + + JSONObject getAreaStatInfoByParam(JSONObject param); + + JSONObject getStatInfoByParam(int type); + + JSONObject getSpeciesYearTotalStatByParam(JSONObject param); + + JSONObject getSpeciesStatInfoByParam(JSONObject param); + + JSONObject getSpeciesMediaListByParam(JSONObject param); + + JSONObject getSpeciesStatListByParam(JSONObject param); + + JSONObject getSpeciesAmountReportByParam(JSONObject param); + + JSONObject getSpeciesWinterPeriodAmountByParam(JSONObject param); + + int getBirdCatalogueAmount(); + + int getBirdFamilyAmount(); + + int getBirdGenusAmount(); + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesInhabitStatService.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesInhabitStatService.java new file mode 100644 index 0000000..49c1a3d --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesInhabitStatService.java @@ -0,0 +1,61 @@ +package net.hzvtc.web.stat.service; + +import java.util.List; + +import net.hzvtc.web.stat.domain.SpeciesInhabitStat; + +/** + * 物种生境数量统计Service接口 + * + * @author admin + * @date 2022-11-05 + */ +public interface SpeciesInhabitStatService { + /** + * 查询物种生境数量统计 + * + * @param id 物种生境数量统计主键 + * @return 物种生境数量统计 + */ + public SpeciesInhabitStat selectSpeciesInhabitStatById(Long id); + + /** + * 查询物种生境数量统计列表 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 物种生境数量统计集合 + */ + public List selectSpeciesInhabitStatList(SpeciesInhabitStat speciesInhabitStat); + + /** + * 新增物种生境数量统计 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 结果 + */ + public int insertSpeciesInhabitStat(SpeciesInhabitStat speciesInhabitStat); + + /** + * 修改物种生境数量统计 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 结果 + */ + public int updateSpeciesInhabitStat(SpeciesInhabitStat speciesInhabitStat); + + /** + * 批量删除物种生境数量统计 + * + * @param ids 需要删除的物种生境数量统计主键集合 + * @return 结果 + */ + public int deleteSpeciesInhabitStatByIds(Long[] ids); + + /** + * 删除物种生境数量统计信息 + * + * @param id 物种生境数量统计主键 + * @return 结果 + */ + public int deleteSpeciesInhabitStatById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesLocationInfoService.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesLocationInfoService.java new file mode 100644 index 0000000..7b277da --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesLocationInfoService.java @@ -0,0 +1,61 @@ +package net.hzvtc.web.stat.service; + +import java.util.List; + +import net.hzvtc.web.stat.domain.SpeciesLocationInfo; + +/** + * 国内鸟类分布点Service接口 + * + * @author admin + * @date 2022-11-06 + */ +public interface SpeciesLocationInfoService { + /** + * 查询国内鸟类分布点 + * + * @param id 国内鸟类分布点主键 + * @return 国内鸟类分布点 + */ + public SpeciesLocationInfo selectSpeciesLocationInfoById(Long id); + + /** + * 查询国内鸟类分布点列表 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 国内鸟类分布点集合 + */ + public List selectSpeciesLocationInfoList(SpeciesLocationInfo speciesLocationInfo); + + /** + * 新增国内鸟类分布点 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 结果 + */ + public int insertSpeciesLocationInfo(SpeciesLocationInfo speciesLocationInfo); + + /** + * 修改国内鸟类分布点 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 结果 + */ + public int updateSpeciesLocationInfo(SpeciesLocationInfo speciesLocationInfo); + + /** + * 批量删除国内鸟类分布点 + * + * @param ids 需要删除的国内鸟类分布点主键集合 + * @return 结果 + */ + public int deleteSpeciesLocationInfoByIds(Long[] ids); + + /** + * 删除国内鸟类分布点信息 + * + * @param id 国内鸟类分布点主键 + * @return 结果 + */ + public int deleteSpeciesLocationInfoById(Long id); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesWinterPeriodService.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesWinterPeriodService.java new file mode 100644 index 0000000..0f0c3d6 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/SpeciesWinterPeriodService.java @@ -0,0 +1,63 @@ +package net.hzvtc.web.stat.service; + +import net.hzvtc.web.stat.domain.SpeciesWinterPeriod; + +import java.util.List; + +/** + * 物种越冬期数量统计Service接口 + * + * @author admin + * @date 2022-11-04 + */ +public interface SpeciesWinterPeriodService { + /** + * 查询物种越冬期数量统计 + * + * @param id 物种越冬期数量统计主键 + * @return 物种越冬期数量统计 + */ + public SpeciesWinterPeriod selectSpeciesWinterPeriodById(Long id); + + /** + * 查询物种越冬期数量统计列表 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 物种越冬期数量统计集合 + */ + public List selectSpeciesWinterPeriodList(SpeciesWinterPeriod speciesWinterPeriod); + + /** + * 新增物种越冬期数量统计 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 结果 + */ + public int insertSpeciesWinterPeriod(SpeciesWinterPeriod speciesWinterPeriod); + + /** + * 修改物种越冬期数量统计 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 结果 + */ + public int updateSpeciesWinterPeriod(SpeciesWinterPeriod speciesWinterPeriod); + + /** + * 批量删除物种越冬期数量统计 + * + * @param ids 需要删除的物种越冬期数量统计主键集合 + * @return 结果 + */ + public int deleteSpeciesWinterPeriodByIds(Long[] ids); + + /** + * 删除物种越冬期数量统计信息 + * + * @param id 物种越冬期数量统计主键 + * @return 结果 + */ + public int deleteSpeciesWinterPeriodById(Long id); + + void calcSpeciesWinterPeriodByParam(); +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/BirdWebPageStatServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/BirdWebPageStatServiceImpl.java new file mode 100644 index 0000000..8131fea --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/BirdWebPageStatServiceImpl.java @@ -0,0 +1,473 @@ +package net.hzvtc.web.stat.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.web.stat.mapper.BirdWebPageStatMapper; +import net.hzvtc.web.stat.service.BirdWebPageStatService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class BirdWebPageStatServiceImpl implements BirdWebPageStatService { + @Resource + private BirdWebPageStatMapper birdWebPageStatMapper; + + @Override + public JSONObject getBirdDailyAmountListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Integer limit = param.getInteger("limit"); + if (limit == null) { + limit = 10; + } + map.put("limit", limit); + map.put("isCommont", 1); + List list = birdWebPageStatMapper.getBirdDailyAmountListByParam(map); + if (list != null && list.size() > 0) { + List ids = list.stream().map(item -> item.getId()).collect(Collectors.toList()); + map.put("list", ids); + List otherList = birdWebPageStatMapper.getBirdDailyOtherAmountListByParam(map); + if (otherList != null && otherList.size() > 0) { + BirdStatDataVo data = otherList.get(0); + data.setName("其他"); + list.add(data); + } + JSONArray array = new JSONArray(); + Map> arealist = list.stream().collect(Collectors.groupingBy(BirdStatDataVo::getName, LinkedHashMap::new, Collectors.toList())); + arealist.forEach((key, data) -> { + JSONObject obj = new JSONObject(); + obj.put("name", key); + int[] data1 = {0}; + int[] data2 = {0}; + data.stream().forEach(item -> { + if (item.getHour() <= 12) { + if (item.getCount() > data1[0]) { + data1[0] = item.getCount(); + } + } else { + if (item.getCount() > data2[0]) { + data2[0] = item.getCount(); + } + } + }); + obj.put("data1", data1[0]); + obj.put("data2", data2[0]); + array.add(obj); + }); + result.put("list", array); + } + return result; + } + + @Override + public JSONObject getBirdDailyStatListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + List list = birdWebPageStatMapper.getBirdDailyAmountNormalListByParam(map); + if (list != null && !list.isEmpty()) { + List ids = list.stream().map(BirdStatDataVo::getId).collect(Collectors.toList()); + map.put("list", ids); + } else { + list = new ArrayList<>(); + } +// List sublist = birdWebPageStatMapper.getBirdDailyAmountAbnormalListByParam(map); +// list.addAll(sublist); + if (list != null && list.size() > 0) { + + JSONArray array = new JSONArray(); + Map> arealist = list.stream().collect(Collectors.groupingBy(BirdStatDataVo::getId, LinkedHashMap::new, Collectors.toList())); + arealist.forEach((key, data) -> { + JSONObject obj = new JSONObject(); + obj.put("id", key); + int[] data1 = {0}; + int[] data2 = {0}; + String[] name = {""}; + Long[] familyId = {0L}; + String[] familyName = {""}; + data.stream().forEach(item -> { + name[0] = item.getName(); + familyId[0] = item.getFamilyId(); + familyName[0] = item.getFamilyName(); + if (item.getHour() <= 12) { + if (item.getCount() > data1[0]) { + data1[0] = item.getCount(); + } + } else { + if (item.getCount() > data2[0]) { + data2[0] = item.getCount(); + } + } + }); + obj.put("data1", data1[0]); + obj.put("data2", data2[0]); + obj.put("dataAll", data1[0] + data2[0]); + obj.put("name", name[0]); + obj.put("familyId", familyId[0]); + obj.put("familyName", familyName[0]); + array.add(obj); + }); + array.sort(Comparator.comparing(obj -> ((JSONObject) obj).getInteger("dataAll")).reversed()); + result.put("list", array); + } + return result; + } + + @Override + public JSONObject getBirdAudioDailyStatListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + List list = birdWebPageStatMapper.getBirdAudioDailyStatListByParam(map); + if (list != null && !list.isEmpty()) { + int hourAmount[] = new int[24]; + JSONArray array = new JSONArray(); + list.forEach(item -> { + hourAmount[item.getHour()] += item.getCount(); + }); + result.put("hourAmount", hourAmount); + Map> subList = list.stream().collect(Collectors.groupingBy(BirdStatDataVo::getSpeciesId, LinkedHashMap::new, Collectors.toList())); + subList.forEach((key, data) -> { + JSONObject obj = new JSONObject(); + obj.put("id", key); + String[] name = {""}; + Long[] familyId = {0L}; + String[] familyName = {""}; + String[] code = {""}; + String[] codeName = {""}; + int[] amount = {0, 0}; + data.stream().forEach(item -> { + name[0] = item.getName(); + familyId[0] = item.getFamilyId(); + familyName[0] = item.getFamilyName(); + code[0] = item.getCode(); + codeName[0] = item.getCodeName(); + if (item.getHour() < 18 && item.getHour() >= 6) { + amount[0] += item.getCount(); + } else { + amount[1] += item.getCount(); + } + }); + obj.put("data1", amount[0]); + obj.put("data2", amount[1]); + obj.put("dataAll", amount[0] + amount[1]); +// obj.put("data3", amount[2]); +// obj.put("data4", amount[3]); + //obj.put("amount", amount[0] + amount[1] + amount[2] + amount[3]); + obj.put("name", name[0]); + obj.put("familyId", familyId[0]); + obj.put("familyName", familyName[0]); + obj.put("code", code[0]); + obj.put("codeName", codeName[0]); + array.add(obj); + }); + array.sort(Comparator.comparing(obj -> ((JSONObject) obj).getInteger("dataAll")).reversed()); + result.put("list", array); + } + return result; + } + + @Override + public List getBirdDailyFamilyListByParam(JSONObject param) { + Map map = new HashMap<>(); + String calcDate = param.getString("calcDate"); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + if (calcDate == null || calcDate.isEmpty()) { + calcDate = df.format(new Date()); + } + map.put("calcDate", calcDate); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + return birdWebPageStatMapper.getBirdDailyFamilyListByParam(map); + } + + @Override + public JSONObject getBirdPeriodStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String dateTo = param.getString("dateTo"); + if (dateTo == null || dateTo.isEmpty()) { + dateTo = df.format(new Date()); + } + map.put("dateTo", dateTo); + String dateFrom = param.getString("dateFrom"); + if (dateFrom == null || dateFrom.isEmpty()) { + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTime(df.parse(dateTo)); + calendar.add(calendar.DATE, -30); + Date minDate = calendar.getTime(); + dateFrom = df.format(minDate); + } catch (Exception ex) { + + } + } + map.put("dateFrom", dateFrom); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + result.put("list", birdWebPageStatMapper.getBirdPeriodStatByParam(map)); + result.put("dateFrom", dateFrom); + result.put("dateTo", dateTo); + return result; + } + + @Override + public JSONObject getBirdMonthStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Integer calcYear = param.getInteger("calcYear"); + if (calcYear == null) { + calcYear = Calendar.getInstance().get(Calendar.YEAR); + } + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + map.put("calcYear", calcYear); + result.put("list", birdWebPageStatMapper.getBirdMonthStatByParam(map)); + result.put("calcYear", calcYear); + return result; + } + + @Override + public List getBirdStatYearInfoByParam(JSONObject param) { + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Integer startYear = param.getInteger("calcStartYear"); + map.put("startYear", startYear); + Integer endYear = param.getInteger("calcEndYear"); + map.put("endYear", endYear); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + return birdWebPageStatMapper.getBirdStatYearInfoByParam(map); + } + + @Override + public JSONObject getBirdAudioMonthStatListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Integer calcYear = param.getInteger("calcYear"); + if (calcYear == null) { + calcYear = LocalDate.now().getYear(); + } + map.put("calcYear", calcYear); + List list = birdWebPageStatMapper.getBirdAudioMonthStatListByParam(map); + if (list != null && list.size() > 0) { + Map> subList = list.stream().collect(Collectors.groupingBy(BirdStatDataVo::getMonth, LinkedHashMap::new, Collectors.toList())); + JSONArray array = new JSONArray(); + subList.forEach((key, data) -> { + JSONObject obj = new JSONObject(); + obj.put("month", key); + int[] amount = {0, 0}; + data.stream().forEach(item -> { + if (item.getHour() < 18 && item.getHour() >= 6) { + amount[0] += item.getCount(); + } else { + amount[1] += item.getCount(); + } + }); + obj.put("data1", amount[0]); + obj.put("data2", amount[1]); +// obj.put("data3", amount[2]); +// obj.put("data4", amount[3]); + array.add(obj); + }); + result.put("list", array); + } + return result; + } + + @Override + public JSONObject getBirdAudioYearStatListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + Integer startYear = param.getInteger("startYear"); + map.put("startYear", startYear); + Integer endYear = param.getInteger("endYear"); + map.put("endYear", endYear); + List list = birdWebPageStatMapper.getBirdAudioYearStatListByParam(map); + if (list != null && list.size() > 0) { + Map> subList = list.stream().collect(Collectors.groupingBy(BirdStatDataVo::getYear, LinkedHashMap::new, Collectors.toList())); + JSONArray array = new JSONArray(); + subList.forEach((key, data) -> { + JSONObject obj = new JSONObject(); + obj.put("year", key); + int[] amount = {0, 0, 0, 0}; + data.stream().forEach(item -> { + if (item.getMonth() <= 3 && item.getMonth() >= 1) { + amount[0] += item.getCount(); + } else if (item.getMonth() <= 6 && item.getMonth() >= 4) { + amount[1] += item.getCount(); + } else if (item.getMonth() <= 9 && item.getMonth() >= 7) { + amount[2] += item.getCount(); + } else { + amount[3] += item.getCount(); + } + }); + obj.put("data1", amount[0]); + obj.put("data2", amount[1]); + obj.put("data3", amount[2]); + obj.put("data4", amount[3]); + array.add(obj); + }); + result.put("list", array); + } + return result; + } + + @Override + public JSONObject getBirdArriveAndLeaveInfoByParam(JSONObject param) { + Map map = new HashMap<>(); + JSONObject result = new JSONObject(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + if (speciesId != null) { + map.put("speciesId", speciesId); + Integer startYear = param.getInteger("calcStartYear"); + map.put("startYear", startYear); + Integer endYear = param.getInteger("calcEndYear"); + map.put("endYear", endYear); + } else { + Integer year = param.getInteger("calcYear"); + if (year == null) { + year = Calendar.getInstance().get(Calendar.YEAR) - 1; + } + map.put("year", year); + result.put("calcYear", year); + } + + result.put("list", birdWebPageStatMapper.getBirdArriveAndLeaveInfoByParam(map)); + return result; + } + + @Override + public JSONObject getBirdAudioMonthStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Integer year = param.getInteger("calcYear"); + if (year == null) { + year = LocalDate.now().getYear(); + } + map.put("calcYear", year); + List list = birdWebPageStatMapper.getBirdAudioMonthStatByParam(map); + result.put("list", list); + result.put("calcYear", year); + return result; + } + + @Override + public JSONObject getBirdAudioYearStatByParam(JSONObject param) { + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Integer calcStartYear = param.getInteger("calcStartYear"); + map.put("calcStartYear", calcStartYear); + Integer calcEndYear = param.getInteger("calcEndYear"); + map.put("calcEndYear", calcEndYear); + List list = birdWebPageStatMapper.getBirdAudioYearStatByParam(map); + JSONObject result = new JSONObject(); + result.put("list", list); + return result; + } + + @Override + public JSONObject getSpeciesWinterPeriodAudioAmountByParam(JSONObject param) { + JSONObject object = new JSONObject(); + JSONArray array = new JSONArray(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Integer startYear = param.getInteger("startYear"); + Integer endYear = param.getInteger("endYear"); + if (startYear == null && endYear == null) { + Integer curYear = LocalDate.now().getYear(); + array.add(getStatListByYear(curYear, map)); + object.put("startYear", curYear + ""); + object.put("endYear", curYear + ""); + } else if (startYear == null || endYear == null) { + Integer curYear = startYear == null ? endYear : startYear; + array.add(getStatListByYear(curYear, map)); + object.put("startYear", curYear + ""); + object.put("endYear", curYear + ""); + } else { + for (int i = startYear; i <= endYear; i++) { + array.add(getStatListByYear(i, map)); + } + object.put("startYear", startYear + ""); + object.put("endYear", endYear + ""); + } + object.put("list", array); + return object; + } + + private JSONObject getStatListByYear(Integer curYear, Map map) { + map.put("dateFrom", (curYear - 1) + "-10-01"); + map.put("dateTo", (curYear) + "-03-31"); + List list = birdWebPageStatMapper.getSpeciesWinterPeriodAudioAmountByParam(map); + JSONObject obj = new JSONObject(); + obj.put("year", curYear); + obj.put("list", list); + return obj; + } +} \ No newline at end of file diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyInhabitServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyInhabitServiceImpl.java new file mode 100644 index 0000000..b5e67b4 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyInhabitServiceImpl.java @@ -0,0 +1,141 @@ +package net.hzvtc.web.stat.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import net.hzvtc.web.stat.domain.SpeciesDailyInhabit; +import net.hzvtc.web.stat.mapper.SpeciesDailyInhabitMapper; +import net.hzvtc.web.stat.service.SpeciesDailyInhabitService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 生境数量统计Service业务层处理 + * + * @author admin + * @date 2023-08-21 + */ +@Service +public class SpeciesDailyInhabitServiceImpl implements SpeciesDailyInhabitService { + @Resource + private SpeciesDailyInhabitMapper speciesDailyInhabitMapper; + + + /** + * 查询生境数量统计列表 + * + * @param speciesDailyInhabit 生境数量统计 + * @return 生境数量统计 + */ + @Override + public List selectSpeciesDailyInhabitList(SpeciesDailyInhabit speciesDailyInhabit) { + return speciesDailyInhabitMapper.selectSpeciesDailyInhabitList(speciesDailyInhabit); + } + + /** + * 新增生境数量统计 + * + * @param speciesDailyInhabit 生境数量统计 + * @return 结果 + */ + @Override + public int insertSpeciesDailyInhabit(SpeciesDailyInhabit speciesDailyInhabit) { + return speciesDailyInhabitMapper.insertSpeciesDailyInhabit(speciesDailyInhabit); + } + + @Override + public List getSpeciesDailyInhabitListByParam(Map map) { + return speciesDailyInhabitMapper.getSpeciesDailyInhabitListByParam(map); + } + + @Override + public List getSpeciesDailyInhabitRealListByParam(Map map) { + return speciesDailyInhabitMapper.getSpeciesDailyInhabitRealListByParam(map); + } + + @Override + public int batchInsertSpeciesDailyInhabit(List list) { + return speciesDailyInhabitMapper.batchInsertSpeciesDailyInhabit(list); + } + + @Override + public List getSpeciesDailyInhabitYearAmountListByParam(Map map) { + return speciesDailyInhabitMapper.getSpeciesDailyInhabitYearAmountListByParam(map); + } + + @Override + public List getSpeciesDailyInhabitWeeklyAmountListByParam(Map map) { + return speciesDailyInhabitMapper.getSpeciesDailyInhabitWeeklyAmountListByParam(map); + } + + @Override + public List getSpeciesDailyInhabitMonthlyAmountListByParam(Map map) { + return speciesDailyInhabitMapper.getSpeciesDailyInhabitMonthlyAmountListByParam(map); + } + + @Override + public List getSpeciesInhabitStatYearListByParam(Map map) { + return speciesDailyInhabitMapper.getSpeciesInhabitStatYearListByParam(map); + } + + @Override + public JSONArray getSpeciesListByParam(JSONObject param) { + JSONArray array = new JSONArray(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Integer startYear = param.getInteger("startYear"); + map.put("startYear", startYear); + Integer endYear = param.getInteger("startYear"); + map.put("endYear", endYear); + List yearList = speciesDailyInhabitMapper.getSpeciesInhabitStatYearListByParam(map); + if (yearList != null && !yearList.isEmpty()) { + yearList.forEach(calcYear -> { + map.put("calcYear", calcYear); + List amountList = speciesDailyInhabitMapper.getSpeciesDailyInhabitYearAmountListByParam(map); + JSONObject object = combineObject(amountList); + object.put("statYear", calcYear); + array.add(object); + }); + } + return array; + } + + @Override + public int deleteSpeciesDailyInhabitByDate(String statDate) { + return speciesDailyInhabitMapper.deleteSpeciesDailyInhabitByDate(statDate); + } + + private JSONObject combineObject(List list) { + JSONObject obj = new JSONObject(); + if (list != null && !list.isEmpty()) { + list.forEach(item -> { + switch (item.getHabitat()) { + case "water": + obj.put("water", item.getAmount()); + break; + case "tree": + obj.put("tree", item.getAmount()); + break; + case "shoreside": + obj.put("shoreside", item.getAmount()); + break; + case "ground": + obj.put("ground", item.getAmount()); + break; + default: + obj.put("other", item.getAmount()); + break; + } + }); + } + return obj; + } + + +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyStatServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyStatServiceImpl.java new file mode 100644 index 0000000..a4d6474 --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesDailyStatServiceImpl.java @@ -0,0 +1,1366 @@ +package net.hzvtc.web.stat.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import net.hzvtc.area.domain.ProtectedArea; +import net.hzvtc.area.service.ProtectedAreaService; +import net.hzvtc.area.service.ProtectedAreaSpeciesService; +import net.hzvtc.common.utils.DateUtils; +import net.hzvtc.data.check.domain.ResultMedia; +import net.hzvtc.data.check.service.ResultMediaService; +import net.hzvtc.data.check.service.ResultRecordService; +import net.hzvtc.device.domain.DeviceInfo; +import net.hzvtc.device.service.DeviceInfoService; +import net.hzvtc.echart.domain.vo.BirdStatDataVo; +import net.hzvtc.echart.service.BirdDataStatService; +import net.hzvtc.email.service.EmailService; +import net.hzvtc.web.stat.domain.SpeciesDailyInhabit; +import net.hzvtc.web.stat.domain.SpeciesDailyStat; +import net.hzvtc.web.stat.mapper.SpeciesDailyStatMapper; +import net.hzvtc.web.stat.service.SpeciesDailyInhabitService; +import net.hzvtc.web.stat.service.SpeciesDailyStatService; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * 物种每日统计Service业务层处理 + * + * @author admin + * @date 2023-02-22 + */ +@Slf4j +@Service +public class SpeciesDailyStatServiceImpl implements SpeciesDailyStatService { + @Resource + private SpeciesDailyStatMapper speciesDailyStatMapper; + @Autowired + private ResultRecordService resultRecordService; + @Autowired + private DeviceInfoService deviceInfoService; + @Autowired + private SpeciesDailyInhabitService speciesDailyInhabitService; + @Autowired + private BirdDataStatService birdDataStatService; + @Autowired + private ProtectedAreaService protectedAreaService; + @Value("${hzvtc.dailyReportFilePath}") + private String dailyReportFilePath; + + @Value("${hzvtc.dailyReportFileOutPath}") + private String dailyReportFileOutPath; + + @Autowired + private EmailService emailService; + + @Autowired + private ProtectedAreaSpeciesService protectedAreaSpeciesService; + + @Autowired + private ResultMediaService resultMediaService; + + + /** + * 查询物种每日统计列表 + * + * @param speciesDailyStat 物种每日统计 + * @return 物种每日统计 + */ + @Override + public List selectSpeciesDailyStatList(SpeciesDailyStat speciesDailyStat) { + return speciesDailyStatMapper.selectSpeciesDailyStatList(speciesDailyStat); + } + + /** + * 新增物种每日统计 + * + * @param speciesDailyStat 物种每日统计 + * @return 结果 + */ + @Override + public int insertSpeciesDailyStat(SpeciesDailyStat speciesDailyStat) { + return speciesDailyStatMapper.insertSpeciesDailyStat(speciesDailyStat); + } + + @Override + public List getSpeciesDailyStatListByParam(JSONObject object) { + Map map = new HashMap<>(); + Long areaId = object.getLong("areaId"); + map.put("areaId", areaId); + String calcDate = object.getString("calcDate"); + map.put("calcDate", calcDate); + Integer recordType = object.getInteger("recordType"); + map.put("recordType", recordType); + JSONArray array = object.getJSONArray("list"); + if (array != null) { + List list = JSONArray.parseArray(array.toJSONString(), Long.class); + map.put("list", list); + } + return speciesDailyStatMapper.getSpeciesDailyStatListByParam(map); + } + + @Override + public List getSpeciesDailyStatListByParam(Map map) { + return speciesDailyStatMapper.getSpeciesDailyStatListByParam(map); + } + + @Override + @Transactional + public void calculateDailyResultRecord(String calcDate) { + Map map = new HashMap<>(); + if (calcDate == null || calcDate.isEmpty()) { + DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + calcDate = fmDate.format(LocalDate.now()); + } + speciesDailyStatMapper.deleteSpeciesDailyStatByDate(calcDate); + speciesDailyInhabitService.deleteSpeciesDailyInhabitByDate(calcDate); + map.put("calcDate", calcDate); + List areaList = resultRecordService.getResultAreaListByParam(map); + String finalCalcDate = calcDate; + areaList.forEach(areaId -> { + saveToSpeciesDailyStat(areaId, finalCalcDate); + }); + } + + private void saveToSpeciesDailyStat(Long areaId, String calcDate) { + Map map = new HashMap<>(); + List deviceIds = deviceInfoService.getDeviceCameraInfoByAreaId(areaId); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + deviceIds.forEach(deviceId -> { + //扫图(从监控视频中获取) + map.put("deviceId", deviceId); + map.put("recordType", 1); + map.put("calcDate", calcDate); + List list = speciesDailyStatMapper.getSpeciesDailyStatListByParam(map); + + if (list != null && list.size() > 0) { + //实时 + List speciesIds = list.stream().map(item -> item.getSpeciesId()).collect(Collectors.toList()); + map.put("list", speciesIds); + map.put("recordType", 2); + List sublist = speciesDailyStatMapper.getSpeciesDailyStatListByParam(map); + list.addAll(sublist); + } else { + //实时 + map.put("recordType", 2); + List sublist = speciesDailyStatMapper.getSpeciesDailyStatListByParam(map); + list = sublist; + } + if (list != null && list.size() > 0) { + list.forEach(item -> { + item.setAreaId(areaId); + item.setDeviceId(deviceId); + }); + speciesDailyStatMapper.batchInsertSpeciesDailyStat(list); + Map params = new HashMap<>(); + List dailyInhabits = new ArrayList<>(); + list.forEach(item -> { + params.put("speciesId", item.getSpeciesId()); + params.put("recordId", item.getRecordId()); + List inhabits = speciesDailyInhabitService.getSpeciesDailyInhabitRealListByParam(params); + if (inhabits != null && !inhabits.isEmpty()) { + dailyInhabits.addAll(inhabits); + } + }); + if (!dailyInhabits.isEmpty()) { + dailyInhabits.forEach(item -> { + item.setAreaId(areaId); + item.setDeviceId(deviceId); + item.setStatDate(calcDate); + }); + speciesDailyInhabitService.batchInsertSpeciesDailyInhabit(dailyInhabits); + } + } + }); + } + + @Override + public void calculateAllResultRecord() { + Map map = new HashMap<>(); + List areaList = resultRecordService.getResultAreaListByParam(map); + if (areaList != null && !areaList.isEmpty()) { + areaList.forEach(areaId -> { + map.put("areaId", areaId); + List calcDates = speciesDailyStatMapper.getRecordDateListByParam(map); + if (calcDates != null && !calcDates.isEmpty()) { + calcDates.forEach(calcDate -> { + saveToSpeciesDailyStat(areaId, calcDate); + }); + } + }); + } + } + + @Override + public JSONObject getBirdPeriodStatByParam(JSONObject object) { + Map map = new HashMap<>(); + Long areaId = object.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = object.getLong("speciesId"); + map.put("speciesId", speciesId); + DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String dateTo = object.getString("dateTo"); + if (dateTo == null || dateTo.isEmpty()) { + dateTo = fmDate.format(LocalDate.now()); + } + + String dateFrom = object.getString("dateFrom"); + if (dateFrom == null || dateFrom.isEmpty()) { + LocalDate before = LocalDate.parse(dateTo).plusDays(-30); + dateFrom = fmDate.format(before); + } + map.put("dateFrom", dateFrom); + map.put("dateTo", dateTo); + Long deviceId = object.getLong("deviceId"); + map.put("deviceId", deviceId); + JSONObject result = new JSONObject(); + result.put("list", speciesDailyStatMapper.getBirdPeriodStatByParam(map)); + result.put("dateFrom", dateFrom); + result.put("dateTo", dateTo); + return result; + } + + @Override + public List getBirdPeriodStatListByParam(JSONObject object) { + Map map = new HashMap<>(); + Long areaId = object.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = object.getLong("speciesId"); + map.put("speciesId", speciesId); + DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String dateTo = object.getString("dateTo"); + if (dateTo == null || dateTo.isEmpty()) { + dateTo = fmDate.format(LocalDate.now()); + } + + String dateFrom = object.getString("dateFrom"); + if (dateFrom == null || dateFrom.isEmpty()) { + LocalDate before = LocalDate.parse(dateTo).plusDays(-30); + dateFrom = fmDate.format(before); + } + map.put("dateFrom", dateFrom); + map.put("dateTo", dateTo); + Long deviceId = object.getLong("deviceId"); + map.put("deviceId", deviceId); + + return speciesDailyStatMapper.getBirdPeriodStatByParam(map); + } + + @Override + public JSONObject getBirdMonthStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + Integer calcYear = param.getInteger("calcYear"); + if (calcYear == null) { + calcYear = LocalDate.now().getYear(); + } + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + map.put("calcYear", calcYear); + result.put("list", speciesDailyStatMapper.getBirdMonthStatByParam(map)); + result.put("calcYear", calcYear); + return result; + } + + @Override + public List getBirdMonthStatListByParam(JSONObject param) { + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + Integer calcYear = param.getInteger("calcYear"); + if (calcYear == null) { + calcYear = LocalDate.now().getYear(); + } + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + map.put("calcYear", calcYear); + return speciesDailyStatMapper.getBirdMonthStatByParam(map); + } + + private Map createQueryParam(JSONObject param) { + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long deviceId = param.getLong("deviceId"); + map.put("deviceId", deviceId); + DateTimeFormatter fmDate = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String dateTo = param.getString("dateTo"); + + if (dateTo == null || dateTo.isEmpty()) { + dateTo = fmDate.format(LocalDate.now()); + } + + String dateFrom = param.getString("dateFrom"); + if (dateFrom == null || dateFrom.isEmpty()) { + LocalDate before = LocalDate.parse(dateTo).plusDays(-30); + dateFrom = fmDate.format(before); + } + + map.put("dateFrom", dateFrom); + map.put("dateTo", dateTo); + return map; + } + + @Override + public JSONObject getSpeciesDailyStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = createQueryParam(param); + result.put("dateFrom", map.get("dateFrom")); + result.put("dateTo", map.get("dateTo")); + List list = speciesDailyStatMapper.getSpeciesDailyStatByParam(map); + result.put("list", list); + return result; + } + + @Override + public JSONObject getSpeciesGroupStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = createQueryParam(param); + result.put("dateFrom", map.get("dateFrom")); + result.put("dateTo", map.get("dateTo")); + List list = speciesDailyStatMapper.getSpeciesGroupStatByParam(map); + result.put("list", list); + return result; + } + + @Override + public List getSpeciesWinterPeriodData(Map map) { + return speciesDailyStatMapper.getSpeciesWinterPeriodData(map); + } + + private Map getSpeciesWeeklyParam(JSONObject param) { + Map map = new HashMap(); + Long areaId = param.getLong("areaId"); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + map.put("dateBegin", DateUtils.getFirstDayOfWeek(calcDate)); + map.put("dateEnd", DateUtils.getLastDayOfWeek(calcDate)); + map.put("areaId", areaId); + map.put("isCommon", param.getInteger("isCommon")); + return map; + } + + @Override + public JSONObject getSpeciesWeeklyReportByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Long areaId = param.getLong("areaId"); + if (areaId == null) { + return result; + } + Map map = getSpeciesWeeklyParam(param); + + result.put("areaData", getSpeciesStatByDeviceId(map, areaId, 0, 1)); + result.put("speciesData", getSpeciesStatBySpeciesId(map, 0, 1)); + result.put("habitatData", getSpeciesStatByInhabit(map, 1)); + return result; + } + + + @Override + public JSONObject getSpeciesMonthlyStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Long areaId = param.getLong("areaId"); + if (areaId == null) { + return result; + } + Map map = new HashMap(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + String arr[] = calcDate.split("-"); + map.put("areaId", areaId); + map.put("year", Integer.parseInt(arr[0])); + map.put("month", Integer.parseInt(arr[1])); + int days = getDaysOfMonth(calcDate); + result.put("days", days); + result.put("areaData", getSpeciesStatByDeviceId(map, areaId, days, 2)); + result.put("speciesData", getSpeciesStatBySpeciesId(map, days, 2)); + result.put("habitatData", getSpeciesStatByInhabit(map, 2)); + return result; + } + + @Override + public JSONObject getSpeciesYearlyStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Long areaId = param.getLong("areaId"); + if (areaId == null) { + return result; + } + Map map = new HashMap(); + Integer year = param.getInteger("calcDate"); + if (year == null) { + SimpleDateFormat df = new SimpleDateFormat("yyyy"); + year = Integer.parseInt(df.format(new Date())); + } + map.put("year", year); + map.put("areaId", areaId); + result.put("areaData", getSpeciesStatByDeviceId(map, areaId, 12, 3)); + result.put("speciesData", getSpeciesStatBySpeciesId(map, 12, 3)); + result.put("habitatData", getSpeciesStatByInhabit(map, 3)); + return result; + } + + @Override + public String getBirdDataWeeklyStatFileByParam(Map param) { + try { + String areaId = (String) param.get("areaId"); + String areaName = ""; + + if (areaId != null && !areaId.isEmpty()) { + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + areaName = protectedArea.getName(); + } else { + return "500"; + } + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(dailyReportFilePath + "weekly_report_tmpl.xlsx")); + XSSFSheet sheet = xssfWorkbook.getSheetAt(0); + sheet.getRow(1).getCell(1).setCellValue(areaName + "鸟类监测周报"); + String calcDate = (String) param.get("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + String dateBegin = DateUtils.getFirstDayOfWeek(calcDate); + String dateEnd = DateUtils.getLastDayOfWeek(calcDate); + + //SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + sheet.getRow(2).getCell(1).setCellValue("日期:" + dateBegin + "~" + dateEnd); + sheet.getRow(4).getCell(1).setCellValue(areaName + "每周鸟类智慧监测数据,包含鸟类监测总数,关键鸟类生境分布和关键物种监测数量"); + param.put("dateBegin", dateBegin); + param.put("dateEnd", dateEnd); + param.put("limit", 8); + param.put("isCommon", 1); + JSONArray array = getSpeciesStatByDeviceId(param, Long.parseLong(areaId), 0, 1); + if (array != null) { + int[] sum = new int[8]; + AtomicInteger starRow = new AtomicInteger(8); + + array.stream().forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + int counts[] = new int[7]; + if (subarray != null) { + subarray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + counts[element.getWeekDay()] = element.getCount(); + }); + } + int i = 0; + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + sum[i++] += val; + } + Arrays.sort(counts); + int max = counts[counts.length - 1]; + sum[i] += max; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + int cell = 2; + starRow.set(28); + for (int val : sum) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + int start = 8 + array.size(); + for (int i = 0; i < 20 - array.size(); i++) { + XSSFRow row = sheet.getRow(start + i); + row.setZeroHeight(true); + } + } + + + array = getSpeciesStatBySpeciesId(param, 0, 1); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(43); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + // log.info("=====name==={}", obj.getString("name")); + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + int counts[] = new int[7]; + if (subarray != null) { + subarray.stream().map(el -> (BirdStatDataVo) el).forEach(element -> { + counts[element.getWeekDay()] = element.getCount(); + }); + } + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + Arrays.sort(counts); + int max = counts[counts.length - 1]; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + } + + array = getSpeciesStatByInhabit(param, 1); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(67); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + int counts[] = new int[5]; + JSONArray subarray = obj.getJSONArray("list"); + if (subarray != null) { + subarray.stream().map(el -> (SpeciesDailyInhabit) el).forEach(element -> { + //counts[element.getWeekDay()] = element.getCount(); + if ("ground".equals(element.getHabitat())) { + counts[0] = element.getAmount(); + } else if ("shoreside".equals(element.getHabitat())) { + counts[1] = element.getAmount(); + } else if ("water".equals(element.getHabitat())) { + counts[2] = element.getAmount(); + } else if ("tree".equals(element.getHabitat())) { + counts[3] = element.getAmount(); + } else { + counts[4] = element.getAmount(); + } + }); + } + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + starRow.getAndIncrement(); + }); + } + String outfile = dailyReportFileOutPath + areaName + "鸟类监测周报(日期" + dateBegin + "-" + dateEnd + ")" + ".xlsx"; + FileOutputStream fileOut = new FileOutputStream(outfile); + xssfWorkbook.write(fileOut); + xssfWorkbook.close(); + fileOut.close(); + return outfile; + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + @Override + public String getBirdDataMonthlyStatFileByParam(Map param) { + try { + String areaId = (String) param.get("areaId"); + String areaName = ""; + + if (areaId != null && !areaId.isEmpty()) { + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + areaName = protectedArea.getName(); + } else { + return "500"; + } + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(dailyReportFilePath + "monthly_report_tmpl.xlsx")); + XSSFSheet sheet = xssfWorkbook.getSheetAt(0); + sheet.getRow(1).getCell(1).setCellValue(areaName + "鸟类监测月报"); + String calcDate = (String) param.get("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + + String arr[] = calcDate.split("-"); + param.put("year", Integer.parseInt(arr[0])); + param.put("month", Integer.parseInt(arr[1])); + int days = getDaysOfMonth(calcDate); + sheet.getRow(2).getCell(1).setCellValue("日期:" + arr[0] + "年" + arr[1] + "月"); + sheet.getRow(4).getCell(1).setCellValue(areaName + "每月鸟类智慧监测数据,包含鸟类监测总数,关键鸟类生境分布和关键物种监测数量"); + + param.put("limit", 8); + param.put("isCommon", 1); + JSONArray array = getSpeciesStatByDeviceId(param, Long.parseLong(areaId), days, 2); + if (array != null) { + int[] sum = new int[days + 1]; + AtomicInteger starRow = new AtomicInteger(8); + + array.stream().forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + int max = 0; + for (int i = 0; i < days; i++) { + int val = (int) subarray.get(i); + if (val > max) { + max = val; + } + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + sum[i] += val; + } + sum[days] += max; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + int cell = 2; + starRow.set(28); + for (int val : sum) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + int start = 8 + array.size(); + for (int i = 0; i < 20 - array.size(); i++) { + XSSFRow row = sheet.getRow(start + i); + row.setZeroHeight(true); + } + } + array = getSpeciesStatBySpeciesId(param, days, 2); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(43); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + // log.info("=====name==={}", obj.getString("name")); + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + + int max = 0; + for (int i = 0; i < days; i++) { + int val = (int) subarray.get(i); + if (val > max) { + max = val; + } + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + } + + array = getSpeciesStatByInhabit(param, 2); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(67); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + int counts[] = new int[5]; + JSONArray subarray = obj.getJSONArray("list"); + if (subarray != null) { + subarray.stream().map(el -> (SpeciesDailyInhabit) el).forEach(element -> { + //counts[element.getWeekDay()] = element.getCount(); + if ("ground".equals(element.getHabitat())) { + counts[0] = element.getAmount(); + } else if ("shoreside".equals(element.getHabitat())) { + counts[1] = element.getAmount(); + } else if ("water".equals(element.getHabitat())) { + counts[2] = element.getAmount(); + } else if ("tree".equals(element.getHabitat())) { + counts[3] = element.getAmount(); + } else { + counts[4] = element.getAmount(); + } + }); + } + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + starRow.getAndIncrement(); + }); + } + String outfile = dailyReportFileOutPath + areaName + "鸟类监测周报(日期" + arr[0] + "年" + arr[1] + "月)" + ".xlsx"; + FileOutputStream fileOut = new FileOutputStream(outfile); + xssfWorkbook.write(fileOut); + xssfWorkbook.close(); + fileOut.close(); + return outfile; + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + @Override + public String getBirdDataYearlyStatFileByParam(Map param) { + try { + String areaId = (String) param.get("areaId"); + String areaName = ""; + + if (areaId != null && !areaId.isEmpty()) { + ProtectedArea protectedArea = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + areaName = protectedArea.getName(); + } else { + return "500"; + } + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(dailyReportFilePath + "yearly_report_tmpl.xlsx")); + XSSFSheet sheet = xssfWorkbook.getSheetAt(0); + sheet.getRow(1).getCell(1).setCellValue(areaName + "鸟类监测年报"); + String calcDate = (String) param.get("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy"); + calcDate = df.format(new Date()); + } + param.put("year", Integer.parseInt(calcDate)); + + sheet.getRow(2).getCell(1).setCellValue("日期:" + calcDate + "年"); + sheet.getRow(4).getCell(1).setCellValue(areaName + "每年鸟类智慧监测数据,包含鸟类监测总数,关键鸟类生境分布和关键物种监测数量"); + + param.put("limit", 8); + param.put("isCommon", 1); + JSONArray array = getSpeciesStatByDeviceId(param, Long.parseLong(areaId), 12, 3); + if (array != null) { + int[] sum = new int[13]; + AtomicInteger starRow = new AtomicInteger(8); + + array.stream().forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + int max = 0; + for (int i = 0; i < 12; i++) { + int val = (int) subarray.get(i); + if (val > max) { + max = val; + } + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + sum[i] += val; + } + sum[12] += max; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + int cell = 2; + starRow.set(28); + for (int val : sum) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + int start = 8 + array.size(); + for (int i = 0; i < 20 - array.size(); i++) { + XSSFRow row = sheet.getRow(start + i); + row.setZeroHeight(true); + } + } + array = getSpeciesStatBySpeciesId(param, 12, 3); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(43); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + // log.info("=====name==={}", obj.getString("name")); + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + JSONArray subarray = obj.getJSONArray("list"); + + int max = 0; + for (int i = 0; i < 12; i++) { + int val = (int) subarray.get(i); + if (val > max) { + max = val; + } + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(max); + starRow.getAndIncrement(); + }); + } + + array = getSpeciesStatByInhabit(param, 2); + if (array != null) { + AtomicInteger starRow = new AtomicInteger(67); + List list; + if (array.size() > 8) { + list = array.subList(0, 8); + } else { + list = array.subList(0, array.size()); + } + list.forEach(data -> { + JSONObject obj = (JSONObject) data; + int cell = 1; + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(obj.getString("name")); + int counts[] = new int[5]; + JSONArray subarray = obj.getJSONArray("list"); + if (subarray != null) { + subarray.stream().map(el -> (SpeciesDailyInhabit) el).forEach(element -> { + //counts[element.getWeekDay()] = element.getCount(); + if ("ground".equals(element.getHabitat())) { + counts[0] = element.getAmount(); + } else if ("shoreside".equals(element.getHabitat())) { + counts[1] = element.getAmount(); + } else if ("water".equals(element.getHabitat())) { + counts[2] = element.getAmount(); + } else if ("tree".equals(element.getHabitat())) { + counts[3] = element.getAmount(); + } else { + counts[4] = element.getAmount(); + } + }); + } + for (int val : counts) { + sheet.getRow(starRow.get()).getCell(cell++).setCellValue(val); + } + starRow.getAndIncrement(); + }); + } + String outfile = dailyReportFileOutPath + areaName + "鸟类监测周报(日期" + calcDate + "年)" + ".xlsx"; + FileOutputStream fileOut = new FileOutputStream(outfile); + xssfWorkbook.write(fileOut); + xssfWorkbook.close(); + fileOut.close(); + return outfile; + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + @Override + public boolean sendBirdDataWeeklyStatEmail(JSONObject param) { + String areaId = param.getString("areaId"); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + + ProtectedArea data = null; + if (areaId != null && !areaId.isEmpty()) { + data = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + } else { + return false; + } + String dateBegin = DateUtils.getFirstDayOfWeek(calcDate); + String dateEnd = DateUtils.getLastDayOfWeek(calcDate); + + Map map = new HashMap<>(); + map.put("calcDate", calcDate); + map.put("areaId", areaId); + map.put("dateBegin", dateBegin); + map.put("dateEnd", dateEnd); + + String filePath = getBirdDataWeeklyStatFileByParam(map); + if (filePath != null && !filePath.isEmpty()) { + emailService.sendEmailWithAttachment(data.getName() + "鸟类监测周报,检测时间:" + dateBegin + "~" + dateEnd, "附件为鸟类监测周报,检测时间为:" + dateBegin + "~" + dateEnd + ",请查收!", filePath, data.getEmail()); + return true; + } else { + return false; + } + } + + @Override + public boolean sendBirdDataMonthlyStatEmail(JSONObject param) { + String areaId = param.getString("areaId"); + if (areaId == null || areaId.isEmpty()) { + return false; + } + ProtectedArea data = null; + if (areaId != null && !areaId.isEmpty()) { + data = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + } else { + return false; + } + Map map = new HashMap(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + calcDate = df.format(new Date()); + } + String arr[] = calcDate.split("-"); + map.put("areaId", areaId); + map.put("calcDate", calcDate); + + String filePath = getBirdDataMonthlyStatFileByParam(map); + if (filePath != null && !filePath.isEmpty()) { + emailService.sendEmailWithAttachment(data.getName() + "鸟类监测月报,检测时间:" + arr[0] + "年" + arr[1] + "月", "附件为鸟类监测周报,检测时间为:" + arr[0] + "年" + arr[1] + "月,请查收!", filePath, data.getEmail()); + return true; + } else { + return false; + } + } + + @Override + public boolean sendBirdDataYearlyStatEmail(JSONObject param) { + String areaId = param.getString("areaId"); + if (areaId == null || areaId.isEmpty()) { + return false; + } + ProtectedArea data = null; + if (areaId != null && !areaId.isEmpty()) { + data = protectedAreaService.selectProtectedAreaById(Long.parseLong(areaId)); + } else { + return false; + } + Map map = new HashMap(); + String calcDate = param.getString("calcDate"); + if (calcDate == null || calcDate.isEmpty()) { + SimpleDateFormat df = new SimpleDateFormat("yyyy"); + calcDate = df.format(new Date()); + } + + map.put("areaId", areaId); + map.put("calcDate", calcDate); + + String filePath = getBirdDataYearlyStatFileByParam(map); + if (filePath != null && !filePath.isEmpty()) { + emailService.sendEmailWithAttachment(data.getName() + "鸟类监测年报,检测时间:" + calcDate + "年", "附件为鸟类监测周报,检测时间为:" + calcDate + "年,请查收!", filePath, data.getEmail()); + return true; + } else { + return false; + } + } + + @Override + public int deleteSpeciesDailyStatByDate(String statDate) { + return speciesDailyStatMapper.deleteSpeciesDailyStatByDate(statDate); + } + + @Override + public JSONObject getAreaStatInfoByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Integer total = speciesDailyStatMapper.getSpeciesAmountByParam(map); + result.put("total", total == null ? 0 : total); + LocalDate localDate = LocalDate.now(); + + map.put("statDate", localDate.toString()); + Integer today = speciesDailyStatMapper.getSpeciesAmountByParam(map); + result.put("today", today == null ? 0 : today); + LocalDate yesterday = localDate.plus(-1, ChronoUnit.DAYS); + map.put("statDate", yesterday.toString()); + Integer amount = speciesDailyStatMapper.getSpeciesAmountByParam(map); + result.put("yesterday", amount == null ? 0 : amount); + return result; + } + + @Override + public JSONObject getStatInfoByParam(int type) { + Map map = new HashMap<>(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDateTime endDate = LocalDateTime.now(); + LocalDateTime startDate = null; + if (type == 1) { + startDate = endDate.minusMonths(6); + map.put("dateFrom", startDate.format(df)); + map.put("dateTo", endDate.format(df)); + } else if (type == 2) { + startDate = endDate.minusDays(30); + map.put("dateFrom", startDate.format(df)); + map.put("dateTo", endDate.format(df)); + } else if (type == 3) { + startDate = endDate.minusDays(7); + map.put("dateFrom", startDate.format(df)); + map.put("dateTo", endDate.format(df)); + } else if (type == 4) { + startDate = endDate.minusDays(1); + map.put("statDate", startDate.format(df)); + } else if (type == 5) { + map.put("statDate", endDate.format(df)); + } + Integer total = speciesDailyStatMapper.getStatAmountByParam(map); + JSONObject result = new JSONObject(); + result.put("total", total == null ? 0 : total); + return result; + } + + @Override + public JSONObject getSpeciesYearTotalStatByParam(JSONObject param) { + JSONObject result = new JSONObject(); + LocalDate localDate = LocalDate.now(); + int month = localDate.getMonth().getValue(); + int year = localDate.getYear(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + if (areaId == null) { + return result; + } + List list = new ArrayList<>(); + if (month < 12) { + map.put("year", year - 1); + //int diff = 12 - month; + map.put("monthFrom", month + 1); + List subList = speciesDailyStatMapper.getSpeciesYearTotalStatByParam(map); + subList.forEach(item -> { + item.setYear(year - 1); + }); + list.addAll(subList); + } + map.clear(); + map.put("areaId", areaId); + map.put("year", year); + List subList = speciesDailyStatMapper.getSpeciesYearTotalStatByParam(map); + subList.forEach(item -> { + item.setYear(year); + }); + list.addAll(subList); + result.put("list", list); + return result; + } + + @Override + public JSONObject getSpeciesStatInfoByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + if (areaId == null) { + return null; + } + int type = param.getInteger("type"); + switch (type) { + case 2: { + LocalDate today = LocalDate.now(); + map.put("dateTo", today.toString()); + result.put("dateTo", today.toString()); + today = today.plusDays(-6); + map.put("dateFrom", today.toString()); + result.put("dateFrom", today.toString()); + break; + } + case 3: { + LocalDate today = LocalDate.now(); + map.put("dateTo", today.toString()); + result.put("dateTo", today.toString()); + today = today.plusDays(-29); + map.put("dateFrom", today.toString()); + result.put("dateFrom", today.toString()); + break; + } + case 4: { + String dateFrom = param.getString("dateFrom"); + map.put("dateFrom", dateFrom); + result.put("dateFrom", dateFrom); + String dateTo = param.getString("dateTo"); + map.put("dateTo", dateTo); + result.put("dateTo", dateTo); + break; + } + default: { + LocalDate now = LocalDate.now(); + map.put("curDate", now.toString()); + result.put("dateFrom", now.toString()); + break; + } + } + map.put("areaId", areaId); +// log.info("==================={}", map); + List list = speciesDailyStatMapper.getSpeciesStatInfoByParam(map); + result.put("list", list); + return result; + } + + @Override + public JSONObject getSpeciesMediaListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + if (areaId == null) { + return result; + } + map.put("areaId", areaId); + Integer limit = param.getInteger("limit"); + map.put("limit", limit); + List list = protectedAreaSpeciesService.getProtectedAreaSpeciesListByAreaId(map); + if (list == null) { + return result; + } + + List dataList = new ArrayList<>(); + Map itemMap = new HashMap<>(); + itemMap.put("areaId", areaId); + list.forEach(item -> { + itemMap.clear(); + itemMap.put("areaId", areaId); + itemMap.put("speciesId", item.getSpeciesId()); + ResultMedia data = resultMediaService.getResultInfoForStatByParam(itemMap); + if (data != null) { + item.setMediaId(data.getMediaId()); + item.setMediaUrl(data.getMediaUrl()); + item.setMetaUrl(data.getMetaUrl()); + + List sublist = speciesDailyStatMapper.getSpeciesStatInfoByParam(itemMap); + item.setTotal((sublist == null || sublist.isEmpty()) ? 0 : sublist.get(0).getCount()); + LocalDate now = LocalDate.now(); + itemMap.put("curDate", now.toString()); + sublist = speciesDailyStatMapper.getSpeciesStatInfoByParam(itemMap); + item.setToday((sublist == null || sublist.isEmpty()) ? 0 : sublist.get(0).getCount()); + + itemMap.put("curDate", now.plusDays(-1).toString()); + sublist = speciesDailyStatMapper.getSpeciesStatInfoByParam(itemMap); + item.setYesterday((sublist == null || sublist.isEmpty()) ? 0 : sublist.get(0).getCount()); + dataList.add(item); + } + + }); +// result.put("list", list); + result.put("list", dataList); + return result; + } + + @Override + public JSONObject getSpeciesStatListByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Map map = new HashMap<>(); +// Long areaId = param.getLong("areaId"); +// if (areaId == null) { +// return result; +// } +// map.put("areaId", areaId); + Integer limit = param.getInteger("limit"); + map.put("limit", limit); + List list = protectedAreaSpeciesService.getProtectedAreaSpeciesListByAreaId(map); + if (list == null) { + return result; + } + Map itemMap = new HashMap<>(); +// itemMap.put("areaId", areaId); + list.forEach(item -> { + itemMap.clear(); + itemMap.put("speciesId", item.getSpeciesId()); + + itemMap.put("mediaType", 3); + + int count = resultMediaService.getResultMediaAmountByParam(itemMap); + item.setVideoCount(count); + + itemMap.put("mediaType", 2); + count = resultMediaService.getResultMediaAmountByParam(itemMap); + item.setImageCount(count); + + List devList = resultMediaService.getResultMediaDeviceListByParam(itemMap); + item.setDeviceIds(devList); + + }); + result.put("list", list); + return result; + } + + @Override + public JSONObject getSpeciesAmountReportByParam(JSONObject param) { + JSONObject result = new JSONObject(); + Long areaId = param.getLong("areaId"); + Long deviceId = param.getLong("deviceId"); + if (areaId == null && deviceId == null) { + return result; + } + Map map = new HashMap<>(); + map.put("areaId", areaId); + map.put("deviceId", deviceId); + Integer calcYear = param.getInteger("calcYear"); + map.put("calcYear", calcYear); + Integer calcMonth = param.getInteger("calcMonth"); + map.put("calcMonth", calcMonth); + Integer monthFrom = param.getInteger("monthFrom"); + map.put("monthFrom", monthFrom); + Integer monthTo = param.getInteger("monthTo"); + map.put("monthTo", monthTo); + List list = speciesDailyStatMapper.getSpeciesAmountReportByParam(map); + result.put("list", list); + result.put("catalogueAmount", speciesDailyStatMapper.getBirdCatalogueAmount()); + result.put("familyAmount", speciesDailyStatMapper.getBirdFamilyAmount()); + result.put("genusAmount", speciesDailyStatMapper.getBirdGenusAmount()); + return result; + } + + @Override + public JSONObject getSpeciesWinterPeriodAmountByParam(JSONObject param) { + JSONObject object = new JSONObject(); + JSONArray array = new JSONArray(); + Map map = new HashMap<>(); + Long areaId = param.getLong("areaId"); + map.put("areaId", areaId); + Long speciesId = param.getLong("speciesId"); + map.put("speciesId", speciesId); + Integer startYear = param.getInteger("startYear"); + Integer endYear = param.getInteger("endYear"); + if (startYear == null && endYear == null) { + Integer curYear = LocalDate.now().getYear(); + array.add(getStatListByYear(curYear, map)); + object.put("startYear", curYear + ""); + object.put("endYear", curYear + ""); + } else if (startYear == null || endYear == null) { + Integer curYear = startYear == null ? endYear : startYear; + array.add(getStatListByYear(curYear, map)); + object.put("startYear", curYear + ""); + object.put("endYear", curYear + ""); + } else { + for (int i = startYear; i <= endYear; i++) { + array.add(getStatListByYear(i, map)); + } + object.put("startYear", startYear + ""); + object.put("endYear", endYear + ""); + } + object.put("list", array); + return object; + } + + @Override + public int getBirdCatalogueAmount() { + return speciesDailyStatMapper.getBirdCatalogueAmount(); + } + + @Override + public int getBirdFamilyAmount() { + return speciesDailyStatMapper.getBirdFamilyAmount(); + } + + @Override + public int getBirdGenusAmount() { + return speciesDailyStatMapper.getBirdGenusAmount(); + } + + private JSONObject getStatListByYear(Integer curYear, Map map) { + map.put("dateFrom", (curYear - 1) + "-10-01"); + map.put("dateTo", (curYear) + "-03-31"); + List list = speciesDailyStatMapper.getSpeciesWinterPeriodAmountByParam(map); + JSONObject obj = new JSONObject(); + obj.put("year", curYear); + obj.put("list", list); + return obj; + } + + private JSONArray getSpeciesStatByDeviceId(Map map, Long areaId, int arrayCount, int type) { + JSONArray areaDataList = new JSONArray(); + List deviceInfoList = deviceInfoService.getDeviceStatInfoByParam(); + deviceInfoList.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("id", item.getId()); + obj.put("name", item.getDeviceName()); + map.put("deviceId", item.getId()); + if (type == 3) { + List list = speciesDailyStatMapper.getSpeciesYearlyStatByDeviceId(map); + int[] counts = new int[arrayCount]; + list.forEach(subItem -> { + counts[subItem.getWeekDay() - 1] = subItem.getCount(); + }); + obj.put("list", counts); + } else if (type == 2) { + List list = speciesDailyStatMapper.getSpeciesMonthlyStatByDeviceId(map); + int[] counts = new int[arrayCount]; + list.forEach(subItem -> { + counts[subItem.getWeekDay() - 1] = subItem.getCount(); + }); + obj.put("list", counts); + } else if (type == 1) { + List list = speciesDailyStatMapper.getSpeciesWeeklyStatByDeviceId(map); + obj.put("list", list); + } + areaDataList.add(obj); + }); + return areaDataList; + } + + private int getDaysOfMonth(String calcDate) { + try { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(df.parse(calcDate)); + return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); + } catch (Exception ex) { + return 1; + } + } + + private JSONArray getSpeciesStatBySpeciesId(Map map, int days, int type) { + JSONArray array = new JSONArray(); + List list = birdDataStatService.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + if (type == 2) { + List subList = speciesDailyStatMapper.getSpeciesMonthlyStatBySpeciesId(map); + int[] dataList = new int[days]; + subList.forEach(subItem -> { + dataList[subItem.getWeekDay() - 1] = subItem.getCount(); + }); + obj.put("list", dataList); + } else if (type == 3) { + List subList = speciesDailyStatMapper.getSpeciesYearlyStatBySpeciesId(map); + int[] dataList = new int[days]; + subList.forEach(subItem -> { + dataList[subItem.getWeekDay() - 1] = subItem.getCount(); + }); + obj.put("list", dataList); + } else if (type == 1) { + List subList = speciesDailyStatMapper.getSpeciesWeeklyStatBySpeciesId(map); + obj.put("list", subList); + } + array.add(obj); + }); + return array; + } + + private JSONArray getSpeciesStatByInhabit(Map map, int type) { + JSONArray array = new JSONArray(); + List list = birdDataStatService.getAreaBirdSpeciesByParam(map); + list.forEach(item -> { + JSONObject obj = new JSONObject(); + obj.put("name", item.getName()); + obj.put("id", item.getId()); + map.put("speciesId", item.getId()); + if (type == 1) { + List subList = speciesDailyInhabitService.getSpeciesDailyInhabitWeeklyAmountListByParam(map); + obj.put("list", subList); + } else if (type == 2) { + List subList = speciesDailyInhabitService.getSpeciesDailyInhabitMonthlyAmountListByParam(map); + obj.put("list", subList); + } else if (type == 3) { + List subList = speciesDailyInhabitService.getSpeciesDailyInhabitMonthlyAmountListByParam(map); + obj.put("list", subList); + } + + array.add(obj); + }); + return array; + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesInhabitStatServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesInhabitStatServiceImpl.java new file mode 100644 index 0000000..f7e501e --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesInhabitStatServiceImpl.java @@ -0,0 +1,87 @@ +package net.hzvtc.web.stat.service.impl; + +import java.util.List; +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import net.hzvtc.web.stat.mapper.SpeciesInhabitStatMapper; +import net.hzvtc.web.stat.domain.SpeciesInhabitStat; +import net.hzvtc.web.stat.service.SpeciesInhabitStatService; + +/** + * 物种生境数量统计Service业务层处理 + * + * @author admin + * @date 2022-11-05 + */ +@Service +public class SpeciesInhabitStatServiceImpl implements SpeciesInhabitStatService { + @Resource + private SpeciesInhabitStatMapper speciesInhabitStatMapper; + + /** + * 查询物种生境数量统计 + * + * @param id 物种生境数量统计主键 + * @return 物种生境数量统计 + */ + @Override + public SpeciesInhabitStat selectSpeciesInhabitStatById(Long id) { + return speciesInhabitStatMapper.selectSpeciesInhabitStatById(id); + } + + /** + * 查询物种生境数量统计列表 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 物种生境数量统计 + */ + @Override + public List selectSpeciesInhabitStatList(SpeciesInhabitStat speciesInhabitStat) { + return speciesInhabitStatMapper.selectSpeciesInhabitStatList(speciesInhabitStat); + } + + /** + * 新增物种生境数量统计 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 结果 + */ + @Override + public int insertSpeciesInhabitStat(SpeciesInhabitStat speciesInhabitStat) { + return speciesInhabitStatMapper.insertSpeciesInhabitStat(speciesInhabitStat); + } + + /** + * 修改物种生境数量统计 + * + * @param speciesInhabitStat 物种生境数量统计 + * @return 结果 + */ + @Override + public int updateSpeciesInhabitStat(SpeciesInhabitStat speciesInhabitStat) { + return speciesInhabitStatMapper.updateSpeciesInhabitStat(speciesInhabitStat); + } + + /** + * 批量删除物种生境数量统计 + * + * @param ids 需要删除的物种生境数量统计主键 + * @return 结果 + */ + @Override + public int deleteSpeciesInhabitStatByIds(Long[] ids) { + return speciesInhabitStatMapper.deleteSpeciesInhabitStatByIds(ids); + } + + /** + * 删除物种生境数量统计信息 + * + * @param id 物种生境数量统计主键 + * @return 结果 + */ + @Override + public int deleteSpeciesInhabitStatById(Long id) { + return speciesInhabitStatMapper.deleteSpeciesInhabitStatById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesLocationInfoServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesLocationInfoServiceImpl.java new file mode 100644 index 0000000..dc3217c --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesLocationInfoServiceImpl.java @@ -0,0 +1,87 @@ +package net.hzvtc.web.stat.service.impl; + +import java.util.List; +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import net.hzvtc.web.stat.mapper.SpeciesLocationInfoMapper; +import net.hzvtc.web.stat.domain.SpeciesLocationInfo; +import net.hzvtc.web.stat.service.SpeciesLocationInfoService; + +/** + * 国内鸟类分布点Service业务层处理 + * + * @author admin + * @date 2022-11-06 + */ +@Service +public class SpeciesLocationInfoServiceImpl implements SpeciesLocationInfoService { + @Resource + private SpeciesLocationInfoMapper speciesLocationInfoMapper; + + /** + * 查询国内鸟类分布点 + * + * @param id 国内鸟类分布点主键 + * @return 国内鸟类分布点 + */ + @Override + public SpeciesLocationInfo selectSpeciesLocationInfoById(Long id) { + return speciesLocationInfoMapper.selectSpeciesLocationInfoById(id); + } + + /** + * 查询国内鸟类分布点列表 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 国内鸟类分布点 + */ + @Override + public List selectSpeciesLocationInfoList(SpeciesLocationInfo speciesLocationInfo) { + return speciesLocationInfoMapper.selectSpeciesLocationInfoList(speciesLocationInfo); + } + + /** + * 新增国内鸟类分布点 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 结果 + */ + @Override + public int insertSpeciesLocationInfo(SpeciesLocationInfo speciesLocationInfo) { + return speciesLocationInfoMapper.insertSpeciesLocationInfo(speciesLocationInfo); + } + + /** + * 修改国内鸟类分布点 + * + * @param speciesLocationInfo 国内鸟类分布点 + * @return 结果 + */ + @Override + public int updateSpeciesLocationInfo(SpeciesLocationInfo speciesLocationInfo) { + return speciesLocationInfoMapper.updateSpeciesLocationInfo(speciesLocationInfo); + } + + /** + * 批量删除国内鸟类分布点 + * + * @param ids 需要删除的国内鸟类分布点主键 + * @return 结果 + */ + @Override + public int deleteSpeciesLocationInfoByIds(Long[] ids) { + return speciesLocationInfoMapper.deleteSpeciesLocationInfoByIds(ids); + } + + /** + * 删除国内鸟类分布点信息 + * + * @param id 国内鸟类分布点主键 + * @return 结果 + */ + @Override + public int deleteSpeciesLocationInfoById(Long id) { + return speciesLocationInfoMapper.deleteSpeciesLocationInfoById(id); + } +} diff --git a/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesWinterPeriodServiceImpl.java b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesWinterPeriodServiceImpl.java new file mode 100644 index 0000000..e38cd7a --- /dev/null +++ b/ai-xuebao-system/src/main/java/net/hzvtc/web/stat/service/impl/SpeciesWinterPeriodServiceImpl.java @@ -0,0 +1,149 @@ +package net.hzvtc.web.stat.service.impl; + +import net.hzvtc.web.stat.domain.SpeciesDailyStat; +import net.hzvtc.web.stat.domain.SpeciesWinterPeriod; +import net.hzvtc.web.stat.mapper.SpeciesWinterPeriodMapper; +import net.hzvtc.web.stat.service.SpeciesDailyStatService; +import net.hzvtc.web.stat.service.SpeciesWinterPeriodService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 物种越冬期数量统计Service业务层处理 + * + * @author admin + * @date 2022-11-04 + */ +@Service +public class SpeciesWinterPeriodServiceImpl implements SpeciesWinterPeriodService { + @Resource + private SpeciesWinterPeriodMapper speciesWinterPeriodMapper; + @Autowired + private SpeciesDailyStatService speciesDailyStatService; + + /** + * 查询物种越冬期数量统计 + * + * @param id 物种越冬期数量统计主键 + * @return 物种越冬期数量统计 + */ + @Override + public SpeciesWinterPeriod selectSpeciesWinterPeriodById(Long id) { + return speciesWinterPeriodMapper.selectSpeciesWinterPeriodById(id); + } + + /** + * 查询物种越冬期数量统计列表 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 物种越冬期数量统计 + */ + @Override + public List selectSpeciesWinterPeriodList(SpeciesWinterPeriod speciesWinterPeriod) { + return speciesWinterPeriodMapper.selectSpeciesWinterPeriodList(speciesWinterPeriod); + } + + /** + * 新增物种越冬期数量统计 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 结果 + */ + @Override + public int insertSpeciesWinterPeriod(SpeciesWinterPeriod speciesWinterPeriod) { + return speciesWinterPeriodMapper.insertSpeciesWinterPeriod(speciesWinterPeriod); + } + + /** + * 修改物种越冬期数量统计 + * + * @param speciesWinterPeriod 物种越冬期数量统计 + * @return 结果 + */ + @Override + public int updateSpeciesWinterPeriod(SpeciesWinterPeriod speciesWinterPeriod) { + return speciesWinterPeriodMapper.updateSpeciesWinterPeriod(speciesWinterPeriod); + } + + /** + * 批量删除物种越冬期数量统计 + * + * @param ids 需要删除的物种越冬期数量统计主键 + * @return 结果 + */ + @Override + public int deleteSpeciesWinterPeriodByIds(Long[] ids) { + return speciesWinterPeriodMapper.deleteSpeciesWinterPeriodByIds(ids); + } + + /** + * 删除物种越冬期数量统计信息 + * + * @param id 物种越冬期数量统计主键 + * @return 结果 + */ + @Override + public int deleteSpeciesWinterPeriodById(Long id) { + return speciesWinterPeriodMapper.deleteSpeciesWinterPeriodById(id); + } + + @Override + public void calcSpeciesWinterPeriodByParam() { + Map map = new HashMap<>(); + int year = LocalDate.now().getYear(); + String dateFrom = String.format("%d-10-01", year - 1); + map.put("dateFrom", dateFrom); + String dateTo = String.format("%d-04-01", year); + map.put("dateTo", dateTo); + List list = speciesDailyStatService.getSpeciesWinterPeriodData(map); + List dataList = new ArrayList<>(); + list.forEach(item -> { + List filterData = dataList.stream().filter(subItem -> (subItem.getSpeciesId() == item.getSpeciesId()) && (subItem.getAreaId() == item.getAreaId())).collect(Collectors.toList()); + if (filterData == null || filterData.isEmpty()) { + SpeciesWinterPeriod data = new SpeciesWinterPeriod(); + data = combineData(data, item.getMaxValue(), item.getAvgValue()); + data.setSpeciesId(item.getSpeciesId()); + data.setAreaId(item.getAreaId()); + data.setYear(year); + dataList.add(data); + } else { + combineData(filterData.get(0), item.getMaxValue(), item.getAvgValue()); + } + }); + if (dataList.size() > 0) { + speciesWinterPeriodMapper.batchInsertSpeciesWinterPeriod(dataList); + } + } + + private SpeciesWinterPeriod combineData(SpeciesWinterPeriod data, int value, int month) { + switch (month) { + case 10: + data.setData1(value); + break; + case 11: + data.setData2(value); + break; + case 12: + data.setData3(value); + break; + case 1: + data.setData4(value); + break; + case 2: + data.setData5(value); + break; + case 3: + data.setData6(value); + break; + } + return data; + } +} diff --git a/ai-xuebao-system/src/main/resources/mapper/app/AppUpgradeMapper.xml b/ai-xuebao-system/src/main/resources/mapper/app/AppUpgradeMapper.xml new file mode 100644 index 0000000..32d6611 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/app/AppUpgradeMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaMapper.xml b/ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaMapper.xml new file mode 100644 index 0000000..7999a9f --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaMapper.xml @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into protected_area + (code, + name, + short_name, + url, + province, + area_level, + introduction, + lon, + lat, + manager, + telephone, + sendEmail, + email, + is_deleted, + create_by, + create_time, + pic_width, + pic_height, + pic_num, + banner_file, + gis_file) + values (#{code}, + #{name}, + #{shortName}, + #{url}, + #{province}, + #{areaLevel}, + #{introduction}, + #{lon}, + #{lat}, + #{manager}, + #{telephone}, + #{sendEmail}, + #{email}, + #{isDeleted}, + #{createBy}, + #{createTime}, + #{picWidth}, + #{picHeight}, + #{picNum}, + #{bannerFile}, + #{gisFile}) + + + + update protected_area + set code = #{code}, + name = #{name}, + short_name = #{shortName}, + url = #{url}, + province = #{province}, + area_level = #{areaLevel}, + introduction = #{introduction}, + lon = #{lon}, + lat = #{lat}, + manager = #{manager}, + telephone = #{telephone}, + sendEmail = #{sendEmail}, + email = #{email}, + pic_width = #{picWidth}, + pic_height = #{picHeight}, + pic_num = #{picNum}, + banner_file = #{bannerFile}, + gis_file = #{gisFile} + where id = #{id} + + + + update protected_area + set is_deleted = 1 + where id = #{id} + + + + update protected_area set is_deleted = 1 where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaSpeciesMapper.xml b/ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaSpeciesMapper.xml new file mode 100644 index 0000000..b4fec6b --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/area/ProtectedAreaSpeciesMapper.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into protected_area_species + (species_id, + area_id, + position, + is_common, + is_special, + create_time, + is_deleted) + values (#{speciesId}, + #{areaId}, + #{position}, + #{isCommon}, + #{isSpecial}, + #{createTime}, + #{isDeleted}) + + + insert into protected_area_species + (species_id, + area_id, + is_common, + is_special, + create_time, + is_deleted) + values + + (#{item.speciesId}, + #{item.areaId}, + #{item.isCommon}, + #{item.isSpecial}, + #{item.createTime}, + #{item.isDeleted}) + + + + + update protected_area_species + set is_common = #{isCommon} + where + area_id = #{areaId} + and + species_id in + + #{id} + + + + + update protected_area_species + set is_common = #{isCommon}, + position = #{position}, + is_special = #{isSpecial} + where id = #{id} + + + + update protected_area_species + set is_deleted = 1 + where id = #{id} + + + + update protected_area_species set is_deleted = 1 where id in + + #{id} + + + + + delete + from protected_area_species + where species_id = #{speciesId} + and area_id = #{areaId} + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/area/ProtectedCareSpeciesMapper.xml b/ai-xuebao-system/src/main/resources/mapper/area/ProtectedCareSpeciesMapper.xml new file mode 100644 index 0000000..e9bb7d1 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/area/ProtectedCareSpeciesMapper.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + insert into protected_care_species + (species_id, + area_id, + create_time) + values (#{speciesId}, + #{areaId}, + #{createTime}) + + + + delete + from protected_care_species + where id = #{id} + and area_id = #{areaId} + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/area/SpeciesAbnormalInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/area/SpeciesAbnormalInfoMapper.xml new file mode 100644 index 0000000..7cc1fe3 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/area/SpeciesAbnormalInfoMapper.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into species_abnormal_info + (device_id, + happen_time, + species_id, + media_id, + is_deleted) + values (#{deviceId}, + #{happenTime}, + #{speciesId}, + #{mediaId}, + #{isDeleted}) + + + insert into species_abnormal_info + (device_id, + happen_time, + species_id, + media_id, + count, + type, + record_id, + is_deleted) + values + + (#{item.deviceId}, + #{item.happenTime}, + #{item.speciesId}, + #{item.mediaId}, + #{item.count}, + #{item.type}, + #{item.recordId}, + 0) + + + + update species_abnormal_info + set is_deleted=1 + where id = #{id} + + + + update species_abnormal_info set is_deleted=1 + where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/area/WinteringPeriodMapper.xml b/ai-xuebao-system/src/main/resources/mapper/area/WinteringPeriodMapper.xml new file mode 100644 index 0000000..a676135 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/area/WinteringPeriodMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into wintering_period + (protected_area_id, + year, + start_time, + end_time, + amount) + values (#{protectedAreaId}, + #{year}, + #{startTime}, + #{endTime}, + #{amount}) + + + + update wintering_period + set protected_area_id = #{protectedAreaId}, + year = #{year}, + start_time = #{startTime}, + end_time = #{endTime}, + amount = #{amount} + where id = #{id} + + + + delete + from wintering_period + where id = #{id} + + + + delete from wintering_period where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdCatalogueMapper.xml b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdCatalogueMapper.xml new file mode 100644 index 0000000..7b7da21 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdCatalogueMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into bird_catalogue + (name, + scientific_name, + english_name, + description) + values (#{name}, + #{scientificName}, + #{englishName}, + #{description}) + + + + update bird_catalogue + set name = #{name}, + scientific_name = #{scientificName}, + english_name = #{englishName}, + description = #{description} + where id = #{id} + + + + update bird_catalogue + set is_deleted=1 + where id = #{id} + + + + update bird_catalogue set is_deleted=1 where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFamilyMapper.xml b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFamilyMapper.xml new file mode 100644 index 0000000..17621ab --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFamilyMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into bird_family + (family_name, + scientific_name, + english_name, + description, + catalogue_id) + values (#{familyName}, + #{scientificName}, + #{englishName}, + #{description}, + #{catalogueId}) + + + + update bird_family + set family_name = #{familyName}, + scientific_name = #{scientificName}, + english_name = #{englishName}, + description = #{description}, + catalogue_id = #{catalogueId} + where id = #{id} + + + + update bird_family + set is_deleted = 1 + where id = #{id} + + + + update bird_family + set is_deleted = 1 + where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFlyingInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFlyingInfoMapper.xml new file mode 100644 index 0000000..0114ed9 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdFlyingInfoMapper.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into bird_flying_info + (species_id, + source, + source_longitude, + source_latitude, + target, + target_longitude, + target_latitude, + is_deleted) + values (#{speciesId}, + #{source}, + #{sourceLongitude}, + #{sourceLatitude}, + #{target}, + #{targetLongitude}, + #{targetLatitude}, + #{isDeleted}) + + + + update bird_flying_info + set species_id = #{speciesId}, + source = #{source}, + source_longitude = #{sourceLongitude}, + source_latitude = #{sourceLatitude}, + target = #{target}, + target_longitude = #{targetLongitude}, + target_latitude = #{targetLatitude} + where id = #{id} + + + + update bird_flying_info + set is_deleted = 1 + where id = #{id} + + + + update bird_flying_info set is_deleted = 1 + where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdGenusMapper.xml b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdGenusMapper.xml new file mode 100644 index 0000000..1cd6f00 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdGenusMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into bird_genus + (name, + scientific_name, + english_name, + family_id, + description) + values (#{name}, + #{scientificName}, + #{englishName}, + #{familyId}, + #{description}) + + + + update bird_genus + set name = #{name}, + scientific_name = #{scientificName}, + english_name = #{englishName}, + family_id = #{familyId}, + description = #{description} + where id = #{id} + + + + update bird_genus + set is_deleted =1 + where id = #{id} + + + + update bird_genus set is_deleted =1 where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdLeaveArriveInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdLeaveArriveInfoMapper.xml new file mode 100644 index 0000000..d11cc62 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdLeaveArriveInfoMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into bird_leave_arrive_info + (area_id, + species_id, + stat_year, + leave_date, + arrive_date, + is_deleted) + values (#{areaId}, + #{speciesId}, + #{statYear}, + #{leaveDate}, + #{arriveDate}, + #{isDeleted}) + + + insert into bird_leave_arrive_info + (area_id, + species_id, + stat_year, + leave_date, + arrive_date, + is_deleted) + values + + ( + #{item.areaId}, + #{item.speciesId}, + #{item.statYear}, + #{item.leaveDate}, + #{item.arriveDate}, + #{item.isDeleted} + ) + + + + + update bird_leave_arrive_info + set area_id = #{areaId}, + species_id = #{speciesId}, + stat_year = #{statYear}, + leave_date = #{leaveDate}, + arrive_date = #{arriveDate} + where id = #{id} + + + + delete + from bird_leave_arrive_info + where id = #{id} + + + + delete from bird_leave_arrive_info where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdMediaMapper.xml b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdMediaMapper.xml new file mode 100644 index 0000000..237cffd --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdMediaMapper.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + insert into bird_media + (species_id, + name, + media_type, + url, + pc_show, + description, + is_deleted, + create_time) + values (#{speciesId}, + #{name}, + #{mediaType}, + #{url}, + #{pcShow}, + #{description}, + #{isDeleted}, + #{createTime}) + + + + update bird_media + set species_id = #{speciesId}, + name = #{name}, + media_type = #{mediaType}, + url = #{url}, + pc_show = #{pcShow}, + description = #{description} + where id = #{id} + + + + update bird_media + set is_deleted = 1 + where id = #{id} + + + + update bird_media set is_deleted = 1 where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdSpeciesMapper.xml b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdSpeciesMapper.xml new file mode 100644 index 0000000..4d4ea4a --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/birdInfo/BirdSpeciesMapper.xml @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete + from sys_dict_data + where dict_type = 'sys_species_code' + + + insert into sys_dict_data (dict_sort, dict_value, dict_label, dict_type) + select (@rownum := @rownum + 1) AS rownumber, a.*, 'sys_species_code' as dict_type + from (select id, name + from bird_species + where id in (select distinct species_id + from result_record_details a + where a.is_deleted = 0 + and species_id > 0) + order by position desc, CONVERT(name USING gbk) COLLATE gbk_chinese_ci) a, + (SELECT @rownum := 0) r + + + + + + + + + + + + + + + + + + + insert into bird_species + (name, + scientific_name, + english_name, + morphology, + habitat, + voice, + distribution, + overseas_distribution, + domestic_distribution, + avatar, + protect_level, + iucn, + residence_type, + species_type, + is_deleted, + create_by, + create_time, + catalogue_id, + family_id, + genus_id, + position) + values (#{name}, + #{scientificName}, + #{englishName}, + #{morphology}, + #{habitat}, + #{voice}, + #{distribution}, + #{overseasDistribution}, + #{domesticDistribution}, + #{avatar}, + #{protectLevel}, + #{iucn}, + #{residenceType}, + #{speciesType}, + #{isDeleted}, + #{createBy}, + #{createTime}, + #{catalogueId}, + #{familyId}, + #{genusId}, + #{position}) + + + + update bird_species + set name = #{name}, + scientific_name = #{scientificName}, + english_name = #{englishName}, + morphology = #{morphology}, + habitat = #{habitat}, + voice = #{voice}, + distribution = #{distribution}, + overseas_distribution = #{overseasDistribution}, + domestic_distribution = #{domesticDistribution}, + avatar = #{avatar}, + protect_level = #{protectLevel}, + iucn = #{iucn}, + residence_type = #{residenceType}, + species_type = #{speciesType}, + update_by = #{updateBy}, + update_time = #{updateTime}, + catalogue_id = #{catalogueId}, + family_id = #{familyId}, + genus_id = #{genusId}, + position = #{position} + where id = #{id} + + + + update bird_species + set is_deleted = 1 + where id = #{id} + + + + update bird_species set is_deleted = 1 where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/dataCheck/FavoriteMediaMapper.xml b/ai-xuebao-system/src/main/resources/mapper/dataCheck/FavoriteMediaMapper.xml new file mode 100644 index 0000000..338006e --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/dataCheck/FavoriteMediaMapper.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + delete + from favorite_media + where media_id = #{mediaId} + + + + + + + + + insert into favorite_media + (media_id, + detail_id, + species_id, + user_id, + type, + create_date, + is_deleted) + values (#{mediaId}, + #{detailId}, + #{speciesId}, + #{userId}, + #{type}, + #{createDate}, + #{isDeleted}) + + + + update favorite_media + set media_id = #{mediaId}, + detail_id = #{detailId}, + species_id = #{speciesId}, + user_id = #{userId}, + is_deleted = #{isDeleted} + where id = #{id} + + + + delete + from favorite_media + where id = #{id} + + + + delete from favorite_media where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/dataCheck/MediaItemMapper.xml b/ai-xuebao-system/src/main/resources/mapper/dataCheck/MediaItemMapper.xml new file mode 100644 index 0000000..817dbbf --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/dataCheck/MediaItemMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into media_item + (device_id, + camera_volt, + solar_volt, + extra_volt, + temperature, + humidity, + atmosphere, + lat, + lon, + memory, + ontime, + nstatus, + astatus, + elevation) + values (#{deviceId}, + #{cameraVolt}, + #{solarVolt}, + #{extraVolt}, + #{temperature}, + #{humidity}, + #{atmosphere}, + #{lat}, + #{lon}, + #{memory}, + #{ontime}, + #{nstatus}, + #{astatus}, + #{elevation}) + + + + update media_item + set device_id = #{deviceId}, + camera_volt = #{cameraVolt}, + solar_volt = #{solarVolt}, + extra_volt = #{extraVolt}, + temperature = #{temperature}, + humidity = #{humidity}, + atmosphere = #{atmosphere}, + lat = #{lat}, + lon = #{lon}, + memory = #{memory}, + ontime = #{ontime}, + nstatus = #{nstatus}, + astatus = #{astatus}, + elevation = #{elevation} + where id = #{id} + + + + delete + from media_item + where id = #{id} + + + + delete from media_item where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultMediaMapper.xml b/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultMediaMapper.xml new file mode 100644 index 0000000..f833d13 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultMediaMapper.xml @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete + from result_media + where device_id = #{deviceId} + and media_type = 4 + + + insert into result_media + (device_id, + media_type, + media_url, + meta_url, + item_id, + time, + version) + values (#{deviceId}, + #{mediaType}, + #{mediaUrl}, + #{metaUrl}, + #{itemId}, + #{time}, + #{version}) + + + insert into result_media + (device_id, + media_type, + media_url, + meta_url, + item_id, + time, + version) + values + + (#{item.deviceId}, + #{item.mediaType}, + #{item.mediaUrl}, + #{item.metaUrl}, + #{item.itemId}, + #{item.time}, + #{item.version} + ) + + + + + + + + + + + + + + + + + + + + + + update result_media set is_deleted=1 where media_id in + + #{mediaId} + + + + update result_media + set is_deleted = #{isDeleted} + where media_id = #{mediaId} + + + update result_media + set is_deleted=1 + where media_id = #{mediaId} + + + update result_media + set is_deleted = 0 + where is_deleted = 1 + + and device_id in (select id from device_info where is_deleted = 0 and protected_area_id = #{areaId}) + + + and device_id = #{deviceId} + + + and DATE_FORMAT(time, '%Y-%m-%d') >= DATE_FORMAT(#{dateFrom}, '%Y-%m-%d') + + + and DATE_FORMAT(time, '%Y-%m-%d') <= DATE_FORMAT(#{dateTo}, '%Y-%m-%d') + + + and media_type = #{mediaType} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordDetailsMapper.xml b/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordDetailsMapper.xml new file mode 100644 index 0000000..e37bdf9 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordDetailsMapper.xml @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into result_record_details + (record_id, + species_id, + habitat, + count, + location, + confidence, + media_id, + location_site_x, + location_site_y, + boundbox) + values (#{recordId}, + #{speciesId}, + #{habitat}, + #{count}, + #{location}, + #{confidence}, + #{mediaId}, + #{locationSiteX}, + #{locationSiteY}, + #{boundbox}) + + + insert into result_record_details + (record_id, + species_id, + habitat, + count, + location, + confidence, + media_id, + boundbox + ) + values + + (#{item.recordId}, + #{item.speciesId}, + #{item.habitat}, + #{item.count}, + #{item.location}, + #{item.confidence}, + #{item.mediaId}, + #{item.boundbox} + ) + + + + + update result_record_details + set species_id = #{speciesId}, + count = #{count}, + checked = #{checked} + where details_id = #{detailsId} + + + + update result_record_details + set checked = 1 + where details_id = #{id} + + + + + + + + update result_record_details + set is_deleted = 1 + where details_id = #{detailsId} + + + + + + + + + + + update result_record_details + set is_deleted = 1 + where details_id in + + #{detailsId} + + + + update result_record_details + set is_deleted = 1 + where media_id = #{mediaId} + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordMapper.xml b/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordMapper.xml new file mode 100644 index 0000000..08cf93a --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/dataCheck/ResultRecordMapper.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into result_record + (device_id, + record_time, + record_type, + version) + values (#{deviceId}, + #{recordTime}, + #{recordType}, + #{version}) + + + + update result_record + set device_id = #{deviceId}, + record_time = #{recordTime}, + record_type = #{recordType}, + version = #{version} + where record_id = #{recordId} + + + + delete + from result_record + where record_id = #{recordId} + + + + delete from result_record where record_id in + + #{recordId} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/device/DeviceInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/device/DeviceInfoMapper.xml new file mode 100644 index 0000000..5c49c56 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/device/DeviceInfoMapper.xml @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update device_info + set status = #{status} + where id = #{id} + + + + + + + + + + + + + + + + + + + insert into device_info + (device_name, + pid, + duid, + description, + longitude, + latitude, + status, + device_ip, + rate, + device_type, + is_deleted, + create_time, + dept_id, + habitat_type) + values (#{deviceName}, + #{pid}, + #{duid}, + #{description}, + #{longitude}, + #{latitude}, + #{status}, + #{deviceIp}, + #{rate}, + #{deviceType}, + #{isDeleted}, + #{createTime}, + #{deptId}, + #{habitatType}) + + + update device_info + set rate = #{rate} + where id = #{id} + + + update device_info + set evalator = #{evalator} + where id = #{id} + + + update device_info + set device_name = #{deviceName}, + pid = #{pid}, + duid = #{duid}, + + description = #{description}, + + longitude = #{longitude}, + latitude = #{latitude}, + status = #{status}, + device_ip = #{deviceIp}, + device_type = #{deviceType}, + dept_id = #{deptId}, + rate = #{rate}, + update_time = #{updateTime}, + habitat_type = #{habitatType} + where id = #{id} + + + + update device_info + set is_deleted = 1 + where id = #{id} + + + + update device_info set is_deleted = 1 + where id in + + #{id} + + + diff --git a/ai-xuebao-system/src/main/resources/mapper/device/DeviceItemMapper.xml b/ai-xuebao-system/src/main/resources/mapper/device/DeviceItemMapper.xml new file mode 100644 index 0000000..d64a60e --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/device/DeviceItemMapper.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into device_item + (shot_mode, + image_size, + burst_shot, + video_size, + video_length, + shot_limit, + timer_server, + timer_port, + store_server, + store_port, + parent_id, + parent_ip, + dislink_time, + heartbeat_time, + pir_switcher, + pir_sensitivity, + pir_interval, + shot_timer, + shot_interval, + shot_timer1_from, + shot_timer1_to, + shot_timer2_from, + shot_timer2_to, + shot_timer3_from, + shot_timer3_to, + shot_timer_repeater, + snapshot, + overwriter, + habitat, + aspect, + slope_postion, + gradient, + habitat_type, + interfere_type, + interfere_level, + status, + pid) + values (#{shotMode}, + #{imageSize}, + #{burstShot}, + #{videoSize}, + #{videoLength}, + #{shotLimit}, + #{timerServer}, + #{timerPort}, + #{storeServer}, + #{storePort}, + #{parentId}, + #{parentIp}, + #{dislinkTime}, + #{heartbeatTime}, + #{pirSwitcher}, + #{pirSensitivity}, + #{pirInterval}, + #{shotTimer}, + #{shotInterval}, + #{shotTimer1From}, + #{shotTimer1To}, + #{shotTimer2From}, + #{shotTimer2To}, + #{shotTimer3From}, + #{shotTimer3To}, + #{shotTimerRepeater}, + #{snapshot}, + #{overwriter}, + #{habitat}, + #{aspect}, + #{slopePostion}, + #{gradient}, + #{habitatType}, + #{interfereType}, + #{interfereLevel}, + #{status}, + #{pid}) + + + + update device_item + set shot_mode = #{shotMode}, + image_size = #{imageSize}, + burst_shot = #{burstShot}, + video_size = #{videoSize}, + video_length = #{videoLength}, + shot_limit = #{shotLimit}, + timer_server = #{timerServer}, + timer_port = #{timerPort}, + store_server = #{storeServer}, + store_port = #{storePort}, + parent_id = #{parentId}, + parent_ip = #{parentIp}, + dislink_time = #{dislinkTime}, + heartbeat_time = #{heartbeatTime}, + pir_switcher = #{pirSwitcher}, + pir_sensitivity = #{pirSensitivity}, + pir_interval = #{pirInterval}, + shot_timer = #{shotTimer}, + shot_interval = #{shotInterval}, + shot_timer1_from = #{shotTimer1From}, + shot_timer1_to = #{shotTimer1To}, + shot_timer2_from = #{shotTimer2From}, + shot_timer2_to = #{shotTimer2To}, + shot_timer3_from = #{shotTimer3From}, + shot_timer3_to = #{shotTimer3To}, + shot_timer_repeater = #{shotTimerRepeater}, + snapshot = #{snapshot}, + overwriter = #{overwriter}, + habitat = #{habitat}, + aspect = #{aspect}, + slope_postion = #{slopePostion}, + gradient = #{gradient}, + habitat_type = #{habitatType}, + interfere_type = #{interfereType}, + interfere_level = #{interfereLevel}, + status = #{status}, + pid = #{pid} + where id = #{id} + + + + delete + from device_item + where id = #{id} + + + + delete from device_item where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/device/DevicePersonMapper.xml b/ai-xuebao-system/src/main/resources/mapper/device/DevicePersonMapper.xml new file mode 100644 index 0000000..114fda6 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/device/DevicePersonMapper.xml @@ -0,0 +1,47 @@ + + + + + + + insert into device_person(name, gender, mobile, deptId, memo, photo, hasMoney, hasTool, pid) + values (#{name}, #{gender}, #{mobile}, #{deptId}, #{memo}, #{photo}, #{hasMoney}, #{hasTool}, #{pid}) + + + + update device_person + set name =#{name}, + gender = #{gender}, + mobile =#{mobile}, + deptId = #{deptId}, + memo = #{memo}, + photo = #{photo}, + hasMoney = #{hasMoney}, + hasTool = #{hasTool} + where id = #{id} + + + delete + from device_person + where id = #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/device/HeatmapInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/device/HeatmapInfoMapper.xml new file mode 100644 index 0000000..11b268f --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/device/HeatmapInfoMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into heatmap_info + (id, + name, + center_x, + center_y, + start_x, + end_x, + start_y, + end_y, + device_id, + is_deleted, + create_time) + values (#{id}, + #{name}, + #{centerX}, + #{centerY}, + #{startX}, + #{endX}, + #{startY}, + #{endY}, + #{deviceId}, + #{isDeleted}, + #{createTime}) + + + + update heatmap_info + set name = #{name}, + center_x = #{centerX}, + center_y = #{centerY}, + start_x = #{startX}, + end_x = #{endX}, + start_y = #{startY}, + end_y = #{endY}, + device_id = #{deviceId} + where id = #{id} + + + + update heatmap_info + set is_deleted =1 + where id = #{id} + + + + update heatmap_info set is_deleted =1 + where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/echart/BirdDataStatMapper.xml b/ai-xuebao-system/src/main/resources/mapper/echart/BirdDataStatMapper.xml new file mode 100644 index 0000000..bed2f22 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/echart/BirdDataStatMapper.xml @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/file/MediaFileInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/file/MediaFileInfoMapper.xml new file mode 100644 index 0000000..b983943 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/file/MediaFileInfoMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + insert into media_file_info + (upload_type, + device_id, + user_id, + version, + remote_path, + state, + create_date, + is_deleted) + values (#{uploadType}, + #{deviceId}, + #{userId}, + #{version}, + #{remotePath}, + #{state}, + #{createDate}, + #{isDeleted}) + + + + update media_file_info + set upload_type = #{uploadType}, + device_id = #{deviceId}, + user_id = #{userId}, + version = #{version}, + remote_path = #{remotePath}, + state = #{state} + where id = #{id} + + + + update media_file_info + set state = #{state} + where id = #{id} + + + + update media_file_info + set is_deleted = 1 + where id = #{id} + + + + update media_file_info set is_deleted = 1 where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/file/MediaFileItemMapper.xml b/ai-xuebao-system/src/main/resources/mapper/file/MediaFileItemMapper.xml new file mode 100644 index 0000000..f3de6db --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/file/MediaFileItemMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + insert into media_file_item + (file_name, + file_type, + url_path, + meta_path, + time, + parent_id) + values (#{fileName}, + #{fileType}, + #{urlPath}, + #{metaPath}, + #{time}, + #{parentId}) + + + + insert into media_file_item + (file_name, + file_type, + url_path, + meta_path, + time, + parent_id) + values + + (#{item.fileName}, + #{item.fileType}, + #{item.urlPath}, + #{item.metaPath}, + #{item.time}, + #{item.parentId}) + + + + + update media_file_item + set file_name = #{fileName}, + file_type = #{fileType}, + url_path = #{urlPath}, + meta_path = #{metaPath}, + time = #{time}, + parent_id = #{parentId} + where id = #{id} + + + + delete + from media_file_item + where id = #{id} + + + + delete from media_file_item where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/grid/AreaGridMapper.xml b/ai-xuebao-system/src/main/resources/mapper/grid/AreaGridMapper.xml new file mode 100644 index 0000000..c7df3b0 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/grid/AreaGridMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + INSERT INTO area_grid (center_lat, center_lon, min_lat,min_lon,max_lat,max_lon) + VALUES + + (#{g.centerLat}, #{g.centerLon}, #{g.minLat},#{minLon}, #{g.maxLat},#{maxLon}) + + + + + diff --git a/ai-xuebao-system/src/main/resources/mapper/job/TableStatInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/job/TableStatInfoMapper.xml new file mode 100644 index 0000000..5b1834c --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/job/TableStatInfoMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + insert into table_stat_info + (table_id, type) + values (#{tableId}, #{type}) + + + + update table_stat_info + set table_id = #{tableId}, + type = #{type} + where id = #{id} + + + + delete + from table_stat_info + where id = #{id} + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationFilesMapper.xml b/ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationFilesMapper.xml new file mode 100644 index 0000000..8383945 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationFilesMapper.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + insert into observation_files + (location, + file_type, + file_ext, + file_name, + observation_id, + create_date) + values (#{location}, + #{fileType}, + #{fileExt}, + #{fileName}, + #{observationId}, + #{createDate}) + + + + update observation_files + set location = #{location}, + file_type = #{fileType}, + file_ext = #{fileExt}, + file_name = #{fileName}, + observation_id = #{observationId}, + create_date = #{createDate} + where id = #{id} + + + + delete + from observation_files + where id = #{id} + + + + delete from observation_files where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationsMapper.xml b/ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationsMapper.xml new file mode 100644 index 0000000..8959169 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/naturalist/ObservationsMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into observations + (observed_on, + lat, + lon, + description, + species_guess, + user_id, + taxon_id, + is_deleted, + create_date) + values (#{observedOn}, + #{lat}, + #{lon}, + #{description}, + #{speciesGuess}, + #{userId}, + #{taxonId}, + #{isDeleted}, + #{createDate}) + + + + update observations + set observed_on = #{observedOn}, + lat = #{lat}, + lon = #{lon}, + description = #{description}, + species_guess = #{speciesGuess}, + user_id = #{userId}, + taxon_id = #{taxonId}, + update_date = #{updateDate} + where id = #{id} + + + + delete + from observations + where id = #{id} + + + + delete from observations where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/stat/BirdWebPageStatMapper.xml b/ai-xuebao-system/src/main/resources/mapper/stat/BirdWebPageStatMapper.xml new file mode 100644 index 0000000..c3fa3a3 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/stat/BirdWebPageStatMapper.xml @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyInhabitMapper.xml b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyInhabitMapper.xml new file mode 100644 index 0000000..21d2ca1 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyInhabitMapper.xml @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into species_daily_inhabit + (record_id, + habitat, + area_id, + device_id, + stat_date, + species_id, + amount) + values (#{recordId}, + #{habitat}, + #{areaId}, + #{deviceId}, + #{statDate}, + #{speciesId}, + #{amount}) + + + + insert into species_daily_inhabit + (record_id, + habitat, + area_id, + device_id, + stat_date, + species_id, + amount) + values + + (#{item.recordId}, + #{item.habitat}, + #{item.areaId}, + #{item.deviceId}, + #{item.statDate}, + #{item.speciesId}, + #{item.amount}) + + + + + + + + + + + + + delete + from species_daily_inhabit + where DATE_FORMAT(stat_date, '%Y-%m-%d') = DATE_FORMAT(#{statDate}, '%Y-%m-%d') + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyStatMapper.xml b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyStatMapper.xml new file mode 100644 index 0000000..a30b17b --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesDailyStatMapper.xml @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into species_daily_stat + (species_id, + area_id, + stat_date, + max_value, + avg_value, + record_id) + values (#{speciesId}, + #{areaId}, + #{statDate}, + #{maxValue}, + #{avgValue}, + #{recordId}) + + + delete + from species_daily_stat + where DATE_FORMAT(stat_date, '%Y-%m-%d') = DATE_FORMAT(#{statDate}, '%Y-%m-%d') + + + insert into species_daily_stat + (species_id, + area_id, + device_id, + stat_date, + max_value, + avg_value, + record_id) + values + + (#{item.speciesId}, + #{item.areaId}, + #{item.deviceId}, + #{item.statDate}, + #{item.maxValue}, + #{item.avgValue}, + #{item.recordId}) + + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesInhabitStatMapper.xml b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesInhabitStatMapper.xml new file mode 100644 index 0000000..b89a0e8 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesInhabitStatMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into species_inhabit_stat + (id, + stat_year, + species_id, + area_id, + data1, + data2, + data3, + data4, + data5) + values (#{id}, + #{statYear}, + #{speciesId}, + #{areaId}, + #{data1}, + #{data2}, + #{data3}, + #{data4}, + #{data5}) + + + + update species_inhabit_stat + set stat_year = #{statYear}, + species_id = #{speciesId}, + area_id = #{areaId}, + data1 = #{data1}, + data2 = #{data2}, + data3 = #{data3}, + data4 = #{data4}, + data5 = #{data5} + where id = #{id} + + + + delete + from species_inhabit_stat + where id = #{id} + + + + delete from species_inhabit_stat where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesLocationInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesLocationInfoMapper.xml new file mode 100644 index 0000000..6c2ca22 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesLocationInfoMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + insert into species_location_info + (species_id, + name, + longitude, + latitude, + memo, + is_deleted) + values (#{speciesId}, + #{name}, + #{longitude}, + #{latitude}, + #{memo}, + #{isDeleted}) + + + + update species_location_info + set species_id = #{speciesId}, + name = #{name}, + longitude = #{longitude}, + latitude = #{latitude}, + memo = #{memo}, + is_deleted = #{isDeleted} + where id = #{id} + + + + delete + from species_location_info + where id = #{id} + + + + delete from species_location_info where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesWinterPeriodMapper.xml b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesWinterPeriodMapper.xml new file mode 100644 index 0000000..3f36cdb --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/stat/SpeciesWinterPeriodMapper.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into species_winter_period + (id, + year, + area_id, + species_id, + data1, + data2, + data3, + data4, + data5, + data6) + values (#{id}, + #{year}, + #{areaId}, + #{speciesId}, + #{data1}, + #{data2}, + #{data3}, + #{data4}, + #{data5}, + #{data6}) + + + insert into species_winter_period + ( + year, + area_id, + species_id, + data1, + data2, + data3, + data4, + data5, + data6) + values + + ( + #{item.year}, + #{item.areaId}, + #{item.speciesId}, + #{item.data1}, + #{item.data2}, + #{item.data3}, + #{item.data4}, + #{item.data5}, + #{item.data6}) + + + + update species_winter_period + set year = #{year}, + area_id = #{areaId}, + species_id = #{speciesId}, + data1 = #{data1}, + data2 = #{data2}, + data3 = #{data3}, + data4 = #{data4}, + data5 = #{data5}, + data6 = #{data6} + where id = #{id} + + + + delete + from species_winter_period + where id = #{id} + + + + delete from species_winter_period where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/MenuInSysMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/MenuInSysMapper.xml new file mode 100644 index 0000000..fbf53ea --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/MenuInSysMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + select * + from menu_in_sys + + + + + + + + insert into menu_in_sys + (menu_id, + parent_id, + order_num, + sys_id, + is_deleted) + values (#{menuId}, + #{parentId}, + #{orderNum}, + #{sysId}, + #{isDeleted}) + + + + update menu_in_sys + set menu_id = #{menuId}, + parent_id = #{parentId}, + order_num = #{orderNum}, + sys_id = #{sysId}, + is_deleted = #{isDeleted} + where id = #{id} + + + + delete + from menu_in_sys + where id = #{id} + + + + delete from menu_in_sys where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/MessageReadInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/MessageReadInfoMapper.xml new file mode 100644 index 0000000..ae91ef0 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/MessageReadInfoMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + insert into message_read_info + (id, + user_id, + message_id, + read_date, + message_type) + values (#{id}, + #{userId}, + #{messageId}, + now(), + #{messageType}) + + + + + update message_read_info + set user_id = #{userId}, + message_id = #{messageId}, + read_date = #{readDate}, + message_type = #{messageType} + where id = #{id} + + + + delete + from message_read_info + where id = #{id} + + + + delete from message_read_info where id in + + #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/NoticeFileInfoMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/NoticeFileInfoMapper.xml new file mode 100644 index 0000000..e6f7ce4 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/NoticeFileInfoMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + insert into notice_file_info + (file_path, + file_type, + name, + notice_id) + values (#{filePath}, + #{fileType}, + #{name}, + #{noticeId}) + + + insert into notice_file_info + (file_path, + file_type, + name, + notice_id) + values + + (#{item.filePath}, + #{item.fileType}, + #{item.name}, + #{item.noticeId}) + + + + delete + from notice_file_info + where id = #{id} + + + + delete from notice_file_info where id not in + + #{id} + + and notice_id = #{noticeId} + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/NoticeReadDeptMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/NoticeReadDeptMapper.xml new file mode 100644 index 0000000..d3dda85 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/NoticeReadDeptMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + insert into notice_read_dept + (dept_id, + notice_id) + values (#{deptId}, + #{noticeId}) + + + + insert into notice_read_dept + (dept_id, + notice_id) + values + + (#{item.deptId}, + #{item.noticeId}) + + + + + delete + from notice_read_dept + where notice_id = #{id} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/NoticeReaderMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/NoticeReaderMapper.xml new file mode 100644 index 0000000..b7b11aa --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/NoticeReaderMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + insert into notice_reader + (person_id, + dept_id, + read_time, + notice_id) + values (#{personId}, + #{deptId}, + #{readTime}, + #{noticeId}) + + + + delete + from notice_reader + where id = #{id} + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysConfigMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 0000000..79da4e2 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + select config_id, + config_name, + config_key, + config_value, + config_type, + create_by, + create_time, + update_by, + update_time, + remark + from sys_config + + + + + + + and config_id = #{configId} + + + and config_key = #{configKey} + + + + + + + + + + + + insert into sys_config ( + config_name, + config_key, + config_value, + config_type, + create_by, + remark, + create_time + )values( + #{configName}, + #{configKey}, + #{configValue}, + #{configType}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_config + + config_name = #{configName}, + config_key = #{configKey}, + config_value = #{configValue}, + config_type = #{configType}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where config_id = #{configId} + + + + delete + from sys_config + where config_id = #{configId} + + + + delete from sys_config where config_id in + + #{configId} + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 0000000..33bac53 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,367 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select d.* + from sys_dept d + + + + + + + + + + + + + + + + + + update sys_dept + set ancestor_path=#{ancestorPath} + where dept_id = #{deptId} + + + + + + + + + + + + + + + + + + + + + + + + insert into sys_dept(parent_id, + dept_name, + full_name, + dept_code, + ancestors, + order_num, + leader, + phone, + email, + full_pinyin, + simple_pinyin, + status, + create_by, + create_time, + dept_level, + ancestor_path) + values (#{parentId}, + #{deptName}, + #{fullName}, + #{deptCode}, + #{ancestors}, + #{orderNum}, + #{leader}, + #{phone}, + #{email}, + #{fullPinyin}, + #{simplePinyin}, + #{status}, + #{createBy}, + sysdate(), + #{deptLevel}, + #{ancestorPath}) + + + update sys_dept + set dept_name = #{deptName}, + dept_code = #{deptCode}, + full_name = #{fullName}, + order_num = #{orderNum}, + leader = #{leader}, + phone = #{phone}, + full_pinyin = #{fullPinyin}, + simple_pinyin = #{simplePinyin}, + update_by = #{updateBy}, + update_time = sysdate(), + ancestor_path=#{ancestorPath} + where dept_id = #{deptId} + + + + update sys_dept set ancestors = + + when #{item.deptId} then #{item.ancestors} + + ,dept_level= + + when #{item.deptId} then #{item.deptLevel} + + where dept_id in + + #{item.deptId} + + + + + update sys_dept set status = '0' where dept_id in + + #{deptId} + + + + + update sys_dept + set del_flag = '2' + where dept_id = #{deptId} + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 0000000..23018cd --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select dict_code, + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + create_by, + create_time, + remark + from sys_dict_data + + + + + + + + + + + + + + delete + from sys_dict_data + where dict_code = #{dictCode} + + + + delete from sys_dict_data where dict_code in + + #{dictCode} + + + + + update sys_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + css_class = #{cssClass}, + list_class = #{listClass}, + is_default = #{isDefault}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_code = #{dictCode} + + + + update sys_dict_data + set dict_type = #{newDictType} + where dict_type = #{oldDictType} + + + + insert into sys_dict_data( + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + remark, + create_by, + create_time + )values( + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{cssClass}, + #{listClass}, + #{isDefault}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 0000000..5e23f6c --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + select dict_id, dict_name, dict_type, status, create_by, create_time, remark + from sys_dict_type + + + + + + + + + + + + + + delete + from sys_dict_type + where dict_id = #{dictId} + + + + delete from sys_dict_type where dict_id in + + #{dictId} + + + + + update sys_dict_type + + dict_name = #{dictName}, + dict_type = #{dictType}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_id = #{dictId} + + + + insert into sys_dict_type( + dict_name, + dict_type, + status, + remark, + create_by, + create_time + )values( + #{dictName}, + #{dictType}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..5c8d6dd --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 0000000..df4df07 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, + menu_name, + parent_id, + order_num, + path, + component, + query, + is_frame, + is_cache, + menu_type, + visible, + status, + ifnull(perms, '') as perms, + icon, + create_time + from sys_menu + + + + + + + + + + + + + + + + + + + + + + + + update sys_menu + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + query = #{query}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + query, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{query}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete + from sys_menu + where menu_id = #{menuId} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysNoticeMapper.xml new file mode 100644 index 0000000..58ddcaa --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into sys_notice (notice_title, + notice_type, + notice_content, + status, + remark, + create_by, + create_time, + is_deleted, + create_dept) + values (#{noticeTitle}, + #{noticeType}, + #{noticeContent}, + #{status}, + #{remark}, + #{createBy}, + #{createTime}, + #{isDeleted}, + #{createDept}) + + + + update sys_notice + set notice_title = #{noticeTitle}, + notice_type = #{noticeType}, + notice_content = #{noticeContent}, + status = #{status}, + update_by = #{updateBy}, + update_time = #{updateTime} + where notice_id = #{noticeId} + + + + update sys_notice + set is_deleted = 1 + where notice_id = #{noticeId} + + + + update sys_notice set is_deleted = 1 + where notice_id in + + #{noticeId} + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..9591367 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, + title, + business_type, + method, + request_method, + operator_type, + oper_name, + dept_name, + oper_url, + oper_ip, + oper_location, + oper_param, + json_result, + status, + error_msg, + oper_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysPostMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 0000000..d7ddf4f --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark + from sys_post + + + + + + + + + + + + + + + + + + update sys_post + + post_code = #{postCode}, + post_name = #{postName}, + post_sort = #{postSort}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where post_id = #{postId} + + + + insert into sys_post( + post_id, + post_code, + post_name, + post_sort, + status, + remark, + create_by, + create_time + )values( + #{postId}, + #{postCode}, + #{postName}, + #{postSort}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_post where post_id = #{postId} + + + + delete from sys_post where post_id in + + #{postId} + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..7f5e724 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_role_dept where role_id=#{roleId} + + + + + + delete from sys_role_dept where role_id in + + #{roleId} + + + + + insert into sys_role_dept(role_id, dept_id) values + + (#{item.roleId},#{item.deptId}) + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..0a7bd58 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select distinct r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.menu_check_strictly, + r.dept_check_strictly, + r.status, + r.del_flag, + r.create_time, + r.remark + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + + + + + + insert into sys_role( + role_id, + role_name, + role_key, + role_sort, + data_scope, + menu_check_strictly, + dept_check_strictly, + status, + remark, + create_by, + sys_id, + create_time + )values( + #{roleId}, + #{roleName}, + #{roleKey}, + #{roleSort}, + #{dataScope}, + #{menuCheckStrictly}, + #{deptCheckStrictly}, + #{status}, + #{remark}, + #{createBy}, + #{sysId}, + sysdate() + ) + + + + update sys_role + + role_name = #{roleName}, + role_key = #{roleKey}, + role_sort = #{roleSort}, + data_scope = #{dataScope}, + menu_check_strictly = #{menuCheckStrictly}, + dept_check_strictly = #{deptCheckStrictly}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where role_id = #{roleId} + + + + update sys_role + set del_flag = '2' + where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..f7ce28d --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + delete + from sys_role_menu + where role_id = #{roleId} + + + + delete + from role_in_area + where role_id = #{roleId} + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + + insert into role_in_area(role_id, area_id) values + + (#{item.roleId},#{item.areaId}) + + + + insert into sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysUserMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..2073504 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, + u.dept_id, + u.user_name, + u.nick_name, + u.email, + u.avatar, + u.phonenumber, + u.password, + u.sex, + u.status, + u.del_flag, + u.login_ip, + u.login_date, + u.create_by, + u.create_time, + u.remark, + u.web_login, + u.portal_login, + d.dept_id, + d.parent_id, + d.dept_name, + d.order_num, + d.leader, + d.status as dept_status, + r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.status as role_status + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id + + + + + + + + + + + + + + + + + + + + insert into sys_user(user_id, dept_id, user_name, nick_name, + email, + avatar, + phonenumber, + password, + status, + create_by, + remark, + create_time, + web_login, + portal_login) + values (#{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{password}, + #{status}, + #{createBy}, + #{remark}, + sysdate(), + #{webLogin}, + #{portalLogin}) + + + + update sys_user + set password = #{password}, + update_by = #{updateBy} + where user_id = #{userId} + + + + update sys_user + set dept_id = #{deptId}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + status = #{status}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate(), + web_login = #{webLogin}, + portal_login = #{portalLogin} + where user_id = #{userId} + + + + update sys_user + set login_ip = #{loginIp}, + login_date = #{loginDate}, + update_time = sysdate() + where user_id = #{userId} + + + + update sys_user + set status = #{status} + where user_id = #{userId} + + + + update sys_user + set avatar = #{avatar} + where user_name = #{userName} + + + + update sys_user + set password = #{password} + where user_name = #{userName} + + + + update sys_user + set del_flag = '2' + where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysUserPostMapper.xml new file mode 100644 index 0000000..7de2f17 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + delete from sys_user_post where user_id=#{userId} + + + + + + delete from sys_user_post where user_id in + + #{userId} + + + + + insert into sys_user_post(user_id, post_id) values + + (#{item.userId},#{item.postId}) + + + + \ No newline at end of file diff --git a/ai-xuebao-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ai-xuebao-system/src/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..ceb3c06 --- /dev/null +++ b/ai-xuebao-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + delete from sys_user_role where user_id=#{userId} + + and role_id in (select role_id from sys_role where sys_id=#{sysId}) + + + + + + + delete from sys_user_role where user_id in + + #{userId} + + + + + insert into sys_user_role(user_id, role_id) values + + (#{item.userId},#{item.roleId}) + + + + + delete + from sys_user_role + where user_id = #{userId} + and role_id = #{roleId} + + + + delete from sys_user_role where role_id=#{roleId} and user_id in + + #{userId} + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..73f03af --- /dev/null +++ b/pom.xml @@ -0,0 +1,301 @@ + + + 4.0.0 + + net.hzvtc + aibird + 1.2.0 + + ai-xuebao + http://www.hzvtc.net + 雪豹及伴生动物智慧监测系统 + + + 1.2.0 + UTF-8 + UTF-8 + 1.8 + 3.1.1 + 1.2.8 + 1.21 + 3.0.0 + 2.3.2 + 2.2.0 + 1.4.7 + 1.2.83 + 5.8.6 + 5.10.0 + 2.11.0 + 1.4 + 3.2.2 + 4.1.2 + 2.3 + 0.12.5 + 2.1.2 + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.7.14 + pom + import + + + + org.springframework.boot + spring-boot-starter-mail + 2.3.5.RELEASE + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + eu.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.boot.version} + + + + + com.github.oshi + oshi-core + ${oshi.version} + + + + + + + + + + + + + + + net.java.dev.jna + jna + ${jna.version} + + + + net.java.dev.jna + jna-platform + ${jna.version} + + + + + io.springfox + springfox-boot-starter + ${swagger.version} + + + io.swagger + swagger-models + + + + + + + commons-io + commons-io + ${commons.io.version} + + + + + commons-fileupload + commons-fileupload + ${commons.fileupload.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + jakarta.json + jakarta.json-api + ${jakarta-json.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + commons-collections + commons-collections + ${commons.collections.version} + + + + co.elastic.clients + elasticsearch-java + 8.14.3 + + + org.elasticsearch.client + elasticsearch-rest-client + 8.14.3 + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + + com.github.penggle + kaptcha + ${kaptcha.version} + + + + + net.hzvtc + ai-xuebao-quartz + ${animal.version} + + + + + net.hzvtc + ai-xuebao-generator + ${animal.version} + + + + + net.hzvtc + ai-xuebao-framework + ${animal.version} + + + + + net.hzvtc + ai-xuebao-system + ${animal.version} + + + + + net.hzvtc + ai-xuebao-common + ${animal.version} + + + + net.hzvtc + ai-xuebao-es + ${animal.version} + + + + + + + ai-xuebao-admin + ai-xuebao-system + ai-xuebao-framework + ai-xuebao-quartz + ai-xuebao-generator + ai-xuebao-common + ai-xuebao-es + + pom + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + false + + + + + \ No newline at end of file