Compare commits
309 Commits
7ccf5e4469
...
updateMenu
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b580788f1 | |||
| 7b6ff3bcc6 | |||
| 8e5303838e | |||
| 28f92b6138 | |||
| 8ece9617d6 | |||
| a5cf647f2b | |||
| 758e49973b | |||
| 876f8b700d | |||
| 53b777c7af | |||
| 5e749f6de6 | |||
| dcd0907cdd | |||
| 3f16621313 | |||
| 03b3c8141a | |||
| 509683386f | |||
| e3b6c3d8d6 | |||
| 29cdd7b3e7 | |||
| ee864c882a | |||
| 10e449c001 | |||
| 89d60dc528 | |||
| ce35086316 | |||
| e7376086f9 | |||
| 4588f3f4c0 | |||
| 97898aa395 | |||
| b4a7c6ba90 | |||
| 4d6a225f96 | |||
| 6d9b5a727d | |||
| a79e08f6bc | |||
| e49ab63a0b | |||
| 2b3c86e763 | |||
| 1263b4812d | |||
| 755969b069 | |||
| dbe8556741 | |||
| b10e7b4ca1 | |||
| 844b3addf3 | |||
| 77532caf47 | |||
| ff9cc76ebc | |||
| d125510267 | |||
| 46ac312ddf | |||
| c45d98856e | |||
| f2c0932e2e | |||
| b8334c7764 | |||
| c709e04c88 | |||
| 509fc8cc28 | |||
| 48338278f0 | |||
| 833ea7af7d | |||
| f5cea23daa | |||
| a29c9c8d4d | |||
| 511bf33914 | |||
| 4450f82717 | |||
| f62c542684 | |||
| bb8c951651 | |||
| 9f5b3918d0 | |||
| 84d9291763 | |||
| fcbc5a30c4 | |||
| 6f4eb21deb | |||
| 387a7488ab | |||
| 6819eb5f80 | |||
| 0f1ad34342 | |||
| 35d1cfc668 | |||
| a6dc40760d | |||
| 2486bb4c6e | |||
| a59a452f89 | |||
| 930bff6cba | |||
| 70c9997c82 | |||
| 0db70d3d73 | |||
| 2884699ff2 | |||
| 849eb802bc | |||
| 4ce8ea6a3a | |||
| 7e1db73fb0 | |||
| 46299e5732 | |||
| 6032869417 | |||
| 955d7e39e6 | |||
| ecc0595ec3 | |||
| 6b22ed8b0a | |||
| 9b7db3214e | |||
| 71b3c77028 | |||
| c7bd709240 | |||
| a80c38f87f | |||
| 7b91443532 | |||
| a9b9e12732 | |||
| 99ecb29f3c | |||
| 4fe7a435c6 | |||
| 18be0f00a3 | |||
| 67bbf94359 | |||
| 9dfea176b3 | |||
| 09d3b06e7a | |||
| 8b60d13c0a | |||
| 188172692b | |||
| 556f3b6535 | |||
| 0b81a8dc63 | |||
| 982ec18490 | |||
| 0c38c42bfe | |||
| 2f0b323680 | |||
| 35d2a10c0e | |||
| 9c7f9ad980 | |||
| 79a2dbfcd3 | |||
| b5b7324f7c | |||
| b171ec6af0 | |||
| 85c7ded162 | |||
| b39aa7be71 | |||
| 8ae5614ce9 | |||
| 03cf7ebac7 | |||
| 3efa899a97 | |||
| bf1b9cf98f | |||
| e800ff3ac9 | |||
| f0802432ed | |||
| c96808efc1 | |||
| e972efb247 | |||
| f782edd68b | |||
| 45702ef838 | |||
| 4e3faa7a23 | |||
| 40559d4d73 | |||
| 7816fec7aa | |||
| 37c95ab0bd | |||
| 3e38cf9abb | |||
| 4aaf384ce8 | |||
| 6a06d8596d | |||
| be89a6fe9e | |||
| 40b51e5e9d | |||
| 4b14ea5c7f | |||
| a44777d7b2 | |||
| 492fba5fd3 | |||
| 07b921d630 | |||
| 13d33e9d53 | |||
| 4f38db5fde | |||
| a868c7b5cb | |||
| d37b41c967 | |||
| b8fb9413de | |||
| fa9fcb1167 | |||
| ebd88a999c | |||
| 97079abdef | |||
| 94aaa90775 | |||
| 1e01c53c52 | |||
| 6c9e23e662 | |||
| 8a27da9975 | |||
| e160cc5ff3 | |||
| 80b5f94cd4 | |||
| c9c81bb761 | |||
| af90b0f879 | |||
| b51a3ccf28 | |||
| f07db8c368 | |||
| 5e9d36400c | |||
| 8f4a3e167a | |||
| 3ccd54a03b | |||
| 03177f58f2 | |||
| b0c875c9c4 | |||
| bfe74bdb4c | |||
| cad5ba1101 | |||
| 45d143ace3 | |||
| df08eb3dd6 | |||
| 8c292850c2 | |||
| 12d3924e8a | |||
| d32947afe2 | |||
| 9eecf67374 | |||
| d7fd7d6cc4 | |||
| 77482c71b3 | |||
| 66893410e9 | |||
| fbbc4846de | |||
| aac6efc568 | |||
| 209e624fc2 | |||
| fe79bf282c | |||
| 18cbc0655b | |||
| 6b59d264b4 | |||
| 74785a768e | |||
| 32aafaa2db | |||
| 06617d94a7 | |||
| 1b2f9aa755 | |||
| 04407d2f84 | |||
| c0fef2521f | |||
| 04430d8853 | |||
| 875b436eea | |||
| 2c1ca98e4e | |||
| 765490b51c | |||
| b116db0bcd | |||
| e2892b460b | |||
| 30b1586a4a | |||
| 15d86526ac | |||
| cdf5f8bf5b | |||
| 9bb41d903e | |||
| d5f1c22bd4 | |||
| d2dcf656df | |||
| 7191a60841 | |||
| 3f21d39653 | |||
| b520ea6afe | |||
| e6283bee1c | |||
| f6e1d0c73e | |||
| c7e06ade6d | |||
| 3d85b10475 | |||
| e26dfc098a | |||
| c3ab46c8c8 | |||
| e37d118d0c | |||
| a6c92e8ba9 | |||
| 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 |
1
xinnengyuan/.gitignore
vendored
1
xinnengyuan/.gitignore
vendored
@ -54,3 +54,4 @@ docs
|
||||
/file
|
||||
.idea/
|
||||
chat-memory/
|
||||
queries/
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>21</java.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>
|
||||
<easyexcel.version>4.0.3</easyexcel.version>
|
||||
<velocity.version>2.3</velocity.version>
|
||||
@ -86,6 +86,15 @@
|
||||
<activeByDefault>true</activeByDefault>
|
||||
</activation>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>menu</id>
|
||||
<properties>
|
||||
<profiles.active>menu</profiles.active>
|
||||
<logging.level>info</logging.level>
|
||||
<monitor.username>ruoyi</monitor.username>
|
||||
<monitor.password>123456</monitor.password>
|
||||
</properties>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>prod</id>
|
||||
<properties>
|
||||
|
||||
@ -5,6 +5,8 @@ import cn.hutool.captcha.AbstractCaptcha;
|
||||
import cn.hutool.captcha.generator.CodeGenerator;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -76,7 +78,7 @@ public class CaptchaController {
|
||||
SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, map);
|
||||
if (!smsResponse.isSuccess()) {
|
||||
log.error("验证码短信发送异常 => {}", smsResponse);
|
||||
return R.fail(smsResponse.getData().toString());
|
||||
return R.fail(parseData(smsResponse));
|
||||
}
|
||||
return R.ok();
|
||||
}
|
||||
@ -140,4 +142,35 @@ public class CaptchaController {
|
||||
return R.ok(captchaVo);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static String parseData(SmsResponse smsResponse ) {
|
||||
try {
|
||||
JSONObject json = JSONUtil.parseObj(smsResponse.getData());
|
||||
// 核心:用 JsonUtil 解析 data,通过键路径 "Response.SendStatusSet[0].Code" 提取字段
|
||||
// 键路径规则:层级用 "." 分隔,列表索引用 "[0]" 表示(第 1 个元素)
|
||||
String code = json.getByPath("Response.SendStatusSet[0].Code", String.class);
|
||||
System.out.println("错误码:" + code); // 输出:FailedOperation.InsufficientBalanceInSmsPackage
|
||||
return convert(code);
|
||||
} catch (Exception e) {
|
||||
return "短信发送未知错误";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static String convert(String code) {
|
||||
return switch (code) {
|
||||
case "FailedOperation.InsufficientBalanceInSmsPackage" -> "套餐包余量不足,请购买套餐包";
|
||||
case "InternalError.SendAndRecvFail" -> "短信收发超时,请检查您的网络是否有波动";
|
||||
case "InvalidParameterValue.IncorrectPhoneNumber" -> "手机号格式错误";
|
||||
case "LimitExceeded.AppCountryOrRegionDailyLimit" -> "业务短信国家/地区日下发条数超过设定的上限";
|
||||
case "LimitExceeded.AppDailyLimit" -> "业务短信日下发条数超过设定的上限";
|
||||
case "LimitExceeded.PhoneNumberDailyLimit" -> "单个手机号日下发短信条数超过设定的上限";
|
||||
case "UnauthorizedOperation.ServiceSuspendDueToArrears" -> "欠费被停止服务";
|
||||
case "UnsupportedOperation.UnsupportedRegion" -> "不支持该地区短信下发";
|
||||
default -> "短信发送未知错误";
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -41,7 +41,7 @@ spring:
|
||||
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
|
||||
chat:
|
||||
options:
|
||||
model: qwen-plus
|
||||
model: qwen3-max
|
||||
datasource:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||
@ -66,7 +66,7 @@ spring:
|
||||
# username: xinnengyuan
|
||||
# password: mEZPC5Sdf3r2HENi
|
||||
# 从库数据源
|
||||
# slave:
|
||||
# slave:
|
||||
# lazy: true
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||
@ -368,3 +368,14 @@ drone:
|
||||
chat:
|
||||
server:
|
||||
port: 19099
|
||||
# rabbitmq 配置
|
||||
rabbitmq:
|
||||
exchange-name: dev-normal-exchange
|
||||
queue-name: dev-normal-queue
|
||||
routing-key: dev.normal.routing.key
|
||||
delay-exchange-name: dev-delay-queue
|
||||
delay-queue-name: dev-delay-exchange
|
||||
delay-routing-key: dev.delay.routing.key
|
||||
dead-letter-exchange: dev-dlx-exchange
|
||||
dead-letter-queue: dev-dlx-queue
|
||||
dead-letter-routing-key: dev.dlx.routing.key
|
||||
|
||||
@ -41,10 +41,10 @@ snail-job:
|
||||
spring:
|
||||
ai:
|
||||
dashscope:
|
||||
api-key: xxx
|
||||
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
|
||||
chat:
|
||||
options:
|
||||
model: qwen-plus
|
||||
model: qwen3-max
|
||||
datasource:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||
@ -343,3 +343,14 @@ drone:
|
||||
chat:
|
||||
server:
|
||||
port: 18088
|
||||
# rabbitmq 配置
|
||||
rabbitmq:
|
||||
exchange-name: local-normal-exchange
|
||||
queue-name: local-normal-queue
|
||||
routing-key: local.normal.routing.key
|
||||
delay-exchange-name: local-delay-queue
|
||||
delay-queue-name: local-delay-exchange
|
||||
delay-routing-key: local.delay.routing.key
|
||||
dead-letter-exchange: local-dlx-exchange
|
||||
dead-letter-queue: local-dlx-queue
|
||||
dead-letter-routing-key: local.dlx.routing.key
|
||||
|
||||
356
xinnengyuan/ruoyi-admin/src/main/resources/application-menu.yml
Normal file
356
xinnengyuan/ruoyi-admin/src/main/resources/application-menu.yml
Normal file
@ -0,0 +1,356 @@
|
||||
# 开发环境配置
|
||||
server:
|
||||
# 服务器的HTTP端口,默认为8080
|
||||
port: 9528
|
||||
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
||||
spring.servlet.multipart.location: /ruoyi/server/temp
|
||||
|
||||
--- # 监控中心配置
|
||||
spring.boot.admin.client:
|
||||
# 增加客户端开关
|
||||
enabled: false
|
||||
url: http://localhost:9090/admin
|
||||
instance:
|
||||
service-host-type: IP
|
||||
metadata:
|
||||
username: ${spring.boot.admin.client.username}
|
||||
userpassword: ${spring.boot.admin.client.password}
|
||||
username: @monitor.username@
|
||||
password: @monitor.password@
|
||||
|
||||
--- # snail-job 配置
|
||||
snail-job:
|
||||
enabled: false
|
||||
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
||||
group: "ruoyi_group"
|
||||
# SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config`表
|
||||
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
||||
server:
|
||||
host: 127.0.0.1
|
||||
port: 17888
|
||||
# 命名空间UUID 详见 script/sql/ry_job.sql `sj_namespace`表`unique_id`字段
|
||||
namespace: ${spring.profiles.active}
|
||||
# 随主应用端口漂移
|
||||
port: 2${server.port}
|
||||
# 客户端ip指定
|
||||
host:
|
||||
# RPC类型: netty, grpc
|
||||
rpc-type: grpc
|
||||
|
||||
--- # 数据源配置
|
||||
spring:
|
||||
ai:
|
||||
dashscope:
|
||||
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
|
||||
chat:
|
||||
options:
|
||||
model: qwen3-max
|
||||
datasource:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||
dynamic:
|
||||
# 性能分析插件(有性能损耗 不建议生产环境使用)
|
||||
p6spy: false
|
||||
# 设置默认的数据源或者数据源组,默认值即为 master
|
||||
primary: master
|
||||
# 严格模式 匹配不到数据源则报错
|
||||
strict: true
|
||||
datasource:
|
||||
# 主库数据源
|
||||
master:
|
||||
type: ${spring.datasource.type}
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
|
||||
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
|
||||
url: jdbc:mysql://192.168.110.2:13386/xinnengyuanmenu?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
username: xinnengyuanmenu
|
||||
password: 2RkXFG8ZE6r5LL7B
|
||||
# # 从库数据源
|
||||
# slave:
|
||||
# lazy: true
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||
# url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
# username:
|
||||
# password:
|
||||
# oracle:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: oracle.jdbc.OracleDriver
|
||||
# url: jdbc:oracle:thin:@//localhost:1521/XE
|
||||
# username: ROOT
|
||||
# password: root
|
||||
# postgres:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: org.postgresql.Driver
|
||||
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
|
||||
# username: root
|
||||
# password: root
|
||||
# sqlserver:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
|
||||
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
|
||||
# username: SA
|
||||
# password: root
|
||||
hikari:
|
||||
# 最大连接池数量
|
||||
maxPoolSize: 20
|
||||
# 最小空闲线程数量
|
||||
minIdle: 10
|
||||
# 配置获取连接等待超时的时间
|
||||
connectionTimeout: 30000
|
||||
# 校验超时时间
|
||||
validationTimeout: 5000
|
||||
# 空闲连接存活最大时间,默认10分钟
|
||||
idleTimeout: 600000
|
||||
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
|
||||
maxLifetime: 1800000
|
||||
# 多久检查一次连接的活性
|
||||
keepaliveTime: 30000
|
||||
|
||||
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
|
||||
spring.data:
|
||||
redis:
|
||||
# 地址
|
||||
host: 192.168.110.2
|
||||
# 端口,默认为6379
|
||||
port: 9287
|
||||
# 数据库索引
|
||||
database: 21
|
||||
# redis 密码必须配置
|
||||
password: syar23rdsaagdrsa
|
||||
# 连接超时时间
|
||||
timeout: 10s
|
||||
# 是否开启ssl
|
||||
ssl.enabled: false
|
||||
|
||||
# redisson 配置
|
||||
redisson:
|
||||
# redis key前缀
|
||||
keyPrefix:
|
||||
# 线程池数量
|
||||
threads: 16
|
||||
# Netty线程池数量
|
||||
nettyThreads: 32
|
||||
# 单节点配置
|
||||
singleServerConfig:
|
||||
# 客户端名称
|
||||
clientName: ${ruoyi.name}
|
||||
# 最小空闲连接数
|
||||
connectionMinimumIdleSize: 32
|
||||
# 连接池大小
|
||||
connectionPoolSize: 64
|
||||
# 连接空闲超时,单位:毫秒
|
||||
idleConnectionTimeout: 10000
|
||||
# 命令等待超时,单位:毫秒
|
||||
timeout: 3000
|
||||
# 发布和订阅连接池大小
|
||||
subscriptionConnectionPoolSize: 50
|
||||
|
||||
--- # mail 邮件发送
|
||||
mail:
|
||||
enabled: false
|
||||
host: smtp.163.com
|
||||
port: 465
|
||||
# 是否需要用户名密码验证
|
||||
auth: true
|
||||
# 发送方,遵循RFC-822标准
|
||||
from: xxx@163.com
|
||||
# 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
|
||||
user: xxx@163.com
|
||||
# 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
|
||||
pass: xxxxxxxxxx
|
||||
# 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
|
||||
starttlsEnable: true
|
||||
# 使用SSL安全连接
|
||||
sslEnable: true
|
||||
# SMTP超时时长,单位毫秒,缺省值不超时
|
||||
timeout: 0
|
||||
# Socket连接超时值,单位毫秒,缺省值不超时
|
||||
connectionTimeout: 0
|
||||
|
||||
--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
|
||||
# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用
|
||||
sms:
|
||||
# 配置源类型用于标定配置来源(interface,yaml)
|
||||
config-type: yaml
|
||||
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
||||
restricted: false
|
||||
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
||||
minute-max: 1
|
||||
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
||||
account-max: 30
|
||||
# 以下配置来自于 org.dromara.sms4j.provider.config.BaseConfig类中
|
||||
blends:
|
||||
# 唯一ID 用于发送短信寻找具体配置 随便定义别用中文即可
|
||||
# 可以同时存在两个相同厂商 例如: ali1 ali2 两个不同的阿里短信账号 也可用于区分租户
|
||||
config1:
|
||||
# 框架定义的厂商名称标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
|
||||
supplier: alibaba
|
||||
# 有些称为accessKey有些称之为apiKey,也有称为sdkKey或者appId。
|
||||
access-key-id: 您的accessKey
|
||||
# 称为accessSecret有些称之为apiSecret
|
||||
access-key-secret: 您的accessKeySecret
|
||||
signature: 您的短信签名
|
||||
sdk-app-id: 您的sdkAppId
|
||||
config2:
|
||||
# 登录
|
||||
supplier: tencent
|
||||
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
|
||||
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
|
||||
signature: 重庆远界大数据研究院
|
||||
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:
|
||||
# 前端外网访问地址
|
||||
address: http://localhost:80
|
||||
type:
|
||||
maxkey:
|
||||
# maxkey 服务器地址
|
||||
# 注意 如下均配置均不需要修改 maxkey 已经内置好了数据
|
||||
server-url: http://sso.maxkey.top
|
||||
client-id: 876892492581044224
|
||||
client-secret: x1Y5MTMwNzIwMjMxNTM4NDc3Mzche8
|
||||
redirect-uri: ${justauth.address}/social-callback?source=maxkey
|
||||
topiam:
|
||||
# topiam 服务器地址
|
||||
server-url: http://127.0.0.1:1989/api/v1/authorize/y0q************spq***********8ol
|
||||
client-id: 449c4*********937************759
|
||||
client-secret: ac7***********1e0************28d
|
||||
redirect-uri: ${justauth.address}/social-callback?source=topiam
|
||||
scopes: [ openid, email, phone, profile ]
|
||||
qq:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=qq
|
||||
union-id: false
|
||||
weibo:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=weibo
|
||||
gitee:
|
||||
client-id: 91436b7940090d09c72c7daf85b959cfd5f215d67eea73acbf61b6b590751a98
|
||||
client-secret: 02c6fcfd70342980cd8dd2f2c06c1a350645d76c754d7a264c4e125f9ba915ac
|
||||
redirect-uri: ${justauth.address}/social-callback?source=gitee
|
||||
dingtalk:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=dingtalk
|
||||
baidu:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=baidu
|
||||
csdn:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=csdn
|
||||
coding:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=coding
|
||||
coding-group-name: xx
|
||||
oschina:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=oschina
|
||||
alipay_wallet:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=alipay_wallet
|
||||
alipay-public-key: MIIB**************DAQAB
|
||||
wechat_open:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=wechat_open
|
||||
wechat_mp:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=wechat_mp
|
||||
wechat_enterprise:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=wechat_enterprise
|
||||
agent-id: 1000002
|
||||
gitlab:
|
||||
client-id: 10**********6
|
||||
client-secret: 1f7d08**********5b7**********29e
|
||||
redirect-uri: ${justauth.address}/social-callback?source=gitlab
|
||||
# 和风天气 https://dev.qweather.com/
|
||||
weather:
|
||||
key-id: T65EAABUXC
|
||||
project-id: 2JTHPUQ5YY
|
||||
private-key: MC4CAQAwBQYDK2VwBCIEIMAglX7IsxYiTeM+FXXnvCUsIggajeP4s8gAllewm6BN
|
||||
api-host: n35rk53njv.re.qweatherapi.com
|
||||
# dxf转 geojson 执行文件名
|
||||
dxf2GeoJson:
|
||||
file-name: main
|
||||
ys7:
|
||||
app-key: xxx
|
||||
app-secret: xxx
|
||||
job:
|
||||
capture-enabled: false # 控制是否启用萤石抓拍任务
|
||||
device-sync-enabled: false # 控制是否同步萤石设备
|
||||
# 斯巴达算法
|
||||
sparta:
|
||||
url: http://119.3.204.120:8040
|
||||
client-id: test
|
||||
client-secret: 115fcb08fa6742a1b086d9bb80a6ad59
|
||||
# 身份证加密密钥(32 位)
|
||||
id-card:
|
||||
encrypt-key: 7ae260d150a14027d2238a1cf80a48ef
|
||||
recognizer:
|
||||
url: http://192.168.110.5:50071
|
||||
|
||||
qrCode:
|
||||
url: http://xny.yj-3d.com:7788
|
||||
# 无人机大图
|
||||
drone:
|
||||
url: http://192.168.110.2:9512
|
||||
# 聊天服务
|
||||
chat:
|
||||
server:
|
||||
port: 17077
|
||||
# rabbitmq 配置
|
||||
rabbitmq:
|
||||
exchange-name: menu-normal-exchange
|
||||
queue-name: menu-normal-queue
|
||||
routing-key: menu.normal.routing.key
|
||||
delay-exchange-name: menu-delay-queue
|
||||
delay-queue-name: menu-delay-exchange
|
||||
delay-routing-key: menu.delay.routing.key
|
||||
dead-letter-exchange: menu-dlx-exchange
|
||||
dead-letter-queue: menu-dlx-queue
|
||||
dead-letter-routing-key: menu.dlx.routing.key
|
||||
@ -41,10 +41,10 @@ snail-job:
|
||||
spring:
|
||||
ai:
|
||||
dashscope:
|
||||
api-key: xxx
|
||||
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
|
||||
chat:
|
||||
options:
|
||||
model: qwen-plus
|
||||
model: qwen3-max
|
||||
datasource:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||
@ -358,3 +358,14 @@ drone:
|
||||
chat:
|
||||
server:
|
||||
port: 19099
|
||||
# rabbitmq 配置
|
||||
rabbitmq:
|
||||
exchange-name: prod-normal-exchange
|
||||
queue-name: prod-normal-queue
|
||||
routing-key: prod.normal.routing.key
|
||||
delay-exchange-name: prod-delay-queue
|
||||
delay-queue-name: prod-delay-exchange
|
||||
delay-routing-key: prod.delay.routing.key
|
||||
dead-letter-exchange: prod-dlx-exchange
|
||||
dead-letter-queue: prod-dlx-queue
|
||||
dead-letter-routing-key: prod.dlx.routing.key
|
||||
|
||||
@ -76,9 +76,9 @@ spring:
|
||||
servlet:
|
||||
multipart:
|
||||
# 单个文件大小
|
||||
max-file-size: 200MB
|
||||
max-file-size: 1024MB
|
||||
# 设置总上传的文件大小
|
||||
max-request-size: 200MB
|
||||
max-request-size: 1024MB
|
||||
mvc:
|
||||
# 设置静态资源路径 防止所有请求都去查静态资源
|
||||
static-path-pattern: /static/**
|
||||
@ -95,7 +95,13 @@ spring:
|
||||
deserialization:
|
||||
# 允许对象忽略json中不存在的属性
|
||||
fail_on_unknown_properties: false
|
||||
|
||||
rabbitmq:
|
||||
host: 192.168.110.2
|
||||
port: 5672
|
||||
username: admin
|
||||
password: yuanjiexny
|
||||
publisher-returns: true
|
||||
publisher-confirm-type: correlated
|
||||
# Sa-Token配置
|
||||
sa-token:
|
||||
# token名称 (同时也是cookie名称)
|
||||
@ -109,7 +115,9 @@ sa-token:
|
||||
# token有效期,单位s 默认30天, -1代表永不过期
|
||||
timeout: 2592000
|
||||
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
|
||||
active-timeout: 86400
|
||||
active-timeout: 2592000
|
||||
# 同一账号最大登录数量,-1代表不限
|
||||
max-login-count: -1
|
||||
|
||||
# security配置
|
||||
security:
|
||||
@ -135,6 +143,7 @@ security:
|
||||
- /facility/matrix/**
|
||||
- /hat/device/data
|
||||
- /websocket/ue
|
||||
- /websocket/vehicle
|
||||
|
||||
# 多租户配置
|
||||
tenant:
|
||||
@ -173,7 +182,7 @@ mybatis-plus:
|
||||
# 数据加密
|
||||
mybatis-encryptor:
|
||||
# 是否开启加密
|
||||
enable: false
|
||||
enable: true
|
||||
# 默认加密算法
|
||||
algorithm: BASE64
|
||||
# 编码方式 BASE64/HEX。默认BASE64
|
||||
@ -207,6 +216,10 @@ api-decrypt:
|
||||
- /gps/equipment/dataAcceptance # GPS数据接收接口
|
||||
|
||||
springdoc:
|
||||
default-flat-param-object: true
|
||||
swagger-ui:
|
||||
path: /swagger-ui.html
|
||||
tags-sorter: alpha
|
||||
api-docs:
|
||||
# 是否开启接口文档
|
||||
enabled: true
|
||||
@ -226,10 +239,14 @@ springdoc:
|
||||
components:
|
||||
# 鉴权方式配置
|
||||
security-schemes:
|
||||
apiKey:
|
||||
type: APIKEY
|
||||
Authorization:
|
||||
type: HTTP
|
||||
in: HEADER
|
||||
name: ${sa-token.token-name}
|
||||
Clientid:
|
||||
type: HTTP
|
||||
in: HEADER
|
||||
name: Clientid
|
||||
#这里定义了两个分组,可定义多个,也可以不定义
|
||||
group-configs:
|
||||
- group: 1.通用模块
|
||||
@ -294,6 +311,12 @@ springdoc:
|
||||
packages-to-scan: org.dromara.ai
|
||||
- group: 31.投标管理模块
|
||||
packages-to-scan: org.dromara.bidding
|
||||
- group: 32.设备模块
|
||||
packages-to-scan: org.dromara.device
|
||||
- group: 33.摄像头模块
|
||||
packages-to-scan: org.dromara.other
|
||||
- group: 34.机械模块
|
||||
packages-to-scan: org.dromara.mechanical
|
||||
# knife4j的增强配置,不需要增强可以不配
|
||||
knife4j:
|
||||
enable: true
|
||||
@ -318,6 +341,8 @@ xss:
|
||||
- /xzd/fenbaohetongbiangg/**
|
||||
- /xzd/fenbaohetongxinxi/**
|
||||
- /xzd/contractManagement/**
|
||||
- /xzd/jixiehetongxinxi/contractMachinery/**
|
||||
- /xzd/jixiehetongbiang/machineryContractAlteration/**
|
||||
|
||||
# 全局线程池相关配置
|
||||
# 如使用JDK21请直接使用虚拟线程 不要开启此配置
|
||||
|
||||
@ -24,6 +24,7 @@ import org.dromara.facility.domain.FacMatrix;
|
||||
import org.dromara.facility.service.IFacMatrixService;
|
||||
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
|
||||
import org.dromara.facility.service.IFacPhotovoltaicPanelService;
|
||||
import org.dromara.manager.recognizermanager.enums.RecognizerTypeEnum;
|
||||
import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult;
|
||||
import org.dromara.manager.ys7manager.Ys7Constant;
|
||||
import org.dromara.manager.ys7manager.Ys7Manager;
|
||||
@ -403,7 +404,8 @@ public class DemoTest {
|
||||
@Test
|
||||
void testImport() {
|
||||
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
|
||||
|
||||
@ -1,14 +1,23 @@
|
||||
package org.dromara.test;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.manager.recognizermanager.RecognizerManager;
|
||||
import org.dromara.manager.recognizermanager.enums.RecognizerTypeEnum;
|
||||
import org.dromara.manager.recognizermanager.vo.RecognizeVo;
|
||||
import org.dromara.progress.domain.PgsProgressPlanDetail;
|
||||
import org.dromara.progress.domain.vo.progressplandetail.PgsProgressPlanDetailFinishedVo;
|
||||
import org.dromara.progress.service.IPgsProgressPlanDetailService;
|
||||
import org.dromara.progress.service.IPgsProgressPlanService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
@ -21,9 +30,55 @@ public class RecognizerTest {
|
||||
@Resource
|
||||
private RecognizerManager recognizerManager;
|
||||
|
||||
@Resource
|
||||
private IPgsProgressPlanDetailService progressPlanDetailService;
|
||||
|
||||
@Resource
|
||||
private IPgsProgressPlanService progressPlanService;
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.PANEL));
|
||||
log.info("recognize: {}", recognize);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testChange() {
|
||||
recognizerManager.convertCoordinate("http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/11/11/d48767a62bc04867a552e06ba6712004.tif", List.of());
|
||||
}
|
||||
|
||||
@Test
|
||||
void checkNumber() {
|
||||
List<PgsProgressPlanDetail> detailList = progressPlanDetailService.list();
|
||||
List<PgsProgressPlanDetail> planDetailList = detailList.stream()
|
||||
.filter(detail -> StringUtils.isNotBlank(detail.getFinishedDetail()))
|
||||
.toList();
|
||||
Map<String, List<PgsProgressPlanDetail>> collect = planDetailList.stream()
|
||||
.collect(Collectors.groupingBy(PgsProgressPlanDetail::getFinishedDetail));
|
||||
// 遍历分组结果,输出重复项
|
||||
for (Map.Entry<String, List<PgsProgressPlanDetail>> entry : collect.entrySet()) {
|
||||
String fieldValue = entry.getKey();
|
||||
List<PgsProgressPlanDetail> duplicates = entry.getValue();
|
||||
if (duplicates.size() > 1) { // 筛选出有重复的字段值
|
||||
PgsProgressPlanDetail first = duplicates.getFirst();
|
||||
Long id = first.getId();
|
||||
Long planId = first.getProgressPlanId();
|
||||
progressPlanService.removeById(planId);
|
||||
progressPlanDetailService.removeById(id);
|
||||
System.out.println("重复对象的对象:" + duplicates.stream().map(PgsProgressPlanDetail::getId).toList());
|
||||
}
|
||||
}
|
||||
for (PgsProgressPlanDetail detail : detailList) {
|
||||
BigDecimal aiFill = detail.getFinishedNumber();
|
||||
String finishedDetail = detail.getFinishedDetail();
|
||||
if (StringUtils.isBlank(finishedDetail)) {
|
||||
continue;
|
||||
}
|
||||
// log.info("id: {}, finishedDetail: {}", detail.getId(), finishedDetail);
|
||||
List<PgsProgressPlanDetailFinishedVo> finishedVos = JSONUtil.toList(finishedDetail, PgsProgressPlanDetailFinishedVo.class);
|
||||
if (aiFill.compareTo(BigDecimal.valueOf(finishedVos.size())) != 0) {
|
||||
log.info("数量异常:{}:{}", detail.getId(), detail.getProgressCategoryId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,6 +59,18 @@ public class AsyncConfig implements AsyncConfigurer {
|
||||
return executor;
|
||||
}
|
||||
|
||||
// 解压线程池(大文件操作,不需要太多线程)
|
||||
@Bean("unzipExecutor")
|
||||
public Executor unzipExecutor() {
|
||||
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||
executor.setCorePoolSize(2);
|
||||
executor.setMaxPoolSize(4);
|
||||
executor.setQueueCapacity(10);
|
||||
executor.setThreadNamePrefix("unzip-");
|
||||
executor.initialize();
|
||||
return executor;
|
||||
}
|
||||
|
||||
/**
|
||||
* 异步执行异常处理
|
||||
*/
|
||||
|
||||
@ -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 XzdProjectManagerApprovalService {
|
||||
|
||||
String selectNmaeByIds(String ids);
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdSjContractInfoService {
|
||||
|
||||
String selectNameByIds(String ids);
|
||||
}
|
||||
@ -0,0 +1,146 @@
|
||||
package org.dromara.common.core.utils;
|
||||
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* 时间戳转换工具类(包含时分秒提取)
|
||||
*/
|
||||
public class TimestampUtils {
|
||||
|
||||
// 默认时区(东八区)
|
||||
private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getTimeZone("GMT+8");
|
||||
|
||||
// 完整日期格式
|
||||
private static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
// 时分秒格式
|
||||
private static final String TIME_FORMAT = "HH:mm:ss";
|
||||
|
||||
// 日期格式
|
||||
private static final String DATE_FORMAT = "yyyy-MM-dd";
|
||||
|
||||
/**
|
||||
* 将日期字符串转为秒级时间戳(优化版)
|
||||
* 支持格式:"2025-12-03 23:59:59"、"2025-12-03"等
|
||||
* @param dateStr 日期字符串
|
||||
* @return 秒级时间戳
|
||||
*/
|
||||
public static Long parseDateToTimestamp(String dateStr) {
|
||||
if (StrUtil.isBlank(dateStr)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 使用Hutool的DateUtil进行智能解析(推荐)
|
||||
try {
|
||||
Date date = DateUtil.parse(dateStr);
|
||||
return date.getTime() / 1000L; // 转为秒级时间戳
|
||||
} catch (Exception e) {
|
||||
throw new IllegalArgumentException(
|
||||
String.format("日期格式错误:%s,支持格式:yyyy-MM-dd HH:mm:ss、yyyy-MM-dd等", dateStr)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将时间戳转换为完整日期格式(yyyy-MM-dd HH:mm:ss)
|
||||
*/
|
||||
public static String formatTimestamp(Object timestamp) {
|
||||
if (timestamp == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String timestampStr = timestamp.toString().trim();
|
||||
if (StrUtil.isBlank(timestampStr)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Long time = parseToMilliseconds(timestampStr);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(FULL_DATE_FORMAT);
|
||||
sdf.setTimeZone(DEFAULT_TIME_ZONE);
|
||||
return sdf.format(new Date(time));
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取时间戳中的时分秒部分(HH:mm:ss)
|
||||
*/
|
||||
public static String extractTime(Object timestamp) {
|
||||
if (timestamp == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String timestampStr = timestamp.toString().trim();
|
||||
if (StrUtil.isBlank(timestampStr)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Long time = parseToMilliseconds(timestampStr);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT);
|
||||
sdf.setTimeZone(DEFAULT_TIME_ZONE);
|
||||
return sdf.format(new Date(time));
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取时间戳中的日期部分(yyyy-MM-dd)
|
||||
*/
|
||||
public static String extractDate(Object timestamp) {
|
||||
if (timestamp == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String timestampStr = timestamp.toString().trim();
|
||||
if (StrUtil.isBlank(timestampStr)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Long time = parseToMilliseconds(timestampStr);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
|
||||
sdf.setTimeZone(DEFAULT_TIME_ZONE);
|
||||
return sdf.format(new Date(time));
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析时间戳字符串为毫秒级时间戳
|
||||
*/
|
||||
private static Long parseToMilliseconds(String timestampStr) {
|
||||
try {
|
||||
Long time = Long.parseLong(timestampStr);
|
||||
// 10位秒级时间戳转为13位毫秒级
|
||||
if (timestampStr.length() == 10) {
|
||||
time = time * 1000;
|
||||
}
|
||||
return time;
|
||||
} catch (NumberFormatException e) {
|
||||
throw new IllegalArgumentException("时间戳格式错误:" + timestampStr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取时间戳对应的小时
|
||||
*/
|
||||
public static int getHour(Object timestamp) {
|
||||
String timeStr = extractTime(timestamp);
|
||||
return Integer.parseInt(timeStr.split(":")[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取时间戳对应的分钟
|
||||
*/
|
||||
public static int getMinute(Object timestamp) {
|
||||
String timeStr = extractTime(timestamp);
|
||||
return Integer.parseInt(timeStr.split(":")[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取时间戳对应的秒
|
||||
*/
|
||||
public static int getSecond(Object timestamp) {
|
||||
String timeStr = extractTime(timestamp);
|
||||
return Integer.parseInt(timeStr.split(":")[2]);
|
||||
}
|
||||
}
|
||||
@ -44,7 +44,17 @@
|
||||
<dependency>
|
||||
<groupId>com.github.xiaoymin</groupId>
|
||||
<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>
|
||||
|
||||
</dependencies>
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
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.Operation;
|
||||
import io.swagger.v3.oas.models.Paths;
|
||||
import io.swagger.v3.oas.models.info.Info;
|
||||
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.handler.OpenApiHandler;
|
||||
import org.springdoc.core.configuration.SpringDocConfiguration;
|
||||
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
|
||||
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
|
||||
import org.springdoc.core.customizers.OpenApiCustomizer;
|
||||
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.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -61,7 +65,6 @@ public class SpringDocConfig {
|
||||
keySet.forEach(securityRequirement::addList);
|
||||
list.add(securityRequirement);
|
||||
openApi.security(list);
|
||||
|
||||
return openApi;
|
||||
}
|
||||
|
||||
@ -123,4 +126,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")
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -73,8 +73,7 @@ public class ExcelReader {
|
||||
|
||||
// 从MultipartFile获取输入流
|
||||
try (InputStream stream = file.getInputStream();
|
||||
org.apache.poi.ss.usermodel.Workbook workbook = isXlsx ?
|
||||
new XSSFWorkbook(stream) : new HSSFWorkbook(stream)) {
|
||||
Workbook workbook = WorkbookFactory.create(stream)) {
|
||||
|
||||
for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) {
|
||||
org.apache.poi.ss.usermodel.Sheet sheet = workbook.getSheetAt(sheetIndex);
|
||||
|
||||
@ -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.util.IdUtil;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.ExcelReader;
|
||||
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.metadata.WriteSheet;
|
||||
import com.alibaba.excel.write.metadata.fill.FillConfig;
|
||||
@ -14,27 +17,27 @@ import jakarta.servlet.ServletOutputStream;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.core.utils.file.FileUtils;
|
||||
import org.dromara.common.excel.convert.ExcelBigNumberConvert;
|
||||
import org.dromara.common.excel.core.*;
|
||||
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.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Excel相关处理
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Slf4j
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class ExcelUtil {
|
||||
|
||||
@ -48,6 +51,41 @@ public class ExcelUtil {
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出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安全问题)
|
||||
*
|
||||
@ -213,7 +282,9 @@ public class ExcelUtil {
|
||||
* @param clazz 实体类
|
||||
* @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);
|
||||
ExcelWriter excelWriter = null;
|
||||
ServletOutputStream os = response.getOutputStream();
|
||||
@ -224,6 +295,9 @@ public class ExcelUtil {
|
||||
.head(clazz)
|
||||
.autoCloseStream(false)
|
||||
.registerConverter(new ExcelBigNumberConvert())
|
||||
// 自动适配
|
||||
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
|
||||
.registerWriteHandler(new DataWriteHandler(clazz))
|
||||
.build();
|
||||
|
||||
|
||||
@ -252,12 +326,71 @@ public class ExcelUtil {
|
||||
excelWriter.finish();
|
||||
} 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 {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -91,7 +91,7 @@ public class PlusDataPermissionHandler {
|
||||
DataPermissionHelper.setVariable("user", currentUser);
|
||||
}
|
||||
// 如果是超级管理员或租户管理员,则不过滤数据
|
||||
if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) {
|
||||
if (LoginHelper.isSuperAdmin()) {
|
||||
return where;
|
||||
}
|
||||
// 构造数据过滤条件的 SQL 片段
|
||||
|
||||
@ -44,10 +44,6 @@ public interface TransConstant {
|
||||
String XZD_KHXX_ID_TO_NAME = "khxx_id_to_name";
|
||||
|
||||
|
||||
// /**
|
||||
// * 供应商id转名称
|
||||
// */
|
||||
// String XZD_KHXX_ID_TO_NAME = "gysxx_id_to_name";
|
||||
|
||||
/**
|
||||
* 新中大项目id转名称
|
||||
@ -57,6 +53,12 @@ public interface TransConstant {
|
||||
* 采购合同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转名称
|
||||
*/
|
||||
@ -69,4 +71,21 @@ public interface TransConstant {
|
||||
* 新中大供应商信息-开户银行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";
|
||||
|
||||
/**
|
||||
* 新中大-设计合同信息id转name
|
||||
*/
|
||||
String XZD_SJ_CONTRACT_INFO_ID_TO_NAME = "xzd_sj_contract_info_id_to_name";
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,23 +1,23 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.dromara.common.core.service.XzdSupplierInfoService;
|
||||
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_KHXX_ID_TO_NAME)
|
||||
public class XzdSupplierInfoImpl implements TranslationInterface<String> {
|
||||
|
||||
private final XzdSupplierInfoService xzdSupplierInfoService;
|
||||
@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 xzdSupplierInfoService.selectNmaeByIds(ids);
|
||||
return xzdCbysZjhcbService.selectNmaeByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdSupplierInfoService.selectNmaeByIds(id.toString());
|
||||
return xzdCbysZjhcbService.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.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,24 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.dromara.common.core.service.XzdSjContractInfoService;
|
||||
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_SJ_CONTRACT_INFO_ID_TO_NAME)
|
||||
public class XzdSjContractInfoImpl implements TranslationInterface<String> {
|
||||
|
||||
private final XzdSjContractInfoService xzdSjContractInfoService;
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdSjContractInfoService.selectNameByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdSjContractInfoService.selectNameByIds(id.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -8,7 +8,10 @@ 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.XzdSupplierInfoImpl
|
||||
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
|
||||
org.dromara.common.translation.core.impl.XzdSjContractInfoImpl
|
||||
|
||||
@ -45,8 +45,7 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
|
||||
String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
|
||||
String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
|
||||
String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
|
||||
String projectIdStr = ServletUtils.getRequest().getParameter("projectId");
|
||||
Long projectId = Long.parseLong(projectIdStr);
|
||||
String projectIdStr = ServletUtils.getRequest().getParameter(LoginHelper.PROJECT_KEY);
|
||||
if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
|
||||
// token 无效
|
||||
throw NotLoginException.newInstance(StpUtil.getLoginType(),
|
||||
@ -55,7 +54,10 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
|
||||
}
|
||||
|
||||
attributes.put(LOGIN_USER_KEY, loginUser);
|
||||
if (projectIdStr != null && !projectIdStr.isEmpty()) {
|
||||
Long projectId = Long.parseLong(projectIdStr);
|
||||
attributes.put(PROJECT_ID,projectId);
|
||||
}
|
||||
return true;
|
||||
} catch (NotLoginException e) {
|
||||
log.error("WebSocket 认证失败'{}',无法访问系统资源", e.getMessage());
|
||||
|
||||
@ -29,6 +29,27 @@
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-amqp</artifactId>
|
||||
</dependency>
|
||||
<!-- 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>
|
||||
|
||||
@ -25,14 +25,15 @@ import java.util.concurrent.CompletableFuture;
|
||||
public class DashScopeChat {
|
||||
|
||||
@Resource
|
||||
private SimpleChat simpleChat;
|
||||
private DashScopeSimpleChat dashScopeSimpleChat;
|
||||
|
||||
@Resource
|
||||
private IAIChatMemoryService chatMemoryService;
|
||||
|
||||
private final ChatClient chatClient;
|
||||
|
||||
private static final String DEFAULT_PROMPT = "你叫煤球,是一个博学的智能聊天助手,请根据用户提问回答!";
|
||||
private static final String DEFAULT_PROMPT =
|
||||
"你是一名智能助手,代号为“煤球”。回答时不要提及自身身份或角色设定,除非用户主动询问;请直接提供清晰、准确、专业的回答。";
|
||||
|
||||
private static final String DEFAULT_FILE_DIR = System.getProperty("user.dir") + "/chat-memory";
|
||||
|
||||
@ -66,10 +67,8 @@ public class DashScopeChat {
|
||||
.collectList()
|
||||
.flatMapMany(tokens -> {
|
||||
String aiResponse = String.join("", tokens);
|
||||
if (isFirst) {
|
||||
// 异步生成标题
|
||||
generateChatTitleAsync(chatId, message, aiResponse, userId);
|
||||
}
|
||||
// 返回完整的流结果
|
||||
return Flux.fromIterable(tokens);
|
||||
});
|
||||
@ -100,7 +99,7 @@ public class DashScopeChat {
|
||||
用户:%s
|
||||
AI:%s
|
||||
""", userMessage, aiResponse);
|
||||
String title = simpleChat.doChat(prompt);
|
||||
String title = dashScopeSimpleChat.doChat(prompt);
|
||||
log.info("用户:{} 生成标题成功:{} -> {}", userId, chatId, title);
|
||||
// 保存对话数据
|
||||
AIChatMemory memory = new AIChatMemory();
|
||||
|
||||
@ -9,11 +9,11 @@ import org.springframework.stereotype.Component;
|
||||
* @date 2025-11-04 15:26
|
||||
*/
|
||||
@Component
|
||||
public class SimpleChat {
|
||||
public class DashScopeSimpleChat {
|
||||
|
||||
private final ChatClient dashScopeChatClient;
|
||||
|
||||
public SimpleChat(ChatClient.Builder chatClientBuilder) {
|
||||
public DashScopeSimpleChat(ChatClient.Builder chatClientBuilder) {
|
||||
this.dashScopeChatClient = chatClientBuilder
|
||||
// 设置 ChatClient 中 ChatModel 的 Options 参数
|
||||
.defaultOptions(
|
||||
@ -4,6 +4,7 @@ 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 lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.ai.domain.AIChatMemory;
|
||||
import org.dromara.ai.domain.dto.AIChatMemoryQueryReq;
|
||||
import org.dromara.ai.domain.dto.AIChatMemoryUpdateReq;
|
||||
@ -13,11 +14,15 @@ 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.core.utils.file.FileUtils;
|
||||
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.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@ -27,6 +32,7 @@ import java.util.List;
|
||||
* @author lilemy
|
||||
* @date 2025-11-04
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class AIChatMemoryServiceImpl extends ServiceImpl<AIChatMemoryMapper, AIChatMemory>
|
||||
implements IAIChatMemoryService {
|
||||
@ -103,9 +109,42 @@ public class AIChatMemoryServiceImpl extends ServiceImpl<AIChatMemoryMapper, AIC
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
List<AIChatMemory> aiChatMemories = this.listByIds(ids);
|
||||
if (aiChatMemories.size() != ids.size()) {
|
||||
throw new ServiceException("数据不存在");
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
// 暂存文件路径
|
||||
List<File> filesToDelete = new ArrayList<>();
|
||||
for (AIChatMemory mem : aiChatMemories) {
|
||||
if (StringUtils.isNotBlank(mem.getFileName())) {
|
||||
File file = new File(System.getProperty("user.dir")
|
||||
+ "/chat-memory/", mem.getFileName());
|
||||
|
||||
try {
|
||||
// 防止目录穿越
|
||||
if (file.getCanonicalPath().startsWith(
|
||||
new File(System.getProperty("user.dir") + "/chat-memory").getCanonicalPath())) {
|
||||
filesToDelete.add(file);
|
||||
} else {
|
||||
log.warn("危险的 filename 路径被拒绝删除: {}", mem.getFileName());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.warn("filename 获取失败: {}", mem.getFileName());
|
||||
throw new ServiceException("文件获取失败: " + mem.getFileName());
|
||||
}
|
||||
}
|
||||
}
|
||||
// 删除数据库
|
||||
boolean b = baseMapper.deleteByIds(ids) > 0;
|
||||
if (!b) {
|
||||
throw new ServiceException("数据库删除失败");
|
||||
}
|
||||
// 删除文件(非事务,不影响数据库逻辑)
|
||||
for (File f : filesToDelete) {
|
||||
if (f.exists() && !FileUtils.del(f)) {
|
||||
log.warn("文件删除失败: {}", f.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ package org.dromara.bidding.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaMode;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
@ -50,7 +51,7 @@ public class BusBiddingUserController extends BaseController {
|
||||
/**
|
||||
* 查询招投标人员列表
|
||||
*/
|
||||
@SaCheckPermission("bidding:biddingUser:getUser")
|
||||
@SaCheckPermission(value = {"bidding:biddingUser:list","bidding:biddingUser:query","bidding:biddingUser:add"},mode = SaMode.OR)
|
||||
@GetMapping("/getUser")
|
||||
public R<List<SysUser>> getUser() {
|
||||
return R.ok(busBiddingUserService.getUser());
|
||||
|
||||
@ -1,26 +1,27 @@
|
||||
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 jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
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.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;
|
||||
|
||||
/**
|
||||
* 备忘录
|
||||
@ -39,7 +40,7 @@ public class BusBwlController extends BaseController {
|
||||
/**
|
||||
* 查询备忘录列表
|
||||
*/
|
||||
@SaCheckPermission("bwl:bwl:list")
|
||||
// @SaCheckPermission("bwl:bwl:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<BusBwlVo> list(BusBwlBo bo, PageQuery pageQuery) {
|
||||
return busBwlService.queryPageList(bo, pageQuery);
|
||||
|
||||
@ -1,27 +1,27 @@
|
||||
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 jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
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.bigscreen.domain.vo.BusSygjVo;
|
||||
import org.dromara.bigscreen.service.IBusSygjService;
|
||||
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.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;
|
||||
|
||||
/**
|
||||
* 实用工具
|
||||
@ -40,7 +40,7 @@ public class BusSygjController extends BaseController {
|
||||
/**
|
||||
* 查询实用工具列表
|
||||
*/
|
||||
@SaCheckPermission("bigscreen:sygj:list")
|
||||
// @SaCheckPermission("bigscreen:sygj:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<BusSygjVo> list(BusSygjBo bo, PageQuery pageQuery) {
|
||||
return busSygjService.queryPageList(bo, pageQuery);
|
||||
|
||||
@ -1,26 +1,27 @@
|
||||
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 jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
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.bigscreen.domain.vo.BusWjzxVo;
|
||||
import org.dromara.bigscreen.service.IBusWjzxService;
|
||||
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.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;
|
||||
|
||||
/**
|
||||
* 文件中心
|
||||
@ -39,7 +40,7 @@ public class BusWjzxController extends BaseController {
|
||||
/**
|
||||
* 查询文件中心列表
|
||||
*/
|
||||
@SaCheckPermission("bigscreen:wjzx:list")
|
||||
// @SaCheckPermission("bigscreen:wjzx:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<BusWjzxVo> list(BusWjzxBo bo, PageQuery pageQuery) {
|
||||
return busWjzxService.queryPageList(bo, pageQuery);
|
||||
|
||||
@ -20,14 +20,10 @@ 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.BusBwlVo;
|
||||
import org.dromara.bigscreen.domain.vo.BusSygjVo;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxVo;
|
||||
import org.dromara.bigscreen.domain.vo.MyProjectInfoVo;
|
||||
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.constant.SystemConstants;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.domain.dto.UserDTO;
|
||||
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||
@ -42,8 +38,9 @@ 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.mapper.SysRoleMapper;
|
||||
import org.dromara.system.domain.vo.RouterVo;
|
||||
import org.dromara.system.service.impl.SysMenuServiceImpl;
|
||||
import org.dromara.system.service.impl.SysUserServiceImpl;
|
||||
import org.dromara.warm.flow.core.FlowEngine;
|
||||
@ -64,6 +61,7 @@ import java.time.DayOfWeek;
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZoneId;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 个人首页接口
|
||||
@ -95,8 +93,10 @@ public class PersonalHomeController extends BaseController {
|
||||
@Resource
|
||||
private IAIChatMemoryService aiChatMemoryService;
|
||||
|
||||
private final SysRoleMapper roleMapper;
|
||||
private final SysMenuServiceImpl menuMapper;
|
||||
@Resource
|
||||
private IBusProjectService projectService;
|
||||
|
||||
private final SysMenuServiceImpl sysMenuService;
|
||||
|
||||
// region AI 模块
|
||||
|
||||
@ -174,8 +174,7 @@ public class PersonalHomeController extends BaseController {
|
||||
*/
|
||||
@GetMapping("/getMyProjectInfo")
|
||||
public R<List<MyProjectInfoVo>> getMyProjectInfoList() {
|
||||
// todo
|
||||
return null;
|
||||
return R.ok(projectService.getMyProjectInfo());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -230,6 +229,12 @@ public class PersonalHomeController extends BaseController {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -308,9 +313,12 @@ public class PersonalHomeController extends BaseController {
|
||||
* 获取部门树
|
||||
*/
|
||||
@GetMapping("/deptTree")
|
||||
public R<List<SysMenu>> deptTree() {
|
||||
public R<List<RouterVo>> deptTree() {
|
||||
// SysRole role = roleMapper.selectById(1);
|
||||
return R.ok(menuMapper.selectMenuTreeByUserId(SystemConstants.SUPER_ADMIN_ID, null));
|
||||
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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -53,6 +53,7 @@ import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -211,6 +212,22 @@ public class ProjectBigScreenController extends BaseController {
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目形象进度
|
||||
*/
|
||||
|
||||
@ -5,9 +5,10 @@ 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.ISysRoleWorkService;
|
||||
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;
|
||||
@ -17,7 +18,10 @@ 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.*;
|
||||
|
||||
@ -35,12 +39,11 @@ import java.util.List;
|
||||
@RequestMapping("/bigscreen/roleWork")
|
||||
public class SysRoleWorkController extends BaseController {
|
||||
|
||||
private final ISysRoleWorkService sysRoleWorkService;
|
||||
private final SysRoleWorkServiceImpl sysRoleWorkService;
|
||||
|
||||
/**
|
||||
* 查询角色流程对应列表
|
||||
*/
|
||||
@SaCheckPermission("bigscreen:roleWork:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<SysRoleWorkVo> list(SysRoleWorkBo bo, PageQuery pageQuery) {
|
||||
return sysRoleWorkService.queryPageList(bo, pageQuery);
|
||||
@ -103,4 +106,45 @@ public class SysRoleWorkController extends BaseController {
|
||||
@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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,39 @@
|
||||
package org.dromara.bigscreen.controller;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
|
||||
import org.dromara.bigscreen.service.ProjectBigScreenService;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.project.domain.vo.project.BusProjectVo;
|
||||
import org.dromara.project.service.IBusProjectService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* UE大屏
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-04
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/UE/screen")
|
||||
public class UEController {
|
||||
|
||||
@Resource
|
||||
private IBusProjectService projectService;
|
||||
|
||||
|
||||
@GetMapping("/projectInfo/{projectId}")
|
||||
public R<BusProjectVo> getProjectPeople(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
return R.ok(projectService.selectById(projectId));
|
||||
}
|
||||
|
||||
}
|
||||
@ -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; // 缺卡统一处理时间
|
||||
}
|
||||
@ -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; // 更新时间
|
||||
}
|
||||
@ -37,6 +37,17 @@ public class BusSygj extends BaseEntity {
|
||||
*/
|
||||
private String gjUrl;
|
||||
|
||||
|
||||
/**
|
||||
* 图片id
|
||||
*
|
||||
* */
|
||||
private Long imgId;
|
||||
/**
|
||||
* 图片路径
|
||||
* */
|
||||
private String imgUrl;
|
||||
|
||||
/**
|
||||
* 审核标志
|
||||
*/
|
||||
|
||||
@ -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; // 摄像头名称
|
||||
}
|
||||
@ -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; // 附件
|
||||
}
|
||||
@ -33,6 +33,11 @@ public class SysRoleWork extends BaseEntity {
|
||||
*/
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 绑定项目id
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 流程名称
|
||||
*/
|
||||
|
||||
@ -27,6 +27,11 @@ public class SysRoleWorkBo extends BaseEntity {
|
||||
*/
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 绑定项目id
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 流程名称
|
||||
*/
|
||||
|
||||
@ -36,6 +36,13 @@ public class BusSygjBo extends BaseEntity {
|
||||
*/
|
||||
private String gjUrl;
|
||||
|
||||
private Long imgId;
|
||||
|
||||
/**
|
||||
* 图片路径
|
||||
* */
|
||||
private String imgUrl;
|
||||
|
||||
/**
|
||||
* 审核标志
|
||||
*/
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
package org.dromara.bigscreen.domain.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import org.dromara.bigscreen.domain.vo.BusPdSjVo;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxSjDateVo;
|
||||
import org.dromara.workflow.domain.vo.FlowTaskVo;
|
||||
|
||||
import java.io.Serializable;
|
||||
@ -24,4 +26,14 @@ public class TaskInfoDto implements Serializable {
|
||||
*/
|
||||
private Long weekCount;
|
||||
|
||||
/**
|
||||
*知识库上传数据
|
||||
*/
|
||||
private BusWjzxSjDateVo busWjzxSjDateVo;
|
||||
|
||||
/**
|
||||
* 派单数据
|
||||
*/
|
||||
private BusPdSjVo busPdSjVo;
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,19 @@
|
||||
package org.dromara.bigscreen.domain.vo;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class BusPdSjVo {
|
||||
/**
|
||||
* 我的派单
|
||||
*/
|
||||
private Long wdpdrw;
|
||||
/**
|
||||
* 其他派单
|
||||
*/
|
||||
private Long qtbmpd;
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -52,6 +52,13 @@ public class BusSygjVo implements Serializable {
|
||||
@ExcelProperty(value = "审核标志")
|
||||
private String auditStatus;
|
||||
|
||||
private Long imgId;
|
||||
|
||||
/**
|
||||
* 图片路径
|
||||
* */
|
||||
private String imgUrl;
|
||||
|
||||
/**
|
||||
* 工具类型 1内部 ,2外部
|
||||
*/
|
||||
|
||||
@ -0,0 +1,16 @@
|
||||
package org.dromara.bigscreen.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class BusWjzxSjDateVo {
|
||||
|
||||
/**
|
||||
* 最近上传
|
||||
*/
|
||||
private Long zjsc;
|
||||
/**
|
||||
* 总数
|
||||
*/
|
||||
private Long zs;
|
||||
}
|
||||
@ -1,11 +1,8 @@
|
||||
package org.dromara.bigscreen.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@ -63,6 +60,11 @@ public class MilestoneVo {
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 是否为当前节点(0不是 1是)
|
||||
*/
|
||||
private Integer active = 0;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
|
||||
@ -23,6 +23,11 @@ public class MyProjectInfoVo implements Serializable {
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 负责人
|
||||
*/
|
||||
private String principal;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
|
||||
@ -36,6 +36,12 @@ public class SysRoleWorkVo implements Serializable {
|
||||
@ExcelProperty(value = "绑定角色ID")
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 绑定项目id
|
||||
*/
|
||||
@ExcelProperty(value = "绑定项目ID")
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 角色名称
|
||||
*/
|
||||
|
||||
@ -41,7 +41,7 @@ public class RedisMessageListener implements MessageListener {
|
||||
public void onMessage(Message message, byte[] pattern) {
|
||||
try {
|
||||
// 1. 快速日志记录(证明监听到消息)
|
||||
log.info("【Redis消息监听】收到消息,长度:{}字节,提交异步处理", message.getBody().length);
|
||||
// log.info("【Redis消息监听】收到消息,长度:{}字节,提交异步处理", message.getBody().length);
|
||||
|
||||
// 2. 提交给异步服务处理(核心:线程分离,监听线程立即返回)
|
||||
asyncMessageHandlerService.handleRedisMessageAsync(message);
|
||||
|
||||
@ -1,8 +1,12 @@
|
||||
package org.dromara.bigscreen.mapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import org.dromara.bigscreen.domain.SysRoleWork;
|
||||
import org.dromara.bigscreen.domain.vo.SysRoleWorkVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
import org.dromara.system.domain.SysUserRole;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 角色流程对应Mapper接口
|
||||
@ -12,4 +16,16 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
*/
|
||||
public interface SysRoleWorkMapper extends BaseMapperPlus<SysRoleWork, SysRoleWorkVo> {
|
||||
|
||||
/**
|
||||
* 根据登录人id和项目ID获取对应角色
|
||||
*/
|
||||
@Select("select * from sys_user_role where user_id = #{userId} and project_id = #{projectId}")
|
||||
List<SysUserRole> getRoleList(Long userId,Long projectId);
|
||||
|
||||
/**
|
||||
* 根据登录人id获取所有项目下所有角色
|
||||
*/
|
||||
@Select("select * from sys_user_role where user_id = #{userId}")
|
||||
List<SysUserRole> getAllRoleList(Long userId);
|
||||
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.dromara.bigscreen.service;
|
||||
|
||||
import org.dromara.bigscreen.domain.dto.BusWjzxBo;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxSjDateVo;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxVo;
|
||||
import org.dromara.bigscreen.domain.BusWjzx;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
@ -33,7 +34,12 @@ public interface IBusWjzxService extends IService<BusWjzx>{
|
||||
* @param pageQuery 分页参数
|
||||
* @return 文件中心分页列表
|
||||
*/
|
||||
TableDataInfo<BusWjzxVo> queryPageList(BusWjzxBo bo, PageQuery pageQuery);
|
||||
TableDataInfo<BusWjzxVo> queryPageList(BusWjzxBo bo, PageQuery pageQuery); /**
|
||||
* 分页查询文件中心列表
|
||||
*
|
||||
* @return 文件中心分页列表
|
||||
*/
|
||||
BusWjzxSjDateVo queryWjzx();
|
||||
|
||||
/**
|
||||
* 查询符合条件的文件中心列表
|
||||
|
||||
@ -60,6 +60,13 @@ public interface ProjectBigScreenService {
|
||||
*/
|
||||
ProjectPeopleVo getProjectPeople(Long projectId);
|
||||
|
||||
/**
|
||||
* 获取项目人员(田东一二期)
|
||||
*
|
||||
* @return 项目人员
|
||||
*/
|
||||
ProjectPeopleVo getProjectPeopleTianDong();
|
||||
|
||||
/**
|
||||
* 获取项目形象进度
|
||||
*
|
||||
@ -89,6 +96,7 @@ public interface ProjectBigScreenService {
|
||||
void setList(GpsEquipmentBo bo);
|
||||
|
||||
List<Map<String, Object>> getClientList(Long projectId);
|
||||
|
||||
List<String> getUeClientList();
|
||||
|
||||
/**
|
||||
|
||||
@ -43,7 +43,7 @@ public class AsyncMessageHandlerServiceImpl implements IAsyncMessageHandlerServi
|
||||
try {
|
||||
// 1. 解析消息体(只解析一次,避免重复操作)
|
||||
byte[] messageBody = message.getBody();
|
||||
if (messageBody == null || messageBody.length == 0) {
|
||||
if (messageBody.length == 0) {
|
||||
log.warn("【异步消息处理】消息体为空,忽略处理");
|
||||
return;
|
||||
}
|
||||
@ -76,8 +76,8 @@ public class AsyncMessageHandlerServiceImpl implements IAsyncMessageHandlerServi
|
||||
return;
|
||||
}
|
||||
|
||||
String key = "";
|
||||
DroProjectDrone droProjectDrone = null;
|
||||
String key;
|
||||
DroProjectDrone droProjectDrone;
|
||||
boolean isOsd4 = false;
|
||||
|
||||
// 5. 根据data字段内容判断key类型,并查询无人机信息
|
||||
@ -130,7 +130,7 @@ public class AsyncMessageHandlerServiceImpl implements IAsyncMessageHandlerServi
|
||||
System.out.println("大屏已推送消息");
|
||||
}
|
||||
int onlineCount = InitOnStartWebSocketServer.getOnlineCount();
|
||||
if (onlineCount > 0){
|
||||
if (onlineCount > 0) {
|
||||
String modleId = b ? droProjectDrone.getAirplaneModleId() : droProjectDrone.getDroneModleId();
|
||||
if (modleId != null) {
|
||||
String ued = ueStructureJsonMessage(message, modleId);
|
||||
@ -143,14 +143,14 @@ public class AsyncMessageHandlerServiceImpl implements IAsyncMessageHandlerServi
|
||||
|
||||
private String buildPushMessage(String key, String message, Long projectId) {
|
||||
JSONObject messageObj = new JSONObject();
|
||||
messageObj.put("type", "wrj_DATA_UPDATE");
|
||||
messageObj.put("projectId",projectId.toString());
|
||||
messageObj.put("clientId",key);
|
||||
messageObj.set("type", "wrj_DATA_UPDATE");
|
||||
messageObj.set("projectId", projectId.toString());
|
||||
messageObj.set("clientId", key);
|
||||
// 位置信息
|
||||
JSONObject locationObj = new JSONObject();
|
||||
locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude").toString()); // 纬度
|
||||
locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude").toString()); // 经度
|
||||
messageObj.put("location", locationObj);
|
||||
locationObj.set("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude").toString()); // 纬度
|
||||
locationObj.set("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude").toString()); // 经度
|
||||
messageObj.set("location", locationObj);
|
||||
return messageObj.toString();
|
||||
}
|
||||
|
||||
@ -161,19 +161,19 @@ public class AsyncMessageHandlerServiceImpl implements IAsyncMessageHandlerServi
|
||||
private String ueStructureJsonMessage(String message, String modelId) {
|
||||
// 构造消息对象(包含关键信息)
|
||||
JSONObject messageObj = new JSONObject();
|
||||
messageObj.put("type", "location"); // 消息类型
|
||||
messageObj.set("type", "location"); // 消息类型
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("id", modelId);
|
||||
data.set("id", modelId);
|
||||
|
||||
// 位置信息
|
||||
JSONObject position = new JSONObject();
|
||||
position.put("lat", JSONUtil.parseObj(message).getJSONObject("data").get("latitude")); // 纬度
|
||||
position.put("lng", JSONUtil.parseObj(message).getJSONObject("data").get("longitude")); // 经度
|
||||
position.put("alt", JSONUtil.parseObj(message).getJSONObject("data").get("height")); // 海拔
|
||||
position.set("lat", JSONUtil.parseObj(message).getJSONObject("data").get("latitude")); // 纬度
|
||||
position.set("lng", JSONUtil.parseObj(message).getJSONObject("data").get("longitude")); // 经度
|
||||
position.set("alt", JSONUtil.parseObj(message).getJSONObject("data").get("height")); // 海拔
|
||||
|
||||
data.put("position", position);
|
||||
messageObj.put("data", data); // 设备唯一标识
|
||||
data.set("position", position);
|
||||
messageObj.set("data", data); // 设备唯一标识
|
||||
|
||||
// 转换为String类型返回
|
||||
return messageObj.toString();
|
||||
|
||||
@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.bigscreen.domain.BusWjzx;
|
||||
import org.dromara.bigscreen.domain.dto.BusSygjBo;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxVo;
|
||||
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
||||
@ -15,6 +16,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.system.service.impl.SysOssServiceImpl;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.bigscreen.domain.vo.BusSygjVo;
|
||||
@ -22,6 +24,7 @@ import org.dromara.bigscreen.domain.BusSygj;
|
||||
import org.dromara.bigscreen.mapper.BusSygjMapper;
|
||||
import org.dromara.bigscreen.service.IBusSygjService;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
@ -39,6 +42,8 @@ public class BusSygjServiceImpl extends ServiceImpl<BusSygjMapper, BusSygj> impl
|
||||
|
||||
private final BusSygjMapper baseMapper;
|
||||
|
||||
private final SysOssServiceImpl sysOssService;
|
||||
|
||||
/**
|
||||
* 查询实用工具
|
||||
*
|
||||
@ -80,7 +85,7 @@ public class BusSygjServiceImpl extends ServiceImpl<BusSygjMapper, BusSygj> impl
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<BusSygj> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(BusSygj::getId);
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getGjm()), BusSygj::getGjm, bo.getGjm());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getGjm()), BusSygj::getGjm, bo.getGjm());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getGjUrl()), BusSygj::getGjUrl, bo.getGjUrl());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), BusSygj::getAuditStatus, bo.getAuditStatus());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getType()), BusSygj::getType, bo.getType());
|
||||
@ -138,6 +143,13 @@ public class BusSygjServiceImpl extends ServiceImpl<BusSygjMapper, BusSygj> impl
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
|
||||
ArrayList<Long> temp = new ArrayList<>();
|
||||
for (Long id : ids) {
|
||||
BusSygjVo busSygjVo = baseMapper.selectVoById(id);
|
||||
temp.add(busSygjVo.getImgId());
|
||||
}
|
||||
sysOssService.deleteWithValidByIds(temp, false);
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
|
||||
|
||||
@ -1,31 +1,33 @@
|
||||
package org.dromara.bigscreen.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 lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.bigscreen.domain.BusWjzx;
|
||||
import org.dromara.bigscreen.domain.dto.BusWjzxBo;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxSjDateVo;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxVo;
|
||||
import org.dromara.bigscreen.mapper.BusWjzxMapper;
|
||||
import org.dromara.bigscreen.service.IBusWjzxService;
|
||||
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.system.service.impl.SysOssServiceImpl;
|
||||
import org.dromara.xzd.biddingManagement.biddingDocument.domain.XzdBiddingFileEstimate;
|
||||
import org.dromara.xzd.biddingManagement.biddingDocument.domain.vo.XzdBiddingFileEstimateVo;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.bigscreen.domain.vo.BusWjzxVo;
|
||||
import org.dromara.bigscreen.domain.BusWjzx;
|
||||
import org.dromara.bigscreen.mapper.BusWjzxMapper;
|
||||
import org.dromara.bigscreen.service.IBusWjzxService;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 文件中心Service业务层处理
|
||||
@ -50,7 +52,7 @@ public class BusWjzxServiceImpl extends ServiceImpl<BusWjzxMapper, BusWjzx> impl
|
||||
* @return 文件中心
|
||||
*/
|
||||
@Override
|
||||
public BusWjzxVo queryById(Long id){
|
||||
public BusWjzxVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
@ -68,6 +70,17 @@ public class BusWjzxServiceImpl extends ServiceImpl<BusWjzxMapper, BusWjzx> impl
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BusWjzxSjDateVo queryWjzx() {
|
||||
BusWjzxSjDateVo busWjzxSjDateVo = new BusWjzxSjDateVo();
|
||||
Long zjsc = baseMapper.selectCount(new LambdaQueryWrapper<BusWjzx>().ge(BusWjzx::getCreateTime, LocalDate.now()));
|
||||
Long zs = this.count();
|
||||
busWjzxSjDateVo.setZs(zs);
|
||||
busWjzxSjDateVo.setZjsc(zjsc);
|
||||
|
||||
return busWjzxSjDateVo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的文件中心列表
|
||||
*
|
||||
@ -84,8 +97,7 @@ public class BusWjzxServiceImpl extends ServiceImpl<BusWjzxMapper, BusWjzx> impl
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<BusWjzx> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(BusWjzx::getId);
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getWjm()), BusWjzx::getWjm, bo.getWjm());
|
||||
|
||||
lqw.like(StringUtils.isNotBlank(bo.getWjm()), BusWjzx::getWjm, bo.getWjm());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), BusWjzx::getAuditStatus, bo.getAuditStatus());
|
||||
lqw.eq(bo.getCreateBy() != null, BusWjzx::getCreateBy, bo.getCreateBy());
|
||||
return lqw;
|
||||
@ -101,7 +113,7 @@ public class BusWjzxServiceImpl extends ServiceImpl<BusWjzxMapper, BusWjzx> impl
|
||||
public Boolean insertByBo(BusWjzxBo bo) {
|
||||
BusWjzx add = MapstructUtils.convert(bo, BusWjzx.class);
|
||||
validEntityBeforeSave(add);
|
||||
if (add != null && StringUtils.isNotBlank(add.getWjm())){
|
||||
if (add != null && StringUtils.isNotBlank(add.getWjm())) {
|
||||
String[] split = add.getWjm().split("\\.");
|
||||
add.setWjlx(split[split.length - 1]);
|
||||
}
|
||||
@ -128,7 +140,7 @@ public class BusWjzxServiceImpl extends ServiceImpl<BusWjzxMapper, BusWjzx> impl
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(BusWjzx entity){
|
||||
private void validEntityBeforeSave(BusWjzx entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
@ -141,7 +153,7 @@ public class BusWjzxServiceImpl extends ServiceImpl<BusWjzxMapper, BusWjzx> impl
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
ArrayList<Long> temp = new ArrayList<>();
|
||||
|
||||
@ -234,6 +234,91 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
||||
return vo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目人员
|
||||
*
|
||||
* @return 项目人员
|
||||
*/
|
||||
@Override
|
||||
public ProjectPeopleVo getProjectPeopleTianDong() {
|
||||
final Long tdyq = 1897160897167638529L;
|
||||
final Long tdeq = 1968506669544656898L;
|
||||
List<Long> ids = List.of(tdeq, tdyq);
|
||||
BusProject project = projectService.getById(tdyq);
|
||||
// 获取大屏数据
|
||||
ProjectPeopleVo vo = new ProjectPeopleVo();
|
||||
// 获取施工人员总数
|
||||
List<SubConstructionUser> list = constructionUserService.lambdaQuery()
|
||||
.in(SubConstructionUser::getProjectId, ids)
|
||||
.eq(SubConstructionUser::getUserRole, "0")
|
||||
.isNotNull(SubConstructionUser::getTeamId).list();
|
||||
List<Long> sysUserIdList = list.stream().map(SubConstructionUser::getSysUserId).toList();
|
||||
int count = list.size();
|
||||
BigDecimal countDec = BigDecimal.valueOf(count);
|
||||
vo.setPeopleCount(countDec);
|
||||
// 获取考勤数据
|
||||
List<Long> attendancePeopleList1 = attendanceService.listAttendancePeopleByProjectId(tdyq);
|
||||
List<Long> attendancePeopleList2 = attendanceService.listAttendancePeopleByProjectId(tdeq);
|
||||
List<Long> attendancePeopleList = new ArrayList<>();
|
||||
attendancePeopleList.addAll(attendancePeopleList1);
|
||||
attendancePeopleList.addAll(attendancePeopleList2);
|
||||
BigDecimal attendanceSize = BigDecimal.valueOf(attendancePeopleList.size());
|
||||
vo.setAttendanceCount(attendanceSize);
|
||||
// 计算考勤率
|
||||
vo.setAttendanceRate(BigDecimalUtil.toPercentage(attendanceSize, countDec));
|
||||
if (count != 0) {
|
||||
// 统计班组人数
|
||||
List<BusProjectTeamMember> memberList = projectTeamMemberService.lambdaQuery()
|
||||
.select(BusProjectTeamMember::getId, BusProjectTeamMember::getTeamId)
|
||||
.in(BusProjectTeamMember::getProjectId, ids)
|
||||
.in(BusProjectTeamMember::getMemberId, sysUserIdList)
|
||||
.list();
|
||||
Map<Long, List<BusProjectTeamMember>> memberMap = memberList.stream()
|
||||
.collect(Collectors.groupingBy(BusProjectTeamMember::getTeamId));
|
||||
// 统计班组考勤数据
|
||||
Map<Long, List<SubConstructionUser>> userTeamMap = new HashMap<>();
|
||||
if (CollUtil.isNotEmpty(attendancePeopleList)) {
|
||||
List<SubConstructionUser> users = constructionUserService.lambdaQuery()
|
||||
.in(SubConstructionUser::getSysUserId, attendancePeopleList)
|
||||
.isNotNull(SubConstructionUser::getTeamId)
|
||||
.list();
|
||||
userTeamMap = users.stream()
|
||||
.collect(Collectors.groupingBy(SubConstructionUser::getTeamId));
|
||||
}
|
||||
List<BusProjectTeam> teamList = projectTeamService.lambdaQuery()
|
||||
.in(BusProjectTeam::getProjectId, ids)
|
||||
.list();
|
||||
String punchRange = project.getPunchRange();
|
||||
String punchTime = "";
|
||||
if (punchRange != null) {
|
||||
String start = punchRange.split(",")[0];
|
||||
punchTime = LocalDate.now() + " ";
|
||||
}
|
||||
List<ProjectTeamAttendanceVo> listVo = new ArrayList<>();
|
||||
for (BusProjectTeam projectTeam : teamList) {
|
||||
ProjectTeamAttendanceVo teamAttendanceVo = new ProjectTeamAttendanceVo();
|
||||
Long id = projectTeam.getId();
|
||||
teamAttendanceVo.setId(id);
|
||||
teamAttendanceVo.setTeamName(projectTeam.getTeamName());
|
||||
teamAttendanceVo.setAttendanceTime(punchTime);
|
||||
BigDecimal allNumber = BigDecimal.ZERO;
|
||||
if (memberMap.containsKey(id)) {
|
||||
allNumber = BigDecimal.valueOf(memberMap.get(id).size());
|
||||
}
|
||||
BigDecimal attendanceNumber = BigDecimal.ZERO;
|
||||
if (CollUtil.isNotEmpty(userTeamMap) && userTeamMap.containsKey(id)) {
|
||||
attendanceNumber = BigDecimal.valueOf(userTeamMap.get(id).size());
|
||||
}
|
||||
teamAttendanceVo.setAttendanceNumber(attendanceNumber);
|
||||
teamAttendanceVo.setAllNumber(allNumber);
|
||||
teamAttendanceVo.setAttendanceRate(BigDecimalUtil.toPercentage(attendanceNumber, allNumber));
|
||||
listVo.add(teamAttendanceVo);
|
||||
}
|
||||
vo.setTeamAttendanceList(listVo);
|
||||
}
|
||||
return vo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目形象进度
|
||||
*
|
||||
@ -459,11 +544,10 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
||||
List<PgsProgressCategory> allChildren = progressCategoryService.list(
|
||||
Wrappers.<PgsProgressCategory>lambdaQuery()
|
||||
.in(progressName.equals("光伏场区"), PgsProgressCategory::getName, gfcqName)
|
||||
.and(wrapper -> {
|
||||
.and(wrapper ->
|
||||
wrapper.like(PgsProgressCategory::getAncestors, "," + topId + ",")
|
||||
.or()
|
||||
.like(PgsProgressCategory::getAncestors, "," + topId);
|
||||
})
|
||||
.like(PgsProgressCategory::getAncestors, "," + topId))
|
||||
);
|
||||
if (allChildren.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
@ -751,38 +835,38 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
||||
if (voList != null && !voList.isEmpty()) {
|
||||
for (GpsEquipmentSonVo item : voList) {
|
||||
JSONObject messageObj = new JSONObject();
|
||||
messageObj.put("type", "location"); // 消息类型
|
||||
messageObj.set("type", "location"); // 消息类型
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("id", item.getModelId());
|
||||
data.set("id", item.getModelId());
|
||||
|
||||
// 位置信息
|
||||
JSONObject position = new JSONObject();
|
||||
position.put("lat", item.getLocLatitude()); // 纬度
|
||||
position.put("lng", item.getLocLongitude()); // 经度
|
||||
position.put("alt", item.getLocAltitude()); // 海拔
|
||||
position.set("lat", item.getLocLatitude()); // 纬度
|
||||
position.set("lng", item.getLocLongitude()); // 经度
|
||||
position.set("alt", item.getLocAltitude()); // 海拔
|
||||
|
||||
data.put("position", position);
|
||||
messageObj.put("data", data); // 设备唯一标识
|
||||
data.set("position", position);
|
||||
messageObj.set("data", data); // 设备唯一标识
|
||||
maps.add(messageObj.toString());
|
||||
}
|
||||
}
|
||||
if (appList != null && !appList.isEmpty()) {
|
||||
for (GpsEquipmentSonVo item : appList) {
|
||||
JSONObject messageObj = new JSONObject();
|
||||
messageObj.put("type", "location"); // 消息类型
|
||||
messageObj.set("type", "location"); // 消息类型
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("id", item.getModelId());
|
||||
data.set("id", item.getModelId());
|
||||
|
||||
// 位置信息
|
||||
JSONObject position = new JSONObject();
|
||||
position.put("lat", item.getLocLatitude()); // 纬度
|
||||
position.put("lng", item.getLocLongitude()); // 经度
|
||||
position.put("alt", item.getLocAltitude()); // 海拔
|
||||
position.set("lat", item.getLocLatitude()); // 纬度
|
||||
position.set("lng", item.getLocLongitude()); // 经度
|
||||
position.set("alt", item.getLocAltitude()); // 海拔
|
||||
|
||||
data.put("position", position);
|
||||
messageObj.put("data", data); // 设备唯一标识
|
||||
data.set("position", position);
|
||||
messageObj.set("data", data); // 设备唯一标识
|
||||
maps.add(messageObj.toString());
|
||||
}
|
||||
}
|
||||
@ -798,19 +882,19 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
||||
if (object != null) {
|
||||
JSONObject object1 = JSONUtil.parseObj(object);
|
||||
JSONObject messageObj = new JSONObject();
|
||||
messageObj.put("type", "location"); // 消息类型
|
||||
messageObj.set("type", "location"); // 消息类型
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("id", key.getAirplaneModleId());
|
||||
data.set("id", key.getAirplaneModleId());
|
||||
|
||||
// 位置信息
|
||||
JSONObject position = new JSONObject();
|
||||
position.put("lat", object1.getJSONObject("data").get("latitude")); // 纬度
|
||||
position.put("lng", object1.getJSONObject("data").get("longitude")); // 经度
|
||||
position.put("alt", object1.getJSONObject("data").get("height")); // 海拔
|
||||
position.set("lat", object1.getJSONObject("data").get("latitude")); // 纬度
|
||||
position.set("lng", object1.getJSONObject("data").get("longitude")); // 经度
|
||||
position.set("alt", object1.getJSONObject("data").get("height")); // 海拔
|
||||
|
||||
data.put("position", position);
|
||||
messageObj.put("data", data); // 设备唯一标识
|
||||
data.set("position", position);
|
||||
messageObj.set("data", data); // 设备唯一标识
|
||||
maps.add(messageObj.toString());
|
||||
} else {
|
||||
Object object2 = stringRedisTemplate.opsForValue().get("wrj:osd3:" + key);
|
||||
@ -818,19 +902,19 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
||||
JSONObject object3 = JSONUtil.parseObj(object2);
|
||||
|
||||
JSONObject messageObj = new JSONObject();
|
||||
messageObj.put("type", "location"); // 消息类型
|
||||
messageObj.set("type", "location"); // 消息类型
|
||||
|
||||
JSONObject data = new JSONObject();
|
||||
data.put("id", key.getDroneModleId());
|
||||
data.set("id", key.getDroneModleId());
|
||||
|
||||
// 位置信息
|
||||
JSONObject position = new JSONObject();
|
||||
position.put("lat", object3.getJSONObject("data").get("latitude")); // 纬度
|
||||
position.put("lng", object3.getJSONObject("data").get("longitude")); // 经度
|
||||
position.put("alt", object3.getJSONObject("data").get("height")); // 海拔
|
||||
position.set("lat", object3.getJSONObject("data").get("latitude")); // 纬度
|
||||
position.set("lng", object3.getJSONObject("data").get("longitude")); // 经度
|
||||
position.set("alt", object3.getJSONObject("data").get("height")); // 海拔
|
||||
|
||||
data.put("position", position);
|
||||
messageObj.put("data", data); // 设备唯一标识
|
||||
data.set("position", position);
|
||||
messageObj.set("data", data); // 设备唯一标识
|
||||
maps.add(messageObj.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,15 +14,17 @@ import org.dromara.common.core.utils.MapstructUtils;
|
||||
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.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.project.domain.dto.project.BusProjectQueryReq;
|
||||
import org.dromara.project.domain.vo.project.BusProjectVo;
|
||||
import org.dromara.project.service.impl.BusProjectServiceImpl;
|
||||
import org.dromara.system.domain.SysUserRole;
|
||||
import org.dromara.system.domain.vo.SysRoleVo;
|
||||
import org.dromara.system.service.impl.SysRoleServiceImpl;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 角色流程对应Service业务层处理
|
||||
@ -37,6 +39,8 @@ public class SysRoleWorkServiceImpl extends ServiceImpl<SysRoleWorkMapper, SysRo
|
||||
private final SysRoleWorkMapper baseMapper;
|
||||
@Autowired
|
||||
private SysRoleServiceImpl roleService;
|
||||
@Autowired
|
||||
private BusProjectServiceImpl projectService;
|
||||
|
||||
/**
|
||||
* 查询角色流程对应
|
||||
@ -85,7 +89,7 @@ public class SysRoleWorkServiceImpl extends ServiceImpl<SysRoleWorkMapper, SysRo
|
||||
private LambdaQueryWrapper<SysRoleWork> buildQueryWrapper(SysRoleWorkBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<SysRoleWork> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(SysRoleWork::getId);
|
||||
lqw.orderByDesc(SysRoleWork::getCreateTime);
|
||||
lqw.eq(bo.getRoleId() != null, SysRoleWork::getRoleId, bo.getRoleId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getLcmc()), SysRoleWork::getLcmc, bo.getLcmc());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getLcms()), SysRoleWork::getLcms, bo.getLcms());
|
||||
@ -101,9 +105,11 @@ public class SysRoleWorkServiceImpl extends ServiceImpl<SysRoleWorkMapper, SysRo
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(SysRoleWorkBo bo) {
|
||||
LambdaQueryWrapper<SysRoleWork> lqw = buildQueryWrapper(bo);
|
||||
LambdaQueryWrapper<SysRoleWork> lqw = new LambdaQueryWrapper<>();
|
||||
lqw.eq(SysRoleWork::getRoleId, bo.getRoleId());
|
||||
if (baseMapper.selectCount(lqw) > 0) {
|
||||
lqw.eq(SysRoleWork::getProjectId, bo.getProjectId());
|
||||
List<SysRoleWork> workVos = list(lqw);
|
||||
if (!workVos.isEmpty()) {
|
||||
throw new RuntimeException("此角色已绑定流程");
|
||||
}
|
||||
|
||||
@ -162,4 +168,150 @@ public class SysRoleWorkServiceImpl extends ServiceImpl<SysRoleWorkMapper, SysRo
|
||||
}
|
||||
}
|
||||
|
||||
public List<SysRoleVo> getRoleList(Long projectId){
|
||||
Long userId = LoginHelper.getUserId();
|
||||
List<SysUserRole> list = baseMapper.getRoleList(userId,projectId);
|
||||
List<SysRoleVo> roleList = new ArrayList<>();
|
||||
for (SysUserRole sysUserRole : list) {
|
||||
|
||||
LambdaQueryWrapper<SysRoleWork> lqw = new LambdaQueryWrapper<>();
|
||||
lqw.eq(SysRoleWork::getRoleId, sysUserRole.getRoleId());
|
||||
lqw.eq(SysRoleWork::getProjectId,projectId);
|
||||
SysRoleWork one = getOne(lqw);
|
||||
|
||||
if (one != null){
|
||||
SysRoleVo sysRoleVo = roleService.selectRoleById(sysUserRole.getRoleId());
|
||||
if (sysRoleVo != null){
|
||||
roleList.add(sysRoleVo);
|
||||
}
|
||||
}
|
||||
}
|
||||
return roleList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 判断此角色在所有项目下所有角色是否有流程
|
||||
*/
|
||||
public Boolean isHaveValue(Long userId){
|
||||
List<SysUserRole> allRoleList = baseMapper.getAllRoleList(userId);
|
||||
for (SysUserRole sysUserRole : allRoleList) {
|
||||
LambdaQueryWrapper<SysRoleWork> lqw = new LambdaQueryWrapper<>();
|
||||
lqw.eq(SysRoleWork::getRoleId, sysUserRole.getRoleId());
|
||||
lqw.eq(SysRoleWork::getProjectId,sysUserRole.getProjectId());
|
||||
List<SysRoleWork> list = list(lqw);
|
||||
if (list != null && !list.isEmpty()){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据当前登录人获取角色流程对应
|
||||
*/
|
||||
public SysRoleWork getRoleWork(Long projectId){
|
||||
Long userId = LoginHelper.getUserId();
|
||||
|
||||
List<SysUserRole> roleList = baseMapper.getRoleList(userId,projectId);
|
||||
|
||||
if (roleList == null || roleList.isEmpty()){
|
||||
return null;
|
||||
}
|
||||
|
||||
for (SysUserRole userRole : roleList) {
|
||||
LambdaQueryWrapper<SysRoleWork> lqw = new LambdaQueryWrapper<>();
|
||||
lqw.eq(SysRoleWork::getRoleId, userRole.getRoleId());
|
||||
lqw.eq(SysRoleWork::getProjectId,projectId);
|
||||
SysRoleWork one = getOne(lqw);
|
||||
if (one != null){
|
||||
return one;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前登录人在所有项目下有流程的角色列表
|
||||
* @return
|
||||
*/
|
||||
public List<BusProjectVo> getProjectRoles(){
|
||||
Long userId = LoginHelper.getUserId();
|
||||
// 获取当前登录用户的所有项目及对应所有角色
|
||||
List<SysUserRole> allRoleList = baseMapper.getAllRoleList(userId);
|
||||
// 获取项目
|
||||
List<BusProjectVo> busProjectVoList = new ArrayList<>();
|
||||
//维护一个该用户的 项目ID:角色ID map
|
||||
Map<Long,Long> map = new HashMap<>();
|
||||
//获取到该用户所有有流程的项目 说明在该项目下该用户有角色有所属流程
|
||||
for (SysUserRole sysUserRole : allRoleList) {
|
||||
BusProjectQueryReq req = new BusProjectQueryReq();
|
||||
req.setId(sysUserRole.getProjectId());
|
||||
List<BusProjectVo> vos = projectService.queryList(req);
|
||||
if (vos != null && !vos.isEmpty()){
|
||||
if(!busProjectVoList.contains(vos.getFirst())){
|
||||
busProjectVoList.add(vos.getFirst());
|
||||
map.put(sysUserRole.getProjectId(),sysUserRole.getRoleId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
List<SysRoleWork> roleWorks = this.list();
|
||||
List<SysRoleVo> roleVos;
|
||||
for (BusProjectVo projectVo : busProjectVoList) {
|
||||
roleVos = new ArrayList<>();
|
||||
for (SysRoleWork roleWork : roleWorks) {
|
||||
if (map.containsKey(projectVo.getId()) && roleWork.getRoleId().equals(map.get(projectVo.getId()))){
|
||||
SysRoleVo sysRoleVo = roleService.selectRoleById(roleWork.getRoleId());
|
||||
if (sysRoleVo != null){
|
||||
roleVos.add(sysRoleVo);
|
||||
}
|
||||
}
|
||||
}
|
||||
projectVo.setRoleVos(roleVos);
|
||||
}
|
||||
|
||||
|
||||
//遍历
|
||||
// for (BusProjectVo projectVo : busProjectVoList) {
|
||||
// roleVos = new ArrayList<>();
|
||||
// //通过项目查找所有角色
|
||||
// LambdaQueryWrapper<SysRoleWork> lqw1 = new LambdaQueryWrapper<>();
|
||||
// lqw1.eq(SysRoleWork::getProjectId,projectVo.getId());
|
||||
// List<SysRoleWork> roleWorkList = list(lqw1);
|
||||
// //遍历
|
||||
// for (SysRoleWork sysRoleWork : roleWorkList) {
|
||||
// SysRoleVo sysRoleVo = roleService.selectRoleById(sysRoleWork.getRoleId());
|
||||
// if (sysRoleVo != null){
|
||||
// roleVos.add(sysRoleVo);
|
||||
// }
|
||||
// }
|
||||
// projectVo.setRoleVos(roleVos);
|
||||
// }
|
||||
|
||||
return busProjectVoList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据用户和项目判断是否有角色流程
|
||||
*/
|
||||
public Boolean isHaveValueByProject(Long projectId){
|
||||
Long userId = LoginHelper.getUserId();
|
||||
List<SysUserRole> roleList = baseMapper.getRoleList(userId, projectId);
|
||||
if (roleList != null && !roleList.isEmpty()){
|
||||
for (SysUserRole userRole : roleList) {
|
||||
LambdaQueryWrapper<SysRoleWork> lqw = new LambdaQueryWrapper<>();
|
||||
lqw.eq(SysRoleWork::getRoleId, userRole.getRoleId());
|
||||
lqw.eq(SysRoleWork::getProjectId,projectId);
|
||||
List<SysRoleWork> list = list(lqw);
|
||||
if (list != null && !list.isEmpty()){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -7,16 +7,21 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaMode;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusMaterialbatchdemandplanBo;
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusMrpBaseReq;
|
||||
import org.dromara.cailiaoshebei.domain.bo.RemainingReq;
|
||||
import org.dromara.cailiaoshebei.domain.dto.BusMrpDto;
|
||||
import org.dromara.cailiaoshebei.domain.dto.BusMrpExportDto;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusMaterialbatchdemandplanVo;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusMrpVo;
|
||||
import org.dromara.cailiaoshebei.service.IBusMaterialbatchdemandplanService;
|
||||
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.design.domain.BusBillofquantities;
|
||||
@ -66,6 +71,18 @@ public class BusMrpBaseController extends BaseController {
|
||||
private final IBusBillofquantitiesService busBillofquantitiesService;
|
||||
private final IBusBiddingPlanService busBiddingPlanService;
|
||||
|
||||
private final IBusMaterialbatchdemandplanService busMaterialbatchdemandplanService;
|
||||
|
||||
|
||||
/**
|
||||
* 查询物资-批次需求计划列表
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:list")
|
||||
@GetMapping("/getPlanList")
|
||||
public TableDataInfo<BusMaterialbatchdemandplanVo> list(BusMaterialbatchdemandplanBo bo, PageQuery pageQuery) {
|
||||
return busMaterialbatchdemandplanService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询物资-批次需求计划基础信息列表
|
||||
*/
|
||||
@ -75,6 +92,15 @@ public class BusMrpBaseController extends BaseController {
|
||||
return busMrpBaseService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询物资-批次需求计划基础信息列表
|
||||
*/
|
||||
// @SaCheckPermission("cailiaoshebei:mrpBase:getListByName")
|
||||
@GetMapping("/getListByName")
|
||||
public R<List<BusMrpBaseVo>> getListByName(BusMrpBaseReq req) {
|
||||
return R.ok(busMrpBaseService.getListByName(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出物资-批次需求计划基础信息列表
|
||||
*/
|
||||
@ -91,7 +117,7 @@ public class BusMrpBaseController extends BaseController {
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:query")
|
||||
// @SaCheckPermission("cailiaoshebei:mrpBase:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<BusMrpVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
@ -136,7 +162,7 @@ public class BusMrpBaseController extends BaseController {
|
||||
/**
|
||||
* 批量新增或修改
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:addbatch")
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:add")
|
||||
@RepeatSubmit()
|
||||
@PostMapping("/batch")
|
||||
public R<Void> batchAddOrUpdate(@RequestBody BusMrpDto dto) {
|
||||
@ -146,6 +172,7 @@ public class BusMrpBaseController extends BaseController {
|
||||
/**
|
||||
* 获取剩余量
|
||||
*/
|
||||
@SaCheckPermission(value = {"cailiaoshebei:mrpBase:add","cailiaoshebei:mrpBase:edit"},mode = SaMode.OR)
|
||||
@GetMapping("/remaining")
|
||||
public R<List<Map<String,Object>>> remaining( RemainingReq req) {
|
||||
String[] split = req.getLimitListId().split(",");
|
||||
@ -161,7 +188,7 @@ public class BusMrpBaseController extends BaseController {
|
||||
/**
|
||||
* 导入物资需求批次计划
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:import")
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:add")
|
||||
@Log(title = "物资-批次需求计划基础信息", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping("/import")
|
||||
@ -190,7 +217,7 @@ public class BusMrpBaseController extends BaseController {
|
||||
/**
|
||||
* 获取工程量清单列表
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:getZhaoBiaoList")
|
||||
@SaCheckPermission(value = {"cailiaoshebei:mrpBase:add","cailiaoshebei:mrpBase:edit"},mode = SaMode.OR)
|
||||
@GetMapping("/getZhaoBiaoList")
|
||||
public R<List<BusBiddingPlanVo>> getZhaoBiaoList(CoryObtainTheListReq req) {
|
||||
BusBiddingPlanBo bo = new BusBiddingPlanBo();
|
||||
@ -206,7 +233,7 @@ public class BusMrpBaseController extends BaseController {
|
||||
* @param bo
|
||||
* @return
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:getMore")
|
||||
@SaCheckPermission("cailiaoshebei:mrpBase:list")
|
||||
@GetMapping("/getMore")
|
||||
public R<List<BusBillofquantitiesLimitListVo>> getMore(BusBiddingPlanBo bo) {
|
||||
if (bo.getId() == null) {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.dromara.cailiaoshebei.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.dev33.satoken.annotation.SaMode;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
@ -8,14 +9,12 @@ import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.cailiaoshebei.domain.BusPlanDocAssociation;
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusMaterialbatchdemandplanBo;
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusPurchaseDocBo;
|
||||
import org.dromara.cailiaoshebei.domain.bo.FeedbackDto;
|
||||
import org.dromara.cailiaoshebei.domain.bo.*;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusLtnVo;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusMaterialbatchdemandplanVo;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusMrpBaseVo;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusPurchaseDocVo;
|
||||
import org.dromara.cailiaoshebei.service.IBusMaterialbatchdemandplanService;
|
||||
import org.dromara.cailiaoshebei.service.IBusPlanDocAssociationService;
|
||||
import org.dromara.cailiaoshebei.service.IBusPurchaseDocService;
|
||||
import org.dromara.cailiaoshebei.service.*;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
@ -27,11 +26,18 @@ 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.utils.logistics.LogisticsInquiryDemo;
|
||||
import org.dromara.common.utils.logistics.LogisticsInquiryUtil;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.design.domain.BusBillofquantities;
|
||||
import org.dromara.design.domain.BusBillofquantitiesVersions;
|
||||
import org.dromara.design.service.IBusBillofquantitiesService;
|
||||
import org.dromara.design.service.IBusBillofquantitiesVersionsService;
|
||||
import org.dromara.tender.domain.bo.TenderSupplierInputReq;
|
||||
import org.dromara.tender.domain.vo.TenderSupplierInputVo;
|
||||
//import org.dromara.tender.service.ITenderSupplierInputService;
|
||||
import org.dromara.xzd.domain.vo.XzdSupplierInfoVo;
|
||||
import org.dromara.xzd.service.IXzdSupplierInfoService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@ -64,6 +70,39 @@ public class BusPurchaseDocController extends BaseController {
|
||||
|
||||
private final IBusBillofquantitiesService busBillofquantitiesService;
|
||||
|
||||
private final IBusMrpBaseService busMrpBaseService;
|
||||
private final IXzdSupplierInfoService xzdSupplierInfoService;
|
||||
// private final ITenderSupplierInputService tenderSupplierInputService;
|
||||
private final IBusLtnService busLtnService;
|
||||
|
||||
/**
|
||||
* 查询物资-物流单号列表
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:purchaseDoc:list")
|
||||
@GetMapping("/getLtnList")
|
||||
public TableDataInfo<BusLtnVo> getLtnList(BusLtnBo bo, PageQuery pageQuery) {
|
||||
return busLtnService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据材料名查询物资-批次需求计划基础信息列表
|
||||
*/
|
||||
@SaCheckPermission(value = {"cailiaoshebei:purchaseDoc:add","cailiaoshebei:purchaseDoc:edit"},mode = SaMode.OR)
|
||||
@GetMapping("/getMrpBaseListByName")
|
||||
public R<List<BusMrpBaseVo>> getListByName(BusMrpBaseReq req) {
|
||||
return R.ok(busMrpBaseService.getListByName(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据材料名获取供应商列表
|
||||
*/
|
||||
@SaCheckPermission(value = {"cailiaoshebei:purchaseDoc:add","cailiaoshebei:purchaseDoc:edit"},mode = SaMode.OR)
|
||||
@GetMapping("/getListByName")
|
||||
public R<List<XzdSupplierInfoVo>> getListByName(TenderSupplierInputReq req) {
|
||||
return R.ok(xzdSupplierInfoService.getListByName(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询物资-采购联系单列表
|
||||
*/
|
||||
@ -102,7 +141,7 @@ public class BusPurchaseDocController extends BaseController {
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:purchaseDoc:query")
|
||||
// @SaCheckPermission("cailiaoshebei:purchaseDoc:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<BusPurchaseDocVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
@ -114,7 +153,7 @@ public class BusPurchaseDocController extends BaseController {
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:purchaseDoc:pdf")
|
||||
@SaCheckPermission("cailiaoshebei:purchaseDoc:list")
|
||||
@GetMapping("/pdf/{id}")
|
||||
public R<String> getPic(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
|
||||
@ -2,10 +2,14 @@ package org.dromara.cailiaoshebei.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaMode;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.system.domain.bo.SysUserBo;
|
||||
import org.dromara.system.domain.vo.SysUserVo;
|
||||
import org.dromara.system.service.ISysUserService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -36,6 +40,16 @@ public class BusPurchaseUserController extends BaseController {
|
||||
|
||||
private final IBusPurchaseUserService busPurchaseUserService;
|
||||
|
||||
private final ISysUserService userService;
|
||||
/**
|
||||
* 获取系统用户列表
|
||||
*/
|
||||
@SaCheckPermission(value = {"cailiaoshebei:purchaseUser:list","cailiaoshebei:purchaseUser:add","cailiaoshebei:purchaseUser:edit"},mode = SaMode.OR)
|
||||
@GetMapping("/getUserList")
|
||||
public TableDataInfo<SysUserVo> list(SysUserBo user, PageQuery pageQuery) {
|
||||
return userService.selectPageUserList(user, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询物资采购人员列表
|
||||
*/
|
||||
@ -61,7 +75,7 @@ public class BusPurchaseUserController extends BaseController {
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:purchaseUser:query")
|
||||
// @SaCheckPermission("cailiaoshebei:purchaseUser:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<BusPurchaseUserVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
@ -107,7 +121,7 @@ public class BusPurchaseUserController extends BaseController {
|
||||
/**
|
||||
* 新增或修改物资采购人员
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:purchaseUser:addOrUpdate")
|
||||
@SaCheckPermission(value = {"cailiaoshebei:purchaseUser:add","cailiaoshebei:purchaseUser:edit"},mode = SaMode.OR)
|
||||
@Log(title = "物资采购人员", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping("/addOrUpdate")
|
||||
@ -121,7 +135,7 @@ public class BusPurchaseUserController extends BaseController {
|
||||
*
|
||||
* @param projectId 项目id
|
||||
*/
|
||||
@SaCheckPermission("cailiaoshebei:purchaseUser:byProject")
|
||||
@SaCheckPermission("cailiaoshebei:purchaseUser:list")
|
||||
@GetMapping("/byProject/{projectId}")
|
||||
public R<BusPurchaseUserVo> getInfoByProject(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.dromara.cailiaoshebei.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.dev33.satoken.annotation.SaMode;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
@ -47,7 +48,7 @@ public class BusTotalsupplyplanController extends BaseController {
|
||||
/**
|
||||
* 获取主数据列表
|
||||
*/
|
||||
@SaCheckPermission("design:totalsupplyplan:queryList")
|
||||
@SaCheckPermission("design:totalsupplyplan:list")
|
||||
@GetMapping("/queryList")
|
||||
public R<List<BusTotalsupplyplanAuditVo>> queryList(TotalsupplyplanQueryListReq bo) {
|
||||
BusTotalsupplyplanAuditBo busTotalsupplyplanAuditBo = BeanUtil.copyProperties(bo, BusTotalsupplyplanAuditBo.class);
|
||||
@ -57,7 +58,7 @@ public class BusTotalsupplyplanController extends BaseController {
|
||||
/**
|
||||
* 根据主数据获取到详情
|
||||
*/
|
||||
@SaCheckPermission("design:totalsupplyplan:masterData")
|
||||
@SaCheckPermission(value = {"design:totalsupplyplan:list","design:totalsupplyplan:add","design:totalsupplyplan:edit"},mode = SaMode.OR)
|
||||
@GetMapping("/masterData")
|
||||
public R<MasterDataReqDto> masterData(MasterDataReq bo) {
|
||||
return R.ok(busTotalsupplyplanService.masterData(bo));
|
||||
@ -86,7 +87,7 @@ public class BusTotalsupplyplanController extends BaseController {
|
||||
/**
|
||||
* 导入物资-总供应计划数据
|
||||
*/
|
||||
@SaCheckPermission("design:totalsupplyplan:import")
|
||||
@SaCheckPermission("design:totalsupplyplan:add")
|
||||
@Log(title = "物资-总供应计划", businessType = BusinessType.IMPORT)
|
||||
@PostMapping("/import")
|
||||
public R<Void> importData(@RequestPart("file") MultipartFile file) {
|
||||
@ -98,7 +99,7 @@ public class BusTotalsupplyplanController extends BaseController {
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("design:totalsupplyplan:query")
|
||||
// @SaCheckPermission("design:totalsupplyplan:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<BusTotalsupplyplanVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
@ -130,7 +131,7 @@ public class BusTotalsupplyplanController extends BaseController {
|
||||
/**
|
||||
* 批量修改物资-总供应计划
|
||||
*/
|
||||
@SaCheckPermission("design:totalsupplyplan:batchEdit")
|
||||
@SaCheckPermission("design:totalsupplyplan:edit")
|
||||
@Log(title = "物资-总供应计划", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/batchEdit")
|
||||
|
||||
@ -3,6 +3,7 @@ package org.dromara.cailiaoshebei.controller.app;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
@ -30,7 +31,10 @@ import org.dromara.design.service.IBusBillofquantitiesService;
|
||||
import org.dromara.design.service.IBusBillofquantitiesVersionsService;
|
||||
import org.dromara.tender.domain.bo.TenderSupplierInputBo;
|
||||
import org.dromara.tender.domain.vo.TenderSupplierInputVo;
|
||||
import org.dromara.tender.service.ITenderSupplierInputService;
|
||||
//import org.dromara.tender.service.ITenderSupplierInputService;
|
||||
import org.dromara.xzd.domain.bo.XzdSupplierInfoBo;
|
||||
import org.dromara.xzd.domain.vo.XzdSupplierInfoVo;
|
||||
import org.dromara.xzd.service.IXzdSupplierInfoService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@ -63,7 +67,9 @@ public class BusPurchaseDocAppController extends BaseController {
|
||||
|
||||
private final IBusBillofquantitiesService busBillofquantitiesService;
|
||||
|
||||
private final ITenderSupplierInputService tenderSupplierInputService;
|
||||
// private final ITenderSupplierInputService tenderSupplierInputService;
|
||||
@Resource
|
||||
private IXzdSupplierInfoService supplierInfoService;
|
||||
|
||||
|
||||
/**
|
||||
@ -78,8 +84,8 @@ public class BusPurchaseDocAppController extends BaseController {
|
||||
* 查询供应商入库列表
|
||||
*/
|
||||
@GetMapping("/supList")
|
||||
public TableDataInfo<TenderSupplierInputVo> list(TenderSupplierInputBo bo, PageQuery pageQuery) {
|
||||
return tenderSupplierInputService.queryPageList(bo, pageQuery);
|
||||
public TableDataInfo<XzdSupplierInfoVo> list(XzdSupplierInfoBo bo, PageQuery pageQuery) {
|
||||
return supplierInfoService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
package org.dromara.cailiaoshebei.domain.bo;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.cailiaoshebei.domain.BusMrpBase;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 物资-批次需求计划基础信息业务对象 bus_mrp_base
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-08-13
|
||||
*/
|
||||
@Data
|
||||
public class BusMrpBaseReq implements Serializable {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 计划编号
|
||||
*/
|
||||
private String name;
|
||||
|
||||
}
|
||||
@ -146,6 +146,11 @@ public class BusMaterialbatchdemandplanVo implements Serializable {
|
||||
*/
|
||||
private BigDecimal tenderQuantity;
|
||||
|
||||
/**
|
||||
* 已使用数量
|
||||
*/
|
||||
private BigDecimal useQuantity;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -57,4 +57,8 @@ public class BusPlanDocAssociationVo implements Serializable {
|
||||
* 需求数量
|
||||
*/
|
||||
private BigDecimal demandQuantity;
|
||||
|
||||
|
||||
private String remark;
|
||||
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package org.dromara.cailiaoshebei.service;
|
||||
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusMrpBaseReq;
|
||||
import org.dromara.cailiaoshebei.domain.dto.BusMrpDto;
|
||||
import org.dromara.cailiaoshebei.domain.dto.BusMrpExportDto;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusMrpBaseVo;
|
||||
@ -87,4 +88,6 @@ public interface IBusMrpBaseService extends IService<BusMrpBase>{
|
||||
* 获取物资已有数量
|
||||
*/
|
||||
Map<String, Object> remaining(Long projectId,Long limitListId,Long mrpBaseId);
|
||||
|
||||
List<BusMrpBaseVo> getListByName(BusMrpBaseReq req);
|
||||
}
|
||||
|
||||
@ -7,9 +7,11 @@ import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.cailiaoshebei.controller.constant;
|
||||
import org.dromara.cailiaoshebei.domain.BusCailiaoshebeiPici;
|
||||
import org.dromara.cailiaoshebei.domain.BusPlanDocAssociation;
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusMaterialbatchdemandplanAddReq;
|
||||
import org.dromara.cailiaoshebei.service.IBusCailiaoshebeiPiciService;
|
||||
import org.dromara.cailiaoshebei.service.IBusMaterialsorderService;
|
||||
import org.dromara.cailiaoshebei.service.IBusPlanDocAssociationService;
|
||||
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
||||
@ -31,7 +33,7 @@ import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
|
||||
import org.dromara.tender.domain.vo.BusTenderPlanningLimitListVo;
|
||||
import org.dromara.tender.service.IBusBiddingPlanService;
|
||||
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
|
||||
import org.dromara.tender.service.ITenderSupplierInputService;
|
||||
//import org.dromara.tender.service.ITenderSupplierInputService;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
@ -79,6 +81,9 @@ public class BusMaterialbatchdemandplanServiceImpl extends ServiceImpl<BusMateri
|
||||
@Lazy
|
||||
@Autowired
|
||||
private IBusBillofquantitiesLimitListService busBillofquantitiesLimitListService;
|
||||
@Lazy
|
||||
@Autowired
|
||||
private IBusPlanDocAssociationService busPlanDocAssociationService;
|
||||
|
||||
/**
|
||||
* 查询物资-批次需求计划
|
||||
@ -119,18 +124,30 @@ public class BusMaterialbatchdemandplanServiceImpl extends ServiceImpl<BusMateri
|
||||
result.getRecords().stream().filter(vo -> {
|
||||
return hashSet.contains(vo.getSuppliespriceId()); // 仅保留 Set 中存在的数据
|
||||
}).forEach(item->{
|
||||
if (map.containsKey(item.getId())) {
|
||||
item.setTenderQuantity(map.get(item.getId()));
|
||||
|
||||
if (map.containsKey(item.getSuppliespriceId())) {
|
||||
item.setTenderQuantity(map.get(item.getSuppliespriceId()));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
result.getRecords().forEach(vo -> {
|
||||
if (vo.getSuppliespricePid() != null){
|
||||
for (BusMaterialbatchdemandplanVo vo : result.getRecords()) {
|
||||
List<BusPlanDocAssociation> busPlanDocAssociations = busPlanDocAssociationService.getBaseMapper().selectList(new LambdaQueryWrapper<BusPlanDocAssociation>().eq(BusPlanDocAssociation::getPlanId, vo.getId()));
|
||||
BigDecimal useQuantity = BigDecimal.ZERO;
|
||||
if (busPlanDocAssociations != null && !busPlanDocAssociations.isEmpty()) {
|
||||
useQuantity = busPlanDocAssociations.stream()
|
||||
// 提取每个item的demandQuantity,若为null则用0替代
|
||||
.map(item -> Optional.ofNullable(item.getDemandQuantity()).orElse(BigDecimal.ZERO))
|
||||
// 累加:初始值0,累加器为两个BigDecimal相加
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
BigDecimal subtract = vo.getDemandQuantity().subtract(useQuantity);
|
||||
vo.setUseQuantity(subtract.compareTo(BigDecimal.ZERO) >0 ? subtract: BigDecimal.ZERO);
|
||||
}
|
||||
if (vo.getSuppliespricePid() != null) {
|
||||
BusBillofquantitiesLimitList billofquantities = busBillofquantitiesLimitListService.getById(vo.getSuppliespricePid());
|
||||
vo.setSuppliespricePname(billofquantities.getName());
|
||||
}
|
||||
});
|
||||
}
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
|
||||
@ -6,13 +6,16 @@ import cn.hutool.core.convert.Convert;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.cailiaoshebei.domain.BusMaterialbatchdemandplan;
|
||||
import org.dromara.cailiaoshebei.domain.BusPlanDocAssociation;
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusMaterialbatchdemandplanBo;
|
||||
import org.dromara.cailiaoshebei.domain.bo.BusMrpBaseReq;
|
||||
import org.dromara.cailiaoshebei.domain.dto.BusMaterialbatchdemandplanExportDto;
|
||||
import org.dromara.cailiaoshebei.domain.dto.BusMrpDto;
|
||||
import org.dromara.cailiaoshebei.domain.dto.BusMrpExportDto;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusMaterialbatchdemandplanVo;
|
||||
import org.dromara.cailiaoshebei.domain.vo.BusMrpVo;
|
||||
import org.dromara.cailiaoshebei.service.IBusMaterialbatchdemandplanService;
|
||||
import org.dromara.cailiaoshebei.service.IBusPlanDocAssociationService;
|
||||
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
||||
@ -61,6 +64,8 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
|
||||
|
||||
private final IBusMaterialbatchdemandplanService planservice;
|
||||
|
||||
private final IBusPlanDocAssociationService planDocAssociationService;
|
||||
|
||||
private final IBusBillofquantitiesLimitListService busBillofquantitiesService;
|
||||
|
||||
private final IBusTenderPlanningLimitListService tenderPlanningLimitListService;
|
||||
@ -328,6 +333,38 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BusMrpBaseVo> getListByName(BusMrpBaseReq req) {
|
||||
if (req.getName() == null || req.getName().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
List<BusMaterialbatchdemandplan> busMaterialbatchdemandplans = planservice.getBaseMapper().selectList(new LambdaQueryWrapper<BusMaterialbatchdemandplan>()
|
||||
.eq(BusMaterialbatchdemandplan::getProjectId, req.getProjectId())
|
||||
.like(BusMaterialbatchdemandplan::getName, req.getName()));
|
||||
Iterator<BusMaterialbatchdemandplan> iterator = busMaterialbatchdemandplans.iterator();
|
||||
Set<Long> mrpIds = new HashSet<>();
|
||||
while (iterator.hasNext()){
|
||||
BusMaterialbatchdemandplan next = iterator.next();
|
||||
List<BusPlanDocAssociation> busPlanDocAssociations = planDocAssociationService.getBaseMapper().selectList(new LambdaQueryWrapper<BusPlanDocAssociation>()
|
||||
.eq(BusPlanDocAssociation::getProjectId, req.getProjectId())
|
||||
.eq(BusPlanDocAssociation::getPlanId, next.getId()));
|
||||
BigDecimal demandQuantity = BigDecimal.ZERO;
|
||||
busPlanDocAssociations.forEach(busPlanDocAssociation -> {
|
||||
demandQuantity.add(busPlanDocAssociation.getDemandQuantity());
|
||||
});
|
||||
if (demandQuantity.compareTo(next.getDemandQuantity()) >= 0) {
|
||||
iterator.remove();
|
||||
}else {
|
||||
mrpIds.add(next.getMrpBaseId());
|
||||
}
|
||||
}
|
||||
if (mrpIds.isEmpty()){
|
||||
return null;
|
||||
}
|
||||
return baseMapper.selectVoList(new LambdaQueryWrapper<BusMrpBase>()
|
||||
.eq(BusMrpBase::getStatus,BusinessStatusEnum.FINISH.getStatus()).in(BusMrpBase::getId,mrpIds));
|
||||
}
|
||||
|
||||
/**
|
||||
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
|
||||
* 正常使用只需#processEvent.flowCode=='leave1'
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.dromara.cailiaoshebei.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.ExcelReader;
|
||||
import com.alibaba.excel.read.metadata.ReadSheet;
|
||||
@ -104,7 +105,7 @@ public class BusTotalsupplyplanServiceImpl extends ServiceImpl<BusTotalsupplypla
|
||||
private LambdaQueryWrapper<BusTotalsupplyplan> buildQueryWrapper(BusTotalsupplyplanBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<BusTotalsupplyplan> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getProjectId() != null ,BusTotalsupplyplan::getProjectId,bo.getProjectId());
|
||||
lqw.eq(bo.getProjectId() != null, BusTotalsupplyplan::getProjectId, bo.getProjectId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTexture()), BusTotalsupplyplan::getTexture, bo.getTexture());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getBrand()), BusTotalsupplyplan::getBrand, bo.getBrand());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getQualityStandard()), BusTotalsupplyplan::getQualityStandard, bo.getQualityStandard());
|
||||
@ -239,7 +240,14 @@ public class BusTotalsupplyplanServiceImpl extends ServiceImpl<BusTotalsupplypla
|
||||
}
|
||||
// 关闭读取器
|
||||
excelReader.finish();
|
||||
if (allData.isEmpty()) {
|
||||
if (CollUtil.isEmpty(allData)) {
|
||||
throw new ServiceException("未读取到有效数据", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
// 过滤 id 为空的数据
|
||||
allData = allData.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.filter(data -> data.getId() != null).toList();
|
||||
if (CollUtil.isEmpty(allData)) {
|
||||
throw new ServiceException("未读取到有效数据", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
// 处理导入的数据
|
||||
@ -248,7 +256,7 @@ public class BusTotalsupplyplanServiceImpl extends ServiceImpl<BusTotalsupplypla
|
||||
return this.updateBatchById(list);
|
||||
} catch (Exception e) {
|
||||
log.error("物资供货总计划,导入Excel文件失败", e);
|
||||
throw new ServiceException("导入失败: " + e.getMessage(), HttpStatus.ERROR);
|
||||
throw new ServiceException("导入失败, " + e.getMessage(), HttpStatus.ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
package org.dromara.common.constant;
|
||||
|
||||
public class RoleIdConstant {
|
||||
|
||||
/**
|
||||
* 分包管理审核
|
||||
*/
|
||||
public static final Long FB_SH = 6L;
|
||||
|
||||
/**
|
||||
* 管理审核
|
||||
*/
|
||||
public static final Long SYS_SH = 7L;
|
||||
}
|
||||
@ -18,6 +18,11 @@ public class IdCoordinatePoint {
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 点位置 107.13162414986301,23.817601041770256
|
||||
*/
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
package org.dromara.common.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-11-18 14:38
|
||||
*/
|
||||
@Data
|
||||
public class WebpConverterStreamVo {
|
||||
|
||||
/**
|
||||
* 图片输入流
|
||||
*/
|
||||
private InputStream inputStream;
|
||||
|
||||
/**
|
||||
* 图片长度
|
||||
*/
|
||||
private long length;
|
||||
|
||||
/**
|
||||
* 图片类型
|
||||
*/
|
||||
private String contentType;
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
package org.dromara.common.utils;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.MessageUtils;
|
||||
@ -9,6 +10,8 @@ import org.dromara.contractor.domain.SubConstructionUser;
|
||||
import org.dromara.mobileAttendanceMachine.DeviceMessageSender;
|
||||
import org.dromara.mobileAttendanceMachine.KqjEntity;
|
||||
import org.dromara.project.domain.BusAttendanceMachine;
|
||||
import org.dromara.project.domain.BusAttendanceMachineRepeat;
|
||||
import org.dromara.project.service.IBusAttendanceMachineRepeatService;
|
||||
import org.dromara.project.service.IBusAttendanceMachineService;
|
||||
import org.dromara.sms4j.api.SmsBlend;
|
||||
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||
@ -19,6 +22,7 @@ import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
@ -36,6 +40,9 @@ public class AsyncUtil {
|
||||
@Lazy
|
||||
private IBusAttendanceMachineService attendanceMachineService;
|
||||
|
||||
@Resource
|
||||
private IBusAttendanceMachineRepeatService busAttendanceMachineRepeatService;
|
||||
|
||||
//发送短信
|
||||
@Async
|
||||
public void sendSms(List<String> mobileList, String config) {
|
||||
@ -63,22 +70,107 @@ public class AsyncUtil {
|
||||
public void sendPersonnel(Long teamId, SubConstructionUser constructionUser) {
|
||||
SysOssVo byId = ossService.getById(Long.valueOf(constructionUser.getFacePic()));
|
||||
List<BusAttendanceMachine> list = attendanceMachineService.lambdaQuery().apply("FIND_IN_SET({0}, teams)", teamId).list();
|
||||
|
||||
ArrayList<BusAttendanceMachineRepeat> repeats = new ArrayList<>();
|
||||
for (BusAttendanceMachine machine : list) {
|
||||
deviceMessageSender.sendPersonnelInformation(machine.getSn(), constructionUser.getSysUserId().toString(), constructionUser.getUserName(), byId.getUrl());
|
||||
Boolean b = deviceMessageSender.sendPersonnelInformation(machine.getSn(),
|
||||
constructionUser.getSysUserId().toString(), constructionUser.getUserName(), byId.getUrl());
|
||||
if (!b) {
|
||||
//记录下来重连时下发
|
||||
BusAttendanceMachineRepeat repeat = new BusAttendanceMachineRepeat();
|
||||
repeat.setSn(machine.getSn());
|
||||
repeat.setUserId(constructionUser.getSysUserId().toString());
|
||||
repeat.setUserName(constructionUser.getUserName());
|
||||
repeat.setUrl(byId.getUrl());
|
||||
repeat.setType("1");
|
||||
repeats.add(repeat);
|
||||
}
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(repeats)) {
|
||||
busAttendanceMachineRepeatService.saveBatch(repeats);
|
||||
}
|
||||
}
|
||||
|
||||
//删除考勤人员
|
||||
@Async
|
||||
public void deletePersonnel(SubConstructionUser constructionUser) {
|
||||
ArrayList<BusAttendanceMachineRepeat> repeats = new ArrayList<>();
|
||||
List<BusAttendanceMachine> list = attendanceMachineService.lambdaQuery().apply("FIND_IN_SET({0}, teams)", constructionUser.getTeamId()).list();
|
||||
for (BusAttendanceMachine machine : list) {
|
||||
try {
|
||||
deviceMessageSender.deleteUser(machine.getSn(), constructionUser.getSysUserId().toString());
|
||||
KqjEntity.CommonResponse commonResponse = deviceMessageSender.deleteUser(machine.getSn(), constructionUser.getSysUserId().toString());
|
||||
int code = commonResponse.getData().getCode();
|
||||
if (code != 0) {
|
||||
//记录下来重连时下发
|
||||
BusAttendanceMachineRepeat repeat = new BusAttendanceMachineRepeat();
|
||||
repeat.setSn(machine.getSn());
|
||||
repeat.setUserId(constructionUser.getSysUserId().toString());
|
||||
repeat.setUserName(constructionUser.getUserName());
|
||||
repeat.setUrl(null);
|
||||
repeat.setType("2");
|
||||
repeats.add(repeat);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("删除考勤人员异常", e);
|
||||
BusAttendanceMachineRepeat repeat = new BusAttendanceMachineRepeat();
|
||||
repeat.setSn(machine.getSn());
|
||||
repeat.setUserId(constructionUser.getSysUserId().toString());
|
||||
repeat.setUserName(constructionUser.getUserName());
|
||||
repeat.setUrl(null);
|
||||
repeat.setType("2");
|
||||
repeats.add(repeat);
|
||||
}
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(repeats)) {
|
||||
busAttendanceMachineRepeatService.saveBatch(repeats);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//重新下发人员
|
||||
@Async
|
||||
public void repeatSend(String sn) {
|
||||
List<BusAttendanceMachineRepeat> list = busAttendanceMachineRepeatService.lambdaQuery()
|
||||
.eq(BusAttendanceMachineRepeat::getSn, sn)
|
||||
.eq(BusAttendanceMachineRepeat::getType, "1")
|
||||
.list();
|
||||
List<Long> repeatIds = new ArrayList<>();
|
||||
for (BusAttendanceMachineRepeat repeat : list) {
|
||||
Boolean b = deviceMessageSender.sendPersonnelInformation(repeat.getSn(), repeat.getUserId(), repeat.getUserName(), repeat.getUrl());
|
||||
if (b) {
|
||||
//成功删除记录
|
||||
repeatIds.add(repeat.getId());
|
||||
}
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(repeatIds)) {
|
||||
busAttendanceMachineRepeatService.removeByIds(repeatIds);
|
||||
}
|
||||
}
|
||||
|
||||
//重新删除人员
|
||||
@Async
|
||||
public void repeatDelete(String sn) {
|
||||
List<BusAttendanceMachineRepeat> list = busAttendanceMachineRepeatService.lambdaQuery()
|
||||
.eq(BusAttendanceMachineRepeat::getSn, sn)
|
||||
.eq(BusAttendanceMachineRepeat::getType, "2")
|
||||
.list();
|
||||
List<Long> repeatIds = new ArrayList<>();
|
||||
for (BusAttendanceMachineRepeat repeat : list) {
|
||||
try {
|
||||
KqjEntity.CommonResponse commonResponse = deviceMessageSender.deleteUser(repeat.getSn(), repeat.getUserId());
|
||||
int code = commonResponse.getData().getCode();
|
||||
if (code == 0) {
|
||||
//成功删除记录
|
||||
repeatIds.add(repeat.getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("删除考勤人员异常", e);
|
||||
}
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(repeatIds)) {
|
||||
busAttendanceMachineRepeatService.removeByIds(repeatIds);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -8,6 +8,7 @@ import org.dromara.common.constant.GeoJsonConstant;
|
||||
import org.dromara.common.core.constant.HttpStatus;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.domain.GeoPoint;
|
||||
import org.dromara.facility.domain.FacMatrix;
|
||||
import org.dromara.facility.domain.FacPhotovoltaicPanel;
|
||||
import org.dromara.facility.domain.dto.geojson.FacFeatureByPlane;
|
||||
import org.dromara.facility.domain.dto.geojson.FacFeatureByPoint;
|
||||
@ -17,6 +18,7 @@ import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult
|
||||
import org.locationtech.jts.geom.*;
|
||||
import org.locationtech.jts.index.strtree.STRtree;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -337,6 +339,29 @@ public class JSTUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 匹配最近方阵,获取该方阵的信息
|
||||
*
|
||||
* @param pointEntity 点位
|
||||
* @param matrices 方阵列表
|
||||
* @return 最近方阵的信息
|
||||
*/
|
||||
public static FacMatrix findContainingMatrix(
|
||||
RecognizeConvertCoordinateResult pointEntity,
|
||||
List<FacMatrix> matrices
|
||||
) {
|
||||
double lng = Double.parseDouble(pointEntity.getLng());
|
||||
double lat = Double.parseDouble(pointEntity.getLat());
|
||||
Point point = geometryFactory.createPoint(new Coordinate(lng, lat));
|
||||
for (FacMatrix matrix : matrices) {
|
||||
Polygon polygon = parsePolygon(matrix.getPositions());
|
||||
if (polygon.covers(point)) { // covers 包含边界}
|
||||
return matrix;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 FacPhotovoltaicPanel.positions 转成 Polygon
|
||||
*/
|
||||
@ -358,15 +383,26 @@ public class JSTUtil {
|
||||
}
|
||||
|
||||
|
||||
public static String getLocationName(String lat, String lng){
|
||||
String a = lng+","+lat;
|
||||
public static String getLocationName(String lat, String lng) {
|
||||
String a = lng + "," + lat;
|
||||
String s = HttpUtil.get("https://restapi.amap.com/v3/geocode/regeo?location=" + a + "&Key=2a769e5362ac9a7d7db12e85b640124c");
|
||||
JSONObject jsonObject = JSONUtil.parseObj(s);
|
||||
String address = null;
|
||||
if(jsonObject.getInt("status") == 1){
|
||||
if (jsonObject.getInt("status") == 1) {
|
||||
address = jsonObject.getJSONObject("regeocode").getStr("formatted_address");
|
||||
}
|
||||
return address;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String s = "[{\"lng\":108.27080423,\"lat\":30.78111723,\"alt\":0},{\"lng\":108.1121822,\"lat\":28.29520706,\"alt\":0},{\"lng\":104.14552241,\"lat\":25.30970518,\"alt\":0},{\"lng\":109.08566373,\"lat\":22.16157883,\"alt\":0},{\"lng\":113.65236101,\"lat\":23.77537016,\"alt\":0},{\"lng\":114.7759412,\"lat\":27.54339559,\"alt\":0},{\"lng\":112.75195929,\"lat\":30.44798186,\"alt\":0},{\"lng\":109.80548867,\"lat\":31.34953868,\"alt\":0}]";
|
||||
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add(s);
|
||||
List<GeoPoint> matchingRange = findMatchingRange("30.247348", "105.729797", list);
|
||||
System.out.println(matchingRange == null);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
package org.dromara.common.utils;
|
||||
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.domain.IdCoordinatePoint;
|
||||
import org.locationtech.jts.geom.Coordinate;
|
||||
import org.locationtech.jts.geom.GeometryFactory;
|
||||
@ -8,8 +10,11 @@ import org.locationtech.jts.geom.Polygon;
|
||||
import org.locationtech.jts.util.GeometricShapeFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@Slf4j
|
||||
public class JtsPointMatcher {
|
||||
|
||||
private static final GeometryFactory geometryFactory = new GeometryFactory();
|
||||
@ -43,19 +48,30 @@ public class JtsPointMatcher {
|
||||
* @param radiusMeter 半径(米)
|
||||
* @return 匹配到的 pointsB 的 id
|
||||
*/
|
||||
public static List<Long> matchPoints(List<Coordinate> pointsA, List<IdCoordinatePoint> pointsB, double radiusMeter) {
|
||||
List<Long> matched = new ArrayList<>();
|
||||
public static Set<Long> matchPoints(List<Coordinate> pointsA, List<IdCoordinatePoint> pointsB, double radiusMeter) {
|
||||
Set<Long> matched = new HashSet<>();
|
||||
for (Coordinate pA : pointsA) {
|
||||
Point pointA = geometryFactory.createPoint(pA);
|
||||
for (IdCoordinatePoint pvPoint : pointsB) {
|
||||
// positions 字段 -> Coordinate
|
||||
String[] posArr = pvPoint.getPositions().split(",");
|
||||
double lon = Double.parseDouble(posArr[0]);
|
||||
double lat = Double.parseDouble(posArr[1]);
|
||||
String positions = pvPoint.getPositions();
|
||||
double lon;
|
||||
double lat;
|
||||
if (positions.startsWith("[") && positions.endsWith("]")) {
|
||||
// 是数组形式,例如 [1231515.141,3123123.3123]
|
||||
List<Double> doubles = JSONUtil.toList(positions, Double.class);
|
||||
lon = doubles.get(0);
|
||||
lat = doubles.get(1);
|
||||
} else {
|
||||
// 是单个坐标,例如 1231515.141,3123123.3123
|
||||
String[] posArr = positions.split(",");
|
||||
lon = Double.parseDouble(posArr[0]);
|
||||
lat = Double.parseDouble(posArr[1]);
|
||||
}
|
||||
Polygon circle = createCircle(lon, lat, radiusMeter);
|
||||
|
||||
if (circle.contains(pointA)) {
|
||||
matched.add(pvPoint.getId());
|
||||
log.info("匹配到桩点:{}", pvPoint.getName());
|
||||
break; // 找到一个就够
|
||||
}
|
||||
}
|
||||
@ -83,7 +99,7 @@ public class JtsPointMatcher {
|
||||
p2.setPositions("107.08827916132982,23.877744707721714"); // 很远
|
||||
listB.add(p2);
|
||||
|
||||
List<Long> result = matchPoints(listA, listB, 4.4);
|
||||
Set<Long> result = matchPoints(listA, listB, 4.4);
|
||||
|
||||
System.out.println("匹配到的桩点ID:");
|
||||
for (Long id : result) {
|
||||
|
||||
@ -0,0 +1,187 @@
|
||||
package org.dromara.common.utils;
|
||||
|
||||
import org.dromara.common.domain.WebpConverterStreamVo;
|
||||
|
||||
import javax.imageio.IIOImage;
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.imageio.ImageWriteParam;
|
||||
import javax.imageio.ImageWriter;
|
||||
import javax.imageio.stream.FileImageOutputStream;
|
||||
import javax.imageio.stream.MemoryCacheImageOutputStream;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-11-18 14:09
|
||||
*/
|
||||
public class WebpConverterUtil {
|
||||
|
||||
/**
|
||||
* 将 PNG 图片转换为 WebP
|
||||
*
|
||||
* @param inputFile 输入文件
|
||||
* @param outputFile 输出文件
|
||||
* @param quality 压缩质量(0.0 ~ 1.0)
|
||||
*/
|
||||
public static void convertPngToWebp(File inputFile, File outputFile, float quality) throws IOException {
|
||||
// 读取 PNG 图片
|
||||
BufferedImage image = ImageIO.read(inputFile);
|
||||
// 获取 WebP writer
|
||||
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp");
|
||||
if (!writers.hasNext()) {
|
||||
throw new IllegalStateException("未找到 WebP ImageWriter,检查依赖是否正确!");
|
||||
}
|
||||
ImageWriter writer = writers.next();
|
||||
// 设置压缩质量
|
||||
ImageWriteParam param = writer.getDefaultWriteParam();
|
||||
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||
String[] types = param.getCompressionTypes();
|
||||
if (types != null && types.length > 0) {
|
||||
param.setCompressionType(types[0]); // 默认一般是 "Lossy"
|
||||
}
|
||||
param.setCompressionQuality(quality); // 0.0 ~ 1.0(越小越压缩)
|
||||
try (FileImageOutputStream output = new FileImageOutputStream(outputFile)) {
|
||||
writer.setOutput(output);
|
||||
writer.write(null, new IIOImage(image, null, null), param);
|
||||
} finally {
|
||||
writer.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从 URL 读取图片并转换为 WebP
|
||||
*
|
||||
* @param imageUrl 图片对象存储 URL
|
||||
* @param outputFile 输出文件
|
||||
* @param quality WebP 压缩质量 (0.0 ~ 1.0)
|
||||
*/
|
||||
public static void convertPngUrlToWebp(String imageUrl, File outputFile, float quality) throws IOException, URISyntaxException {
|
||||
// 1. 根据 URL 读取图片
|
||||
BufferedImage image = ImageIO.read(new URI(imageUrl).toURL());
|
||||
if (image == null) {
|
||||
throw new IOException("无法从 URL 加载图片,URL = " + imageUrl);
|
||||
}
|
||||
|
||||
// 2. 获取 WebP writer
|
||||
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp");
|
||||
if (!writers.hasNext()) {
|
||||
throw new IllegalStateException("未找到 WebP ImageWriter,请检查 TwelveMonkeys 依赖!");
|
||||
}
|
||||
ImageWriter writer = writers.next();
|
||||
|
||||
// 3. 设置压缩质量
|
||||
ImageWriteParam param = writer.getDefaultWriteParam();
|
||||
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||
String[] types = param.getCompressionTypes();
|
||||
if (types != null && types.length > 0) {
|
||||
param.setCompressionType(types[0]); // 默认一般是 "Lossy"
|
||||
}
|
||||
param.setCompressionQuality(quality);
|
||||
|
||||
// 4. 写出 WebP
|
||||
try (FileImageOutputStream output = new FileImageOutputStream(outputFile)) {
|
||||
writer.setOutput(output);
|
||||
writer.write(null, new IIOImage(image, null, null), param);
|
||||
} finally {
|
||||
writer.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从 URL 加载 PNG/JPG 等图片,压缩分辨率后转换为 WebP,并返回 InputStream
|
||||
*
|
||||
* @param imageUrl 图片对象存储 URL
|
||||
* @param quality WebP 压缩质量 (0.0 ~ 1.0)
|
||||
* @param targetWidth 目标宽度(为 0 表示按高度等比例缩放)
|
||||
* @param targetHeight 目标高度(为 0 表示按宽度等比例缩放)
|
||||
*/
|
||||
public static WebpConverterStreamVo convertUrlToWebpStream(
|
||||
String imageUrl,
|
||||
float quality,
|
||||
int targetWidth,
|
||||
int targetHeight
|
||||
) throws IOException, URISyntaxException {
|
||||
|
||||
// 1. 加载 URL 图片
|
||||
BufferedImage original = ImageIO.read(new URI(imageUrl).toURL());
|
||||
if (original == null) {
|
||||
throw new IOException("无法从 URL 加载图片: " + imageUrl);
|
||||
}
|
||||
|
||||
// 2. 计算目标宽高(支持等比例缩放)
|
||||
int width = original.getWidth();
|
||||
int height = original.getHeight();
|
||||
|
||||
if (targetWidth > 0 && targetHeight > 0) {
|
||||
// 固定分辨率
|
||||
width = targetWidth;
|
||||
height = targetHeight;
|
||||
} else if (targetWidth > 0) {
|
||||
// 高度自适应
|
||||
height = original.getHeight() * targetWidth / original.getWidth();
|
||||
width = targetWidth;
|
||||
} else if (targetHeight > 0) {
|
||||
// 宽度自适应
|
||||
width = original.getWidth() * targetHeight / original.getHeight();
|
||||
height = targetHeight;
|
||||
}
|
||||
// 否则都为 0,则保持原图大小
|
||||
|
||||
// 3. 按分辨率缩放
|
||||
Image scaledInstance = original.getScaledInstance(width, height, Image.SCALE_SMOOTH);
|
||||
BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
|
||||
|
||||
Graphics2D g = resized.createGraphics();
|
||||
g.drawImage(scaledInstance, 0, 0, null);
|
||||
g.dispose();
|
||||
|
||||
// 4. 获取 WebP writer
|
||||
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp");
|
||||
if (!writers.hasNext()) {
|
||||
throw new IllegalStateException("未找到 WebP ImageWriter,请确认 TwelveMonkeys 依赖已正确导入!");
|
||||
}
|
||||
ImageWriter writer = writers.next();
|
||||
|
||||
// 5. 设置压缩参数
|
||||
ImageWriteParam param = writer.getDefaultWriteParam();
|
||||
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||
|
||||
String[] types = param.getCompressionTypes();
|
||||
if (types != null && types.length > 0) {
|
||||
param.setCompressionType(types[0]);
|
||||
}
|
||||
param.setCompressionQuality(quality);
|
||||
|
||||
// 6. 输出到流
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try (MemoryCacheImageOutputStream output = new MemoryCacheImageOutputStream(baos)) {
|
||||
writer.setOutput(output);
|
||||
writer.write(null, new IIOImage(resized, null, null), param);
|
||||
} finally {
|
||||
writer.dispose();
|
||||
}
|
||||
|
||||
// 7. 返回
|
||||
WebpConverterStreamVo vo = new WebpConverterStreamVo();
|
||||
vo.setInputStream(new ByteArrayInputStream(baos.toByteArray()));
|
||||
vo.setLength(baos.size());
|
||||
vo.setContentType("image/webp");
|
||||
return vo;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
File input = new File("input.jpeg");
|
||||
File output = new File("output.webp");
|
||||
convertPngToWebp(input, output, 0.6f);
|
||||
System.out.println("转换完成!");
|
||||
}
|
||||
}
|
||||
@ -42,6 +42,7 @@ public class BaiDuFace {
|
||||
private static final String FACE_COMPARE_URL = "https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=%s";
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 人脸识别+人脸检测
|
||||
*
|
||||
@ -147,7 +148,6 @@ public class BaiDuFace {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 人脸对比(计算人脸相似度)
|
||||
*
|
||||
|
||||
@ -0,0 +1,106 @@
|
||||
package org.dromara.complaintBox.app.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.domain.model.LoginUser;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
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.complaintBox.app.domain.vo.AppDetailsOfTheOpinionVo;
|
||||
import org.dromara.complaintBox.domain.bo.BusComplaintBoxBo;
|
||||
import org.dromara.complaintBox.domain.bo.BusComplaintBoxMessageLoggingBo;
|
||||
import org.dromara.complaintBox.domain.vo.BusComplaintBoxVo;
|
||||
import org.dromara.complaintBox.service.IBusComplaintBoxMessageLoggingService;
|
||||
import org.dromara.complaintBox.service.IBusComplaintBoxService;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* 意见箱
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/app/complaintBox/complaintBox")
|
||||
public class AppBusComplaintBoxController extends BaseController {
|
||||
|
||||
@Lazy
|
||||
private final IBusComplaintBoxService busComplaintBoxService;
|
||||
@Lazy
|
||||
private final IBusComplaintBoxMessageLoggingService busComplaintBoxMessageLoggingService;
|
||||
|
||||
|
||||
/**
|
||||
* 查询意见箱列表
|
||||
*/
|
||||
// @SaCheckPermission("appComplaintBox:complaintBox:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<BusComplaintBoxVo> list(BusComplaintBoxBo bo, PageQuery pageQuery) {
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
if (loginUser != null) {
|
||||
bo.setUserId(loginUser.getUserId());
|
||||
}
|
||||
return busComplaintBoxService.appQueryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取意见箱详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
// @SaCheckPermission("appComplaintBox:complaintBox:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<AppDetailsOfTheOpinionVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(busComplaintBoxService.appQueryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增意见箱
|
||||
*/
|
||||
// @SaCheckPermission("appComplaintBox:complaintBox:add")
|
||||
@Log(title = "意见箱", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusComplaintBoxBo bo) {
|
||||
return toAjax(busComplaintBoxService.insertByBo(bo));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 新增意见回复
|
||||
*/
|
||||
// @SaCheckPermission("appComplaintBox:complaintBox:add")
|
||||
@Log(title = "意见箱", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping("/postAReply")
|
||||
public R<Void> postAReply(@Validated(AddGroup.class) @RequestBody BusComplaintBoxMessageLoggingBo bo) {
|
||||
return toAjax(busComplaintBoxMessageLoggingService.insertAppByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改意见阅读状态
|
||||
*/
|
||||
// @SaCheckPermission("appComplaintBox:complaintBox:edit")
|
||||
@Log(title = "意见箱", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/editCheckStatus")
|
||||
public R<Void> editCheckStatus(@Validated(EditGroup.class) @RequestBody BusComplaintBoxBo bo) {
|
||||
return toAjax(busComplaintBoxService.editCheckStatus(bo));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
package org.dromara.complaintBox.app.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
import org.dromara.complaintBox.domain.vo.BusComplaintBoxMessageLoggingVo;
|
||||
import org.dromara.complaintBox.domain.vo.BusComplaintBoxVo;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class AppDetailsOfTheOpinionVo implements Serializable {
|
||||
|
||||
private BusComplaintBoxVo busComplaintBoxVo;
|
||||
|
||||
private List<BusComplaintBoxMessageLoggingVo> messageLoggingVos;
|
||||
}
|
||||
@ -0,0 +1,124 @@
|
||||
package org.dromara.complaintBox.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.complaintBox.domain.bo.BusComplaintBoxDisposeLoggingBo;
|
||||
import org.dromara.complaintBox.domain.bo.BusComplaintBoxMessageLoggingBo;
|
||||
import org.dromara.complaintBox.domain.vo.BusComplaintBoxDisposeLoggingVo;
|
||||
import org.dromara.complaintBox.domain.vo.ComplaintBoxCountVo;
|
||||
import org.dromara.complaintBox.domain.vo.DetailsOfTheOpinionVo;
|
||||
import org.dromara.complaintBox.service.IBusComplaintBoxDisposeLoggingService;
|
||||
import org.dromara.complaintBox.service.IBusComplaintBoxMessageLoggingService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
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.complaintBox.domain.vo.BusComplaintBoxVo;
|
||||
import org.dromara.complaintBox.domain.bo.BusComplaintBoxBo;
|
||||
import org.dromara.complaintBox.service.IBusComplaintBoxService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 意见箱
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/complaintBox/complaintBox")
|
||||
public class BusComplaintBoxController extends BaseController {
|
||||
|
||||
private final IBusComplaintBoxService busComplaintBoxService;
|
||||
@Lazy
|
||||
@Autowired
|
||||
private IBusComplaintBoxMessageLoggingService busComplaintBoxMessageLoggingService;
|
||||
@Lazy
|
||||
@Autowired
|
||||
private IBusComplaintBoxDisposeLoggingService disposeLoggingService;
|
||||
|
||||
|
||||
/**
|
||||
* 查询意见箱列表
|
||||
*/
|
||||
@SaCheckPermission("complaintBox:complaintBox:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<BusComplaintBoxVo> list(BusComplaintBoxBo bo, PageQuery pageQuery) {
|
||||
return busComplaintBoxService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
/**
|
||||
* 查询意见处理记录列表
|
||||
*/
|
||||
@SaCheckPermission("complaintBox:complaintBox:list")
|
||||
@GetMapping("/getDisposeLogList")
|
||||
public TableDataInfo<BusComplaintBoxDisposeLoggingVo> getDisposeLogList(BusComplaintBoxDisposeLoggingBo bo, PageQuery pageQuery) {
|
||||
return disposeLoggingService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
/**
|
||||
* web获取各个处理状态数量
|
||||
*/
|
||||
@SaCheckPermission("complaintBox:complaintBox:list")
|
||||
@GetMapping("/getCount")
|
||||
public R<List<ComplaintBoxCountVo>> getCount(BusComplaintBoxBo bo) {
|
||||
return R.ok(busComplaintBoxService.getCount(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取意见箱详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
// @SaCheckPermission("complaintBox:complaintBox:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<DetailsOfTheOpinionVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(busComplaintBoxService.getInfo(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增意见回复
|
||||
*/
|
||||
@SaCheckPermission("complaintBox:complaintBox:add")
|
||||
@Log(title = "意见箱", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping("/postAReply")
|
||||
public R<Void> postAReply(@Validated(AddGroup.class) @RequestBody BusComplaintBoxMessageLoggingBo bo) {
|
||||
return toAjax(busComplaintBoxMessageLoggingService.insertWebByBo(bo));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 修改意见阅读状态
|
||||
*/
|
||||
@SaCheckPermission("complaintBox:complaintBox:edit")
|
||||
@Log(title = "意见箱", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/editCheckStatus")
|
||||
public R<Void> editCheckStatus(@Validated(EditGroup.class) @RequestBody BusComplaintBoxBo bo) {
|
||||
return toAjax(busComplaintBoxService.editCheckStatus(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改意见阅读状态
|
||||
*/
|
||||
@SaCheckPermission("complaintBox:complaintBox:edit")
|
||||
@Log(title = "意见箱", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/editStatus")
|
||||
public R<Void> editStatus(@Validated(EditGroup.class) @RequestBody BusComplaintBoxBo bo) {
|
||||
return toAjax(busComplaintBoxService.editStatus(bo));
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,91 @@
|
||||
package org.dromara.complaintBox.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_complaint_box
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("bus_complaint_box")
|
||||
public class BusComplaintBox extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 公司id(当前登录人的顶层下一级部门id)
|
||||
*/
|
||||
private Long companyId;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 用户id
|
||||
*/
|
||||
private Long userId;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private Long avatar;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 意见类型(1、功能建议,2、Bug反馈,3、体验问题,4其他意见)
|
||||
*/
|
||||
private String opinionType;
|
||||
|
||||
/**
|
||||
* 详细描述
|
||||
*/
|
||||
private String detail;
|
||||
|
||||
/**
|
||||
* 上传图片(id,id之间使用','分割)
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 是否匿名提交(0、否,1、是)
|
||||
*/
|
||||
private String isCryptonym;
|
||||
|
||||
/**
|
||||
* 处理状态(0、待处理,5、处理中,9、已解决,10、退回,14、不予解决())
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 当前处理人id
|
||||
*/
|
||||
private Long currentDisposeUserId;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
package org.dromara.complaintBox.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_complaint_box_dispose_logging
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("bus_complaint_box_dispose_logging")
|
||||
public class BusComplaintBoxDisposeLogging extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 意见id
|
||||
*/
|
||||
private Long complaintId;
|
||||
|
||||
/**
|
||||
* 用户id
|
||||
*/
|
||||
private Long userId;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private Long avatar;
|
||||
|
||||
/**
|
||||
* 是否退回(0、否,1、是)
|
||||
*/
|
||||
private String isRefund;
|
||||
|
||||
/**
|
||||
* 退回原因
|
||||
*/
|
||||
private String cause;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,76 @@
|
||||
package org.dromara.complaintBox.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_complaint_box_message_logging
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("bus_complaint_box_message_logging")
|
||||
public class BusComplaintBoxMessageLogging extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 意见id
|
||||
*/
|
||||
private Long complaintId;
|
||||
|
||||
/**
|
||||
* 回复用户id
|
||||
*/
|
||||
private Long replyUserId;
|
||||
|
||||
/**
|
||||
* 回复用户名
|
||||
*/
|
||||
private String replyUserName;
|
||||
|
||||
/**
|
||||
* 回复用户头像地址
|
||||
*/
|
||||
private Long replyAvatar;
|
||||
|
||||
/**
|
||||
* 被回复用户id
|
||||
*/
|
||||
private Long repliedUserId;
|
||||
|
||||
/**
|
||||
* 被回复用户名
|
||||
*/
|
||||
private String repliedUserName;
|
||||
|
||||
/**
|
||||
* 被回复用户头像地址
|
||||
*/
|
||||
private Long repliedAvatar;
|
||||
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
private String details;
|
||||
|
||||
/**
|
||||
* 处理状态(0、未读,1、已读)
|
||||
*/
|
||||
private String status;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,95 @@
|
||||
package org.dromara.complaintBox.domain.bo;
|
||||
|
||||
import org.dromara.complaintBox.domain.BusComplaintBox;
|
||||
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_complaint_box
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = BusComplaintBox.class, reverseConvertGenerate = false)
|
||||
public class BusComplaintBoxBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 公司id(当前登录人的顶层下一级部门id)
|
||||
*/
|
||||
private Long companyId;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 用户id
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = { AddGroup.class })
|
||||
private Long userId;
|
||||
/**
|
||||
* 当前处理人id
|
||||
*/
|
||||
private Long currentDisposeUserId;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private Long avatar;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 意见类型(1、功能建议,2、Bug反馈,3、体验问题,4其他意见)
|
||||
*/
|
||||
private String opinionType;
|
||||
|
||||
/**
|
||||
* 详细描述
|
||||
*/
|
||||
private String detail;
|
||||
|
||||
/**
|
||||
* 上传图片(id,id之间使用','分割)
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 是否匿名提交(0、否,1、是)
|
||||
*/
|
||||
private String isCryptonym;
|
||||
|
||||
/**
|
||||
* 处理状态(0、待处理,5、处理中,9、已解决,14、关闭)
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 退回原因
|
||||
*/
|
||||
private String cause;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,60 @@
|
||||
package org.dromara.complaintBox.domain.bo;
|
||||
|
||||
import org.dromara.complaintBox.domain.BusComplaintBoxDisposeLogging;
|
||||
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_complaint_box_dispose_logging
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = BusComplaintBoxDisposeLogging.class, reverseConvertGenerate = false)
|
||||
public class BusComplaintBoxDisposeLoggingBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 意见id
|
||||
*/
|
||||
private Long complaintId;
|
||||
|
||||
/**
|
||||
* 用户id
|
||||
*/
|
||||
private Long userId;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
private Long avatar;
|
||||
|
||||
/**
|
||||
* 是否退回(0、否,1、是)
|
||||
*/
|
||||
private String isRefund;
|
||||
|
||||
/**
|
||||
* 退回原因
|
||||
*/
|
||||
private String cause;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,80 @@
|
||||
package org.dromara.complaintBox.domain.bo;
|
||||
|
||||
import org.dromara.complaintBox.domain.BusComplaintBoxMessageLogging;
|
||||
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_complaint_box_message_logging
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = BusComplaintBoxMessageLogging.class, reverseConvertGenerate = false)
|
||||
public class BusComplaintBoxMessageLoggingBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 意见id
|
||||
*/
|
||||
private Long complaintId;
|
||||
|
||||
/**
|
||||
* 回复用户id
|
||||
*/
|
||||
private Long replyUserId;
|
||||
|
||||
/**
|
||||
* 回复用户名
|
||||
*/
|
||||
private String replyUserName;
|
||||
|
||||
/**
|
||||
* 回复用户头像地址
|
||||
*/
|
||||
private Long replyAvatar;
|
||||
|
||||
/**
|
||||
* 被回复用户id
|
||||
*/
|
||||
private Long repliedUserId;
|
||||
|
||||
/**
|
||||
* 被回复用户名
|
||||
*/
|
||||
private String repliedUserName;
|
||||
|
||||
/**
|
||||
* 被回复用户头像地址
|
||||
*/
|
||||
private Long repliedAvatar;
|
||||
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
private String details;
|
||||
|
||||
/**
|
||||
* 处理状态(0、未读,1、已读)
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 上一条沟通记录id
|
||||
*/
|
||||
private Long oldId;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,82 @@
|
||||
package org.dromara.complaintBox.domain.vo;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import org.dromara.complaintBox.domain.BusComplaintBoxDisposeLogging;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 意见箱-意见处理记录视图对象 bus_complaint_box_dispose_logging
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = BusComplaintBoxDisposeLogging.class)
|
||||
public class BusComplaintBoxDisposeLoggingVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 意见id
|
||||
*/
|
||||
@ExcelProperty(value = "意见id")
|
||||
private Long complaintId;
|
||||
|
||||
/**
|
||||
* 用户id
|
||||
*/
|
||||
@ExcelProperty(value = "用户id")
|
||||
private Long userId;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
@ExcelProperty(value = "用户名")
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 头像地址
|
||||
*/
|
||||
@ExcelProperty(value = "头像地址")
|
||||
private Long avatar;
|
||||
|
||||
/**
|
||||
* 是否退回(0、否,1、是)
|
||||
*/
|
||||
@ExcelProperty(value = "是否退回", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "0=、否,1、是")
|
||||
private String isRefund;
|
||||
|
||||
/**
|
||||
* 退回原因
|
||||
*/
|
||||
@ExcelProperty(value = "退回原因")
|
||||
private String cause;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,99 @@
|
||||
package org.dromara.complaintBox.domain.vo;
|
||||
|
||||
import org.dromara.complaintBox.domain.BusComplaintBoxMessageLogging;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 意见箱-意见沟通记录视图对象 bus_complaint_box_message_logging
|
||||
*
|
||||
* @author Lion Li
|
||||
* @date 2025-11-29
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = BusComplaintBoxMessageLogging.class)
|
||||
public class BusComplaintBoxMessageLoggingVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 意见id
|
||||
*/
|
||||
@ExcelProperty(value = "意见id")
|
||||
private Long complaintId;
|
||||
|
||||
/**
|
||||
* 回复用户id
|
||||
*/
|
||||
private Long replyUserId;
|
||||
|
||||
/**
|
||||
* 回复用户名
|
||||
*/
|
||||
private String replyUserName;
|
||||
|
||||
/**
|
||||
* 回复用户头像地址
|
||||
*/
|
||||
private Long replyAvatar;
|
||||
private String replyAvatarUrl;
|
||||
|
||||
/**
|
||||
* 被回复用户id
|
||||
*/
|
||||
private Long repliedUserId;
|
||||
|
||||
/**
|
||||
* 被回复用户名
|
||||
*/
|
||||
private String repliedUserName;
|
||||
|
||||
/**
|
||||
* 被回复用户头像地址
|
||||
*/
|
||||
private Long repliedAvatar;
|
||||
private String repliedAvatarUrl;
|
||||
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
@ExcelProperty(value = "消息内容")
|
||||
private String details;
|
||||
|
||||
/**
|
||||
* 处理状态(0、未读,1、已读)
|
||||
*/
|
||||
@ExcelProperty(value = "处理状态", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "0=、未读,1、已读")
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 发起人类型(0、发起人,1、处理人)
|
||||
*/
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user