Compare commits

..

220 Commits

Author SHA1 Message Date
zt
a444d4c953 Merge remote-tracking branch 'origin/dev' into dev 2025-10-29 16:31:21 +08:00
zt
3c01ec861b 人脸报错 2025-10-29 16:31:04 +08:00
365cf00644 10-29-bug修复 2025-10-29 16:12:16 +08:00
4faff3b0bc Merge remote-tracking branch 'origin/dev' into dev 2025-10-29 15:57:06 +08:00
866f2336c3 10-29-bug修复 2025-10-29 15:56:56 +08:00
e4132ea540 处理长顺的老数据 2025-10-29 11:33:13 +08:00
zt
53208c36cf 考勤机 2025-10-29 11:21:47 +08:00
8f2a3e6e50 10-29-bug修复,安装包新增描述 2025-10-29 09:53:45 +08:00
lcj
b67a7d5370 考勤接口 2025-10-28 20:39:14 +08:00
zt
07509c8e15 考勤机 2025-10-28 20:23:23 +08:00
e6c58a64ac 10-28-bug修复 2025-10-28 20:02:57 +08:00
lg
abb6b8c13a 分包合同竣工结算添加合同文本字段 2025-10-28 19:05:36 +08:00
lg
de492728bc cbs权限 2025-10-28 18:42:24 +08:00
82fa732db6 10-28-bug修复 2025-10-28 15:52:07 +08:00
lcj
275d640263 车辆管理 2025-10-28 14:17:45 +08:00
7e47b8a74f 施工产值增加第N周 2025-10-28 11:57:14 +08:00
d4301da0ec 添加详情权限 2025-10-28 11:02:53 +08:00
lg
fe5b5473dd 审核数据添加 2025-10-28 09:44:33 +08:00
0126d44761 ws注解放开 2025-10-27 20:42:03 +08:00
dbefd88e41 添加客户详情权限 2025-10-27 20:09:39 +08:00
9a3b7ebe54 添加审核 2025-10-27 20:00:56 +08:00
81be4a862c 10-27-添加审核完善 2025-10-27 19:57:35 +08:00
lg
43f2db9f7e 审核数据添加 2025-10-27 19:51:55 +08:00
abefa90408 10-27-添加审核完善 2025-10-27 19:14:24 +08:00
08f48b7817 10-27-添加审核 2025-10-27 18:45:49 +08:00
lcj
6b8ace60d4 车辆管理,修改材料 2025-10-27 17:10:41 +08:00
lg
b997dd5f00 详情权限取消 2025-10-27 15:35:49 +08:00
6174743858 Merge remote-tracking branch 'origin/dev' into dev 2025-10-27 15:25:19 +08:00
82d55d7188 10-27-修改bug 2025-10-27 15:25:06 +08:00
lg
aec5eacd0b 采购详情权限取消 2025-10-27 15:25:04 +08:00
zt
a320b85965 考勤机 2025-10-27 15:14:29 +08:00
lg
b61a7c153d 投标文件-项目类型中文返回 2025-10-27 14:44:50 +08:00
fb9b01cf34 修改物资跟踪管理台账查询列表修改 2025-10-27 14:27:11 +08:00
lg
32f134873a 采购合同金额字段 2025-10-27 11:37:41 +08:00
f4220be9d6 10-27-修改bug 2025-10-27 10:29:27 +08:00
lg
8252fd7216 标后分析返回对象增加字段 2025-10-27 09:44:11 +08:00
lg
57855f4307 bug修改 2025-10-25 22:18:10 +08:00
6784eafe6e 供应商-客户中间表引用表的新增修改删除修改 2025-10-25 22:17:26 +08:00
0b42c1d6a6 Merge remote-tracking branch 'origin/dev' into dev 2025-10-25 22:16:07 +08:00
4b37a7327f 10-25-修改 2025-10-25 22:16:00 +08:00
lg
0287f1e4ce bug修改 2025-10-25 21:58:47 +08:00
5d8af1cab8 10-25-供应商删除修改 2025-10-25 21:57:13 +08:00
123896f08b Merge remote-tracking branch 'origin/dev' into dev 2025-10-25 21:25:40 +08:00
a8a198b51f 10-25-增加校验 2025-10-25 21:25:33 +08:00
lg
f00b98714a Merge remote-tracking branch 'origin/dev' into dev 2025-10-25 21:24:39 +08:00
lg
4ff87f3996 bug修改 2025-10-25 21:23:58 +08:00
5f3ae0f9f1 10-25-供应商地域绑定及搜索 2025-10-25 21:22:36 +08:00
786c864a27 供应商-客户中间表引用表的新增修改删除修改 2025-10-25 21:21:48 +08:00
lg
c61e802b85 bug修改 2025-10-25 21:09:26 +08:00
lg
9a568799f4 bug修改 2025-10-25 21:05:26 +08:00
8aa38063bf 供应商-客户中间表引用表的新增修改删除 2025-10-25 20:58:07 +08:00
c4a11ec245 10-25-解除继承 2025-10-25 20:28:40 +08:00
lg
169b76589c bug修改 2025-10-25 20:23:02 +08:00
lg
199f51ea21 bug修改 2025-10-25 20:19:21 +08:00
lg
23572dfc07 bug修改 2025-10-25 20:14:03 +08:00
570b0ce316 10-25-供应商新增、删除添加校验 2025-10-25 20:11:14 +08:00
lg
f953a96c36 bug修改 2025-10-25 20:05:43 +08:00
zt
25c4eee464 bug 2025-10-25 20:01:28 +08:00
lg
b209ef1fab 中间表数据添加 2025-10-25 19:20:32 +08:00
lg
77e9f4d9a2 中间表数据添加 2025-10-25 19:18:09 +08:00
lg
e73c808bc3 xzd前缀添加 2025-10-25 17:21:16 +08:00
zt
edf0d1a5db 设计导出 2025-10-25 17:10:43 +08:00
lcj
cc23a308c1 修改配置,车辆管理 2025-10-25 17:01:15 +08:00
bc891327c9 10-25-字段调整 2025-10-25 16:51:17 +08:00
39bedfeb92 10-25-字段调整 2025-10-25 16:44:33 +08:00
56fc4ff83e 10-24-修复 2025-10-24 22:16:26 +08:00
524ed30728 Merge remote-tracking branch 'origin/dev' into dev 2025-10-24 22:16:13 +08:00
584304e744 供应商-客户中间表初始化 2025-10-24 22:07:16 +08:00
zt
56418600c5 1 2025-10-24 20:17:03 +08:00
40e57b18cb 10-24-修复 2025-10-24 20:05:45 +08:00
lg
ced6cb219c deptid添加 2025-10-24 20:01:03 +08:00
218ec5ea95 gps接口修改 2025-10-24 19:40:54 +08:00
zt
1c601bd68e 设计导出 2025-10-24 19:32:20 +08:00
lg
7d6eba719b 投标保证金收回 2025-10-24 17:50:15 +08:00
8cfc34dbcb Merge remote-tracking branch 'origin/dev' into dev 2025-10-24 17:46:29 +08:00
23a749973d 10-24-修复 2025-10-24 17:45:59 +08:00
4b96702dc9 成本预算添加部门id 2025-10-24 17:41:37 +08:00
a1af8711ef 添加id转name注解方法 2025-10-24 17:05:11 +08:00
9e8cff931b 10-24-修复 2025-10-24 17:00:15 +08:00
lg
5bccd71bdc 投标保证金缴纳 2025-10-24 16:59:24 +08:00
lg
544f35a601 投标管理修改 2025-10-24 16:04:38 +08:00
f920d4976e 10-24-修复 2025-10-24 15:22:31 +08:00
cdcd665d43 添加id转name注解方法 2025-10-24 11:55:19 +08:00
lg
08de61e455 trans添加客户供应商 2025-10-24 10:48:06 +08:00
lcj
025c3115b7 接入ai,识别 2025-10-24 09:23:40 +08:00
9e366554b7 10-23-修复 2025-10-23 22:35:04 +08:00
zt
d934abf0fe bug修改 2025-10-23 19:36:49 +08:00
lg
e16e9133e2 采购合同修改 2025-10-23 17:42:42 +08:00
d7854a35d7 10-23-修复 2025-10-23 17:36:00 +08:00
97e0dd467f Merge remote-tracking branch 'origin/dev' into dev 2025-10-23 17:24:08 +08:00
e58a99e696 10-23-修复 2025-10-23 17:24:00 +08:00
lg
0d5a9eb505 采购合同修改 2025-10-23 17:18:36 +08:00
lg
45ac1817e1 成本预算修改 2025-10-23 16:08:17 +08:00
lg
f2d4ff4237 客户信息变更 2025-10-23 15:04:42 +08:00
a4cc5c14f3 Merge remote-tracking branch 'origin/dev' into dev 2025-10-23 14:27:41 +08:00
5be571cc30 10-23-修复 2025-10-23 14:27:32 +08:00
ff656dd046 富文本配置修改 2025-10-23 11:28:29 +08:00
lg
20574d0037 bug修改 2025-10-23 11:25:12 +08:00
42cf396e93 10-23-xss规则 2025-10-23 11:22:34 +08:00
2a30b05dd7 新中大综合服务合同优化 2025-10-23 11:21:46 +08:00
4ecee185bf 10-22-bug修复 2025-10-23 11:14:21 +08:00
lg
48ab59c67d bug修改 2025-10-23 09:22:27 +08:00
lcj
806e8f3391 修改配置文件 2025-10-22 20:19:40 +08:00
61244321a7 10-22-bug修复 2025-10-22 20:10:10 +08:00
zt
ff1e613316 设计导出 2025-10-22 18:58:30 +08:00
03161751fc 10-22-bug修复 2025-10-22 18:51:50 +08:00
9ebf4a3e5f 10-22-新增供应商空值校验 2025-10-22 18:38:48 +08:00
lcj
3ba13e3ef8 新部署一个项目 2025-10-22 16:07:10 +08:00
lg
8d3853fe6b bug修改 2025-10-22 15:08:30 +08:00
lg
dbc09a62ea 后端修改 2025-10-22 09:29:20 +08:00
zt
f3fa78475c bug 2025-10-21 20:05:55 +08:00
c565771283 10-21-修复 2025-10-21 20:04:59 +08:00
bac8488244 新中大综合服务合同修改,建管大屏接口优化、gps接口优化 2025-10-21 18:35:07 +08:00
lcj
a5f661b558 承包合同,安全质量大屏 2025-10-21 18:29:06 +08:00
zt
ceecec97c7 打印天气 2025-10-21 18:25:52 +08:00
c6ae8a4c00 10-21-收票与开票-收票登记 2025-10-21 17:31:00 +08:00
zt
37d0c776c0 设计计划 2025-10-21 15:53:56 +08:00
f8eea0f63f 修改查询语句 2025-10-21 10:36:52 +08:00
lg
59c749ab2a 表名修改 2025-10-21 10:09:59 +08:00
eeeba2bf4b 10-21-修复 2025-10-21 10:07:55 +08:00
lg
a9ce42101f 补充 2025-10-20 20:16:44 +08:00
lcj
13de88265f 识别逻辑 2025-10-20 20:09:51 +08:00
a464a1236d 综合服务进度、采购进度、竣工、竣工调整添加底部计量结算内容 2025-10-20 20:07:40 +08:00
fce5d0e7fc 10-20-修复字段 2025-10-20 19:57:27 +08:00
66ba43d030 Merge remote-tracking branch 'origin/dev' into dev 2025-10-20 19:26:18 +08:00
1aa77e5eda 10-20-决算清 2025-10-20 19:26:08 +08:00
zt
037016fc13 人脸对接 2025-10-20 19:24:36 +08:00
99f0026552 大屏接口添加计划容量 2025-10-20 17:12:06 +08:00
lg
535262d721 枚举 2025-10-20 16:32:32 +08:00
fbcb9ca3f2 10-20-决算清单(调整)初始化 2025-10-20 16:19:00 +08:00
2a7a20b966 Merge remote-tracking branch 'origin/dev' into dev 2025-10-20 16:10:14 +08:00
98fdab0dba 10-20-承包合同进度结算补齐 2025-10-20 16:10:03 +08:00
lg
bd71335ae6 分包合同枚举 2025-10-20 15:53:15 +08:00
zt
7f746fc250 考勤机 2025-10-20 15:41:43 +08:00
lg
901c8785fe 合同类型字段补充 2025-10-20 15:30:34 +08:00
e4e9718acb 10-20-初始化 2025-10-20 15:08:29 +08:00
738101f374 10-20-初始化 2025-10-20 15:05:58 +08:00
lg
a7befd7278 字段修改补充 2025-10-20 14:56:38 +08:00
lg
52e968c313 字段修改 2025-10-20 14:47:03 +08:00
lg
de9d7d34d6 部门修改和变更增加清单,合同内清单 2025-10-20 14:29:59 +08:00
zt
9f0105d88a 角色优化 2025-10-20 14:21:18 +08:00
lcj
80ec8ff86d 结算 2025-10-20 14:19:43 +08:00
f3473fe5d5 阶段成本分解校验修改 2025-10-18 21:05:20 +08:00
lcj
856f3f334b 修改日期 2025-10-18 20:35:50 +08:00
lcj
0b216a4101 修改配置 2025-10-18 20:19:35 +08:00
c7338b45ad 大屏项目 2025-10-18 20:09:38 +08:00
c93b1b752e Merge remote-tracking branch 'origin/dev' into dev 2025-10-18 20:08:43 +08:00
e38074bb25 大屏项目 2025-10-18 20:08:17 +08:00
zt
be0f425e14 Merge remote-tracking branch 'origin/dev' into dev 2025-10-18 20:03:14 +08:00
zt
f24e33b1c7 注销 2025-10-18 20:02:54 +08:00
48ea20581c 项目 2025-10-18 19:54:27 +08:00
lcj
e7fa22e573 承包分包合同进度结算 2025-10-18 19:44:37 +08:00
83b7b32035 解决冲突 2025-10-18 18:56:03 +08:00
6a0be071b8 合同管理-承包、分包、采购、综合服务的信息、变更添加合同变更清单 2025-10-18 18:47:21 +08:00
lg
7bdf8f53b9 采购合同修改 2025-10-18 18:45:25 +08:00
lg
03b249afe7 单据编号统一接口 2025-10-18 17:15:16 +08:00
lg
2e5e42fd84 成本单 2025-10-18 14:21:49 +08:00
f9d9785536 10-17-收票与开票-开票申请 2025-10-18 14:14:27 +08:00
a06511e0bf Merge remote-tracking branch 'origin/dev' into dev 2025-10-18 14:13:49 +08:00
zt
31aa56d34b 设备打卡 2025-10-17 21:15:44 +08:00
2b4517760f 立项及成本-成本预算-阶段成本分解接口 2025-10-17 20:10:36 +08:00
c318d0b10b 合同管理-合同变更清单初始化 2025-10-17 17:42:40 +08:00
lcj
ec54b4ff52 大屏、产值 2025-10-17 15:42:05 +08:00
zt
965a0cc90e 材料 2025-10-17 15:39:59 +08:00
zt
ebddc5c51f 分包 2025-10-17 15:37:24 +08:00
a323844440 立项与成本-成本预算-总体计划成本接口 2025-10-17 14:15:35 +08:00
lg
6bcddf50da 资金计划 2025-10-17 11:54:00 +08:00
lcj
c72275859f 大屏、产值 2025-10-17 11:51:09 +08:00
9561ee9323 10-17-收票与开票-开票申请 2025-10-17 11:24:46 +08:00
b7a52de2d2 立项与成本-成本预算-完工成本填报新增 2025-10-17 10:53:00 +08:00
bfc3ea60fd 立项与成本-成本预算-完工成本填报初始化 2025-10-17 10:34:03 +08:00
zt
1acc676b0f 短信优化 2025-10-17 10:15:11 +08:00
d6a378f711 Merge remote-tracking branch 'origin/dev' into dev 2025-10-16 21:59:24 +08:00
b4f56b6c79 10-16-承包合同收款-分包合同付款 2025-10-16 21:58:55 +08:00
zt
b5d2b3df06 优化 2025-10-16 20:33:34 +08:00
lcj
4042b4a441 修改bug 2025-10-16 20:31:56 +08:00
1fd3da3e2a 收款与付款-采购、综合服务付款接口 2025-10-16 20:07:05 +08:00
zt
0d84c49ca4 优化 2025-10-16 18:43:05 +08:00
lcj
cecfb60e71 项目部门关联 2025-10-16 17:55:48 +08:00
lcj
aec8667edc 进度计划产值 2025-10-16 15:18:39 +08:00
e930cd3b7c 10-16-承包合同竣工结算调整 2025-10-16 14:42:14 +08:00
373906bde7 Merge remote-tracking branch 'origin/dev' into dev 2025-10-16 14:40:51 +08:00
bca9745e60 收款与付款-采购、综合服务付款初始化 2025-10-16 14:40:31 +08:00
lcj
6808057111 考勤机 2025-10-15 23:57:32 +08:00
lg
9f1da9e6c0 结算信息 2025-10-15 22:50:38 +08:00
d8838f8e01 采购合同结算接口 2025-10-15 22:01:22 +08:00
d92d37c646 大屏接口修改与ws接口修改 2025-10-15 21:59:27 +08:00
zt
6398a28974 优化 2025-10-15 20:36:12 +08:00
cce9ef98d8 10-15-承包合同竣工结算 2025-10-15 19:52:55 +08:00
467a972a6d Merge remote-tracking branch 'origin/dev' into dev 2025-10-15 19:17:20 +08:00
00e5f5ede6 10-15-变更子表更新方式 2025-10-15 19:08:43 +08:00
1b590bbcbd 10-15-修复 2025-10-15 17:30:17 +08:00
40d53dffba 10-15-方案选择帮助,印章帮助,预算分类 2025-10-15 13:51:35 +08:00
zt
db3af72d5f 优化 2025-10-15 10:49:45 +08:00
9604cab4d6 综合服务对应接口和结算采购合同对应接口 2025-10-15 10:30:54 +08:00
536b25d773 Merge remote-tracking branch 'origin/dev' into dev 2025-10-14 23:21:52 +08:00
e87cbce77a 解决ws不兼容 2025-10-14 23:21:23 +08:00
f34afd962d Merge remote-tracking branch 'origin/dev' into dev 2025-10-14 21:10:20 +08:00
lcj
98f23e2c02 修改bug 2025-10-14 20:24:17 +08:00
zt
b9507e1fd7 优化 2025-10-14 18:42:02 +08:00
1ceef7f1d1 1 2025-10-14 17:38:15 +08:00
lcj
0fb3fd70a6 进度计划甘特图 2025-10-14 17:21:37 +08:00
aab0a5e0b8 10-13-承包合同结算周期 2025-10-14 16:26:40 +08:00
f9d1a7a489 10-13-承包合同,变更,终止,方案选择 2025-10-14 16:22:38 +08:00
87e58ca4af 增加移动考勤机 2025-10-14 16:02:32 +08:00
lcj
d6263c6430 大屏质量、物资、识别记录 2025-10-14 15:12:32 +08:00
lg
253ef81066 分包合同信息 2025-10-14 15:01:31 +08:00
2f4bec42a3 大屏接口修改 2025-10-14 14:57:54 +08:00
zt
3879ce28b6 bug 2025-10-14 14:25:59 +08:00
lg
691b5341c7 采购合同 2025-10-14 11:03:46 +08:00
4a50dc6ff0 10-13-承包合同,变更,终止 2025-10-13 22:46:49 +08:00
d7e4c65afb Merge remote-tracking branch 'origin/dev' into dev 2025-10-13 22:45:07 +08:00
61b39d89de 大屏接口修改 2025-10-13 21:49:27 +08:00
2497527c77 供应商接口修改 2025-10-13 21:47:46 +08:00
zt
79f74434f7 bug 2025-10-13 21:20:44 +08:00
zt
bd0fe7228b 设计优化 2025-10-13 19:59:52 +08:00
66b45df3fb Merge remote-tracking branch 'origin/dev' into dev 2025-10-13 18:44:18 +08:00
38d6832f2c 表名枚举 2025-10-13 18:34:06 +08:00
8e51d67071 表名枚举 2025-10-13 18:32:53 +08:00
942ca4202a 10-13-承包合同信息完善,合作协议完善 2025-10-13 15:09:43 +08:00
1012 changed files with 92864 additions and 2063 deletions

