Compare commits
164 Commits
98f23e2c02
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 57855f4307 | |||
| 6784eafe6e | |||
| 0b42c1d6a6 | |||
| 4b37a7327f | |||
| 0287f1e4ce | |||
| 5d8af1cab8 | |||
| 123896f08b | |||
| a8a198b51f | |||
| f00b98714a | |||
| 4ff87f3996 | |||
| 5f3ae0f9f1 | |||
| 786c864a27 | |||
| c61e802b85 | |||
| 9a568799f4 | |||
| 8aa38063bf | |||
| c4a11ec245 | |||
| 169b76589c | |||
| 199f51ea21 | |||
| 23572dfc07 | |||
| 570b0ce316 | |||
| f953a96c36 | |||
| 25c4eee464 | |||
| b209ef1fab | |||
| 77e9f4d9a2 | |||
| e73c808bc3 | |||
| edf0d1a5db | |||
| cc23a308c1 | |||
| bc891327c9 | |||
| 39bedfeb92 | |||
| 56fc4ff83e | |||
| 524ed30728 | |||
| 584304e744 | |||
| 56418600c5 | |||
| 40e57b18cb | |||
| ced6cb219c | |||
| 218ec5ea95 | |||
| 1c601bd68e | |||
| 7d6eba719b | |||
| 8cfc34dbcb | |||
| 23a749973d | |||
| 4b96702dc9 | |||
| a1af8711ef | |||
| 9e8cff931b | |||
| 5bccd71bdc | |||
| 544f35a601 | |||
| f920d4976e | |||
| cdcd665d43 | |||
| 08de61e455 | |||
| 025c3115b7 | |||
| 9e366554b7 | |||
| d934abf0fe | |||
| e16e9133e2 | |||
| d7854a35d7 | |||
| 97e0dd467f | |||
| e58a99e696 | |||
| 0d5a9eb505 | |||
| 45ac1817e1 | |||
| f2d4ff4237 | |||
| a4cc5c14f3 | |||
| 5be571cc30 | |||
| ff656dd046 | |||
| 20574d0037 | |||
| 42cf396e93 | |||
| 2a30b05dd7 | |||
| 4ecee185bf | |||
| 48ab59c67d | |||
| 806e8f3391 | |||
| 61244321a7 | |||
| ff1e613316 | |||
| 03161751fc | |||
| 9ebf4a3e5f | |||
| 3ba13e3ef8 | |||
| 8d3853fe6b | |||
| dbc09a62ea | |||
| f3fa78475c | |||
| c565771283 | |||
| bac8488244 | |||
| a5f661b558 | |||
| ceecec97c7 | |||
| c6ae8a4c00 | |||
| 37d0c776c0 | |||
| f8eea0f63f | |||
| 59c749ab2a | |||
| eeeba2bf4b | |||
| a9ce42101f | |||
| 13de88265f | |||
| a464a1236d | |||
| fce5d0e7fc | |||
| 66ba43d030 | |||
| 1aa77e5eda | |||
| 037016fc13 | |||
| 99f0026552 | |||
| 535262d721 | |||
| fbcb9ca3f2 | |||
| 2a7a20b966 | |||
| 98fdab0dba | |||
| bd71335ae6 | |||
| 7f746fc250 | |||
| 901c8785fe | |||
| e4e9718acb | |||
| 738101f374 | |||
| a7befd7278 | |||
| 52e968c313 | |||
| de9d7d34d6 | |||
| 9f0105d88a | |||
| 80ec8ff86d | |||
| f3473fe5d5 | |||
| 856f3f334b | |||
| 0b216a4101 | |||
| c7338b45ad | |||
| c93b1b752e | |||
| e38074bb25 | |||
| be0f425e14 | |||
| f24e33b1c7 | |||
| 48ea20581c | |||
| e7fa22e573 | |||
| 83b7b32035 | |||
| 6a0be071b8 | |||
| 7bdf8f53b9 | |||
| 03b249afe7 | |||
| 2e5e42fd84 | |||
| f9d9785536 | |||
| a06511e0bf | |||
| 31aa56d34b | |||
| 2b4517760f | |||
| c318d0b10b | |||
| ec54b4ff52 | |||
| 965a0cc90e | |||
| ebddc5c51f | |||
| a323844440 | |||
| 6bcddf50da | |||
| c72275859f | |||
| 9561ee9323 | |||
| b7a52de2d2 | |||
| bfc3ea60fd | |||
| 1acc676b0f | |||
| d6a378f711 | |||
| b4f56b6c79 | |||
| b5d2b3df06 | |||
| 4042b4a441 | |||
| 1fd3da3e2a | |||
| 0d84c49ca4 | |||
| cecfb60e71 | |||
| aec8667edc | |||
| e930cd3b7c | |||
| 373906bde7 | |||
| bca9745e60 | |||
| 6808057111 | |||
| 9f1da9e6c0 | |||
| d8838f8e01 | |||
| d92d37c646 | |||
| 6398a28974 | |||
| cce9ef98d8 | |||
| 467a972a6d | |||
| 00e5f5ede6 | |||
| 1b590bbcbd | |||
| 40d53dffba | |||
| db3af72d5f | |||
| 9604cab4d6 | |||
| 536b25d773 | |||
| e87cbce77a | |||
| f34afd962d | |||
| aab0a5e0b8 | |||
| f9d1a7a489 |
@ -92,7 +92,7 @@ public class SysRegisterService {
|
||||
// if (!isValid) {
|
||||
// throw new UserException("注册失败,密码需满足8–18位,包含大小写字母、数字、特殊字符中的至少三种组合");
|
||||
// }
|
||||
// 验证码开关
|
||||
|
||||
SysUserBo sysUser = new SysUserBo();
|
||||
sysUser.setUserName(username);
|
||||
sysUser.setNickName(username);
|
||||
@ -101,6 +101,13 @@ public class SysRegisterService {
|
||||
sysUser.setUserType(userType);
|
||||
sysUser.setEmail(registerBody.getEmail());
|
||||
|
||||
SysUser sysUserByPhonenumber = userMapper.selectDefFlagUser(username);
|
||||
if(sysUserByPhonenumber != null){
|
||||
sysUser.setUserId(sysUserByPhonenumber.getUserId());
|
||||
userMapper.updateDefFlag(sysUser);
|
||||
userMapper.updateConstructionUser(sysUserByPhonenumber.getUserId());
|
||||
}else {
|
||||
|
||||
boolean exist = TenantHelper.dynamic(tenantId, () -> {
|
||||
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
||||
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
|
||||
@ -112,6 +119,7 @@ public class SysRegisterService {
|
||||
if (!regFlag) {
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
}
|
||||
|
||||
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
|
||||
}
|
||||
|
||||
@ -1,3 +1,7 @@
|
||||
# 开发环境配置
|
||||
server:
|
||||
# 服务器的HTTP端口,默认为8080
|
||||
port: 8899
|
||||
--- # 监控中心配置
|
||||
spring.boot.admin.client:
|
||||
# 增加客户端开关
|
||||
@ -32,6 +36,12 @@ snail-job:
|
||||
|
||||
--- # 数据源配置
|
||||
spring:
|
||||
ai:
|
||||
dashscope:
|
||||
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
|
||||
chat:
|
||||
options:
|
||||
model: qwen-plus
|
||||
datasource:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||
@ -52,6 +62,9 @@ spring:
|
||||
url: jdbc:mysql://192.168.110.2:13386/xinnengyuandev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
username: xinnengyuandev
|
||||
password: StRWCZdZirysNSs2
|
||||
# url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
# username: xinnengyuan
|
||||
# password: mEZPC5Sdf3r2HENi
|
||||
# 从库数据源
|
||||
slave:
|
||||
lazy: true
|
||||
@ -71,9 +84,16 @@ spring:
|
||||
lazy: true
|
||||
type: ${spring.datasource.type}
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://192.168.110.2:13386/zmkgdev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
username: zmkgdev
|
||||
password: JhYxREf25AXdy3h8
|
||||
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
username: zmkgc
|
||||
password: nWKDKRNRT48tFBdh
|
||||
# slave:
|
||||
# lazy: true
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
# username: zmkgprod
|
||||
# password: MaY8nehwWkJriWPm
|
||||
# oracle:
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: oracle.jdbc.OracleDriver
|
||||
@ -116,7 +136,7 @@ spring.data:
|
||||
# 端口,默认为6379
|
||||
port: 9287
|
||||
# 数据库索引
|
||||
database: 10
|
||||
database: 16
|
||||
# redis 密码必须配置
|
||||
password: syar23rdsaagdrsa
|
||||
# 连接超时时间
|
||||
@ -175,7 +195,7 @@ sms:
|
||||
# 配置源类型用于标定配置来源(interface,yaml)
|
||||
config-type: yaml
|
||||
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
||||
restricted: true
|
||||
restricted: false
|
||||
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
||||
minute-max: 1
|
||||
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
||||
@ -324,6 +344,7 @@ ys7:
|
||||
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
|
||||
job:
|
||||
capture-enabled: false # 控制是否启用萤石抓拍任务
|
||||
device-sync-enabled: false # 控制是否同步萤石设备
|
||||
#ys7:
|
||||
# app-key: 081b0d6d5f7f4de8bc5c7fa350fb26ec
|
||||
# app-secret: caa37b9f60ef02deb57e563bc190e6db
|
||||
@ -343,3 +364,7 @@ qrCode:
|
||||
# 无人机大图
|
||||
drone:
|
||||
url: http://192.168.110.2:9512
|
||||
# 聊天服务
|
||||
chat:
|
||||
server:
|
||||
port: 19099
|
||||
|
||||
@ -1,3 +1,7 @@
|
||||
# 开发环境配置
|
||||
server:
|
||||
# 服务器的HTTP端口,默认为8080
|
||||
port: 9918
|
||||
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
||||
spring.servlet.multipart.location: /ruoyi/server/temp
|
||||
|
||||
@ -35,6 +39,12 @@ snail-job:
|
||||
|
||||
--- # 数据源配置
|
||||
spring:
|
||||
ai:
|
||||
dashscope:
|
||||
api-key: xxx
|
||||
chat:
|
||||
options:
|
||||
model: qwen-plus
|
||||
datasource:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||
@ -105,7 +115,7 @@ spring.data:
|
||||
# 端口,默认为6379
|
||||
port: 9287
|
||||
# 数据库索引
|
||||
database: 6
|
||||
database: 17
|
||||
# redis 密码必须配置
|
||||
password: syar23rdsaagdrsa
|
||||
# 连接超时时间
|
||||
@ -164,7 +174,7 @@ sms:
|
||||
# 配置源类型用于标定配置来源(interface,yaml)
|
||||
config-type: yaml
|
||||
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
||||
restricted: true
|
||||
restricted: false
|
||||
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
||||
minute-max: 1
|
||||
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
||||
@ -183,12 +193,45 @@ sms:
|
||||
signature: 您的短信签名
|
||||
sdk-app-id: 您的sdkAppId
|
||||
config2:
|
||||
# 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
|
||||
# 登录
|
||||
supplier: tencent
|
||||
access-key-id: 您的accessKey
|
||||
access-key-secret: 您的accessKeySecret
|
||||
signature: 您的短信签名
|
||||
sdk-app-id: 您的sdkAppId
|
||||
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:
|
||||
@ -275,8 +318,11 @@ weather:
|
||||
dxf2GeoJson:
|
||||
file-name: main
|
||||
ys7:
|
||||
app-key: 3acf9f1a43dc4209841e0893003db0a2
|
||||
app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36
|
||||
app-key: xxx
|
||||
app-secret: xxx
|
||||
job:
|
||||
capture-enabled: false # 控制是否启用萤石抓拍任务
|
||||
device-sync-enabled: false # 控制是否同步萤石设备
|
||||
# 斯巴达算法
|
||||
sparta:
|
||||
url: http://119.3.204.120:8040
|
||||
@ -286,10 +332,14 @@ sparta:
|
||||
id-card:
|
||||
encrypt-key: 7ae260d150a14027d2238a1cf80a48ef
|
||||
recognizer:
|
||||
url: http://192.168.110.5:50070
|
||||
url: http://192.168.110.5:50071
|
||||
|
||||
qrCode:
|
||||
url: http://xny.yj-3d.com:7171
|
||||
url: http://xny.yj-3d.com:7788
|
||||
# 无人机大图
|
||||
drone:
|
||||
url: http://192.168.110.2:9512
|
||||
# 聊天服务
|
||||
chat:
|
||||
server:
|
||||
port: 18088
|
||||
|
||||
@ -1,3 +1,7 @@
|
||||
# 开发环境配置
|
||||
server:
|
||||
# 服务器的HTTP端口,默认为8080
|
||||
port: 8899
|
||||
--- # 临时文件存储位置 避免临时文件被系统清理报错
|
||||
spring.servlet.multipart.location: /ruoyi/server/temp
|
||||
|
||||
@ -35,6 +39,12 @@ snail-job:
|
||||
|
||||
--- # 数据源配置
|
||||
spring:
|
||||
ai:
|
||||
dashscope:
|
||||
api-key: xxx
|
||||
chat:
|
||||
options:
|
||||
model: qwen-plus
|
||||
datasource:
|
||||
type: com.zaxxer.hikari.HikariDataSource
|
||||
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
|
||||
@ -55,21 +65,21 @@ spring:
|
||||
url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
username: xinnengyuan
|
||||
password: mEZPC5Sdf3r2HENi
|
||||
# 从库数据源
|
||||
slave:
|
||||
lazy: true
|
||||
type: ${spring.datasource.type}
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
username: zmkgc
|
||||
password: nWKDKRNRT48tFBdh
|
||||
slave1:
|
||||
lazy: true
|
||||
type: ${spring.datasource.type}
|
||||
driverClassName: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
username: zmkgprod
|
||||
password: MaY8nehwWkJriWPm
|
||||
# # 从库数据源
|
||||
# slave:
|
||||
# lazy: true
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||
# url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
# username: zmkgc
|
||||
# password: nWKDKRNRT48tFBdh
|
||||
# slave1:
|
||||
# lazy: true
|
||||
# type: ${spring.datasource.type}
|
||||
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||
# username: zmkgprod
|
||||
# password: MaY8nehwWkJriWPm
|
||||
# # 从库数据源
|
||||
# slave:
|
||||
# lazy: true
|
||||
@ -321,12 +331,13 @@ weather:
|
||||
api-host: n35rk53njv.re.qweatherapi.com
|
||||
# dxf转 geojson 执行文件名
|
||||
dxf2GeoJson:
|
||||
file-name: main.exe
|
||||
file-name: main
|
||||
ys7:
|
||||
app-key: 3acf9f1a43dc4209841e0893003db0a2
|
||||
app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36
|
||||
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
|
||||
job:
|
||||
capture-enabled: false # 控制是否启用萤石抓拍任务
|
||||
capture-enabled: true # 控制是否启用萤石抓拍任务
|
||||
device-sync-enabled: true # 控制是否同步萤石设备
|
||||
# 斯巴达算法
|
||||
sparta:
|
||||
url: http://119.3.204.120:8040
|
||||
@ -343,3 +354,7 @@ qrCode:
|
||||
# 无人机大图
|
||||
drone:
|
||||
url: http://192.168.110.2:9512
|
||||
# 聊天服务
|
||||
chat:
|
||||
server:
|
||||
port: 19099
|
||||
|
||||
@ -22,7 +22,7 @@ captcha:
|
||||
# 开发环境配置
|
||||
server:
|
||||
# 服务器的HTTP端口,默认为8080
|
||||
port: 8899
|
||||
# port: 8899
|
||||
servlet:
|
||||
# 应用的访问路径
|
||||
context-path: /
|
||||
@ -106,6 +106,10 @@ sa-token:
|
||||
is-share: false
|
||||
# jwt秘钥
|
||||
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
|
||||
# token有效期,单位s 默认30天, -1代表永不过期
|
||||
timeout: 2592000
|
||||
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
|
||||
active-timeout: 86400
|
||||
|
||||
# security配置
|
||||
security:
|
||||
@ -253,6 +257,8 @@ springdoc:
|
||||
packages-to-scan: org.dromara.design
|
||||
- group: 13.工作流模块
|
||||
packages-to-scan: org.dromara.workflow
|
||||
- group: 14.合同模块
|
||||
packages-to-scan: org.dromara.ctr
|
||||
- group: 15.无人机模块
|
||||
packages-to-scan: org.dromara.drone
|
||||
- group: 20.代码生成模块
|
||||
@ -275,8 +281,10 @@ springdoc:
|
||||
packages-to-scan: org.dromara.gps
|
||||
- group: 24.招标模块
|
||||
packages-to-scan: org.dromara.tender
|
||||
- group: 25.app版本模块
|
||||
packages-to-scan: org.dromara.app
|
||||
# - group: 25.app版本模块
|
||||
# packages-to-scan: org.dromara.app
|
||||
- group: 25.数据迁移模块
|
||||
packages-to-scan: org.dromara.transferData
|
||||
- group: 26.netty消息模块
|
||||
packages-to-scan: org.dromara.websocket
|
||||
- group: 27.新中大模块
|
||||
@ -296,6 +304,14 @@ xss:
|
||||
- /system/notice
|
||||
- /warm-flow/save-xml
|
||||
- /project/project
|
||||
- /xzd/contractDetails/**
|
||||
- /xzd/contractChange/**
|
||||
- /comprehensive/csContractChange/**
|
||||
- /comprehensive/csContractInformation/**
|
||||
- /hetongbiangeng/**
|
||||
- /fenbaohetongbiangg/**
|
||||
- /fenbaohetongxinxi/**
|
||||
- /contractManagement/**
|
||||
|
||||
# 全局线程池相关配置
|
||||
# 如使用JDK21请直接使用虚拟线程 不要开启此配置
|
||||
|
||||
Binary file not shown.
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计更改通知单.docx
Normal file
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计更改通知单.docx
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计验证表.docx
Normal file
BIN
xinnengyuan/ruoyi-admin/src/main/resources/template/设计验证表.docx
Normal file
Binary file not shown.
@ -5,7 +5,6 @@ import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.util.IdcardUtil;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
@ -30,6 +29,8 @@ import org.dromara.manager.ys7manager.Ys7Constant;
|
||||
import org.dromara.manager.ys7manager.Ys7Manager;
|
||||
import org.dromara.manager.ys7manager.vo.Ys7ResponseVo;
|
||||
import org.dromara.other.domain.OthYs7Device;
|
||||
import org.dromara.other.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture;
|
||||
import org.dromara.other.service.IOthYs7DeviceImgService;
|
||||
import org.dromara.other.service.IOthYs7DeviceService;
|
||||
import org.dromara.out.domain.OutConstructionValue;
|
||||
import org.dromara.out.domain.OutConstructionValueRange;
|
||||
@ -56,6 +57,8 @@ import java.time.LocalDate;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -113,6 +116,9 @@ public class DemoTest {
|
||||
@Resource
|
||||
private IOthYs7DeviceService ys7DeviceService;
|
||||
|
||||
@Resource
|
||||
private IOthYs7DeviceImgService ys7DeviceImgService;
|
||||
|
||||
@Resource
|
||||
private Ys7Manager ys7Manager;
|
||||
|
||||
@ -129,7 +135,7 @@ public class DemoTest {
|
||||
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday);
|
||||
Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/
|
||||
LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间(2024-01-01)
|
||||
LocalDate end = LocalDate.of(2025, 10, 13); // 截止时间(2025-09-15)
|
||||
LocalDate end = LocalDate.of(2025, 10, 20); // 截止时间(2025-09-15)
|
||||
|
||||
// 如果起始不是周一,调整到当周的周一
|
||||
if (start.getDayOfWeek() != DayOfWeek.MONDAY) {
|
||||
@ -149,7 +155,7 @@ public class DemoTest {
|
||||
.ge(PgsProgressPlanDetail::getDate, monday)
|
||||
.le(PgsProgressPlanDetail::getDate, sunday)
|
||||
.ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO)
|
||||
.eq(PgsProgressPlanDetail::getStatus, "1")
|
||||
// .eq(PgsProgressPlanDetail::getStatus, "1")
|
||||
.list();
|
||||
if (CollUtil.isEmpty(planDetailList)) {
|
||||
// 下一周
|
||||
@ -244,8 +250,8 @@ public class DemoTest {
|
||||
value.setOutValue(constructionValue);
|
||||
value.setOwnerValue(ownerValue);
|
||||
// 统计总产值
|
||||
allConstructionValue = allConstructionValue.add(constructionValue).setScale(4, RoundingMode.HALF_UP);
|
||||
allOwnerValue = allOwnerValue.add(ownerValue).setScale(4, RoundingMode.HALF_UP);
|
||||
allConstructionValue = allConstructionValue.add(constructionValue);
|
||||
allOwnerValue = allOwnerValue.add(ownerValue);
|
||||
// 添加需要修改状态的计划详情
|
||||
PgsProgressPlanDetail update = new PgsProgressPlanDetail();
|
||||
update.setId(planDetail.getId());
|
||||
@ -253,8 +259,8 @@ public class DemoTest {
|
||||
updateList.add(update);
|
||||
saveList.add(value);
|
||||
}
|
||||
range.setOutValue(allConstructionValue);
|
||||
range.setOwnerValue(allOwnerValue);
|
||||
range.setOutValue(allConstructionValue.setScale(4, RoundingMode.HALF_UP));
|
||||
range.setOwnerValue(allOwnerValue.setScale(4, RoundingMode.HALF_UP));
|
||||
// 如果产值都为0,则不保存
|
||||
if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) {
|
||||
return null;
|
||||
@ -548,4 +554,38 @@ public class DemoTest {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void capturePic() {
|
||||
List<String> urlList = List.of(
|
||||
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/db8a379b456142459852b654f20d5f97.png",
|
||||
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/913dbcf0f7244c8b878e84b5525bec4b.png",
|
||||
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/2b904765f03f40b2ad0ddbf6ddeadb45.png"
|
||||
);
|
||||
for (String url : urlList) {
|
||||
Pattern pattern = Pattern.compile(".*/device/img/([^/]+)/.*");
|
||||
Matcher matcher = pattern.matcher(url);
|
||||
OthYs7Device ys7Device = ys7DeviceService.lambdaQuery()
|
||||
.eq(OthYs7Device::getDeviceSerial, "GA1730672")
|
||||
.last("limit 1")
|
||||
.one();
|
||||
if (ys7Device == null) {
|
||||
throw new ServiceException("设备不存在", HttpStatus.ERROR);
|
||||
}
|
||||
String deviceSerial = ys7Device.getDeviceSerial();
|
||||
// 如果没有预置位,则直接对默认通道抓图
|
||||
OthYs7DeviceImgCreateByCapture img = new OthYs7DeviceImgCreateByCapture();
|
||||
img.setProjectId(ys7Device.getProjectId());
|
||||
img.setDeviceSerial(deviceSerial);
|
||||
img.setDeviceName(ys7Device.getDeviceName());
|
||||
// String url = "http://xny.yj-3d.com:9000/xinnengyuan/ys7/device/img/GA1044315/2025-10-13_859fdfb7dde540608356f29cb9e3d63e.jpg";
|
||||
// String url = "http://xny.yj-3d.com:9000/xinnengyuan/ys7/device/img/GA1044315/2025-10-12_2801707255b84004acb5fee2a75299b2.jpg";
|
||||
img.setCreateTime(new Date());
|
||||
img.setUrl(url);
|
||||
log.info("图片:{},识别中", url);
|
||||
ys7DeviceImgService.saveCapturePic(List.of(img));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ public class RecognizerTest {
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.SOLAR));
|
||||
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.PANEL));
|
||||
log.info("recognize: {}", recognize);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,9 +1,17 @@
|
||||
package org.dromara.test;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto;
|
||||
import org.dromara.safety.service.IHseViolationRecordService;
|
||||
import org.dromara.system.domain.SysMenu;
|
||||
import org.dromara.system.domain.vo.SysMenuVo;
|
||||
import org.dromara.system.mapper.SysMenuMapper;
|
||||
import org.dromara.system.service.ISysMenuService;
|
||||
import org.hamcrest.core.Is;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -20,6 +28,9 @@ public class ViolationRecordTest {
|
||||
@Resource
|
||||
private IHseViolationRecordService violationRecordService;
|
||||
|
||||
@Autowired
|
||||
private SysMenuMapper sysMenuMapper;
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
List<HseViolationRecordCreateDto> list = new ArrayList<>();
|
||||
@ -55,4 +66,26 @@ public class ViolationRecordTest {
|
||||
list.add(dto5);
|
||||
violationRecordService.insertByMonitor(list);
|
||||
}
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
SysMenuVo sysMenuVo = sysMenusByList(1972500768346673154L);
|
||||
System.out.println(sysMenuVo.toString());
|
||||
|
||||
}
|
||||
|
||||
SysMenuVo sysMenusByList(Long id) {
|
||||
SysMenuVo sysMenus = new SysMenuVo();
|
||||
List<SysMenu> res = sysMenuMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, id));
|
||||
if (res != null && res.size() > 0 ) {
|
||||
sysMenus.setChildren(MapstructUtils.convert(res, SysMenuVo.class));
|
||||
res.forEach(sysMenu -> {
|
||||
sysMenusByList(sysMenu.getMenuId());
|
||||
});
|
||||
}
|
||||
return sysMenus;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,32 @@
|
||||
package org.dromara.common.core.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
@Data
|
||||
public class XzdCustomerSupplierVos implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 类型(1、供应商,2、客户)
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 供应商-客户id
|
||||
*/
|
||||
private Long cSId;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdCsContractInformationService {
|
||||
|
||||
String selectNameByIds(String ids);
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
import org.dromara.common.core.domain.vo.XzdCustomerSupplierVos;
|
||||
|
||||
public interface XzdCustomerSupplierService {
|
||||
|
||||
/**
|
||||
* 查询供应商-客户中间
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 供应商-客户中间
|
||||
*/
|
||||
XzdCustomerSupplierVos queryByIdone(Long id);
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdCustomerinformationService {
|
||||
|
||||
String selectNmaeByIds(String id);
|
||||
|
||||
String selectNmaeById(Long id);
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdJsCgJungonService {
|
||||
|
||||
String selectNameByIds(String ids);
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdProjectService {
|
||||
|
||||
String selectNmaeByIds(String ids);
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdPurchaseContractInformationService {
|
||||
String selectNameByIds(String ids);
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdSupplierInfoService {
|
||||
|
||||
String selectNmaeByIds(String ids);
|
||||
|
||||
String selectNmaeById(Long id);
|
||||
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package org.dromara.common.core.service;
|
||||
|
||||
public interface XzdSupplierOpenBankService {
|
||||
|
||||
String selectNameByIds(String ids);
|
||||
}
|
||||
@ -77,7 +77,7 @@ public class RedisUtils {
|
||||
public static <T> void publish(String channelKey, T msg, Consumer<T> consumer) {
|
||||
RTopic topic = CLIENT.getTopic(channelKey);
|
||||
topic.publish(msg);
|
||||
System.out.println("发布通道消息---------"+msg.toString());
|
||||
// System.out.println("发布通道消息---------"+msg.toString());
|
||||
consumer.accept(msg);
|
||||
}
|
||||
|
||||
|
||||
@ -37,4 +37,36 @@ public interface TransConstant {
|
||||
*/
|
||||
String PROJECT_ID_TO_NAME = "project_id_to_name";
|
||||
|
||||
|
||||
/**
|
||||
* 客户id转名称
|
||||
*/
|
||||
String XZD_KHXX_ID_TO_NAME = "khxx_id_to_name";
|
||||
|
||||
|
||||
// /**
|
||||
// * 供应商id转名称
|
||||
// */
|
||||
// String XZD_KHXX_ID_TO_NAME = "gysxx_id_to_name";
|
||||
|
||||
/**
|
||||
* 新中大项目id转名称
|
||||
*/
|
||||
String XZD_PROJECT_ID_TO_NAME = "xzd_project_id_to_name";
|
||||
/**
|
||||
* 采购合同id转名称
|
||||
*/
|
||||
String XZD_PURCHASE_CONTRACT_ID_TO_NAME = "xzd_purchase_contract_id_to_name";
|
||||
/**
|
||||
* 综合服务合同id转名称
|
||||
*/
|
||||
String XZD_CS_CONTRACT_INFORMATION_ID_TO_NAME = "xzd_cs_contract_information_id_to_name";
|
||||
/**
|
||||
* 结算-采购合同竣工结算id转名称
|
||||
*/
|
||||
String XZD_JS_CG_JUNGON_ID_TO_NAME = "xzd_js_cg_jungon_id_to_name";
|
||||
/**
|
||||
* 新中大供应商信息-开户银行id转银行名称
|
||||
*/
|
||||
String XZD_SUPPLIER_OPEN_BANK_ID_TO_NAME = "xzd_supplier_open_bank_id_to_name";
|
||||
}
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.dromara.common.core.service.XzdCsContractInformationService;
|
||||
import org.dromara.common.core.service.XzdPurchaseContractInformationService;
|
||||
import org.dromara.common.translation.annotation.TranslationType;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.common.translation.core.TranslationInterface;
|
||||
|
||||
@AllArgsConstructor
|
||||
@TranslationType(type = TransConstant.XZD_CS_CONTRACT_INFORMATION_ID_TO_NAME)
|
||||
public class XzdCsContractInformationImpl implements TranslationInterface<String> {
|
||||
|
||||
private final XzdCsContractInformationService xzdCsContractInformationService;
|
||||
|
||||
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdCsContractInformationService.selectNameByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdCsContractInformationService.selectNameByIds(id.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.dromara.common.core.service.XzdCustomerinformationService;
|
||||
import org.dromara.common.translation.annotation.TranslationType;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.common.translation.core.TranslationInterface;
|
||||
|
||||
@AllArgsConstructor
|
||||
@TranslationType(type = TransConstant.XZD_KHXX_ID_TO_NAME)
|
||||
public class XzdCustomerinformationImpl implements TranslationInterface<String> {
|
||||
|
||||
private final XzdCustomerinformationService xzdCustomerinformationService;
|
||||
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdCustomerinformationService.selectNmaeByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdCustomerinformationService.selectNmaeByIds(id.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.dromara.common.core.service.XzdJsCgJungonService;
|
||||
import org.dromara.common.translation.annotation.TranslationType;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.common.translation.core.TranslationInterface;
|
||||
|
||||
@AllArgsConstructor
|
||||
@TranslationType(type = TransConstant.XZD_JS_CG_JUNGON_ID_TO_NAME)
|
||||
public class XzdJsCgJungonImpl implements TranslationInterface<String> {
|
||||
|
||||
private final XzdJsCgJungonService xzdJsCgJungonService;
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdJsCgJungonService.selectNameByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdJsCgJungonService.selectNameByIds(id.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.dromara.common.core.service.XzdProjectService;
|
||||
import org.dromara.common.translation.annotation.TranslationType;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.common.translation.core.TranslationInterface;
|
||||
|
||||
@AllArgsConstructor
|
||||
@TranslationType(type = TransConstant.XZD_PROJECT_ID_TO_NAME)
|
||||
public class XzdProjectImpl implements TranslationInterface<String> {
|
||||
private final XzdProjectService xzdProjectService;
|
||||
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdProjectService.selectNmaeByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdProjectService.selectNmaeByIds(id.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
|
||||
import org.dromara.common.core.service.XzdPurchaseContractInformationService;
|
||||
import org.dromara.common.translation.annotation.TranslationType;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.common.translation.core.TranslationInterface;
|
||||
|
||||
@AllArgsConstructor
|
||||
@TranslationType(type = TransConstant.XZD_PURCHASE_CONTRACT_ID_TO_NAME)
|
||||
public class XzdPurchaseContractInformationImpl implements TranslationInterface<String> {
|
||||
|
||||
private final XzdPurchaseContractInformationService xzdCustomerinformationService;
|
||||
|
||||
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdCustomerinformationService.selectNameByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdCustomerinformationService.selectNameByIds(id.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,24 @@
|
||||
package org.dromara.common.translation.core.impl;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.dromara.common.core.service.XzdSupplierInfoService;
|
||||
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;
|
||||
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdSupplierInfoService.selectNmaeByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdSupplierInfoService.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.XzdSupplierOpenBankService;
|
||||
import org.dromara.common.translation.annotation.TranslationType;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.common.translation.core.TranslationInterface;
|
||||
|
||||
@AllArgsConstructor
|
||||
@TranslationType(type = TransConstant.XZD_SUPPLIER_OPEN_BANK_ID_TO_NAME)
|
||||
public class XzdSupplierOpenBankImpl implements TranslationInterface<String> {
|
||||
|
||||
private final XzdSupplierOpenBankService xzdSupplierOpenBankService;
|
||||
@Override
|
||||
public String translation(Object key, String other) {
|
||||
if (key instanceof String ids) {
|
||||
return xzdSupplierOpenBankService.selectNameByIds(ids);
|
||||
} else if (key instanceof Long id) {
|
||||
return xzdSupplierOpenBankService.selectNameByIds(id.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -5,3 +5,10 @@ org.dromara.common.translation.core.impl.OssUrlTranslationImpl
|
||||
org.dromara.common.translation.core.impl.UserNameTranslationImpl
|
||||
org.dromara.common.translation.core.impl.NicknameTranslationImpl
|
||||
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
|
||||
|
||||
@ -13,6 +13,7 @@ import org.springframework.web.socket.WebSocketHandler;
|
||||
import org.springframework.web.socket.config.annotation.EnableWebSocket;
|
||||
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
|
||||
import org.springframework.web.socket.server.HandshakeInterceptor;
|
||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||
|
||||
/**
|
||||
* WebSocket 配置
|
||||
|
||||
@ -69,8 +69,8 @@ public class WebSocketUtils {
|
||||
broadcastMessage.setMessage(webSocketMessage.getMessage());
|
||||
broadcastMessage.setSessionKeys(unsentSessionKeys);
|
||||
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
|
||||
log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
|
||||
WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
|
||||
// log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
|
||||
// WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -84,7 +84,7 @@ public class WebSocketUtils {
|
||||
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
|
||||
broadcastMessage.setMessage(message);
|
||||
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
|
||||
log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);
|
||||
// log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -15,15 +15,40 @@
|
||||
system系统模块
|
||||
</description>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud.ai</groupId>
|
||||
<artifactId>spring-ai-alibaba-bom</artifactId>
|
||||
<version>1.0.0.2</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
|
||||
<dependencies>
|
||||
|
||||
<!-- Java WebSocket 标准API -->
|
||||
<dependency>
|
||||
<groupId>javax.websocket</groupId>
|
||||
<artifactId>javax.websocket-api</artifactId>
|
||||
<version>1.1</version>
|
||||
<scope>provided</scope>
|
||||
<groupId>com.alibaba.cloud.ai</groupId>
|
||||
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
|
||||
</dependency>
|
||||
<!-- Java WebSocket 标准API -->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>javax.websocket</groupId>-->
|
||||
<!-- <artifactId>javax.websocket-api</artifactId>-->
|
||||
<!-- <version>1.1</version>-->
|
||||
<!-- <scope>provided</scope>-->
|
||||
<!-- </dependency>-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency>-->
|
||||
@ -109,7 +134,6 @@
|
||||
</dependency>
|
||||
|
||||
|
||||
|
||||
<!-- 支持中文字体 -->
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>com.itextpdf</groupId>-->
|
||||
@ -270,6 +294,13 @@
|
||||
<artifactId>netty-all</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
<version>1.15</version> <!-- 最新版本可自行调整 -->
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
@ -0,0 +1,51 @@
|
||||
package org.dromara.ai.controller;
|
||||
|
||||
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.ai.chat.client.ChatClient;
|
||||
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-23 11:32
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@RequestMapping("/ai")
|
||||
public class AIController {
|
||||
|
||||
private static final String DEFAULT_PROMPT = "你是一个博学的智能聊天助手,请根据用户提问回答!";
|
||||
|
||||
private final ChatClient dashScopeChatClient;
|
||||
|
||||
public AIController(ChatClient.Builder chatClientBuilder) {
|
||||
this.dashScopeChatClient = chatClientBuilder
|
||||
.defaultSystem(DEFAULT_PROMPT)
|
||||
// 实现 Logger 的 Advisor
|
||||
.defaultAdvisors(
|
||||
new SimpleLoggerAdvisor()
|
||||
)
|
||||
// 设置 ChatClient 中 ChatModel 的 Options 参数
|
||||
.defaultOptions(
|
||||
DashScopeChatOptions.builder()
|
||||
.withTopP(0.7)
|
||||
.build()
|
||||
)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* ChatClient 流式调用
|
||||
*/
|
||||
@GetMapping("/stream/chat")
|
||||
public Flux<String> streamChat(@RequestParam(value = "query", defaultValue = "你好,很高兴认识你,能简单介绍一下自己吗?") String query, HttpServletResponse response) {
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
return dashScopeChatClient.prompt(query).stream().content();
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,5 @@
|
||||
package org.dromara.bigscreen.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -62,7 +61,7 @@ public class MoneyBigScreenController {
|
||||
/**
|
||||
* 查询项目位置列表
|
||||
*/
|
||||
@SaCheckPermission("money:bigScreen:projectGis")
|
||||
// @SaCheckPermission("money:bigScreen:projectGis")
|
||||
@GetMapping("/project/gis")
|
||||
public R<List<BusProjectGisVo>> getProjectGis() {
|
||||
return R.ok(moneyBigScreenService.getProjectGis());
|
||||
@ -545,7 +544,7 @@ public class MoneyBigScreenController {
|
||||
/**
|
||||
* 查询项目天气
|
||||
*/
|
||||
@SaCheckPermission("project:bigScreen:weather")
|
||||
// @SaCheckPermission("project:bigScreen:weather")
|
||||
@GetMapping("/weather/{projectId}")
|
||||
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
@ -555,7 +554,7 @@ public class MoneyBigScreenController {
|
||||
/**
|
||||
* 查询项目安全天数
|
||||
*/
|
||||
@SaCheckPermission("project:bigScreen:safetyDay")
|
||||
// @SaCheckPermission("project:bigScreen:safetyDay")
|
||||
@GetMapping("/safetyDay/{projectId}")
|
||||
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
|
||||
@ -1,18 +1,15 @@
|
||||
package org.dromara.bigscreen.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
|
||||
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
||||
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
|
||||
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
|
||||
import org.dromara.bigscreen.domain.vo.ProjectLandVo;
|
||||
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
|
||||
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
|
||||
import org.dromara.bigscreen.domain.vo.*;
|
||||
import org.dromara.bigscreen.service.ProjectBigScreenService;
|
||||
import org.dromara.common.core.constant.HttpStatus;
|
||||
import org.dromara.common.core.domain.R;
|
||||
@ -20,7 +17,12 @@ import org.dromara.common.core.exception.ServiceException;
|
||||
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.dromara.facility.domain.bo.FacRedLineBo;
|
||||
import org.dromara.facility.domain.vo.redline.FacRedLineVo;
|
||||
import org.dromara.facility.service.IFacRedLineService;
|
||||
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
||||
import org.dromara.land.domain.BusLandBlock;
|
||||
import org.dromara.land.domain.BusLandTransferLedger;
|
||||
@ -33,6 +35,7 @@ import org.dromara.manager.ys7manager.Ys7Manager;
|
||||
import org.dromara.other.domain.OthYs7Device;
|
||||
import org.dromara.other.service.IOthYs7DeviceService;
|
||||
import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo;
|
||||
import org.dromara.project.domain.vo.project.BusProjectVo;
|
||||
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
|
||||
import org.dromara.project.service.IBusProjectNewsService;
|
||||
import org.dromara.project.service.IBusProjectService;
|
||||
@ -86,6 +89,8 @@ public class ProjectBigScreenController extends BaseController {
|
||||
|
||||
private final BusLandTransferLedgerSonServiceImpl busLandTransferLedgerSonService;
|
||||
|
||||
private final IFacRedLineService facRedLineService;
|
||||
|
||||
/**
|
||||
* 查询项目土地统计
|
||||
*/
|
||||
@ -185,14 +190,6 @@ public class ProjectBigScreenController extends BaseController {
|
||||
@GetMapping("/news/{projectId}")
|
||||
public R<List<BusProjectNewsVo>> getProjectNews(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
// List<BusCorporateEvents> busCorporateEvents = projectBigScreenMapper.getBusCorporateEvents();
|
||||
// return R.ok(busCorporateEvents.stream().map(event -> {
|
||||
// BusProjectNewsVo vo = new BusProjectNewsVo();
|
||||
// vo.setId(event.getId());
|
||||
// vo.setTitle(event.getHeadline());
|
||||
// vo.setContent(event.getContent());
|
||||
// return vo;
|
||||
// }).toList());
|
||||
return R.ok(projectBigScreenService.getProjectNews(projectId));
|
||||
}
|
||||
|
||||
@ -203,23 +200,6 @@ public class ProjectBigScreenController extends BaseController {
|
||||
@GetMapping("/safetyInspection/{projectId}")
|
||||
public R<List<ProjectSafetyInspectionVo>> getProjectSafetyInspection(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
/* BusProject project = projectService.getById(projectId);
|
||||
projectId = project.getGoId();
|
||||
String pic;
|
||||
if (projectId == 60) {
|
||||
pic = "http://xny.yj-3d.com:7464";
|
||||
} else {
|
||||
pic = "http://xny.yj-3d.com:7363";
|
||||
}
|
||||
List<BusTour> busTours = projectBigScreenMapper.selectTourByProjectId(projectId);
|
||||
return R.ok(busTours.stream().map(tour -> {
|
||||
ProjectSafetyInspectionVo vo = new ProjectSafetyInspectionVo();
|
||||
vo.setId(tour.getId());
|
||||
vo.setViolationType(tour.getTourType());
|
||||
vo.setPicture(pic + tour.getPicture());
|
||||
vo.setCreateTime(tour.getCreatedAt());
|
||||
return vo;
|
||||
}).toList());*/
|
||||
return R.ok(projectBigScreenService.getProjectSafetyInspection(projectId));
|
||||
}
|
||||
|
||||
@ -230,51 +210,6 @@ public class ProjectBigScreenController extends BaseController {
|
||||
@GetMapping("/people/{projectId}")
|
||||
public R<ProjectPeopleVo> getProjectPeople(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
// BusProject project = projectService.getById(projectId);
|
||||
// projectId = project.getGoId();
|
||||
// Integer projectUserCount = projectBigScreenMapper.getProjectUserCount(projectId);
|
||||
// ProjectPeopleVo vo = new ProjectPeopleVo();
|
||||
// vo.setPeopleCount(BigDecimal.valueOf(projectUserCount));
|
||||
// Integer attendanceCount = projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate());
|
||||
// vo.setAttendanceCount(BigDecimal.valueOf(attendanceCount));
|
||||
// vo.setAttendanceRate(BigDecimalUtil.toPercentage(BigDecimal.valueOf(attendanceCount), BigDecimal.valueOf(projectUserCount)));
|
||||
// List<BusConstructionUser> projectUserList = projectBigScreenMapper.getProjectUserList(projectId);
|
||||
// List<BusProjectTeamByGo> teamList = projectBigScreenMapper.getTeamList(projectId);
|
||||
//
|
||||
// List<ProjectTeamAttendanceVo> teamAttendanceList = new ArrayList<>();
|
||||
// String punchRange = project.getPunchRange();
|
||||
// String punchTime = "";
|
||||
// if (punchRange != null) {
|
||||
// String start = punchRange.split(",")[0];
|
||||
// punchTime = LocalDate.now() + " " + start;
|
||||
// }
|
||||
// if (projectUserList != null && teamList != null) {
|
||||
// projectUserList = projectUserList.stream().filter(user -> user.getTeamId() != null).toList();
|
||||
// Map<Long, List<BusConstructionUser>> userMap = projectUserList.stream()
|
||||
// .collect(Collectors.groupingBy(BusConstructionUser::getTeamId));
|
||||
// for (BusProjectTeamByGo team : teamList) {
|
||||
// ProjectTeamAttendanceVo vo1 = new ProjectTeamAttendanceVo();
|
||||
// vo1.setId(team.getId());
|
||||
// vo1.setTeamName(team.getName());
|
||||
// vo1.setAttendanceTime(punchTime);
|
||||
// vo1.setAttendanceNumber(BigDecimal.ZERO);
|
||||
// List<BusConstructionUser> userList = userMap.get(team.getId());
|
||||
// if (CollUtil.isNotEmpty(userList)) {
|
||||
// List<String> list = userList.stream().map(BusConstructionUser::getOpenid).distinct().toList();
|
||||
// Integer aCount = projectBigScreenMapper.getAttendanceCountByOpenIds(list, LocalDate.now());
|
||||
// vo1.setAttendanceNumber(BigDecimal.valueOf(aCount));
|
||||
// }
|
||||
// vo1.setAllNumber(BigDecimal.valueOf(userMap.getOrDefault(team.getId(), List.of()).size()));
|
||||
// if (vo1.getAttendanceNumber() != null && vo1.getAllNumber() != null && vo1.getAllNumber().compareTo(BigDecimal.ZERO) != 0) {
|
||||
// vo1.setAttendanceRate(BigDecimalUtil.toPercentage(vo1.getAttendanceNumber(), vo1.getAllNumber()));
|
||||
// } else {
|
||||
// vo1.setAttendanceRate(BigDecimal.ZERO);
|
||||
// }
|
||||
// teamAttendanceList.add(vo1);
|
||||
// }
|
||||
// }
|
||||
// vo.setTeamAttendanceList(teamAttendanceList);
|
||||
// return R.ok(vo);
|
||||
return R.ok(projectBigScreenService.getProjectPeople(projectId));
|
||||
}
|
||||
|
||||
@ -295,18 +230,7 @@ public class ProjectBigScreenController extends BaseController {
|
||||
@GetMapping("/generalize/{projectId}")
|
||||
public R<String> getProjectGeneralize(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
// BusProject project = projectService.getById(projectId);
|
||||
// if (project != null) {
|
||||
// Long goId = project.getGoId();
|
||||
// if (goId != null) {
|
||||
// List<SysProjectIntroduce> sysProjectIntroduces = projectBigScreenMapper.selectByProjectId(goId);
|
||||
// if (CollUtil.isNotEmpty(sysProjectIntroduces)) {
|
||||
// return R.ok(sysProjectIntroduces.getFirst().getRichText());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
return R.ok(projectBigScreenService.getProjectGeneralize(projectId));
|
||||
// return R.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -346,11 +270,15 @@ public class ProjectBigScreenController extends BaseController {
|
||||
if (count > 0) {
|
||||
throw new ServiceException("已存在同名萤石摄像头", HttpStatus.CONFLICT);
|
||||
}
|
||||
// todo 更新云端名称
|
||||
/* Boolean result = ys7Manager.updateDeviceName(one.getDeviceSerial(), deviceName);
|
||||
// 更新云端名称
|
||||
Boolean result = ys7Manager.updateDeviceName(one.getDeviceSerial(), deviceName);
|
||||
if (!result) {
|
||||
throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
if (req.getLatitude() != null && req.getLongitude() != null) {
|
||||
ys7Device.setLatitude(req.getLatitude());
|
||||
ys7Device.setLongitude(req.getLongitude());
|
||||
}
|
||||
return toAjax(othYs7DeviceService.updateById(ys7Device));
|
||||
}
|
||||
@ -376,7 +304,7 @@ public class ProjectBigScreenController extends BaseController {
|
||||
/**
|
||||
* 查询GPS设备用户列表
|
||||
*/
|
||||
@SaCheckPermission("project:big:screen")
|
||||
// @SaCheckPermission("project:big:screen")
|
||||
@GetMapping("/getList")
|
||||
public R<List<String>> getList(Long projectId) {
|
||||
return R.ok(projectBigScreenService.getList(projectId));
|
||||
@ -396,12 +324,37 @@ public class ProjectBigScreenController extends BaseController {
|
||||
/**
|
||||
* 查询地图项目分类
|
||||
*/
|
||||
@SaCheckPermission("project:big:screen")
|
||||
// @SaCheckPermission("project:big:screen")
|
||||
@GetMapping("/getProjectMapList")
|
||||
public R<Map<String, Map<String, Map<String, String>>>> getProjectMapList() {
|
||||
return R.ok(projectService.getProjectMapList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询地图项目分类
|
||||
*/
|
||||
// @SaCheckPermission("project:big:screen")
|
||||
@PostMapping("/updatePosition")
|
||||
public R<Void> updatePosition(@RequestBody ProjectUpdateDto dto) {
|
||||
return toAjax(projectService.updatePosition(dto));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目信息
|
||||
*/
|
||||
@GetMapping("/getProjectInfo/{projectId}")
|
||||
public R<ProjectInfo> getProjectInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long projectId) {
|
||||
BusProjectVo projectVo = projectService.queryById(projectId);
|
||||
ProjectInfo info = new ProjectInfo();
|
||||
info.setLat(projectVo.getLat());
|
||||
info.setLng(projectVo.getLng());
|
||||
info.setPlan(projectVo.getPlan());
|
||||
info.setPosition(projectVo.getPosition());
|
||||
info.setProjectId(projectVo.getId().toString());
|
||||
return R.ok(info);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询项目地域分散图
|
||||
@ -440,4 +393,12 @@ public class ProjectBigScreenController extends BaseController {
|
||||
return R.ok(projectBigScreenService.getInfoData(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询设施-红线列表
|
||||
*/
|
||||
@GetMapping("/redLine/list")
|
||||
public TableDataInfo<FacRedLineVo> list(FacRedLineBo bo, PageQuery pageQuery) {
|
||||
return facRedLineService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,16 @@
|
||||
package org.dromara.bigscreen.domain.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class ProjectUpdateDto implements Serializable {
|
||||
|
||||
|
||||
private Long projectId; // 项目id
|
||||
|
||||
private String position; // 图片
|
||||
|
||||
}
|
||||
@ -5,6 +5,7 @@ import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
@ -37,4 +38,13 @@ public class Ys7DeviceUpdateReq implements Serializable {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 纬度(精确到6位小数)
|
||||
*/
|
||||
private BigDecimal latitude;
|
||||
/**
|
||||
* 经度(精确到6位小数)
|
||||
*/
|
||||
private BigDecimal longitude;
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
package org.dromara.bigscreen.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-22 15:00
|
||||
*/
|
||||
@Data
|
||||
public class ProjectInfo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -8436930470114636496L;
|
||||
|
||||
/**
|
||||
* 纬度
|
||||
*/
|
||||
private String lat;
|
||||
|
||||
/**
|
||||
* 经度
|
||||
*/
|
||||
private String lng;
|
||||
|
||||
/**
|
||||
* 计划
|
||||
*/
|
||||
private String plan;
|
||||
|
||||
/**
|
||||
* 位置
|
||||
*/
|
||||
private String position;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private String projectId;
|
||||
}
|
||||
@ -80,12 +80,12 @@ public class RedisMessageListener implements MessageListener {
|
||||
private String buildPushMessage(String key, String message, Long projectId) {
|
||||
JSONObject messageObj = new JSONObject();
|
||||
messageObj.put("type", "wrj_DATA_UPDATE");
|
||||
messageObj.put("projectId",projectId);
|
||||
messageObj.put("projectId",projectId.toString());
|
||||
messageObj.put("clientId",key);
|
||||
// 位置信息
|
||||
JSONObject locationObj = new JSONObject();
|
||||
locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude")); // 纬度
|
||||
locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude")); // 经度
|
||||
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);
|
||||
return messageObj.toString();
|
||||
}
|
||||
|
||||
@ -505,7 +505,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
||||
gps.put("id", item.getClientId());
|
||||
gps.put("userId", item.getUserId());
|
||||
gps.put("label", item.getClientId());
|
||||
gps.put("name", item.getDeviceName());
|
||||
gps.put("name", item.getUserId() != null ? item.getUserName() : item.getClientId());
|
||||
gps.put("type", "gps");
|
||||
gps.put("lat", item.getLocLatitude());
|
||||
gps.put("lng", item.getLocLongitude());
|
||||
|
||||
@ -211,6 +211,11 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
|
||||
public void validNum(List<BusPlanDocAssociationBo> associationList, Long supplierId) {
|
||||
|
||||
for (BusPlanDocAssociationBo association : associationList) {
|
||||
|
||||
if(association.getDemandQuantity() == null){
|
||||
throw new ServiceException("请填写需求数量");
|
||||
}
|
||||
|
||||
//获取批次需求计划
|
||||
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
|
||||
List<String> statuss = new ArrayList<>();
|
||||
|
||||
@ -0,0 +1,65 @@
|
||||
package org.dromara.common.enums;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
@Getter
|
||||
public enum AppUserTypeEnum {
|
||||
|
||||
|
||||
SG("0", "施工人员", 2L),
|
||||
BZZ("0", "施工人员(班组长)", 3L),
|
||||
GL("1", "管理", 4L),
|
||||
FB("2", "分包", 5L),
|
||||
;
|
||||
|
||||
private final String type;
|
||||
|
||||
private final String value;
|
||||
|
||||
private final Long roleId;
|
||||
|
||||
AppUserTypeEnum(String type, String value,Long roleId) {
|
||||
this.type = type;
|
||||
this.value = value;
|
||||
this.roleId = roleId;
|
||||
}
|
||||
|
||||
|
||||
public static final List<Long> ROLE_ID_LIST = Arrays.asList(SG.roleId, BZZ.roleId, FB.roleId, GL.roleId);
|
||||
|
||||
/**
|
||||
* roleId获取枚举
|
||||
*
|
||||
* @param roleId 角色
|
||||
* @return 枚举
|
||||
*/
|
||||
public static AppUserTypeEnum getByRoleId(Long roleId) {
|
||||
for (AppUserTypeEnum value : AppUserTypeEnum.values()) {
|
||||
if (value.getRoleId().equals(roleId)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* type获取枚举
|
||||
*
|
||||
* @param type 类型
|
||||
* @return 枚举
|
||||
*/
|
||||
public static AppUserTypeEnum getByType(String type) {
|
||||
for (AppUserTypeEnum value : AppUserTypeEnum.values()) {
|
||||
if (value.getType().equals(type)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,12 +1,21 @@
|
||||
package org.dromara.common.utils;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.MessageUtils;
|
||||
import org.dromara.common.sse.dto.SseMessageDto;
|
||||
import org.dromara.common.sse.utils.SseMessageUtils;
|
||||
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.service.IBusAttendanceMachineService;
|
||||
import org.dromara.sms4j.api.SmsBlend;
|
||||
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||
import org.dromara.system.domain.vo.SysOssVo;
|
||||
import org.dromara.system.service.ISysOssService;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@ -17,6 +26,16 @@ import java.util.List;
|
||||
@Slf4j
|
||||
public class AsyncUtil {
|
||||
|
||||
@Resource
|
||||
@Lazy
|
||||
private DeviceMessageSender deviceMessageSender;
|
||||
@Resource
|
||||
@Lazy
|
||||
private ISysOssService ossService;
|
||||
@Resource
|
||||
@Lazy
|
||||
private IBusAttendanceMachineService attendanceMachineService;
|
||||
|
||||
//发送短信
|
||||
@Async
|
||||
public void sendSms(List<String> mobileList, String config) {
|
||||
@ -39,4 +58,27 @@ public class AsyncUtil {
|
||||
}
|
||||
|
||||
|
||||
//下发考勤人员
|
||||
@Async
|
||||
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();
|
||||
for (BusAttendanceMachine machine : list) {
|
||||
deviceMessageSender.sendPersonnelInformation(machine.getSn(), constructionUser.getSysUserId().toString(), constructionUser.getUserName(), byId.getUrl());
|
||||
}
|
||||
}
|
||||
|
||||
//删除考勤人员
|
||||
@Async
|
||||
public void deletePersonnel(SubConstructionUser constructionUser) {
|
||||
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());
|
||||
} catch (Exception e) {
|
||||
log.error("删除考勤人员异常", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,89 @@
|
||||
package org.dromara.common.utils.attendance;
|
||||
|
||||
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
public class FaceUtil {
|
||||
|
||||
private static final String FACE_URL = "http://192.168.110.5:1224";
|
||||
|
||||
/**
|
||||
* 创建人脸记录 post
|
||||
* @param name 姓名
|
||||
* @param card 身份证
|
||||
* @param path 人脸图片HTTP地址(需可公开访问)
|
||||
*/
|
||||
public static void createFaceRecord(String name, String card, String path) {
|
||||
String url = FACE_URL+"/api/faces";
|
||||
|
||||
HashMap<String, Object> param = new HashMap<>() {{
|
||||
put("name", name);
|
||||
put("card", card);
|
||||
put("path", path);
|
||||
}};
|
||||
HttpUtil.post(url, param);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 人脸检测
|
||||
* @param path 图片HTTP地址(需可公开访问)
|
||||
*/
|
||||
public static Map<String, String> faceDetect(String path) {
|
||||
String url = FACE_URL+"/api/faces/detect";
|
||||
|
||||
HashMap<String, Object> param = new HashMap<>() {{
|
||||
put("path", path);
|
||||
put("similarity_threshold", 0.8);
|
||||
}};
|
||||
//转成json
|
||||
|
||||
String post = HttpUtil.post(url, param);
|
||||
Map<String, String> map = new HashMap<>();
|
||||
// 遍历检测到的人脸数据
|
||||
try {
|
||||
// 解析返回的JSON数据
|
||||
JSONObject response = JSON.parseObject(post);
|
||||
JSONObject data = response.getJSONObject("data");
|
||||
JSONArray detectedFaces = data.getJSONArray("detected_faces");
|
||||
|
||||
for (int i = 0; i < detectedFaces.size(); i++) {
|
||||
JSONObject face = detectedFaces.getJSONObject(i);
|
||||
JSONObject matchInfo = face.getJSONObject("match_info");
|
||||
|
||||
// 检查相似度是否大于等于阈值
|
||||
double similarity = matchInfo.getDoubleValue("similarity");
|
||||
double threshold = matchInfo.getDoubleValue("threshold");
|
||||
|
||||
if (similarity >= threshold) {
|
||||
// 提取用户信息
|
||||
JSONObject userInfo = face.getJSONObject("user_info");
|
||||
String name = userInfo.getString("name");
|
||||
String idCard = userInfo.getString("id_card");
|
||||
map.put(idCard, name);
|
||||
}
|
||||
}
|
||||
}catch (Exception e){
|
||||
log.error("人脸检测失败",e);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Map<String, String> map = faceDetect("http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/12/9688ce2474ad47e7bf59c641848cdf8f.jpg");
|
||||
// System.out.println(map);
|
||||
// createFaceRecord("石志强","513022111145632652","http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/12/9688ce2474ad47e7bf59c641848cdf8f.jpg");
|
||||
}
|
||||
|
||||
}
|
||||
@ -364,10 +364,11 @@ public class SubConstructionUserController extends BaseController {
|
||||
if (user.getEntryDate() != null) {
|
||||
vo.setEntryDate(DateUtils.formatDateTime(user.getEntryDate()));
|
||||
}
|
||||
//0男 1女 2未知
|
||||
String sex = vo.getSex();
|
||||
if (sex != null && sex.equals("1")) {
|
||||
if (sex != null && sex.equals("0")) {
|
||||
vo.setSex("男");
|
||||
} else if (sex != null && sex.equals("2")) {
|
||||
} else if (sex != null && sex.equals("1")) {
|
||||
vo.setSex("女");
|
||||
} else {
|
||||
vo.setSex("未知");
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.dromara.contractor.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
@ -204,4 +205,10 @@ public class SubConstructionUser extends BaseEntity {
|
||||
private Long goId;
|
||||
|
||||
private String goOpenid;
|
||||
|
||||
/**
|
||||
* 删除标志(0代表存在 1代表删除)
|
||||
*/
|
||||
@TableLogic
|
||||
private String delFlag;
|
||||
}
|
||||
|
||||
@ -101,4 +101,7 @@ public class SubConstructionUserQueryReq implements Serializable {
|
||||
*/
|
||||
private String userId;
|
||||
|
||||
|
||||
private String phone;
|
||||
|
||||
}
|
||||
|
||||
@ -19,12 +19,14 @@ import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.DateUtils;
|
||||
import org.dromara.common.core.utils.ObjectUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.enums.AppUserTypeEnum;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.oss.core.OssClient;
|
||||
import org.dromara.common.oss.exception.OssException;
|
||||
import org.dromara.common.oss.factory.OssFactory;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.common.utils.AsyncUtil;
|
||||
import org.dromara.common.utils.IdCardEncryptorUtil;
|
||||
import org.dromara.common.utils.baiduUtil.BaiDuFace;
|
||||
import org.dromara.common.utils.baiduUtil.BaiDuOCR;
|
||||
@ -45,6 +47,7 @@ import org.dromara.contractor.mapper.SubConstructionUserMapper;
|
||||
import org.dromara.contractor.service.ISubConstructionUserFileService;
|
||||
import org.dromara.contractor.service.ISubConstructionUserService;
|
||||
import org.dromara.contractor.service.ISubContractorService;
|
||||
import org.dromara.mobileAttendanceMachine.DeviceMessageSender;
|
||||
import org.dromara.project.domain.*;
|
||||
import org.dromara.project.domain.enums.BusAttendanceClockStatusEnum;
|
||||
import org.dromara.project.domain.enums.BusAttendanceCommuterEnum;
|
||||
@ -150,6 +153,11 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
||||
@Resource
|
||||
private ISysRoleService roleService;
|
||||
|
||||
@Resource
|
||||
private AsyncUtil asyncUtil;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 查询施工人员
|
||||
*
|
||||
@ -201,8 +209,10 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
||||
LambdaQueryWrapper<SubConstructionUser> lqw = Wrappers.lambdaQuery();
|
||||
// 从对象中取值
|
||||
String userName = req.getUserName();
|
||||
String phone = req.getPhone();
|
||||
|
||||
// 模糊查询
|
||||
lqw.like(StringUtils.isNotBlank(phone), SubConstructionUser::getPhone, phone);
|
||||
lqw.like(StringUtils.isNotBlank(userName), SubConstructionUser::getUserName, userName);
|
||||
lqw.isNull(SubConstructionUser::getProjectId);
|
||||
lqw.isNull(SubConstructionUser::getTeamId);
|
||||
@ -276,7 +286,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
||||
userRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery()
|
||||
.eq(SysUserRole::getUserId, constructionUser.getSysUserId())
|
||||
.eq(SysUserRole::getProjectId, dto.getProjectId())
|
||||
.in(SysUserRole::getRoleId, Arrays.asList(2L, 3L))
|
||||
.in(SysUserRole::getRoleId, AppUserTypeEnum.ROLE_ID_LIST)
|
||||
);
|
||||
//再添加分配角色
|
||||
Long roleId = "0".equals(dto.getPostId()) ? 2L : 3L;
|
||||
@ -289,6 +299,8 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
||||
//强退
|
||||
roleService.cleanOnlineUser(Collections.singletonList(constructionUser.getSysUserId()));
|
||||
|
||||
asyncUtil.sendPersonnel(dto.getTeamId(), constructionUser);
|
||||
|
||||
return i > 0;
|
||||
}
|
||||
|
||||
@ -1517,6 +1529,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
||||
lqw.eq(SubConstructionUser::getUserRole, "0");
|
||||
if (req.getProjectId() == null) {
|
||||
lqw.isNull(SubConstructionUser::getProjectId);
|
||||
lqw.apply("exists (select 1 from sys_user where user_id = sys_user_id and dept_id is null)");
|
||||
} else {
|
||||
lqw.eq(SubConstructionUser::getProjectId, req.getProjectId());
|
||||
}
|
||||
|
||||
@ -0,0 +1,116 @@
|
||||
package org.dromara.ctr.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementBo;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementUpdateReq;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementTotalVo;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
|
||||
import org.dromara.ctr.service.ICtrContractProgressSettlementService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/ctr/contractProgressSettlement")
|
||||
public class CtrContractProgressSettlementController extends BaseController {
|
||||
|
||||
private final ICtrContractProgressSettlementService ctrContractProgressSettlementService;
|
||||
|
||||
/**
|
||||
* 查询承包合同进度结算列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlement:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<CtrContractProgressSettlementVo> list(CtrContractProgressSettlementBo bo, PageQuery pageQuery) {
|
||||
return ctrContractProgressSettlementService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出承包合同进度结算列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlement:export")
|
||||
@Log(title = "承包合同进度结算", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(CtrContractProgressSettlementBo bo, HttpServletResponse response) {
|
||||
List<CtrContractProgressSettlementVo> list = ctrContractProgressSettlementService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "承包合同进度结算", CtrContractProgressSettlementVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取承包合同进度结算详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlement:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<CtrContractProgressSettlementVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(ctrContractProgressSettlementService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增承包合同进度结算
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlement:add")
|
||||
@Log(title = "承包合同进度结算", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated @RequestBody CtrContractProgressSettlementCreateReq req) {
|
||||
return toAjax(ctrContractProgressSettlementService.insertByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改承包合同进度结算
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlement:edit")
|
||||
@Log(title = "承包合同进度结算", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated @RequestBody CtrContractProgressSettlementUpdateReq req) {
|
||||
return toAjax(ctrContractProgressSettlementService.updateByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询金额合计
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlement:query")
|
||||
@GetMapping("/queryMoneyTotal")
|
||||
public R<CtrContractProgressSettlementTotalVo> queryMoneyTotal(CtrContractProgressSettlementBo bo) {
|
||||
return R.ok(ctrContractProgressSettlementService.queryMoneyTotal(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除承包合同进度结算
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlement:remove")
|
||||
@Log(title = "承包合同进度结算", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(ctrContractProgressSettlementService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,105 @@
|
||||
package org.dromara.ctr.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementItemBo;
|
||||
import org.dromara.ctr.service.ICtrContractProgressSettlementItemService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算清单
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/ctr/contractProgressSettlementItem")
|
||||
public class CtrContractProgressSettlementItemController extends BaseController {
|
||||
|
||||
private final ICtrContractProgressSettlementItemService ctrContractProgressSettlementItemService;
|
||||
|
||||
/**
|
||||
* 查询承包合同进度结算清单列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlementItem:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<CtrContractProgressSettlementItemVo> list(CtrContractProgressSettlementItemBo bo, PageQuery pageQuery) {
|
||||
return ctrContractProgressSettlementItemService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出承包合同进度结算清单列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlementItem:export")
|
||||
@Log(title = "承包合同进度结算清单", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(CtrContractProgressSettlementItemBo bo, HttpServletResponse response) {
|
||||
List<CtrContractProgressSettlementItemVo> list = ctrContractProgressSettlementItemService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "承包合同进度结算清单", CtrContractProgressSettlementItemVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取承包合同进度结算清单详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlementItem:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<CtrContractProgressSettlementItemVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(ctrContractProgressSettlementItemService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增承包合同进度结算清单
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlementItem:add")
|
||||
@Log(title = "承包合同进度结算清单", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody CtrContractProgressSettlementItemBo bo) {
|
||||
return toAjax(ctrContractProgressSettlementItemService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改承包合同进度结算清单
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlementItem:edit")
|
||||
@Log(title = "承包合同进度结算清单", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CtrContractProgressSettlementItemBo bo) {
|
||||
return toAjax(ctrContractProgressSettlementItemService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除承包合同进度结算清单
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("ctr:contractProgressSettlementItem:remove")
|
||||
@Log(title = "承包合同进度结算清单", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(ctrContractProgressSettlementItemService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,106 @@
|
||||
package org.dromara.ctr.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementBo;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementUpdateReq;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
|
||||
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/ctr/subcontractProgressSettlement")
|
||||
public class CtrSubcontractProgressSettlementController extends BaseController {
|
||||
|
||||
private final ICtrSubcontractProgressSettlementService ctrSubcontractProgressSettlementService;
|
||||
|
||||
/**
|
||||
* 查询分包合同进度结算列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlement:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<CtrSubcontractProgressSettlementVo> list(CtrSubcontractProgressSettlementBo bo, PageQuery pageQuery) {
|
||||
return ctrSubcontractProgressSettlementService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出分包合同进度结算列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlement:export")
|
||||
@Log(title = "分包合同进度结算", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(CtrSubcontractProgressSettlementBo bo, HttpServletResponse response) {
|
||||
List<CtrSubcontractProgressSettlementVo> list = ctrSubcontractProgressSettlementService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "分包合同进度结算", CtrSubcontractProgressSettlementVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取分包合同进度结算详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlement:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<CtrSubcontractProgressSettlementVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(ctrSubcontractProgressSettlementService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增分包合同进度结算
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlement:add")
|
||||
@Log(title = "分包合同进度结算", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated @RequestBody CtrSubcontractProgressSettlementCreateReq req) {
|
||||
return toAjax(ctrSubcontractProgressSettlementService.insertByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改分包合同进度结算
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlement:edit")
|
||||
@Log(title = "分包合同进度结算", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated @RequestBody CtrSubcontractProgressSettlementUpdateReq req) {
|
||||
return toAjax(ctrSubcontractProgressSettlementService.updateByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除分包合同进度结算
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlement:remove")
|
||||
@Log(title = "分包合同进度结算", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(ctrSubcontractProgressSettlementService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,105 @@
|
||||
package org.dromara.ctr.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementItemBo;
|
||||
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementItemService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算清单
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/ctr/subcontractProgressSettlementItem")
|
||||
public class CtrSubcontractProgressSettlementItemController extends BaseController {
|
||||
|
||||
private final ICtrSubcontractProgressSettlementItemService ctrSubcontractProgressSettlementItemService;
|
||||
|
||||
/**
|
||||
* 查询分包合同进度结算清单列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlementItem:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<CtrSubcontractProgressSettlementItemVo> list(CtrSubcontractProgressSettlementItemBo bo, PageQuery pageQuery) {
|
||||
return ctrSubcontractProgressSettlementItemService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出分包合同进度结算清单列表
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlementItem:export")
|
||||
@Log(title = "分包合同进度结算清单", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(CtrSubcontractProgressSettlementItemBo bo, HttpServletResponse response) {
|
||||
List<CtrSubcontractProgressSettlementItemVo> list = ctrSubcontractProgressSettlementItemService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "分包合同进度结算清单", CtrSubcontractProgressSettlementItemVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取分包合同进度结算清单详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlementItem:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<CtrSubcontractProgressSettlementItemVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(ctrSubcontractProgressSettlementItemService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增分包合同进度结算清单
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlementItem:add")
|
||||
@Log(title = "分包合同进度结算清单", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody CtrSubcontractProgressSettlementItemBo bo) {
|
||||
return toAjax(ctrSubcontractProgressSettlementItemService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改分包合同进度结算清单
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlementItem:edit")
|
||||
@Log(title = "分包合同进度结算清单", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CtrSubcontractProgressSettlementItemBo bo) {
|
||||
return toAjax(ctrSubcontractProgressSettlementItemService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除分包合同进度结算清单
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("ctr:subcontractProgressSettlementItem:remove")
|
||||
@Log(title = "分包合同进度结算清单", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(ctrSubcontractProgressSettlementItemService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,139 @@
|
||||
package org.dromara.ctr.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算对象 ctr_contract_progress_settlement
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("ctr_contract_progress_settlement")
|
||||
public class CtrContractProgressSettlement extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 结算日期
|
||||
*/
|
||||
private LocalDate settlementDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 结算单位(客户)
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal settlementMoney;
|
||||
|
||||
/**
|
||||
* 本期扣款金额
|
||||
*/
|
||||
private BigDecimal deductionMoney;
|
||||
|
||||
/**
|
||||
* 本期奖励金额
|
||||
*/
|
||||
private BigDecimal bonus;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal thisSettlementRatio;
|
||||
|
||||
/**
|
||||
* 支付条款
|
||||
*/
|
||||
private Long paymentTerms;
|
||||
|
||||
/**
|
||||
* 多文件逗号分隔
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,107 @@
|
||||
package org.dromara.ctr.domain;
|
||||
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算清单对象 ctr_contract_progress_settlement_item
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("ctr_contract_progress_settlement_item")
|
||||
public class CtrContractProgressSettlementItem extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 结算单ID
|
||||
*/
|
||||
private Long settlementId;
|
||||
|
||||
/**
|
||||
* 类型(1合同内清单 2变更增加清单 3合同外清单)
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,123 @@
|
||||
package org.dromara.ctr.domain;
|
||||
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算对象 ctr_subcontract_progress_settlement
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("ctr_subcontract_progress_settlement")
|
||||
public class CtrSubcontractProgressSettlement extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 单据日期
|
||||
*/
|
||||
private LocalDate documentDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 结算单位
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal currentSettlementRate;
|
||||
|
||||
/**
|
||||
* 文件ID
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
private String auditStatus;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,130 @@
|
||||
package org.dromara.ctr.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算清单对象 ctr_subcontract_progress_settlement_item
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@TableName("ctr_subcontract_progress_settlement_item")
|
||||
public class CtrSubcontractProgressSettlementItem implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 结算单ID
|
||||
*/
|
||||
private Long settlementId;
|
||||
|
||||
/**
|
||||
* 类型(1合同内清单 2变更增加清单 3合同外清单)
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 税额
|
||||
*/
|
||||
private String tax;
|
||||
|
||||
/**
|
||||
* WBS工作分解结构
|
||||
*/
|
||||
private String wbs;
|
||||
|
||||
/**
|
||||
* CBS成本分解结构
|
||||
*/
|
||||
private String cbs;
|
||||
|
||||
/**
|
||||
* CBS预算总额
|
||||
*/
|
||||
private BigDecimal cbsBudgetTotal;
|
||||
|
||||
/**
|
||||
* CBS余额
|
||||
*/
|
||||
private BigDecimal cbsBalance;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@ -0,0 +1,150 @@
|
||||
package org.dromara.ctr.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.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlement;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算业务对象 ctr_contract_progress_settlement
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = CtrContractProgressSettlement.class, reverseConvertGenerate = false)
|
||||
public class CtrContractProgressSettlementBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = {EditGroup.class})
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
@NotNull(message = "所属部门不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
@NotBlank(message = "单据编码不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@NotBlank(message = "标题不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 结算日期
|
||||
*/
|
||||
@NotNull(message = "结算日期不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private LocalDate settlementDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@NotBlank(message = "合同编码不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 类型(1付款 2收款)
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@NotNull(message = "审批金额不能为空", groups = {AddGroup.class, EditGroup.class})
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 结算单位(客户)
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal settlementMoney;
|
||||
|
||||
/**
|
||||
* 本期扣款金额
|
||||
*/
|
||||
private BigDecimal deductionMoney;
|
||||
|
||||
/**
|
||||
* 本期奖励金额
|
||||
*/
|
||||
private BigDecimal bonus;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal thisSettlementRatio;
|
||||
|
||||
/**
|
||||
* 支付条款
|
||||
*/
|
||||
private Long paymentTerms;
|
||||
|
||||
/**
|
||||
* 多文件逗号分隔
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,110 @@
|
||||
package org.dromara.ctr.domain.bo;
|
||||
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import jakarta.validation.constraints.*;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算清单业务对象 ctr_contract_progress_settlement_item
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = CtrContractProgressSettlementItem.class, reverseConvertGenerate = false)
|
||||
public class CtrContractProgressSettlementItemBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 结算单ID
|
||||
*/
|
||||
@NotNull(message = "结算单ID不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private Long settlementId;
|
||||
|
||||
/**
|
||||
* 类型(1合同内清单 2变更增加清单 3合同外清单)
|
||||
*/
|
||||
@NotBlank(message = "类型(1合同内清单 2变更增加清单 3合同外清单)不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@NotBlank(message = "编码不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@NotBlank(message = "合同清单名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@NotBlank(message = "计量单位不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@ -0,0 +1,122 @@
|
||||
package org.dromara.ctr.domain.bo;
|
||||
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import jakarta.validation.constraints.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算业务对象 ctr_subcontract_progress_settlement
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlement.class, reverseConvertGenerate = false)
|
||||
public class CtrSubcontractProgressSettlementBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
@NotBlank(message = "单据编码不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 单据日期
|
||||
*/
|
||||
@NotNull(message = "单据日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private LocalDate documentDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@NotBlank(message = "合同编码不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@NotNull(message = "审批金额不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 结算单位
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal currentSettlementRate;
|
||||
|
||||
/**
|
||||
* 文件ID
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
private String auditStatus;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,136 @@
|
||||
package org.dromara.ctr.domain.bo;
|
||||
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import jakarta.validation.constraints.*;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算清单业务对象 ctr_subcontract_progress_settlement_item
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class, reverseConvertGenerate = false)
|
||||
public class CtrSubcontractProgressSettlementItemBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 结算单ID
|
||||
*/
|
||||
@NotNull(message = "结算单ID不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private Long settlementId;
|
||||
|
||||
/**
|
||||
* 类型(1合同内清单 2变更增加清单 3合同外清单)
|
||||
*/
|
||||
@NotBlank(message = "类型(1合同内清单 2变更增加清单 3合同外清单)不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@NotBlank(message = "编码不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@NotBlank(message = "合同清单名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@NotBlank(message = "计量单位不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 税额
|
||||
*/
|
||||
private String tax;
|
||||
|
||||
/**
|
||||
* WBS工作分解结构
|
||||
*/
|
||||
private String wbs;
|
||||
|
||||
/**
|
||||
* CBS成本分解结构
|
||||
*/
|
||||
private String cbs;
|
||||
|
||||
/**
|
||||
* CBS预算总额
|
||||
*/
|
||||
private BigDecimal cbsBudgetTotal;
|
||||
|
||||
/**
|
||||
* CBS余额
|
||||
*/
|
||||
private BigDecimal cbsBalance;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,148 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlement;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算业务对象 ctr_contract_progress_settlement
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@AutoMapper(target = CtrContractProgressSettlement.class, reverseConvertGenerate = false)
|
||||
public class CtrContractProgressSettlementCreateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -7707258738219359278L;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
@NotNull(message = "所属部门不能为空")
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@NotBlank(message = "标题不能为空")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 结算日期
|
||||
*/
|
||||
@NotNull(message = "结算日期不能为空")
|
||||
private LocalDate settlementDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@NotBlank(message = "合同编码不能为空")
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@NotNull(message = "审批金额不能为空")
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 结算单位(客户)
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal settlementMoney;
|
||||
|
||||
/**
|
||||
* 本期扣款金额
|
||||
*/
|
||||
private BigDecimal deductionMoney;
|
||||
|
||||
/**
|
||||
* 本期奖励金额
|
||||
*/
|
||||
private BigDecimal bonus;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal thisSettlementRatio;
|
||||
|
||||
/**
|
||||
* 支付条款
|
||||
*/
|
||||
private Long paymentTerms;
|
||||
|
||||
/**
|
||||
* 多文件逗号分隔
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 合同内清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemCreateReq> inInventory;
|
||||
|
||||
/**
|
||||
* 变更增加清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemCreateReq> changeInventory;
|
||||
|
||||
/**
|
||||
* 合同外清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemCreateReq> outInventory;
|
||||
|
||||
}
|
||||
@ -0,0 +1,86 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-18 17:05
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CtrContractProgressSettlementItemCreateReq {
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@NotBlank(message = "编码不能为空")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@NotBlank(message = "合同清单名称不能为空")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@NotBlank(message = "计量单位不能为空")
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
@ -0,0 +1,91 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-18 17:39
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CtrContractProgressSettlementItemUpdateReq {
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@NotBlank(message = "编码不能为空")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@NotBlank(message = "合同清单名称不能为空")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@NotBlank(message = "计量单位不能为空")
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
@ -0,0 +1,157 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlement;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-18 17:30
|
||||
*/
|
||||
@Data
|
||||
@AutoMapper(target = CtrContractProgressSettlement.class, reverseConvertGenerate = false)
|
||||
public class CtrContractProgressSettlementUpdateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -105855005415297131L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
@NotNull(message = "所属部门不能为空")
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
@NotBlank(message = "单据编码不能为空")
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@NotBlank(message = "标题不能为空")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 结算日期
|
||||
*/
|
||||
@NotNull(message = "结算日期不能为空")
|
||||
private LocalDate settlementDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@NotBlank(message = "合同编码不能为空")
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@NotNull(message = "审批金额不能为空")
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 结算单位(客户)
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal settlementMoney;
|
||||
|
||||
/**
|
||||
* 本期扣款金额
|
||||
*/
|
||||
private BigDecimal deductionMoney;
|
||||
|
||||
/**
|
||||
* 本期奖励金额
|
||||
*/
|
||||
private BigDecimal bonus;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal thisSettlementRatio;
|
||||
|
||||
/**
|
||||
* 支付条款
|
||||
*/
|
||||
private Long paymentTerms;
|
||||
|
||||
/**
|
||||
* 多文件逗号分隔
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 合同内清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemUpdateReq> inInventory;
|
||||
|
||||
/**
|
||||
* 变更增加清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemUpdateReq> changeInventory;
|
||||
|
||||
/**
|
||||
* 合同外清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemUpdateReq> outInventory;
|
||||
}
|
||||
@ -0,0 +1,129 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-18 19:14
|
||||
*/
|
||||
@Data
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlement.class, reverseConvertGenerate = false)
|
||||
public class CtrSubcontractProgressSettlementCreateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 770553999547826460L;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@NotBlank(message = "标题不能为空")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 单据日期
|
||||
*/
|
||||
@NotNull(message = "单据日期不能为空")
|
||||
private LocalDate documentDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@NotBlank(message = "合同编码不能为空")
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@NotNull(message = "审批金额不能为空")
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 结算单位
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal currentSettlementRate;
|
||||
|
||||
/**
|
||||
* 文件ID
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
private String auditStatus;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 合同内清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemCreateReq> inInventory;
|
||||
|
||||
/**
|
||||
* 变更增加清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemCreateReq> changeInventory;
|
||||
|
||||
/**
|
||||
* 合同外清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemCreateReq> outInventory;
|
||||
}
|
||||
@ -0,0 +1,115 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-18 19:17
|
||||
*/
|
||||
@Data
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class, reverseConvertGenerate = false)
|
||||
public class CtrSubcontractProgressSettlementItemCreateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -7720839036718185218L;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@NotBlank(message = "编码不能为空")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@NotBlank(message = "合同清单名称不能为空")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@NotBlank(message = "计量单位不能为空")
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 税额
|
||||
*/
|
||||
private String tax;
|
||||
|
||||
/**
|
||||
* WBS工作分解结构
|
||||
*/
|
||||
private String wbs;
|
||||
|
||||
/**
|
||||
* CBS成本分解结构
|
||||
*/
|
||||
private String cbs;
|
||||
|
||||
/**
|
||||
* CBS预算总额
|
||||
*/
|
||||
private BigDecimal cbsBudgetTotal;
|
||||
|
||||
/**
|
||||
* CBS余额
|
||||
*/
|
||||
private BigDecimal cbsBalance;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
@ -0,0 +1,123 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-18 19:21
|
||||
*/
|
||||
@Data
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class, reverseConvertGenerate = false)
|
||||
public class CtrSubcontractProgressSettlementItemUpdateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 4319471696029509036L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@NotBlank(message = "编码不能为空")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@NotBlank(message = "合同清单名称不能为空")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@NotBlank(message = "计量单位不能为空")
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 税额
|
||||
*/
|
||||
private String tax;
|
||||
|
||||
/**
|
||||
* WBS工作分解结构
|
||||
*/
|
||||
private String wbs;
|
||||
|
||||
/**
|
||||
* CBS成本分解结构
|
||||
*/
|
||||
private String cbs;
|
||||
|
||||
/**
|
||||
* CBS预算总额
|
||||
*/
|
||||
private BigDecimal cbsBudgetTotal;
|
||||
|
||||
/**
|
||||
* CBS余额
|
||||
*/
|
||||
private BigDecimal cbsBalance;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@ -0,0 +1,136 @@
|
||||
package org.dromara.ctr.domain.dto;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-18 19:20
|
||||
*/
|
||||
@Data
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlement.class, reverseConvertGenerate = false)
|
||||
public class CtrSubcontractProgressSettlementUpdateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = -7099475527833822253L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@NotNull(message = "主键ID不能为空")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
@NotBlank(message = "单据编码不能为空")
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@NotBlank(message = "标题不能为空")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 单据日期
|
||||
*/
|
||||
@NotNull(message = "单据日期不能为空")
|
||||
private LocalDate documentDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@NotBlank(message = "合同编码不能为空")
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@NotNull(message = "审批金额不能为空")
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 结算单位
|
||||
*/
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
private BigDecimal currentSettlementRate;
|
||||
|
||||
/**
|
||||
* 文件ID
|
||||
*/
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
private String auditStatus;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 合同内清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemUpdateReq> inInventory;
|
||||
|
||||
/**
|
||||
* 变更增加清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemUpdateReq> changeInventory;
|
||||
|
||||
/**
|
||||
* 合同外清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemUpdateReq> outInventory;
|
||||
}
|
||||
@ -0,0 +1,130 @@
|
||||
package org.dromara.ctr.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
|
||||
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;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 承包合同进度结算清单视图对象 ctr_contract_progress_settlement_item
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = CtrContractProgressSettlementItem.class)
|
||||
public class CtrContractProgressSettlementItemVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 结算单ID
|
||||
*/
|
||||
@ExcelProperty(value = "结算单ID")
|
||||
private Long settlementId;
|
||||
|
||||
/**
|
||||
* 类型(1合同内清单 2变更增加清单 3合同外清单)
|
||||
*/
|
||||
@ExcelProperty(value = "类型(1合同内清单 2变更增加清单 3合同外清单)")
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@ExcelProperty(value = "编码")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@ExcelProperty(value = "合同清单名称")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@ExcelProperty(value = "计量单位")
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
@ExcelProperty(value = "单价")
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
@ExcelProperty(value = "含税单价")
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算数量")
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算百分比")
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算金额")
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算不含税金额")
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
@ExcelProperty(value = "本期审批数量")
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期审批金额")
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
@ExcelProperty(value = "税率", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(dictType = "xzd_tax_rate")
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package org.dromara.ctr.domain.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-10-21 11:01
|
||||
*/
|
||||
@Data
|
||||
public class CtrContractProgressSettlementTotalVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1537548228169684228L;
|
||||
|
||||
/**
|
||||
* 总金额
|
||||
*/
|
||||
private BigDecimal moneyTotal;
|
||||
}
|
||||
@ -0,0 +1,192 @@
|
||||
package org.dromara.ctr.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import org.dromara.common.translation.annotation.Translation;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlement;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* 承包合同进度结算视图对象 ctr_contract_progress_settlement
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = CtrContractProgressSettlement.class)
|
||||
public class CtrContractProgressSettlementVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
@ExcelProperty(value = "所属部门")
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 部门名称
|
||||
*/
|
||||
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId")
|
||||
private String deptName;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
@ExcelProperty(value = "单据编码")
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@ExcelProperty(value = "标题")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 结算日期
|
||||
*/
|
||||
@ExcelProperty(value = "结算日期")
|
||||
private LocalDate settlementDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@ExcelProperty(value = "合同编码")
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
@ExcelProperty(value = "合同名称")
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
@ExcelProperty(value = "统计周期")
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@ExcelProperty(value = "项目ID")
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
@ExcelProperty(value = "项目名称")
|
||||
@Translation(type = TransConstant.PROJECT_ID_TO_NAME, mapper = "projectId")
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@ExcelProperty(value = "审批金额")
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
@ExcelProperty(value = "计量开始日期")
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
@ExcelProperty(value = "计量结束日期")
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 结算单位(客户)
|
||||
*/
|
||||
@ExcelProperty(value = "结算单位(客户)")
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 结算单位名称
|
||||
*/
|
||||
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "settlementUnit")
|
||||
private String settlementUnitName;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算金额")
|
||||
private BigDecimal settlementMoney;
|
||||
|
||||
/**
|
||||
* 本期扣款金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期扣款金额")
|
||||
private BigDecimal deductionMoney;
|
||||
|
||||
/**
|
||||
* 本期奖励金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期奖励金额")
|
||||
private BigDecimal bonus;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
@ExcelProperty(value = "合同金额")
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
@ExcelProperty(value = "本次结算比例")
|
||||
private BigDecimal thisSettlementRatio;
|
||||
|
||||
/**
|
||||
* 支付条款
|
||||
*/
|
||||
@ExcelProperty(value = "支付条款")
|
||||
private Long paymentTerms;
|
||||
|
||||
/**
|
||||
* 多文件逗号分隔
|
||||
*/
|
||||
@ExcelProperty(value = "多文件逗号分隔")
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 合同内清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemVo> inInventory;
|
||||
|
||||
/**
|
||||
* 变更增加清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemVo> changeInventory;
|
||||
|
||||
/**
|
||||
* 合同外清单
|
||||
*/
|
||||
private List<CtrContractProgressSettlementItemVo> outInventory;
|
||||
|
||||
}
|
||||
@ -0,0 +1,160 @@
|
||||
package org.dromara.ctr.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
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;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 分包合同进度结算清单视图对象 ctr_subcontract_progress_settlement_item
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class)
|
||||
public class CtrSubcontractProgressSettlementItemVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 结算单ID
|
||||
*/
|
||||
@ExcelProperty(value = "结算单ID")
|
||||
private Long settlementId;
|
||||
|
||||
/**
|
||||
* 类型(1合同内清单 2变更增加清单 3合同外清单)
|
||||
*/
|
||||
@ExcelProperty(value = "类型(1合同内清单 2变更增加清单 3合同外清单)")
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 编码
|
||||
*/
|
||||
@ExcelProperty(value = "编码")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 合同清单名称
|
||||
*/
|
||||
@ExcelProperty(value = "合同清单名称")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 计量单位
|
||||
*/
|
||||
@ExcelProperty(value = "计量单位")
|
||||
private String unit;
|
||||
|
||||
/**
|
||||
* 单价
|
||||
*/
|
||||
@ExcelProperty(value = "单价")
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
/**
|
||||
* 含税单价
|
||||
*/
|
||||
@ExcelProperty(value = "含税单价")
|
||||
private BigDecimal taxUnitPrice;
|
||||
|
||||
/**
|
||||
* 本期结算数量
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算数量")
|
||||
private BigDecimal currentQty;
|
||||
|
||||
/**
|
||||
* 本期结算百分比
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算百分比")
|
||||
private BigDecimal currentRate;
|
||||
|
||||
/**
|
||||
* 本期结算金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算金额")
|
||||
private BigDecimal currentAmount;
|
||||
|
||||
/**
|
||||
* 本期结算不含税金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期结算不含税金额")
|
||||
private BigDecimal currentNoAmount;
|
||||
|
||||
/**
|
||||
* 本期审批数量
|
||||
*/
|
||||
@ExcelProperty(value = "本期审批数量")
|
||||
private BigDecimal currentApprovedQty;
|
||||
|
||||
/**
|
||||
* 本期审批金额
|
||||
*/
|
||||
@ExcelProperty(value = "本期审批金额")
|
||||
private BigDecimal currentApprovedAmount;
|
||||
|
||||
/**
|
||||
* 税率(%)
|
||||
*/
|
||||
@ExcelProperty(value = "税率", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(dictType = "xzd_tax_rate")
|
||||
private String taxRate;
|
||||
|
||||
/**
|
||||
* 税额
|
||||
*/
|
||||
@ExcelProperty(value = "税额")
|
||||
private String tax;
|
||||
|
||||
/**
|
||||
* WBS工作分解结构
|
||||
*/
|
||||
@ExcelProperty(value = "WBS工作分解结构")
|
||||
private String wbs;
|
||||
|
||||
/**
|
||||
* CBS成本分解结构
|
||||
*/
|
||||
@ExcelProperty(value = "CBS成本分解结构")
|
||||
private String cbs;
|
||||
|
||||
/**
|
||||
* CBS预算总额
|
||||
*/
|
||||
@ExcelProperty(value = "CBS预算总额")
|
||||
private BigDecimal cbsBudgetTotal;
|
||||
|
||||
/**
|
||||
* CBS余额
|
||||
*/
|
||||
@ExcelProperty(value = "CBS余额")
|
||||
private BigDecimal cbsBalance;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,173 @@
|
||||
package org.dromara.ctr.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import org.dromara.common.translation.annotation.Translation;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* 分包合同进度结算视图对象 ctr_subcontract_progress_settlement
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = CtrSubcontractProgressSettlement.class)
|
||||
public class CtrSubcontractProgressSettlementVo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "主键ID")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 单据编码
|
||||
*/
|
||||
@ExcelProperty(value = "单据编码")
|
||||
private String documentCode;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@ExcelProperty(value = "标题")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 所属部门
|
||||
*/
|
||||
@ExcelProperty(value = "所属部门")
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 部门名称
|
||||
*/
|
||||
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId")
|
||||
private String deptName;
|
||||
|
||||
/**
|
||||
* 单据日期
|
||||
*/
|
||||
@ExcelProperty(value = "单据日期")
|
||||
private LocalDate documentDate;
|
||||
|
||||
/**
|
||||
* 合同编码
|
||||
*/
|
||||
@ExcelProperty(value = "合同编码")
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
@ExcelProperty(value = "合同名称")
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 统计周期
|
||||
*/
|
||||
@ExcelProperty(value = "统计周期")
|
||||
private String contractProgress;
|
||||
|
||||
/**
|
||||
* 计量开始日期
|
||||
*/
|
||||
@ExcelProperty(value = "计量开始日期")
|
||||
private LocalDate measureDateBegin;
|
||||
|
||||
/**
|
||||
* 计量结束日期
|
||||
*/
|
||||
@ExcelProperty(value = "计量结束日期")
|
||||
private LocalDate measureDateEnd;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@ExcelProperty(value = "项目ID")
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 项目名称
|
||||
*/
|
||||
@ExcelProperty(value = "项目名称")
|
||||
private String projectName;
|
||||
|
||||
/**
|
||||
* 审批金额
|
||||
*/
|
||||
@ExcelProperty(value = "审批金额")
|
||||
private BigDecimal approvalAmount;
|
||||
|
||||
/**
|
||||
* 结算单位
|
||||
*/
|
||||
@ExcelProperty(value = "结算单位")
|
||||
private Long settlementUnit;
|
||||
|
||||
/**
|
||||
* 结算单位名称
|
||||
*/
|
||||
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "settlementUnit")
|
||||
private String settlementUnitName;
|
||||
|
||||
/**
|
||||
* 合同金额
|
||||
*/
|
||||
@ExcelProperty(value = "合同金额")
|
||||
private BigDecimal contractAmount;
|
||||
|
||||
/**
|
||||
* 本次结算比例
|
||||
*/
|
||||
@ExcelProperty(value = "本次结算比例")
|
||||
private BigDecimal currentSettlementRate;
|
||||
|
||||
/**
|
||||
* 文件ID
|
||||
*/
|
||||
@ExcelProperty(value = "文件ID")
|
||||
private String fileId;
|
||||
|
||||
/**
|
||||
* 审核状态
|
||||
*/
|
||||
@ExcelProperty(value = "审核状态")
|
||||
private String auditStatus;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 合同内清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemVo> inInventory;
|
||||
|
||||
/**
|
||||
* 变更增加清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemVo> changeInventory;
|
||||
|
||||
/**
|
||||
* 合同外清单
|
||||
*/
|
||||
private List<CtrSubcontractProgressSettlementItemVo> outInventory;
|
||||
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
package org.dromara.ctr.mapper;
|
||||
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算清单Mapper接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface CtrContractProgressSettlementItemMapper extends BaseMapperPlus<CtrContractProgressSettlementItem, CtrContractProgressSettlementItemVo> {
|
||||
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
package org.dromara.ctr.mapper;
|
||||
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlement;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算Mapper接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface CtrContractProgressSettlementMapper extends BaseMapperPlus<CtrContractProgressSettlement, CtrContractProgressSettlementVo> {
|
||||
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
package org.dromara.ctr.mapper;
|
||||
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算清单Mapper接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface CtrSubcontractProgressSettlementItemMapper extends BaseMapperPlus<CtrSubcontractProgressSettlementItem, CtrSubcontractProgressSettlementItemVo> {
|
||||
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
package org.dromara.ctr.mapper;
|
||||
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算Mapper接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface CtrSubcontractProgressSettlementMapper extends BaseMapperPlus<CtrSubcontractProgressSettlement, CtrSubcontractProgressSettlementVo> {
|
||||
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
package org.dromara.ctr.service;
|
||||
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementItemBo;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算清单Service接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface ICtrContractProgressSettlementItemService extends IService<CtrContractProgressSettlementItem>{
|
||||
|
||||
/**
|
||||
* 查询承包合同进度结算清单
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 承包合同进度结算清单
|
||||
*/
|
||||
CtrContractProgressSettlementItemVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询承包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 承包合同进度结算清单分页列表
|
||||
*/
|
||||
TableDataInfo<CtrContractProgressSettlementItemVo> queryPageList(CtrContractProgressSettlementItemBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的承包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 承包合同进度结算清单列表
|
||||
*/
|
||||
List<CtrContractProgressSettlementItemVo> queryList(CtrContractProgressSettlementItemBo bo);
|
||||
|
||||
/**
|
||||
* 新增承包合同进度结算清单
|
||||
*
|
||||
* @param bo 承包合同进度结算清单
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(CtrContractProgressSettlementItemBo bo);
|
||||
|
||||
/**
|
||||
* 修改承包合同进度结算清单
|
||||
*
|
||||
* @param bo 承包合同进度结算清单
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(CtrContractProgressSettlementItemBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除承包合同进度结算清单信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
package org.dromara.ctr.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlement;
|
||||
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementBo;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementUpdateReq;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementTotalVo;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算Service接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface ICtrContractProgressSettlementService extends IService<CtrContractProgressSettlement> {
|
||||
|
||||
/**
|
||||
* 查询承包合同进度结算
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 承包合同进度结算
|
||||
*/
|
||||
CtrContractProgressSettlementVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询承包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 承包合同进度结算分页列表
|
||||
*/
|
||||
TableDataInfo<CtrContractProgressSettlementVo> queryPageList(CtrContractProgressSettlementBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的承包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 承包合同进度结算列表
|
||||
*/
|
||||
List<CtrContractProgressSettlementVo> queryList(CtrContractProgressSettlementBo bo);
|
||||
|
||||
/**
|
||||
* 查询金额统计
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 金额统计
|
||||
*/
|
||||
CtrContractProgressSettlementTotalVo queryMoneyTotal(CtrContractProgressSettlementBo bo);
|
||||
|
||||
/**
|
||||
* 新增承包合同进度结算
|
||||
*
|
||||
* @param req 承包合同进度结算
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(CtrContractProgressSettlementCreateReq req);
|
||||
|
||||
/**
|
||||
* 修改承包合同进度结算
|
||||
*
|
||||
* @param req 承包合同进度结算
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(CtrContractProgressSettlementUpdateReq req);
|
||||
|
||||
/**
|
||||
* 校验并批量删除承包合同进度结算信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
package org.dromara.ctr.service;
|
||||
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementItemBo;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算清单Service接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface ICtrSubcontractProgressSettlementItemService extends IService<CtrSubcontractProgressSettlementItem>{
|
||||
|
||||
/**
|
||||
* 查询分包合同进度结算清单
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 分包合同进度结算清单
|
||||
*/
|
||||
CtrSubcontractProgressSettlementItemVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询分包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 分包合同进度结算清单分页列表
|
||||
*/
|
||||
TableDataInfo<CtrSubcontractProgressSettlementItemVo> queryPageList(CtrSubcontractProgressSettlementItemBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的分包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 分包合同进度结算清单列表
|
||||
*/
|
||||
List<CtrSubcontractProgressSettlementItemVo> queryList(CtrSubcontractProgressSettlementItemBo bo);
|
||||
|
||||
/**
|
||||
* 新增分包合同进度结算清单
|
||||
*
|
||||
* @param bo 分包合同进度结算清单
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(CtrSubcontractProgressSettlementItemBo bo);
|
||||
|
||||
/**
|
||||
* 修改分包合同进度结算清单
|
||||
*
|
||||
* @param bo 分包合同进度结算清单
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(CtrSubcontractProgressSettlementItemBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除分包合同进度结算清单信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@ -0,0 +1,72 @@
|
||||
package org.dromara.ctr.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
|
||||
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementBo;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementUpdateReq;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算Service接口
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
public interface ICtrSubcontractProgressSettlementService extends IService<CtrSubcontractProgressSettlement> {
|
||||
|
||||
/**
|
||||
* 查询分包合同进度结算
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 分包合同进度结算
|
||||
*/
|
||||
CtrSubcontractProgressSettlementVo queryById(Long id);
|
||||
|
||||
/**
|
||||
* 分页查询分包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 分包合同进度结算分页列表
|
||||
*/
|
||||
TableDataInfo<CtrSubcontractProgressSettlementVo> queryPageList(CtrSubcontractProgressSettlementBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询符合条件的分包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 分包合同进度结算列表
|
||||
*/
|
||||
List<CtrSubcontractProgressSettlementVo> queryList(CtrSubcontractProgressSettlementBo bo);
|
||||
|
||||
/**
|
||||
* 新增分包合同进度结算
|
||||
*
|
||||
* @param req 分包合同进度结算
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
Boolean insertByBo(CtrSubcontractProgressSettlementCreateReq req);
|
||||
|
||||
/**
|
||||
* 修改分包合同进度结算
|
||||
*
|
||||
* @param req 分包合同进度结算
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
Boolean updateByBo(CtrSubcontractProgressSettlementUpdateReq req);
|
||||
|
||||
/**
|
||||
* 校验并批量删除分包合同进度结算信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@ -0,0 +1,142 @@
|
||||
package org.dromara.ctr.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementItemBo;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
|
||||
import org.dromara.ctr.mapper.CtrContractProgressSettlementItemMapper;
|
||||
import org.dromara.ctr.service.ICtrContractProgressSettlementItemService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算清单Service业务层处理
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class CtrContractProgressSettlementItemServiceImpl extends ServiceImpl<CtrContractProgressSettlementItemMapper, CtrContractProgressSettlementItem> implements ICtrContractProgressSettlementItemService {
|
||||
|
||||
/**
|
||||
* 查询承包合同进度结算清单
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 承包合同进度结算清单
|
||||
*/
|
||||
@Override
|
||||
public CtrContractProgressSettlementItemVo queryById(Long id){
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询承包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 承包合同进度结算清单分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<CtrContractProgressSettlementItemVo> queryPageList(CtrContractProgressSettlementItemBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<CtrContractProgressSettlementItem> lqw = buildQueryWrapper(bo);
|
||||
Page<CtrContractProgressSettlementItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的承包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 承包合同进度结算清单列表
|
||||
*/
|
||||
@Override
|
||||
public List<CtrContractProgressSettlementItemVo> queryList(CtrContractProgressSettlementItemBo bo) {
|
||||
LambdaQueryWrapper<CtrContractProgressSettlementItem> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<CtrContractProgressSettlementItem> buildQueryWrapper(CtrContractProgressSettlementItemBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CtrContractProgressSettlementItem> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(CtrContractProgressSettlementItem::getId);
|
||||
lqw.eq(bo.getSettlementId() != null, CtrContractProgressSettlementItem::getSettlementId, bo.getSettlementId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getType()), CtrContractProgressSettlementItem::getType, bo.getType());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCode()), CtrContractProgressSettlementItem::getCode, bo.getCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getName()), CtrContractProgressSettlementItem::getName, bo.getName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getUnit()), CtrContractProgressSettlementItem::getUnit, bo.getUnit());
|
||||
lqw.eq(bo.getUnitPrice() != null, CtrContractProgressSettlementItem::getUnitPrice, bo.getUnitPrice());
|
||||
lqw.eq(bo.getTaxUnitPrice() != null, CtrContractProgressSettlementItem::getTaxUnitPrice, bo.getTaxUnitPrice());
|
||||
lqw.eq(bo.getCurrentQty() != null, CtrContractProgressSettlementItem::getCurrentQty, bo.getCurrentQty());
|
||||
lqw.eq(bo.getCurrentRate() != null, CtrContractProgressSettlementItem::getCurrentRate, bo.getCurrentRate());
|
||||
lqw.eq(bo.getCurrentAmount() != null, CtrContractProgressSettlementItem::getCurrentAmount, bo.getCurrentAmount());
|
||||
lqw.eq(bo.getCurrentNoAmount() != null, CtrContractProgressSettlementItem::getCurrentNoAmount, bo.getCurrentNoAmount());
|
||||
lqw.eq(bo.getCurrentApprovedQty() != null, CtrContractProgressSettlementItem::getCurrentApprovedQty, bo.getCurrentApprovedQty());
|
||||
lqw.eq(bo.getCurrentApprovedAmount() != null, CtrContractProgressSettlementItem::getCurrentApprovedAmount, bo.getCurrentApprovedAmount());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTaxRate()), CtrContractProgressSettlementItem::getTaxRate, bo.getTaxRate());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增承包合同进度结算清单
|
||||
*
|
||||
* @param bo 承包合同进度结算清单
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(CtrContractProgressSettlementItemBo bo) {
|
||||
CtrContractProgressSettlementItem add = MapstructUtils.convert(bo, CtrContractProgressSettlementItem.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setId(add.getId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改承包合同进度结算清单
|
||||
*
|
||||
* @param bo 承包合同进度结算清单
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(CtrContractProgressSettlementItemBo bo) {
|
||||
CtrContractProgressSettlementItem update = MapstructUtils.convert(bo, CtrContractProgressSettlementItem.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(CtrContractProgressSettlementItem entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除承包合同进度结算清单信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,353 @@
|
||||
package org.dromara.ctr.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.ObjectUtils;
|
||||
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.ctr.domain.CtrContractProgressSettlement;
|
||||
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
|
||||
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementBo;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementItemCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementItemUpdateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementUpdateReq;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementTotalVo;
|
||||
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
|
||||
import org.dromara.ctr.mapper.CtrContractProgressSettlementMapper;
|
||||
import org.dromara.ctr.service.ICtrContractProgressSettlementItemService;
|
||||
import org.dromara.ctr.service.ICtrContractProgressSettlementService;
|
||||
import org.dromara.system.domain.vo.SysDeptVo;
|
||||
import org.dromara.system.service.ISysDeptService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 承包合同进度结算Service业务层处理
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class CtrContractProgressSettlementServiceImpl extends ServiceImpl<CtrContractProgressSettlementMapper, CtrContractProgressSettlement>
|
||||
implements ICtrContractProgressSettlementService {
|
||||
|
||||
private final ICtrContractProgressSettlementItemService contractProgressSettlementItemService;
|
||||
|
||||
private final ISysDeptService deptService;
|
||||
|
||||
/**
|
||||
* 查询承包合同进度结算
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 承包合同进度结算
|
||||
*/
|
||||
@Override
|
||||
public CtrContractProgressSettlementVo queryById(Long id) {
|
||||
CtrContractProgressSettlementVo vo = baseMapper.selectVoById(id);
|
||||
List<CtrContractProgressSettlementItem> list = contractProgressSettlementItemService.lambdaQuery()
|
||||
.eq(CtrContractProgressSettlementItem::getSettlementId, id)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
List<CtrContractProgressSettlementItemVo> listVo = list.stream().map(item ->
|
||||
MapstructUtils.convert(item, CtrContractProgressSettlementItemVo.class))
|
||||
.toList();
|
||||
Map<String, List<CtrContractProgressSettlementItemVo>> map = listVo.stream()
|
||||
.collect(Collectors.groupingBy(CtrContractProgressSettlementItemVo::getType));
|
||||
vo.setInInventory(map.getOrDefault("1", new ArrayList<>()));
|
||||
vo.setChangeInventory(map.getOrDefault("2", new ArrayList<>()));
|
||||
vo.setOutInventory(map.getOrDefault("3", new ArrayList<>()));
|
||||
}
|
||||
return vo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询承包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 承包合同进度结算分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<CtrContractProgressSettlementVo> queryPageList(CtrContractProgressSettlementBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = buildQueryWrapper(bo);
|
||||
Page<CtrContractProgressSettlementVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的承包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 承包合同进度结算列表
|
||||
*/
|
||||
@Override
|
||||
public List<CtrContractProgressSettlementVo> queryList(CtrContractProgressSettlementBo bo) {
|
||||
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询金额统计
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 金额统计
|
||||
*/
|
||||
@Override
|
||||
public CtrContractProgressSettlementTotalVo queryMoneyTotal(CtrContractProgressSettlementBo bo) {
|
||||
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = Wrappers.lambdaQuery();
|
||||
Long deptId = bo.getDeptId();
|
||||
String type = bo.getType();
|
||||
if (ObjectUtils.isNotEmpty(deptId) && StringUtils.isNotBlank(type) && !LoginHelper.isSuperAdmin()) {
|
||||
SysDeptVo sysDeptVo = deptService.selectDeptById(deptId);
|
||||
List<Long> list = StringUtils.splitTo(sysDeptVo.getAncestors(), Convert::toLong);
|
||||
if (list.size() == 2 && Objects.equals(type, "1")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getDeptId, deptId);
|
||||
} else if (list.size() == 2 && Objects.equals(type, "2")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, deptId);
|
||||
} else if (list.size() > 2 && Objects.equals(type, "1")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getDeptId, list.get(2));
|
||||
} else if (list.size() > 2 && Objects.equals(type, "2")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, list.get(2));
|
||||
}
|
||||
}
|
||||
List<CtrContractProgressSettlement> settlementList = this.list(lqw);
|
||||
CtrContractProgressSettlementTotalVo vo = new CtrContractProgressSettlementTotalVo();
|
||||
if (CollUtil.isEmpty(settlementList)) {
|
||||
return vo;
|
||||
}
|
||||
if (Objects.equals(type, "1")) {
|
||||
vo.setMoneyTotal(settlementList.stream().map(CtrContractProgressSettlement::getSettlementMoney)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
} else if (Objects.equals(type, "2")) {
|
||||
vo.setMoneyTotal(settlementList.stream().map(CtrContractProgressSettlement::getDeductionMoney)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add));
|
||||
}
|
||||
return vo;
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<CtrContractProgressSettlement> buildQueryWrapper(CtrContractProgressSettlementBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(CtrContractProgressSettlement::getId);
|
||||
Long deptId = bo.getDeptId();
|
||||
String type = bo.getType();
|
||||
if (ObjectUtils.isNotEmpty(deptId) && StringUtils.isNotBlank(type) && !LoginHelper.isSuperAdmin()) {
|
||||
SysDeptVo sysDeptVo = deptService.selectDeptById(deptId);
|
||||
List<Long> list = StringUtils.splitTo(sysDeptVo.getAncestors(), Convert::toLong);
|
||||
if (list.size() == 2 && Objects.equals(type, "1")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getDeptId, deptId);
|
||||
} else if (list.size() == 2 && Objects.equals(type, "2")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, deptId);
|
||||
} else if (list.size() > 2 && Objects.equals(type, "1")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getDeptId, list.get(2));
|
||||
} else if (list.size() > 2 && Objects.equals(type, "2")) {
|
||||
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, list.get(2));
|
||||
}
|
||||
}
|
||||
lqw.like(StringUtils.isNotBlank(bo.getDocumentCode()), CtrContractProgressSettlement::getDocumentCode, bo.getDocumentCode());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTitle()), CtrContractProgressSettlement::getTitle, bo.getTitle());
|
||||
lqw.eq(bo.getSettlementDate() != null, CtrContractProgressSettlement::getSettlementDate, bo.getSettlementDate());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContractCode()), CtrContractProgressSettlement::getContractCode, bo.getContractCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getContractName()), CtrContractProgressSettlement::getContractName, bo.getContractName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContractProgress()), CtrContractProgressSettlement::getContractProgress, bo.getContractProgress());
|
||||
lqw.eq(bo.getProjectId() != null, CtrContractProgressSettlement::getProjectId, bo.getProjectId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), CtrContractProgressSettlement::getProjectName, bo.getProjectName());
|
||||
lqw.eq(bo.getApprovalAmount() != null, CtrContractProgressSettlement::getApprovalAmount, bo.getApprovalAmount());
|
||||
lqw.eq(bo.getMeasureDateBegin() != null, CtrContractProgressSettlement::getMeasureDateBegin, bo.getMeasureDateBegin());
|
||||
lqw.eq(bo.getMeasureDateEnd() != null, CtrContractProgressSettlement::getMeasureDateEnd, bo.getMeasureDateEnd());
|
||||
lqw.eq(bo.getSettlementUnit() != null, CtrContractProgressSettlement::getSettlementUnit, bo.getSettlementUnit());
|
||||
lqw.eq(bo.getSettlementMoney() != null, CtrContractProgressSettlement::getSettlementMoney, bo.getSettlementMoney());
|
||||
lqw.eq(bo.getDeductionMoney() != null, CtrContractProgressSettlement::getDeductionMoney, bo.getDeductionMoney());
|
||||
lqw.eq(bo.getBonus() != null, CtrContractProgressSettlement::getBonus, bo.getBonus());
|
||||
lqw.eq(bo.getContractAmount() != null, CtrContractProgressSettlement::getContractAmount, bo.getContractAmount());
|
||||
lqw.eq(bo.getThisSettlementRatio() != null, CtrContractProgressSettlement::getThisSettlementRatio, bo.getThisSettlementRatio());
|
||||
lqw.eq(bo.getPaymentTerms() != null, CtrContractProgressSettlement::getPaymentTerms, bo.getPaymentTerms());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), CtrContractProgressSettlement::getFileId, bo.getFileId());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增承包合同进度结算
|
||||
*
|
||||
* @param req 承包合同进度结算
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean insertByBo(CtrContractProgressSettlementCreateReq req) {
|
||||
CtrContractProgressSettlement add = MapstructUtils.convert(req, CtrContractProgressSettlement.class);
|
||||
if (Objects.equals(req.getDeptId(), req.getSettlementUnit())) {
|
||||
throw new ServiceException("结算单位不能与收款单位相同");
|
||||
}
|
||||
// 生成唯一编号
|
||||
LocalDate today = LocalDate.now();
|
||||
Long userId = LoginHelper.getUserId();
|
||||
boolean flag;
|
||||
synchronized (userId.toString().intern()) {
|
||||
LocalDateTime startOfDay = today.atStartOfDay();
|
||||
LocalDateTime endOfDay = today.plusDays(1).atStartOfDay().minusNanos(1);
|
||||
// 获取当天的最大编号
|
||||
Long count = this.lambdaQuery()
|
||||
.between(CtrContractProgressSettlement::getCreateTime, startOfDay, endOfDay)
|
||||
.count();
|
||||
String result = String.format("%03d", count + 1); // 3表示长度,0表示补0
|
||||
add.setDocumentCode(today.format(DateTimeFormatter.BASIC_ISO_DATE) + "-" + result);
|
||||
validEntityBeforeSave(add);
|
||||
flag = baseMapper.insert(add) > 0;
|
||||
}
|
||||
if (flag) {
|
||||
Long id = add.getId();
|
||||
List<CtrContractProgressSettlementItemCreateReq> inInventory = req.getInInventory();
|
||||
List<CtrContractProgressSettlementItemCreateReq> changeInventory = req.getChangeInventory();
|
||||
List<CtrContractProgressSettlementItemCreateReq> outInventory = req.getOutInventory();
|
||||
List<CtrContractProgressSettlementItem> itemList = new ArrayList<>();
|
||||
itemList.addAll(inInventory.stream().map(r -> {
|
||||
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("1");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(changeInventory.stream().map(r -> {
|
||||
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("2");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(outInventory.stream().map(r -> {
|
||||
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("3");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
if (CollUtil.isNotEmpty(itemList)) {
|
||||
boolean saveBatch = contractProgressSettlementItemService.saveBatch(itemList);
|
||||
if (!saveBatch) {
|
||||
throw new ServiceException("保存承包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改承包合同进度结算
|
||||
*
|
||||
* @param req 承包合同进度结算
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean updateByBo(CtrContractProgressSettlementUpdateReq req) {
|
||||
CtrContractProgressSettlement update = MapstructUtils.convert(req, CtrContractProgressSettlement.class);
|
||||
validEntityBeforeSave(update);
|
||||
if (Objects.equals(req.getDeptId(), req.getSettlementUnit())) {
|
||||
throw new ServiceException("结算单位不能与收款单位相同");
|
||||
}
|
||||
Long id = req.getId();
|
||||
// 删除旧数据
|
||||
List<CtrContractProgressSettlementItem> oldList = contractProgressSettlementItemService.lambdaQuery()
|
||||
.eq(CtrContractProgressSettlementItem::getSettlementId, id)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(oldList)) {
|
||||
boolean deleteBatch = contractProgressSettlementItemService.removeByIds(oldList);
|
||||
if (!deleteBatch) {
|
||||
throw new ServiceException("删除承包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
// 新增子数据
|
||||
List<CtrContractProgressSettlementItemUpdateReq> inInventory = req.getInInventory();
|
||||
List<CtrContractProgressSettlementItemUpdateReq> changeInventory = req.getChangeInventory();
|
||||
List<CtrContractProgressSettlementItemUpdateReq> outInventory = req.getOutInventory();
|
||||
List<CtrContractProgressSettlementItem> itemList = new ArrayList<>();
|
||||
itemList.addAll(inInventory.stream().map(r -> {
|
||||
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("1");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(changeInventory.stream().map(r -> {
|
||||
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("2");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(outInventory.stream().map(r -> {
|
||||
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("3");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
if (CollUtil.isNotEmpty(itemList)) {
|
||||
boolean saveBatch = contractProgressSettlementItemService.saveBatch(itemList);
|
||||
if (!saveBatch) {
|
||||
throw new ServiceException("保存承包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
// 保存主数据
|
||||
boolean b = baseMapper.updateById(update) > 0;
|
||||
if (!b) {
|
||||
throw new ServiceException("修改承包合同进度结算失败");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(CtrContractProgressSettlement entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除承包合同进度结算信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
// 删除关联数据
|
||||
List<CtrContractProgressSettlementItem> list = contractProgressSettlementItemService.lambdaQuery()
|
||||
.in(CtrContractProgressSettlementItem::getSettlementId, ids)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
boolean deleteBatch = contractProgressSettlementItemService.removeByIds(list);
|
||||
if (!deleteBatch) {
|
||||
throw new ServiceException("删除承包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,150 @@
|
||||
package org.dromara.ctr.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 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.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementItemBo;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.mapper.CtrSubcontractProgressSettlementItemMapper;
|
||||
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementItemService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算清单Service业务层处理
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class CtrSubcontractProgressSettlementItemServiceImpl extends ServiceImpl<CtrSubcontractProgressSettlementItemMapper, CtrSubcontractProgressSettlementItem>
|
||||
implements ICtrSubcontractProgressSettlementItemService {
|
||||
|
||||
private final CtrSubcontractProgressSettlementItemMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询分包合同进度结算清单
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 分包合同进度结算清单
|
||||
*/
|
||||
@Override
|
||||
public CtrSubcontractProgressSettlementItemVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询分包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 分包合同进度结算清单分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<CtrSubcontractProgressSettlementItemVo> queryPageList(CtrSubcontractProgressSettlementItemBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> lqw = buildQueryWrapper(bo);
|
||||
Page<CtrSubcontractProgressSettlementItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的分包合同进度结算清单列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 分包合同进度结算清单列表
|
||||
*/
|
||||
@Override
|
||||
public List<CtrSubcontractProgressSettlementItemVo> queryList(CtrSubcontractProgressSettlementItemBo bo) {
|
||||
LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> buildQueryWrapper(CtrSubcontractProgressSettlementItemBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(CtrSubcontractProgressSettlementItem::getId);
|
||||
lqw.eq(bo.getSettlementId() != null, CtrSubcontractProgressSettlementItem::getSettlementId, bo.getSettlementId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getType()), CtrSubcontractProgressSettlementItem::getType, bo.getType());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCode()), CtrSubcontractProgressSettlementItem::getCode, bo.getCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getName()), CtrSubcontractProgressSettlementItem::getName, bo.getName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getUnit()), CtrSubcontractProgressSettlementItem::getUnit, bo.getUnit());
|
||||
lqw.eq(bo.getUnitPrice() != null, CtrSubcontractProgressSettlementItem::getUnitPrice, bo.getUnitPrice());
|
||||
lqw.eq(bo.getTaxUnitPrice() != null, CtrSubcontractProgressSettlementItem::getTaxUnitPrice, bo.getTaxUnitPrice());
|
||||
lqw.eq(bo.getCurrentQty() != null, CtrSubcontractProgressSettlementItem::getCurrentQty, bo.getCurrentQty());
|
||||
lqw.eq(bo.getCurrentRate() != null, CtrSubcontractProgressSettlementItem::getCurrentRate, bo.getCurrentRate());
|
||||
lqw.eq(bo.getCurrentAmount() != null, CtrSubcontractProgressSettlementItem::getCurrentAmount, bo.getCurrentAmount());
|
||||
lqw.eq(bo.getCurrentNoAmount() != null, CtrSubcontractProgressSettlementItem::getCurrentNoAmount, bo.getCurrentNoAmount());
|
||||
lqw.eq(bo.getCurrentApprovedQty() != null, CtrSubcontractProgressSettlementItem::getCurrentApprovedQty, bo.getCurrentApprovedQty());
|
||||
lqw.eq(bo.getCurrentApprovedAmount() != null, CtrSubcontractProgressSettlementItem::getCurrentApprovedAmount, bo.getCurrentApprovedAmount());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTaxRate()), CtrSubcontractProgressSettlementItem::getTaxRate, bo.getTaxRate());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTax()), CtrSubcontractProgressSettlementItem::getTax, bo.getTax());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getWbs()), CtrSubcontractProgressSettlementItem::getWbs, bo.getWbs());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCbs()), CtrSubcontractProgressSettlementItem::getCbs, bo.getCbs());
|
||||
lqw.eq(bo.getCbsBudgetTotal() != null, CtrSubcontractProgressSettlementItem::getCbsBudgetTotal, bo.getCbsBudgetTotal());
|
||||
lqw.eq(bo.getCbsBalance() != null, CtrSubcontractProgressSettlementItem::getCbsBalance, bo.getCbsBalance());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增分包合同进度结算清单
|
||||
*
|
||||
* @param bo 分包合同进度结算清单
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(CtrSubcontractProgressSettlementItemBo bo) {
|
||||
CtrSubcontractProgressSettlementItem add = MapstructUtils.convert(bo, CtrSubcontractProgressSettlementItem.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setId(add.getId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改分包合同进度结算清单
|
||||
*
|
||||
* @param bo 分包合同进度结算清单
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(CtrSubcontractProgressSettlementItemBo bo) {
|
||||
CtrSubcontractProgressSettlementItem update = MapstructUtils.convert(bo, CtrSubcontractProgressSettlementItem.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(CtrSubcontractProgressSettlementItem entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除分包合同进度结算清单信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,280 @@
|
||||
package org.dromara.ctr.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
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 org.dromara.common.core.exception.ServiceException;
|
||||
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.ctr.domain.CtrSubcontractProgressSettlement;
|
||||
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
|
||||
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementBo;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementItemCreateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementItemUpdateReq;
|
||||
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementUpdateReq;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
|
||||
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
|
||||
import org.dromara.ctr.mapper.CtrSubcontractProgressSettlementMapper;
|
||||
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementItemService;
|
||||
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 分包合同进度结算Service业务层处理
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-10-18
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class CtrSubcontractProgressSettlementServiceImpl extends ServiceImpl<CtrSubcontractProgressSettlementMapper, CtrSubcontractProgressSettlement>
|
||||
implements ICtrSubcontractProgressSettlementService {
|
||||
|
||||
private final ICtrSubcontractProgressSettlementItemService subcontractProgressSettlementItemService;
|
||||
|
||||
/**
|
||||
* 查询分包合同进度结算
|
||||
*
|
||||
* @param id 主键
|
||||
* @return 分包合同进度结算
|
||||
*/
|
||||
@Override
|
||||
public CtrSubcontractProgressSettlementVo queryById(Long id) {
|
||||
CtrSubcontractProgressSettlementVo vo = baseMapper.selectVoById(id);
|
||||
List<CtrSubcontractProgressSettlementItem> list = subcontractProgressSettlementItemService.lambdaQuery()
|
||||
.eq(CtrSubcontractProgressSettlementItem::getSettlementId, id)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
List<CtrSubcontractProgressSettlementItemVo> listVo = list.stream().map(item ->
|
||||
MapstructUtils.convert(item, CtrSubcontractProgressSettlementItemVo.class))
|
||||
.toList();
|
||||
Map<String, List<CtrSubcontractProgressSettlementItemVo>> map = listVo.stream()
|
||||
.collect(Collectors.groupingBy(CtrSubcontractProgressSettlementItemVo::getType));
|
||||
vo.setInInventory(map.getOrDefault("1", new ArrayList<>()));
|
||||
vo.setChangeInventory(map.getOrDefault("2", new ArrayList<>()));
|
||||
vo.setOutInventory(map.getOrDefault("3", new ArrayList<>()));
|
||||
}
|
||||
return vo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询分包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @param pageQuery 分页参数
|
||||
* @return 分包合同进度结算分页列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<CtrSubcontractProgressSettlementVo> queryPageList(CtrSubcontractProgressSettlementBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<CtrSubcontractProgressSettlement> lqw = buildQueryWrapper(bo);
|
||||
Page<CtrSubcontractProgressSettlementVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询符合条件的分包合同进度结算列表
|
||||
*
|
||||
* @param bo 查询条件
|
||||
* @return 分包合同进度结算列表
|
||||
*/
|
||||
@Override
|
||||
public List<CtrSubcontractProgressSettlementVo> queryList(CtrSubcontractProgressSettlementBo bo) {
|
||||
LambdaQueryWrapper<CtrSubcontractProgressSettlement> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<CtrSubcontractProgressSettlement> buildQueryWrapper(CtrSubcontractProgressSettlementBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CtrSubcontractProgressSettlement> lqw = Wrappers.lambdaQuery();
|
||||
lqw.orderByDesc(CtrSubcontractProgressSettlement::getId);
|
||||
lqw.like(StringUtils.isNotBlank(bo.getDocumentCode()), CtrSubcontractProgressSettlement::getDocumentCode, bo.getDocumentCode());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTitle()), CtrSubcontractProgressSettlement::getTitle, bo.getTitle());
|
||||
lqw.eq(bo.getDocumentDate() != null, CtrSubcontractProgressSettlement::getDocumentDate, bo.getDocumentDate());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContractCode()), CtrSubcontractProgressSettlement::getContractCode, bo.getContractCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getContractName()), CtrSubcontractProgressSettlement::getContractName, bo.getContractName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContractProgress()), CtrSubcontractProgressSettlement::getContractProgress, bo.getContractProgress());
|
||||
lqw.eq(bo.getMeasureDateBegin() != null, CtrSubcontractProgressSettlement::getMeasureDateBegin, bo.getMeasureDateBegin());
|
||||
lqw.eq(bo.getMeasureDateEnd() != null, CtrSubcontractProgressSettlement::getMeasureDateEnd, bo.getMeasureDateEnd());
|
||||
lqw.eq(bo.getProjectId() != null, CtrSubcontractProgressSettlement::getProjectId, bo.getProjectId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), CtrSubcontractProgressSettlement::getProjectName, bo.getProjectName());
|
||||
lqw.eq(bo.getApprovalAmount() != null, CtrSubcontractProgressSettlement::getApprovalAmount, bo.getApprovalAmount());
|
||||
lqw.eq(bo.getSettlementUnit() != null, CtrSubcontractProgressSettlement::getSettlementUnit, bo.getSettlementUnit());
|
||||
lqw.eq(bo.getContractAmount() != null, CtrSubcontractProgressSettlement::getContractAmount, bo.getContractAmount());
|
||||
lqw.eq(bo.getCurrentSettlementRate() != null, CtrSubcontractProgressSettlement::getCurrentSettlementRate, bo.getCurrentSettlementRate());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), CtrSubcontractProgressSettlement::getFileId, bo.getFileId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), CtrSubcontractProgressSettlement::getAuditStatus, bo.getAuditStatus());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增分包合同进度结算
|
||||
*
|
||||
* @param req 分包合同进度结算
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(CtrSubcontractProgressSettlementCreateReq req) {
|
||||
CtrSubcontractProgressSettlement add = MapstructUtils.convert(req, CtrSubcontractProgressSettlement.class);
|
||||
// 生成唯一编号
|
||||
LocalDate today = LocalDate.now();
|
||||
Long userId = LoginHelper.getUserId();
|
||||
boolean flag;
|
||||
synchronized (userId.toString().intern()) {
|
||||
LocalDateTime startOfDay = today.atStartOfDay();
|
||||
LocalDateTime endOfDay = today.plusDays(1).atStartOfDay().minusNanos(1);
|
||||
// 获取当天的最大编号
|
||||
Long count = this.lambdaQuery()
|
||||
.between(CtrSubcontractProgressSettlement::getCreateTime, startOfDay, endOfDay)
|
||||
.count();
|
||||
String result = String.format("%03d", count + 1); // 3表示长度,0表示补0
|
||||
add.setDocumentCode(today.format(DateTimeFormatter.BASIC_ISO_DATE) + "-" + result);
|
||||
validEntityBeforeSave(add);
|
||||
flag = baseMapper.insert(add) > 0;
|
||||
}
|
||||
if (flag) {
|
||||
Long id = add.getId();
|
||||
List<CtrSubcontractProgressSettlementItemCreateReq> inInventory = req.getInInventory();
|
||||
List<CtrSubcontractProgressSettlementItemCreateReq> changeInventory = req.getChangeInventory();
|
||||
List<CtrSubcontractProgressSettlementItemCreateReq> outInventory = req.getOutInventory();
|
||||
List<CtrSubcontractProgressSettlementItem> itemList = new ArrayList<>();
|
||||
itemList.addAll(inInventory.stream().map(r -> {
|
||||
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("1");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(changeInventory.stream().map(r -> {
|
||||
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("2");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(outInventory.stream().map(r -> {
|
||||
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("3");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
if (CollUtil.isNotEmpty(itemList)) {
|
||||
boolean saveBatch = subcontractProgressSettlementItemService.saveBatch(itemList);
|
||||
if (!saveBatch) {
|
||||
throw new ServiceException("保存分包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改分包合同进度结算
|
||||
*
|
||||
* @param req 分包合同进度结算
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(CtrSubcontractProgressSettlementUpdateReq req) {
|
||||
CtrSubcontractProgressSettlement update = MapstructUtils.convert(req, CtrSubcontractProgressSettlement.class);
|
||||
validEntityBeforeSave(update);
|
||||
Long id = req.getId();
|
||||
// 删除旧数据
|
||||
List<CtrSubcontractProgressSettlementItem> oldList = subcontractProgressSettlementItemService.lambdaQuery()
|
||||
.eq(CtrSubcontractProgressSettlementItem::getSettlementId, id)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(oldList)) {
|
||||
boolean deleteBatch = subcontractProgressSettlementItemService.removeByIds(oldList);
|
||||
if (!deleteBatch) {
|
||||
throw new ServiceException("删除分包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
// 新增子数据
|
||||
List<CtrSubcontractProgressSettlementItemUpdateReq> inInventory = req.getInInventory();
|
||||
List<CtrSubcontractProgressSettlementItemUpdateReq> changeInventory = req.getChangeInventory();
|
||||
List<CtrSubcontractProgressSettlementItemUpdateReq> outInventory = req.getOutInventory();
|
||||
List<CtrSubcontractProgressSettlementItem> itemList = new ArrayList<>();
|
||||
itemList.addAll(inInventory.stream().map(r -> {
|
||||
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("1");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(changeInventory.stream().map(r -> {
|
||||
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("2");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
itemList.addAll(outInventory.stream().map(r -> {
|
||||
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
|
||||
item.setSettlementId(id);
|
||||
item.setType("3");
|
||||
BeanUtils.copyProperties(r, item);
|
||||
return item;
|
||||
}).toList());
|
||||
if (CollUtil.isNotEmpty(itemList)) {
|
||||
boolean saveBatch = subcontractProgressSettlementItemService.saveBatch(itemList);
|
||||
if (!saveBatch) {
|
||||
throw new ServiceException("保存承包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
// 保存主数据
|
||||
boolean b = baseMapper.updateById(update) > 0;
|
||||
if (!b) {
|
||||
throw new ServiceException("修改分包合同进度结算失败");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(CtrSubcontractProgressSettlement entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验并批量删除分包合同进度结算信息
|
||||
*
|
||||
* @param ids 待删除的主键集合
|
||||
* @param isValid 是否进行有效性校验
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
// 删除关联数据
|
||||
List<CtrSubcontractProgressSettlementItem> list = subcontractProgressSettlementItemService.lambdaQuery()
|
||||
.in(CtrSubcontractProgressSettlementItem::getSettlementId, ids)
|
||||
.list();
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
boolean deleteBatch = subcontractProgressSettlementItemService.removeByIds(list);
|
||||
if (!deleteBatch) {
|
||||
throw new ServiceException("删除分包合同进度结算明细失败");
|
||||
}
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@ -1,8 +1,15 @@
|
||||
package org.dromara.design.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.ExcelWriter;
|
||||
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
|
||||
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.poi.ss.usermodel.IndexedColors;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
@ -10,17 +17,17 @@ import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.design.domain.bo.ImportExcelFileReq;
|
||||
import org.dromara.design.domain.bo.ObtainAllVersionNumbersReq;
|
||||
import org.dromara.design.domain.bo.CoryObtainTheListReq;
|
||||
import org.dromara.design.domain.bo.SheetListReq;
|
||||
import org.dromara.design.domain.bo.*;
|
||||
import org.dromara.design.domain.vo.*;
|
||||
import org.dromara.design.exportUtil.bill.*;
|
||||
import org.dromara.design.service.IBusBillofquantitiesVersionsService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 工程量清单版本
|
||||
@ -103,6 +110,74 @@ public class BusBillofquantitiesVersionsController extends BaseController {
|
||||
return R.ok(busBillofquantitiesVersionsService.obtainAllClassification(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出工程量清单版本列表
|
||||
*/
|
||||
@Log(title = "工程量清单版本", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(String versions,Long projectId, HttpServletResponse response) throws IOException {
|
||||
Map<String, List<BillOfQuantitiesExport>> sheetDataMap = busBillofquantitiesVersionsService.export(versions,projectId);
|
||||
|
||||
if (sheetDataMap.isEmpty()) {
|
||||
response.getWriter().write("无数据可导出");
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 设置响应头(同上)
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
String fileName = URLEncoder.encode( "工程量清单", "UTF-8").replaceAll("\\+", "%20");
|
||||
response.setHeader("Content-disposition", "attachment;filename*=UTF-8''" + fileName + ".xlsx");
|
||||
|
||||
// 3. 构建Excel写入器
|
||||
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
|
||||
try {
|
||||
// 4. 遍历每个Sheet分组,创建Sheet并写入数据
|
||||
for (Map.Entry<String, List<BillOfQuantitiesExport>> entry : sheetDataMap.entrySet()) {
|
||||
String sheetName = entry.getKey();
|
||||
List<BillOfQuantitiesExport> dataList = entry.getValue();
|
||||
|
||||
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
||||
// 背景设置为红色
|
||||
headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
|
||||
|
||||
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
|
||||
new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle());
|
||||
|
||||
// 定义Sheet(同时注册标题处理器和冻结窗格处理器)
|
||||
WriteSheet writeSheet = EasyExcel.writerSheet(sheetName)
|
||||
.registerWriteHandler(new FreezePaneWriteHandler()) // 冻结前2行
|
||||
.registerWriteHandler(new ColumnWidthWriteHandler()) // 调整列宽
|
||||
.registerWriteHandler(new CustomRowStyleHandler()) // 新增:边框和标题样式
|
||||
.registerWriteHandler(horizontalCellStyleStrategy)
|
||||
.head(head(sheetName))
|
||||
.build();
|
||||
|
||||
// 写入数据
|
||||
excelWriter.write(dataList, writeSheet);
|
||||
}
|
||||
} finally {
|
||||
excelWriter.finish();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private List<List<String>> head(String sheetName) {
|
||||
List<List<String>> list = new ArrayList<List<String>>();
|
||||
List<String> list1 = Arrays.asList(sheetName,"编号");
|
||||
List<String> list2 = Arrays.asList(sheetName, "名称");
|
||||
List<String> list3 = Arrays.asList(sheetName, "规格");
|
||||
List<String> list4 = Arrays.asList(sheetName, "单位");
|
||||
List<String> list5 = Arrays.asList(sheetName, "数量");
|
||||
List<String> list6 = Arrays.asList(sheetName, "备注");
|
||||
list.add(list1);
|
||||
list.add(list2);
|
||||
list.add(list3);
|
||||
list.add(list4);
|
||||
list.add(list5);
|
||||
list.add(list6);
|
||||
return list;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * 导入物资设备清单
|
||||
|
||||
@ -1,17 +1,40 @@
|
||||
package org.dromara.design.controller;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.deepoove.poi.XWPFTemplate;
|
||||
import com.deepoove.poi.config.Configure;
|
||||
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.design.domain.BusDrawingreviewReceipts;
|
||||
import org.dromara.design.domain.DesCollectFile;
|
||||
import org.dromara.design.domain.DesDesignChange;
|
||||
import org.dromara.design.domain.bo.DesUserBo;
|
||||
import org.dromara.design.domain.dto.designchange.DesDesignExtendDetailDto;
|
||||
import org.dromara.design.domain.vo.DesCollectFileWordVo;
|
||||
import org.dromara.design.domain.vo.DesUserVo;
|
||||
import org.dromara.design.domain.vo.designchange.DesDesignChangeVo;
|
||||
import org.dromara.design.service.IDesDesignChangeService;
|
||||
import org.dromara.design.service.IDesUserService;
|
||||
import org.dromara.project.domain.BusProject;
|
||||
import org.dromara.project.domain.vo.project.BusSubProjectVo;
|
||||
import org.dromara.project.service.IBusProjectService;
|
||||
import org.dromara.system.service.ISysDictDataService;
|
||||
import org.dromara.system.service.ISysUserService;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -44,6 +67,12 @@ public class BusDrawingreviewReceiptsController extends BaseController {
|
||||
|
||||
private final IDesUserService desUserService;
|
||||
|
||||
private final IDesDesignChangeService desDesignChangeService;
|
||||
|
||||
private final ISysDictDataService dictDataService;
|
||||
|
||||
private final ISysUserService userService;
|
||||
|
||||
/**
|
||||
* 查询设计-图纸评审验证列表
|
||||
*/
|
||||
@ -132,4 +161,85 @@ public class BusDrawingreviewReceiptsController extends BaseController {
|
||||
return R.ok(desUserService.queryList(bo));
|
||||
}
|
||||
|
||||
|
||||
private static final String TEMPLATE_PATH = "template/设计验证表.docx";
|
||||
@PostMapping("/downloadWord")
|
||||
public void generateDesignLeaderDoc(Long id, HttpServletResponse response) {
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
// 1. 调用Service生成目标模板的Word字节流
|
||||
byte[] docBytes = generateDocBytes(id);
|
||||
|
||||
// 2. 配置响应头:确保前端正确下载(避免中文乱码、指定文件类型)
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // 二进制流类型
|
||||
// 下载文件名:格式为“[项目名]-设计负责人任命通知单.docx”(此处用projectId拼接,真实场景可从数据中获取项目名)
|
||||
String downloadFileName = URLEncoder.encode(
|
||||
"设计验证表.docx",
|
||||
"UTF-8"
|
||||
);
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
|
||||
response.setContentLength(docBytes.length); // 设置响应体长度(优化下载体验)
|
||||
|
||||
// 3. 将Word字节流写入响应
|
||||
outputStream = response.getOutputStream();
|
||||
outputStream.write(docBytes);
|
||||
outputStream.flush();
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
// 异常处理:返回500错误状态码
|
||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
} finally {
|
||||
// 关闭流,避免资源泄漏
|
||||
if (outputStream != null) {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] generateDocBytes(Long id) throws Exception {
|
||||
// -------------------------- 步骤1:按projectId查询项目数据(模拟真实业务) --------------------------
|
||||
// 实际场景替换为数据库查询(如调用DAO获取项目名称、负责人等)
|
||||
DesDesignChangeVo desDesignChangeVo = desDesignChangeService.queryById(id);
|
||||
BusDrawingreviewReceipts receipts = busDrawingreviewReceiptsService.lambdaQuery()
|
||||
.eq(BusDrawingreviewReceipts::getDrawingreviewId, id)
|
||||
.last("limit 1")
|
||||
.one();
|
||||
DesDesignExtendDetailDto extendDetail = desDesignChangeVo.getExtendDetail();
|
||||
String s = dictDataService.selectDictLabel("des_user_major", receipts.getProfessional());
|
||||
String designerName = null;
|
||||
if(StrUtil.isNotBlank(receipts.getDesigner())){
|
||||
Long userId = Long.parseLong(receipts.getDesigner());
|
||||
designerName= userService.queryNameById(userId);
|
||||
}
|
||||
|
||||
Map<String, Object> placeholderData = new HashMap<>();
|
||||
placeholderData.put("projectName", receipts.getProjectName());
|
||||
placeholderData.put("subName",extendDetail.getSubName());
|
||||
placeholderData.put("stage", receipts.getStage());
|
||||
placeholderData.put("professionalName", s);
|
||||
placeholderData.put("volume", receipts.getVolume());
|
||||
placeholderData.put("designerName", designerName);
|
||||
placeholderData.put("verificationOpinion", receipts.getVerificationOpinion());
|
||||
placeholderData.put("executionOpinion", receipts.getExecutionOpinion());
|
||||
// -------------------------- 步骤2:用poi-tl加载目标模板并替换占位符 --------------------------
|
||||
// 读取resources下的“设计项目负责人任命通知单.docx”模板
|
||||
ClassPathResource templateResource = new ClassPathResource(TEMPLATE_PATH);
|
||||
try (InputStream templateIs = templateResource.getInputStream();
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||
|
||||
XWPFTemplate template = XWPFTemplate.compile(templateIs).render(placeholderData);
|
||||
|
||||
// -------------------------- 步骤3:将生成的文档写入字节流 --------------------------
|
||||
template.write(outputStream);
|
||||
template.close(); // 关闭模板资源
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,14 +1,31 @@
|
||||
package org.dromara.design.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.deepoove.poi.XWPFTemplate;
|
||||
import com.deepoove.poi.config.Configure;
|
||||
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.design.domain.DesCollectFile;
|
||||
import org.dromara.design.domain.bo.DesCollectFileBo;
|
||||
import org.dromara.design.domain.dto.ExportDto;
|
||||
import org.dromara.design.domain.dto.designchange.DesDesignExtendDetailDto;
|
||||
import org.dromara.design.domain.vo.DesCollectFileVo;
|
||||
import org.dromara.design.domain.vo.DesCollectFileWordVo;
|
||||
import org.dromara.design.domain.vo.designchange.DesDesignChangeVo;
|
||||
import org.dromara.design.service.IDesCollectFileService;
|
||||
import org.dromara.project.domain.BusProject;
|
||||
import org.dromara.project.service.IBusProjectService;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -38,6 +55,8 @@ public class DesCollectFileController extends BaseController {
|
||||
|
||||
private final IDesCollectFileService desCollectFileService;
|
||||
|
||||
private final IBusProjectService projectService;
|
||||
|
||||
/**
|
||||
* 查询收资文件列表
|
||||
*/
|
||||
@ -105,7 +124,6 @@ public class DesCollectFileController extends BaseController {
|
||||
return toAjax(desCollectFileService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 上传资料文件
|
||||
*/
|
||||
@ -117,4 +135,93 @@ public class DesCollectFileController extends BaseController {
|
||||
@NotNull(message = "请先选择项目")Long projectId) {
|
||||
return toAjax(desCollectFileService.addFile(file, catalogueId, projectId));
|
||||
}
|
||||
|
||||
@PostMapping("/exportZip")
|
||||
public void exportZip(ExportDto dto, HttpServletResponse response) throws Exception {
|
||||
desCollectFileService.exportAsZip(dto, response);
|
||||
}
|
||||
|
||||
private static final String TEMPLATE_PATH = "template/设计输入资料清单及评审表.docx";
|
||||
@PostMapping("/downloadWord")
|
||||
public void generateDesignLeaderDoc(Long projectId, HttpServletResponse response) {
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
// 1. 调用Service生成目标模板的Word字节流
|
||||
byte[] docBytes = generateDocBytes(projectId);
|
||||
|
||||
// 2. 配置响应头:确保前端正确下载(避免中文乱码、指定文件类型)
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // 二进制流类型
|
||||
// 下载文件名:格式为“[项目名]-设计负责人任命通知单.docx”(此处用projectId拼接,真实场景可从数据中获取项目名)
|
||||
String downloadFileName = URLEncoder.encode(
|
||||
"设计输入资料清单及评审表.docx",
|
||||
"UTF-8"
|
||||
);
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
|
||||
response.setContentLength(docBytes.length); // 设置响应体长度(优化下载体验)
|
||||
|
||||
// 3. 将Word字节流写入响应
|
||||
outputStream = response.getOutputStream();
|
||||
outputStream.write(docBytes);
|
||||
outputStream.flush();
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
// 异常处理:返回500错误状态码
|
||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
} finally {
|
||||
// 关闭流,避免资源泄漏
|
||||
if (outputStream != null) {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] generateDocBytes(Long projectId) throws Exception {
|
||||
// -------------------------- 步骤1:按projectId查询项目数据(模拟真实业务) --------------------------
|
||||
// 实际场景替换为数据库查询(如调用DAO获取项目名称、负责人等)
|
||||
List<DesCollectFile> list = desCollectFileService.lambdaQuery()
|
||||
.eq(DesCollectFile::getProjectId, projectId).list();
|
||||
|
||||
List<DesCollectFileWordVo> files = new ArrayList<>();
|
||||
int i = 1;
|
||||
for (DesCollectFile desCollectFile : list) {
|
||||
DesCollectFileWordVo desCollectFileWordVo = new DesCollectFileWordVo();
|
||||
desCollectFileWordVo.setNum(i);
|
||||
i++;
|
||||
desCollectFileWordVo.setFileName(desCollectFile.getFileName());
|
||||
files.add(desCollectFileWordVo);
|
||||
}
|
||||
|
||||
BusProject project = projectService.getById(projectId);
|
||||
|
||||
|
||||
Map<String, Object> placeholderData = new HashMap<>();
|
||||
placeholderData.put("projectName", project.getProjectName());
|
||||
placeholderData.put("files",files);
|
||||
// -------------------------- 步骤2:用poi-tl加载目标模板并替换占位符 --------------------------
|
||||
// 读取resources下的“设计项目负责人任命通知单.docx”模板
|
||||
ClassPathResource templateResource = new ClassPathResource(TEMPLATE_PATH);
|
||||
try (InputStream templateIs = templateResource.getInputStream();
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||
|
||||
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
|
||||
|
||||
Configure config = Configure.builder()
|
||||
.bind("files", policy).build();
|
||||
|
||||
XWPFTemplate template = XWPFTemplate.compile(templateIs, config).render(placeholderData);
|
||||
|
||||
// -------------------------- 步骤3:将生成的文档写入字节流 --------------------------
|
||||
template.write(outputStream);
|
||||
template.close(); // 关闭模板资源
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,342 @@
|
||||
package org.dromara.design.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
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;
|
||||
|
||||
import org.apache.poi.xwpf.usermodel.*;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.design.domain.DesConstructionSchedulePlan;
|
||||
import org.dromara.design.domain.DesUser;
|
||||
import org.dromara.design.domain.dto.constructionscheduleplan.*;
|
||||
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
|
||||
import org.dromara.design.exportUtil.plan.AttachmentPersonnel;
|
||||
import org.dromara.design.service.IDesConstructionSchedulePlanService;
|
||||
|
||||
|
||||
import org.dromara.design.service.IDesUserService;
|
||||
import org.dromara.system.domain.vo.SysDictDataVo;
|
||||
import org.dromara.system.service.ISysDictDataService;
|
||||
import org.dromara.system.service.ISysDictTypeService;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
/**
|
||||
* 设计计划
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-08-01
|
||||
*/
|
||||
@Validated
|
||||
@RestController
|
||||
@RequestMapping("/design/constructionSchedulePlan")
|
||||
public class DesConstructionSchedulePlanController extends BaseController {
|
||||
|
||||
@Resource
|
||||
private IDesConstructionSchedulePlanService desConstructionSchedulePlanService;
|
||||
@Resource
|
||||
private IDesUserService desUserService;
|
||||
@Resource
|
||||
private ISysDictTypeService dictTypeService;
|
||||
/**
|
||||
* 查询设计计划列表
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:list")
|
||||
@GetMapping("/list")
|
||||
public R<List<DesConstructionSchedulePlanVo>> list(DesConstructionSchedulePlanQueryReq req) {
|
||||
List<DesConstructionSchedulePlanVo> list = desConstructionSchedulePlanService.queryList(req);
|
||||
return R.ok(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出设计计划列表
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:export")
|
||||
@Log(title = "施工进度计划", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(DesConstructionSchedulePlanQueryReq req, HttpServletResponse response) {
|
||||
List<DesConstructionSchedulePlanVo> list = desConstructionSchedulePlanService.queryList(req);
|
||||
ExcelUtil.exportExcel(list, "施工进度计划", DesConstructionSchedulePlanVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据项目id导出设计计划模版
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:exportTemplate")
|
||||
@Log(title = "施工进度计划", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/exportTemplate/{projectId}")
|
||||
public void exportExcelByProjectId(@NotNull(message = "项目id不能为空")
|
||||
@PathVariable Long projectId, HttpServletResponse response) {
|
||||
desConstructionSchedulePlanService.exportExcelByProjectId(projectId, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取设计计划模版
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:readTemplate")
|
||||
@Log(title = "施工进度计划", businessType = BusinessType.IMPORT)
|
||||
@PostMapping("/readTemplate")
|
||||
public R<Void> readExcel(@RequestParam("file") MultipartFile file, Long projectId) {
|
||||
List<DesConstructionSchedulePlanExcelDto> list = desConstructionSchedulePlanService.readExcel(file, projectId);
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
List<DesConstructionSchedulePlan> planList = desConstructionSchedulePlanService.convertToEntities(list);
|
||||
return toAjax(desConstructionSchedulePlanService.saveBatch(planList));
|
||||
}
|
||||
return toAjax(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取设计计划详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<DesConstructionSchedulePlanVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long id) {
|
||||
return R.ok(desConstructionSchedulePlanService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增设计计划
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:add")
|
||||
@Log(title = "施工进度计划", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<DesConstructionSchedulePlanVo> add(@Validated @RequestBody DesConstructionSchedulePlanCreateReq req) {
|
||||
return R.ok(desConstructionSchedulePlanService.insertByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改设计计划
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:edit")
|
||||
@Log(title = "施工进度计划", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated @RequestBody DesConstructionSchedulePlanUpdateReq req) {
|
||||
return toAjax(desConstructionSchedulePlanService.updateByBo(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改设计计划为完成状态
|
||||
*
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:editFinish")
|
||||
@Log(title = "施工进度计划", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/finish")
|
||||
public R<Void> editFinish(@Validated @RequestBody DesConstructionSchedulePlanFinishReq req) {
|
||||
return toAjax(desConstructionSchedulePlanService.updateFinish(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除设计计划
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("design:constructionSchedulePlan:remove")
|
||||
@Log(title = "施工进度计划", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] ids) {
|
||||
return toAjax(desConstructionSchedulePlanService.deleteByIds(List.of(ids)));
|
||||
}
|
||||
|
||||
@PostMapping("/exportSchedule")
|
||||
public void exportSchedule(HttpServletResponse response, Long projectId) throws IOException {
|
||||
desConstructionSchedulePlanService.exportSchedule(response,projectId);
|
||||
}
|
||||
|
||||
private static final String TEMPLATE_RESOURCE_PATH = "template/CCCET-JL-CX-25设计计划表.docx";
|
||||
// -------------------------- 2. 核心接口:修复单元格清空逻辑与数据填充 --------------------------
|
||||
@PostMapping("/downloadWord")
|
||||
public void fillCccetTemplate(Long projectId, HttpServletResponse response) {
|
||||
// 1. 基础参数校验(避免空数据)
|
||||
|
||||
// 2. 读取resource中的模板+填充数据
|
||||
try (
|
||||
// 关键:通过ClassPathResource读取resource/template下的模板
|
||||
InputStream templateIs = new ClassPathResource(TEMPLATE_RESOURCE_PATH).getInputStream();
|
||||
XWPFDocument doc = new XWPFDocument(templateIs); // 加载模板
|
||||
OutputStream out = response.getOutputStream() // 响应流
|
||||
) {
|
||||
// --------------------------
|
||||
// 步骤1:填充第1页-主信息表(索引0,固定6列)
|
||||
// --------------------------
|
||||
// XWPFTable mainTable = doc.getTables().get(0);
|
||||
// // 工程名称(第1行第0列)
|
||||
// if (mainTable.getRows().size() > 1 && mainTable.getRow(1).getCell(0) != null) {
|
||||
// mainTable.getRow(1).getCell(0).setText(request.getProjectName() == null ? "" : request.getProjectName());
|
||||
// }
|
||||
// // 工程号(第1行第1列)
|
||||
// if (mainTable.getRows().size() > 1 && mainTable.getRow(1).getCell(1) != null) {
|
||||
// mainTable.getRow(1).getCell(1).setText(request.getProjectNo());
|
||||
// }
|
||||
// // 编制日期(第2行第3列)
|
||||
// if (mainTable.getRows().size() > 2 && mainTable.getRow(2).getCell(3) != null) {
|
||||
// mainTable.getRow(2).getCell(3).setText(request.getCompileDate() == null ? "" : request.getCompileDate());
|
||||
// }
|
||||
// // 编制人(第3行第0列)
|
||||
// if (mainTable.getRows().size() > 3 && mainTable.getRow(3).getCell(0) != null) {
|
||||
// mainTable.getRow(3).getCell(0).setText(request.getCompiler() == null ? "" : request.getCompiler());
|
||||
// }
|
||||
// // 批准人(第3行第2列)
|
||||
// if (mainTable.getRows().size() > 3 && mainTable.getRow(3).getCell(2) != null) {
|
||||
// mainTable.getRow(3).getCell(2).setText(request.getApprover() == null ? "" : request.getApprover());
|
||||
// }
|
||||
// // 设计阶段(第3行第4列)
|
||||
// if (mainTable.getRows().size() > 3 && mainTable.getRow(3).getCell(4) != null) {
|
||||
// mainTable.getRow(3).getCell(4).setText(request.getDesignStage() == null ? "" : request.getDesignStage());
|
||||
// }
|
||||
// // 设计规模(第4行第0列)
|
||||
// if (mainTable.getRows().size() > 4 && mainTable.getRow(4).getCell(0) != null) {
|
||||
// mainTable.getRow(4).getCell(0).setText(request.getDesignScale() == null ? "" : request.getDesignScale());
|
||||
// }
|
||||
|
||||
// --------------------------
|
||||
// 步骤2:填充第3页-附件1人员配置表(索引2,固定11列)
|
||||
// --------------------------
|
||||
XWPFTable staffTable = doc.getTables().get(2);
|
||||
// 删除模板中附件1的空数据行(保留第0行表头)
|
||||
while (staffTable.getRows().size() > 2) {
|
||||
staffTable.removeRow(1);
|
||||
}
|
||||
|
||||
List<AttachmentPersonnel> list = getPersonnelDataByProjectId(projectId);
|
||||
for (AttachmentPersonnel staff : list) {
|
||||
XWPFTableRow newRow = staffTable.createRow();
|
||||
// 补全11列(避免POI默认列数不足导致null)
|
||||
while (newRow.getTableCells().size() < 11) {
|
||||
newRow.createCell();
|
||||
}
|
||||
// 按附件1列顺序填充
|
||||
newRow.getCell(0).setText(staff.getProfessional() == null ? "" : staff.getProfessional());
|
||||
newRow.getCell(1).setText(staff.getLeaderName() == null ? "" : staff.getLeaderName());
|
||||
newRow.getCell(2).setText(staff.getLeaderTitle() == null ? "" : staff.getLeaderTitle());
|
||||
newRow.getCell(3).setText(staff.getDesignerName() == null ? "" : staff.getDesignerName());
|
||||
newRow.getCell(4).setText(staff.getDesignerTitle() == null ? "" : staff.getDesignerTitle());
|
||||
newRow.getCell(5).setText(staff.getReviewerName() == null ? "" : staff.getReviewerName());
|
||||
newRow.getCell(6).setText(staff.getReviewerTitle() == null ? "" : staff.getReviewerTitle());
|
||||
newRow.getCell(7).setText(staff.getCheckerName() == null ? "" : staff.getCheckerName());
|
||||
newRow.getCell(8).setText(staff.getCheckerTitle() == null ? "" : staff.getCheckerTitle());
|
||||
newRow.getCell(9).setText(staff.getApproverName() == null ? "" : staff.getApproverName());
|
||||
newRow.getCell(10).setText(staff.getApproverTitle() == null ? "" : staff.getApproverTitle());
|
||||
}
|
||||
|
||||
// --------------------------
|
||||
// 步骤3:设置响应头(触发前端下载)
|
||||
// --------------------------
|
||||
response.setContentType("application/octet-stream");
|
||||
// 文件名:填充后_工程号_CCCET-JL-CX-25设计计划表.docx
|
||||
String fileName = "CCCET-JL-CX-25设计计划表.docx";
|
||||
response.setHeader("Content-Disposition",
|
||||
"attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
|
||||
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); // 允许前端获取文件名
|
||||
|
||||
// --------------------------
|
||||
// 步骤4:写出文件到前端
|
||||
// --------------------------
|
||||
doc.write(out);
|
||||
out.flush();
|
||||
|
||||
} catch (Exception e) {
|
||||
// 异常封装(前端可捕获具体错误)
|
||||
throw new RuntimeException("CCCET-JL-CX-25模板填充失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 根据projectId获取数据(仅针对CCCET-JL-CX-25设计计划表.docx附件1)
|
||||
*/
|
||||
private List<AttachmentPersonnel> getPersonnelDataByProjectId(Long projectId) {
|
||||
// 模拟数据库查询(实际项目替换为真实Service调用)
|
||||
List<DesUser> userList = desUserService.list(Wrappers.<DesUser>lambdaQuery()
|
||||
.eq(DesUser::getProjectId, projectId)
|
||||
);
|
||||
if (userList.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 专业字典映射(编码→名称)
|
||||
List<SysDictDataVo> majorDict = dictTypeService.selectDictDataByType("des_user_major");
|
||||
Map<String, String> majorMap = majorDict.stream()
|
||||
.collect(Collectors.toMap(SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel));
|
||||
|
||||
// 按角色分组(1-专业负责人,2-设计人,3-校审人,4-审定人,5-审核人)
|
||||
DesUser leader = userList.stream().filter(u -> "1".equals(u.getUserType())).findFirst().orElse(null);
|
||||
Map<String, List<DesUser>> designerMap = userList.stream()
|
||||
.filter(u -> "2".equals(u.getUserType()))
|
||||
.collect(Collectors.groupingBy(DesUser::getUserMajor));
|
||||
Map<String, List<DesUser>> reviewerMap = userList.stream()
|
||||
.filter(u -> "3".equals(u.getUserType()))
|
||||
.collect(Collectors.groupingBy(DesUser::getUserMajor));
|
||||
Map<String, List<DesUser>> checkerMap = userList.stream()
|
||||
.filter(u -> "5".equals(u.getUserType()))
|
||||
.collect(Collectors.groupingBy(DesUser::getUserMajor));
|
||||
Map<String, List<DesUser>> approverMap = userList.stream()
|
||||
.filter(u -> "4".equals(u.getUserType()))
|
||||
.collect(Collectors.groupingBy(DesUser::getUserMajor));
|
||||
|
||||
// 构建附件1数据(一个专业一行,避免重复)
|
||||
List<AttachmentPersonnel> dataList = new ArrayList<>();
|
||||
for (Map.Entry<String, List<DesUser>> entry : designerMap.entrySet()) {
|
||||
String majorCode = entry.getKey();
|
||||
String majorName = majorMap.getOrDefault(majorCode, majorCode);
|
||||
List<DesUser> designers = entry.getValue();
|
||||
|
||||
// 获取对应专业的其他角色
|
||||
DesUser reviewer = reviewerMap.getOrDefault(majorCode, Collections.emptyList()).stream().findFirst().orElse(null);
|
||||
DesUser checker = checkerMap.getOrDefault(majorCode, Collections.emptyList()).stream().findFirst().orElse(null);
|
||||
DesUser approver = approverMap.getOrDefault(majorCode, Collections.emptyList()).stream().findFirst().orElse(null);
|
||||
// 封装数据(多个设计人用顿号分隔)
|
||||
AttachmentPersonnel data = new AttachmentPersonnel();
|
||||
data.setProfessional(majorName);
|
||||
data.setLeaderName(leader != null ? leader.getUserName() : "");
|
||||
//data.setLeadeTitle(leader != null ? leader.getUserTitle() : "");
|
||||
data.setDesignerName(designers.stream().map(DesUser::getUserName).collect(Collectors.joining("、")));
|
||||
//data.setDesignerTitle(designers.stream().map(DesUser::getUserTitle).collect(Collectors.joining("、")));
|
||||
data.setReviewerName(reviewer != null ? reviewer.getUserName() : "");
|
||||
//data.setReviewerTitle(reviewer != null ? reviewer.getUserTitle() : "");
|
||||
data.setCheckerName(checker != null ? checker.getUserName() : "");
|
||||
//data.setCheckerTitle(checker != null ? checker.getUserTitle() : "");
|
||||
data.setApproverName(approver != null ? approver.getUserName() : "");
|
||||
//data.setApproverTitle(approver != null ? approver.getUserTitle() : "");
|
||||
|
||||
dataList.add(data);
|
||||
}
|
||||
|
||||
return dataList;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -2,6 +2,7 @@ package org.dromara.design.controller;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.deepoove.poi.XWPFTemplate;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotEmpty;
|
||||
@ -16,24 +17,36 @@ import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.web.core.BaseController;
|
||||
import org.dromara.design.domain.DesUser;
|
||||
import org.dromara.design.domain.DesVolumeCatalog;
|
||||
import org.dromara.design.domain.DesVolumeFile;
|
||||
import org.dromara.design.domain.dto.designchange.DesDesignChangeCreateReq;
|
||||
import org.dromara.design.domain.dto.designchange.DesDesignChangeQueryReq;
|
||||
import org.dromara.design.domain.dto.designchange.DesDesignChangeUpdateReq;
|
||||
import org.dromara.design.domain.dto.designchange.DesDesignExtendDetailDto;
|
||||
import org.dromara.design.domain.dto.volumecatalog.DesVolumeCatalogQueryReq;
|
||||
import org.dromara.design.domain.vo.designchange.DesDesignChangeVo;
|
||||
import org.dromara.design.domain.vo.volumecatalog.DesVolumeCatalogVo;
|
||||
import org.dromara.design.service.IDesDesignChangeService;
|
||||
import org.dromara.design.service.IDesVolumeCatalogService;
|
||||
import org.dromara.design.service.IDesVolumeFileService;
|
||||
import org.dromara.project.domain.BusProject;
|
||||
import org.dromara.system.domain.vo.SysOssVo;
|
||||
import org.dromara.system.service.ISysDictDataService;
|
||||
import org.dromara.system.service.ISysOssService;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -56,6 +69,9 @@ public class DesDesignChangeController extends BaseController {
|
||||
@Resource
|
||||
private IDesVolumeFileService desVolumeFileService;
|
||||
|
||||
@Resource
|
||||
private ISysDictDataService dictDataService;
|
||||
|
||||
/**
|
||||
* 查询设计变更管理列表
|
||||
*/
|
||||
@ -146,4 +162,92 @@ public class DesDesignChangeController extends BaseController {
|
||||
return R.ok(list);
|
||||
}
|
||||
|
||||
private static final String TEMPLATE_PATH = "template/设计更改通知单.docx";
|
||||
|
||||
@PostMapping("/downloadWord")
|
||||
public void generateDesignLeaderDoc(Long id, HttpServletResponse response) {
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
// 1. 调用Service生成目标模板的Word字节流
|
||||
byte[] docBytes = generateDocBytes(id);
|
||||
|
||||
// 2. 配置响应头:确保前端正确下载(避免中文乱码、指定文件类型)
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // 二进制流类型
|
||||
// 下载文件名:格式为“[项目名]-设计负责人任命通知单.docx”(此处用projectId拼接,真实场景可从数据中获取项目名)
|
||||
String downloadFileName = URLEncoder.encode(
|
||||
"设计更改通知单.docx",
|
||||
"UTF-8"
|
||||
);
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
|
||||
response.setContentLength(docBytes.length); // 设置响应体长度(优化下载体验)
|
||||
|
||||
// 3. 将Word字节流写入响应
|
||||
outputStream = response.getOutputStream();
|
||||
outputStream.write(docBytes);
|
||||
outputStream.flush();
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
// 异常处理:返回500错误状态码
|
||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
} finally {
|
||||
// 关闭流,避免资源泄漏
|
||||
if (outputStream != null) {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] generateDocBytes(Long id) throws Exception {
|
||||
// -------------------------- 步骤1:按projectId查询项目数据(模拟真实业务) --------------------------
|
||||
// 实际场景替换为数据库查询(如调用DAO获取项目名称、负责人等)
|
||||
DesDesignChangeVo vo = desDesignChangeService.queryById(id);
|
||||
DesDesignExtendDetailDto extendDetail = vo.getExtendDetail()==null?new DesDesignExtendDetailDto():vo.getExtendDetail();
|
||||
|
||||
Map<String, Object> placeholderData = new HashMap<>();
|
||||
placeholderData.put("projectName", vo.getProjectName());
|
||||
placeholderData.put("designPhase",extendDetail.getDesignPhase());
|
||||
placeholderData.put("subName",extendDetail.getSubName());
|
||||
String s = dictDataService.selectDictLabel("des_user_major", vo.getSpecialty());
|
||||
placeholderData.put("specialty",s);
|
||||
placeholderData.put("volumeNo",vo.getVolumeNo());
|
||||
|
||||
String changeReason = vo.getChangeReason();
|
||||
List<String> reasons = Arrays.asList("设计漏项", "设计改进", "设计差错", "接口差错",
|
||||
"业主要求", "施工承包商要求", "外部资料与最终情况不符", "材料代用或其他");
|
||||
|
||||
String reason = reasons.stream()
|
||||
.map(item -> changeReason.contains(String.valueOf(reasons.indexOf(item) + 1)) ? " ☑" + item : " □" + item)
|
||||
.collect(Collectors.joining());
|
||||
|
||||
placeholderData.put("changeReason", reason);
|
||||
placeholderData.put("designDisposal1", "1".equals(extendDetail.getDesignDisposal())?"☑" : "□");
|
||||
placeholderData.put("designDisposal2", "2".equals(extendDetail.getDesignDisposal())?"☑" : "□");
|
||||
placeholderData.put("designDisposal3", "3".equals(extendDetail.getDesignDisposal())?"☑" : "□");
|
||||
placeholderData.put("changeContent",vo.getChangeContent());
|
||||
placeholderData.put("changeCategory1", "1".equals(extendDetail.getChangeCategory())?"☑" : "□");
|
||||
placeholderData.put("changeCategory2", "2".equals(extendDetail.getChangeCategory())?"☑" : "□");
|
||||
placeholderData.put("involvingProfessions", extendDetail.getInvolvingProfessions());
|
||||
// -------------------------- 步骤2:用poi-tl加载目标模板并替换占位符 --------------------------
|
||||
// 读取resources下的“设计项目负责人任命通知单.docx”模板
|
||||
ClassPathResource templateResource = new ClassPathResource(TEMPLATE_PATH);
|
||||
try (InputStream templateIs = templateResource.getInputStream();
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||
|
||||
// 1. 加载模板 2. 注入替换数据 3. 渲染生成新文档
|
||||
XWPFTemplate template = XWPFTemplate.compile(templateIs)
|
||||
.render(placeholderData); // 自动匹配{{变量名}}占位符
|
||||
|
||||
// -------------------------- 步骤3:将生成的文档写入字节流 --------------------------
|
||||
template.write(outputStream);
|
||||
template.close(); // 关闭模板资源
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -129,6 +129,7 @@ public class DesExtractController extends BaseController {
|
||||
@SaCheckPermission("design:extract:userMajor")
|
||||
@GetMapping("/userMajor")
|
||||
public R<List<DesUserVo>> selectUserMajor(DesUserBo bo) {
|
||||
bo.setUserType("1");
|
||||
return R.ok( deUserService.queryList(bo));
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.design.domain.dto.ExportDto;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -128,4 +129,9 @@ public class DesPrelimSchemeController extends BaseController {
|
||||
return toAjax(desPrelimSchemeService.updateFile(file, projectId,id));
|
||||
}
|
||||
|
||||
@PostMapping("/exportZipWithStatus")
|
||||
public void exportZipWithStatus(ExportDto dto, HttpServletResponse response) throws Exception {
|
||||
desPrelimSchemeService.exportAsZipWithStatusPrefix(dto, response);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.design.domain.dto.ExportDto;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -126,4 +127,10 @@ public class DesSchemeController extends BaseController {
|
||||
public R<Void> updateFile(MultipartFile file, Long projectId, @NotNull(message = "主键不能为空")@PathVariable Long id) {
|
||||
return toAjax(desSchemeService.updateFile(file, projectId,id));
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/exportZipWithStatus")
|
||||
public void exportZipWithStatus(ExportDto dto, HttpServletResponse response) throws Exception {
|
||||
desSchemeService.exportAsZipWithStatusPrefix(dto, response);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,16 +1,18 @@
|
||||
package org.dromara.design.controller;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URLEncoder;
|
||||
import java.rmi.ServerException;
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZoneId;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.deepoove.poi.XWPFTemplate;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
@ -22,8 +24,15 @@ import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
//import org.dromara.design.domain.DesUserExcelData;
|
||||
import org.dromara.design.domain.DesUser;
|
||||
import org.dromara.design.domain.DesUserExcelData;
|
||||
import org.dromara.design.domain.dto.desUser.DesUserBatchDto;
|
||||
import org.dromara.project.domain.BusProject;
|
||||
import org.dromara.project.service.IBusProjectService;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -54,6 +63,7 @@ import org.springframework.web.multipart.MultipartFile;
|
||||
public class DesUserController extends BaseController {
|
||||
|
||||
private final IDesUserService desUserService;
|
||||
private final IBusProjectService projectService;
|
||||
|
||||
/**
|
||||
* 查询设计人员列表
|
||||
@ -142,5 +152,75 @@ public class DesUserController extends BaseController {
|
||||
return toAjax(desUserService.batchAddOrUpdate(dto));
|
||||
}
|
||||
|
||||
private static final String TEMPLATE_PATH = "template/设计项目负责人任命通知单.docx";
|
||||
|
||||
@PostMapping("/downloadWord")
|
||||
public void generateDesignLeaderDoc( Long projectId,
|
||||
HttpServletResponse response
|
||||
) {
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
// 1. 调用Service生成目标模板的Word字节流
|
||||
byte[] docBytes = generateDocBytes(projectId);
|
||||
|
||||
// 2. 配置响应头:确保前端正确下载(避免中文乱码、指定文件类型)
|
||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // 二进制流类型
|
||||
// 下载文件名:格式为“[项目名]-设计负责人任命通知单.docx”(此处用projectId拼接,真实场景可从数据中获取项目名)
|
||||
String downloadFileName = URLEncoder.encode(
|
||||
"设计负责人任命通知单.docx",
|
||||
"UTF-8"
|
||||
);
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
|
||||
response.setContentLength(docBytes.length); // 设置响应体长度(优化下载体验)
|
||||
|
||||
// 3. 将Word字节流写入响应
|
||||
outputStream = response.getOutputStream();
|
||||
outputStream.write(docBytes);
|
||||
outputStream.flush();
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
// 异常处理:返回500错误状态码
|
||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
} finally {
|
||||
// 关闭流,避免资源泄漏
|
||||
if (outputStream != null) {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] generateDocBytes(Long projectId) throws Exception {
|
||||
// -------------------------- 步骤1:按projectId查询项目数据(模拟真实业务) --------------------------
|
||||
// 实际场景替换为数据库查询(如调用DAO获取项目名称、负责人等)
|
||||
BusProject byId = projectService.getById(projectId);
|
||||
DesUser desUser = desUserService.lambdaQuery().eq(DesUser::getProjectId, projectId)
|
||||
.eq(DesUser::getUserType, "1")
|
||||
.last("limit 1").one();
|
||||
|
||||
|
||||
Map<String, Object> placeholderData = new HashMap<>();
|
||||
placeholderData.put("projectName", byId==null?"" :byId.getProjectName());
|
||||
placeholderData.put("leaderName",desUser==null?"": desUser.getUserName());
|
||||
|
||||
// -------------------------- 步骤2:用poi-tl加载目标模板并替换占位符 --------------------------
|
||||
// 读取resources下的“设计项目负责人任命通知单.docx”模板
|
||||
ClassPathResource templateResource = new ClassPathResource(TEMPLATE_PATH);
|
||||
try (InputStream templateIs = templateResource.getInputStream();
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||
|
||||
// 1. 加载模板 2. 注入替换数据 3. 渲染生成新文档
|
||||
XWPFTemplate template = XWPFTemplate.compile(templateIs)
|
||||
.render(placeholderData); // 自动匹配{{变量名}}占位符
|
||||
|
||||
// -------------------------- 步骤3:将生成的文档写入字节流 --------------------------
|
||||
template.write(outputStream);
|
||||
template.close(); // 关闭模板资源
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,87 @@
|
||||
package org.dromara.design.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 施工进度计划对象 pgs_construction_schedule_plan
|
||||
*
|
||||
* @author lilemy
|
||||
* @date 2025-08-01
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("des_construction_schedule_plan")
|
||||
public class DesConstructionSchedulePlan extends BaseEntity {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 主键ID
|
||||
*/
|
||||
@TableId(value = "id")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 父ID
|
||||
*/
|
||||
private Long parentId;
|
||||
|
||||
/**
|
||||
* 节点名称
|
||||
*/
|
||||
private String nodeName;
|
||||
|
||||
/**
|
||||
* 对应项目结构
|
||||
*/
|
||||
private Long projectStructure;
|
||||
|
||||
/**
|
||||
* 对应项目结构名称
|
||||
*/
|
||||
private String projectStructureName;
|
||||
|
||||
/**
|
||||
* 预计开始时间
|
||||
*/
|
||||
private LocalDate planStartDate;
|
||||
|
||||
/**
|
||||
* 预计结束时间
|
||||
*/
|
||||
private LocalDate planEndDate;
|
||||
|
||||
/**
|
||||
* 实际开始时间
|
||||
*/
|
||||
private LocalDate practicalStartDate;
|
||||
|
||||
/**
|
||||
* 实际结束时间
|
||||
*/
|
||||
private LocalDate practicalEndDate;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
package org.dromara.design.domain.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ExportDto {
|
||||
private Long projectId;
|
||||
private List<Long> ids;
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
package org.dromara.design.domain.dto.constructionscheduleplan;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* @author lilemy
|
||||
* @date 2025-08-01 14:05
|
||||
*/
|
||||
@Data
|
||||
public class DesConstructionSchedulePlanCreateReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 4060838737379600701L;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
@NotNull(message = "项目ID不能为空")
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 父ID
|
||||
*/
|
||||
private Long parentId;
|
||||
|
||||
/**
|
||||
* 节点名称
|
||||
*/
|
||||
@NotBlank(message = "节点名称不能为空")
|
||||
private String nodeName;
|
||||
|
||||
/**
|
||||
* 对应项目结构
|
||||
*/
|
||||
private Long projectStructure;
|
||||
|
||||
/**
|
||||
* 对应项目结构名称
|
||||
*/
|
||||
private String projectStructureName;
|
||||
|
||||
/**
|
||||
* 预计开始时间
|
||||
*/
|
||||
private LocalDate planStartDate;
|
||||
|
||||
/**
|
||||
* 预计结束时间
|
||||
*/
|
||||
private LocalDate planEndDate;
|
||||
|
||||
/**
|
||||
* 实际开始时间
|
||||
*/
|
||||
private LocalDate practicalStartDate;
|
||||
|
||||
/**
|
||||
* 实际结束时间
|
||||
*/
|
||||
private LocalDate practicalEndDate;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user