Compare commits
113 Commits
201f7bd3a7
...
prod
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| 98f23e2c02 | |||
| b9507e1fd7 | |||
| 1ceef7f1d1 | |||
| 0fb3fd70a6 | |||
| aab0a5e0b8 | |||
| f9d1a7a489 | |||
| 87e58ca4af | |||
| d6263c6430 | |||
| 253ef81066 | |||
| 2f4bec42a3 | |||
| 3879ce28b6 | |||
| 691b5341c7 | |||
| 4a50dc6ff0 | |||
| d7e4c65afb | |||
| 61b39d89de | |||
| 2497527c77 | |||
| 79f74434f7 | |||
| bd0fe7228b | |||
| 66b45df3fb | |||
| 38d6832f2c | |||
| 8e51d67071 | |||
| 942ca4202a | |||
| 255a202c02 | |||
| 1033ee01fb |
@ -92,7 +92,7 @@ public class SysRegisterService {
|
|||||||
// if (!isValid) {
|
// if (!isValid) {
|
||||||
// throw new UserException("注册失败,密码需满足8–18位,包含大小写字母、数字、特殊字符中的至少三种组合");
|
// throw new UserException("注册失败,密码需满足8–18位,包含大小写字母、数字、特殊字符中的至少三种组合");
|
||||||
// }
|
// }
|
||||||
// 验证码开关
|
|
||||||
SysUserBo sysUser = new SysUserBo();
|
SysUserBo sysUser = new SysUserBo();
|
||||||
sysUser.setUserName(username);
|
sysUser.setUserName(username);
|
||||||
sysUser.setNickName(username);
|
sysUser.setNickName(username);
|
||||||
@ -101,16 +101,24 @@ public class SysRegisterService {
|
|||||||
sysUser.setUserType(userType);
|
sysUser.setUserType(userType);
|
||||||
sysUser.setEmail(registerBody.getEmail());
|
sysUser.setEmail(registerBody.getEmail());
|
||||||
|
|
||||||
boolean exist = TenantHelper.dynamic(tenantId, () -> {
|
SysUser sysUserByPhonenumber = userMapper.selectDefFlagUser(username);
|
||||||
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
if(sysUserByPhonenumber != null){
|
||||||
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
|
sysUser.setUserId(sysUserByPhonenumber.getUserId());
|
||||||
});
|
userMapper.updateDefFlag(sysUser);
|
||||||
if (exist) {
|
userMapper.updateConstructionUser(sysUserByPhonenumber.getUserId());
|
||||||
throw new UserException("user.register.save.error", username);
|
}else {
|
||||||
}
|
|
||||||
boolean regFlag = userService.registerUser(sysUser, tenantId);
|
boolean exist = TenantHelper.dynamic(tenantId, () -> {
|
||||||
if (!regFlag) {
|
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
|
||||||
throw new UserException("user.register.error");
|
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
|
||||||
|
});
|
||||||
|
if (exist) {
|
||||||
|
throw new UserException("user.register.save.error", username);
|
||||||
|
}
|
||||||
|
boolean regFlag = userService.registerUser(sysUser, tenantId);
|
||||||
|
if (!regFlag) {
|
||||||
|
throw new UserException("user.register.error");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
|
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
|
||||||
|
|||||||
@ -52,6 +52,9 @@ spring:
|
|||||||
url: jdbc:mysql://192.168.110.2:13386/xinnengyuandev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
url: jdbc:mysql://192.168.110.2:13386/xinnengyuandev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||||
username: xinnengyuandev
|
username: xinnengyuandev
|
||||||
password: StRWCZdZirysNSs2
|
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:
|
slave:
|
||||||
lazy: true
|
lazy: true
|
||||||
@ -71,9 +74,16 @@ spring:
|
|||||||
lazy: true
|
lazy: true
|
||||||
type: ${spring.datasource.type}
|
type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgdev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgdev
|
username: zmkgc
|
||||||
password: JhYxREf25AXdy3h8
|
password: nWKDKRNRT48tFBdh
|
||||||
|
# slave:
|
||||||
|
# lazy: true
|
||||||
|
# type: ${spring.datasource.type}
|
||||||
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
|
# username: zmkgprod
|
||||||
|
# password: MaY8nehwWkJriWPm
|
||||||
# oracle:
|
# oracle:
|
||||||
# type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
# driverClassName: oracle.jdbc.OracleDriver
|
# driverClassName: oracle.jdbc.OracleDriver
|
||||||
@ -116,7 +126,7 @@ spring.data:
|
|||||||
# 端口,默认为6379
|
# 端口,默认为6379
|
||||||
port: 9287
|
port: 9287
|
||||||
# 数据库索引
|
# 数据库索引
|
||||||
database: 10
|
database: 16
|
||||||
# redis 密码必须配置
|
# redis 密码必须配置
|
||||||
password: syar23rdsaagdrsa
|
password: syar23rdsaagdrsa
|
||||||
# 连接超时时间
|
# 连接超时时间
|
||||||
@ -175,7 +185,7 @@ sms:
|
|||||||
# 配置源类型用于标定配置来源(interface,yaml)
|
# 配置源类型用于标定配置来源(interface,yaml)
|
||||||
config-type: yaml
|
config-type: yaml
|
||||||
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
||||||
restricted: true
|
restricted: false
|
||||||
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
||||||
minute-max: 1
|
minute-max: 1
|
||||||
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
||||||
@ -324,6 +334,7 @@ ys7:
|
|||||||
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
|
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
|
||||||
job:
|
job:
|
||||||
capture-enabled: false # 控制是否启用萤石抓拍任务
|
capture-enabled: false # 控制是否启用萤石抓拍任务
|
||||||
|
device-sync-enabled: false # 控制是否同步萤石设备
|
||||||
#ys7:
|
#ys7:
|
||||||
# app-key: 081b0d6d5f7f4de8bc5c7fa350fb26ec
|
# app-key: 081b0d6d5f7f4de8bc5c7fa350fb26ec
|
||||||
# app-secret: caa37b9f60ef02deb57e563bc190e6db
|
# app-secret: caa37b9f60ef02deb57e563bc190e6db
|
||||||
|
|||||||
@ -55,21 +55,21 @@ spring:
|
|||||||
url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: xinnengyuan
|
username: xinnengyuan
|
||||||
password: mEZPC5Sdf3r2HENi
|
password: mEZPC5Sdf3r2HENi
|
||||||
# 从库数据源
|
# # 从库数据源
|
||||||
slave:
|
# slave:
|
||||||
lazy: true
|
# lazy: true
|
||||||
type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgc
|
# username: zmkgc
|
||||||
password: nWKDKRNRT48tFBdh
|
# password: nWKDKRNRT48tFBdh
|
||||||
slave1:
|
# slave1:
|
||||||
lazy: true
|
# lazy: true
|
||||||
type: ${spring.datasource.type}
|
# type: ${spring.datasource.type}
|
||||||
driverClassName: com.mysql.cj.jdbc.Driver
|
# driverClassName: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
|
||||||
username: zmkgprod
|
# username: zmkgprod
|
||||||
password: MaY8nehwWkJriWPm
|
# password: MaY8nehwWkJriWPm
|
||||||
# # 从库数据源
|
# # 从库数据源
|
||||||
# slave:
|
# slave:
|
||||||
# lazy: true
|
# lazy: true
|
||||||
@ -179,7 +179,7 @@ sms:
|
|||||||
# 配置源类型用于标定配置来源(interface,yaml)
|
# 配置源类型用于标定配置来源(interface,yaml)
|
||||||
config-type: yaml
|
config-type: yaml
|
||||||
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
# 用于标定yml中的配置是否开启短信拦截,接口配置不受此限制
|
||||||
restricted: true
|
restricted: false
|
||||||
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
|
||||||
minute-max: 1
|
minute-max: 1
|
||||||
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
|
||||||
@ -321,12 +321,13 @@ weather:
|
|||||||
api-host: n35rk53njv.re.qweatherapi.com
|
api-host: n35rk53njv.re.qweatherapi.com
|
||||||
# dxf转 geojson 执行文件名
|
# dxf转 geojson 执行文件名
|
||||||
dxf2GeoJson:
|
dxf2GeoJson:
|
||||||
file-name: main.exe
|
file-name: main
|
||||||
ys7:
|
ys7:
|
||||||
app-key: 3acf9f1a43dc4209841e0893003db0a2
|
app-key: 3acf9f1a43dc4209841e0893003db0a2
|
||||||
app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36
|
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
|
||||||
job:
|
job:
|
||||||
capture-enabled: true # 控制是否启用萤石抓拍任务
|
capture-enabled: false # 控制是否启用萤石抓拍任务
|
||||||
|
device-sync-enabled: true # 控制是否同步萤石设备
|
||||||
# 斯巴达算法
|
# 斯巴达算法
|
||||||
sparta:
|
sparta:
|
||||||
url: http://119.3.204.120:8040
|
url: http://119.3.204.120:8040
|
||||||
|
|||||||
@ -253,6 +253,8 @@ springdoc:
|
|||||||
packages-to-scan: org.dromara.design
|
packages-to-scan: org.dromara.design
|
||||||
- group: 13.工作流模块
|
- group: 13.工作流模块
|
||||||
packages-to-scan: org.dromara.workflow
|
packages-to-scan: org.dromara.workflow
|
||||||
|
- group: 14.合同模块
|
||||||
|
packages-to-scan: org.dromara.ctr
|
||||||
- group: 15.无人机模块
|
- group: 15.无人机模块
|
||||||
packages-to-scan: org.dromara.drone
|
packages-to-scan: org.dromara.drone
|
||||||
- group: 20.代码生成模块
|
- group: 20.代码生成模块
|
||||||
@ -275,8 +277,10 @@ springdoc:
|
|||||||
packages-to-scan: org.dromara.gps
|
packages-to-scan: org.dromara.gps
|
||||||
- group: 24.招标模块
|
- group: 24.招标模块
|
||||||
packages-to-scan: org.dromara.tender
|
packages-to-scan: org.dromara.tender
|
||||||
- group: 25.app版本模块
|
# - group: 25.app版本模块
|
||||||
packages-to-scan: org.dromara.app
|
# packages-to-scan: org.dromara.app
|
||||||
|
- group: 25.数据迁移模块
|
||||||
|
packages-to-scan: org.dromara.transferData
|
||||||
- group: 26.netty消息模块
|
- group: 26.netty消息模块
|
||||||
packages-to-scan: org.dromara.websocket
|
packages-to-scan: org.dromara.websocket
|
||||||
- group: 27.新中大模块
|
- group: 27.新中大模块
|
||||||
|
|||||||
@ -3,6 +3,9 @@ package org.dromara.test;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.core.util.IdcardUtil;
|
import cn.hutool.core.util.IdcardUtil;
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
import cn.hutool.http.HttpResponse;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
||||||
@ -22,6 +25,11 @@ import org.dromara.facility.service.IFacMatrixService;
|
|||||||
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
|
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
|
||||||
import org.dromara.facility.service.IFacPhotovoltaicPanelService;
|
import org.dromara.facility.service.IFacPhotovoltaicPanelService;
|
||||||
import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult;
|
import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult;
|
||||||
|
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.service.IOthYs7DeviceService;
|
||||||
import org.dromara.out.domain.OutConstructionValue;
|
import org.dromara.out.domain.OutConstructionValue;
|
||||||
import org.dromara.out.domain.OutConstructionValueRange;
|
import org.dromara.out.domain.OutConstructionValueRange;
|
||||||
import org.dromara.out.service.IOutConstructionValueRangeService;
|
import org.dromara.out.service.IOutConstructionValueRangeService;
|
||||||
@ -101,6 +109,12 @@ public class DemoTest {
|
|||||||
@Resource
|
@Resource
|
||||||
private IOutConstructionValueService constructionValueService;
|
private IOutConstructionValueService constructionValueService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IOthYs7DeviceService ys7DeviceService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private Ys7Manager ys7Manager;
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testConstructionValue() {
|
void testConstructionValue() {
|
||||||
@ -114,7 +128,7 @@ public class DemoTest {
|
|||||||
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday);
|
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday);
|
||||||
Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/
|
Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/
|
||||||
LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间(2024-01-01)
|
LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间(2024-01-01)
|
||||||
LocalDate end = LocalDate.of(2025, 9, 15); // 截止时间(2025-09-15)
|
LocalDate end = LocalDate.of(2025, 10, 20); // 截止时间(2025-09-15)
|
||||||
|
|
||||||
// 如果起始不是周一,调整到当周的周一
|
// 如果起始不是周一,调整到当周的周一
|
||||||
if (start.getDayOfWeek() != DayOfWeek.MONDAY) {
|
if (start.getDayOfWeek() != DayOfWeek.MONDAY) {
|
||||||
@ -134,7 +148,7 @@ public class DemoTest {
|
|||||||
.ge(PgsProgressPlanDetail::getDate, monday)
|
.ge(PgsProgressPlanDetail::getDate, monday)
|
||||||
.le(PgsProgressPlanDetail::getDate, sunday)
|
.le(PgsProgressPlanDetail::getDate, sunday)
|
||||||
.ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO)
|
.ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO)
|
||||||
.eq(PgsProgressPlanDetail::getStatus, "1")
|
// .eq(PgsProgressPlanDetail::getStatus, "1")
|
||||||
.list();
|
.list();
|
||||||
if (CollUtil.isEmpty(planDetailList)) {
|
if (CollUtil.isEmpty(planDetailList)) {
|
||||||
// 下一周
|
// 下一周
|
||||||
@ -229,8 +243,8 @@ public class DemoTest {
|
|||||||
value.setOutValue(constructionValue);
|
value.setOutValue(constructionValue);
|
||||||
value.setOwnerValue(ownerValue);
|
value.setOwnerValue(ownerValue);
|
||||||
// 统计总产值
|
// 统计总产值
|
||||||
allConstructionValue = allConstructionValue.add(constructionValue).setScale(4, RoundingMode.HALF_UP);
|
allConstructionValue = allConstructionValue.add(constructionValue);
|
||||||
allOwnerValue = allOwnerValue.add(ownerValue).setScale(4, RoundingMode.HALF_UP);
|
allOwnerValue = allOwnerValue.add(ownerValue);
|
||||||
// 添加需要修改状态的计划详情
|
// 添加需要修改状态的计划详情
|
||||||
PgsProgressPlanDetail update = new PgsProgressPlanDetail();
|
PgsProgressPlanDetail update = new PgsProgressPlanDetail();
|
||||||
update.setId(planDetail.getId());
|
update.setId(planDetail.getId());
|
||||||
@ -238,8 +252,8 @@ public class DemoTest {
|
|||||||
updateList.add(update);
|
updateList.add(update);
|
||||||
saveList.add(value);
|
saveList.add(value);
|
||||||
}
|
}
|
||||||
range.setOutValue(allConstructionValue);
|
range.setOutValue(allConstructionValue.setScale(4, RoundingMode.HALF_UP));
|
||||||
range.setOwnerValue(allOwnerValue);
|
range.setOwnerValue(allOwnerValue.setScale(4, RoundingMode.HALF_UP));
|
||||||
// 如果产值都为0,则不保存
|
// 如果产值都为0,则不保存
|
||||||
if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) {
|
if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) {
|
||||||
return null;
|
return null;
|
||||||
@ -505,4 +519,32 @@ public class DemoTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void openSxtLx() {
|
||||||
|
String token = ys7Manager.getToken();
|
||||||
|
List<OthYs7Device> list = ys7DeviceService.list();
|
||||||
|
for (OthYs7Device othYs7Device : list) {
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("accessToken", token);
|
||||||
|
paramMap.put("deviceSerial", othYs7Device.getDeviceSerial());
|
||||||
|
paramMap.put("enable", 1);
|
||||||
|
String errorMsg = "Ys7 Token 请求失败";
|
||||||
|
try (HttpResponse response = HttpRequest.post(Ys7Constant.setDeviceVideoUrlByPost)
|
||||||
|
.form(paramMap)
|
||||||
|
.execute()) {
|
||||||
|
if (!response.isOk()) {
|
||||||
|
log.error("{}:{}", errorMsg, response.getStatus());
|
||||||
|
// throw new ServiceException(errorMsg + response.getStatus());
|
||||||
|
}
|
||||||
|
String body = response.body();
|
||||||
|
Ys7ResponseVo responseVo = JSONUtil.toBean(body, Ys7ResponseVo.class);
|
||||||
|
if (!responseVo.getCode().equals("200")) {
|
||||||
|
log.error("{},状态码:{},{}", errorMsg, responseVo.getCode(), responseVo.getMsg());
|
||||||
|
// throw new ServiceException(errorMsg + responseVo.getMsg());
|
||||||
|
}
|
||||||
|
log.info("Ys7 Token 请求成功:{}", body);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -77,7 +77,7 @@ public class RedisUtils {
|
|||||||
public static <T> void publish(String channelKey, T msg, Consumer<T> consumer) {
|
public static <T> void publish(String channelKey, T msg, Consumer<T> consumer) {
|
||||||
RTopic topic = CLIENT.getTopic(channelKey);
|
RTopic topic = CLIENT.getTopic(channelKey);
|
||||||
topic.publish(msg);
|
topic.publish(msg);
|
||||||
System.out.println("发布通道消息---------"+msg.toString());
|
// System.out.println("发布通道消息---------"+msg.toString());
|
||||||
consumer.accept(msg);
|
consumer.accept(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.EnableWebSocket;
|
||||||
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
|
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
|
||||||
import org.springframework.web.socket.server.HandshakeInterceptor;
|
import org.springframework.web.socket.server.HandshakeInterceptor;
|
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WebSocket 配置
|
* WebSocket 配置
|
||||||
|
|||||||
@ -69,8 +69,8 @@ public class WebSocketUtils {
|
|||||||
broadcastMessage.setMessage(webSocketMessage.getMessage());
|
broadcastMessage.setMessage(webSocketMessage.getMessage());
|
||||||
broadcastMessage.setSessionKeys(unsentSessionKeys);
|
broadcastMessage.setSessionKeys(unsentSessionKeys);
|
||||||
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
|
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
|
||||||
log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
|
// log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
|
||||||
WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
|
// WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -84,7 +84,7 @@ public class WebSocketUtils {
|
|||||||
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
|
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
|
||||||
broadcastMessage.setMessage(message);
|
broadcastMessage.setMessage(message);
|
||||||
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
|
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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,24 @@
|
|||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- 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>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>com.drewnoakes</groupId>-->
|
<!-- <groupId>com.drewnoakes</groupId>-->
|
||||||
<!-- <artifactId>metadata-extractor</artifactId>-->
|
<!-- <artifactId>metadata-extractor</artifactId>-->
|
||||||
@ -262,6 +280,13 @@
|
|||||||
<artifactId>netty-all</artifactId>
|
<artifactId>netty-all</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>1.15</version> <!-- 最新版本可自行调整 -->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -1,10 +1,8 @@
|
|||||||
package org.dromara.bigscreen.controller;
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import org.dromara.bigscreen.domain.dto.WeatherQueryReq;
|
import org.dromara.bigscreen.domain.dto.WeatherQueryReq;
|
||||||
import org.dromara.bigscreen.domain.vo.*;
|
import org.dromara.bigscreen.domain.vo.*;
|
||||||
import org.dromara.bigscreen.mapper.ProjectBigScreenMapper;
|
import org.dromara.bigscreen.mapper.ProjectBigScreenMapper;
|
||||||
@ -52,14 +50,10 @@ public class EnterpriseBigScreenController {
|
|||||||
@Resource
|
@Resource
|
||||||
private IBusProjectService projectService;
|
private IBusProjectService projectService;
|
||||||
|
|
||||||
@Resource
|
|
||||||
private ProjectBigScreenMapper projectBigScreenMapper;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取关键指标
|
* 获取关键指标
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:keyIndex")
|
// @SaCheckPermission("enterprise:bigScreen:keyIndex")
|
||||||
@GetMapping("/keyIndex")
|
@GetMapping("/keyIndex")
|
||||||
public R<EnterpriseKeyIndexVo> getEnterpriseKeyIndex() {
|
public R<EnterpriseKeyIndexVo> getEnterpriseKeyIndex() {
|
||||||
return R.ok(enterpriseBigScreenService.getEnterpriseKeyIndex());
|
return R.ok(enterpriseBigScreenService.getEnterpriseKeyIndex());
|
||||||
@ -68,7 +62,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 项目进度分析
|
* 项目进度分析
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:projectProgress")
|
// @SaCheckPermission("enterprise:bigScreen:projectProgress")
|
||||||
@GetMapping("/projectProgress")
|
@GetMapping("/projectProgress")
|
||||||
public R<ProjectProgressAnalysisVo> getProjectProgress() {
|
public R<ProjectProgressAnalysisVo> getProjectProgress() {
|
||||||
return R.ok(enterpriseBigScreenService.getProjectProgressAnalysis());
|
return R.ok(enterpriseBigScreenService.getProjectProgressAnalysis());
|
||||||
@ -77,7 +71,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 项目产值对比
|
* 项目产值对比
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:projectOutputValueComparison")
|
// @SaCheckPermission("enterprise:bigScreen:projectOutputValueComparison")
|
||||||
@GetMapping("/projectOutputValueComparison")
|
@GetMapping("/projectOutputValueComparison")
|
||||||
public R<List<OutputValueComparisonVo>> getProjectOutputValueComparison() {
|
public R<List<OutputValueComparisonVo>> getProjectOutputValueComparison() {
|
||||||
return R.ok(enterpriseBigScreenService.getProjectOutputValueComparison());
|
return R.ok(enterpriseBigScreenService.getProjectOutputValueComparison());
|
||||||
@ -86,7 +80,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 项目进度完成度和计划容量
|
* 项目进度完成度和计划容量
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:projectProgressCapacity")
|
// @SaCheckPermission("enterprise:bigScreen:projectProgressCapacity")
|
||||||
@GetMapping("/projectProgressCapacity")
|
@GetMapping("/projectProgressCapacity")
|
||||||
public R<List<ProjectProgressCapacityVo>> getProjectProgressCapacity() {
|
public R<List<ProjectProgressCapacityVo>> getProjectProgressCapacity() {
|
||||||
return R.ok(enterpriseBigScreenService.getProjectProgressCapacity());
|
return R.ok(enterpriseBigScreenService.getProjectProgressCapacity());
|
||||||
@ -95,7 +89,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 风险预警
|
* 风险预警
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:riskEarlyWarning")
|
// @SaCheckPermission("enterprise:bigScreen:riskEarlyWarning")
|
||||||
@GetMapping("/riskEarlyWarning")
|
@GetMapping("/riskEarlyWarning")
|
||||||
public R<List<RiskEarlyWarningVo>> getRiskEarlyWarning() {
|
public R<List<RiskEarlyWarningVo>> getRiskEarlyWarning() {
|
||||||
return R.ok(enterpriseBigScreenService.getRiskEarlyWarning());
|
return R.ok(enterpriseBigScreenService.getRiskEarlyWarning());
|
||||||
@ -104,7 +98,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询天气
|
* 查询天气
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:weather")
|
// @SaCheckPermission("enterprise:bigScreen:weather")
|
||||||
@GetMapping("/weather")
|
@GetMapping("/weather")
|
||||||
public R<List<WeatherVo>> getProjectWeather(WeatherQueryReq req) {
|
public R<List<WeatherVo>> getProjectWeather(WeatherQueryReq req) {
|
||||||
return R.ok(enterpriseBigScreenService.getWeather3DaysList(req));
|
return R.ok(enterpriseBigScreenService.getWeather3DaysList(req));
|
||||||
@ -113,7 +107,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询安全天数
|
* 查询安全天数
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:safetyDay")
|
// @SaCheckPermission("enterprise:bigScreen:safetyDay")
|
||||||
@GetMapping("/safetyDay")
|
@GetMapping("/safetyDay")
|
||||||
public R<Long> getProjectSafetyDay() {
|
public R<Long> getProjectSafetyDay() {
|
||||||
LocalDate date = LocalDate.of(2023, 1, 1);
|
LocalDate date = LocalDate.of(2023, 1, 1);
|
||||||
@ -125,7 +119,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 人数统计
|
* 人数统计
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:peopleCount")
|
// @SaCheckPermission("enterprise:bigScreen:peopleCount")
|
||||||
@GetMapping("/peopleCount")
|
@GetMapping("/peopleCount")
|
||||||
public R<PeopleCountVo> getProjectPeopleCount() {
|
public R<PeopleCountVo> getProjectPeopleCount() {
|
||||||
PeopleCountVo peopleCountVo = new PeopleCountVo();
|
PeopleCountVo peopleCountVo = new PeopleCountVo();
|
||||||
@ -156,7 +150,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 出勤人数统计
|
* 出勤人数统计
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:allAttendanceCount")
|
// @SaCheckPermission("enterprise:bigScreen:allAttendanceCount")
|
||||||
@GetMapping("/allAttendanceCount")
|
@GetMapping("/allAttendanceCount")
|
||||||
public R<TodayAttendanceCountVo> getAllAttendanceCount() {
|
public R<TodayAttendanceCountVo> getAllAttendanceCount() {
|
||||||
TodayAttendanceCountVo todayAttendanceCountVo = new TodayAttendanceCountVo();
|
TodayAttendanceCountVo todayAttendanceCountVo = new TodayAttendanceCountVo();
|
||||||
@ -195,7 +189,7 @@ public class EnterpriseBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 每个项目的出勤人数
|
* 每个项目的出勤人数
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("enterprise:bigScreen:projectAttendanceCount")
|
// @SaCheckPermission("enterprise:bigScreen:projectAttendanceCount")
|
||||||
@GetMapping("/projectAttendanceCount")
|
@GetMapping("/projectAttendanceCount")
|
||||||
public R<List<ProjectAttendanceCountVo>> getProjectAttendanceCount() {
|
public R<List<ProjectAttendanceCountVo>> getProjectAttendanceCount() {
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package org.dromara.bigscreen.controller;
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -62,7 +61,7 @@ public class MoneyBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目位置列表
|
* 查询项目位置列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("money:bigScreen:projectGis")
|
// @SaCheckPermission("money:bigScreen:projectGis")
|
||||||
@GetMapping("/project/gis")
|
@GetMapping("/project/gis")
|
||||||
public R<List<BusProjectGisVo>> getProjectGis() {
|
public R<List<BusProjectGisVo>> getProjectGis() {
|
||||||
return R.ok(moneyBigScreenService.getProjectGis());
|
return R.ok(moneyBigScreenService.getProjectGis());
|
||||||
@ -545,7 +544,7 @@ public class MoneyBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目天气
|
* 查询项目天气
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:weather")
|
// @SaCheckPermission("project:bigScreen:weather")
|
||||||
@GetMapping("/weather/{projectId}")
|
@GetMapping("/weather/{projectId}")
|
||||||
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
|
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
@ -555,7 +554,7 @@ public class MoneyBigScreenController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目安全天数
|
* 查询项目安全天数
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:safetyDay")
|
// @SaCheckPermission("project:bigScreen:safetyDay")
|
||||||
@GetMapping("/safetyDay/{projectId}")
|
@GetMapping("/safetyDay/{projectId}")
|
||||||
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
|
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
package org.dromara.bigscreen.controller;
|
package org.dromara.bigscreen.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
|
||||||
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
|
||||||
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
|
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
|
||||||
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
|
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
|
||||||
@ -89,6 +89,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目土地统计
|
* 查询项目土地统计
|
||||||
*/
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/{projectId}")
|
@GetMapping("/{projectId}")
|
||||||
public R<List<ProjectLandVo>> landCount(@NotNull(message = "主键不能为空")
|
public R<List<ProjectLandVo>> landCount(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
@ -100,9 +101,16 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
LambdaQueryWrapper<BusLandTransferLedgerSon> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<BusLandTransferLedgerSon> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
lambdaQueryWrapper.in(BusLandTransferLedgerSon::getParentId, list1);
|
lambdaQueryWrapper.in(BusLandTransferLedgerSon::getParentId, list1);
|
||||||
List<BusLandTransferLedgerSon> sonList = busLandTransferLedgerSonService.list(lambdaQueryWrapper);
|
List<BusLandTransferLedgerSon> sonList = busLandTransferLedgerSonService.list(lambdaQueryWrapper);
|
||||||
Map<Long, BigDecimal> collect = sonList.stream().filter(vo -> "1".equals(vo.getTransferStatus()))
|
Map<Long, BigDecimal> collect = sonList.stream()
|
||||||
.collect(Collectors.toMap(BusLandTransferLedgerSon::getParentId, BusLandTransferLedgerSon::getAreaValue));
|
.filter(vo -> "1".equals(vo.getTransferStatus()))
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
BusLandTransferLedgerSon::getParentId,
|
||||||
|
Collectors.reducing(
|
||||||
|
BigDecimal.ZERO,
|
||||||
|
BusLandTransferLedgerSon::getAreaValue,
|
||||||
|
BigDecimal::add
|
||||||
|
)
|
||||||
|
));
|
||||||
for (BusLandTransferLedger busLandTransferLedger : levelList) {
|
for (BusLandTransferLedger busLandTransferLedger : levelList) {
|
||||||
BigDecimal areaValue = collect.get(busLandTransferLedger.getId());
|
BigDecimal areaValue = collect.get(busLandTransferLedger.getId());
|
||||||
if (areaValue != null) {
|
if (areaValue != null) {
|
||||||
@ -153,7 +161,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目天气
|
* 查询项目天气
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:weather")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/weather/{projectId}")
|
@GetMapping("/weather/{projectId}")
|
||||||
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
|
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
@ -163,7 +171,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目安全天数
|
* 查询项目安全天数
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:safetyDay")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/safetyDay/{projectId}")
|
@GetMapping("/safetyDay/{projectId}")
|
||||||
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
|
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
@ -173,107 +181,37 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目公告
|
* 查询项目公告
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:news")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/news/{projectId}")
|
@GetMapping("/news/{projectId}")
|
||||||
public R<List<BusProjectNewsVo>> getProjectNews(@NotNull(message = "主键不能为空")
|
public R<List<BusProjectNewsVo>> getProjectNews(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@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));
|
return R.ok(projectBigScreenService.getProjectNews(projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目AI安全巡检
|
* 查询项目AI安全巡检
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:safetyInspection")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/safetyInspection/{projectId}")
|
@GetMapping("/safetyInspection/{projectId}")
|
||||||
public R<List<ProjectSafetyInspectionVo>> getProjectSafetyInspection(@NotNull(message = "主键不能为空")
|
public R<List<ProjectSafetyInspectionVo>> getProjectSafetyInspection(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@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));
|
return R.ok(projectBigScreenService.getProjectSafetyInspection(projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目人员情况
|
* 查询项目人员情况
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:people")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/people/{projectId}")
|
@GetMapping("/people/{projectId}")
|
||||||
public R<ProjectPeopleVo> getProjectPeople(@NotNull(message = "主键不能为空")
|
public R<ProjectPeopleVo> getProjectPeople(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@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));
|
return R.ok(projectBigScreenService.getProjectPeople(projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目形象进度
|
* 查询项目形象进度
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:imageProgress")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/imageProgress/{projectId}")
|
@GetMapping("/imageProgress/{projectId}")
|
||||||
public R<List<ProjectImageProgressVo>> getProjectImageProgress(@NotNull(message = "主键不能为空")
|
public R<List<ProjectImageProgressVo>> getProjectImageProgress(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
@ -283,28 +221,17 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询项目概括
|
* 查询项目概括
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:generalize")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/generalize/{projectId}")
|
@GetMapping("/generalize/{projectId}")
|
||||||
public R<String> getProjectGeneralize(@NotNull(message = "主键不能为空")
|
public R<String> getProjectGeneralize(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@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(projectBigScreenService.getProjectGeneralize(projectId));
|
||||||
// return R.ok();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询设备列表
|
* 查询设备列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:getClientList")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getClientList/{projectId}")
|
@GetMapping("/getClientList/{projectId}")
|
||||||
public R<List<Map<String, Object>>> getClientList(@NotNull(message = "主键不能为空")
|
public R<List<Map<String, Object>>> getClientList(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long projectId) {
|
@PathVariable Long projectId) {
|
||||||
@ -314,6 +241,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 修改萤石摄像头
|
* 修改萤石摄像头
|
||||||
*/
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PutMapping("/device")
|
@PutMapping("/device")
|
||||||
public R<Void> edit(@Validated @RequestBody Ys7DeviceUpdateReq req) {
|
public R<Void> edit(@Validated @RequestBody Ys7DeviceUpdateReq req) {
|
||||||
@ -337,11 +265,15 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
throw new ServiceException("已存在同名萤石摄像头", HttpStatus.CONFLICT);
|
throw new ServiceException("已存在同名萤石摄像头", HttpStatus.CONFLICT);
|
||||||
}
|
}
|
||||||
// todo 更新云端名称
|
// 更新云端名称
|
||||||
/* Boolean result = ys7Manager.updateDeviceName(one.getDeviceSerial(), deviceName);
|
Boolean result = ys7Manager.updateDeviceName(one.getDeviceSerial(), deviceName);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR);
|
throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR);
|
||||||
}*/
|
}
|
||||||
|
}
|
||||||
|
if (req.getLatitude() != null && req.getLongitude() != null) {
|
||||||
|
ys7Device.setLatitude(req.getLatitude());
|
||||||
|
ys7Device.setLongitude(req.getLongitude());
|
||||||
}
|
}
|
||||||
return toAjax(othYs7DeviceService.updateById(ys7Device));
|
return toAjax(othYs7DeviceService.updateById(ys7Device));
|
||||||
}
|
}
|
||||||
@ -349,6 +281,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询质量信息
|
* 查询质量信息
|
||||||
*/
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getQualityList/gis")
|
@GetMapping("/getQualityList/gis")
|
||||||
public R<QltQualityInspectionListGisVo> queryGisList(QltQualityInspectionGisReq req) {
|
public R<QltQualityInspectionListGisVo> queryGisList(QltQualityInspectionGisReq req) {
|
||||||
return R.ok(qualityInspectionService.queryGisList(req));
|
return R.ok(qualityInspectionService.queryGisList(req));
|
||||||
@ -357,6 +290,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询大屏安全信息
|
* 查询大屏安全信息
|
||||||
*/
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getSafetyList/gis")
|
@GetMapping("/getSafetyList/gis")
|
||||||
public R<HseSafetyInspectionListGisVo> queryGisList(HseSafetyInspectionGisReq req) {
|
public R<HseSafetyInspectionListGisVo> queryGisList(HseSafetyInspectionGisReq req) {
|
||||||
return R.ok(safetyInspectionService.queryGisList(req));
|
return R.ok(safetyInspectionService.queryGisList(req));
|
||||||
@ -365,7 +299,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询GPS设备用户列表
|
* 查询GPS设备用户列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:getList")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getList")
|
@GetMapping("/getList")
|
||||||
public R<List<String>> getList(Long projectId) {
|
public R<List<String>> getList(Long projectId) {
|
||||||
return R.ok(projectBigScreenService.getList(projectId));
|
return R.ok(projectBigScreenService.getList(projectId));
|
||||||
@ -374,7 +308,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 新增GPS设备详细
|
* 新增GPS设备详细
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("project:bigScreen:setList")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@Log(title = "GPS设备详细", businessType = BusinessType.INSERT)
|
@Log(title = "GPS设备详细", businessType = BusinessType.INSERT)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PostMapping("/setList")
|
@PostMapping("/setList")
|
||||||
@ -385,17 +319,26 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询地图项目分类
|
* 查询地图项目分类
|
||||||
*/
|
*/
|
||||||
// @SaCheckPermission("project:bigScreen:getProjectMapList")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getProjectMapList")
|
@GetMapping("/getProjectMapList")
|
||||||
public R<Map<String, Map<String, Map<String, String>>>> getProjectMapList() {
|
public R<Map<String, Map<String, Map<String, String>>>> getProjectMapList() {
|
||||||
return R.ok(projectService.getProjectMapList());
|
return R.ok(projectService.getProjectMapList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询地图项目分类
|
||||||
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
|
@PostMapping("/updatePosition")
|
||||||
|
public R<Void> updatePosition(@RequestBody ProjectUpdateDto dto) {
|
||||||
|
return toAjax(projectService.updatePosition(dto));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询项目地域分散图
|
* 查询项目地域分散图
|
||||||
*/
|
*/
|
||||||
// @SaCheckPermission("project:bigScreen:getProjectMapList")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getProjectDiYv")
|
@GetMapping("/getProjectDiYv")
|
||||||
public R<Map<String, Long>> getProjectDiYv() {
|
public R<Map<String, Long>> getProjectDiYv() {
|
||||||
return R.ok(projectService.getProjectDiYv());
|
return R.ok(projectService.getProjectDiYv());
|
||||||
@ -404,7 +347,7 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 计划和实际容量对比
|
* 计划和实际容量对比
|
||||||
*/
|
*/
|
||||||
// @SaCheckPermission("project:bigScreen:getProjectMapList")
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getProjectCapacity")
|
@GetMapping("/getProjectCapacity")
|
||||||
public R<Map<String, Map<String, String>>> getProjectCapacity() {
|
public R<Map<String, Map<String, String>>> getProjectCapacity() {
|
||||||
return R.ok(projectService.getProjectCapacity());
|
return R.ok(projectService.getProjectCapacity());
|
||||||
@ -414,16 +357,18 @@ public class ProjectBigScreenController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 更新无人机缓存
|
* 更新无人机缓存
|
||||||
*/
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/setWrjHc")
|
@GetMapping("/setWrjHc")
|
||||||
public void setWrjHc(){
|
public void setWrjHc() {
|
||||||
projectBigScreenService.setWrjHc();
|
projectBigScreenService.setWrjHc();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新无人机缓存
|
* 更新无人机缓存
|
||||||
*/
|
*/
|
||||||
|
// @SaCheckPermission("project:big:screen")
|
||||||
@GetMapping("/getInfoData")
|
@GetMapping("/getInfoData")
|
||||||
public R<Map<String, Map<String, Object>>> getInfoData(TanchuangInfoReq req){
|
public R<Map<String, Map<String, Object>>> getInfoData(TanchuangInfoReq req) {
|
||||||
return R.ok(projectBigScreenService.getInfoData(req));
|
return R.ok(projectBigScreenService.getInfoData(req));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author lilemy
|
* @author lilemy
|
||||||
@ -37,4 +38,13 @@ public class Ys7DeviceUpdateReq implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 纬度(精确到6位小数)
|
||||||
|
*/
|
||||||
|
private BigDecimal latitude;
|
||||||
|
/**
|
||||||
|
* 经度(精确到6位小数)
|
||||||
|
*/
|
||||||
|
private BigDecimal longitude;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -80,12 +80,12 @@ public class RedisMessageListener implements MessageListener {
|
|||||||
private String buildPushMessage(String key, String message, Long projectId) {
|
private String buildPushMessage(String key, String message, Long projectId) {
|
||||||
JSONObject messageObj = new JSONObject();
|
JSONObject messageObj = new JSONObject();
|
||||||
messageObj.put("type", "wrj_DATA_UPDATE");
|
messageObj.put("type", "wrj_DATA_UPDATE");
|
||||||
messageObj.put("projectId",projectId);
|
messageObj.put("projectId",projectId.toString());
|
||||||
messageObj.put("clientId",key);
|
messageObj.put("clientId",key);
|
||||||
// 位置信息
|
// 位置信息
|
||||||
JSONObject locationObj = new JSONObject();
|
JSONObject locationObj = new JSONObject();
|
||||||
locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude")); // 纬度
|
locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude").toString()); // 纬度
|
||||||
locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude")); // 经度
|
locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude").toString()); // 经度
|
||||||
messageObj.put("location", locationObj);
|
messageObj.put("location", locationObj);
|
||||||
return messageObj.toString();
|
return messageObj.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import org.dromara.drone.service.IDroProjectDroneService;
|
|||||||
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
||||||
import org.dromara.gps.domain.vo.DeviceVo;
|
import org.dromara.gps.domain.vo.DeviceVo;
|
||||||
import org.dromara.gps.domain.vo.GpsEquipmentSonVo;
|
import org.dromara.gps.domain.vo.GpsEquipmentSonVo;
|
||||||
|
import org.dromara.gps.domain.vo.LocationVo;
|
||||||
import org.dromara.gps.service.IDeviceService;
|
import org.dromara.gps.service.IDeviceService;
|
||||||
import org.dromara.gps.service.IGpsEquipmentService;
|
import org.dromara.gps.service.IGpsEquipmentService;
|
||||||
import org.dromara.manager.weathermanager.vo.WeatherVo;
|
import org.dromara.manager.weathermanager.vo.WeatherVo;
|
||||||
@ -479,10 +480,10 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
|||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
List<GpsEquipmentSonVo> voList = gpsEquipmentService.getClientList(projectId, startOfDay, now);
|
List<GpsEquipmentSonVo> voList = gpsEquipmentService.getClientList(projectId, startOfDay, now);
|
||||||
List<GpsEquipmentSonVo> appList = gpsEquipmentService.getUserListByProjectId(projectId, startOfDay, now);
|
List<GpsEquipmentSonVo> appList = gpsEquipmentService.getUserListByProjectId(projectId, startOfDay, now);
|
||||||
List<DeviceVo> anqmList = deviceService.getUserListByProjectId(projectId, startOfDay, now);
|
List<LocationVo> anqmList = deviceService.getUserListByProjectId(projectId, startOfDay, now);
|
||||||
List<OthYs7Device> othYs7DeviceList = othYs7DeviceService.lambdaQuery()
|
List<OthYs7Device> othYs7DeviceList = othYs7DeviceService.lambdaQuery()
|
||||||
.eq(OthYs7Device::getProjectId, projectId)
|
.eq(OthYs7Device::getProjectId, projectId)
|
||||||
.between(OthYs7Device::getUpdateTime, startOfDay, now)
|
// .between(OthYs7Device::getUpdateTime, startOfDay, now)
|
||||||
.list();
|
.list();
|
||||||
List<String> wrjKeys = droProjectDroneService.getTopicsByProjectId(projectId);
|
List<String> wrjKeys = droProjectDroneService.getTopicsByProjectId(projectId);
|
||||||
List<Map<String, Object>> maps = new ArrayList<>();
|
List<Map<String, Object>> maps = new ArrayList<>();
|
||||||
@ -498,33 +499,13 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
|||||||
List<Map<String, Object>> anqmChildrenMap = new ArrayList<>();
|
List<Map<String, Object>> anqmChildrenMap = new ArrayList<>();
|
||||||
List<Map<String, Object>> wrjChildrenMap = new ArrayList<>();
|
List<Map<String, Object>> wrjChildrenMap = new ArrayList<>();
|
||||||
List<Map<String, Object>> sxtChildrenMap = new ArrayList<>();
|
List<Map<String, Object>> sxtChildrenMap = new ArrayList<>();
|
||||||
|
|
||||||
Map<String, Object> sxt = new HashMap<>();
|
|
||||||
sxt.put("id", 4545555);
|
|
||||||
sxt.put("label", "");
|
|
||||||
sxt.put("name", "摄像头");
|
|
||||||
sxt.put("type", "shexiangtou");
|
|
||||||
sxt.put("lat", 23.81524718);
|
|
||||||
sxt.put("lng", 107.13038137);
|
|
||||||
sxt.put("alt", 0);
|
|
||||||
sxtChildrenMap.add(sxt);
|
|
||||||
Map<String, Object> anqm = new HashMap<>();
|
|
||||||
anqm.put("id", 45454455154L);
|
|
||||||
anqm.put("label", "");
|
|
||||||
anqm.put("name", "安全帽");
|
|
||||||
anqm.put("type", "positioningDevice");
|
|
||||||
anqm.put("lat", 23.81488041);
|
|
||||||
anqm.put("lng", 107.12917371);
|
|
||||||
anqm.put("alt", 0);
|
|
||||||
|
|
||||||
anqmChildrenMap.add(anqm);
|
|
||||||
if (voList != null && !voList.isEmpty()) {
|
if (voList != null && !voList.isEmpty()) {
|
||||||
for (GpsEquipmentSonVo item : voList) {
|
for (GpsEquipmentSonVo item : voList) {
|
||||||
Map<String, Object> gps = new HashMap<>();
|
Map<String, Object> gps = new HashMap<>();
|
||||||
gps.put("id", item.getClientId());
|
gps.put("id", item.getClientId());
|
||||||
gps.put("userId", item.getUserId());
|
gps.put("userId", item.getUserId());
|
||||||
gps.put("label", item.getClientId());
|
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("type", "gps");
|
||||||
gps.put("lat", item.getLocLatitude());
|
gps.put("lat", item.getLocLatitude());
|
||||||
gps.put("lng", item.getLocLongitude());
|
gps.put("lng", item.getLocLongitude());
|
||||||
@ -535,10 +516,10 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
|||||||
if (appList != null && !appList.isEmpty()) {
|
if (appList != null && !appList.isEmpty()) {
|
||||||
for (GpsEquipmentSonVo item : appList) {
|
for (GpsEquipmentSonVo item : appList) {
|
||||||
Map<String, Object> app = new HashMap<>();
|
Map<String, Object> app = new HashMap<>();
|
||||||
app.put("id", item.getClientId());
|
app.put("id", item.getUserId());
|
||||||
app.put("userId", item.getUserId());
|
app.put("userId", item.getUserId());
|
||||||
app.put("label", item.getClientId());
|
app.put("label", item.getUserId());
|
||||||
app.put("name", item.getDeviceName());
|
app.put("name", item.getUserName());
|
||||||
app.put("type", "app");
|
app.put("type", "app");
|
||||||
app.put("lat", item.getLocLatitude());
|
app.put("lat", item.getLocLatitude());
|
||||||
app.put("lng", item.getLocLongitude());
|
app.put("lng", item.getLocLongitude());
|
||||||
@ -546,20 +527,35 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
|
|||||||
appChildrenMap.add(app);
|
appChildrenMap.add(app);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if (othYs7DeviceList != null && !othYs7DeviceList.isEmpty()) {
|
if (anqmList != null && !anqmList.isEmpty()) {
|
||||||
// for (OthYs7Device item : othYs7DeviceList) {
|
for (LocationVo item : anqmList) {
|
||||||
// Map<String, Object> sxt = new HashMap<>();
|
Map<String, Object> anqm = new HashMap<>();
|
||||||
// sxt.put("id", item.getDeviceSerial());
|
anqm.put("id", item.getDevNum());
|
||||||
// sxt.put("label", item.getDeviceSerial());
|
anqm.put("userId", item.getUserId());
|
||||||
// sxt.put("name", item.getDeviceName());
|
anqm.put("label", item.getDevNum());
|
||||||
// sxt.put("type", "shexiangtou");
|
anqm.put("name", item.getDevNum());
|
||||||
// sxt.put("lat", item.getLatitude());
|
anqm.put("type", "positioningDevice");
|
||||||
// sxt.put("lng", item.getLongitude());
|
anqm.put("lat", item.getLatitude());
|
||||||
// sxt.put("alt", item.getAltitude());
|
anqm.put("lng", item.getLongitude());
|
||||||
// sxt.put("detail", item.getDetail());
|
anqm.put("alt", item.getElevation());
|
||||||
// sxtChildrenMap.add(sxt);
|
anqmChildrenMap.add(anqm);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
if (othYs7DeviceList != null && !othYs7DeviceList.isEmpty()) {
|
||||||
|
for (OthYs7Device item : othYs7DeviceList) {
|
||||||
|
Map<String, Object> sxt = new HashMap<>();
|
||||||
|
sxt.put("id", item.getDeviceSerial());
|
||||||
|
sxt.put("label", item.getDeviceSerial());
|
||||||
|
sxt.put("name", item.getDeviceName());
|
||||||
|
sxt.put("type", "shexiangtou");
|
||||||
|
sxt.put("lat", item.getLatitude());
|
||||||
|
sxt.put("lng", item.getLongitude());
|
||||||
|
sxt.put("alt", item.getAltitude());
|
||||||
|
sxt.put("status", item.getStatus());
|
||||||
|
sxt.put("detail", item.getDetail());
|
||||||
|
sxtChildrenMap.add(sxt);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (wrjKeys != null && !wrjKeys.isEmpty()) {
|
if (wrjKeys != null && !wrjKeys.isEmpty()) {
|
||||||
for (String key : wrjKeys) {
|
for (String key : wrjKeys) {
|
||||||
Object object = stringRedisTemplate.opsForValue().get("wrj:osd4:" + key);
|
Object object = stringRedisTemplate.opsForValue().get("wrj:osd4:" + key);
|
||||||
|
|||||||
@ -211,6 +211,11 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
|
|||||||
public void validNum(List<BusPlanDocAssociationBo> associationList, Long supplierId) {
|
public void validNum(List<BusPlanDocAssociationBo> associationList, Long supplierId) {
|
||||||
|
|
||||||
for (BusPlanDocAssociationBo association : associationList) {
|
for (BusPlanDocAssociationBo association : associationList) {
|
||||||
|
|
||||||
|
if(association.getDemandQuantity() == null){
|
||||||
|
throw new ServiceException("请填写需求数量");
|
||||||
|
}
|
||||||
|
|
||||||
//获取批次需求计划
|
//获取批次需求计划
|
||||||
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
|
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
|
||||||
List<String> statuss = new ArrayList<>();
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -10,6 +10,7 @@ import org.dromara.sms4j.core.factory.SmsFactory;
|
|||||||
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@ -21,7 +22,7 @@ public class AsyncUtil {
|
|||||||
public void sendSms(List<String> mobileList, String config) {
|
public void sendSms(List<String> mobileList, String config) {
|
||||||
SmsBlend smsBlend = SmsFactory.getSmsBlend(config);
|
SmsBlend smsBlend = SmsFactory.getSmsBlend(config);
|
||||||
for (String mobile : mobileList) {
|
for (String mobile : mobileList) {
|
||||||
SmsResponse smsResponse = smsBlend.sendMessage(mobile, (String) null);
|
SmsResponse smsResponse = smsBlend.sendMessage(mobile, new LinkedHashMap<String, String>());
|
||||||
if (!smsResponse.isSuccess()) {
|
if (!smsResponse.isSuccess()) {
|
||||||
log.error("验证码短信发送异常 => {}", smsResponse);
|
log.error("验证码短信发送异常 => {}", smsResponse);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -3,7 +3,6 @@ package org.dromara.contractor.controller.app;
|
|||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
|
||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
import org.dromara.common.log.annotation.Log;
|
import org.dromara.common.log.annotation.Log;
|
||||||
import org.dromara.common.log.enums.BusinessType;
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
@ -136,7 +135,7 @@ public class SubConstructionUserAppController {
|
|||||||
@Log(title = "施工人员", businessType = BusinessType.OTHER)
|
@Log(title = "施工人员", businessType = BusinessType.OTHER)
|
||||||
@PostMapping("/face/comparison")
|
@PostMapping("/face/comparison")
|
||||||
public R<Boolean> faceComparison(@RequestParam("file") MultipartFile file) {
|
public R<Boolean> faceComparison(@RequestParam("file") MultipartFile file) {
|
||||||
return R.ok(constructionUserService.faceComparison(file));
|
return R.ok(constructionUserService.faceComparison(file,null ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package org.dromara.contractor.domain;
|
package org.dromara.contractor.domain;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
@ -204,4 +205,10 @@ public class SubConstructionUser extends BaseEntity {
|
|||||||
private Long goId;
|
private Long goId;
|
||||||
|
|
||||||
private String goOpenid;
|
private String goOpenid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除标志(0代表存在 1代表删除)
|
||||||
|
*/
|
||||||
|
@TableLogic
|
||||||
|
private String delFlag;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -213,10 +213,11 @@ public interface ISubConstructionUserService extends IService<SubConstructionUse
|
|||||||
/**
|
/**
|
||||||
* 人脸识别
|
* 人脸识别
|
||||||
*
|
*
|
||||||
* @param file 图片文件
|
* @param file 图片文件
|
||||||
|
* @param userId
|
||||||
* @return 是否匹配成功
|
* @return 是否匹配成功
|
||||||
*/
|
*/
|
||||||
Boolean faceComparison(MultipartFile file);
|
Boolean faceComparison(MultipartFile file, Long userId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据系统用户id查询施工人员
|
* 根据系统用户id查询施工人员
|
||||||
|
|||||||
@ -19,6 +19,7 @@ import org.dromara.common.core.exception.ServiceException;
|
|||||||
import org.dromara.common.core.utils.DateUtils;
|
import org.dromara.common.core.utils.DateUtils;
|
||||||
import org.dromara.common.core.utils.ObjectUtils;
|
import org.dromara.common.core.utils.ObjectUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
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.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.oss.core.OssClient;
|
import org.dromara.common.oss.core.OssClient;
|
||||||
@ -183,7 +184,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
|||||||
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, req.getProjectId());
|
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, req.getProjectId());
|
||||||
|
|
||||||
if (CollectionUtil.isEmpty(byUserId)) {
|
if (CollectionUtil.isEmpty(byUserId)) {
|
||||||
return new TableDataInfo<>();
|
return TableDataInfo.build(new ArrayList<>());
|
||||||
}
|
}
|
||||||
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
|
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
|
||||||
}
|
}
|
||||||
@ -276,7 +277,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
|||||||
userRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery()
|
userRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery()
|
||||||
.eq(SysUserRole::getUserId, constructionUser.getSysUserId())
|
.eq(SysUserRole::getUserId, constructionUser.getSysUserId())
|
||||||
.eq(SysUserRole::getProjectId, dto.getProjectId())
|
.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;
|
Long roleId = "0".equals(dto.getPostId()) ? 2L : 3L;
|
||||||
@ -1394,6 +1395,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
|||||||
SysUserBo sysUserBo = new SysUserBo();
|
SysUserBo sysUserBo = new SysUserBo();
|
||||||
sysUserBo.setUserId(userId);
|
sysUserBo.setUserId(userId);
|
||||||
sysUserBo.setNickName(user.getUserName());
|
sysUserBo.setNickName(user.getUserName());
|
||||||
|
sysUserBo.setSex(user.getSex());
|
||||||
userService.updateUser(sysUserBo);
|
userService.updateUser(sysUserBo);
|
||||||
return user.getId();
|
return user.getId();
|
||||||
}
|
}
|
||||||
@ -1417,15 +1419,18 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
|||||||
/**
|
/**
|
||||||
* 人脸识别
|
* 人脸识别
|
||||||
*
|
*
|
||||||
* @param file 图片文件
|
* @param file 图片文件
|
||||||
|
* @param userId
|
||||||
* @return 是否匹配成功
|
* @return 是否匹配成功
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean faceComparison(MultipartFile file) {
|
public Boolean faceComparison(MultipartFile file, Long userId) {
|
||||||
String reqBase64 = this.getPicBase64(file);
|
String reqBase64 = this.getPicBase64(file);
|
||||||
HumanFaceReq request = new HumanFaceReq();
|
HumanFaceReq request = new HumanFaceReq();
|
||||||
request.setImage(reqBase64);
|
request.setImage(reqBase64);
|
||||||
Long userId = LoginHelper.getUserId();
|
if(userId == null){
|
||||||
|
userId = LoginHelper.getUserId();
|
||||||
|
}
|
||||||
SubConstructionUser constructionUser = this.getBySysUserId(userId);
|
SubConstructionUser constructionUser = this.getBySysUserId(userId);
|
||||||
if (constructionUser == null || StringUtils.isBlank(constructionUser.getFacePic())) {
|
if (constructionUser == null || StringUtils.isBlank(constructionUser.getFacePic())) {
|
||||||
throw new ServiceException("未进行实名认证");
|
throw new ServiceException("未进行实名认证");
|
||||||
@ -1513,6 +1518,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
|
|||||||
lqw.eq(SubConstructionUser::getUserRole, "0");
|
lqw.eq(SubConstructionUser::getUserRole, "0");
|
||||||
if (req.getProjectId() == null) {
|
if (req.getProjectId() == null) {
|
||||||
lqw.isNull(SubConstructionUser::getProjectId);
|
lqw.isNull(SubConstructionUser::getProjectId);
|
||||||
|
lqw.apply("exists (select 1 from sys_user where user_id = sys_user_id and dept_id is null)");
|
||||||
} else {
|
} else {
|
||||||
lqw.eq(SubConstructionUser::getProjectId, req.getProjectId());
|
lqw.eq(SubConstructionUser::getProjectId, req.getProjectId());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -295,7 +295,7 @@ public class SubUserSalaryDetailServiceImpl extends ServiceImpl<SubUserSalaryDet
|
|||||||
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, dto.getProjectId());
|
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, dto.getProjectId());
|
||||||
|
|
||||||
if(CollectionUtil.isEmpty(byUserId)){
|
if(CollectionUtil.isEmpty(byUserId)){
|
||||||
return new TableDataInfo<>();
|
return TableDataInfo.build(new ArrayList<>());
|
||||||
}
|
}
|
||||||
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
|
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,146 @@
|
|||||||
|
package org.dromara.design.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
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.dto.constructionscheduleplan.*;
|
||||||
|
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
|
||||||
|
import org.dromara.design.service.IDesConstructionSchedulePlanService;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设计计划
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-01
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/design/constructionSchedulePlan")
|
||||||
|
public class DesConstructionSchedulePlanController extends BaseController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IDesConstructionSchedulePlanService desConstructionSchedulePlanService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设计计划列表
|
||||||
|
*/
|
||||||
|
@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)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,105 @@
|
|||||||
|
package org.dromara.design.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.design.domain.vo.DesSmsRecordVo;
|
||||||
|
import org.dromara.design.domain.bo.DesSmsRecordBo;
|
||||||
|
import org.dromara.design.service.IDesSmsRecordService;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-10-13
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/design/smsRecord")
|
||||||
|
public class DesSmsRecordController extends BaseController {
|
||||||
|
|
||||||
|
private final IDesSmsRecordService desSmsRecordService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设计图纸短信记录列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("design:smsRecord:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<DesSmsRecordVo> list(DesSmsRecordBo bo, PageQuery pageQuery) {
|
||||||
|
return desSmsRecordService.queryPageList(bo, pageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出设计图纸短信记录列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("design:smsRecord:export")
|
||||||
|
@Log(title = "设计图纸短信记录", businessType = BusinessType.EXPORT)
|
||||||
|
@PostMapping("/export")
|
||||||
|
public void export(DesSmsRecordBo bo, HttpServletResponse response) {
|
||||||
|
List<DesSmsRecordVo> list = desSmsRecordService.queryList(bo);
|
||||||
|
ExcelUtil.exportExcel(list, "设计图纸短信记录", DesSmsRecordVo.class, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取设计图纸短信记录详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("design:smsRecord:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<DesSmsRecordVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(desSmsRecordService.queryById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增设计图纸短信记录
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("design:smsRecord:add")
|
||||||
|
@Log(title = "设计图纸短信记录", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody DesSmsRecordBo bo) {
|
||||||
|
return toAjax(desSmsRecordService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改设计图纸短信记录
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("design:smsRecord:edit")
|
||||||
|
@Log(title = "设计图纸短信记录", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DesSmsRecordBo bo) {
|
||||||
|
return toAjax(desSmsRecordService.updateByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("design:smsRecord:remove")
|
||||||
|
@Log(title = "设计图纸短信记录", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(desSmsRecordService.deleteWithValidByIds(List.of(ids), true));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -40,12 +40,9 @@ public class DesVolumeFileAppController extends BaseController {
|
|||||||
private IDesVolumeFileService desVolumeFileService;
|
private IDesVolumeFileService desVolumeFileService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
@GetMapping("/joinList")
|
||||||
* app图纸管理分页查询
|
public TableDataInfo<DesVolumeFileJoinVo> joinList(DesVolumeFileBo bo, PageQuery pageQuery) {
|
||||||
*/
|
return desVolumeFileService.queryJoinPageList(bo, pageQuery);
|
||||||
@GetMapping("/list")
|
|
||||||
public TableDataInfo<DesVolumeFileAppVo> list(DesVolumeFileAppPageDto dto, PageQuery pageQuery) {
|
|
||||||
return desVolumeFileService.queryAppPageList(dto, pageQuery);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,52 @@
|
|||||||
|
package org.dromara.design.controller.app;
|
||||||
|
|
||||||
|
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.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
|
import org.dromara.common.log.annotation.Log;
|
||||||
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.design.domain.bo.DesVolumeFileViewerBo;
|
||||||
|
import org.dromara.design.domain.vo.volumefileviewer.DesVolumeFileViewerVo;
|
||||||
|
import org.dromara.design.service.IDesVolumeFileViewerService;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 卷册文件查阅人
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-14
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/app/design/volumeFileViewer")
|
||||||
|
public class DesVolumeFileViewerAppController extends BaseController {
|
||||||
|
|
||||||
|
private final IDesVolumeFileViewerService desVolumeFileViewerService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增卷册文件查阅人
|
||||||
|
*/
|
||||||
|
@Log(title = "卷册文件查阅人", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody DesVolumeFileViewerBo bo) {
|
||||||
|
return toAjax(desVolumeFileViewerService.insertByBo(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -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,46 @@
|
|||||||
|
package org.dromara.design.domain;
|
||||||
|
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设计图纸短信记录对象 des_sms_record
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-10-13
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@TableName("des_sms_record")
|
||||||
|
public class DesSmsRecord extends BaseEntity {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图纸id
|
||||||
|
*/
|
||||||
|
private Long volumeFileId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 0-不需要再次发送 1-需要再次发送
|
||||||
|
*/
|
||||||
|
private String again;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户类型(1-项目经理,2-设计部主任)
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
package org.dromara.design.domain.bo;
|
||||||
|
|
||||||
|
import org.dromara.design.domain.DesSmsRecord;
|
||||||
|
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.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设计图纸短信记录业务对象 des_sms_record
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-10-13
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@AutoMapper(target = DesSmsRecord.class, reverseConvertGenerate = false)
|
||||||
|
public class DesSmsRecordBo extends BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图纸id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "图纸id不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private Long volumeFileId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 0-不需要再次发送 1-需要再次发送
|
||||||
|
*/
|
||||||
|
private String again;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户类型(1-项目经理,2-设计部主任)
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -62,7 +62,7 @@ public class DesVolumeFileBo extends BaseEntity {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 备注
|
* 项目id
|
||||||
*/
|
*/
|
||||||
private Long projectId;
|
private Long projectId;
|
||||||
|
|
||||||
@ -78,6 +78,9 @@ public class DesVolumeFileBo extends BaseEntity {
|
|||||||
private String documentName;
|
private String documentName;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审核状态
|
||||||
|
*/
|
||||||
private String auditStatus;
|
private String auditStatus;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
package org.dromara.design.domain.dto.constructionscheduleplan;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-09-06 17:12
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class DesConstructionSchedulePlanExcelDto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编号(1, 1.1, 1.1.1)
|
||||||
|
*/
|
||||||
|
private String number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目ID
|
||||||
|
*/
|
||||||
|
private Long projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 节点名称
|
||||||
|
*/
|
||||||
|
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,31 @@
|
|||||||
|
package org.dromara.design.domain.dto.constructionscheduleplan;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-09-17 10:15
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DesConstructionSchedulePlanFinishReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 8139653508791280689L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@NotNull(message = "主键不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 完成时间
|
||||||
|
*/
|
||||||
|
@NotNull(message = "完成时间不能为空")
|
||||||
|
private LocalDate finishDate;
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
package org.dromara.design.domain.dto.constructionscheduleplan;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-01 14:05
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DesConstructionSchedulePlanQueryReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 9021370369055688811L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目ID
|
||||||
|
*/
|
||||||
|
private Long projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 节点名称
|
||||||
|
*/
|
||||||
|
private String nodeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对应项目结构名称
|
||||||
|
*/
|
||||||
|
private String projectStructureName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private String status;
|
||||||
|
}
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
package org.dromara.design.domain.dto.constructionscheduleplan;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-01 14:06
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class DesConstructionSchedulePlanUpdateReq implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 6955873817030428268L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 节点名称
|
||||||
|
*/
|
||||||
|
private String nodeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 父ID
|
||||||
|
*/
|
||||||
|
private Long parentId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对应项目结构
|
||||||
|
*/
|
||||||
|
private Long projectStructure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对应项目结构名称
|
||||||
|
*/
|
||||||
|
private String projectStructureName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预计开始时间
|
||||||
|
*/
|
||||||
|
private LocalDate planStartDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预计结束时间
|
||||||
|
*/
|
||||||
|
private LocalDate planEndDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实际开始时间
|
||||||
|
*/
|
||||||
|
private LocalDate practicalStartDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实际结束时间
|
||||||
|
*/
|
||||||
|
private LocalDate practicalEndDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
}
|
||||||
@ -17,7 +17,7 @@ import java.util.Date;
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 工程量清单版本视图对象 bus_billofquantities_versions
|
* 工程量清单版本视图对象 bus_billofquantities_versions
|
||||||
*
|
*
|
||||||
* @author Lion Li
|
* @author Lion Li
|
||||||
* @date 2025-08-11
|
* @date 2025-08-11
|
||||||
|
|||||||
@ -0,0 +1,104 @@
|
|||||||
|
package org.dromara.design.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.excel.annotation.ExcelDictFormat;
|
||||||
|
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||||
|
import org.dromara.progress.domain.PgsConstructionSchedulePlan;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 施工进度计划视图对象 pgs_construction_schedule_plan
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-01
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
@AutoMapper(target = PgsConstructionSchedulePlan.class)
|
||||||
|
public class DesConstructionSchedulePlanVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "主键ID")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 项目ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "项目ID")
|
||||||
|
private Long projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 父ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "父ID")
|
||||||
|
private Long parentId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 节点名称
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "节点名称")
|
||||||
|
private String nodeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对应项目结构
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "对应项目结构")
|
||||||
|
private Long projectStructure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对应项目结构名称
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "对应项目结构名称")
|
||||||
|
private String projectStructureName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预计开始时间
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "预计开始时间")
|
||||||
|
private LocalDate planStartDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预计结束时间
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "预计结束时间")
|
||||||
|
private LocalDate planEndDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实际开始时间
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "实际开始时间")
|
||||||
|
private LocalDate practicalStartDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实际结束时间
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "实际结束时间")
|
||||||
|
private LocalDate practicalEndDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
|
||||||
|
@ExcelDictFormat(dictType = "project_construction_status")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "备注")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
package org.dromara.design.domain.vo;
|
||||||
|
|
||||||
|
import org.dromara.design.domain.DesSmsRecord;
|
||||||
|
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;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设计图纸短信记录视图对象 des_sms_record
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-10-13
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ExcelIgnoreUnannotated
|
||||||
|
@AutoMapper(target = DesSmsRecord.class)
|
||||||
|
public class DesSmsRecordVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "主键ID")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图纸id
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "图纸id")
|
||||||
|
private Long volumeFileId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 0-不需要再次发送 1-需要再次发送
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "0-不需要再次发送 1-需要再次发送")
|
||||||
|
private String again;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户类型(1-项目经理,2-设计部主任)
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "用户类型(1-项目经理,2-设计部主任)")
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
package org.dromara.design.mapper;
|
||||||
|
|
||||||
|
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||||
|
import org.dromara.design.domain.DesConstructionSchedulePlan;
|
||||||
|
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
|
||||||
|
import org.dromara.progress.domain.PgsConstructionSchedulePlan;
|
||||||
|
import org.dromara.progress.domain.vo.constructionscheduleplan.PgsConstructionSchedulePlanVo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 施工进度计划Mapper接口
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-01
|
||||||
|
*/
|
||||||
|
public interface DesConstructionSchedulePlanMapper extends BaseMapperPlus<DesConstructionSchedulePlan, DesConstructionSchedulePlanVo> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
package org.dromara.design.mapper;
|
||||||
|
|
||||||
|
import org.dromara.design.domain.DesSmsRecord;
|
||||||
|
import org.dromara.design.domain.vo.DesSmsRecordVo;
|
||||||
|
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设计图纸短信记录Mapper接口
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-10-13
|
||||||
|
*/
|
||||||
|
public interface DesSmsRecordMapper extends BaseMapperPlus<DesSmsRecord, DesSmsRecordVo> {
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
package org.dromara.design.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.dromara.design.domain.DesConstructionSchedulePlan;
|
||||||
|
import org.dromara.design.domain.dto.constructionscheduleplan.*;
|
||||||
|
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 施工进度计划Service接口
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-01
|
||||||
|
*/
|
||||||
|
public interface IDesConstructionSchedulePlanService extends IService<DesConstructionSchedulePlan> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询施工进度计划
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 施工进度计划
|
||||||
|
*/
|
||||||
|
DesConstructionSchedulePlanVo queryById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的施工进度计划列表
|
||||||
|
*
|
||||||
|
* @param req 查询条件
|
||||||
|
* @return 施工进度计划列表
|
||||||
|
*/
|
||||||
|
List<DesConstructionSchedulePlanVo> queryList(DesConstructionSchedulePlanQueryReq req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增施工进度计划
|
||||||
|
*
|
||||||
|
* @param req 施工进度计划
|
||||||
|
* @return 新增施工进度计划封装
|
||||||
|
*/
|
||||||
|
DesConstructionSchedulePlanVo insertByBo(DesConstructionSchedulePlanCreateReq req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改施工进度计划
|
||||||
|
*
|
||||||
|
* @param req 施工进度计划
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
Boolean updateByBo(DesConstructionSchedulePlanUpdateReq req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改施工进度计划为完成状态
|
||||||
|
*
|
||||||
|
* @param req 施工进度计划
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
Boolean updateFinish(DesConstructionSchedulePlanFinishReq req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除施工进度计划信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
Boolean deleteByIds(Collection<Long> ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取施工进度计划视图对象
|
||||||
|
*
|
||||||
|
* @param constructionSchedulePlan 施工进度计划对象
|
||||||
|
* @return 施工进度计划视图对象
|
||||||
|
*/
|
||||||
|
DesConstructionSchedulePlanVo getVo(DesConstructionSchedulePlan constructionSchedulePlan);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取施工进度计划查询条件封装
|
||||||
|
*
|
||||||
|
* @param req 查询条件
|
||||||
|
* @return 查询条件封装
|
||||||
|
*/
|
||||||
|
LambdaQueryWrapper<DesConstructionSchedulePlan> buildQueryWrapper(DesConstructionSchedulePlanQueryReq req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取施工进度计划分页对象视图
|
||||||
|
*
|
||||||
|
* @param constructionSchedulePlanList 施工进度计划分页对象
|
||||||
|
* @return 施工进度计划分页对象视图
|
||||||
|
*/
|
||||||
|
List<DesConstructionSchedulePlanVo> getVoList(List<DesConstructionSchedulePlan> constructionSchedulePlanList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出Excel
|
||||||
|
*
|
||||||
|
* @param projectId 项目id
|
||||||
|
*/
|
||||||
|
void exportExcelByProjectId(Long projectId, HttpServletResponse response);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取Excel文件
|
||||||
|
*
|
||||||
|
* @param file Excel文件
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @return 读取的数据列表
|
||||||
|
*/
|
||||||
|
List<DesConstructionSchedulePlanExcelDto> readExcel(MultipartFile file, Long projectId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将Excel数据转换为实体列表
|
||||||
|
*
|
||||||
|
* @param excelList Excel数据列表
|
||||||
|
* @return 实体列表
|
||||||
|
*/
|
||||||
|
List<DesConstructionSchedulePlan> convertToEntities(List<DesConstructionSchedulePlanExcelDto> excelList);
|
||||||
|
}
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
package org.dromara.design.service;
|
||||||
|
|
||||||
|
import org.dromara.design.domain.vo.DesSmsRecordVo;
|
||||||
|
import org.dromara.design.domain.bo.DesSmsRecordBo;
|
||||||
|
import org.dromara.design.domain.DesSmsRecord;
|
||||||
|
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 Lion Li
|
||||||
|
* @date 2025-10-13
|
||||||
|
*/
|
||||||
|
public interface IDesSmsRecordService extends IService<DesSmsRecord>{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 设计图纸短信记录
|
||||||
|
*/
|
||||||
|
DesSmsRecordVo queryById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询设计图纸短信记录列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return 设计图纸短信记录分页列表
|
||||||
|
*/
|
||||||
|
TableDataInfo<DesSmsRecordVo> queryPageList(DesSmsRecordBo bo, PageQuery pageQuery);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的设计图纸短信记录列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @return 设计图纸短信记录列表
|
||||||
|
*/
|
||||||
|
List<DesSmsRecordVo> queryList(DesSmsRecordBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @param bo 设计图纸短信记录
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
Boolean insertByBo(DesSmsRecordBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @param bo 设计图纸短信记录
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
Boolean updateByBo(DesSmsRecordBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除设计图纸短信记录信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建短信记录
|
||||||
|
*
|
||||||
|
* @param volumeFileId 卷册文件id
|
||||||
|
*/
|
||||||
|
void createSmsRecord(Long volumeFileId);
|
||||||
|
|
||||||
|
|
||||||
|
void updateSmsRecord(Long volumeFileId);
|
||||||
|
}
|
||||||
@ -0,0 +1,627 @@
|
|||||||
|
package org.dromara.design.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
import org.apache.poi.ss.util.CellRangeAddressList;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
import org.dromara.common.core.constant.HttpStatus;
|
||||||
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
|
import org.dromara.common.core.utils.ObjectUtils;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.design.domain.DesConstructionSchedulePlan;
|
||||||
|
import org.dromara.design.domain.bo.DesUserBo;
|
||||||
|
import org.dromara.design.domain.dto.constructionscheduleplan.*;
|
||||||
|
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
|
||||||
|
import org.dromara.design.mapper.DesConstructionSchedulePlanMapper;
|
||||||
|
import org.dromara.design.service.IDesConstructionSchedulePlanService;
|
||||||
|
|
||||||
|
import org.dromara.project.service.IBusProjectService;
|
||||||
|
import org.dromara.system.domain.vo.SysDictDataVo;
|
||||||
|
import org.dromara.system.service.ISysDictDataService;
|
||||||
|
import org.springframework.beans.BeanUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.ZoneId;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 施工进度计划Service业务层处理
|
||||||
|
*
|
||||||
|
* @author lilemy
|
||||||
|
* @date 2025-08-01
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class DesConstructionSchedulePlanServiceImpl extends ServiceImpl<DesConstructionSchedulePlanMapper, DesConstructionSchedulePlan>
|
||||||
|
implements IDesConstructionSchedulePlanService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IBusProjectService projectService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ISysDictDataService dictDataService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询施工进度计划
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 施工进度计划
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DesConstructionSchedulePlanVo queryById(Long id) {
|
||||||
|
DesConstructionSchedulePlan constructionSchedulePlan = this.getById(id);
|
||||||
|
if (constructionSchedulePlan == null) {
|
||||||
|
throw new ServiceException("施工进度计划信息不存在", HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
return this.getVo(constructionSchedulePlan);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的施工进度计划列表
|
||||||
|
*
|
||||||
|
* @param req 查询条件
|
||||||
|
* @return 施工进度计划列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<DesConstructionSchedulePlanVo> queryList(DesConstructionSchedulePlanQueryReq req) {
|
||||||
|
List<DesConstructionSchedulePlan> result = this.list(this.buildQueryWrapper(req));
|
||||||
|
return this.getVoList(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增施工进度计划
|
||||||
|
*
|
||||||
|
* @param req 施工进度计划
|
||||||
|
* @return 新增施工进度计划封装
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DesConstructionSchedulePlanVo insertByBo(DesConstructionSchedulePlanCreateReq req) {
|
||||||
|
DesConstructionSchedulePlan constructionSchedulePlan = new DesConstructionSchedulePlan();
|
||||||
|
BeanUtils.copyProperties(req, constructionSchedulePlan);
|
||||||
|
boolean save = this.save(constructionSchedulePlan);
|
||||||
|
if (!save) {
|
||||||
|
throw new ServiceException("新增施工进度计划信息异常", HttpStatus.ERROR);
|
||||||
|
}
|
||||||
|
DesConstructionSchedulePlan newConstructionSchedulePlan = this.getById(constructionSchedulePlan.getId());
|
||||||
|
return this.getVo(newConstructionSchedulePlan);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改施工进度计划
|
||||||
|
*
|
||||||
|
* @param req 施工进度计划
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateByBo(DesConstructionSchedulePlanUpdateReq req) {
|
||||||
|
DesConstructionSchedulePlan constructionSchedulePlan = new DesConstructionSchedulePlan();
|
||||||
|
BeanUtils.copyProperties(req, constructionSchedulePlan);
|
||||||
|
return this.updateById(constructionSchedulePlan);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改施工进度计划为完成状态
|
||||||
|
*
|
||||||
|
* @param req 施工进度计划
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateFinish(DesConstructionSchedulePlanFinishReq req) {
|
||||||
|
DesConstructionSchedulePlan plan = this.getById(req.getId());
|
||||||
|
if (plan == null) {
|
||||||
|
throw new ServiceException("施工进度计划信息不存在", HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
if (plan.getStatus().equals("4")) {
|
||||||
|
throw new ServiceException("施工进度计划已完成", HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
LocalDate practicalStartDate = plan.getPracticalStartDate();
|
||||||
|
LocalDate finishDate = req.getFinishDate();
|
||||||
|
if (practicalStartDate == null) {
|
||||||
|
throw new ServiceException("请先填写实际开始时间", HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
if (finishDate.isBefore(practicalStartDate)) {
|
||||||
|
throw new ServiceException("实际结束时间不能早于实际开始时间", HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
plan.setStatus("4");
|
||||||
|
plan.setPracticalEndDate(finishDate);
|
||||||
|
return this.updateById(plan);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除施工进度计划信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Boolean deleteByIds(Collection<Long> ids) {
|
||||||
|
return this.removeBatchByIds(ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取施工进度计划视图对象
|
||||||
|
*
|
||||||
|
* @param constructionSchedulePlan 施工进度计划对象
|
||||||
|
* @return 施工进度计划视图对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DesConstructionSchedulePlanVo getVo(DesConstructionSchedulePlan constructionSchedulePlan) {
|
||||||
|
DesConstructionSchedulePlanVo vo = new DesConstructionSchedulePlanVo();
|
||||||
|
if (constructionSchedulePlan == null) {
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
BeanUtils.copyProperties(constructionSchedulePlan, vo);
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取施工进度计划查询条件封装
|
||||||
|
*
|
||||||
|
* @param req 查询条件
|
||||||
|
* @return 查询条件封装
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public LambdaQueryWrapper<DesConstructionSchedulePlan> buildQueryWrapper(DesConstructionSchedulePlanQueryReq req) {
|
||||||
|
LambdaQueryWrapper<DesConstructionSchedulePlan> lqw = new LambdaQueryWrapper<>();
|
||||||
|
if (req == null) {
|
||||||
|
return lqw;
|
||||||
|
}
|
||||||
|
Long projectId = req.getProjectId();
|
||||||
|
String nodeName = req.getNodeName();
|
||||||
|
String status = req.getStatus();
|
||||||
|
lqw.eq(ObjectUtils.isNotEmpty(projectId), DesConstructionSchedulePlan::getProjectId, projectId);
|
||||||
|
lqw.like(StringUtils.isNotBlank(nodeName), DesConstructionSchedulePlan::getNodeName, nodeName);
|
||||||
|
lqw.eq(StringUtils.isNotBlank(status), DesConstructionSchedulePlan::getStatus, status);
|
||||||
|
return lqw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取施工进度计划分页对象视图
|
||||||
|
*
|
||||||
|
* @param constructionSchedulePlanList 施工进度计划分页对象
|
||||||
|
* @return 施工进度计划分页对象视图
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<DesConstructionSchedulePlanVo> getVoList(List<DesConstructionSchedulePlan> constructionSchedulePlanList) {
|
||||||
|
return constructionSchedulePlanList.stream().map(this::getVo).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
// region 导出 excel
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出Excel
|
||||||
|
*
|
||||||
|
* @param projectId 项目id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void exportExcelByProjectId(Long projectId, HttpServletResponse response) {
|
||||||
|
DesUserBo desUserBo = new DesUserBo();
|
||||||
|
desUserBo.setProjectId(projectId);
|
||||||
|
Map<Long, String> projectStructureMap = projectService.getStructureAsList(projectId);
|
||||||
|
if (projectStructureMap.isEmpty()) {
|
||||||
|
throw new ServiceException("获取项目列表失败,项目为空!!!");
|
||||||
|
}
|
||||||
|
List<SysDictDataVo> dictDataVos = dictDataService.selectByDictType("project_construction_status");
|
||||||
|
if (dictDataVos == null || dictDataVos.isEmpty()) {
|
||||||
|
throw new ServiceException("项目施工状态为空!!");
|
||||||
|
}
|
||||||
|
Map<String, String> statusMap = new HashMap<>();
|
||||||
|
for (SysDictDataVo vo : dictDataVos) {
|
||||||
|
statusMap.put(vo.getDictValue(), vo.getDictLabel());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Workbook workbook = new XSSFWorkbook();
|
||||||
|
// 创建主 Sheet 和隐藏 Sheet
|
||||||
|
Sheet mainSheet = workbook.createSheet("设计里程碑计划模版");
|
||||||
|
Sheet dataSheet = workbook.createSheet("DropdownData");
|
||||||
|
workbook.setSheetHidden(workbook.getSheetIndex(dataSheet), true);
|
||||||
|
|
||||||
|
// 3. 创建单元格样式
|
||||||
|
CellStyle editableStyle = createEditableCellStyle(workbook); // 可编辑单元格样式
|
||||||
|
CellStyle protectedStyle = createProtectedCellStyle(workbook); // 受保护单元格样式(ID列用
|
||||||
|
//填充隐藏数据Sheet
|
||||||
|
int rowIndex = 0;
|
||||||
|
// 填充项目关联结构(A列和B列)
|
||||||
|
for (Map.Entry<Long, String> entry : projectStructureMap.entrySet()) {
|
||||||
|
Row row = dataSheet.createRow(rowIndex++);
|
||||||
|
row.createCell(0).setCellValue(entry.getValue());
|
||||||
|
row.createCell(1).setCellValue(entry.getKey().toString());
|
||||||
|
}
|
||||||
|
// 重置行索引,填充人员和人员ID(C列和D列)
|
||||||
|
rowIndex = 0;
|
||||||
|
for (Map.Entry<String, String> entry : statusMap.entrySet()) {
|
||||||
|
Row row = dataSheet.getRow(rowIndex);
|
||||||
|
if (row == null) {
|
||||||
|
row = dataSheet.createRow(rowIndex);
|
||||||
|
}
|
||||||
|
row.createCell(4).setCellValue(entry.getValue());
|
||||||
|
row.createCell(5).setCellValue(entry.getKey());
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
// 主 Sheet 设置表头
|
||||||
|
Row sheetRow = mainSheet.createRow(0);
|
||||||
|
String[] headers = {"编号(格式:1,1.1,1.1.1。用于进行父子结构关联)", "节点名称",
|
||||||
|
"预计开始时间(输入格式:2025-09-06)", "预计结束时间", "实际开始时间", "实际结束时间", "状态", "状态编码", "备注"};
|
||||||
|
for (int i = 0; i < headers.length; i++) {
|
||||||
|
Cell cell = sheetRow.createCell(i);
|
||||||
|
cell.setCellValue(headers[i]);
|
||||||
|
if (i == 0) {
|
||||||
|
CellStyle css = workbook.createCellStyle();
|
||||||
|
DataFormat format = workbook.createDataFormat();
|
||||||
|
css.setDataFormat(format.getFormat("@"));
|
||||||
|
cell.setCellStyle(css);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// 6. 设置专业下拉列表(第二列)
|
||||||
|
// setMajorDropdown(mainSheet, projectStructureMap.size());
|
||||||
|
setStatusDropdown(mainSheet, statusMap.size());
|
||||||
|
// String formulaTemplate = "IFERROR(INDEX(DropdownData!$B$1:$B$" + projectStructureMap.size() + ", MATCH(C{rowNum}, DropdownData!$A$1:$A$" + projectStructureMap.size() + ", 0)),\"\")";
|
||||||
|
String formulaTemplate1 = "IFERROR(INDEX(DropdownData!$F$1:$F$" + statusMap.size() + ", MATCH(G{rowNum}, DropdownData!$E$1:$E$" + statusMap.size() + ", 0)),\"\")";
|
||||||
|
for (int i = 1; i <= 1000; i++) { // 从第2行到101行
|
||||||
|
Row row = mainSheet.createRow(i);
|
||||||
|
int currentRowNum = i + 1; // Excel行号从1开始
|
||||||
|
// String formula = formulaTemplate.replace("{rowNum}", String.valueOf(currentRowNum));
|
||||||
|
//
|
||||||
|
// Cell cell = row.createCell(2);
|
||||||
|
// cell.setCellStyle(editableStyle); //专业不锁定
|
||||||
|
//
|
||||||
|
// Cell idCell = row.createCell(3);
|
||||||
|
// idCell.setCellFormula(formula);
|
||||||
|
// idCell.setCellStyle(protectedStyle); // 应用隐藏公式样式
|
||||||
|
|
||||||
|
String formula1 = formulaTemplate1.replace("{rowNum}", String.valueOf(currentRowNum));
|
||||||
|
|
||||||
|
Cell cell1 = row.createCell(6);
|
||||||
|
cell1.setCellStyle(editableStyle); //专业不锁定
|
||||||
|
|
||||||
|
Cell idCell1 = row.createCell(7);
|
||||||
|
idCell1.setCellFormula(formula1);
|
||||||
|
idCell1.setCellStyle(protectedStyle); // 应用隐藏公式样式
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 1; i <= 100; i++) {
|
||||||
|
Row row = mainSheet.getRow(i);
|
||||||
|
if (row == null) {
|
||||||
|
row = mainSheet.createRow(i);
|
||||||
|
}
|
||||||
|
Cell cell = row.createCell(0);
|
||||||
|
CellStyle textStyle = workbook.createCellStyle();
|
||||||
|
textStyle.setLocked(false);
|
||||||
|
DataFormat format = workbook.createDataFormat();
|
||||||
|
textStyle.setDataFormat(format.getFormat("@")); // "@" 表示文本格式
|
||||||
|
cell.setCellStyle(textStyle);
|
||||||
|
|
||||||
|
Cell cell1 = row.createCell(1);
|
||||||
|
cell1.setCellStyle(editableStyle);
|
||||||
|
|
||||||
|
Cell cell4 = row.createCell(2);
|
||||||
|
cell4.setCellStyle(editableStyle);
|
||||||
|
|
||||||
|
Cell cell5 = row.createCell(3);
|
||||||
|
cell5.setCellStyle(editableStyle);
|
||||||
|
|
||||||
|
Cell cell6 = row.createCell(4);
|
||||||
|
cell6.setCellStyle(editableStyle);
|
||||||
|
|
||||||
|
Cell cell7 = row.createCell(5);
|
||||||
|
cell7.setCellStyle(editableStyle);
|
||||||
|
|
||||||
|
Cell cell10 = row.createCell(8);
|
||||||
|
cell10.setCellStyle(editableStyle);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 保护工作表,仅允许编辑未锁定的单元格
|
||||||
|
mainSheet.protectSheet("123456"); // 空密码
|
||||||
|
|
||||||
|
// 核心:锁定表头(第1行)和前1列(包含ID列)
|
||||||
|
mainSheet.createFreezePane(0, 1, 0, 1);
|
||||||
|
|
||||||
|
// 调整列宽(更新列索引)
|
||||||
|
mainSheet.setColumnWidth(0, 20 * 320); // 编号
|
||||||
|
mainSheet.setColumnWidth(1, 20 * 280); // 节点名称
|
||||||
|
mainSheet.setColumnWidth(2, 20 * 320); // 预计开始时间
|
||||||
|
mainSheet.setColumnWidth(3, 20 * 200); // 预计结束时间
|
||||||
|
mainSheet.setColumnWidth(4, 20 * 200); // 实际开始时间
|
||||||
|
mainSheet.setColumnWidth(5, 20 * 200); // 实际结束时间
|
||||||
|
mainSheet.setColumnWidth(6, 20 * 100); // 状态
|
||||||
|
mainSheet.setColumnWidth(7, 20 * 200); // 状态编码
|
||||||
|
mainSheet.setColumnWidth(8, 20 * 200); // 备注
|
||||||
|
|
||||||
|
|
||||||
|
// 2. 设置响应头
|
||||||
|
// 设置响应头,指定Excel格式和下载文件名
|
||||||
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||||
|
response.setCharacterEncoding("utf-8");
|
||||||
|
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("设计里程碑计划模版.xlsx", StandardCharsets.UTF_8));
|
||||||
|
|
||||||
|
// 直接写入响应输出流
|
||||||
|
try {
|
||||||
|
workbook.write(response.getOutputStream());
|
||||||
|
workbook.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建可编辑单元格样式
|
||||||
|
*/
|
||||||
|
private CellStyle createEditableCellStyle(Workbook workbook) {
|
||||||
|
CellStyle style = workbook.createCellStyle();
|
||||||
|
style.setLocked(false); // 关键:允许编辑
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建受保护单元格样式(用于ID列)
|
||||||
|
*/
|
||||||
|
private CellStyle createProtectedCellStyle(Workbook workbook) {
|
||||||
|
CellStyle style = workbook.createCellStyle();
|
||||||
|
DataFormat dataFormat = workbook.createDataFormat();
|
||||||
|
short formatIndex = dataFormat.getFormat("0"); // 匹配“自定义→0”格式
|
||||||
|
style.setDataFormat(formatIndex);
|
||||||
|
style.setHidden(true); // 隐藏公式
|
||||||
|
style.setLocked(true);
|
||||||
|
return style;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置专业下拉列表(第二列,索引1)
|
||||||
|
*/
|
||||||
|
private void setMajorDropdown(Sheet mainSheet, int majorCount) {
|
||||||
|
DataValidationHelper helper = mainSheet.getDataValidationHelper();
|
||||||
|
|
||||||
|
// 专业数据范围:数据Sheet的A列(从第1行到专业数量行)
|
||||||
|
String majorRange = "DropdownData!$A$1:$A$" + majorCount;
|
||||||
|
|
||||||
|
DataValidationConstraint constraint = helper.createFormulaListConstraint(majorRange);
|
||||||
|
// 作用范围:第2行到100行,第二列
|
||||||
|
CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, 2, 2);
|
||||||
|
|
||||||
|
DataValidation validation = helper.createValidation(constraint, addressList);
|
||||||
|
validation.setShowErrorBox(true);
|
||||||
|
mainSheet.addValidationData(validation);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置专业下拉列表(第二列,索引1)
|
||||||
|
*/
|
||||||
|
private void setStatusDropdown(Sheet mainSheet, int majorCount) {
|
||||||
|
DataValidationHelper helper = mainSheet.getDataValidationHelper();
|
||||||
|
|
||||||
|
// 专业数据范围:数据Sheet的A列(从第1行到专业数量行)
|
||||||
|
String majorRange = "DropdownData!$E$1:$E$" + majorCount;
|
||||||
|
|
||||||
|
DataValidationConstraint constraint = helper.createFormulaListConstraint(majorRange);
|
||||||
|
// 作用范围:第2行到100行,第二列
|
||||||
|
CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, 6, 6);
|
||||||
|
|
||||||
|
DataValidation validation = helper.createValidation(constraint, addressList);
|
||||||
|
validation.setShowErrorBox(true);
|
||||||
|
mainSheet.addValidationData(validation);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取Excel文件
|
||||||
|
*
|
||||||
|
* @param file Excel文件
|
||||||
|
* @param projectId 项目ID
|
||||||
|
* @return 读取的数据列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<DesConstructionSchedulePlanExcelDto> readExcel(MultipartFile file, Long projectId) {
|
||||||
|
List<DesConstructionSchedulePlanExcelDto> dataList = new ArrayList<>();
|
||||||
|
|
||||||
|
try (InputStream inputStream = file.getInputStream();
|
||||||
|
XSSFWorkbook workbook = new XSSFWorkbook(inputStream)) {
|
||||||
|
|
||||||
|
XSSFSheet sheet = workbook.getSheetAt(0);
|
||||||
|
|
||||||
|
// 从第二行(index=1)开始读取数据,跳过表头
|
||||||
|
for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
|
||||||
|
Row row = sheet.getRow(rowIndex);
|
||||||
|
if (hasValidData(row)) {
|
||||||
|
String number = getCellValue(row.getCell(0));
|
||||||
|
String nodeName = getCellValue(row.getCell(1));
|
||||||
|
String projectStructureName = null;
|
||||||
|
Long projectStructure = null;
|
||||||
|
LocalDate planStartDate = getLocalDateValue(row.getCell(2));
|
||||||
|
LocalDate planEndDate = getLocalDateValue(row.getCell(3));
|
||||||
|
LocalDate practicalStartDate = getLocalDateValue(row.getCell(4));
|
||||||
|
LocalDate practicalEndDate = getLocalDateValue(row.getCell(5));
|
||||||
|
String status = getCellValue(row.getCell(7));
|
||||||
|
String remark = getCellValue(row.getCell(8));
|
||||||
|
|
||||||
|
DesConstructionSchedulePlanExcelDto excelData = new DesConstructionSchedulePlanExcelDto(
|
||||||
|
number, projectId, nodeName, projectStructure, projectStructureName,
|
||||||
|
planStartDate, planEndDate, practicalStartDate, practicalEndDate, status, remark
|
||||||
|
);
|
||||||
|
dataList.add(excelData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("读取表格数据失败", e);
|
||||||
|
throw new ServiceException("读取表格数据失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
return dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将Excel数据转换为实体列表
|
||||||
|
*
|
||||||
|
* @param excelList Excel数据列表
|
||||||
|
* @return 实体列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<DesConstructionSchedulePlan> convertToEntities(List<DesConstructionSchedulePlanExcelDto> excelList) {
|
||||||
|
List<DesConstructionSchedulePlan> result = new ArrayList<>();
|
||||||
|
Map<String, Long> numberIdMap = new HashMap<>();
|
||||||
|
|
||||||
|
for (DesConstructionSchedulePlanExcelDto dto : excelList) {
|
||||||
|
DesConstructionSchedulePlan entity = new DesConstructionSchedulePlan();
|
||||||
|
|
||||||
|
LocalDate planStartDate = dto.getPlanStartDate();
|
||||||
|
LocalDate planEndDate = dto.getPlanEndDate();
|
||||||
|
if (planStartDate == null || planEndDate == null || planStartDate.isAfter(planEndDate)) {
|
||||||
|
throw new ServiceException("计划开始时间和计划结束时间不能为空,且计划开始时间不能大于计划结束时间", HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成主键
|
||||||
|
Long id = IdWorker.getId();
|
||||||
|
entity.setId(id);
|
||||||
|
|
||||||
|
entity.setProjectId(dto.getProjectId());
|
||||||
|
entity.setNodeName(dto.getNodeName());
|
||||||
|
entity.setProjectStructure(dto.getProjectStructure());
|
||||||
|
entity.setProjectStructureName(dto.getProjectStructureName());
|
||||||
|
entity.setPlanStartDate(planStartDate);
|
||||||
|
entity.setPlanEndDate(planEndDate);
|
||||||
|
entity.setPracticalStartDate(dto.getPracticalStartDate());
|
||||||
|
entity.setPracticalEndDate(dto.getPracticalEndDate());
|
||||||
|
entity.setStatus(dto.getStatus());
|
||||||
|
entity.setRemark(dto.getRemark());
|
||||||
|
// 确定父ID
|
||||||
|
String number = dto.getNumber();
|
||||||
|
if (number != null && number.contains(".")) {
|
||||||
|
String parentNumber = number.substring(0, number.lastIndexOf("."));
|
||||||
|
Long parentId = numberIdMap.get(parentNumber);
|
||||||
|
if (parentId == null) {
|
||||||
|
throw new ServiceException("未找到父编号:" + parentNumber, HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
entity.setParentId(parentId);
|
||||||
|
} else {
|
||||||
|
entity.setParentId(0L); // 顶级节点
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存当前编号对应的id
|
||||||
|
numberIdMap.put(number, id);
|
||||||
|
result.add(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean hasValidData(Row row) {
|
||||||
|
// 遍历行中的所有单元格
|
||||||
|
for (int cellIndex = 0; cellIndex < row.getLastCellNum(); cellIndex++) {
|
||||||
|
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
|
||||||
|
String cellValue = getCellValue(cell).trim();
|
||||||
|
|
||||||
|
// 只要有一个单元格有非空值,就认为是有效行
|
||||||
|
if (!cellValue.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getCellValue(Cell cell) {
|
||||||
|
if (cell == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
// 使用CellType枚举判断单元格类型(POI 4.0+版本推荐方式)
|
||||||
|
CellType cellType = cell.getCellType();
|
||||||
|
// 对于公式单元格,获取其计算结果的类型
|
||||||
|
if (cellType == CellType.FORMULA) {
|
||||||
|
cellType = cell.getCachedFormulaResultType();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cellType) {
|
||||||
|
case STRING:
|
||||||
|
return cell.getStringCellValue().trim();
|
||||||
|
case NUMERIC:
|
||||||
|
if (DateUtil.isCellDateFormatted(cell)) {
|
||||||
|
Date date = cell.getDateCellValue();
|
||||||
|
return date.toString();
|
||||||
|
} else {
|
||||||
|
// 处理数字类型,避免科学计数法
|
||||||
|
// 处理数字,移除不必要的.0后缀
|
||||||
|
String numericValue = String.valueOf(cell.getNumericCellValue());
|
||||||
|
if (numericValue.endsWith(".0")) {
|
||||||
|
return numericValue.substring(0, numericValue.length() - 2);
|
||||||
|
}
|
||||||
|
return numericValue;
|
||||||
|
}
|
||||||
|
case BOOLEAN:
|
||||||
|
return String.valueOf(cell.getBooleanCellValue());
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LocalDate getLocalDateValue(Cell cell) {
|
||||||
|
if (cell == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
CellType cellType = cell.getCellType();
|
||||||
|
if (cellType == CellType.FORMULA) {
|
||||||
|
cellType = cell.getCachedFormulaResultType();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (cellType == CellType.NUMERIC) {
|
||||||
|
if (DateUtil.isCellDateFormatted(cell)) {
|
||||||
|
Date date = cell.getDateCellValue();
|
||||||
|
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
||||||
|
} else {
|
||||||
|
// 如果是数字但不是日期,就尝试转为 LocalDate (例如 20250730)
|
||||||
|
double numericValue = cell.getNumericCellValue();
|
||||||
|
String text = String.valueOf((long) numericValue);
|
||||||
|
return LocalDate.parse(text);
|
||||||
|
}
|
||||||
|
} else if (cellType == CellType.STRING) {
|
||||||
|
String text = cell.getStringCellValue().trim();
|
||||||
|
if (text.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 尝试解析不同格式
|
||||||
|
try {
|
||||||
|
return LocalDate.parse(text); // 默认 ISO 格式 yyyy-MM-dd
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 如果 Excel 是 yyyy/MM/dd 或 yyyy.MM.dd,可以额外处理
|
||||||
|
try {
|
||||||
|
return LocalDate.parse(text, java.time.format.DateTimeFormatter.ofPattern("yyyy/MM/dd"));
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return LocalDate.parse(text, java.time.format.DateTimeFormatter.ofPattern("yyyy.MM.dd"));
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
return null; // 不识别的格式就返回 null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -628,6 +628,7 @@ public class DesDesignChangeServiceImpl extends ServiceImpl<DesDesignChangeMappe
|
|||||||
} else if ("2".equals(bean.getDesignDisposal())) {
|
} else if ("2".equals(bean.getDesignDisposal())) {
|
||||||
LambdaUpdateWrapper<DesVolumeFile> wrapper = new LambdaUpdateWrapper<>();
|
LambdaUpdateWrapper<DesVolumeFile> wrapper = new LambdaUpdateWrapper<>();
|
||||||
wrapper.set(DesVolumeFile::getType, DesVolumeFile.WASTE)
|
wrapper.set(DesVolumeFile::getType, DesVolumeFile.WASTE)
|
||||||
|
.eq(DesVolumeFile::getType, DesVolumeFile.BLUEPRINT)
|
||||||
.eq(DesVolumeFile::getVolumeCatalogId, volumeCatalog.getDesign());
|
.eq(DesVolumeFile::getVolumeCatalogId, volumeCatalog.getDesign());
|
||||||
String saveFile = designChange.getSaveFile();
|
String saveFile = designChange.getSaveFile();
|
||||||
if (StringUtils.isNotBlank(saveFile)) {
|
if (StringUtils.isNotBlank(saveFile)) {
|
||||||
@ -658,7 +659,7 @@ public class DesDesignChangeServiceImpl extends ServiceImpl<DesDesignChangeMappe
|
|||||||
String lastVersion = list.getFirst().getVersion();
|
String lastVersion = list.getFirst().getVersion();
|
||||||
// 提取版本号数字部分(去除LT-前缀)
|
// 提取版本号数字部分(去除LT-前缀)
|
||||||
String versionNumber = lastVersion;
|
String versionNumber = lastVersion;
|
||||||
if (lastVersion.startsWith("LT-")) {
|
if (lastVersion.startsWith("LT-") || lastVersion.startsWith("GC-")) {
|
||||||
versionNumber = lastVersion.substring(3); // 去除"LT-"前缀
|
versionNumber = lastVersion.substring(3); // 去除"LT-"前缀
|
||||||
}
|
}
|
||||||
int majorVersion = (int) Math.floor(Double.parseDouble(versionNumber)) + 1;
|
int majorVersion = (int) Math.floor(Double.parseDouble(versionNumber)) + 1;
|
||||||
|
|||||||
@ -448,9 +448,9 @@ public class DesDrawingServiceImpl extends ServiceImpl<DesDrawingMapper, DesDraw
|
|||||||
try {
|
try {
|
||||||
ByteArrayOutputStream baos = PdfBoxQrCodeGenerator.addQRCodeToPDFOnAllPages(ossVo.getUrl(), bytes,isChangeFile);
|
ByteArrayOutputStream baos = PdfBoxQrCodeGenerator.addQRCodeToPDFOnAllPages(ossVo.getUrl(), bytes,isChangeFile);
|
||||||
|
|
||||||
try (FileOutputStream fileOut = new FileOutputStream("C:\\Users\\YuanJie\\Desktop\\test1.pdf")) {
|
// try (FileOutputStream fileOut = new FileOutputStream("C:\\Users\\YuanJie\\Desktop\\test1.pdf")) {
|
||||||
baos.writeTo(fileOut);
|
// baos.writeTo(fileOut);
|
||||||
}
|
// }
|
||||||
|
|
||||||
FileNameMap fileNameMap = URLConnection.getFileNameMap();
|
FileNameMap fileNameMap = URLConnection.getFileNameMap();
|
||||||
String originalName = ossVo.getOriginalName();
|
String originalName = ossVo.getOriginalName();
|
||||||
|
|||||||
@ -0,0 +1,228 @@
|
|||||||
|
package org.dromara.design.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.design.domain.DesVolumeCatalog;
|
||||||
|
import org.dromara.design.domain.DesVolumeFile;
|
||||||
|
import org.dromara.design.domain.DesVolumeFileViewer;
|
||||||
|
import org.dromara.design.service.IDesVolumeCatalogService;
|
||||||
|
import org.dromara.design.service.IDesVolumeFileService;
|
||||||
|
import org.dromara.design.service.IDesVolumeFileViewerService;
|
||||||
|
import org.dromara.system.domain.SysUser;
|
||||||
|
import org.dromara.system.service.ISysRoleService;
|
||||||
|
import org.dromara.system.service.ISysUserService;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.dromara.design.domain.bo.DesSmsRecordBo;
|
||||||
|
import org.dromara.design.domain.vo.DesSmsRecordVo;
|
||||||
|
import org.dromara.design.domain.DesSmsRecord;
|
||||||
|
import org.dromara.design.mapper.DesSmsRecordMapper;
|
||||||
|
import org.dromara.design.service.IDesSmsRecordService;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设计图纸短信记录Service业务层处理
|
||||||
|
*
|
||||||
|
* @author Lion Li
|
||||||
|
* @date 2025-10-13
|
||||||
|
*/
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class DesSmsRecordServiceImpl extends ServiceImpl<DesSmsRecordMapper, DesSmsRecord> implements IDesSmsRecordService {
|
||||||
|
|
||||||
|
private final DesSmsRecordMapper baseMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy
|
||||||
|
private IDesVolumeFileViewerService volumeFileViewerService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy
|
||||||
|
private ISysRoleService roleService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy
|
||||||
|
private ISysUserService userService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy
|
||||||
|
private IDesVolumeFileService designFileService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
@Lazy
|
||||||
|
private IDesVolumeCatalogService volumeCatalogService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
* @return 设计图纸短信记录
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DesSmsRecordVo queryById(Long id) {
|
||||||
|
return baseMapper.selectVoById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分页查询设计图纸短信记录列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @param pageQuery 分页参数
|
||||||
|
* @return 设计图纸短信记录分页列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public TableDataInfo<DesSmsRecordVo> queryPageList(DesSmsRecordBo bo, PageQuery pageQuery) {
|
||||||
|
LambdaQueryWrapper<DesSmsRecord> lqw = buildQueryWrapper(bo);
|
||||||
|
Page<DesSmsRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||||
|
return TableDataInfo.build(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询符合条件的设计图纸短信记录列表
|
||||||
|
*
|
||||||
|
* @param bo 查询条件
|
||||||
|
* @return 设计图纸短信记录列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<DesSmsRecordVo> queryList(DesSmsRecordBo bo) {
|
||||||
|
LambdaQueryWrapper<DesSmsRecord> lqw = buildQueryWrapper(bo);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LambdaQueryWrapper<DesSmsRecord> buildQueryWrapper(DesSmsRecordBo bo) {
|
||||||
|
Map<String, Object> params = bo.getParams();
|
||||||
|
LambdaQueryWrapper<DesSmsRecord> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.orderByDesc(DesSmsRecord::getId);
|
||||||
|
lqw.eq(bo.getVolumeFileId() != null, DesSmsRecord::getVolumeFileId, bo.getVolumeFileId());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getAgain()), DesSmsRecord::getAgain, bo.getAgain());
|
||||||
|
lqw.eq(StringUtils.isNotBlank(bo.getType()), DesSmsRecord::getType, bo.getType());
|
||||||
|
return lqw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @param bo 设计图纸短信记录
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean insertByBo(DesSmsRecordBo bo) {
|
||||||
|
DesSmsRecord add = MapstructUtils.convert(bo, DesSmsRecord.class);
|
||||||
|
validEntityBeforeSave(add);
|
||||||
|
boolean flag = baseMapper.insert(add) > 0;
|
||||||
|
if (flag) {
|
||||||
|
bo.setId(add.getId());
|
||||||
|
}
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改设计图纸短信记录
|
||||||
|
*
|
||||||
|
* @param bo 设计图纸短信记录
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean updateByBo(DesSmsRecordBo bo) {
|
||||||
|
DesSmsRecord update = MapstructUtils.convert(bo, DesSmsRecord.class);
|
||||||
|
validEntityBeforeSave(update);
|
||||||
|
return baseMapper.updateById(update) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存前的数据校验
|
||||||
|
*/
|
||||||
|
private void validEntityBeforeSave(DesSmsRecord entity) {
|
||||||
|
//TODO 做一些数据校验,如唯一约束
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验并批量删除设计图纸短信记录信息
|
||||||
|
*
|
||||||
|
* @param ids 待删除的主键集合
|
||||||
|
* @param isValid 是否进行有效性校验
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||||
|
if (isValid) {
|
||||||
|
//TODO 做一些业务上的校验,判断是否需要校验
|
||||||
|
}
|
||||||
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Async
|
||||||
|
public void createSmsRecord(Long volumeFileId) {
|
||||||
|
|
||||||
|
List<DesSmsRecord> desSmsRecords = new ArrayList<>();
|
||||||
|
|
||||||
|
DesSmsRecord desSmsRecord = new DesSmsRecord();
|
||||||
|
desSmsRecord.setVolumeFileId(volumeFileId);
|
||||||
|
desSmsRecord.setAgain("1");
|
||||||
|
desSmsRecord.setType("1");
|
||||||
|
desSmsRecords.add(desSmsRecord);
|
||||||
|
|
||||||
|
DesSmsRecord desSmsRecord1 = new DesSmsRecord();
|
||||||
|
desSmsRecord1.setVolumeFileId(volumeFileId);
|
||||||
|
desSmsRecord1.setAgain("1");
|
||||||
|
desSmsRecord1.setType("2");
|
||||||
|
|
||||||
|
desSmsRecords.add(desSmsRecord1);
|
||||||
|
baseMapper.insertBatch(desSmsRecords);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Async
|
||||||
|
public void updateSmsRecord(Long volumeFileId) {
|
||||||
|
List<DesSmsRecord> desSmsRecords = baseMapper.selectList(Wrappers.<DesSmsRecord>lambdaQuery()
|
||||||
|
.eq(DesSmsRecord::getVolumeFileId, volumeFileId)
|
||||||
|
.eq(DesSmsRecord::getAgain, "1")
|
||||||
|
);
|
||||||
|
for (DesSmsRecord record : desSmsRecords) {
|
||||||
|
DesVolumeFile desVolumeFile = designFileService.getById(record.getVolumeFileId());
|
||||||
|
DesVolumeCatalog desVolumeCatalog = volumeCatalogService.getById(desVolumeFile.getVolumeCatalogId());
|
||||||
|
|
||||||
|
List<Long> longs = new ArrayList<>();
|
||||||
|
if (record.getType().equals("1")) {
|
||||||
|
longs = roleService.selectRoleIdsByName("项目经理");
|
||||||
|
} else {
|
||||||
|
longs.add(1961028169115197442L);
|
||||||
|
}
|
||||||
|
if (CollectionUtil.isEmpty(longs)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, desVolumeCatalog.getProjectId());
|
||||||
|
List<Long> userIds = sysUsers.stream().map(SysUser::getUserId).toList();
|
||||||
|
if (CollectionUtil.isEmpty(userIds)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
List<DesVolumeFileViewer> list = volumeFileViewerService.list(Wrappers.lambdaQuery(DesVolumeFileViewer.class)
|
||||||
|
.eq(DesVolumeFileViewer::getVolumeFileId, record.getVolumeFileId())
|
||||||
|
.in(DesVolumeFileViewer::getUserId, userIds)
|
||||||
|
);
|
||||||
|
List<Long> list1 = list.stream().map(DesVolumeFileViewer::getUserId).toList();
|
||||||
|
|
||||||
|
List<SysUser> list2 = sysUsers.stream().filter(vo -> !list1.contains(vo.getUserId())).toList();
|
||||||
|
if (list2.isEmpty()) {
|
||||||
|
record.setAgain("0");
|
||||||
|
baseMapper.updateById(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -34,10 +34,7 @@ import org.dromara.design.domain.dto.volumefile.DesVolumeFileCreateReq;
|
|||||||
import org.dromara.design.domain.vo.BusDrawingreviewReceiptsVo;
|
import org.dromara.design.domain.vo.BusDrawingreviewReceiptsVo;
|
||||||
import org.dromara.design.domain.vo.volumefile.*;
|
import org.dromara.design.domain.vo.volumefile.*;
|
||||||
import org.dromara.design.mapper.DesVolumeFileMapper;
|
import org.dromara.design.mapper.DesVolumeFileMapper;
|
||||||
import org.dromara.design.service.IBusDrawingreviewReceiptsService;
|
import org.dromara.design.service.*;
|
||||||
import org.dromara.design.service.IDesDrawingService;
|
|
||||||
import org.dromara.design.service.IDesVolumeCatalogService;
|
|
||||||
import org.dromara.design.service.IDesVolumeFileService;
|
|
||||||
import org.dromara.project.domain.BusProject;
|
import org.dromara.project.domain.BusProject;
|
||||||
import org.dromara.project.service.IBusProjectService;
|
import org.dromara.project.service.IBusProjectService;
|
||||||
import org.dromara.system.domain.SysUser;
|
import org.dromara.system.domain.SysUser;
|
||||||
@ -95,6 +92,9 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
|
|||||||
@Resource
|
@Resource
|
||||||
private ISysRoleService roleService;
|
private ISysRoleService roleService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IDesSmsRecordService desSmsRecordService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询卷册文件列表
|
* 分页查询卷册文件列表
|
||||||
@ -421,17 +421,17 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
|
|||||||
|
|
||||||
if (DesVolumeFile.BLUEPRINT.equals(type)) {
|
if (DesVolumeFile.BLUEPRINT.equals(type)) {
|
||||||
// 蓝图文件:LT-1.0, LT-1.1, LT-1.2...
|
// 蓝图文件:LT-1.0, LT-1.1, LT-1.2...
|
||||||
double maxVersion = Double.parseDouble(maxBatchVersion);
|
if (CollectionUtil.isEmpty(existingFilesInDB)) {
|
||||||
int majorVersion = (int) Math.floor(maxVersion);
|
// 没有历史版本,从1.0开始,根据文件索引递增
|
||||||
int minorVersion = (int) ((maxVersion - majorVersion) * 10) + fileIndex + 1;
|
int minorVersion = fileIndex;
|
||||||
|
versionStr = "LT-1." + minorVersion;
|
||||||
// 如果是第一个文件且没有历史版本,则从1.0开始
|
|
||||||
if (fileIndex == 0 && CollectionUtil.isEmpty(existingFilesInDB)) {
|
|
||||||
versionStr = "1.0";
|
|
||||||
} else {
|
} else {
|
||||||
versionStr = majorVersion + "." + minorVersion;
|
// 有历史版本,基于最高版本递增
|
||||||
|
double maxVersion = Double.parseDouble(maxBatchVersion);
|
||||||
|
int majorVersion = (int) Math.floor(maxVersion);
|
||||||
|
int minorVersion = (int) Math.round((maxVersion - majorVersion) * 10) + fileIndex + 1;
|
||||||
|
versionStr = "LT-" + majorVersion + "." + minorVersion;
|
||||||
}
|
}
|
||||||
versionStr = "LT-" + versionStr;
|
|
||||||
} else if (DesVolumeFile.PROCESS.equals(type)) {
|
} else if (DesVolumeFile.PROCESS.equals(type)) {
|
||||||
// 过程图纸:基于蓝图版本号
|
// 过程图纸:基于蓝图版本号
|
||||||
List<DesVolumeFile> blueprintFiles = baseMapper.selectList(new LambdaQueryWrapper<DesVolumeFile>()
|
List<DesVolumeFile> blueprintFiles = baseMapper.selectList(new LambdaQueryWrapper<DesVolumeFile>()
|
||||||
@ -621,12 +621,15 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
|
|||||||
|
|
||||||
//异步发送消息 项目经理 设计部主任(1961028169115197442)
|
//异步发送消息 项目经理 设计部主任(1961028169115197442)
|
||||||
DesVolumeCatalog byId = volumeCatalogService.getById(desVolumeFile.getVolumeCatalogId());
|
DesVolumeCatalog byId = volumeCatalogService.getById(desVolumeFile.getVolumeCatalogId());
|
||||||
List<Long> longs = roleService.selectRoleIdsByName("项目经理");
|
ArrayList<Long> longs = new ArrayList<>();
|
||||||
|
List<Long> longs1 = roleService.selectRoleIdsByName("项目经理");
|
||||||
|
longs.addAll(longs1);
|
||||||
longs.add(1961028169115197442L);
|
longs.add(1961028169115197442L);
|
||||||
|
|
||||||
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, byId.getProjectId());
|
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, byId.getProjectId());
|
||||||
asyncUtil.sendSms(sysUsers.stream().map(SysUser::getPhonenumber).toList(), "config5");
|
asyncUtil.sendSms(sysUsers.stream().map(SysUser::getPhonenumber).toList(), "config5");
|
||||||
asyncUtil.sendSse(sysUsers.stream().map(SysUser::getUserId).toList(), "有新的蓝图审批完成");
|
asyncUtil.sendSse(sysUsers.stream().map(SysUser::getUserId).toList(), "有新的过程图纸审批完成");
|
||||||
|
desSmsRecordService.createSmsRecord(desVolumeFile.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -692,12 +695,14 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
|
|||||||
});
|
});
|
||||||
//异步发送消息 项目经理 设计部主任(1961028169115197442)
|
//异步发送消息 项目经理 设计部主任(1961028169115197442)
|
||||||
DesVolumeCatalog byId = volumeCatalogService.getById(desVolumeFile.getVolumeCatalogId());
|
DesVolumeCatalog byId = volumeCatalogService.getById(desVolumeFile.getVolumeCatalogId());
|
||||||
List<Long> longs = roleService.selectRoleIdsByName("项目经理");
|
ArrayList<Long> longs = new ArrayList<>();
|
||||||
|
List<Long> longs1 = roleService.selectRoleIdsByName("项目经理");
|
||||||
|
longs.addAll(longs1);
|
||||||
longs.add(1961028169115197442L);
|
longs.add(1961028169115197442L);
|
||||||
|
|
||||||
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, byId.getProjectId());
|
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, byId.getProjectId());
|
||||||
asyncUtil.sendSms(sysUsers.stream().map(SysUser::getPhonenumber).toList(), "config5");
|
asyncUtil.sendSms(sysUsers.stream().map(SysUser::getPhonenumber).toList(), "config5");
|
||||||
asyncUtil.sendSse(sysUsers.stream().map(SysUser::getUserId).toList(), "有新的蓝图审批完成");
|
asyncUtil.sendSse(sysUsers.stream().map(SysUser::getUserId).toList(), "有新的蓝图审批完成");
|
||||||
|
desSmsRecordService.createSmsRecord(desVolumeFile.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package org.dromara.design.service.impl;
|
|||||||
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
@ -13,6 +14,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.design.domain.vo.volumefileviewer.DesVolumeFileViewerVo;
|
import org.dromara.design.domain.vo.volumefileviewer.DesVolumeFileViewerVo;
|
||||||
|
import org.dromara.design.service.IDesSmsRecordService;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.dromara.design.domain.bo.DesVolumeFileViewerBo;
|
import org.dromara.design.domain.bo.DesVolumeFileViewerBo;
|
||||||
|
|
||||||
@ -36,6 +39,8 @@ public class DesVolumeFileViewerServiceImpl extends ServiceImpl<DesVolumeFileVie
|
|||||||
|
|
||||||
private final DesVolumeFileViewerMapper baseMapper;
|
private final DesVolumeFileViewerMapper baseMapper;
|
||||||
|
|
||||||
|
private final IDesSmsRecordService desSmsRecordService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询卷册文件查阅人
|
* 查询卷册文件查阅人
|
||||||
*
|
*
|
||||||
@ -98,6 +103,7 @@ public class DesVolumeFileViewerServiceImpl extends ServiceImpl<DesVolumeFileVie
|
|||||||
if (flag) {
|
if (flag) {
|
||||||
bo.setId(add.getId());
|
bo.setId(add.getId());
|
||||||
}
|
}
|
||||||
|
desSmsRecordService.updateSmsRecord(bo.getVolumeFileId());
|
||||||
return flag;
|
return flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package org.dromara.drone.service.impl;
|
package org.dromara.drone.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
@ -151,7 +152,9 @@ public class DroProjectDroneServiceImpl extends ServiceImpl<DroProjectDroneMappe
|
|||||||
List<DroProjectDrone> list = this.lambdaQuery()
|
List<DroProjectDrone> list = this.lambdaQuery()
|
||||||
.eq(DroProjectDrone::getProjectId, projectId)
|
.eq(DroProjectDrone::getProjectId, projectId)
|
||||||
.list();
|
.list();
|
||||||
droneManager.addAirportInfoByProject(list.stream().map(DroProjectDrone::getDroneSn).toList(), projectId);
|
if (CollUtil.isNotEmpty(list)) {
|
||||||
|
droneManager.addAirportInfoByProject(list.stream().map(DroProjectDrone::getDroneSn).toList(), projectId);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package org.dromara.facility.controller;
|
package org.dromara.facility.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import cn.dev33.satoken.annotation.SaMode;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
@ -41,7 +42,7 @@ public class FacRedLineController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询设施-红线列表
|
* 查询设施-红线列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("facility:redLine:list")
|
@SaCheckPermission(value = {"facility:redLine:list", "project:big:screen"}, mode = SaMode.OR)
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<FacRedLineVo> list(FacRedLineBo bo, PageQuery pageQuery) {
|
public TableDataInfo<FacRedLineVo> list(FacRedLineBo bo, PageQuery pageQuery) {
|
||||||
return facRedLineService.queryPageList(bo, pageQuery);
|
return facRedLineService.queryPageList(bo, pageQuery);
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletResponse;
|
|||||||
import jakarta.validation.constraints.*;
|
import jakarta.validation.constraints.*;
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
|
import org.dromara.gps.domain.vo.GpsStatusVo;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
@ -56,6 +57,16 @@ public class GpsEquipmentSonController extends BaseController {
|
|||||||
return R.ok(gpsEquipmentSonService.queryList(bo));
|
return R.ok(gpsEquipmentSonService.queryList(bo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询GPS设备定位日期信息列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("gps:equipmentSon:getRlList")
|
||||||
|
@GetMapping("/getRlList")
|
||||||
|
public R<List<GpsStatusVo>> getRlList(GpsEquipmentSonBo bo) {
|
||||||
|
return R.ok(gpsEquipmentSonService.getRlList(bo));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询GPS设备定位信息列表(大屏获取人员最后一次位置)
|
* 查询GPS设备定位信息列表(大屏获取人员最后一次位置)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import lombok.Data;
|
|||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 安全帽经纬度数据对象 location
|
* 安全帽经纬度数据对象 location
|
||||||
@ -60,17 +61,17 @@ public class Location extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 纬度
|
* 纬度
|
||||||
*/
|
*/
|
||||||
private Long latitude;
|
private Float latitude;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 经度
|
* 经度
|
||||||
*/
|
*/
|
||||||
private Long longitude;
|
private Float longitude;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 海拔
|
* 海拔
|
||||||
*/
|
*/
|
||||||
private Long elevation;
|
private Float elevation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 速度
|
* 速度
|
||||||
|
|||||||
@ -63,17 +63,17 @@ public class LocationBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 纬度
|
* 纬度
|
||||||
*/
|
*/
|
||||||
private Long latitude;
|
private Float latitude;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 经度
|
* 经度
|
||||||
*/
|
*/
|
||||||
private Long longitude;
|
private Float longitude;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 海拔
|
* 海拔
|
||||||
*/
|
*/
|
||||||
private Long elevation;
|
private Float elevation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 速度
|
* 速度
|
||||||
|
|||||||
@ -0,0 +1,12 @@
|
|||||||
|
package org.dromara.gps.domain.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class GpsStatusVo implements Serializable {
|
||||||
|
private LocalDate riqi;
|
||||||
|
private Long count;
|
||||||
|
}
|
||||||
@ -11,6 +11,7 @@ import lombok.Data;
|
|||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
@ -76,19 +77,19 @@ public class LocationVo implements Serializable {
|
|||||||
* 纬度
|
* 纬度
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "纬度")
|
@ExcelProperty(value = "纬度")
|
||||||
private Long latitude;
|
private Float latitude;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 经度
|
* 经度
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "经度")
|
@ExcelProperty(value = "经度")
|
||||||
private Long longitude;
|
private Float longitude;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 海拔
|
* 海拔
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "海拔")
|
@ExcelProperty(value = "海拔")
|
||||||
private Long elevation;
|
private Float elevation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 速度
|
* 速度
|
||||||
|
|||||||
@ -3,8 +3,10 @@ package org.dromara.gps.mapper;
|
|||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.apache.ibatis.annotations.Select;
|
import org.apache.ibatis.annotations.Select;
|
||||||
import org.dromara.gps.domain.GpsEquipmentSon;
|
import org.dromara.gps.domain.GpsEquipmentSon;
|
||||||
|
import org.dromara.gps.domain.bo.GpsEquipmentSonBo;
|
||||||
import org.dromara.gps.domain.vo.GpsEquipmentSonVo;
|
import org.dromara.gps.domain.vo.GpsEquipmentSonVo;
|
||||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||||
|
import org.dromara.gps.domain.vo.GpsStatusVo;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -25,12 +27,13 @@ public interface GpsEquipmentSonMapper extends BaseMapperPlus<GpsEquipmentSon, G
|
|||||||
" gps_equipment_son \n" +
|
" gps_equipment_son \n" +
|
||||||
"WHERE \n" +
|
"WHERE \n" +
|
||||||
"project_id = #{projectId} \n " +
|
"project_id = #{projectId} \n " +
|
||||||
// "AND create_time BETWEEN #{startTime} AND #{endTime}\n" +
|
"AND create_time BETWEEN #{startTime} AND #{endTime}\n" +
|
||||||
")\n" +
|
")\n" +
|
||||||
"SELECT\n" +
|
"SELECT\n" +
|
||||||
" *\n" +
|
" r.*,su.nick_name as userName\n" +
|
||||||
"FROM\n" +
|
"FROM\n" +
|
||||||
" RankedData\n" +
|
" RankedData r\n" +
|
||||||
|
"LEFT JOIN sys_user su ON r.user_id=su.user_id\n" +
|
||||||
"WHERE\n" +
|
"WHERE\n" +
|
||||||
" rn = 1;")
|
" rn = 1;")
|
||||||
List<GpsEquipmentSonVo> getClientList(@Param("projectId") Long projectId, @Param("startTime") LocalDateTime startOfDay, @Param("endTime") LocalDateTime now);
|
List<GpsEquipmentSonVo> getClientList(@Param("projectId") Long projectId, @Param("startTime") LocalDateTime startOfDay, @Param("endTime") LocalDateTime now);
|
||||||
@ -67,13 +70,42 @@ public interface GpsEquipmentSonMapper extends BaseMapperPlus<GpsEquipmentSon, G
|
|||||||
"WHERE \n" +
|
"WHERE \n" +
|
||||||
"project_id = #{projectId}\n " +
|
"project_id = #{projectId}\n " +
|
||||||
"AND client_id IS NULL \n" +
|
"AND client_id IS NULL \n" +
|
||||||
// "AND create_time BETWEEN #{startTime} AND #{endTime} \n" +
|
"AND create_time BETWEEN #{startTime} AND #{endTime} \n" +
|
||||||
")\n" +
|
")\n" +
|
||||||
"SELECT\n" +
|
"SELECT\n" +
|
||||||
" *\n" +
|
" r.*,su.nick_name as userName\n" +
|
||||||
"FROM\n" +
|
"FROM\n" +
|
||||||
" RankedData\n" +
|
" RankedData r " +
|
||||||
|
"LEFT JOIN sys_user su ON r.user_id=su.user_id\n" +
|
||||||
"WHERE\n" +
|
"WHERE\n" +
|
||||||
" rn = 1;")
|
" rn = 1;")
|
||||||
List<GpsEquipmentSonVo> getUserListByProjectId(@Param("projectId") Long projectId, @Param("startTime") LocalDateTime startOfDay, @Param("endTime") LocalDateTime now);
|
List<GpsEquipmentSonVo> getUserListByProjectId(@Param("projectId") Long projectId, @Param("startTime") LocalDateTime startOfDay, @Param("endTime") LocalDateTime now);
|
||||||
|
|
||||||
|
@Select("WITH RECURSIVE date_range AS (\n" +
|
||||||
|
" -- 1. 初始化开始日期(取startTime的“年月日”部分,忽略时分秒)\n" +
|
||||||
|
" SELECT DATE(#{bo.startTime}) AS stat_date\n" +
|
||||||
|
" UNION ALL\n" +
|
||||||
|
" -- 2. 递归生成后续日期,直到不超过endTime的“年月日”\n" +
|
||||||
|
" SELECT DATE_ADD(stat_date, INTERVAL 1 DAY)\n" +
|
||||||
|
" FROM date_range\n" +
|
||||||
|
" WHERE stat_date < DATE(#{bo.endTime})\n" +
|
||||||
|
")\n" +
|
||||||
|
"\n" +
|
||||||
|
"SELECT \n" +
|
||||||
|
" dr.stat_date AS riqi, -- 统计日期(格式:YYYY-MM-DD)\n" +
|
||||||
|
" COUNT(ges.id) AS count -- 当天符合条件的记录数\n" +
|
||||||
|
"FROM date_range dr\n" +
|
||||||
|
"LEFT JOIN (\n" +
|
||||||
|
" SELECT \n" +
|
||||||
|
" DATE(create_time) AS data_date, -- 提取创建时间的“年月日”\n" +
|
||||||
|
" id -- 仅需主键用于计数(减少数据传输)\n" +
|
||||||
|
" FROM gps_equipment_son\n" +
|
||||||
|
" WHERE \n" +
|
||||||
|
" project_id = #{bo.projectId} -- 匹配项目ID\n" +
|
||||||
|
" AND client_id =#{bo.clientId} -- 客户端ID为空\n" +
|
||||||
|
" AND create_time BETWEEN #{bo.startTime} AND #{bo.endTime} -- 时间范围\n" +
|
||||||
|
") ges ON dr.stat_date = ges.data_date -- 按日期关联\n" +
|
||||||
|
"GROUP BY dr.stat_date -- 按统计日期分组\n" +
|
||||||
|
"ORDER BY dr.stat_date; -- 按日期升序排列")
|
||||||
|
List<GpsStatusVo> getRlList(@Param("bo") GpsEquipmentSonBo bo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,7 @@ public interface LocationMapper extends BaseMapperPlus<Location, LocationVo> {
|
|||||||
@Select("WITH RankedData AS (\n" +
|
@Select("WITH RankedData AS (\n" +
|
||||||
" SELECT\n" +
|
" SELECT\n" +
|
||||||
" *,\n" +
|
" *,\n" +
|
||||||
" ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS rn\n" +
|
" ROW_NUMBER() OVER (PARTITION BY dev_num ORDER BY create_time DESC) AS rn\n" +
|
||||||
" FROM\n" +
|
" FROM\n" +
|
||||||
" anqm_location \n " +
|
" anqm_location \n " +
|
||||||
"WHERE \n" +
|
"WHERE \n" +
|
||||||
@ -48,5 +48,5 @@ public interface LocationMapper extends BaseMapperPlus<Location, LocationVo> {
|
|||||||
" RankedData\n" +
|
" RankedData\n" +
|
||||||
"WHERE\n" +
|
"WHERE\n" +
|
||||||
" rn = 1;")
|
" rn = 1;")
|
||||||
List<DeviceVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
|
List<LocationVo> getUserListByProjectId(@Param("projectId") Long projectId, @Param("startOfDay") LocalDateTime startOfDay, @Param("now") LocalDateTime now);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +1,13 @@
|
|||||||
package org.dromara.gps.service;
|
package org.dromara.gps.service;
|
||||||
|
|
||||||
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
import org.dromara.gps.domain.bo.GpsEquipmentBo;
|
||||||
import org.dromara.gps.domain.vo.AnqmUserVo;
|
import org.dromara.gps.domain.vo.*;
|
||||||
import org.dromara.gps.domain.vo.DeviceVo;
|
|
||||||
import org.dromara.gps.domain.bo.DeviceBo;
|
import org.dromara.gps.domain.bo.DeviceBo;
|
||||||
import org.dromara.gps.domain.Device;
|
import org.dromara.gps.domain.Device;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.dromara.gps.domain.vo.GpsProjectVo;
|
|
||||||
import org.dromara.gps.domain.vo.GpsUserVo;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -80,7 +77,7 @@ public interface IDeviceService extends IService<Device>{
|
|||||||
|
|
||||||
Boolean unbindManmachine(DeviceBo bo);
|
Boolean unbindManmachine(DeviceBo bo);
|
||||||
|
|
||||||
List<DeviceVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
|
List<LocationVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
|
||||||
|
|
||||||
List<AnqmUserVo> getUserList(DeviceBo bo);
|
List<AnqmUserVo> getUserList(DeviceBo bo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import org.dromara.gps.domain.vo.GpsStatusVo;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -78,4 +79,6 @@ public interface IGpsEquipmentSonService extends IService<GpsEquipmentSon>{
|
|||||||
List<GpsEquipmentSonVo> getLargerScreenList(GpsEquipmentSonBo bo);
|
List<GpsEquipmentSonVo> getLargerScreenList(GpsEquipmentSonBo bo);
|
||||||
|
|
||||||
List<GpsEquipmentSonVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
|
List<GpsEquipmentSonVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
|
||||||
|
|
||||||
|
List<GpsStatusVo> getRlList(GpsEquipmentSonBo bo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,5 +73,5 @@ public interface ILocationService extends IService<Location>{
|
|||||||
|
|
||||||
List<LocationVo> getLargerScreenList(LocationBo bo);
|
List<LocationVo> getLargerScreenList(LocationBo bo);
|
||||||
|
|
||||||
List<DeviceVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
|
List<LocationVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user