View File

@ -92,7 +92,7 @@ public class SysRegisterService {
// if (!isValid) {
// throw new UserException("注册失败密码需满足818位包含大小写字母、数字、特殊字符中的至少三种组合");
// }
// 验证码开关
SysUserBo sysUser = new SysUserBo();
sysUser.setUserName(username);
sysUser.setNickName(username);
@ -101,6 +101,13 @@ public class SysRegisterService {
sysUser.setUserType(userType);
sysUser.setEmail(registerBody.getEmail());
SysUser sysUserByPhonenumber = userMapper.selectDefFlagUser(username);
if(sysUserByPhonenumber != null){
sysUser.setUserId(sysUserByPhonenumber.getUserId());
userMapper.updateDefFlag(sysUser);
userMapper.updateConstructionUser(sysUserByPhonenumber.getUserId());
}else {
boolean exist = TenantHelper.dynamic(tenantId, () -> {
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
@ -112,6 +119,7 @@ public class SysRegisterService {
if (!regFlag) {
throw new UserException("user.register.error");
}
}
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
}

View File

@ -1,3 +1,7 @@
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 8899
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
@ -32,6 +36,12 @@ snail-job:
--- # 数据源配置
spring:
ai:
dashscope:
api-key: sk-8d8df92fcbac4bd2922edba30b0bb8fa
chat:
options:
model: qwen-plus
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
@ -52,6 +62,9 @@ spring:
url: jdbc:mysql://192.168.110.2:13386/xinnengyuandev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: xinnengyuandev
password: StRWCZdZirysNSs2
# url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# username: xinnengyuan
# password: mEZPC5Sdf3r2HENi
# 从库数据源
slave:
lazy: true
@ -71,9 +84,16 @@ spring:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.2:13386/zmkgdev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgdev
password: JhYxREf25AXdy3h8
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgc
password: nWKDKRNRT48tFBdh
# slave:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: zmkgprod
# password: MaY8nehwWkJriWPm
# oracle:
# type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver
@ -116,7 +136,7 @@ spring.data:
# 端口默认为6379
port: 9287
# 数据库索引
database: 10
database: 16
# redis 密码必须配置
password: syar23rdsaagdrsa
# 连接超时时间
@ -175,7 +195,7 @@ sms:
# 配置源类型用于标定配置来源(interface,yaml)
config-type: yaml
# 用于标定yml中的配置是否开启短信拦截接口配置不受此限制
restricted: true
restricted: false
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
minute-max: 1
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
@ -324,6 +344,7 @@ ys7:
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
job:
capture-enabled: false # 控制是否启用萤石抓拍任务
device-sync-enabled: false # 控制是否同步萤石设备
#ys7:
# app-key: 081b0d6d5f7f4de8bc5c7fa350fb26ec
# app-secret: caa37b9f60ef02deb57e563bc190e6db
@ -343,3 +364,7 @@ qrCode:
# 无人机大图
drone:
url: http://192.168.110.2:9512
# 聊天服务
chat:
server:
port: 19099

View File

@ -1,3 +1,7 @@
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 9918
--- # 临时文件存储位置 避免临时文件被系统清理报错
spring.servlet.multipart.location: /ruoyi/server/temp
@ -35,6 +39,12 @@ snail-job:
--- # 数据源配置
spring:
ai:
dashscope:
api-key: xxx
chat:
options:
model: qwen-plus
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
@ -105,7 +115,7 @@ spring.data:
# 端口默认为6379
port: 9287
# 数据库索引
database: 6
database: 17
# redis 密码必须配置
password: syar23rdsaagdrsa
# 连接超时时间
@ -164,7 +174,7 @@ sms:
# 配置源类型用于标定配置来源(interface,yaml)
config-type: yaml
# 用于标定yml中的配置是否开启短信拦截接口配置不受此限制
restricted: true
restricted: false
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
minute-max: 1
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
@ -183,12 +193,45 @@ sms:
signature: 您的短信签名
sdk-app-id: 您的sdkAppId
config2:
# 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分
# 登录
supplier: tencent
access-key-id: 您的accessKey
access-key-secret: 您的accessKeySecret
signature: 您的短信签名
sdk-app-id: 您的sdkAppId
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
signature: 重庆远界大数据研究院
sdk-app-id: 1401018866
template-id: 2491779
config3:
# 注册
supplier: tencent
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
signature: 重庆远界大数据研究院
sdk-app-id: 1401018866
template-id: 2491776
config4:
# 质量工单逾期
supplier: tencent
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
signature: 重庆远界大数据研究院
sdk-app-id: 1401018866
template-id: 2534747
config5:
# 设计图纸
supplier: tencent
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
signature: 重庆远界大数据研究院
sdk-app-id: 1401018866
template-id: 2534750
config6:
# 安全工单
supplier: tencent
access-key-id: AKIDb3JK5dx4wa0DCxWqvxlKejvysZ3ITVJv
access-key-secret: c5LPFsJI8k7GDxTkoeFj4A1ukQr66rPi
signature: 重庆远界大数据研究院
sdk-app-id: 1401018866
template-id: 2534848
--- # 三方授权
justauth:
@ -275,8 +318,11 @@ weather:
dxf2GeoJson:
file-name: main
ys7:
app-key: 3acf9f1a43dc4209841e0893003db0a2
app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36
app-key: xxx
app-secret: xxx
job:
capture-enabled: false # 控制是否启用萤石抓拍任务
device-sync-enabled: false # 控制是否同步萤石设备
# 斯巴达算法
sparta:
url: http://119.3.204.120:8040
@ -286,10 +332,14 @@ sparta:
id-card:
encrypt-key: 7ae260d150a14027d2238a1cf80a48ef
recognizer:
url: http://192.168.110.5:50070
url: http://192.168.110.5:50071
qrCode:
url: http://xny.yj-3d.com:7171
url: http://xny.yj-3d.com:7788
# 无人机大图
drone:
url: http://192.168.110.2:9512
# 聊天服务
chat:
server:
port: 18088

View File

@ -1,3 +1,7 @@
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 8899
--- # 临时文件存储位置 避免临时文件被系统清理报错
spring.servlet.multipart.location: /ruoyi/server/temp
@ -35,6 +39,12 @@ snail-job:
--- # 数据源配置
spring:
ai:
dashscope:
api-key: xxx
chat:
options:
model: qwen-plus
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
@ -55,21 +65,21 @@ spring:
url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: xinnengyuan
password: mEZPC5Sdf3r2HENi
# 从库数据源
slave:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgc
password: nWKDKRNRT48tFBdh
slave1:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgprod
password: MaY8nehwWkJriWPm
# # 从库数据源
# slave:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: zmkgc
# password: nWKDKRNRT48tFBdh
# slave1:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: zmkgprod
# password: MaY8nehwWkJriWPm
# # 从库数据源
# slave:
# lazy: true
@ -179,7 +189,7 @@ sms:
# 配置源类型用于标定配置来源(interface,yaml)
config-type: yaml
# 用于标定yml中的配置是否开启短信拦截接口配置不受此限制
restricted: true
restricted: false
# 短信拦截限制单手机号每分钟最大发送,只对开启了拦截的配置有效
minute-max: 1
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
@ -321,12 +331,13 @@ weather:
api-host: n35rk53njv.re.qweatherapi.com
# dxf转 geojson 执行文件名
dxf2GeoJson:
file-name: main.exe
file-name: main
ys7:
app-key: 3acf9f1a43dc4209841e0893003db0a2
app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
job:
capture-enabled: true # 控制是否启用萤石抓拍任务
device-sync-enabled: true # 控制是否同步萤石设备
# 斯巴达算法
sparta:
url: http://119.3.204.120:8040
@ -343,3 +354,7 @@ qrCode:
# 无人机大图
drone:
url: http://192.168.110.2:9512
# 聊天服务
chat:
server:
port: 19099

View File

@ -22,7 +22,7 @@ captcha:
# 开发环境配置
server:
# 服务器的HTTP端口默认为8080
port: 8899
# port: 8899
servlet:
# 应用的访问路径
context-path: /
@ -106,6 +106,10 @@ sa-token:
is-share: false
# jwt秘钥
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
# token有效期单位s 默认30天, -1代表永不过期
timeout: 2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
active-timeout: 86400
# security配置
security:
@ -253,6 +257,8 @@ springdoc:
packages-to-scan: org.dromara.design
- group: 13.工作流模块
packages-to-scan: org.dromara.workflow
- group: 14.合同模块
packages-to-scan: org.dromara.ctr
- group: 15.无人机模块
packages-to-scan: org.dromara.drone
- group: 20.代码生成模块
@ -275,12 +281,16 @@ springdoc:
packages-to-scan: org.dromara.gps
- group: 24.招标模块
packages-to-scan: org.dromara.tender
- group: 25.app版本模块
packages-to-scan: org.dromara.app
# - group: 25.app版本模块
# packages-to-scan: org.dromara.app
- group: 25.数据迁移模块
packages-to-scan: org.dromara.transferData
- group: 26.netty消息模块
packages-to-scan: org.dromara.websocket
- group: 27.新中大模块
packages-to-scan: org.dromara.xzd
- group: 28.车辆模块
packages-to-scan: org.dromara.vehicle
# knife4j的增强配置不需要增强可以不配
knife4j:
enable: true
@ -296,6 +306,15 @@ xss:
- /system/notice
- /warm-flow/save-xml
- /project/project
- /xzd/contractDetails/**
- /xzd/contractChange/**
- /xzd/comprehensive/csContractChange/**
- /xzd/comprehensive/csContractInformation/**
- /xzd/hetongbiangeng/**
- /xzd/fenbaohetongjungong/**
- /xzd/fenbaohetongbiangg/**
- /xzd/fenbaohetongxinxi/**
- /xzd/contractManagement/**
# 全局线程池相关配置
# 如使用JDK21请直接使用虚拟线程 不要开启此配置
@ -367,5 +386,5 @@ warm-flow:
--- # 百度云配置
baidu:
client:
id: zSB7KdLgY7a1tIEx3eTy65TE
secret: 5nabjclW5BWGV8UwEueDgBDmOveRVkmD
id: pXACgshs1ABNFa6UM6HvkQ78 #zSB7KdLgY7a1tIEx3eTy65TE
secret: EtTCBwd0KjGFOMDkbq84y3RxJxWpIVv4 #5nabjclW5BWGV8UwEueDgBDmOveRVkmD

View File

@ -3,6 +3,9 @@ package org.dromara.test;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
@ -22,6 +25,13 @@ import org.dromara.facility.service.IFacMatrixService;
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
import org.dromara.facility.service.IFacPhotovoltaicPanelService;
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.domain.dto.ys7deviceimg.OthYs7DeviceImgCreateByCapture;
import org.dromara.other.service.IOthYs7DeviceImgService;
import org.dromara.other.service.IOthYs7DeviceService;
import org.dromara.out.domain.OutConstructionValue;
import org.dromara.out.domain.OutConstructionValueRange;
import org.dromara.out.service.IOutConstructionValueRangeService;
@ -47,6 +57,8 @@ import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@ -101,6 +113,15 @@ public class DemoTest {
@Resource
private IOutConstructionValueService constructionValueService;
@Resource
private IOthYs7DeviceService ys7DeviceService;
@Resource
private IOthYs7DeviceImgService ys7DeviceImgService;
@Resource
private Ys7Manager ys7Manager;
@Test
void testConstructionValue() {
@ -114,7 +135,7 @@ public class DemoTest {
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday);
Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/
LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间2024-01-01
LocalDate end = LocalDate.of(2025, 9, 15); // 截止时间2025-09-15
LocalDate end = LocalDate.of(2025, 10, 20); // 截止时间2025-09-15
// 如果起始不是周一,调整到当周的周一
if (start.getDayOfWeek() != DayOfWeek.MONDAY) {
@ -134,7 +155,7 @@ public class DemoTest {
.ge(PgsProgressPlanDetail::getDate, monday)
.le(PgsProgressPlanDetail::getDate, sunday)
.ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO)
.eq(PgsProgressPlanDetail::getStatus, "1")
// .eq(PgsProgressPlanDetail::getStatus, "1")
.list();
if (CollUtil.isEmpty(planDetailList)) {
// 下一周
@ -229,8 +250,8 @@ public class DemoTest {
value.setOutValue(constructionValue);
value.setOwnerValue(ownerValue);
// 统计总产值
allConstructionValue = allConstructionValue.add(constructionValue).setScale(4, RoundingMode.HALF_UP);
allOwnerValue = allOwnerValue.add(ownerValue).setScale(4, RoundingMode.HALF_UP);
allConstructionValue = allConstructionValue.add(constructionValue);
allOwnerValue = allOwnerValue.add(ownerValue);
// 添加需要修改状态的计划详情
PgsProgressPlanDetail update = new PgsProgressPlanDetail();
update.setId(planDetail.getId());
@ -238,8 +259,8 @@ public class DemoTest {
updateList.add(update);
saveList.add(value);
}
range.setOutValue(allConstructionValue);
range.setOwnerValue(allOwnerValue);
range.setOutValue(allConstructionValue.setScale(4, RoundingMode.HALF_UP));
range.setOwnerValue(allOwnerValue.setScale(4, RoundingMode.HALF_UP));
// 如果产值都为0则不保存
if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) {
return null;
@ -505,4 +526,66 @@ 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);
}
}
}
@Test
void capturePic() {
List<String> urlList = List.of(
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/db8a379b456142459852b654f20d5f97.png",
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/913dbcf0f7244c8b878e84b5525bec4b.png",
"http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/23/2b904765f03f40b2ad0ddbf6ddeadb45.png"
);
for (String url : urlList) {
Pattern pattern = Pattern.compile(".*/device/img/([^/]+)/.*");
Matcher matcher = pattern.matcher(url);
OthYs7Device ys7Device = ys7DeviceService.lambdaQuery()
.eq(OthYs7Device::getDeviceSerial, "GA1730672")
.last("limit 1")
.one();
if (ys7Device == null) {
throw new ServiceException("设备不存在", HttpStatus.ERROR);
}
String deviceSerial = ys7Device.getDeviceSerial();
// 如果没有预置位,则直接对默认通道抓图
OthYs7DeviceImgCreateByCapture img = new OthYs7DeviceImgCreateByCapture();
img.setProjectId(ys7Device.getProjectId());
img.setDeviceSerial(deviceSerial);
img.setDeviceName(ys7Device.getDeviceName());
// String url = "http://xny.yj-3d.com:9000/xinnengyuan/ys7/device/img/GA1044315/2025-10-13_859fdfb7dde540608356f29cb9e3d63e.jpg";
// String url = "http://xny.yj-3d.com:9000/xinnengyuan/ys7/device/img/GA1044315/2025-10-12_2801707255b84004acb5fee2a75299b2.jpg";
img.setCreateTime(new Date());
img.setUrl(url);
log.info("图片:{},识别中", url);
ys7DeviceImgService.saveCapturePic(List.of(img));
}
}
}

View File

@ -23,7 +23,7 @@ public class RecognizerTest {
@Test
void test() {
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.SOLAR));
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.PANEL));
log.info("recognize: {}", recognize);
}
}

