Compare commits

...

240 Commits

Author SHA1 Message Date
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
zt
255a202c02 Merge remote-tracking branch 'origin/dev' into dev 2025-10-13 11:44:29 +08:00
zt
1033ee01fb 审批 2025-10-13 11:44:13 +08:00
201f7bd3a7 安全帽表名修改 2025-10-13 11:42:14 +08:00
8a7726e216 安全帽接口修改 2025-10-13 09:55:16 +08:00
lcj
bc85fe64a4 进度计划,施工产值 2025-10-13 09:39:21 +08:00
549fbe92de 10-12-承包合同信息 2025-10-12 21:32:13 +08:00
270071a5f3 Merge remote-tracking branch 'origin/dev' into dev 2025-10-12 21:31:41 +08:00
09cbb6a8c5 大屏接口修改 2025-10-12 20:56:08 +08:00
zt
f825b9f968 优化 2025-10-12 20:51:38 +08:00
f7b9d2f431 10-12-支付条款新增 2025-10-12 19:32:10 +08:00
742df7279b 10-12-承包合同 2025-10-12 18:52:18 +08:00
684209aa36 安全帽和大屏接口 2025-10-12 18:18:30 +08:00
d033b505e2 10-12-合作协议 2025-10-12 17:20:45 +08:00
59623f53a0 Merge remote-tracking branch 'origin/dev' into dev 2025-10-12 16:08:01 +08:00
b9cf8ea3de 10-12-新增银行卡,合作协议 2025-10-12 16:07:54 +08:00
45761415fa 批次需求计划优化 2025-10-12 15:23:35 +08:00
lcj
4dca396d11 进度计划,施工产值 2025-10-12 14:16:05 +08:00
0efaf12849 Merge remote-tracking branch 'origin/dev' into dev 2025-10-12 00:25:45 +08:00
lg
51686c212e 标前立项 2025-10-12 00:25:23 +08:00
lg
866c53c6cc Merge remote-tracking branch 'origin/dev' into dev 2025-10-12 00:24:44 +08:00
809494ffca Merge remote-tracking branch 'origin/dev' into dev 2025-10-11 23:38:07 +08:00
zt
7824803bf6 管理员和分包补卡 2025-10-11 20:59:45 +08:00
zt
5df3bb7baf 管理员和分包补卡 2025-10-11 19:23:53 +08:00
c7dcddb58e 10-11-项目信息 2025-10-11 19:14:51 +08:00
zt
cc64f16231 优化 2025-10-11 15:27:33 +08:00
26129e7433 10-11-安装包上传,事务分离 2025-10-11 14:49:08 +08:00
lg
e7aec88abf Merge remote-tracking branch 'origin/dev' into dev 2025-10-11 10:56:21 +08:00
lg
f820edebb5 标前立项 2025-10-11 10:56:07 +08:00
9d586f7b77 Merge remote-tracking branch 'origin/dev' into dev 2025-10-11 10:55:31 +08:00
lcj
00e9fa1ea3 根据配置文件抓拍图片 2025-10-11 10:50:14 +08:00
9a698857ce 10-11-项目信息,工程建设 2025-10-11 10:16:11 +08:00
b47cdb5732 大屏接口优化 2025-10-10 22:46:42 +08:00
zt
3bf7a1201f bug修改 2025-10-10 22:44:03 +08:00
lcj
bb38b6a6e1 添加抓拍,修改项目大屏 2025-10-10 21:57:57 +08:00
zt
11b5908d8c bug修改 2025-10-10 21:45:08 +08:00
zt
6c96c6f534 bug修改 2025-10-10 21:03:10 +08:00
lg
22a7500048 误删除 2025-10-10 20:59:39 +08:00
lg
412db4d348 误删除 2025-10-10 20:36:44 +08:00
lg
6a200b391e 1111 2025-10-10 20:12:13 +08:00
lg
6e0e867e57 Merge branch 'dev' of http://192.168.110.2:3000/lcj/xinnengyuan into dev 2025-10-10 20:11:33 +08:00
66d2f24256 10-10-1 2025-10-10 20:10:20 +08:00
lg
69e8e4169b 1111 2025-10-10 20:07:47 +08:00
33d051164e 10-10-项目信息初始化 2025-10-10 18:25:22 +08:00
2d18345087 10-10-修复2 2025-10-10 16:34:21 +08:00
ef10a4f0a4 10-10-修复 2025-10-10 16:33:12 +08:00
9784aa7ee3 Merge remote-tracking branch 'origin/dev' into dev 2025-10-10 16:14:55 +08:00
af069f3fa5 10-10-xzd项目经理推荐审批模块 2025-10-10 16:14:49 +08:00
zt
d8f5cc34ea bug修改 2025-10-10 15:22:17 +08:00
0870003967 Merge remote-tracking branch 'origin/dev' into dev 2025-10-10 14:42:48 +08:00
fb4ce63f59 10-10-xzd供应商信息模块 2025-10-10 14:42:34 +08:00
1243 changed files with 119507 additions and 2313 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,16 +101,24 @@ public class SysRegisterService {
sysUser.setUserType(userType);
sysUser.setEmail(registerBody.getEmail());
boolean exist = TenantHelper.dynamic(tenantId, () -> {
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
});
if (exist) {
throw new UserException("user.register.save.error", username);
}
boolean regFlag = userService.registerUser(sysUser, tenantId);
if (!regFlag) {
throw new UserException("user.register.error");
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()));
});
if (exist) {
throw new UserException("user.register.save.error", username);
}
boolean regFlag = userService.registerUser(sysUser, tenantId);
if (!regFlag) {
throw new UserException("user.register.error");
}
}
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));

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
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
@ -209,6 +229,30 @@ sms:
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
--- # 三方授权
@ -297,7 +341,10 @@ dxf2GeoJson:
file-name: main.exe
ys7:
app-key: 3acf9f1a43dc4209841e0893003db0a2
app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36
app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e
job:
capture-enabled: false # 控制是否启用萤石抓拍任务
device-sync-enabled: false # 控制是否同步萤石设备
#ys7:
# app-key: 081b0d6d5f7f4de8bc5c7fa350fb26ec
# app-secret: caa37b9f60ef02deb57e563bc190e6db
@ -317,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
# 短信拦截限制单手机号每日最大发送量,只对开启了拦截的配置有效
@ -213,6 +223,30 @@ sms:
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:
@ -297,10 +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: 09e29c70ae1161fbc3ce2030fc09ba2e
job:
capture-enabled: true # 控制是否启用萤石抓拍任务
device-sync-enabled: true # 控制是否同步萤石设备
# 斯巴达算法
sparta:
url: http://119.3.204.120:8040
@ -317,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:
@ -129,6 +133,7 @@ security:
- /resource/oss/upload
# todo 仅测试
- /facility/matrix/**
- /hat/device/data
# 多租户配置
tenant:
@ -252,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.代码生成模块
@ -274,8 +281,10 @@ springdoc:
packages-to-scan: org.dromara.gps
- group: 24.招标模块
packages-to-scan: org.dromara.tender
- group: 25.app版本模块
packages-to-scan: org.dromara.app
# - group: 25.app版本模块
# packages-to-scan: org.dromara.app
- group: 25.数据迁移模块
packages-to-scan: org.dromara.transferData
- group: 26.netty消息模块
packages-to-scan: org.dromara.websocket
- group: 27.新中大模块
@ -295,6 +304,14 @@ xss:
- /system/notice
- /warm-flow/save-xml
- /project/project
- /xzd/contractDetails/**
- /xzd/contractChange/**
- /comprehensive/csContractChange/**
- /comprehensive/csContractInformation/**
- /hetongbiangeng/**
- /fenbaohetongbiangg/**
- /fenbaohetongxinxi/**
- /contractManagement/**
# 全局线程池相关配置
# 如使用JDK21请直接使用虚拟线程 不要开启此配置

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;
@ -18,11 +21,17 @@ import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.contractor.service.ISubUserSalaryDetailService;
import org.dromara.design.service.IDesTechnicalStandardService;
import org.dromara.facility.domain.FacMatrix;
import org.dromara.facility.domain.FacPhotovoltaicPanel;
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;
@ -48,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;
/**
@ -102,51 +113,14 @@ public class DemoTest {
@Resource
private IOutConstructionValueService constructionValueService;
@Test
void syncTest() {
List<BusProject> projects = projectService.lambdaQuery()
.eq(BusProject::getPId, 1968506669544656898L)
.list();
Set<Long> projectIds = projects.stream().map(BusProject::getId).collect(Collectors.toSet());
List<FacPhotovoltaicPanel> zujian = photovoltaicPanelService.lambdaQuery()
.eq(FacPhotovoltaicPanel::getProgressCategoryName, "组件安装")
.in(FacPhotovoltaicPanel::getProjectId, projectIds)
.list();
Map<Long, List<FacPhotovoltaicPanel>> zujianMap = zujian.stream()
.collect(Collectors.groupingBy(FacPhotovoltaicPanel::getMatrixId));
List<PgsProgressCategory> zhijia = progressCategoryService.lambdaQuery()
.eq(PgsProgressCategory::getName, "支架安装")
.in(PgsProgressCategory::getProjectId, projectIds)
.list();
Map<Long, List<PgsProgressCategory>> zhijiaMap = zhijia.stream()
.collect(Collectors.groupingBy(PgsProgressCategory::getMatrixId));
List<FacPhotovoltaicPanel> newP = new ArrayList<>();
for (Map.Entry<Long, List<FacPhotovoltaicPanel>> entry : zujianMap.entrySet()) {
Long key = entry.getKey();
List<FacPhotovoltaicPanel> panels = entry.getValue();
List<PgsProgressCategory> list = zhijiaMap.getOrDefault(key, new ArrayList<>());
if (CollUtil.isEmpty(list)) {
continue;
}
PgsProgressCategory zhi = list.getFirst();
List<FacPhotovoltaicPanel> panelList = panels.stream().map(panel -> {
FacPhotovoltaicPanel p = new FacPhotovoltaicPanel();
p.setProjectId(panel.getProjectId());
p.setMatrixId(panel.getMatrixId());
p.setName(panel.getName());
p.setPositions(panel.getPositions());
p.setProgressCategoryId(zhi.getId());
p.setProgressCategoryName(zhi.getName());
p.setRemark(panel.getRemark());
p.setCreateDept(panel.getCreateDept());
p.setCreateBy(panel.getCreateBy());
p.setUpdateBy(panel.getUpdateBy());
return p;
}).toList();
newP.addAll(panelList);
}
photovoltaicPanelService.saveBatch(newP);
}
@Resource
private IOthYs7DeviceService ys7DeviceService;
@Resource
private IOthYs7DeviceImgService ys7DeviceImgService;
@Resource
private Ys7Manager ys7Manager;
@Test
@ -161,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) {
@ -181,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)) {
// 下一周
@ -276,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());
@ -285,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;
@ -552,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.PHO));
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

@ -26,7 +26,7 @@ public class WebSocketTopicListener implements ApplicationRunner, Ordered {
public void run(ApplicationArguments args) throws Exception {
// 订阅WebSocket消息
WebSocketUtils.subscribeMessage((message) -> {
log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage());
// log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage());
// 如果key不为空就按照key发消息 如果为空就群发
if (CollUtil.isNotEmpty(message.getSessionKeys())) {
message.getSessionKeys().forEach(key -> {

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,21 +15,54 @@
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>-->
<!-- <artifactId>metadata-extractor</artifactId>-->
<!-- <version>2.18.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.drewnoakes</groupId>-->
<!-- <artifactId>metadata-extractor</artifactId>-->
<!-- <version>2.18.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>technology.tabula</groupId>-->
<!-- <artifactId>tabula</artifactId>-->
<!-- <version>1.0.4</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>technology.tabula</groupId>-->
<!-- <artifactId>tabula</artifactId>-->
<!-- <version>1.0.4</version>-->
<!-- </dependency>-->
<!-- JSON解析FastJSON -->
@ -101,19 +134,18 @@
</dependency>
<!-- 支持中文字体 -->
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itext-asian</artifactId>-->
<!-- <version>5.2.0</version>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; iText &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itextpdf</artifactId>-->
<!-- <version>5.5.13.3</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itext-asian</artifactId>-->
<!-- <version>5.2.0</version>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; iText &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itextpdf</artifactId>-->
<!-- <version>5.5.13.3</version>-->
<!-- </dependency>-->
<!-- ZXing -->
<dependency>
<groupId>com.google.zxing</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

@ -41,41 +41,88 @@ public class SysPackageController {
/**
* 上传最新安装包及版本
*/
@Transactional
@GetMapping("/uploadNewVersion")
public R<SysPackage> uploadNewVersion(String version, String type, MultipartFile file) {
String originalFileName = "apk/package/app-release.apk";
//覆盖失败,先删除文件
LambdaQueryWrapper<SysPackage> lambdaQueryWrapper =new LambdaQueryWrapper<>();
// 先查询最新记录
LambdaQueryWrapper<SysPackage> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.orderByDesc(SysPackage::getCreateTime);
List<SysPackage> list = sysPackageService.list(lambdaQueryWrapper);
if (list != null && !list.isEmpty()){
SysPackage first = list.getFirst();
Boolean b = sysOssService.deleteWithValidByIds(List.of(first.getFileId()), false);
if (!b){
log.error("通过IDS删除文件失败");
}
}
// 分离事务:先处理文件上传
SysOssVo upload = sysOssService.upload(file, originalFileName);
if (upload == null){
if (upload == null) {
return R.fail("上传失败");
}
SysPackage sysPackage = new SysPackage();
sysPackage.setVersion( version);
sysPackage.setFileId(upload.getOssId());
sysPackage.setFileUrl(upload.getUrl());
sysPackage.setType(type);
boolean save = sysPackageService.save(sysPackage);
if (!save){
return R.fail("保存失败");
}
return R.ok(sysPackage);
// 分离事务:再处理数据库操作
return handleDatabaseOperations(version, type, upload, list);
}
@Transactional
public R<SysPackage> handleDatabaseOperations(String version, String type, SysOssVo upload, List<SysPackage> existingPackages) {
try {
// 先删除旧文件记录
if (existingPackages != null && !existingPackages.isEmpty()) {
SysPackage first = existingPackages.getFirst();
Boolean b = sysOssService.deleteWithValidByIds(List.of(first.getFileId()), false);
if (!b) {
log.error("通过IDS删除文件失败");
}
}
// 保存新记录
SysPackage sysPackage = new SysPackage();
sysPackage.setVersion(version);
sysPackage.setFileId(upload.getOssId());
sysPackage.setFileUrl(upload.getUrl());
sysPackage.setType(type);
boolean save = sysPackageService.save(sysPackage);
if (!save) {
return R.fail("保存失败");
}
return R.ok(sysPackage);
} catch (Exception e) {
log.error("数据库操作失败", e);
throw e; // 重新抛出异常触发事务回滚
}
}
// public R<SysPackage> uploadNewVersion(String version, String type, MultipartFile file) {
// String originalFileName = "apk/package/app-release.apk";
//
// //覆盖失败,先删除文件
// LambdaQueryWrapper<SysPackage> lambdaQueryWrapper =new LambdaQueryWrapper<>();
// lambdaQueryWrapper.orderByDesc(SysPackage::getCreateTime);
// List<SysPackage> list = sysPackageService.list(lambdaQueryWrapper);
// if (list != null && !list.isEmpty()){
// SysPackage first = list.getFirst();
// Boolean b = sysOssService.deleteWithValidByIds(List.of(first.getFileId()), false);
// if (!b){
// log.error("通过IDS删除文件失败");
// }
// }
//
// SysOssVo upload = sysOssService.upload(file, originalFileName);
// if (upload == null){
// return R.fail("上传失败");
// }
// SysPackage sysPackage = new SysPackage();
// sysPackage.setVersion( version);
// sysPackage.setFileId(upload.getOssId());
// sysPackage.setFileUrl(upload.getUrl());
// sysPackage.setType(type);
//
// boolean save = sysPackageService.save(sysPackage);
// if (!save){
// return R.fail("保存失败");
// }
//
// return R.ok(sysPackage);
// }
/**
* 删除 现在指向的是同一个文件

View File

@ -0,0 +1,56 @@
package org.dromara.bigscreen.config;
import jakarta.annotation.Resource;
import org.dromara.bigscreen.listener.RedisMessageListener;
import org.dromara.drone.service.IDroProjectDroneService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import java.util.List;
@Configuration
public class RedisConfig {
@Resource
@Lazy
private IDroProjectDroneService droProjectDroneService;
/**
* 配置Redis消息监听容器
*/
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// List<String> wrjKeys = droProjectDroneService.getTopicsByKeyPrefix();
// for (String key : wrjKeys) {
// // 订阅 wrj:8UUXN4P00A06NK 频道
// container.addMessageListener(listenerAdapter, new PatternTopic("wrj:osd4"+key));
// }
return container;
}
/**
* 配置消息监听适配器,将消息转发给自定义的监听器
*/
@Bean
public MessageListenerAdapter listenerAdapter(RedisMessageListener listener) {
return new MessageListenerAdapter(listener);
}
/**
* 配置StringRedisTemplate
*/
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}

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,15 +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;
@ -17,19 +17,25 @@ 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.gps.domain.vo.GpsEquipmentSonVo;
import org.dromara.gps.service.IGpsEquipmentService;
import org.dromara.land.domain.BusLandBlock;
import org.dromara.land.domain.BusLandTransferLedger;
import org.dromara.land.domain.BusLandTransferLedgerSon;
import org.dromara.land.service.IBusLandBlockService;
import org.dromara.land.service.IBusLandTransferLedgerService;
import org.dromara.land.service.impl.BusLandTransferLedgerSonServiceImpl;
import org.dromara.manager.weathermanager.vo.WeatherVo;
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;
@ -45,7 +51,6 @@ import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -69,7 +74,6 @@ public class ProjectBigScreenController extends BaseController {
private final IBusLandBlockService busLandBlockService;
private final IGpsEquipmentService gpsEquipmentService;
private final IOthYs7DeviceService othYs7DeviceService;
@ -83,15 +87,42 @@ public class ProjectBigScreenController extends BaseController {
private final Ys7Manager ys7Manager;
private final BusLandTransferLedgerSonServiceImpl busLandTransferLedgerSonService;
private final IFacRedLineService facRedLineService;
/**
* 查询项目土地统计
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/{projectId}")
public R<List<ProjectLandVo>> landCount(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
List<BusLandTransferLedger> levelList = busLandTransferLedgerService.list(Wrappers.lambdaQuery(BusLandTransferLedger.class)
.eq(BusLandTransferLedger::getProjectId, projectId));
if (CollectionUtil.isNotEmpty(levelList)) {
List<Long> list1 = levelList.stream().map(BusLandTransferLedger::getId).toList();
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.groupingBy(
BusLandTransferLedgerSon::getParentId,
Collectors.reducing(
BigDecimal.ZERO,
BusLandTransferLedgerSon::getAreaValue,
BigDecimal::add
)
));
for (BusLandTransferLedger busLandTransferLedger : levelList) {
BigDecimal areaValue = collect.get(busLandTransferLedger.getId());
if (areaValue != null) {
busLandTransferLedger.setTransferAea(areaValue);
}
}
}
// 根据 landBlockId 分组,并对 designArea 和 transferAea 进行求和
Map<Long, Map<String, BigDecimal>> groupedResult = levelList.stream()
.collect(Collectors.groupingBy(
@ -135,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) {
@ -145,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) {
@ -155,204 +186,67 @@ 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(projectNewsService.getLimtVoByProjectId(projectId));
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<ProjectImageProgressVo> getProjectImageProgress(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
public R<List<ProjectImageProgressVo>> getProjectImageProgress(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
return R.ok(projectBigScreenService.getProjectImageProgress(projectId));
}
/**
* 查询项目概括
*/
@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) {
List<GpsEquipmentSonVo> voList = gpsEquipmentService.getClientList(projectId);
List<OthYs7Device> othYs7DeviceList = othYs7DeviceService.lambdaQuery()
.eq(OthYs7Device::getProjectId, projectId)
.list();
List<Map<String, Object>> maps = new ArrayList<>();
Map<String, Object> gpsMap = new HashMap<>();
Map<String, Object> wrjMap = new HashMap<>();
Map<String, Object> sxtMap = new HashMap<>();
List<Map<String, Object>> gpsChildrenMap = new ArrayList<>();
List<Map<String, Object>> wrjChildrenMap = new ArrayList<>();
List<Map<String, Object>> sxtChildrenMap = new ArrayList<>();
if (voList != null && !voList.isEmpty()) {
for (GpsEquipmentSonVo item : voList) {
Map<String, Object> gps = new HashMap<>();
gps.put("id", item.getClientId());
gps.put("label", item.getClientId());
gps.put("name", item.getDeviceName());
gps.put("type", "positioningDevice");
gps.put("lat", item.getLocLatitude());
gps.put("lng", item.getLocLongitude());
gps.put("alt", item.getLocAltitude());
gpsChildrenMap.add(gps);
}
}
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);
}
}
// List<Map<String, Object>> maps1 = setSxt();
List<Map<String, Object>> maps2 = setWrj();
gpsMap.put("id", 1);
gpsMap.put("label", "定位设备");
gpsMap.put("children", gpsChildrenMap);
sxtMap.put("id", 2);
sxtMap.put("label", "摄像头");
sxtMap.put("children", sxtChildrenMap);
// sxtMap.put("children", maps1);
wrjMap.put("id", 3);
wrjMap.put("label", "无人机");
// wrjMap.put("children",wrjChildrenMap);
wrjMap.put("children", maps2);
maps.add(gpsMap);
maps.add(wrjMap);
maps.add(sxtMap);
return R.ok(maps);
return R.ok(projectBigScreenService.getClientList(projectId));
}
/**
* 修改萤石摄像头
*/
// @SaCheckPermission("project:big:screen")
@RepeatSubmit()
@PutMapping("/device")
public R<Void> edit(@Validated @RequestBody Ys7DeviceUpdateReq req) {
@ -376,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));
}
@ -388,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));
@ -396,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));
@ -404,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));
@ -413,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")
@ -424,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());
@ -443,140 +368,37 @@ 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());
}
// public List<Map<String, Object>> setSxt() {
// List<Map<String, Object>> sxtChildrenMap = new ArrayList<>();
// HashMap<String, Object> map1 = new HashMap<>();
// map1.put("id", "55");
// map1.put("label", "那荷4号方阵-1");
// map1.put("name", "22");
// map1.put("type", "camera");
// map1.put("lng", 107.111325);
// map1.put("lat", 23.820919);
// map1.put("alt", 0);
// HashMap<String, Object> map2 = new HashMap<>();
// map2.put("id", "56");
// map2.put("label", "甫必 1号方阵");
// map2.put("name", "23");
// map2.put("type", "camera");
// map2.put("lng", 107.091297);
// map2.put("lat", 23.813567);
// map2.put("alt", 0);
// HashMap<String, Object> map3 = new HashMap<>();
// map3.put("id", "57");
// map3.put("label", "1222224");
// map3.put("name", "24");
// map3.put("type", "camera");
// map3.put("lng", 107.085442);
// map3.put("lat", 23.811958);
// map3.put("alt", 0);
// HashMap<String, Object> map4 = new HashMap<>();
// map4.put("id", "58");
// map4.put("label", "甫必2号方阵-1");
// map4.put("name", "25");
// map4.put("type", "camera");
// map4.put("lng", 107.085181);
// map4.put("lat", 23.810556);
// map4.put("alt", 0);
// HashMap<String, Object> map5 = new HashMap<>();
// map5.put("id", "58");
// map5.put("label", "甫必 4号方阵");
// map5.put("name", "25");
// map5.put("type", "camera");
// map5.put("lng", 107.081747);
// map5.put("lat", 23.808131);
// map5.put("alt", 0);
// HashMap<String, Object> map6 = new HashMap<>();
// map6.put("id", "58");
// map6.put("label", "甫必 7号方阵-1");
// map6.put("name", "25");
// map6.put("type", "camera");
// map6.put("lng", 107.077922);
// map6.put("lat", 23.798344);
// map6.put("alt", 0);
// HashMap<String, Object> map7 = new HashMap<>();
// map7.put("id", "58");
// map7.put("label", "68甫必6");
// map7.put("name", "25");
// map7.put("type", "camera");
// map7.put("lng", 107.077333);
// map7.put("lat", 23.797969);
// map7.put("alt", 0);
// HashMap<String, Object> map8 = new HashMap<>();
// map8.put("id", "58");
// map8.put("label", "甫必5号方阵");
// map8.put("name", "25");
// map8.put("type", "camera");
// map8.put("lng", 107.075853);
// map8.put("lat", 23.796711);
// map8.put("alt", 0);
// HashMap<String, Object> map9 = new HashMap<>();
// map9.put("id", "58");
// map9.put("label", "西牛2号方阵");
// map9.put("name", "25");
// map9.put("type", "camera");
// map9.put("lng", 107.078942);
// map9.put("lat", 23.789306);
// map9.put("alt", 0);
// HashMap<String, Object> map10 = new HashMap<>();
// map10.put("id", "58");
// map10.put("label", "福绿1号方阵");
// map10.put("name", "25");
// map10.put("type", "camera");
// map10.put("lng", 107.090061);
// map10.put("lat", 23.790411);
// map10.put("alt", 0);
// HashMap<String, Object> map11 = new HashMap<>();
// map11.put("id", "58");
// map11.put("label", "福绿6号方阵-2");
// map11.put("name", "25");
// map11.put("type", "camera");
// map11.put("lng", 107.112883);
// map11.put("lat", 23.771378);
// map11.put("alt", 0);
//
// sxtChildrenMap.add(map1);
// sxtChildrenMap.add(map2);
// sxtChildrenMap.add(map3);
// sxtChildrenMap.add(map4);
// sxtChildrenMap.add(map5);
// sxtChildrenMap.add(map6);
// sxtChildrenMap.add(map7);
// sxtChildrenMap.add(map8);
// sxtChildrenMap.add(map9);
// sxtChildrenMap.add(map10);
// sxtChildrenMap.add(map11);
//
// return sxtChildrenMap;
// }
public List<Map<String, Object>> setWrj() {
List<Map<String, Object>> sxtChildrenMap = new ArrayList<>();
HashMap<String, Object> map1 = new HashMap<>();
map1.put("id", "65");
map1.put("label", "田东无人机");
map1.put("name", "32");
map1.put("type", "drone");
map1.put("lng", 107.12744694624267);
map1.put("lat", 23.615965741917278);
map1.put("alt", 0);
// HashMap<String, Object> map2 = new HashMap<>();
// map2.put("id", "66");
// map2.put("label", "长顺无人机");
// map2.put("name", "33");
// map2.put("type", "drone");
// map2.put("lng", 106.49142431645038);
// map2.put("lat", 29.534472802500083);
// map2.put("alt", 0);
sxtChildrenMap.add(map1);
// sxtChildrenMap.add(map2);
return sxtChildrenMap;
/**
* 更新无人机缓存
*/
// @SaCheckPermission("project:big:screen")
@GetMapping("/setWrjHc")
public void setWrjHc() {
projectBigScreenService.setWrjHc();
}
/**
* 更新无人机缓存
*/
// @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

@ -0,0 +1,11 @@
package org.dromara.bigscreen.domain.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class TanchuangInfoReq implements Serializable {
private Long id;
}

View File

@ -0,0 +1,26 @@
package org.dromara.bigscreen.domain.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-09-09 15:16
*/
@Data
public class WurenjiQueryReq {
/**
* 经度
*/
private String longitude;
/**
* 纬度
*/
private String latitude;
}

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

@ -16,39 +16,49 @@ public class ProjectImageProgressVo implements Serializable {
@Serial
private static final long serialVersionUID = 7963637133004484891L;
/**
* 类别名称
*/
private String progressName;
/**
* 进度百分比
*/
private BigDecimal progressTotal;
/**
* 场区百分比
*/
private BigDecimal areaPercentage;
// private BigDecimal areaPercentage;
/**
* 道路百分比
*/
private BigDecimal roadPercentage;
// private BigDecimal roadPercentage;
/**
* 集电线路百分比
*/
private BigDecimal collectorLinePercentage;
// private BigDecimal collectorLinePercentage;
/**
* 送出线路百分比
*/
private BigDecimal exportLinePercentage;
// private BigDecimal exportLinePercentage;
/**
* 升压站百分比
*/
private BigDecimal substationPercentage;
// private BigDecimal substationPercentage;
/**
* 箱变百分比
*/
private BigDecimal boxTransformerPercentage;
// private BigDecimal boxTransformerPercentage;
/**
* 总百分比
*/
private BigDecimal totalPercentage;
// private BigDecimal totalPercentage;
}

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

@ -0,0 +1,92 @@
package org.dromara.bigscreen.listener;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import org.dromara.common.websocket.dto.WebSocketMessageDto;
import org.dromara.common.websocket.utils.WebSocketUtils;
import org.dromara.drone.domain.DroProjectDrone;
import org.dromara.drone.service.IDroProjectDroneService;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.Objects;
/**
* Redis消息监听器用于处理订阅频道收到的消息
*/
@Component
public class RedisMessageListener implements MessageListener {
@Lazy
private final StringRedisTemplate stringRedisTemplate;
@Resource
@Lazy
private IDroProjectDroneService droProjectDroneService;
// 构造函数注入StringRedisTemplate
public RedisMessageListener(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
/**
* 处理接收到的消息
* @param message 消息对象
* @param pattern 订阅的模式
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 处理消息
// System.out.println("返回:"+stringRedisTemplate.getStringSerializer().deserialize(message.getBody()));
String gateway = JSONUtil.parseObj(stringRedisTemplate.getStringSerializer().deserialize(message.getBody())).getStr("gateway");
String key = "";
if (JSONUtil.parseObj(stringRedisTemplate.getStringSerializer().deserialize(message.getBody())).getJSONObject("data").get("job_number") != null) {
key = "wrj:osd1:"+gateway;
}else if (JSONUtil.parseObj(stringRedisTemplate.getStringSerializer().deserialize(message.getBody())).getJSONObject("data").get("wireless_link") != null) {
key = "wrj:osd2:"+gateway;
}else if (JSONUtil.parseObj(stringRedisTemplate.getStringSerializer().deserialize(message.getBody())).getJSONObject("data").get("network_state") != null) {
key = "wrj:osd3:"+gateway;
DroProjectDrone droProjectDrone = droProjectDroneService.getBaseMapper().selectOne(new LambdaQueryWrapper<DroProjectDrone>().eq(DroProjectDrone::getDroneSn, gateway));
setWs(message, gateway, droProjectDrone);
}else{
key = "wrj:osd4:"+gateway;
DroProjectDrone droProjectDrone = droProjectDroneService.getBaseMapper().selectOne(new LambdaQueryWrapper<DroProjectDrone>().eq(DroProjectDrone::getDroneSn, gateway));
setWs(message, gateway, droProjectDrone);
}
stringRedisTemplate
.opsForValue()
.set(key
, Objects.requireNonNull(stringRedisTemplate.getStringSerializer().deserialize(message.getBody())));
}
private void setWs(Message message, String gateway, DroProjectDrone droProjectDrone) {
String pushContent = buildPushMessage(gateway,stringRedisTemplate.getStringSerializer().deserialize(message.getBody()), droProjectDrone.getProjectId());
// 发送给指定用户equipment.getUserId()
WebSocketMessageDto messageDto = new WebSocketMessageDto();
messageDto.setMessage(pushContent);
messageDto.setSessionKeys(Collections.singletonList(droProjectDrone.getProjectId()));
WebSocketUtils.publishMessage(messageDto);
}
private String buildPushMessage(String key, String message, Long projectId) {
JSONObject messageObj = new JSONObject();
messageObj.put("type", "wrj_DATA_UPDATE");
messageObj.put("projectId",projectId.toString());
messageObj.put("clientId",key);
// 位置信息
JSONObject locationObj = new JSONObject();
locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude").toString()); // 纬度
locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude").toString()); // 经度
messageObj.put("location", locationObj);
return messageObj.toString();
}
}

View File

@ -0,0 +1,193 @@
package org.dromara.bigscreen.manager;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.drone.service.IDroProjectDroneService;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* Redis 订阅管理器(定时任务动态更新订阅关系)
*/
@Component
@Slf4j
public class RedisSubscribeManager {
// 1. 注入 Redis 核心组件
@Resource
private RedisMessageListenerContainer redisMessageListenerContainer;
@Resource
private MessageListenerAdapter redisMessageListenerAdapter;
// 2. 注入业务 Service延迟加载避免循环依赖
@Resource
@Lazy
private IDroProjectDroneService droProjectDroneService;
// 3. 维护已订阅的主题关系key=完整主题如wrj:8UUXN4P00A06NKvalue=对应的PatternTopic
private final Map<String, PatternTopic> subscribedTopics = new ConcurrentHashMap<>();
/**
* 项目启动后立即执行一次订阅(避免等待定时任务首次执行)
*/
@PostConstruct
public void initSubscribe() {
log.info("项目启动初始化Redis订阅...");
// 步骤1从数据库获取最新的主题列表原逻辑getTopicsByKeyPrefix
List<String> latestKeys = droProjectDroneService.getTopicsByKeyPrefix();
if (latestKeys == null || latestKeys.isEmpty()) {
log.warn("未获取到任何主题,将取消所有现有订阅");
cancelAllSubscribes();
return;
}
// 步骤2构建最新的完整主题格式wrj:key
Set<String> latestFullTopics = new HashSet<>();
for (String key : latestKeys) {
latestFullTopics.add("wrj:osd1:" + key);
latestFullTopics.add("wrj:osd2:" + key);
latestFullTopics.add("wrj:osd3:" + key);
latestFullTopics.add("wrj:osd4:" + key);
}
// 步骤3对比现有订阅删除过期主题
cancelExpiredSubscribes(latestFullTopics);
// 步骤4对比现有订阅新增未订阅的主题
addNewSubscribes(latestFullTopics);
}
/**
* 4. 定时任务定期更新订阅每5分钟执行一次可调整cron表达式
* cron格式秒 分 时 日 月 周 年示例0 0/5 * * * ? 表示每5分钟
*/
@Scheduled(cron = "0 0/6 * * * ?")
public void dynamicUpdateSubscribe() {
try {
Object object = RedisUtils.getCacheObject("xmjdap:ws");
log.info("开始执行Redis订阅更新定时任务...");
if (object == null) {
cancelAllSubscribes();
return;
}
long oldTime = Long.parseLong(String.valueOf(object));
long now = System.currentTimeMillis();
if (now-oldTime > 300000) {
RedisUtils.deleteObject("xmjdap:ws");
cancelAllSubscribes();
return;
}
// 步骤1从数据库获取最新的主题列表原逻辑getTopicsByKeyPrefix
List<String> latestKeys = droProjectDroneService.getTopicsByKeyPrefix();
if (latestKeys == null || latestKeys.isEmpty()) {
log.warn("定时任务未获取到任何主题,将取消所有现有订阅");
cancelAllSubscribes();
return;
}
// 步骤2构建最新的完整主题格式wrj:key
Set<String> latestFullTopics = new HashSet<>();
for (String key : latestKeys) {
latestFullTopics.add("wrj:osd1:" + key);
latestFullTopics.add("wrj:osd2:" + key);
latestFullTopics.add("wrj:osd3:" + key);
latestFullTopics.add("wrj:osd4:" + key);
}
// 步骤3对比现有订阅删除过期主题
cancelExpiredSubscribes(latestFullTopics);
// 步骤4对比现有订阅新增未订阅的主题
addNewSubscribes(latestFullTopics);
log.info("Redis订阅更新完成当前已订阅主题数{}", subscribedTopics.size());
} catch (Exception e) {
log.error("Redis订阅更新定时任务执行失败", e);
// 异常时不修改现有订阅,避免误删
}
}
/**
* 取消过期的订阅(现有订阅不在最新列表中的主题)
*/
private void cancelExpiredSubscribes(Set<String> latestFullTopics) {
// 遍历现有订阅,找出需要删除的主题
Set<String> expiredTopics = subscribedTopics.keySet().stream()
.filter(topic -> !latestFullTopics.contains(topic))
.collect(Collectors.toSet());
if (expiredTopics.isEmpty()) {
log.info("无过期订阅主题,无需删除");
return;
}
// 取消每个过期主题的订阅
for (String expiredTopic : expiredTopics) {
PatternTopic topic = subscribedTopics.get(expiredTopic);
if (topic != null) {
// 从容器中移除监听器(取消订阅)
redisMessageListenerContainer.removeMessageListener(redisMessageListenerAdapter, topic);
subscribedTopics.remove(expiredTopic);
log.info("已取消过期订阅:{}", expiredTopic);
}
}
}
/**
* 新增未订阅的主题(最新列表中有但现有订阅没有的主题)
*/
private void addNewSubscribes(Set<String> latestFullTopics) {
// 遍历最新主题,找出需要新增的主题
Set<String> newTopics = latestFullTopics.stream()
.filter(topic -> !subscribedTopics.containsKey(topic))
.collect(Collectors.toSet());
if (newTopics.isEmpty()) {
log.info("无新增订阅主题,无需添加");
return;
}
// 为每个新主题添加订阅
for (String newTopic : newTopics) {
PatternTopic topic = new PatternTopic(newTopic);
// 向容器中添加监听器(新增订阅)
redisMessageListenerContainer.addMessageListener(redisMessageListenerAdapter, topic);
subscribedTopics.put(newTopic, topic);
log.info("已新增订阅:{}", newTopic);
}
}
/**
* 取消所有现有订阅(兜底方法)
*/
public void cancelAllSubscribes() {
if (subscribedTopics.isEmpty()) {
return;
}
// 遍历所有已订阅主题,取消订阅
for (Map.Entry<String, PatternTopic> entry : subscribedTopics.entrySet()) {
redisMessageListenerContainer.removeMessageListener(redisMessageListenerAdapter, entry.getValue());
log.info("已取消订阅:{}", entry.getKey());
}
subscribedTopics.clear();
}
}

View File

@ -1,14 +1,16 @@
package org.dromara.bigscreen.service;
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
import org.dromara.manager.weathermanager.vo.WeatherVo;
import org.dromara.gps.domain.bo.GpsEquipmentBo;
import org.dromara.manager.weathermanager.vo.WeatherVo;
import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo;
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
import java.util.List;
import java.util.Map;
/**
* @author lilemy
@ -62,7 +64,7 @@ public interface ProjectBigScreenService {
* @param projectId 项目id
* @return 项目形象进度
*/
ProjectImageProgressVo getProjectImageProgress(Long projectId);
List<ProjectImageProgressVo> getProjectImageProgress(Long projectId);
/**
* 获取项目概括
@ -75,4 +77,13 @@ public interface ProjectBigScreenService {
List<String> getList(Long projectId);
void setList(GpsEquipmentBo bo);
List<Map<String, Object>> getClientList(Long projectId);
/**
* 更新无人机缓存
*/
void setWrjHc();
Map<String, Map<String, Object>> getInfoData(TanchuangInfoReq req);
}

View File

@ -2,8 +2,10 @@ package org.dromara.bigscreen.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import jakarta.annotation.Resource;
import org.dromara.bigscreen.domain.dto.TanchuangInfoReq;
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
@ -15,10 +17,18 @@ import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.utils.BigDecimalUtil;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.contractor.service.ISubConstructionUserService;
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;
import org.dromara.other.domain.OthYs7Device;
import org.dromara.other.service.IOthYs7DeviceService;
import org.dromara.progress.constant.PgsProgressCategoryConstant;
import org.dromara.progress.domain.PgsProgressCategory;
import org.dromara.progress.domain.enums.PgsProgressUnitTypeEnum;
import org.dromara.progress.service.IPgsProgressCategoryService;
import org.dromara.project.domain.BusProject;
import org.dromara.project.domain.BusProjectTeam;
@ -29,11 +39,14 @@ import org.dromara.project.service.*;
import org.dromara.safety.domain.HseRecognizeRecord;
import org.dromara.safety.service.IHseRecognizeRecordService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
@ -68,6 +81,20 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
@Resource
private IPgsProgressCategoryService progressCategoryService;
@Resource
private IDroProjectDroneService droProjectDroneService;
@Resource
private IGpsEquipmentService gpsEquipmentService;
@Resource
private IOthYs7DeviceService othYs7DeviceService;
@Resource
@Lazy
private StringRedisTemplate stringRedisTemplate;
@Resource
private IDeviceService deviceService;
/**
* 获取项目天气
*
@ -141,8 +168,12 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
// 获取大屏数据
ProjectPeopleVo vo = new ProjectPeopleVo();
// 获取施工人员总数
Long count = constructionUserService.lambdaQuery()
.eq(SubConstructionUser::getProjectId, projectId).count();
List<SubConstructionUser> list = constructionUserService.lambdaQuery()
.eq(SubConstructionUser::getProjectId, projectId)
.eq(SubConstructionUser::getUserRole, "0")
.isNotNull(SubConstructionUser::getTeamId).list();
List<Long> sysUserIdList = list.stream().map(SubConstructionUser::getSysUserId).toList();
int count = list.size();
BigDecimal countDec = BigDecimal.valueOf(count);
vo.setPeopleCount(countDec);
// 获取考勤数据
@ -156,13 +187,17 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
List<BusProjectTeamMember> memberList = projectTeamMemberService.lambdaQuery()
.select(BusProjectTeamMember::getId, BusProjectTeamMember::getTeamId)
.eq(BusProjectTeamMember::getProjectId, projectId)
.in(BusProjectTeamMember::getMemberId, sysUserIdList)
.list();
Map<Long, List<BusProjectTeamMember>> memberMap = memberList.stream()
.collect(Collectors.groupingBy(BusProjectTeamMember::getTeamId));
// 统计班组考勤数据
Map<Long, List<SubConstructionUser>> userTeamMap = new HashMap<>();
if (CollUtil.isNotEmpty(attendancePeopleList)) {
List<SubConstructionUser> users = constructionUserService.listByIds(attendancePeopleList);
List<SubConstructionUser> users = constructionUserService.lambdaQuery()
.in(SubConstructionUser::getSysUserId, attendancePeopleList)
.isNotNull(SubConstructionUser::getTeamId)
.list();
userTeamMap = users.stream()
.collect(Collectors.groupingBy(SubConstructionUser::getTeamId));
}
@ -173,7 +208,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
String punchTime = "";
if (punchRange != null) {
String start = punchRange.split(",")[0];
punchTime = LocalDate.now() + " " + start;
punchTime = LocalDate.now() + " ";
}
List<ProjectTeamAttendanceVo> listVo = new ArrayList<>();
for (BusProjectTeam projectTeam : teamList) {
@ -207,9 +242,59 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
* @return 项目形象进度
*/
@Override
public ProjectImageProgressVo getProjectImageProgress(Long projectId) {
public List<ProjectImageProgressVo> getProjectImageProgress(Long projectId) {
checkProject(projectId);
ProjectImageProgressVo vo = new ProjectImageProgressVo();
// 获取当前项目的所有子项目
List<Long> projectIds = new ArrayList<>(projectService.lambdaQuery()
.select(BusProject::getId)
.eq(BusProject::getPId, projectId)
.list()
.stream()
.map(BusProject::getId)
.toList());
projectIds.add(projectId);
// 查询该子项目下的顶级进度类别父ID为0
List<PgsProgressCategory> list = progressCategoryService.lambdaQuery()
.in(PgsProgressCategory::getProjectId, projectIds)
.eq(PgsProgressCategory::getParentId, PgsProgressCategoryConstant.TOP_PARENT_ID)
.list();
// 如果没有查询到顶级进度类别,直接返回空集合
if (CollUtil.isEmpty(list)) {
return List.of();
}
List<ProjectImageProgressVo> topList = new ArrayList<>();
// 获取这些顶级类别的所有子节点
List<Long> ids = list.stream().map(PgsProgressCategory::getId).distinct().toList();
List<PgsProgressCategory> childrenNodes = progressCategoryService.getChildrenNodeByTopIds(ids);
if (CollUtil.isNotEmpty(list)) {
// 按名称分组(同名的放在一起)
Map<String, List<PgsProgressCategory>> subMap = list.stream()
.collect(Collectors.groupingBy(PgsProgressCategory::getName));
for (Map.Entry<String, List<PgsProgressCategory>> entry : subMap.entrySet()) {
ProjectImageProgressVo topVo = new ProjectImageProgressVo();
topVo.setProgressName(entry.getKey());
List<PgsProgressCategory> value = entry.getValue();
// 获取这些类别下的所有叶子节点
List<Long> topIds = value.stream().map(PgsProgressCategory::getId).distinct().toList();
List<PgsProgressCategory> leafNodesByTopIds = childrenNodes.stream()
.filter(node -> {
Set<Long> ancestorSet = Arrays.stream(node.getAncestors().split(","))
.map(Long::parseLong)
.collect(Collectors.toSet());
return topIds.stream().anyMatch(ancestorSet::contains);
}).toList();
// 如果有叶子节点,统计进度和状态;否则初始化为未完成
if (CollUtil.isNotEmpty(leafNodesByTopIds)) {
topVo.setProgressTotal(progressCategoryService.getCompletedPercentage(leafNodesByTopIds));
} else {
topVo.setProgressTotal(BigDecimal.ZERO);
}
// 加入结果集
topList.add(topVo);
}
}
return topList;
/* ProjectImageProgressVo vo = new ProjectImageProgressVo();
// 获取所有子项目列表
List<BusProject> subProjectList = projectService.lambdaQuery()
.eq(BusProject::getPId, projectId)
@ -218,7 +303,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
return vo;
}
// 子项目id列表
List<Long> subProjectIds = subProjectList.stream().map(BusProject::getId).toList();
List<Long> projectIds = new ArrayList<>(subProjectList.stream().map(BusProject::getId).toList());
// 计算集电线路
vo.setCollectorLinePercentage(BigDecimal.valueOf(0.00));
// 计算送出线路
@ -232,8 +317,9 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
// 计算箱变
vo.setBoxTransformerPercentage(BigDecimal.ZERO);
// 获取集电线路、送出线路、升压站数据
projectIds.add(projectId);
List<PgsProgressCategory> progressCategoryList = progressCategoryService.lambdaQuery()
.in(PgsProgressCategory::getProjectId, subProjectIds)
.in(PgsProgressCategory::getProjectId, projectIds)
.in(PgsProgressCategory::getName, "集电线路", "送出线路", "升压站", "光伏场区")
.eq(PgsProgressCategory::getParentId, 0L)
.list();
@ -301,7 +387,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
}
// 计算道路
List<PgsProgressCategory> roadCategoryList = progressCategoryService.lambdaQuery()
.in(PgsProgressCategory::getProjectId, subProjectIds)
.in(PgsProgressCategory::getProjectId, projectIds)
.like(PgsProgressCategory::getName, "道路")
.ne(PgsProgressCategory::getUnitType, PgsProgressUnitTypeEnum.NULL.getValue())
.list();
@ -313,7 +399,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
}
// 计算箱变
List<PgsProgressCategory> boxTransformerCategoryList = progressCategoryService.lambdaQuery()
.in(PgsProgressCategory::getProjectId, subProjectIds)
.in(PgsProgressCategory::getProjectId, projectIds)
.like(PgsProgressCategory::getName, "箱变")
.ne(PgsProgressCategory::getUnitType, PgsProgressUnitTypeEnum.NULL.getValue())
.list();
@ -333,7 +419,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
.add(vo.getBoxTransformerPercentage())
.divide(BigDecimal.valueOf(6), 2, RoundingMode.HALF_UP) // 保留两位小数
);
return vo;
return vo;*/
}
/**
@ -365,7 +451,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
@Override
public List<String> getList(Long projectId) {
if (projectId == null){
if (projectId == null) {
throw new ServiceException("项目id不能为空");
}
Object object = RedisUtils.getCacheObject("xmjdp:" + projectId);
@ -379,9 +465,173 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
@Override
public void setList(GpsEquipmentBo bo) {
if (bo.getProjectId() == null){
if (bo.getProjectId() == null) {
throw new ServiceException("项目id不能为空");
}
RedisUtils.setCacheObject("xmjdp:"+bo.getProjectId(), bo.getIdList());
RedisUtils.setCacheObject("xmjdp:" + bo.getProjectId(), bo.getIdList());
}
@Override
public List<Map<String, Object>> getClientList(Long projectId) {
// 获取当天的开始时间00:00:00
LocalDateTime startOfDay = LocalDateTime.now().with(LocalTime.MIN);
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
List<GpsEquipmentSonVo> voList = gpsEquipmentService.getClientList(projectId, startOfDay, now);
List<GpsEquipmentSonVo> appList = gpsEquipmentService.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)
.list();
List<String> wrjKeys = droProjectDroneService.getTopicsByProjectId(projectId);
List<Map<String, Object>> maps = new ArrayList<>();
Map<String, Object> gpsMap = new HashMap<>();
Map<String, Object> anqmMap = new HashMap<>();
Map<String, Object> appMap = new HashMap<>();
Map<String, Object> sbMap = new HashMap<>();
Map<String, Object> wrjMap = new HashMap<>();
Map<String, Object> sxtMap = new HashMap<>();
List<Map<String, Object>> gpsChildrenMap = new ArrayList<>();
List<Map<String, Object>> sbChildrenMap = new ArrayList<>();
List<Map<String, Object>> appChildrenMap = new ArrayList<>();
List<Map<String, Object>> anqmChildrenMap = new ArrayList<>();
List<Map<String, Object>> wrjChildrenMap = new ArrayList<>();
List<Map<String, Object>> sxtChildrenMap = new ArrayList<>();
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.getUserId() != null ? item.getUserName() : item.getClientId());
gps.put("type", "gps");
gps.put("lat", item.getLocLatitude());
gps.put("lng", item.getLocLongitude());
gps.put("alt", item.getLocAltitude());
sbChildrenMap.add(gps);
}
}
if (appList != null && !appList.isEmpty()) {
for (GpsEquipmentSonVo item : appList) {
Map<String, Object> app = new HashMap<>();
app.put("id", item.getUserId());
app.put("userId", item.getUserId());
app.put("label", item.getUserId());
app.put("name", item.getUserName());
app.put("type", "app");
app.put("lat", item.getLocLatitude());
app.put("lng", item.getLocLongitude());
app.put("alt", item.getLocAltitude());
appChildrenMap.add(app);
}
}
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);
Object object6 = stringRedisTemplate.opsForValue().get("wrj:osd2:" + key);
String status = "";
if (object6 != null) {
JSONObject object1 = JSONUtil.parseObj(object6);
status = object1.getJSONObject("data").get("flighttask_step_code").toString();
}
if (object != null) {
JSONObject object1 = JSONUtil.parseObj(object);
Map<String, Object> wrj = new HashMap<>();
wrj.put("id", key);
wrj.put("label", key);
wrj.put("name", key);
wrj.put("type", "wurenji");
wrj.put("status", status);
wrj.put("lat", object1.getJSONObject("data").get("latitude"));
wrj.put("lng", object1.getJSONObject("data").get("longitude"));
wrj.put("alt", object1.getJSONObject("data").get("height"));
wrjChildrenMap.add(wrj);
}else {
Object object2 = stringRedisTemplate.opsForValue().get("wrj:osd3:" + key);
if (object2 != null) {
JSONObject object3 = JSONUtil.parseObj(object2);
Map<String, Object> wrj = new HashMap<>();
wrj.put("id", key);
wrj.put("label", key);
wrj.put("name", key);
wrj.put("type", "wurenji");
wrj.put("status", status);
wrj.put("lat", object3.getJSONObject("data").get("latitude"));
wrj.put("lng", object3.getJSONObject("data").get("longitude"));
wrj.put("alt", object3.getJSONObject("data").get("height"));
wrjChildrenMap.add(wrj);
}
}
}
}
gpsChildrenMap.add(sbMap);
gpsChildrenMap.add(appMap);
gpsChildrenMap.add(anqmMap);
gpsMap.put("id", 1);
gpsMap.put("label", "人员定位");
gpsMap.put("children", gpsChildrenMap);
sbMap.put("id", 4);
sbMap.put("label", "设备定位");
sbMap.put("children", sbChildrenMap);
appMap.put("id", 5);
appMap.put("label", "app定位");
appMap.put("children", appChildrenMap);
anqmMap.put("id", 6);
anqmMap.put("label", "安全帽定位");
anqmMap.put("children", anqmChildrenMap);
sxtMap.put("id", 2);
sxtMap.put("label", "摄像头");
sxtMap.put("children", sxtChildrenMap);
wrjMap.put("id", 3);
wrjMap.put("label", "无人机");
wrjMap.put("children", wrjChildrenMap);
maps.add(gpsMap);
maps.add(wrjMap);
maps.add(sxtMap);
return maps;
}
@Override
public void setWrjHc() {
RedisUtils.setCacheObject("xmjdap:ws",System.currentTimeMillis() );
}
@Override
public Map<String, Map<String, Object>> getInfoData(TanchuangInfoReq req) {
return projectService.getInfoData(req);
}
}

View File

@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.cailiaoshebei.domain.bo.RemainingReq;
import org.dromara.cailiaoshebei.domain.dto.BusMrpDto;
import org.dromara.cailiaoshebei.domain.dto.BusMrpExportDto;
import org.dromara.cailiaoshebei.domain.vo.BusMrpVo;
@ -24,6 +25,10 @@ import org.dromara.design.domain.bo.CoryObtainTheListReq;
import org.dromara.design.domain.vo.ObtainTheListRes;
import org.dromara.design.service.IBusBillofquantitiesService;
import org.dromara.design.service.IBusBillofquantitiesVersionsService;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.service.IBusBiddingPlanService;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@ -59,6 +64,7 @@ public class BusMrpBaseController extends BaseController {
private final IBusBillofquantitiesVersionsService busBillofquantitiesVersionsService;
private final IBusBillofquantitiesService busBillofquantitiesService;
private final IBusBiddingPlanService busBiddingPlanService;
/**
* 查询物资-批次需求计划基础信息列表
@ -141,8 +147,14 @@ public class BusMrpBaseController extends BaseController {
* 获取剩余量
*/
@GetMapping("/remaining")
public R<Map<String,Object>> remaining(Long projectId, String suppliespriceName,String specification,Long mrpBaseId) {
return R.ok(busMrpBaseService.remaining(projectId,suppliespriceName,specification,mrpBaseId));
public R<List<Map<String,Object>>> remaining( RemainingReq req) {
String[] split = req.getLimitListId().split(",");
List<Map<String, Object>> maps = new ArrayList<>();
for (String id : split) {
Map<String, Object> remaining = busMrpBaseService.remaining(req.getProjectId(), Long.valueOf(id), req.getMrpBaseId());
maps.add(remaining);
}
return R.ok(maps);
}
@ -175,6 +187,35 @@ public class BusMrpBaseController extends BaseController {
return R.ok(list);
}
/**
* 获取工程量清单列表
*/
@SaCheckPermission("cailiaoshebei:mrpBase:getZhaoBiaoList")
@GetMapping("/getZhaoBiaoList")
public R<List<BusBiddingPlanVo>> getZhaoBiaoList(CoryObtainTheListReq req) {
BusBiddingPlanBo bo = new BusBiddingPlanBo();
bo.setProjectId(req.getProjectId());
bo.setType("3");
bo.setBidStatus(1);
List<BusBiddingPlanVo> busBiddingPlanVos = busBiddingPlanService.queryList(bo);
return R.ok(busBiddingPlanVos);
}
/**
* 招标计划数据详情
* @param bo
* @return
*/
@SaCheckPermission("cailiaoshebei:mrpBase:getMore")
@GetMapping("/getMore")
public R<List<BusBillofquantitiesLimitListVo>> getMore(BusBiddingPlanBo bo) {
if (bo.getId() == null) {
throw new ServiceException("id不能为空");
}
return R.ok(busBiddingPlanService.getMore(bo));
}
/**
* 获取工程量清单列表
*/

View File

@ -106,8 +106,8 @@ public class BusMrpBaseAppController extends BaseController {
* 获取剩余量
*/
@GetMapping("/remaining")
public R<Map<String,Object>> remaining(Long projectId, String suppliespriceName,String specification,Long mrpBaseId) {
return R.ok(busMrpBaseService.remaining(projectId,suppliespriceName,specification,mrpBaseId));
public R<Map<String,Object>> remaining(Long projectId,Long limitListId,Long mrpBaseId) {
return R.ok(busMrpBaseService.remaining(projectId,limitListId,mrpBaseId));
}

View File

@ -42,6 +42,10 @@ public class BusPlanDocAssociationBo extends BaseEntity {
* 采购联系单id
*/
private Long docId;
/**
*
*/
private Long suppliespriceId;
/**
* 需求数量

View File

@ -0,0 +1,16 @@
package org.dromara.cailiaoshebei.domain.bo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class RemainingReq implements Serializable {
private Long projectId;
private String limitListId;
private Long mrpBaseId;
}

View File

@ -140,4 +140,12 @@ public class BusMaterialbatchdemandplanVo implements Serializable {
*/
private BigDecimal remaining;
/**
* 供应商提供数量
*/
private BigDecimal tenderQuantity;
}

View File

@ -86,5 +86,5 @@ public interface IBusMrpBaseService extends IService<BusMrpBase>{
/**
* 获取物资已有数量
*/
Map<String, Object> remaining(Long projectId, String suppliespriceName, String specification, Long mrpBaseId);
Map<String, Object> remaining(Long projectId,Long limitListId,Long mrpBaseId);
}

View File

@ -24,10 +24,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.design.domain.BusBillofquantities;
import org.dromara.design.service.IBusBillofquantitiesService;
import org.dromara.tender.domain.BusBillofquantitiesLimitList;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.domain.vo.BusTenderPlanningLimitListVo;
import org.dromara.tender.service.IBusBiddingPlanService;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
import org.dromara.tender.service.ITenderSupplierInputService;
import org.springframework.context.annotation.Lazy;
import org.springframework.beans.factory.annotation.Autowired;
@ -41,6 +44,7 @@ import org.dromara.cailiaoshebei.mapper.BusMaterialbatchdemandplanMapper;
import org.dromara.cailiaoshebei.service.IBusMaterialbatchdemandplanService;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
/**
@ -72,6 +76,9 @@ public class BusMaterialbatchdemandplanServiceImpl extends ServiceImpl<BusMateri
@Lazy
@Autowired
private IBusBillofquantitiesService busBillofquantitiesService;
@Lazy
@Autowired
private IBusBillofquantitiesLimitListService busBillofquantitiesLimitListService;
/**
* 查询物资-批次需求计划
@ -101,22 +108,26 @@ public class BusMaterialbatchdemandplanServiceImpl extends ServiceImpl<BusMateri
bo1.setType("3");
bo1.setWinningBidderId(bo.getSupplierId());
List<BusBillofquantitiesLimitListVo> busBiddingPlanVos = busBiddingPlanService.getBillofquantitiesLimitListVo(bo1);
Map<Long, BigDecimal> map = busBiddingPlanService.getCailiaoCount(bo1);
if (busBiddingPlanVos == null || busBiddingPlanVos.isEmpty()) {
throw new ServiceException("该供应商暂无材料");
}
Set<String> hashSet = new HashSet<>();
busBiddingPlanVos.stream().forEach(vo -> {
hashSet.add(vo.getName()+"+"+vo.getSpecification());
Set<Long> hashSet = new HashSet<>();
busBiddingPlanVos.forEach(vo -> {
hashSet.add(vo.getId());
});
List<BusMaterialbatchdemandplanVo> list = result.getRecords().stream().filter(vo -> {
String key = vo.getName() + "+" + vo.getSpecification(); // 拼接字符串(需与 Set 中格式一致)
return hashSet.contains(key); // 仅保留 Set 中存在的数据
}).toList();
result.setRecords(list);
result.getRecords().stream().filter(vo -> {
return hashSet.contains(vo.getSuppliespriceId()); // 仅保留 Set 中存在的数据
}).forEach(item->{
if (map.containsKey(item.getId())) {
item.setTenderQuantity(map.get(item.getId()));
}
});
}
result.getRecords().stream().forEach(vo -> {
result.getRecords().forEach(vo -> {
if (vo.getSuppliespricePid() != null){
BusBillofquantities billofquantities = busBillofquantitiesService.getById(vo.getSuppliespricePid());
BusBillofquantitiesLimitList billofquantities = busBillofquantitiesLimitListService.getById(vo.getSuppliespricePid());
vo.setSuppliespricePname(billofquantities.getName());
}
});

View File

@ -29,6 +29,10 @@ import lombok.RequiredArgsConstructor;
import org.dromara.common.utils.excel.ExcelDynamicReader;
import org.dromara.design.domain.BusBillofquantities;
import org.dromara.design.service.IBusBillofquantitiesService;
import org.dromara.tender.domain.BusBillofquantitiesLimitList;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
import org.dromara.tender.service.IBusTenderPlanningLimitListService;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.dromara.cailiaoshebei.domain.bo.BusMrpBaseBo;
@ -57,7 +61,10 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
private final IBusMaterialbatchdemandplanService planservice;
private final IBusBillofquantitiesService busBillofquantitiesService;
private final IBusBillofquantitiesLimitListService busBillofquantitiesService;
private final IBusTenderPlanningLimitListService tenderPlanningLimitListService;
/**
@ -75,7 +82,7 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
planBo.setMrpBaseId(id);
List<BusMaterialbatchdemandplanVo> voList = planservice.queryList(planBo);
for (BusMaterialbatchdemandplanVo vo : voList) {
Map<String, Object> map = remaining(vo.getProjectId(),vo.getName(), vo.getSpecification(), id);
Map<String, Object> map = remaining(vo.getProjectId(), vo.getSuppliespriceId(), id);
vo.setRemaining(Convert.toBigDecimal(map.get("remainingQuantity")));
}
busMrpVo.setMrpBaseBo(busMrpBaseVo);
@ -190,14 +197,13 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
if (CollectionUtil.isNotEmpty(dto.getPlanList())) {
// 按 suppliespriceId 分组统计本次提交的数量
Map<String, BigDecimal> batchSumMap = dto.getPlanList().stream()
// String name = item.getName() != null ? item.getName() : "";
// String spec = item.getSpecification() != null ? item.getSpecification() : "";
// return name + "&&&" + spec;
Map<Long, BigDecimal> batchSumMap = dto.getPlanList().stream()
.collect(Collectors.groupingBy(
// 关键修改:使用 name + specification 拼接作为分组键
item -> {
String name = item.getName() != null ? item.getName() : "";
String spec = item.getSpecification() != null ? item.getSpecification() : "";
return name + "&&&" + spec;
},
BusMaterialbatchdemandplanBo::getSuppliespriceId,
Collectors.reducing(
BigDecimal.ZERO,
item -> {
@ -209,45 +215,36 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
));
// 检查每种物料是否超出数量限制
for (Map.Entry<String, BigDecimal> entry : batchSumMap.entrySet()) {
String biaoshi = entry.getKey();
for (Map.Entry<Long, BigDecimal> entry : batchSumMap.entrySet()) {
Long biaoshi = entry.getKey();
BigDecimal batchSum = entry.getValue();
String[] split = biaoshi.split("&&&");
// 获取数据库中已有的数量
List<BusMaterialbatchdemandplan> existingList = planservice.list(
Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class)
.eq(BusMaterialbatchdemandplan::getName, split[0])
.eq(BusMaterialbatchdemandplan::getSpecification,split[1])
.eq(BusMaterialbatchdemandplan::getSuppliespriceId, biaoshi)
.ne(BusMaterialbatchdemandplan::getMrpBaseId, convert.getId()) // 排除当前批次
);
//计算数据库保存数量
BigDecimal existingSum = existingList.stream()
.map(BusMaterialbatchdemandplan::getDemandQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 检查总数量是否超出限制
List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper().selectList(new LambdaQueryWrapper<BusBillofquantities>()
.eq(BusBillofquantities::getProjectId, dto.getMrpBaseBo().getProjectId())
.eq(BusBillofquantities::getName, split[0])
.eq(BusBillofquantities::getSpecification, split[1]));
BigDecimal quantity = busBillofquantities.stream()
.map(BusBillofquantities::getQuantity)
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = tenderPlanningLimitListService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getLimitListId, biaoshi));
BigDecimal quantity = busTenderPlanningLimitLists.stream()
.map(BusTenderPlanningLimitList::getNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (existingSum.add(batchSum).compareTo(quantity) > 0) {
// 找到超出限制的物料名称用于提示
String itemName = dto.getPlanList().stream()
.filter(item -> {
String name = item.getName() != null ? item.getName() : "";
String spec = item.getSpecification() != null ? item.getSpecification() : "";
return (name + "&&&" + spec).equals(biaoshi);
})
.filter(item -> Objects.equals(biaoshi, item.getSuppliespriceId()))
.findFirst()
.map(item -> {
String name = item.getName() != null ? item.getName() : "";
String spec = item.getSpecification() != null ? item.getSpecification() : "";
return "名称:“"+name + "”,规格:“" + spec+"";
return "名称:“"+name + "";
})
.orElse("未知物料");
throw new ServiceException(itemName + "超出数量");
@ -257,11 +254,11 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
// 转换并保存数据
List<BusMaterialbatchdemandplan> plans = MapstructUtils.convert(dto.getPlanList(), BusMaterialbatchdemandplan.class);
plans.forEach(item -> {
// BusBillofquantities byId = busBillofquantitiesService.getById(item.getSuppliespriceId());
// if (!"0".equals(byId.getPid())) {
// BusBillofquantities one = busBillofquantitiesService.getOne(new LambdaQueryWrapper<BusBillofquantities>().eq(BusBillofquantities::getSid, byId.getPid()));
// item.setSuppliespricePid(one.getId());
// }
BusBillofquantitiesLimitList byId = busBillofquantitiesService.getById(item.getSuppliespriceId());
if (!"0".equals(byId.getPid())) {
BusBillofquantitiesLimitList one = busBillofquantitiesService.getOne(new LambdaQueryWrapper<BusBillofquantitiesLimitList>().eq(BusBillofquantitiesLimitList::getSid, byId.getPid()));
item.setSuppliespricePid(one.getId());
}
item.setMrpBaseId(convert.getId());
item.setProjectId(convert.getProjectId());
});
@ -297,23 +294,21 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
@Override
public Map<String, Object> remaining(Long projectId, String suppliespriceName, String specification, Long mrpBaseId) {
public Map<String, Object> remaining(Long projectId, Long limitListId,Long mrpBaseId) {
Map<String, Object> map = new HashMap<>();
List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusBillofquantities>()
.eq(BusBillofquantities::getProjectId, projectId)
.eq(BusBillofquantities::getName, suppliespriceName)
.eq(BusBillofquantities::getSpecification,specification));
BigDecimal quantity = busBillofquantities.stream()
.map(BusBillofquantities::getQuantity)
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = tenderPlanningLimitListService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getLimitListId, limitListId));
BigDecimal quantity = busTenderPlanningLimitLists.stream()
.map(BusTenderPlanningLimitList::getNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// BusBillofquantities byId = busBillofquantitiesService.getById(suppliespriceId);
BusBillofquantitiesLimitList busBillofquantities = busBillofquantitiesService.getById(limitListId);
// 获取数据库中已有的数量
List<BusMaterialbatchdemandplan> existingList = planservice.list(
Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class)
.eq(BusMaterialbatchdemandplan::getName, suppliespriceName)
.eq(BusMaterialbatchdemandplan::getSpecification ,specification)
.eq(BusMaterialbatchdemandplan::getSuppliespriceId ,limitListId)
.ne(mrpBaseId!=null,BusMaterialbatchdemandplan::getMrpBaseId, mrpBaseId)// 排除当前批次
);
BigDecimal reduce = BigDecimal.ZERO;
@ -323,10 +318,11 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
map.put("remainingQuantity",quantity.subtract(reduce));
map.put("specification",busBillofquantities.getFirst().getSpecification());
map.put("unit",busBillofquantities.getFirst().getUnit());
map.put("remark",busBillofquantities.getFirst().getRemark());
map.put("name",busBillofquantities.getFirst().getName());
map.put("specification",busBillofquantities.getSpecification());
map.put("suppliespriceId",limitListId);
map.put("unit",busBillofquantities.getUnit());
map.put("remark",busBillofquantities.getRemark());
map.put("name",busBillofquantities.getName());
return map;
}

View File

@ -51,6 +51,8 @@ import org.dromara.project.domain.BusProject;
import org.dromara.project.service.IBusProjectService;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.service.IBusTenderPlanningLimitListService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
@ -98,6 +100,8 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
private final ISysOssService ossService;
private final IBusTenderPlanningLimitListService tenderPlanningLimitListService;
/**
* 查询物资-采购联系单
*
@ -187,7 +191,7 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
BusPurchaseDoc add = MapstructUtils.convert(bo, BusPurchaseDoc.class);
validEntityBeforeSave(add);
validNum(bo.getAssociationList());
validNum(bo.getAssociationList(),add.getSupplierId());
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
@ -204,20 +208,65 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
}
public void validNum(List<BusPlanDocAssociationBo> associationList) {
public void validNum(List<BusPlanDocAssociationBo> associationList, Long supplierId) {
for (BusPlanDocAssociationBo association : associationList) {
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
if(association.getDemandQuantity() == null){
throw new ServiceException("请填写需求数量");
}
//获取批次需求计划
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
List<String> statuss = new ArrayList<>();
statuss.add(BusinessStatusEnum.DRAFT.getStatus());
statuss.add(BusinessStatusEnum.FINISH.getStatus());
statuss.add(BusinessStatusEnum.WAITING.getStatus());
//查询处于草稿、待审核、已审核状态的联系单
List<Long> ids = new ArrayList<>();
//该供应商的联系单
List<Long> ids1 = new ArrayList<>();
for (BusPurchaseDoc busPurchaseDoc : baseMapper.selectList(new LambdaQueryWrapper<BusPurchaseDoc>().in(BusPurchaseDoc::getStatus, statuss))) {
ids.add(busPurchaseDoc.getId());
if (busPurchaseDoc.getSupplierId().equals(supplierId)) {
ids1.add(busPurchaseDoc.getId());
}
}
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = tenderPlanningLimitListService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getLimitListId, association.getSuppliespriceId()));
BigDecimal quantity = busTenderPlanningLimitLists.stream()
.map(BusTenderPlanningLimitList::getNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
//查询处于这些采购联系单
List<BusPlanDocAssociation> list = planDocAssociationService.list(Wrappers.lambdaQuery(BusPlanDocAssociation.class)
.eq(BusPlanDocAssociation::getPlanId, association.getPlanId()));
.eq(BusPlanDocAssociation::getPlanId, association.getPlanId())
.in(BusPlanDocAssociation::getDocId, ids));
List<BusMaterialbatchdemandplan> busMaterialbatchdemandplans = materialbatchdemandplanService.getBaseMapper().selectList(new LambdaQueryWrapper<BusMaterialbatchdemandplan>()
.eq(BusMaterialbatchdemandplan::getSuppliespriceId, association.getSuppliespriceId()));
Set<Long> planids = new HashSet<>();
busMaterialbatchdemandplans.forEach(busMaterialbatchdemandplan -> {
planids.add(busMaterialbatchdemandplan.getId());
});
if (!ids1.isEmpty()){
List<BusPlanDocAssociation> list1 = planDocAssociationService.list(Wrappers.lambdaQuery(BusPlanDocAssociation.class)
.in(BusPlanDocAssociation::getDocId, ids1));
//计算材料已存在的数量
BigDecimal cltotal = list1.stream()
.filter(Objects::nonNull)
.filter(item->planids.contains(item.getPlanId()))
.map(BusPlanDocAssociation::getDemandQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (cltotal.add(association.getDemandQuantity()).compareTo(quantity) > 0) {
throw new ServiceException("材料:" + byId.getName() + "已超出供应商提供数量");
}
}
//计算采购已存在的数量
BigDecimal total = list.stream()
.map(BusPlanDocAssociation::getDemandQuantity)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (total.add(association.getDemandQuantity()).compareTo(byId.getDemandQuantity()) > 0) {
throw new ServiceException("材料:" + byId.getName() + "已超出计划单的物料批次需求计划数量");
}

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

@ -0,0 +1,84 @@
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, new LinkedHashMap<String, String>());
if (!smsResponse.isSuccess()) {
log.error("验证码短信发送异常 => {}", smsResponse);
}
}
}
//发送sse
@Async
public void sendSse(List<Long> userId, String message) {
SseMessageDto sseMessageDto = new SseMessageDto();
sseMessageDto.setUserIds(userId);
sseMessageDto.setMessage(message);
SseMessageUtils.publishMessage(sseMessageDto);
}
//下发考勤人员
@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,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

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

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

View File

@ -213,10 +213,11 @@ public interface ISubConstructionUserService extends IService<SubConstructionUse
/**
* 人脸识别
*
* @param file 图片文件
* @param file 图片文件
* @param userId
* @return 是否匹配成功
*/
Boolean faceComparison(MultipartFile file);
Boolean faceComparison(MultipartFile file, Long userId);
/**
* 根据系统用户id查询施工人员
@ -236,4 +237,12 @@ public interface ISubConstructionUserService extends IService<SubConstructionUse
TableDataInfo<SubConstructionUserAppVo> queryUndistributedList(SubConstructionUserQueryReq req, PageQuery pageQuery);
void deleteeBySysUserIds( List<Long> ids);
/**
* 根据系统用户id查询施工人员
*
* @param sysUserId 系统用户id
* @return 施工人员
*/
SubConstructionUser getByUserId(Long sysUserId);
}

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;
/**
* 查询施工人员
*
@ -182,15 +190,15 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
if ("2".equals(appUserType)) {
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, req.getProjectId());
if(CollectionUtil.isEmpty(byUserId)){
return new TableDataInfo<>();
if (CollectionUtil.isEmpty(byUserId)) {
return TableDataInfo.build(new ArrayList<>());
}
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
}
// 查询数据库
LambdaQueryWrapper<SubConstructionUser> wrapper = this.buildQueryWrapper(req);
wrapper.in(req.getTeamId() == null && "2".equals(appUserType), SubConstructionUser::getTeamId,list1);
wrapper.in(req.getTeamId() == null && "2".equals(appUserType), SubConstructionUser::getTeamId, list1);
wrapper.eq(SubConstructionUser::getUserRole, "0");
Page<SubConstructionUser> result = this.page(pageQuery.build(), wrapper);
return TableDataInfo.build(getVoPage(result));
@ -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);
@ -232,14 +242,14 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
@Transactional(rollbackFor = Exception.class)
public Boolean allocate(AllocateDto dto) {
SubConstructionUser constructionUser = baseMapper.selectById(dto.getId());
if(constructionUser == null){
if (constructionUser == null) {
throw new ServiceException("施工人员信息不存在", HttpStatus.ERROR);
}
constructionUser.setProjectId(dto.getProjectId());
constructionUser.setContractorId(dto.getContractorId());
BusProjectTeam team = projectTeamService.getById(dto.getTeamId());
if(team == null){
if (team == null) {
throw new ServiceException("班组信息不存在", HttpStatus.ERROR);
}
constructionUser.setTeamId(dto.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,7 +299,9 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
//强退
roleService.cleanOnlineUser(Collections.singletonList(constructionUser.getSysUserId()));
return i>0;
asyncUtil.sendPersonnel(dto.getTeamId(), constructionUser);
return i > 0;
}
/**
@ -855,7 +867,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
String decrypt = constructionUserVo.getSfzNumber();
try {
decrypt = idCardEncryptorUtil.decrypt(constructionUserVo.getSfzNumber());
}catch (Exception e) {
} catch (Exception e) {
log.error("身份证号码解密失败", e);
}
constructionUserVo.setSfzNumber(decrypt);
@ -1066,7 +1078,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
constructionUserVo.setPostId(one.getPostId());
}
}else {
} else {
constructionUserVo.setTeamName(null);
}
@ -1086,37 +1098,51 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
@Override
public Page<SubConstructionUserAttendanceTotalVo> getAttendanceTotalVoPage(SubConstructionUserAttendanceQueryReq req,
PageQuery pageQuery) {
String clockMonth = req.getClockDate();
if (!DateConstant.YEAR_MONTH_PATTERN.matcher(clockMonth).matches()) {
throw new ServiceException("月份格式不正确", HttpStatus.BAD_REQUEST);
}
// 解析月份
YearMonth yearMonth = YearMonth.parse(clockMonth);
// 判断是否大于当前月份
if (yearMonth.isAfter(YearMonth.now())) {
throw new ServiceException("不能查看大于当前月份的记录", HttpStatus.BAD_REQUEST);
}
// 计算当月第一天 / 最后一天
LocalDate start = yearMonth.atDay(1);
LocalDate end = yearMonth.atEndOfMonth();
LambdaQueryWrapper<SubConstructionUser> lqw = Wrappers.lambdaQuery();
// 从对象中取值
String userName = req.getUserName();
Long projectId = req.getProjectId();
Long teamId = req.getTeamId();
String typeOfWork = req.getTypeOfWork();
String clockMonth = req.getClockDate();
// 联表查询
LambdaQueryWrapper<BusAttendance> attendanceLqw = Wrappers.lambdaQuery(BusAttendance.class)
.eq(BusAttendance::getProjectId, projectId);
if (ObjectUtils.isNotEmpty(clockMonth)) {
// 校验月份格式
if (!DateConstant.YEAR_MONTH_PATTERN.matcher(clockMonth).matches()) {
throw new ServiceException("月份格式不正确", HttpStatus.BAD_REQUEST);
}
// 解析月份
YearMonth yearMonth = YearMonth.parse(clockMonth);
// 判断是否大于当前月份
if (yearMonth.isAfter(YearMonth.now())) {
throw new ServiceException("不能查看大于当前月份的记录", HttpStatus.BAD_REQUEST);
}
// 计算当月第一天 / 最后一天
LocalDate start = yearMonth.atDay(1);
LocalDate end = yearMonth.atEndOfMonth();
attendanceLqw.between(BusAttendance::getClockDate, start, end);
List<Long> userIdList = attendanceService.list(attendanceLqw)
.stream().map(BusAttendance::getUserId).toList();
if (CollUtil.isNotEmpty(userIdList)) {
lqw.in(SubConstructionUser::getSysUserId, userIdList);
}
}
// if (ObjectUtils.isNotEmpty(clockMonth)) {
// // 校验月份格式
// if (!DateConstant.YEAR_MONTH_PATTERN.matcher(clockMonth).matches()) {
// throw new ServiceException("月份格式不正确", HttpStatus.BAD_REQUEST);
// }
// // 解析月份
// YearMonth yearMonth = YearMonth.parse(clockMonth);
// // 判断是否大于当前月份
// if (yearMonth.isAfter(YearMonth.now())) {
// throw new ServiceException("不能查看大于当前月份的记录", HttpStatus.BAD_REQUEST);
// }
// // 计算当月第一天 / 最后一天
// LocalDate start = yearMonth.atDay(1);
// LocalDate end = yearMonth.atEndOfMonth();
// attendanceLqw.between(BusAttendance::getClockDate, start, end);
// List<Long> userIdList = attendanceService.list(attendanceLqw)
// .stream().map(BusAttendance::getUserId).toList();
// if (CollUtil.isNotEmpty(userIdList)) {
// lqw.in(SubConstructionUser::getSysUserId, userIdList);
// }
// }
// 模糊查询
lqw.like(StringUtils.isNotBlank(userName), SubConstructionUser::getUserName, userName);
// 精确查询
@ -1131,6 +1157,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
}
//只查施工人员
lqw.eq(SubConstructionUser::getUserRole, "0");
lqw.isNotNull(SubConstructionUser::getTeamId);
// 分页查询获取数据
Page<SubConstructionUser> constructionUserPage = this.page(pageQuery.build(), lqw);
List<SubConstructionUser> constructionUserList = constructionUserPage.getRecords();
@ -1145,6 +1172,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
List<Long> userIdList = constructionUserList.stream().map(SubConstructionUser::getSysUserId).toList();
// 关联查询施工人员考勤列表
attendanceLqw.in(BusAttendance::getUserId, userIdList);
attendanceLqw.between(BusAttendance::getClockDate, start, end);
Map<Long, List<BusAttendance>> userIdBusAttendanceListMap = attendanceService.list(attendanceLqw)
.stream().collect(Collectors.groupingBy(BusAttendance::getUserId));
// 填充信息
@ -1196,7 +1224,8 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
unClockDays++;
}
}
if(ATTENDANCE_LIST.contains(clockInStatus) || ATTENDANCE_LIST.contains(clockOutStatus)){
if ((clockInStatus != null && ATTENDANCE_LIST.contains(clockInStatus))
|| (clockOutStatus != null && ATTENDANCE_LIST.contains(clockOutStatus))) {
attendanceDays++;
}
@ -1266,12 +1295,12 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
vo.setGender(wordsResult.getGender() != null ? wordsResult.getGender().getWords() : "");
vo.setImage(upload);
} else {
if (wordsResult.getExpiryDate() != null ) {
if (wordsResult.getExpiryDate() != null) {
vo.setExpiryDate(wordsResult.getExpiryDate().getWords());
if ("长期".equals(wordsResult.getExpiryDate().getWords())) {
vo.setExpiryDate("99991231");
}
}else {
} else {
vo.setExpiryDate("");
}
vo.setIssuingAuthority(wordsResult.getIssuingAuthority() != null ? wordsResult.getIssuingAuthority().getWords() : "");
@ -1377,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();
}
@ -1400,15 +1430,18 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
/**
* 人脸识别
*
* @param file 图片文件
* @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("未进行实名认证");
@ -1493,9 +1526,11 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
lqw.eq(ObjectUtils.isNotEmpty(typeOfWork), SubConstructionUser::getTypeOfWork, typeOfWork);
lqw.isNull(SubConstructionUser::getTeamId);
if(req.getProjectId() == null){
lqw.eq(SubConstructionUser::getUserRole, "0");
if (req.getProjectId() == null) {
lqw.isNull(SubConstructionUser::getProjectId);
}else{
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());
}
Page<SubConstructionUser> result = this.page(pageQuery.build(), lqw);
@ -1531,4 +1566,12 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
this.remove(Wrappers.<SubConstructionUser>lambdaUpdate()
.in(SubConstructionUser::getSysUserId, ids));
}
@Override
public SubConstructionUser getByUserId(Long sysUserId) {
return this.lambdaQuery()
.eq(SubConstructionUser::getSysUserId, sysUserId)
.last("limit 1")
.one();
}
}

View File

@ -14,6 +14,7 @@ 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.contractor.domain.SubConstructionUser;
import org.dromara.contractor.domain.SubContractor;
import org.dromara.contractor.domain.dto.contractor.SubContractorCreateReq;
@ -118,10 +119,7 @@ public class SubContractorServiceImpl extends ServiceImpl<SubContractorMapper, S
// 数据校验
validEntityBeforeSave(contractor);
String name = req.getName();
Long count = this.lambdaQuery()
.eq(SubContractor::getName, name)
.eq(SubContractor::getProjectId, req.getProjectId())
.count();
Long count = this.lambdaQuery().eq(SubContractor::getName, name).count();
if (count > 0) {
throw new ServiceException("分包单位名称重复", HttpStatus.BAD_REQUEST);
}
@ -162,11 +160,7 @@ public class SubContractorServiceImpl extends ServiceImpl<SubContractorMapper, S
}
// 判断名称是否重复
if (!oldContractor.getName().equals(req.getName())) {
Long count = this.lambdaQuery()
.eq(SubContractor::getName, req.getName())
.eq(SubContractor::getProjectId, req.getProjectId())
.ne(SubContractor::getId, contractor.getId())
.count();
Long count = this.lambdaQuery().eq(SubContractor::getName, req.getName()).count();
if (count > 0) {
throw new ServiceException("分包单位名称重复", HttpStatus.BAD_REQUEST);
}

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

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