Compare commits

...

585 Commits

Author SHA1 Message Date
wanjia 89cf31f69a feat(dms):excel导入校企成果,支持图片 2026-03-03 15:36:03 +08:00
wanjia 14fc5ffe82 fix(dms):#3968 推荐依赖包补充 2026-01-12 16:40:02 +08:00
wanjia 33546ec525 fix(dms):重复pom依赖引入修正 2026-01-12 16:16:45 +08:00
wanjia 57826cc52a fix(dms):变量命名修正 2026-01-12 16:16:30 +08:00
wanjia 2c5a1c3e43 fix(dms):#3922 不存在的competitionId报错优化 2026-01-12 16:16:12 +08:00
wanjia 4b81b296da fix(dms):慢查询优化 2026-01-12 11:16:07 +08:00
wanjia 5899277c28 feat(特色专区):专区文章返回概要和发布时间 2025-12-22 09:16:55 +08:00
wanjia 457c93d821 feat(特色专区):专区资源支持更新时间字段排序 2025-12-12 11:37:07 +08:00
wanjia a54f6fc8a4 feat(特色专区):专区资源拓展数据字段 2025-12-11 11:11:20 +08:00
wanjia 5527e4ba6a feat(特色专区):专区资源支持标签搜索 2025-12-10 09:04:04 +08:00
wanjia b69d1f16e9 Merge remote-tracking branch 'main/master' 2025-12-09 14:00:59 +08:00
wanjia 43a3245ec0 feat(特色专区):专区资源支持标签 2025-12-09 13:59:41 +08:00
wanjia9506 16e941df45 Merge pull request '专区资源领域支持标签' (#1022) from wanjia9506/microservices:master into master 2025-12-09 11:29:53 +08:00
wanjia bfdbe31287 feat(特色专区):专区资源领域支持标签 2025-12-09 10:00:19 +08:00
otto a5dbcad720 Merge pull request 'fix【成果】 移除简介为空的成果历史' (#1016) from liuhuazhong/microservices:feat_chievements_dev into master 2025-10-27 16:13:29 +08:00
刘华中 2f8f7b8574 fix【成果】 移除简介为空的成果历史 2025-10-27 15:54:20 +08:00
otto c979c6fc1f Merge pull request '设置首页推荐时需更新活跃度排名数据' (#1012) from otto/microservices:master into master 2025-10-20 16:17:01 +08:00
OTTO 6299d2fa54 fix(特色专区): 设置首页推荐时需更新活跃度排名数据 2025-10-20 16:19:05 +08:00
OTTO 6d9d66d1bc fix(特色专区): 仅计算首页推荐的项目分数 2025-10-20 16:11:23 +08:00
otto 4d64411baa Merge pull request 'fix(特色专区): 仅计算首页推荐的项目分数' (#1011) from otto/microservices:master into master 2025-10-20 16:09:28 +08:00
wanjia9506 381b87b3d3 Merge pull request 'bug修复' (#983) from liuhuazhong/microservices:feat_chievements_dev into master 2025-09-17 16:56:15 +08:00
刘华中 d67d9900d2 fix【推荐】 Long->String 2025-09-17 16:52:41 +08:00
wanjia9506 de2ad06ce1 Merge pull request '系统用户:查询最新用户信息' (#1001) from wanjia9506/microservices:master into master 2025-09-15 16:28:35 +08:00
wanjia b426441d19 fix(系统用户):查询最新用户信息 2025-09-15 16:29:34 +08:00
OTTO ab1370b4da feat(特色专区): 【超算专区】专项项目分类支持简介 2025-09-15 10:59:00 +08:00
otto c65e2ddfd9 Merge pull request 'feat(特色专区): 【超算专区】专项项目分类支持简介' (#1000) from otto/microservices:master into master 2025-09-15 10:58:50 +08:00
otto c82bfb5283 Merge pull request 'feat(特色专区): 【超算专区】超算专区需支持对关联开源项目的计分排名以及项目相关数据' (#999) from otto/microservices:master into master 2025-09-10 17:08:55 +08:00
OTTO 82addd88a1 feat(特色专区): 【超算专区】超算专区需支持对关联开源项目的计分排名以及项目相关数据 2025-09-10 17:08:12 +08:00
OTTO 70efa77f0c feat(特色专区): 【超算专区】专区资源领域支持简介
关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/199/task/134006
2025-09-10 14:10:56 +08:00
otto 123451d519 Merge pull request 'feat(特色专区): 【超算专区】专区资源领域支持简介' (#998) from otto/microservices:master into master 2025-09-10 14:10:14 +08:00
13036795865 16787a5987 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-09-05 16:15:56 +08:00
13036795865 6db7476d01 修复了一些bug 2025-09-05 16:15:40 +08:00
刘华中 53189ec3c9 fix【推荐】 issue推荐贡献者改为项目成员 2025-09-05 14:35:04 +08:00
OTTO cf3bcc19ef refactor(微服务平台): 清理无效代码 2025-09-05 09:02:53 +08:00
otto 50241ed650 Merge pull request 'refactor(微服务平台): 清理无效代码' (#993) from otto/microservices:master into master 2025-09-05 09:02:02 +08:00
OTTO e3f55d4675 Merge branch 'master' of code.gitlink.org.cn:Gitlink/microservices
# Conflicts:
#	pom.xml
2025-09-05 09:01:31 +08:00
OTTO f3887a51e0 refactor(微服务平台): 清理无效代码 2025-09-05 08:57:21 +08:00
wanjia9506 574c82ff92 Merge pull request 'fix(创客赏金统计):异常关闭的已完成统计' (#992) from wanjia9506/microservices:master into master 2025-09-05 08:46:46 +08:00
wanjia 7c41d02d73 fix(创客赏金统计):异常关闭的已完成统计 2025-09-05 08:47:23 +08:00
13036795865 1ec0c254c9 修复了一些bug 2025-09-04 16:25:14 +08:00
OTTO f04be58d75 refactor(微服务平台): 清理无效代码 2025-09-04 14:43:04 +08:00
otto 88fc3d7301 Merge pull request 'refactor(微服务平台): 清理无效代码' (#991) from otto/microservices:master into master 2025-09-04 14:41:46 +08:00
otto 05f0185316 Merge pull request '微服务平台' (#990) from hot_fix into master 2025-09-04 14:38:02 +08:00
otto 9606278a08 微服务平台 2025-09-04 14:37:49 +08:00
wanjia9506 6d951d8996 Merge pull request '导入测试用例维护人改为当前操作人' (#989) from zwz into master 2025-08-29 17:06:55 +08:00
曾威嶂 35ffdc51c3 导入测试用例维护人改为当前操作人 2025-08-29 17:04:14 +08:00
曾威嶂 ff5d8abc7b 修复查询测试用例列表用户名不存在 2025-08-29 16:20:42 +08:00
wanjia9506 137120b32b Merge pull request '修复查询测试用例列表用户名不存在' (#988) from zwz into master 2025-08-29 16:19:37 +08:00
13036795865 0d642c17b3 修复了一些bug 2025-08-25 14:05:33 +08:00
13036795865 cf5e83b661 修复了一些bug 2025-08-15 14:48:34 +08:00
wanjia9506 97116cd70a Merge pull request '社区疑修关联工作项自动评论' (#981) from wanjia9506/microservices:dev_issues_transform into master 2025-08-11 11:29:56 +08:00
wanjia 266f1a7420 fix(社区版项目管理):#3676 社区疑修关联工作项自动评论问题修复 2025-08-11 11:26:29 +08:00
wanjia9506 6c0e3c4dd0 Merge pull request '社区疑修关联工作项自动评论问题修复' (#980) from wanjia9506/microservices:dev_issues_transform into master 2025-08-11 11:01:22 +08:00
wanjia e3050f974d fix(社区版项目管理):#3676 社区疑修关联工作项自动评论问题修复 2025-08-11 10:59:13 +08:00
wanjia9506 574ca0d845 Merge pull request '疑修列表入参丰富' (#973) from wanjia9506/microservices:dev_issues_transform into master 2025-07-30 15:04:15 +08:00
wanjia c6ac0f4a98 feat(社区版项目管理):#3676 疑修列表入参丰富 2025-07-30 15:03:05 +08:00
wanjia9506 30463e9113 Merge pull request '疑修列表接口' (#972) from wanjia9506/microservices:dev_issues_transform into master 2025-07-30 14:38:29 +08:00
wanjia 113a84b023 feat(社区版项目管理):#3676 疑修列表接口 2025-07-30 14:37:23 +08:00
wanjia9506 428af3495a Merge pull request '仓库列表、疑修列表接口' (#971) from wanjia9506/microservices:dev_issues_transform into master 2025-07-30 14:17:42 +08:00
wanjia 5122204fe8 feat(社区版项目管理):#3676 仓库列表、疑修列表接口 2025-07-30 14:16:38 +08:00
wanjia9506 bbb4e50f80 Merge pull request '查看社区疑修与项目工作项关联接口' (#970) from wanjia9506/microservices:dev_issues_transform into master 2025-07-30 11:25:34 +08:00
wanjia 987af70ec3 feat(社区版项目管理):#3676 查看社区疑修与项目工作项关联接口 2025-07-30 11:24:14 +08:00
wanjia9506 9936c21594 Merge pull request '查看社区疑修与项目工作项关联接口' (#969) from wanjia9506/microservices:dev_issues_transform into master 2025-07-30 11:01:53 +08:00
wanjia d56f171922 feat(社区版项目管理):#3676 查看社区疑修与项目工作项关联接口 2025-07-30 11:00:35 +08:00
wanjia9506 4c00fadd0c Merge pull request '转发forge评论相关接口' (#967) from wanjia9506/microservices:dev_issues_transform into master 2025-07-29 14:53:28 +08:00
wanjia d42947ad9d feat(社区版项目管理):#3676 转发forge评论相关接口 2025-07-29 14:52:22 +08:00
wanjia9506 ca80c905d5 Merge pull request '转发forge删除疑修接口' (#966) from wanjia9506/microservices:dev_issues_transform into master 2025-07-29 14:14:53 +08:00
wanjia 225b2f3a24 feat(社区版项目管理):#3676 转发forge删除疑修接口 2025-07-29 14:13:36 +08:00
wanjia9506 9d0a36f804 Merge pull request '转发forge代码库相关接口' (#961) from wanjia9506/microservices:dev_issues_transform into master 2025-07-28 16:34:04 +08:00
wanjia 1ed8d87c80 feat(社区版项目管理):#3676 转发forge代码库相关接口 2025-07-28 16:31:16 +08:00
wanjia9506 a1fdb1ed31 Merge pull request '社区版项目管理' (#960) from wanjia9506/microservices:dev_issues_transform into master 2025-07-28 14:22:51 +08:00
wanjia ef61378cc4 feat(社区版项目管理):#3676 转发forge代码库、疑修相关接口 2025-07-28 14:19:45 +08:00
wanjia 7388abeee8 feat(社区版项目管理):#3676 添加社区疑修与项目工作项关联 2025-07-28 10:38:44 +08:00
wanjia9506 7bf6b6bde0 Merge pull request '知识库名称长度修改' (#957) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-07-25 10:44:45 +08:00
wanjia 4ce61b09bf fix(项目仪表盘):#3689 知识库名称长度修改 2025-07-25 10:41:26 +08:00
wanjia9506 a2801fc599 Merge pull request '知识库日志title更改' (#954) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-07-24 15:24:18 +08:00
wanjia 2ce483f737 feat(项目仪表盘):#132587 知识库日志title更改 2025-07-24 15:22:57 +08:00
wanjia9506 8e6f27e158 Merge pull request '知识库动态添加上传文件、更新动态' (#950) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-07-24 14:36:03 +08:00
wanjia 83447dc34a feat(项目仪表盘):#132587 知识库动态添加上传文件、更新动态 2025-07-24 14:34:40 +08:00
wanjia9506 4f306a4b19 Merge pull request '工作项负责人排序+项目仪表盘中动态记录补充知识库类型' (#948) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-07-23 17:08:44 +08:00
wanjia 9b12911095 feat(项目仪表盘):#132587 加注释 2025-07-23 17:03:30 +08:00
wanjia 30daa7b00c feat(项目仪表盘):#132587 项目仪表盘中知识库类型动态转换 2025-07-23 14:21:59 +08:00
wanjia 6dc2dda918 feat(项目仪表盘):#132587 项目仪表盘中动态记录补充知识库类型 2025-07-22 16:50:33 +08:00
wanjia 3982b5dd9a feat(工作项列表):工作项负责人升序/降序 2025-07-22 11:43:08 +08:00
wanjia9506 c750f1b26e Merge pull request '修改测试用例导出内容排序' (#940) from zwz into master 2025-07-21 13:51:54 +08:00
曾威嶂 986ac5bc96 修改测试用例导出内容排序 2025-07-21 13:50:48 +08:00
wanjia9506 851cfd5599 Merge pull request '修改测试用例导出格式' (#939) from zwz into master 2025-07-21 11:22:19 +08:00
曾威嶂 d67058a2d7 修改测试用例导出表格格式 2025-07-21 11:18:02 +08:00
wanjia9506 63da653833 Merge pull request '项目周报统计加时间区间传参' (#938) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-07-21 09:52:05 +08:00
wanjia ae700d51d0 Merge remote-tracking branch 'main/master' into dev_weeklyReport_refact 2025-07-21 09:50:19 +08:00
wanjia 12c3f0be2a feat(周报):项目周报统计加时间区间传参 2025-07-21 09:39:34 +08:00
13036795865 c3dec7fec2 修复了一些bug 2025-07-03 14:17:23 +08:00
wanjia9506 d4feb0614c Merge pull request '个人周报统计加用户传参和时间区间' (#925) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-07-02 14:27:20 +08:00
wanjia cc97f13a1f feat(周报):#128808 个人周报统计加用户传参和时间区间 2025-07-02 14:25:40 +08:00
wanjia9506 1e200bf8f2 Merge pull request 'fix 测试用例导入兼容格式问题;新增部分用例导入接口' (#924) from zwz into master 2025-07-02 10:43:19 +08:00
曾威嶂 8045096c02 fix 测试用例导入兼容格式问题;新增部分用例导入接口 2025-07-02 10:39:49 +08:00
13036795865 b4dd83c0ec 修复了一些bug 2025-06-25 15:18:21 +08:00
13036795865 84118693f7 修复了一些bug 2025-06-25 14:55:54 +08:00
wanjia9506 3b17e0c729 Merge pull request 'feat(资源库) 区块链相关' (#918) from liuhuazhong/microservices:feat_chievements_dev into master 2025-06-24 09:05:53 +08:00
13036795865 e5698ae5c8 修复了一些bug 2025-06-23 11:22:01 +08:00
wanjia9506 0d206b0050 Merge pull request '个人周报统计加用户传参' (#916) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-06-21 14:09:34 +08:00
wanjia 7691eed48d Merge remote-tracking branch 'main/master' into dev_weeklyReport_refact 2025-06-21 14:07:46 +08:00
wanjia 9a032cb840 feat(周报):个人周报统计加用户传参 2025-06-21 14:07:30 +08:00
13036795865 93c3a48b35 修复了一些bug 2025-06-21 13:53:00 +08:00
13036795865 d8531a429a 修复了一些bug 2025-06-21 11:34:28 +08:00
13036795865 322f986170 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-06-21 08:58:45 +08:00
13036795865 5bdf65a200 修复了一些bug 2025-06-21 08:58:33 +08:00
刘华中 7b3023c56e fix【资源库】 修复一个bug 2025-06-20 16:34:09 +08:00
13036795865 aa593e1583 修复了一些bug 2025-06-20 09:28:03 +08:00
13036795865 987150e01d 修复了一些bug 2025-06-20 08:57:04 +08:00
13036795865 8673006247 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev
# Conflicts:
#	microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BlockChainService.java
2025-06-19 20:27:23 +08:00
13036795865 ce5a07c755 修复了一些bug 2025-06-19 20:25:08 +08:00
刘华中 6ae585bb5b fix【资源库】 修复一些bug 2025-06-19 15:37:39 +08:00
13036795865 7a7e5350fb bug 3353\3337\3232\3341 2025-06-18 17:01:48 +08:00
13036795865 f53c9b74f4 bug 3334\3319\3332 2025-06-18 10:13:50 +08:00
13036795865 47cb86ad7c bug 3328\3326 2025-06-17 15:35:38 +08:00
13036795865 4a07c4b8d3 bug 3327\3320\3321 2025-06-17 15:06:23 +08:00
13036795865 26f6534bc1 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-06-17 10:27:36 +08:00
13036795865 f3ce9cb56f bug 3321\3292\3289\3305\3294 2025-06-17 10:27:24 +08:00
wanjia9506 f51dbdccef Merge pull request '个人周报完成情况置空' (#915) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-06-16 16:59:47 +08:00
wanjia e3037b03a0 feat(周报):个人周报完成情况置空 2025-06-16 16:58:39 +08:00
刘华中 54c2216c1a fix【资源库】 修复一些bug 2025-06-16 16:47:24 +08:00
13036795865 15bab4fe0a bug 3305\3205\3230\3294 2025-06-16 10:41:15 +08:00
wanjia9506 57d4171442 Merge pull request '周报优化' (#914) from wanjia9506/microservices:dev_weeklyReport_refact into master 2025-06-16 10:05:44 +08:00
wanjia bb9a5ec58b feat(周报):#128092 个人周报完成情况查询逻辑优化 2025-06-13 09:10:51 +08:00
wanjia 506c54ef5f feat(周报):#128092 个人周报中添加工作项完成情况 2025-06-12 19:36:15 +08:00
13036795865 80ac027567 bug 3221 【资源库】每日查看专家数量为0未计数 2025-06-12 15:36:00 +08:00
13036795865 b93b249ae6 bug 3218 2025-06-11 09:17:18 +08:00
wanjia9506 6dfe866c93 Merge pull request '历史周报中个人/项目组工作项列表加时间区间入参' (#913) from wanjia9506/microservices:master into master 2025-06-09 14:35:31 +08:00
wanjia 6f7612780f Merge remote-tracking branch 'main/master' 2025-06-09 14:27:19 +08:00
wanjia c41974784b fix(周报):历史周报中个人/项目组工作项列表加时间区间入参 2025-06-09 14:26:59 +08:00
otto e8b3de286d Merge pull request '支持航天院自动伸缩功能' (#912) from otto/microservices:master into master 2025-06-07 15:10:19 +08:00
OTTO 357b4be19d feat(航天院自动伸缩功能): 打印接口请求消息 2025-06-07 14:40:44 +08:00
wanjia cf4c55877c updare README 2025-06-07 09:11:08 +08:00
wanjia9506 2f11e78844 Merge pull request '测试用例导入导出' (#911) from dev_testCase_export into master 2025-06-06 16:55:09 +08:00
wanjia9506 e78ae3c29c Merge pull request '更新需求' (#910) from zengweizhang/microservices:master into dev_testCase_export 2025-06-06 16:12:56 +08:00
zwz 60eeb05560 新增导出测试用例章节模板 2025-06-06 15:44:52 +08:00
13036795865 c0270f3f74 区块链交易信息查询 2025-06-05 20:02:29 +08:00
13036795865 7cad1a7005 区块链交易信息查询 2025-06-05 19:12:22 +08:00
13036795865 ac132e8256 区块链交易信息查询 2025-06-04 20:28:55 +08:00
wanjia9506 c001df36d8 Merge pull request '同步更新issue企业标识' (#908) from wanjia9506/microservices:dev_data_compatible_127659 into master 2025-06-04 09:03:08 +08:00
wanjia d216d3d0b8 fix(数据同步):同步更新issue企业标识 2025-06-04 08:58:29 +08:00
zengweizhang 743cb69663 Merge pull request '修复1、测试用例导出时表格章节号不对问题;2、部分章节测试用例没有导出的问题' (#906) from zengweizhang/microservices:master into dev_testCase_export 2025-06-03 08:34:22 +08:00
zwz 77381ea173 修复1、测试用例导出时表格章节号不对问题;2、部分章节测试用例没有导出的问题 2025-06-02 22:39:02 +08:00
13036795865 99073851b4 fiscobocs 接口调用需要的认证文件 2025-05-30 16:17:03 +08:00
刘华中 6cf191de76 feat【资源库-专家推荐】数据类型修改 2025-05-30 11:28:35 +08:00
zengweizhang 49bdd12ff3 Merge pull request '修复test_tracking错误' (#905) from zengweizhang/microservices:master into dev_testCase_export 2025-05-30 11:00:55 +08:00
zwz b079d42fcd 修复test_tracking错误 2025-05-30 11:00:17 +08:00
zengweizhang 1ab2d600de Merge pull request '修复test_tracking错误' (#904) from zengweizhang/microservices:master into dev_testCase_export 2025-05-30 10:46:45 +08:00
zwz 4ca5dd0c51 修复test_tracking错误 2025-05-30 10:45:54 +08:00
刘华中 cdeb638f78 feat【资源库-专家推荐】任务推荐增加状态和领域得分累加 2025-05-30 10:30:56 +08:00
zengweizhang 1f55b9878e Merge pull request '修复test_tracking错误' (#903) from zengweizhang/microservices:master into dev_testCase_export 2025-05-30 10:28:48 +08:00
zwz 34867e4580 修复test_tracking错误 2025-05-30 10:27:03 +08:00
zengweizhang 06825e82c1 Merge pull request '修复映射问题' (#902) from zengweizhang/microservices:master into dev_testCase_export 2025-05-30 09:42:38 +08:00
zwz 2f06bf137d 修复test_tracking错误 2025-05-30 09:40:26 +08:00
zengweizhang d887c6cf1b Merge pull request '获取测试用例管理详细信息 错误修复' (#901) from zengweizhang/microservices:master into dev_testCase_export 2025-05-29 19:50:20 +08:00
zwz 51fe5866e3 获取测试用例管理详细信息,用户未找到问题修复 2025-05-29 19:35:30 +08:00
wanjia9506 03abc0cf28 Merge pull request '获取测试用例管理详细信息 错误修复' (#898) from zengweizhang/microservices:master into dev_testCase_export 2025-05-29 17:21:49 +08:00
刘华中 5d1752e890 feat【资源库-数据产权子系统】增加用户列表查询接口 2025-05-29 17:00:39 +08:00
zwz 2218278c58 获取测试用例管理详细信息 错误修复 2025-05-29 16:59:06 +08:00
otto bd9382cf1c Merge pull request '新增测试用例 "测试追踪"、"是否导入" 字段,修复导入测试用例后列表刷新问题' (#895) from zengweizhang/microservices:master into dev_testCase_export 2025-05-29 15:18:08 +08:00
zwz 618b62d22d 新增测试用例 "测试追踪"、"是否导入" 字段,修复导入测试用例后列表刷新问题 2025-05-29 14:53:32 +08:00
zwz e8a6db6ac8 新增测试用例 "测试追踪"、"是否导入" 字段,修复导入测试用例后列表刷新问题 2025-05-29 14:48:42 +08:00
刘华中 70d8a56eaa fix【资源库-数据产权子系统】token分配增加数量验证 2025-05-29 10:22:25 +08:00
刘华中 9c78405699 fix【资源库-数据产权子系统】v2 2025-05-28 18:03:30 +08:00
刘华中 2724d66a09 fix【资源库-数据产权子系统】v1 2025-05-28 16:36:53 +08:00
otto 35f94f3ac5 Merge pull request '制品库支持外网访问' (#891) from dev_zpk into master 2025-05-28 16:11:02 +08:00
otto fb850bad71 Merge pull request '制品库支持外网访问' (#890) from otto/microservices:dev_zpk into dev_zpk 2025-05-28 15:54:02 +08:00
OTTO 2fef3cbc24 feat(项目管理模块): 制品库支持外网访问 2025-05-28 15:52:20 +08:00
刘华中 4044add373 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-28 15:48:14 +08:00
13036795865 1c21b04b52 成果聚类详情 2025-05-28 15:35:45 +08:00
OTTO 9786975fe1 Merge branch 'master' of code.gitlink.org.cn:Gitlink/microservices 2025-05-28 14:29:14 +08:00
刘华中 2a21d804f8 fix【资源库-成果推荐】专家推荐增加过滤条件 2025-05-28 14:22:52 +08:00
wanjia9506 dbcdb468ab Merge pull request 'fix(需求纳入计划): 计划中自动填充企业标识' (#889) from wanjia9506/microservices:dev_weeklyReport_wikiPrevision_merge into master 2025-05-28 11:04:22 +08:00
wanjia 7d16bccea8 fix(需求纳入计划): 计划中自动填充企业标识 2025-05-28 11:01:54 +08:00
wanjia9506 85913c605a Merge pull request 'wiki历史版本+周报改版' (#888) from wanjia9506/microservices:dev_weeklyReport_wikiPrevision_merge into master 2025-05-28 08:31:34 +08:00
wanjia 79136717ef Merge branch 'dev_weeklyReport_refact' into dev_weeklyReport_wikiPrevision_merge 2025-05-27 17:28:00 +08:00
wanjia 64b4c36635 Merge branch 'feat_wiki_prevision_126382' into dev_weeklyReport_wikiPrevision_merge 2025-05-27 17:27:44 +08:00
刘华中 8b70cf3815 fix【资源库-成果推荐】任务成果推荐修改 2025-05-27 17:27:15 +08:00
wanjia9506 a41c0192f2 Merge pull request '新增测试用例导入、导出功能,优化部分代码' (#887) from zengweizhang/microservices:master into dev_testCase_export 2025-05-27 16:54:12 +08:00
zwz bfa4e01372 Merge branch 'master' of https://gitlink.org.cn/Gitlink/microservices 2025-05-27 16:16:09 +08:00
zwz 72cb98c592 新增测试用例导入、导出功能,优化部分代码 2025-05-27 16:00:22 +08:00
wanjia db6b1cfe10 fix(新建项目): #127249 创建项目时关联代码仓后,项目数据新增成果后添加项目-仓库关联数据时去除项目存在性校验 2025-05-27 15:38:38 +08:00
wanjia9506 af7cd7d006 Merge pull request '【资源库-成果库】成果详情增加用户对接的时间' (#883) from liuhuazhong/microservices:feat_chievements_dev into master 2025-05-27 15:16:59 +08:00
刘华中 fa41454534 【资源库-成果库】成果详情增加用户对接的时间 2025-05-27 15:07:26 +08:00
wanjia f459e84521 Merge remote-tracking branch 'origin/dev_weeklyReport_refact' into dev_weeklyReport_refact
# Conflicts:
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java
2025-05-27 14:59:01 +08:00
wanjia 6f63a0de72 feat(周报功能重构):查看他人项目组周报权限控制去除 2025-05-27 14:56:22 +08:00
wanjia e6322835db feat(周报功能重构):周报-个人工作项列表项目信息补全 2025-05-27 14:55:36 +08:00
wanjia 0e83fa62ce feat(周报功能重构):周报-个人工作项列表 2025-05-27 14:55:35 +08:00
刘华中 5232236167 【资源库-成果库】成果详情增加用户对接的时间 2025-05-27 14:23:58 +08:00
13036795865 ce1692ac66 删除无用的方法 2025-05-27 11:50:49 +08:00
13036795865 65e66013cf 成果征集信息下载 2025-05-27 11:44:06 +08:00
13036795865 bd0b24eb1a 对接数据填充 2025-05-27 11:21:03 +08:00
13036795865 154e139f59 对接数据填充 2025-05-27 11:20:01 +08:00
13036795865 e7fb87c759 对接数据填充 2025-05-27 09:53:34 +08:00
13036795865 879133b8c7 活跃用户统计修改;资源库首页来源统计(统计上架数据) 2025-05-27 08:41:06 +08:00
wanjia9506 93185be706 Merge pull request '【资源库-成果库】详情增加用户对接数量' (#882) from liuhuazhong/microservices:feat_chievements_dev into master 2025-05-26 19:47:24 +08:00
刘华中 d5d4fa4805 【资源库-成果库】详情增加用户对接数量 2025-05-26 19:45:41 +08:00
wanjia ea2d703a5e feat(Wiki历史版本):周报-个人工作项列表 2025-05-26 19:17:29 +08:00
wanjia9506 1b8f1ea253 Merge pull request '【资源库-成果库】 一些改动' (#881) from liuhuazhong/microservices:feat_chievements_dev into master 2025-05-26 19:02:16 +08:00
刘华中 8acecc5f13 【资源库-成果库】 列表增加用户相关信息 2025-05-26 17:26:02 +08:00
wanjia 143fa631ce feat(Wiki历史版本):历史版本列表用户名显示昵称 2025-05-26 16:00:50 +08:00
13036795865 f4dd5ce278 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-26 15:52:10 +08:00
13036795865 b24412a1b3 专家实名认证率bug修改 2025-05-26 15:52:00 +08:00
wanjia e48ce7f4b0 feat(Wiki历史版本):历史版本列表用户名显示昵称 2025-05-26 15:43:55 +08:00
刘华中 7a1306929b 【资源库-成果库】 列表增加用户相关信息 2025-05-26 15:37:22 +08:00
13036795865 6e2b1f348f bug 3061、3059 修改 2025-05-26 14:36:11 +08:00
wanjia f61b11bc93 feat(周报功能重构):个人周报统计工作项列表信息补全 2025-05-26 14:18:54 +08:00
wanjia 83f86f623d feat(周报功能重构):个人周报统计工作项分页参数添加 2025-05-26 14:07:36 +08:00
13036795865 a3fc3246fc 成果字典增删查改,成果聚类分析 2025-05-26 13:58:11 +08:00
wanjia 6e7ae41dac feat(周报功能重构):补全项目名空值处理 2025-05-26 13:50:12 +08:00
13036795865 311383d2a3 成果字典增删查改,成果聚类分析 2025-05-26 11:10:37 +08:00
13036795865 5dd17b1142 成果字典增删查改,成果聚类分析 2025-05-26 11:08:23 +08:00
13036795865 7c6617626a 没有的字典值新增 2025-05-26 09:34:34 +08:00
13036795865 d815c57f12 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-26 09:03:55 +08:00
13036795865 b266bb82d6 新增成果字典管理;校企成果新增相关字段 2025-05-26 09:03:37 +08:00
刘华中 e77576f085 【资源库-成果库】一些调整 2025-05-23 16:42:22 +08:00
wanjia e9137d30ba feat(周报功能重构):周报中项目组工作项列表 2025-05-23 16:39:59 +08:00
zwz 7b1c5fe622 增加测试用例批量导出功能 2025-05-23 15:54:52 +08:00
13036795865 5ae151e360 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-23 14:28:25 +08:00
13036795865 b7b21b1f35 区块链方法常量 2025-05-23 14:28:13 +08:00
wanjia 0b69e3bafa feat(Wiki历史版本):项目层级名修正 2025-05-23 13:58:55 +08:00
刘华中 ee3d983c49 【资源库-推荐】issue\pr推荐联调改动 2025-05-23 11:17:14 +08:00
wanjia dcea028be3 feat(周报功能重构):今日待办返回是否为项目负责人 2025-05-23 10:19:38 +08:00
wanjia 5199a829f5 feat(周报功能重构):工作项列表传企业标识 2025-05-23 10:19:38 +08:00
wanjia 1354a2b7a0 feat(周报功能重构):空值处理 2025-05-23 10:19:38 +08:00
wanjia e6413d1efe feat(周报功能重构):生产个人周报时返回项目名 2025-05-22 16:26:29 +08:00
wanjia fe7c642a08 feat(周报功能重构):周报操作去除项目编号绑定 2025-05-22 14:17:28 +08:00
wanjia 3c2b288068 feat(周报功能重构):周报列表入参加企业标识 2025-05-22 11:03:00 +08:00
wanjia 71e5c84a1a feat(周报功能重构):周报个人统计、项目组统计 2025-05-22 09:57:23 +08:00
刘华中 d49f0621c8 【资源库-大屏展示】成果大屏的需求调整改动 2025-05-21 19:28:40 +08:00
13036795865 f05d5cf548 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-21 17:04:14 +08:00
13036795865 6faba9a9c5 专家评审数据排序 2025-05-21 17:03:33 +08:00
刘华中 d6141fe73d 【资源库-大屏展示】成果大屏的需求调整改动 2025-05-21 16:48:32 +08:00
刘华中 fd54700340 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-21 16:43:21 +08:00
13036795865 b429ce6563 根据用户id查询用户收藏、点赞、关注的数据 2025-05-21 16:28:37 +08:00
13036795865 618e3a7731 专家领域去掉为空数据 2025-05-21 15:00:10 +08:00
刘华中 73ba9c53e7 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-21 14:59:13 +08:00
刘华中 611b59a533 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-21 14:54:06 +08:00
13036795865 de64d3c4c6 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-21 14:51:55 +08:00
13036795865 070a404685 成果聚类 2025-05-21 14:51:29 +08:00
刘华中 7f54998e61 【资源库-推荐管理】开源竞赛评审专家推荐 2025-05-20 17:08:38 +08:00
刘华中 79e05c109c 【资源库-推荐管理】创客任务评审专家推荐 2025-05-20 14:56:27 +08:00
xxq250 562469eccb Merge pull request '根据项目ID查询所属组织标识,取消权限拦截,手动注入上下文' (#876) from xxq250/microservices:master into master 2025-05-20 11:18:51 +08:00
xxq250 5dc02cdd33 fixed 根据项目ID查询所属组织标识,取消权限拦截 2025-05-20 11:18:15 +08:00
刘华中 99952b884f 【资源库-推荐管理】创客任务成果推荐 2025-05-20 11:15:09 +08:00
xxq250 890d0d9f50 fixed 根据项目ID查询所属组织标识,取消权限拦截,手动注入上下文 2025-05-20 11:12:55 +08:00
xxq250 911aae3355 Merge pull request '根据项目ID查询所属组织标识,取消权限拦截' (#875) from xxq250/microservices:master into master 2025-05-20 10:32:29 +08:00
xxq250 9455497795 fixed 根据项目ID查询所属组织标识,取消权限拦截 2025-05-20 10:32:04 +08:00
xxq250 743f799e86 Merge pull request '根据项目ID查询所属组织标识,取消权限拦截' (#874) from xxq250/microservices:master into master 2025-05-20 10:26:46 +08:00
xxq250 31ca5d313e fixed 根据项目ID查询所属组织标识,取消权限拦截 2025-05-20 10:26:18 +08:00
xxq250 43946c05f1 Merge pull request 'fixed 根据项目ID查询所属组织标识' (#873) from xxq250/microservices:master into master 2025-05-20 10:09:21 +08:00
xxq250 5838b0db3f fixed 根据项目ID查询所属组织标识 2025-05-20 10:08:03 +08:00
xxq250 f96ae2ce8f fixed 根据项目ID查询所属组织标识 2025-05-20 09:59:27 +08:00
xxq250 b2d3d413be Merge pull request 'fixed 工作项增加企业标识' (#872) from xxq250/microservices:master into master 2025-05-20 09:51:39 +08:00
xxq250 a78c9c2b5d fixed 工作项增加企业标识 2025-05-20 09:49:52 +08:00
刘华中 900122d258 【资源库-推荐管理】推荐相关逻辑修改 2025-05-20 08:31:45 +08:00
刘华中 f6e0b6083a feat: 【资源库-推荐管理】完成创客任务成果推荐后端V1 2025-05-17 16:12:16 +08:00
wanjia9506 8f3331c079 Merge pull request 'dss:已支付金额以万为单位' (#871) from wanjia9506/microservices:dev_data_statistics into master 2025-05-17 14:34:06 +08:00
刘华中 0297b476eb 【资源库-成果管理】统计优质专家时需要优化SQL、需要记录创建人,校企成果列表仅展示当前用户创建的数据 2025-05-17 10:39:50 +08:00
刘华中 10e80dbf49 feat【资源库】首页统计增加上下架的过滤 2025-05-17 09:46:35 +08:00
13036795865 f1da2939c6 领域排序 2025-05-17 09:32:59 +08:00
13036795865 a3542daa9f 专家统计优化 2025-05-17 09:29:46 +08:00
wanjia 405cc2da3e feat(创客空间全局资源获取):已支付金额以万为单位 2025-05-17 08:38:26 +08:00
wanjia 4cef9d6a44 feat(创客空间全局资源获取):已支付金额以万为单位 2025-05-17 08:17:31 +08:00
wanjia9506 c28381b7bc Merge pull request '已支付金额以万为单位' (#870) from wanjia9506/microservices:dev_data_statistics into master 2025-05-17 08:14:48 +08:00
刘华中 ee97b24e51 feat【资源库】创客成果数统计SQL错误、【资源库】参与评审竞赛数统计错误 2025-05-16 16:26:10 +08:00
13036795865 fad993e486 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-16 14:13:29 +08:00
13036795865 11e8f2efb9 帖子原创非原创 2025-05-16 14:00:09 +08:00
刘华中 a708082d1e feat【资源库】竞赛和创客任务:相关成果展示、专家:专家审核数据展示 2025-05-15 16:46:13 +08:00
13036795865 4d7bb9184a Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-15 16:42:45 +08:00
13036795865 aaf956a352 活跃用户:项目、任务、竞赛不同时为0的数据 2025-05-15 16:42:35 +08:00
xxq250 1bf0146cc5 Merge pull request 'issue add statusMsg' (#869) from xxq250/microservices:master into master 2025-05-15 15:56:11 +08:00
xxq250 4a8f9b971f fixed issue add statusMsg 2025-05-15 15:42:49 +08:00
刘华中 4b97dd9521 fix 【资源库】 sql字段匹配 2025-05-15 11:08:36 +08:00
13036795865 855c2e9e53 资源库前端成果名称查询 2025-05-14 20:57:08 +08:00
13036795865 f2d1fc350d Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-14 20:50:37 +08:00
13036795865 5e3ccaf4e7 专家性别获取 2025-05-14 20:50:26 +08:00
刘华中 e69a54033e fix 【资源库】 专家详情页的7天成果每日浏览折线图接口调整 2025-05-14 20:36:33 +08:00
13036795865 0429fe5ab7 资源库前端展示成果名称 2025-05-14 20:04:22 +08:00
13036795865 876cdd9eed 资源库前端展示成果名称 2025-05-14 19:55:25 +08:00
13036795865 1d8b646876 资源库前端展示成果名称 2025-05-14 19:40:32 +08:00
13036795865 3ea6352091 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-14 19:21:24 +08:00
13036795865 bd89d8bbc9 资源库前端展示成果名称 2025-05-14 19:21:12 +08:00
13036795865 06b334e782 资源库前端展示成果名称 2025-05-14 19:21:00 +08:00
刘华中 99c4842442 fix 【资源库】过滤 2025-05-14 19:07:04 +08:00
13036795865 31da182157 获取热门成果的人员图片和信息 2025-05-14 10:53:32 +08:00
wanjia9506 0f689986f2 Merge pull request '列表中文件夹类型文件,返回是否存在子文件夹' (#868) from wanjia9506/microservices:feat_document_126283 into master 2025-05-14 09:34:54 +08:00
13036795865 7707757ac4 swagger添加注释 2025-05-13 15:50:32 +08:00
wanjia cd6a2275b8 feat(知识库):列表中文件夹类型文件,返回是否存在子文件夹 2025-05-13 15:36:14 +08:00
13036795865 4d08c973fe 数据仓库上下架 2025-05-13 11:34:54 +08:00
13036795865 cca9296f5b Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-13 11:14:52 +08:00
13036795865 f6eb2f9901 如果登录人为空获取对应负责人的值 2025-05-13 11:14:38 +08:00
wanjia 6f7d969ce9 feat(Wiki历史版本):wiki历史版本列表及历史版本详情 2025-05-13 10:46:07 +08:00
liuhuazhong 9d6bbe5785 fix 【资源库】图片地址拼接 2025-05-12 17:06:49 +08:00
otto 5dae889f13 Merge pull request '资源库功能' (#867) from liuhuazhong/microservices:feat_chievements_dev into master 2025-05-09 17:13:59 +08:00
liuhuazhong a992476be6 fix 【资源库】详情接口没有返回field1Name 2025-05-09 17:08:40 +08:00
liuhuazhong 677fb671bb fix 【资源库-校企成果】需要记录创建人,校企成果列表仅展示当前用户创建的数据。后台接口回滚 2025-05-09 16:54:21 +08:00
liuhuazhong 1213aeae77 fix 【资源库-校企成果】需要记录创建人,校企成果列表仅展示当前用户创建的数据 2025-05-09 15:31:17 +08:00
liuhuazhong 3270ae7cdd fix 【资源库】竞赛成果统计数错误 2025-05-09 14:27:30 +08:00
liuhuazhong 10a520bf98 fix 【资源库-成果管理】统计优质专家时需要优化SQL 2025-05-09 11:21:25 +08:00
liuhuazhong 93dd90fc47 fix 【资源库-成果管理】优质专家资源库一系列调整 2025-05-09 10:07:33 +08:00
liuhuazhong c699bc9121 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-09 09:50:27 +08:00
liuhuazhong 25803e31e0 fix 【资源库-成果管理】竞争作品名称拼接 竞赛名称+参赛队长姓名 2025-05-09 09:50:23 +08:00
13036795865 a679a68465 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-09 09:43:55 +08:00
13036795865 779b92dee2 成果负责人对应的人员图片 2025-05-09 09:43:42 +08:00
wanjia9506 06944e2357 Merge pull request '创客任务总浏览量统计' (#866) from wanjia9506/microservices:dev_data_statistics into master 2025-05-09 09:09:09 +08:00
wanjia 15bbfc6d2d feat(数据统计):创客任务总浏览量统计 2025-05-09 09:09:39 +08:00
liuhuazhong b74154e56c Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-09 08:32:14 +08:00
13036795865 efa8bdef79 专家性别以及默认图片 2025-05-08 17:28:14 +08:00
liuhuazhong c54be832a1 fix 【资源库】项目成果存在关联成果但是未展示 2025-05-08 16:05:41 +08:00
13036795865 67f88ffe33 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-08 14:55:14 +08:00
13036795865 12573eaece 数据仓库领域翻译 2025-05-08 14:50:29 +08:00
liuhuazhong f8c3d42a32 fix 【资源库-校企成果】校企成果被删除,对应的成员也应该一并删除、校企成果详情需要显示负责人 2025-05-08 14:29:18 +08:00
13036795865 30f049427f 根据来源与领域搜索数据 2025-05-08 14:04:28 +08:00
13036795865 e6a724627d 专家领域以及专家领域搜索 2025-05-08 11:02:22 +08:00
13036795865 09a284bb10 Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-08 10:19:02 +08:00
13036795865 848fa33136 根据不同数据来源获取对应的领域数据 2025-05-08 10:18:43 +08:00
liuhuazhong e26876b85c fix 【资源库-成果管理首页】资源库-成果管理首页bug修复 2025-05-07 17:08:23 +08:00
liuhuazhong 764f43284d fix 【资源库-成果管理首页】资源库-成果管理首页bug修复 2025-05-07 14:45:54 +08:00
admin b756996639 fix 【资源库-成果管理】列表排序处理、【资源库】游客访问资源库首页,接口401、【资源库-成果管理】项目总数/项目公开数需要去重处理 2025-05-07 09:33:49 +08:00
admin e18efaaacb Merge remote-tracking branch 'origin/feat_chievements_dev' into feat_chievements_dev 2025-05-07 09:19:59 +08:00
13036795865 475756bd0d 根据不同数据来源获取对应的领域数据 2025-05-07 08:54:14 +08:00
admin de341e0aec fix(用户画像) 用户画像逻辑改动 2025-05-06 11:31:07 +08:00
admin 3c557a8dc9 fix(活跃用户资源库) 获取用户资源库相关统计数据 2025-04-30 09:49:03 +08:00
admin 04f43e8f99 fix(活跃用户资源库、活跃用户) 活跃用户资源库、活跃用户 2025-04-29 16:29:17 +08:00
admin ae195dee38 fix(活跃用户资源库) 活跃用户资源库 2025-04-29 09:19:48 +08:00
admin 4c89db1a9e fix(文件清理) 清理无效文件 2025-04-28 11:28:16 +08:00
admin 43c2fcffba feat(开源项目) 根据查询内容,调用搜索行为接口 2025-04-28 10:47:57 +08:00
admin 476dbff76c feat(开源项目相关成果显示) 开源项目相关成果显示接口 2025-04-27 14:08:11 +08:00
admin 492de55aa0 feat(论坛大屏) 论坛大屏接口 2025-04-25 16:23:36 +08:00
admin d2deba6f90 专家联调 2025-04-25 11:34:34 +08:00
admin a5f53b2a83 feat(竞赛大屏) 竞赛大屏接口 2025-04-24 15:37:50 +08:00
admin f62e49ac0a feat(专家大屏) 专家大屏接口 2025-04-24 10:56:39 +08:00
admin f573afac22 专家实名认证逻辑修改 2025-04-24 09:42:25 +08:00
admin 8117cd862e feat(画像行为权重、成果团队) 画像行为权重、成果团队 2025-04-23 17:15:30 +08:00
admin fd2044696e 校企成果表要加一个 成果状态字段 2025-04-23 14:37:18 +08:00
admin 447f744647 feat(大屏V1) 大屏V1接口 2025-04-22 16:42:41 +08:00
admin 7d266a41cd feat(成果详情) 成果详情接口 2025-04-22 11:20:25 +08:00
admin cb286fa3f0 用户画像代码合并、专家资源库逻辑调整 2025-04-18 16:19:15 +08:00
wanjia9506 a36e4b7256 Merge pull request '创客首页数据统计接口' (#864) from wanjia9506/microservices:dev_data_statistics into master 2025-04-18 14:33:29 +08:00
admin ad1b5ca8c4 七日新增统计 2025-04-17 15:55:33 +08:00
admin de02ce787a 热门成果 2025-04-16 17:11:38 +08:00
admin d22795991f 代码合并、近七日用户行为数据 2025-04-16 10:42:48 +08:00
admin 144d5f9e29 代码合并 2025-04-16 08:45:11 +08:00
admin d82b01f514 feat(数据记录): 相关数据记录 2025-04-15 16:34:09 +08:00
admin 430590814c feat(专家): 专家资源库逻辑 2025-04-14 17:28:14 +08:00
liuhuazhong 58dfa24f9c feat(竞赛): 竞赛资源库逻辑 2025-04-11 09:58:00 +08:00
liuhuazhong 553198b554 feat(竞赛): 竞赛资源库逻辑 2025-04-10 14:44:44 +08:00
wanjia 24ecd3953c feat(数据统计):累计奖金金额过滤异常关闭任务 2025-04-10 10:51:29 +08:00
OTTO 992a07f154 feat(项目管理知识库优化): 知识库直接创建的文档需要能下载
Signed-off-by: OTTO <731554297@qq.com>
2025-04-09 14:33:26 +08:00
liuhuazhong 7c8c717699 feat(任务): 任务资源库逻辑 2025-04-09 11:11:44 +08:00
liuhuazhong c3c262caa5 feat(项目): 项目资源库逻辑 2025-04-08 15:44:52 +08:00
liuhuazhong 3650c914be feat(项目): 项目资源库逻辑 2025-04-08 11:34:23 +08:00
OTTO 94061dc01c Merge branch 'third-party-tool-forward' of code.gitlink.org.cn:Gitlink/microservices 2025-04-07 14:37:52 +08:00
otto de54dfff7a Merge pull request '项目管理分支合并主干分支' (#862) from otto/microservices:master into master 2025-04-07 14:30:19 +08:00
wanjia e866c11d46 feat(数据统计):开源项目统计接口访问权限修改 https://pm.osredm.com/osredm/projects/27/bug/2380 2025-04-07 10:35:47 +08:00
OTTO 09d4401583 Merge branch 'product_refact' of code.gitlink.org.cn:Gitlink/microservices into product_refact_merge_master
# Conflicts:
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/service/SoftwareFactStatisticsServiceImpl.java
2025-04-07 10:14:54 +08:00
OTTO ec3db48214 feat(项目管理总览接口开发): 合并主干分支
Signed-off-by: OTTO <731554297@qq.com>
2025-04-07 10:11:15 +08:00
OTTO 75c8d48860 Merge branch 'master' of code.gitlink.org.cn:Gitlink/microservices into product_refact
# Conflicts:
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/constant/Constant.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/ZonePmsProject.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/vo/ProjectSituationVO.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisForgeMapper.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisPmsMapper.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/service/SoftwareFactStatisticsServiceImpl.java
#	microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisForgeMapper.xml
#	microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisPmsMapper.xml
2025-04-07 09:41:19 +08:00
liuhuazhong 6ebf4b4693 feat(校企成果管理): 校企成果管理逻辑 2025-04-03 15:07:21 +08:00
liuhuazhong 346461a63c feat(成果管理): 成果管理逻辑 2025-04-02 17:14:38 +08:00
liuhuazhong 125c068e69 feat(PR推荐): PR推荐逻辑 2025-04-01 15:50:13 +08:00
wanjia 3c29e65c46 feat(数据统计):创客首页数据统计接口 2025-04-01 10:16:53 +08:00
liuhuazhong caeeb6b924 feat(疑修推荐): 疑修推荐 2025-03-28 15:57:01 +08:00
wanjia9506 97a016361d Merge pull request '添加公开上传接口' (#859) from wanjia9506/microservices:kanban_refact into product_refact 2025-03-26 11:27:41 +08:00
wanjia b2d98dabc9 fix(产品):添加公开上传接口 2025-03-26 11:29:58 +08:00
wanjia 99d58df966 fix(产品):添加原始需求公开接口 2025-03-26 10:32:13 +08:00
wanjia9506 83fd822d0e Merge pull request '添加原始需求公开接口' (#857) from wanjia9506/microservices:kanban_refact into product_refact 2025-03-26 10:28:34 +08:00
wanjia 759922b3db fix(产品):添加用户需求公开接口 2025-03-26 10:14:25 +08:00
wanjia9506 7e37ef0a36 Merge pull request '添加原始需求公开接口' (#856) from wanjia9506/microservices:kanban_refact into product_refact 2025-03-26 10:11:08 +08:00
xxq250 e40d9bf5c0 Merge remote-tracking branch 'origin/product_refact' into product_refact 2025-03-26 09:43:15 +08:00
xxq250 e791a3f02a fixed 流水线分组查询时repo_name变更 2025-03-26 09:43:07 +08:00
wanjia ceca31cb5c fix(产品):添加用户需求公开接口 2025-03-26 09:36:45 +08:00
wanjia9506 105ce14327 Merge pull request '添加用户需求公开接口' (#855) from wanjia9506/microservices:kanban_refact into product_refact 2025-03-26 09:34:10 +08:00
wanjia 6a46e8dfdf fix(组织工作台):看板里程碑按开始时间排序 2025-03-26 09:22:46 +08:00
wanjia e1f73ed177 fix(产品):添加用户需求公开接口 2025-03-26 09:22:04 +08:00
wanjia9506 1eacfa7e9e Merge pull request '看板里程碑按开始时间排序+添加用户需求公开接口' (#854) from wanjia9506/microservices:kanban_refact into product_refact 2025-03-26 09:20:26 +08:00
xxq250 67318f6d0f fixed 流水线分组查询时repo_name变更 2025-03-26 09:08:03 +08:00
wanjia f460559674 Merge remote-tracking branch 'main/product_refact' into kanban_refact 2025-03-26 08:36:25 +08:00
wanjia9506 5c67195157 Merge pull request 'fix(软件工厂): 最多缺陷个人改为最多缺陷解决个人;测试用例执行数统计错误' (#853) from xjy_software_fact_statis into master 2025-03-25 11:23:36 +08:00
wanjia9506 24b98366ab Merge pull request 'fix(软件工厂): 最多缺陷个人改为最多缺陷解决个人;测试用例执行数统计错误' (#852) from liuhuazhong/microservices:xjy_software_fact_statis into xjy_software_fact_statis 2025-03-25 10:23:48 +08:00
liuhuazhong c0a5ff23fe fix(软件工厂): 最多缺陷个人改为最多缺陷解决个人;测试用例执行数统计错误 2025-03-25 10:16:49 +08:00
liuhuazhong 40a1374c40 feat(项目资源库): 项目与用户行为数据 2025-03-21 17:22:02 +08:00
OTTO 8da6005d9f feat(项目管理总览接口开发): 增加项目成员数量属性返回
Signed-off-by: OTTO <731554297@qq.com>
2025-03-21 14:29:59 +08:00
otto b5b228a3da Merge pull request '增加项目成员数量属性返回' (#851) from otto/microservices:product_refact into product_refact 2025-03-21 14:26:53 +08:00
OTTO 40b6256204 feat(项目管理总览接口开发): 完成项目管理总览接口开发
Signed-off-by: OTTO <731554297@qq.com>
2025-03-21 11:20:09 +08:00
liuhuazhong 7b8c8694ff feat(竞赛资源库): 竞赛与用户行为数据 2025-03-21 11:09:53 +08:00
liuhuazhong f798cae717 feat(任务资源库): 任务与用户行为数据 2025-03-21 09:01:08 +08:00
otto 08096df571 Merge pull request 'feat(项目管理适配线上环境): 打印请求Forge响应异常日志' (#849) from otto/microservices:master into master 2025-03-20 14:12:58 +08:00
OTTO f0e01ecaf6 feat(项目管理适配线上环境): 打印请求Forge响应异常日志
Signed-off-by: OTTO <731554297@qq.com>
2025-03-20 14:10:32 +08:00
otto cf9c1b5ade Merge pull request '项目管理产品需求改版' (#848) from otto/microservices:master into master 2025-03-20 09:41:54 +08:00
OTTO 03a11ab7df Merge branch 'product_refact' of code.gitlink.org.cn:Gitlink/microservices into product_refact_deliver 2025-03-20 09:35:19 +08:00
OTTO 123d967254 feat(项目管理适配线上环境): 修复变更时无法删除附件的问题
Signed-off-by: OTTO <731554297@qq.com>
2025-03-19 11:11:19 +08:00
OTTO 729cdb8017 feat(项目管理适配线上环境): 修复基于产品需求创建项目计划报错的问题
Signed-off-by: OTTO <731554297@qq.com>
2025-03-19 10:47:28 +08:00
OTTO 689229801c feat(项目管理适配线上环境): 合并主干分支代码
Signed-off-by: OTTO <731554297@qq.com>
2025-03-18 17:07:55 +08:00
OTTO 1498f93a06 Merge branch 'master' of code.gitlink.org.cn:Gitlink/microservices into product_refact_deliver 2025-03-18 17:07:40 +08:00
OTTO 904a1b551c Merge branch 'master' of code.gitlink.org.cn:otto/microservices into product_refact_deliver
# Conflicts:
#	microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/constant/CacheConstants.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/pipeline/controller/PmsCiPipelinesController.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/pipeline/service/IPmsCiPipelinesService.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/pipeline/service/impl/PmsCiPipelinesServiceImpl.java
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java
2025-03-18 17:03:23 +08:00
OTTO 06bf1c2910 feat(项目管理适配线上环境): 项目计划逻辑调整
1. 若项目未关联产品允许新增项目计划
2. 若项目未关联产品允许编辑项目计划

Signed-off-by: OTTO <731554297@qq.com>
2025-03-18 14:12:50 +08:00
OTTO 509de16d62 feat(项目管理适配线上环境): 项目若已关联产品不允许取消或修改关联
Signed-off-by: OTTO <731554297@qq.com>
2025-03-18 10:20:26 +08:00
otto 17c3882691 Merge pull request '软件工厂统计、专区数据统计能力上线' (#843) from xjy_software_fact_statis into master 2025-03-14 14:17:18 +08:00
otto 5ae14817fd Merge pull request '软件工程统计接口,移至OpenController' (#842) from liuhuazhong/microservices:xjy_software_fact_statis into xjy_software_fact_statis 2025-03-14 09:32:04 +08:00
liuhuazhong 99c029c593 软件工程统计接口,移至OpenController 2025-03-14 09:22:17 +08:00
otto e51799addd Merge pull request '专区数据统计能力上线' (#841) from liuhuazhong/microservices:xjy_software_fact_statis into xjy_software_fact_statis 2025-03-13 15:03:26 +08:00
liuhuazhong b8fbf94be6 feat(专区数据统计能力上线): 近一周的文章新增发布数、近一周PV数(总访问量)、近一周UV数(点击去重) 2025-03-13 14:28:20 +08:00
otto a86763af9d Merge pull request '软件工厂统计' (#840) from liuhuazhong/microservices:xjy_software_fact_statis into xjy_software_fact_statis 2025-03-11 15:50:47 +08:00
liuhuazhong 7a4abfa7e9 feat(软件工厂统计): 今日工作态势、周月工作态势、项目研发状态 2025-03-11 15:13:29 +08:00
otto 82722dec2c Merge pull request 'Sentinel登录状态默认30分钟失效,将Sentinel Token缓存过期时间调整为28分钟' (#839) from otto/microservices:master into master 2025-03-07 17:05:26 +08:00
OTTO e40d58ae9d feat(微服务治理工具): 优化Sentinel免登录逻辑
Sentinel登录状态默认30分钟失效,将Sentinel Token缓存过期时间调整为28分钟

Signed-off-by: OTTO <731554297@qq.com>
2025-03-07 15:33:22 +08:00
OTTO 4c8be09a72 feat(微服务治理工具): 优化portainer转发逻辑
修复拦截portainer中URL中携带endpoints的请求时,未考虑endpoints在末尾的情况

Signed-off-by: OTTO <731554297@qq.com>
2025-03-07 14:00:16 +08:00
otto 686df768bf Merge pull request '修复拦截portainer中URL中携带endpoints的请求时,未考虑endpoints在末尾的情况' (#838) from otto/microservices:master into master 2025-03-07 13:57:05 +08:00
otto 597b3e3c14 Merge pull request '微服务治理工具处理' (#837) from otto/microservices:master into master 2025-03-07 11:10:47 +08:00
OTTO c179173b74 feat(微服务治理工具): 优化portainer转发逻辑
1. 清理用户Cookie中携带的portainer_api_key参数,防止该参数转发到portainer后导致的JWT Token无效的问题
2. 处理portainer指定endpoints的问题:拦截portainer中URL中携带endpoints的请求,将请求中的endpoints替换为Nacos中配置的参数,防止环境变更导致数据失效

Signed-off-by: OTTO <731554297@qq.com>
2025-03-07 11:07:05 +08:00
otto 713104e353 Merge pull request 'feat(微服务治理工具): 优化portainer转发逻辑' (#836) from otto/microservices:third-party-tool-forward into third-party-tool-forward 2025-03-07 11:04:59 +08:00
OTTO 5dbed2684c feat(微服务治理工具): 优化代码格式
Signed-off-by: OTTO <731554297@qq.com>
2025-03-07 09:56:36 +08:00
OTTO d81093a51a feat(微服务治理工具): 登录状态异常拦截
当Nacos返回异常状态码时,且body数据类型为JSON时,从JSON中取出message字段作为异常响应信息,若不存在该字段则返回默认的错误信息

Signed-off-by: OTTO <731554297@qq.com>
2025-03-07 08:55:44 +08:00
otto 05533c9475 Merge pull request '当Nacos返回异常状态码时,且body数据类型为JSON时,从JSON中取出message字段作为异常响应信息,若不存在该字段则返回默认的错误信息' (#835) from otto/microservices:third-party-tool-forward into third-party-tool-forward 2025-03-07 08:52:29 +08:00
OTTO 209c96bc48 feat(微服务治理工具): 删除无效配置
Signed-off-by: OTTO <731554297@qq.com>
2025-03-06 16:52:03 +08:00
OTTO a7da00e34c Merge branch 'master' of code.gitlink.org.cn:Gitlink/microservices into third-party-tool-forward 2025-03-06 16:51:28 +08:00
OTTO 8dec06e520 feat(微服务治理工具): 登录状态异常拦截
记录鉴权异常信息

Signed-off-by: OTTO <731554297@qq.com>
2025-03-06 16:49:29 +08:00
otto 63e9d65b60 Merge pull request 'feat(微服务治理工具): 登录状态异常拦截处理' (#834) from otto/microservices:third-party-tool-forward into third-party-tool-forward 2025-03-06 16:48:57 +08:00
OTTO e4264c87a0 feat(微服务治理工具): 登录状态异常拦截
1. portainer发生异常返回错误码时进行拦截,返回标准化错误信息,同时记录异常日志
2. portainer Token失效时,清理Redis中portainer Token
3. 检测到sentinel返回403状态码时(大概率为Toke失效或过期),清理Redis中sentinel Token,返回标准化错误信息,同时记录异常日志

Signed-off-by: OTTO <731554297@qq.com>
2025-03-06 16:47:26 +08:00
OTTO 5b43d5c33b feat(微服务治理工具): 登录状态异常拦截
nacosToken失效时清理Redis中nacosToken并返回标准的状态码

Signed-off-by: OTTO <731554297@qq.com>
2025-03-06 16:43:39 +08:00
OTTO d8645f34e4 feat(微服务治理工具): 网关异常时记录错误日志
Signed-off-by: OTTO <731554297@qq.com>
2025-03-06 16:41:35 +08:00
OTTO b5d2376beb feat(微服务治理工具): 优化微服务治理工具转发逻辑
1. 优化代码结构
2. 当对象不存在时返回标准的错误信息

Signed-off-by: OTTO <731554297@qq.com>
2025-03-06 16:40:21 +08:00
OTTO 3b8e443296 feat(微服务治理工具): 处理Nacos异常响应格式非标准化的问题
将异常信息设置为常量,统一响应消息

Signed-off-by: OTTO <731554297@qq.com>
2025-03-06 16:38:39 +08:00
OTTO 2e44e2b24e fix(制品库优化): 修复产品版本标签正则表达式错误的问题
Signed-off-by: OTTO <731554297@qq.com>
2025-03-03 10:38:37 +08:00
otto d759a5d913 Merge pull request 'fix(制品库优化): 修复产品版本标签正则表达式错误的问题' (#833) from otto/microservices:product_refact into product_refact 2025-03-03 10:35:31 +08:00
OTTO 1140566a51 feat(微服务治理工具): 处理Nacos异常响应格式非标准化的问题
限制仅当异常响应时才对错误信息进行标准化处理

Signed-off-by: OTTO <731554297@qq.com>
2025-02-25 10:41:17 +08:00
otto 103beae4d8 Merge pull request '限制仅当异常响应时才对错误信息进行标准化处理' (#832) from otto/microservices:third-party-tool-forward into third-party-tool-forward 2025-02-25 10:38:09 +08:00
OTTO 61db706e02 feat(微服务治理工具): 当请求为Nacos时,Nacos返回的所有非JSON响应都会被自动转换为结构化的错误信息,同时将HTTP状态码设置为200,适合用于规范化微服务架构的响应格式。
Signed-off-by: OTTO <731554297@qq.com>
2025-02-24 17:02:53 +08:00
otto edb5e65035 Merge pull request '当请求为Nacos时,Nacos返回的所有非JSON响应都会被自动转换为结构化的错误信息,同时将HTTP状态码设置为200,适合用于规范化微服务架构的响应格式。' (#831) from otto/microservices:third-party-tool-forward into third-party-tool-forward 2025-02-24 17:02:22 +08:00
OTTO 9178cda289 feat(微服务治理工具): 优化第三方工具请求时,登录失败的异常提示信息
Signed-off-by: OTTO <731554297@qq.com>
2025-02-21 15:00:25 +08:00
OTTO e21c8b451e fix(产品模块): 模块处的需求数量统计错误
计算产品需求的配置项模块的所有需求时,通过数据库查询不包含无所属模块以及非固定模块的需求数量来统计

Signed-off-by: OTTO <731554297@qq.com>
2025-02-19 15:05:15 +08:00
otto 2a7ab04e08 Merge pull request 'fix(产品模块): 模块处的需求数量统计错误' (#830) from otto/microservices:product_refact into product_refact 2025-02-19 15:02:13 +08:00
OTTO 6d547cd0df fix(产品模块): 模块处的需求数量统计错误
计算产品需求的配置项模块的所有需求时,通过数据库查询不包含无所属模块以及非固定模块的需求数量来统计

Signed-off-by: OTTO <731554297@qq.com>
2025-02-19 09:22:20 +08:00
otto 601f87273f Merge pull request '计算产品需求的配置项模块的所有需求时,通过数据库查询不包含无所属模块以及非固定模块的需求数量来统计' (#829) from otto/microservices:product_refact into product_refact 2025-02-19 09:19:13 +08:00
OTTO 65ea36f889 fix(产品模块): 模块处的需求数量统计错误
无所属模块查询使用-1进行查询

Signed-off-by: OTTO <731554297@qq.com>
2025-02-19 08:43:18 +08:00
otto 9ed4ce2cc2 Merge pull request '无所属模块查询使用-1进行查询' (#828) from otto/microservices:product_refact into product_refact 2025-02-19 08:40:13 +08:00
OTTO 48ddc9ccdb fix(产品模块): 模块处的需求数量统计错误
无所属模块查询使用-1进行查询

Signed-off-by: OTTO <731554297@qq.com>
2025-02-18 16:57:55 +08:00
otto 2b7bbdf512 Merge pull request '无所属模块查询使用-1进行查询' (#827) from otto/microservices:product_refact into product_refact 2025-02-18 16:54:46 +08:00
OTTO 44d78caca1 fix(产品模块): 模块处的需求数量统计错误
优化配置项需求名称显示

Signed-off-by: OTTO <731554297@qq.com>
2025-02-18 16:50:33 +08:00
otto de1bb39187 Merge pull request '优化配置项需求名称显示' (#826) from otto/microservices:product_refact into product_refact 2025-02-18 16:47:24 +08:00
OTTO 8e51a872ba fix(制品库优化): 打包文件时需对Nexus下载地址进行urlEncode处理
Signed-off-by: OTTO <731554297@qq.com>
2025-02-18 15:34:30 +08:00
otto 133d821023 Merge pull request 'fix(制品库优化): 打包文件时需对Nexus下载地址进行urlEncode处理' (#825) from otto/microservices:product_refact into product_refact 2025-02-18 15:31:27 +08:00
OTTO f2238aec52 fix(产品模块): 模块处的需求数量统计错误
无所属模块查询使用-1进行查询

Signed-off-by: OTTO <731554297@qq.com>
2025-02-18 15:12:48 +08:00
otto 041ca0c542 Merge pull request '无所属模块查询使用-1进行查询' (#824) from otto/microservices:product_refact into product_refact 2025-02-18 15:09:52 +08:00
OTTO efa45f7d79 fix(产品模块): 模块处的需求数量统计错误
计算产品需求的配置项模块的所有需求时,通过数据库查询不包含无所属模块以及非固定模块的需求数量来统计

Signed-off-by: OTTO <731554297@qq.com>
2025-02-17 17:31:33 +08:00
otto ac5f3d9821 Merge pull request '计算产品需求的配置项模块的所有需求时,通过数据库查询不包含无所属模块以及非固定模块的需求数量来统计' (#823) from otto/microservices:product_refact into product_refact 2025-02-17 17:28:23 +08:00
OTTO 4058e652a0 fix(制品库优化): 产品库移入文档时若文档内容为空则设置文档的文件内容为空字符串
Signed-off-by: OTTO <731554297@qq.com>
2025-02-17 17:10:00 +08:00
otto b8e13f2b97 Merge pull request 'fix(制品库优化): 产品库移入文档时若文档内容为空则设置文档的文件内容为空字符串' (#822) from otto/microservices:product_refact into product_refact 2025-02-17 17:08:10 +08:00
OTTO a55a4985d9 fix(产品模块): 模块处的需求数量统计错误
固定模块、其他需求需要和配置项模块同级

Signed-off-by: OTTO <731554297@qq.com>
2025-02-17 16:50:10 +08:00
otto dcdc523474 Merge pull request 'fix(文件服务): 修复通过文件标识下载接口异常' (#821) from otto/microservices:hotFix into master 2025-02-17 15:08:12 +08:00
OTTO ee558dd5be fix(文件服务): 修复通过文件标识下载接口异常
Signed-off-by: OTTO <731554297@qq.com>
2025-02-17 15:11:00 +08:00
OTTO ca9d80e111 fix(文件服务): 修复通过文件标识下载接口异常
Signed-off-by: OTTO <731554297@qq.com>
2025-02-17 15:07:18 +08:00
OTTO 03edc8ac49 fix(制品库优化): 通过产品库下载文档,中文名称乱码
通过修正请求Nexus参数的编码,修复中文乱码问题

Signed-off-by: OTTO <731554297@qq.com>
2025-02-17 10:43:54 +08:00
OTTO c50f157682 fix(制品库优化): 单独下载产品制品,实际下载结果与预期不符
修复前端传参错误导致打包失败的问题

Signed-off-by: OTTO <731554297@qq.com>
2025-02-17 09:51:05 +08:00
OTTO bda485b970 Merge branch 'product_refact' of code.gitlink.org.cn:otto/microservices into product_refact 2025-02-12 11:46:09 +08:00
OTTO bc183b6c25 Merge branch 'product_refact' of code.gitlink.org.cn:Gitlink/microservices into product_refact 2025-02-12 11:45:50 +08:00
OTTO 3dea48610d fix(制品库优化): 优化制品移入产品库逻辑
制品文件下载成功后,同时将制品文件标识更新到制品assetId相同的制品中

Signed-off-by: OTTO <731554297@qq.com>
2025-02-12 11:45:31 +08:00
OTTO e5c3e2d999 fix(制品库优化): 修复制品移入产品库逻辑
制品文件下载成功后,同时将制品文件标识更新到制品assetId相同的制品中

Signed-off-by: OTTO <731554297@qq.com>
2025-02-12 11:45:14 +08:00
otto ed33e52aaa Merge pull request 'fix(制品库优化): 优化制品移入产品库逻辑' (#820) from otto/microservices:product_refact into product_refact 2025-02-12 11:43:37 +08:00
OTTO 2d4392bfb2 fix(制品库优化): 修复制品移入产品库逻辑
当需要移入的制品文件未存在于文件服务中时,通过文件服务下载该文件,并返回文件标识,通过文件标识再将文件上传到nexus

Signed-off-by: OTTO <731554297@qq.com>
2025-02-12 11:34:21 +08:00
OTTO 294e60a961 Merge branch 'product_refact' of code.gitlink.org.cn:Gitlink/microservices into product_refact 2025-02-12 09:07:53 +08:00
OTTO 8ad3f51ce8 feat(产品需求调整): 用户需求调整为原始需求
Signed-off-by: OTTO <731554297@qq.com>
2025-02-12 09:07:14 +08:00
otto 911205db54 Merge pull request 'feat(产品需求调整): 用户需求调整为原始需求' (#819) from otto/microservices:product_refact into product_refact 2025-02-12 09:05:01 +08:00
OTTO 74112e2f35 feat(产品需求调整): 需求规格调整为需求
Signed-off-by: OTTO <731554297@qq.com>
2025-02-11 17:18:02 +08:00
otto abd7ef7e82 Merge pull request 'feat(产品需求调整): 需求规格调整为需求' (#818) from otto/microservices:product_refact into product_refact 2025-02-11 17:14:54 +08:00
OTTO 20ecc7157f fix(制品库优化): 软件包调整为制品
Signed-off-by: OTTO <731554297@qq.com>
2025-02-11 16:57:58 +08:00
otto 68fdfdcd5c Merge pull request 'fix(制品库优化): 软件包调整为制品' (#817) from otto/microservices:product_refact into product_refact 2025-02-11 16:55:19 +08:00
OTTO ba1e16337d fix(制品库优化): 修复异步打包逻辑
异步打包时未打包完成就错误的删除了redis中的键值导致打包失败

Signed-off-by: OTTO <731554297@qq.com>
2025-02-11 16:17:49 +08:00
otto 7a0ca0bef4 Merge pull request '异步打包时未打包完成就错误的删除了redis中的键值导致打包失败' (#816) from otto/microservices:product_refact into product_refact 2025-02-11 16:15:21 +08:00
OTTO d58e359798 Merge branch 'product_refact' of code.gitlink.org.cn:Gitlink/microservices into product_refact
# Conflicts:
#	microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/pipeline/service/impl/PmsCiPipelinesServiceImpl.java
2025-02-11 15:51:02 +08:00
OTTO f72c3684fe feat(流水线功能完善): 提供流水线id查询接口
Signed-off-by: OTTO <731554297@qq.com>
2025-02-11 15:49:58 +08:00
otto 9870f0f376 Merge pull request 'feat(流水线功能完善): 提供流水线id查询接口' (#815) from otto/microservices:product_refact into product_refact 2025-02-11 15:49:24 +08:00
OTTO 1000c7fed5 feat(制品库优化): 获取制品列表时若制品来源于流水线需展示相关信息
获取制品列表时若制品来源于流水线则设置制品的来源标签

Signed-off-by: OTTO <731554297@qq.com>
2025-02-10 15:53:19 +08:00
otto 5d05da7d03 Merge pull request 'feat(制品库优化): 获取制品列表时若制品来源于流水线需展示相关信息' (#814) from otto/microservices:product_refact into product_refact 2025-02-10 15:50:43 +08:00
OTTO c271179b43 feat(制品库优化): 获取制品列表时若制品来源于流水线需展示相关信息
raw类型制品上传时设置制品在Nexus的AssetId

Signed-off-by: OTTO <731554297@qq.com>
2025-02-10 15:15:28 +08:00
xxq250 9e898e64c8 增加流水线执行详情查询,查询 2025-01-24 08:58:45 +08:00
xxq250 ef8590c387 增加流水线执行详情查询,取值键值 2025-01-24 08:51:08 +08:00
xxq250 8c97e600a1 增加流水线执行详情查询,文件名拼接url 2025-01-24 08:25:40 +08:00
xxq250 4ae505ae40 增加流水线执行详情查询,文件名拼接 2025-01-23 17:43:02 +08:00
xxq250 9cdc4622ad 增加流水线执行详情查询,排序 2025-01-23 17:36:46 +08:00
xxq250 ef9c77e842 增加流水线执行详情查询,排序 2025-01-23 17:26:52 +08:00
OTTO 573c97f4d9 feat(产品库优化): 受控库列表的制品要识别是否为流水线生成
通过fromType和attributes设置来源为流水线的相关数据

关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124516

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 17:09:50 +08:00
xxq250 79fe1c2515 Merge remote-tracking branch 'origin/product_refact' into product_refact 2025-01-23 16:59:13 +08:00
xxq250 6fc19138bb 增加流水线执行详情查询sql 2025-01-23 16:59:09 +08:00
OTTO b197668782 feat(产品库优化): 受控库列表的制品要识别是否为流水线生成
通过fromType和attributes设置来源为流水线的相关数据

关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124516

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 16:51:22 +08:00
otto adba40d1b5 Merge pull request '受控库列表的制品要识别是否为流水线生成' (#813) from otto/microservices:product_refact into product_refact 2025-01-23 16:50:06 +08:00
xxq250 cc679fed0a Merge remote-tracking branch 'origin/product_refact' into product_refact 2025-01-23 16:48:46 +08:00
xxq250 782e2e7e5a 增加流水线执行详情查询 2025-01-23 16:48:40 +08:00
OTTO e3e6d37fd4 feat(产品库优化): 产品库应当区分文档与制品
修复当打包文件标识异常或打包异常时无法将文件标识置空的bug

关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124517

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 16:34:25 +08:00
otto 3268dc9fb8 Merge pull request '修复当打包文件标识异常或打包异常时无法将文件标识置空的bug' (#812) from otto/microservices:product_refact into product_refact 2025-01-23 16:32:04 +08:00
OTTO b6e5742188 feat(产品库优化): 产品库应当区分文档与制品
产品库打包支持打包所有文件、打包软件包和打包文档

关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124517

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 16:11:22 +08:00
otto a528956dd5 Merge pull request '产品库打包支持打包所有文件、打包软件包和打包文档' (#811) from otto/microservices:product_refact into product_refact 2025-01-23 16:08:52 +08:00
OTTO 366118bca0 feat(产品库优化): 产品库应当区分文档与制品
产品库打包接口新增node参数代表打包节点(Software:打包软件包;Document:打包文档;不传或传其他值:打包所有)

关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124517

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 15:00:51 +08:00
otto f484b14bcd Merge pull request '产品库应当区分文档与制品' (#810) from otto/microservices:product_refact into product_refact 2025-01-23 14:59:45 +08:00
OTTO 8e6620ad2e feat(产品库优化): 优化产品库打包功能
1. 文件服务开始打包时创建redis key(0:代表打包未完成;1:代表打包已完成;-1:代表打包失败,需要重新打包)
2. 异步执行打包任务时,若发生任何异常则将key值设置为-1,若打包完成则将key值设为1
3. 调用获取打包文件下载接口时,检查redis key值;若键值不存在或键值为1,代表打包成功,通过远程接口获取文件信息;若键值为-1,代表打包失败,需要重新打包;若调用远程接口获取文件信息失败仍提示用户打包失败需要重新打包

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 14:28:32 +08:00
OTTO 0d63456fb9 feat(产品库优化): 产品库应当区分文档与制品
1. 普通制品和Docker制品移入产品库时默认添加前缀Software
2. 文档制品移入产品库时默认添加前缀Document

关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124517

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 11:19:17 +08:00
OTTO 9a1b5e0125 feat(产品库优化): 产品库应当区分文档与制品
1. 产品库/制品库增加字段:来源类型
2. 产品库移入文档时将来源类型设置为文档

关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124517

Signed-off-by: OTTO <731554297@qq.com>
2025-01-23 11:01:24 +08:00
otto 5b8524936a Merge pull request '修复产品库移入制品时若制品为中文会被urlEncode两次导致中文无法正常显示' (#809) from otto/microservices:product_refact into product_refact 2025-01-22 11:33:29 +08:00
OTTO a56a63ca78 fix(产品库优化): 修复产品库移入制品时若制品为中文会被urlEncode两次导致中文无法正常显示
修复方案:urlEncode前判断字符串是否已经被urlEncode过
1. 使用URLDecoder.decode对字符串进行解码。
2. 再使用URLEncoder.encode对解码后的字符串重新编码。
3. 如果重新编码后的字符串与原始字符串相同,则说明原始字符串是经过URL编码的

Signed-off-by: OTTO <731554297@qq.com>
2025-01-22 11:15:33 +08:00
OTTO bf5e152432 feat(产品需求重构): 产品需求(用户需求+需求规格)评审时间错误
关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/bug/124540

Signed-off-by: OTTO <731554297@qq.com>
2025-01-21 11:38:36 +08:00
otto 2b915c52a2 Merge pull request '产品需求(用户需求+需求规格)评审时间错误' (#808) from otto/microservices:product_refact into product_refact 2025-01-21 11:36:37 +08:00
wanjia9506 bdb9b6ea6d Merge pull request '产品需求、产品规格默认值' (#807) from wanjia9506/microservices:kanban_refact into product_refact 2025-01-21 11:21:24 +08:00
wanjia a0a1ec3d3d fix(组织工作台):产品需求、产品规格默认值 2025-01-21 11:23:21 +08:00
wanjia 67dae46b22 fix(知识库):校验组织内是否存在同名知识库逻辑修复 2025-01-21 09:59:12 +08:00
wanjia9506 83f65cfd3d Merge pull request '校验组织内是否存在同名知识库逻辑修复' (#806) from wanjia9506/microservices:kanban_refact into product_refact 2025-01-21 09:57:28 +08:00
wanjia 40bc06fc11 fix(知识库):校验组织内是否存在同名知识库逻辑修复 2025-01-21 09:56:38 +08:00
wanjia 1d99323465 fix(知识库):我收藏的知识库筛选问题 2025-01-21 09:25:34 +08:00
wanjia9506 de1832bdd8 Merge pull request '我收藏的知识库筛选问题' (#805) from wanjia9506/microservices:kanban_refact into product_refact 2025-01-21 09:23:07 +08:00
otto 8d4c00c9a0 Merge pull request '需求规格模块中无所属模块调整为其他需求' (#804) from otto/microservices:product_refact into product_refact 2025-01-16 14:00:40 +08:00
OTTO ef476d06a8 feat(产品需求重构): 需求规格模块中无所属模块调整为其他需求
关联Issue:https://pm.gitlink.org.cn/Gitlink/projects/228/demand/124520

Signed-off-by: OTTO <731554297@qq.com>
2025-01-16 14:00:24 +08:00
wanjia 730b8b30ed fix(组织工作台):我负责的产品数统计 2025-01-16 11:45:43 +08:00
wanjia9506 9cb2ca13cb Merge pull request '我负责的产品数统计' (#803) from wanjia9506/microservices:kanban_refact into product_refact 2025-01-16 11:43:19 +08:00
OTTO 01bf425689 feat(产品需求重构): 产品需求关联项目不允许修改
Signed-off-by: OTTO <731554297@qq.com>
2025-01-16 11:22:03 +08:00
otto e488744927 Merge pull request '产品需求关联项目不允许修改' (#802) from otto/microservices:product_refact into product_refact 2025-01-16 11:19:57 +08:00
wanjia c28437cdd0 Merge remote-tracking branch 'main/product_refact' into kanban_refact 2025-01-16 10:51:32 +08:00
wanjia9506 9a43dd80fe Merge pull request '用户需求、需求规格统计完成率修正' (#801) from wanjia9506/microservices:kanban_refact into product_refact 2025-01-16 10:49:35 +08:00
wanjia 9c89e97287 fix(组织工作台):用户需求、需求规格统计完成率修正 2025-01-16 10:48:23 +08:00
OTTO 4ea5406c48 feat(产品计划重构): 产品计划修改为产品里程碑
Signed-off-by: OTTO <731554297@qq.com>
2025-01-16 09:27:47 +08:00
otto 6235bb6fe0 Merge pull request '产品计划修改为产品里程碑' (#800) from otto/microservices:product_refact into product_refact 2025-01-16 09:26:54 +08:00
wanjia9506 433e7d90b2 Merge pull request '数据可视化监测' (#799) from wanjia9506/microservices:dev_data_statistics into master 2025-01-15 15:22:23 +08:00
wanjia 41e3817454 feat(数据可视化监测):开源项目全局统计缓存key数据修改 2025-01-15 15:24:29 +08:00
wanjia c8827c7c56 feat(数据可视化监测):日志存放位置校正 2025-01-15 11:27:41 +08:00
wanjia9506 f4844589c2 Merge pull request '日志存放位置校正' (#798) from wanjia9506/microservices:dev_data_statistics into master 2025-01-15 11:25:29 +08:00
wanjia9506 85905bb92d Merge pull request '问题修复' (#797) from wanjia9506/microservices:kanban_refact into product_refact 2025-01-15 09:55:56 +08:00
wanjia 8707f0ee89 Merge remote-tracking branch 'main/product_refact' into kanban_refact 2025-01-15 09:55:05 +08:00
wanjia 182db3e872 feat(组织工作台):#124149 我的产品 需求规格统计数修正 2025-01-15 09:27:31 +08:00
wanjia a9a75dc100 feat(组织工作台):产品统计状态修正 2025-01-15 09:05:06 +08:00
otto cc455e7d9f Merge pull request '产品库的产品版本调整产品版本标识逻辑' (#796) from otto/microservices:product_refact into product_refact 2025-01-14 15:48:52 +08:00
OTTO a71d14b570 feat(制品库调整): 产品库的产品版本调整产品版本标识逻辑
版本标识生成规则调整为(产品标识-产品版本号-产品版本标签)

Signed-off-by: OTTO <731554297@qq.com>
2025-01-14 15:47:38 +08:00
otto 96dfb1d856 Merge pull request '查询产品列表时返回自定义标识' (#793) from otto/microservices:product_refact into product_refact 2025-01-08 14:36:21 +08:00
OTTO 6bb968ec5e fix(Bug修复): 修复产品标识由用户自定义后可能在不同组织下存在相同产品标识的问题
查询产品列表时返回自定义标识

Signed-off-by: OTTO <731554297@qq.com>
2025-01-08 14:39:00 +08:00
OTTO 33ffe1bfb4 fix(Bug修复): 修复产品标识由用户自定义后可能在不同组织下存在相同产品标识的问题
1. 新增字段:自定义标识,用户输入的自定义标识填充到该字段中,原产品标识还是自动生成
2. 需求规格标识根据自定义标识来生成

Signed-off-by: OTTO <731554297@qq.com>
2025-01-08 14:34:37 +08:00
otto feb40410f8 Merge pull request 'fix(Bug修复): 修复产品标识由用户自定义后可能在不同组织下存在相同产品标识的问题' (#792) from otto/microservices:product_refact into product_refact 2025-01-08 14:33:06 +08:00
OTTO 24c1bfedba fix(Bug修复): 修复项目经理无权限创建项目的bug
Signed-off-by: OTTO <731554297@qq.com>
2025-01-06 13:56:48 +08:00
otto beac1b54bb Merge pull request '修复项目经理无权限创建项目的bug' (#791) from otto/microservices:product_refact into product_refact 2025-01-06 13:54:33 +08:00
wanjia 456b0acd48 feat(数据可视化监测):创客任务任务排行返回任务id 2025-01-03 14:44:51 +08:00
wanjia9506 0d3c77ef80 Merge pull request '创客任务任务排行返回任务id' (#790) from wanjia9506/microservices:dev_data_statistics into master 2025-01-03 14:42:57 +08:00
wanjia9506 20e6750448 Merge pull request '数据可视化监测问题修复' (#789) from wanjia9506/microservices:dev_data_statistics into master 2025-01-03 14:09:44 +08:00
wanjia 16137b91f0 feat(数据可视化监测):创客任务操作日志返回任务id 2025-01-02 16:49:09 +08:00
wanjia b1a6100d4f feat(数据可视化监测):开源项目最新动态默认条数 2025-01-02 16:48:49 +08:00
OTTO f695700777 feat(软件发展新技术课题联调): 产品库逻辑调整
产品库不限制名称是否重复

Signed-off-by: OTTO <731554297@qq.com>
2024-12-27 16:14:45 +08:00
otto 7956e028a9 Merge pull request '产品库不限制名称是否重复' (#788) from otto/microservices:product_refact into product_refact 2024-12-27 16:14:38 +08:00
xxq250 ac7e9208cb 增加流水线执行测试报告结果查询Get 2024-12-18 10:49:50 +08:00
xxq250 54923e2b96 增加流水线执行测试报告结果查询 2024-12-18 10:39:24 +08:00
otto cb7c77df74 Merge pull request '调用第三方微服务' (#776) from otto/microservices:dev into dev 2024-12-17 15:23:36 +08:00
otto 21f91261ba Merge pull request '调用第三方微服务' (#8) from master_micro_ops into dev 2024-12-17 15:22:52 +08:00
OTTO fbc1a5cfc2 Merge branch 'master' of code.gitlink.org.cn:Gitlink/microservices into dev 2024-12-17 15:23:04 +08:00
OTTO ca1ee3bef1 Merge branch 'master' of code.gitlink.org.cn:Gitlink/microservices into master_micro_ops 2024-12-17 14:29:02 +08:00
OTTO fa4d727623 Merge branch 'dev' of code.gitlink.org.cn:Gitlink/microservices into master_micro_ops
# Conflicts:
#	microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/constant/CacheConstants.java
2024-12-17 14:28:43 +08:00
wanjia9506 5813592695 Merge pull request '数据可视化监测' (#774) from wanjia9506/microservices:dev_data_statistics into master 2024-12-16 15:23:42 +08:00
wanjia 15e656fb4d feat(项目文档):权限重构 2024-12-16 15:12:57 +08:00
wanjia 2165e73c88 feat(数据可视化监测):管理员身份调用gitlink统计接口 2024-12-16 14:15:54 +08:00
wanjia 2fb09332c6 feat(数据可视化监测):权限控制,可视化仅gitlink管理员可见 2024-12-16 13:48:56 +08:00
wanjia 8a3777e0f2 feat(数据可视化监测):创客日志返回时间,已支付总金额字段修改 2024-12-16 13:46:54 +08:00
wanjia f3d772feb6 feat(数据可视化监测):项目动态、项目排行、用户排行 2024-12-14 11:31:44 +08:00
otto 7c4a6f1eea Merge pull request 'feat(流水线解析): 增加对工具类节点的解析' (#738) from liuhuazhong/microservices:dev into dev 2024-12-12 09:16:11 +08:00
wanjia d4ba19f707 feat(数据可视化监测):项目、创客空间数据可视化 2024-12-02 11:42:05 +08:00
liuhuazhong da1ec52f91 feat(流水线解析): 增加对工具类节点的解析 2024-11-29 16:42:09 +08:00
otto 57c4e62daa Merge pull request '将流水线json文本解析成yaml格式' (#737) from liuhuazhong/microservices:dev-lhz into dev 2024-11-28 15:12:25 +08:00
liuhuazhong c0b4ddb86e 将流水线json文本解析成yaml格式 2024-11-28 14:49:27 +08:00
otto 1e6a7d7823 Merge pull request '特色专区用户浏览统计' (#735) from otto/microservices:dev into dev 2024-11-26 15:47:11 +08:00
otto c6fa72d11c Merge pull request '修复专区关联关系更新对象swagger说明' (#733) from otto/microservices:dev into dev 2024-11-16 11:09:50 +08:00
otto 9c7436d127 Merge pull request '新增专项项目会议报告公开接口' (#732) from otto/microservices:dev into dev 2024-11-16 09:39:41 +08:00
otto 6163e97da7 Merge pull request '完成专项项目会议报告功能开发' (#731) from otto/microservices:dev into dev 2024-11-16 09:17:08 +08:00
otto 3de1f1b742 Merge pull request '新增获取专项项目关联类型列表公开接口' (#730) from otto/microservices:dev into dev 2024-11-14 15:00:07 +08:00
otto e63d3f6907 Merge pull request '专项项目关联列表公开接口支持通过关联类型查询' (#729) from otto/microservices:dev into dev 2024-11-14 14:47:39 +08:00
otto 871080276f Merge pull request '专项项目以及专项项目关联对象的排序逻辑修复' (#727) from otto/microservices:dev into dev 2024-11-08 09:09:40 +08:00
otto 0bbf810b12 Merge pull request '修改文件名最大长度:文件名最大长度(Linux默认支持最大的文件长度为255字节)' (#725) from otto/microservices:dev into dev 2024-11-07 16:36:06 +08:00
otto edfb37b467 Merge pull request '文件服务新增公开接口通过文件标识下载文件(当前仅允许专区文件通过改接口下载)' (#723) from otto/microservices:dev into dev 2024-11-07 13:51:36 +08:00
otto 01ad7413e6 Merge pull request '资源调整为附件非必填' (#722) from otto/microservices:dev into dev 2024-11-07 11:23:53 +08:00
otto 279bfc6ac0 Merge pull request '查询资源时返回资源关联的单位' (#721) from otto/microservices:dev into dev 2024-11-07 10:05:00 +08:00
otto 16e28f9a37 Merge pull request '根据简介图片文件标识校验文件是否存在' (#720) from otto/microservices:dev into dev 2024-11-07 08:52:00 +08:00
otto 5ade6cc0bd Merge pull request '专项项目增加负责单位字段以及简介图片文件标识字段' (#719) from otto/microservices:dev into dev 2024-11-06 17:27:18 +08:00
otto 5d15dc0fae Merge pull request '特色专区专项项目增加单位字段' (#718) from otto/microservices:dev into dev 2024-11-06 16:55:25 +08:00
otto 5c6ecb3615 Merge pull request '项目管理支持在成员列表查看成员权限' (#717) from otto/microservices:dev into dev 2024-11-05 10:30:31 +08:00
OTTO c900fed456 perf(网关服务): 优化网关权限拦截异常时的错误提示
Signed-off-by: OTTO <731554297@qq.com>
2024-10-19 14:44:02 +08:00
OTTO a44127858e feat(调用第三方微服务): 处理Portainer请求转发
识别到Portainer请求时,调用Portainer登录接口获取Token并写入到请求头中,解析Token的过期时间,将Token存储到Redis中,以便后续Portainer接口鉴权使用

Signed-off-by: OTTO <731554297@qq.com>
2024-10-19 14:04:04 +08:00
OTTO e2138020be feat(调用第三方微服务): 处理Nacos请求转发
1. 调用Nacos登录接口后将响应结果中的accessToken添加到请求头中
2. 增加Redis对Sentinel和Nacos的Token进行缓存,减少登录接口重复调用次数,加快第三方开源软件调用的响应速度

Signed-off-by: OTTO <731554297@qq.com>
2024-10-18 09:43:46 +08:00
OTTO 62495f0f33 feat(调用第三方微服务): 处理Nacos请求转发
Nacos登录接口:用户名/密码调整为表单提交

Signed-off-by: OTTO <731554297@qq.com>
2024-10-18 09:41:05 +08:00
OTTO 57a10a1a98 feat(调用第三方微服务): 处理Nacos请求转发
Feign支持Form表单提交

Signed-off-by: OTTO <731554297@qq.com>
2024-10-18 09:40:20 +08:00
OTTO de9f31a103 feat(调用第三方微服务): 处理Nacos请求转发
识别到Nacos请求时,调用Nacos登录接口获取Token并写入到请求头中,用于Nacos后续接口的鉴权操作

Signed-off-by: OTTO <731554297@qq.com>
2024-10-11 08:40:04 +08:00
OTTO 0029075542 feat(调用第三方微服务): 处理Sentinel请求转发
识别到Sentinel请求时,调用Sentinel登录接口获取Token并写入到Cookie中,用于Sentinel后续接口的鉴权操作

Signed-off-by: OTTO <731554297@qq.com>
2024-10-10 16:50:11 +08:00
464 changed files with 31882 additions and 1238 deletions

1
.gitignore vendored
View File

@ -43,6 +43,7 @@ nbdist/
*.log
*.xml.versionsBackup
*.swp
logs
!*/build/*.java
!*/build/*.html

View File

@ -0,0 +1,36 @@
## 系统模块
~~~
com.microservices
├── microservices-ui // 前端框架
├── microservices-gateway // 网关模块
├── microservices-auth // 认证中心
├── microservices-api // 接口模块
│ └── microservices-api-system // 系统接口
├── microservices-common // 通用模块
│ └── microservices-common-async // 异步线程池配置
│ └── microservices-common-core // 核心模块
│ └── microservices-common-datascope // 权限范围
│ └── microservices-common-datasource // 多数据源
│ └── microservices-common-httpClient // http调用
│ └── microservices-common-log // 日志记录
│ └── microservices-common-redis // 缓存服务
│ └── microservices-common-seata // seata分布式事务
│ └── microservices-common-security // 安全模块
│ └── microservices-common-swagger // 系统接口
├── microservices-modules // 业务模块
│ └── microservices-cms // 内容管理模块
│ └── microservices-dms // 数据管理体系模块
│ └── microservices-dss // 数据统计系统模块
│ └── microservices-file // 文件服务
│ └── microservices-gen // 代码生成
│ └── microservices-job // 定时任务
│ └── microservices-pms // 项目管理系统模块
│ └── microservices-system // 系统模块
│ └── microservices-wiki // Wiki模块
│ └── microservices-zone // 特色专区系统模块
├── microservices-visual // 图形化管理模块
│ └── microservices-visual-monitor // 监控中心
├──pom.xml // 公共依赖
~~~

View File

@ -14,6 +14,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 文件服务
@ -34,6 +35,17 @@ public interface RemoteFileService {
@RequestParam("hierarchy") String hierarchy,
@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* Base64 图片上传HashMap 版本
*/
@PostMapping(value = "/upload/base64")
R<SysFileInfo> uploadBase64(
@RequestBody Map<String, Object> params,
@RequestParam("type") String type,
@RequestParam("hierarchy") String hierarchy,
@RequestHeader(SecurityConstants.FROM_SOURCE) String source
);
/**
* 根据文件Id列表获取文件列表
*
@ -108,6 +120,16 @@ public interface RemoteFileService {
@RequestParam("hierarchy") String hierarchy,
@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 通过Url下载文件到本地
*/
@PostMapping(value = "/common/downloadFileByUrl")
R<String> downloadFileByUrl(
@RequestParam("fileUrl") String fileUrl
, @RequestParam("type") String type
, @RequestParam("hierarchy") String hierarchy,
@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 上传本地文件到Forge
*

View File

@ -0,0 +1,46 @@
package com.microservices.system.api;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.constant.ServiceNameConstants;
import com.microservices.system.api.factory.RemoteGatewayFallbackFactory;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
/**
* 网关
*
* @author microservices
*/
@Component
@FeignClient(contextId = "remoteGatewayService", value = ServiceNameConstants.GATEWAY_SERVICE, fallbackFactory = RemoteGatewayFallbackFactory.class)
public interface RemoteGatewayService {
/**
* 登录Sentinel
*
* @return 响应
*/
@PostMapping("/sentinel/auth/login")
Response loginSentinel(@RequestParam("username") String username, @RequestParam("password") String password);
/**
* 登录Nacos
*
* @return 响应
*/
@PostMapping(value = "/nacos/v1/auth/users/login", consumes = {"application/x-www-form-urlencoded"})
Response loginNacos(Map<String, ?> formParams);
/**
* 登录Portainer
*
* @return 响应
*/
@PostMapping("/portainer/api/auth")
Response loginPortainer(@RequestBody JSONObject loginBody);
}

View File

@ -7,9 +7,9 @@ import com.microservices.system.api.domain.SysLogininfor;
import com.microservices.system.api.domain.SysOperLog;
import com.microservices.system.api.factory.RemoteLogFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 日志服务
@ -38,4 +38,20 @@ public interface RemoteLogService
*/
@PostMapping("/logininfor")
public R<Boolean> saveLogininfor(@RequestBody SysLogininfor sysLogininfor, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 获取操作日志列表
*
* @param title 日志标题
* @param operUrl 操作地址
* @param status 操作状态
* @param topN 获取最新N条
* @return 操作日志列表
*/
@GetMapping("/operlog/latest")
R<List<SysOperLog>> getLatestOperLogList(@RequestParam(value = "title", required = false) String title,
@RequestParam(value = "operUrl", required = false) String operUrl,
@RequestParam(value = "status", required = false) Integer status,
@RequestParam(value = "topN") Integer topN,
@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

View File

@ -4,7 +4,7 @@ import com.microservices.common.core.constant.SecurityConstants;
import com.microservices.common.core.constant.ServiceNameConstants;
import com.microservices.common.core.domain.R;
import com.microservices.system.api.domain.SysDept;
import com.microservices.system.api.factory.RemoteCmsFallbackFactory;
import com.microservices.system.api.factory.RemoteZoneFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
@ -15,7 +15,7 @@ import java.util.List;
*
* @author microservices
*/
@FeignClient(contextId = "remoteZoneService", value = ServiceNameConstants.ZONE_SERVICE, fallbackFactory = RemoteCmsFallbackFactory.class)
@FeignClient(contextId = "remoteZoneService", value = ServiceNameConstants.ZONE_SERVICE, fallbackFactory = RemoteZoneFallbackFactory.class)
public interface RemoteZoneService {
/**
* 新增组织时自动创建特色专区

View File

@ -14,6 +14,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 文件服务降级处理
@ -36,6 +37,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
return R.fail("上传文件失败:" + throwable.getMessage());
}
@Override
public R<SysFileInfo> uploadBase64(Map<String, Object> params, String type, String hierarchy, String source) {
return R.fail("上传base64文件失败:" + throwable.getMessage());
}
@Override
public R<List<SysFileInfo>> getFileList(String fileIds) {
return R.fail("获取文件列表失败:" + throwable.getMessage());
@ -71,6 +77,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
return R.fail("打包文件失败:" + throwable.getMessage());
}
@Override
public R<String> downloadFileByUrl(String fileUrl, String type, String hierarchy, String source) {
return R.fail("通过Url下载文件到本地失败:" + throwable.getMessage());
}
@Override
public R<List<String>> uploadFileToForge(String fileIdentifiers, String source) {
return R.fail("上传本地文件到Forge失败:" + throwable.getMessage());

View File

@ -0,0 +1,44 @@
package com.microservices.system.api.factory;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.system.api.RemoteGatewayService;
import feign.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 用户服务降级处理
*
* @author microservices
*/
@Component
public class RemoteGatewayFallbackFactory implements FallbackFactory<RemoteGatewayService> {
private static final Logger log = LoggerFactory.getLogger(RemoteGatewayFallbackFactory.class);
@Override
public RemoteGatewayService create(Throwable throwable) {
log.error("网关服务调用失败:{}", throwable.getMessage());
return new RemoteGatewayService() {
@Override
public Response loginSentinel(String password, String username) {
return null;
}
@Override
public Response loginNacos(Map<String, ?> formParams) {
return null;
}
@Override
public Response loginPortainer(JSONObject loginBody) {
System.out.println(throwable.getMessage());
return null;
}
};
}
}

View File

@ -9,6 +9,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 日志服务降级处理
*
@ -36,6 +38,12 @@ public class RemoteLogFallbackFactory implements FallbackFactory<RemoteLogServic
{
return null;
}
@Override
public R<List<SysOperLog>> getLatestOperLogList(String title, String operUrl, Integer status, Integer topN, String source)
{
return R.fail("获取最新操作日志失败:" + throwable.getMessage());
}
};
}

View File

@ -0,0 +1,62 @@
package com.microservices.system.api.utils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
public class StandardMultipartFile implements MultipartFile {
private final byte[] content;
private final String name;
private final String originalFilename;
private final String contentType;
public StandardMultipartFile(byte[] content, String name, String originalFilename, String contentType) {
this.content = content != null ? content : new byte[0];
this.name = name;
this.originalFilename = originalFilename;
this.contentType = contentType;
}
@Override
public String getName() {
return name;
}
@Override
public String getOriginalFilename() {
return originalFilename;
}
@Override
public String getContentType() {
return contentType;
}
@Override
public boolean isEmpty() {
return content.length == 0;
}
@Override
public long getSize() {
return content.length;
}
@Override
public byte[] getBytes() throws IOException {
return content;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(content);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
try (FileOutputStream fos = new FileOutputStream(dest)) {
fos.write(content);
}
}
}

View File

@ -5,3 +5,4 @@ com.microservices.system.api.factory.RemoteFileFallbackFactory
com.microservices.system.api.factory.RemoteCmsFallbackFactory
com.microservices.system.api.factory.RemoteZoneFallbackFactory
com.microservices.system.api.factory.RemotePmsFallbackFactory
com.microservices.system.api.factory.RemoteGatewayFallbackFactory

View File

@ -202,20 +202,36 @@ public class CacheConstants {
/**
* Gitlink组织开通企业是否完成 Key前缀
*/
public final static String GITLINK_ORG_ID_OPEN_ENTERPRISE_KEY = "gitlink_org_id_open_enterprise_key:";
private final static String GITLINK_ORG_ID_OPEN_ENTERPRISE_KEY = "gitlink_org_id_open_enterprise_key:";
public static String getGitlinkOrgIdOpenEnterpriseKey(Long gitlinkOrgId) {
return GITLINK_ORG_ID_OPEN_ENTERPRISE_KEY + gitlinkOrgId;
}
/**
* Sentinel Token缓存Key
*/
public final static String SENTINEL_TOKEN = "sentinel_token";
/**
* Nacos Token缓存Key
*/
public static final String NACOS_TOKEN = "nacos_token";
/**
* Portainer Token缓存Key
*/
public static final String PORTAINER_TOKEN = "portainer_token";
/**
* 专区项目Gitlink信息 Key前缀
*/
public final static String ZONE_PROJECT_GITLINK_INFO = "zone_project_gitlink_info:";
private final static String ZONE_PROJECT_GITLINK_INFO = "zone_project_gitlink_info:";
/**
* 专区下项目分数排序 Key前缀
*/
public final static String ZONE_PROJECT_SORT_BY_SCORE = "zone_project_sort_by_score:";
private final static String ZONE_PROJECT_SORT_BY_SCORE = "zone_project_sort_by_score:";
public static String getZoneProjectGitlinkInfo(Long gitlinkProjectId) {
return ZONE_PROJECT_GITLINK_INFO + gitlinkProjectId;
@ -228,4 +244,20 @@ public class CacheConstants {
public static String getAllZoneProjectSortByScore(Long zoneId) {
return ZONE_PROJECT_SORT_BY_SCORE + "*:" + zoneId + ":*";
}
/**
* 文件打包是否完成0代表未完成1代表已完成-1代表打包失败需要重新打包
*/
private final static String PACKAGE_FILE_IS_FINISH = "packageFileIsFinish:";
public static String getPackageFileIsFinish(String fileIdentifier) {
return PACKAGE_FILE_IS_FINISH + fileIdentifier;
}
// 全局资源数据缓存最近一年统计数据
public final static String GLOBAL_RESOURCES_DATA_KEY = "GLOBAL_RESOURCES_DATA:";
public static String getGlobalResourcesDataKey(String startDate, String endDate) {
return GLOBAL_RESOURCES_DATA_KEY + startDate + "_TO_" + endDate;
}
}

View File

@ -0,0 +1,17 @@
package com.microservices.common.core.constant;
/**
* 异常信息常量
*
* @author otto
*/
public class ExceptionMsgConstants {
/**
* 平台通用异常
*/
public static final String SYSTEM_EXEC_ERROR = "请求处理异常,请联系管理员处理";
/**
* 重试异常
*/
public static final String RETRY_ERROR = "请求发生异常,请重新请求";
}

View File

@ -32,4 +32,8 @@ public class ServiceNameConstants {
* 项目管理模块的serviceid
*/
public static final String PMS_SERVICE = "microservices-pms";
/**
* 网关模块的serviceid
*/
public static final String GATEWAY_SERVICE = "microservices-gateway";
}

View File

@ -18,6 +18,15 @@ public class TokenConstants {
* GitLink令牌标识
*/
public static final String GitLink_Token_Key = "autologin_trustie=";
/**
* Sentinel令牌标识
*/
public static final String Sentinel_Token_Key = "sentinel_dashboard_cookie";
public static final String Portainer_Token_Key = "portainer_api_key";
/**
* Sentinel令牌标识
*/
public static final String Nacos_Token_Key = "Accesstoken";
/**
* Cookie中令牌标识
*/

View File

@ -0,0 +1,40 @@
package com.microservices.common.core.utils;
import java.util.HashMap;
public class CookieUtil {
public static HashMap<String, String> getCookieMap(String cookie) {
HashMap<String, String> map = new HashMap<>();
if (cookie != null) {
String[] cookies = cookie.split(";");
for (String cookieStr : cookies) {
String[] cookieArr = cookieStr.split("=");
String key = cookieArr[0].trim();
String value = cookieArr[1].trim();
map.put(key, value);
}
}
return map;
}
public static String getCookieValue(String cookie, String key) {
HashMap<String, String> map = getCookieMap(cookie);
return map.get(key);
}
public static String removeCookieKey(String cookie, String key) {
HashMap<String, String> map = getCookieMap(cookie);
map.remove(key);
return genCookieStr(map);
}
private static String genCookieStr(HashMap<String, String> cookieMap) {
StringBuilder stringBuilder = new StringBuilder();
for (String key : cookieMap.keySet()) {
stringBuilder.append(key).append("=").append(cookieMap.get(key)).append(";");
}
return stringBuilder.toString();
}
}

View File

@ -26,6 +26,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
@ -265,4 +267,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
cal.add(Calendar.DATE, -7 * times);
return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, cal.getTime());
}
public static long dateTimeToUnix(Date date) {
// date.getTime() 返回当前 Date 对象表示的毫秒数除以 1000 后得到以秒为单位的时间戳 10 位时间戳
return date.getTime() / 1000;
}
}

View File

@ -218,17 +218,18 @@ public class ServletUtils {
}
/**
* 内容编码(排除斜杠)
* 内容编码(排除斜杠并且支持重复编码)
*
* @param str 内容
* @return 编码后的内容
*/
public static String urlEncodeExcludeSlashes(String str) {
public static String urlEncodeExcludeSlashesApplyDuplicate(String str) {
try {
StringBuilder stringBuffer = new StringBuilder();
String[] strings = str.split("/");
for (String string : strings) {
stringBuffer.append("/").append(URLEncoder.encode(string, Constants.UTF8));
string = URLEncoder.encode(string, Constants.UTF8);
stringBuffer.append("/").append(string);
}
return stringBuffer.toString().replaceAll("\\+", "%20");
} catch (UnsupportedEncodingException e) {
@ -236,6 +237,22 @@ public class ServletUtils {
}
}
/**
* 判断字符串是否经过URLEncode
* 1. 使用URLDecoder.decode对字符串进行解码
* 2. 再使用URLEncoder.encode对解码后的字符串重新编码
* 3. 如果重新编码后的字符串与原始字符串相同则说明原始字符串是经过URL编码的
*
* @param encodedString 需encode的字符串
* @return 是否经过URLEncode
* @throws UnsupportedEncodingException 编码异常
*/
public static boolean isUrlEncoded(String encodedString) throws UnsupportedEncodingException {
String decodedString = URLDecoder.decode(encodedString, "UTF-8");
String reencodedString = URLEncoder.encode(decodedString, "UTF-8");
return encodedString.equalsIgnoreCase(reencodedString);
}
/**
* 内容解码
*

View File

@ -13,17 +13,19 @@ import com.microservices.common.core.utils.reflect.ReflectUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
@ -1458,4 +1460,288 @@ public class ExcelUtil<T>
}
return method;
}
// 存储Excel中的图片key: 行号_列号value: MultipartFile
private final Map<String, MultipartFile> excelImageMap = new HashMap<>();
/**
* 获取解析后的Excel图片映射表行号_列号 -> MultipartFile
* <p>对外返回不可修改的Map避免外部篡改同时让静态检查识别到该集合被查询</p>
* @return 图片映射表
*/
public Map<String, MultipartFile> getExcelImageMap() {
// 返回不可修改的Map提升代码安全性同时让静态检查识别到集合被读取
return Collections.unmodifiableMap(excelImageMap);
}
/**
* 解析Excel中的图片并转换为MultipartFile存入{@link #excelImageMap}
* @param sheet Excel工作表
* @throws IOException 解析图片失败时抛出
*/
private void parseExcelImages(Sheet sheet) throws IOException {
if (wb instanceof XSSFWorkbook) {
parseXSSFImages((XSSFSheet) sheet);
} else if (wb instanceof HSSFWorkbook) {
parseHSSFImages((HSSFWorkbook) wb, sheet);
}
}
/**
* 解析XSSF格式xlsx图片
*/
private void parseXSSFImages(XSSFSheet sheet) {
XSSFDrawing drawing = sheet.createDrawingPatriarch();
List<XSSFShape> shapes = drawing.getShapes();
for (XSSFShape shape : shapes) {
if (shape instanceof XSSFPicture) {
XSSFPicture picture = (XSSFPicture) shape;
XSSFPictureData pictureData = picture.getPictureData();
XSSFClientAnchor anchor = picture.getPreferredSize();
// 获取图片所在单元格位置
int row = anchor.getRow1();
int col = anchor.getCol1();
String cellKey = row + "_" + col;
// 转换为MultipartFile并存储
MultipartFile multipartFile = bytesToMultipartFile(pictureData.getData(), "xlsx_image.png");
excelImageMap.put(cellKey, multipartFile);
}
}
}
/**
* 解析HSSF格式xls图片
*/
private void parseHSSFImages(HSSFWorkbook workbook, Sheet sheet) {
List<HSSFPictureData> pictureDataList = workbook.getAllPictures();
for (int i = 0; i < pictureDataList.size(); i++) {
HSSFPictureData pictureData = pictureDataList.get(i);
HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
List<HSSFShape> shapes = patriarch.getChildren();
for (HSSFShape shape : shapes) {
if (shape instanceof HSSFPicture) {
HSSFPicture picture = (HSSFPicture) shape;
if (picture.getPictureIndex() == i) {
HSSFClientAnchor anchor = picture.getClientAnchor();
int row = anchor.getRow1();
int col = anchor.getCol1();
String cellKey = row + "_" + col;
// 转换为MultipartFile并存储
MultipartFile multipartFile = bytesToMultipartFile(pictureData.getData(), "xls_image.png");
excelImageMap.put(cellKey, multipartFile);
break;
}
}
}
}
}
/**
* 自定义MultipartFile实现通用版无外部依赖
*/
public static class CustomMultipartFile implements MultipartFile {
private final byte[] content;
private final String filename;
private final String contentType;
public CustomMultipartFile(byte[] content, String filename, String contentType) {
this.content = content;
this.filename = filename;
this.contentType = contentType;
}
@Override
public String getName() {
return "file";
}
@Override
public String getOriginalFilename() {
return filename;
}
@Override
public String getContentType() {
return contentType;
}
@Override
public boolean isEmpty() {
return content == null || content.length == 0;
}
@Override
public long getSize() {
return content.length;
}
@Override
public byte[] getBytes() throws IOException {
return content;
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(content);
}
@Override
public void transferTo(java.io.File dest) throws IOException, IllegalStateException {
try (java.io.OutputStream os = new java.io.FileOutputStream(dest)) {
os.write(content);
}
}
}
/**
* 将字节数组转换为MultipartFile核心工具方法
*/
public MultipartFile bytesToMultipartFile(byte[] bytes, String fileName) {
try {
String suffix = "png";
if (fileName != null && fileName.contains(".")) {
suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
}
String finalFileName = UUID.randomUUID().toString() + "." + suffix;
String contentType = "image/" + suffix;
return new CustomMultipartFile(bytes, finalFileName, contentType);
} catch (Exception e) {
throw new RuntimeException("转换图片为MultipartFile失败", e);
}
}
// 导入包含图片的excel
public List<T> importExcelWithImages(String sheetName, InputStream is, int titleNum) throws Exception {
this.type = Type.IMPORT;
this.wb = WorkbookFactory.create(is);
List<T> list = new ArrayList<T>();
Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0);
if (sheet == null) {
throw new IOException("文件sheet不存在");
}
// 1. 解析Excel中的图片生成imageMap行号_列号 -> MultipartFile
parseExcelImages(sheet);
int rows = sheet.getLastRowNum();
if (rows > 0) {
// ========== 参考原有逻辑构建表头列名和下标映射 ==========
Map<String, Integer> cellMap = new HashMap<>();
Row heard = sheet.getRow(titleNum);
for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) {
Cell cell = heard.getCell(i);
if (StringUtils.isNotNull(cell)) {
String columnName = this.getCellValue(heard, i).toString().trim();
cellMap.put(columnName, i);
} else {
cellMap.put(null, i);
}
}
// ========== 参考原有逻辑构建字段映射通过Excel注解匹配列名 ==========
List<Object[]> fields = this.getFields();
Map<Integer, Object[]> fieldsMap = new HashMap<Integer, Object[]>();
for (Object[] objects : fields) {
Excel attr = (Excel) objects[1];
Integer column = cellMap.get(attr.name());
if (column != null) {
fieldsMap.put(column, objects);
}
}
// 找到图片列的下标关键和Excel模板的列名对应
Integer imageColumnIndex = cellMap.get("图片");
// ========== 遍历数据行参考原有逻辑 ==========
for (int i = titleNum + 1; i <= rows; i++) {
Row row = sheet.getRow(i);
if (isRowEmpty(row)) {
continue;
}
T entity = null;
// 生成当前行的图片key行号_图片列下标i是数据行号对应Excel的行
String imageCellKey = i + "_" + imageColumnIndex;
// ========== 参考原有逻辑遍历字段映射赋值 ==========
for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet()) {
Integer columnIndex = entry.getKey();
Object val = this.getCellValue(row, columnIndex);
// 如果不存在实例则新建
entity = (entity == null ? clazz.newInstance() : entity);
// 从map中得到对应列的field和Excel注解
Field field = (Field) entry.getValue()[0];
Excel attr = (Excel) entry.getValue()[1];
// ========== 关键修改如果是图片替换值为图片key ==========
if (imageColumnIndex != null && columnIndex.equals(imageColumnIndex)) {
val = imageCellKey; // 将单元格原始值替换为图片key如1_12
}
// ========== 原有类型转换逻辑完全复用 ==========
Class<?> fieldType = field.getType();
if (String.class == fieldType) {
String s = Convert.toStr(val);
if (StringUtils.endsWith(s, ".0")) {
val = StringUtils.substringBefore(s, ".0");
} else {
String dateFormat = field.getAnnotation(Excel.class).dateFormat();
if (StringUtils.isNotEmpty(dateFormat)) {
val = parseDateToStr(dateFormat, val);
} else {
val = Convert.toStr(val);
}
}
} else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
val = Convert.toInt(val);
} else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) {
val = Convert.toLong(val);
} else if (Double.TYPE == fieldType || Double.class == fieldType) {
val = Convert.toDouble(val);
} else if (Float.TYPE == fieldType || Float.class == fieldType) {
val = Convert.toFloat(val);
} else if (BigDecimal.class == fieldType) {
val = Convert.toBigDecimal(val);
} else if (Date.class == fieldType) {
if (val instanceof String) {
val = DateUtils.parseDate(val);
} else if (val instanceof Double) {
val = DateUtil.getJavaDate((Double) val);
}
} else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) {
val = Convert.toBool(val, false);
}
// ========== 原有反射赋值逻辑完全复用 ==========
if (StringUtils.isNotNull(fieldType)) {
String propertyName = field.getName();
if (StringUtils.isNotEmpty(attr.targetAttr())) {
propertyName = field.getName() + "." + attr.targetAttr();
} else if (StringUtils.isNotEmpty(attr.readConverterExp())) {
val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
} else if (!attr.handler().equals(ExcelHandlerAdapter.class)) {
val = dataFormatHandlerAdapter(val, attr);
}
// 使用原有工具类反射赋值核心替换自定义setEntityFieldValue
ReflectUtils.invokeSetter(entity, propertyName, val);
}
}
if (entity != null) {
list.add(entity);
}
}
}
return list;
}
}

View File

@ -283,6 +283,7 @@ public class HttpAPIService {
if (length != 0L) {
String result = EntityUtils.toString(httpEntity);
if (!JSON.isValid(result)) {
logger.error("平台接口响应格式异常,状态码:{},响应内容:{}", httpStatusCode, result);
throw new ServiceException("平台接口响应格式异常");
}
Object resultObj = JSON.parse(result);

View File

@ -1,9 +1,16 @@
package com.microservices.common.security.feign;
import feign.RequestInterceptor;
import feign.codec.Encoder;
import feign.form.FormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Feign 配置注册
*
@ -12,9 +19,20 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignAutoConfiguration
{
// 这里会由容器自动注入HttpMessageConverters的对象工厂
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public RequestInterceptor requestInterceptor()
{
return new FeignRequestInterceptor();
}
// new一个form编码器实现支持form表单提交
// 注意这里方法名称也就是bean的名称是什么不重要
// 重要的是返回类型要是 Encoder 并且实现类必须是 FormEncoder 或者其子类
@Bean
public Encoder feignFormEncoder() {
return new FormEncoder(new SpringEncoder(messageConverters));
}
}

View File

@ -2,13 +2,18 @@ package com.microservices.gateway.config;
import feign.codec.Decoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.util.stream.Collectors;
/**
* @author otto
*/
@ -25,4 +30,10 @@ public class FeignConfig {
(new MappingJackson2HttpMessageConverter());
return () -> httpMessageConverters;
}
@Bean
@ConditionalOnMissingBean
public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
}
}

View File

@ -11,6 +11,8 @@ import com.microservices.common.core.utils.ServletUtils;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.redis.service.RedisService;
import com.microservices.gateway.config.properties.IgnoreWhiteProperties;
import com.microservices.gateway.service.ThirdPartyToolService;
import com.microservices.gateway.utils.CustomExecutorFactory;
import com.microservices.system.api.RemoteUserService;
import com.microservices.system.api.domain.SysUserDeptRole;
import com.microservices.system.api.utils.FeignUtils;
@ -28,9 +30,8 @@ import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 网关鉴权
@ -51,7 +52,12 @@ public class AuthFilter implements GlobalFilter, Ordered {
@Autowired
private RemoteUserService remoteUserService;
ExecutorService executorService = Executors.newFixedThreadPool(1);
@Lazy
@Autowired
private ThirdPartyToolService thirdPartyToolService;
ThreadPoolExecutor threadPoolExecutor = CustomExecutorFactory.threadPoolExecutor;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
@ -75,12 +81,16 @@ public class AuthFilter implements GlobalFilter, Ordered {
}
if (StringUtils.isEmpty(token)) {
if (StringUtils.isNotEmpty(gitLinkCookie)) {
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
}
return unauthorizedResponse(exchange, "令牌不能为空");
}
Claims claims;
try {
claims = JwtUtils.parseToken(token);
} catch (Exception e) {
log.error("令牌解析失败:{}", e.getMessage());
return unauthorizedResponse(exchange, "令牌格式不正确!");
}
if (claims == null) {
@ -105,6 +115,11 @@ public class AuthFilter implements GlobalFilter, Ordered {
ServletUtils.addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
// 内部请求来源参数清除
ServletUtils.removeHeader(mutate, SecurityConstants.FROM_SOURCE);
Mono<Void> thirdPartyRes = thirdPartyToolService.handleRequestForThirdPartyTools(exchange, request, mutate);
if (thirdPartyRes != null) {
return thirdPartyRes;
}
return chain.filter(exchange.mutate().request(mutate.build()).build());
}
@ -116,7 +131,7 @@ public class AuthFilter implements GlobalFilter, Ordered {
boolean hasUserIdentifyList = redisService.hasKey(redisKey);
if (!hasUserIdentifyList) {
// 网关采用异步架构所以此处需要通过异步请求获取本系统Token
Future<R<List<SysUserDeptRole>>> future = executorService.submit(
Future<R<List<SysUserDeptRole>>> future = threadPoolExecutor.submit(
() -> remoteUserService.getSysUserDeptRoleListByUserName(username, SecurityConstants.INNER));
try {
List<SysUserDeptRole> feignResult = FeignUtils.getReturnData(
@ -130,7 +145,7 @@ public class AuthFilter implements GlobalFilter, Ordered {
}
private String genCookieByToken(String token) {
return String.format("%s%s;",TokenConstants.GitLink_Token_Key, token);
return String.format("%s%s;", TokenConstants.GitLink_Token_Key, token);
}
private String getGitLinkRequestCookie(ServerHttpRequest request) {
@ -141,7 +156,7 @@ public class AuthFilter implements GlobalFilter, Ordered {
String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION);
if (token != null) {
// 网关采用异步架构所以此处需要通过异步请求获取本系统Token
Future<R<Boolean>> future = executorService.submit(
Future<R<Boolean>> future = threadPoolExecutor.submit(
() -> remoteUserService.checkGitLinkUserLogin(token, SecurityConstants.INNER));
try {
Boolean feignResult = FeignUtils.getReturnData(
@ -194,7 +209,7 @@ public class AuthFilter implements GlobalFilter, Ordered {
private String getGitLinkToken(String cookie) {
if (StringUtils.isNotEmpty(cookie)) {
// 网关采用异步架构所以此处需要通过异步请求获取本系统Token
Future<R<String>> future = executorService.submit(() -> remoteUserService
Future<R<String>> future = threadPoolExecutor.submit(() -> remoteUserService
.getSysUserTokenByGitLinkCookie(cookie, SecurityConstants.INNER));
R<String> feignResult;
try {

View File

@ -0,0 +1,218 @@
package com.microservices.gateway.filter;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.constant.CacheConstants;
import com.microservices.common.core.constant.ExceptionMsgConstants;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.redis.service.RedisService;
import lombok.extern.slf4j.Slf4j;
import org.reactivestreams.Publisher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
@Slf4j
@Component
public class GlobalResponseFilter implements GlobalFilter, Ordered {
@Autowired
private RedisService redisService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String lowerUrl = request.getURI().getPath().toLowerCase();
ServerHttpResponse originalResponse = exchange.getResponse();
DataBufferFactory bufferFactory = originalResponse.bufferFactory();
// 当请求为Nacos时Nacos返回的所有非JSON响应都会被自动转换为结构化的错误信息同时将HTTP状态码设置为200适合用于规范化微服务架构的响应格式
if (lowerUrl.startsWith("/nacos")) {
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
HttpStatus status = getStatusCode() != null ? getStatusCode() : HttpStatus.INTERNAL_SERVER_ERROR;
if (!status.isError()) {
return super.writeWith(body);
}
if (status == HttpStatus.FORBIDDEN) {
log.error("nacos鉴权异常已清理redis中nacos token");
// 设置新的状态码为 200
setStatusCode(HttpStatus.OK);
// 设置响应内容类型为 JSON
getHeaders().setContentType(MediaType.APPLICATION_JSON);
// 清理Sentinel失效token
redisService.deleteObject(CacheConstants.NACOS_TOKEN);
// 创建自定义的 JSON 响应内容
String jsonBody = JSON.toJSONString(AjaxResult.error(ExceptionMsgConstants.RETRY_ERROR));
byte[] bytes = jsonBody.getBytes(StandardCharsets.UTF_8);
getHeaders().setContentLength(bytes.length);
DataBuffer dataBuffer = bufferFactory.wrap(bytes);
// 返回新的响应内容
return super.writeWith(Mono.just(dataBuffer));
}
return Flux.from(body).<String>handle((dataBuffer, synchronousSink) -> {
if (status.isError()) {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
//释放掉内存
DataBufferUtils.release(dataBuffer);
String result = new String(bytes, StandardCharsets.UTF_8);
synchronousSink.next(result);
return;
}
synchronousSink.complete();
}).flatMap(resStr -> {
// 保留原始状态码
originalResponse.setStatusCode(HttpStatus.OK);
String errMsg;
if (!JSON.isValid(resStr)) {
errMsg = resStr;
} else {
JSONObject resJson = JSONObject.parseObject(resStr);
if (resJson.containsKey("message")) {
errMsg = resJson.getString("message");
} else {
errMsg = ExceptionMsgConstants.SYSTEM_EXEC_ERROR;
}
}
byte[] bytes = JSON.toJSONBytes(AjaxResult.error(errMsg));
getHeaders().setContentLength(bytes.length);
DataBuffer buffer = bufferFactory.wrap(bytes);
return super.writeWith(Mono.just(buffer));
}).then();
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
if (lowerUrl.startsWith("/portainer")) {
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
HttpStatus status = getStatusCode() != null ? getStatusCode() : HttpStatus.INTERNAL_SERVER_ERROR;
if (!status.isError()) {
return super.writeWith(body);
}
return Flux.from(body).<String>handle((dataBuffer, synchronousSink) -> {
if (status.isError()) {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
//释放掉内存
DataBufferUtils.release(dataBuffer);
String result = new String(bytes, StandardCharsets.UTF_8);
synchronousSink.next(result);
}
synchronousSink.complete();
}).flatMap(resStr -> {
log.error("Portainer响应处理异常异常信息{}", resStr);
originalResponse.setStatusCode(HttpStatus.OK);
byte[] bytes;
if (JSON.isValid(resStr)) {
JSONObject resJson = JSONObject.parseObject(resStr);
if (resJson.containsKey("message")) {
String message = resJson.getString("message");
if (StringUtils.isNotBlank(message) && message.contains("A valid authorisation token is missing")) {
log.error("Portainer鉴权异常已清理redis中Portainer token");
//token失效清除redis缓存
redisService.deleteObject(CacheConstants.PORTAINER_TOKEN);
bytes = JSON.toJSONBytes(AjaxResult.error(ExceptionMsgConstants.RETRY_ERROR));
} else {
bytes = JSON.toJSONBytes(AjaxResult.error(message));
}
} else {
bytes = JSON.toJSONBytes(AjaxResult.error(ExceptionMsgConstants.SYSTEM_EXEC_ERROR));
}
} else {
bytes = JSON.toJSONBytes(AjaxResult.error(ExceptionMsgConstants.SYSTEM_EXEC_ERROR));
}
getHeaders().setContentLength(bytes.length);
DataBuffer buffer = bufferFactory.wrap(bytes);
return super.writeWith(Mono.just(buffer));
}).then();
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
if (lowerUrl.startsWith("/sentinel")) {
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
HttpStatus status = getStatusCode() != null ? getStatusCode() : HttpStatus.INTERNAL_SERVER_ERROR;
if (!status.isError()) {
return super.writeWith(body);
}
if (status == HttpStatus.UNAUTHORIZED) {
log.error("sentinel鉴权异常已清理redis中sentinel token");
// 设置新的状态码为 200
setStatusCode(HttpStatus.OK);
// 设置响应内容类型为 JSON
getHeaders().setContentType(MediaType.APPLICATION_JSON);
// 清理Sentinel失效token
redisService.deleteObject(CacheConstants.SENTINEL_TOKEN);
// 创建自定义的 JSON 响应内容
String jsonBody = JSON.toJSONString(AjaxResult.error(ExceptionMsgConstants.RETRY_ERROR));
byte[] bytes = jsonBody.getBytes(StandardCharsets.UTF_8);
getHeaders().setContentLength(bytes.length);
DataBuffer dataBuffer = bufferFactory.wrap(bytes);
// 返回新的响应内容
return super.writeWith(Mono.just(dataBuffer));
}
return Flux.from(body).<String>handle((dataBuffer, synchronousSink) -> {
if (status.isError()) {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
//释放掉内存
DataBufferUtils.release(dataBuffer);
String result = new String(bytes, StandardCharsets.UTF_8);
synchronousSink.next(result);
}
synchronousSink.complete();
}).flatMap(resStr -> {
log.error("Sentinel响应处理异常异常信息{}", resStr);
byte[] bytes;
bytes = JSON.toJSONBytes(AjaxResult.error(ExceptionMsgConstants.SYSTEM_EXEC_ERROR));
setStatusCode(HttpStatus.OK);
getHeaders().setContentLength(bytes.length);
DataBuffer buffer = bufferFactory.wrap(bytes);
return super.writeWith(Mono.just(buffer));
}).then();
}
};
return chain.filter(exchange.mutate().response(decoratedResponse).build());
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
//WRITE_RESPONSE_FILTER 之前执行
return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER - 1;
}
}

View File

@ -1,5 +1,6 @@
package com.microservices.gateway.handler;
import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.utils.ServletUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -19,33 +20,27 @@ import reactor.core.publisher.Mono;
*/
@Order(-1)
@Configuration
public class GatewayExceptionHandler implements ErrorWebExceptionHandler
{
public class GatewayExceptionHandler implements ErrorWebExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class);
@Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
{
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
ServerHttpResponse response = exchange.getResponse();
if (exchange.getResponse().isCommitted())
{
if (exchange.getResponse().isCommitted()) {
return Mono.error(ex);
}
String msg;
if (ex instanceof NotFoundException)
{
if (ex instanceof NotFoundException) {
msg = "服务未找到";
}
else if (ex instanceof ResponseStatusException)
{
} else if (ex instanceof ServiceException) {
msg = ex.getMessage();
} else if (ex instanceof ResponseStatusException) {
ResponseStatusException responseStatusException = (ResponseStatusException) ex;
msg = responseStatusException.getMessage();
}
else
{
} else {
msg = "内部服务器错误";
}

View File

@ -0,0 +1,22 @@
package com.microservices.gateway.service;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* 第三方工具服务类
*
* @author OTTO
*/
public interface ThirdPartyToolService {
/**
* 处理第三方工具请求
*
* @param exchange
* @param request 请求
* @param mutate 请求头获取器
*/
Mono<Void> handleRequestForThirdPartyTools(ServerWebExchange exchange, ServerHttpRequest request, ServerHttpRequest.Builder mutate);
}

View File

@ -0,0 +1,232 @@
package com.microservices.gateway.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.constant.CacheConstants;
import com.microservices.common.core.constant.ExceptionMsgConstants;
import com.microservices.common.core.constant.TokenConstants;
import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.utils.CookieUtil;
import com.microservices.common.core.utils.ServletUtils;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.redis.service.RedisService;
import com.microservices.gateway.service.ThirdPartyToolService;
import com.microservices.gateway.utils.CustomExecutorFactory;
import com.microservices.system.api.RemoteGatewayService;
import feign.Response;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author OTTO
*/
@Service
public class ThirdPartyToolServiceImpl implements ThirdPartyToolService {
private static final Logger log = LoggerFactory.getLogger(ThirdPartyToolServiceImpl.class);
@Value("${thirdPartyTools.nacos.auth.username:}")
public String nacosUsername;
@Value("${thirdPartyTools.nacos.auth.password:}")
public String nacosPassword;
@Value("${thirdPartyTools.sentinel.auth.username:}")
public String sentinelUsername;
@Value("${thirdPartyTools.sentinel.auth.password:}")
public String sentinelPassword;
@Value("${thirdPartyTools.portainer.auth.username:}")
public String portainerUsername;
@Value("${thirdPartyTools.portainer.auth.password:}")
public String portainerPassword;
@Value("${thirdPartyTools.portainer.endpoints:}")
public Integer portainerEndpoints;
ThreadPoolExecutor threadPoolExecutor = CustomExecutorFactory.threadPoolExecutor;
@Lazy
@Autowired
private RemoteGatewayService remoteGatewayService;
@Autowired
private RedisService redisService;
/**
* 处理第三方工具请求
*/
@Override
public Mono<Void> handleRequestForThirdPartyTools(ServerWebExchange exchange, ServerHttpRequest request, ServerHttpRequest.Builder mutate) {
String url = request.getURI().getPath();
String lowerUrl = url.toLowerCase();
if (StringUtils.isEmpty(lowerUrl)) {
return null;
}
// 处理Sentinel请求
if (lowerUrl.startsWith("/sentinel")) {
// 检查Cookie中是否携带sentinel cookie
String cookie = request.getHeaders().getFirst(TokenConstants.Cookie);
if (StringUtils.isNotEmpty(CookieUtil.getCookieValue(cookie, TokenConstants.Sentinel_Token_Key))) {
cookie = CookieUtil.removeCookieKey(cookie, TokenConstants.Sentinel_Token_Key);
}
String sentinelCookie = null;
if (redisService.hasKey(CacheConstants.SENTINEL_TOKEN)) {
sentinelCookie = redisService.getCacheObject(CacheConstants.SENTINEL_TOKEN);
} else {
// 网关采用异步架构所以此处需要通过异步请求获取Sentinel Token
Future<Response> future = threadPoolExecutor.submit(() -> remoteGatewayService.loginSentinel(sentinelUsername, sentinelPassword));
try {
Response response = future.get(1, TimeUnit.SECONDS);
Map<String, Collection<String>> header = response.headers();
if (header != null && header.containsKey("set-cookie")) {
sentinelCookie = header.get("set-cookie").iterator().next();
//Sentinel登录状态默认30分钟失效将Sentinel Token缓存过期时间调整为28分钟
redisService.setCacheObject(CacheConstants.SENTINEL_TOKEN, sentinelCookie, 28L, TimeUnit.MINUTES);
}
} catch (TimeoutException e) {
log.error("获取Sentinel Token超时");
} catch (InterruptedException | ExecutionException e) {
log.error("获取Sentinel Token失败{}", e.getMessage());
}
}
if (StringUtils.isNotEmpty(sentinelCookie)) {
ServletUtils.removeHeader(mutate, TokenConstants.Cookie);
mutate.header(TokenConstants.Cookie, String.format("%s;%s;", cookie, sentinelCookie));
} else {
throw new ServiceException("Sentinel服务获取Token失败");
}
}
// 处理Nacos请求
if (lowerUrl.startsWith("/nacos")) {
String nacosToken = null;
if (redisService.hasKey(CacheConstants.NACOS_TOKEN)) {
nacosToken = redisService.getCacheObject(CacheConstants.NACOS_TOKEN);
} else {
Map<String, String> nacosMap = new HashMap<>();
nacosMap.put("username", nacosUsername);
nacosMap.put("password", nacosPassword);
// 网关采用异步架构所以此处需要通过异步请求获取Nacos Token
Future<Response> future = threadPoolExecutor.submit(() -> remoteGatewayService.loginNacos(nacosMap));
try {
Response res = future.get(1, TimeUnit.SECONDS);
StringWriter writer = new StringWriter();
IOUtils.copy(res.body().asInputStream(), writer, StandardCharsets.UTF_8.name());
String str = writer.toString();
if (!JSON.isValid(str)) {
return exceptionResponse(exchange, str, res.status());
}
JSONObject resJsonObject = JSONObject.parseObject(str);
if (resJsonObject == null) {
return exceptionResponse(exchange, str, res.status());
}
nacosToken = resJsonObject.getString("accessToken");
Long tokenTtl = resJsonObject.getLong("tokenTtl");
if (nacosToken != null && tokenTtl != null) {
redisService.setCacheObject(CacheConstants.NACOS_TOKEN, nacosToken, tokenTtl - 10, TimeUnit.SECONDS);
}
} catch (TimeoutException e) {
log.error("获取Nacos Token超时");
} catch (InterruptedException | ExecutionException | IOException | NullPointerException e) {
log.error("获取Nacos Token失败{}", e.getMessage());
}
}
if (StringUtils.isNotEmpty(nacosToken)) {
mutate.header(TokenConstants.Nacos_Token_Key, nacosToken);
} else {
throw new ServiceException("Nacos服务获取Token失败");
}
}
// 处理portainer请求
if (lowerUrl.startsWith("/portainer")) {
// 处理portainer指定endpoints的问题
if (lowerUrl.startsWith("/portainer/api/endpoints/")) {
String regex = "^/portainer/api/endpoints/\\d+(/?.*)";
if (Pattern.matches(regex, lowerUrl)) {
// 替换掉endpoints
regex = "(^/portainer/api/endpoints/)(\\d+)(/?.*)";
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
// 替换数字部分
url = matcher.replaceAll(matcher.group(1) + portainerEndpoints + matcher.group(3));
try {
mutate.uri(new URI(url));
} catch (URISyntaxException e) {
log.error("替换Portainer请求中Endpoints时发生异常{}", e.getMessage());
}
}
}
}
String portainerToken = null;
String cookie = request.getHeaders().getFirst(TokenConstants.Cookie);
if (StringUtils.isNotEmpty(CookieUtil.getCookieValue(cookie, TokenConstants.Portainer_Token_Key))) {
cookie = CookieUtil.removeCookieKey(cookie, TokenConstants.Portainer_Token_Key);
}
if (redisService.hasKey(CacheConstants.PORTAINER_TOKEN)) {
portainerToken = redisService.getCacheObject(CacheConstants.PORTAINER_TOKEN);
} else {
// 网关采用异步架构所以此处需要通过异步请求获取Portainer Token
JSONObject loginPortainerBody = new JSONObject();
loginPortainerBody.put("username", portainerUsername);
loginPortainerBody.put("password", portainerPassword);
Future<Response> future = threadPoolExecutor.submit(() -> remoteGatewayService.loginPortainer(loginPortainerBody));
try {
Response res = future.get(1, TimeUnit.SECONDS);
StringWriter writer = new StringWriter();
IOUtils.copy(res.body().asInputStream(), writer, StandardCharsets.UTF_8.name());
String str = writer.toString();
if (!JSON.isValid(str)) {
return exceptionResponse(exchange, str, res.status());
}
JSONObject resJsonObject = JSONObject.parseObject(str);
portainerToken = resJsonObject.getString("jwt");
if (portainerToken == null) {
return exceptionResponse(exchange, str, res.status());
}
String[] tokenSplit = portainerToken.split("\\.");
String tokenBodyStr = new String(Base64.getDecoder().decode(tokenSplit[1]), StandardCharsets.UTF_8);
JSONObject tokenBody = JSONObject.parseObject(tokenBodyStr);
Long expiration = tokenBody.getLong("exp");
Long now = new Date().getTime() / 1000;
long portainerTokenTtl = expiration - now;
if (portainerTokenTtl > 20) {
redisService.setCacheObject(CacheConstants.PORTAINER_TOKEN, portainerToken, portainerTokenTtl - 10, TimeUnit.SECONDS);
}
} catch (TimeoutException e) {
log.error("获取Portainer Token超时");
} catch (InterruptedException | ExecutionException | IOException | NullPointerException e) {
log.error("获取Portainer Token失败{}", e.getMessage());
}
}
if (StringUtils.isNotEmpty(portainerToken)) {
ServletUtils.removeHeader(mutate, TokenConstants.Cookie);
ServletUtils.removeHeader(mutate, TokenConstants.AUTHENTICATION);
mutate.header(TokenConstants.AUTHENTICATION, TokenConstants.PREFIX + portainerToken);
mutate.header(TokenConstants.Cookie, String.format("%s;%s;", cookie, portainerToken));
} else {
throw new ServiceException("Portainer服务获取Token失败");
}
}
return null;
}
private Mono<Void> exceptionResponse(ServerWebExchange exchange, String msg, int code) {
log.error("[第三方工具请求处理异常]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), msg);
return ServletUtils.webFluxResponseWriter(exchange.getResponse(), ExceptionMsgConstants.SYSTEM_EXEC_ERROR, code);
}
}

View File

@ -0,0 +1,35 @@
package com.microservices.gateway.utils;
import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.threadPool.ThreadPoolExecutorWrap;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author OTTO
*/
public class CustomExecutorFactory {
/**
* 创建线程池
* 存在并发处理的情况设置核心线程为2设置有界队列长度为100最大线程数为10
* 当超出队列已满且达到最大线程数时抛出异常
* Ncpu=CPU数量
* Ucpu=目标CPU的使用率0<=Ucpu<=1
* W/C=任务等待时间与任务计算时间的比率
* Nthreads =Ncpu*Ucpu*(1+W/C)
*/
public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutorWrap(
4
, 10
, 10
, TimeUnit.SECONDS
, new ArrayBlockingQueue<>(100)
, Executors.defaultThreadFactory()
, (r, executor) -> {
throw new ServiceException("目前处理的人太多了,请稍后再试");
}
);
}

View File

@ -186,6 +186,8 @@ public class CmsDoc extends BaseSortEntity {
HotCmsDocDto hotCmsDocDto = new HotCmsDocDto();
hotCmsDocDto.setId(id);
hotCmsDocDto.setName(name);
hotCmsDocDto.setSummary(summary);
hotCmsDocDto.setPublishTime(publishTime);
return hotCmsDocDto;
}

View File

@ -1,10 +1,13 @@
package com.microservices.cms.doc.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.microservices.common.core.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author otto
*/
@ -23,4 +26,11 @@ public class HotCmsDocDto {
@Excel(name = "文章名称")
@ApiModelProperty("文章名称")
private String name;
@ApiModelProperty("文章概要")
private String summary;
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("发布时间")
private Date publishTime;
}

View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.microservices</groupId>
<artifactId>microservices-modules</artifactId>
<version>3.6.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microservices-modules-dms</artifactId>
<description>
microservices-modules-dms数据管理体系模块
</description>
<dependencies>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Swagger UI -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.fox.version}</version>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Microservices Common Async -->
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-async</artifactId>
</dependency>
<!-- Microservices Common DataSource -->
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-datasource</artifactId>
</dependency>
<!-- Microservices Common DataScope -->
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-datascope</artifactId>
</dependency>
<!-- Microservices Common Log -->
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-log</artifactId>
</dependency>
<!-- Microservices Common Swagger -->
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-swagger</artifactId>
</dependency>
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 处理访问Gitlink相关接口 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
<dependency>
<groupId>com.microservices</groupId>
<artifactId>microservices-common-httpClient</artifactId>
<version>3.6.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.shibing624</groupId>
<artifactId>similarity</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.4</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,25 @@
package com.microservices.dms;
import com.microservices.common.security.annotation.EnableCustomConfig;
import com.microservices.common.security.annotation.EnableRyFeignClients;
import com.microservices.common.swagger.annotation.EnableCustomSwagger2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 项目管理模块
*
* @author otto
*/
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication
@EnableScheduling
public class MicroservicesDmsApplication {
public static void main(String[] args) {
SpringApplication.run(MicroservicesDmsApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 数据管理体系模块启动成功 ლ(´ڡ`ლ)゙ \n");
}
}

View File

@ -0,0 +1,125 @@
package com.microservices.dms.achievementLibrary.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.system.api.domain.SysDictData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.microservices.common.log.annotation.Log;
import com.microservices.common.log.enums.BusinessType;
import com.microservices.common.security.annotation.RequiresPermissions;
import com.microservices.dms.achievementLibrary.domain.AchievementDictData;
import com.microservices.dms.achievementLibrary.service.IAchievementDictDataService;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.core.utils.poi.ExcelUtil;
import com.microservices.common.core.web.page.TableDataInfo;
/**
* 成果相关字典Controller
*
* @author microservices
* @date 2025-05-23
*/
@Api(tags = "数据管理体系-成果字典管理")
@RestController
@RequestMapping("/achDict")
public class AchievementDictDataController extends BaseController
{
@Autowired
private IAchievementDictDataService achievementDictDataService;
/**
* 查询成果相关字典列表
*/
@GetMapping("/list")
public TableDataInfo list(AchievementDictData achievementDictData)
{
startPage();
List<AchievementDictData> list = achievementDictDataService.selectAchievementDictDataList(achievementDictData);
return getDataTable(list);
}
/**
* 导出成果相关字典列表
*/
@Log(title = "成果相关字典", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, AchievementDictData achievementDictData)
{
List<AchievementDictData> list = achievementDictDataService.selectAchievementDictDataList(achievementDictData);
ExcelUtil<AchievementDictData> util = new ExcelUtil<AchievementDictData>(AchievementDictData.class);
util.exportExcel(response, list, "成果相关字典数据");
}
/**
* 获取成果相关字典详细信息
*/
@GetMapping(value = "/{dictCode}")
public AjaxResult getInfo(@PathVariable("dictCode") Long dictCode)
{
return success(achievementDictDataService.selectAchievementDictDataByDictCode(dictCode));
}
/**
* 新增成果相关字典
*/
@Log(title = "成果相关字典", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AchievementDictData achievementDictData)
{
return toAjax(achievementDictDataService.insertAchievementDictData(achievementDictData));
}
/**
* 修改成果相关字典
*/
@Log(title = "成果相关字典", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AchievementDictData achievementDictData)
{
return toAjax(achievementDictDataService.updateAchievementDictData(achievementDictData));
}
/**
* 删除成果相关字典
*/
@Log(title = "成果相关字典", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictCodes}")
public AjaxResult remove(@PathVariable Long[] dictCodes)
{
return toAjax(achievementDictDataService.deleteAchievementDictDataByDictCodes(dictCodes));
}
/**
* 根据字典类型查询字典数据信息
*/
@ApiOperation("根据成果字典分类查询成果值")
@GetMapping(value = "/getDictDateByType")
public AjaxResult getDictDateByType(String dictType)
{
List<KeyValueVo> data = achievementDictDataService.selectDictDataByType(dictType);
return success(data);
}
@ApiOperation("根据成果字典分类")
@GetMapping(value = "/getDictTypes")
public AjaxResult getDictTypes()
{
List<String> data = achievementDictDataService.getDictTypes();
return success(data);
}
}

View File

@ -0,0 +1,102 @@
package com.microservices.dms.achievementLibrary.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.microservices.common.log.annotation.Log;
import com.microservices.common.log.enums.BusinessType;
import com.microservices.common.security.annotation.RequiresPermissions;
import com.microservices.dms.achievementLibrary.domain.AchievementTeam;
import com.microservices.dms.achievementLibrary.service.IAchievementTeamService;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.core.utils.poi.ExcelUtil;
import com.microservices.common.core.web.page.TableDataInfo;
/**
* 成果团队Controller
*
* @author microservices
* @date 2025-04-23
*/
@RestController
@Api(tags = "数据管理体系-成果团队接口")
@RequestMapping("/achievementsTeam")
public class AchievementTeamController extends BaseController
{
@Autowired
private IAchievementTeamService achievementTeamService;
/**
* 查询成果团队列表
*/
@GetMapping("/list")
public TableDataInfo list(AchievementTeam achievementTeam)
{
startPage();
List<AchievementTeam> list = achievementTeamService.selectAchievementTeamList(achievementTeam);
return getDataTable(list);
}
/**
* 导出成果团队列表
*/
@Log(title = "成果团队", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, AchievementTeam achievementTeam)
{
List<AchievementTeam> list = achievementTeamService.selectAchievementTeamList(achievementTeam);
ExcelUtil<AchievementTeam> util = new ExcelUtil<AchievementTeam>(AchievementTeam.class);
util.exportExcel(response, list, "成果团队数据");
}
/**
* 获取成果团队详细信息
*/
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(achievementTeamService.selectAchievementTeamById(id));
}
/**
* 新增成果团队
*/
@Log(title = "成果团队", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AchievementTeam achievementTeam)
{
return toAjax(achievementTeamService.insertAchievementTeam(achievementTeam));
}
/**
* 修改成果团队
*/
@Log(title = "成果团队", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AchievementTeam achievementTeam)
{
return toAjax(achievementTeamService.updateAchievementTeam(achievementTeam));
}
/**
* 删除成果团队
*/
@Log(title = "成果团队", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(achievementTeamService.deleteAchievementTeamByIds(ids));
}
}

View File

@ -0,0 +1,310 @@
package com.microservices.dms.achievementLibrary.controller;
import com.microservices.common.core.utils.poi.ExcelUtil;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.core.web.page.TableDataInfo;
import com.microservices.common.log.annotation.Log;
import com.microservices.common.log.enums.BusinessType;
import com.microservices.dms.achievementLibrary.domain.AchQueryVo;
import com.microservices.dms.achievementLibrary.domain.Achievements;
import com.microservices.dms.achievementLibrary.service.IAchievementsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 成果Controller
*
* @author microservices
* @date 2025-04-02
*/
@RestController
@RequestMapping("/achievements")
@Api(tags = "数据管理体系-成果库接口")
public class AchievementsController extends BaseController {
@Autowired
private IAchievementsService achievementsService;
/**
* 查询成果列表
*/
@GetMapping("/list")
public TableDataInfo list(Achievements achievements) {
startPage();
List<Achievements> list = achievementsService.selectAchievementsList(achievements);
return getDataTable(list);
}
/**
* 导出成果列表
*/
@Log(title = "成果", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Achievements achievements) {
List<Achievements> list = achievementsService.selectAchievementsList(achievements);
ExcelUtil<Achievements> util = new ExcelUtil<Achievements>(Achievements.class);
util.exportExcel(response, list, "成果数据");
}
/**
* 获取成果详细信息
*/
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(achievementsService.selectAchievementsById(id));
}
/**
* 新增成果
*/
@Log(title = "成果", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Achievements achievements) {
return toAjax(achievementsService.insertAchievements(achievements));
}
/**
* 修改成果
*/
@Log(title = "成果", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Achievements achievements) {
return toAjax(achievementsService.updateAchievements(achievements));
}
/**
* 删除成果
*/
@Log(title = "成果", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(achievementsService.deleteAchievementsByIds(ids));
}
@ApiOperation("删除成果数据")
@DeleteMapping("/deleteById")
public AjaxResult deleteById(Long id) {
return toAjax(achievementsService.deleteAchievementsById(id));
}
/**
* 获取精选成果
*
* @return
*/
@ApiOperation("获取精选成果")
@GetMapping("/getChoiceImport")
public AjaxResult getChoiceImport() {
return success(achievementsService.getChoiceImport());
}
/**
* 根据成果来源对成果数据进行分类统计
*
* @return
*/
@ApiOperation("根据成果来源对成果数据进行分类统计")
@GetMapping("/getTjBySources")
public AjaxResult getTjBySources() {
return success(achievementsService.getTjBySources());
}
/**
* 根据成果领域对成功数据进行汇总
*
* @return
*/
@ApiOperation("根据成果领域对成果数据进行汇总")
@GetMapping("/getTjByAreas")
public AjaxResult getTjByAreas() {
return success(achievementsService.getTjByAreas());
}
/**
* 根据领域分类名称获取领域相关数据(创客任务开放竞赛校企成果
*/
@ApiOperation("根据领域分类名称,获取领域相关数据")
@GetMapping("/getAreasByName")
public AjaxResult getAreasByName(String areaName) {
return success(achievementsService.getAreasByName(areaName));
}
@ApiOperation("根据领域分类名称,获取项目领域")
@GetMapping("/getProjectAreasByName")
public AjaxResult getProjectAreasByName(String areaName) {
return success(achievementsService.getProjectAreasByName(areaName));
}
@ApiOperation("根据领域分类名称,获取专家领域")
@GetMapping("/getExpertAreasByName")
public AjaxResult getExpertAreasByName(String areaName) {
return success(achievementsService.getExpertAreasByName(areaName));
}
/* 获取全部成果,根据成果名称成果领域成果来源进行查询
* @return
*/
@ApiOperation("获取全部成果,根据成果名称、成果领域、成果来源进行查询")
@GetMapping("/getAllResult")
public TableDataInfo getAllResult(AchQueryVo achQueryVo) {
startPage();
return getDataTable(achievementsService.getAllResult(achQueryVo));
}
@ApiOperation("近七日用户行为数据")
@GetMapping("/getUerActionData")
public AjaxResult getUerActionData() {
return success(achievementsService.getUerActionData());
}
@ApiOperation("热门成果")
@GetMapping("/getHotAchievement")
public AjaxResult getHotAchievement() {
return success(achievementsService.getHotAchievement());
}
@ApiOperation("七日新增")
@GetMapping("/get7DayAdd")
public AjaxResult get7DayAdd(AchQueryVo achQueryVo) {
return success(achievementsService.get7DayAdd(achQueryVo));
}
@ApiOperation("首页项目统计")
@GetMapping("/indexProjectStatistic")
public AjaxResult indexProjectStatistic() {
return success(achievementsService.indexProjectStatistic());
}
@ApiOperation("首页task统计")
@GetMapping("/indexTaskStatistic")
public AjaxResult indexTaskStatistic() {
return success(achievementsService.indexTaskStatistic());
}
@ApiOperation("首页Competition统计")
@GetMapping("/indexCompetitionStatistic")
public AjaxResult indexCompetitionStatistic() {
return success(achievementsService.indexCompetitionStatistic());
}
@ApiOperation("首页SchoolEnterprise统计")
@GetMapping("/indexSchoolEnterpriseStatistic")
public AjaxResult indexSchoolEnterpriseStatistic() {
return success(achievementsService.indexSchoolEnterpriseStatistic());
}
@ApiOperation("首页专家统计")
@GetMapping("/indexExpertStatistic")
public AjaxResult indexExpertStatistic() {
return success(achievementsService.indexExpertStatistic());
}
@ApiOperation("根据当前用户以及成果ID,获取当前成果的 是否收藏与关注状态")
@GetMapping("/getWatchFavoriteStatusById")
public AjaxResult getWatchFavoriteStatusById(Long id, Long userId) {
return success(achievementsService.getWatchFavoriteStatusById(id, userId));
}
@ApiOperation("根据成果ID获取近7日成果点击数量折线图")
@GetMapping("/get7AddClickById")
public AjaxResult get7AddClickById(String id,@RequestParam(value = "clickType",required = false, defaultValue = "Achievements")
String clickType) {
return success(achievementsService.get7AddClickById(id,clickType));
}
@ApiOperation("根据专家id获取近7日成果点击数量折线图")
@GetMapping("/getExpert7AddClickById")
public AjaxResult getExpert7AddClickById(String id,@RequestParam(value = "clickType",required = false, defaultValue = "Experts")
String clickType) {
return success(achievementsService.get7AddClickById(id,clickType));
}
@ApiOperation("根据成果ID,获取成果的相关行为数据统计(点击量、搜索量、附件下载量、收藏、关注)")
@GetMapping("/getActDataStatisticById")
public AjaxResult getActDataStatisticById(Long id) {
return success(achievementsService.getActDataStatisticById(id));
}
@ApiOperation("根据领域来源、领域分类名称,获取领域相关数据")
@GetMapping("/getAllAreas")
public AjaxResult getAllAreas(String areaName) {
return success(achievementsService.getAllAreas(areaName));
}
@ApiOperation("根据领域,将成果数据进行分类")
@GetMapping("/getAreaStatistic")
public AjaxResult getAreaStatistic(String areaKey)
{
return success(achievementsService.getAreaStatistic(areaKey));
}
@ApiOperation("根据领域获取领域详情")
@GetMapping("/getAreaDetail")
public AjaxResult getAreaDetail(String areaKey,String kyxmSum,String source)
{
return success(achievementsService.getAreaDetail(areaKey,kyxmSum,source));
}
/**
* 获取开源项目的相关成果
*/
@ApiOperation(value = "获取开源项目的相关成果")
@GetMapping("/getRelatedAch")
public AjaxResult getRelatedAch(Long id,Long sourceId)
{
return success(achievementsService.getRelatedAch(id,sourceId));
}
@ApiOperation(value = "获取开源竞赛的相关成果")
@GetMapping("/getRelatedAchCompetition")
public AjaxResult getRelatedAchCompetition(Long id,Long sourceId)
{
return success(achievementsService.getRelatedAchCompetition(id,sourceId));
}
@ApiOperation(value = "获取创客任务的相关成果")
@GetMapping("/getRelatedAchTask")
public AjaxResult getRelatedAchTask(Long id,Long sourceId)
{
return success(achievementsService.getRelatedAchTask(id,sourceId));
}
@ApiOperation(value = "获取专家-创客任务的相关成果")
@GetMapping("/getRelatedAchTaskOfExpert")
public AjaxResult getRelatedAchTaskOfExpert(Long expertId)
{
return success(achievementsService.getRelatedAchTaskOfExpert(expertId));
}
@ApiOperation(value = "获取专家-开源竞赛的相关成果")
@GetMapping("/getRelatedAchCompetitionOfExpert")
public AjaxResult getRelatedAchCompetitionOfExpert(Long expertId)
{
return success(achievementsService.getRelatedAchCompetitionOfExpert(expertId));
}
@ApiOperation(value = "搜索行为数据记录")
@GetMapping("/getSearchResult")
public AjaxResult getSearchResult(String achName,Long userId)
{
return success(achievementsService.getSearchResult(achName,userId));
}
}

View File

@ -0,0 +1,99 @@
package com.microservices.dms.achievementLibrary.controller;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.dms.achievementLibrary.service.BigScreenStatisticService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@Api(tags = "数据管理体系-大屏统计接口")
@RequestMapping("/bigScreenStatistic")
public class BigScreenStatisticController {
private final BigScreenStatisticService bigScreenStatisticService;
@GetMapping(value = "/achievement/getAchievementTopStatistic")
@ApiOperation(value = "成果任务统计顶部折线图")
public AjaxResult getAchievementTopStatistic(String source) {
return AjaxResult.success(bigScreenStatisticService.getAchievementTopStatistic(source));
}
@GetMapping(value = "/achievement/getAchievementDataYearly")
@ApiOperation(value = "年度成果数据")
public AjaxResult getAchievementDataYearly() {
return AjaxResult.success(bigScreenStatisticService.getAchievementDataYearly());
}
@GetMapping(value = "/achievement/getAchievementType")
@ApiOperation(value = "成果类型")
public AjaxResult getAchievementType() {
return AjaxResult.success(bigScreenStatisticService.getAchievementType());
}
@GetMapping(value = "/achievement/getAchievementDomain")
@ApiOperation(value = "成果领域分布")
public AjaxResult getAchievementDomain() {
return AjaxResult.success(bigScreenStatisticService.getAchievementDomain());
}
@GetMapping(value = "/achievement/getAchievementAddYearly")
@ApiOperation(value = "近1年新增成果数")
public AjaxResult getAchievementAddYearly() {
return AjaxResult.success(bigScreenStatisticService.getAchievementAddYearly());
}
@GetMapping(value = "/achievement/getAchievementActData")
@ApiOperation(value = "成果行为数据展示")
public AjaxResult getAchievementActData() {
return AjaxResult.success(bigScreenStatisticService.getAchievementActData());
}
@GetMapping(value = "/achievement/getAchievementHotRank")
@ApiOperation(value = "成果热度排行")
public AjaxResult getAchievementHotRank() {
return AjaxResult.success(bigScreenStatisticService.getAchievementHotRank());
}
@GetMapping(value = "/competition/getCompetitionTopStatistic")
@ApiOperation(value = "competition统计顶部")
public AjaxResult getAchievementTopStatistic() {
return AjaxResult.success(bigScreenStatisticService.getCompetitionTopStatistic());
}
@GetMapping(value = "/competition/getCompetitionStatisticYearly")
@ApiOperation(value = "竞赛数据统计")
public AjaxResult getCompetitionStatisticYearly() {
return AjaxResult.success(bigScreenStatisticService.getCompetitionStatisticYearly());
}
@GetMapping(value = "/competition/getCompetitionHot")
@ApiOperation(value = "热门竞赛统计")
public AjaxResult getCompetitionHot() {
return AjaxResult.success(bigScreenStatisticService.getCompetitionHot());
}
@GetMapping(value = "/competition/getCompetitionYearlyPaperAdd")
@ApiOperation(value = "年度竞赛作品新增数")
public AjaxResult getCompetitionYearlyPaperAdd() {
return AjaxResult.success(bigScreenStatisticService.getCompetitionYearlyPaperAdd());
}
@GetMapping(value = "/competition/getCompetitionYearlyFinish")
@ApiOperation(value = "近1年竞赛完成情况")
public AjaxResult getCompetitionYearlyFinish() {
return AjaxResult.success(bigScreenStatisticService.getCompetitionYearlyFinish());
}
}

View File

@ -0,0 +1,115 @@
package com.microservices.dms.achievementLibrary.controller;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.core.web.page.TableDataInfo;
import com.microservices.dms.achievementLibrary.domain.BlockchainListQueryVo;
import com.microservices.dms.achievementLibrary.domain.TokenListVo;
import com.microservices.dms.achievementLibrary.domain.blockchain.InBlockchainData;
import com.microservices.dms.achievementLibrary.domain.blockchain.InLinkProjectVo;
import com.microservices.dms.achievementLibrary.domain.blockchain.UserVo;
import com.microservices.dms.achievementLibrary.service.BlockChainService;
import com.microservices.dms.achievementLibrary.service.InBlockchainDataServiceImpl;
import com.microservices.dms.common.vo.UserCreateVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/blockChain")
@Api(tags = "数据管理体系-数据产权子系统")
public class BlockChainController extends BaseController {
@Autowired
private BlockChainService blockChainService;
@Autowired
private InBlockchainDataServiceImpl inBlockchainDataService;
@GetMapping("/projectTokenList")
@ApiOperation(value = "项目token列表")
public TableDataInfo projectTokenList(String projectName) {
startPage();
List<TokenListVo> list = blockChainService.projectTokenList(projectName);
return getDataTable(list);
}
@GetMapping("/projectTokenDistribute")
@ApiOperation(value = "项目token分配、点击token分配按钮弹出框展示相关数据项目名称、分配token、被分配人")
public AjaxResult projectTokenDistribute(InLinkProjectVo projectVo) {
return blockChainService.projectTokenDistribute(projectVo);
}
@GetMapping("/issueDataList")
@ApiOperation(value = "入链issue列表")
public TableDataInfo issueDataList(BlockchainListQueryVo queryVo) {
startPage();
List<Map<String, Object>> list = blockChainService.issueDataList(queryVo);
return getDataTable(list);
}
@GetMapping("/commitDataList")
@ApiOperation(value = "入链commit列表")
public TableDataInfo commitDataList(BlockchainListQueryVo queryVo) {
startPage();
List<Map<String, Object>> list = blockChainService.commitDataList(queryVo);
return getDataTable(list);
}
@GetMapping("/prDataList")
@ApiOperation(value = "入链PR列表")
public TableDataInfo prDataList(BlockchainListQueryVo queryVo) {
startPage();
List<Map<String, Object>> list = blockChainService.prDataList(queryVo);
return getDataTable(list);
}
@GetMapping("/userDataList")
@ApiOperation(value = "入链user列表")
public TableDataInfo userDataList(BlockchainListQueryVo queryVo) {
List<Map> list = blockChainService.userDataList(queryVo);
return getDataTable(list);
}
@GetMapping("/userList")
@ApiOperation(value = "用户列表列表")
public TableDataInfo userList(UserVo userVo) {
startPage();
List<UserVo> list = blockChainService.userList(userVo);
return getDataTable(list);
}
@GetMapping("/InBlockchainDataList")
@ApiOperation(value = "查询区块链数据入链列表")
public TableDataInfo list(InBlockchainData inBlockchainData) {
startPage();
List<InBlockchainData> list = inBlockchainDataService.selectInBlockchainDataList(inBlockchainData);
return getDataTable(list);
}
@ApiOperation("提供入链项目信息查询")
@GetMapping("/queryBlockInfo")
public AjaxResult queryBlockInfo (String type,String typeId) {
return blockChainService.queryBlockInfo(type,typeId);
}
@ApiOperation("根据项目id获取用户对应的token")
@GetMapping("/getUserTokenByProjectId")
public AjaxResult getUserTokenByProjectId (String type,String userName,String tokenName) {
return blockChainService.getUserTokenByProjectId(type,userName,tokenName);
}
@ApiOperation("获取用户对应的所有项目token")
@GetMapping("/getUserAllProjectToken")
public AjaxResult getUserAllProjectToken (String userName) {
return blockChainService.getUserAllProjectToken(userName);
}
}

View File

@ -0,0 +1,51 @@
package com.microservices.dms.achievementLibrary.controller;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.dms.achievementLibrary.service.BlockChainService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/blockFisco")
@Api(tags = "数据管理体系-数据产权入链交易")
public class BlockFiscoController {
@Autowired
private BlockChainService blockChainService;
@GetMapping("/getTransactionByHash")
@ApiOperation(value = "通过交易哈希获取交易详情")
public AjaxResult getTransactionByHash(String txHash) {
return AjaxResult.success(blockChainService.getTransactionByHash(txHash));
}
@ApiOperation(value = "交易哈希获取交易回执")
@GetMapping("/getTransactionReceipt")
public AjaxResult getTransactionReceipt(String txHash) {
return AjaxResult.success(blockChainService.getTransactionReceipt(txHash));
}
@ApiOperation(value = "获取最新区块号")
@GetMapping("/blockNumber")
public AjaxResult getBlockNumber() {
return AjaxResult.success(blockChainService.getBlockNumber());
}
@ApiOperation(value = "获取区块链总交易数")
@GetMapping("/getTotalTransactionCount")
public AjaxResult getTotalTransactionCount() {
return AjaxResult.success(blockChainService.getTotalTransactionCount());
}
}

View File

@ -0,0 +1,76 @@
package com.microservices.dms.achievementLibrary.controller;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.dms.achievementLibrary.service.ExpertDashboardService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@Api(tags = "数据管理体系-专家可视化接口")
@RequestMapping("/expertDashboard")
public class ExpertDashboardController {
@Autowired
private ExpertDashboardService expertDashboardService;
@GetMapping(value = "getExpertTotal")
@ApiOperation(value = "获取专家总数")
public AjaxResult getExpertTotal() {
return AjaxResult.success(expertDashboardService.getExpertTotal());
}
@GetMapping(value = "getAuthenticationStatistic")
@ApiOperation(value = "专家实名完成度")
public AjaxResult getAuthenticationStatistic() {
return AjaxResult.success(expertDashboardService.getAuthenticationStatistic());
}
@GetMapping(value = "getTitleRankStatistic")
@ApiOperation(value = "专家职称级分布")
public AjaxResult getTitleRankStatistic() {
return AjaxResult.success(expertDashboardService.getTitleRankStatistic());
}
@GetMapping(value = "getExpertAduit")
@ApiOperation(value = "专家评审作品数排序")
public AjaxResult getExpertAduit() {
return AjaxResult.success(expertDashboardService.getExpertAduit());
}
@GetMapping(value = "getExpertTypeStatistic")
@ApiOperation(value = "专家专业类别")
public AjaxResult getExpertTypeStatistic() {
return AjaxResult.success(expertDashboardService.getExpertTypeStatistic());
}
@GetMapping(value = "getWorkplaceTypeStatistic")
@ApiOperation(value = "专家单位类别分布")
public AjaxResult getWorkplaceTypeStatistic() {
return AjaxResult.success(expertDashboardService.getWorkplaceTypeStatistic());
}
@GetMapping(value = "getHighestDegreeStatistic")
@ApiOperation(value = "专家学历分布")
public AjaxResult getHighestDegreeStatistic() {
return AjaxResult.success(expertDashboardService.getHighestDegreeStatistic());
}
//7年度专家数据统计 cretate_on
@GetMapping(value = "getExpertTotalByYear")
@ApiOperation(value = "年度专家数据统计")
public AjaxResult getExpertTotalByYear() {
return AjaxResult.success(expertDashboardService.getExpertTotalByYear());
}
@GetMapping(value = "getReviewAreasStatistic")
@ApiOperation(value = "热门专家领域")
public AjaxResult getReviewAreasStatistic() {
return AjaxResult.success(expertDashboardService.getReviewAreasStatistic());
}
}

View File

@ -0,0 +1,62 @@
package com.microservices.dms.achievementLibrary.controller;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.dms.achievementLibrary.service.MemoDashboardService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@Api(tags = "数据管理体系-社区动态可视化接口")
@RequestMapping("/memoDashboard")
public class MemoDashboardController {
@Autowired
private MemoDashboardService memoDashboardService;
@GetMapping(value = "getMemoAduit")
@ApiOperation(value = "帖子审核通过率、帖子总数")
public AjaxResult getMemoAduit() {
return AjaxResult.success(memoDashboardService.getMemoAduit());
}
@GetMapping(value = "getIsOriginalStatistic")
@ApiOperation(value = "帖子原创、非原创")
public AjaxResult getIsOriginalStatistic() {
return AjaxResult.success(memoDashboardService.getIsOriginalStatistic());
}
@GetMapping(value = "getMemoTotalByYear")
@ApiOperation(value = "年度论坛帖子总数")
public AjaxResult getMemoTotalByYear() {
return AjaxResult.success(memoDashboardService.getMemoTotalByYear());
}
@GetMapping(value = "getForumSectionStatistic")
@ApiOperation(value = "帖子分类")
public AjaxResult getForumSectionStatistic() {
return AjaxResult.success(memoDashboardService.getForumSectionStatistic());
}
@GetMapping(value = "getAddMemoStatistic")
@ApiOperation(value = "近一年新增帖子数")
public AjaxResult getAddMemoStatistic() {
return AjaxResult.success(memoDashboardService.getAddMemoStatistic());
}
@GetMapping(value = "getTop5Memos")
@ApiOperation(value = "年度帖子热度top5")
public AjaxResult getTop5Memos() {
return AjaxResult.success(memoDashboardService.getTop5Memos());
}
@GetMapping(value = "get7DayPaise")
@ApiOperation(value = "近7日帖子点赞数")
public AjaxResult get7DayPaise() {
return AjaxResult.success(memoDashboardService.get7DayPaise());
}
}

View File

@ -0,0 +1,149 @@
package com.microservices.dms.achievementLibrary.controller;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.core.utils.poi.ExcelUtil;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.core.web.page.TableDataInfo;
import com.microservices.common.log.annotation.Log;
import com.microservices.common.log.enums.BusinessType;
import com.microservices.common.security.utils.SecurityUtils;
import com.microservices.dms.achievementLibrary.domain.SchoolEnterpriseAchievements;
import com.microservices.dms.achievementLibrary.service.ISchoolEnterpriseAchievementsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* 校企成果Controller
*
* @author microservices
* @date 2025-04-03
*/
@Api(tags = "数据管理体系-校企成果接口")
@RestController
@RequestMapping("/schoolEnterpriseAchievements")
public class SchoolEnterpriseAchievementsController extends BaseController
{
@Autowired
private ISchoolEnterpriseAchievementsService schoolEnterpriseAchievementsService;
/**
* 查询校企成果列表
*/
@GetMapping("/list")
public TableDataInfo list(SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
startPage();
List<SchoolEnterpriseAchievements> list = schoolEnterpriseAchievementsService.selectSchoolEnterpriseAchievementsList(schoolEnterpriseAchievements);
return getDataTable(list);
}
/**
* 查询校企成果列表
*/
@GetMapping("/listFront")
public TableDataInfo listFront(SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
startPage();
List<SchoolEnterpriseAchievements> list = schoolEnterpriseAchievementsService.listFront(schoolEnterpriseAchievements);
return getDataTable(list);
}
/**
* 导出校企成果列表
*/
@Log(title = "校企成果", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
List<SchoolEnterpriseAchievements> list = schoolEnterpriseAchievementsService.selectSchoolEnterpriseAchievementsList(schoolEnterpriseAchievements);
ExcelUtil<SchoolEnterpriseAchievements> util = new ExcelUtil<SchoolEnterpriseAchievements>(SchoolEnterpriseAchievements.class);
util.exportExcel(response, list, "校企成果数据");
}
/**
* 获取校企成果详细信息
*/
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(schoolEnterpriseAchievementsService.selectSchoolEnterpriseAchievementsById(id));
}
/**
* 新增校企成果
*/
@Log(title = "校企成果", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
if (!schoolEnterpriseAchievementsService.getCheckSchoolAchName(schoolEnterpriseAchievements)) {
return error("新增校企成果'" + schoolEnterpriseAchievements.getAchievementName() + "'失败,成果名称已存在");
}
return AjaxResult.success(schoolEnterpriseAchievementsService.insertSchoolEnterpriseAchievements(schoolEnterpriseAchievements));
}
@PostMapping("/importData")
@Log(title = "校企成果", businessType = BusinessType.INSERT)
public AjaxResult importData(@RequestPart("file") MultipartFile file,
@RequestParam(value = "updateSupport", defaultValue = "false") boolean updateSupport) throws Exception {
ExcelUtil<SchoolEnterpriseAchievements> util = new ExcelUtil<>(SchoolEnterpriseAchievements.class);
// 1. 解析Excel获取实体列表和图片Map
List<SchoolEnterpriseAchievements> list = util.importExcelWithImages(StringUtils.EMPTY, file.getInputStream(), 0);
Map<String, MultipartFile> imageMap = util.getExcelImageMap();
// 2. 调用业务层处理传入实体列表和图片Map
String operName = SecurityUtils.getUsername();
String message = schoolEnterpriseAchievementsService.batchInsertSchoolEnterpriseAchievements(list, imageMap, updateSupport, operName);
return AjaxResult.success(message);
}
/**
* 修改校企成果
*/
@Log(title = "校企成果", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
// if (!schoolEnterpriseAchievementsService.getCheckSchoolAchName(schoolEnterpriseAchievements)) {
// return error("修改校企成果'" + schoolEnterpriseAchievements.getAchievementName() + "'失败,成果名称已存在");
// }
return AjaxResult.success(schoolEnterpriseAchievementsService.updateSchoolEnterpriseAchievements(schoolEnterpriseAchievements));
}
/**
* 删除校企成果
*/
@Log(title = "校企成果", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return AjaxResult.success(schoolEnterpriseAchievementsService.deleteSchoolEnterpriseAchievementsByIds(ids));
}
/**
* 顶部统计
*/
@GetMapping("/topStatistic")
@ApiOperation(value = "顶部统计数据")
@ApiImplicitParams({
@ApiImplicitParam(name = "tags", value = "成果标签", paramType = "query", dataTypeClass = String.class),
@ApiImplicitParam(name = "status", value = "成果状态", paramType = "query", dataTypeClass = Integer.class),
})
public AjaxResult topStatistic(SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
Long value = schoolEnterpriseAchievementsService.topStatistic(schoolEnterpriseAchievements);
return AjaxResult.success(value);
}
}

View File

@ -0,0 +1,15 @@
package com.microservices.dms.achievementLibrary.domain;
import lombok.Data;
import java.util.List;
@Data
public class AchDetailVo {
private List<Achievements> achievementsList;
private long clickSum;
private long dockSum;
private long favoriteSum;
private long watcherSum;
private String remark;
}

View File

@ -0,0 +1,49 @@
package com.microservices.dms.achievementLibrary.domain;
public class AchQueryVo {
private String areaQuery;//领域
private String source;//来源
private String achievementName;//名称
private Long userId;
private String showAchievementName;
public String getAreaQuery() {
return areaQuery;
}
public void setAreaQuery(String areaQuery) {
this.areaQuery = areaQuery;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getAchievementName() {
return achievementName;
}
public void setAchievementName(String achievementName) {
this.achievementName = achievementName;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getShowAchievementName() {
return showAchievementName;
}
public void setShowAchievementName(String showAchievementName) {
this.showAchievementName = showAchievementName;
}
}

View File

@ -0,0 +1,24 @@
package com.microservices.dms.achievementLibrary.domain;
import java.util.List;
public class AchRelatedResult {
private String year;
private List<AchRelatedVo> achRelatedVoList;
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public List<AchRelatedVo> getAchRelatedVoList() {
return achRelatedVoList;
}
public void setAchRelatedVoList(List<AchRelatedVo> achRelatedVoList) {
this.achRelatedVoList = achRelatedVoList;
}
}

View File

@ -0,0 +1,85 @@
package com.microservices.dms.achievementLibrary.domain;
public class AchRelatedVo {
private Long id;
private String attachments;
private String summary;
private String achievementType;
private String achMonthDay;
private String source;
private Long sourceId;
private String achRelateName;
private String showAchievementName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAttachments() {
return attachments;
}
public void setAttachments(String attachments) {
this.attachments = attachments;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getAchievementType() {
return achievementType;
}
public void setAchievementType(String achievementType) {
this.achievementType = achievementType;
}
public String getAchMonthDay() {
return achMonthDay;
}
public void setAchMonthDay(String achMonthDay) {
this.achMonthDay = achMonthDay;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public Long getSourceId() {
return sourceId;
}
public void setSourceId(Long sourceId) {
this.sourceId = sourceId;
}
public String getAchRelateName() {
return achRelateName;
}
public void setAchRelateName(String achRelateName) {
this.achRelateName = achRelateName;
}
public String getShowAchievementName() {
return showAchievementName;
}
public void setShowAchievementName(String showAchievementName) {
this.showAchievementName = showAchievementName;
}
}

View File

@ -0,0 +1,112 @@
package com.microservices.dms.achievementLibrary.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.web.domain.BaseEntity;
/**
* 成果相关字典对象 achievement_dict_data
*
* @author microservices
* @date 2025-05-23
*/
public class AchievementDictData extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 字典编码 */
private Long dictCode;
/** 字典排序 */
@Excel(name = "字典排序")
private Integer dictSort;
/** 字典标签 */
@Excel(name = "字典标签")
private String dictLabel;
/** 字典键值 */
@Excel(name = "字典键值")
private String dictValue;
/** 字典类型 */
@Excel(name = "字典类型")
private String dictType;
/** 状态0正常 1停用 */
@Excel(name = "状态", readConverterExp = "0=正常,1=停用")
private String status;
public void setDictCode(Long dictCode)
{
this.dictCode = dictCode;
}
public Long getDictCode()
{
return dictCode;
}
public void setDictSort(Integer dictSort)
{
this.dictSort = dictSort;
}
public Integer getDictSort()
{
return dictSort;
}
public void setDictLabel(String dictLabel)
{
this.dictLabel = dictLabel;
}
public String getDictLabel()
{
return dictLabel;
}
public void setDictValue(String dictValue)
{
this.dictValue = dictValue;
}
public String getDictValue()
{
return dictValue;
}
public void setDictType(String dictType)
{
this.dictType = dictType;
}
public String getDictType()
{
return dictType;
}
public void setStatus(String status)
{
this.status = status;
}
public String getStatus()
{
return status;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("dictCode", getDictCode())
.append("dictSort", getDictSort())
.append("dictLabel", getDictLabel())
.append("dictValue", getDictValue())
.append("dictType", getDictType())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

View File

@ -0,0 +1,195 @@
package com.microservices.dms.achievementLibrary.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.web.domain.BaseEntity;
/**
* 成果团队对象 achievement_team
*
* @author microservices
* @date 2025-04-23
*/
public class AchievementTeam extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键 */
private Long id;
/** 成果ld */
@Excel(name = "成果ld")
private Long achievementId;
/** 姓名 */
@Excel(name = "姓名")
private String username;
/** 所属单位 */
@Excel(name = "所属单位")
private String company;
/** 职称 */
@Excel(name = "职称")
private String technicalTitle;
/** 专业 */
@Excel(name = "专业")
private String professionalTitle;
/** 研究方向 */
@Excel(name = "研究方向")
private String researchDirection;
/** 联系方式 */
@Excel(name = "联系方式")
private String phone;
/** 个人简介 */
@Excel(name = "个人简介")
private String summary;
/** 本项成果中主要承担工作 */
@Excel(name = "本项成果中主要承担工作")
private String workContent;
/** 是否是负责人 */
@Excel(name = "是否是负责人")
private String isLeader;
/** $column.columnComment */
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private Long status;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setAchievementId(Long achievementId)
{
this.achievementId = achievementId;
}
public Long getAchievementId()
{
return achievementId;
}
public void setUsername(String username)
{
this.username = username;
}
public String getUsername()
{
return username;
}
public void setCompany(String company)
{
this.company = company;
}
public String getCompany()
{
return company;
}
public void setTechnicalTitle(String technicalTitle)
{
this.technicalTitle = technicalTitle;
}
public String getTechnicalTitle()
{
return technicalTitle;
}
public void setProfessionalTitle(String professionalTitle)
{
this.professionalTitle = professionalTitle;
}
public String getProfessionalTitle()
{
return professionalTitle;
}
public void setResearchDirection(String researchDirection)
{
this.researchDirection = researchDirection;
}
public String getResearchDirection()
{
return researchDirection;
}
public void setPhone(String phone)
{
this.phone = phone;
}
public String getPhone()
{
return phone;
}
public void setSummary(String summary)
{
this.summary = summary;
}
public String getSummary()
{
return summary;
}
public void setWorkContent(String workContent)
{
this.workContent = workContent;
}
public String getWorkContent()
{
return workContent;
}
public void setIsLeader(String isLeader)
{
this.isLeader = isLeader;
}
public String getIsLeader()
{
return isLeader;
}
public void setStatus(Long status)
{
this.status = status;
}
public Long getStatus()
{
return status;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("achievementId", getAchievementId())
.append("username", getUsername())
.append("company", getCompany())
.append("technicalTitle", getTechnicalTitle())
.append("professionalTitle", getProfessionalTitle())
.append("researchDirection", getResearchDirection())
.append("phone", getPhone())
.append("summary", getSummary())
.append("workContent", getWorkContent())
.append("isLeader", getIsLeader())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -0,0 +1,554 @@
package com.microservices.dms.achievementLibrary.domain;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.web.domain.BaseEntity;
/**
* 成果对象 achievementsll
*
* @author microservices
* @date 2025-04-02
*/
public class Achievements extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 成果唯一标识
*/
private Long id;
/**
* 成果名称
*/
@Excel(name = "成果名称")
private String achievementName;
/**
* 成果展示名称
*/
private String showAchievementName;
/**
* 成果领域1
*/
@Excel(name = "成果领域1")
private String field1;
//成果领域名称
private String field1Name;
/**
* 成果领域2
*/
@Excel(name = "成果领域2")
private String field2;
/**
* 成果领域3
*/
@Excel(name = "成果领域3")
private String field3;
/**
* 成果类型
*/
@Excel(name = "成果类型")
private String achievementType;
/**
* 成果来源
*/
@Excel(name = "成果来源")
private String source;
/**
* 成果来源ID
*/
@Excel(name = "成果来源ID")
private Long sourceId;
/**
* 成果来源跳转链接
*/
@Excel(name = "成果来源跳转链接")
private String sourceLink;
/**
* 成果标签
*/
@Excel(name = "成果标签")
private String tags;
/**
* 成果摘要
*/
@Excel(name = "成果摘要")
private String summary;
/**
* 发布单位
*/
@Excel(name = "发布单位")
private String publishingUnit;
/**
* 成果地址
*/
@Excel(name = "成果地址")
private String address;
/**
* 是否精选成果
*/
@Excel(name = "是否精选成果")
private Integer isFeatured;
/**
* 联系人
*/
@Excel(name = "联系人")
private String contactPerson;
/**
* 联系电话
*/
@Excel(name = "联系电话")
private String contactNumber;
/**
* 成果所属人ID
*/
@Excel(name = "成果所属人ID")
private String ownerId;
/**
* 成果所属人名称
*/
@Excel(name = "成果所属人名称")
private String ownerName;
/**
* 成果状态
*/
@Excel(name = "成果状态")
private String status;
/**
* 成果详情
*/
@Excel(name = "成果详情")
private String details;
/**
* 成果审核人
*/
@Excel(name = "成果审核人")
private String reviewer;
/**
* 成果审核时间
*/
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "成果审核时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date reviewDate;
/**
* 成果审核意见
*/
@Excel(name = "成果审核意见")
private String reviewComments;
/**
* 成果图片
*/
@Excel(name = "图片")
private String images;
/**
* 成果附件
*/
@Excel(name = "成果附件")
private String attachments;
//成果小类
private String ext1;
//成果状态
private String ext2;
//成果团队名称
private String ext3;
private Long clickSum;
private Long watcherSum;
private Long favoriteSum;
private Long dockSum;
private String filedDesc;
private Float hotRank;
private Long attachmentCount;
private Integer isExpertAudit;
private String userImg;
private String userNickName;
public String gender;
private String userLogin;
private List<Map<String,Object>> dockingUserInfo;
public String getExt1() {
return ext1;
}
public void setExt1(String ext1) {
this.ext1 = ext1;
}
public String getExt2() {
return ext2;
}
public void setExt2(String ext2) {
this.ext2 = ext2;
}
public String getExt3() {
return ext3;
}
public void setExt3(String ext3) {
this.ext3 = ext3;
}
public List<Map<String, Object>> getDockingUserInfo() {
return dockingUserInfo;
}
public void setDockingUserInfo(List<Map<String, Object>> dockingUserInfo) {
this.dockingUserInfo = dockingUserInfo;
}
public String getFiledDesc() {
return filedDesc;
}
public void setFiledDesc(String filedDesc) {
this.filedDesc = filedDesc;
}
public Long getDockSum() {
return dockSum;
}
public void setDockSum(Long dockSum) {
this.dockSum = dockSum;
}
public String getShowAchievementName() {
return showAchievementName;
}
public void setShowAchievementName(String showAchievementName) {
this.showAchievementName = showAchievementName;
}
public String getUserImg() {
return userImg;
}
public void setUserImg(String userImg) {
this.userImg = userImg;
}
public String getUserNickName() {
return userNickName;
}
public void setUserNickName(String userNickName) {
this.userNickName = userNickName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getUserLogin() {
return userLogin;
}
public void setUserLogin(String userLogin) {
this.userLogin = userLogin;
}
public String getField1Name() {
return field1Name;
}
public void setField1Name(String field1Name) {
this.field1Name = field1Name;
}
public Long getWatcherSum() {
return watcherSum;
}
public void setWatcherSum(Long watcherSum) {
this.watcherSum = watcherSum;
}
public Long getFavoriteSum() {
return favoriteSum;
}
public void setFavoriteSum(Long favoriteSum) {
this.favoriteSum = favoriteSum;
}
public Float getHotRank() {
return hotRank;
}
public void setHotRank(Float hotRank) {
this.hotRank = hotRank;
}
public Integer getIsExpertAudit() {
return isExpertAudit;
}
public void setIsExpertAudit(Integer isExpertAudit) {
this.isExpertAudit = isExpertAudit;
}
public Long getAttachmentCount() {
return attachmentCount;
}
public void setAttachmentCount(Long attachmentCount) {
this.attachmentCount = attachmentCount;
}
public Long getClickSum() {
return clickSum;
}
public void setClickSum(Long clickSum) {
this.clickSum = clickSum;
}
private List<KeyValVo> attachmentList;
public List<KeyValVo> getAttachmentList() {
return attachmentList;
}
public void setAttachmentList(List<KeyValVo> attachmentList) {
this.attachmentList = attachmentList;
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setAchievementName(String achievementName) {
this.achievementName = achievementName;
}
public String getAchievementName() {
return achievementName;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField1() {
return field1;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField2() {
return field2;
}
public void setField3(String field3) {
this.field3 = field3;
}
public String getField3() {
return field3;
}
public void setAchievementType(String achievementType) {
this.achievementType = achievementType;
}
public String getAchievementType() {
return achievementType;
}
public void setSource(String source) {
this.source = source;
}
public String getSource() {
return source;
}
public void setSourceId(Long sourceId) {
this.sourceId = sourceId;
}
public Long getSourceId() {
return sourceId;
}
public void setSourceLink(String sourceLink) {
this.sourceLink = sourceLink;
}
public String getSourceLink() {
return sourceLink;
}
public void setTags(String tags) {
this.tags = tags;
}
public String getTags() {
return tags;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getSummary() {
return summary;
}
public void setPublishingUnit(String publishingUnit) {
this.publishingUnit = publishingUnit;
}
public String getPublishingUnit() {
return publishingUnit;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
public void setIsFeatured(Integer isFeatured) {
this.isFeatured = isFeatured;
}
public Integer getIsFeatured() {
return isFeatured;
}
public void setContactPerson(String contactPerson) {
this.contactPerson = contactPerson;
}
public String getContactPerson() {
return contactPerson;
}
public void setContactNumber(String contactNumber) {
this.contactNumber = contactNumber;
}
public String getContactNumber() {
return contactNumber;
}
public void setOwnerId(String ownerId) {
this.ownerId = ownerId;
}
public String getOwnerId() {
return ownerId;
}
public void setOwnerName(String ownerName) {
this.ownerName = ownerName;
}
public String getOwnerName() {
return ownerName;
}
public void setStatus(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
public void setDetails(String details) {
this.details = details;
}
public String getDetails() {
return details;
}
public void setReviewer(String reviewer) {
this.reviewer = reviewer;
}
public String getReviewer() {
return reviewer;
}
public void setReviewDate(Date reviewDate) {
this.reviewDate = reviewDate;
}
public Date getReviewDate() {
return reviewDate;
}
public void setReviewComments(String reviewComments) {
this.reviewComments = reviewComments;
}
public String getReviewComments() {
return reviewComments;
}
public void setImages(String images) {
this.images = images;
}
public String getImages() {
return images;
}
public void setAttachments(String attachments) {
this.attachments = attachments;
}
public String getAttachments() {
return attachments;
}
}

View File

@ -0,0 +1,83 @@
package com.microservices.dms.achievementLibrary.domain;
public class AreaStatisticVo {
//领域名称
private String areaName;
//领域key
private String areaKey;
//领域说明
private String remark;
//开源项目汇总
private Long kyxmSum;
//创客任务汇总
private Long ckrwSum;
//开放竞赛汇总
private Long kfjsSum;
//校企成果汇总
private Long xqcgSum;
private String source;
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public String getAreaKey() {
return areaKey;
}
public void setAreaKey(String areaKey) {
this.areaKey = areaKey;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Long getKyxmSum() {
return kyxmSum;
}
public void setKyxmSum(Long kyxmSum) {
this.kyxmSum = kyxmSum;
}
public Long getCkrwSum() {
return ckrwSum;
}
public void setCkrwSum(Long ckrwSum) {
this.ckrwSum = ckrwSum;
}
public Long getKfjsSum() {
return kfjsSum;
}
public void setKfjsSum(Long kfjsSum) {
this.kfjsSum = kfjsSum;
}
public Long getXqcgSum() {
return xqcgSum;
}
public void setXqcgSum(Long xqcgSum) {
this.xqcgSum = xqcgSum;
}
}

View File

@ -0,0 +1,25 @@
package com.microservices.dms.achievementLibrary.domain;
import java.util.List;
public class AreasTjVo {
private Long areaSum;
private List<KeyValueVo> areaDetails;
public Long getAreaSum() {
return areaSum;
}
public void setAreaSum(Long areaSum) {
this.areaSum = areaSum;
}
public List<KeyValueVo> getAreaDetails() {
return areaDetails;
}
public void setAreaDetails(List<KeyValueVo> areaDetails) {
this.areaDetails = areaDetails;
}
}

View File

@ -0,0 +1,12 @@
package com.microservices.dms.achievementLibrary.domain;
import lombok.Data;
@Data
public class BlockchainListQueryVo {
private String projectName;
private String issueName;
private String prName;
private String userName;
private Long userId;
}

View File

@ -0,0 +1,44 @@
package com.microservices.dms.achievementLibrary.domain;
public class ExpertTotallVo {
//专家名称
private String name;
//任务审核数
private Long taskAuditSum;
//竞赛审核数
private Long competitionAuditSum;
//总数
private Long total;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getTaskAuditSum() {
return taskAuditSum;
}
public void setTaskAuditSum(Long taskAuditSum) {
this.taskAuditSum = taskAuditSum;
}
public Long getCompetitionAuditSum() {
return competitionAuditSum;
}
public void setCompetitionAuditSum(Long competitionAuditSum) {
this.competitionAuditSum = competitionAuditSum;
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
}

View File

@ -0,0 +1,95 @@
package com.microservices.dms.achievementLibrary.domain;
public class HotAchVo {
private int watcher;
private int faviter;
private int total;
private String gender;
private String name;
private String showAchievementName;
private Long id;
private String userNickName;
private String userName;
private String userImg;
public String getUserImg() {
return userImg;
}
public void setUserImg(String userImg) {
this.userImg = userImg;
}
public int getWatcher() {
return watcher;
}
public void setWatcher(int watcher) {
this.watcher = watcher;
}
public int getFaviter() {
return faviter;
}
public void setFaviter(int faviter) {
this.faviter = faviter;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserNickName() {
return userNickName;
}
public void setUserNickName(String userNickName) {
this.userNickName = userNickName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getShowAchievementName() {
return showAchievementName;
}
public void setShowAchievementName(String showAchievementName) {
this.showAchievementName = showAchievementName;
}
}

View File

@ -0,0 +1,58 @@
package com.microservices.dms.achievementLibrary.domain;
public class KeyValueVo {
private String key;
private String name;
private String result;
private Long value;
private Long value2;
private Long total;
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public Long getValue2() {
return value2;
}
public void setValue2(Long value2) {
this.value2 = value2;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Long getValue() {
return value;
}
public void setValue(Long value) {
this.value = value;
}
}

View File

@ -0,0 +1,74 @@
package com.microservices.dms.achievementLibrary.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
public class MemoTotalVo {
private Long id;
private String subject;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "发布时间", hidden = true)
private Date publishedAt;
private Long viewedCount;
private Long praisesCount;
private Long repliesCount;
private Long behavioreSum;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public Date getPublishedAt() {
return publishedAt;
}
public void setPublishedAt(Date publishedAt) {
this.publishedAt = publishedAt;
}
public Long getViewedCount() {
return viewedCount;
}
public void setViewedCount(Long viewedCount) {
this.viewedCount = viewedCount;
}
public Long getPraisesCount() {
return praisesCount;
}
public void setPraisesCount(Long praisesCount) {
this.praisesCount = praisesCount;
}
public Long getRepliesCount() {
return repliesCount;
}
public void setRepliesCount(Long repliesCount) {
this.repliesCount = repliesCount;
}
public Long getBehavioreSum() {
return behavioreSum;
}
public void setBehavioreSum(Long behavioreSum) {
this.behavioreSum = behavioreSum;
}
}

View File

@ -0,0 +1,467 @@
package com.microservices.dms.achievementLibrary.domain;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.web.domain.BaseEntity;
/**
* 校企成果对象 school_enterprise_achievements
*
* @author microservices
* @date 2025-04-03
*/
public class SchoolEnterpriseAchievements extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 成果唯一标识
*/
private Long id;
/**
* 成果名称
*/
@Excel(name = "成果名称")
private String achievementName;
/**
* 成果领域1
*/
@Excel(
name = "成果领域",
readConverterExp = "1=理论研究,2=政策法规,3=医学,4=电子信息,5=通信工程,6=计算机科学,7=软件工程,9=人工智能,10=知识图谱,12=大数据,23=机器人,24=无人系统,25=创意征集,26=文献翻译,27=成果转化,28=科技协同,29=科研组织模式,30=新兴领域,31=其他,32=电子元器件,33=测试仪器,34=军事历史,35=计算机网络"
)
private String field1;
/**
* 成果领域2
*/
@Excel(name = "成果领域2")
private String field2;
/**
* 成果领域3
*/
@Excel(name = "成果领域3")
private String field3;
/**
* 成果类型
*/
@Excel(name = "成果类型", readConverterExp = "1=理论成果,2=技术成果,3=应用成果,4=软科学成果,5=文化艺术成果,6=社会服务成果,7=交叉领域成果")
private String achievementType;
/**
* 成果来源
*/
@Excel(name = "成果来源")
private String source;
/**
* 成果来源ID
*/
@Excel(name = "成果来源ID")
private String sourceId;
/**
* 成果来源跳转链接
*/
@Excel(name = "成果来源跳转链接")
private String sourceLink;
/**
* 成果标签
*/
@Excel(
name = "成果标签",
readConverterExp = "1=高校,2=企业,3=其他"
)
private String tags;
/**
* 成果摘要
*/
@Excel(name = "成果摘要")
private String summary;
/**
* 发布单位
*/
@Excel(name = "发布单位")
private String publishingUnit;
/**
* 成果地址
*/
@Excel(name = "成果地址")
private String address;
/**
* 是否精选成果
*/
@Excel(name = "是否精选成果")
private Integer isFeatured;
/**
* 联系人
*/
@Excel(name = "联系人")
private String contactPerson;
/**
* 联系电话
*/
@Excel(name = "联系电话")
private String contactNumber;
/**
* 成果所属人ID
*/
@Excel(name = "成果所属人ID")
private String ownerId;
/**
* 成果所属人名称
*/
@Excel(name = "成果所属人名称")
private String ownerName;
/**
* 成果状态
*/
@Excel(name = "校企成果的状态 1是通过3是不通过")
private String status;
/**
* 成果详情
*/
@Excel(name = "成果详情")
private String details;
/**
* 成果审核人
*/
@Excel(name = "成果审核人")
private String reviewer;
/**
* 成果审核时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "成果审核时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date reviewDate;
/**
* 成果审核意见
*/
@Excel(name = "成果审核意见")
private String reviewComments;
/**
* 成果图片
*/
@Excel(name = "图片")
private String images;
/**
* 成果附件
*/
@Excel(name = "成果附件")
private String attachments;
private Integer achievementStatus;
//成果小类型
@Excel(
name = "成果小类型",
readConverterExp = "7=学术论文,8=学术专著,9=理论模型,10=发明专利,11=技术标准,12=软件系统,13=技术原型,14=产品设备,15=解决方案,16=示范工程,17=政策建议,18=咨询报告,19=行业标准,20=管理办法,21=文学作品,22=艺术作品,23=公益项目,24=社会调查报告,25=教育培训成果,26=理论模型+产品设备,27=学术论文+技术原型"
)
private String achievementLittleType;
@Excel(
name = "成果状态",
readConverterExp = "1=已有阶段性成果,2=已有成熟成果,3=已公开发表,4=已对外发布,5=已开展应用,6=已形成商业化产品"
)
private String achievementCurStatus;
//团队名称
private String teamName;
private List<AchievementTeam> teamList;
public List<AchievementTeam> getTeamList() {
return teamList;
}
public void setTeamList(List<AchievementTeam> teamList) {
this.teamList = teamList;
}
public String getTeamName() {
return teamName;
}
public void setTeamName(String teamName) {
this.teamName = teamName;
}
public String getAchievementLittleType() {
return achievementLittleType;
}
public void setAchievementLittleType(String achievementLittleType) {
this.achievementLittleType = achievementLittleType;
}
public String getAchievementCurStatus() {
return achievementCurStatus;
}
public void setAchievementCurStatus(String achievementCurStatus) {
this.achievementCurStatus = achievementCurStatus;
}
public Integer getAchievementStatus() {
return achievementStatus;
}
public void setAchievementStatus(Integer achievementStatus) {
this.achievementStatus = achievementStatus;
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setAchievementName(String achievementName) {
this.achievementName = achievementName;
}
public String getAchievementName() {
return achievementName;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField1() {
return field1;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField2() {
return field2;
}
public void setField3(String field3) {
this.field3 = field3;
}
public String getField3() {
return field3;
}
public void setAchievementType(String achievementType) {
this.achievementType = achievementType;
}
public String getAchievementType() {
return achievementType;
}
public void setSource(String source) {
this.source = source;
}
public String getSource() {
return source;
}
public void setSourceId(String sourceId) {
this.sourceId = sourceId;
}
public String getSourceId() {
return sourceId;
}
public void setSourceLink(String sourceLink) {
this.sourceLink = sourceLink;
}
public String getSourceLink() {
return sourceLink;
}
public void setTags(String tags) {
this.tags = tags;
}
public String getTags() {
return tags;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getSummary() {
return summary;
}
public void setPublishingUnit(String publishingUnit) {
this.publishingUnit = publishingUnit;
}
public String getPublishingUnit() {
return publishingUnit;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
public void setIsFeatured(Integer isFeatured) {
this.isFeatured = isFeatured;
}
public Integer getIsFeatured() {
return isFeatured;
}
public void setContactPerson(String contactPerson) {
this.contactPerson = contactPerson;
}
public String getContactPerson() {
return contactPerson;
}
public void setContactNumber(String contactNumber) {
this.contactNumber = contactNumber;
}
public String getContactNumber() {
return contactNumber;
}
public void setOwnerId(String ownerId) {
this.ownerId = ownerId;
}
public String getOwnerId() {
return ownerId;
}
public void setOwnerName(String ownerName) {
this.ownerName = ownerName;
}
public String getOwnerName() {
return ownerName;
}
public void setStatus(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
public void setDetails(String details) {
this.details = details;
}
public String getDetails() {
return details;
}
public void setReviewer(String reviewer) {
this.reviewer = reviewer;
}
public String getReviewer() {
return reviewer;
}
public void setReviewDate(Date reviewDate) {
this.reviewDate = reviewDate;
}
public Date getReviewDate() {
return reviewDate;
}
public void setReviewComments(String reviewComments) {
this.reviewComments = reviewComments;
}
public String getReviewComments() {
return reviewComments;
}
public void setImages(String images) {
this.images = images;
}
public String getImages() {
return images;
}
public void setAttachments(String attachments) {
this.attachments = attachments;
}
public String getAttachments() {
return attachments;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("achievementName", getAchievementName())
.append("field1", getField1())
.append("field2", getField2())
.append("field3", getField3())
.append("achievementType", getAchievementType())
.append("source", getSource())
.append("sourceId", getSourceId())
.append("sourceLink", getSourceLink())
.append("tags", getTags())
.append("summary", getSummary())
.append("publishingUnit", getPublishingUnit())
.append("address", getAddress())
.append("isFeatured", getIsFeatured())
.append("contactPerson", getContactPerson())
.append("contactNumber", getContactNumber())
.append("ownerId", getOwnerId())
.append("ownerName", getOwnerName())
.append("status", getStatus())
.append("details", getDetails())
.append("reviewer", getReviewer())
.append("reviewDate", getReviewDate())
.append("reviewComments", getReviewComments())
.append("images", getImages())
.append("attachments", getAttachments())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -0,0 +1,24 @@
package com.microservices.dms.achievementLibrary.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class TokenListVo {
private Long id; // 项目ID
private String name; // 项目名称
private String userId;//用户id
private Long totalToken; // 项目总Token
private String createBy; // 创建人
private Long issueToken;//issueToken
private Long currentToken; // 当前Token
private String repositoryName; // 仓库名称
private Long repositoryId; // 仓库名称
private Long applyToken;//已分配token
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createdOn; // 项目创建时间
private Long ableApplyToken;//责任人可分配token
}

View File

@ -0,0 +1,81 @@
package com.microservices.dms.achievementLibrary.domain.blockchain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.web.domain.BaseEntity;
/**
* 区块链数据入链对象 in_blockchain_data
*
* @author microservices
* @date 2025-05-27
*/
public class InBlockchainData extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
private Long id;
/** 数据类型pr、issue、commit */
@Excel(name = "数据类型pr、issue、commit")
private String type;
/** 关联类型的唯一标识符 */
@Excel(name = "关联类型的唯一标识符")
private String typeId;
/** 交易哈希值 */
@Excel(name = "交易哈希值")
private String txHash;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setType(String type)
{
this.type = type;
}
public String getType()
{
return type;
}
public void setTypeId(String typeId)
{
this.typeId = typeId;
}
public String getTypeId()
{
return typeId;
}
public void setTxHash(String txHash)
{
this.txHash = txHash;
}
public String getTxHash()
{
return txHash;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("type", getType())
.append("typeId", getTypeId())
.append("txHash", getTxHash())
.append("createTime", getCreateTime())
.append("createBy", getCreateBy())
.toString();
}
}

View File

@ -0,0 +1,35 @@
package com.microservices.dms.achievementLibrary.domain.blockchain;
import java.io.Serializable;
public class InLinkProjectVo implements Serializable {
private Long amount;
private String projectId;
private String userId;
public Long getAmount() {
return this.amount;
}
public void setAmount(Long amount) {
this.amount = amount;
}
public String getProjectId() {
return this.projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
public String getUserId() {
return this.userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}

View File

@ -0,0 +1,152 @@
package com.microservices.dms.achievementLibrary.domain.blockchain;
import java.math.BigDecimal;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.web.domain.BaseEntity;
/**
* 用户/项目转账信息记录对象 user_project_transfer_records
*
* @author microservices
* @date 2025-05-27
*/
public class UserProjectTransferRecords extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 唯一标识每条记录 */
private Long id;
/** 付款方ID */
@Excel(name = "付款方ID")
private String payerId;
/** 项目ID */
@Excel(name = "项目ID")
private String projectId;
/** 转账金额,支持高精度数值 */
@Excel(name = "转账金额,支持高精度数值")
private BigDecimal token;
/** 收款方ID */
@Excel(name = "收款方ID")
private String payeeId;
/** 交易哈希值,确保每一笔交易唯一 */
@Excel(name = "交易哈希值,确保每一笔交易唯一")
private String txHash;
/** 转账类型project、user */
@Excel(name = "转账类型project、user")
private String type;
/** 备用字段1 */
@Excel(name = "备用字段1")
private String reserve1;
/** 备用字段2 */
@Excel(name = "备用字段2")
private String reserve2;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setPayerId(String payerId)
{
this.payerId = payerId;
}
public String getPayerId()
{
return payerId;
}
public void setProjectId(String projectId)
{
this.projectId = projectId;
}
public String getProjectId()
{
return projectId;
}
public void setToken(BigDecimal token)
{
this.token = token;
}
public BigDecimal getToken()
{
return token;
}
public void setPayeeId(String payeeId)
{
this.payeeId = payeeId;
}
public String getPayeeId()
{
return payeeId;
}
public void setTxHash(String txHash)
{
this.txHash = txHash;
}
public String getTxHash()
{
return txHash;
}
public void setType(String type)
{
this.type = type;
}
public String getType()
{
return type;
}
public void setReserve1(String reserve1)
{
this.reserve1 = reserve1;
}
public String getReserve1()
{
return reserve1;
}
public void setReserve2(String reserve2)
{
this.reserve2 = reserve2;
}
public String getReserve2()
{
return reserve2;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("payerId", getPayerId())
.append("projectId", getProjectId())
.append("token", getToken())
.append("payeeId", getPayeeId())
.append("txHash", getTxHash())
.append("createTime", getCreateTime())
.append("createBy", getCreateBy())
.append("type", getType())
.append("reserve1", getReserve1())
.append("reserve2", getReserve2())
.toString();
}
}

View File

@ -0,0 +1,22 @@
package com.microservices.dms.achievementLibrary.domain.blockchain;
public class UserVo {
private Long id;
private String nickname;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}

View File

@ -0,0 +1,74 @@
package com.microservices.dms.achievementLibrary.mapper;
import java.util.List;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.dms.achievementLibrary.domain.AchievementDictData;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 成果相关字典Mapper接口
*
* @author microservices
* @date 2025-05-23
*/
@Mapper
@Slave
public interface AchievementDictDataMapper
{
/**
* 查询成果相关字典
*
* @param dictCode 成果相关字典主键
* @return 成果相关字典
*/
public AchievementDictData selectAchievementDictDataByDictCode(Long dictCode);
/**
* 查询成果相关字典列表
*
* @param achievementDictData 成果相关字典
* @return 成果相关字典集合
*/
public List<AchievementDictData> selectAchievementDictDataList(AchievementDictData achievementDictData);
/**
* 新增成果相关字典
*
* @param achievementDictData 成果相关字典
* @return 结果
*/
public int insertAchievementDictData(AchievementDictData achievementDictData);
/**
* 修改成果相关字典
*
* @param achievementDictData 成果相关字典
* @return 结果
*/
public int updateAchievementDictData(AchievementDictData achievementDictData);
/**
* 删除成果相关字典
*
* @param dictCode 成果相关字典主键
* @return 结果
*/
public int deleteAchievementDictDataByDictCode(Long dictCode);
/**
* 批量删除成果相关字典
*
* @param dictCodes 需要删除的数据主键集合
* @return 结果
*/
public int deleteAchievementDictDataByDictCodes(Long[] dictCodes);
List<KeyValueVo> selectDictDataByType(@Param("dictType") String dictType);
int selectDictDataByLabel(@Param("label") String label,@Param("type") String type);
List<String> getDictTypes();
}

View File

@ -0,0 +1,71 @@
package com.microservices.dms.achievementLibrary.mapper;
import java.util.List;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.dms.achievementLibrary.domain.AchievementTeam;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 成果团队Mapper接口
*
* @author microservices
* @date 2025-04-23
*/
@Mapper
@Slave
public interface AchievementTeamMapper
{
/**
* 查询成果团队
*
* @param id 成果团队主键
* @return 成果团队
*/
public AchievementTeam selectAchievementTeamById(Long id);
/**
* 查询成果团队列表
*
* @param achievementTeam 成果团队
* @return 成果团队集合
*/
public List<AchievementTeam> selectAchievementTeamList(AchievementTeam achievementTeam);
/**
* 新增成果团队
*
* @param achievementTeam 成果团队
* @return 结果
*/
public int insertAchievementTeam(AchievementTeam achievementTeam);
/**
* 修改成果团队
*
* @param achievementTeam 成果团队
* @return 结果
*/
public int updateAchievementTeam(AchievementTeam achievementTeam);
/**
* 删除成果团队
*
* @param id 成果团队主键
* @return 结果
*/
public int deleteAchievementTeamById(Long id);
/**
* 批量删除成果团队
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteAchievementTeamByIds(Long[] ids);
void deleteAchievementTeamByAId(@Param("aid") Long aid);
List<AchievementTeam> selectAchievementTeamByAchId(@Param("achId") Long achId);
}

View File

@ -0,0 +1,174 @@
package com.microservices.dms.achievementLibrary.mapper;
import java.util.*;
import com.microservices.common.datasource.annotation.Master;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.dms.achievementLibrary.domain.*;
import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo;
import com.microservices.dms.resourceLibrary.domain.CompetitionResourceLibrary;
import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary;
import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.PropertyValues;
/**
* 成果Mapper接口
*
* @author microservices
* @date 2025-04-02
*/
@Mapper
@Slave
public interface AchievementsMapper {
/**
* 查询成果
*
* @param id 成果主键
* @return 成果
*/
public Achievements selectAchievementsById(Long id);
/**
* 查询成果列表
*
* @param achievements 成果
* @return 成果集合
*/
public List<Achievements> selectAchievementsList(Achievements achievements);
/**
* 新增成果
*
* @param achievements 成果
* @return 结果
*/
public int insertAchievements(Achievements achievements);
/**
* 修改成果
*
* @param achievements 成果
* @return 结果
*/
public int updateAchievements(Achievements achievements);
/**
* 删除成果
*
* @param id 成果主键
* @return 结果
*/
public int deleteAchievementsById(Long id);
/**
* 批量删除成果
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteAchievementsByIds(Long[] ids);
@MapKey("k")
@Master
List<Map<String, String>> getFileInfoByIdents(@Param("idents") Set<String> idents);
List<Achievements> getChoiceImport();
List<KeyValueVo> getTjBySources();
List<KeyValueVo> getTjByAreas();
List<Achievements> selectAchievementsByParam(AchQueryVo achQueryVo);
Long getAchievementClickSum(@Param("id") Long id);
List<KeyValVo<String, Long>> getaWatcher(@Param("s") Date s, @Param("e") Date e, @Param("t") String achievements);
List<KeyValVo<String, Long>> getFavorite(@Param("s") Date s, @Param("e") Date e, @Param("t") String achievements);
List<KeyValVo<String, Long>> getAchievement(@Param("s") Date s, @Param("e") Date e, @Param("t") String source);
List<HotAchVo> getHotAchievement();
Map<String, Long> indexProjectStatistic();
Map<String, Object> indexTaskStatistic();
Map<String, Long> indexCompetitionStatistic();
Long indexSchoolEnterpriseStatistic(@Param("s") String s, @Param("t") String tags);
List<KeyValueVo> getAreasByName(@Param("areaName") String areaName);
AchievementBehaviorSumVo getActDataStatisticById(@Param("id") Long id);
List<KeyValVo<String, Long>> get7AddClickById(@Param("s") Date s, @Param("e") Date e, @Param("t") String achievements, @Param("id") String id);
AchievementBehaviorSumVo getWatchFavoriteStatusById(@Param("id") Long id, @Param("userId")Long userId);
Long countAchievementBySource(@Param("s") Date s, @Param("e") Date e, @Param("t") String achievements);
List<Map<String, Object>> getAchievementDataYearly();
List<Map<String, Object>> getAchievementType();
List<KeyValueVo> getAchievementActData(@Param("s") Date s, @Param("e") Date e);
List<Map<String, Object>> getAchievementDomain();
List<Map<String, Object>> getAchievementAddYearly();
List<Map<String, Object>> getAchievementHotRank();
List<Long> getAllId();
List<AreaStatisticVo> getAreaStatistic(@Param("source")String source,@Param("areaKey") String areaKey);
List<AchRelatedVo> getRelatedAch(@Param("id")Long id, @Param("sourceId") List<Long> sourceId, @Param("paramYear")String paramYear);
List<String> getDistinctYear(@Param("id")Long id, @Param("sourceId")List<Long> sourceId);
List<Long> selectAchievementsByName(@Param("achName") String achName);
String getField1NameByParam(@Param("source")String source, @Param("id") Long id);
List<KeyValueVo> getProjectAreasByName(@Param("areaName") String areaName);
List<String> getExpertAreasByName(@Param("areaName") String areaName);
List<Long> getAllSourceId(@Param("id")Long id, @Param("sourceId")Long sourceId);
List<Long> getAllSourceIdCompetition(@Param("id")Long id, @Param("sourceId")Long sourceId);
List<Long> getAllSourceIdTask(@Param("id")Long id, @Param("sourceId")Long sourceId);
List<TaskResourceLibrary> getRelatedAchTaskOfExpert(@Param("id")Long id);
List<CompetitionResourceLibrary> getRelatedAchCompetitionOfExpert(@Param("id")Long id);
List<KeyValVo<String,Long>> getAchievementAddYearlyData(@Param("s") Date s, @Param("e") Date e);
List<KeyValueVo> getAchievementActDataW(@Param("s") Date s, @Param("e") Date e);
List<KeyValueVo> getAchievementActDataC(@Param("s") Date s, @Param("e") Date e);
List<KeyValueVo> getAchievementActDataD(@Param("s") Date s, @Param("e") Date e);
List<KeyValueVo> getAchievementActDataF(@Param("s") Date s, @Param("e") Date e);
List<Map<String, Object>> getDockingUserInfo(@Param("id") Long id);
List<Achievements> selectAchievementsByArea(AchQueryVo achQueryVo);
List<KeyValVo<String, Long>> getExperts(@Param("s") Date s, @Param("e") Date e);
List<KeyValueVo> getAllAreas(@Param("areaName") String areaName);
void updateRelationAchievements(@Param("source") String source,@Param("sourceId") Long sourceId);
List<Map<String, Object>> getDockingUserInfoList(@Param("id") Long id);
String getField1RemarkByParam(@Param("source")String source,@Param("areaKey") String areaKey);
}

View File

@ -0,0 +1,82 @@
package com.microservices.dms.achievementLibrary.mapper;
import java.util.List;
import java.util.Map;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.dms.achievementLibrary.domain.BlockchainListQueryVo;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.achievementLibrary.domain.blockchain.InBlockchainData;
import com.microservices.dms.common.vo.CommitCreateVo;
import com.microservices.dms.common.vo.CommitResultVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 区块链数据入链Mapper接口
*
* @author microservices
* @date 2025-05-27
*/
@Mapper
@Slave
public interface InBlockchainDataMapper
{
/**
* 查询区块链数据入链
*
* @param id 区块链数据入链主键
* @return 区块链数据入链
*/
public InBlockchainData selectInBlockchainDataById(Long id);
/**
* 查询区块链数据入链列表
*
* @param inBlockchainData 区块链数据入链
* @return 区块链数据入链集合
*/
public List<InBlockchainData> selectInBlockchainDataList(InBlockchainData inBlockchainData);
/**
* 新增区块链数据入链
*
* @param inBlockchainData 区块链数据入链
* @return 结果
*/
public int insertInBlockchainData(InBlockchainData inBlockchainData);
/**
* 修改区块链数据入链
*
* @param inBlockchainData 区块链数据入链
* @return 结果
*/
public int updateInBlockchainData(InBlockchainData inBlockchainData);
/**
* 删除区块链数据入链
*
* @param id 区块链数据入链主键
* @return 结果
*/
public int deleteInBlockchainDataById(Long id);
/**
* 批量删除区块链数据入链
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteInBlockchainDataByIds(Long[] ids);
List<Map<String, Object>> issueDataList(BlockchainListQueryVo queryVo);
List<Map<String, Object>> commitDataList(BlockchainListQueryVo queryVo);
List<Map<String, Object>> prDataList(BlockchainListQueryVo queryVo);
List<String> getNeedToBlockCommitList();
List<CommitResultVo> getCommitListById(@Param("projectId") String projectId);
}

View File

@ -0,0 +1,71 @@
package com.microservices.dms.achievementLibrary.mapper;
import java.util.List;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.dms.achievementLibrary.domain.SchoolEnterpriseAchievements;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 校企成果Mapper接口
*
* @author microservices
* @date 2025-04-03
*/
@Mapper
@Slave
public interface SchoolEnterpriseAchievementsMapper
{
/**
* 查询校企成果
*
* @param id 校企成果主键
* @return 校企成果
*/
public SchoolEnterpriseAchievements selectSchoolEnterpriseAchievementsById(Long id);
/**
* 查询校企成果列表
*
* @param schoolEnterpriseAchievements 校企成果
* @return 校企成果集合
*/
public List<SchoolEnterpriseAchievements> selectSchoolEnterpriseAchievementsList(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
/**
* 新增校企成果
*
* @param schoolEnterpriseAchievements 校企成果
* @return 结果
*/
public int insertSchoolEnterpriseAchievements(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
/**
* 修改校企成果
*
* @param schoolEnterpriseAchievements 校企成果
* @return 结果
*/
public int updateSchoolEnterpriseAchievements(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
/**
* 删除校企成果
*
* @param id 校企成果主键
* @return 结果
*/
public int deleteSchoolEnterpriseAchievementsById(Long id);
/**
* 批量删除校企成果
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteSchoolEnterpriseAchievementsByIds(Long[] ids);
Long topStatistic(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
SchoolEnterpriseAchievements selectSchoolEnterpriseAchievementsByName(@Param("achievementName") String achievementName);
}

View File

@ -0,0 +1,73 @@
package com.microservices.dms.achievementLibrary.mapper;
import java.util.List;
import java.util.Map;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.dms.achievementLibrary.domain.BlockchainListQueryVo;
import com.microservices.dms.achievementLibrary.domain.blockchain.UserProjectTransferRecords;
import com.microservices.dms.achievementLibrary.domain.blockchain.UserVo;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户/项目转账信息记录Mapper接口
*
* @author microservices
* @date 2025-05-27
*/
@Mapper
@Slave
public interface UserProjectTransferRecordsMapper
{
/**
* 查询用户/项目转账信息记录
*
* @param id 用户/项目转账信息记录主键
* @return 用户/项目转账信息记录
*/
public UserProjectTransferRecords selectUserProjectTransferRecordsById(Long id);
/**
* 查询用户/项目转账信息记录列表
*
* @param userProjectTransferRecords 用户/项目转账信息记录
* @return 用户/项目转账信息记录集合
*/
public List<UserProjectTransferRecords> selectUserProjectTransferRecordsList(UserProjectTransferRecords userProjectTransferRecords);
/**
* 新增用户/项目转账信息记录
*
* @param userProjectTransferRecords 用户/项目转账信息记录
* @return 结果
*/
public int insertUserProjectTransferRecords(UserProjectTransferRecords userProjectTransferRecords);
/**
* 修改用户/项目转账信息记录
*
* @param userProjectTransferRecords 用户/项目转账信息记录
* @return 结果
*/
public int updateUserProjectTransferRecords(UserProjectTransferRecords userProjectTransferRecords);
/**
* 删除用户/项目转账信息记录
*
* @param id 用户/项目转账信息记录主键
* @return 结果
*/
public int deleteUserProjectTransferRecordsById(Long id);
/**
* 批量删除用户/项目转账信息记录
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteUserProjectTransferRecordsByIds(Long[] ids);
List<Map> userDataList(BlockchainListQueryVo queryVo);
List<UserVo> userList(UserVo userVo);
}

View File

@ -0,0 +1,223 @@
package com.microservices.dms.achievementLibrary.service;
import com.alibaba.nacos.shaded.com.google.common.collect.Maps;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper;
import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo;
import com.microservices.dms.resourceLibrary.mapper.CompetitionResourceLibraryMapper;
import com.microservices.dms.utils.DateUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class BigScreenStatisticService {
private final AchievementsMapper achievementsMapper;
private final CompetitionResourceLibraryMapper competitionResourceLibraryMapper;
public Map<String, Object> getAchievementTopStatistic(String source) {
//获取本周近7天)的数据
Date[] days = DateUtil.getDays(0, 6);
Map<String, Long> m = achievementsMapper.getAchievement(days[0], days[1], source)
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrMMDD(days[0], days[1]);
//获取上周7-14天前的数据
Date[] lastDays = DateUtil.getDays(7, 13);
long lastSum = Optional.ofNullable(achievementsMapper.countAchievementBySource(lastDays[0], lastDays[1], source)).orElse(0L);
long sum = Optional.ofNullable(achievementsMapper.countAchievementBySource(null, null, source)).orElse(0L);
long cSum = m.values().stream().mapToLong(Long::longValue).sum();
//计算本周/上周增长%
double rate;
if (lastSum == 0) rate = 100D;
else {
rate = (double) (cSum - lastSum) / lastSum;
}
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = m.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
Map<String, Object> map = new HashMap<>();
map.put("list", res);
map.put("sum", sum);
map.put("rate", rate);
return map;
}
public List<Map<String, Object>> getAchievementDataYearly() {
return achievementsMapper.getAchievementDataYearly();
}
public List<Map<String, Object>> getAchievementType() {
return achievementsMapper.getAchievementType();
}
public List<Map<String,Object>> getAchievementActData() {
Date[] days = DateUtil.getDays(0, 6);
Map<String, Long> wlist = achievementsMapper.getAchievementActDataW(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue));
Map<String, Long> clist = achievementsMapper.getAchievementActDataC(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue));
Map<String, Long> dlist = achievementsMapper.getAchievementActDataD(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue));
Map<String, Long> flist = achievementsMapper.getAchievementActDataF(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue));
List<String> dateStr = DateUtil.getDateStrMMDD(days[0], days[1]);
List<KeyValueVo> wres = new ArrayList<>();
List<KeyValueVo> cres = new ArrayList<>();
List<KeyValueVo> dres = new ArrayList<>();
List<KeyValueVo> fres = new ArrayList<>();
for (String s : dateStr) {
Long a = wlist.getOrDefault(s, 0L);
KeyValueVo k1 = new KeyValueVo();
k1.setKey(s);
k1.setValue(a);
k1.setName("关注");
wres.add(k1);
}
for (String s : dateStr) {
Long a = clist.getOrDefault(s, 0L);
KeyValueVo k1 = new KeyValueVo();
k1.setKey(s);
k1.setValue(a);
k1.setName("浏览");
cres.add(k1);
}
for (String s : dateStr) {
Long a = dlist.getOrDefault(s, 0L);
KeyValueVo k1 = new KeyValueVo();
k1.setKey(s);
k1.setValue(a);
k1.setName("下载");
dres.add(k1);
}
for (String s : dateStr) {
Long a = flist.getOrDefault(s, 0L);
KeyValueVo k1 = new KeyValueVo();
k1.setKey(s);
k1.setValue(a);
k1.setName("收藏");
fres.add(k1);
}
List<Map<String, Object>> r = new ArrayList<>();
Map<String, Object> w = new HashMap<>();
w.put("key", "关注");
w.put("value", wres);
Map<String, Object> c = new HashMap<>();
c.put("key","浏览");
c.put("value", cres);
Map<String, Object> d = new HashMap<>();
d.put("key","下载");
d.put("value", dres);
Map<String, Object> f = new HashMap<>();
f.put("key", "收藏");
f.put("value", fres);
r.add(w);
r.add(c);
r.add(d);
r.add(f);
return r;
}
public List<Map<String, Object>> getAchievementDomain() {
return achievementsMapper.getAchievementDomain();
}
public Object getAchievementAddYearly() {
Date[] currentYear = DateUtil.getLast12Months();
Map<String, Long> m = achievementsMapper.getAchievementAddYearlyData(currentYear[0],currentYear[1])
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrYYYYMM(currentYear[0], currentYear[1]);
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = m.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
return res;
}
public List<Map<String, Object>> getAchievementHotRank() {
return achievementsMapper.getAchievementHotRank();
}
public Map<String, Object> getCompetitionTopStatistic() {
Map<String, Object> res = new HashMap<>();
Long finish = competitionResourceLibraryMapper.getCompetitionFinish();
res.put("finish", finish);
Long enroll = competitionResourceLibraryMapper.getCompetitionEnroll();
res.put("enroll", enroll);
Long underway = competitionResourceLibraryMapper.getCompetitionUnderway();
res.put("underway", underway);
Long submitCount = competitionResourceLibraryMapper.getCompetitionSubmitCount();
res.put("submitCount", submitCount);
Long transfer = competitionResourceLibraryMapper.getCompetitionTransferCount();
res.put("transfer", transfer);
Long needAudit = competitionResourceLibraryMapper.getCompetitionNeedAuditCount();
res.put("needAudit", needAudit);
return res;
}
public List<KeyValueVo> getCompetitionStatisticYearly() {
return competitionResourceLibraryMapper.getCompetitionStatisticYearly();
}
public Object getCompetitionHot() {
return competitionResourceLibraryMapper.getCompetitionHot();
}
public List<KeyValVo<String, Long>> getCompetitionYearlyPaperAdd() {
Date[] currentYear = DateUtil.getLast12Months();
Map<String, Long> m = competitionResourceLibraryMapper.getCompetitionYearlyPaperAdd(currentYear[0],currentYear[1])
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrYYYYMM(currentYear[0], currentYear[1]);
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = m.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
return res;
}
public List<KeyValVo<String, Long>> getCompetitionYearlyFinish() {
Date[] currentYear = DateUtil.getLast12Months();
Map<String, Long> m = competitionResourceLibraryMapper.getCompetitionYearlyFinish(currentYear[0],currentYear[1])
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrYYYYMM(currentYear[0], currentYear[1]);
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = m.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
return res;
}
}

View File

@ -0,0 +1,614 @@
package com.microservices.dms.achievementLibrary.service;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.httpClient.service.HttpAPIService;
import com.microservices.common.security.utils.SecurityUtils;
import com.microservices.dms.achievementLibrary.domain.Achievements;
import com.microservices.dms.achievementLibrary.domain.BlockchainListQueryVo;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.achievementLibrary.domain.TokenListVo;
import com.microservices.dms.achievementLibrary.domain.blockchain.InBlockchainData;
import com.microservices.dms.achievementLibrary.domain.blockchain.InLinkProjectVo;
import com.microservices.dms.achievementLibrary.domain.blockchain.UserProjectTransferRecords;
import com.microservices.dms.achievementLibrary.domain.blockchain.UserVo;
import com.microservices.dms.achievementLibrary.mapper.InBlockchainDataMapper;
import com.microservices.dms.achievementLibrary.mapper.UserProjectTransferRecordsMapper;
import com.microservices.dms.behaviorImage.domain.AchievementImageVo;
import com.microservices.dms.common.vo.*;
import com.microservices.dms.referral.mapper.TalentReferralMapper;
import com.microservices.dms.resourceLibrary.mapper.ProjectResourceLibraryMapper;
import com.microservices.dms.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
//import org.fisco.bcos.sdk.client.Client;
//import org.fisco.bcos.sdk.client.protocol.request.Transaction;
//import org.fisco.bcos.sdk.client.protocol.response.BcosTransaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import static com.microservices.common.core.utils.DateUtils.YYYY_MM_DD_HH_MM_SS;
import static com.microservices.common.core.utils.PageUtils.startPage;
import static com.microservices.dms.constant.BlockChainFunConstants.*;
import static com.microservices.dms.utils.DateUtil.formatLocalDateTimePlusH;
@Service
@Slf4j
public class BlockChainService {
@Autowired
private ProjectResourceLibraryMapper projectResourceLibraryMapper;
@Value("${gitlink.fiscobcosUrl:localhost}")
public String fiscobcosUrl;
@Autowired
private HttpAPIService httpAPIService;
@Autowired
private InBlockchainDataMapper inBlockchainDataMapper;
@Autowired
private UserProjectTransferRecordsMapper userProjectTransferRecordsMapper;
@Autowired
private TalentReferralMapper talentReferralMapper;
public List<TokenListVo> projectTokenList(String projectName) {
List<TokenListVo> list = projectResourceLibraryMapper.selectProjectInfos(projectName);
for (TokenListVo v : list) {
JSONObject param = queryProjectInfo(v);
if(param != null) {
Long issueTokenSum = projectResourceLibraryMapper.sumProjectIssueToken(v.getId());
v.setIssueToken(issueTokenSum);
long totalToken = Long.parseLong(param.getString("total_supply"));//总token
v.setTotalToken(totalToken);
//根据创建人login获取对应的用户id
String userName = v.getUserId();
//根据创建人项目Id,获取创建人拥有token
String tokenName = param.getString("token_name");
Long applyToken= getUserBlanaceProjectId("userSingleInfo",userName,tokenName);
v.setApplyToken(applyToken);
v.setCurrentToken(totalToken - applyToken);
}
v.setCreatedOn(DateUtil.plusHours(v.getCreatedOn(), 8));
}
return list;
}
public Long getUserBlanaceProjectId(String type,String userName,String tokenName) {
JSONObject params = new JSONObject();
if(type.equals(USER_SINGLE_INFO)){
params.put(REQUEST_TYPE, USER_SINGLE_REPO);
params.put("token_name", tokenName);
params.put("username", userName);
}else if(type.equals(USER_ALL_INFO)){
params.put(REQUEST_TYPE, USER_ALL_REPOS);
params.put("username", userName);
}
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
return Long.parseLong(rsp.getString("balance"));
}
return -1L;
}
private JSONObject queryProjectInfo(TokenListVo v) {
JSONObject param = new JSONObject();
param.put(REQUEST_TYPE, QUERY_REPO);
param.put("token_name", String.valueOf(v.getId()));
JSONObject jsonObject = queryFiscobcos(param);
if (jsonObject != null) {
return jsonObject;
}
return null;
}
private JSONObject queryFiscobcos(JSONObject param) {
try {
// Map<String,String> p = convertParams(param);
// JSONObject from = JSONObject.from(p);
JSONObject reps = httpAPIService.doPost(fiscobcosUrl, param);
// if (result.getCode() != 200) {
// return null;
// }
// JSONObject reps = JSONObject.parseObject(result.getContent());
if (reps.containsKey(RESP_STATUS) && reps.getString(RESP_STATUS).equals("0")) {
return reps;
}
} catch (Exception e) {
log.error("区块链接口请求失败", e);
return null;
}
return null;
}
private Map<String, String> convertParams(JSONObject param) {
Set<String> keys = param.keySet();
Map<String, String> r = new HashMap<>();
// 遍历 key 集合并获取对应的 value
for (String key : keys) {
Object o = param.get(key);
if (o != null) {
if (o instanceof String || o instanceof Integer || o instanceof Long || o instanceof BigDecimal || o instanceof Double) {
r.put(key, param.getString(key));
} else if (o instanceof LocalDateTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = formatter.format(LocalDateTime.parse(o.toString(), formatter));
r.put(key, format);
} else if (o instanceof Date) {
String s = DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS, (Date) o);
r.put(key, s);
} else if (o instanceof List || o instanceof Map) {
String jsonString = JSONObject.toJSONString(o);
r.put(key, jsonString);
}else {
r.put(key, o.toString());
}
}else {
r.put(key, null);
}
}
return r;
}
public AjaxResult projectTokenDistribute(InLinkProjectVo vo) {
//根据项目ID获取用户ID
//根据项目id获取项目创建人
String userId = projectResourceLibraryMapper.getProjectUserIdById(vo.getProjectId());
validTokenCount(vo.getProjectId(), vo.getAmount(),userId);
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, TRANSFER_AMOUNT);
params.put("token_name", vo.getProjectId());
params.put("amount", vo.getAmount());
params.put("payee", vo.getUserId());
params.put("payer", userId);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
String txHash = rsp.getString(TX_HASH);
// insert to db 4将3入链成功的数据存入表 用户/项目转账信息记录表 type:project payer_idusername)
if (StringUtils.isNotEmpty(txHash)) {
UserProjectTransferRecords records = new UserProjectTransferRecords();
records.setPayerId(params.getString("payer"));//转账人
records.setPayeeId(params.getString("payee"));//收款人
records.setProjectId(vo.getProjectId());
records.setToken(BigDecimal.valueOf(vo.getAmount()));
records.setType("projectApply");//项目分配
records.setCreateTime(DateUtils.getNowDate());
records.setTxHash(txHash);
records.setCreateBy(SecurityUtils.getUsername());
userProjectTransferRecordsMapper.insertUserProjectTransferRecords(records);
}
return AjaxResult.success();
}
return AjaxResult.error();
}
public AjaxResult userCreate(UserCreateVo userCreateVo) {
//根据项目id获取项目创建人
String userId = projectResourceLibraryMapper.getUserIdBYLogin(userCreateVo.getPayee());//收款人ID
userCreateVo.setPayee(userId);
String payerId = projectResourceLibraryMapper.getUserIdBYLogin(userCreateVo.getPayer());//转账人ID
userCreateVo.setPayer(payerId);
//转账人token充足
validUserTokenCount(userCreateVo);
//进行转账
JSONObject params = JSONObject.from(userCreateVo);
params.put(REQUEST_TYPE, TRANSFER_AMOUNT);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
String txHash = rsp.getString(TX_HASH);
// insert to db 将2入链成功的数据新增到用户/项目转账信息记录表 type:user payer_idpayer)
if (StringUtils.isNotEmpty(txHash)) {
UserProjectTransferRecords records = new UserProjectTransferRecords();
records.setPayerId(params.getString("payer"));
records.setPayeeId(params.getString("payee"));
records.setProjectId(params.getString("token_name"));
records.setToken(params.getBigDecimal("amount"));
records.setType("userTransfer");//用户转账
records.setTxHash(txHash);
records.setCreateTime(DateUtils.getNowDate());
records.setCreateBy(SecurityUtils.getUsername());
userProjectTransferRecordsMapper.insertUserProjectTransferRecords(records);
return AjaxResult.success(rsp);
}
}
return AjaxResult.error();
}
//判断用户当前项目剩余token是否还支持分配
private void validUserTokenCount(UserCreateVo userCreateVo) {
//现根据用户id,以及项目名称查询对应用户拥有的token
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, USER_SINGLE_REPO);
params.put("token_name", userCreateVo.getToken_name());
params.put("username", userCreateVo.getPayer());
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
if(rsp != null) {
long curToken = Long.parseLong(rsp.getString("balance"));
Long amount = userCreateVo.getAmount();
if (curToken <amount) {
throw new ServiceException("token数量不足");
}
}
}
//判断项目剩余token是否还支持分配
private void validTokenCount(String tokenName, Long amount,String userName) {
TokenListVo v = new TokenListVo();
if(StringUtils.isEmpty(tokenName)) {
throw new ServiceException("项目ID不能为空");
}
v.setId(Long.parseLong(Optional.ofNullable(tokenName).orElse("-1")));
Long issueTokenSum = projectResourceLibraryMapper.sumProjectIssueToken(v.getId());
v.setIssueToken(issueTokenSum);
//根据创建人项目Id,获取创建人拥有token
Long applyToken= getUserBlanaceProjectId("userSingleInfo",userName,tokenName);
v.setApplyToken(applyToken);
long curToken = applyToken - issueTokenSum;
if (curToken < amount) {
throw new ServiceException("token数量不足");
}
}
private Long queryTotalToken(TokenListVo v) {
if(v.getName().equals("区块链测试")){
System.out.println("zzz");
}
JSONObject param = new JSONObject();
param.put(REQUEST_TYPE, QUERY_REPO);
param.put("token_name", String.valueOf(v.getId()));
JSONObject jsonObject = queryFiscobcos(param);
if (jsonObject != null) {
return jsonObject.getLong("total_supply");
}
return -1L;
}
public AjaxResult prCreate(PrCreateVo prCreateVo) {
Map<String, Object> res = projectResourceLibraryMapper.selectPrInfo(prCreateVo.getPr_id());
if (res != null) {
JSONObject params = JSONObject.from(res);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
params.put("updated_at", DataUtilsStr());
params.put("pull_request_number", params.getLong("pull_request_number"));
params.put(REQUEST_TYPE, CREATE_PR);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
String txHash = rsp.getString(TX_HASH);
//将对应的token todo
// insert to db 新增表pr入链关联id,type,type_id,tx_hash,create_time (type:pr,type_id:"pull_request_id)
if (StringUtils.isNotEmpty(txHash)) {
InBlockchainData inBlockchainData = new InBlockchainData();
inBlockchainData.setType("pr");
inBlockchainData.setTxHash(txHash);
inBlockchainData.setTypeId(prCreateVo.getPr_id());
inBlockchainData.setCreateTime(DateUtils.getNowDate());
inBlockchainData.setCreateBy(SecurityUtils.getUsername());
inBlockchainDataMapper.insertInBlockchainData(inBlockchainData);
return AjaxResult.success(rsp);
}
}
}
return AjaxResult.error();
}
private String DataUtilsStr() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(DateUtils.getNowDate());
}
public AjaxResult issueCreateUpdate(IssueCreateVo issueCreateVo) {
Map<String, Object> res = projectResourceLibraryMapper.selectIssueInfo(issueCreateVo.getIssue_id());
if (res != null) {
JSONObject params = JSONObject.from(res);
params.put(REQUEST_TYPE, CREATE_UPDATE_ISSUE);
params.put("updated_at", DataUtilsStr());
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
String txHash = rsp.getString(TX_HASH);
// insert to db 4 数据入链表id,type,type_id,tx_hash,create_time (type:issue,type_id:issue_id)
if (StringUtils.isNotEmpty(txHash)) {
InBlockchainData inBlockchainData = new InBlockchainData();
inBlockchainData.setType("issue");
inBlockchainData.setTxHash(txHash);
inBlockchainData.setTypeId(issueCreateVo.getIssue_id());
inBlockchainData.setCreateTime(DateUtils.getNowDate());
inBlockchainData.setCreateBy(SecurityUtils.getUsername());
inBlockchainDataMapper.insertInBlockchainData(inBlockchainData);
return AjaxResult.success(rsp);
}
}
}
return AjaxResult.error();
}
public List<Map<String, Object>> issueDataList(BlockchainListQueryVo queryVo) {
List<Map<String, Object>> maps = inBlockchainDataMapper.issueDataList(queryVo);
handleForgeDate(maps);
return maps;
}
private void handleForgeDate(List<Map<String, Object>> maps){
for (Map<String, Object> m : maps) {
LocalDateTime updatedAt = (LocalDateTime) m.get("updated_at");
LocalDateTime createdAt = (LocalDateTime) m.get("created_at");
m.put("updated_at",formatLocalDateTimePlusH(updatedAt,8));
m.put("created_at",formatLocalDateTimePlusH(createdAt,8));
if (m.containsKey("committer_time")) {
LocalDateTime committer_time = (LocalDateTime) m.get("committer_time");
m.put("committer_time",formatLocalDateTimePlusH(committer_time,8));
}
}
}
//定时任务将commit数据入链
// @Scheduled(cron = "${cron.commitPushBlock}")
public void commitPushBlock() {
//先查询需要入链的数据
List<String> commitIdList = inBlockchainDataMapper.getNeedToBlockCommitList();
if(commitIdList!=null && commitIdList.size()>0) {
//遍历数据入区块链
for(String commitId : commitIdList) {
CommitCreateVo commitCreateVo = new CommitCreateVo();
commitCreateVo.setCommit_id(commitId);
commitCreate(commitCreateVo);
}
}
}
public AjaxResult commitCreate(CommitCreateVo commitCreateVo) {
List<CommitResultVo> CommitCreateVoList = new ArrayList<>();
if(StringUtils.isEmpty(commitCreateVo.getCommit_id())) {
String projectId = commitCreateVo.getProject_id();
if (StringUtils.isNotEmpty(projectId)) {
CommitCreateVoList = inBlockchainDataMapper.getCommitListById(projectId);
}
}else{
CommitResultVo resultVo = new CommitResultVo();
resultVo.setCommitId(commitCreateVo.getCommit_id());
resultVo.setCommitDiff(commitCreateVo.getCommit_diff());
CommitCreateVoList.add(resultVo);
}
if(CommitCreateVoList!=null && CommitCreateVoList.size()>0) {
for(CommitResultVo commit : CommitCreateVoList) {
commitDataTnBlock(commit);
//判断代码合并的时候issue
String issue_id = commitCreateVo.getIssue_id();
if(StringUtils.isNotEmpty(issue_id)) {
//根据issue_id获取判断是否要进行token转让
UserProjectTransferRecords records = projectResourceLibraryMapper.selectIssueEndInfo(issue_id);
if (Objects.nonNull(records)) {
records.setType("issuePr");//pr合并关闭issue
records.setTxHash("txHash");
records.setCreateTime(DateUtils.getNowDate());
records.setCreateBy(SecurityUtils.getUsername());
userProjectTransferRecordsMapper.insertUserProjectTransferRecords(records);
}
}
}
}
return AjaxResult.success();
}
private AjaxResult commitDataTnBlock(CommitResultVo commitCreateVo) {
String commitId = commitCreateVo.getCommitId();
//根据项目id,查询对应的需要入链的commit
Map<String, Object> res = projectResourceLibraryMapper.selectCommitInfo(commitId,commitCreateVo.getCommitDiff());
JSONObject params = JSONObject.from(res);
params.put(REQUEST_TYPE, CREATE_COMMIT);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
String txHash = rsp.getString(TX_HASH);
// insert to db 4 数据入链表id,type,type_id,tx_hash,create_time (type:issue,type_id:issue_id)
if (StringUtils.isNotEmpty(txHash)) {
InBlockchainData inBlockchainData = new InBlockchainData();
inBlockchainData.setType("commit");
inBlockchainData.setTxHash(txHash);
inBlockchainData.setTypeId(commitId);
inBlockchainData.setCreateTime(DateUtils.getNowDate());
inBlockchainData.setCreateBy(SecurityUtils.getUsername());
inBlockchainDataMapper.insertInBlockchainData(inBlockchainData);
return AjaxResult.success(rsp);
}
}
return AjaxResult.error();
}
public List<Map<String, Object>> commitDataList(BlockchainListQueryVo queryVo) {
List<Map<String, Object>> maps = inBlockchainDataMapper.commitDataList(queryVo);
handleForgeDate(maps);
return maps;
}
public List<Map<String, Object>> prDataList(BlockchainListQueryVo queryVo) {
List<Map<String, Object>> maps = inBlockchainDataMapper.prDataList(queryVo);
handleForgeDate(maps);
return maps;
}
//产权转让
public List<Map> userDataList(BlockchainListQueryVo queryVo) {
Long gitlinkUserId = SecurityUtils.getGitlinkUserId();
Map<String, Object> stringObjectMap = Optional.ofNullable(talentReferralMapper.selectUsersById(gitlinkUserId)).orElse(new HashMap<>());
if (!Objects.equals(stringObjectMap.get("admin"), "1")) {
queryVo.setUserId(gitlinkUserId);
}
startPage();
return userProjectTransferRecordsMapper.userDataList(queryVo);
}
public List<UserVo> userList(UserVo userVo) {
return userProjectTransferRecordsMapper.userList(userVo);
}
public AjaxResult projectCreate(ProjectCreateVo projectCreateVo) {
//先根据项目id(token_name)判断项目是否存在存在才入链
String tokenName = projectCreateVo.getToken_name();
int num = talentReferralMapper.selectProjectById(tokenName);
if(num>0) {
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, CREATE_REPO);
params.put("owner", projectCreateVo.getOwner());
params.put("token_name", projectCreateVo.getToken_name());
// params.put("cur_supply", projectCreateVo.getCur_supply());
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
params.put("total_supply", projectCreateVo.getTotal_supply());
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
String txHash = rsp.getString(TX_HASH);
// insert to db 4 数据入链表id,type,type_id,tx_hash,create_time (type:issue,type_id:issue_id)
if (StringUtils.isNotEmpty(txHash)) {
InBlockchainData inBlockchainData = new InBlockchainData();
inBlockchainData.setType("project");
inBlockchainData.setTxHash(txHash);
inBlockchainData.setTypeId(projectCreateVo.getToken_name());
inBlockchainData.setCreateTime(DateUtils.getNowDate());
inBlockchainData.setCreateBy(SecurityUtils.getUsername());
inBlockchainDataMapper.insertInBlockchainData(inBlockchainData);
return AjaxResult.success(rsp);
}
}
}
return AjaxResult.error();
}
public AjaxResult queryBlockInfo(String type,String typeId) {
JSONObject params = paramsQuery(type,typeId);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
return AjaxResult.success(rsp);
}
private JSONObject paramsQuery(String type, String typeId) {
JSONObject params = new JSONObject();
if(type.equals(PROJECT_INFO)){
params.put(REQUEST_TYPE, QUERY_REPO);
params.put("token_name", typeId);
}else if(type.equals(COMMIT_INTO)){
params.put(REQUEST_TYPE, QUERY_COMMIT);
params.put("commit_hash", typeId);
}else if(type.equals(PR_LATEST_INFO)){
params.put(REQUEST_TYPE, QUERY_PR_LATEST);
params.put("pull_request_id", typeId);
}else if(type.equals(PR_ALL_INFO)){
params.put(REQUEST_TYPE, QUERY_PR_ALL);
params.put("pull_request_id", typeId);
}else if(type.equals(ISSUE_LATEST_INFO)){
params.put(REQUEST_TYPE, QUERY_ISSUE_LATEST);
params.put("issue_id", typeId);
}else if(type.equals(ISSUE_ALL_INFO)){
params.put(REQUEST_TYPE, QUERY_ISSUE_ALL);
params.put("issue_id", typeId);
}
return params;
}
public AjaxResult getTransactionByHash(String txHash) {
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, GET_TRANSACTION_BYHASH);
params.put("tx_hash", txHash);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
return AjaxResult.success(rsp);
}
public AjaxResult getTransactionReceipt(String txHash) {
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, GET_TRANSACTION_RECEIPT);
params.put("tx_hash", txHash);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
return AjaxResult.success(rsp);
}
public AjaxResult getTotalTransactionCount() {
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, GET_TOTAL_TRANSACTION_COUNTT);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
return AjaxResult.success(rsp);
}
public AjaxResult getBlockNumber() {
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, GET_BLOCK_NUM);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
return AjaxResult.success(rsp);
}
return AjaxResult.error();
}
public AjaxResult getUserTokenByProjectId(String type,String userName,String tokenName) {
JSONObject params = new JSONObject();
if(type.equals(USER_SINGLE_INFO)){
params.put(REQUEST_TYPE, USER_SINGLE_REPO);
params.put("token_name", tokenName);
params.put("username", userName);
}else if(type.equals(USER_ALL_INFO)){
params.put(REQUEST_TYPE, USER_ALL_REPOS);
params.put("username", userName);
}
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
return AjaxResult.success(rsp);
}
return AjaxResult.error();
}
//
public AjaxResult getUserAllProjectToken(String userName) {
JSONObject params = new JSONObject();
params.put(REQUEST_TYPE, USER_ALL_REPOS);
params.put("username", userName);
Map<String, String> p = convertParams(params);
params = JSONObject.from(p);
JSONObject rsp = queryFiscobcos(params);
if (rsp != null) {
return AjaxResult.success(rsp);
}
return AjaxResult.error();
}
}

View File

@ -0,0 +1,90 @@
package com.microservices.dms.achievementLibrary.service;
import com.microservices.dms.achievementLibrary.domain.ExpertTotallVo;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.resourceLibrary.mapper.ExpertResourceLibraryMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class ExpertDashboardService {
@Autowired
private ExpertResourceLibraryMapper expertResourceLibraryMapper;
/**
* 专家职称级分布
* @return
*/
public List<KeyValueVo> getTitleRankStatistic() {
return expertResourceLibraryMapper.getTitleRankStatistic();
}
/**
* 专家专业类别
* @return
*/
public List<KeyValueVo> getExpertTypeStatistic() {
return expertResourceLibraryMapper.getExpertTypeStatistic();
}
/**
* 专家学历分布
* @return
*/
public List<KeyValueVo> getHighestDegreeStatistic() {
return expertResourceLibraryMapper.getHighestDegreeStatistic();
}
/**
* 专家单位类别分布
* @return
*/
public List<KeyValueVo> getWorkplaceTypeStatistic() {
return expertResourceLibraryMapper.getWorkplaceTypeStatistic();
}
/**
* 获取专家总数
* @return
*/
public Long getExpertTotal() {
return expertResourceLibraryMapper.getExpertTotal();
}
/**
* 专家实名完成度 userId users.authentication
* @return
*/
public KeyValueVo getAuthenticationStatistic() {
return expertResourceLibraryMapper.getAuthenticationStatistic();
}
/**
* 年度专家数据统计 cretate_on
* @return
*/
public List<KeyValueVo> getExpertTotalByYear() {
return expertResourceLibraryMapper.getExpertTotalByYear();
}
/**
* 热门专家领域
* reviewAreaOnereviewAreaTworeviewAreaThree
* @return
*/
public List<KeyValueVo> getReviewAreasStatistic() {
return expertResourceLibraryMapper.getReviewAreasStatistic();
}
/**
* 近一年专家评审数
* @return
*/
public List<ExpertTotallVo> getExpertAduit() {
return expertResourceLibraryMapper.getExpertAduit();
}
}

View File

@ -0,0 +1,67 @@
package com.microservices.dms.achievementLibrary.service;
import java.util.List;
import com.microservices.dms.achievementLibrary.domain.AchievementDictData;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import org.apache.ibatis.annotations.Param;
/**
* 成果相关字典Service接口
*
* @author microservices
* @date 2025-05-23
*/
public interface IAchievementDictDataService
{
/**
* 查询成果相关字典
*
* @param dictCode 成果相关字典主键
* @return 成果相关字典
*/
public AchievementDictData selectAchievementDictDataByDictCode(Long dictCode);
/**
* 查询成果相关字典列表
*
* @param achievementDictData 成果相关字典
* @return 成果相关字典集合
*/
public List<AchievementDictData> selectAchievementDictDataList(AchievementDictData achievementDictData);
/**
* 新增成果相关字典
*
* @param achievementDictData 成果相关字典
* @return 结果
*/
public int insertAchievementDictData(AchievementDictData achievementDictData);
/**
* 修改成果相关字典
*
* @param achievementDictData 成果相关字典
* @return 结果
*/
public int updateAchievementDictData(AchievementDictData achievementDictData);
/**
* 批量删除成果相关字典
*
* @param dictCodes 需要删除的成果相关字典主键集合
* @return 结果
*/
public int deleteAchievementDictDataByDictCodes(Long[] dictCodes);
/**
* 删除成果相关字典信息
*
* @param dictCode 成果相关字典主键
* @return 结果
*/
public int deleteAchievementDictDataByDictCode(Long dictCode);
List<KeyValueVo> selectDictDataByType(String dictType);
List<String> getDictTypes();
}

View File

@ -0,0 +1,61 @@
package com.microservices.dms.achievementLibrary.service;
import java.util.List;
import com.microservices.dms.achievementLibrary.domain.AchievementTeam;
/**
* 成果团队Service接口
*
* @author microservices
* @date 2025-04-23
*/
public interface IAchievementTeamService
{
/**
* 查询成果团队
*
* @param id 成果团队主键
* @return 成果团队
*/
public AchievementTeam selectAchievementTeamById(Long id);
/**
* 查询成果团队列表
*
* @param achievementTeam 成果团队
* @return 成果团队集合
*/
public List<AchievementTeam> selectAchievementTeamList(AchievementTeam achievementTeam);
/**
* 新增成果团队
*
* @param achievementTeam 成果团队
* @return 结果
*/
public int insertAchievementTeam(AchievementTeam achievementTeam);
/**
* 修改成果团队
*
* @param achievementTeam 成果团队
* @return 结果
*/
public int updateAchievementTeam(AchievementTeam achievementTeam);
/**
* 批量删除成果团队
*
* @param ids 需要删除的成果团队主键集合
* @return 结果
*/
public int deleteAchievementTeamByIds(Long[] ids);
/**
* 删除成果团队信息
*
* @param id 成果团队主键
* @return 结果
*/
public int deleteAchievementTeamById(Long id);
}

View File

@ -0,0 +1,127 @@
package com.microservices.dms.achievementLibrary.service;
import java.util.List;
import java.util.Map;
import com.microservices.dms.achievementLibrary.domain.*;
import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo;
import com.microservices.dms.resourceLibrary.domain.CompetitionResourceLibrary;
import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary;
import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo;
/**
* 成果Service接口
*
* @author microservices
* @date 2025-04-02
*/
public interface IAchievementsService {
/**
* 查询成果
*
* @param id 成果主键
* @return 成果
*/
public Achievements selectAchievementsById(Long id);
/**
* 查询成果列表
*
* @param achievements 成果
* @return 成果集合
*/
public List<Achievements> selectAchievementsList(Achievements achievements);
/**
* 新增成果
*
* @param achievements 成果
* @return 结果
*/
public int insertAchievements(Achievements achievements);
/**
* 修改成果
*
* @param achievements 成果
* @return 结果
*/
public int updateAchievements(Achievements achievements);
/**
* 批量删除成果
*
* @param ids 需要删除的成果主键集合
* @return 结果
*/
public int deleteAchievementsByIds(Long[] ids);
/**
* 删除成果信息
*
* @param id 成果主键
* @return 结果
*/
public int deleteAchievementsById(Long id);
String buildFileInfoByIdents(String aStr, String source);
List<Achievements> selectAchievementsFrontList(Achievements achievements);
List<Achievements> getChoiceImport();
List<KeyValueVo> getTjBySources();
List<KeyValueVo> getTjByAreas();
List<Achievements> getAllResult(AchQueryVo achQueryVo);
Map<String, Object> getUerActionData();
List<HotAchVo> getHotAchievement();
List<KeyValVo<String, Long>> get7DayAdd(AchQueryVo achQueryVo);
Map<String,Long> indexProjectStatistic();
Map<String,Object> indexTaskStatistic();
Map<String,Long> indexCompetitionStatistic();
Map<String,Long> indexSchoolEnterpriseStatistic();
Map<String,Long> indexExpertStatistic();
List<KeyValueVo> getAreasByName(String areaName);
AchievementBehaviorSumVo getActDataStatisticById(Long id);
List<KeyValVo<String, Long>> get7AddClickById(String id, String clickType);
AchievementBehaviorSumVo getWatchFavoriteStatusById(Long id, Long userId);
List<AreaStatisticVo> getAreaStatistic(String areaKey);
List<AchRelatedResult> getRelatedAch(Long id, Long sourceId);
int getSearchResult(String achName, Long userId);
List<KeyValueVo> getProjectAreasByName(String areaName);
List<String> getExpertAreasByName(String areaName);
List<AchRelatedResult> getRelatedAchCompetition(Long id, Long sourceId);
List<AchRelatedResult> getRelatedAchTask(Long id, Long sourceId);
List<TaskResourceLibrary> getRelatedAchTaskOfExpert(Long id);
List<CompetitionResourceLibrary> getRelatedAchCompetitionOfExpert(Long id);
AchDetailVo getAreaDetail(String areaKey,String kyxmSum, String source);
List<KeyValVo<String, Long>> get7DayAddExport(AchQueryVo achQueryVo);
List<KeyValueVo> getAllAreas(String areaName);
}

View File

@ -0,0 +1,72 @@
package com.microservices.dms.achievementLibrary.service;
import java.util.List;
import java.util.Map;
import com.microservices.dms.achievementLibrary.domain.SchoolEnterpriseAchievements;
import org.springframework.web.multipart.MultipartFile;
/**
* 校企成果Service接口
*
* @author microservices
* @date 2025-04-03
*/
public interface ISchoolEnterpriseAchievementsService
{
/**
* 查询校企成果
*
* @param id 校企成果主键
* @return 校企成果
*/
public SchoolEnterpriseAchievements selectSchoolEnterpriseAchievementsById(Long id);
/**
* 查询校企成果列表
*
* @param schoolEnterpriseAchievements 校企成果
* @return 校企成果集合
*/
public List<SchoolEnterpriseAchievements> selectSchoolEnterpriseAchievementsList(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
/**
* 新增校企成果
*
* @param schoolEnterpriseAchievements 校企成果
* @return 结果
*/
public Long insertSchoolEnterpriseAchievements(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
/**
* 修改校企成果
*
* @param schoolEnterpriseAchievements 校企成果
* @return 结果
*/
public int updateSchoolEnterpriseAchievements(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
/**
* 批量删除校企成果
*
* @param ids 需要删除的校企成果主键集合
* @return 结果
*/
public int deleteSchoolEnterpriseAchievementsByIds(Long[] ids);
/**
* 删除校企成果信息
*
* @param id 校企成果主键
* @return 结果
*/
public int deleteSchoolEnterpriseAchievementsById(Long id);
Long topStatistic(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
List<SchoolEnterpriseAchievements> listFront(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
boolean getCheckSchoolAchName(SchoolEnterpriseAchievements schoolEnterpriseAchievements);
String batchInsertSchoolEnterpriseAchievements(List<SchoolEnterpriseAchievements> list, Map<String, MultipartFile> imageMap, boolean updateSupport, String operName);
}

View File

@ -0,0 +1,95 @@
package com.microservices.dms.achievementLibrary.service;
import java.util.List;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.dms.achievementLibrary.domain.blockchain.InBlockchainData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.microservices.dms.achievementLibrary.mapper.InBlockchainDataMapper;
/**
* 区块链数据入链Service业务层处理
*
* @author microservices
* @date 2025-05-27
*/
@Service
public class InBlockchainDataServiceImpl
{
@Autowired
private InBlockchainDataMapper inBlockchainDataMapper;
/**
* 查询区块链数据入链
*
* @param id 区块链数据入链主键
* @return 区块链数据入链
*/
public InBlockchainData selectInBlockchainDataById(Long id)
{
return inBlockchainDataMapper.selectInBlockchainDataById(id);
}
/**
* 查询区块链数据入链列表
*
* @param inBlockchainData 区块链数据入链
* @return 区块链数据入链
*/
public List<InBlockchainData> selectInBlockchainDataList(InBlockchainData inBlockchainData)
{
return inBlockchainDataMapper.selectInBlockchainDataList(inBlockchainData);
}
/**
* 新增区块链数据入链
*
* @param inBlockchainData 区块链数据入链
* @return 结果
*/
public int insertInBlockchainData(InBlockchainData inBlockchainData)
{
inBlockchainData.setCreateTime(DateUtils.getNowDate());
return inBlockchainDataMapper.insertInBlockchainData(inBlockchainData);
}
/**
* 修改区块链数据入链
*
* @param inBlockchainData 区块链数据入链
* @return 结果
*/
public int updateInBlockchainData(InBlockchainData inBlockchainData)
{
return inBlockchainDataMapper.updateInBlockchainData(inBlockchainData);
}
/**
* 批量删除区块链数据入链
*
* @param ids 需要删除的区块链数据入链主键
* @return 结果
*/
public int deleteInBlockchainDataByIds(Long[] ids)
{
return inBlockchainDataMapper.deleteInBlockchainDataByIds(ids);
}
/**
* 删除区块链数据入链信息
*
* @param id 区块链数据入链主键
* @return 结果
*/
public int deleteInBlockchainDataById(Long id)
{
return inBlockchainDataMapper.deleteInBlockchainDataById(id);
}
}

View File

@ -0,0 +1,100 @@
package com.microservices.dms.achievementLibrary.service;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.dms.achievementLibrary.domain.AchQueryVo;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.achievementLibrary.domain.MemoTotalVo;
import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo;
import com.microservices.dms.resourceLibrary.mapper.ExpertResourceLibraryMapper;
import com.microservices.dms.utils.DateUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class MemoDashboardService {
@Autowired
private ExpertResourceLibraryMapper memoResourceLibraryMapper;
/**
* 审核通过率
* @return
*/
public List<KeyValueVo> getMemoAduit() {
return memoResourceLibraryMapper.getMemoAduit();
}
/**
* 原创非原创
* @return
*/
public List<KeyValueVo> getIsOriginalStatistic() {
return memoResourceLibraryMapper.getIsOriginalStatistic();
}
/**
* 年度动态数据统计
* @return
*/
public List<KeyValueVo> getMemoTotalByYear() {
return memoResourceLibraryMapper.getMemoTotalByYear();
}
/**
* 根据帖子类型汇总
* @return
*/
public List<KeyValueVo> getForumSectionStatistic() {
return memoResourceLibraryMapper.getForumSectionStatistic();
}
/**
* 近一年新增帖子数
* @return
*/
public List<KeyValueVo> getAddMemoStatistic() {
Date[] currentYear = DateUtil.getLast12Months();
return memoResourceLibraryMapper.getAddMemoStatistic(currentYear[0],currentYear[1]);
}
/**
* 本年帖子热度top5论坛评论点击点赞
* @return
*/
public List<MemoTotalVo> getTop5Memos() {
return memoResourceLibraryMapper.getTop5Memos();
}
/**
* 近7日帖子点赞数
* @return
*/
public List<KeyValVo<String, Long>> get7DayPaise() {
Date[] days = DateUtil.getDays(0, 6);
Map<String, Long> w = memoResourceLibraryMapper.get7DayPaise(days[0], days[1])
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrMMDD(days[0], days[1]);
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = w.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
return res;
}
}

View File

@ -0,0 +1,88 @@
package com.microservices.dms.achievementLibrary.service;
import java.util.List;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.dms.achievementLibrary.domain.blockchain.UserProjectTransferRecords;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.microservices.dms.achievementLibrary.mapper.UserProjectTransferRecordsMapper;
/**
* 用户/项目转账信息记录Service业务层处理
*
* @author microservices
* @date 2025-05-27
*/
@Service
public class UserProjectTransferRecordsServiceImpl
{
@Autowired
private UserProjectTransferRecordsMapper userProjectTransferRecordsMapper;
/**
* 查询用户/项目转账信息记录
*
* @param id 用户/项目转账信息记录主键
* @return 用户/项目转账信息记录
*/
public UserProjectTransferRecords selectUserProjectTransferRecordsById(Long id)
{
return userProjectTransferRecordsMapper.selectUserProjectTransferRecordsById(id);
}
/**
* 查询用户/项目转账信息记录列表
*
* @param userProjectTransferRecords 用户/项目转账信息记录
* @return 用户/项目转账信息记录
*/
public List<UserProjectTransferRecords> selectUserProjectTransferRecordsList(UserProjectTransferRecords userProjectTransferRecords)
{
return userProjectTransferRecordsMapper.selectUserProjectTransferRecordsList(userProjectTransferRecords);
}
/**
* 新增用户/项目转账信息记录
*
* @param userProjectTransferRecords 用户/项目转账信息记录
* @return 结果
*/
public int insertUserProjectTransferRecords(UserProjectTransferRecords userProjectTransferRecords)
{
userProjectTransferRecords.setCreateTime(DateUtils.getNowDate());
return userProjectTransferRecordsMapper.insertUserProjectTransferRecords(userProjectTransferRecords);
}
/**
* 修改用户/项目转账信息记录
*
* @param userProjectTransferRecords 用户/项目转账信息记录
* @return 结果
*/
public int updateUserProjectTransferRecords(UserProjectTransferRecords userProjectTransferRecords)
{
return userProjectTransferRecordsMapper.updateUserProjectTransferRecords(userProjectTransferRecords);
}
/**
* 批量删除用户/项目转账信息记录
*
* @param ids 需要删除的用户/项目转账信息记录主键
* @return 结果
*/
public int deleteUserProjectTransferRecordsByIds(Long[] ids)
{
return userProjectTransferRecordsMapper.deleteUserProjectTransferRecordsByIds(ids);
}
/**
* 删除用户/项目转账信息记录信息
*
* @param id 用户/项目转账信息记录主键
* @return 结果
*/
public int deleteUserProjectTransferRecordsById(Long id)
{
return userProjectTransferRecordsMapper.deleteUserProjectTransferRecordsById(id);
}
}

View File

@ -0,0 +1,116 @@
package com.microservices.dms.achievementLibrary.service.impl;
import java.util.Collections;
import java.util.List;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.microservices.dms.achievementLibrary.mapper.AchievementDictDataMapper;
import com.microservices.dms.achievementLibrary.domain.AchievementDictData;
import com.microservices.dms.achievementLibrary.service.IAchievementDictDataService;
/**
* 成果相关字典Service业务层处理
*
* @author microservices
* @date 2025-05-23
*/
@Service
public class AchievementDictDataServiceImpl implements IAchievementDictDataService
{
@Autowired
private AchievementDictDataMapper achievementDictDataMapper;
/**
* 查询成果相关字典
*
* @param dictCode 成果相关字典主键
* @return 成果相关字典
*/
@Override
public AchievementDictData selectAchievementDictDataByDictCode(Long dictCode)
{
return achievementDictDataMapper.selectAchievementDictDataByDictCode(dictCode);
}
/**
* 查询成果相关字典列表
*
* @param achievementDictData 成果相关字典
* @return 成果相关字典
*/
@Override
public List<AchievementDictData> selectAchievementDictDataList(AchievementDictData achievementDictData)
{
return achievementDictDataMapper.selectAchievementDictDataList(achievementDictData);
}
/**
* 新增成果相关字典
*
* @param achievementDictData 成果相关字典
* @return 结果
*/
@Override
public int insertAchievementDictData(AchievementDictData achievementDictData)
{
//判断字典是否存在存在则不管不存在则新增
String label = achievementDictData.getDictLabel();
String type = achievementDictData.getDictType();
int num = achievementDictDataMapper.selectDictDataByLabel(label,type);
if (num > 0){
return 0;
}else{
achievementDictData.setCreateTime(DateUtils.getNowDate());
return achievementDictDataMapper.insertAchievementDictData(achievementDictData);
}
}
/**
* 修改成果相关字典
*
* @param achievementDictData 成果相关字典
* @return 结果
*/
@Override
public int updateAchievementDictData(AchievementDictData achievementDictData)
{
achievementDictData.setUpdateTime(DateUtils.getNowDate());
return achievementDictDataMapper.updateAchievementDictData(achievementDictData);
}
/**
* 批量删除成果相关字典
*
* @param dictCodes 需要删除的成果相关字典主键
* @return 结果
*/
@Override
public int deleteAchievementDictDataByDictCodes(Long[] dictCodes)
{
return achievementDictDataMapper.deleteAchievementDictDataByDictCodes(dictCodes);
}
/**
* 删除成果相关字典信息
*
* @param dictCode 成果相关字典主键
* @return 结果
*/
@Override
public int deleteAchievementDictDataByDictCode(Long dictCode)
{
return achievementDictDataMapper.deleteAchievementDictDataByDictCode(dictCode);
}
@Override
public List<KeyValueVo> selectDictDataByType(String dictType) {
return achievementDictDataMapper.selectDictDataByType(dictType);
}
@Override
public List<String> getDictTypes() {
return achievementDictDataMapper.getDictTypes();
}
}

View File

@ -0,0 +1,96 @@
package com.microservices.dms.achievementLibrary.service.impl;
import java.util.List;
import com.microservices.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.microservices.dms.achievementLibrary.mapper.AchievementTeamMapper;
import com.microservices.dms.achievementLibrary.domain.AchievementTeam;
import com.microservices.dms.achievementLibrary.service.IAchievementTeamService;
/**
* 成果团队Service业务层处理
*
* @author microservices
* @date 2025-04-23
*/
@Service
public class AchievementTeamServiceImpl implements IAchievementTeamService
{
@Autowired
private AchievementTeamMapper achievementTeamMapper;
/**
* 查询成果团队
*
* @param id 成果团队主键
* @return 成果团队
*/
@Override
public AchievementTeam selectAchievementTeamById(Long id)
{
return achievementTeamMapper.selectAchievementTeamById(id);
}
/**
* 查询成果团队列表
*
* @param achievementTeam 成果团队
* @return 成果团队
*/
@Override
public List<AchievementTeam> selectAchievementTeamList(AchievementTeam achievementTeam)
{
return achievementTeamMapper.selectAchievementTeamList(achievementTeam);
}
/**
* 新增成果团队
*
* @param achievementTeam 成果团队
* @return 结果
*/
@Override
public int insertAchievementTeam(AchievementTeam achievementTeam)
{
achievementTeam.setCreateTime(DateUtils.getNowDate());
return achievementTeamMapper.insertAchievementTeam(achievementTeam);
}
/**
* 修改成果团队
*
* @param achievementTeam 成果团队
* @return 结果
*/
@Override
public int updateAchievementTeam(AchievementTeam achievementTeam)
{
achievementTeam.setUpdateTime(DateUtils.getNowDate());
return achievementTeamMapper.updateAchievementTeam(achievementTeam);
}
/**
* 批量删除成果团队
*
* @param ids 需要删除的成果团队主键
* @return 结果
*/
@Override
public int deleteAchievementTeamByIds(Long[] ids)
{
return achievementTeamMapper.deleteAchievementTeamByIds(ids);
}
/**
* 删除成果团队信息
*
* @param id 成果团队主键
* @return 结果
*/
@Override
public int deleteAchievementTeamById(Long id)
{
return achievementTeamMapper.deleteAchievementTeamById(id);
}
}

View File

@ -0,0 +1,632 @@
package com.microservices.dms.achievementLibrary.service.impl;
import java.util.*;
import java.util.stream.Collectors;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.httpClient.service.HttpAPIService;
import com.microservices.common.security.utils.SecurityUtils;
import com.microservices.dms.achievementLibrary.domain.*;
import com.microservices.dms.achievementLibrary.mapper.SchoolEnterpriseAchievementsMapper;
import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo;
import com.microservices.dms.behaviorImage.domain.AchievementImageVo;
import com.microservices.dms.behaviorImage.service.IBehaviorImageService;
import com.microservices.dms.resourceLibrary.domain.Clicker;
import com.microservices.dms.resourceLibrary.domain.CompetitionResourceLibrary;
import com.microservices.dms.resourceLibrary.domain.Searcher;
import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary;
import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo;
import com.microservices.dms.resourceLibrary.mapper.CompetitionResourceLibraryMapper;
import com.microservices.dms.resourceLibrary.mapper.ExpertResourceLibraryMapper;
import com.microservices.dms.resourceLibrary.mapper.ProjectResourceLibraryMapper;
import com.microservices.dms.resourceLibrary.mapper.TaskResourceLibraryMapper;
import com.microservices.dms.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.K;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper;
import com.microservices.dms.achievementLibrary.service.IAchievementsService;
import static com.microservices.dms.constant.BlockChainFunConstants.QUERY_REPO;
import static com.microservices.dms.utils.UrlUtil.getUrlPath;
/**
* 成果Service业务层处理
*
* @author microservices
* @date 2025-04-02
*/
@Service
@Slf4j
public class AchievementsServiceImpl implements IAchievementsService {
@Autowired
private AchievementsMapper achievementsMapper;
@Autowired
private TaskResourceLibraryMapper taskResourceLibraryMapper;
@Autowired
private ExpertResourceLibraryMapper expertResourceLibraryMapper;
@Autowired
private IBehaviorImageService behaviorImageService;
@Value("${makerSpaceUrl}")
public String makerSpaceUrl;
@Value("${http.gitLinkUrl}")
public String gitLinkUrl;
@Value("${http.gatewayUrl}")
public String gatewayUrl;
/**
* 查询成果
*
* @param id 成果主键
* @return 成果
*/
@Override
public Achievements selectAchievementsById(Long id) {
Achievements a = achievementsMapper.selectAchievementsById(id);
if (StringUtils.isNotNull(a)) {
String gender = a.getGender();
String img = "";
if (StringUtils.isNotEmpty(gender) && gender.equals("1")) {
img = "images/avatars/User/girl.jpg";
} else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) {
img = "images/avatars/User/boy.jpg";
}
a.setUserImg(img);
if (StringUtils.isNotEmpty(a.getField1())) {
String field1Name = achievementsMapper.getField1NameByParam(a.getSource(), a.getId());
if (StringUtils.isNotNull(field1Name)) {
a.setField1Name(field1Name);
}
}
a.setUserImg(img);
a.setImages(buildFileInfoByIdents(a.getImages(), a.getSource()));
a.setAttachments(buildFileInfoByIdents(a.getAttachments(), a.getSource()));
}
return a;
}
/**
* 查询成果列表
*
* @param achievements 成果
* @return 成果
*/
@Override
public List<Achievements> selectAchievementsList(Achievements achievements) {
List<Achievements> list = achievementsMapper.selectAchievementsList(achievements);
for (Achievements a : list) {
String gender = a.getGender();
String img = "";
if (StringUtils.isNotEmpty(gender) && gender.equals("1")) {
img = "images/avatars/User/girl.jpg";
} else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) {
img = "images/avatars/User/boy.jpg";
}
a.setUserImg(img);
//根据id获取领域名称
if (StringUtils.isNotEmpty(a.getField1())) {
String field1Name = achievementsMapper.getField1NameByParam(a.getSource(), a.getId());
if (StringUtils.isNotNull(field1Name)) {
a.setField1Name(field1Name);
}
}
a.setImages(buildFileInfoByIdents(a.getImages(), a.getSource()));
a.setAttachments(buildFileInfoByIdents(a.getAttachments(), a.getSource()));
//拼接对接的用户信息
List<Map<String,Object>> dockingUserInfo = achievementsMapper.getDockingUserInfoList(a.getId());
a.setDockingUserInfo(dockingUserInfo);
}
return list;
}
@Override
public List<Achievements> selectAchievementsFrontList(Achievements achievements) {
List<Achievements> list = achievementsMapper.selectAchievementsList(achievements);
for (Achievements a : list) {
a.setDetails(null);
a.setImages(buildFileInfoByIdents(a.getImages(), a.getSource()));
a.setAttachments(buildFileInfoByIdents(a.getAttachments(), a.getSource()));
}
return list;
}
/**
* 新增成果
*
* @param achievements 成果
* @return 结果
*/
@Override
public int insertAchievements(Achievements achievements) {
achievements.setCreateTime(DateUtils.getNowDate());
achievements.setCreateBy(SecurityUtils.getUsername());
return achievementsMapper.insertAchievements(achievements);
}
/**
* 修改成果
*
* @param achievements 成果
* @return 结果
*/
@Override
public int updateAchievements(Achievements achievements) {
achievements.setUpdateTime(DateUtils.getNowDate());
achievements.setUpdateBy(SecurityUtils.getUsername());
return achievementsMapper.updateAchievements(achievements);
}
/**
* 批量删除成果
*
* @param ids 需要删除的成果主键
* @return 结果
*/
@Override
public int deleteAchievementsByIds(Long[] ids) {
return achievementsMapper.deleteAchievementsByIds(ids);
}
/**
* 删除成果信息
*
* @param id 成果主键
* @return 结果
*/
@Override
public int deleteAchievementsById(Long id) {
//根据id获取数据仓库该数据信息
Achievements achievements = achievementsMapper.selectAchievementsById(id);
if(achievements != null){
String source = achievements.getSource();
if(StringUtils.isNotEmpty(source)) {
achievementsMapper.updateRelationAchievements(source,achievements.getSourceId());
}
}
return achievementsMapper.deleteAchievementsById(id);
}
@Override
public String buildFileInfoByIdents(String aStr, String source) {
if (StringUtils.isEmpty(aStr) || StringUtils.isEmpty(source)) {
return aStr;
}
List<Map<String, String>> list = JSON.parseObject(aStr, new TypeReference<List<Map<String, String>>>() {
});
if (Objects.equals(source, "1") || Objects.equals(source, "3")) {
concatUrl(list, gitLinkUrl);
}
if (Objects.equals(source, "2")) {
concatUrl(list, makerSpaceUrl);
}
if (Objects.equals(source, "4")) {
concatUrl(list, gatewayUrl);
}
return JSON.toJSONString(list);
}
private void concatUrl(List<Map<String, String>> list, String url) {
for (Map<String, String> map : list) {
String v = map.getOrDefault("v", "");
String urlPath = getUrlPath(v);
map.put("v", url + urlPath);
}
}
@Override
public List<Achievements> getChoiceImport() {
return achievementsMapper.getChoiceImport();
}
@Override
public List<KeyValueVo> getTjBySources() {
return achievementsMapper.getTjBySources();
}
@Override
public List<KeyValueVo> getTjByAreas() {
return achievementsMapper.getTjByAreas();
}
@Override
public List<Achievements> getAllResult(AchQueryVo achQueryVo) {
//根据查询条件获取所有的成果数据
List<Achievements> list = achievementsMapper.selectAchievementsByParam(achQueryVo);
//遍历成果数据获取对应成果的点击数
for (Achievements a : list) {
String gender = a.getGender();
String img = "";
if (StringUtils.isNotEmpty(gender) && gender.equals("1")) {
img = "images/avatars/User/girl.jpg";
} else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) {
img = "images/avatars/User/boy.jpg";
}
a.setUserImg(img);
//根据id获取领域名称
if (StringUtils.isEmpty(achQueryVo.getSource()) && StringUtils.isNotEmpty(a.getField1())) {
String field1Name = achievementsMapper.getField1NameByParam(a.getSource(), a.getId());
if (StringUtils.isNotNull(field1Name)) {
a.setField1Name(field1Name);
}
}
Long clickSum = achievementsMapper.getAchievementClickSum(a.getId());
a.setClickSum(clickSum);
}
return list;
}
@Override
public Map<String, Object> getUerActionData() {
Date[] days = DateUtil.getDays(0, 6);
Map<String, Long> w = achievementsMapper.getaWatcher(days[0], days[1], "Achievements")
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
Map<String, Long> g = achievementsMapper.getFavorite(days[0], days[1], "Achievements")
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrMMDD(days[0], days[1]);
List<KeyValVo<String, Long>> wRes = new ArrayList<>();
List<KeyValVo<String, Long>> gRes = new ArrayList<>();
for (String s : dateStr) {
Long a = w.getOrDefault(s, 0L);
Long b = g.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
KeyValVo<String, Long> k2 = new KeyValVo<>();
k2.setK(s);
k2.setV(b);
wRes.add(k1);
gRes.add(k2);
}
Map<String, Object> res = new HashMap<>();
res.put("watcher", wRes);
res.put("favorite", gRes);
return res;
}
@Override
public List<HotAchVo> getHotAchievement() {
//根据查询条件获取所有的成果数据
List<HotAchVo> resultList = achievementsMapper.getHotAchievement();
//遍历成果数据获取对应成果的点击数
for (HotAchVo a : resultList) {
String gender = a.getGender();
String img = "";
if (StringUtils.isNotEmpty(gender) && gender.equals("1")) {
img = "images/avatars/User/girl.jpg";
} else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) {
img = "images/avatars/User/boy.jpg";
}
a.setUserImg(img);
}
return resultList;
}
@Override
public List<KeyValVo<String, Long>> get7DayAdd(AchQueryVo achQueryVo) {
Date[] days = DateUtil.getDays(0, 6);
Map<String, Long> w = achievementsMapper.getAchievement(days[0], days[1], achQueryVo.getSource())
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrMMDD(days[0], days[1]);
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = w.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
return res;
}
@Override
public List<KeyValVo<String, Long>> get7DayAddExport(AchQueryVo achQueryVo) {
Date[] days = DateUtil.getDays(0, 6);
Map<String, Long> w = achievementsMapper.getExperts(days[0], days[1])
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrMMDD(days[0], days[1]);
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = w.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
return res;
}
@Override
public Map<String, Long> indexProjectStatistic() {
Map<String, Long> res = achievementsMapper.indexProjectStatistic();
return res;
}
@Override
public Map<String, Object> indexTaskStatistic() {
Map<String, Object> res = achievementsMapper.indexTaskStatistic();
double convertedTaskAmount = taskResourceLibraryMapper.getConvertedTaskAmount2();
res.put("convertedTaskAmount", convertedTaskAmount);
return res;
}
@Override
public Map<String, Long> indexCompetitionStatistic() {
Map<String, Long> res = achievementsMapper.indexCompetitionStatistic();
return res;
}
@Override
public Map<String, Long> indexSchoolEnterpriseStatistic() {
Map<String, Long> res = new HashMap<>();
Long schoolEnterpriseCount = achievementsMapper.indexSchoolEnterpriseStatistic("4", "");
res.put("schoolEnterpriseCount", schoolEnterpriseCount);
Long schoolCount = achievementsMapper.indexSchoolEnterpriseStatistic("4", "1");
res.put("schoolCount", schoolCount);
Long enterpriseCount = achievementsMapper.indexSchoolEnterpriseStatistic("4", "2");
res.put("enterpriseCount", enterpriseCount);
Clicker clicker = new Clicker();
clicker.setClickType("Achievements");
long clickCount = taskResourceLibraryMapper.countClicker(clicker);
res.put("clickCount", clickCount);
return res;
}
/**
* 首页专家数据统计
* @return
*/
@Override
public Map<String, Long> indexExpertStatistic() {
Map<String, Long> res = new HashMap<>();
Long expertResourceCount = expertResourceLibraryMapper.expertResourceCount();
res.put("expertResourceCount", expertResourceCount);
Long auditTaskAuditExpertCount = expertResourceLibraryMapper.auditTaskAuditExpertCount();
res.put("auditTaskAuditExpertCount", auditTaskAuditExpertCount);
Long auditCompetitionAuditExpertCount = expertResourceLibraryMapper.auditCompetitionAuditExpertCount();
res.put("auditCompetitionAuditExpertCount", auditCompetitionAuditExpertCount);
Clicker clicker = new Clicker();
clicker.setClickType("Experts");
long clickCount = taskResourceLibraryMapper.countClickerSimple(clicker);
res.put("clickCount", clickCount);
return res;
}
@Override
public List<KeyValueVo> getAreasByName(String areaName) {
return achievementsMapper.getAreasByName(areaName);
}
@Override
public AchievementBehaviorSumVo getActDataStatisticById(Long id) {
return achievementsMapper.getActDataStatisticById(id);
}
@Override
public List<KeyValVo<String, Long>> get7AddClickById(String id, String clickType) {
if (StringUtils.isEmpty(clickType)) {
clickType = "Achievements";
}
Date[] days = DateUtil.getDays(0, 6);
Map<String, Long> w = achievementsMapper.get7AddClickById(days[0], days[1], clickType, id)
.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV));
List<String> dateStr = DateUtil.getDateStrMMDD(days[0], days[1]);
List<KeyValVo<String, Long>> res = new ArrayList<>();
for (String s : dateStr) {
Long a = w.getOrDefault(s, 0L);
KeyValVo<String, Long> k1 = new KeyValVo<>();
k1.setK(s);
k1.setV(a);
res.add(k1);
}
return res;
}
@Override
public AchievementBehaviorSumVo getWatchFavoriteStatusById(Long id, Long userId) {
return achievementsMapper.getWatchFavoriteStatusById(id, userId);
}
@Scheduled(cron = "${cron.calculateHotRank}")
public void timingCalcHotRank() {
List<Long> ids = achievementsMapper.getAllId();
for (Long id : ids) {
AchievementImageVo image = behaviorImageService.getAchievementImageById(id);
float score = image.getScore();
Achievements u = new Achievements();
u.setId(id);
u.setHotRank(score);
achievementsMapper.updateAchievements(u);
}
}
@Override
public List<AreaStatisticVo> getAreaStatistic(String areaKey) {
List<AreaStatisticVo> areaStatisticVoList = new ArrayList<>();
if(StringUtils.isNotEmpty(areaKey)) {
//根据逗号进行分割
String[] res =areaKey.split(",");
for (String s : res) {
String[] ss = s.split("_");
List<AreaStatisticVo> tmpList = achievementsMapper.getAreaStatistic(ss[1],ss[0]);
areaStatisticVoList.addAll(tmpList);
}
return areaStatisticVoList;
}else{
return achievementsMapper.getAreaStatistic(null,areaKey);
}
}
@Override
public List<AchRelatedResult> getRelatedAch(Long id, Long sourceId) {
List<AchRelatedResult> relatedResultList = new ArrayList<>();
//想根据开源项目id获取对应的年度信息
List<Long> allSourceId = achievementsMapper.getAllSourceId(id, sourceId);
if(allSourceId != null && allSourceId.size() > 0) {
List<String> allYear = achievementsMapper.getDistinctYear(id, allSourceId);
if (StringUtils.isNotNull(allYear)) {
//遍历年度信息获取年度成果数据
for (String paramYear : allYear) {
AchRelatedResult relatedResult = new AchRelatedResult();
relatedResult.setYear(paramYear);
List<AchRelatedVo> tmpList = achievementsMapper.getRelatedAch(id, allSourceId, paramYear);
relatedResult.setAchRelatedVoList(tmpList);
relatedResultList.add(relatedResult);
}
}
}
return relatedResultList;
}
@Override
public List<AchRelatedResult> getRelatedAchCompetition(Long id, Long sourceId) {
List<AchRelatedResult> relatedResultList = new ArrayList<>();
//想根据开源项目id获取对应的年度信息
List<Long> allSourceId = achievementsMapper.getAllSourceIdCompetition(id, sourceId);
List<String> allYear = achievementsMapper.getDistinctYear(id, allSourceId);
if (StringUtils.isNotNull(allYear)) {
//遍历年度信息获取年度成果数据
for (String paramYear : allYear) {
AchRelatedResult relatedResult = new AchRelatedResult();
relatedResult.setYear(paramYear);
List<AchRelatedVo> tmpList = achievementsMapper.getRelatedAch(id, allSourceId, paramYear);
relatedResult.setAchRelatedVoList(tmpList);
relatedResultList.add(relatedResult);
}
}
return relatedResultList;
}
@Override
public List<AchRelatedResult> getRelatedAchTask(Long id, Long sourceId) {
List<AchRelatedResult> relatedResultList = new ArrayList<>();
//想根据开源项目id获取对应的年度信息
List<Long> allSourceId = achievementsMapper.getAllSourceIdTask(id, sourceId);
List<String> allYear = achievementsMapper.getDistinctYear(id, allSourceId);
if (StringUtils.isNotNull(allYear)) {
//遍历年度信息获取年度成果数据
for (String paramYear : allYear) {
AchRelatedResult relatedResult = new AchRelatedResult();
relatedResult.setYear(paramYear);
List<AchRelatedVo> tmpList = achievementsMapper.getRelatedAch(id, allSourceId, paramYear);
relatedResult.setAchRelatedVoList(tmpList);
relatedResultList.add(relatedResult);
}
}
return relatedResultList;
}
@Override
public List<TaskResourceLibrary> getRelatedAchTaskOfExpert(Long id) {
return achievementsMapper.getRelatedAchTaskOfExpert(id);
}
@Override
public List<CompetitionResourceLibrary> getRelatedAchCompetitionOfExpert(Long id) {
return achievementsMapper.getRelatedAchCompetitionOfExpert(id);
}
/**
* 根据查询内容调用搜索行为接口
*
* @param achName
* @param userId
*/
@Override
public int getSearchResult(String achName, Long userId) {
int num = 0;
if (StringUtils.isEmpty(achName)) {
return num;
}
List<Long> idList = achievementsMapper.selectAchievementsByName(achName);
if (StringUtils.isNotNull(idList)) {
for (Long searchId : idList) {
Searcher e = new Searcher();
e.setCreatedAt(DateUtils.getNowDate());
e.setUserId(userId);
e.setSearchId(searchId);
e.setExtInfo(achName);
e.setSearchType("Achievements");
num = taskResourceLibraryMapper.insertSearcher(e);
num++;
}
}
return num;
}
@Override
public List<KeyValueVo> getProjectAreasByName(String areaName) {
return achievementsMapper.getProjectAreasByName(areaName);
}
@Override
public List<String> getExpertAreasByName(String areaName) {
return achievementsMapper.getExpertAreasByName(areaName);
}
@Override
public AchDetailVo getAreaDetail(String areaKey,String kyxmSum, String source) {
AchDetailVo achDetailVo = new AchDetailVo();
AchQueryVo achQueryVo = new AchQueryVo();
achQueryVo.setAreaQuery(areaKey);
achQueryVo.setSource(source);
//根据kye,和source,查询领域描述
String remark = achievementsMapper.getField1RemarkByParam(source,areaKey);
achDetailVo.setRemark(remark);
List<Achievements> achievementsList = achievementsMapper.selectAchievementsByArea(achQueryVo);
if(achievementsList!=null && achievementsList.size()>0) {
achDetailVo.setAchievementsList(achievementsList);
long clickSum = achievementsList.stream().mapToLong(Achievements::getClickSum).sum();
achDetailVo.setClickSum(clickSum);
long dockSum = achievementsList.stream().mapToLong(Achievements::getDockSum).sum();
achDetailVo.setDockSum(dockSum);
long favoriteSum = achievementsList.stream().mapToLong(Achievements::getFavoriteSum).sum();
achDetailVo.setFavoriteSum(favoriteSum);
long watcherSum = achievementsList.stream().mapToLong(Achievements::getWatcherSum).sum();
achDetailVo.setWatcherSum(watcherSum);
}
return achDetailVo;
}
@Override
public List<KeyValueVo> getAllAreas(String areaName) {
List<KeyValueVo> resultVal = achievementsMapper.getAllAreas(areaName);
return resultVal;
}
}

View File

@ -0,0 +1,337 @@
package com.microservices.dms.achievementLibrary.service.impl;
import java.io.*;
import java.util.*;
import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.constant.SecurityConstants;
import com.microservices.common.core.constant.UserConstants;
import com.microservices.common.core.domain.R;
import com.microservices.common.core.exception.ServiceException;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.common.security.utils.SecurityUtils;
import com.microservices.dms.achievementLibrary.domain.AchievementTeam;
import com.microservices.dms.achievementLibrary.domain.Achievements;
import com.microservices.dms.achievementLibrary.mapper.AchievementTeamMapper;
import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper;
import com.microservices.dms.achievementLibrary.service.IAchievementsService;
import com.microservices.system.api.RemoteFileService;
import com.microservices.system.api.model.LoginUser;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.microservices.dms.achievementLibrary.mapper.SchoolEnterpriseAchievementsMapper;
import com.microservices.dms.achievementLibrary.domain.SchoolEnterpriseAchievements;
import com.microservices.dms.achievementLibrary.service.ISchoolEnterpriseAchievementsService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
/**
* 校企成果Service业务层处理
*
* @author microservices
* @date 2025-04-03
*/
@Service
public class SchoolEnterpriseAchievementsServiceImpl implements ISchoolEnterpriseAchievementsService
{
@Autowired
private SchoolEnterpriseAchievementsMapper schoolEnterpriseAchievementsMapper;
@Autowired
private AchievementTeamMapper achievementTeamMapper;
@Autowired
private IAchievementsService achievementsService;
@Autowired
private AchievementsMapper achievementsMapper;
@Autowired
private RemoteFileService remoteFileService;
/**
* 查询校企成果
*
* @param id 校企成果主键
* @return 校企成果
*/
@Override
public SchoolEnterpriseAchievements selectSchoolEnterpriseAchievementsById(Long id)
{
SchoolEnterpriseAchievements sAchievements = schoolEnterpriseAchievementsMapper.selectSchoolEnterpriseAchievementsById(id);
if(StringUtils.isNotNull(sAchievements)){
Long achId = sAchievements.getId();
List<AchievementTeam> teamList = achievementTeamMapper.selectAchievementTeamByAchId(achId);
if(StringUtils.isNotNull(teamList) && teamList.size() > 0){
sAchievements.setTeamList(teamList);
}
}
return sAchievements;
}
/**
* 查询校企成果列表
*
* @param schoolEnterpriseAchievements 校企成果
* @return 校企成果
*/
@Override
public List<SchoolEnterpriseAchievements> selectSchoolEnterpriseAchievementsList(SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
// LoginUser loginUser = SecurityUtils.getLoginUser();
// if (loginUser != null){
// String username = loginUser.getUsername();
// schoolEnterpriseAchievements.setCreateBy(username);
// }
List<SchoolEnterpriseAchievements> list = schoolEnterpriseAchievementsMapper.selectSchoolEnterpriseAchievementsList(schoolEnterpriseAchievements);
for (SchoolEnterpriseAchievements a : list) {
a.setImages(achievementsService.buildFileInfoByIdents(a.getImages(), "4"));
a.setAttachments(achievementsService.buildFileInfoByIdents(a.getAttachments(), "4"));
}
return list;
}
@Override
public List<SchoolEnterpriseAchievements> listFront(SchoolEnterpriseAchievements schoolEnterpriseAchievements) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null) {
String username = loginUser.getUsername();
schoolEnterpriseAchievements.setCreateBy(username);
}
return selectSchoolEnterpriseAchievementsList(schoolEnterpriseAchievements);
}
/**
* 新增校企成果
*
* @param schoolEnterpriseAchievements 校企成果
* @return 结果
*/
@Override
public Long insertSchoolEnterpriseAchievements(SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null){
String username = loginUser.getUsername();
schoolEnterpriseAchievements.setCreateBy(username);
}
schoolEnterpriseAchievements.setCreateTime(DateUtils.getNowDate());
schoolEnterpriseAchievementsMapper.insertSchoolEnterpriseAchievements(schoolEnterpriseAchievements);
return schoolEnterpriseAchievements.getId();
}
//先判断是否存在名称一致的成果存在则抛异常已存在名称一样的成果
@Override
public boolean getCheckSchoolAchName(SchoolEnterpriseAchievements schoolEnterpriseAchievements) {
Long achId = StringUtils.isNull(schoolEnterpriseAchievements.getId()) ? -1L : schoolEnterpriseAchievements.getId();
SchoolEnterpriseAchievements info =schoolEnterpriseAchievementsMapper.selectSchoolEnterpriseAchievementsByName(schoolEnterpriseAchievements.getAchievementName());
if (StringUtils.isNotNull(info) && info.getId().longValue() != achId.longValue())
{
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 导入成果数据包含图片处理
*/
@Override
@Transactional
@Slave
public String batchInsertSchoolEnterpriseAchievements(List<SchoolEnterpriseAchievements> list,
Map<String, MultipartFile> imageMap,
boolean updateSupport,
String operName) {
if (list == null || list.isEmpty()) {
throw new RuntimeException("导入成果数据不能为空!");
}
int successNum = 0;
int failureNum = 0;
int imageErrorNum = 0; // 新增图片处理失败数
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
StringBuilder imageErrorMsg = new StringBuilder(); // 新增图片错误信息
for (SchoolEnterpriseAchievements schoolEnterpriseAchievement : list) {
try {
// 处理图片字段优化后返回处理结果不抛出异常
String imageHandleResult = handleAchievementImage(schoolEnterpriseAchievement, imageMap);
if (imageHandleResult.contains("失败") || imageHandleResult.contains("异常")) {
imageErrorNum++;
imageErrorMsg.append("<br/>").append(imageErrorNum).append("、成果 ").append(schoolEnterpriseAchievement.getAchievementName()).append(" 图片处理失败:").append(imageHandleResult);
}
// 原有查重和入库逻辑不受图片处理影响
SchoolEnterpriseAchievements exist = schoolEnterpriseAchievementsMapper.selectSchoolEnterpriseAchievementsByName(schoolEnterpriseAchievement.getAchievementName());
if (exist == null) {
schoolEnterpriseAchievement.setCreateBy(operName);
schoolEnterpriseAchievement.setCreateTime(new Date());
schoolEnterpriseAchievement.setUpdateBy(operName);
schoolEnterpriseAchievement.setUpdateTime(new Date());
schoolEnterpriseAchievement.setStatus("0");
schoolEnterpriseAchievement.setAchievementStatus(0);
schoolEnterpriseAchievementsMapper.insertSchoolEnterpriseAchievements(schoolEnterpriseAchievement);
successNum++;
successMsg.append("<br/>").append(successNum).append("、成果 ").append(schoolEnterpriseAchievement.getAchievementName()).append(" 导入成功");
} else {
if (updateSupport) {
schoolEnterpriseAchievement.setId(exist.getId());
schoolEnterpriseAchievement.setCreateBy(exist.getCreateBy());
schoolEnterpriseAchievement.setCreateTime(exist.getCreateTime());
schoolEnterpriseAchievement.setUpdateBy(operName);
schoolEnterpriseAchievement.setUpdateTime(new Date());
schoolEnterpriseAchievementsMapper.updateSchoolEnterpriseAchievements(schoolEnterpriseAchievement);
successNum++;
successMsg.append("<br/>").append(successNum).append("、成果 ").append(schoolEnterpriseAchievement.getAchievementName()).append(" 更新成功");
} else {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("、成果 ").append(schoolEnterpriseAchievement.getAchievementName()).append(" 已存在(未开启更新)");
}
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、成果 " + schoolEnterpriseAchievement.getAchievementName() + " 导入失败:";
failureMsg.append(msg).append(e.getMessage());
}
}
// 组装最终提示信息包含图片处理错误
StringBuilder finalMsg = new StringBuilder();
if (successNum > 0) {
finalMsg.append("").append(successNum).append(" 条数据导入/更新成功:").append(successMsg);
}
if (failureNum > 0) {
finalMsg.append("<br/>共 ").append(failureNum).append(" 条数据导入失败:").append(failureMsg);
}
if (imageErrorNum > 0) {
finalMsg.append("<br/>共 ").append(imageErrorNum).append(" 条数据图片处理失败:").append(imageErrorMsg);
}
return finalMsg.toString();
}
/**
* 处理成果图片上传并格式化存储FastJSON解析版
* @param achievement 成果实体
* @param imageMap Excel解析出的图片映射表
* @return 图片处理结果提示成功/失败信息
*/
private String handleAchievementImage(SchoolEnterpriseAchievements achievement, Map<String, MultipartFile> imageMap) {
String imageCellKey = achievement.getImages();
if (StringUtils.isEmpty(imageCellKey) || !imageMap.containsKey(imageCellKey)) {
return "无图片,跳过处理";
}
try {
MultipartFile file = imageMap.get(imageCellKey);
byte[] fileBytes = file.getBytes();
if (fileBytes == null || fileBytes.length == 0) {
return "图片文件为空,跳过处理";
}
// 构建 HashMap 参数
String originalFilename = StringUtils.isEmpty(file.getOriginalFilename())
? "excel_import_image_" + System.currentTimeMillis() + ".png"
: file.getOriginalFilename();
Map<String, Object> params = new HashMap<>();
params.put("base64Data", Base64.getEncoder().encodeToString(fileBytes));
params.put("fileName", originalFilename);
params.put("contentType", file.getContentType());
params.put("size", fileBytes.length);
// 调用 Base64 上传接口
R<?> fileResult = remoteFileService.uploadBase64(params, "dms", "import", SecurityConstants.INNER);
// 解析结果与原逻辑相同
if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData())) {
String errorMsg = !StringUtils.isNull(fileResult) ? fileResult.getMsg() : "接口返回异常";
return "图片上传失败:" + errorMsg;
}
JSONObject resultJson = JSONObject.parseObject(JSONObject.toJSONString(fileResult.getData()));
String fileOriginName = resultJson.getString("fileOriginName");
String url = resultJson.getString("downloadUrl");
Integer fileId = resultJson.getInteger("fileId");
if (StringUtils.isEmpty(fileOriginName) || StringUtils.isEmpty(url) || fileId == null) {
return "图片上传成功,但返回数据不完整";
}
String imageJson = String.format("[{\"k\":\"%s\",\"v\":\"%s\",\"id\":%d}]",
fileOriginName, url, fileId);
achievement.setImages(imageJson);
return "图片处理成功";
} catch (Exception e) {
return "图片处理异常:" + e.getMessage();
}
}
/**
* 修改校企成果
*
* @param schoolEnterpriseAchievements 校企成果
* @return 结果
*/
@Override
public int updateSchoolEnterpriseAchievements(SchoolEnterpriseAchievements schoolEnterpriseAchievements)
{
schoolEnterpriseAchievements.setUpdateTime(DateUtils.getNowDate());
String status = schoolEnterpriseAchievements.getStatus();
if(StringUtils.isNotEmpty(status)){
schoolEnterpriseAchievements.setReviewDate(DateUtils.getNowDate());
if (SecurityUtils.getLoginUser() != null) {
schoolEnterpriseAchievements.setReviewer(SecurityUtils.getLoginUser().getUsername());
}
}
return schoolEnterpriseAchievementsMapper.updateSchoolEnterpriseAchievements(schoolEnterpriseAchievements);
}
/**
* 批量删除校企成果
*
* @param ids 需要删除的校企成果主键
* @return 结果
*/
@Override
public int deleteSchoolEnterpriseAchievementsByIds(Long[] ids)
{
return schoolEnterpriseAchievementsMapper.deleteSchoolEnterpriseAchievementsByIds(ids);
}
/**
* 删除校企成果信息
*
* @param id 校企成果主键
* @return 结果
*/
@Override
public int deleteSchoolEnterpriseAchievementsById(Long id)
{
// 校企成果删除前判断数据仓库是否存在数据存在则不允许删除该数据
Achievements achievements = new Achievements();
achievements.setSource("4");
achievements.setSourceId(id);
List<Achievements> ss = achievementsMapper.selectAchievementsList(achievements);
if (ss != null && !ss.isEmpty()) {
throw new ServiceException("数据仓库是否存在数据,不允许删除");
}
// 校企成果被删除对应的成员也应该一并删除
achievementTeamMapper.deleteAchievementTeamByAId(id);
return schoolEnterpriseAchievementsMapper.deleteSchoolEnterpriseAchievementsById(id);
}
@Override
public Long topStatistic(SchoolEnterpriseAchievements schoolEnterpriseAchievements) {
return schoolEnterpriseAchievementsMapper.topStatistic(schoolEnterpriseAchievements);
}
}

View File

@ -0,0 +1,181 @@
package com.microservices.dms.behaviorImage.controller;
import com.microservices.common.core.utils.poi.ExcelUtil;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.core.web.page.TableDataInfo;
import com.microservices.common.log.annotation.Log;
import com.microservices.common.log.enums.BusinessType;
import com.microservices.dms.behaviorImage.domain.ActivityUserLibrary;
import com.microservices.dms.behaviorImage.domain.BehaviorImageWeight;
import com.microservices.dms.behaviorImage.service.IBehaviorImageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import static com.microservices.common.core.utils.PageUtils.startPage;
/**
* 成果画像Controller
*
* @author microservices
* @date 2025-04-17
*/
@RestController
@RequestMapping("/behaviorImage")
@Api(tags = "数据管理体系-画像接口")
public class BehaviorImageController extends BaseController {
@Autowired
private IBehaviorImageService behaviorImageService;
/**
* 根据成果ID获取对应的成果画像
*/
//@RequiresPermissions("dms:achievements:query")
@ApiOperation(value = "根据成果ID获取对应的成果画像")
@GetMapping(value = "/achievementImage")
public AjaxResult getAchievementImageById(Long id)
{
return AjaxResult.success(behaviorImageService.getAchievementImageById(id));
}
/**
* 查询画像行为权重列表
*/
@GetMapping("/list")
public TableDataInfo list(BehaviorImageWeight behaviorImageWeight)
{
startPage();
List<BehaviorImageWeight> list = behaviorImageService.selectBehaviorImageWeightList(behaviorImageWeight);
return getDataTable(list);
}
/**
* 导出画像行为权重列表
*/
@Log(title = "画像行为权重", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, BehaviorImageWeight behaviorImageWeight)
{
List<BehaviorImageWeight> list = behaviorImageService.selectBehaviorImageWeightList(behaviorImageWeight);
ExcelUtil<BehaviorImageWeight> util = new ExcelUtil<BehaviorImageWeight>(BehaviorImageWeight.class);
util.exportExcel(response, list, "画像行为权重数据");
}
/**
* 获取画像行为权重详细信息
*/
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(behaviorImageService.selectBehaviorImageWeightById(id));
}
/**
* 新增画像行为权重
*/
@Log(title = "画像行为权重", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody BehaviorImageWeight behaviorImageWeight)
{
return toAjax(behaviorImageService.insertBehaviorImageWeight(behaviorImageWeight));
}
/**
* 修改画像行为权重
*/
@Log(title = "画像行为权重", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody BehaviorImageWeight behaviorImageWeight)
{
return toAjax(behaviorImageService.updateBehaviorImageWeight(behaviorImageWeight));
}
/**
* 删除画像行为权重
*/
@Log(title = "画像行为权重", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(behaviorImageService.deleteBehaviorImageWeightByIds(ids));
}
/**
* 获取活跃用户数据
*/
@GetMapping(value = "/activityList")
@ApiOperation("获取用户资源库数据")
public TableDataInfo activityList(ActivityUserLibrary activityUserLibrary)
{
startPage();
List<ActivityUserLibrary> list = behaviorImageService.selectActivityUserLibraryList(activityUserLibrary);
return getDataTable(list);
}
@ApiOperation("/根据用户ID,获取用户对应的成果汇总")
@GetMapping(value = "/getUserTypeStatistic")
public AjaxResult getUserTypeStatistic(@PathVariable("userId") Long userId)
{
return AjaxResult.success(behaviorImageService.getUserTypeStatistic(userId));
}
@GetMapping(value = "/getUserProjectStatistic")
@ApiOperation("/获取用户开源项目相关数据")
public AjaxResult getUserProjectStatistic(@PathVariable("userId") Long userId)
{
return AjaxResult.success(behaviorImageService.getUserProjectStatistic(userId));
}
@GetMapping(value = "/getUserTaskStatistic")
@ApiOperation("/获取用户创客任务相关数据")
public AjaxResult getUserTaskStatistic(@PathVariable("userId") Long userId)
{
return AjaxResult.success(behaviorImageService.getUserTaskStatistic(userId));
}
@GetMapping(value = "/getUserCompStatistic")
@ApiOperation("/获取用户开放竞赛相关数据")
public AjaxResult getUserCompStatistic(@PathVariable("userId") Long userId)
{
return AjaxResult.success(behaviorImageService.getUserCompStatistic(userId));
}
@GetMapping(value = "/getUserMemoStatistic")
@ApiOperation("/获取用户论坛交流相关数据")
public AjaxResult getUserMemoStatistic(@PathVariable("userId") Long userId)
{
return AjaxResult.success(behaviorImageService.getUserMemoStatistic(userId));
}
@GetMapping(value = "/getUserExpertStatistic")
@ApiOperation("/获取用户专家资源相关数据")
public AjaxResult getUserExpertStatistic(@PathVariable("userId") Long userId)
{
return AjaxResult.success(behaviorImageService.getUserExpertStatistic(userId));
}
/**
* 获取活跃用户相关统计数据
*/
@GetMapping(value = "/getActivityStatistic")
@ApiOperation("获取用户资源库相关统计数据")
public AjaxResult getActivityStatistic()
{
return AjaxResult.success(behaviorImageService.getActivityStatistic());
}
@GetMapping(value = "/getUserBehaviorSum")
@ApiOperation("获取用户的所有关注、点赞数")
public AjaxResult getUserBehaviorSum(Long userId)
{
return AjaxResult.success(behaviorImageService.getUserBehaviorSum(userId));
}
}

View File

@ -0,0 +1,64 @@
package com.microservices.dms.behaviorImage.domain;
public class AchievementBehaviorSumVo {
//点击量浏览量
private Long clickSum;
//关注量
private Long watchSum;
//查询量
private Long searchSum;
//收藏量
private Long favoriteSum;
//下载量
private Long downloadSum;
//成果用户对接
private Long userDockingSum;
public Long getUserDockingSum() {
return userDockingSum;
}
public void setUserDockingSum(Long userDockingSum) {
this.userDockingSum = userDockingSum;
}
public Long getClickSum() {
return clickSum;
}
public void setClickSum(Long clickSum) {
this.clickSum = clickSum;
}
public Long getWatchSum() {
return watchSum;
}
public void setWatchSum(Long watchSum) {
this.watchSum = watchSum;
}
public Long getSearchSum() {
return searchSum;
}
public void setSearchSum(Long searchSum) {
this.searchSum = searchSum;
}
public Long getFavoriteSum() {
return favoriteSum;
}
public void setFavoriteSum(Long favoriteSum) {
this.favoriteSum = favoriteSum;
}
public Long getDownloadSum() {
return downloadSum;
}
public void setDownloadSum(Long downloadSum) {
this.downloadSum = downloadSum;
}
}

View File

@ -0,0 +1,25 @@
package com.microservices.dms.behaviorImage.domain;
/**
* 成果画像结果
*/
public class AchievementImageVo {
private Long id;
private float score;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
}

View File

@ -0,0 +1,128 @@
package com.microservices.dms.behaviorImage.domain;
import com.microservices.common.core.web.domain.BaseEntity;
public class ActivityUserLibrary extends BaseEntity
{
private static final long serialVersionUID = 1L;
//用户id
private Long userId;
//登录名称
private String loginName;
//用户名称
private String userName;
//是否是专家
private String isExpert;
//是否已实名
private String isAuth;
//关注领域
private String areasStr;
//相关项目数
private Long relatedProject;
//相关任务数
private Long relatedTask;
//相关竞赛数
private Long relatedCompetition;
//相关成果数
private Long relatedAch;
//相关专家
private Long relatedExpert;
//相关论坛
private Long relatedMemo;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getIsExpert() {
return isExpert;
}
public void setIsExpert(String isExpert) {
this.isExpert = isExpert;
}
public String getIsAuth() {
return isAuth;
}
public void setIsAuth(String isAuth) {
this.isAuth = isAuth;
}
public String getAreasStr() {
return areasStr;
}
public void setAreasStr(String areasStr) {
this.areasStr = areasStr;
}
public Long getRelatedProject() {
return relatedProject;
}
public void setRelatedProject(Long relatedProject) {
this.relatedProject = relatedProject;
}
public Long getRelatedTask() {
return relatedTask;
}
public void setRelatedTask(Long relatedTask) {
this.relatedTask = relatedTask;
}
public Long getRelatedCompetition() {
return relatedCompetition;
}
public void setRelatedCompetition(Long relatedCompetition) {
this.relatedCompetition = relatedCompetition;
}
public Long getRelatedAch() {
return relatedAch;
}
public void setRelatedAch(Long relatedAch) {
this.relatedAch = relatedAch;
}
public Long getRelatedExpert() {
return relatedExpert;
}
public void setRelatedExpert(Long relatedExpert) {
this.relatedExpert = relatedExpert;
}
public Long getRelatedMemo() {
return relatedMemo;
}
public void setRelatedMemo(Long relatedMemo) {
this.relatedMemo = relatedMemo;
}
}

View File

@ -0,0 +1,36 @@
package com.microservices.dms.behaviorImage.domain;
import lombok.Data;
public class ActivityUserTotal {
//活跃用户
private Long totalUser;
//活跃用户专家数
private Long totalExpert;
//活跃用户实名认证
private Long authTotal;
public Long getTotalUser() {
return totalUser;
}
public void setTotalUser(Long totalUser) {
this.totalUser = totalUser;
}
public Long getTotalExpert() {
return totalExpert;
}
public void setTotalExpert(Long totalExpert) {
this.totalExpert = totalExpert;
}
public Long getAuthTotal() {
return authTotal;
}
public void setAuthTotal(Long authTotal) {
this.authTotal = authTotal;
}
}

View File

@ -0,0 +1,34 @@
package com.microservices.dms.behaviorImage.domain;
public class BehaviorContant {
/**
* 成果画像
*/
public final static String ACHIEVEMENTS_IMAGE = "Achievements";
/**
* 点击行为
*/
public final static String CLICK_BEHAVIOR = "click";
/**
* 收藏行为
*/
public final static String FAVORITE_BEHAVIOR = "favorite";
/**
* 搜索行为
*/
public final static String SEARCH_BEHAVIOR = "search";
/**
* 关注行为
*/
public final static String WATCH_BEHAVIOR = "watch";
/**
* 附件下载行为
*/
public final static String FILE_DOWNLOAD_BEHAVIOR = "file_download";
}

View File

@ -0,0 +1,98 @@
package com.microservices.dms.behaviorImage.domain;
import com.microservices.common.core.annotation.Excel;
import com.microservices.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 画像行为权重对象 behavior_image_weight
*
* @author microservices
* @date 2025-04-23
*/
public class BehaviorImageWeight extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键 */
private Long id;
/** 行为编码 */
@Excel(name = "行为编码")
private String behaviorCode;
/** 画像分类 */
@Excel(name = "画像分类")
private String imageType;
/** 行为名称 */
@Excel(name = "行为名称")
private String behaviorName;
/** 行为权重 */
@Excel(name = "行为权重")
private String behaviorWeight;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setBehaviorCode(String behaviorCode)
{
this.behaviorCode = behaviorCode;
}
public String getBehaviorCode()
{
return behaviorCode;
}
public void setImageType(String imageType)
{
this.imageType = imageType;
}
public String getImageType()
{
return imageType;
}
public void setBehaviorName(String behaviorName)
{
this.behaviorName = behaviorName;
}
public String getBehaviorName()
{
return behaviorName;
}
public void setBehaviorWeight(String behaviorWeight)
{
this.behaviorWeight = behaviorWeight;
}
public String getBehaviorWeight()
{
return behaviorWeight;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("behaviorCode", getBehaviorCode())
.append("imageType", getImageType())
.append("behaviorName", getBehaviorName())
.append("behaviorWeight", getBehaviorWeight())
.append("remark", getRemark())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -0,0 +1,46 @@
package com.microservices.dms.behaviorImage.domain;
public class UserCompetitionTotalVo {
//创建竞赛数
private Long joinCompetitionCount;
//关注竞赛数
private Long watchCompetitionCount;
//报名数
private Long signUpCount;
//提交作品数
private Long submitWorkCount;
public Long getJoinCompetitionCount() {
return joinCompetitionCount;
}
public void setJoinCompetitionCount(Long joinCompetitionCount) {
this.joinCompetitionCount = joinCompetitionCount;
}
public Long getWatchCompetitionCount() {
return watchCompetitionCount;
}
public void setWatchCompetitionCount(Long watchCompetitionCount) {
this.watchCompetitionCount = watchCompetitionCount;
}
public Long getSignUpCount() {
return signUpCount;
}
public void setSignUpCount(Long signUpCount) {
this.signUpCount = signUpCount;
}
public Long getSubmitWorkCount() {
return submitWorkCount;
}
public void setSubmitWorkCount(Long submitWorkCount) {
this.submitWorkCount = submitWorkCount;
}
}

View File

@ -0,0 +1,44 @@
package com.microservices.dms.behaviorImage.domain;
public class UserExpertTotalVo {
//关注专家数
private Long watchExpertCount;
//收藏专家数
private Long favoriteExpertCount;
//评审竞赛数
private Long aduitCompetitionCount;
//评审任务数
private Long aduitTaskCount;
public Long getWatchExpertCount() {
return watchExpertCount;
}
public void setWatchExpertCount(Long watchExpertCount) {
this.watchExpertCount = watchExpertCount;
}
public Long getFavoriteExpertCount() {
return favoriteExpertCount;
}
public void setFavoriteExpertCount(Long favoriteExpertCount) {
this.favoriteExpertCount = favoriteExpertCount;
}
public Long getAduitCompetitionCount() {
return aduitCompetitionCount;
}
public void setAduitCompetitionCount(Long aduitCompetitionCount) {
this.aduitCompetitionCount = aduitCompetitionCount;
}
public Long getAduitTaskCount() {
return aduitTaskCount;
}
public void setAduitTaskCount(Long aduitTaskCount) {
this.aduitTaskCount = aduitTaskCount;
}
}

View File

@ -0,0 +1,45 @@
package com.microservices.dms.behaviorImage.domain;
public class UserMemoTotalVo {
// private Long managerMemoCount;
//参与帖子
private Long joinMemoCount;
//创建帖子
private Long createMemoCount;
//回复帖子
private Long replayMemoCount;
//关注帖子
private Long watchMemoCount;
public Long getJoinMemoCount() {
return joinMemoCount;
}
public void setJoinMemoCount(Long joinMemoCount) {
this.joinMemoCount = joinMemoCount;
}
public Long getCreateMemoCount() {
return createMemoCount;
}
public void setCreateMemoCount(Long createMemoCount) {
this.createMemoCount = createMemoCount;
}
public Long getReplayMemoCount() {
return replayMemoCount;
}
public void setReplayMemoCount(Long replayMemoCount) {
this.replayMemoCount = replayMemoCount;
}
public Long getWatchMemoCount() {
return watchMemoCount;
}
public void setWatchMemoCount(Long watchMemoCount) {
this.watchMemoCount = watchMemoCount;
}
}

View File

@ -0,0 +1,84 @@
package com.microservices.dms.behaviorImage.domain;
public class UserProjectTotalVo {
//创建项目数
private Long createProjectCount;
//参与项目数
private Long joinProjectCount;
//fork项目数
private Long forkProjectCount;
//点赞项目数
private Long praiseProjectCount;
//关注项目数
private Long watchProjectCount;
//提交代码数
private Long commitSum;
//issue相关数
private Long issueSum;
//合并代码数
private Long prSum;
public Long getCreateProjectCount() {
return createProjectCount;
}
public void setCreateProjectCount(Long createProjectCount) {
this.createProjectCount = createProjectCount;
}
public Long getJoinProjectCount() {
return joinProjectCount;
}
public void setJoinProjectCount(Long joinProjectCount) {
this.joinProjectCount = joinProjectCount;
}
public Long getForkProjectCount() {
return forkProjectCount;
}
public void setForkProjectCount(Long forkProjectCount) {
this.forkProjectCount = forkProjectCount;
}
public Long getPraiseProjectCount() {
return praiseProjectCount;
}
public void setPraiseProjectCount(Long praiseProjectCount) {
this.praiseProjectCount = praiseProjectCount;
}
public Long getWatchProjectCount() {
return watchProjectCount;
}
public void setWatchProjectCount(Long watchProjectCount) {
this.watchProjectCount = watchProjectCount;
}
public Long getCommitSum() {
return commitSum;
}
public void setCommitSum(Long commitSum) {
this.commitSum = commitSum;
}
public Long getIssueSum() {
return issueSum;
}
public void setIssueSum(Long issueSum) {
this.issueSum = issueSum;
}
public Long getPrSum() {
return prSum;
}
public void setPrSum(Long prSum) {
this.prSum = prSum;
}
}

View File

@ -0,0 +1,46 @@
package com.microservices.dms.behaviorImage.domain;
public class UserTaskTotalVo {
//创建任务数
private Long createTaskCount;
//任务交稿数
private Long submitPapersCount;
//关注任务数
private Long watchTaskCount;
//参加任务数
private Long joinTaskCount;
public Long getCreateTaskCount() {
return createTaskCount;
}
public void setCreateTaskCount(Long createTaskCount) {
this.createTaskCount = createTaskCount;
}
public Long getSubmitPapersCount() {
return submitPapersCount;
}
public void setSubmitPapersCount(Long submitPapersCount) {
this.submitPapersCount = submitPapersCount;
}
public Long getWatchTaskCount() {
return watchTaskCount;
}
public void setWatchTaskCount(Long watchTaskCount) {
this.watchTaskCount = watchTaskCount;
}
public Long getJoinTaskCount() {
return joinTaskCount;
}
public void setJoinTaskCount(Long joinTaskCount) {
this.joinTaskCount = joinTaskCount;
}
}

View File

@ -0,0 +1,67 @@
package com.microservices.dms.behaviorImage.domain;
public class UserTypeTotalVo {
private String resultType;
private Long watchSum;
private Long favoriteSum;
private Long downloadSum;
private Long clickSum;
private Long searchSum;
private Long praiseSum;
public String getResultType() {
return resultType;
}
public void setResultType(String resultType) {
this.resultType = resultType;
}
public Long getWatchSum() {
return watchSum;
}
public void setWatchSum(Long watchSum) {
this.watchSum = watchSum;
}
public Long getFavoriteSum() {
return favoriteSum;
}
public void setFavoriteSum(Long favoriteSum) {
this.favoriteSum = favoriteSum;
}
public Long getDownloadSum() {
return downloadSum;
}
public void setDownloadSum(Long downloadSum) {
this.downloadSum = downloadSum;
}
public Long getClickSum() {
return clickSum;
}
public void setClickSum(Long clickSum) {
this.clickSum = clickSum;
}
public Long getSearchSum() {
return searchSum;
}
public void setSearchSum(Long searchSum) {
this.searchSum = searchSum;
}
public Long getPraiseSum() {
return praiseSum;
}
public void setPraiseSum(Long praiseSum) {
this.praiseSum = praiseSum;
}
}

View File

@ -0,0 +1,103 @@
package com.microservices.dms.behaviorImage.mapper;
import com.microservices.common.datasource.annotation.Slave;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.behaviorImage.domain.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
@Slave
public interface BehaviorImageMapper {
AchievementBehaviorSumVo getBehaviorSumListByType();
List<KeyValueVo> getWeightListByType(@Param("achievementsImage") String achievementsImage);
Long getFavoriteSumByAchievementId(@Param("id") Long id,@Param("achievementsImage") String achievementsImage);
Long getSearchSumByAchievementId(@Param("id") Long id,@Param("achievementsImage") String achievementsImage);
Long getWatchSumByAchievementId(@Param("id") Long id,@Param("achievementsImage") String achievementsImage);
Long getFileDownloadSumByAchievementId(@Param("id") Long id,@Param("achievementsImage") String achievementsImage);
Long getClickSumByAchievementId(@Param("id") Long id, @Param("achievementsImage") String achievementsImage);
/**
* 查询画像行为权重
*
* @param id 画像行为权重主键
* @return 画像行为权重
*/
public BehaviorImageWeight selectBehaviorImageWeightById(Long id);
/**
* 查询画像行为权重列表
*
* @param behaviorImageWeight 画像行为权重
* @return 画像行为权重集合
*/
public List<BehaviorImageWeight> selectBehaviorImageWeightList(BehaviorImageWeight behaviorImageWeight);
/**
* 新增画像行为权重
*
* @param behaviorImageWeight 画像行为权重
* @return 结果
*/
public int insertBehaviorImageWeight(BehaviorImageWeight behaviorImageWeight);
/**
* 修改画像行为权重
*
* @param behaviorImageWeight 画像行为权重
* @return 结果
*/
public int updateBehaviorImageWeight(BehaviorImageWeight behaviorImageWeight);
/**
* 删除画像行为权重
*
* @param id 画像行为权重主键
* @return 结果
*/
public int deleteBehaviorImageWeightById(Long id);
/**
* 批量删除画像行为权重
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteBehaviorImageWeightByIds(Long[] ids);
List<KeyValueVo> getUserProjecttatistic(@Param("userId")Long userId);
List<KeyValueVo> getUserTaskStatistic(@Param("userId")Long userId);
List<ActivityUserLibrary> selectActivityUserLibraryList(ActivityUserLibrary activityUserLibrary);
Long getrelatedProjectCount(@Param("userId")Long userId);
Long getrelatedTaskCount(@Param("userId")Long userId);
List<KeyValueVo> getUserCompStatistic(@Param("userId")Long userId);
Long getrelatedCompetitionCount(@Param("userId")Long userId);
List<KeyValueVo> getUserMemoStatistic(@Param("userId")Long userId);
Long getrelatedMemoCount(@Param("userId")Long userId);
List<KeyValueVo> getUserExperttatistic(@Param("userId")Long userId);
List<UserTypeTotalVo> getUserTypeStatistic(@Param("userId")Long userId);
ActivityUserTotal getActivityStatistic();
List<ActivityUserLibrary> selectActivityUserLibraryListAll(ActivityUserLibrary activityUserLibrary);
UserTypeTotalVo getUserBehaviorSum(@Param("userId")Long userId);
}

View File

@ -0,0 +1,81 @@
package com.microservices.dms.behaviorImage.service;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.behaviorImage.domain.*;
import java.util.List;
public interface IBehaviorImageService {
AchievementImageVo getAchievementImageById(Long id);
/**
* 查询画像行为权重
*
* @param id 画像行为权重主键
* @return 画像行为权重
*/
public BehaviorImageWeight selectBehaviorImageWeightById(Long id);
/**
* 查询画像行为权重列表
*
* @param behaviorImageWeight 画像行为权重
* @return 画像行为权重集合
*/
public List<BehaviorImageWeight> selectBehaviorImageWeightList(BehaviorImageWeight behaviorImageWeight);
/**
* 新增画像行为权重
*
* @param behaviorImageWeight 画像行为权重
* @return 结果
*/
public int insertBehaviorImageWeight(BehaviorImageWeight behaviorImageWeight);
/**
* 修改画像行为权重
*
* @param behaviorImageWeight 画像行为权重
* @return 结果
*/
public int updateBehaviorImageWeight(BehaviorImageWeight behaviorImageWeight);
/**
* 批量删除画像行为权重
*
* @param ids 需要删除的画像行为权重主键集合
* @return 结果
*/
public int deleteBehaviorImageWeightByIds(Long[] ids);
/**
* 删除画像行为权重信息
*
* @param id 画像行为权重主键
* @return 结果
*/
public int deleteBehaviorImageWeightById(Long id);
/**
* 查询活跃用户资源库列表
*
* @param activityUserLibrary 活跃用户资源库
* @return 活跃用户资源库集合
*/
List<ActivityUserLibrary> selectActivityUserLibraryList(ActivityUserLibrary activityUserLibrary);
List<UserTypeTotalVo> getUserTypeStatistic(Long userId);
UserProjectTotalVo getUserProjectStatistic(Long userId);
UserTaskTotalVo getUserTaskStatistic(Long userId);
UserCompetitionTotalVo getUserCompStatistic(Long userId);
UserMemoTotalVo getUserMemoStatistic(Long userId);
UserExpertTotalVo getUserExpertStatistic(Long userId);
ActivityUserTotal getActivityStatistic();
UserTypeTotalVo getUserBehaviorSum(Long userId);
}

View File

@ -0,0 +1,352 @@
package com.microservices.dms.behaviorImage.service.impl;
import com.microservices.common.core.utils.DateUtils;
import com.microservices.common.core.utils.StringUtils;
import com.microservices.dms.achievementLibrary.domain.KeyValueVo;
import com.microservices.dms.behaviorImage.domain.*;
import com.microservices.dms.behaviorImage.mapper.BehaviorImageMapper;
import com.microservices.dms.behaviorImage.service.IBehaviorImageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service
public class BehaviorImageServiceImpl implements IBehaviorImageService {
@Autowired
private BehaviorImageMapper behaviorImageMapper;
@Override
public AchievementImageVo getAchievementImageById(Long id) {
AchievementImageVo achievementImageVo = new AchievementImageVo();
//获取所有行为汇总数据
AchievementBehaviorSumVo achievementBehaviorSumVo = behaviorImageMapper.getBehaviorSumListByType();
if(StringUtils.isNotNull(achievementBehaviorSumVo)) {
float score = 0f;
//从行为表中获取成果行为数据权限
List<KeyValueVo> behaviorImageWeightList = behaviorImageMapper.getWeightListByType(BehaviorContant.ACHIEVEMENTS_IMAGE);
float clickResult = 0L;
float watchResult = 0L;
float searchResult = 0L;
float favoriteResult = 0L;
float fileDownloadResult = 0L;
//简单算法
for (KeyValueVo keyValueVo : behaviorImageWeightList) {
String bhavior = keyValueVo.getKey();
Long weight = keyValueVo.getValue();
if (bhavior.equals(BehaviorContant.CLICK_BEHAVIOR)) {//点击
//根据当前成果ID,获取成果点击行为数量
Long clickSum = achievementBehaviorSumVo.getClickSum();
if(StringUtils.isNotNull(clickSum) && clickSum > 0) {
Long click = behaviorImageMapper.getClickSumByAchievementId(id, BehaviorContant.ACHIEVEMENTS_IMAGE);
if (StringUtils.isNotNull(click)) {
// clickResult = click * weight / clickSum ;
clickResult = click * weight / 100 ;
}
}
} else if (bhavior.equals(BehaviorContant.FAVORITE_BEHAVIOR)) {//收藏
//根据当前成果ID,获取成果收藏行为数量
Long favoriteSum = achievementBehaviorSumVo.getFavoriteSum();
if(StringUtils.isNotNull(favoriteSum) && favoriteSum > 0) {
Long favorite = behaviorImageMapper.getFavoriteSumByAchievementId(id,BehaviorContant.ACHIEVEMENTS_IMAGE);
if (StringUtils.isNotNull(favorite)) {
// favoriteResult = favorite *weight / favoriteSum ;
favoriteResult = favorite *weight / 100 ;
}
}
} else if (bhavior.equals(BehaviorContant.SEARCH_BEHAVIOR)) {//搜索
//根据当前成果ID,获取成果搜索行为数量
Long searchSum = achievementBehaviorSumVo.getSearchSum();
if(StringUtils.isNotNull(searchSum) && searchSum > 0) {
Long search = behaviorImageMapper.getSearchSumByAchievementId(id, BehaviorContant.ACHIEVEMENTS_IMAGE);
if (StringUtils.isNotNull(search)) {
// searchResult = search *weight / searchSum;
searchResult = search *weight / 100;
}
}
} else if (bhavior.equals(BehaviorContant.WATCH_BEHAVIOR)) {//关注
//根据当前成果ID,获取成果关注行为数量
Long watchSum = achievementBehaviorSumVo.getFavoriteSum();
if(StringUtils.isNotNull( watchSum) && watchSum > 0) {
Long watch = behaviorImageMapper.getWatchSumByAchievementId(id,BehaviorContant.ACHIEVEMENTS_IMAGE);
if (StringUtils.isNotNull( watch) ) {
// watchResult = watch *weight / watchSum;
watchResult = watch *weight / 100;
}
}
} else if (bhavior.equals(BehaviorContant.FILE_DOWNLOAD_BEHAVIOR)) {//文件下载
//根据当前成果ID,获取成果文件下载行为数量
Long fileDownloadSum = achievementBehaviorSumVo.getFavoriteSum();
if(StringUtils.isNotNull(fileDownloadSum) && fileDownloadSum > 0) {
Long fileDownload = behaviorImageMapper.getFileDownloadSumByAchievementId(id, BehaviorContant.ACHIEVEMENTS_IMAGE);
if (StringUtils.isNotNull(fileDownload)) {
// fileDownloadResult = fileDownload *weight / fileDownloadSum ;
fileDownloadResult = fileDownload *weight / 100 ;
}
}
}
}
score = clickResult+watchResult+searchResult+favoriteResult+fileDownloadResult;
achievementImageVo.setScore(score);
}
return achievementImageVo;
}
/**
* 查询画像行为权重
*
* @param id 画像行为权重主键
* @return 画像行为权重
*/
@Override
public BehaviorImageWeight selectBehaviorImageWeightById(Long id)
{
return behaviorImageMapper.selectBehaviorImageWeightById(id);
}
/**
* 查询画像行为权重列表
*
* @param behaviorImageWeight 画像行为权重
* @return 画像行为权重
*/
@Override
public List<BehaviorImageWeight> selectBehaviorImageWeightList(BehaviorImageWeight behaviorImageWeight)
{
return behaviorImageMapper.selectBehaviorImageWeightList(behaviorImageWeight);
}
/**
* 新增画像行为权重
*
* @param behaviorImageWeight 画像行为权重
* @return 结果
*/
@Override
public int insertBehaviorImageWeight(BehaviorImageWeight behaviorImageWeight)
{
behaviorImageWeight.setCreateTime(DateUtils.getNowDate());
return behaviorImageMapper.insertBehaviorImageWeight(behaviorImageWeight);
}
/**
* 修改画像行为权重
*
* @param behaviorImageWeight 画像行为权重
* @return 结果
*/
@Override
public int updateBehaviorImageWeight(BehaviorImageWeight behaviorImageWeight)
{
behaviorImageWeight.setUpdateTime(DateUtils.getNowDate());
return behaviorImageMapper.updateBehaviorImageWeight(behaviorImageWeight);
}
/**
* 批量删除画像行为权重
*
* @param ids 需要删除的画像行为权重主键
* @return 结果
*/
@Override
public int deleteBehaviorImageWeightByIds(Long[] ids)
{
return behaviorImageMapper.deleteBehaviorImageWeightByIds(ids);
}
/**
* 删除画像行为权重信息
*
* @param id 画像行为权重主键
* @return 结果
*/
@Override
public int deleteBehaviorImageWeightById(Long id)
{
return behaviorImageMapper.deleteBehaviorImageWeightById(id);
}
/**
* 用户新增分类数据统计
* @param userId
* @return
*/
public List<UserTypeTotalVo> getUserTypeStatistic(Long userId) {
return behaviorImageMapper.getUserTypeStatistic(userId);
}
/**
* 根据用户ID,获取开源项目相关汇总
* @param userId
* @return
*/
@Override
public UserProjectTotalVo getUserProjectStatistic(Long userId) {
UserProjectTotalVo userProjectTotalVo = new UserProjectTotalVo();
List<KeyValueVo> resultVo = behaviorImageMapper.getUserProjecttatistic(userId);
if(StringUtils.isNotNull(resultVo)) {
for(KeyValueVo temResult : resultVo) {
Long result = temResult.getValue();
if(temResult.getKey().equals("createProjectCount")) {
userProjectTotalVo.setCreateProjectCount(result);
}else if(temResult.getKey().equals("joinProjectCount")){
userProjectTotalVo.setJoinProjectCount(result);
}else if(temResult.getKey().equals("forkProjectCount")){
userProjectTotalVo.setForkProjectCount(result);
}else if(temResult.getKey().equals("issueSum")){
userProjectTotalVo.setIssueSum(result);
}else if(temResult.getKey().equals("prSum")){
userProjectTotalVo.setPrSum(result);
}else if(temResult.getKey().equals("commitSum")){
userProjectTotalVo.setCommitSum(result);
}else if(temResult.getKey().equals("watchProjectCount")){
userProjectTotalVo.setWatchProjectCount(result);
}else if(temResult.getKey().equals("praiseProjectCount")){
userProjectTotalVo.setPraiseProjectCount(result);
}
}
}
return userProjectTotalVo;
}
/**
* 根据用户ID,获取创客任务相关汇总
* @param userId
* @return
*/
@Override
public UserTaskTotalVo getUserTaskStatistic(Long userId) {
UserTaskTotalVo userTaskTotalVo = new UserTaskTotalVo();
List<KeyValueVo> resultVo = behaviorImageMapper.getUserTaskStatistic(userId);
if(StringUtils.isNotNull(resultVo)) {
for(KeyValueVo temResult : resultVo) {
Long result = temResult.getValue();
if(temResult.getKey().equals("createTaskCount")) {
userTaskTotalVo.setCreateTaskCount(result);
}else if(temResult.getKey().equals("submitPapersCount")){
userTaskTotalVo.setSubmitPapersCount(result);
}else if(temResult.getKey().equals("watchTaskCount")){
userTaskTotalVo.setWatchTaskCount(result);
}
}
}
return userTaskTotalVo;
}
/**
* 根据用户ID,获取开放竞赛相关汇总
* @param userId
* @return
*/
@Override
public UserCompetitionTotalVo getUserCompStatistic(Long userId) {
UserCompetitionTotalVo userCompetitionTotalVo = new UserCompetitionTotalVo();
List<KeyValueVo> resultVo = behaviorImageMapper.getUserCompStatistic(userId);
if(StringUtils.isNotNull(resultVo)) {
for(KeyValueVo temResult : resultVo) {
Long result = temResult.getValue();
if(temResult.getKey().equals("joinCompetitionCount")) {
userCompetitionTotalVo.setJoinCompetitionCount(result);
}else if(temResult.getKey().equals("watchCompetitionCount")){
userCompetitionTotalVo.setWatchCompetitionCount(result);
}else if(temResult.getKey().equals("signUpCount")){
userCompetitionTotalVo.setSignUpCount(result);
}else if(temResult.getKey().equals("submitWorkCount")){
userCompetitionTotalVo.setSubmitWorkCount(result);
}
}
}
return userCompetitionTotalVo;
}
/**
* 根据用户ID, 获取用户论坛交流相关数据
* @param userId
* @return
*/
@Override
public UserMemoTotalVo getUserMemoStatistic(Long userId) {
UserMemoTotalVo userMemoTotalVo = new UserMemoTotalVo();
List<KeyValueVo> resultVo = behaviorImageMapper.getUserMemoStatistic(userId);
if(StringUtils.isNotNull(resultVo)) {
for(KeyValueVo temResult : resultVo) {
Long result = temResult.getValue();
if(temResult.getKey().equals("createMemoCount")) {
userMemoTotalVo.setCreateMemoCount(result);
}else if(temResult.getKey().equals("replayMemoCount")){
userMemoTotalVo.setReplayMemoCount(result);
}else if(temResult.getKey().equals("watchMemoCount")){
userMemoTotalVo.setWatchMemoCount(result);
}
}
}
return userMemoTotalVo;
}
/**
* 根据用户ID, 获取用户专家资源相关数据
* @param userId
* @return
*/
@Override
public UserExpertTotalVo getUserExpertStatistic(Long userId) {
UserExpertTotalVo userExpertTotalVo = new UserExpertTotalVo();
List<KeyValueVo> resultVo = behaviorImageMapper.getUserExperttatistic(userId);
if(StringUtils.isNotNull(resultVo)) {
for(KeyValueVo temResult : resultVo) {
Long result = temResult.getValue();
if(temResult.getKey().equals("watchExpertCount")) {
userExpertTotalVo.setWatchExpertCount(result);
}else if(temResult.getKey().equals("favoriteExpertCount")){
userExpertTotalVo.setFavoriteExpertCount(result);
}else if(temResult.getKey().equals("aduitCompetitionCount")){
userExpertTotalVo.setAduitCompetitionCount(result);
}else if(temResult.getKey().equals("aduitTaskCount")){
userExpertTotalVo.setAduitTaskCount(result);
}
}
}
return userExpertTotalVo;
}
@Override
public ActivityUserTotal getActivityStatistic() {
return behaviorImageMapper.getActivityStatistic();
}
/**
* 用户资源库
* @param activityUserLibrary 活跃用户资源库
* @return
*/
// @Override
// public List<ActivityUserLibrary> selectActivityUserLibraryList(ActivityUserLibrary activityUserLibrary) {
// List<ActivityUserLibrary> list = behaviorImageMapper.selectActivityUserLibraryList(activityUserLibrary);
// for (ActivityUserLibrary a : list) {
// Long relatedProject= behaviorImageMapper.getrelatedProjectCount(a.getUserId());
// a.setRelatedProject(relatedProject);
// Long relatedTask= behaviorImageMapper.getrelatedTaskCount(a.getUserId());
// a.setRelatedTask(relatedTask);
// Long relatedCompetition= behaviorImageMapper.getrelatedCompetitionCount(a.getUserId());
// a.setRelatedCompetition(relatedCompetition);
// Long relatedMemo= behaviorImageMapper.getrelatedMemoCount(a.getUserId());
// a.setRelatedMemo(relatedMemo);
// }
// return list;
// }
@Override
public List<ActivityUserLibrary> selectActivityUserLibraryList(ActivityUserLibrary activityUserLibrary) {
List<ActivityUserLibrary> list = behaviorImageMapper.selectActivityUserLibraryListAll(activityUserLibrary);
return list;
}
@Override
public UserTypeTotalVo getUserBehaviorSum(Long userId) {
return behaviorImageMapper.getUserBehaviorSum(userId);
}
}

View File

@ -0,0 +1,223 @@
package com.microservices.dms.common.controller;
import com.microservices.common.core.web.controller.BaseController;
import com.microservices.common.core.web.domain.AjaxResult;
import com.microservices.common.core.web.page.TableDataInfo;
import com.microservices.dms.achievementLibrary.domain.AchQueryVo;
import com.microservices.dms.achievementLibrary.service.BlockChainService;
import com.microservices.dms.achievementLibrary.service.IAchievementsService;
import com.microservices.dms.common.vo.*;
import com.microservices.dms.resourceLibrary.domain.ExpertResourceLibrary;
import com.microservices.dms.resourceLibrary.service.IExpertResourceLibraryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* @author otto
*/
@RestController
@Api(tags = "数据管理体系-公开接口")
@RequestMapping("/open")
@RefreshScope
public class OpenController extends BaseController {
@Autowired
private IAchievementsService achievementsService;
@Autowired
private IExpertResourceLibraryService expertResourceLibraryService;
@Autowired
private BlockChainService blockChainService;
/**
* 获取精选成果
*
* @return
*/
@ApiOperation("获取精选成果")
@GetMapping("/achievements/getChoiceImport")
public AjaxResult getChoiceImport() {
return success(achievementsService.getChoiceImport());
}
/**
* 根据成果来源对成果数据进行分类统计
*
* @return
*/
@ApiOperation("根据成果来源对成果数据进行分类统计")
@GetMapping("/achievements/getTjBySources")
public AjaxResult getTjBySources() {
return success(achievementsService.getTjBySources());
}
/**
* 根据成果领域对成功数据进行汇总
*
* @return
*/
@ApiOperation("根据成果领域对成果数据进行汇总")
@GetMapping("/achievements/getTjByAreas")
public AjaxResult getTjByAreas() {
return success(achievementsService.getTjByAreas());
}
/**
* 根据领域分类名称获取领域相关数据
*/
@ApiOperation("根据领域分类名称,获取领域相关数据")
@GetMapping("/achievements/getAreasByName")
public AjaxResult getAreasByName(String areaName) {
return success(achievementsService.getAreasByName(areaName));
}
@ApiOperation("根据领域分类名称,获取项目领域")
@GetMapping("/achievements/getProjectAreasByName")
public AjaxResult getProjectAreasByName(String areaName) {
return success(achievementsService.getProjectAreasByName(areaName));
}
@ApiOperation("根据领域分类名称,获取专家领域")
@GetMapping("/achievements/getExpertAreasByName")
public AjaxResult getExpertAreasByName(String areaName) {
return success(achievementsService.getExpertAreasByName(areaName));
}
/* 获取全部成果,根据成果名称成果领域成果来源进行查询
* @return
*/
@ApiOperation("获取全部成果,根据成果名称、成果领域、成果来源进行查询")
@GetMapping("/achievements/getAllResult")
public TableDataInfo getAllResult(AchQueryVo achQueryVo) {
startPage();
return getDataTable(achievementsService.getAllResult(achQueryVo));
}
@ApiOperation("近七日用户行为数据")
@GetMapping("/achievements/getUerActionData")
public AjaxResult getUerActionData() {
return success(achievementsService.getUerActionData());
}
@ApiOperation("热门成果")
@GetMapping("/achievements/getHotAchievement")
public AjaxResult getHotAchievement() {
return success(achievementsService.getHotAchievement());
}
@ApiOperation("七日新增")
@GetMapping("/achievements/get7DayAdd")
public AjaxResult get7DayAdd(AchQueryVo achQueryVo) {
return success(achievementsService.get7DayAdd(achQueryVo));
}
@ApiOperation("七日新增专家")
@GetMapping("/achievements/get7DayAddExpert")
public AjaxResult get7DayAddExport(AchQueryVo achQueryVo) {
return success(achievementsService.get7DayAddExport(achQueryVo));
}
@ApiOperation("首页项目统计")
@GetMapping("/achievements/indexProjectStatistic")
public AjaxResult indexProjectStatistic() {
return success(achievementsService.indexProjectStatistic());
}
@ApiOperation("首页task统计")
@GetMapping("/achievements/indexTaskStatistic")
public AjaxResult indexTaskStatistic() {
return success(achievementsService.indexTaskStatistic());
}
@ApiOperation("首页Competition统计")
@GetMapping("/achievements/indexCompetitionStatistic")
public AjaxResult indexCompetitionStatistic() {
return success(achievementsService.indexCompetitionStatistic());
}
@ApiOperation("首页SchoolEnterprise统计")
@GetMapping("/achievements/indexSchoolEnterpriseStatistic")
public AjaxResult indexSchoolEnterpriseStatistic() {
return success(achievementsService.indexSchoolEnterpriseStatistic());
}
@ApiOperation("首页专家统计")
@GetMapping("/achievements/indexExpertStatistic")
public AjaxResult indexExpertStatistic() {
return success(achievementsService.indexExpertStatistic());
}
/**
* 查询专家资源库列表
*/
@GetMapping("/expertResourceLibrary/listFront")
public TableDataInfo listFront(ExpertResourceLibrary expertResourceLibrary)
{
startPage();
List<ExpertResourceLibrary> list = expertResourceLibraryService.selectExpertResourceLibraryList2(expertResourceLibrary);
return getDataTable(list);
}
@GetMapping("/downloadAch")
@ApiOperation("成果征集信息下载")
public ResponseEntity<Resource> downloadAch() throws IOException {
String fileName = "红山开源优秀科研成果信息征集.zip";
Resource resource = new ClassPathResource(fileName);
if (!resource.exists()) {
throw new RuntimeException("文件不存在: " + fileName);
}
String encodedFileName = URLEncoder.encode(fileName, String.valueOf(StandardCharsets.UTF_8))
.replace("+", "%20");
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename*=UTF-8''" + encodedFileName)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
// @ApiOperation("提供给开源项目那边新建项目并且use_blockchain='1'的项目数据")
// @PostMapping("/blockChain/projectCreate")
// public AjaxResult projectCreate (@RequestBody ProjectCreateVo projectCreateVo) {
// return blockChainService.projectCreate(projectCreateVo);
// }
@ApiOperation("提供给开源项目那边新建issue、更新issue时调用调用方法时传入相关数据(项目入链并且悬赏金额不为空的issue数据才调用封装方法)")
@PostMapping("/blockChain/issueCreateUpdate")
public AjaxResult issueCreateUpdate (@RequestBody IssueCreateVo issueCreateVo) {
return blockChainService.issueCreateUpdate(issueCreateVo);
}
@ApiOperation("提供给开源项目那边提交commit调用调用方法时传入相关数据(入链项目提交commit才调用)")
@PostMapping("/blockChain/commitCreate")
public AjaxResult commitCreate(@RequestBody CommitCreateVo commitCreateVo) {
return blockChainService.commitCreate(commitCreateVo);
}
@ApiOperation("提供给开源项目那边新建pr时调用调用方法时传入相关数据(入链项目pr_合并代码才调用))")
@PostMapping("/blockChain/prCreate")
public AjaxResult prCreate(@RequestBody PrCreateVo prCreateVo) {
return blockChainService.prCreate(prCreateVo);
}
@ApiOperation("封装方法userCreate入链项目2519用户1向用户2转帐10个金币")
@PostMapping("/blockChain/userCreate")
public AjaxResult userCreate(@RequestBody UserCreateVo userCreateVo) {
return blockChainService.userCreate(userCreateVo);
}
}

View File

@ -0,0 +1,14 @@
package com.microservices.dms.common.vo;
import lombok.Data;
@Data
public class CommitCreateVo {
private String commit_id;
private String project_id;
private String commit_diff;
private String issue_id;
}

View File

@ -0,0 +1,10 @@
package com.microservices.dms.common.vo;
import lombok.Data;
@Data
public class CommitResultVo {
private String commitId;
private String commitDiff;
}

Some files were not shown because too many files have changed in this diff Show More