View File

@ -1,9 +1,17 @@
package org.dromara.test;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.safety.domain.dto.violationrecord.HseViolationRecordCreateDto;
import org.dromara.safety.service.IHseViolationRecordService;
import org.dromara.system.domain.SysMenu;
import org.dromara.system.domain.vo.SysMenuVo;
import org.dromara.system.mapper.SysMenuMapper;
import org.dromara.system.service.ISysMenuService;
import org.hamcrest.core.Is;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
@ -20,6 +28,9 @@ public class ViolationRecordTest {
@Resource
private IHseViolationRecordService violationRecordService;
@Autowired
private SysMenuMapper sysMenuMapper;
@Test
void test() {
List<HseViolationRecordCreateDto> list = new ArrayList<>();
@ -55,4 +66,26 @@ public class ViolationRecordTest {
list.add(dto5);
violationRecordService.insertByMonitor(list);
}
@Test
void contextLoads() {
SysMenuVo sysMenuVo = sysMenusByList(1972500768346673154L);
System.out.println(sysMenuVo.toString());
}
SysMenuVo sysMenusByList(Long id) {
SysMenuVo sysMenus = new SysMenuVo();
List<SysMenu> res = sysMenuMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, id));
if (res != null && res.size() > 0 ) {
sysMenus.setChildren(MapstructUtils.convert(res, SysMenuVo.class));
res.forEach(sysMenu -> {
sysMenusByList(sysMenu.getMenuId());
});
}
return sysMenus;
}
}

