From 166149bdd7dc84a96b5b6b94d59be0e1e90dca67 Mon Sep 17 00:00:00 2001 From: shizisheng Date: Wed, 14 May 2025 11:38:17 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=B7=A5=E5=9C=B0-oss=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E7=AE=A1=E7=90=86-=E9=85=8D=E5=90=88?= =?UTF-8?q?=E5=A4=A9=E7=BF=BC=E4=BA=91OSS-=E8=A6=81=E5=9C=A8nacos=E9=87=8C?= =?UTF-8?q?system.yml=E9=85=8D=E7=BD=AEosstianyi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/service/DictService.java | 3 + .../dict/service/impl/DictServiceImpl.java | 5 + dk-modules/system/pom.xml | 5 + .../system/config/OssTianyiConfig.java | 79 ++++++ .../ossTianyi/OssTianyiController.java | 58 +++++ .../controller/site/SiteController.java | 125 +++++++++ .../controller/site/SiteWeekController.java | 239 ++++++++++++++++++ .../site/SiteWeekOssController.java | 227 +++++++++++++++++ .../system/SysSubmailConfigController.java | 25 +- .../org/dromara/system/domain/SiteWeek.java | 67 +++++ .../dromara/system/domain/SiteWeekOss.java | 71 ++++++ .../dromara/system}/domain/SysUploadFile.java | 2 +- .../dromara/system/domain/bo/SiteWeekBo.java | 73 ++++++ .../system/domain/bo/SiteWeekOssBo.java | 78 ++++++ .../system/domain/vo/SiteWeekOssVo.java | 86 +++++++ .../dromara/system/domain/vo/SiteWeekVo.java | 86 +++++++ .../dromara/system/mapper/SiteWeekMapper.java | 15 ++ .../system/mapper/SiteWeekOssMapper.java | 15 ++ .../system/service/ISiteWeekOssService.java | 69 +++++ .../system/service/ISiteWeekService.java | 69 +++++ .../service/impl/SiteWeekOssServiceImpl.java | 135 ++++++++++ .../service/impl/SiteWeekServiceImpl.java | 135 ++++++++++ .../system/utils/OssTianyiClientUtils.java | 179 +++++++++++++ .../org/dromara/system/utils/WeekNoUtil.java | 66 +++++ .../mapper/system/SiteWeekMapper.xml | 7 + .../mapper/system/SiteWeekOssMapper.xml | 7 + 26 files changed, 1924 insertions(+), 2 deletions(-) create mode 100644 dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java rename dk-modules/{sample/src/main/java/org/dromara/sample/storage => system/src/main/java/org/dromara/system}/domain/SysUploadFile.java (99%) create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekBo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekOssBo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekOssVo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekVo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekMapper.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekOssMapper.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekOssService.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekService.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekOssServiceImpl.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekServiceImpl.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/utils/OssTianyiClientUtils.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/utils/WeekNoUtil.java create mode 100644 dk-modules/system/src/main/resources/mapper/system/SiteWeekMapper.xml create mode 100644 dk-modules/system/src/main/resources/mapper/system/SiteWeekOssMapper.xml diff --git a/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java b/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java index 9f2632f..021800e 100644 --- a/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java +++ b/dk-common/common-core/src/main/java/org/dromara/common/core/service/DictService.java @@ -60,4 +60,7 @@ public interface DictService { * @return dictValue为key,dictLabel为值组成的Map */ Map getAllDictByDictType(String dictType); + + //获取字典下所有的字典值与标签 (key: 字典标签, value:字典键值) + Map getAllDictMapByDictType(String dictType); } diff --git a/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java b/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java index 62a5d45..7453946 100644 --- a/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java +++ b/dk-common/common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java @@ -86,4 +86,9 @@ public class DictServiceImpl implements DictService { return StreamUtils.toMap(list, RemoteDictDataVo::getDictValue, RemoteDictDataVo::getDictLabel); } + @Override + public Map getAllDictMapByDictType(String dictType) { + List list = remoteDictService.selectDictDataByType(dictType); + return StreamUtils.toMap(list, RemoteDictDataVo::getDictLabel, RemoteDictDataVo::getDictValue); + } } diff --git a/dk-modules/system/pom.xml b/dk-modules/system/pom.xml index 37e2ae9..b0c2d65 100644 --- a/dk-modules/system/pom.xml +++ b/dk-modules/system/pom.xml @@ -93,6 +93,11 @@ common-encrypt + + org.dromara + common-oss + + org.dromara diff --git a/dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java b/dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java new file mode 100644 index 0000000..8ea7cdb --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/config/OssTianyiConfig.java @@ -0,0 +1,79 @@ +package org.dromara.system.config; + +import io.minio.MinioClient; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Minio 配置信息 + * + * @author ruoyi + */ +@Configuration +@ConfigurationProperties(prefix = "osstianyi") +public class OssTianyiConfig +{ + + private String endPoint; + private String accessKey; + private String secretKey; + private String bucketName; + + public String getEndPoint() { + return endPoint; + } + + public void setEndPoint(String endPoint) { + this.endPoint = endPoint; + } + + public String getAccessKey() + { + return accessKey; + } + + public void setAccessKey(String accessKey) + { + this.accessKey = accessKey; + } + + public String getSecretKey() + { + return secretKey; + } + + public void setSecretKey(String secretKey) + { + this.secretKey = secretKey; + } + + public String getBucketName() + { + return bucketName; + } + + public void setBucketName(String bucketName) + { + this.bucketName = bucketName; + } + + @Override + public String toString() { + return "OssTianyiConfig{" + + "endPoint='" + endPoint + '\'' + + ", accessKey='" + accessKey + '\'' + + ", secretKey='" + secretKey + '\'' + + ", bucketName='" + bucketName + '\'' + + '}'; + } + + @Bean + public MinioClient getMinioClient() + { +// System.out.println("OssTianyiConfig"); +// System.out.println("OssTianyiConfig" + endPoint); + System.out.println(toString()); + return MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build(); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java new file mode 100644 index 0000000..6bc7580 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/ossTianyi/OssTianyiController.java @@ -0,0 +1,58 @@ +package org.dromara.system.controller.ossTianyi; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysUploadFile; +import org.dromara.system.utils.OssTianyiClientUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; + +/** + * 系统上传文件Controller + * + * @author tom + * @date 2024-12-21 + */ +@RestController +@RequestMapping("/ossTianyi") +public class OssTianyiController extends BaseController +{ + + @Autowired + private OssTianyiClientUtils ossTianyiClientUtils; + + /** + * 查询系统上传文件列表 (实际是上传接口) + */ + @SaCheckPermission("file:sysUploadFile:list") + @GetMapping("/list") + public TableDataInfo list(SysUploadFile sysUploadFile) + { + String localFilePath = "D:\\123pan\\page.html"; + try{ + ossTianyiClientUtils.uploadFileTest("page.html","dev/temp",localFilePath); + }catch (Exception e){ + e.printStackTrace(); + } + + return null; + } + + @GetMapping("/upload") + public R> upload(@RequestPart("file") MultipartFile file) { + try { + ossTianyiClientUtils.uploadFile( "dev/temp/"+file.getName(), file); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java new file mode 100644 index 0000000..ac4a828 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteController.java @@ -0,0 +1,125 @@ +package org.dromara.system.controller.site; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.service.DictService; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.resource.api.RemoteMessageService; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.service.ISysNoticeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 公告 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/site") +public class SiteController extends BaseController { + + private final ISysNoticeService noticeService; + private final DictService dictService; + + @DubboReference + private final RemoteMessageService remoteMessageService; + + + + //每周提供一次二维场地全貌图及工地视频。 以周为单位处理数据 + //site/img/2005/xxxxxxx.png + //site/video/2025/ + + //todo 二维瓦片上传 + + + //todo 二维瓦片批量上传 (按照周) + + + //todo 二维瓦片批量下载 (按照周) + + //todo 二维瓦片访问 #按照 http://localhost:3308/tile/{z}/{x}/{y}.png 模式访问 + + + //todo 工地视频上传 + + //todo 工地视频下载 + + + + + + + + + + + + /** + * 获取通知公告列表 + */ +// @SaCheckPermission("system:notice:list") + @GetMapping("/list") + public TableDataInfo list(SysNoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeList(notice, pageQuery); + } + + /** + * 根据通知公告编号获取详细信息 + * + * @param noticeId 公告ID + */ +// @SaCheckPermission("system:notice:query") + @GetMapping(value = "/{noticeId}") + public R getInfo(@PathVariable Long noticeId) { + return R.ok(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ +// @SaCheckPermission("system:notice:add") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysNoticeBo notice) { + int rows = noticeService.insertNotice(notice); + if (rows <= 0) { + return R.fail(); + } + String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); + remoteMessageService.publishAll("[" + type + "] " + notice.getNoticeTitle()); + return R.ok(); + } + + /** + * 修改通知公告 + */ +// @SaCheckPermission("system:notice:edit") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysNoticeBo notice) { + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + * + * @param noticeIds 公告ID串 + */ +// @SaCheckPermission("system:notice:remove") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public R remove(@PathVariable Long[] noticeIds) { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java new file mode 100644 index 0000000..3ad738d --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekController.java @@ -0,0 +1,239 @@ +package org.dromara.system.controller.site; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.service.DictService; +import org.dromara.common.dict.utils.DictUtils; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.domain.SiteWeek; +import org.dromara.system.domain.bo.SiteWeekOssBo; +import org.dromara.system.domain.vo.SiteWeekOssVo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISiteWeekOssService; +import org.dromara.system.service.ISysDictDataService; +import org.dromara.system.utils.OssTianyiClientUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SiteWeekVo; +import org.dromara.system.domain.bo.SiteWeekBo; +import org.dromara.system.service.ISiteWeekService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.utils.WeekNoUtil; + + +/** + * 工地日期周 + * 前端访问路由地址为:/system/siteWeek + * + * @author szs + * @date 2025-05-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/siteWeek") +public class SiteWeekController extends BaseController { + + private final ISiteWeekService siteWeekService; + +// @Autowired +// private ISysDictDataService sysDictDataService; +// RemoteDictService + + private final DictService dictService; + + @Autowired + private ISiteWeekOssService siteWeekOssService; + + @Autowired + private OssTianyiClientUtils ossTianyiClientUtils; + + + /** + * 查询工地日期周列表 + */ + @SaCheckPermission("system:siteWeek:list") + @GetMapping("/list") + public TableDataInfo list(SiteWeekBo bo, PageQuery pageQuery) { + return siteWeekService.queryPageList(bo, pageQuery); + } + + /** + * 导出工地日期周列表 + */ + @SaCheckPermission("system:siteWeek:export") + @Log(title = "工地日期周", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SiteWeekBo bo, HttpServletResponse response) { + List list = siteWeekService.queryList(bo); + ExcelUtil.exportExcel(list, "工地日期周", SiteWeekVo.class, response); + } + + /** + * 获取工地日期周详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:siteWeek:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(siteWeekService.queryById(id)); + } + + /** + * 新增工地日期周 + */ + @SaCheckPermission("system:siteWeek:add") + @Log(title = "工地日期周", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SiteWeekBo bo) { + return toAjax(siteWeekService.insertByBo(bo)); + } + + @SaCheckPermission("system:siteWeek:add") + @Log(title = "工地日期周", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/autoAdd") + public R autoAdd(@Validated(AddGroup.class) @RequestBody SiteWeekBo bo) { + R siteWeekVo = autoAddSiteWeek(); + return siteWeekVo; + } + + private R autoAddSiteWeek() { + //新增时基于最新日期处理weekNo + //先查找当前周是否已存在数据库, 有》返回已有数据, 无》新建数据再返回 + Date currentDate = new Date(); + + int weekNoByDate = WeekNoUtil.getWeekNoByDate(currentDate); + + SiteWeekBo siteWeekBo = new SiteWeekBo(); + siteWeekBo.setWeekNo((long) weekNoByDate); + + + List siteWeekVoList = siteWeekService.queryList(siteWeekBo); + SiteWeekVo siteWeekVo = null; + if (siteWeekVoList.size() > 0) { + return R.fail("当前周已存在,无法新增"); + + }else{ + String dateStr = WeekNoUtil.generateDateStr(currentDate); + String dateFormatStr = DateUtil.format(currentDate, "yyyy-MM-dd"); + siteWeekBo.setName(dateStr); + siteWeekBo.setNameTime(dateFormatStr); + + + //扩展默认字典配置 默认(tile/tileZip/img/video) +// List siteOssDirList = DictUtils.getDictCache("site_oss_dir"); + /** + * 这里用dictService直接查,是因为 RemoteDictDataVo 转 SysDictDataVo 报错,折中做法,(简单说就是 RemoteDictDataVo vo = siteOssDirList.get(0)就报错) + * 报错如下 + * class org.dromara.system.domain.vo.SysDictDataVo cannot be cast to class org.dromara.system.api.domain.vo.RemoteDictDataVo + * (org.dromara.system.domain.vo.SysDictDataVo and org.dromara.system.api.domain.vo.RemoteDictDataVo are in unnamed module of + * loader 'app') + */ + Map siteOssDirMap = dictService.getAllDictMapByDictType("site_oss_dir"); + + siteWeekBo.setDirTile(siteOssDirMap.getOrDefault("二维地图","tile")); + siteWeekBo.setDirTileZip(siteOssDirMap.getOrDefault("二维地图压缩包","tileZip")); + siteWeekBo.setDirImg(siteOssDirMap.getOrDefault("图片","img")); + siteWeekBo.setDirVideo(siteOssDirMap.getOrDefault("视频","video")); + +/* + for (int i = 0; i < siteOssDirList.size(); i++) { + switch (siteOssDirList.get(i).getDictLabel()){ + case "二维地图": + siteWeekBo.setDirTile(siteOssDirList.get(i).getDictValue()); + break; + case "二维地图压缩包": + siteWeekBo.setDirTileZip(siteOssDirList.get(i).getDictValue()); + break; + case "图片": + siteWeekBo.setDirImg(siteOssDirList.get(i).getDictValue()); + break; + case "视频": + siteWeekBo.setDirVideo(siteOssDirList.get(i).getDictValue()); + break; + } + }*/ + + siteWeekService.insertByBo(siteWeekBo); + siteWeekVo = BeanUtil.copyProperties(siteWeekBo, SiteWeekVo.class); + } + return R.ok(siteWeekVo); + } + + + + + /** + * 修改工地日期周 + */ + @SaCheckPermission("system:siteWeek:edit") + @Log(title = "工地日期周", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SiteWeekBo bo) { + return toAjax(siteWeekService.updateByBo(bo)); + } + + @SaCheckPermission("system:siteWeek:edit") + @Log(title = "更新工地日期周", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("changeKeepFlag") + public R changeKeepFlag(@Validated(EditGroup.class) @RequestBody SiteWeekBo bo) { + return toAjax(siteWeekService.updateByBo(bo)); + } + + /** + * 删除工地日期周 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:siteWeek:remove") + @Log(title = "工地日期周", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { +// Boolean result = siteWeekService.deleteWithValidByIds(List.of(ids), true); + + Boolean result = true; + for (Long id : ids) { + SiteWeekOssBo siteWeekOssBo = new SiteWeekOssBo(); + siteWeekOssBo.setSiteWeekId(id); + List siteWeekOssVoList = siteWeekOssService.queryList(siteWeekOssBo); + for (SiteWeekOssVo siteWeekOssVo : siteWeekOssVoList) { + try{ + ossTianyiClientUtils.deleteFile(siteWeekOssVo.getUrl()); //minio删除文件 + siteWeekOssService.deleteWithValidByIds(List.of(siteWeekOssVo.getId()),true); //工地周数据删除 + }catch (Exception e){ + result = false; + System.err.println("天翼oss文件删除失败"+ siteWeekOssVo.getUrl()); + } + } + siteWeekService.deleteWithValidByIds(List.of(id),true); + } + + return toAjax(result); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java new file mode 100644 index 0000000..e64d65c --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/site/SiteWeekOssController.java @@ -0,0 +1,227 @@ +package org.dromara.system.controller.site; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.List; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.ObjectUtil; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.ServletOutputStream; +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.apache.poi.util.IOUtils; +import org.dromara.system.config.OssTianyiConfig; +import org.dromara.system.domain.bo.SiteWeekBo; +import org.dromara.system.domain.vo.SiteWeekVo; +import org.dromara.system.service.ISiteWeekService; +import org.dromara.system.utils.OssTianyiClientUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SiteWeekOssVo; +import org.dromara.system.domain.bo.SiteWeekOssBo; +import org.dromara.system.service.ISiteWeekOssService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 工地周OSS对象存储 + * 前端访问路由地址为:/system/siteWeekOss + * + * @author szs + * @date 2025-05-10 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/siteWeekOss") +public class SiteWeekOssController extends BaseController { + + private final ISiteWeekOssService siteWeekOssService; + + @Autowired + private ISiteWeekService siteWeekService; + + @Autowired + private OssTianyiClientUtils ossTianyiClientUtils; + + /** + * 查询工地周OSS对象存储列表 + */ + @SaCheckPermission("system:siteWeekOss:list") + @GetMapping("/list") + public TableDataInfo list(SiteWeekOssBo bo, PageQuery pageQuery) { + return siteWeekOssService.queryPageList(bo, pageQuery); + } + + /** + * 导出工地周OSS对象存储列表 + */ + @SaCheckPermission("system:siteWeekOss:export") + @Log(title = "工地周OSS对象存储", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SiteWeekOssBo bo, HttpServletResponse response) { + List list = siteWeekOssService.queryList(bo); + ExcelUtil.exportExcel(list, "工地周OSS对象存储", SiteWeekOssVo.class, response); + } + + /** + * 获取工地周OSS对象存储详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:siteWeekOss:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(siteWeekOssService.queryById(id)); + } + + /** + * 新增工地周OSS对象存储 + */ + @SaCheckPermission("system:siteWeekOss:add") + @Log(title = "工地周OSS对象存储", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SiteWeekOssBo bo) { + return toAjax(siteWeekOssService.insertByBo(bo)); + } + + /** + * 修改工地周OSS对象存储 + */ + @SaCheckPermission("system:siteWeekOss:edit") + @Log(title = "工地周OSS对象存储", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SiteWeekOssBo bo) { + return toAjax(siteWeekOssService.updateByBo(bo)); + } + +// @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) + @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "上传OSS对象存储",description = "上传OSS对象存储") + public R upload(@RequestPart("file") MultipartFile file, @RequestParam("siteWeekId") Long siteWeekId) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + + SiteWeekVo siteWeekVo = siteWeekService.queryById(siteWeekId); + //工地日期周默认上传路径 + String baseUrl = siteWeekVo.getNameTime() + "/" + siteWeekVo.getDirTile() + "/"; + + //上传到minio + String fileUrl = baseUrl + file.getOriginalFilename(); + ossTianyiClientUtils.uploadFile(fileUrl, file); + + + //记录到本地 + SiteWeekOssBo siteWeekOssBo = new SiteWeekOssBo(); + siteWeekOssBo.setSiteWeekId(siteWeekVo.getId()); + siteWeekOssBo.setWeekNo(siteWeekVo.getWeekNo()); + siteWeekOssBo.setFileName(file.getOriginalFilename()); + siteWeekOssBo.setOriginalName(file.getOriginalFilename()); + siteWeekOssBo.setFileSuffix(FileUtil.extName(file.getOriginalFilename())); + siteWeekOssBo.setUrl(fileUrl); + siteWeekOssBo.setService("tianyiOss"); + + Boolean uploadBo = siteWeekOssService.insertByBo(siteWeekOssBo); + + +// SysOssVo oss = iSysOssService.upload(file); +// SiteWeekOssBo uploadVo = new SiteWeekOssBo(); +// uploadVo.setUrl(oss.getUrl()); +// uploadVo.setFileName(oss.getOriginalName()); +// uploadVo.setOssId(oss.getOssId().toString()); +// return R.ok(uploadVo); + return R.ok(siteWeekOssBo); + } + + /** + * 下载OSS对象存储 + * + * @param id OSS对象ID + */ + @GetMapping("/download/{id}") + @Operation(summary = "下载OSS对象存储",description = "下载OSS对象存储") + public void download(@PathVariable Long id, HttpServletResponse response) throws IOException { + SiteWeekOssVo siteWeekOssVo = siteWeekOssService.queryById(id); +// InputStream inputStream = ossTianyiClientUtils.downloadFile(siteWeekOssVo.getUrl()); + +// String encodedFileName = URLEncoder.encode(siteWeekOssVo.getFileName(), "UTF-8").replaceAll("\\+", "%20"); +// response.setContentType("application/octet-stream"); +// response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName); +// response.setHeader("download-filename", encodedFileName); +// // 文件流复制 +// try (ServletOutputStream outputStream = response.getOutputStream()) { +// IOUtils.copy(inputStream, outputStream); +// outputStream.flush(); +// } finally { +// inputStream.close(); // 关闭流 +// } + + try (InputStream inputStream = ossTianyiClientUtils.downloadFile(siteWeekOssVo.getUrl())) { + + // 文件名进行编码 + String encodedFileName = URLEncoder.encode(siteWeekOssVo.getFileName(), "UTF-8").replaceAll("\\+", "%20"); + response.setContentType("application/octet-stream");// 设置响应内容类型 + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName); + + // 获取响应输出流 + ServletOutputStream outputStream = response.getOutputStream(); + // 文件内容写入响应输出流 + byte[] buffer = new byte[1024]; + + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + outputStream.flush(); + } catch (Exception e) { + throw new RuntimeException("下载有误"); + } + } + + + /** + * 删除工地周OSS对象存储 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:siteWeekOss:remove") + @Log(title = "工地周OSS对象存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { +// Boolean result = siteWeekOssService.deleteWithValidByIds(List.of(ids), true); + Boolean result = true; + for (Long id : ids) { + SiteWeekOssVo siteWeekOssVo = siteWeekOssService.queryById(id); + try{ + ossTianyiClientUtils.deleteFile(siteWeekOssVo.getUrl()); //minio删除文件 + siteWeekOssService.deleteWithValidByIds(List.of(id),true); //工地周数据删除 + }catch (Exception e){ + result = false; + System.err.println("天翼oss文件删除失败"+ siteWeekOssVo.getUrl()); + } + + } + return toAjax(result); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java index 5860774..294e78c 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysSubmailConfigController.java @@ -1,6 +1,7 @@ package org.dromara.system.controller.system; import java.nio.file.CopyOption; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -18,17 +19,22 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.excel.core.ExcelResult; import org.dromara.system.domain.SysSubmailConfigUser; import org.dromara.system.domain.SysSubmailLog; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysSubmailConfigUserBo; import org.dromara.system.domain.bo.SysSubmailLogBo; import org.dromara.system.domain.vo.SysSubmailConfigUserVo; +import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.listener.SysUserImportListener; import org.dromara.system.service.ISysConfigService; import org.dromara.system.service.ISysSubmailConfigUserService; import org.dromara.system.service.ISysSubmailLogService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -44,6 +50,7 @@ import org.dromara.system.domain.vo.SysSubmailConfigVo; import org.dromara.system.domain.bo.SysSubmailConfigBo; import org.dromara.system.service.ISysSubmailConfigService; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 赛邮服务配置 @@ -87,6 +94,18 @@ public class SysSubmailConfigController extends BaseController { return sysSubmailConfigService.queryList(bo); } + @SaCheckPermission("system:sysSubmailConfig:export") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { +// ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysSubmailConfigVo.class, new SysUserImportListener(updateSupport)); + System.out.println(file.getName()); + return R.ok(null); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "配置数据", SysSubmailConfigVo.class, response); + } /** * 导出赛邮服务配置列表 */ @@ -95,7 +114,11 @@ public class SysSubmailConfigController extends BaseController { @PostMapping("/export") public void export(SysSubmailConfigBo bo, HttpServletResponse response) { List list = sysSubmailConfigService.queryList(bo); - ExcelUtil.exportExcel(list, "赛邮服务配置", SysSubmailConfigVo.class, response); +// ExcelUtil.exportExcel(list, "赛邮服务配置", SysSubmailConfigVo.class, response); + + List listVo = MapstructUtils.convert(list, SysSubmailConfigVo.class); + // 导出方法 + ExcelUtil.exportExcel(listVo, "赛邮服务数据", SysSubmailConfigVo.class, response); } /** diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java new file mode 100644 index 0000000..c1d3797 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeek.java @@ -0,0 +1,67 @@ +package org.dromara.system.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 工地日期周对象 site_week + * + * @author szs + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("site_week") +public class SiteWeek extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 名称 + */ + private String name; + + /** + * 年月日名称 + */ + private String nameTime; + + /** + * 周编号 + */ + private Long weekNo; + + /** + * 周描述 + */ + private String weekNoDescr; + + /** + * 分组编号(备用) + */ + private Long groupNo; + + private String dirTile; + private String dirTileZip; + private String dirImg; + private String dirVideo; + private String isKeepFlag; //是否保存(0正常 1停用) + + /** + * 备注 + */ + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java new file mode 100644 index 0000000..59d258d --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SiteWeekOss.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 工地周OSS对象存储对象 site_week_oss + * + * @author szs + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("site_week_oss") +public class SiteWeekOss extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 工地周id + */ + private Long siteWeekId; + + /** + * 周编号 + */ + private Long weekNo; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 备注 + */ + private String remark; + + /** + * 服务商 + */ + private String service; + + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/storage/domain/SysUploadFile.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SysUploadFile.java similarity index 99% rename from dk-modules/sample/src/main/java/org/dromara/sample/storage/domain/SysUploadFile.java rename to dk-modules/system/src/main/java/org/dromara/system/domain/SysUploadFile.java index 9e004dd..49b7b11 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/storage/domain/SysUploadFile.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SysUploadFile.java @@ -1,4 +1,4 @@ -package org.dromara.sample.storage.domain; +package org.dromara.system.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekBo.java new file mode 100644 index 0000000..826ef37 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekBo.java @@ -0,0 +1,73 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SiteWeek; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 工地日期周业务对象 site_week + * + * @author szs + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SiteWeek.class, reverseConvertGenerate = false) +public class SiteWeekBo extends BaseEntity { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 名称 + */ +// @NotBlank(message = "名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 年月日名称 + */ +// @NotBlank(message = "年月日名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameTime; + + /** + * 周编号 + */ +// @NotNull(message = "周编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long weekNo; + + /** + * 周描述 + */ +// @NotBlank(message = "周描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String weekNoDescr; + + /** + * 分组编号(备用) + */ +// @NotNull(message = "分组编号(备用)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long groupNo; + + private String dirTile;//瓦片路径 + private String dirTileZip;//瓦片压缩包 + private String dirImg;//图片路径 + private String dirVideo;//视频路径 + private String isKeepFlag; //是否保存(0正常 1停用) + + + /** + * 备注 + */ +// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekOssBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekOssBo.java new file mode 100644 index 0000000..84e23b0 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/SiteWeekOssBo.java @@ -0,0 +1,78 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SiteWeekOss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 工地周OSS对象存储业务对象 site_week_oss + * + * @author szs + * @date 2025-05-10 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SiteWeekOss.class, reverseConvertGenerate = false) +public class SiteWeekOssBo extends BaseEntity { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 工地周id + */ + @NotNull(message = "工地周id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long siteWeekId; + + /** + * 周编号 + */ + @NotNull(message = "周编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long weekNo; + + /** + * 文件名 + */ + @NotBlank(message = "文件名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileName; + + /** + * 原名 + */ + @NotBlank(message = "原名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String originalName; + + /** + * 文件后缀名 + */ + @NotBlank(message = "文件后缀名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String fileSuffix; + + /** + * URL地址 + */ + @NotBlank(message = "URL地址不能为空", groups = { AddGroup.class, EditGroup.class }) + private String url; + + /** + * 备注 + */ + @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + /** + * 服务商 + */ + @NotBlank(message = "服务商不能为空", groups = { AddGroup.class, EditGroup.class }) + private String service; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekOssVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekOssVo.java new file mode 100644 index 0000000..9271e36 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekOssVo.java @@ -0,0 +1,86 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SiteWeekOss; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 工地周OSS对象存储视图对象 site_week_oss + * + * @author szs + * @date 2025-05-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SiteWeekOss.class) +public class SiteWeekOssVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 工地周id + */ + @ExcelProperty(value = "工地周id") + private Long siteWeekId; + + /** + * 周编号 + */ + @ExcelProperty(value = "周编号") + private Long weekNo; + + /** + * 文件名 + */ + @ExcelProperty(value = "文件名") + private String fileName; + + /** + * 原名 + */ + @ExcelProperty(value = "原名") + private String originalName; + + /** + * 文件后缀名 + */ + @ExcelProperty(value = "文件后缀名") + private String fileSuffix; + + /** + * URL地址 + */ + @ExcelProperty(value = "URL地址") + private String url; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 服务商 + */ + @ExcelProperty(value = "服务商") + private String service; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekVo.java new file mode 100644 index 0000000..2085947 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/SiteWeekVo.java @@ -0,0 +1,86 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SiteWeek; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 工地日期周视图对象 site_week + * + * @author szs + * @date 2025-05-10 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SiteWeek.class) +public class SiteWeekVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 名称 + */ + @ExcelProperty(value = "名称") + private String name; + + /** + * 年月日名称 + */ + @ExcelProperty(value = "年月日名称") + private String nameTime; + + /** + * 周编号 + */ + @ExcelProperty(value = "周编号") + private Long weekNo; + + /** + * 周描述 + */ + @ExcelProperty(value = "周描述") + private String weekNoDescr; + + /** + * 分组编号(备用) + */ + @ExcelProperty(value = "分组编号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "备=用") + private Long groupNo; + + @ExcelProperty(value = "瓦片路径") + private String dirTile; + @ExcelProperty(value = "瓦片压缩包") + private String dirTileZip; + @ExcelProperty(value = "图片路径") + private String dirImg; + @ExcelProperty(value = "视频路径") + private String dirVideo; + @ExcelProperty(value = "是否保存") + private String isKeepFlag; //是否保存(0正常 1停用) + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekMapper.java new file mode 100644 index 0000000..1c306a9 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SiteWeek; +import org.dromara.system.domain.vo.SiteWeekVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 工地日期周Mapper接口 + * + * @author szs + * @date 2025-05-10 + */ +public interface SiteWeekMapper extends BaseMapperPlus { + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekOssMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekOssMapper.java new file mode 100644 index 0000000..1e36b0b --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SiteWeekOssMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SiteWeekOss; +import org.dromara.system.domain.vo.SiteWeekOssVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 工地周OSS对象存储Mapper接口 + * + * @author szs + * @date 2025-05-10 + */ +public interface SiteWeekOssMapper extends BaseMapperPlus { + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekOssService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekOssService.java new file mode 100644 index 0000000..437255e --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekOssService.java @@ -0,0 +1,69 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SiteWeekOss; +import org.dromara.system.domain.vo.SiteWeekOssVo; +import org.dromara.system.domain.bo.SiteWeekOssBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 工地周OSS对象存储Service接口 + * + * @author szs + * @date 2025-05-10 + */ +public interface ISiteWeekOssService { + + /** + * 查询工地周OSS对象存储 + * + * @param id 主键 + * @return 工地周OSS对象存储 + */ + SiteWeekOssVo queryById(Long id); + + /** + * 分页查询工地周OSS对象存储列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 工地周OSS对象存储分页列表 + */ + TableDataInfo queryPageList(SiteWeekOssBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的工地周OSS对象存储列表 + * + * @param bo 查询条件 + * @return 工地周OSS对象存储列表 + */ + List queryList(SiteWeekOssBo bo); + + /** + * 新增工地周OSS对象存储 + * + * @param bo 工地周OSS对象存储 + * @return 是否新增成功 + */ + Boolean insertByBo(SiteWeekOssBo bo); + + /** + * 修改工地周OSS对象存储 + * + * @param bo 工地周OSS对象存储 + * @return 是否修改成功 + */ + Boolean updateByBo(SiteWeekOssBo bo); + + /** + * 校验并批量删除工地周OSS对象存储信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekService.java new file mode 100644 index 0000000..bc808b8 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISiteWeekService.java @@ -0,0 +1,69 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.SiteWeek; +import org.dromara.system.domain.vo.SiteWeekVo; +import org.dromara.system.domain.bo.SiteWeekBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 工地日期周Service接口 + * + * @author szs + * @date 2025-05-10 + */ +public interface ISiteWeekService { + + /** + * 查询工地日期周 + * + * @param id 主键 + * @return 工地日期周 + */ + SiteWeekVo queryById(Long id); + + /** + * 分页查询工地日期周列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 工地日期周分页列表 + */ + TableDataInfo queryPageList(SiteWeekBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的工地日期周列表 + * + * @param bo 查询条件 + * @return 工地日期周列表 + */ + List queryList(SiteWeekBo bo); + + /** + * 新增工地日期周 + * + * @param bo 工地日期周 + * @return 是否新增成功 + */ + Boolean insertByBo(SiteWeekBo bo); + + /** + * 修改工地日期周 + * + * @param bo 工地日期周 + * @return 是否修改成功 + */ + Boolean updateByBo(SiteWeekBo bo); + + /** + * 校验并批量删除工地日期周信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekOssServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekOssServiceImpl.java new file mode 100644 index 0000000..efaac85 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekOssServiceImpl.java @@ -0,0 +1,135 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SiteWeekOssBo; +import org.dromara.system.domain.vo.SiteWeekOssVo; +import org.dromara.system.domain.SiteWeekOss; +import org.dromara.system.mapper.SiteWeekOssMapper; +import org.dromara.system.service.ISiteWeekOssService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 工地周OSS对象存储Service业务层处理 + * + * @author szs + * @date 2025-05-10 + */ +@RequiredArgsConstructor +@Service +public class SiteWeekOssServiceImpl implements ISiteWeekOssService { + + private final SiteWeekOssMapper baseMapper; + + /** + * 查询工地周OSS对象存储 + * + * @param id 主键 + * @return 工地周OSS对象存储 + */ + @Override + public SiteWeekOssVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询工地周OSS对象存储列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 工地周OSS对象存储分页列表 + */ + @Override + public TableDataInfo queryPageList(SiteWeekOssBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的工地周OSS对象存储列表 + * + * @param bo 查询条件 + * @return 工地周OSS对象存储列表 + */ + @Override + public List queryList(SiteWeekOssBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SiteWeekOssBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSiteWeekId() != null, SiteWeekOss::getSiteWeekId, bo.getSiteWeekId()); + lqw.eq(bo.getWeekNo() != null, SiteWeekOss::getWeekNo, bo.getWeekNo()); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), SiteWeekOss::getFileName, bo.getFileName()); + lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), SiteWeekOss::getOriginalName, bo.getOriginalName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), SiteWeekOss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SiteWeekOss::getUrl, bo.getUrl()); + lqw.eq(StringUtils.isNotBlank(bo.getService()), SiteWeekOss::getService, bo.getService()); + return lqw; + } + + /** + * 新增工地周OSS对象存储 + * + * @param bo 工地周OSS对象存储 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SiteWeekOssBo bo) { + SiteWeekOss add = MapstructUtils.convert(bo, SiteWeekOss.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改工地周OSS对象存储 + * + * @param bo 工地周OSS对象存储 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SiteWeekOssBo bo) { + SiteWeekOss update = MapstructUtils.convert(bo, SiteWeekOss.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SiteWeekOss entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除工地周OSS对象存储信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekServiceImpl.java new file mode 100644 index 0000000..de8a353 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SiteWeekServiceImpl.java @@ -0,0 +1,135 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SiteWeekBo; +import org.dromara.system.domain.vo.SiteWeekVo; +import org.dromara.system.domain.SiteWeek; +import org.dromara.system.mapper.SiteWeekMapper; +import org.dromara.system.service.ISiteWeekService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 工地日期周Service业务层处理 + * + * @author szs + * @date 2025-05-10 + */ +@RequiredArgsConstructor +@Service +public class SiteWeekServiceImpl implements ISiteWeekService { + + private final SiteWeekMapper baseMapper; + + /** + * 查询工地日期周 + * + * @param id 主键 + * @return 工地日期周 + */ + @Override + public SiteWeekVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询工地日期周列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 工地日期周分页列表 + */ + @Override + public TableDataInfo queryPageList(SiteWeekBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的工地日期周列表 + * + * @param bo 查询条件 + * @return 工地日期周列表 + */ + @Override + public List queryList(SiteWeekBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + lqw.orderByDesc(BaseEntity::getCreateTime); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SiteWeekBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getName()), SiteWeek::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNameTime()), SiteWeek::getNameTime, bo.getNameTime()); + lqw.eq(bo.getWeekNo() != null, SiteWeek::getWeekNo, bo.getWeekNo()); + lqw.eq(StringUtils.isNotBlank(bo.getWeekNoDescr()), SiteWeek::getWeekNoDescr, bo.getWeekNoDescr()); + lqw.eq(bo.getGroupNo() != null, SiteWeek::getGroupNo, bo.getGroupNo()); + return lqw; + } + + /** + * 新增工地日期周 + * + * @param bo 工地日期周 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SiteWeekBo bo) { + SiteWeek add = MapstructUtils.convert(bo, SiteWeek.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改工地日期周 + * + * @param bo 工地日期周 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SiteWeekBo bo) { + SiteWeek update = MapstructUtils.convert(bo, SiteWeek.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SiteWeek entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除工地日期周信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/OssTianyiClientUtils.java b/dk-modules/system/src/main/java/org/dromara/system/utils/OssTianyiClientUtils.java new file mode 100644 index 0000000..9c557e8 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/utils/OssTianyiClientUtils.java @@ -0,0 +1,179 @@ +package org.dromara.system.utils; + +import cn.hutool.core.io.FileUtil; +import io.minio.*; +import io.minio.errors.*; +import io.minio.messages.Item; +import org.dromara.system.config.OssTianyiConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +@Component +public class OssTianyiClientUtils { + + private static MinioClient minioClient; + +// private static String endPoint = "https://jiangsu-10.zos.ctyun.cn"; //地域节点,可访问 +// // private static String endPoint = "https://dk-ty-oss-bucket.jiangsu-10.zos.ctyun.cn"; //说是桶的域名地址,支持公网访问ZOS,实测报错 +// private static String minioAccessKey = "22e3f37368a242b38f4f25d98c9baf1f"; +// private static String minioSecretKey = "0d858850666248e59830d9a596847062"; + + // private static String bucketName = "dk-ty-oss-bucket"; +// private String bucketName = "dkossbucket"; + private String objectName = "page.html"; + //注意,天翼云里默认路径就是文件名,不需要在前面加根路径/ + private String filePath = "dev/temp/"; + private String fileDir = "dev"; + + + @Autowired + OssTianyiConfig ossTianyiConfig; + + @Autowired + public OssTianyiClientUtils(OssTianyiConfig ossTianyiConfig) { + this.ossTianyiConfig = ossTianyiConfig; + init(); + } + + private void init() { + this.minioClient = MinioClient.builder() + .endpoint(ossTianyiConfig.getEndPoint()) + .credentials(ossTianyiConfig.getAccessKey(), ossTianyiConfig.getSecretKey()) + .build(); + } + + /** + * 天翼云OSS初始化(采用S3 Compatible Storage) + */ +// public void tianyiOssInit() { +// minioClient = MinioClient.builder() +// .endpoint(ossTianyiConfig.getEndPoint()) +// .credentials(ossTianyiConfig.getAccessKey(), ossTianyiConfig.getSecretKey()) +// .build(); +// } + + /** + * 文件上传 (固定) + */ + public void uploadFileTest(String objectName, String filePath, String localFilePath) throws Exception { + File file = new File(localFilePath); + BufferedInputStream inputStream = FileUtil.getInputStream(file); + String contentType = Files.probeContentType(file.toPath()); + if (contentType == null) { + contentType = "application/octet-stream"; + } + PutObjectArgs args = PutObjectArgs.builder() + .bucket(ossTianyiConfig.getBucketName()) + .object(filePath + objectName) + .stream(inputStream, FileUtil.size(file), -1) + .contentType(contentType) + .build(); + minioClient.putObject(args); + } + + public void uploadFile(String fileUrl, MultipartFile file) { + try { + PutObjectArgs args = PutObjectArgs.builder() + .bucket(ossTianyiConfig.getBucketName()) + .object( fileUrl) //路径 /dev/temp/page.png + .stream(file.getInputStream(), file.getSize(), -1) + .contentType(file.getContentType()) + .build(); + minioClient.putObject(args); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + + /** + * 文件删除 + */ + public void deleteFile( String objectName) throws Exception { + minioClient.removeObject( + RemoveObjectArgs.builder() + .bucket(ossTianyiConfig.getBucketName()) + .object(objectName) + .build()); + } + + /** + * 文件下载 + */ + public InputStream downloadFile( String objectUrl) { + InputStream inputStream = null; + try { + inputStream = minioClient.getObject( + GetObjectArgs.builder() + .bucket(ossTianyiConfig.getBucketName()) + .object(objectUrl) + .build() + ); + } catch (Exception e) { + throw new RuntimeException(e); + } +// FileUtil.writeFromStream(inputStream, new File(downloadPath)); + return inputStream; + } + + /** + * 文件列表 + * @param prefix + */ + public void listFiles( String prefix) { + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder() + .bucket(ossTianyiConfig.getBucketName()) + .prefix(prefix) + .recursive(true) + .build() + ); + + try { + for (Result result : results) { + try { +// System.out.println("文件名:" + result.get().objectName()); // 获取对象名称(文件路径) + System.out.println(result.get().objectName()); // 获取对象名称(文件路径) + } catch (Exception e) { + e.printStackTrace(); + } + } + + } catch (Exception e) { + System.err.println("文件读取异常: " + e.getMessage()); + } + + } + + + + +// public void updateFile(String bucketName, String objectName, String filePath, String localFilePath) throws Exception { +// uploadFile(bucketName, objectName, filePath, localFilePath); +// } + + +// public static void main(String[] args) throws Exception { +// String localFilePath = "D:\\123pan\\page.html"; +// +// tianyiOssInit("", "", ""); +// uploadFile(bucketName, objectName, filePath, localFilePath);//正常 +//// deleteFile(bucketName, filePath + objectName);//正常 +//// listFiles(bucketName, fileDir + "/"); // 正常 +// +//// downloadFile(bucketName, filePath + objectName, "D:\\123pan\\downloaded_page.html"); //正常 +// +// } + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/WeekNoUtil.java b/dk-modules/system/src/main/java/org/dromara/system/utils/WeekNoUtil.java new file mode 100644 index 0000000..bb550b4 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/utils/WeekNoUtil.java @@ -0,0 +1,66 @@ +package org.dromara.system.utils; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * WeekNo生成工具,基于固定日期计算(1970年1月1日) + * 测试结果:2025-05-10号距离固定日期为2889周 + */ +public class WeekNoUtil { + + // 设置参考点(ISO周:2023年第1周开始的周一) +// private static final String REFERENCE_DATE_STR = "2023-01-02 00:00:00"; + private static final String REFERENCE_DATE_STR = "1970-01-01 00:00:00"; + + public static int getWeekNoByDate(Date date) { + DateTime inputDate = DateUtil.date(date); + DateTime referenceDate = DateUtil.parse(REFERENCE_DATE_STR, "yyyy-MM-dd HH:mm:ss"); + + // 获取参考日所在的周一 + DateTime refMonday = DateUtil.beginOfWeek(referenceDate); + DateTime inputMonday = DateUtil.beginOfWeek(inputDate); + + // 计算两个周一之间的周数差值 + long weeks = DateUtil.between(inputMonday, refMonday, DateUnit.WEEK); + + // 周差 + 1,得到 weekNo + return (int) weeks + 1; + } + + public static int getWeekNoByStr(String dateStr) { + DateTime inputDate = DateUtil.parse(dateStr, "yyyy-MM-dd HH:mm:ss"); + DateTime referenceDate = DateUtil.parse(REFERENCE_DATE_STR, "yyyy-MM-dd HH:mm:ss"); + + // 获取参考日所在的周一 + DateTime refMonday = DateUtil.beginOfWeek(referenceDate); + DateTime inputMonday = DateUtil.beginOfWeek(inputDate); + + // 计算两个周一之间的周数差值 + long weeks = DateUtil.between(inputMonday, refMonday, DateUnit.WEEK); + + // 周差 + 1,得到 weekNo + return (int) weeks + 1; + } + + public static String generateDateStr(Date currentDate) { + int year = DateUtil.year(currentDate); + int month = DateUtil.month(currentDate); + int weekofMonth = DateUtil.weekOfMonth(currentDate); + String name = year + "年" + month + "月" + weekofMonth + "周"; + return name; + } + + /* public static void main(String[] args) { + String now = DateUtil.now(); // 当前时间 + int weekNo = getWeekNoByStr(now); + System.out.println("当前周No:" + weekNo); + + int weekNoD = getWeekNoByDate(new Date()); + System.out.println("当前周No:" + weekNoD); + }*/ +} diff --git a/dk-modules/system/src/main/resources/mapper/system/SiteWeekMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SiteWeekMapper.xml new file mode 100644 index 0000000..ccf5a3b --- /dev/null +++ b/dk-modules/system/src/main/resources/mapper/system/SiteWeekMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/dk-modules/system/src/main/resources/mapper/system/SiteWeekOssMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SiteWeekOssMapper.xml new file mode 100644 index 0000000..253bf2c --- /dev/null +++ b/dk-modules/system/src/main/resources/mapper/system/SiteWeekOssMapper.xml @@ -0,0 +1,7 @@ + + + + + From 80d7e72bcbc06753be190d785bd93bf91b35933e Mon Sep 17 00:00:00 2001 From: wuyuan <15505152113@163.com> Date: Wed, 14 May 2025 14:09:21 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=9B=B4=E6=92=AD=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/param/TakeoffToPointParam.java | 2 +- .../service/impl/ControlServiceImpl.java | 4 +- .../service/impl/LiveStreamServiceImpl.java | 61 +++++++++++++------ .../manage/service/impl/SDKDeviceService.java | 20 ++++-- .../media/service/impl/MediaServiceImpl.java | 11 +++- .../sample/rocketmq/RocketMqConsum.java | 10 +-- .../controller/WaylineJobController.java | 7 +++ 7 files changed, 80 insertions(+), 35 deletions(-) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java b/dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java index bcf3fdb..ef233a2 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/control/model/param/TakeoffToPointParam.java @@ -39,7 +39,7 @@ public class TakeoffToPointParam { @Range(min = 2, max = 1500) @NotNull - private Double rthAltitude; + private Integer rthAltitude; @NotNull private RcLostActionEnum rcLostAction; diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java index c75887f..7480e39 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/control/service/impl/ControlServiceImpl.java @@ -196,9 +196,9 @@ public class ControlServiceImpl implements IControlService { waylineJobEntity.setBeginTime(new Date()); waylineJobEntity.setStatus(WaylineJobStatusEnum.PENDING.getVal()); waylineJobEntity.setOutOfControlAction(OutOfControlActionEnum.RETURN_TO_HOME.getAction()); - waylineJobEntity.setRthAltitude(Integer.parseInt(param.getRthAltitude().toString())); + waylineJobEntity.setRthAltitude(param.getRthAltitude()); waylineJobEntity.setMediaCount(0); - waylineJobEntity.setJobType(WaylineJobTypeEnum.PEOPLE_TASK.getType()); + waylineJobEntity.setJobType(WaylineJobTypeEnum.INSTRUCT.getType()); TopicServicesResponse response = abstractControlService.takeoffToPoint( SDKManager.getDeviceSDK(sn), mapper.convertValue(param, TakeoffToPointRequest.class)); ServicesReplyData reply = response.getData(); diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java index f9742e7..ada3a4f 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java @@ -1,23 +1,28 @@ package org.dromara.sample.manage.service.impl; +import org.dromara.common.rocketmq.producer.MessageProducerUtil; import org.dromara.common.sdk.cloudapi.device.DeviceDomainEnum; import org.dromara.common.sdk.cloudapi.device.VideoId; import org.dromara.common.sdk.cloudapi.livestream.*; import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService; +import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress; import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.SDKManager; import org.dromara.common.sdk.mqtt.services.ServicesReplyData; import org.dromara.common.sdk.mqtt.services.TopicServicesResponse; +import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.manage.model.dto.*; +import org.dromara.sample.manage.model.entity.DeviceEntity; import org.dromara.sample.manage.model.param.DeviceQueryParam; import org.dromara.sample.manage.service.*; +import org.dromara.sample.wayline.model.dto.WaylineJobDTO; +import org.dromara.sample.wayline.service.IWaylineJobService; +import org.dromara.sample.wayline.service.IWaylineRedisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; /** @@ -44,6 +49,16 @@ public class LiveStreamServiceImpl implements ILiveStreamService { @Autowired private AbstractLivestreamService abstractLivestreamService; + + @Autowired + private IPlayTextService playTextService; + + @Autowired + private IWaylineRedisService waylineRedisService; + + @Autowired + private IWaylineJobService waylineJobService; + @Override public List getLiveCapacity(String workspaceId) { @@ -68,26 +83,23 @@ public class LiveStreamServiceImpl implements ILiveStreamService { @Override public HttpResultResponse liveStart(LiveTypeDTO liveParam) { // Check if this lens is available live. - HttpResultResponse responseResult = this.checkBeforeLive(liveParam.getVideoId()); if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) { return responseResult; } - Boolean flag = deviceRedisService.checkDeviceVideo(liveParam.getVideoId().getDroneSn()); - - ILivestreamUrl url = LiveStreamProperty.get(liveParam.getUrlType()); url = setExt(liveParam.getUrlType(), url, liveParam.getVideoId()); - if (!flag) { - TopicServicesResponse> response = abstractLivestreamService.liveStartPush( - SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), - new LiveStartPushRequest() - .setUrl(url) - .setUrlType(liveParam.getUrlType()) - .setVideoId(liveParam.getVideoId()) - .setVideoQuality(liveParam.getVideoQuality())); - - if (!response.getData().getResult().isSuccess()) { + + TopicServicesResponse> response = abstractLivestreamService.liveStartPush( + SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), + new LiveStartPushRequest() + .setUrl(url) + .setUrlType(liveParam.getUrlType()) + .setVideoId(liveParam.getVideoId()) + .setVideoQuality(liveParam.getVideoQuality())); + + if (!response.getData().getResult().isSuccess()) { + if(response.getData().getResult().getCode() != 513003){ return HttpResultResponse.error(response.getData().getResult()); } } @@ -116,7 +128,22 @@ public class LiveStreamServiceImpl implements ILiveStreamService { default: return HttpResultResponse.error(LiveErrorCodeEnum.URL_TYPE_NOT_SUPPORTED); } + DeviceEntity deviceBySn = deviceService.getDeviceByChildSn(liveParam.getVideoId().getDroneSn()); + if(deviceBySn != null){ + + Optional> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceBySn.getDeviceSn()); + Map reqMap = new HashMap<>(); + if(runningWaylineJob.isPresent()) { + String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId(); + Optional waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId); + reqMap.put("jobId",waylineJobDTO.get().getJobId()); + reqMap.put("jobName",waylineJobDTO.get().getJobName()); + reqMap.put("deviceSn",deviceBySn.getDeviceSn()); + playTextService.streamType(reqMap); + } + } + // MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",liveParam.getVideoId().getDroneSn(),liveParam.getVideoId().toString()); return HttpResultResponse.success(live); } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java index a239930..ad9d679 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java @@ -181,15 +181,23 @@ public class SDKDeviceService extends AbstractDeviceService { @Override public void dockLiveStatusUpdate(TopicStateRequest request, MessageHeaders headers){ - Optional dockOnline = deviceRedisService.getDeviceOnline(request.getGateway()); + /*Optional dockOnline = deviceRedisService.getDeviceOnline(request.getGateway()); Optional deviceOnline = deviceRedisService.getDeviceOnline(dockOnline.get().getChildDeviceSn()); + Optional deviceOsd = deviceRedisService.getDeviceOsd(dockOnline.get().getDeviceSn(), OsdDock.class); + if(deviceOsd.get().getModeCode().getCode() != 4){ + return; + } + if(!RedisOpsUtils.checkExist("video"+deviceOnline.get().getDeviceSn())){ + return; + } + RedisOpsUtils.set("video"+deviceOnline.get().getDeviceSn(),60); if(deviceOnline.isEmpty()){ return; } if(request.getData().getLiveStatus().size() == 0 ){ String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice(); deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn()); - VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); + VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString()); } @@ -197,10 +205,10 @@ public class SDKDeviceService extends AbstractDeviceService { item.getVideoId().getDroneSn().equals(dockOnline.get().getChildDeviceSn()) && item.getStatus() == true).collect(Collectors.toList()); if(dockLiveStatusDataList.size() == 0){ String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice(); - VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); + VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); deviceRedisService.delDeviceVideo(deviceOnline.get().getDeviceSn()); MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString()); - } + }*/ } @Override @@ -221,11 +229,11 @@ public class SDKDeviceService extends AbstractDeviceService { } DeviceDTO device = deviceOpt.get(); - String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice(); + /*String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice(); if(!deviceRedisService.checkDeviceVideo(device.getDeviceSn())){ VideoId videoId = new VideoId(device.getDeviceSn()+SLASH+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL.getType() + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",device.getDeviceSn(),videoId.toString()); - } + }*/ deviceRedisService.setDeviceOnline(device); deviceRedisService.setDeviceOsd(from, request.getData()); deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData()); diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java index f6bcd97..226f137 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/media/service/impl/MediaServiceImpl.java @@ -3,6 +3,7 @@ package org.dromara.sample.media.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.dromara.common.core.constant.DeviceQrtzConstants; +import org.dromara.common.sdk.cloudapi.device.OsdDock; import org.dromara.common.sdk.cloudapi.media.*; import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService; import org.dromara.common.sdk.mqtt.MqttReply; @@ -113,9 +114,17 @@ public class MediaServiceImpl extends AbstractMediaService implements IMediaServ String jobId = callback.getFile().getExt().getFlightId(); Optional deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway()); + if(deviceRedisService.getDeviceOsd(request.getGateway(), OsdDock.class).get().getModeCode().getCode() == 4){ + DeviceDTO device = deviceOpt.get(); + boolean isSave = parseMediaFile(callback, device); + if (!isSave) { + log.error("将文件保存到数据库失败,请手动检查数据。"); + return null; + } + return new TopicEventsResponse().setData(MqttReply.success()); + } MediaFileCountDTO mediaFileCount = mediaRedisService.getMediaCount(request.getGateway(), jobId); List deviceQrtzFileEntities = deviceQrtzFileMapper.selectList(new LambdaQueryWrapper().eq(DeviceQrtzFileEntity::getDeviceSn, request.getGateway()).eq(DeviceQrtzFileEntity::getStatus, DeviceQrtzConstants.QRTZ_FILE_STATUS_2).eq(DeviceQrtzFileEntity::getWaylineId, mediaFileCount.getFileId())); - // duplicate data if (deviceOpt.isEmpty() || (Objects.nonNull(mediaFileCount) && request.getBid().equals(mediaFileCount.getBid()) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java b/dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java index 83d45d2..640578e 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java @@ -72,14 +72,8 @@ public class RocketMqConsum implements RocketMQListener { Optional waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId); reqMap.put("jobId",waylineJobDTO.get().getJobId()); reqMap.put("jobName",waylineJobDTO.get().getJobName()); + reqMap.put("deviceSn",videoId.getDroneSn()); + playTextService.streamType(reqMap); } - liveStreamService.liveStop(videoId); - HttpResultResponse httpResultResponse = liveStreamService.liveStart(liveTypeDTO); - if (httpResultResponse.getCode() == 0 || httpResultResponse.getCode() == 513012 || httpResultResponse.getCode() == 513003){ - reqMap.put("deviceSn:",videoId.getDroneSn()); - // playTextService.streamType(reqMap); - } - deviceRedisService.setDeviceVideo(videoId.getDroneSn(),videoId); - } } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java index 0182596..20c444c 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java @@ -15,6 +15,7 @@ import org.dromara.common.sdk.common.PaginationData; import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.media.model.MediaFileDTO; import org.dromara.sample.wayline.model.dto.WaylineJobDTO; +import org.dromara.sample.wayline.model.enums.WaylineTaskStatusEnum; import org.dromara.sample.wayline.model.param.CreateJobParam; import org.dromara.sample.wayline.model.param.UpdateJobParam; import org.dromara.sample.wayline.service.IFlightTaskService; @@ -120,6 +121,12 @@ public class WaylineJobController { return HttpResultResponse.success(); } + public static void main(String[] args) { + WaylineTaskStatusEnum pause = WaylineTaskStatusEnum.RESUME; + System.out.println(pause.getVal()); + + } + @GetMapping("/{workspace_id}/getJobFileUrlByDeviceSn") @Operation(summary = "根据设备查询飞行任务。", description = "根据设备查询飞行任务。") From a0cf0071ed93f6a7cdac67f8349cd930ad1b37e3 Mon Sep 17 00:00:00 2001 From: shizisheng Date: Wed, 14 May 2025 14:43:58 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=B7=A5=E5=9C=B0-ai=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=8E=B7=E5=8F=96=E6=9C=89=E6=95=88=E9=A1=B9?= =?UTF-8?q?(=E5=90=AF=E7=94=A8status)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/BusinessAlertStatisticsServiceImpl.java | 5 +++++ .../java/org/dromara/system/dubbo/RemotePostServiceImpl.java | 1 + 2 files changed, 6 insertions(+) diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java index 168cdfd..4068fd9 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertStatisticsServiceImpl.java @@ -1,7 +1,9 @@ package org.dromara.business.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; @@ -416,6 +418,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist //查询所有的职能岗位 List postVoList = remotePostService.listPost(); + postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则 if (ObjectUtil.isEmpty(postVoList)) { return ListUtil.empty(); @@ -444,6 +447,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist //查询所有的职能岗位 List postVoList = remotePostService.listPost(); + postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则 List result = new ArrayList<>(); @@ -498,6 +502,7 @@ public class BusinessAlertStatisticsServiceImpl implements IBusinessAlertStatist //查询所有的职能岗位 List postVoList = remotePostService.listPost(); + postVoList = postVoList.stream().filter(item -> StrUtil.equals("0",item.getStatus())).toList();//剔除禁用规则 List monthList = getLastSixMonths(); diff --git a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemotePostServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemotePostServiceImpl.java index ef659cb..410a68b 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemotePostServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemotePostServiceImpl.java @@ -40,6 +40,7 @@ public class RemotePostServiceImpl implements RemotePostService { remotePostVo.setPostId(aiLabel.getPostId()); remotePostVo.setPostName(aiLabel.getPostName()); remotePostVo.setPostCode(aiLabel.getPostCode()); + remotePostVo.setStatus(aiLabel.getStatus()); return remotePostVo; }) .collect(Collectors.toList()); From a74ac3ceec9fb89fd5ce5a4fa533cf8fe11d38e2 Mon Sep 17 00:00:00 2001 From: shizisheng Date: Thu, 15 May 2025 10:13:08 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=A4=A7=E7=96=86=E5=BC=80=E5=8F=91-api+?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=A0=81=E5=AF=B9=E6=AF=94=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dk-common/common-excel/pom.xml | 15 ++ .../system/controller/DjiApiController.java | 113 +++++++++++ .../controller/DjiApiErrorController.java | 131 +++++++++++++ .../org/dromara/system/domain/DjiApi.java | 63 +++++++ .../dromara/system/domain/DjiApiError.java | 76 ++++++++ .../dromara/system/domain/bo/DjiApiBo.java | 68 +++++++ .../system/domain/bo/DjiApiErrorBo.java | 84 +++++++++ .../system/domain/vo/DjiApiErrorVo.java | 93 +++++++++ .../dromara/system/domain/vo/DjiApiVo.java | 77 ++++++++ .../listener/DjiApiErrorImportListener.java | 177 ++++++++++++++++++ .../system/mapper/DjiApiErrorMapper.java | 15 ++ .../dromara/system/mapper/DjiApiMapper.java | 15 ++ .../system/service/IDjiApiErrorService.java | 72 +++++++ .../system/service/IDjiApiService.java | 69 +++++++ .../service/impl/DjiApiErrorServiceImpl.java | 146 +++++++++++++++ .../service/impl/DjiApiServiceImpl.java | 133 +++++++++++++ .../mapper/djidev/DjiApiErrorMapper.xml | 7 + .../resources/mapper/djidev/DjiApiMapper.xml | 7 + pom.xml | 2 +- 19 files changed, 1362 insertions(+), 1 deletion(-) create mode 100644 dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiBo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiErrorBo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiErrorVo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiVo.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/listener/DjiApiErrorImportListener.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiErrorMapper.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiMapper.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiErrorService.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiService.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiErrorServiceImpl.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiServiceImpl.java create mode 100644 dk-modules/system/src/main/resources/mapper/djidev/DjiApiErrorMapper.xml create mode 100644 dk-modules/system/src/main/resources/mapper/djidev/DjiApiMapper.xml diff --git a/dk-common/common-excel/pom.xml b/dk-common/common-excel/pom.xml index 23747b2..efebe1d 100644 --- a/dk-common/common-excel/pom.xml +++ b/dk-common/common-excel/pom.xml @@ -25,6 +25,21 @@ com.alibaba easyexcel + + + + + + + + + + + + + + + diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java new file mode 100644 index 0000000..de246bb --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiController.java @@ -0,0 +1,113 @@ +package org.dromara.system.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.DjiApiVo; +import org.dromara.system.domain.bo.DjiApiBo; +import org.dromara.system.service.IDjiApiService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 大疆开发 + * 前端访问路由地址为:/djidev/djiApi + * + * @author szs + * @date 2025-05-14 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/djiApi") +public class DjiApiController extends BaseController { + + private final IDjiApiService djiApiService; + + /** + * 查询大疆开发列表 + */ + @SaCheckPermission("djidev:djiApi:list") + @GetMapping("/list") + public TableDataInfo list(DjiApiBo bo, PageQuery pageQuery) { + return djiApiService.queryPageList(bo, pageQuery); + } + + /** + * 导出大疆开发列表 + */ + @SaCheckPermission("djidev:djiApi:export") + @Log(title = "大疆开发", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DjiApiBo bo, HttpServletResponse response) { + List list = djiApiService.queryList(bo); + ExcelUtil.exportExcel(list, "大疆开发", DjiApiVo.class, response); + } + + /** + * 获取大疆开发详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("djidev:djiApi:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(djiApiService.queryById(id)); + } + + /** + * 新增大疆开发 + */ + @SaCheckPermission("djidev:djiApi:add") + @Log(title = "大疆开发", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DjiApiBo bo) { + //跟新版本次数 + if(null == bo.getVersionCount()){ + DjiApiBo bo1 = new DjiApiBo(); + bo1.setDjiApiType(bo.getDjiApiType()); + List djiApiVos = djiApiService.queryList(bo1); + bo.setVersionCount(djiApiVos.size() +1); + } + return toAjax(djiApiService.insertByBo(bo)); + } + + /** + * 修改大疆开发 + */ + @SaCheckPermission("djidev:djiApi:edit") + @Log(title = "大疆开发", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DjiApiBo bo) { + return toAjax(djiApiService.updateByBo(bo)); + } + + /** + * 删除大疆开发 + * + * @param ids 主键串 + */ + @SaCheckPermission("djidev:djiApi:remove") + @Log(title = "大疆开发", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(djiApiService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java new file mode 100644 index 0000000..a32885e --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/DjiApiErrorController.java @@ -0,0 +1,131 @@ +package org.dromara.system.controller; + +import java.util.ArrayList; +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.listener.DjiApiErrorImportListener; +import org.dromara.system.listener.SysUserImportListener; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.DjiApiErrorVo; +import org.dromara.system.domain.bo.DjiApiErrorBo; +import org.dromara.system.service.IDjiApiErrorService; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 大疆开发-错误码 + * 前端访问路由地址为:/djidev/djiApiError + * + * @author szs + * @date 2025-05-14 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/djiApiError") +public class DjiApiErrorController extends BaseController { + + private final IDjiApiErrorService djiApiErrorService; + + /** + * 查询大疆开发-错误码列表 + */ + @SaCheckPermission("djidev:djiApiError:list") + @GetMapping("/list") + public TableDataInfo list(DjiApiErrorBo bo, PageQuery pageQuery) { + return djiApiErrorService.queryPageList(bo, pageQuery); + } + + /** + * 导出大疆开发-错误码列表 + */ + @SaCheckPermission("djidev:djiApiError:export") + @Log(title = "大疆开发-错误码", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(DjiApiErrorBo bo, HttpServletResponse response) { + List list = djiApiErrorService.queryList(bo); + ExcelUtil.exportExcel(list, "大疆开发-错误码", DjiApiErrorVo.class, response); + } + + + @Log(title = "大疆开发-错误码管理", businessType = BusinessType.IMPORT) + @SaCheckPermission("djidev:djiApiError:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), DjiApiErrorVo.class, new DjiApiErrorImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "大疆开发-错误码数据", DjiApiErrorVo.class, response); + } + + + /** + * 获取大疆开发-错误码详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("djidev:djiApiError:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(djiApiErrorService.queryById(id)); + } + + /** + * 新增大疆开发-错误码 + */ + @SaCheckPermission("djidev:djiApiError:add") + @Log(title = "大疆开发-错误码", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody DjiApiErrorBo bo) { + return toAjax(djiApiErrorService.insertByBo(bo)); + } + + /** + * 修改大疆开发-错误码 + */ + @SaCheckPermission("djidev:djiApiError:edit") + @Log(title = "大疆开发-错误码", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody DjiApiErrorBo bo) { + return toAjax(djiApiErrorService.updateByBo(bo)); + } + + /** + * 删除大疆开发-错误码 + * + * @param ids 主键串 + */ + @SaCheckPermission("djidev:djiApiError:remove") + @Log(title = "大疆开发-错误码", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(djiApiErrorService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java b/dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java new file mode 100644 index 0000000..5e22b56 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/DjiApi.java @@ -0,0 +1,63 @@ +package org.dromara.system.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 大疆开发对象 dji_api + * + * @author szs + * @date 2025-05-14 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("dji_api") +public class DjiApi extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 大疆api类型 + */ + private String djiApiType; + + /** + * 版本名称 + */ + private String name; + + /** + * 版本号 + */ + private String nameVersionNo; + + /** + * 版本次数 + */ + private Integer versionCount; + + /** + * 发步日期 + */ + private Date timeRelease; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java b/dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java new file mode 100644 index 0000000..52e9309 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/DjiApiError.java @@ -0,0 +1,76 @@ +package org.dromara.system.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 大疆开发-错误码对象 dji_api_error + * + * @author szs + * @date 2025-05-14 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("dji_api_error") +public class DjiApiError extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id") + private Long id; + + /** + * 大疆APIId + */ + private Long djiApiId; + + /** + * 大疆API版本 + */ + private String djiApiName; + + /** + * 错误码 + */ + private String name; + + /** + * 中文描述 + */ + private String nameCn; + + /** + * 英文描述 + */ + private String nameEn; + + /** + * 是否变更 + */ + private String isChangeFlag; + + /** + * 历史变更次数 + */ + private Integer changeHistroyCount; + + /** + * 历史变更Ids(,分隔) + */ + private String changeHistoryIds; + + /** + * 大疆开发-错误码 + */ + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiBo.java new file mode 100644 index 0000000..f43f624 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiBo.java @@ -0,0 +1,68 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.DjiApi; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 大疆开发业务对象 dji_api + * + * @author szs + * @date 2025-05-14 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = DjiApi.class, reverseConvertGenerate = false) +public class DjiApiBo extends BaseEntity { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 大疆api类型 + */ + @NotBlank(message = "大疆api类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String djiApiType; + + /** + * 版本名称 + */ + @NotBlank(message = "版本名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 版本号 + */ + @NotBlank(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameVersionNo; + + /** + * 版本次数 + */ +// @NotNull(message = "版本次数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer versionCount; + + /** + * 发步日期 + */ + @NotNull(message = "发步日期不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date timeRelease; + + /** + * 备注 + */ +// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiErrorBo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiErrorBo.java new file mode 100644 index 0000000..6ed64e3 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/bo/DjiApiErrorBo.java @@ -0,0 +1,84 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.DjiApiError; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 大疆开发-错误码业务对象 dji_api_error + * + * @author szs + * @date 2025-05-14 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = DjiApiError.class, reverseConvertGenerate = false) +public class DjiApiErrorBo extends BaseEntity { + + /** + * ID + */ + @NotNull(message = "ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 大疆APIId + */ + @NotNull(message = "大疆APIId不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long djiApiId; + + /** + * 大疆API版本 + */ +// @NotBlank(message = "大疆API版本不能为空", groups = { AddGroup.class, EditGroup.class }) + private String djiApiName; + + /** + * 错误码 + */ + @NotBlank(message = "错误码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 中文描述 + */ + @NotBlank(message = "中文描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameCn; + + /** + * 英文描述 + */ +// @NotBlank(message = "英文描述不能为空", groups = { AddGroup.class, EditGroup.class }) + private String nameEn; + + /** + * 是否变更 + */ +// @NotBlank(message = "是否变更不能为空", groups = { AddGroup.class, EditGroup.class }) + private String isChangeFlag; + + /** + * 历史变更次数 + */ +// @NotNull(message = "历史变更次数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer changeHistroyCount; + + /** + * 历史变更Ids(,分隔) + */ +// @NotBlank(message = "历史变更Ids(,分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) + private String changeHistoryIds; + + /** + * 大疆开发-错误码 + */ +// @NotBlank(message = "大疆开发-错误码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiErrorVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiErrorVo.java new file mode 100644 index 0000000..f0c34d2 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiErrorVo.java @@ -0,0 +1,93 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.DjiApiError; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 大疆开发-错误码视图对象 dji_api_error + * + * @author szs + * @date 2025-05-14 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DjiApiError.class) +public class DjiApiErrorVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 大疆APIId + */ + @ExcelProperty(value = "大疆APIId") + private Long djiApiId; + + /** + * 大疆API版本 + */ + @ExcelProperty(value = "大疆API版本") + private String djiApiName; + + /** + * 错误码 + */ + @ExcelProperty(value = "错误码") + private String name; + + /** + * 中文描述 + */ + @ExcelProperty(value = "中文描述") + private String nameCn; + + /** + * 英文描述 + */ + @ExcelProperty(value = "英文描述") + private String nameEn; + + /** + * 是否变更 + */ + @ExcelProperty(value = "是否变更", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String isChangeFlag; + + /** + * 历史变更次数 + */ + @ExcelProperty(value = "历史变更次数") + private Integer changeHistroyCount; + + /** + * 历史变更Ids(,分隔) + */ + @ExcelProperty(value = "历史变更Ids(,分隔)") + private String changeHistoryIds; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiVo.java b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiVo.java new file mode 100644 index 0000000..aff408d --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/vo/DjiApiVo.java @@ -0,0 +1,77 @@ +package org.dromara.system.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.system.domain.DjiApi; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 大疆开发视图对象 dji_api + * + * @author szs + * @date 2025-05-14 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = DjiApi.class) +public class DjiApiVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ExcelProperty(value = "ID") + private Long id; + + /** + * 大疆api类型 + */ + @ExcelProperty(value = "大疆api类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "dji_api_type") + private String djiApiType; + + /** + * 版本名称 + */ + @ExcelProperty(value = "版本名称") + private String name; + + /** + * 版本号 + */ + @ExcelProperty(value = "版本号") + private String nameVersionNo; + + /** + * 版本次数 + */ + @ExcelProperty(value = "版本次数") + private Integer versionCount; + + /** + * 发步日期 + */ + @ExcelProperty(value = "发步日期") + private Date timeRelease; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/listener/DjiApiErrorImportListener.java b/dk-modules/system/src/main/java/org/dromara/system/listener/DjiApiErrorImportListener.java new file mode 100644 index 0000000..7942b4e --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/listener/DjiApiErrorImportListener.java @@ -0,0 +1,177 @@ +package org.dromara.system.listener; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HtmlUtil; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.excel.core.ExcelListener; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.domain.bo.DjiApiBo; +import org.dromara.system.domain.bo.DjiApiErrorBo; +import org.dromara.system.domain.vo.DjiApiErrorVo; +import org.dromara.system.domain.vo.DjiApiVo; +import org.dromara.system.service.IDjiApiErrorService; +import org.dromara.system.service.IDjiApiService; + +import java.util.List; + +/** + * 系统用户自定义导入 + * + * @author Lion Li + */ +@Slf4j +public class DjiApiErrorImportListener extends AnalysisEventListener implements ExcelListener { + + + private final IDjiApiErrorService djiApiErrorService; + private final IDjiApiService djiApiService; + + + private final Boolean isUpdateSupport; + + private final Long operUserId; + + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public DjiApiErrorImportListener(Boolean isUpdateSupport) { + this.djiApiErrorService = SpringUtils.getBean(IDjiApiErrorService.class); + this.djiApiService = SpringUtils.getBean(IDjiApiService.class); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + } + + @Override + public void invoke(DjiApiErrorVo apiErrVo, AnalysisContext context) { + if(StrUtil.isEmpty(apiErrVo.getDjiApiName())){ + failureNum++; + failureMsg.append("
").append(failureNum).append("大疆开发API 不存在,请检查大疆API"); + return; + } + //检查大疆API编号是否存在 + DjiApiBo djiApiBo = new DjiApiBo(); + djiApiBo.setName(apiErrVo.getDjiApiName()); + List djiApiVoList = djiApiService.queryList(djiApiBo); + if(djiApiVoList.size()<=0){ + failureNum++; + failureMsg.append("
").append(failureNum).append("大疆开发API ").append(apiErrVo.getDjiApiName()).append(" 不存在,请检查大疆API"); + }else{ + DjiApiVo djiApiVo = djiApiVoList.get(0); + //上次的版本 + DjiApiVo djiApiVoOld = null; + if(djiApiVo.getVersionCount() >= 2){ + int versionCountOld = djiApiVo.getVersionCount() - 1; + DjiApiBo djiApiBoOld = new DjiApiBo(); + djiApiBoOld.setDjiApiType(djiApiVo.getDjiApiType()); + djiApiBoOld.setVersionCount(versionCountOld); + List djiApiVoOldList = djiApiService.queryList(djiApiBoOld); + if(djiApiVoOldList.size() > 0){ + djiApiVoOld = djiApiVoOldList.get(0); + } + } + + + DjiApiErrorBo apiErrorBo = new DjiApiErrorBo(); + apiErrorBo.setDjiApiId(djiApiVo.getId()); + apiErrorBo.setName(apiErrVo.getName()); + DjiApiErrorVo djiApiErrorVo = this.djiApiErrorService.selectOneApiErrorByInfo(apiErrorBo); + + try { + // 验证是否存在这个用户 + if (ObjectUtil.isNull(djiApiErrorVo)) { + DjiApiErrorBo apiErrBo = BeanUtil.toBean(apiErrVo, DjiApiErrorBo.class); + apiErrBo.setDjiApiId(djiApiVo.getId()); + apiErrBo.setDjiApiName(djiApiVo.getName()); + ValidatorUtils.validate(apiErrBo); + apiErrBo.setCreateBy(operUserId); + + //找历史记录,查看上一个版本是否不同 + if(null != djiApiVoOld){ + DjiApiErrorBo lastErrBo = new DjiApiErrorBo(); + lastErrBo.setDjiApiId(djiApiVoOld.getId()); + lastErrBo.setName(apiErrVo.getName()); + DjiApiErrorVo lastErrVo = djiApiErrorService.selectOneApiErrorByInfo(lastErrBo); + if(StrUtil.equals(lastErrVo.getNameCn(),apiErrVo.getNameCn())){ + apiErrBo.setIsChangeFlag("N"); + }else { + apiErrBo.setIsChangeFlag("Y"); + } + } + + djiApiErrorService.insertByBo(apiErrBo); + successNum++; + successMsg.append("
").append(successNum).append("、错误码 ").append(apiErrBo.getName()).append(" 导入成功"); + } else if (isUpdateSupport) { + Long apiErrVoId = djiApiErrorVo.getId(); + DjiApiErrorBo apiErrBo = BeanUtil.toBean(apiErrVo, DjiApiErrorBo.class); + apiErrBo.setId(apiErrVoId); + ValidatorUtils.validate(apiErrBo); + apiErrBo.setUpdateBy(operUserId); + djiApiErrorService.updateByBo(apiErrBo); + successNum++; + successMsg.append("
").append(successNum).append("、错误码 ").append(apiErrBo.getName()).append(" 更新成功"); + } else { + failureNum++; + failureMsg.append("
").append(failureNum).append("、错误码 ").append(djiApiErrorVo.getName()).append(" 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、错误码 " + HtmlUtil.cleanHtmlTag(apiErrVo.getName()) + " 导入失败:"; + String message = e.getMessage(); + if (e instanceof ConstraintViolationException cvException) { + message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", "); + } + failureMsg.append(msg).append(message); + log.error(msg, e); + } + + + + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult getExcelResult() { + return new ExcelResult() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiErrorMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiErrorMapper.java new file mode 100644 index 0000000..b302324 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiErrorMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.DjiApiError; +import org.dromara.system.domain.vo.DjiApiErrorVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 大疆开发-错误码Mapper接口 + * + * @author szs + * @date 2025-05-14 + */ +public interface DjiApiErrorMapper extends BaseMapperPlus { + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiMapper.java new file mode 100644 index 0000000..c9d458d --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/DjiApiMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.DjiApi; +import org.dromara.system.domain.vo.DjiApiVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 大疆开发Mapper接口 + * + * @author szs + * @date 2025-05-14 + */ +public interface DjiApiMapper extends BaseMapperPlus { + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiErrorService.java b/dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiErrorService.java new file mode 100644 index 0000000..24fb14e --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiErrorService.java @@ -0,0 +1,72 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.DjiApiError; +import org.dromara.system.domain.vo.DjiApiErrorVo; +import org.dromara.system.domain.bo.DjiApiErrorBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 大疆开发-错误码Service接口 + * + * @author szs + * @date 2025-05-14 + */ +public interface IDjiApiErrorService { + + /** + * 查询大疆开发-错误码 + * + * @param id 主键 + * @return 大疆开发-错误码 + */ + DjiApiErrorVo queryById(Long id); + + /** + * 分页查询大疆开发-错误码列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 大疆开发-错误码分页列表 + */ + TableDataInfo queryPageList(DjiApiErrorBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的大疆开发-错误码列表 + * + * @param bo 查询条件 + * @return 大疆开发-错误码列表 + */ + List queryList(DjiApiErrorBo bo); + + /** + * 新增大疆开发-错误码 + * + * @param bo 大疆开发-错误码 + * @return 是否新增成功 + */ + Boolean insertByBo(DjiApiErrorBo bo); + + /** + * 修改大疆开发-错误码 + * + * @param bo 大疆开发-错误码 + * @return 是否修改成功 + */ + Boolean updateByBo(DjiApiErrorBo bo); + + /** + * 校验并批量删除大疆开发-错误码信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + DjiApiErrorVo selectOneApiErrorByInfo(DjiApiErrorBo apiErrorBo); + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiService.java b/dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiService.java new file mode 100644 index 0000000..fa273e4 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/IDjiApiService.java @@ -0,0 +1,69 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.DjiApi; +import org.dromara.system.domain.vo.DjiApiVo; +import org.dromara.system.domain.bo.DjiApiBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 大疆开发Service接口 + * + * @author szs + * @date 2025-05-14 + */ +public interface IDjiApiService { + + /** + * 查询大疆开发 + * + * @param id 主键 + * @return 大疆开发 + */ + DjiApiVo queryById(Long id); + + /** + * 分页查询大疆开发列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 大疆开发分页列表 + */ + TableDataInfo queryPageList(DjiApiBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的大疆开发列表 + * + * @param bo 查询条件 + * @return 大疆开发列表 + */ + List queryList(DjiApiBo bo); + + /** + * 新增大疆开发 + * + * @param bo 大疆开发 + * @return 是否新增成功 + */ + Boolean insertByBo(DjiApiBo bo); + + /** + * 修改大疆开发 + * + * @param bo 大疆开发 + * @return 是否修改成功 + */ + Boolean updateByBo(DjiApiBo bo); + + /** + * 校验并批量删除大疆开发信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiErrorServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiErrorServiceImpl.java new file mode 100644 index 0000000..cb7f910 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiErrorServiceImpl.java @@ -0,0 +1,146 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.system.domain.SysUser; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.DjiApiErrorBo; +import org.dromara.system.domain.vo.DjiApiErrorVo; +import org.dromara.system.domain.DjiApiError; +import org.dromara.system.mapper.DjiApiErrorMapper; +import org.dromara.system.service.IDjiApiErrorService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 大疆开发-错误码Service业务层处理 + * + * @author szs + * @date 2025-05-14 + */ +@RequiredArgsConstructor +@Service +public class DjiApiErrorServiceImpl implements IDjiApiErrorService { + + private final DjiApiErrorMapper baseMapper; + + /** + * 查询大疆开发-错误码 + * + * @param id 主键 + * @return 大疆开发-错误码 + */ + @Override + public DjiApiErrorVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询大疆开发-错误码列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 大疆开发-错误码分页列表 + */ + @Override + public TableDataInfo queryPageList(DjiApiErrorBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的大疆开发-错误码列表 + * + * @param bo 查询条件 + * @return 大疆开发-错误码列表 + */ + @Override + public List queryList(DjiApiErrorBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(DjiApiErrorBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDjiApiId() != null, DjiApiError::getDjiApiId, bo.getDjiApiId()); + lqw.like(StringUtils.isNotBlank(bo.getDjiApiName()), DjiApiError::getDjiApiName, bo.getDjiApiName()); + lqw.like(StringUtils.isNotBlank(bo.getName()), DjiApiError::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNameCn()), DjiApiError::getNameCn, bo.getNameCn()); + lqw.eq(StringUtils.isNotBlank(bo.getNameEn()), DjiApiError::getNameEn, bo.getNameEn()); + lqw.eq(StringUtils.isNotBlank(bo.getIsChangeFlag()), DjiApiError::getIsChangeFlag, bo.getIsChangeFlag()); + lqw.eq(bo.getChangeHistroyCount() != null, DjiApiError::getChangeHistroyCount, bo.getChangeHistroyCount()); + lqw.eq(StringUtils.isNotBlank(bo.getChangeHistoryIds()), DjiApiError::getChangeHistoryIds, bo.getChangeHistoryIds()); + return lqw; + } + + /** + * 新增大疆开发-错误码 + * + * @param bo 大疆开发-错误码 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DjiApiErrorBo bo) { + DjiApiError add = MapstructUtils.convert(bo, DjiApiError.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改大疆开发-错误码 + * + * @param bo 大疆开发-错误码 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DjiApiErrorBo bo) { + DjiApiError update = MapstructUtils.convert(bo, DjiApiError.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DjiApiError entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除大疆开发-错误码信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + @Override + public DjiApiErrorVo selectOneApiErrorByInfo(DjiApiErrorBo apiErrorBo) { + return baseMapper.selectVoOne(new LambdaQueryWrapper() + .eq(DjiApiError::getDjiApiId, apiErrorBo.getDjiApiId()) + .eq(DjiApiError::getName,apiErrorBo.getName())); + } + + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiServiceImpl.java new file mode 100644 index 0000000..c31e273 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/DjiApiServiceImpl.java @@ -0,0 +1,133 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.DjiApiBo; +import org.dromara.system.domain.vo.DjiApiVo; +import org.dromara.system.domain.DjiApi; +import org.dromara.system.mapper.DjiApiMapper; +import org.dromara.system.service.IDjiApiService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 大疆开发Service业务层处理 + * + * @author szs + * @date 2025-05-14 + */ +@RequiredArgsConstructor +@Service +public class DjiApiServiceImpl implements IDjiApiService { + + private final DjiApiMapper baseMapper; + + /** + * 查询大疆开发 + * + * @param id 主键 + * @return 大疆开发 + */ + @Override + public DjiApiVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询大疆开发列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 大疆开发分页列表 + */ + @Override + public TableDataInfo queryPageList(DjiApiBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的大疆开发列表 + * + * @param bo 查询条件 + * @return 大疆开发列表 + */ + @Override + public List queryList(DjiApiBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(DjiApiBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getDjiApiType()), DjiApi::getDjiApiType, bo.getDjiApiType()); + lqw.like(StringUtils.isNotBlank(bo.getName()), DjiApi::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getNameVersionNo()), DjiApi::getNameVersionNo, bo.getNameVersionNo()); + lqw.eq(bo.getVersionCount() != null, DjiApi::getVersionCount, bo.getVersionCount()); + lqw.eq(bo.getTimeRelease() != null, DjiApi::getTimeRelease, bo.getTimeRelease()); + return lqw; + } + + /** + * 新增大疆开发 + * + * @param bo 大疆开发 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(DjiApiBo bo) { + DjiApi add = MapstructUtils.convert(bo, DjiApi.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改大疆开发 + * + * @param bo 大疆开发 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(DjiApiBo bo) { + DjiApi update = MapstructUtils.convert(bo, DjiApi.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(DjiApi entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除大疆开发信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/dk-modules/system/src/main/resources/mapper/djidev/DjiApiErrorMapper.xml b/dk-modules/system/src/main/resources/mapper/djidev/DjiApiErrorMapper.xml new file mode 100644 index 0000000..8ace2c7 --- /dev/null +++ b/dk-modules/system/src/main/resources/mapper/djidev/DjiApiErrorMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/dk-modules/system/src/main/resources/mapper/djidev/DjiApiMapper.xml b/dk-modules/system/src/main/resources/mapper/djidev/DjiApiMapper.xml new file mode 100644 index 0000000..d37007e --- /dev/null +++ b/dk-modules/system/src/main/resources/mapper/djidev/DjiApiMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/pom.xml b/pom.xml index 511c150..ff3f610 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.2.22 2.6.0 0.15.0 - 4.0.3 + 3.3.2 5.8.31 3.37.0 2.2.7 From 74dfbf1bf7651968fefaed9b17cb95d06faf4429 Mon Sep 17 00:00:00 2001 From: like <1025687351@qq.com> Date: Thu, 15 May 2025 10:50:37 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=8E=A8=E6=B5=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneController.java | 83 ++++++++++++++++--- .../manage/mapper/IDeviceStreamMapper.java | 15 ++++ .../model/entity/DeviceStreamEntity.java | 43 ++++++++++ .../manage/service/IDeviceStreamService.java | 17 ++++ .../service/impl/DeviceStreamServiceImpl.java | 44 ++++++++++ 5 files changed, 190 insertions(+), 12 deletions(-) create mode 100644 dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java create mode 100644 dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java create mode 100644 dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java create mode 100644 dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java index 9e403c9..0585aa0 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java @@ -1,6 +1,9 @@ package org.dromara.sample.manage.controller; import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.seata.common.util.StringUtils; @@ -9,6 +12,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.implementation.bytecode.Throw; +import org.apache.commons.collections.CollectionUtils; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; @@ -28,11 +32,16 @@ import org.dromara.common.sdk.mqtt.property.PropertySetPublish; import org.dromara.common.sdk.mqtt.services.ServicesPublish; import org.dromara.common.sdk.mqtt.services.ServicesReplyReceiver; import org.dromara.common.sdk.mqtt.services.TopicServicesRequest; +import org.dromara.common.translation.annotation.Translation; import org.dromara.sample.common.util.Md5Utils; +import org.dromara.sample.manage.mapper.IDeviceStreamMapper; import org.dromara.sample.manage.model.dto.*; +import org.dromara.sample.manage.model.entity.DeviceStreamEntity; +import org.dromara.sample.manage.service.IDeviceStreamService; import org.dromara.sample.media.mapper.IFileMapper; import org.dromara.system.api.RemoteConfigService; import org.json.JSONObject; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.net.URI; @@ -69,6 +78,9 @@ public class MegaphoneController { @DubboReference private RemoteConfigService remoteConfigService; + @Resource + IDeviceStreamMapper deviceStreamMapper; + /** * 喊话器-开始播放文档(对应遥控器的录音广播模式) * Get the topology list of all online devices in one workspace. @@ -247,6 +259,7 @@ public class MegaphoneController { */ @PostMapping("/{workspace_id}/getStreamIp") @Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。") + @Transactional public HttpResultResponse getStreamIp(@PathVariable("workspace_id") String workspaceId, @RequestBody MapobjectMap ) { @@ -254,18 +267,55 @@ public class MegaphoneController { //发送mqtt String s = remoteConfigService.selectStreamIp(); DisobeyDTO param = Convert.convert(DisobeyDTO.class, objectMap); - if (StringUtils.isNotEmpty(param.getModel())){ - String[] split = param.getModel().split(","); - for (String type : split){ - List list = new ArrayList<>(); - list.add(type); - DisobeyDTO disobeyDTO = new DisobeyDTO(); - disobeyDTO.setUrl(s); - disobeyDTO.setOpen(param.getOpen()); - disobeyDTO.setType(list); - disobeyDTO.setRtmpUrl(param.getRtmpUrl()); - gatewayPublish.publish(top,new CommonTopicRequest<>() - .setData(Objects.requireNonNull(disobeyDTO)),1); + + if (param.getOpen() == 1){ + if (StringUtils.isNotEmpty(param.getModel())){ + String[] split = param.getModel().split(","); + for (String type : split){ + List deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl()) + .eq("stream_type", type)); + if (CollectionUtils.isEmpty(deviceStreamEntities)){ + DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity(); + deviceStreamEntity.setStreamType(type); + deviceStreamEntity.setCreateTime(new Date()); + deviceStreamEntity.setUpdateTime(new Date()); + deviceStreamEntity.setRtmpUrl(param.getRtmpUrl()); + deviceStreamMapper.insert(deviceStreamEntity); + List list = new ArrayList<>(); + list.add(type); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl(s); + disobeyDTO.setOpen(param.getOpen()); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(param.getRtmpUrl()); + gatewayPublish.publish(top,new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); + } + } + } + } + if (param.getOpen() == 2){ + if (StringUtils.isNotEmpty(param.getModel())){ + String[] split = param.getModel().split(","); + for (String type : split){ + List deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl()) + .eq("stream_type", type)); + if (CollectionUtils.isNotEmpty(deviceStreamEntities)){ + deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl()) + .eq("stream_type", type)); + List list = new ArrayList<>(); + list.add(type); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl(s); + disobeyDTO.setOpen(param.getOpen()); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(param.getRtmpUrl()); + gatewayPublish.publish(top,new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); + } + } + }else { + deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); } } return HttpResultResponse.success(); @@ -296,6 +346,15 @@ public class MegaphoneController { return HttpResultResponse.success(megaphoneDTO); } + @GetMapping("/getStreamType") + @Operation(summary = "获取开启的算法类型。", description = "获取开启的算法类型。") + public HttpResultResponse> getStreamType(@RequestParam String rtmpUrl + ) { + List deviceStreamEntities = deviceStreamMapper.selectList(new LambdaQueryWrapper().eq(DeviceStreamEntity::getRtmpUrl, rtmpUrl)); + return HttpResultResponse.success(deviceStreamEntities); + } + + /** * 获取媒体流ip diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java new file mode 100644 index 0000000..db16f80 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/mapper/IDeviceStreamMapper.java @@ -0,0 +1,15 @@ +package org.dromara.sample.manage.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.dromara.sample.manage.model.entity.DeviceStreamEntity; +import org.dromara.sample.manage.model.entity.PlayTextEntity; + +/** + * + * @author sean.zhou + * @date 2021/11/10 + * @version 0.1 + */ +public interface IDeviceStreamMapper extends BaseMapper { + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java new file mode 100644 index 0000000..5c63b87 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceStreamEntity.java @@ -0,0 +1,43 @@ +package org.dromara.sample.manage.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * The entity class of the device + * + * @author sean.zhou + * @version 0.1 + * @date 2021/11/10 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TableName(value = "manage_device_stream") +public class DeviceStreamEntity implements Serializable { + + @TableId(type = IdType.AUTO) + private Integer id; + + @TableField(value = "rtmp_url") + private String rtmpUrl; + + @TableField(value = "stream_type") + private String streamType; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java new file mode 100644 index 0000000..bdfd655 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceStreamService.java @@ -0,0 +1,17 @@ +package org.dromara.sample.manage.service; + +import org.dromara.common.sdk.common.HttpResultResponse; +import org.dromara.common.sdk.common.PaginationData; +import org.dromara.sample.manage.model.entity.PlayTextEntity; + +import java.util.Map; + +/** + * @author sean.zhou + * @date 2021/11/10 + * @version 0.1 + */ +public interface IDeviceStreamService { + + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java new file mode 100644 index 0000000..2446a0f --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceStreamServiceImpl.java @@ -0,0 +1,44 @@ +package org.dromara.sample.manage.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.sdk.common.HttpResultResponse; +import org.dromara.common.sdk.common.Pagination; +import org.dromara.common.sdk.common.PaginationData; +import org.dromara.common.sdk.mqtt.CommonTopicRequest; +import org.dromara.common.sdk.mqtt.MqttGatewayPublish; +import org.dromara.sample.feign.RemoteSystemFeign; +import org.dromara.sample.manage.mapper.IPlayTextMapper; +import org.dromara.sample.manage.model.dto.StreamTypeDTO; +import org.dromara.sample.manage.model.entity.PlayTextEntity; +import org.dromara.sample.manage.service.IDeviceStreamService; +import org.dromara.sample.manage.service.IPlayTextService; +import org.dromara.system.api.RemoteConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; + +/** + * + * @author sean.zhou + * @version 0.1 + * @date 2021/11/10 + */ +@Service +@Slf4j +@Transactional +public class DeviceStreamServiceImpl implements IDeviceStreamService { + +} From 124d7ac453a09ec78ac3537c8e361590b4d35392 Mon Sep 17 00:00:00 2001 From: like <1025687351@qq.com> Date: Thu, 15 May 2025 11:21:34 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E6=8E=A8=E6=B5=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneController.java | 72 +++++++++---------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java index 0585aa0..12f5f39 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java @@ -267,55 +267,47 @@ public class MegaphoneController { //发送mqtt String s = remoteConfigService.selectStreamIp(); DisobeyDTO param = Convert.convert(DisobeyDTO.class, objectMap); - if (param.getOpen() == 1){ + deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); if (StringUtils.isNotEmpty(param.getModel())){ String[] split = param.getModel().split(","); for (String type : split){ - List deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl()) - .eq("stream_type", type)); - if (CollectionUtils.isEmpty(deviceStreamEntities)){ - DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity(); - deviceStreamEntity.setStreamType(type); - deviceStreamEntity.setCreateTime(new Date()); - deviceStreamEntity.setUpdateTime(new Date()); - deviceStreamEntity.setRtmpUrl(param.getRtmpUrl()); - deviceStreamMapper.insert(deviceStreamEntity); - List list = new ArrayList<>(); - list.add(type); - DisobeyDTO disobeyDTO = new DisobeyDTO(); - disobeyDTO.setUrl(s); - disobeyDTO.setOpen(param.getOpen()); - disobeyDTO.setType(list); - disobeyDTO.setRtmpUrl(param.getRtmpUrl()); - gatewayPublish.publish(top,new CommonTopicRequest<>() - .setData(Objects.requireNonNull(disobeyDTO)),1); - } + DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity(); + deviceStreamEntity.setStreamType(type); + deviceStreamEntity.setCreateTime(new Date()); + deviceStreamEntity.setUpdateTime(new Date()); + deviceStreamEntity.setRtmpUrl(param.getRtmpUrl()); + deviceStreamMapper.insert(deviceStreamEntity); + List list = new ArrayList<>(); + list.add(type); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl(s); + disobeyDTO.setOpen(param.getOpen()); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(param.getRtmpUrl()); + gatewayPublish.publish(top,new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); + } } } if (param.getOpen() == 2){ - if (StringUtils.isNotEmpty(param.getModel())){ - String[] split = param.getModel().split(","); - for (String type : split){ - List deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl()) - .eq("stream_type", type)); - if (CollectionUtils.isNotEmpty(deviceStreamEntities)){ - deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl()) - .eq("stream_type", type)); - List list = new ArrayList<>(); - list.add(type); - DisobeyDTO disobeyDTO = new DisobeyDTO(); - disobeyDTO.setUrl(s); - disobeyDTO.setOpen(param.getOpen()); - disobeyDTO.setType(list); - disobeyDTO.setRtmpUrl(param.getRtmpUrl()); - gatewayPublish.publish(top,new CommonTopicRequest<>() - .setData(Objects.requireNonNull(disobeyDTO)),1); - } + List deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); + if (CollectionUtils.isNotEmpty(deviceStreamEntities)){ + for (DeviceStreamEntity deviceStreamEntity: deviceStreamEntities){ + deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", deviceStreamEntity.getRtmpUrl()) + .eq("stream_type", deviceStreamEntity.getStreamType())); + List list = new ArrayList<>(); + list.add(deviceStreamEntity.getStreamType()); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl(s); + disobeyDTO.setOpen(param.getOpen()); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(param.getRtmpUrl()); + gatewayPublish.publish(top,new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); } - }else { - deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); + } } return HttpResultResponse.success(); From 6b060c1d48ac0105ac79a3a761924613124e95a2 Mon Sep 17 00:00:00 2001 From: wuyuan <15505152113@163.com> Date: Thu, 15 May 2025 16:31:20 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=9B=B4=E6=92=AD=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sample/manage/service/impl/LiveStreamServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java index ada3a4f..034950e 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java @@ -134,11 +134,14 @@ public class LiveStreamServiceImpl implements ILiveStreamService { Optional> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceBySn.getDeviceSn()); Map reqMap = new HashMap<>(); if(runningWaylineJob.isPresent()) { + ILivestreamUrl iLivestreamUrl = LiveStreamProperty.get(UrlTypeEnum.RTMP); String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId(); Optional waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId); reqMap.put("jobId",waylineJobDTO.get().getJobId()); reqMap.put("jobName",waylineJobDTO.get().getJobName()); reqMap.put("deviceSn",deviceBySn.getDeviceSn()); + reqMap.put("videoId",liveParam.getVideoId().toString()); + reqMap.put("url",iLivestreamUrl.toString()); playTextService.streamType(reqMap); } } From aa3ea1527b835c6495e551637b7e9205ddbe1f3f Mon Sep 17 00:00:00 2001 From: like <1025687351@qq.com> Date: Thu, 15 May 2025 19:44:42 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E6=8E=A8=E6=B5=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneController.java | 102 ++++++++++++++---- .../manage/controller/PlayTextController.java | 2 + .../service/impl/LiveStreamServiceImpl.java | 63 +++++++++-- 3 files changed, 138 insertions(+), 29 deletions(-) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java index 12f5f39..7e9a8e8 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/MegaphoneController.java @@ -34,6 +34,7 @@ import org.dromara.common.sdk.mqtt.services.ServicesReplyReceiver; import org.dromara.common.sdk.mqtt.services.TopicServicesRequest; import org.dromara.common.translation.annotation.Translation; import org.dromara.sample.common.util.Md5Utils; +import org.dromara.sample.feign.RemoteSystemFeign; import org.dromara.sample.manage.mapper.IDeviceStreamMapper; import org.dromara.sample.manage.model.dto.*; import org.dromara.sample.manage.model.entity.DeviceStreamEntity; @@ -48,6 +49,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.*; +import java.util.stream.Collectors; import static org.apache.commons.compress.utils.ArchiveUtils.sanitize; import static org.dromara.common.sdk.mqtt.MqttGatewayPublish.DEFAULT_RETRY_COUNT; @@ -81,6 +83,8 @@ public class MegaphoneController { @Resource IDeviceStreamMapper deviceStreamMapper; + @Resource + private RemoteSystemFeign remoteSystemFeign; /** * 喊话器-开始播放文档(对应遥控器的录音广播模式) * Get the topology list of all online devices in one workspace. @@ -267,32 +271,76 @@ public class MegaphoneController { //发送mqtt String s = remoteConfigService.selectStreamIp(); DisobeyDTO param = Convert.convert(DisobeyDTO.class, objectMap); + List deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); + List types = deviceStreamEntities.stream() + .map(DeviceStreamEntity::getStreamType) + .collect(Collectors.toList()); if (param.getOpen() == 1){ - deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); +// deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); if (StringUtils.isNotEmpty(param.getModel())){ String[] split = param.getModel().split(","); - for (String type : split){ - DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity(); - deviceStreamEntity.setStreamType(type); - deviceStreamEntity.setCreateTime(new Date()); - deviceStreamEntity.setUpdateTime(new Date()); - deviceStreamEntity.setRtmpUrl(param.getRtmpUrl()); - deviceStreamMapper.insert(deviceStreamEntity); - List list = new ArrayList<>(); - list.add(type); - DisobeyDTO disobeyDTO = new DisobeyDTO(); - disobeyDTO.setUrl(s); - disobeyDTO.setOpen(param.getOpen()); - disobeyDTO.setType(list); - disobeyDTO.setRtmpUrl(param.getRtmpUrl()); - gatewayPublish.publish(top,new CommonTopicRequest<>() - .setData(Objects.requireNonNull(disobeyDTO)),1); - + if (CollectionUtils.isNotEmpty(types) && split.length > types.size()){ + //加数据 + for (String type : split){ + if (!types.contains(type)){ + DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity(); + deviceStreamEntity.setStreamType(type); + deviceStreamEntity.setCreateTime(new Date()); + deviceStreamEntity.setUpdateTime(new Date()); + deviceStreamEntity.setRtmpUrl(param.getRtmpUrl()); + deviceStreamMapper.insert(deviceStreamEntity); + List list = new ArrayList<>(); + list.add(type); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl(s); + disobeyDTO.setOpen(param.getOpen()); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(param.getRtmpUrl()); + gatewayPublish.publish(top,new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); + } + } + }else if (CollectionUtils.isNotEmpty(types) && split.length < types.size()){ + //删数据 + for (String type : types){ + List list1 = Arrays.asList(split); + if (!list1.contains(type)){ + deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl()) + .eq("stream_type", type)); + List list = new ArrayList<>(); + list.add(type); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl(s); + disobeyDTO.setOpen(2); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(param.getRtmpUrl()); + gatewayPublish.publish(top,new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); + } + } + }else { + for (String type : split){ + DeviceStreamEntity deviceStreamEntity = new DeviceStreamEntity(); + deviceStreamEntity.setStreamType(type); + deviceStreamEntity.setCreateTime(new Date()); + deviceStreamEntity.setUpdateTime(new Date()); + deviceStreamEntity.setRtmpUrl(param.getRtmpUrl()); + deviceStreamMapper.insert(deviceStreamEntity); + List list = new ArrayList<>(); + list.add(type); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl(s); + disobeyDTO.setOpen(param.getOpen()); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(param.getRtmpUrl()); + gatewayPublish.publish(top,new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); + + } } } } if (param.getOpen() == 2){ - List deviceStreamEntities = deviceStreamMapper.selectList(new QueryWrapper().eq("rtmp_url", param.getRtmpUrl())); if (CollectionUtils.isNotEmpty(deviceStreamEntities)){ for (DeviceStreamEntity deviceStreamEntity: deviceStreamEntities){ deviceStreamMapper.delete(new QueryWrapper().eq("rtmp_url", deviceStreamEntity.getRtmpUrl()) @@ -468,4 +516,20 @@ public class MegaphoneController { // } + @GetMapping("/streams") + @Operation(summary = "获取媒体流ip。", description = "获取媒体流ip。") + @Transactional + public HttpResultResponse> streams (@RequestParam String deviceSn + ) { + List list = remoteSystemFeign.selectStreamType(deviceSn); + List list1 = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(list)){ + for (String s : list){ + String[] split = s.split(","); + list1.add(split[2]); + } + } + return HttpResultResponse.success(list1); + } + } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java index f94cc91..5424bca 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/PlayTextController.java @@ -91,4 +91,6 @@ public class PlayTextController { } + + } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java index 034950e..b81b722 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java @@ -1,5 +1,8 @@ package org.dromara.sample.manage.service.impl; +import cn.hutool.core.convert.Convert; +import jakarta.annotation.Resource; +import org.apache.commons.collections.CollectionUtils; import org.dromara.common.rocketmq.producer.MessageProducerUtil; import org.dromara.common.sdk.cloudapi.device.DeviceDomainEnum; import org.dromara.common.sdk.cloudapi.device.VideoId; @@ -8,9 +11,12 @@ import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService; import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress; import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.SDKManager; +import org.dromara.common.sdk.mqtt.CommonTopicRequest; +import org.dromara.common.sdk.mqtt.MqttGatewayPublish; import org.dromara.common.sdk.mqtt.services.ServicesReplyData; import org.dromara.common.sdk.mqtt.services.TopicServicesResponse; import org.dromara.sample.component.mqtt.model.EventsReceiver; +import org.dromara.sample.feign.RemoteSystemFeign; import org.dromara.sample.manage.model.dto.*; import org.dromara.sample.manage.model.entity.DeviceEntity; import org.dromara.sample.manage.model.param.DeviceQueryParam; @@ -49,6 +55,8 @@ public class LiveStreamServiceImpl implements ILiveStreamService { @Autowired private AbstractLivestreamService abstractLivestreamService; + @Resource + private MqttGatewayPublish gatewayPublish; @Autowired private IPlayTextService playTextService; @@ -59,6 +67,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService { @Autowired private IWaylineJobService waylineJobService; + @Resource + private RemoteSystemFeign remoteSystemFeign; + @Override public List getLiveCapacity(String workspaceId) { @@ -134,15 +145,32 @@ public class LiveStreamServiceImpl implements ILiveStreamService { Optional> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceBySn.getDeviceSn()); Map reqMap = new HashMap<>(); if(runningWaylineJob.isPresent()) { - ILivestreamUrl iLivestreamUrl = LiveStreamProperty.get(UrlTypeEnum.RTMP); - String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId(); - Optional waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId); - reqMap.put("jobId",waylineJobDTO.get().getJobId()); - reqMap.put("jobName",waylineJobDTO.get().getJobName()); - reqMap.put("deviceSn",deviceBySn.getDeviceSn()); - reqMap.put("videoId",liveParam.getVideoId().toString()); - reqMap.put("url",iLivestreamUrl.toString()); - playTextService.streamType(reqMap); + //开启ai推流 + List deviceSn = remoteSystemFeign.selectStreamType(deviceBySn.getDeviceSn()); + if (CollectionUtils.isNotEmpty(deviceSn)){ + ILivestreamUrl iLivestreamUrl = LiveStreamProperty.get(UrlTypeEnum.RTMP); + String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId(); + Optional waylineJobDTO = waylineJobService.getJobByJobInternalId(jobId); + reqMap.put("jobId",waylineJobDTO.get().getJobId()); + reqMap.put("jobName",waylineJobDTO.get().getJobName()); + reqMap.put("deviceSn",deviceBySn.getDeviceSn()); + reqMap.put("videoId",liveParam.getVideoId().getDroneSn().toString()+"-"+liveParam.getVideoId().getPayloadIndex().toString()); + reqMap.put("url",iLivestreamUrl.toString()); + playTextService.streamType(reqMap); + for (String s : deviceSn){ + String[] split = s.split(","); + List list = new ArrayList<>(); + list.add(split[2]); + DisobeyDTO disobeyDTO = new DisobeyDTO(); + disobeyDTO.setUrl("http://114.235.183.163"); + disobeyDTO.setOpen(1); + disobeyDTO.setType(list); + disobeyDTO.setRtmpUrl(liveParam.getVideoId().getDroneSn().toString()+"-"+liveParam.getVideoId().getPayloadIndex().toString()); + gatewayPublish.publish("task/image/disobey/smoke",new CommonTopicRequest<>() + .setData(Objects.requireNonNull(disobeyDTO)),1); + } + } + } } @@ -156,10 +184,25 @@ public class LiveStreamServiceImpl implements ILiveStreamService { if (HttpResultResponse.CODE_SUCCESS != responseResult.getCode()) { return responseResult; } - TopicServicesResponse response = abstractLivestreamService.liveStopPush( SDKManager.getDeviceSDK(responseResult.getData().getDeviceSn()), new LiveStopPushRequest() .setVideoId(videoId)); +// //关闭ai推流 +// List deviceSn = remoteSystemFeign.selectStreamType(responseResult.getData().getDeviceSn()); +// if (CollectionUtils.isNotEmpty(deviceSn)){ +// for (String s : deviceSn){ +// List list = new ArrayList<>(); +// list.add(s); +// DisobeyDTO disobeyDTO = new DisobeyDTO(); +// disobeyDTO.setUrl(s); +// disobeyDTO.setOpen(2); +// disobeyDTO.setType(list); +// disobeyDTO.setRtmpUrl(videoId.toString()); +// gatewayPublish.publish("task/image/disobey/smoke",new CommonTopicRequest<>() +// .setData(Objects.requireNonNull(disobeyDTO)),1); +// } +// } + if (!response.getData().getResult().isSuccess()) { return HttpResultResponse.error(response.getData().getResult()); }