Compare commits
340 Commits
48ea20581c
...
flowUpdate
| Author | SHA1 | Date | |
|---|---|---|---|
| f6e01abe0e | |||
| 02f324e1d4 | |||
| 96392dbf57 | |||
| e39e788ddc | |||
| e17ab16821 | |||
| 8a928e852d | |||
| 397f8ee768 | |||
| 8e25b416ec | |||
| e6b0527e44 | |||
| 403848cb4b | |||
| a4b1820e1c | |||
| c2afe05e81 | |||
| 1902ba9d59 | |||
| 1d1a0e45c6 | |||
| 72c775b1e3 | |||
| bec0848cd9 | |||
| 4e78886a82 | |||
| 292a56bccd | |||
| 3f12c15cf8 | |||
| 1ab47ccb57 | |||
| 321fc67c4f | |||
| b6e8031cef | |||
| d7265b08a8 | |||
| 2f0ad8a8cd | |||
| 22c58031d2 | |||
| 473f6943d5 | |||
| 08ef9ccfea | |||
| 94b5736241 | |||
| 95b4bc85b3 | |||
| dfaadd4977 | |||
| f372f22934 | |||
| bc91c44596 | |||
| 480d7be81d | |||
| 1c0be9b5ee | |||
| 9c7d8ffc96 | |||
| 167cbf256b | |||
| c3ce1c22d3 | |||
| 891c205233 | |||
| 3b184abc96 | |||
| 9a20cf0e43 | |||
| faf434e4d2 | |||
| 73988b8828 | |||
| 0c3b14e010 | |||
| d764fbe473 | |||
| 073f704c0e | |||
| 5f64f3aef4 | |||
| baa492b799 | |||
| a668381101 | |||
| 4f2ac72edc | |||
| b501965d25 | |||
| 57b662837d | |||
| f11ed11629 | |||
| cdcbfaa1a9 | |||
| ef775a3cfb | |||
| 818b67b5aa | |||
| a0554e47fd | |||
| 49c9ef8878 | |||
| 3265a58813 | |||
| 5a9044786c | |||
| d8d0828f8e | |||
| 8bade20502 | |||
| be944595e3 | |||
| 1eaf29b282 | |||
| 4bb24fe464 | |||
| e704522965 | |||
| 3440b885ee | |||
| 3e85e79bdd | |||
| 90b0eb82f4 | |||
| ef2c1ff455 | |||
| 074fb5bf86 | |||
| 3f4b127cdf | |||
| e93ea2fdfd | |||
| cf368db9af | |||
| 034d01d604 | |||
| af247d917b | |||
| a51d836dc2 | |||
| 1f233c142a | |||
| 4b3a56eb5f | |||
| 2b25ec1483 | |||
| 0736552eb7 | |||
| d99d59ffa0 | |||
| 5da05dcf24 | |||
| fceb06eca8 | |||
| 24219b6942 | |||
| 8566231790 | |||
| b96cc95741 | |||
| 8478cd2997 | |||
| 1bbc1e52ae | |||
| 9221cb50a3 | |||
| e8e15f4a98 | |||
| 0941197ca9 | |||
| 23dc2f2759 | |||
| 7321db3419 | |||
| be7576f8ea | |||
| cc72b1bd64 | |||
| e1d713b23e | |||
| 5ebc46d2e1 | |||
| 0da63144e7 | |||
| 347bd92b69 | |||
| 6d859c6a8c | |||
| 733b95632b | |||
| b905320413 | |||
| 8d4059bbf4 | |||
| b1b8ced0a8 | |||
| 9d3c212856 | |||
| ceec388f5f | |||
| 44f604ff57 | |||
| fae9c61f07 | |||
| e48b27715f | |||
| feb0e49da3 | |||
| 245cdb40f7 | |||
| a2d2431bce | |||
| 048a175526 | |||
| d9d2688e24 | |||
| 15382b5aba | |||
| 8500469918 | |||
| 864eb1462f | |||
| 86b44282ea | |||
| 7ccf5e4469 | |||
| 137ab4e802 | |||
| a941db7870 | |||
| 35c32d68c3 | |||
| 359600004d | |||
| 910801b057 | |||
| 7aa9d519a0 | |||
| 5d7b438745 | |||
| 204177afa0 | |||
| 1d8d9c0236 | |||
| 8ceade6227 | |||
| 5714079de3 | |||
| f21a298b8f | |||
| 09fbf237f0 | |||
| a6fd3e0cef | |||
| e47cd3eba7 | |||
| a6976aaac4 | |||
| dd970d200c | |||
| d1d6c443de | |||
| d26a99cdbb | |||
| 90dbc34a93 | |||
| 0408afb67e | |||
| 587cabc166 | |||
| 30f916f8eb | |||
| fae046885e | |||
| 05569d0471 | |||
| 8efeff20d4 | |||
| bc21aa3f41 | |||
| fedbb99b18 | |||
| 4b2b68d9ef | |||
| a663e30759 | |||
| b6a2d41f57 | |||
| cd87783ad0 | |||
| 7876a82ca4 | |||
| 0a18a0892a | |||
| b2e1cce667 | |||
| 64c1c84ed3 | |||
| f2301264ea | |||
| c83af6df6d | |||
| 22d9dfe138 | |||
| bcee164f48 | |||
| f6d8cb3ba7 | |||
| 659146a2cf | |||
| c17c084095 | |||
| 5962f694e2 | |||
| 373528b432 | |||
| e9f5e0fa03 | |||
| b88a92b7e1 | |||
| fb72063369 | |||
| 9809213a12 | |||
| 87e1cb7473 | |||
| c456ae215f | |||
| 091d7bfc0e | |||
| c9f80fe498 | |||
| 7a3deba52a | |||
| eb015fcecc | |||
| d9fab2a4a2 | |||
| 7f125b4548 | |||
| 88dcecc88c | |||
| 5458329252 | |||
| c4e275f5a8 | |||
| f8f89fd96e | |||
| b8ffa41a30 | |||
| f99cd08d57 | |||
| 45cae080a0 | |||
| 84a8f49e95 | |||
| e725991ece | |||
| c2a06a729c | |||
| 4a5e50a7a2 | |||
| 9b30a7bcec | |||
| ec383e44db | |||
| d3909f131f | |||
| a444d4c953 | |||
| 3c01ec861b | |||
| 365cf00644 | |||
| 4faff3b0bc | |||
| 866f2336c3 | |||
| e4132ea540 | |||
| 53208c36cf | |||
| 8f2a3e6e50 | |||
| b67a7d5370 | |||
| 07509c8e15 | |||
| e6c58a64ac | |||
| abb6b8c13a | |||
| de492728bc | |||
| 82fa732db6 | |||
| 275d640263 | |||
| 7e47b8a74f | |||
| d4301da0ec | |||
| fe5b5473dd | |||
| 0126d44761 | |||
| dbefd88e41 | |||
| 9a3b7ebe54 | |||
| 81be4a862c | |||
| 43f2db9f7e | |||
| abefa90408 | |||
| 08f48b7817 | |||
| 6b8ace60d4 | |||
| b997dd5f00 | |||
| 6174743858 | |||
| 82d55d7188 | |||
| aec5eacd0b | |||
| a320b85965 | |||
| b61a7c153d | |||
| fb9b01cf34 | |||
| 32f134873a | |||
| f4220be9d6 | |||
| 8252fd7216 | |||
| 57855f4307 | |||
| 6784eafe6e | |||
| 0b42c1d6a6 | |||
| 4b37a7327f | |||
| 0287f1e4ce | |||
| 5d8af1cab8 | |||
| 123896f08b | |||
| a8a198b51f | |||
| f00b98714a | |||
| 4ff87f3996 | |||
| 5f3ae0f9f1 | |||
| 786c864a27 | |||
| c61e802b85 | |||
| 9a568799f4 | |||
| 8aa38063bf | |||
| c4a11ec245 | |||
| 169b76589c | |||
| 199f51ea21 | |||
| 23572dfc07 | |||
| 570b0ce316 | |||
| f953a96c36 | |||
| 25c4eee464 | |||
| b209ef1fab | |||
| 77e9f4d9a2 | |||
| e73c808bc3 | |||
| edf0d1a5db | |||
| cc23a308c1 | |||
| bc891327c9 | |||
| 39bedfeb92 | |||
| 56fc4ff83e | |||
| 524ed30728 | |||
| 584304e744 | |||
| 56418600c5 | |||
| 40e57b18cb | |||
| ced6cb219c | |||
| 218ec5ea95 | |||
| 1c601bd68e | |||
| 7d6eba719b | |||
| 8cfc34dbcb | |||
| 23a749973d | |||
| 4b96702dc9 | |||
| a1af8711ef | |||
| 9e8cff931b | |||
| 5bccd71bdc | |||
| 544f35a601 | |||
| f920d4976e | |||
| cdcd665d43 | |||
| 08de61e455 | |||
| 025c3115b7 | |||
| 9e366554b7 | |||
| d934abf0fe | |||
| e16e9133e2 | |||
| d7854a35d7 | |||
| 97e0dd467f | |||
| e58a99e696 | |||
| 0d5a9eb505 | |||
| 45ac1817e1 | |||
| f2d4ff4237 | |||
| a4cc5c14f3 | |||
| 5be571cc30 | |||
| ff656dd046 | |||
| 20574d0037 | |||
| 42cf396e93 | |||
| 2a30b05dd7 | |||
| 4ecee185bf | |||
| 48ab59c67d | |||
| 806e8f3391 | |||
| 61244321a7 | |||
| ff1e613316 | |||
| 03161751fc | |||
| 9ebf4a3e5f | |||
| 3ba13e3ef8 | |||
| 8d3853fe6b | |||
| dbc09a62ea | |||
| f3fa78475c | |||
| c565771283 | |||
| bac8488244 | |||
| a5f661b558 | |||
| ceecec97c7 | |||
| c6ae8a4c00 | |||
| 37d0c776c0 | |||
| f8eea0f63f | |||
| 59c749ab2a | |||
| eeeba2bf4b | |||
| a9ce42101f | |||
| 13de88265f | |||
| a464a1236d | |||
| fce5d0e7fc | |||
| 66ba43d030 | |||
| 1aa77e5eda | |||
| 037016fc13 | |||
| 99f0026552 | |||
| 535262d721 | |||
| fbcb9ca3f2 | |||
| 2a7a20b966 | |||
| 98fdab0dba | |||
| bd71335ae6 | |||
| 7f746fc250 | |||
| 901c8785fe | |||
| e4e9718acb | |||
| 738101f374 | |||
| a7befd7278 | |||
| 52e968c313 | |||
| de9d7d34d6 | |||
| 9f0105d88a | |||
| 80ec8ff86d | |||
| f3473fe5d5 | |||
| 856f3f334b | |||
| 0b216a4101 | |||
| c7338b45ad | |||
| c93b1b752e | |||
| e38074bb25 | |||
| be0f425e14 | |||
| f24e33b1c7 |
1
xinnengyuan/.gitignore
vendored
1
xinnengyuan/.gitignore
vendored
@ -53,3 +53,4 @@ logs/
|
|||||||
docs
|
docs
|
||||||
/file
|
/file
|
||||||
.idea/
|
.idea/
|
||||||
|
chat-memory/
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<java.version>21</java.version>
|
<java.version>21</java.version>
|
||||||
<mybatis.version>3.5.16</mybatis.version>
|
<mybatis.version>3.5.16</mybatis.version>
|
||||||
<springdoc.version>2.8.4</springdoc.version>
|
<springdoc.version>2.3.0</springdoc.version>
|
||||||
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
|
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
|
||||||
<easyexcel.version>4.0.3</easyexcel.version>
|
<easyexcel.version>4.0.3</easyexcel.version>
|
||||||
<velocity.version>2.3</velocity.version>
|
<velocity.version>2.3</velocity.version>
|
||||||
@ -49,7 +49,7 @@
|
|||||||
<!-- 面向运行时的D-ORM依赖 -->
|
<!-- 面向运行时的D-ORM依赖 -->
|
||||||
<anyline.version>8.7.2-20250101</anyline.version>
|
<anyline.version>8.7.2-20250101</anyline.version>
|
||||||
<!--工作流配置-->
|
<!--工作流配置-->
|
||||||
<warm-flow.version>1.7.4</warm-flow.version>
|
<warm-flow.version>1.8.2</warm-flow.version>
|
||||||
|
|
||||||
<!-- 插件版本 -->
|
<!-- 插件版本 -->
|
||||||
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
|
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
|
||||||
|
|||||||
@ -92,7 +92,7 @@ public class SysRegisterService {
|
|||||||
// if (!isValid) {
|
// if (!isValid) {
|
||||||
// throw new UserException("注册失败,密码需满足8–18位,包含大小写字母、数字、特殊字符中的至少三种组合");
|
// throw new UserException("注册失败,密码需满足8–18位,包含大小写字母、数字、特殊字符中的至少三种组合");
|
||||||
// }
|
// }
|
||||||
// 验证码开关
|
|
||||||
SysUserBo sysUser = new SysUserBo();
|
SysUserBo sysUser = new SysUserBo();
|
||||||
sysUser.setUserName(username);
|
sysUser.setUserName(username);
|
||||||
sysUser.setNickName(username);
|
sysUser.setNickName(username);
|
||||||
@ -101,6 +101,13 @@ public class SysRegisterService {
|
|||||||
sysUser.setUserType(userType);
|
sysUser.setUserType(userType);
|
||||||
sysUser.setEmail(registerBody.getEmail());
|
sysUser.setEmail(registerBody.getEmail());
|
||||||
|
|
||||||
|
SysUser sysUserByPhonenumber = userMapper.selectDefFlagUser(username);
|
||||||
|
if(sysUserByPhonenumber != null){
|
||||||
|
sysUser.setUserId(sysUserByPhonenumber.getUserId());
|
||||||
|
userMapper.updateDefFlag(sysUser);
|
||||||
|
userMapper.updateConstructionUser(sysUserByPhonenumber.getUserId());
|
||||||
|
}else {
|
||||||
|
|
||||||
boolean exist = TenantHelper.dynamic(tenantId, () -> {
|
boolean exist = TenantHelper.dynamic(tenantId, () -> {
|
||||||
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
||||||
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
|
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
|
||||||
@ -112,6 +119,7 @@ public class SysRegisterService {
|
|||||||
if (!regFlag) {
|
if (!regFlag) {
|
||||||
throw new UserException("user.register.error");
|
throw new UserException("user.register.error");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
|
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,7 @@
|
|||||||
|
# 开发环境配置
|
||||||
|
server:
|
||||||
|
# 服务器的HTTP端口,默认为8080
|
||||||
|
port: 8899
|
||||||
--- # 监控中心配置
|
--- # 监控中心配置
|
||||||
spring.boot.admin.client:
|
spring.boot.admin.client:
|
||||||
# 增加客户端开关
|
# 增加客户端开关
|
||||||
@ -32,6 +36,12 @@ snail-job:
|
|||||||
|
|
||||||
--- # 数据源配置
|
--- # 数据源配置
|
||||||
spring:
|
spring:
|
||||||
|
ai:
|
||||||
|
dashscope:
|
||||||
|
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
|
||||||
|
chat:
|
||||||
|
options:
|
||||||
|
model: qwen-plus
|
||||||
datasource:
|
datasource:
|
||||||
type: com.zaxxer.hikari.HikariDataSource
|
type: com.zaxxer.hikari.HikariDataSource
|
||||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||||
@ -49,31 +59,41 @@ spring:
|
|||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
|
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
|
||||||
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
||||||
url: jdbc:mysql://192.168.110.2:13386/xinnengyuandev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
url: jdbc:mysql://192.168.110.2:13386/xinnengyuandev-update?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||||
username: xinnengyuandev
|
username: xinnengyuandev-update
|
||||||
password: StRWCZdZirysNSs2
|
password: cp7cAbWLZnRc6wyp
|
||||||
|
# url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||||
|
# username: xinnengyuan
|
||||||
|
# password: mEZPC5Sdf3r2HENi
|
||||||
# 从库数据源
|
# 从库数据源
|
||||||
slave:
|
# slave:
|
||||||
lazy: true
|
# lazy: true
|
||||||
type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgc
|
# username: zmkgc
|
||||||
password: nWKDKRNRT48tFBdh
|
# password: nWKDKRNRT48tFBdh
|
||||||
slave1:
|
# slave1:
|
||||||
lazy: true
|
# lazy: true
|
||||||
type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgprod
|
# username: zmkgprod
|
||||||
password: MaY8nehwWkJriWPm
|
# password: MaY8nehwWkJriWPm
|
||||||
slave2:
|
# slave2:
|
||||||
lazy: true
|
# lazy: true
|
||||||
type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgdev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgdev
|
# username: zmkgc
|
||||||
password: JhYxREf25AXdy3h8
|
# password: nWKDKRNRT48tFBdh
|
||||||
|
# slave:
|
||||||
|
# lazy: true
|
||||||
|
# type: ${spring.datasource.type}
|
||||||
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
|
# username: zmkgprod
|
||||||
|
# password: MaY8nehwWkJriWPm
|
||||||
# oracle:
|
# oracle:
|
||||||
# type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
# driverClassName: oracle.jdbc.OracleDriver
|
# driverClassName: oracle.jdbc.OracleDriver
|
||||||
@ -116,7 +136,7 @@ spring.data:
|
|||||||
# 端口,默认为6379
|
# 端口,默认为6379
|
||||||
port: 9287
|
port: 9287
|
||||||
# 数据库索引
|
# 数据库索引
|
||||||
database: 10
|
database: 16
|
||||||
# redis 密码必须配置
|
# redis 密码必须配置
|
||||||
password: syar23rdsaagdrsa
|
password: syar23rdsaagdrsa
|
||||||
# 连接超时时间
|
# 连接超时时间
|
||||||
@ -344,3 +364,7 @@ qrCode:
|
|||||||
# 无人机大图
|
# 无人机大图
|
||||||
drone:
|
drone:
|
||||||
url: http://192.168.110.2:9512
|
url: http://192.168.110.2:9512
|
||||||
|
# 聊天服务
|
||||||
|
chat:
|
||||||
|
server:
|
||||||
|
port: 19099
|
||||||
|
|||||||
@ -1,3 +1,7 @@
|
|||||||
|
# 开发环境配置
|
||||||
|
server:
|
||||||
|
# 服务器的HTTP端口,默认为8080
|
||||||
|
port: 9918
|
||||||
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
||||||
spring.servlet.multipart.location: /ruoyi/server/temp
|
spring.servlet.multipart.location: /ruoyi/server/temp
|
||||||
|
|
||||||
@ -35,6 +39,12 @@ snail-job:
|
|||||||
|
|
||||||
--- # 数据源配置
|
--- # 数据源配置
|
||||||
spring:
|
spring:
|
||||||
|
ai:
|
||||||
|
dashscope:
|
||||||
|
api-key: xxx
|
||||||
|
chat:
|
||||||
|
options:
|
||||||
|
model: qwen-plus
|
||||||
datasource:
|
datasource:
|
||||||
type: com.zaxxer.hikari.HikariDataSource
|
type: com.zaxxer.hikari.HikariDataSource
|
||||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||||
@ -105,7 +115,7 @@ spring.data:
|
|||||||
# 端口,默认为6379
|
# 端口,默认为6379
|
||||||
port: 9287
|
port: 9287
|
||||||
# 数据库索引
|
# 数据库索引
|
||||||
database: 6
|
database: 17
|
||||||
# redis 密码必须配置
|
# redis 密码必须配置
|
||||||
password: syar23rdsaagdrsa
|
password: syar23rdsaagdrsa
|
||||||
# 连接超时时间
|
# 连接超时时间
|
||||||
@ -164,7 +174,7 @@ sms:
|
|||||||
# 配置源类型用于标定配置来源(interface,yaml)
|
# 配置源类型用于标定配置来源(interface,yaml)
|
||||||
config-type: yaml
|
config-type: yaml
|
||||||
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
||||||
restricted: true
|
restricted: false
|
||||||
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
||||||
minute-max: 1
|
minute-max: 1
|
||||||
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
||||||
@ -183,12 +193,45 @@ sms:
|
|||||||
signature: 您的短信签名
|
signature: 您的短信签名
|
||||||
sdk-app-id: 您的sdkAppId
|
sdk-app-id: 您的sdkAppId
|
||||||
config2:
|
config2:
|
||||||
# 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
|
# 登录
|
||||||
supplier: tencent
|
supplier: tencent
|
||||||
access-key-id: 您的accessKey
|
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
|
||||||
access-key-secret: 您的accessKeySecret
|
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
|
||||||
signature: 您的短信签名
|
signature: 重庆远界大数据研究院
|
||||||
sdk-app-id: 您的sdkAppId
|
sdk-app-id: 1401018866
|
||||||
|
template-id: 2491779
|
||||||
|
config3:
|
||||||
|
# 注册
|
||||||
|
supplier: tencent
|
||||||
|
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
|
||||||
|
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
|
||||||
|
signature: 重庆远界大数据研究院
|
||||||
|
sdk-app-id: 1401018866
|
||||||
|
template-id: 2491776
|
||||||
|
config4:
|
||||||
|
# 质量工单逾期
|
||||||
|
supplier: tencent
|
||||||
|
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
|
||||||
|
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
|
||||||
|
signature: 重庆远界大数据研究院
|
||||||
|
sdk-app-id: 1401018866
|
||||||
|
template-id: 2534747
|
||||||
|
config5:
|
||||||
|
# 设计图纸
|
||||||
|
supplier: tencent
|
||||||
|
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
|
||||||
|
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
|
||||||
|
signature: 重庆远界大数据研究院
|
||||||
|
sdk-app-id: 1401018866
|
||||||
|
template-id: 2534750
|
||||||
|
config6:
|
||||||
|
# 安全工单
|
||||||
|
supplier: tencent
|
||||||
|
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
|
||||||
|
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
|
||||||
|
signature: 重庆远界大数据研究院
|
||||||
|
sdk-app-id: 1401018866
|
||||||
|
template-id: 2534848
|
||||||
|
|
||||||
--- # 三方授权
|
--- # 三方授权
|
||||||
justauth:
|
justauth:
|
||||||
@ -275,8 +318,11 @@ weather:
|
|||||||
dxf2GeoJson:
|
dxf2GeoJson:
|
||||||
file-name: main
|
file-name: main
|
||||||
ys7:
|
ys7:
|
||||||
app-key: 3acf9f1a43dc4209841e0893003db0a2
|
app-key: xxx
|
||||||
app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36
|
app-secret: xxx
|
||||||
|
job:
|
||||||
|
capture-enabled: false # 控制是否启用萤石抓拍任务
|
||||||
|
device-sync-enabled: false # 控制是否同步萤石设备
|
||||||
# 斯巴达算法
|
# 斯巴达算法
|
||||||
sparta:
|
sparta:
|
||||||
url: http://119.3.204.120:8040
|
url: http://119.3.204.120:8040
|
||||||
@ -286,10 +332,14 @@ sparta:
|
|||||||
id-card:
|
id-card:
|
||||||
encrypt-key: 7ae260d150a14027d2238a1cf80a48ef
|
encrypt-key: 7ae260d150a14027d2238a1cf80a48ef
|
||||||
recognizer:
|
recognizer:
|
||||||
url: http://192.168.110.5:50070
|
url: http://192.168.110.5:50071
|
||||||
|
|
||||||
qrCode:
|
qrCode:
|
||||||
url: http://xny.yj-3d.com:7171
|
url: http://xny.yj-3d.com:7788
|
||||||
# 无人机大图
|
# 无人机大图
|
||||||
drone:
|
drone:
|
||||||
url: http://192.168.110.2:9512
|
url: http://192.168.110.2:9512
|
||||||
|
# 聊天服务
|
||||||
|
chat:
|
||||||
|
server:
|
||||||
|
port: 18088
|
||||||
|
|||||||
@ -1,3 +1,7 @@
|
|||||||
|
# 开发环境配置
|
||||||
|
server:
|
||||||
|
# 服务器的HTTP端口,默认为8080
|
||||||
|
port: 8899
|
||||||
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
||||||
spring.servlet.multipart.location: /ruoyi/server/temp
|
spring.servlet.multipart.location: /ruoyi/server/temp
|
||||||
|
|
||||||
@ -35,6 +39,12 @@ snail-job:
|
|||||||
|
|
||||||
--- # 数据源配置
|
--- # 数据源配置
|
||||||
spring:
|
spring:
|
||||||
|
ai:
|
||||||
|
dashscope:
|
||||||
|
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
|
||||||
|
chat:
|
||||||
|
options:
|
||||||
|
model: qwen3-max
|
||||||
datasource:
|
datasource:
|
||||||
type: com.zaxxer.hikari.HikariDataSource
|
type: com.zaxxer.hikari.HikariDataSource
|
||||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||||
@ -55,21 +65,21 @@ spring:
|
|||||||
url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: xinnengyuan
|
username: xinnengyuan
|
||||||
password: mEZPC5Sdf3r2HENi
|
password: mEZPC5Sdf3r2HENi
|
||||||
# 从库数据源
|
# # 从库数据源
|
||||||
slave:
|
# slave:
|
||||||
lazy: true
|
# lazy: true
|
||||||
type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgc
|
# username: zmkgc
|
||||||
password: nWKDKRNRT48tFBdh
|
# password: nWKDKRNRT48tFBdh
|
||||||
slave1:
|
# slave1:
|
||||||
lazy: true
|
# lazy: true
|
||||||
type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgprod
|
# username: zmkgprod
|
||||||
password: MaY8nehwWkJriWPm
|
# password: MaY8nehwWkJriWPm
|
||||||
# # 从库数据源
|
# # 从库数据源
|
||||||
# slave:
|
# slave:
|
||||||
# lazy: true
|
# lazy: true
|
||||||
@ -326,7 +336,7 @@ ys7:
|
|||||||
app-key: 3acf9f1a43dc4209841e0893003db0a2
|
app-key: 3acf9f1a43dc4209841e0893003db0a2
|
||||||
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
|
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
|
||||||
job:
|
job:
|
||||||
capture-enabled: false # 控制是否启用萤石抓拍任务
|
capture-enabled: true # 控制是否启用萤石抓拍任务
|
||||||
device-sync-enabled: true # 控制是否同步萤石设备
|
device-sync-enabled: true # 控制是否同步萤石设备
|
||||||
# 斯巴达算法
|
# 斯巴达算法
|
||||||
sparta:
|
sparta:
|
||||||
@ -344,3 +354,7 @@ qrCode:
|
|||||||
# 无人机大图
|
# 无人机大图
|
||||||
drone:
|
drone:
|
||||||
url: http://192.168.110.2:9512
|
url: http://192.168.110.2:9512
|
||||||
|
# 聊天服务
|
||||||
|
chat:
|
||||||
|
server:
|
||||||
|
port: 19099
|
||||||
|
|||||||
@ -22,7 +22,7 @@ captcha:
|
|||||||
# 开发环境配置
|
# 开发环境配置
|
||||||
server:
|
server:
|
||||||
# 服务器的HTTP端口,默认为8080
|
# 服务器的HTTP端口,默认为8080
|
||||||
port: 8899
|
# port: 8899
|
||||||
servlet:
|
servlet:
|
||||||
# 应用的访问路径
|
# 应用的访问路径
|
||||||
context-path: /
|
context-path: /
|
||||||
@ -106,6 +106,12 @@ sa-token:
|
|||||||
is-share: false
|
is-share: false
|
||||||
# jwt秘钥
|
# jwt秘钥
|
||||||
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
|
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
|
||||||
|
# token有效期,单位s 默认30天, -1代表永不过期
|
||||||
|
timeout: 2592000
|
||||||
|
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
|
||||||
|
active-timeout: 86400
|
||||||
|
# 同一账号最大登录数量,-1代表不限
|
||||||
|
max-login-count: -1
|
||||||
|
|
||||||
# security配置
|
# security配置
|
||||||
security:
|
security:
|
||||||
@ -130,6 +136,8 @@ security:
|
|||||||
# todo 仅测试
|
# todo 仅测试
|
||||||
- /facility/matrix/**
|
- /facility/matrix/**
|
||||||
- /hat/device/data
|
- /hat/device/data
|
||||||
|
- /websocket/ue
|
||||||
|
- /websocket/vehicle
|
||||||
|
|
||||||
# 多租户配置
|
# 多租户配置
|
||||||
tenant:
|
tenant:
|
||||||
@ -202,6 +210,10 @@ api-decrypt:
|
|||||||
- /gps/equipment/dataAcceptance # GPS数据接收接口
|
- /gps/equipment/dataAcceptance # GPS数据接收接口
|
||||||
|
|
||||||
springdoc:
|
springdoc:
|
||||||
|
default-flat-param-object: true
|
||||||
|
swagger-ui:
|
||||||
|
path: /swagger-ui.html
|
||||||
|
tags-sorter: alpha
|
||||||
api-docs:
|
api-docs:
|
||||||
# 是否开启接口文档
|
# 是否开启接口文档
|
||||||
enabled: true
|
enabled: true
|
||||||
@ -221,10 +233,14 @@ springdoc:
|
|||||||
components:
|
components:
|
||||||
# 鉴权方式配置
|
# 鉴权方式配置
|
||||||
security-schemes:
|
security-schemes:
|
||||||
apiKey:
|
Authorization:
|
||||||
type: APIKEY
|
type: HTTP
|
||||||
in: HEADER
|
in: HEADER
|
||||||
name: ${sa-token.token-name}
|
name: ${sa-token.token-name}
|
||||||
|
Clientid:
|
||||||
|
type: HTTP
|
||||||
|
in: HEADER
|
||||||
|
name: Clientid
|
||||||
#这里定义了两个分组,可定义多个,也可以不定义
|
#这里定义了两个分组,可定义多个,也可以不定义
|
||||||
group-configs:
|
group-configs:
|
||||||
- group: 1.通用模块
|
- group: 1.通用模块
|
||||||
@ -257,8 +273,6 @@ springdoc:
|
|||||||
packages-to-scan: org.dromara.ctr
|
packages-to-scan: org.dromara.ctr
|
||||||
- group: 15.无人机模块
|
- group: 15.无人机模块
|
||||||
packages-to-scan: org.dromara.drone
|
packages-to-scan: org.dromara.drone
|
||||||
- group: 20.代码生成模块
|
|
||||||
packages-to-scan: org.dromara.generator
|
|
||||||
- group: 16.app模块
|
- group: 16.app模块
|
||||||
packages-to-scan: org.dromara.app
|
packages-to-scan: org.dromara.app
|
||||||
- group: 17.材料设备模块
|
- group: 17.材料设备模块
|
||||||
@ -267,22 +281,30 @@ springdoc:
|
|||||||
packages-to-scan: org.dromara.out
|
packages-to-scan: org.dromara.out
|
||||||
- group: 19.消息模块
|
- group: 19.消息模块
|
||||||
packages-to-scan: org.dromara.message
|
packages-to-scan: org.dromara.message
|
||||||
|
- group: 20.代码生成模块
|
||||||
|
packages-to-scan: org.dromara.generator
|
||||||
- group: 21.分标策划模块
|
- group: 21.分标策划模块
|
||||||
packages-to-scan: org.dromara.tender
|
packages-to-scan: org.dromara.tender
|
||||||
- group: 22.大屏模块
|
- group: 22.大屏模块
|
||||||
packages-to-scan: org.dromara.bigscreen
|
packages-to-scan: org.dromara.bigscreen
|
||||||
- group: 22.投标管理模块
|
|
||||||
packages-to-scan: org.dromara.bidding
|
|
||||||
- group: 23.GPS定位模块
|
- group: 23.GPS定位模块
|
||||||
packages-to-scan: org.dromara.gps
|
packages-to-scan: org.dromara.gps
|
||||||
- group: 24.招标模块
|
- group: 24.招标模块
|
||||||
packages-to-scan: org.dromara.tender
|
packages-to-scan: org.dromara.tender
|
||||||
- group: 25.app版本模块
|
- group: 25.数据迁移模块
|
||||||
packages-to-scan: org.dromara.app
|
packages-to-scan: org.dromara.transferData
|
||||||
- group: 26.netty消息模块
|
- group: 26.netty消息模块
|
||||||
packages-to-scan: org.dromara.websocket
|
packages-to-scan: org.dromara.websocket
|
||||||
- group: 27.新中大模块
|
- group: 27.新中大模块
|
||||||
packages-to-scan: org.dromara.xzd
|
packages-to-scan: org.dromara.xzd
|
||||||
|
- group: 28.车辆模块
|
||||||
|
packages-to-scan: org.dromara.vehicle
|
||||||
|
- group: 29.app版本模块
|
||||||
|
packages-to-scan: org.dromara.app
|
||||||
|
- group: 30.AI 模块
|
||||||
|
packages-to-scan: org.dromara.ai
|
||||||
|
- group: 31.投标管理模块
|
||||||
|
packages-to-scan: org.dromara.bidding
|
||||||
# knife4j的增强配置,不需要增强可以不配
|
# knife4j的增强配置,不需要增强可以不配
|
||||||
knife4j:
|
knife4j:
|
||||||
enable: true
|
enable: true
|
||||||
@ -298,6 +320,17 @@ xss:
|
|||||||
- /system/notice
|
- /system/notice
|
||||||
- /warm-flow/save-xml
|
- /warm-flow/save-xml
|
||||||
- /project/project
|
- /project/project
|
||||||
|
- /xzd/contractDetails/**
|
||||||
|
- /xzd/contractChange/**
|
||||||
|
- /xzd/comprehensive/csContractChange/**
|
||||||
|
- /xzd/comprehensive/csContractInformation/**
|
||||||
|
- /xzd/hetongbiangeng/**
|
||||||
|
- /xzd/fenbaohetongjungong/**
|
||||||
|
- /xzd/fenbaohetongbiangg/**
|
||||||
|
- /xzd/fenbaohetongxinxi/**
|
||||||
|
- /xzd/contractManagement/**
|
||||||
|
- /xzd/jixiehetongxinxi/contractMachinery/**
|
||||||
|
- /xzd/jixiehetongbiang/machineryContractAlteration/**
|
||||||
|
|
||||||
# 全局线程池相关配置
|
# 全局线程池相关配置
|
||||||
# 如使用JDK21请直接使用虚拟线程 不要开启此配置
|
# 如使用JDK21请直接使用虚拟线程 不要开启此配置
|
||||||
|
|||||||
Binary file not shown.
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计更改通知单.docx
Normal file
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计更改通知单.docx
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计验证表.docx
Normal file
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计验证表.docx
Normal file
Binary file not shown.
@ -5,7 +5,6 @@ import cn.hutool.core.io.FileUtil;
|
|||||||
import cn.hutool.core.util.IdcardUtil;
|
import cn.hutool.core.util.IdcardUtil;
|
||||||
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpRequest;
|
||||||
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpResponse;
|
||||||
import cn.hutool.json.JSONObject;
|
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
@ -25,11 +24,14 @@ import org.dromara.facility.domain.FacMatrix;
|
|||||||
import org.dromara.facility.service.IFacMatrixService;
|
import org.dromara.facility.service.IFacMatrixService;
|
||||||
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
|
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
|
||||||
import org.dromara.facility.service.IFacPhotovoltaicPanelService;
|
import org.dromara.facility.service.IFacPhotovoltaicPanelService;
|
||||||
|
import org.dromara.manager.recognizermanager.enums.RecognizerTypeEnum;
|
||||||
import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult;
|
import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult;
|
||||||
import org.dromara.manager.ys7manager.Ys7Constant;
|
import org.dromara.manager.ys7manager.Ys7Constant;
|
||||||
import org.dromara.manager.ys7manager.Ys7Manager;
|
import org.dromara.manager.ys7manager.Ys7Manager;
|
||||||
import org.dromara.manager.ys7manager.vo.Ys7ResponseVo;
|
import org.dromara.manager.ys7manager.vo.Ys7ResponseVo;
|
||||||
import org.dromara.other.domain.OthYs7Device;
|
import org.dromara.other.domain.OthYs7Device;
|
||||||
|
import org.dromara.other.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture;
|
||||||
|
import org.dromara.other.service.IOthYs7DeviceImgService;
|
||||||
import org.dromara.other.service.IOthYs7DeviceService;
|
import org.dromara.other.service.IOthYs7DeviceService;
|
||||||
import org.dromara.out.domain.OutConstructionValue;
|
import org.dromara.out.domain.OutConstructionValue;
|
||||||
import org.dromara.out.domain.OutConstructionValueRange;
|
import org.dromara.out.domain.OutConstructionValueRange;
|
||||||
@ -56,6 +58,8 @@ import java.time.LocalDate;
|
|||||||
import java.time.temporal.TemporalAdjusters;
|
import java.time.temporal.TemporalAdjusters;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -113,6 +117,9 @@ public class DemoTest {
|
|||||||
@Resource
|
@Resource
|
||||||
private IOthYs7DeviceService ys7DeviceService;
|
private IOthYs7DeviceService ys7DeviceService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IOthYs7DeviceImgService ys7DeviceImgService;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private Ys7Manager ys7Manager;
|
private Ys7Manager ys7Manager;
|
||||||
|
|
||||||
@ -129,7 +136,7 @@ public class DemoTest {
|
|||||||
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday);
|
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday);
|
||||||
Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/
|
Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/
|
||||||
LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间(2024-01-01)
|
LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间(2024-01-01)
|
||||||
LocalDate end = LocalDate.of(2025, 10, 13); // 截止时间(2025-09-15)
|
LocalDate end = LocalDate.of(2025, 10, 27); // 截止时间(2025-09-15)
|
||||||
|
|
||||||
// 如果起始不是周一,调整到当周的周一
|
// 如果起始不是周一,调整到当周的周一
|
||||||
if (start.getDayOfWeek() != DayOfWeek.MONDAY) {
|
if (start.getDayOfWeek() != DayOfWeek.MONDAY) {
|
||||||
@ -144,8 +151,14 @@ public class DemoTest {
|
|||||||
System.out.println(monday + " ~ " + sunday);
|
System.out.println(monday + " ~ " + sunday);
|
||||||
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", monday, sunday);
|
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", monday, sunday);
|
||||||
// Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(start, now, null);
|
// Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(start, now, null);
|
||||||
|
List<BusProject> list = projectService.lambdaQuery()
|
||||||
|
.eq(BusProject::getPId, 1968506669544656898L)
|
||||||
|
.list();
|
||||||
|
List<Long> list1 = new ArrayList<>(list.stream().map(BusProject::getId).toList());
|
||||||
|
list1.add(1968506669544656898L);
|
||||||
// 获取范围时间内的计划详情
|
// 获取范围时间内的计划详情
|
||||||
List<PgsProgressPlanDetail> planDetailList = progressPlanDetailService.lambdaQuery()
|
List<PgsProgressPlanDetail> planDetailList = progressPlanDetailService.lambdaQuery()
|
||||||
|
.in(PgsProgressPlanDetail::getProjectId, list1)
|
||||||
.ge(PgsProgressPlanDetail::getDate, monday)
|
.ge(PgsProgressPlanDetail::getDate, monday)
|
||||||
.le(PgsProgressPlanDetail::getDate, sunday)
|
.le(PgsProgressPlanDetail::getDate, sunday)
|
||||||
.ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO)
|
.ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO)
|
||||||
@ -244,8 +257,8 @@ public class DemoTest {
|
|||||||
value.setOutValue(constructionValue);
|
value.setOutValue(constructionValue);
|
||||||
value.setOwnerValue(ownerValue);
|
value.setOwnerValue(ownerValue);
|
||||||
// 统计总产值
|
// 统计总产值
|
||||||
allConstructionValue = allConstructionValue.add(constructionValue).setScale(4, RoundingMode.HALF_UP);
|
allConstructionValue = allConstructionValue.add(constructionValue);
|
||||||
allOwnerValue = allOwnerValue.add(ownerValue).setScale(4, RoundingMode.HALF_UP);
|
allOwnerValue = allOwnerValue.add(ownerValue);
|
||||||
// 添加需要修改状态的计划详情
|
// 添加需要修改状态的计划详情
|
||||||
PgsProgressPlanDetail update = new PgsProgressPlanDetail();
|
PgsProgressPlanDetail update = new PgsProgressPlanDetail();
|
||||||
update.setId(planDetail.getId());
|
update.setId(planDetail.getId());
|
||||||
@ -253,8 +266,8 @@ public class DemoTest {
|
|||||||
updateList.add(update);
|
updateList.add(update);
|
||||||
saveList.add(value);
|
saveList.add(value);
|
||||||
}
|
}
|
||||||
range.setOutValue(allConstructionValue);
|
range.setOutValue(allConstructionValue.setScale(4, RoundingMode.HALF_UP));
|
||||||
range.setOwnerValue(allOwnerValue);
|
range.setOwnerValue(allOwnerValue.setScale(4, RoundingMode.HALF_UP));
|
||||||
// 如果产值都为0,则不保存
|
// 如果产值都为0,则不保存
|
||||||
if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) {
|
if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) {
|
||||||
return null;
|
return null;
|
||||||
@ -391,7 +404,8 @@ public class DemoTest {
|
|||||||
@Test
|
@Test
|
||||||
void testImport() {
|
void testImport() {
|
||||||
photovoltaicPanelService.updateFinishNumberByCoordinate(List.of(1968510961294921730L),
|
photovoltaicPanelService.updateFinishNumberByCoordinate(List.of(1968510961294921730L),
|
||||||
List.of(new RecognizeConvertCoordinateResult("107.124334530", "23.830557974")));
|
List.of(new RecognizeConvertCoordinateResult("107.124334530", "23.830557974")),
|
||||||
|
RecognizerTypeEnum.BRACKET.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -548,4 +562,38 @@ public class DemoTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void capturePic() {
|
||||||
|
List<String> urlList = List.of(
|
||||||
|
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/db8a379b456142459852b654f20d5f97.png",
|
||||||
|
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/913dbcf0f7244c8b878e84b5525bec4b.png",
|
||||||
|
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/2b904765f03f40b2ad0ddbf6ddeadb45.png"
|
||||||
|
);
|
||||||
|
for (String url : urlList) {
|
||||||
|
Pattern pattern = Pattern.compile(".*/device/img/([^/]+)/.*");
|
||||||
|
Matcher matcher = pattern.matcher(url);
|
||||||
|
OthYs7Device ys7Device = ys7DeviceService.lambdaQuery()
|
||||||
|
.eq(OthYs7Device::getDeviceSerial, "GA1730672")
|
||||||
|
.last("limit 1")
|
||||||
|
.one();
|
||||||
|
if (ys7Device == null) {
|
||||||
|
throw new ServiceException("设备不存在", HttpStatus.ERROR);
|
||||||
|
}
|
||||||
|
String deviceSerial = ys7Device.getDeviceSerial();
|
||||||
|
// 如果没有预置位,则直接对默认通道抓图
|
||||||
|
OthYs7DeviceImgCreateByCapture img = new OthYs7DeviceImgCreateByCapture();
|
||||||
|
img.setProjectId(ys7Device.getProjectId());
|
||||||
|
img.setDeviceSerial(deviceSerial);
|
||||||
|
img.setDeviceName(ys7Device.getDeviceName());
|
||||||
|
// String url = "http://xny.yj-3d.com:9000/xinnengyuan/ys7/device/img/GA1044315/2025-10-13_859fdfb7dde540608356f29cb9e3d63e.jpg";
|
||||||
|
// String url = "http://xny.yj-3d.com:9000/xinnengyuan/ys7/device/img/GA1044315/2025-10-12_2801707255b84004acb5fee2a75299b2.jpg";
|
||||||
|
img.setCreateTime(new Date());
|
||||||
|
img.setUrl(url);
|
||||||
|
log.info("图片:{},识别中", url);
|
||||||
|
ys7DeviceImgService.saveCapturePic(List.of(img));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,132 @@
|
|||||||
|
package org.dromara.test;
|
||||||
|
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.materials.domain.MatMaterialIssue;
|
||||||
|
import org.dromara.materials.domain.MatMaterialReceive;
|
||||||
|
import org.dromara.materials.domain.MatMaterials;
|
||||||
|
import org.dromara.materials.domain.MatMaterialsInventory;
|
||||||
|
import org.dromara.materials.domain.enums.MatMaterialsInventoryOutPutEnum;
|
||||||
|
import org.dromara.materials.service.IMatMaterialIssueService;
|
||||||
|
import org.dromara.materials.service.IMatMaterialReceiveService;
|
||||||
|
import org.dromara.materials.service.IMatMaterialsInventoryService;
|
||||||
|
import org.dromara.materials.service.IMatMaterialsService;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-10-30 15:58
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@SpringBootTest
|
||||||
|
public class MaterialsTest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 长顺项目id
|
||||||
|
*/
|
||||||
|
private static final Long PROJECT_ID = 1897161054676336641L;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IMatMaterialsService materialsService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IMatMaterialsInventoryService materialsInventoryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IMatMaterialReceiveService materialReceiveService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IMatMaterialIssueService materialIssueService;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void test() {
|
||||||
|
// 获取所有材料
|
||||||
|
List<MatMaterials> materials = materialsService.lambdaQuery()
|
||||||
|
.eq(MatMaterials::getProjectId, PROJECT_ID)
|
||||||
|
.list();
|
||||||
|
Set<Long> materialIds = materials.stream().map(MatMaterials::getId).collect(Collectors.toSet());
|
||||||
|
// 获取所有材料的出库数据
|
||||||
|
List<MatMaterialsInventory> inventoryList = materialsInventoryService.lambdaQuery()
|
||||||
|
.in(MatMaterialsInventory::getMaterialsId, materialIds)
|
||||||
|
.eq(MatMaterialsInventory::getOutPut, MatMaterialsInventoryOutPutEnum.OUT.getValue())
|
||||||
|
.list();
|
||||||
|
// 按表单编号分组
|
||||||
|
Map<String, List<MatMaterials>> map = materials.stream()
|
||||||
|
.collect(Collectors.groupingBy(MatMaterials::getFormCode));
|
||||||
|
for (Map.Entry<String, List<MatMaterials>> entry : map.entrySet()) {
|
||||||
|
String formCode = entry.getKey();
|
||||||
|
List<MatMaterials> materialsList = entry.getValue();
|
||||||
|
// 获取入库数据
|
||||||
|
MatMaterialReceive receive = materialReceiveService.lambdaQuery()
|
||||||
|
.eq(MatMaterialReceive::getFormCode, formCode)
|
||||||
|
.one();
|
||||||
|
// 创建领料出库数据
|
||||||
|
MatMaterialIssue issue = new MatMaterialIssue();
|
||||||
|
issue.setProjectId(PROJECT_ID);
|
||||||
|
issue.setMaterialSource("2");
|
||||||
|
issue.setFormCode(formCode);
|
||||||
|
issue.setProjectName(receive.getProjectName());
|
||||||
|
issue.setMaterialName(receive.getMaterialName());
|
||||||
|
issue.setOrderingUnit(receive.getOrderingUnit());
|
||||||
|
issue.setSupplierUnit(receive.getSupplierUnit());
|
||||||
|
// issue.setIssueUnit(inventory.getRecipient());
|
||||||
|
// issue.setIssueUnitId(inventory.getRecipientId());
|
||||||
|
// issue.setShipper(inventory.getShipper());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// issue.setStorageUnit();
|
||||||
|
issue.setCertCount(0);
|
||||||
|
issue.setReportCount(0);
|
||||||
|
issue.setTechDocCount(0);
|
||||||
|
issue.setLicenseCount(0);
|
||||||
|
log.info("领料出库数据:{}", issue);
|
||||||
|
log.info("=============================");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (MatMaterials material : materials) {
|
||||||
|
String formCode = material.getFormCode();
|
||||||
|
// 查看入库数据
|
||||||
|
MatMaterialReceive receive = materialReceiveService.lambdaQuery()
|
||||||
|
.eq(MatMaterialReceive::getFormCode, formCode)
|
||||||
|
.one();
|
||||||
|
// 查看出库数据
|
||||||
|
/* List<MatMaterialsInventory> inventoryList = materialsInventoryService.lambdaQuery()
|
||||||
|
.eq(MatMaterialsInventory::getMaterialsId, material.getId())
|
||||||
|
.eq(MatMaterialsInventory::getOutPut, MatMaterialsInventoryOutPutEnum.OUT.getValue())
|
||||||
|
.list();
|
||||||
|
if (CollUtil.isEmpty(inventoryList)) {
|
||||||
|
continue;
|
||||||
|
}*/
|
||||||
|
// 创建领料出库数据
|
||||||
|
List<MatMaterialIssue> issueList = inventoryList.stream().map(inventory -> {
|
||||||
|
MatMaterialIssue issue = new MatMaterialIssue();
|
||||||
|
issue.setProjectId(PROJECT_ID);
|
||||||
|
issue.setMaterialSource("2");
|
||||||
|
issue.setFormCode(receive.getFormCode());
|
||||||
|
issue.setProjectName(receive.getProjectName());
|
||||||
|
issue.setMaterialName(receive.getMaterialName());
|
||||||
|
issue.setOrderingUnit(receive.getOrderingUnit());
|
||||||
|
issue.setSupplierUnit(receive.getSupplierUnit());
|
||||||
|
issue.setIssueUnit(inventory.getRecipient());
|
||||||
|
issue.setIssueUnitId(inventory.getRecipientId());
|
||||||
|
issue.setShipper(inventory.getShipper());
|
||||||
|
// issue.setStorageUnit();
|
||||||
|
issue.setCertCount(0);
|
||||||
|
issue.setReportCount(0);
|
||||||
|
issue.setTechDocCount(0);
|
||||||
|
issue.setLicenseCount(0);
|
||||||
|
log.info("领料出库数据:{}", issue);
|
||||||
|
log.info("=============================");
|
||||||
|
return issue;
|
||||||
|
}).toList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -23,7 +23,12 @@ public class RecognizerTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void test() {
|
void test() {
|
||||||
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.SOLAR));
|
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.PANEL));
|
||||||
log.info("recognize: {}", recognize);
|
log.info("recognize: {}", recognize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testChange() {
|
||||||
|
recognizerManager.convertCoordinate("http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/11/11/d48767a62bc04867a552e06ba6712004.tif", List.of());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,17 @@
|
|||||||
package org.dromara.test;
|
package org.dromara.test;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto;
|
import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto;
|
||||||
import org.dromara.safety.service.IHseViolationRecordService;
|
import org.dromara.safety.service.IHseViolationRecordService;
|
||||||
|
import org.dromara.system.domain.SysMenu;
|
||||||
|
import org.dromara.system.domain.vo.SysMenuVo;
|
||||||
|
import org.dromara.system.mapper.SysMenuMapper;
|
||||||
|
import org.dromara.system.service.ISysMenuService;
|
||||||
|
import org.hamcrest.core.Is;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -20,6 +28,9 @@ public class ViolationRecordTest {
|
|||||||
@Resource
|
@Resource
|
||||||
private IHseViolationRecordService violationRecordService;
|
private IHseViolationRecordService violationRecordService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SysMenuMapper sysMenuMapper;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void test() {
|
void test() {
|
||||||
List<HseViolationRecordCreateDto> list = new ArrayList<>();
|
List<HseViolationRecordCreateDto> list = new ArrayList<>();
|
||||||
@ -55,4 +66,26 @@ public class ViolationRecordTest {
|
|||||||
list.add(dto5);
|
list.add(dto5);
|
||||||
violationRecordService.insertByMonitor(list);
|
violationRecordService.insertByMonitor(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void contextLoads() {
|
||||||
|
SysMenuVo sysMenuVo = sysMenusByList(1972500768346673154L);
|
||||||
|
System.out.println(sysMenuVo.toString());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
SysMenuVo sysMenusByList(Long id) {
|
||||||
|
SysMenuVo sysMenus = new SysMenuVo();
|
||||||
|
List<SysMenu> res = sysMenuMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, id));
|
||||||
|
if (res != null && res.size() > 0 ) {
|
||||||
|
sysMenus.setChildren(MapstructUtils.convert(res, SysMenuVo.class));
|
||||||
|
res.forEach(sysMenu -> {
|
||||||
|
sysMenusByList(sysMenu.getMenuId());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return sysMenus;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,11 +5,14 @@ import org.dromara.common.core.exception.ServiceException;
|
|||||||
import org.dromara.common.core.utils.SpringUtils;
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
|
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.core.task.VirtualThreadTaskExecutor;
|
import org.springframework.core.task.VirtualThreadTaskExecutor;
|
||||||
import org.springframework.scheduling.annotation.AsyncConfigurer;
|
import org.springframework.scheduling.annotation.AsyncConfigurer;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 异步配置
|
* 异步配置
|
||||||
@ -26,12 +29,36 @@ public class AsyncConfig implements AsyncConfigurer {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Executor getAsyncExecutor() {
|
public Executor getAsyncExecutor() {
|
||||||
if(SpringUtils.isVirtual()) {
|
if (SpringUtils.isVirtual()) {
|
||||||
return new VirtualThreadTaskExecutor("async-");
|
return new VirtualThreadTaskExecutor("async-");
|
||||||
}
|
}
|
||||||
return SpringUtils.getBean("scheduledExecutorService");
|
return SpringUtils.getBean("scheduledExecutorService");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增:自定义线程池(可以在 @Async("capturePicExecutor") 使用)
|
||||||
|
*/
|
||||||
|
@Bean("capturePicExecutor")
|
||||||
|
public Executor customExecutor() {
|
||||||
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||||
|
// 核心线程数
|
||||||
|
executor.setCorePoolSize(5);
|
||||||
|
// 最大线程数
|
||||||
|
executor.setMaxPoolSize(10);
|
||||||
|
// 队列容量(超过核心线程数时,任务进入队列)
|
||||||
|
executor.setQueueCapacity(50);
|
||||||
|
// 空闲线程最大存活时间(秒)
|
||||||
|
executor.setKeepAliveSeconds(60);
|
||||||
|
// 线程名前缀,方便定位日志
|
||||||
|
executor.setThreadNamePrefix("capturePic-async-");
|
||||||
|
// 拒绝策略:当线程池满时
|
||||||
|
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
|
||||||
|
// CallerRunsPolicy:由调用线程执行任务(相对安全)
|
||||||
|
// 初始化
|
||||||
|
executor.initialize();
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 异步执行异常处理
|
* 异步执行异常处理
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -0,0 +1,45 @@
|
|||||||
|
package org.dromara.common.core.domain.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例业务扩展对象
|
||||||
|
*
|
||||||
|
* @author may
|
||||||
|
* @date 2025-08-05
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class FlowInstanceBizExtDTO implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例ID
|
||||||
|
*/
|
||||||
|
private Long instanceId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务ID
|
||||||
|
*/
|
||||||
|
private String businessId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务编码
|
||||||
|
*/
|
||||||
|
private String businessCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务标题
|
||||||
|
*/
|
||||||
|
private String businessTitle;
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,6 +1,7 @@
|
|||||||
package org.dromara.common.core.domain.dto;
|
package org.dromara.common.core.domain.dto;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
@ -30,11 +31,21 @@ public class StartProcessDTO implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String flowCode;
|
private String flowCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办理人(可不填 用于覆盖当前节点办理人)
|
||||||
|
*/
|
||||||
|
private String handler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}}
|
* 流程变量,前端会提交一个元素{'entity': {业务详情数据对象}}
|
||||||
*/
|
*/
|
||||||
private Map<String, Object> variables;
|
private Map<String, Object> variables;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程业务扩展信息
|
||||||
|
*/
|
||||||
|
private FlowInstanceBizExtDTO bizExt;
|
||||||
|
|
||||||
public Map<String, Object> getVariables() {
|
public Map<String, Object> getVariables() {
|
||||||
if (variables == null) {
|
if (variables == null) {
|
||||||
return new HashMap<>(16);
|
return new HashMap<>(16);
|
||||||
@ -42,4 +53,11 @@ public class StartProcessDTO implements Serializable {
|
|||||||
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
|
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
|
||||||
return variables;
|
return variables;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FlowInstanceBizExtDTO getBizExt() {
|
||||||
|
if (ObjectUtil.isNull(bizExt)) {
|
||||||
|
bizExt = new FlowInstanceBizExtDTO();
|
||||||
|
}
|
||||||
|
return bizExt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,21 +52,23 @@ public class TaskAssigneeDTO implements Serializable {
|
|||||||
*/
|
*/
|
||||||
public static <T> List<TaskHandler> convertToHandlerList(
|
public static <T> List<TaskHandler> convertToHandlerList(
|
||||||
List<T> sourceList,
|
List<T> sourceList,
|
||||||
Function<T, Long> storageId,
|
Function<T, String> storageId,
|
||||||
Function<T, String> handlerCode,
|
Function<T, String> handlerCode,
|
||||||
Function<T, String> handlerName,
|
Function<T, String> handlerName,
|
||||||
Function<T, Long> groupName,
|
Function<T, String> groupName,
|
||||||
Function<T, Date> createTimeMapper) {
|
Function<T, Date> createTimeMapper) {
|
||||||
return sourceList.stream()
|
return sourceList.stream()
|
||||||
.map(item -> new TaskHandler(
|
.map(item -> new TaskHandler(
|
||||||
String.valueOf(storageId.apply(item)),
|
storageId.apply(item),
|
||||||
handlerCode.apply(item),
|
handlerCode.apply(item),
|
||||||
handlerName.apply(item),
|
handlerName.apply(item),
|
||||||
groupName != null ? String.valueOf(groupName.apply(item)) : null,
|
groupName.apply(item),
|
||||||
createTimeMapper.apply(item)
|
createTimeMapper.apply(item)
|
||||||
)).collect(Collectors.toList());
|
)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
|||||||
@ -62,4 +62,10 @@ public class ProcessEvent implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Boolean submit;
|
private Boolean submit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实例id
|
||||||
|
*/
|
||||||
|
private Long instanceId;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import lombok.Data;
|
|||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程办理监听
|
* 流程办理监听
|
||||||
@ -56,4 +57,14 @@ public class ProcessTaskEvent implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实例id
|
||||||
|
*/
|
||||||
|
private Long instanceId;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 办理参数
|
||||||
|
*/
|
||||||
|
private Map<String, Object> params;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,32 @@
|
|||||||
|
package org.dromara.common.core.domain.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class XzdCustomerSupplierVos implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类型(1、供应商,2、客户)
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 供应商-客户id
|
||||||
|
*/
|
||||||
|
private Long cSId;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
package org.dromara.common.core.exception;
|
package org.dromara.common.core.exception;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.StrFormatter;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
@ -56,4 +57,8 @@ public final class ServiceException extends RuntimeException {
|
|||||||
this.detailMessage = detailMessage;
|
this.detailMessage = detailMessage;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ServiceException(String message, Object... args) {
|
||||||
|
this.message = StrFormatter.format(message, args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -82,6 +82,7 @@ public interface WorkflowService {
|
|||||||
* completeTask.getVariables().put("ignore", true);
|
* completeTask.getVariables().put("ignore", true);
|
||||||
*
|
*
|
||||||
* @param completeTask 参数
|
* @param completeTask 参数
|
||||||
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
boolean completeTask(CompleteTaskDTO completeTask);
|
boolean completeTask(CompleteTaskDTO completeTask);
|
||||||
|
|
||||||
@ -90,6 +91,15 @@ public interface WorkflowService {
|
|||||||
*
|
*
|
||||||
* @param taskId 任务ID
|
* @param taskId 任务ID
|
||||||
* @param message 办理意见
|
* @param message 办理意见
|
||||||
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
boolean completeTask(Long taskId, String message);
|
boolean completeTask(Long taskId, String message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动流程并办理第一个任务
|
||||||
|
*
|
||||||
|
* @param startProcess 参数
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
boolean startCompleteTask(StartProcessDTO startProcess);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdCbysZjhcbService {
|
||||||
|
String selectNmaeByIds(String ids);
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机械合同信息Service接口
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-12
|
||||||
|
*/
|
||||||
|
public interface XzdContractMachineryService {
|
||||||
|
|
||||||
|
String selectNmaeByIds(String ids);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdCsContractInformationService {
|
||||||
|
|
||||||
|
String selectNameByIds(String ids);
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
import org.dromara.common.core.domain.vo.XzdCustomerSupplierVos;
|
||||||
|
|
||||||
|
public interface XzdCustomerSupplierService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询供应商-客户中间
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 供应商-客户中间
|
||||||
|
*/
|
||||||
|
XzdCustomerSupplierVos queryByIdone(Long id);
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdCustomerinformationService {
|
||||||
|
|
||||||
|
String selectNmaeByIds(String id);
|
||||||
|
|
||||||
|
String selectNmaeById(Long id);
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdJsCgJungonService {
|
||||||
|
|
||||||
|
String selectNameByIds(String ids);
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdProjectManagerApprovalService {
|
||||||
|
|
||||||
|
String selectNmaeByIds(String ids);
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdProjectService {
|
||||||
|
|
||||||
|
String selectNmaeByIds(String ids);
|
||||||
|
}
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdPurchaseContractInformationService {
|
||||||
|
String selectNameByIds(String ids);
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdSupplierInfoService {
|
||||||
|
|
||||||
|
String selectNmaeByIds(String ids);
|
||||||
|
|
||||||
|
String selectNmaeById(Long id);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
public interface XzdSupplierOpenBankService {
|
||||||
|
|
||||||
|
String selectNameByIds(String ids);
|
||||||
|
}
|
||||||
@ -7,7 +7,6 @@ import lombok.NoArgsConstructor;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -31,8 +30,10 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return CollUtil.newArrayList();
|
return CollUtil.newArrayList();
|
||||||
}
|
}
|
||||||
|
return collection.stream()
|
||||||
|
.filter(function)
|
||||||
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
|
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
|
||||||
return collection.stream().filter(function).collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,13 +41,26 @@ public class StreamUtils {
|
|||||||
*
|
*
|
||||||
* @param collection 需要查询的集合
|
* @param collection 需要查询的集合
|
||||||
* @param function 过滤方法
|
* @param function 过滤方法
|
||||||
* @return 找到符合条件的第一个元素,没有则返回null
|
* @return 找到符合条件的第一个元素,没有则返回 Optional.empty()
|
||||||
*/
|
*/
|
||||||
public static <E> E findFirst(Collection<E> collection, Predicate<E> function) {
|
public static <E> Optional<E> findFirst(Collection<E> collection, Predicate<E> function) {
|
||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return null;
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
return collection.stream().filter(function).findFirst().orElse(null);
|
return collection.stream()
|
||||||
|
.filter(function)
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找到流中满足条件的第一个元素值
|
||||||
|
*
|
||||||
|
* @param collection 需要查询的集合
|
||||||
|
* @param function 过滤方法
|
||||||
|
* @return 找到符合条件的第一个元素,没有则返回 null
|
||||||
|
*/
|
||||||
|
public static <E> E findFirstValue(Collection<E> collection, Predicate<E> function) {
|
||||||
|
return findFirst(collection,function).orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,13 +68,26 @@ public class StreamUtils {
|
|||||||
*
|
*
|
||||||
* @param collection 需要查询的集合
|
* @param collection 需要查询的集合
|
||||||
* @param function 过滤方法
|
* @param function 过滤方法
|
||||||
* @return 找到符合条件的任意一个元素,没有则返回null
|
* @return 找到符合条件的任意一个元素,没有则返回 Optional.empty()
|
||||||
*/
|
*/
|
||||||
public static <E> Optional<E> findAny(Collection<E> collection, Predicate<E> function) {
|
public static <E> Optional<E> findAny(Collection<E> collection, Predicate<E> function) {
|
||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
return collection.stream().filter(function).findAny();
|
return collection.stream()
|
||||||
|
.filter(function)
|
||||||
|
.findAny();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 找到流中任意一个满足条件的元素值
|
||||||
|
*
|
||||||
|
* @param collection 需要查询的集合
|
||||||
|
* @param function 过滤方法
|
||||||
|
* @return 找到符合条件的任意一个元素,没有则返回null
|
||||||
|
*/
|
||||||
|
public static <E> E findAnyValue(Collection<E> collection, Predicate<E> function) {
|
||||||
|
return findAny(collection,function).orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,7 +113,10 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return StringUtils.EMPTY;
|
return StringUtils.EMPTY;
|
||||||
}
|
}
|
||||||
return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter));
|
return collection.stream()
|
||||||
|
.map(function)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.joining(delimiter));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -100,8 +130,11 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return CollUtil.newArrayList();
|
return CollUtil.newArrayList();
|
||||||
}
|
}
|
||||||
|
return collection.stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.sorted(comparing)
|
||||||
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
|
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
|
||||||
return collection.stream().filter(Objects::nonNull).sorted(comparing).collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -118,7 +151,9 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return MapUtil.newHashMap();
|
return MapUtil.newHashMap();
|
||||||
}
|
}
|
||||||
return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));
|
return collection.stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -137,7 +172,25 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return MapUtil.newHashMap();
|
return MapUtil.newHashMap();
|
||||||
}
|
}
|
||||||
return collection.stream().filter(Objects::nonNull).collect(Collectors.toMap(key, value, (l, r) -> l));
|
return collection.stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toMap(key, value, (l, r) -> l));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 map 中的数据作为新 Map 的 value ,key 不变
|
||||||
|
* @param map 需要处理的map
|
||||||
|
* @param take 取值函数
|
||||||
|
* @param <K> map中的key类型
|
||||||
|
* @param <E> map中的value类型
|
||||||
|
* @param <V> 新map中的value类型
|
||||||
|
* @return 新的map
|
||||||
|
*/
|
||||||
|
public static <K, E, V> Map<K, V> toMap(Map<K, E> map, BiFunction<K, E, V> take) {
|
||||||
|
if (CollUtil.isEmpty(map)) {
|
||||||
|
return MapUtil.newHashMap();
|
||||||
|
}
|
||||||
|
return toMap(map.entrySet(), Map.Entry::getKey, entry -> take.apply(entry.getKey(), entry.getValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -154,8 +207,8 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return MapUtil.newHashMap();
|
return MapUtil.newHashMap();
|
||||||
}
|
}
|
||||||
return collection
|
return collection.stream()
|
||||||
.stream().filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList()));
|
.collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,8 +228,8 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return MapUtil.newHashMap();
|
return MapUtil.newHashMap();
|
||||||
}
|
}
|
||||||
return collection
|
return collection.stream()
|
||||||
.stream().filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList())));
|
.collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList())));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,11 +246,11 @@ public class StreamUtils {
|
|||||||
* @return 分类后的map
|
* @return 分类后的map
|
||||||
*/
|
*/
|
||||||
public static <E, T, U> Map<T, Map<U, E>> group2Map(Collection<E> collection, Function<E, T> key1, Function<E, U> key2) {
|
public static <E, T, U> Map<T, Map<U, E>> group2Map(Collection<E> collection, Function<E, T> key1, Function<E, U> key2) {
|
||||||
if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return MapUtil.newHashMap();
|
return MapUtil.newHashMap();
|
||||||
}
|
}
|
||||||
return collection
|
return collection.stream()
|
||||||
.stream().filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l)));
|
.collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,8 +268,7 @@ public class StreamUtils {
|
|||||||
if (CollUtil.isEmpty(collection)) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return CollUtil.newArrayList();
|
return CollUtil.newArrayList();
|
||||||
}
|
}
|
||||||
return collection
|
return collection.stream()
|
||||||
.stream()
|
|
||||||
.map(function)
|
.map(function)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
|
// 注意此处不要使用 .toList() 新语法 因为返回的是不可变List 会导致序列化问题
|
||||||
@ -234,11 +286,10 @@ public class StreamUtils {
|
|||||||
* @return 转化后的Set
|
* @return 转化后的Set
|
||||||
*/
|
*/
|
||||||
public static <E, T> Set<T> toSet(Collection<E> collection, Function<E, T> function) {
|
public static <E, T> Set<T> toSet(Collection<E> collection, Function<E, T> function) {
|
||||||
if (CollUtil.isEmpty(collection) || function == null) {
|
if (CollUtil.isEmpty(collection)) {
|
||||||
return CollUtil.newHashSet();
|
return CollUtil.newHashSet();
|
||||||
}
|
}
|
||||||
return collection
|
return collection.stream()
|
||||||
.stream()
|
|
||||||
.map(function)
|
.map(function)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
@ -258,26 +309,20 @@ public class StreamUtils {
|
|||||||
* @return 合并后的map
|
* @return 合并后的map
|
||||||
*/
|
*/
|
||||||
public static <K, X, Y, V> Map<K, V> merge(Map<K, X> map1, Map<K, Y> map2, BiFunction<X, Y, V> merge) {
|
public static <K, X, Y, V> Map<K, V> merge(Map<K, X> map1, Map<K, Y> map2, BiFunction<X, Y, V> merge) {
|
||||||
if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) {
|
if (CollUtil.isEmpty(map1) && CollUtil.isEmpty(map2)) {
|
||||||
|
// 如果两个 map 都为空,则直接返回空的 map
|
||||||
return MapUtil.newHashMap();
|
return MapUtil.newHashMap();
|
||||||
} else if (MapUtil.isEmpty(map1)) {
|
} else if (CollUtil.isEmpty(map1)) {
|
||||||
map1 = MapUtil.newHashMap();
|
// 如果 map1 为空,则直接处理返回 map2
|
||||||
} else if (MapUtil.isEmpty(map2)) {
|
return toMap(map2.entrySet(), Map.Entry::getKey, entry -> merge.apply(null, entry.getValue()));
|
||||||
map2 = MapUtil.newHashMap();
|
} else if (CollUtil.isEmpty(map2)) {
|
||||||
|
// 如果 map2 为空,则直接处理返回 map1
|
||||||
|
return toMap(map1.entrySet(), Map.Entry::getKey, entry -> merge.apply(entry.getValue(), null));
|
||||||
}
|
}
|
||||||
Set<K> key = new HashSet<>();
|
Set<K> keySet = new HashSet<>();
|
||||||
key.addAll(map1.keySet());
|
keySet.addAll(map1.keySet());
|
||||||
key.addAll(map2.keySet());
|
keySet.addAll(map2.keySet());
|
||||||
Map<K, V> map = new HashMap<>();
|
return toMap(keySet, key -> key, key -> merge.apply(map1.get(key), map2.get(key)));
|
||||||
for (K t : key) {
|
|
||||||
X x = map1.get(t);
|
|
||||||
Y y = map2.get(t);
|
|
||||||
V z = merge.apply(x, y);
|
|
||||||
if (z != null) {
|
|
||||||
map.put(t, z);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -351,4 +351,14 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
|
|||||||
return noSpaces.matches("\\d+");
|
return noSpaces.matches("\\d+");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将可迭代对象中的元素使用逗号拼接成字符串
|
||||||
|
*
|
||||||
|
* @param iterable 可迭代对象,如 List、Set 等
|
||||||
|
* @return 拼接后的字符串
|
||||||
|
*/
|
||||||
|
public static String joinComma(Iterable<?> iterable) {
|
||||||
|
return StringUtils.join(iterable, SEPARATOR);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,7 +44,17 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.xiaoymin</groupId>
|
<groupId>com.github.xiaoymin</groupId>
|
||||||
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
|
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
|
||||||
<version>4.4.0</version>
|
<version>4.5.0</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springdoc</groupId>
|
||||||
|
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springdoc</groupId>
|
||||||
|
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package org.dromara.common.doc.config;
|
package org.dromara.common.doc.config;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.models.Components;
|
||||||
import io.swagger.v3.oas.models.OpenAPI;
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.oas.models.Operation;
|
||||||
import io.swagger.v3.oas.models.Paths;
|
import io.swagger.v3.oas.models.Paths;
|
||||||
import io.swagger.v3.oas.models.info.Info;
|
import io.swagger.v3.oas.models.info.Info;
|
||||||
import io.swagger.v3.oas.models.security.SecurityRequirement;
|
import io.swagger.v3.oas.models.security.SecurityRequirement;
|
||||||
@ -9,6 +11,7 @@ import org.dromara.common.core.utils.StringUtils;
|
|||||||
import org.dromara.common.doc.config.properties.SpringDocProperties;
|
import org.dromara.common.doc.config.properties.SpringDocProperties;
|
||||||
import org.dromara.common.doc.handler.OpenApiHandler;
|
import org.dromara.common.doc.handler.OpenApiHandler;
|
||||||
import org.springdoc.core.configuration.SpringDocConfiguration;
|
import org.springdoc.core.configuration.SpringDocConfiguration;
|
||||||
|
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
|
||||||
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
|
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
|
||||||
import org.springdoc.core.customizers.OpenApiCustomizer;
|
import org.springdoc.core.customizers.OpenApiCustomizer;
|
||||||
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
|
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
|
||||||
@ -23,6 +26,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|||||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -61,7 +65,6 @@ public class SpringDocConfig {
|
|||||||
keySet.forEach(securityRequirement::addList);
|
keySet.forEach(securityRequirement::addList);
|
||||||
list.add(securityRequirement);
|
list.add(securityRequirement);
|
||||||
openApi.security(list);
|
openApi.security(list);
|
||||||
|
|
||||||
return openApi;
|
return openApi;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,6 +110,15 @@ public class SpringDocConfig {
|
|||||||
}
|
}
|
||||||
PlusPaths newPaths = new PlusPaths();
|
PlusPaths newPaths = new PlusPaths();
|
||||||
oldPaths.forEach((k, v) -> newPaths.addPathItem(finalContextPath + k, v));
|
oldPaths.forEach((k, v) -> newPaths.addPathItem(finalContextPath + k, v));
|
||||||
|
newPaths.forEach((s, pathItem) -> {
|
||||||
|
// 为所有接口添加鉴权
|
||||||
|
pathItem.readOperations().forEach(operation -> {
|
||||||
|
operation.addSecurityItem(new SecurityRequirement()
|
||||||
|
.addList(HttpHeaders.AUTHORIZATION)
|
||||||
|
.addList("Clientid")
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
openApi.setPaths(newPaths);
|
openApi.setPaths(newPaths);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -123,4 +135,26 @@ public class SpringDocConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {
|
||||||
|
return openApi -> {
|
||||||
|
// 全局添加鉴权参数
|
||||||
|
if(openApi.getPaths()!=null){
|
||||||
|
openApi.getPaths().forEach((s, pathItem) -> {
|
||||||
|
// 为所有接口添加鉴权
|
||||||
|
List<Operation> operations = pathItem.readOperations();
|
||||||
|
operations.forEach(operation -> {
|
||||||
|
operation.addSecurityItem(new SecurityRequirement()
|
||||||
|
.addList(HttpHeaders.AUTHORIZATION)
|
||||||
|
.addList("Clientid")
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
package org.dromara.common.excel.handler;
|
||||||
|
|
||||||
|
import com.alibaba.excel.write.handler.CellWriteHandler;
|
||||||
|
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class LockColumnHandler implements CellWriteHandler {
|
||||||
|
|
||||||
|
private final Set<Integer> lockColumns;
|
||||||
|
|
||||||
|
public LockColumnHandler(Collection<Integer> lockColumns) {
|
||||||
|
this.lockColumns = new HashSet<>(lockColumns);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterCellDispose(CellWriteHandlerContext context) {
|
||||||
|
Cell cell = context.getCell();
|
||||||
|
if (cell == null) return;
|
||||||
|
|
||||||
|
Workbook workbook = cell.getSheet().getWorkbook();
|
||||||
|
|
||||||
|
// 必须为所有单元格创建一个新的 CellStyle
|
||||||
|
CellStyle style = workbook.createCellStyle();
|
||||||
|
|
||||||
|
// 锁定指定列
|
||||||
|
if (lockColumns.contains(cell.getColumnIndex())) {
|
||||||
|
style.setLocked(true);
|
||||||
|
} else {
|
||||||
|
style.setLocked(false); // 非锁定列必须明确设置为 false!
|
||||||
|
}
|
||||||
|
|
||||||
|
cell.setCellStyle(style);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package org.dromara.common.excel.handler;
|
||||||
|
|
||||||
|
import com.alibaba.excel.write.handler.SheetWriteHandler;
|
||||||
|
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||||
|
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-14 15:05
|
||||||
|
*/
|
||||||
|
public class SheetProtectHandler implements SheetWriteHandler {
|
||||||
|
|
||||||
|
private final String password;
|
||||||
|
|
||||||
|
public SheetProtectHandler(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder,
|
||||||
|
WriteSheetHolder writeSheetHolder) {
|
||||||
|
Sheet sheet = writeSheetHolder.getSheet();
|
||||||
|
sheet.protectSheet(password); // 可为空字符串
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,7 +4,10 @@ import cn.hutool.core.collection.CollUtil;
|
|||||||
import cn.hutool.core.io.resource.ClassPathResource;
|
import cn.hutool.core.io.resource.ClassPathResource;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import com.alibaba.excel.EasyExcel;
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import com.alibaba.excel.ExcelReader;
|
||||||
import com.alibaba.excel.ExcelWriter;
|
import com.alibaba.excel.ExcelWriter;
|
||||||
|
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
|
||||||
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
||||||
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
|
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
|
||||||
import com.alibaba.excel.write.metadata.WriteSheet;
|
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||||
import com.alibaba.excel.write.metadata.fill.FillConfig;
|
import com.alibaba.excel.write.metadata.fill.FillConfig;
|
||||||
@ -14,27 +17,27 @@ import jakarta.servlet.ServletOutputStream;
|
|||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.core.utils.file.FileUtils;
|
import org.dromara.common.core.utils.file.FileUtils;
|
||||||
import org.dromara.common.excel.convert.ExcelBigNumberConvert;
|
import org.dromara.common.excel.convert.ExcelBigNumberConvert;
|
||||||
import org.dromara.common.excel.core.*;
|
import org.dromara.common.excel.core.*;
|
||||||
import org.dromara.common.excel.handler.DataWriteHandler;
|
import org.dromara.common.excel.handler.DataWriteHandler;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.dromara.common.excel.handler.LockColumnHandler;
|
||||||
|
import org.dromara.common.excel.handler.SheetProtectHandler;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Excel相关处理
|
* Excel相关处理
|
||||||
*
|
*
|
||||||
* @author Lion Li
|
* @author Lion Li
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
public class ExcelUtil {
|
public class ExcelUtil {
|
||||||
|
|
||||||
@ -48,6 +51,41 @@ public class ExcelUtil {
|
|||||||
return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();
|
return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步读取 Excel(支持读取多个 Sheet)
|
||||||
|
*
|
||||||
|
* @param is 输入流(一次性读取)
|
||||||
|
* @param clazz Excel 映射实体类
|
||||||
|
* @return 所有 Sheet 的数据汇总
|
||||||
|
*/
|
||||||
|
public static <T> List<T> importExcelAllSheet(InputStream is, Class<T> clazz) {
|
||||||
|
// 用于存放所有 sheet 的数据
|
||||||
|
List<T> allData = new ArrayList<>();
|
||||||
|
// 1. 构建 ExcelReader
|
||||||
|
ExcelReaderBuilder readerBuilder = EasyExcel.read(is);
|
||||||
|
ExcelReader reader = readerBuilder.build();
|
||||||
|
// 2. 获取 Excel 中全部 Sheet 信息(包含 SheetNo、页名等)
|
||||||
|
List<ReadSheet> readSheets = reader.excelExecutor().sheetList();
|
||||||
|
// 3. 遍历每一个 Sheet
|
||||||
|
for (ReadSheet sheet : readSheets) {
|
||||||
|
// 为每个 Sheet 创建独立监听器,用于接收读取结果
|
||||||
|
DefaultExcelListener<T> listener = new DefaultExcelListener<>(false);
|
||||||
|
// 4. 构建当前 Sheet 的读取器 使用 sheet.getSheetNo() 指定当前 sheet
|
||||||
|
ReadSheet readSheet = EasyExcel.readSheet(sheet.getSheetNo())
|
||||||
|
// 设置头映射实体类
|
||||||
|
.head(clazz)
|
||||||
|
// 注册读取监听器
|
||||||
|
.registerReadListener(listener)
|
||||||
|
.build();
|
||||||
|
// 5. 开始读取当前 Sheet
|
||||||
|
reader.read(readSheet);
|
||||||
|
// 6. 收集当前 Sheet 读取的数据
|
||||||
|
allData.addAll(listener.getExcelResult().getList());
|
||||||
|
}
|
||||||
|
// 7. 关闭读取器,释放资源
|
||||||
|
reader.finish();
|
||||||
|
return allData;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用校验监听器 异步导入 同步返回
|
* 使用校验监听器 异步导入 同步返回
|
||||||
@ -205,6 +243,37 @@ public class ExcelUtil {
|
|||||||
builder.doWrite(list);
|
builder.doWrite(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出excel
|
||||||
|
*
|
||||||
|
* @param list 导出数据集合
|
||||||
|
* @param sheetName 工作表的名称
|
||||||
|
* @param clazz 实体类
|
||||||
|
* @param lockColumns 锁定列
|
||||||
|
* @param merge 是否合并单元格
|
||||||
|
* @param os 输出流
|
||||||
|
*/
|
||||||
|
public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, List<Integer> lockColumns,
|
||||||
|
boolean merge, OutputStream os, List<DropDownOptions> options) {
|
||||||
|
ExcelWriterSheetBuilder builder = EasyExcel.write(os, clazz)
|
||||||
|
.registerWriteHandler(new LockColumnHandler(lockColumns)) // 锁定第3列
|
||||||
|
.registerWriteHandler(new SheetProtectHandler("dawdawdwad")) // 保护整张 sheet
|
||||||
|
.autoCloseStream(false)
|
||||||
|
// 自动适配
|
||||||
|
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
||||||
|
// 大数值自动转换 防止失真
|
||||||
|
.registerConverter(new ExcelBigNumberConvert())
|
||||||
|
.registerWriteHandler(new DataWriteHandler(clazz))
|
||||||
|
.sheet(sheetName);
|
||||||
|
if (merge) {
|
||||||
|
// 合并处理器
|
||||||
|
builder.registerWriteHandler(new CellMergeStrategy(list, true));
|
||||||
|
}
|
||||||
|
// 添加下拉框操作
|
||||||
|
builder.registerWriteHandler(new ExcelDownHandler(options));
|
||||||
|
builder.doWrite(list);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出多sheet excel(增强版,解决XML安全问题)
|
* 导出多sheet excel(增强版,解决XML安全问题)
|
||||||
*
|
*
|
||||||
@ -213,7 +282,9 @@ public class ExcelUtil {
|
|||||||
* @param clazz 实体类
|
* @param clazz 实体类
|
||||||
* @param optionsList 级联下拉选内容列表
|
* @param optionsList 级联下拉选内容列表
|
||||||
*/
|
*/
|
||||||
public static <T> void exportMultiSheetExcelEnhanced(List<List<T>> sheetData, List<String> sheetNames, Class<T> clazz, List<List<DropDownOptions>> optionsList,HttpServletResponse response) throws IOException {
|
public static <T> void exportMultiSheetExcelEnhanced(List<List<T>> sheetData, List<String> sheetNames,
|
||||||
|
Class<T> clazz, List<List<DropDownOptions>> optionsList,
|
||||||
|
HttpServletResponse response) throws IOException {
|
||||||
resetResponse("file", response);
|
resetResponse("file", response);
|
||||||
ExcelWriter excelWriter = null;
|
ExcelWriter excelWriter = null;
|
||||||
ServletOutputStream os = response.getOutputStream();
|
ServletOutputStream os = response.getOutputStream();
|
||||||
@ -224,6 +295,9 @@ public class ExcelUtil {
|
|||||||
.head(clazz)
|
.head(clazz)
|
||||||
.autoCloseStream(false)
|
.autoCloseStream(false)
|
||||||
.registerConverter(new ExcelBigNumberConvert())
|
.registerConverter(new ExcelBigNumberConvert())
|
||||||
|
// 自动适配
|
||||||
|
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
||||||
|
.registerWriteHandler(new DataWriteHandler(clazz))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
@ -252,12 +326,71 @@ public class ExcelUtil {
|
|||||||
excelWriter.finish();
|
excelWriter.finish();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 记录日志但不中断主流程
|
// 记录日志但不中断主流程
|
||||||
e.printStackTrace();
|
log.error("Excel 导出错误", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出多sheet excel(增强版,解决XML安全问题)
|
||||||
|
*
|
||||||
|
* @param sheetData 多个sheet的数据
|
||||||
|
* @param sheetNames 多个sheet的名称
|
||||||
|
* @param clazz 实体类
|
||||||
|
* @param optionsList 级联下拉选内容列表
|
||||||
|
*/
|
||||||
|
public static <T> void exportExcel(List<List<T>> sheetData, List<String> sheetNames, List<Integer> lockColumns,
|
||||||
|
Class<T> clazz, List<List<DropDownOptions>> optionsList,
|
||||||
|
HttpServletResponse response) throws IOException {
|
||||||
|
resetResponse("file", response);
|
||||||
|
ExcelWriter excelWriter = null;
|
||||||
|
ServletOutputStream os = response.getOutputStream();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 使用SXSSFWorkbook避免内存问题,并减少XML处理复杂度
|
||||||
|
excelWriter = EasyExcel.write(os)
|
||||||
|
.head(clazz)
|
||||||
|
.registerWriteHandler(new LockColumnHandler(lockColumns)) // 锁定第3列
|
||||||
|
// .registerWriteHandler(new SheetProtectHandler("dawdawdwad")) // 保护整张 sheet
|
||||||
|
.autoCloseStream(false)
|
||||||
|
.registerConverter(new ExcelBigNumberConvert())
|
||||||
|
// 自动适配
|
||||||
|
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
||||||
|
.registerWriteHandler(new DataWriteHandler(clazz))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
// 为每个sheet写入数据
|
||||||
|
for (int i = 0; i < sheetData.size(); i++) {
|
||||||
|
// 创建基本sheet配置
|
||||||
|
WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetNames.get(i))
|
||||||
|
.head(clazz)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// 添加下拉选项(如果存在)
|
||||||
|
if (optionsList != null && optionsList.size() > i && optionsList.get(i) != null) {
|
||||||
|
ExcelDownHandler handler = new ExcelDownHandler(optionsList.get(i));
|
||||||
|
writeSheet.setCustomWriteHandlerList(
|
||||||
|
Collections.singletonList(handler));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入数据
|
||||||
|
excelWriter.write(sheetData.get(i), writeSheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
// 确保资源正确释放
|
||||||
|
if (excelWriter != null) {
|
||||||
|
try {
|
||||||
|
excelWriter.finish();
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 记录日志但不中断主流程
|
||||||
|
log.error("Excel 导出错误", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 单表多数据模板导出 模板格式为 {.属性}
|
* 单表多数据模板导出 模板格式为 {.属性}
|
||||||
@ -493,6 +626,4 @@ public class ExcelUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import cn.hutool.core.map.MapUtil;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.sse.dto.SseMessageDto;
|
import org.dromara.common.sse.dto.SseMessageDto;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -22,7 +23,14 @@ public class SseEmitterManager {
|
|||||||
/**
|
/**
|
||||||
* 订阅的频道
|
* 订阅的频道
|
||||||
*/
|
*/
|
||||||
private final static String SSE_TOPIC = "global:sse";
|
// private final static String SSE_TOPIC = "global:sse";
|
||||||
|
|
||||||
|
private static String SSE_TOPIC;
|
||||||
|
|
||||||
|
@Value("${spring.data.redis.database:0}")
|
||||||
|
public void setDatabase(int database) {
|
||||||
|
SSE_TOPIC = "global:sse:db" + database;
|
||||||
|
}
|
||||||
|
|
||||||
private final static Map<Long, Map<String, SseEmitter>> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>();
|
private final static Map<Long, Map<String, SseEmitter>> USER_TOKEN_EMITTERS = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
|||||||
@ -37,4 +37,50 @@ public interface TransConstant {
|
|||||||
*/
|
*/
|
||||||
String PROJECT_ID_TO_NAME = "project_id_to_name";
|
String PROJECT_ID_TO_NAME = "project_id_to_name";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户id转名称
|
||||||
|
*/
|
||||||
|
String XZD_KHXX_ID_TO_NAME = "khxx_id_to_name";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新中大项目id转名称
|
||||||
|
*/
|
||||||
|
String XZD_PROJECT_ID_TO_NAME = "xzd_project_id_to_name";
|
||||||
|
/**
|
||||||
|
* 采购合同id转名称
|
||||||
|
*/
|
||||||
|
String XZD_PURCHASE_CONTRACT_ID_TO_NAME = "xzd_purchase_contract_id_to_name";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机械合同id转名称
|
||||||
|
*/
|
||||||
|
String XZD_PURCHASE_JXXIE_ID_TO_NAME = "xzd_purchase_contract_jixie_id_to_name";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 综合服务合同id转名称
|
||||||
|
*/
|
||||||
|
String XZD_CS_CONTRACT_INFORMATION_ID_TO_NAME = "xzd_cs_contract_information_id_to_name";
|
||||||
|
/**
|
||||||
|
* 结算-采购合同竣工结算id转名称
|
||||||
|
*/
|
||||||
|
String XZD_JS_CG_JUNGON_ID_TO_NAME = "xzd_js_cg_jungon_id_to_name";
|
||||||
|
/**
|
||||||
|
* 新中大供应商信息-开户银行id转银行名称
|
||||||
|
*/
|
||||||
|
String XZD_SUPPLIER_OPEN_BANK_ID_TO_NAME = "xzd_supplier_open_bank_id_to_name";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新中大-项目经理推荐及审批id转名称
|
||||||
|
*/
|
||||||
|
String XZD_PROJECT_MANAGER_APPROVAL_ID_TO_NAME = "xzd_project_manager_approval_id_to_name";
|
||||||
|
/**
|
||||||
|
* 新中大-立项及成本-成本预算-总体计划成本id转名称
|
||||||
|
*/
|
||||||
|
String XZD_CBYS_ZJHCB_ID_TO_NAME = "xzd_cbys_zjhcb_id_to_name";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,24 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdCbysZjhcbService;
|
||||||
|
import org.dromara.common.core.service.XzdProjectManagerApprovalService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_CBYS_ZJHCB_ID_TO_NAME)
|
||||||
|
public class XzdCbysZjhcbImpl implements TranslationInterface<String> {
|
||||||
|
private final XzdCbysZjhcbService xzdCbysZjhcbService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdCbysZjhcbService.selectNmaeByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdCbysZjhcbService.selectNmaeByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdCsContractInformationService;
|
||||||
|
import org.dromara.common.core.service.XzdPurchaseContractInformationService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_CS_CONTRACT_INFORMATION_ID_TO_NAME)
|
||||||
|
public class XzdCsContractInformationImpl implements TranslationInterface<String> {
|
||||||
|
|
||||||
|
private final XzdCsContractInformationService xzdCsContractInformationService;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdCsContractInformationService.selectNameByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdCsContractInformationService.selectNameByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdCustomerinformationService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_KHXX_ID_TO_NAME)
|
||||||
|
public class XzdCustomerinformationImpl implements TranslationInterface<String> {
|
||||||
|
|
||||||
|
private final XzdCustomerinformationService xzdCustomerinformationService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdCustomerinformationService.selectNmaeByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdCustomerinformationService.selectNmaeByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdContractMachineryService;
|
||||||
|
import org.dromara.common.core.service.XzdJsCgJungonService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_PURCHASE_JXXIE_ID_TO_NAME)
|
||||||
|
public class XzdJXHTTranslation implements TranslationInterface<String> {
|
||||||
|
|
||||||
|
private final XzdContractMachineryService xzdContractMachineryService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdContractMachineryService.selectNmaeByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdContractMachineryService.selectNmaeByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdJsCgJungonService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_JS_CG_JUNGON_ID_TO_NAME)
|
||||||
|
public class XzdJsCgJungonImpl implements TranslationInterface<String> {
|
||||||
|
|
||||||
|
private final XzdJsCgJungonService xzdJsCgJungonService;
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdJsCgJungonService.selectNameByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdJsCgJungonService.selectNameByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdProjectService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_PROJECT_ID_TO_NAME)
|
||||||
|
public class XzdProjectImpl implements TranslationInterface<String> {
|
||||||
|
private final XzdProjectService xzdProjectService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdProjectService.selectNmaeByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdProjectService.selectNmaeByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdProjectManagerApprovalService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_PROJECT_MANAGER_APPROVAL_ID_TO_NAME)
|
||||||
|
public class XzdProjectManagerApprovalImpl implements TranslationInterface<String> {
|
||||||
|
private final XzdProjectManagerApprovalService xzdProjectManagerApprovalService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdProjectManagerApprovalService.selectNmaeByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdProjectManagerApprovalService.selectNmaeByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
|
import org.dromara.common.core.service.XzdPurchaseContractInformationService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_PURCHASE_CONTRACT_ID_TO_NAME)
|
||||||
|
public class XzdPurchaseContractInformationImpl implements TranslationInterface<String> {
|
||||||
|
|
||||||
|
private final XzdPurchaseContractInformationService xzdCustomerinformationService;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdCustomerinformationService.selectNameByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdCustomerinformationService.selectNameByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package org.dromara.common.translation.core.impl;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.XzdSupplierOpenBankService;
|
||||||
|
import org.dromara.common.translation.annotation.TranslationType;
|
||||||
|
import org.dromara.common.translation.constant.TransConstant;
|
||||||
|
import org.dromara.common.translation.core.TranslationInterface;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@TranslationType(type = TransConstant.XZD_SUPPLIER_OPEN_BANK_ID_TO_NAME)
|
||||||
|
public class XzdSupplierOpenBankImpl implements TranslationInterface<String> {
|
||||||
|
|
||||||
|
private final XzdSupplierOpenBankService xzdSupplierOpenBankService;
|
||||||
|
@Override
|
||||||
|
public String translation(Object key, String other) {
|
||||||
|
if (key instanceof String ids) {
|
||||||
|
return xzdSupplierOpenBankService.selectNameByIds(ids);
|
||||||
|
} else if (key instanceof Long id) {
|
||||||
|
return xzdSupplierOpenBankService.selectNameByIds(id.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,3 +5,12 @@ org.dromara.common.translation.core.impl.OssUrlTranslationImpl
|
|||||||
org.dromara.common.translation.core.impl.UserNameTranslationImpl
|
org.dromara.common.translation.core.impl.UserNameTranslationImpl
|
||||||
org.dromara.common.translation.core.impl.NicknameTranslationImpl
|
org.dromara.common.translation.core.impl.NicknameTranslationImpl
|
||||||
org.dromara.common.translation.core.impl.ProjectNameTranslationImpl
|
org.dromara.common.translation.core.impl.ProjectNameTranslationImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdCustomerinformationImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdProjectImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdPurchaseContractInformationImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdJsCgJungonImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdCsContractInformationImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdSupplierOpenBankImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdProjectManagerApprovalImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdCbysZjhcbImpl
|
||||||
|
org.dromara.common.translation.core.impl.XzdJXHTTranslation
|
||||||
|
|||||||
@ -45,8 +45,7 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
|
|||||||
String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
|
String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
|
||||||
String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
|
String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
|
||||||
String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
|
String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
|
||||||
String projectIdStr = ServletUtils.getRequest().getParameter("projectId");
|
String projectIdStr = ServletUtils.getRequest().getParameter(LoginHelper.PROJECT_KEY);
|
||||||
Long projectId = Long.parseLong(projectIdStr);
|
|
||||||
if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
|
if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
|
||||||
// token 无效
|
// token 无效
|
||||||
throw NotLoginException.newInstance(StpUtil.getLoginType(),
|
throw NotLoginException.newInstance(StpUtil.getLoginType(),
|
||||||
@ -55,7 +54,10 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
attributes.put(LOGIN_USER_KEY, loginUser);
|
attributes.put(LOGIN_USER_KEY, loginUser);
|
||||||
|
if (projectIdStr != null && !projectIdStr.isEmpty()) {
|
||||||
|
Long projectId = Long.parseLong(projectIdStr);
|
||||||
attributes.put(PROJECT_ID,projectId);
|
attributes.put(PROJECT_ID,projectId);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (NotLoginException e) {
|
} catch (NotLoginException e) {
|
||||||
log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage());
|
log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage());
|
||||||
|
|||||||
@ -15,16 +15,53 @@
|
|||||||
system系统模块
|
system系统模块
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.cloud.ai</groupId>
|
||||||
|
<artifactId>spring-ai-alibaba-bom</artifactId>
|
||||||
|
<version>1.0.0.2</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- TwelveMonkeys ImageIO 扩展 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||||
|
<artifactId>imageio-core</artifactId>
|
||||||
|
<version>3.12.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||||
|
<artifactId>imageio-webp</artifactId>
|
||||||
|
<version>3.12.0</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.sejda.imageio/webp-imageio -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.sejda.imageio</groupId>
|
||||||
|
<artifactId>webp-imageio</artifactId>
|
||||||
|
<version>0.1.6</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.cloud.ai</groupId>
|
||||||
|
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.esotericsoftware</groupId>
|
||||||
|
<artifactId>kryo</artifactId>
|
||||||
|
<version>5.6.2</version>
|
||||||
|
</dependency>
|
||||||
<!-- Java WebSocket 标准API -->
|
<!-- Java WebSocket 标准API -->
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>javax.websocket</groupId>-->
|
<!-- <groupId>javax.websocket</groupId>-->
|
||||||
<!-- <artifactId>javax.websocket-api</artifactId>-->
|
<!-- <artifactId>javax.websocket-api</artifactId>-->
|
||||||
<!-- <version>1.1</version>-->
|
<!-- <version>1.1</version>-->
|
||||||
<!-- <scope>provided</scope>-->
|
<!-- <scope>provided</scope>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
@ -36,18 +73,18 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>com.drewnoakes</groupId>-->
|
<!-- <groupId>com.drewnoakes</groupId>-->
|
||||||
<!-- <artifactId>metadata-extractor</artifactId>-->
|
<!-- <artifactId>metadata-extractor</artifactId>-->
|
||||||
<!-- <version>2.18.0</version>-->
|
<!-- <version>2.18.0</version>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
|
|
||||||
|
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>technology.tabula</groupId>-->
|
<!-- <groupId>technology.tabula</groupId>-->
|
||||||
<!-- <artifactId>tabula</artifactId>-->
|
<!-- <artifactId>tabula</artifactId>-->
|
||||||
<!-- <version>1.0.4</version>-->
|
<!-- <version>1.0.4</version>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
|
|
||||||
|
|
||||||
<!-- JSON解析(FastJSON) -->
|
<!-- JSON解析(FastJSON) -->
|
||||||
@ -119,19 +156,18 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- 支持中文字体 -->
|
<!-- 支持中文字体 -->
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>com.itextpdf</groupId>-->
|
<!-- <groupId>com.itextpdf</groupId>-->
|
||||||
<!-- <artifactId>itext-asian</artifactId>-->
|
<!-- <artifactId>itext-asian</artifactId>-->
|
||||||
<!-- <version>5.2.0</version>-->
|
<!-- <version>5.2.0</version>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
<!-- <!– iText –>-->
|
<!-- <!– iText –>-->
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>com.itextpdf</groupId>-->
|
<!-- <groupId>com.itextpdf</groupId>-->
|
||||||
<!-- <artifactId>itextpdf</artifactId>-->
|
<!-- <artifactId>itextpdf</artifactId>-->
|
||||||
<!-- <version>5.5.13.3</version>-->
|
<!-- <version>5.5.13.3</version>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
<!-- ZXing -->
|
<!-- ZXing -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.zxing</groupId>
|
<groupId>com.google.zxing</groupId>
|
||||||
@ -280,6 +316,13 @@
|
|||||||
<artifactId>netty-all</artifactId>
|
<artifactId>netty-all</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>1.15</version> <!-- 最新版本可自行调整 -->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -0,0 +1,61 @@
|
|||||||
|
package org.dromara.ai.advisor;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.ai.chat.client.ChatClientMessageAggregator;
|
||||||
|
import org.springframework.ai.chat.client.ChatClientRequest;
|
||||||
|
import org.springframework.ai.chat.client.ChatClientResponse;
|
||||||
|
import org.springframework.ai.chat.client.advisor.api.CallAdvisor;
|
||||||
|
import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain;
|
||||||
|
import org.springframework.ai.chat.client.advisor.api.StreamAdvisor;
|
||||||
|
import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain;
|
||||||
|
import reactor.core.publisher.Flux;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义日志拦截器
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04 10:15
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class CustomLoggerAdvisor implements CallAdvisor, StreamAdvisor {
|
||||||
|
|
||||||
|
private void before(ChatClientRequest request) {
|
||||||
|
log.info("AI 请求参数:{}", request.prompt());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void observeAfter(ChatClientResponse response) {
|
||||||
|
if (response.chatResponse() != null) {
|
||||||
|
log.info("AI 响应结果:{}", response.chatResponse().getResult().getOutput().getText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {
|
||||||
|
before(chatClientRequest);
|
||||||
|
ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest);
|
||||||
|
observeAfter(chatClientResponse);
|
||||||
|
return chatClientResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {
|
||||||
|
before(chatClientRequest);
|
||||||
|
Flux<ChatClientResponse> chatClientResponseFlux = streamAdvisorChain.nextStream(chatClientRequest);
|
||||||
|
return (new ChatClientMessageAggregator()).aggregateChatClientResponse(chatClientResponseFlux, this::observeAfter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the name of the advisor.
|
||||||
|
*
|
||||||
|
* @return the advisor name.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return this.getClass().getSimpleName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getOrder() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
package org.dromara.ai.chat;
|
||||||
|
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.ai.advisor.CustomLoggerAdvisor;
|
||||||
|
import org.dromara.ai.chatmemory.FileBasedChatMemory;
|
||||||
|
import org.dromara.ai.domain.AIChatMemory;
|
||||||
|
import org.dromara.ai.service.IAIChatMemoryService;
|
||||||
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
|
import org.springframework.ai.chat.client.ChatClient;
|
||||||
|
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
|
||||||
|
import org.springframework.ai.chat.memory.ChatMemory;
|
||||||
|
import org.springframework.ai.chat.model.ChatModel;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import reactor.core.publisher.Flux;
|
||||||
|
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04 09:34
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class DashScopeChat {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SimpleChat simpleChat;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IAIChatMemoryService chatMemoryService;
|
||||||
|
|
||||||
|
private final ChatClient chatClient;
|
||||||
|
|
||||||
|
private static final String DEFAULT_PROMPT = "你叫煤球,是一个博学的智能聊天助手,请根据用户提问回答!";
|
||||||
|
|
||||||
|
private static final String DEFAULT_FILE_DIR = System.getProperty("user.dir") + "/chat-memory";
|
||||||
|
|
||||||
|
public DashScopeChat(ChatModel dashScopeChatModel) {
|
||||||
|
// 初始化基于文件的对话记忆
|
||||||
|
ChatMemory chatMemory = new FileBasedChatMemory(DEFAULT_FILE_DIR);
|
||||||
|
chatClient = ChatClient.builder(dashScopeChatModel)
|
||||||
|
.defaultSystem(DEFAULT_PROMPT)
|
||||||
|
.defaultAdvisors(
|
||||||
|
MessageChatMemoryAdvisor.builder(chatMemory).build(),
|
||||||
|
// 自定义日志输出
|
||||||
|
new CustomLoggerAdvisor()
|
||||||
|
).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话,流式输出
|
||||||
|
*
|
||||||
|
* @param message 用户输入
|
||||||
|
* @param chatId 会话id
|
||||||
|
* @return 流式输出结果
|
||||||
|
*/
|
||||||
|
public Flux<String> doChatStream(String message, String chatId, Boolean isFirst) {
|
||||||
|
Long userId = LoginHelper.getUserId();
|
||||||
|
return chatClient
|
||||||
|
.prompt()
|
||||||
|
.user(message)
|
||||||
|
.advisors(spec -> spec.param(ChatMemory.CONVERSATION_ID, chatId))
|
||||||
|
.stream()
|
||||||
|
.content()// 收集所有 token,生成完整回复
|
||||||
|
.collectList()
|
||||||
|
.flatMapMany(tokens -> {
|
||||||
|
String aiResponse = String.join("", tokens);
|
||||||
|
if (isFirst) {
|
||||||
|
// 异步生成标题
|
||||||
|
generateChatTitleAsync(chatId, message, aiResponse, userId);
|
||||||
|
}
|
||||||
|
// 返回完整的流结果
|
||||||
|
return Flux.fromIterable(tokens);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步生成标题
|
||||||
|
*
|
||||||
|
* @param chatId 会话id
|
||||||
|
* @param userMessage 用户输入
|
||||||
|
* @param aiResponse AI回复
|
||||||
|
* @param userId 用户id
|
||||||
|
*/
|
||||||
|
private void generateChatTitleAsync(String chatId, String userMessage, String aiResponse, Long userId) {
|
||||||
|
CompletableFuture.runAsync(() -> {
|
||||||
|
try {
|
||||||
|
// 先判断一下当前聊天是否存在
|
||||||
|
Long count = chatMemoryService.lambdaQuery()
|
||||||
|
.eq(AIChatMemory::getUserId, userId)
|
||||||
|
.eq(AIChatMemory::getFileName, chatId)
|
||||||
|
.count();
|
||||||
|
if (count > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 构建生成标题的提示词
|
||||||
|
String prompt = String.format("""
|
||||||
|
请以陈述句的形式总结下面这段用户与AI的对话生成一个简短的标题(不超过10个字):
|
||||||
|
用户:%s
|
||||||
|
AI:%s
|
||||||
|
""", userMessage, aiResponse);
|
||||||
|
String title = simpleChat.doChat(prompt);
|
||||||
|
log.info("用户:{} 生成标题成功:{} -> {}", userId, chatId, title);
|
||||||
|
// 保存对话数据
|
||||||
|
AIChatMemory memory = new AIChatMemory();
|
||||||
|
memory.setUserId(userId);
|
||||||
|
memory.setFileName(chatId);
|
||||||
|
memory.setFirstQuestion(title);
|
||||||
|
chatMemoryService.save(memory);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("生成标题失败", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package org.dromara.ai.chat;
|
||||||
|
|
||||||
|
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
|
||||||
|
import org.springframework.ai.chat.client.ChatClient;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04 15:26
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SimpleChat {
|
||||||
|
|
||||||
|
private final ChatClient dashScopeChatClient;
|
||||||
|
|
||||||
|
public SimpleChat(ChatClient.Builder chatClientBuilder) {
|
||||||
|
this.dashScopeChatClient = chatClientBuilder
|
||||||
|
// 设置 ChatClient 中 ChatModel 的 Options 参数
|
||||||
|
.defaultOptions(
|
||||||
|
DashScopeChatOptions.builder()
|
||||||
|
.withTopP(0.7)
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话
|
||||||
|
*
|
||||||
|
* @param message 用户输入
|
||||||
|
* @return 响应结果
|
||||||
|
*/
|
||||||
|
public String doChat(String message) {
|
||||||
|
return dashScopeChatClient.prompt(message).call().content();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,89 @@
|
|||||||
|
package org.dromara.ai.chatmemory;
|
||||||
|
|
||||||
|
import com.esotericsoftware.kryo.Kryo;
|
||||||
|
import com.esotericsoftware.kryo.io.Input;
|
||||||
|
import com.esotericsoftware.kryo.io.Output;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.objenesis.strategy.StdInstantiatorStrategy;
|
||||||
|
import org.springframework.ai.chat.memory.ChatMemory;
|
||||||
|
import org.springframework.ai.chat.messages.Message;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于文件持久化的对话记忆
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class FileBasedChatMemory implements ChatMemory {
|
||||||
|
|
||||||
|
private final String BASE_DIR;
|
||||||
|
private static final Kryo kryo = new Kryo();
|
||||||
|
|
||||||
|
static {
|
||||||
|
kryo.setRegistrationRequired(false);
|
||||||
|
// 设置实例化策略
|
||||||
|
kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构造对象时,指定文件保存目录
|
||||||
|
public FileBasedChatMemory(String dir) {
|
||||||
|
this.BASE_DIR = dir;
|
||||||
|
File baseDir = new File(dir);
|
||||||
|
if (!baseDir.exists()) {
|
||||||
|
baseDir.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(String conversationId, List<Message> messages) {
|
||||||
|
List<Message> conversationMessages = getOrCreateConversation(conversationId);
|
||||||
|
conversationMessages.addAll(messages);
|
||||||
|
saveConversation(conversationId, conversationMessages);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Message> get(String conversationId) {
|
||||||
|
List<Message> messages = getOrCreateConversation(conversationId);
|
||||||
|
log.info("获取对话:{}", messages);
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clear(String conversationId) {
|
||||||
|
File file = getConversationFile(conversationId);
|
||||||
|
if (file.exists()) {
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Message> getOrCreateConversation(String conversationId) {
|
||||||
|
File file = getConversationFile(conversationId);
|
||||||
|
List<Message> messages = new ArrayList<>();
|
||||||
|
if (file.exists()) {
|
||||||
|
try (Input input = new Input(new FileInputStream(file))) {
|
||||||
|
messages = kryo.readObject(input, ArrayList.class);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("读取对话失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveConversation(String conversationId, List<Message> messages) {
|
||||||
|
File file = getConversationFile(conversationId);
|
||||||
|
try (Output output = new Output(new FileOutputStream(file))) {
|
||||||
|
kryo.writeObject(output, messages);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("保存对话失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private File getConversationFile(String conversationId) {
|
||||||
|
return new File(BASE_DIR, conversationId + ".kryo");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
package org.dromara.ai.controller;
|
||||||
|
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.ai.chat.DashScopeChat;
|
||||||
|
import org.dromara.ai.chatmemory.FileBasedChatMemory;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatReq;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.springframework.ai.chat.messages.Message;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import reactor.core.publisher.Flux;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-10-23 11:32
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Validated
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/ai/chat")
|
||||||
|
public class AIChatController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DashScopeChat dashScopeChat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ChatClient 流式调用
|
||||||
|
*/
|
||||||
|
@GetMapping("/stream")
|
||||||
|
public Flux<String> streamChat(@Validated AIChatReq req, HttpServletResponse response) {
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
return dashScopeChat.doChatStream(req.getQuery(), req.getChatId(), req.getIsFirst());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对话记录
|
||||||
|
*/
|
||||||
|
@GetMapping("/history")
|
||||||
|
public R<List<Message>> getChatHistory(String chatId) {
|
||||||
|
FileBasedChatMemory memory = new FileBasedChatMemory(System.getProperty("user.dir") + "/chat-memory");
|
||||||
|
return R.ok(memory.get(chatId));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
package org.dromara.ai.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryQueryReq;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryUpdateReq;
|
||||||
|
import org.dromara.ai.domain.vo.AIChatMemoryVo;
|
||||||
|
import org.dromara.ai.service.IAIChatMemoryService;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话记录信息
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/ai/chatMemory")
|
||||||
|
public class AIChatMemoryController extends BaseController {
|
||||||
|
|
||||||
|
private final IAIChatMemoryService aiChatMemoryService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询AI 对话记录信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("ai:chatMemory:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<AIChatMemoryVo> list(AIChatMemoryQueryReq req, PageQuery pageQuery) {
|
||||||
|
return aiChatMemoryService.queryPageList(req, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出AI 对话记录信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("ai:chatMemory:export")
|
||||||
|
@Log(title = "AI 对话记录信息", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(AIChatMemoryQueryReq req, HttpServletResponse response) {
|
||||||
|
List<AIChatMemoryVo> list = aiChatMemoryService.queryList(req);
|
||||||
|
ExcelUtil.exportExcel(list, "AI 对话记录信息", AIChatMemoryVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取AI 对话记录信息详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("ai:chatMemory:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<AIChatMemoryVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(aiChatMemoryService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改 AI 对话记录信息
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("ai:chatMemory:edit")
|
||||||
|
@Log(title = "AI 对话记录信息", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> updateAIChatMemory(@Validated AIChatMemoryUpdateReq req) {
|
||||||
|
return toAjax(aiChatMemoryService.updateByReq(req));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除AI 对话记录信息
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("ai:chatMemory:remove")
|
||||||
|
@Log(title = "AI 对话记录信息", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(aiChatMemoryService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
package org.dromara.ai.domain;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话记录信息对象 ai_chat_memory
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("ai_chat_memory")
|
||||||
|
public class AIChatMemory extends BaseEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户id
|
||||||
|
*/
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名
|
||||||
|
*/
|
||||||
|
private String fileName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第一条问题
|
||||||
|
*/
|
||||||
|
private String firstQuestion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
package org.dromara.ai.domain.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04 15:19
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class AIChatMemoryQueryReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = -4090176451164739134L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户id
|
||||||
|
*/
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名
|
||||||
|
*/
|
||||||
|
private String fileName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第一条问题
|
||||||
|
*/
|
||||||
|
private String firstQuestion;
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package org.dromara.ai.domain.dto;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-05 11:28
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class AIChatMemoryUpdateReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 6541297164616819137L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@NotNull(message = "主键不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第一条问题
|
||||||
|
*/
|
||||||
|
private String firstQuestion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
package org.dromara.ai.domain.dto;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-05 09:31
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class AIChatReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = -4669223630531267889L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 聊天内容
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "请输入内容")
|
||||||
|
private String query;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话id
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "请输入会话id")
|
||||||
|
private String chatId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否首次对话
|
||||||
|
*/
|
||||||
|
@NotNull(message = "请选择是否首次对话")
|
||||||
|
private Boolean isFirst;
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
package org.dromara.ai.domain.vo;
|
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.dromara.ai.domain.AIChatMemory;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话记录信息视图对象 ai_chat_memory
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
@AutoMapper(target = AIChatMemory.class)
|
||||||
|
public class AIChatMemoryVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "主键")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户id
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "用户id")
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "文件名")
|
||||||
|
private String fileName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第一条问题
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "第一条问题")
|
||||||
|
private String firstQuestion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "备注")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
package org.dromara.ai.mapper;
|
||||||
|
|
||||||
|
import org.dromara.ai.domain.AIChatMemory;
|
||||||
|
import org.dromara.ai.domain.vo.AIChatMemoryVo;
|
||||||
|
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话记录信息Mapper接口
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
public interface AIChatMemoryMapper extends BaseMapperPlus<AIChatMemory, AIChatMemoryVo> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
package org.dromara.ai.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import org.dromara.ai.domain.AIChatMemory;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryQueryReq;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryUpdateReq;
|
||||||
|
import org.dromara.ai.domain.vo.AIChatMemoryVo;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话记录信息Service接口
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
public interface IAIChatMemoryService extends IService<AIChatMemory> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询AI 对话记录信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return AI 对话记录信息
|
||||||
|
*/
|
||||||
|
AIChatMemoryVo queryById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询AI 对话记录信息列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return AI 对话记录信息分页列表
|
||||||
|
*/
|
||||||
|
TableDataInfo<AIChatMemoryVo> queryPageList(AIChatMemoryQueryReq bo, PageQuery pageQuery);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的AI 对话记录信息列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @return AI 对话记录信息列表
|
||||||
|
*/
|
||||||
|
List<AIChatMemoryVo> queryList(AIChatMemoryQueryReq bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改 AI 对话记录信息
|
||||||
|
*
|
||||||
|
* @param req 修改参数
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
Boolean updateByReq(AIChatMemoryUpdateReq req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除AI 对话记录信息信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
}
|
||||||
@ -0,0 +1,111 @@
|
|||||||
|
package org.dromara.ai.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.dromara.ai.domain.AIChatMemory;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryQueryReq;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryUpdateReq;
|
||||||
|
import org.dromara.ai.domain.vo.AIChatMemoryVo;
|
||||||
|
import org.dromara.ai.mapper.AIChatMemoryMapper;
|
||||||
|
import org.dromara.ai.service.IAIChatMemoryService;
|
||||||
|
import org.dromara.common.core.constant.HttpStatus;
|
||||||
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.springframework.beans.BeanUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话记录信息Service业务层处理
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class AIChatMemoryServiceImpl extends ServiceImpl<AIChatMemoryMapper, AIChatMemory>
|
||||||
|
implements IAIChatMemoryService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询AI 对话记录信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return AI 对话记录信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AIChatMemoryVo queryById(Long id) {
|
||||||
|
return baseMapper.selectVoById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询AI 对话记录信息列表
|
||||||
|
*
|
||||||
|
* @param req 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return AI 对话记录信息分页列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<AIChatMemoryVo> queryPageList(AIChatMemoryQueryReq req, PageQuery pageQuery) {
|
||||||
|
LambdaQueryWrapper<AIChatMemory> lqw = buildQueryWrapper(req);
|
||||||
|
Page<AIChatMemoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的AI 对话记录信息列表
|
||||||
|
*
|
||||||
|
* @param req 查询条件
|
||||||
|
* @return AI 对话记录信息列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<AIChatMemoryVo> queryList(AIChatMemoryQueryReq req) {
|
||||||
|
LambdaQueryWrapper<AIChatMemory> lqw = buildQueryWrapper(req);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改 AI 对话记录信息
|
||||||
|
*
|
||||||
|
* @param req 修改参数
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateByReq(AIChatMemoryUpdateReq req) {
|
||||||
|
AIChatMemory oldChatMemory = this.getById(req.getId());
|
||||||
|
if (oldChatMemory == null) {
|
||||||
|
throw new ServiceException("数据不存在", HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
AIChatMemory update = new AIChatMemory();
|
||||||
|
BeanUtils.copyProperties(req, update);
|
||||||
|
return this.updateById(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LambdaQueryWrapper<AIChatMemory> buildQueryWrapper(AIChatMemoryQueryReq req) {
|
||||||
|
LambdaQueryWrapper<AIChatMemory> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.orderByDesc(AIChatMemory::getId);
|
||||||
|
lqw.eq(req.getUserId() != null, AIChatMemory::getUserId, req.getUserId());
|
||||||
|
lqw.like(StringUtils.isNotBlank(req.getFileName()), AIChatMemory::getFileName, req.getFileName());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(req.getFirstQuestion()), AIChatMemory::getFirstQuestion, req.getFirstQuestion());
|
||||||
|
return lqw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除AI 对话记录信息信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||||
|
if (isValid) {
|
||||||
|
//TODO 做一些业务上的校验,判断是否需要校验
|
||||||
|
}
|
||||||
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,8 +3,12 @@ package org.dromara.app.controller;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.app.domain.SysPackage;
|
import org.dromara.app.domain.SysPackage;
|
||||||
|
import org.dromara.app.domain.bo.SysPackageBo;
|
||||||
|
import org.dromara.app.domain.vo.SysPackageVo;
|
||||||
import org.dromara.app.service.SysPackageServiceImpl;
|
import org.dromara.app.service.SysPackageServiceImpl;
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.system.domain.vo.SysOssVo;
|
import org.dromara.system.domain.vo.SysOssVo;
|
||||||
import org.dromara.system.service.impl.SysOssServiceImpl;
|
import org.dromara.system.service.impl.SysOssServiceImpl;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -26,6 +30,14 @@ public class SysPackageController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private SysPackageServiceImpl sysPackageService;
|
private SysPackageServiceImpl sysPackageService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<SysPackageVo> list(SysPackageBo bo, PageQuery pageQuery) {
|
||||||
|
return sysPackageService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取最新版本
|
* 获取最新版本
|
||||||
*/
|
*/
|
||||||
@ -42,7 +54,7 @@ public class SysPackageController {
|
|||||||
* 上传最新安装包及版本
|
* 上传最新安装包及版本
|
||||||
*/
|
*/
|
||||||
@GetMapping("/uploadNewVersion")
|
@GetMapping("/uploadNewVersion")
|
||||||
public R<SysPackage> uploadNewVersion(String version, String type, MultipartFile file) {
|
public R<SysPackage> uploadNewVersion(String version, String type, MultipartFile file, String context) {
|
||||||
String originalFileName = "apk/package/app-release.apk";
|
String originalFileName = "apk/package/app-release.apk";
|
||||||
|
|
||||||
// 先查询最新记录
|
// 先查询最新记录
|
||||||
@ -57,11 +69,11 @@ public class SysPackageController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 分离事务:再处理数据库操作
|
// 分离事务:再处理数据库操作
|
||||||
return handleDatabaseOperations(version, type, upload, list);
|
return handleDatabaseOperations(version, type, upload, list, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public R<SysPackage> handleDatabaseOperations(String version, String type, SysOssVo upload, List<SysPackage> existingPackages) {
|
public R<SysPackage> handleDatabaseOperations(String version, String type, SysOssVo upload, List<SysPackage> existingPackages, String context) {
|
||||||
try {
|
try {
|
||||||
// 先删除旧文件记录
|
// 先删除旧文件记录
|
||||||
if (existingPackages != null && !existingPackages.isEmpty()) {
|
if (existingPackages != null && !existingPackages.isEmpty()) {
|
||||||
@ -78,6 +90,7 @@ public class SysPackageController {
|
|||||||
sysPackage.setFileId(upload.getOssId());
|
sysPackage.setFileId(upload.getOssId());
|
||||||
sysPackage.setFileUrl(upload.getUrl());
|
sysPackage.setFileUrl(upload.getUrl());
|
||||||
sysPackage.setType(type);
|
sysPackage.setType(type);
|
||||||
|
sysPackage.setContext(context);
|
||||||
|
|
||||||
boolean save = sysPackageService.save(sysPackage);
|
boolean save = sysPackageService.save(sysPackage);
|
||||||
if (!save) {
|
if (!save) {
|
||||||
|
|||||||
@ -30,4 +30,9 @@ public class SysPackage extends BaseEntity {
|
|||||||
|
|
||||||
private String fileUrl;
|
private String fileUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新内容
|
||||||
|
*/
|
||||||
|
private String context;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,32 @@
|
|||||||
|
package org.dromara.app.domain.bo;
|
||||||
|
|
||||||
|
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import org.dromara.xzd.domain.XzdContractDetails;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = XzdContractDetails.class, reverseConvertGenerate = false)
|
||||||
|
public class SysPackageBo extends BaseEntity {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 0安卓1苹果2鸿蒙
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
private Long fileId;
|
||||||
|
|
||||||
|
private String fileUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新内容
|
||||||
|
*/
|
||||||
|
private String context;
|
||||||
|
}
|
||||||
@ -27,4 +27,9 @@ public class SysPackageVo {
|
|||||||
|
|
||||||
@ExcelProperty("安装包地址")
|
@ExcelProperty("安装包地址")
|
||||||
private String fileUrl;
|
private String fileUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新内容
|
||||||
|
*/
|
||||||
|
private String context;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,24 @@
|
|||||||
package org.dromara.app.service;
|
package org.dromara.app.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.dromara.app.domain.SysPackage;
|
import org.dromara.app.domain.SysPackage;
|
||||||
|
import org.dromara.app.domain.bo.SysPackageBo;
|
||||||
|
import org.dromara.app.domain.vo.SysPackageVo;
|
||||||
import org.dromara.app.mapper.SysPackageMapper;
|
import org.dromara.app.mapper.SysPackageMapper;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class SysPackageServiceImpl extends ServiceImpl<SysPackageMapper, SysPackage> {
|
public class SysPackageServiceImpl extends ServiceImpl<SysPackageMapper, SysPackage> {
|
||||||
|
|
||||||
|
public TableDataInfo<SysPackageVo> queryPageList(SysPackageBo bo, PageQuery pageQuery) {
|
||||||
|
// LambdaQueryWrapper<SysPackage> lqw = buildQueryWrapper(bo);
|
||||||
|
Page<SysPackageVo> result = baseMapper.selectVoPage(pageQuery.build(), new LambdaQueryWrapper<>());
|
||||||
|
// setValue(result.getRecords());
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,43 @@
|
|||||||
|
package org.dromara.bigscreen.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 无人机消息redis订阅专用线程池
|
||||||
|
*/
|
||||||
|
@Configuration // 标记为配置类,让Spring扫描加载
|
||||||
|
@EnableAsync // 启用Spring异步功能(若项目已在启动类加过,此处可省略,但加上更稳妥)
|
||||||
|
public class AsyncConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定义名为 "messageAsyncExecutor" 的线程池 Bean(与 @Async("messageAsyncExecutor") 对应)
|
||||||
|
*/
|
||||||
|
@Bean(name = "messageAsyncExecutor") // Bean名称必须是 "messageAsyncExecutor",大小写敏感
|
||||||
|
public Executor messageAsyncExecutor() {
|
||||||
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||||
|
|
||||||
|
// 1. 核心线程数:根据CPU核心数或业务量调整(示例:5个)
|
||||||
|
executor.setCorePoolSize(5);
|
||||||
|
// 2. 最大线程数:避免线程过多导致资源耗尽(示例:10个)
|
||||||
|
executor.setMaxPoolSize(10);
|
||||||
|
// 3. 任务队列容量:缓冲待处理的异步任务(示例:50个)
|
||||||
|
executor.setQueueCapacity(50);
|
||||||
|
// 4. 线程名前缀:便于日志排查(格式:message-async-1, message-async-2...)
|
||||||
|
executor.setThreadNamePrefix("message-async-");
|
||||||
|
// 5. 线程空闲时间:超过60秒空闲则销毁(释放资源)
|
||||||
|
executor.setKeepAliveSeconds(60);
|
||||||
|
// 6. 任务拒绝策略:队列满时,由提交任务的线程临时执行(避免消息丢失)
|
||||||
|
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
|
||||||
|
|
||||||
|
// 7. 初始化线程池(必须调用,否则线程池不会生效)
|
||||||
|
executor.initialize();
|
||||||
|
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -12,8 +12,6 @@ import org.springframework.data.redis.listener.PatternTopic;
|
|||||||
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
|
||||||
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
|
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class RedisConfig {
|
public class RedisConfig {
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,105 @@
|
|||||||
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import org.dromara.bigscreen.domain.dto.BusBwlBo;
|
||||||
|
import org.dromara.bigscreen.domain.vo.BusBwlVo;
|
||||||
|
import org.dromara.bigscreen.service.IBusBwlService;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备忘录
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/bwl/bwl")
|
||||||
|
public class BusBwlController extends BaseController {
|
||||||
|
|
||||||
|
private final IBusBwlService busBwlService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询备忘录列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bwl:bwl:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<BusBwlVo> list(BusBwlBo bo, PageQuery pageQuery) {
|
||||||
|
return busBwlService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出备忘录列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bwl:bwl:export")
|
||||||
|
@Log(title = "备忘录", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(BusBwlBo bo, HttpServletResponse response) {
|
||||||
|
List<BusBwlVo> list = busBwlService.queryList(bo);
|
||||||
|
ExcelUtil.exportExcel(list, "备忘录", BusBwlVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取备忘录详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bwl:bwl:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<BusBwlVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(busBwlService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增备忘录
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bwl:bwl:add")
|
||||||
|
@Log(title = "备忘录", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusBwlBo bo) {
|
||||||
|
return toAjax(busBwlService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改备忘录
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bwl:bwl:edit")
|
||||||
|
@Log(title = "备忘录", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusBwlBo bo) {
|
||||||
|
return toAjax(busBwlService.updateByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除备忘录
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bwl:bwl:remove")
|
||||||
|
@Log(title = "备忘录", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(busBwlService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,106 @@
|
|||||||
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import org.dromara.bigscreen.domain.dto.BusSygjBo;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.bigscreen.domain.vo.BusSygjVo;
|
||||||
|
|
||||||
|
import org.dromara.bigscreen.service.IBusSygjService;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实用工具
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-05
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/bigscreen/sygj")
|
||||||
|
public class BusSygjController extends BaseController {
|
||||||
|
|
||||||
|
private final IBusSygjService busSygjService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询实用工具列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:sygj:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<BusSygjVo> list(BusSygjBo bo, PageQuery pageQuery) {
|
||||||
|
return busSygjService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出实用工具列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:sygj:export")
|
||||||
|
@Log(title = "实用工具", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(BusSygjBo bo, HttpServletResponse response) {
|
||||||
|
List<BusSygjVo> list = busSygjService.queryList(bo);
|
||||||
|
ExcelUtil.exportExcel(list, "实用工具", BusSygjVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取实用工具详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:sygj:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<BusSygjVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(busSygjService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增实用工具
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:sygj:add")
|
||||||
|
@Log(title = "实用工具", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusSygjBo bo) {
|
||||||
|
return toAjax(busSygjService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改实用工具
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:sygj:edit")
|
||||||
|
@Log(title = "实用工具", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusSygjBo bo) {
|
||||||
|
return toAjax(busSygjService.updateByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除实用工具
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:sygj:remove")
|
||||||
|
@Log(title = "实用工具", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(busSygjService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,105 @@
|
|||||||
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import org.dromara.bigscreen.domain.dto.BusWjzxBo;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.bigscreen.domain.vo.BusWjzxVo;
|
||||||
|
import org.dromara.bigscreen.service.IBusWjzxService;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件中心
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-05
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/bigscreen/wjzx")
|
||||||
|
public class BusWjzxController extends BaseController {
|
||||||
|
|
||||||
|
private final IBusWjzxService busWjzxService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询文件中心列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:wjzx:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<BusWjzxVo> list(BusWjzxBo bo, PageQuery pageQuery) {
|
||||||
|
return busWjzxService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出文件中心列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:wjzx:export")
|
||||||
|
@Log(title = "文件中心", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(BusWjzxBo bo, HttpServletResponse response) {
|
||||||
|
List<BusWjzxVo> list = busWjzxService.queryList(bo);
|
||||||
|
ExcelUtil.exportExcel(list, "文件中心", BusWjzxVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文件中心详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:wjzx:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<BusWjzxVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(busWjzxService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增文件中心
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:wjzx:add")
|
||||||
|
@Log(title = "文件中心", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusWjzxBo bo) {
|
||||||
|
return toAjax(busWjzxService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改文件中心
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:wjzx:edit")
|
||||||
|
@Log(title = "文件中心", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusWjzxBo bo) {
|
||||||
|
return toAjax(busWjzxService.updateByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除文件中心
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:wjzx:remove")
|
||||||
|
@Log(title = "文件中心", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(busWjzxService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,5 @@
|
|||||||
package org.dromara.bigscreen.controller;
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -62,7 +61,7 @@ public class MoneyBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目位置列表
|
* 查询项目位置列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("money:bigScreen:projectGis")
|
// @SaCheckPermission("money:bigScreen:projectGis")
|
||||||
@GetMapping("/project/gis")
|
@GetMapping("/project/gis")
|
||||||
public R<List<BusProjectGisVo>> getProjectGis() {
|
public R<List<BusProjectGisVo>> getProjectGis() {
|
||||||
return R.ok(moneyBigScreenService.getProjectGis());
|
return R.ok(moneyBigScreenService.getProjectGis());
|
||||||
@ -545,7 +544,7 @@ public class MoneyBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目天气
|
* 查询项目天气
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:weather")
|
// @SaCheckPermission("project:bigScreen:weather")
|
||||||
@GetMapping("/weather/{projectId}")
|
@GetMapping("/weather/{projectId}")
|
||||||
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
|
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
@ -555,7 +554,7 @@ public class MoneyBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目安全天数
|
* 查询项目安全天数
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:safetyDay")
|
// @SaCheckPermission("project:bigScreen:safetyDay")
|
||||||
@GetMapping("/safetyDay/{projectId}")
|
@GetMapping("/safetyDay/{projectId}")
|
||||||
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
|
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
|
|||||||
@ -0,0 +1,326 @@
|
|||||||
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.convert.Convert;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.ai.chat.DashScopeChat;
|
||||||
|
import org.dromara.ai.chatmemory.FileBasedChatMemory;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryQueryReq;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatMemoryUpdateReq;
|
||||||
|
import org.dromara.ai.domain.dto.AIChatReq;
|
||||||
|
import org.dromara.ai.domain.vo.AIChatMemoryVo;
|
||||||
|
import org.dromara.ai.service.IAIChatMemoryService;
|
||||||
|
import org.dromara.bigscreen.domain.dto.BusBwlBo;
|
||||||
|
import org.dromara.bigscreen.domain.dto.BusSygjBo;
|
||||||
|
import org.dromara.bigscreen.domain.dto.BusWjzxBo;
|
||||||
|
import org.dromara.bigscreen.domain.dto.TaskInfoDto;
|
||||||
|
import org.dromara.bigscreen.domain.vo.*;
|
||||||
|
import org.dromara.bigscreen.service.IBusBwlService;
|
||||||
|
import org.dromara.bigscreen.service.IBusSygjService;
|
||||||
|
import org.dromara.bigscreen.service.IBusWjzxService;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.core.domain.dto.UserDTO;
|
||||||
|
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||||
|
import org.dromara.common.core.utils.StreamUtils;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.patch.domain.bo.PdMasterBo;
|
||||||
|
import org.dromara.patch.domain.vo.PdMasterBymiAndQt;
|
||||||
|
import org.dromara.patch.service.IPdMasterService;
|
||||||
|
import org.dromara.project.service.IBusProjectService;
|
||||||
|
import org.dromara.system.domain.SysMenu;
|
||||||
|
import org.dromara.system.domain.vo.RouterVo;
|
||||||
|
import org.dromara.system.mapper.SysRoleMapper;
|
||||||
|
import org.dromara.system.service.impl.SysMenuServiceImpl;
|
||||||
|
import org.dromara.system.service.impl.SysUserServiceImpl;
|
||||||
|
import org.dromara.warm.flow.core.FlowEngine;
|
||||||
|
import org.dromara.warm.flow.core.entity.User;
|
||||||
|
import org.dromara.warm.flow.core.enums.NodeType;
|
||||||
|
import org.dromara.warm.flow.orm.entity.FlowDefinition;
|
||||||
|
import org.dromara.warm.flow.orm.mapper.FlowDefinitionMapper;
|
||||||
|
import org.dromara.workflow.domain.bo.FlowTaskBo;
|
||||||
|
import org.dromara.workflow.domain.vo.FlowTaskVo;
|
||||||
|
import org.dromara.workflow.mapper.FlwTaskMapper;
|
||||||
|
import org.springframework.ai.chat.messages.Message;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import reactor.core.publisher.Flux;
|
||||||
|
|
||||||
|
import java.time.DayOfWeek;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 个人首页接口
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RequestMapping("/personalHome")
|
||||||
|
public class PersonalHomeController extends BaseController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FlwTaskMapper flwTaskMapper;
|
||||||
|
@Autowired
|
||||||
|
private FlowDefinitionMapper flowDefinitionMapper;
|
||||||
|
@Autowired
|
||||||
|
private SysUserServiceImpl userService;
|
||||||
|
|
||||||
|
private final IBusWjzxService busWjzxService;
|
||||||
|
|
||||||
|
private final IBusSygjService busSygjService;
|
||||||
|
@Autowired
|
||||||
|
private IPdMasterService pdMasterService;
|
||||||
|
|
||||||
|
private final IBusBwlService busBwlService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DashScopeChat dashScopeChat;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IAIChatMemoryService aiChatMemoryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IBusProjectService projectService;
|
||||||
|
|
||||||
|
private final SysRoleMapper roleMapper;
|
||||||
|
private final SysMenuServiceImpl sysMenuService;
|
||||||
|
|
||||||
|
// region AI 模块
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取新 AI 对话聊天id
|
||||||
|
*/
|
||||||
|
@GetMapping("/ai/chat/new")
|
||||||
|
public R<String> getNewAIChat() {
|
||||||
|
return R.ok(UUID.randomUUID().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI 对话流式调用
|
||||||
|
*/
|
||||||
|
@GetMapping("/ai/chat/stream")
|
||||||
|
public Flux<String> streamChat(@Validated AIChatReq req, HttpServletResponse response) {
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
return dashScopeChat.doChatStream(req.getQuery(), req.getChatId(), req.getIsFirst());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 AI 对话记录
|
||||||
|
*/
|
||||||
|
@GetMapping("/ai/chat/history")
|
||||||
|
public R<List<Message>> getChatHistory(String chatId) {
|
||||||
|
FileBasedChatMemory memory = new FileBasedChatMemory(System.getProperty("user.dir") + "/chat-memory");
|
||||||
|
return R.ok(memory.get(chatId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询 AI 对话记录信息列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/ai/chatMemory/list")
|
||||||
|
public TableDataInfo<AIChatMemoryVo> listAIChatMemory(AIChatMemoryQueryReq req, PageQuery pageQuery) {
|
||||||
|
return aiChatMemoryService.queryPageList(req, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 AI 对话记录信息详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@GetMapping("/ai/chatMemory/{id}")
|
||||||
|
public R<AIChatMemoryVo> getAIChatMemoryInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(aiChatMemoryService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改 AI 对话记录信息
|
||||||
|
*/
|
||||||
|
@Log(title = "AI 对话记录信息", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping("/ai/chatMemory")
|
||||||
|
public R<Void> updateAIChatMemory(@Validated AIChatMemoryUpdateReq req) {
|
||||||
|
return toAjax(aiChatMemoryService.updateByReq(req));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除 AI 对话记录信息
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@Log(title = "AI 对话记录信息", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/ai/chatMemory/{ids}")
|
||||||
|
public R<Void> removeAIChatMemory(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(aiChatMemoryService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取我的项目信息
|
||||||
|
*/
|
||||||
|
@GetMapping("/getMyProjectInfo")
|
||||||
|
public R<List<MyProjectInfoVo>> getMyProjectInfoList() {
|
||||||
|
return R.ok(projectService.getMyProjectInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 首页待办事项
|
||||||
|
*
|
||||||
|
* @param projectId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@GetMapping("/getTaskList")
|
||||||
|
public R<TaskInfoDto> getTaskList(String projectId) {
|
||||||
|
TaskInfoDto taskInfoDto = new TaskInfoDto();
|
||||||
|
|
||||||
|
QueryWrapper<FlowTaskBo> queryWrapper = new QueryWrapper<>();
|
||||||
|
List<Long> definitionIds = new ArrayList<>();
|
||||||
|
if (!"0".equals(projectId)) {
|
||||||
|
List<FlowDefinition> flowDefinitions = flowDefinitionMapper.selectList(new LambdaQueryWrapper<FlowDefinition>()
|
||||||
|
.select(FlowDefinition::getId)
|
||||||
|
.like(FlowDefinition::getFlowCode, projectId));
|
||||||
|
if (flowDefinitions != null && !flowDefinitions.isEmpty()) {
|
||||||
|
flowDefinitions.forEach(flowDefinition -> {
|
||||||
|
definitionIds.add(flowDefinition.getId());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (definitionIds.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey());
|
||||||
|
queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr());
|
||||||
|
queryWrapper.in("t.flow_status", BusinessStatusEnum.WAITING.getStatus());
|
||||||
|
List<FlowTaskVo> page = this.getFlowTaskDefinitionIdsVoPage(definitionIds, queryWrapper);
|
||||||
|
|
||||||
|
//根据createTime过滤出本周数据
|
||||||
|
// 获取本周一和本周日
|
||||||
|
LocalDate today = LocalDate.now();
|
||||||
|
LocalDate monday = today.with(DayOfWeek.MONDAY);
|
||||||
|
LocalDate sunday = today.with(DayOfWeek.SUNDAY);
|
||||||
|
|
||||||
|
// 筛选本周数据
|
||||||
|
List<FlowTaskVo> weeklyTasks = page.stream()
|
||||||
|
.filter(task -> {
|
||||||
|
Date createTime = task.getCreateTime(); // 假设字段名为createTime
|
||||||
|
if (createTime != null) {
|
||||||
|
LocalDate createLocalDate = createTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
||||||
|
return !createLocalDate.isBefore(monday) && !createLocalDate.isAfter(sunday);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
taskInfoDto.setList(page);
|
||||||
|
taskInfoDto.setTotal((long) page.size());
|
||||||
|
taskInfoDto.setWeekCount((long) weeklyTasks.size());
|
||||||
|
|
||||||
|
BusPdSjVo busPdSjVo = pdMasterService.queryPageListByDate();
|
||||||
|
BusWjzxSjDateVo busWjzxSjDateVo = busWjzxService.queryWjzx();
|
||||||
|
|
||||||
|
taskInfoDto.setBusWjzxSjDateVo(busWjzxSjDateVo);
|
||||||
|
taskInfoDto.setBusPdSjVo(busPdSjVo);
|
||||||
|
|
||||||
|
return R.ok(taskInfoDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FlowTaskVo> getFlowTaskDefinitionIdsVoPage(List<Long> definitionIds, QueryWrapper<FlowTaskBo> queryWrapper) {
|
||||||
|
List<FlowTaskVo> records = flwTaskMapper.getListRunTaskDefinitionInfo(definitionIds, queryWrapper);
|
||||||
|
if (CollUtil.isNotEmpty(records)) {
|
||||||
|
List<Long> taskIds = StreamUtils.toList(records, FlowTaskVo::getId);
|
||||||
|
Map<Long, List<UserDTO>> listMap = currentTaskAllUser(taskIds);
|
||||||
|
records.forEach(t -> {
|
||||||
|
List<UserDTO> userList = listMap.getOrDefault(t.getId(), Collections.emptyList());
|
||||||
|
if (CollUtil.isNotEmpty(userList)) {
|
||||||
|
t.setAssigneeIds(StreamUtils.join(userList, e -> String.valueOf(e.getUserId())));
|
||||||
|
t.setAssigneeNames(StreamUtils.join(userList, UserDTO::getNickName));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return records;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Long, List<UserDTO>> currentTaskAllUser(List<Long> taskIdList) {
|
||||||
|
Map<Long, List<UserDTO>> map = new HashMap<>();
|
||||||
|
// 获取与当前任务关联的用户列表
|
||||||
|
List<User> associatedUsers = FlowEngine.userService().getByAssociateds(taskIdList);
|
||||||
|
Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
|
||||||
|
for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
|
||||||
|
List<User> value = entry.getValue();
|
||||||
|
if (CollUtil.isNotEmpty(value)) {
|
||||||
|
List<UserDTO> userDtoList = userService.selectListByIds(StreamUtils.toList(value, e -> Convert.toLong(e.getProcessedBy())));
|
||||||
|
map.put(entry.getKey(), userDtoList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询实用工具列表
|
||||||
|
*/
|
||||||
|
// @SaCheckPermission("bigscreen:sygj:list")
|
||||||
|
@GetMapping("/listsygj")
|
||||||
|
public TableDataInfo<BusSygjVo> listsygj(BusSygjBo bo, PageQuery pageQuery) {
|
||||||
|
return busSygjService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询文件中心列表
|
||||||
|
*/
|
||||||
|
// @SaCheckPermission("bigscreen:wjzx:list")
|
||||||
|
@GetMapping("/listBywjzx")
|
||||||
|
public TableDataInfo<BusWjzxVo> listBywjzx(BusWjzxBo bo, PageQuery pageQuery) {
|
||||||
|
return busWjzxService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询派单列表
|
||||||
|
*/
|
||||||
|
// @SaCheckPermission("patch:master:list")
|
||||||
|
@GetMapping("/listPd")
|
||||||
|
public PdMasterBymiAndQt listPd(PdMasterBo bo, PageQuery pageQuery) {
|
||||||
|
return pdMasterService.queryPageListBy(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询备忘录列表
|
||||||
|
*/
|
||||||
|
// @SaCheckPermission("bwl:bwl:list")
|
||||||
|
@GetMapping("/listbwl")
|
||||||
|
public TableDataInfo<BusBwlVo> listbwl(BusBwlBo bo, PageQuery pageQuery) {
|
||||||
|
return busBwlService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取部门树
|
||||||
|
*/
|
||||||
|
@GetMapping("/deptTree")
|
||||||
|
public R<List<RouterVo>> deptTree() {
|
||||||
|
// SysRole role = roleMapper.selectById(1);
|
||||||
|
List<SysMenu> menus = sysMenuService.selectMenuTreeByUserId(LoginHelper.getUserId(), null);
|
||||||
|
// menus = menus.stream().filter(menu -> "2".equals(menu.getMenuSource())).collect(Collectors.toList());
|
||||||
|
menus = menus.stream().filter(menu -> "1".equals(menu.getMenuSource())).collect(Collectors.toList());
|
||||||
|
return R.ok(sysMenuService.buildMenus(menus));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,19 +1,16 @@
|
|||||||
package org.dromara.bigscreen.controller;
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.bigscreen.domain.dto.ProjectImageProgressDetailReq;
|
||||||
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
|
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
|
||||||
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
||||||
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
|
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
|
import org.dromara.bigscreen.domain.vo.*;
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectLandVo;
|
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
|
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
|
|
||||||
import org.dromara.bigscreen.service.ProjectBigScreenService;
|
import org.dromara.bigscreen.service.ProjectBigScreenService;
|
||||||
import org.dromara.common.core.constant.HttpStatus;
|
import org.dromara.common.core.constant.HttpStatus;
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
@ -21,7 +18,12 @@ import org.dromara.common.core.exception.ServiceException;
|
|||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
import org.dromara.common.log.annotation.Log;
|
import org.dromara.common.log.annotation.Log;
|
||||||
import org.dromara.common.log.enums.BusinessType;
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.web.core.BaseController;
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.facility.domain.bo.FacRedLineBo;
|
||||||
|
import org.dromara.facility.domain.vo.redline.FacRedLineVo;
|
||||||
|
import org.dromara.facility.service.IFacRedLineService;
|
||||||
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
||||||
import org.dromara.land.domain.BusLandBlock;
|
import org.dromara.land.domain.BusLandBlock;
|
||||||
import org.dromara.land.domain.BusLandTransferLedger;
|
import org.dromara.land.domain.BusLandTransferLedger;
|
||||||
@ -34,8 +36,8 @@ import org.dromara.manager.ys7manager.Ys7Manager;
|
|||||||
import org.dromara.other.domain.OthYs7Device;
|
import org.dromara.other.domain.OthYs7Device;
|
||||||
import org.dromara.other.service.IOthYs7DeviceService;
|
import org.dromara.other.service.IOthYs7DeviceService;
|
||||||
import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo;
|
import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo;
|
||||||
|
import org.dromara.project.domain.vo.project.BusProjectVo;
|
||||||
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
|
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
|
||||||
import org.dromara.project.service.IBusProjectNewsService;
|
|
||||||
import org.dromara.project.service.IBusProjectService;
|
import org.dromara.project.service.IBusProjectService;
|
||||||
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionGisReq;
|
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionGisReq;
|
||||||
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionListGisVo;
|
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionListGisVo;
|
||||||
@ -51,6 +53,7 @@ import java.math.BigDecimal;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,8 +80,6 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
|
|
||||||
private final IBusProjectService projectService;
|
private final IBusProjectService projectService;
|
||||||
|
|
||||||
private final IBusProjectNewsService projectNewsService;
|
|
||||||
|
|
||||||
private final IQltQualityInspectionService qualityInspectionService;
|
private final IQltQualityInspectionService qualityInspectionService;
|
||||||
|
|
||||||
private final IHseSafetyInspectionService safetyInspectionService;
|
private final IHseSafetyInspectionService safetyInspectionService;
|
||||||
@ -87,6 +88,8 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
|
|
||||||
private final BusLandTransferLedgerSonServiceImpl busLandTransferLedgerSonService;
|
private final BusLandTransferLedgerSonServiceImpl busLandTransferLedgerSonService;
|
||||||
|
|
||||||
|
private final IFacRedLineService facRedLineService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目土地统计
|
* 查询项目土地统计
|
||||||
*/
|
*/
|
||||||
@ -209,6 +212,22 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
return R.ok(projectBigScreenService.getProjectPeople(projectId));
|
return R.ok(projectBigScreenService.getProjectPeople(projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询项目人员情况
|
||||||
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
|
@GetMapping("/ue/people/{projectId}")
|
||||||
|
public R<ProjectPeopleVo> getProjectPeopleUe(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long projectId) {
|
||||||
|
final Long tdyq = 1897160897167638529L;
|
||||||
|
final Long tdeq = 1968506669544656898L;
|
||||||
|
if (Objects.equals(projectId, tdeq) || Objects.equals(projectId, tdyq)) {
|
||||||
|
return R.ok(projectBigScreenService.getProjectPeopleTianDong());
|
||||||
|
} else {
|
||||||
|
return R.ok(projectBigScreenService.getProjectPeople(projectId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目形象进度
|
* 查询项目形象进度
|
||||||
*/
|
*/
|
||||||
@ -219,6 +238,15 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
return R.ok(projectBigScreenService.getProjectImageProgress(projectId));
|
return R.ok(projectBigScreenService.getProjectImageProgress(projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取项目形象进度详情
|
||||||
|
*/
|
||||||
|
@GetMapping("/imageProgress/detail")
|
||||||
|
public R<List<ProjectImageProgressDetailVo>> getProjectImageProgressDetail(@Validated ProjectImageProgressDetailReq req) {
|
||||||
|
List<ProjectImageProgressDetailVo> list = projectBigScreenService.getProjectImageProgressDetail(req);
|
||||||
|
return R.ok(list);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目概括
|
* 查询项目概括
|
||||||
*/
|
*/
|
||||||
@ -272,6 +300,10 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR);
|
throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (req.getLatitude() != null && req.getLongitude() != null) {
|
||||||
|
ys7Device.setLatitude(req.getLatitude());
|
||||||
|
ys7Device.setLongitude(req.getLongitude());
|
||||||
|
}
|
||||||
return toAjax(othYs7DeviceService.updateById(ys7Device));
|
return toAjax(othYs7DeviceService.updateById(ys7Device));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -296,7 +328,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询GPS设备用户列表
|
* 查询GPS设备用户列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:big:screen")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getList")
|
@GetMapping("/getList")
|
||||||
public R<List<String>> getList(Long projectId) {
|
public R<List<String>> getList(Long projectId) {
|
||||||
return R.ok(projectBigScreenService.getList(projectId));
|
return R.ok(projectBigScreenService.getList(projectId));
|
||||||
@ -316,7 +348,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询地图项目分类
|
* 查询地图项目分类
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:big:screen")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getProjectMapList")
|
@GetMapping("/getProjectMapList")
|
||||||
public R<Map<String, Map<String, Map<String, String>>>> getProjectMapList() {
|
public R<Map<String, Map<String, Map<String, String>>>> getProjectMapList() {
|
||||||
return R.ok(projectService.getProjectMapList());
|
return R.ok(projectService.getProjectMapList());
|
||||||
@ -325,12 +357,28 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询地图项目分类
|
* 查询地图项目分类
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:big:screen")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@PostMapping("/updatePosition")
|
@PostMapping("/updatePosition")
|
||||||
public R<Void> updatePosition(@RequestBody ProjectUpdateDto dto) {
|
public R<Void> updatePosition(@RequestBody ProjectUpdateDto dto) {
|
||||||
return toAjax(projectService.updatePosition(dto));
|
return toAjax(projectService.updatePosition(dto));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取项目信息
|
||||||
|
*/
|
||||||
|
@GetMapping("/getProjectInfo/{projectId}")
|
||||||
|
public R<ProjectInfo> getProjectInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long projectId) {
|
||||||
|
BusProjectVo projectVo = projectService.queryById(projectId);
|
||||||
|
ProjectInfo info = new ProjectInfo();
|
||||||
|
info.setLat(projectVo.getLat());
|
||||||
|
info.setLng(projectVo.getLng());
|
||||||
|
info.setPlan(projectVo.getPlan());
|
||||||
|
info.setPosition(projectVo.getPosition());
|
||||||
|
info.setProjectId(projectVo.getId().toString());
|
||||||
|
return R.ok(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目地域分散图
|
* 查询项目地域分散图
|
||||||
@ -369,4 +417,12 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
return R.ok(projectBigScreenService.getInfoData(req));
|
return R.ok(projectBigScreenService.getInfoData(req));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设施-红线列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/redLine/list")
|
||||||
|
public TableDataInfo<FacRedLineVo> list(FacRedLineBo bo, PageQuery pageQuery) {
|
||||||
|
return facRedLineService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,151 @@
|
|||||||
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.bigscreen.domain.SysRoleWork;
|
||||||
|
import org.dromara.bigscreen.domain.bo.SysRoleWorkBo;
|
||||||
|
import org.dromara.bigscreen.domain.vo.SysRoleWorkVo;
|
||||||
|
import org.dromara.bigscreen.service.impl.SysRoleWorkServiceImpl;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.project.domain.vo.project.BusProjectVo;
|
||||||
|
import org.dromara.system.domain.vo.SysRoleVo;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色流程对应
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-06
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/bigscreen/roleWork")
|
||||||
|
public class SysRoleWorkController extends BaseController {
|
||||||
|
|
||||||
|
private final SysRoleWorkServiceImpl sysRoleWorkService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询角色流程对应列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:roleWork:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<SysRoleWorkVo> list(SysRoleWorkBo bo, PageQuery pageQuery) {
|
||||||
|
return sysRoleWorkService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出角色流程对应列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:roleWork:export")
|
||||||
|
@Log(title = "角色流程对应", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(SysRoleWorkBo bo, HttpServletResponse response) {
|
||||||
|
List<SysRoleWorkVo> list = sysRoleWorkService.queryList(bo);
|
||||||
|
ExcelUtil.exportExcel(list, "角色流程对应", SysRoleWorkVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取角色流程对应详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:roleWork:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<SysRoleWorkVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(sysRoleWorkService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增角色流程对应
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:roleWork:add")
|
||||||
|
@Log(title = "角色流程对应", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysRoleWorkBo bo) {
|
||||||
|
return toAjax(sysRoleWorkService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改角色流程对应
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:roleWork:edit")
|
||||||
|
@Log(title = "角色流程对应", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysRoleWorkBo bo) {
|
||||||
|
return toAjax(sysRoleWorkService.updateByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除角色流程对应
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("bigscreen:roleWork:remove")
|
||||||
|
@Log(title = "角色流程对应", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(sysRoleWorkService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前用户在制定项目下有流程的角色列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/getRoleList/{projectId}")
|
||||||
|
public R<List<SysRoleVo>> getRoleList(@PathVariable("projectId") Long projectId) {
|
||||||
|
return R.ok(sysRoleWorkService.getRoleList(projectId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断当前用户在所有项目下所有角色是否有角色流程
|
||||||
|
*/
|
||||||
|
@GetMapping("/isHaveValue")
|
||||||
|
public R<Boolean> isHaveValue() {
|
||||||
|
return R.ok(sysRoleWorkService.isHaveValue(LoginHelper.getUserId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据用户和项目判断是否有角色流程
|
||||||
|
*/
|
||||||
|
@GetMapping("/getRoleWork/{projectId}")
|
||||||
|
public R<Boolean> getRoleWorkByProject(@PathVariable("projectId") Long projectId) {
|
||||||
|
return R.ok(sysRoleWorkService.isHaveValueByProject(projectId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取角色对应流程 弃用
|
||||||
|
*/
|
||||||
|
@GetMapping("/getRoleToWork/{projectId}")
|
||||||
|
public R<SysRoleWork> getRoleWork(@PathVariable("projectId") Long projectId) {
|
||||||
|
return R.ok(sysRoleWorkService.getRoleWork(projectId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取有对应流程并且包含角色列表的项目列表
|
||||||
|
*/
|
||||||
|
@GetMapping("/getProjectRoles")
|
||||||
|
public R<List<BusProjectVo>> getProjectRoles() {
|
||||||
|
return R.ok(sysRoleWorkService.getProjectRoles());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,58 +0,0 @@
|
|||||||
package org.dromara.bigscreen.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class BusAttendanceByGo {
|
|
||||||
|
|
||||||
private Long id; // 主键ID
|
|
||||||
|
|
||||||
private String userName; // 人员姓名
|
|
||||||
|
|
||||||
private String pacePhoto; // 人脸照
|
|
||||||
|
|
||||||
private Long projectId; // 项目id
|
|
||||||
|
|
||||||
private String createBy; // 创建者
|
|
||||||
|
|
||||||
private String updateBy; // 更新者
|
|
||||||
|
|
||||||
private LocalDateTime createdAt; // 创建时间
|
|
||||||
|
|
||||||
private LocalDateTime updatedAt; // 更新时间
|
|
||||||
|
|
||||||
private LocalDateTime deletedAt; // 删除时间
|
|
||||||
|
|
||||||
private String clockOn; // 上午打卡
|
|
||||||
|
|
||||||
private String clockOff; // 下午打卡
|
|
||||||
|
|
||||||
private String printingDate; // 年月日打卡时间
|
|
||||||
|
|
||||||
private String isPinch; // 1正常,2迟到,3早退,4缺勤,5补卡
|
|
||||||
|
|
||||||
private String openid; // 微信id
|
|
||||||
|
|
||||||
private String pinchOpenId; // 代打id
|
|
||||||
|
|
||||||
private String clockRecord; // 多次打卡时间记录
|
|
||||||
|
|
||||||
private String pinchUserName; // 代打人姓名
|
|
||||||
|
|
||||||
private String commuter; // 上下班(1上班 2下班)
|
|
||||||
|
|
||||||
private String punchRange; // 打卡范围
|
|
||||||
|
|
||||||
private BigDecimal dailyWage; // 日薪
|
|
||||||
|
|
||||||
private String lng; // 经度
|
|
||||||
|
|
||||||
private String lat; // 纬度
|
|
||||||
|
|
||||||
private String location; // 逆编码地址信息
|
|
||||||
|
|
||||||
private LocalDateTime missing; // 缺卡统一处理时间
|
|
||||||
}
|
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
package org.dromara.bigscreen.domain;
|
||||||
|
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备忘录对象 bus_bwl
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("bus_bwl")
|
||||||
|
public class BusBwl extends BaseEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备忘录ID
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标题
|
||||||
|
*/
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内容
|
||||||
|
*/
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态(0:未完成 1:已完成)
|
||||||
|
*/
|
||||||
|
private Long status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划开始时间
|
||||||
|
*/
|
||||||
|
private Date jhkssj;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划结束时间
|
||||||
|
*/
|
||||||
|
private Date jhjssj;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,91 +0,0 @@
|
|||||||
package org.dromara.bigscreen.domain;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@TableName("bus_construction_user")
|
|
||||||
public class BusConstructionUser {
|
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
|
||||||
private Long id; // 主键ID
|
|
||||||
|
|
||||||
private String openid; // 微信id
|
|
||||||
|
|
||||||
private String nickName; // 微信名称
|
|
||||||
|
|
||||||
private Long teamId; // 班组id
|
|
||||||
|
|
||||||
private String headIcon; // 登陆照片
|
|
||||||
|
|
||||||
private String pacePhoto; // 人脸照
|
|
||||||
|
|
||||||
private String userName; // 人员姓名
|
|
||||||
|
|
||||||
private Long projectId; // 项目id
|
|
||||||
|
|
||||||
private String status; // 状态(0在职 1离职)-字典position_status
|
|
||||||
|
|
||||||
private String isPinch; // 是否代打
|
|
||||||
|
|
||||||
private String ifManagement; // 是否班组管理
|
|
||||||
|
|
||||||
private String createBy; // 创建者
|
|
||||||
|
|
||||||
private String updateBy; // 更新者
|
|
||||||
|
|
||||||
private LocalDateTime createdAt; // 创建时间
|
|
||||||
|
|
||||||
private LocalDateTime updatedAt; // 更新时间
|
|
||||||
|
|
||||||
private LocalDateTime deletedAt; // 删除时间
|
|
||||||
|
|
||||||
private String phone; // 电话
|
|
||||||
|
|
||||||
private String sex; // 1:男,2女,3保密
|
|
||||||
|
|
||||||
private String sfzNation; // 身份证民族
|
|
||||||
|
|
||||||
private String sfzNumber; // 身份证号码
|
|
||||||
|
|
||||||
private String sfzStart; // 身份证有效开始期
|
|
||||||
|
|
||||||
private String sfzEnd; // 身份证有效结束期
|
|
||||||
|
|
||||||
private String sfzSite; // 身份证地址
|
|
||||||
|
|
||||||
private String sfzBirth; // 身份证出生日期
|
|
||||||
|
|
||||||
private String nativePlace; // 籍贯
|
|
||||||
|
|
||||||
private String yhkNumber; // 银行卡号
|
|
||||||
|
|
||||||
private String yhkOpeningBank; // 开户行
|
|
||||||
|
|
||||||
private String yhkCardholder; // 持卡人
|
|
||||||
|
|
||||||
private String typeOfWork; // 工种(字典)
|
|
||||||
|
|
||||||
private String clock; // 打卡(1启用打卡 2禁止打卡)
|
|
||||||
|
|
||||||
private Long labourserviceId; // 劳务公司id
|
|
||||||
|
|
||||||
private String entryDate; // 入场时间
|
|
||||||
|
|
||||||
private String leaveDate; // 离场时间
|
|
||||||
|
|
||||||
private BigDecimal salary; // 薪水(为0表示无效)
|
|
||||||
|
|
||||||
private String projectRecord; // 是否开启项目备案(1开启 2不开启)
|
|
||||||
|
|
||||||
private String wxOrPc; // 哪添加的(1表示pc 2表示小程序)
|
|
||||||
|
|
||||||
private String subscription; // 消息订阅状态(1订阅 2无订阅)
|
|
||||||
|
|
||||||
private String devNum; // 安全帽设备标识
|
|
||||||
}
|
|
||||||
@ -1,52 +0,0 @@
|
|||||||
package org.dromara.bigscreen.domain;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 企业大事记
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@TableName("bus_corporate_events")
|
|
||||||
public class BusCorporateEvents {
|
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 标题
|
|
||||||
*/
|
|
||||||
private String headline;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 内容
|
|
||||||
*/
|
|
||||||
private String content;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建人
|
|
||||||
*/
|
|
||||||
private Long createdBy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新人
|
|
||||||
*/
|
|
||||||
private Long updatedBy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*/
|
|
||||||
private LocalDateTime createdAt;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新时间
|
|
||||||
*/
|
|
||||||
private LocalDateTime updatedAt;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除时间(软删除标记)
|
|
||||||
*/
|
|
||||||
private LocalDateTime deletedAt;
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
package org.dromara.bigscreen.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class BusProjectTeamByGo {
|
|
||||||
|
|
||||||
private Long id; // 主键id
|
|
||||||
|
|
||||||
private Long projectId; // 项目id
|
|
||||||
|
|
||||||
private String name; // 班组名称
|
|
||||||
|
|
||||||
private String isClockIn; // 范围内打卡(0范围内打卡 1任何地点打卡)
|
|
||||||
|
|
||||||
private String punchRange; // 打卡范围(id串)
|
|
||||||
|
|
||||||
private String remark; // 备注
|
|
||||||
|
|
||||||
private String createBy; // 创建者
|
|
||||||
|
|
||||||
private String updateBy; // 更新者
|
|
||||||
|
|
||||||
private Long createDept; // 创建部门
|
|
||||||
|
|
||||||
private LocalDateTime createTime; // 创建时间
|
|
||||||
|
|
||||||
private LocalDateTime updateTime; // 更新时间
|
|
||||||
}
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
package org.dromara.bigscreen.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class BusProjectTeamMemberByGo {
|
|
||||||
|
|
||||||
private Long id; // 主键id
|
|
||||||
|
|
||||||
private Long teamId; // 班组id
|
|
||||||
|
|
||||||
private Long projectId; // 项目id
|
|
||||||
|
|
||||||
private Long memberId; // 施工人员id
|
|
||||||
|
|
||||||
private String postId; // 岗位(0普通员工,1组长)
|
|
||||||
|
|
||||||
private String remark; // 备注
|
|
||||||
|
|
||||||
private LocalDateTime createTime; // 创建时间
|
|
||||||
|
|
||||||
private LocalDateTime updateTime; // 更新时间
|
|
||||||
}
|
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
package org.dromara.bigscreen.domain;
|
||||||
|
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实用工具对象 bus_sygj
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-05
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("bus_sygj")
|
||||||
|
public class BusSygj extends BaseEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具名
|
||||||
|
*/
|
||||||
|
private String gjm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具路径
|
||||||
|
*/
|
||||||
|
private String gjUrl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片id
|
||||||
|
*
|
||||||
|
* */
|
||||||
|
private Long imgId;
|
||||||
|
/**
|
||||||
|
* 图片路径
|
||||||
|
* */
|
||||||
|
private String imgUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核标志
|
||||||
|
*/
|
||||||
|
private String auditStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具类型 1内部 ,2外部
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述
|
||||||
|
*/
|
||||||
|
private String gnms;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,35 +0,0 @@
|
|||||||
package org.dromara.bigscreen.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class BusTour {
|
|
||||||
|
|
||||||
private Long id; // 主键ID
|
|
||||||
|
|
||||||
private Long projectId; // 项目id
|
|
||||||
|
|
||||||
private String tourCategory; // 类别字典(如:无人机识别、监控拍摄)
|
|
||||||
|
|
||||||
private String tourType; // 类型字典(如:安全帽、安全带)
|
|
||||||
|
|
||||||
private String picture; // 图片路径
|
|
||||||
|
|
||||||
private Integer num; // 违规数量
|
|
||||||
|
|
||||||
private String describe; // 故障描述
|
|
||||||
|
|
||||||
private Date createdAt; // 创建时间
|
|
||||||
|
|
||||||
private Date updatedAt; // 更新时间
|
|
||||||
|
|
||||||
private Date deletedAt; // 删除时间
|
|
||||||
|
|
||||||
private String tableName; // 表名
|
|
||||||
|
|
||||||
private Long tableId; // 表id
|
|
||||||
|
|
||||||
private String sxtName; // 摄像头名称
|
|
||||||
}
|
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
package org.dromara.bigscreen.domain;
|
||||||
|
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件中心对象 bus_wjzx
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-05
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("bus_wjzx")
|
||||||
|
public class BusWjzx extends BaseEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名
|
||||||
|
*/
|
||||||
|
private String wjm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件上传路径
|
||||||
|
*/
|
||||||
|
private String wjId;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件类型
|
||||||
|
*/
|
||||||
|
private String wjlx;
|
||||||
|
/**
|
||||||
|
* 文件描述
|
||||||
|
*/
|
||||||
|
private String gnms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核标志
|
||||||
|
*/
|
||||||
|
private String auditStatus;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,34 +0,0 @@
|
|||||||
package org.dromara.bigscreen.domain;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.IdType;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@TableName("sys_project_introduce")
|
|
||||||
public class SysProjectIntroduce {
|
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
|
||||||
private Long id; // 主键id
|
|
||||||
|
|
||||||
private Long projectId; // 项目id
|
|
||||||
|
|
||||||
private String headline; // 标题
|
|
||||||
|
|
||||||
private String richText; // 富文本
|
|
||||||
|
|
||||||
private String createdBy; // 创建人
|
|
||||||
|
|
||||||
private String updatedBy; // 更新人
|
|
||||||
|
|
||||||
private LocalDateTime createdAt; // 创建时间
|
|
||||||
|
|
||||||
private LocalDateTime updatedAt; // 更新时间
|
|
||||||
|
|
||||||
private LocalDateTime deletedAt; // 删除时间
|
|
||||||
|
|
||||||
private String files; // 附件
|
|
||||||
}
|
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
package org.dromara.bigscreen.domain;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色流程对应对象 sys_role_work
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-06
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("sys_role_work")
|
||||||
|
public class SysRoleWork extends BaseEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定角色ID
|
||||||
|
*/
|
||||||
|
private Long roleId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定项目id
|
||||||
|
*/
|
||||||
|
private Long projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程名称
|
||||||
|
*/
|
||||||
|
private String lcmc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程描述
|
||||||
|
*/
|
||||||
|
private String lcms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程详情
|
||||||
|
*/
|
||||||
|
private String lcxq;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
package org.dromara.bigscreen.domain.bo;
|
||||||
|
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import org.dromara.bigscreen.domain.SysRoleWork;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色流程对应业务对象 sys_role_work
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-06
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = SysRoleWork.class, reverseConvertGenerate = false)
|
||||||
|
public class SysRoleWorkBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定角色ID
|
||||||
|
*/
|
||||||
|
private Long roleId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定项目id
|
||||||
|
*/
|
||||||
|
private Long projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程名称
|
||||||
|
*/
|
||||||
|
private String lcmc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程描述
|
||||||
|
*/
|
||||||
|
private String lcms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程详情
|
||||||
|
*/
|
||||||
|
private String lcxq;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
package org.dromara.bigscreen.domain.dto;
|
||||||
|
|
||||||
|
import org.dromara.bigscreen.domain.BusBwl;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备忘录业务对象 bus_bwl
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-04
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = BusBwl.class, reverseConvertGenerate = false)
|
||||||
|
public class BusBwlBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备忘录ID
|
||||||
|
*/
|
||||||
|
@NotNull(message = "备忘录ID不能为空", groups = { EditGroup.class })
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标题
|
||||||
|
*/
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内容
|
||||||
|
*/
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态(0:未完成 1:已完成)
|
||||||
|
*/
|
||||||
|
private Long status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划开始时间
|
||||||
|
*/
|
||||||
|
private Date jhkssj;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计划结束时间
|
||||||
|
*/
|
||||||
|
private Date jhjssj;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
package org.dromara.bigscreen.domain.dto;
|
||||||
|
|
||||||
|
import org.dromara.bigscreen.domain.BusSygj;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实用工具业务对象 bus_sygj
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-05
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = BusSygj.class, reverseConvertGenerate = false)
|
||||||
|
public class BusSygjBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@NotNull(message = "不能为空", groups = { EditGroup.class })
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具名
|
||||||
|
*/
|
||||||
|
private String gjm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具路径
|
||||||
|
*/
|
||||||
|
private String gjUrl;
|
||||||
|
|
||||||
|
private Long imgId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片路径
|
||||||
|
* */
|
||||||
|
private String imgUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核标志
|
||||||
|
*/
|
||||||
|
private String auditStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工具类型 1内部 ,2外部
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 功能描述
|
||||||
|
*/
|
||||||
|
private String gnms;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
package org.dromara.bigscreen.domain.dto;
|
||||||
|
|
||||||
|
import org.dromara.bigscreen.domain.BusWjzx;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件中心业务对象 bus_wjzx
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-11-05
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = BusWjzx.class, reverseConvertGenerate = false)
|
||||||
|
public class BusWjzxBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@NotNull(message = "不能为空", groups = { EditGroup.class })
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件名
|
||||||
|
*/
|
||||||
|
private String wjm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件上传路径
|
||||||
|
*/
|
||||||
|
private String wjId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件描述
|
||||||
|
*/
|
||||||
|
private String gnms;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件类型
|
||||||
|
*/
|
||||||
|
private String wjlx;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核标志
|
||||||
|
*/
|
||||||
|
private String auditStatus;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user