View File

@ -0,0 +1,32 @@
package org.dromara.common.core.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
public class XzdCustomerSupplierVos implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
private Long id;
/**
* 类型1、供应商2、客户
*/
private String type;
/**
* 供应商-客户id
*/
private Long cSId;
}

View File

@ -0,0 +1,6 @@
package org.dromara.common.core.service;
public interface XzdCsContractInformationService {
String selectNameByIds(String ids);
}

View File

@ -0,0 +1,14 @@
package org.dromara.common.core.service;
import org.dromara.common.core.domain.vo.XzdCustomerSupplierVos;
public interface XzdCustomerSupplierService {
/**
* 查询供应商-客户中间
*
* @param id 主键
* @return 供应商-客户中间
*/
XzdCustomerSupplierVos queryByIdone(Long id);
}

View File

@ -0,0 +1,8 @@
package org.dromara.common.core.service;
public interface XzdCustomerinformationService {
String selectNmaeByIds(String id);
String selectNmaeById(Long id);
}

View File

@ -0,0 +1,6 @@
package org.dromara.common.core.service;
public interface XzdJsCgJungonService {
String selectNameByIds(String ids);
}

View File

@ -0,0 +1,6 @@
package org.dromara.common.core.service;
public interface XzdProjectService {
String selectNmaeByIds(String ids);
}

View File

@ -0,0 +1,5 @@
package org.dromara.common.core.service;
public interface XzdPurchaseContractInformationService {
String selectNameByIds(String ids);
}

View File

@ -0,0 +1,9 @@
package org.dromara.common.core.service;
public interface XzdSupplierInfoService {
String selectNmaeByIds(String ids);
String selectNmaeById(Long id);
}

View File

@ -0,0 +1,6 @@
package org.dromara.common.core.service;
public interface XzdSupplierOpenBankService {
String selectNameByIds(String ids);
}

View File

@ -77,7 +77,7 @@ public class RedisUtils {
public static <T> void publish(String channelKey, T msg, Consumer<T> consumer) {
RTopic topic = CLIENT.getTopic(channelKey);
topic.publish(msg);
System.out.println("发布通道消息---------"+msg.toString());
// System.out.println("发布通道消息---------"+msg.toString());
consumer.accept(msg);
}

View File

@ -37,4 +37,36 @@ public interface TransConstant {
*/
String PROJECT_ID_TO_NAME = "project_id_to_name";
/**
* 客户id转名称
*/
String XZD_KHXX_ID_TO_NAME = "khxx_id_to_name";
// /**
// * 供应商id转名称
// */
// String XZD_KHXX_ID_TO_NAME = "gysxx_id_to_name";
/**
* 新中大项目id转名称
*/
String XZD_PROJECT_ID_TO_NAME = "xzd_project_id_to_name";
/**
* 采购合同id转名称
*/
String XZD_PURCHASE_CONTRACT_ID_TO_NAME = "xzd_purchase_contract_id_to_name";
/**
* 综合服务合同id转名称
*/
String XZD_CS_CONTRACT_INFORMATION_ID_TO_NAME = "xzd_cs_contract_information_id_to_name";
/**
* 结算-采购合同竣工结算id转名称
*/
String XZD_JS_CG_JUNGON_ID_TO_NAME = "xzd_js_cg_jungon_id_to_name";
/**
* 新中大供应商信息-开户银行id转银行名称
*/
String XZD_SUPPLIER_OPEN_BANK_ID_TO_NAME = "xzd_supplier_open_bank_id_to_name";
}

View File

@ -0,0 +1,26 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.XzdCsContractInformationService;
import org.dromara.common.core.service.XzdPurchaseContractInformationService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
@AllArgsConstructor
@TranslationType(type = TransConstant.XZD_CS_CONTRACT_INFORMATION_ID_TO_NAME)
public class XzdCsContractInformationImpl implements TranslationInterface<String> {
private final XzdCsContractInformationService xzdCsContractInformationService;
@Override
public String translation(Object key, String other) {
if (key instanceof String ids) {
return xzdCsContractInformationService.selectNameByIds(ids);
} else if (key instanceof Long id) {
return xzdCsContractInformationService.selectNameByIds(id.toString());
}
return null;
}
}

View File

@ -0,0 +1,24 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.XzdCustomerinformationService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
@AllArgsConstructor
@TranslationType(type = TransConstant.XZD_KHXX_ID_TO_NAME)
public class XzdCustomerinformationImpl implements TranslationInterface<String> {
private final XzdCustomerinformationService xzdCustomerinformationService;
@Override
public String translation(Object key, String other) {
if (key instanceof String ids) {
return xzdCustomerinformationService.selectNmaeByIds(ids);
} else if (key instanceof Long id) {
return xzdCustomerinformationService.selectNmaeByIds(id.toString());
}
return null;
}
}

View File

@ -0,0 +1,23 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.XzdJsCgJungonService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
@AllArgsConstructor
@TranslationType(type = TransConstant.XZD_JS_CG_JUNGON_ID_TO_NAME)
public class XzdJsCgJungonImpl implements TranslationInterface<String> {
private final XzdJsCgJungonService xzdJsCgJungonService;
@Override
public String translation(Object key, String other) {
if (key instanceof String ids) {
return xzdJsCgJungonService.selectNameByIds(ids);
} else if (key instanceof Long id) {
return xzdJsCgJungonService.selectNameByIds(id.toString());
}
return null;
}
}

View File

@ -0,0 +1,23 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.XzdProjectService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
@AllArgsConstructor
@TranslationType(type = TransConstant.XZD_PROJECT_ID_TO_NAME)
public class XzdProjectImpl implements TranslationInterface<String> {
private final XzdProjectService xzdProjectService;
@Override
public String translation(Object key, String other) {
if (key instanceof String ids) {
return xzdProjectService.selectNmaeByIds(ids);
} else if (key instanceof Long id) {
return xzdProjectService.selectNmaeByIds(id.toString());
}
return null;
}
}

View File

@ -0,0 +1,26 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.XzdPurchaseContractInformationService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
@AllArgsConstructor
@TranslationType(type = TransConstant.XZD_PURCHASE_CONTRACT_ID_TO_NAME)
public class XzdPurchaseContractInformationImpl implements TranslationInterface<String> {
private final XzdPurchaseContractInformationService xzdCustomerinformationService;
@Override
public String translation(Object key, String other) {
if (key instanceof String ids) {
return xzdCustomerinformationService.selectNameByIds(ids);
} else if (key instanceof Long id) {
return xzdCustomerinformationService.selectNameByIds(id.toString());
}
return null;
}
}

View File

@ -0,0 +1,24 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.XzdSupplierInfoService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
@AllArgsConstructor
//@TranslationType(type = TransConstant.XZD_KHXX_ID_TO_NAME)
public class XzdSupplierInfoImpl implements TranslationInterface<String> {
private final XzdSupplierInfoService xzdSupplierInfoService;
@Override
public String translation(Object key, String other) {
if (key instanceof String ids) {
return xzdSupplierInfoService.selectNmaeByIds(ids);
} else if (key instanceof Long id) {
return xzdSupplierInfoService.selectNmaeByIds(id.toString());
}
return null;
}
}

View File

@ -0,0 +1,23 @@
package org.dromara.common.translation.core.impl;
import lombok.AllArgsConstructor;
import org.dromara.common.core.service.XzdSupplierOpenBankService;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.common.translation.core.TranslationInterface;
@AllArgsConstructor
@TranslationType(type = TransConstant.XZD_SUPPLIER_OPEN_BANK_ID_TO_NAME)
public class XzdSupplierOpenBankImpl implements TranslationInterface<String> {
private final XzdSupplierOpenBankService xzdSupplierOpenBankService;
@Override
public String translation(Object key, String other) {
if (key instanceof String ids) {
return xzdSupplierOpenBankService.selectNameByIds(ids);
} else if (key instanceof Long id) {
return xzdSupplierOpenBankService.selectNameByIds(id.toString());
}
return null;
}
}

View File

@ -5,3 +5,10 @@ org.dromara.common.translation.core.impl.OssUrlTranslationImpl
org.dromara.common.translation.core.impl.UserNameTranslationImpl
org.dromara.common.translation.core.impl.NicknameTranslationImpl
org.dromara.common.translation.core.impl.ProjectNameTranslationImpl
org.dromara.common.translation.core.impl.XzdCustomerinformationImpl
org.dromara.common.translation.core.impl.XzdProjectImpl
org.dromara.common.translation.core.impl.XzdPurchaseContractInformationImpl
org.dromara.common.translation.core.impl.XzdSupplierInfoImpl
org.dromara.common.translation.core.impl.XzdJsCgJungonImpl
org.dromara.common.translation.core.impl.XzdCsContractInformationImpl
org.dromara.common.translation.core.impl.XzdSupplierOpenBankImpl

View File

@ -13,6 +13,7 @@ import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.server.HandshakeInterceptor;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* WebSocket 配置

View File

@ -69,8 +69,8 @@ public class WebSocketUtils {
broadcastMessage.setMessage(webSocketMessage.getMessage());
broadcastMessage.setSessionKeys(unsentSessionKeys);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
// log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
// WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
});
}
}
@ -84,7 +84,7 @@ public class WebSocketUtils {
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
broadcastMessage.setMessage(message);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);
// log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);
});
}

View File

@ -15,8 +15,41 @@
system系统模块
</description>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>1.0.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
<!-- Java WebSocket 标准API -->
<!-- <dependency>-->
<!-- <groupId>javax.websocket</groupId>-->
<!-- <artifactId>javax.websocket-api</artifactId>-->
<!-- <version>1.1</version>-->
<!-- <scope>provided</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.drewnoakes</groupId>-->
@ -101,7 +134,6 @@
</dependency>
<!-- 支持中文字体 -->
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
@ -262,6 +294,13 @@
<artifactId>netty-all</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version> <!-- 最新版本可自行调整 -->
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,51 @@
package org.dromara.ai.controller;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
/**
* @author lilemy
* @date 2025-10-23 11:32
*/
@Validated
@RestController
@RequestMapping("/ai")
public class AIController {
private static final String DEFAULT_PROMPT = "你是一个博学的智能聊天助手,请根据用户提问回答!";
private final ChatClient dashScopeChatClient;
public AIController(ChatClient.Builder chatClientBuilder) {
this.dashScopeChatClient = chatClientBuilder
.defaultSystem(DEFAULT_PROMPT)
// 实现 Logger 的 Advisor
.defaultAdvisors(
new SimpleLoggerAdvisor()
)
// 设置 ChatClient 中 ChatModel 的 Options 参数
.defaultOptions(
DashScopeChatOptions.builder()
.withTopP(0.7)
.build()
)
.build();
}
/**
* ChatClient 流式调用
*/
@GetMapping("/stream/chat")
public Flux<String> streamChat(@RequestParam(value = "query", defaultValue = "你好,很高兴认识你,能简单介绍一下自己吗?") String query, HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
return dashScopeChatClient.prompt(query).stream().content();
}
}

View File

@ -42,7 +42,7 @@ public class SysPackageController {
* 上传最新安装包及版本
*/
@GetMapping("/uploadNewVersion")
public R<SysPackage> uploadNewVersion(String version, String type, MultipartFile file) {
public R<SysPackage> uploadNewVersion(String version, String type, MultipartFile file, String context) {
String originalFileName = "apk/package/app-release.apk";
// 先查询最新记录
@ -57,11 +57,11 @@ public class SysPackageController {
}
// 分离事务:再处理数据库操作
return handleDatabaseOperations(version, type, upload, list);
return handleDatabaseOperations(version, type, upload, list, context);
}
@Transactional
public R<SysPackage> handleDatabaseOperations(String version, String type, SysOssVo upload, List<SysPackage> existingPackages) {
public R<SysPackage> handleDatabaseOperations(String version, String type, SysOssVo upload, List<SysPackage> existingPackages, String context) {
try {
// 先删除旧文件记录
if (existingPackages != null && !existingPackages.isEmpty()) {
@ -78,6 +78,7 @@ public class SysPackageController {
sysPackage.setFileId(upload.getOssId());
sysPackage.setFileUrl(upload.getUrl());
sysPackage.setType(type);
sysPackage.setContext(context);
boolean save = sysPackageService.save(sysPackage);
if (!save) {

View File

@ -30,4 +30,9 @@ public class SysPackage extends BaseEntity {
private String fileUrl;
/**
* 更新内容
*/
private String context;
}

View File

@ -27,4 +27,9 @@ public class SysPackageVo {
@ExcelProperty("安装包地址")
private String fileUrl;
/**
* 更新内容
*/
private String context;
}

View File

@ -1,10 +1,8 @@
package org.dromara.bigscreen.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.dromara.bigscreen.domain.dto.WeatherQueryReq;
import org.dromara.bigscreen.domain.vo.*;
import org.dromara.bigscreen.mapper.ProjectBigScreenMapper;
@ -52,14 +50,10 @@ public class EnterpriseBigScreenController {
@Resource
private IBusProjectService projectService;
@Resource
private ProjectBigScreenMapper projectBigScreenMapper;
/**
* 获取关键指标
*/
@SaCheckPermission("enterprise:bigScreen:keyIndex")
// @SaCheckPermission("enterprise:bigScreen:keyIndex")
@GetMapping("/keyIndex")
public R<EnterpriseKeyIndexVo> getEnterpriseKeyIndex() {
return R.ok(enterpriseBigScreenService.getEnterpriseKeyIndex());
@ -68,7 +62,7 @@ public class EnterpriseBigScreenController {
/**
* 项目进度分析
*/
@SaCheckPermission("enterprise:bigScreen:projectProgress")
// @SaCheckPermission("enterprise:bigScreen:projectProgress")
@GetMapping("/projectProgress")
public R<ProjectProgressAnalysisVo> getProjectProgress() {
return R.ok(enterpriseBigScreenService.getProjectProgressAnalysis());
@ -77,7 +71,7 @@ public class EnterpriseBigScreenController {
/**
* 项目产值对比
*/
@SaCheckPermission("enterprise:bigScreen:projectOutputValueComparison")
// @SaCheckPermission("enterprise:bigScreen:projectOutputValueComparison")
@GetMapping("/projectOutputValueComparison")
public R<List<OutputValueComparisonVo>> getProjectOutputValueComparison() {
return R.ok(enterpriseBigScreenService.getProjectOutputValueComparison());
@ -86,7 +80,7 @@ public class EnterpriseBigScreenController {
/**
* 项目进度完成度和计划容量
*/
@SaCheckPermission("enterprise:bigScreen:projectProgressCapacity")
// @SaCheckPermission("enterprise:bigScreen:projectProgressCapacity")
@GetMapping("/projectProgressCapacity")
public R<List<ProjectProgressCapacityVo>> getProjectProgressCapacity() {
return R.ok(enterpriseBigScreenService.getProjectProgressCapacity());
@ -95,7 +89,7 @@ public class EnterpriseBigScreenController {
/**
* 风险预警
*/
@SaCheckPermission("enterprise:bigScreen:riskEarlyWarning")
// @SaCheckPermission("enterprise:bigScreen:riskEarlyWarning")
@GetMapping("/riskEarlyWarning")
public R<List<RiskEarlyWarningVo>> getRiskEarlyWarning() {
return R.ok(enterpriseBigScreenService.getRiskEarlyWarning());
@ -104,7 +98,7 @@ public class EnterpriseBigScreenController {
/**
* 查询天气
*/
@SaCheckPermission("enterprise:bigScreen:weather")
// @SaCheckPermission("enterprise:bigScreen:weather")
@GetMapping("/weather")
public R<List<WeatherVo>> getProjectWeather(WeatherQueryReq req) {
return R.ok(enterpriseBigScreenService.getWeather3DaysList(req));
@ -113,7 +107,7 @@ public class EnterpriseBigScreenController {
/**
* 查询安全天数
*/
@SaCheckPermission("enterprise:bigScreen:safetyDay")
// @SaCheckPermission("enterprise:bigScreen:safetyDay")
@GetMapping("/safetyDay")
public R<Long> getProjectSafetyDay() {
LocalDate date = LocalDate.of(2023, 1, 1);
@ -125,7 +119,7 @@ public class EnterpriseBigScreenController {
/**
* 人数统计
*/
@SaCheckPermission("enterprise:bigScreen:peopleCount")
// @SaCheckPermission("enterprise:bigScreen:peopleCount")
@GetMapping("/peopleCount")
public R<PeopleCountVo> getProjectPeopleCount() {
PeopleCountVo peopleCountVo = new PeopleCountVo();
@ -156,7 +150,7 @@ public class EnterpriseBigScreenController {
/**
* 出勤人数统计
*/
@SaCheckPermission("enterprise:bigScreen:allAttendanceCount")
// @SaCheckPermission("enterprise:bigScreen:allAttendanceCount")
@GetMapping("/allAttendanceCount")
public R<TodayAttendanceCountVo> getAllAttendanceCount() {
TodayAttendanceCountVo todayAttendanceCountVo = new TodayAttendanceCountVo();
@ -195,7 +189,7 @@ public class EnterpriseBigScreenController {
/**
* 每个项目的出勤人数
*/
@SaCheckPermission("enterprise:bigScreen:projectAttendanceCount")
// @SaCheckPermission("enterprise:bigScreen:projectAttendanceCount")
@GetMapping("/projectAttendanceCount")
public R<List<ProjectAttendanceCountVo>> getProjectAttendanceCount() {

View File

@ -1,6 +1,5 @@
package org.dromara.bigscreen.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
@ -62,7 +61,7 @@ public class MoneyBigScreenController {
/**
* 查询项目位置列表
*/
@SaCheckPermission("money:bigScreen:projectGis")
// @SaCheckPermission("money:bigScreen:projectGis")
@GetMapping("/project/gis")
public R<List<BusProjectGisVo>> getProjectGis() {
return R.ok(moneyBigScreenService.getProjectGis());
@ -545,7 +544,7 @@ public class MoneyBigScreenController {
/**
* 查询项目天气
*/
@SaCheckPermission("project:bigScreen:weather")
// @SaCheckPermission("project:bigScreen:weather")
@GetMapping("/weather/{projectId}")
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
@ -555,7 +554,7 @@ public class MoneyBigScreenController {
/**
* 查询项目安全天数
*/
@SaCheckPermission("project:bigScreen:safetyDay")
// @SaCheckPermission("project:bigScreen:safetyDay")
@GetMapping("/safetyDay/{projectId}")
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {

View File

@ -1,18 +1,15 @@
package org.dromara.bigscreen.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.bigscreen.domain.dto.ProjectUpdateDto;
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
import org.dromara.bigscreen.domain.vo.ProjectLandVo;
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
import org.dromara.bigscreen.domain.vo.*;
import org.dromara.bigscreen.service.ProjectBigScreenService;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.domain.R;
@ -20,7 +17,12 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.facility.domain.bo.FacRedLineBo;
import org.dromara.facility.domain.vo.redline.FacRedLineVo;
import org.dromara.facility.service.IFacRedLineService;
import org.dromara.gps.domain.bo.GpsEquipmentBo;
import org.dromara.land.domain.BusLandBlock;
import org.dromara.land.domain.BusLandTransferLedger;
@ -33,6 +35,7 @@ import org.dromara.manager.ys7manager.Ys7Manager;
import org.dromara.other.domain.OthYs7Device;
import org.dromara.other.service.IOthYs7DeviceService;
import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo;
import org.dromara.project.domain.vo.project.BusProjectVo;
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
import org.dromara.project.service.IBusProjectNewsService;
import org.dromara.project.service.IBusProjectService;
@ -86,9 +89,12 @@ public class ProjectBigScreenController extends BaseController {
private final BusLandTransferLedgerSonServiceImpl busLandTransferLedgerSonService;
private final IFacRedLineService facRedLineService;
/**
* 查询项目土地统计
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/{projectId}")
public R<List<ProjectLandVo>> landCount(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
@ -100,9 +106,16 @@ public class ProjectBigScreenController extends BaseController {
LambdaQueryWrapper<BusLandTransferLedgerSon> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(BusLandTransferLedgerSon::getParentId, list1);
List<BusLandTransferLedgerSon> sonList = busLandTransferLedgerSonService.list(lambdaQueryWrapper);
Map<Long, BigDecimal> collect = sonList.stream().filter(vo -> "1".equals(vo.getTransferStatus()))
.collect(Collectors.toMap(BusLandTransferLedgerSon::getParentId, BusLandTransferLedgerSon::getAreaValue));
Map<Long, BigDecimal> collect = sonList.stream()
.filter(vo -> "1".equals(vo.getTransferStatus()))
.collect(Collectors.groupingBy(
BusLandTransferLedgerSon::getParentId,
Collectors.reducing(
BigDecimal.ZERO,
BusLandTransferLedgerSon::getAreaValue,
BigDecimal::add
)
));
for (BusLandTransferLedger busLandTransferLedger : levelList) {
BigDecimal areaValue = collect.get(busLandTransferLedger.getId());
if (areaValue != null) {
@ -153,7 +166,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询项目天气
*/
@SaCheckPermission("project:bigScreen:weather")
// @SaCheckPermission("project:big:screen")
@GetMapping("/weather/{projectId}")
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
@ -163,7 +176,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询项目安全天数
*/
@SaCheckPermission("project:bigScreen:safetyDay")
// @SaCheckPermission("project:big:screen")
@GetMapping("/safetyDay/{projectId}")
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
@ -173,107 +186,37 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询项目公告
*/
@SaCheckPermission("project:bigScreen:news")
// @SaCheckPermission("project:big:screen")
@GetMapping("/news/{projectId}")
public R<List<BusProjectNewsVo>> getProjectNews(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
// List<BusCorporateEvents> busCorporateEvents = projectBigScreenMapper.getBusCorporateEvents();
// return R.ok(busCorporateEvents.stream().map(event -> {
// BusProjectNewsVo vo = new BusProjectNewsVo();
// vo.setId(event.getId());
// vo.setTitle(event.getHeadline());
// vo.setContent(event.getContent());
// return vo;
// }).toList());
return R.ok(projectBigScreenService.getProjectNews(projectId));
}
/**
* 查询项目AI安全巡检
*/
@SaCheckPermission("project:bigScreen:safetyInspection")
// @SaCheckPermission("project:big:screen")
@GetMapping("/safetyInspection/{projectId}")
public R<List<ProjectSafetyInspectionVo>> getProjectSafetyInspection(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
/* BusProject project = projectService.getById(projectId);
projectId = project.getGoId();
String pic;
if (projectId == 60) {
pic = "http://xny.yj-3d.com:7464";
} else {
pic = "http://xny.yj-3d.com:7363";
}
List<BusTour> busTours = projectBigScreenMapper.selectTourByProjectId(projectId);
return R.ok(busTours.stream().map(tour -> {
ProjectSafetyInspectionVo vo = new ProjectSafetyInspectionVo();
vo.setId(tour.getId());
vo.setViolationType(tour.getTourType());
vo.setPicture(pic + tour.getPicture());
vo.setCreateTime(tour.getCreatedAt());
return vo;
}).toList());*/
return R.ok(projectBigScreenService.getProjectSafetyInspection(projectId));
}
/**
* 查询项目人员情况
*/
@SaCheckPermission("project:bigScreen:people")
// @SaCheckPermission("project:big:screen")
@GetMapping("/people/{projectId}")
public R<ProjectPeopleVo> getProjectPeople(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
// BusProject project = projectService.getById(projectId);
// projectId = project.getGoId();
// Integer projectUserCount = projectBigScreenMapper.getProjectUserCount(projectId);
// ProjectPeopleVo vo = new ProjectPeopleVo();
// vo.setPeopleCount(BigDecimal.valueOf(projectUserCount));
// Integer attendanceCount = projectBigScreenMapper.getAttendanceCount(projectId, DateUtils.getDate());
// vo.setAttendanceCount(BigDecimal.valueOf(attendanceCount));
// vo.setAttendanceRate(BigDecimalUtil.toPercentage(BigDecimal.valueOf(attendanceCount), BigDecimal.valueOf(projectUserCount)));
// List<BusConstructionUser> projectUserList = projectBigScreenMapper.getProjectUserList(projectId);
// List<BusProjectTeamByGo> teamList = projectBigScreenMapper.getTeamList(projectId);
//
// List<ProjectTeamAttendanceVo> teamAttendanceList = new ArrayList<>();
// String punchRange = project.getPunchRange();
// String punchTime = "";
// if (punchRange != null) {
// String start = punchRange.split(",")[0];
// punchTime = LocalDate.now() + " " + start;
// }
// if (projectUserList != null && teamList != null) {
// projectUserList = projectUserList.stream().filter(user -> user.getTeamId() != null).toList();
// Map<Long, List<BusConstructionUser>> userMap = projectUserList.stream()
// .collect(Collectors.groupingBy(BusConstructionUser::getTeamId));
// for (BusProjectTeamByGo team : teamList) {
// ProjectTeamAttendanceVo vo1 = new ProjectTeamAttendanceVo();
// vo1.setId(team.getId());
// vo1.setTeamName(team.getName());
// vo1.setAttendanceTime(punchTime);
// vo1.setAttendanceNumber(BigDecimal.ZERO);
// List<BusConstructionUser> userList = userMap.get(team.getId());
// if (CollUtil.isNotEmpty(userList)) {
// List<String> list = userList.stream().map(BusConstructionUser::getOpenid).distinct().toList();
// Integer aCount = projectBigScreenMapper.getAttendanceCountByOpenIds(list, LocalDate.now());
// vo1.setAttendanceNumber(BigDecimal.valueOf(aCount));
// }
// vo1.setAllNumber(BigDecimal.valueOf(userMap.getOrDefault(team.getId(), List.of()).size()));
// if (vo1.getAttendanceNumber() != null && vo1.getAllNumber() != null && vo1.getAllNumber().compareTo(BigDecimal.ZERO) != 0) {
// vo1.setAttendanceRate(BigDecimalUtil.toPercentage(vo1.getAttendanceNumber(), vo1.getAllNumber()));
// } else {
// vo1.setAttendanceRate(BigDecimal.ZERO);
// }
// teamAttendanceList.add(vo1);
// }
// }
// vo.setTeamAttendanceList(teamAttendanceList);
// return R.ok(vo);
return R.ok(projectBigScreenService.getProjectPeople(projectId));
}
/**
* 查询项目形象进度
*/
@SaCheckPermission("project:bigScreen:imageProgress")
// @SaCheckPermission("project:big:screen")
@GetMapping("/imageProgress/{projectId}")
public R<List<ProjectImageProgressVo>> getProjectImageProgress(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
@ -283,28 +226,17 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询项目概括
*/
@SaCheckPermission("project:bigScreen:generalize")
// @SaCheckPermission("project:big:screen")
@GetMapping("/generalize/{projectId}")
public R<String> getProjectGeneralize(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
// BusProject project = projectService.getById(projectId);
// if (project != null) {
// Long goId = project.getGoId();
// if (goId != null) {
// List<SysProjectIntroduce> sysProjectIntroduces = projectBigScreenMapper.selectByProjectId(goId);
// if (CollUtil.isNotEmpty(sysProjectIntroduces)) {
// return R.ok(sysProjectIntroduces.getFirst().getRichText());
// }
// }
// }
return R.ok(projectBigScreenService.getProjectGeneralize(projectId));
// return R.ok();
}
/**
* 查询设备列表
*/
@SaCheckPermission("project:bigScreen:getClientList")
// @SaCheckPermission("project:big:screen")
@GetMapping("/getClientList/{projectId}")
public R<List<Map<String, Object>>> getClientList(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
@ -314,6 +246,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 修改萤石摄像头
*/
// @SaCheckPermission("project:big:screen")
@RepeatSubmit()
@PutMapping("/device")
public R<Void> edit(@Validated @RequestBody Ys7DeviceUpdateReq req) {
@ -337,11 +270,15 @@ public class ProjectBigScreenController extends BaseController {
if (count > 0) {
throw new ServiceException("已存在同名萤石摄像头", HttpStatus.CONFLICT);
}
// todo 更新云端名称
/* Boolean result = ys7Manager.updateDeviceName(one.getDeviceSerial(), deviceName);
// 更新云端名称
Boolean result = ys7Manager.updateDeviceName(one.getDeviceSerial(), deviceName);
if (!result) {
throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR);
}*/
}
}
if (req.getLatitude() != null && req.getLongitude() != null) {
ys7Device.setLatitude(req.getLatitude());
ys7Device.setLongitude(req.getLongitude());
}
return toAjax(othYs7DeviceService.updateById(ys7Device));
}
@ -349,6 +286,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询质量信息
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/getQualityList/gis")
public R<QltQualityInspectionListGisVo> queryGisList(QltQualityInspectionGisReq req) {
return R.ok(qualityInspectionService.queryGisList(req));
@ -357,6 +295,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询大屏安全信息
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/getSafetyList/gis")
public R<HseSafetyInspectionListGisVo> queryGisList(HseSafetyInspectionGisReq req) {
return R.ok(safetyInspectionService.queryGisList(req));
@ -365,7 +304,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询GPS设备用户列表
*/
@SaCheckPermission("project:bigScreen:getList")
// @SaCheckPermission("project:big:screen")
@GetMapping("/getList")
public R<List<String>> getList(Long projectId) {
return R.ok(projectBigScreenService.getList(projectId));
@ -374,7 +313,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 新增GPS设备详细
*/
@SaCheckPermission("project:bigScreen:setList")
// @SaCheckPermission("project:big:screen")
@Log(title = "GPS设备详细", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/setList")
@ -385,17 +324,42 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询地图项目分类
*/
// @SaCheckPermission("project:bigScreen:getProjectMapList")
// @SaCheckPermission("project:big:screen")
@GetMapping("/getProjectMapList")
public R<Map<String, Map<String, Map<String, String>>>> getProjectMapList() {
return R.ok(projectService.getProjectMapList());
}
/**
* 查询地图项目分类
*/
// @SaCheckPermission("project:big:screen")
@PostMapping("/updatePosition")
public R<Void> updatePosition(@RequestBody ProjectUpdateDto dto) {
return toAjax(projectService.updatePosition(dto));
}
/**
* 获取项目信息
*/
@GetMapping("/getProjectInfo/{projectId}")
public R<ProjectInfo> getProjectInfo(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
BusProjectVo projectVo = projectService.queryById(projectId);
ProjectInfo info = new ProjectInfo();
info.setLat(projectVo.getLat());
info.setLng(projectVo.getLng());
info.setPlan(projectVo.getPlan());
info.setPosition(projectVo.getPosition());
info.setProjectId(projectVo.getId().toString());
return R.ok(info);
}
/**
* 查询项目地域分散图
*/
// @SaCheckPermission("project:bigScreen:getProjectMapList")
// @SaCheckPermission("project:big:screen")
@GetMapping("/getProjectDiYv")
public R<Map<String, Long>> getProjectDiYv() {
return R.ok(projectService.getProjectDiYv());
@ -404,7 +368,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 计划和实际容量对比
*/
// @SaCheckPermission("project:bigScreen:getProjectMapList")
// @SaCheckPermission("project:big:screen")
@GetMapping("/getProjectCapacity")
public R<Map<String, Map<String, String>>> getProjectCapacity() {
return R.ok(projectService.getProjectCapacity());
@ -414,6 +378,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 更新无人机缓存
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/setWrjHc")
public void setWrjHc() {
projectBigScreenService.setWrjHc();
@ -422,9 +387,18 @@ public class ProjectBigScreenController extends BaseController {
/**
* 更新无人机缓存
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/getInfoData")
public R<Map<String, Map<String, Object>>> getInfoData(TanchuangInfoReq req) {
return R.ok(projectBigScreenService.getInfoData(req));
}
/**
* 查询设施-红线列表
*/
@GetMapping("/redLine/list")
public TableDataInfo<FacRedLineVo> list(FacRedLineBo bo, PageQuery pageQuery) {
return facRedLineService.queryPageList(bo, pageQuery);
}
}

View File

@ -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; // 图片
}

View File

@ -5,6 +5,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author lilemy
@ -37,4 +38,13 @@ public class Ys7DeviceUpdateReq implements Serializable {
*/
private String remark;
/**
* 纬度精确到6位小数
*/
private BigDecimal latitude;
/**
* 经度精确到6位小数
*/
private BigDecimal longitude;
}

View File

@ -0,0 +1,42 @@
package org.dromara.bigscreen.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-10-22 15:00
*/
@Data
public class ProjectInfo implements Serializable {
@Serial
private static final long serialVersionUID = -8436930470114636496L;
/**
* 纬度
*/
private String lat;
/**
* 经度
*/
private String lng;
/**
* 计划
*/
private String plan;
/**
* 位置
*/
private String position;
/**
* 项目id
*/
private String projectId;
}

View File

@ -80,12 +80,12 @@ public class RedisMessageListener implements MessageListener {
private String buildPushMessage(String key, String message, Long projectId) {
JSONObject messageObj = new JSONObject();
messageObj.put("type", "wrj_DATA_UPDATE");
messageObj.put("projectId",projectId);
messageObj.put("projectId",projectId.toString());
messageObj.put("clientId",key);
// 位置信息
JSONObject locationObj = new JSONObject();
locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude")); // 纬度
locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude")); // 经度
locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude").toString()); // 纬度
locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude").toString()); // 经度
messageObj.put("location", locationObj);
return messageObj.toString();
}

View File

@ -21,6 +21,7 @@ import org.dromara.drone.service.IDroProjectDroneService;
import org.dromara.gps.domain.bo.GpsEquipmentBo;
import org.dromara.gps.domain.vo.DeviceVo;
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.IGpsEquipmentService;
import org.dromara.manager.weathermanager.vo.WeatherVo;
@ -479,10 +480,10 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
LocalDateTime now = LocalDateTime.now();
List<GpsEquipmentSonVo> voList = gpsEquipmentService.getClientList(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()
.eq(OthYs7Device::getProjectId, projectId)
.between(OthYs7Device::getUpdateTime, startOfDay, now)
// .between(OthYs7Device::getUpdateTime, startOfDay, now)
.list();
List<String> wrjKeys = droProjectDroneService.getTopicsByProjectId(projectId);
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>> wrjChildrenMap = 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()) {
for (GpsEquipmentSonVo item : voList) {
Map<String, Object> gps = new HashMap<>();
gps.put("id", item.getClientId());
gps.put("userId", item.getUserId());
gps.put("label", item.getClientId());
gps.put("name", item.getDeviceName());
gps.put("name", item.getUserId() != null ? item.getUserName() : item.getClientId());
gps.put("type", "gps");
gps.put("lat", item.getLocLatitude());
gps.put("lng", item.getLocLongitude());
@ -535,10 +516,10 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
if (appList != null && !appList.isEmpty()) {
for (GpsEquipmentSonVo item : appList) {
Map<String, Object> app = new HashMap<>();
app.put("id", item.getClientId());
app.put("id", item.getUserId());
app.put("userId", item.getUserId());
app.put("label", item.getClientId());
app.put("name", item.getDeviceName());
app.put("label", item.getUserId());
app.put("name", item.getUserName());
app.put("type", "app");
app.put("lat", item.getLocLatitude());
app.put("lng", item.getLocLongitude());
@ -546,20 +527,35 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
appChildrenMap.add(app);
}
}
// 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("detail", item.getDetail());
// sxtChildrenMap.add(sxt);
// }
// }
if (anqmList != null && !anqmList.isEmpty()) {
for (LocationVo item : anqmList) {
Map<String, Object> anqm = new HashMap<>();
anqm.put("id", item.getDevNum());
anqm.put("userId", item.getUserId());
anqm.put("label", item.getDevNum());
anqm.put("name", item.getDevNum());
anqm.put("type", "positioningDevice");
anqm.put("lat", item.getLatitude());
anqm.put("lng", item.getLongitude());
anqm.put("alt", item.getElevation());
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()) {
for (String key : wrjKeys) {
Object object = stringRedisTemplate.opsForValue().get("wrj:osd4:" + key);

View File

@ -318,11 +318,13 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
map.put("remainingQuantity",quantity.subtract(reduce));
map.put("specification",busBillofquantities.getSpecification());
map.put("suppliespriceId",limitListId);
if (busBillofquantities != null) {
map.put("specification",busBillofquantities.getSpecification());
map.put("unit",busBillofquantities.getUnit());
map.put("remark",busBillofquantities.getRemark());
map.put("name",busBillofquantities.getName());
}
return map;
}

View File

@ -211,6 +211,11 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
public void validNum(List<BusPlanDocAssociationBo> associationList, Long supplierId) {
for (BusPlanDocAssociationBo association : associationList) {
if(association.getDemandQuantity() == null){
throw new ServiceException("请填写需求数量");
}
//获取批次需求计划
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
List<String> statuss = new ArrayList<>();

View File

@ -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;
}
}

View File

@ -1,27 +1,47 @@
package org.dromara.common.utils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.MessageUtils;
import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.utils.SseMessageUtils;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.mobileAttendanceMachine.DeviceMessageSender;
import org.dromara.mobileAttendanceMachine.KqjEntity;
import org.dromara.project.domain.BusAttendanceMachine;
import org.dromara.project.service.IBusAttendanceMachineService;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
import java.util.List;
@Component
@Slf4j
public class AsyncUtil {
@Resource
@Lazy
private DeviceMessageSender deviceMessageSender;
@Resource
@Lazy
private ISysOssService ossService;
@Resource
@Lazy
private IBusAttendanceMachineService attendanceMachineService;
//发送短信
@Async
public void sendSms(List<String> mobileList, String config) {
SmsBlend smsBlend = SmsFactory.getSmsBlend(config);
for (String mobile : mobileList) {
SmsResponse smsResponse = smsBlend.sendMessage(mobile, (String) null);
SmsResponse smsResponse = smsBlend.sendMessage(mobile, new LinkedHashMap<String, String>());
if (!smsResponse.isSuccess()) {
log.error("验证码短信发送异常 => {}", smsResponse);
}
@ -38,4 +58,27 @@ public class AsyncUtil {
}
//下发考勤人员
@Async
public void sendPersonnel(Long teamId, SubConstructionUser constructionUser) {
SysOssVo byId = ossService.getById(Long.valueOf(constructionUser.getFacePic()));
List<BusAttendanceMachine> list = attendanceMachineService.lambdaQuery().apply("FIND_IN_SET({0}, teams)", teamId).list();
for (BusAttendanceMachine machine : list) {
deviceMessageSender.sendPersonnelInformation(machine.getSn(), constructionUser.getSysUserId().toString(), constructionUser.getUserName(), byId.getUrl());
}
}
//删除考勤人员
@Async
public void deletePersonnel(SubConstructionUser constructionUser) {
List<BusAttendanceMachine> list = attendanceMachineService.lambdaQuery().apply("FIND_IN_SET({0}, teams)", constructionUser.getTeamId()).list();
for (BusAttendanceMachine machine : list) {
try {
deviceMessageSender.deleteUser(machine.getSn(), constructionUser.getSysUserId().toString());
} catch (Exception e) {
log.error("删除考勤人员异常", e);
}
}
}
}

View File

@ -0,0 +1,93 @@
package org.dromara.common.utils;
import java.util.HashMap;
import java.util.Map;
/**
* 接口错误码匹配工具(用户展示用)
*/
public class ErrorCodeMatcher {
private static final Map<String, String> ERROR_MAP = new HashMap<>();
static {
// 基础错误码
ERROR_MAP.put("1", "抱歉,出现未知错误,请您重试。若问题持续,请联系管理员。");
ERROR_MAP.put("2", "服务暂时不可用,请稍后重试。若多次尝试仍有问题,请联系管理员。");
ERROR_MAP.put("3", "调用的接口不存在,请检查请求地址是否正确(建议避免特殊字符,如手动输入重试)。");
ERROR_MAP.put("4", "当前集群请求量超限,请稍后再试。持续异常请联系管理员。");
ERROR_MAP.put("6", "暂无该接口调用权限,请联系管理员开通相关权限。");
ERROR_MAP.put("14", "鉴权失败,请检查密钥是否正确,或联系管理员协助处理。");
ERROR_MAP.put("17", "今日免费额度已用完。如需继续使用,请联系管理员获取更多资源。");
ERROR_MAP.put("18", "请求频率超限QPS限制。如需提高限制请联系管理员咨询。");
ERROR_MAP.put("19", "总请求量已达限额,请联系管理员获取更多资源。");
ERROR_MAP.put("100", "访问令牌无效,请联系管理员重新获取。");
ERROR_MAP.put("110", "访问令牌无效有效期30天请联系管理员更新。");
ERROR_MAP.put("111", "访问令牌已过期,请联系管理员重新获取。");
// 216xxx系列错误码
ERROR_MAP.put("216100", "请求中包含无效参数,请检查后重新提交。");
ERROR_MAP.put("216101", "缺少必要的请求参数,请核对后补充完整。");
ERROR_MAP.put("216102", "请求的服务暂不支持,请检查调用地址是否正确,或联系管理员确认。");
ERROR_MAP.put("216103", "部分参数长度超限,请缩短后重新尝试。");
ERROR_MAP.put("216110", "应用ID不存在请核对是否为正确ID或联系管理员确认。");
ERROR_MAP.put("216200", "上传的图片为空,请检查图片是否正确上传。");
ERROR_MAP.put("216201", "图片格式不支持目前仅支持PNG、JPG、JPEG、BMP格式请转码后重试。");
ERROR_MAP.put("216202", "图片大小不符合要求,请参考接口文档的限制重新上传,或联系管理员咨询。");
ERROR_MAP.put("216205", "请求体过大base64编码后需小于10M请压缩内容后重试。");
ERROR_MAP.put("216306", "文件上传失败,请检查请求参数是否符合要求。");
ERROR_MAP.put("216307", "图片解析失败,若多次尝试仍有问题,请联系管理员。");
ERROR_MAP.put("216308", "PDF页码参数超过实际页数请核对后修改。");
ERROR_MAP.put("216401", "请求提交失败,请稍后重试。");
ERROR_MAP.put("216402", "获取结果失败,请稍后重试或检查任务状态。");
ERROR_MAP.put("216603", "无法获取PDF页数请检查文件是否完整或编码是否正确。");
ERROR_MAP.put("216604", "请求总量已达限额,请联系管理员获取更多额度。");
ERROR_MAP.put("216630", "识别失败,请重试。若问题持续,请联系管理员。");
ERROR_MAP.put("216631", "银行卡识别失败,请确保上传的是银行卡正面完整清晰的图片(异形卡可能无法识别)。");
ERROR_MAP.put("216633", "身份证识别失败,请确保上传的是身份证完整清晰的图片(非身份证或模糊图片无法识别)。");
ERROR_MAP.put("216634", "检测失败,请重试。若持续异常,请联系管理员。");
ERROR_MAP.put("216600", "企业核验服务请求失败,请重试。持续问题请联系管理员(适用于工商信息查询、要素核验等)。");
ERROR_MAP.put("216601", "企业核验查询成功,但未找到相关结果,请确认信息是否正确后重试。");
ERROR_MAP.put("216602", "企业核验服务超时,请稍后重试。持续问题请联系管理员。");
// 282xxx系列错误码
ERROR_MAP.put("282000", "服务器内部错误。若使用通用文字识别,可能因图片文字过多导致超时,建议分割图片后重试;其他情况可稍后再试,持续问题请联系管理员。");
ERROR_MAP.put("282003", "请求缺少必要参数,请核对后补充。");
ERROR_MAP.put("282005", "批量任务处理出错,请根据具体错误提示排查。");
ERROR_MAP.put("282006", "批量任务数量超限单次最多处理10个任务请减少数量后重试。");
ERROR_MAP.put("282100", "图片压缩转码失败,请更换图片后重试。");
ERROR_MAP.put("282102", "未检测到可识别的卡证/票据,请确保图片包含清晰完整的目标(非卡证或模糊图片无法识别)。");
ERROR_MAP.put("282103", "卡证/票据识别失败,请确保图片包含清晰完整的目标(非对应类型或模糊图片无法识别)。");
ERROR_MAP.put("282110", "图片URL不存在请核对地址后重新提交。");
ERROR_MAP.put("282111", "图片URL格式错误请检查是否符合接口要求的格式。");
ERROR_MAP.put("282112", "图片URL下载超时可能因图片过大超过3M、地址无效或存在防盗链。建议更换图片地址或下载后直接上传。");
ERROR_MAP.put("282113", "图片URL返回无效内容请检查地址是否正确。");
ERROR_MAP.put("282114", "图片URL长度不符合要求需1-1024字节请修改后重试。");
ERROR_MAP.put("282134", "增值税发票验真失败,可能因系统维护,建议次日再试。持续问题请联系管理员。");
ERROR_MAP.put("282808", "请求ID不存在请核对ID是否正确。");
ERROR_MAP.put("282809", "返回结果格式错误需为excel或json请稍后重试。");
ERROR_MAP.put("282810", "图像识别失败,请重试。若问题持续,请联系管理员。");
ERROR_MAP.put("282160", "行驶证核验资源超限,请联系管理员咨询。");
ERROR_MAP.put("282161", "行驶证核验请求过于频繁,请稍后再试。");
}
/**
* 根据错误码获取用户友好的错误信息
* @param errorCode 错误码(字符串/整数)
* @return 优化后的错误提示,未匹配时返回"未知错误错误码xxx"
*/
public static String getFriendlyMessage(String errorCode) {
return ERROR_MAP.getOrDefault(errorCode, "未知错误(错误码:" + errorCode + "),请重试或联系管理员。");
}
public static String getFriendlyMessage(int errorCode) {
return getFriendlyMessage(String.valueOf(errorCode));
}
// 测试示例
public static void main(String[] args) {
System.out.println(getFriendlyMessage(1)); // 输出:抱歉,出现未知错误,请您重试...
System.out.println(getFriendlyMessage("216201")); // 输出图片格式不支持目前仅支持PNG...
System.out.println(getFriendlyMessage(9999)); // 输出未知错误错误码9999...
}
}

View File

@ -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");
}
}

View File

@ -3,6 +3,7 @@ package org.dromara.common.utils.baiduUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.utils.ErrorCodeMatcher;
import org.dromara.common.utils.baiduUtil.entity.face.ComparisonRes;
import org.dromara.common.utils.baiduUtil.entity.face.HumanFaceReq;
import org.dromara.common.utils.baiduUtil.entity.face.HumanFaceRes;
@ -208,8 +209,7 @@ public class BaiDuFace {
// 8. 处理API返回错误
if (comparisonRep.getErrorCode() != 0) {
throw new RuntimeException("人脸对比失败:" + comparisonRep.getErrorMsg()
+ "(错误码:" + comparisonRep.getErrorCode() + "");
throw new RuntimeException("人脸对比失败:" + ErrorCodeMatcher.getFriendlyMessage(comparisonRep.getErrorCode()));
}
// 9. 校验对比结果

View File

@ -364,10 +364,11 @@ public class SubConstructionUserController extends BaseController {
if (user.getEntryDate() != null) {
vo.setEntryDate(DateUtils.formatDateTime(user.getEntryDate()));
}
//0男 1女 2未知
String sex = vo.getSex();
if (sex != null && sex.equals("1")) {
if (sex != null && sex.equals("0")) {
vo.setSex("");
} else if (sex != null && sex.equals("2")) {
} else if (sex != null && sex.equals("1")) {
vo.setSex("");
} else {
vo.setSex("未知");

View File

@ -3,7 +3,6 @@ package org.dromara.contractor.controller.app;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
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.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
@ -136,7 +135,7 @@ public class SubConstructionUserAppController {
@Log(title = "施工人员", businessType = BusinessType.OTHER)
@PostMapping("/face/comparison")
public R<Boolean> faceComparison(@RequestParam("file") MultipartFile file) {
return R.ok(constructionUserService.faceComparison(file));
return R.ok(constructionUserService.faceComparison(file,null ));
}

View File

@ -1,6 +1,7 @@
package org.dromara.contractor.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -204,4 +205,10 @@ public class SubConstructionUser extends BaseEntity {
private Long goId;
private String goOpenid;
/**
* 删除标志0代表存在 1代表删除
*/
@TableLogic
private String delFlag;
}

View File

@ -36,7 +36,7 @@ public class SubConstructionUserAuthenticationReq implements Serializable {
private String phone;
/**
* 0:保密 1:男 2女
* 0男1女2未知
*/
@NotBlank(message = "性别不能为空")
private String sex;

View File

@ -101,4 +101,7 @@ public class SubConstructionUserQueryReq implements Serializable {
*/
private String userId;
private String phone;
}

View File

@ -214,9 +214,10 @@ public interface ISubConstructionUserService extends IService<SubConstructionUse
* 人脸识别
*
* @param file 图片文件
* @param userId
* @return 是否匹配成功
*/
Boolean faceComparison(MultipartFile file);
Boolean faceComparison(MultipartFile file, Long userId);
/**
* 根据系统用户id查询施工人员

View File

@ -19,12 +19,14 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.enums.AppUserTypeEnum;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.exception.OssException;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.utils.AsyncUtil;
import org.dromara.common.utils.IdCardEncryptorUtil;
import org.dromara.common.utils.baiduUtil.BaiDuFace;
import org.dromara.common.utils.baiduUtil.BaiDuOCR;
@ -45,6 +47,7 @@ import org.dromara.contractor.mapper.SubConstructionUserMapper;
import org.dromara.contractor.service.ISubConstructionUserFileService;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.contractor.service.ISubContractorService;
import org.dromara.mobileAttendanceMachine.DeviceMessageSender;
import org.dromara.project.domain.*;
import org.dromara.project.domain.enums.BusAttendanceClockStatusEnum;
import org.dromara.project.domain.enums.BusAttendanceCommuterEnum;
@ -150,6 +153,11 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
@Resource
private ISysRoleService roleService;
@Resource
private AsyncUtil asyncUtil;
/**
* 查询施工人员
*
@ -183,7 +191,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, req.getProjectId());
if (CollectionUtil.isEmpty(byUserId)) {
return new TableDataInfo<>();
return TableDataInfo.build(new ArrayList<>());
}
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
}
@ -201,8 +209,10 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
LambdaQueryWrapper<SubConstructionUser> lqw = Wrappers.lambdaQuery();
// 从对象中取值
String userName = req.getUserName();
String phone = req.getPhone();
// 模糊查询
lqw.like(StringUtils.isNotBlank(phone), SubConstructionUser::getPhone, phone);
lqw.like(StringUtils.isNotBlank(userName), SubConstructionUser::getUserName, userName);
lqw.isNull(SubConstructionUser::getProjectId);
lqw.isNull(SubConstructionUser::getTeamId);
@ -276,7 +286,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
userRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery()
.eq(SysUserRole::getUserId, constructionUser.getSysUserId())
.eq(SysUserRole::getProjectId, dto.getProjectId())
.in(SysUserRole::getRoleId, Arrays.asList(2L, 3L))
.in(SysUserRole::getRoleId, AppUserTypeEnum.ROLE_ID_LIST)
);
//再添加分配角色
Long roleId = "0".equals(dto.getPostId()) ? 2L : 3L;
@ -289,6 +299,8 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
//强退
roleService.cleanOnlineUser(Collections.singletonList(constructionUser.getSysUserId()));
asyncUtil.sendPersonnel(dto.getTeamId(), constructionUser);
return i > 0;
}
@ -1394,6 +1406,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
SysUserBo sysUserBo = new SysUserBo();
sysUserBo.setUserId(userId);
sysUserBo.setNickName(user.getUserName());
sysUserBo.setSex(user.getSex());
userService.updateUser(sysUserBo);
return user.getId();
}
@ -1418,14 +1431,17 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
* 人脸识别
*
* @param file 图片文件
* @param userId
* @return 是否匹配成功
*/
@Override
public Boolean faceComparison(MultipartFile file) {
public Boolean faceComparison(MultipartFile file, Long userId) {
String reqBase64 = this.getPicBase64(file);
HumanFaceReq request = new HumanFaceReq();
request.setImage(reqBase64);
Long userId = LoginHelper.getUserId();
if(userId == null){
userId = LoginHelper.getUserId();
}
SubConstructionUser constructionUser = this.getBySysUserId(userId);
if (constructionUser == null || StringUtils.isBlank(constructionUser.getFacePic())) {
throw new ServiceException("未进行实名认证");
@ -1513,6 +1529,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
lqw.eq(SubConstructionUser::getUserRole, "0");
if (req.getProjectId() == null) {
lqw.isNull(SubConstructionUser::getProjectId);
lqw.apply("exists (select 1 from sys_user where user_id = sys_user_id and dept_id is null)");
} else {
lqw.eq(SubConstructionUser::getProjectId, req.getProjectId());
}

View File

@ -295,7 +295,7 @@ public class SubUserSalaryDetailServiceImpl extends ServiceImpl<SubUserSalaryDet
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, dto.getProjectId());
if(CollectionUtil.isEmpty(byUserId)){
return new TableDataInfo<>();
return TableDataInfo.build(new ArrayList<>());
}
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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> {
}

View File

@ -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> {
}

View File

@ -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> {
}

View File

@ -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> {
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,159 @@
package org.dromara.dataTransmission;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONObject;
import org.dromara.common.redis.utils.RedisUtils;
import javax.crypto.Cipher;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.time.Duration;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import java.io.ByteArrayOutputStream;
@Component
public class TokenUtils {
// Token过期时间25分钟与Redis存储过期时间保持一致
private static final long TOKEN_EXPIRE_SECONDS = 1500;
// HTTP请求超时时间10秒
private static final Duration HTTP_TIMEOUT = Duration.ofSeconds(10);
//通用字符
private static final String USER_NAME = "username";
private static final String PASSWORD = "password";
private static final String PUBLIC_KEY = "publicKey";
private static final String URL = "url";
//clientId
public static final String CLARITYPM = "claritypm";
//接口信息及参数
private static final Map<String, Map<String, String>> tokenMap = new HashMap<>(){
{
put(CLARITYPM, new HashMap<>(){{
put(URL, "https://claritypm.powerchina.cn/neSmartsite-api/loginCli");
put(USER_NAME, "zhangweiwei");
put(PASSWORD, "Hkrsoft@#2023");
put(PUBLIC_KEY, "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoaejbjbttHyHuEzHL8lIX5GZZ6zIYrqJpEDlPM4V5LHn19rSAYp2FyAr8y5Ctny9uUdaYbkoFiVQgxWrAYo4X/3O0OFDsowE25FMOLQY0Mn5B6CvVR7Sdt3DqzIzM1tUnJCIbVGNfDMgxLrLwFN8RvOW8MPlB6LgOvlGMDbj+OQIDAQAB");
}});
}
};
//字段参数
private static final Map<String, Map<String, String>> paramMap = new HashMap<>(){
{
put(CLARITYPM, new HashMap<>(){{
put(USER_NAME, "username");
put(PASSWORD, "password");
}});
}
};
/**
* 优先从Redis获取Token不存在则调用接口获取并存储
* @param clientId 客户端ID
* @return 有效的Token字符串
* @throws Exception 当获取过程发生异常时抛出
*/
public static String getToken(String clientId) throws Exception {
// 1. 定义Redis中的Token键名
// String redisKey = "data_auth:token:" + clientId;
//
// // 2. 尝试从Redis获取Token
// String token = RedisUtils.getCacheObject(redisKey);
// if (token != null && !token.isBlank()) {
// // 缓存命中,直接返回
// return token;
// }
// 3. 缓存未命中调用接口获取Token
Map<String, String> map = tokenMap.get(clientId);
String token = fetchTokenFromApi(clientId,map.get(URL), map.get(USER_NAME), rsaEncrypt(map.get(PASSWORD),map.get(PUBLIC_KEY)));
// 4. 存储到Redis设置25分钟过期
// RedisUtils.setCacheObject(redisKey, token,Duration.ofSeconds(TOKEN_EXPIRE_SECONDS) );
return token;
}
/**
* 从接口获取Token的内部方法
*/
private static String fetchTokenFromApi(String clientId, String authUrl, String username, String encryptedPassword) throws Exception {
// 构建JSON请求体包含加密后的密码
// 1. 构建请求头(与原 Go 代码一致的头信息)
// Map<String, String> headers = new HashMap<>();
// headers.put(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
// headers.put("User-Agent", "Mozilla/5.0");
// headers.put(HttpHeaders.ACCEPT, "application/json");
// headers.put("Origin", "https://claritypm.powerchina.cn");
// headers.put("Referer", "https://claritypm.powerchina.cn/");
// 2. 构建请求体(保持你的原有逻辑)
Map<String, String> map = paramMap.get(clientId);
JSONObject requestBody = new JSONObject();
requestBody.put(map.get(USER_NAME), username); // 从 map 中获取接口要求的用户名参数名
requestBody.put(map.get(PASSWORD), encryptedPassword); // 加密后的密码
String jsonBody = requestBody.toJSONString();
System.out.println("请求体:" + jsonBody);
// 3. 带 Header 发送 POST 请求Hutool HttpUtil 重载方法)
String post = HttpUtil.createPost(authUrl)
// .addHeaders(headers) // 设置所有请求头
.body(jsonBody) // 设置请求体
.execute() // 执行请求
.body(); // 获取响应体
System.out.println("响应结果:" + post);
// 3. 解析响应(核心解析逻辑)
JSONObject responseJson = JSONObject.parseObject(post);
int code = responseJson.getIntValue("code");
String msg = responseJson.getString("msg");
String token = responseJson.getString("token");
// 4. 校验响应有效性
if (code != 200) {
throw new RuntimeException("获取 Token 失败,响应信息:" + msg + ",状态码:" + code);
}
if (token == null || token.trim().isEmpty()) {
throw new RuntimeException("响应中未包含有效 Token响应内容" + post);
}
return token;
}
/**
* RSA公钥加密核心加密方法
* @param content 待加密内容(原始密码)
* @param publicKeyStr 公钥字符串Base64编码
* @return 加密后的Base64字符串
* @throws Exception 加密过程异常
*/
public static String rsaEncrypt(String content, String publicKeyStr) throws Exception {
RSA rsa = new RSA(null, publicKeyStr);
byte[] encryptedBytes = rsa.encrypt(content, KeyType.PublicKey);
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static void main(String[] args) throws Exception {
String claritypm = getToken(CLARITYPM);
System.out.println(claritypm);
}
}

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