881 Commits
Author SHA1 Message Date
qitz 74112dc93b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-03-22 10:06:30 +08:00
qitz 08717e84be 优化新增功能 2024-03-22 10:06:10 +08:00
wangqiong123andGitea 8d732fb8fb Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2024-02-28 09:40:24 +08:00
18792927508 5240926cd7 视频会议调用调解系统 2024-02-28 09:36:31 +08:00
qtzandGitea 16d6d1c29d Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-02-06 15:59:52 +08:00
qitz b0e0123c4a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-02-06 15:56:21 +08:00
qitz abb96916e3 优化新增功能 2024-02-06 15:56:03 +08:00
qtzandGitea e3bdb44192 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-19 17:28:42 +08:00
qitz ff175c98df Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-19 17:26:09 +08:00
qitz 5c434e576f 优化用印功能 2024-01-19 17:25:40 +08:00
wangqiong123andGitea 6b5e91c4d7 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-19 10:47:36 +08:00
18792927508 5f622b0641 视频回调 2024-01-19 10:45:17 +08:00
qtzandGitea 9bfcc02a48 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-10 13:44:44 +08:00
qitz a3a3fa17f1 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-10 13:41:35 +08:00
qitz f38d6997bc 优化公章列表查询 2024-01-10 13:41:18 +08:00
qtzandGitea 13e3503af4 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-10 11:39:27 +08:00
qitz 70af2e822b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-10 11:35:53 +08:00
qitz 71a228c625 修改送达裁决书功能 2024-01-10 11:35:28 +08:00
qtzandGitea 9f79c901ca Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-09 11:45:16 +08:00
qitz fa782834e7 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-09 11:41:50 +08:00
qitz 088bd41d0b 优化批量送达裁决书功能 2024-01-09 11:41:16 +08:00
qtzandGitea f6b1403e3c Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-08 14:51:20 +08:00
qitz da105d20e4 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-08 14:47:49 +08:00
qitz 293dd52e8c 优化案件列表查询 2024-01-08 14:47:19 +08:00
qtzandGitea eeb6757ec8 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-05 17:55:55 +08:00
qitz 6960564dde Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-05 17:53:28 +08:00
qitz fb8366fa78 优化批量列表查询 2024-01-05 17:53:02 +08:00
qtzandGitea 31dc8e4032 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-05 16:35:11 +08:00
qitz 6caf44a9ec Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-05 16:31:46 +08:00
qitz 95cacd287b 批量送达裁决书功能 2024-01-05 16:31:22 +08:00
qtzandGitea fdf48d2f14 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-05 14:49:01 +08:00
qitz b24fc351ea Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-05 14:45:44 +08:00
qitz 11e6c91cc6 实现批量签名用印功能 2024-01-05 14:45:10 +08:00
qtzandGitea fd04248c4b Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-04 18:02:31 +08:00
qitz 1f9cea5d3e Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-04 17:59:11 +08:00
qitz 4be8bcab6d 实现批量审核仲裁方式 2024-01-04 17:58:44 +08:00
qtzandGitea cf6b0e7d70 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-04 16:16:35 +08:00
qitz ff2a7dd781 实现批量部门长审核裁决书 2024-01-04 16:11:49 +08:00
wangqiong123andGitea f99cf25adf Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-04 10:04:46 +08:00
18792927508 1ea9767674 压缩包导入修改 2024-01-04 10:01:59 +08:00
qtzandGitea 2253984352 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-03 18:00:33 +08:00
qitz b14d46803c Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-03 17:56:31 +08:00
qitz 82b6431be9 实现批量组庭功能 2024-01-03 17:55:35 +08:00
qtzandGitea 6cb1ecab7b Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-03 13:52:37 +08:00
qitz 061bdc6312 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-03 13:49:30 +08:00
qitz f980592507 优化批量缴费功能 2024-01-03 13:49:01 +08:00
qtzandGitea 1d0e12ee18 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-03 09:37:41 +08:00
qitz d5b6cddd8f Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-03 09:33:57 +08:00
qitz e4931d1499 优化缴费功能 2024-01-03 09:33:26 +08:00
qtzandGitea 7748d4e558 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-02 16:45:32 +08:00
qitz 7d5ee5cffd Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-02 16:42:08 +08:00
qitz 48da135874 批量缴费 2024-01-02 16:41:36 +08:00
qtzandGitea 8be09de49c Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-02 14:15:19 +08:00
qitz 2aff2e8d7d Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-02 14:11:25 +08:00
qitz 06320d99ca 批量审查 2024-01-02 14:10:53 +08:00
qtzandGitea 7cd6c52db5 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2024-01-02 10:00:50 +08:00
qitz 455f3265ec Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2024-01-02 09:57:36 +08:00
qitz 33774c51fb 优化批量提交 2024-01-02 09:57:04 +08:00
qtzandGitea c68c91e0b3 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-29 17:29:36 +08:00
qitz 53c64c36da Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2023-12-29 17:24:05 +08:00
qitz 7a38c4e8a5 实现批量管理查询批量和批量提交 2023-12-29 17:23:09 +08:00
wangqiong123andGitea 66d66e5156 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-28 10:33:27 +08:00
18792927508 20517eaaaa bug修改 2023-12-28 10:30:45 +08:00
qitz deea55b1e9 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2023-12-27 14:40:48 +08:00
qitz 31a9287a8f 1 2023-12-27 14:40:26 +08:00
wangqiong123andGitea 4cd04ef10e Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-27 14:39:35 +08:00
18792927508 afb6b2a4b5 bug修改 2023-12-27 14:38:03 +08:00
qtzandGitea a12083d93c Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-27 14:03:58 +08:00
qitz f66af56144 优化查询案件列表 2023-12-27 13:58:02 +08:00
wangqiong123andGitea 0d71663935 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-25 16:04:49 +08:00
qitz 753039d5e9 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2023-12-25 16:04:45 +08:00
qitz 743040d813 优化下载zip 2023-12-25 16:04:29 +08:00
18792927508 9f8e21383d 1 2023-12-25 16:03:10 +08:00
wangqiong123andGitea 4e85bf306b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-21 09:17:57 +08:00
18792927508 1da61f526d 案件bug修复 2023-12-21 09:16:26 +08:00
wangqiong123andGitea c7970e884f Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-20 09:17:46 +08:00
18792927508 20c95700ab 案件 2023-12-20 09:15:28 +08:00
qtzandGitea 547394f8d6 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-19 14:06:08 +08:00
qitz a671da2f11 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2023-12-19 14:02:23 +08:00
qitz 60561da44d 优化生成案件编号规则功能 2023-12-19 14:01:56 +08:00
qtzandGitea e5138339a8 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-15 17:30:36 +08:00
qitz 45f30d2dbc Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2023-12-15 17:26:14 +08:00
qitz 8aa82b28be 实现案件编号规则功能 2023-12-15 17:25:40 +08:00
wangqiong123andGitea 23847cf918 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-15 10:58:52 +08:00
18792927508 c6d0cb9579 案件修改 2023-12-15 10:57:16 +08:00
qtzandGitea e590293b33 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-14 15:55:50 +08:00
qitz e1fa902c59 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2023-12-14 15:51:40 +08:00
qitz 5eb7b070fd 实现组庭审核时仲裁员待办案件数据显示 2023-12-14 15:51:09 +08:00
qtzandGitea fbf10a1ed9 Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-13 16:01:37 +08:00
qitz 0e96b4d8f4 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz5 2023-12-13 15:58:56 +08:00
qitz 61f8638635 增加是否书面审理 2023-12-13 15:58:38 +08:00
qtzandGitea 6c9a09f29a Merge branch 'qtz5' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-13 11:46:48 +08:00
qitz 2787aa38c6 优化驳回原因功能 2023-12-13 11:44:20 +08:00
wangqiong123andGitea d69b959534 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-12 19:09:28 +08:00
18792927508 60c1db6e2a 案件流程,日志修改 2023-12-12 19:08:23 +08:00
qtzandGitea d4db9785b3 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-12 18:26:54 +08:00
qitz 7ace643452 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-12 18:21:22 +08:00
qitz c4276aac48 优化仲裁员确认功能 2023-12-12 18:20:55 +08:00
qtzandGitea 02386824af Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-12 17:16:15 +08:00
qitz 209de376e3 优化立案审查驳回接口 2023-12-12 17:12:31 +08:00
wangqiong123andGitea 4c4dfcd9d5 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-12 16:23:53 +08:00
18792927508 a78e3e23d6 工具类,案件压缩包导入优化 2023-12-12 16:22:41 +08:00
qtzandGitea 5730bb12a7 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-12 15:04:10 +08:00
qitz 2e1ceaa393 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-12 15:00:57 +08:00
qitz b1f0fb8f6f 优化案件提交退还原因 2023-12-12 14:59:01 +08:00
qtzandGitea 2e1c5eae8a Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-12 11:56:05 +08:00
qitz 23d53688e4 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-12 11:50:11 +08:00
qitz 5558debc20 实现庭审笔录上传 2023-12-12 11:49:48 +08:00
qtzandGitea 1c9e92b60e Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-11 18:06:03 +08:00
qitz 4be7832789 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-11 18:01:15 +08:00
qitz 0c968937af 实现下载案件压缩包 2023-12-11 18:00:37 +08:00
qtzandGitea c8aa73fc21 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-11 10:22:28 +08:00
qitz b2d42ccfba 优化更新自定义字段 2023-12-11 10:18:20 +08:00
wangqiong123andGitea a832a8281a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-11 09:24:51 +08:00
18792927508 27fa06ab04 案件功能优化 2023-12-11 09:23:47 +08:00
wangqiong123andGitea 397950e033 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 20:49:16 +08:00
18792927508 aa36758066 裁决书修改 2023-12-09 20:48:16 +08:00
qtzandGitea 69b5b0d072 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 15:38:14 +08:00
qitz 6f80764866 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-09 15:35:22 +08:00
qitz a10be7303f 优化案件更新 2023-12-09 15:35:04 +08:00
qtzandGitea 65dbeb9bdc Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 15:18:14 +08:00
wangqiong123andGitea 4286d35243 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 15:18:05 +08:00
18792927508 4ea958e91d 短信签名修改 2023-12-09 15:17:00 +08:00
qitz 23f4c31338 优化更新功能 2023-12-09 15:14:38 +08:00
qitz 67b3566eb8 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-09 14:50:36 +08:00
qitz 965a5912c0 优化批量 2023-12-09 14:49:59 +08:00
wangqiong123andGitea f62248e93e Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 14:21:05 +08:00
18792927508 2b6deb09b9 压缩包上传修改 2023-12-09 14:19:53 +08:00
qtzandGitea 9604bc938a Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 12:03:40 +08:00
qitz 9d3b296a27 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-09 12:01:00 +08:00
qitz 9a1f6a107e 修改案件信息自定义字段 2023-12-09 12:00:44 +08:00
qtzandGitea db0cea67be Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 10:54:19 +08:00
qitz 992817300c 优化案件修改功能 2023-12-09 10:50:33 +08:00
wangqiong123andGitea 9fdd40ee4e Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-09 09:26:15 +08:00
18792927508 5d4929f36b 压缩包上传,裁决书生成,案件修改,修改后对比信息 2023-12-09 09:25:12 +08:00
18792927508 a7826fbc16 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into wq 2023-12-08 22:37:33 +08:00
qtzandGitea dc498364ae Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-08 18:07:35 +08:00
qitz 0755325701 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-08 18:03:04 +08:00
qitz 3eeb1a0882 1 2023-12-08 18:02:54 +08:00
qitz f989831de2 修改抓取规则保存功能 2023-12-08 17:59:09 +08:00
18792927508 078c214202 生成裁决书修改 2023-12-08 13:50:01 +08:00
wangqiong123andGitea 4bc2940f9e Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-08 11:04:16 +08:00
18792927508 923d1e0483 抓取规则修改 2023-12-08 11:02:49 +08:00
wangqiong123andGitea a87fdca103 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-07 17:41:59 +08:00
18792927508 0ec450d85c word转pdf 2023-12-07 17:41:00 +08:00
qtzandGitea c7988344d3 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-07 16:49:40 +08:00
qitz 3cc3be3ee0 优化导入压缩包功能 2023-12-07 16:46:05 +08:00
wangqiong123andGitea 3a831e31ad Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-07 15:08:44 +08:00
18792927508 a525fd6a16 案件压缩包导入 2023-12-07 15:07:51 +08:00
qtzandGitea 6d720c5757 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-07 11:40:58 +08:00
qitz 023037e2ca 保存庭审记录 2023-12-07 11:37:16 +08:00
wangqiong123andGitea b3355ff79f Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-07 09:46:15 +08:00
18792927508 feb30e9fe5 1 2023-12-07 09:45:23 +08:00
wangqiong123andGitea f9c3609b8b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-07 09:36:32 +08:00
18792927508 79bf8423e0 案件压缩包导入修改 2023-12-07 09:29:33 +08:00
qtzandGitea 45bea53a70 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-06 17:35:04 +08:00
qitz a24b78473f 保存抓取规则功能 2023-12-06 17:30:37 +08:00
qitz f9dbd8a010 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-06 10:45:03 +08:00
wangqiong123andGitea 31b4f482dd Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-06 10:44:48 +08:00
18792927508 08758c78ab 抓取规则mapper 2023-12-06 10:43:41 +08:00
qitz 4a23dfbc2a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-06 10:35:00 +08:00
qitz 086cfca5dc 1 2023-12-06 10:34:40 +08:00
qtzandGitea 120b30c4ea Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-05 17:49:01 +08:00
qitz df93d06ae2 实现仲裁员审核裁决书功能 2023-12-05 17:45:54 +08:00
wangqiong123andGitea a683b38e8d Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-05 15:25:00 +08:00
18792927508 33d44eed4d 仲裁员审核裁决书 2023-12-05 15:19:36 +08:00
qtzandGitea 8615b98be2 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-05 11:40:19 +08:00
wangqiong123andGitea 57b5325154 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-05 11:37:31 +08:00
qitz 1ccbc8c895 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-12-05 11:37:07 +08:00
18792927508 0be2808800 生成裁决书路径修改 2023-12-05 11:36:33 +08:00
qitz 93b3c29ac3 优化查看流程功能 2023-12-05 11:35:53 +08:00
wangqiong123andGitea ffb0a9f6da Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-05 11:06:42 +08:00
18792927508 93d9e11688 案件流程修改 2023-12-05 11:05:47 +08:00
wangqiong123andGitea 20e6986ec9 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-04 17:11:04 +08:00
18792927508 ba6237853e 生成裁决书修改 2023-12-04 17:08:39 +08:00
hejinboandGitea cc5c4ab49a Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-04 13:41:20 +08:00
hejinbo 738afdce5c 模板管理 2023-12-04 13:40:04 +08:00
wangqiong123andGitea 78b8aa6487 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-12-01 13:28:26 +08:00
18792927508 98200d775c 申请人用手机号关联 2023-12-01 13:25:58 +08:00
wangqiong123andGitea fde91ebba5 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 21:47:13 +08:00
18792927508 320398289d duibi 2023-11-30 21:46:33 +08:00
hejinboandGitea eb7a8fd736 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 21:11:56 +08:00
hejinbo 0393b11712 压缩包导入去空格 2023-11-30 21:10:36 +08:00
wangqiong123andGitea f231e09e8a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 20:05:00 +08:00
18792927508 434b93b61c 案件查询 2023-11-30 20:04:03 +08:00
hejinboandGitea c083e3711c Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 20:00:55 +08:00
hejinbo 62e5467e5f 案件修改 2023-11-30 19:59:50 +08:00
hejinboandGitea f71c07ab6a Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 15:28:50 +08:00
hejinbo ec87e603ee Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-30 15:27:37 +08:00
hejinbo 630b455790 小程序立案申请书展示 2023-11-30 15:27:21 +08:00
wangqiong123andGitea cee39d271a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 15:17:57 +08:00
18792927508 1b7f380867 转pdf 2023-11-30 15:16:59 +08:00
wangqiong123andGitea 8acb479047 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 15:04:54 +08:00
18792927508 de1644db2c 根据案件id查附件 2023-11-30 15:04:09 +08:00
wangqiong123andGitea 45d23fbab6 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 14:57:17 +08:00
gy b 0e6470fd59 案件回显 2023-11-30 14:56:27 +08:00
hejinboandGitea 002ea67fe7 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 14:06:04 +08:00
hejinbo e75aa0f7f1 公章管理 2023-11-30 14:04:54 +08:00
hejinboandGitea 397f74daad Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 12:12:22 +08:00
hejinbo 9146059eea xiughai 2023-11-30 12:08:58 +08:00
hejinbo 135b7b6964 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-30 12:08:15 +08:00
hejinbo 0f258a43f3 暂存 2023-11-30 12:05:57 +08:00
wangqiong123andGitea d53d328437 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-30 10:35:12 +08:00
gy b ba0a91e0c8 案件回显 2023-11-30 10:34:36 +08:00
wangqiong123andGitea 1dcdf68814 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 22:49:13 +08:00
gy b ce72dae1ad 案件对比 2023-11-29 22:48:51 +08:00
wangqiong123andGitea 07a93038a5 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 22:42:01 +08:00
gy b 7f26242ea8 对比信息 2023-11-29 22:41:27 +08:00
wangqiong123andGitea 8816a64040 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 21:47:03 +08:00
gy b 0db3c4814d 案件查询 2023-11-29 21:45:43 +08:00
hejinboandGitea ba86324276 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 21:42:08 +08:00
hejinbo 1a0de0e483 修改模板更改参数校验 2023-11-29 21:41:00 +08:00
hejinboandGitea 1ca8a32d10 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 21:17:51 +08:00
hejinbo 07d80398ae 语音转录 2023-11-29 21:16:38 +08:00
hejinboandGitea 04db4a633b Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 16:26:10 +08:00
hejinbo 7c665da605 修改 2023-11-29 16:25:26 +08:00
hejinboandGitea 0996ce4008 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 16:05:44 +08:00
hejinbo 7bcb28cdac Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-29 16:04:19 +08:00
hejinbo cbc1a23715 修改 2023-11-29 15:59:25 +08:00
wangqiong123andGitea 8a48dbbab0 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 13:02:37 +08:00
18792927508 59497d26f7 1 2023-11-29 13:01:30 +08:00
wangqiong123andGitea 9962fef53a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-29 11:51:44 +08:00
18792927508 609a3725d6 案件查询 2023-11-29 11:51:01 +08:00
wangqiong123andGitea ffa7ace73b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-28 19:52:46 +08:00
18792927508 cc7cf6d2c0 bug修复 2023-11-28 19:51:27 +08:00
wangqiong123andGitea 532baf1682 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-28 16:33:57 +08:00
18792927508 9f9da3a0dc html转pdf 2023-11-28 16:33:13 +08:00
hejinboandGitea 9c6a5fc390 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-28 15:39:19 +08:00
hejinbo 0b8c566f1d Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-28 15:35:40 +08:00
hejinbo 9807b13101 暂存 2023-11-28 15:34:58 +08:00
wangqiong123andGitea 5ca8535f02 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-28 14:03:29 +08:00
18792927508 fa02011bd7 daibana 2023-11-28 14:02:49 +08:00
wangqiong123andGitea 45336e3a96 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-28 11:35:26 +08:00
18792927508 6bcb7ac3e8 待办案件修改 2023-11-28 11:34:32 +08:00
wangqiong123andGitea 6d79065b92 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-28 10:37:39 +08:00
18792927508 6b73802bf7 案件修改 2023-11-28 10:37:17 +08:00
wangqiong123andGitea c46f81c628 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-27 17:59:54 +08:00
18792927508 69fbcd4b4b 案件修改 2023-11-27 17:59:24 +08:00
hejinboandGitea 1ddaf829fc Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-27 17:32:03 +08:00
hejinbo 12d94a38ca Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-27 17:28:57 +08:00
hejinbo 6a0009a3ad 暂存 2023-11-27 17:28:37 +08:00
wangqiong123andGitea f4e47e3348 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-25 18:15:59 +08:00
18792927508 dbefa0b24e 多线程工具类,websocket 2023-11-25 18:15:40 +08:00
hejinboandGitea aef4ae747e Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-25 18:08:23 +08:00
hejinbo 1a1f87c998 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb
# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CaseApplicationServiceImpl.java
2023-11-25 18:06:05 +08:00
hejinbo 17b35f7095 暂存 2023-11-25 17:56:52 +08:00
wangqiong123andGitea 2eb70a7808 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-25 11:04:18 +08:00
18792927508 b34aa2092e 案件质证加反仲裁原因 2023-11-25 11:03:51 +08:00
wangqiong123andGitea f9d77c264a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-24 19:23:06 +08:00
18792927508 c39cd5babd 案件修改 2023-11-24 19:22:32 +08:00
hejinbo e3cd2495cf 压缩包导入 2023-11-24 18:57:35 +08:00
wangqiong123andGitea 05121a5569 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-24 14:34:46 +08:00
18792927508 080e77a79d 案件修改 2023-11-24 14:34:22 +08:00
wangqiong123andGitea 3c424b60a4 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 22:51:57 +08:00
18792927508 c7988cbc00 案件对比 2023-11-23 22:51:29 +08:00
wangqiong123andGitea 183b0ecd2c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 20:40:02 +08:00
18792927508 0cef2791d6 案件记录附件表 2023-11-23 20:39:35 +08:00
hejinboandGitea cb8df46151 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 20:28:09 +08:00
hejinbo 3a393be18d 批量缴费确认 2023-11-23 20:27:27 +08:00
hejinboandGitea 4d93997f53 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 20:17:32 +08:00
hejinbo 20d8d2e045 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-23 20:16:25 +08:00
hejinbo 74305b5728 xiufu 2023-11-23 20:15:55 +08:00
wangqiong123andGitea d52cb55443 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 18:47:34 +08:00
18792927508 217dda4225 会议 2023-11-23 18:47:16 +08:00
hejinboandGitea d282515d64 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 18:46:10 +08:00
hejinbo 80f6e726f8 倒序 2023-11-23 18:41:59 +08:00
hejinboandGitea 7029decfe8 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 17:53:25 +08:00
hejinbo 6798d64993 修改xml 2023-11-23 17:52:49 +08:00
hejinboandGitea de7fe6fee0 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 17:38:23 +08:00
hejinbo 365409ab6d Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-23 17:36:11 +08:00
hejinbo 607da65dc4 11.23开发 2023-11-23 17:35:59 +08:00
wangqiong123andGitea 5621318bae Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 10:39:51 +08:00
18792927508 80cabfbf5e 立案详情修改 2023-11-23 10:30:29 +08:00
wangqiong123andGitea b4797984dd Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-23 09:02:47 +08:00
18792927508 213e27e4e7 联调修改 2023-11-23 09:02:20 +08:00
hejinboandGitea d6bb72d5eb Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-22 17:16:38 +08:00
hejinbo 9ee2e83c7a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-22 17:15:20 +08:00
hejinbo 940244f829 11.22开发 2023-11-22 17:15:00 +08:00
wangqiong123andGitea 7182106bab Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-22 17:14:53 +08:00
18792927508 f5817926ca 修改 2023-11-22 17:14:31 +08:00
wangqiong123andGitea c9f194f8b8 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-22 13:59:23 +08:00
18792927508 11aab5bc31 修改申请 2023-11-22 13:58:34 +08:00
hejinboandGitea f85edb62f4 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-22 11:52:52 +08:00
hejinbo 80523e71d1 机构、模板管理优化接口 2023-11-22 11:51:51 +08:00
hejinboandGitea 765c444a16 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-21 14:58:49 +08:00
hejinbo 06b0822a15 111 2023-11-21 14:54:36 +08:00
hejinbo 0b94672e58 批量缴费接口开发 2023-11-21 14:53:07 +08:00
hejinboandGitea b979d8a4eb Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-20 14:39:41 +08:00
hejinbo 2438e89252 模板管理修改接口 2023-11-20 14:39:01 +08:00
hejinboandGitea 93899d881c Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-20 11:03:27 +08:00
hejinbo 36e7342d85 模板管理查询修改 2023-11-20 11:02:38 +08:00
hejinboandGitea b3a2a2af3e Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-20 10:46:29 +08:00
hejinbo 440e895c51 模板管理查询修改 2023-11-20 10:44:41 +08:00
hejinbo 004c736aa1 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-20 10:40:44 +08:00
hejinboandGitea a99e281f8a Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-17 17:59:25 +08:00
hejinbo 09d814566f Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-17 17:50:24 +08:00
hejinbo 35a9faeb6a 模板管理开发 2023-11-17 17:49:53 +08:00
hejinboandGitea e92aabb0e4 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-17 14:27:35 +08:00
hejinbo 736b189473 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-17 14:25:53 +08:00
hejinbo 2557d57508 zancun 2023-11-17 14:25:03 +08:00
wangqiong123andGitea 63de4daf2a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-17 10:39:33 +08:00
18792927508 f53f519d84 案件模板下载 2023-11-17 10:39:01 +08:00
hejinboandGitea 8bb2a6f327 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-16 19:33:17 +08:00
hejinbo 7fe72980ac Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-16 19:23:10 +08:00
hejinbo c644fb3142 修复公章管理 2023-11-16 19:23:01 +08:00
wangqiong123andGitea 25f0df5899 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-16 16:00:00 +08:00
18792927508 8906d10451 代理人角色查询 2023-11-16 15:59:40 +08:00
hejinboandGitea e18e47f31f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-16 14:35:45 +08:00
wangqiong123andGitea 43d6c55579 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-16 14:34:05 +08:00
18792927508 bbb2776610 邮箱相关修改 2023-11-16 14:33:42 +08:00
hejinbo f5aa2d9d06 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-16 14:30:00 +08:00
hejinbo 0d197b2aa9 genggai 2023-11-16 14:21:43 +08:00
wangqiong123andGitea e06c159759 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-16 12:09:59 +08:00
18792927508 5287c031bc 邮箱完善 2023-11-16 12:09:36 +08:00
hejinboandGitea d8c09d6dff Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-16 10:55:41 +08:00
hejinbo 091d9e4af9 pull dev 2023-11-16 10:54:52 +08:00
hejinbo a4e8347835 zancun 2023-11-16 10:42:19 +08:00
hejinbo 8b0eae8dca 机构管理.公章管理优化 2023-11-15 18:27:09 +08:00
wangqiong123andGitea 1a1d64c827 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-15 16:55:09 +08:00
18792927508 114a963447 视频录制修改 2023-11-15 16:54:51 +08:00
wangqiong123andGitea 431b05c72b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-15 16:13:14 +08:00
18792927508 eb09ba6ae9 视频录制,停止录制 2023-11-15 16:12:48 +08:00
hejinboandGitea cd22f387f4 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-15 09:07:34 +08:00
hejinbo 044cffeb7f Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-15 09:06:51 +08:00
hejinbo 4088cf7357 公章管理测试 2023-11-15 09:01:20 +08:00
hejinboandGitea 02a93bbd3f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-14 14:49:10 +08:00
hejinbo dac20a4a04 11.14批量生成裁决书 2023-11-14 14:42:10 +08:00
wangqiong123andGitea 0a7bf5b54d Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-14 11:36:03 +08:00
18792927508 a6731e8595 会议相关,查询案件修改 2023-11-14 11:35:26 +08:00
hejinboandGitea 8a7dfec1d6 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-13 16:18:36 +08:00
hejinbo de3fc04a05 11.13开发 2023-11-13 16:16:44 +08:00
hejinbo b3361914bd Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-13 13:56:20 +08:00
hejinbo 9a9cacbdd5 11.13 查询和流程节点修改 2023-11-13 13:55:44 +08:00
hejinbo 8123e78e93 11.11中午添加白工校验参数代码 2023-11-11 12:12:23 +08:00
hejinboandGitea 1a51edfa8a Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-10 23:47:01 +08:00
hejinbo dd856a7619 10号晚测完系统后代码 2023-11-10 23:45:56 +08:00
bgyandGitea f6b4d5aceb Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-10 22:53:19 +08:00
gy b 9282d639b9 修复庭审笔录生成功能 2023-11-10 22:50:50 +08:00
hejinboandGitea ad7a8125db Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-10 18:21:41 +08:00
hejinbo ffc559543c 合并冲突解决 2023-11-10 18:20:04 +08:00
hejinbo 4cf4fa6f5c 11.10 开发 2023-11-10 18:08:30 +08:00
wangqiong123andGitea 5aaeb7dced Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-10 15:10:00 +08:00
18792927508 9bb23badc0 会议相关 2023-11-10 15:09:25 +08:00
wangqiong123andGitea e671ed8e2a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-09 18:17:28 +08:00
18792927508 3316e61824 部分功能实现 2023-11-09 18:16:06 +08:00
hejinbo 7cfc39190a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-09 17:35:22 +08:00
hejinbo 94d3f1cb1e 11.9开发 2023-11-09 17:34:12 +08:00
wangqiong123andGitea a9ddcaecf9 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-09 17:24:39 +08:00
18792927508 1242497d6f 销毁房间等接口 2023-11-09 17:24:07 +08:00
wangqiong123andGitea 1f41b4903b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-09 09:25:49 +08:00
18792927508 4e729103d6 登录返回值增加用户信息 2023-11-09 09:25:06 +08:00
hejinbo ae2c8fe59f Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-08 17:48:05 +08:00
hejinbo 1cdf3abc30 11.8kaifa 2023-11-08 17:47:59 +08:00
wangqiong123andGitea f04905b721 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-08 17:29:14 +08:00
18792927508 6662a05a6c 预约会议 2023-11-08 17:28:37 +08:00
hejinbo 8c890c415a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-08 10:38:17 +08:00
hejinbo b18075b0c4 优化裁决书 2023-11-08 10:37:48 +08:00
qtzandGitea b090ddd41b Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-07 20:47:22 +08:00
qitz 8947d5fd10 修改用印功能 2023-11-07 20:43:48 +08:00
qtzandGitea 331d98f33a Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-06 15:12:56 +08:00
qitz 9402f26857 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-06 15:08:36 +08:00
qitz 8ca9b43b3b 修改新建用户时的校验 2023-11-06 15:08:07 +08:00
wangqiong123andGitea 8ebf8ab2ea Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-06 14:51:09 +08:00
18792927508 4c5713300c bug修复 2023-11-06 14:50:46 +08:00
hejinboandGitea f15e73438e Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-06 11:18:34 +08:00
hejinbo f0e9261c22 邮件发送记录增加发送状态 2023-11-06 11:16:54 +08:00
qtzandGitea d3701b7299 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-04 19:47:29 +08:00
qitz 4eb62becc5 优化下载裁决书功能 2023-11-04 19:42:34 +08:00
qitz 2bbc030c40 优化下载功能 2023-11-04 18:32:21 +08:00
hejinboandGitea 37717366ab Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 20:06:27 +08:00
hejinbo e85fb44ef2 11.3发版,注释秦工下载文件代码 2023-11-03 20:05:12 +08:00
hejinbo 15426c5b7b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-03 18:33:20 +08:00
wangqiong123andGitea e6edadb07c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 18:27:04 +08:00
18792927508 32480b58b3 定时任务 2023-11-03 18:26:44 +08:00
qtzandGitea e410edbe1e Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 17:05:12 +08:00
qitz 45ab470c52 修改裁决书下载功能 2023-11-03 17:02:23 +08:00
hejinbo 84621de905 更改短信新增发送记录 2023-11-03 16:51:26 +08:00
qitz 4ab85a5d23 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-03 16:39:06 +08:00
qitz 3473d8721e 修改下载裁决书功能 2023-11-03 16:38:39 +08:00
hejinboandGitea d91294a3fe Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 16:29:54 +08:00
hejinbo a0d2ce44d0 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-03 16:28:30 +08:00
hejinbo 43ba159489 添加短信发送状态 2023-11-03 16:28:01 +08:00
wangqiong123andGitea f0f8a2ea00 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 16:03:37 +08:00
18792927508 533ce8d465 bug修改 2023-11-03 16:03:08 +08:00
hejinboandGitea 2092e5d64d Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 11:48:38 +08:00
hejinbo 5b7b839395 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-03 11:47:46 +08:00
hejinbo 876d0807c7 裁决书插入证据图片 2023-11-03 11:47:39 +08:00
wangqiong123andGitea 664aa6b3f0 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 10:58:52 +08:00
18792927508 07a3dea9cc Revert "Revert "导入时加案件名称""
This reverts commit 9c8bb4b00d.
2023-11-03 10:57:15 +08:00
18792927508 9c8bb4b00d Revert "导入时加案件名称"
This reverts commit b2c3e64333.
2023-11-03 10:57:03 +08:00
18792927508 b2c3e64333 导入时加案件名称 2023-11-03 10:50:51 +08:00
qtzandGitea aea374e9e8 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-03 10:41:42 +08:00
qitz 7de2bdddf7 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-03 10:39:14 +08:00
qitz 6b1ee10b33 优化发邮件功能 2023-11-03 10:38:42 +08:00
qtzandGitea 2002ba071b Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 17:59:54 +08:00
qitz 121ea7c7ae Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-02 17:57:10 +08:00
qitz aae315a059 修改公章管理功能 2023-11-02 17:56:46 +08:00
hejinboandGitea d41b82a47f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 17:50:06 +08:00
hejinbo 5120c7c2d2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-02 17:49:26 +08:00
hejinbo 9fdbc8712a 改bug 2023-11-02 17:49:20 +08:00
wangqiong123andGitea ed7c4c4e2a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 17:41:30 +08:00
18792927508 7a47907ac7 bug修改 2023-11-02 17:40:37 +08:00
wangqiong123andGitea 7649cf9326 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 16:11:19 +08:00
18792927508 85e9240eee 缴费详情报错修改 2023-11-02 16:11:00 +08:00
wangqiong123andGitea 5373f1fb42 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 15:36:30 +08:00
18792927508 eba2773a9d b 2023-11-02 15:34:32 +08:00
wangqiong123andGitea 178ff2a675 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 14:49:41 +08:00
18792927508 d1d1b70d9b 修改开庭时间时加短信通知 2023-11-02 14:49:18 +08:00
qtzandGitea fdbfcafb81 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 13:50:52 +08:00
qitz 53e8ea4137 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-02 13:48:38 +08:00
qitz 69da111d75 修改用印位置 2023-11-02 13:48:12 +08:00
wangqiong123andGitea 2c20dec85e Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 11:21:29 +08:00
18792927508 2db715840f bug修改 2023-11-02 11:21:12 +08:00
qtzandGitea 55a78b3658 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-02 11:13:05 +08:00
qitz 51b6f6e782 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-02 11:09:32 +08:00
qitz a7073733a6 修改签名用印功能 2023-11-02 11:08:45 +08:00
hejinboandGitea 4391566b55 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 18:06:27 +08:00
hejinbo f4f7153278 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-01 18:05:01 +08:00
hejinbo 790419b95d 改bug 2023-11-01 18:04:48 +08:00
wangqiong123andGitea 7c40d648b6 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 16:35:49 +08:00
18792927508 674c5ca914 发送房间号短信 2023-11-01 16:35:23 +08:00
wangqiong123andGitea 96113abc00 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 14:29:35 +08:00
18792927508 b959e3b909 导入修改 2023-11-01 14:29:16 +08:00
qtzandGitea 05d3a1da2e Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 14:17:58 +08:00
qitz 74a09ac92c Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-01 14:15:37 +08:00
qitz 82691055e6 修改更新立案申请状态 2023-11-01 14:15:21 +08:00
qtzandGitea b5fb2f1243 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 14:02:48 +08:00
qitz ea94880fff Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-11-01 14:00:13 +08:00
qitz 6a49e0199f 修改部门功能 2023-11-01 13:59:47 +08:00
hejinboandGitea 428d69383a Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 11:38:39 +08:00
hejinbo 314a687943 优化 2023-11-01 11:37:57 +08:00
wangqiong123andGitea 4052fdf03a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 11:07:10 +08:00
18792927508 a3a7d39da3 导入新增日志 2023-11-01 11:06:44 +08:00
hejinboandGitea 341be38f87 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-11-01 09:23:00 +08:00
hejinbo 8e82f8eaa2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-11-01 09:19:10 +08:00
hejinbo 106ccce871 书面审理接口修改 2023-11-01 09:18:40 +08:00
hejinbo 2238224e83 10.31开发 2023-10-31 19:15:46 +08:00
wangqiong123andGitea 32d15e0d48 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-31 16:03:11 +08:00
18792927508 daf7621503 法律顾问查询 2023-10-31 16:01:54 +08:00
wangqiong123andGitea 5c13015bde Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-31 15:29:13 +08:00
18792927508 7b6c459070 修改案件证据 2023-10-31 15:28:32 +08:00
wangqiong123andGitea a21acab67d Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-31 15:19:39 +08:00
18792927508 5851ec7b70 1 2023-10-31 15:18:57 +08:00
qtzandGitea 9dab3261d6 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-31 14:54:36 +08:00
qitz 7c1f59d651 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-31 14:51:32 +08:00
qitz cc35c03cee 优化修改开庭时间 2023-10-31 14:51:08 +08:00
qtzandGitea 8089efb9b7 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-31 13:31:05 +08:00
qitz 0c8910512a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-31 13:27:25 +08:00
qitz c980aac78c 修改查询进度 2023-10-31 13:26:55 +08:00
wangqiong123andGitea 580901e91c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-31 09:11:22 +08:00
18792927508 1467549b05 视频代码 2023-10-31 09:10:55 +08:00
qtzandGitea d453471fca Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-30 20:10:40 +08:00
qitz 3a7687b31c Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-30 20:07:00 +08:00
qitz 0cda870fbd 实现机构认证功能 2023-10-30 20:06:38 +08:00
wangqiong123andGitea 5d91ed144f Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-30 16:00:04 +08:00
18792927508 1110f5edcd bug修改 2023-10-30 15:56:34 +08:00
hejinboandGitea d31d363c44 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-30 15:55:07 +08:00
hejinbo ac68c446fc 解决bug 2023-10-30 15:53:58 +08:00
hanchaoboandGitea 8d1190ce28 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-28 12:01:58 +08:00
18792927508 d993b57a09 文件录制 2023-10-28 11:50:32 +08:00
hejinboandGitea 6865b437a5 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-27 16:32:50 +08:00
18792927508 2515d5dbfd 视频录制 2023-10-27 16:24:42 +08:00
qtzandGitea 99b7649364 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-27 10:01:26 +08:00
qitz 9e16fc1b1a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-27 09:58:13 +08:00
qitz 8c950a2fd1 修改发邮件功能 2023-10-27 09:57:41 +08:00
hejinboandGitea 0d96ba00b8 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-26 16:17:47 +08:00
hejinbo 1e7019cba9 解决bug 2023-10-26 16:15:56 +08:00
hejinboandGitea 84a19396bf Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-26 15:42:01 +08:00
hejinbo ce64d7f203 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-26 15:38:20 +08:00
hejinbo 2ae2155808 10.26开发 2023-10-26 15:38:16 +08:00
qtzandGitea 1bed0a2259 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-26 15:08:24 +08:00
qitz b5c2bb391c 实现记录发送邮件功能 2023-10-26 15:04:27 +08:00
wangqiong123andGitea 1090aa0dbd Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-25 17:08:39 +08:00
18792927508 d3c1778bc3 导入时被申请人出生年月日校验 2023-10-25 17:07:48 +08:00
hejinboandGitea c0c35306ef Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-25 17:07:07 +08:00
hejinbo 524fdd2675 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-25 16:57:01 +08:00
hejinbo ec20f9d7d5 10.25开发 2023-10-25 16:56:37 +08:00
qtzandGitea 833a24354e Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-25 16:50:46 +08:00
qitz e8c3f5a6d6 修改日志查询功能 2023-10-25 16:48:15 +08:00
wangqiong123andGitea 56831390b1 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-25 14:42:14 +08:00
18792927508 353b78d5cf 部门代码修改 2023-10-25 14:41:30 +08:00
qtzandGitea da39527ffb Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-25 14:21:45 +08:00
qitz c5c7b7ba9f Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-25 14:18:18 +08:00
qitz 49197586a4 优化导入压缩包功能 2023-10-25 14:17:57 +08:00
wangqiong123andGitea d739a44862 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-25 11:02:03 +08:00
18792927508 be624b638d 部分Bug修改 2023-10-25 11:01:37 +08:00
hejinboandGitea 729cb9120d Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-24 17:31:02 +08:00
hejinbo e0fe19ebcb 更新代码 2023-10-24 17:30:08 +08:00
hejinbo f682811fdb Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-24 17:24:19 +08:00
hejinbo 16cbd67b01 获取证据目录列表 2023-10-24 17:23:58 +08:00
wangqiong123andGitea 6285269078 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-24 16:54:48 +08:00
18792927508 6f5e8e23aa 被申请人查看案件 2023-10-24 16:54:24 +08:00
qtzandGitea fff2eaabaa Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-24 16:38:41 +08:00
qitz d1f7a12fca 实现解析压缩包 2023-10-24 16:34:51 +08:00
qitz f7738d4515 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-24 14:12:01 +08:00
qitz f776276eb5 优化解压缩功能 2023-10-24 14:11:42 +08:00
hejinboandGitea c6e667bb0f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-24 10:37:19 +08:00
hejinbo befa62e69f 增加证据目录字段 2023-10-24 10:36:41 +08:00
qitz 5012cedd7b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-24 10:26:09 +08:00
qitz 437b672446 实现解析压缩包功能 2023-10-24 10:25:37 +08:00
wangqiong123andGitea 1199f2fef0 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-24 10:12:29 +08:00
18792927508 0482a516ac 1 2023-10-24 10:11:58 +08:00
wangqiong123andGitea cd252fddd9 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-24 10:03:51 +08:00
18792927508 f1a1ba8bab 管理员角标数量修改 2023-10-24 10:03:09 +08:00
hejinboandGitea 7a37d11f4f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-24 09:57:01 +08:00
hejinbo 2261a549f8 返回生成的自增id 2023-10-24 09:56:10 +08:00
hejinboandGitea 0c6e6b1231 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-23 17:57:43 +08:00
hejinbo beb9e212f4 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-23 17:56:26 +08:00
hejinbo ca768ad0d6 10.23开发 2023-10-23 17:54:51 +08:00
wangqiong123andGitea 5d2a97cac6 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-23 16:09:21 +08:00
18792927508 723440a37e 查询修改开庭时间 2023-10-23 16:08:51 +08:00
wangqiong123andGitea 8fd1eef2d1 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-23 15:10:44 +08:00
18792927508 d4871f4a2f 审核仲裁方式改为单个操作 2023-10-23 15:10:21 +08:00
wangqiong123andGitea 6d9074feb5 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-21 20:21:25 +08:00
18792927508 91da9b96b8 案件批量功能
导入优化
2023-10-21 20:20:42 +08:00
wangqiong123andGitea d3da2fabe8 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-20 17:13:36 +08:00
18792927508 39bce7bd62 1 2023-10-20 17:13:12 +08:00
wangqiong123andGitea 65c641403c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-20 16:27:10 +08:00
18792927508 190273ba21 案件批量操作修改 2023-10-20 16:26:31 +08:00
wangqiong123andGitea 9e46b3068f Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-20 15:45:45 +08:00
18792927508 d660edc670 案件批量操作 2023-10-20 15:43:44 +08:00
wangqiong123andGitea 32fb164ef9 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-20 14:48:22 +08:00
18792927508 3d36f05cf9 锁定,解锁案件 2023-10-20 14:47:58 +08:00
qtzandGitea c2c4d71d37 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-20 14:15:29 +08:00
qitz e30c10941d Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-20 14:13:33 +08:00
qitz 05e70343a8 实现修改开庭时间接口 2023-10-20 14:13:11 +08:00
qtzandGitea 8ba2c50a6d Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-19 15:22:13 +08:00
qitz 9fe0b621c2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-19 15:19:13 +08:00
qitz e54f4f0b70 实现案件进度查询 2023-10-19 15:18:46 +08:00
wangqiong123andGitea 73797bb610 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-19 15:15:47 +08:00
18792927508 2d658af62e 日志修改 2023-10-19 15:15:20 +08:00
wangqiong123andGitea e1d866292c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-19 14:06:22 +08:00
18792927508 3cc72198d9 导入时提示修改,删除附件接口 2023-10-19 14:05:15 +08:00
wangqiong123andGitea 29cc4e7af1 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-19 10:47:54 +08:00
18792927508 3f17c3a7ee 批量上传案件证据 2023-10-19 10:47:35 +08:00
wangqiong123andGitea 728d6267df Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-19 09:52:47 +08:00
18792927508 699a69f1e9 确认缴费详情返回缴费凭证 2023-10-19 09:52:26 +08:00
wangqiong123andGitea b7ba367b70 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-18 19:28:00 +08:00
18792927508 54ee01cb77 角色查询案件 2023-10-18 19:27:31 +08:00
wangqiong123andGitea e8a02fbe2f Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-18 18:23:25 +08:00
18792927508 ff637782cb 角色案件查询 2023-10-18 18:22:44 +08:00
18792927508 ac27737aa5 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into wq 2023-10-18 18:20:46 +08:00
18792927508 7980d2880d 代码冲突解决 2023-10-18 18:19:14 +08:00
wangqiong123andGitea 0e8580143b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-18 18:14:27 +08:00
18792927508 1c6544fea7 合并 2023-10-18 18:11:00 +08:00
qtzandGitea 23e29a282e Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-18 18:06:42 +08:00
18792927508 10f7fffe10 合并 2023-10-18 18:04:31 +08:00
qitz 50e9b5fb9d 实现重新生成裁决书 2023-10-18 18:03:27 +08:00
qitz 4a2dc3a2ec Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-18 14:32:25 +08:00
qitz 732d426d72 修改生成裁决书功能 2023-10-18 14:32:03 +08:00
hejinboandGitea 61f24aeefc Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-18 13:51:57 +08:00
hejinbo 2d3b08d027 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb
# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/CaseAffiliate.java
2023-10-18 13:50:38 +08:00
qtzandGitea e39b2ce087 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-18 10:47:31 +08:00
qitz 3c5d45f4cf 优化生成裁决书接口 2023-10-18 10:45:08 +08:00
hejinbo 953410c5df 暂存 2023-10-18 10:22:10 +08:00
18792927508 ad4f1aecb2 角色案件查询 2023-10-18 10:19:49 +08:00
hejinbo 163b99c7b1 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-18 09:54:43 +08:00
qitz 6d748b8920 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-17 22:22:42 +08:00
qitz 3530aacf64 优化生成裁决书功能 2023-10-17 22:21:38 +08:00
qitz 5b46ee97b1 优化生成裁决书功能 2023-10-17 22:20:38 +08:00
wangqiong123andGitea 96a0983441 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 21:08:31 +08:00
18792927508 305529fefc 短信验证码 2023-10-17 21:07:53 +08:00
qtzandGitea 5d2fdedfcf Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 18:58:51 +08:00
qitz 1cd7aa9ea4 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-17 18:56:48 +08:00
qitz 1a8403423e 修改生成庭审笔录功能 2023-10-17 18:56:35 +08:00
hejinbo eff4c740aa 10.17开发 2023-10-17 18:27:21 +08:00
wangqiong123andGitea b31a7c93da Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 17:13:16 +08:00
18792927508 7f5ea8ad2c 发送短信修改 2023-10-17 17:12:54 +08:00
hejinboandGitea ba0caceb04 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 16:52:56 +08:00
hejinbo fe536eb7b5 优化 2023-10-17 16:52:09 +08:00
hejinboandGitea a3c3c6608f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 16:08:54 +08:00
qtzandGitea 48e502b1a1 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 16:05:40 +08:00
qitz 5612aa2f84 1 2023-10-17 16:00:02 +08:00
hejinbo d026e0f7ea Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-17 15:59:11 +08:00
hejinbo 41387c58d4 暂存 2023-10-17 15:59:04 +08:00
qitz 6ace1d3102 优化立案申请功能 2023-10-17 15:30:21 +08:00
wangqiong123andGitea 89c428ee4b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 15:04:37 +08:00
18792927508 6dd8762dc1 查询 2023-10-17 15:03:48 +08:00
18792927508 bc1579ef95 查询修改 2023-10-17 14:29:06 +08:00
wangqiong123andGitea a262b3cc4b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 13:50:39 +08:00
18792927508 371284d360 查询 2023-10-17 13:50:15 +08:00
wangqiong123andGitea 4ee0dda38c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 12:20:20 +08:00
18792927508 b5555698e8 1 2023-10-17 12:19:47 +08:00
wangqiong123andGitea b71228a24a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-17 11:47:47 +08:00
18792927508 b54af26e42 待办数量查询 2023-10-17 11:47:11 +08:00
hejinbo 2104c70e25 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-17 09:27:37 +08:00
wangqiong123andGitea 7778d2b721 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-16 20:44:52 +08:00
18792927508 9cd49c8109 根据角色查询案件 2023-10-16 20:44:30 +08:00
wangqiong123andGitea 01a08d670a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-16 18:48:13 +08:00
18792927508 c8e5e745ce 新增修改案件申请代理人关系修改 2023-10-16 18:47:54 +08:00
wangqiong123andGitea e56942ee54 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-16 18:32:23 +08:00
18792927508 d7d9bb51b2 导入案件申请代理人修改 2023-10-16 18:31:56 +08:00
hejinbo 06e008e306 暂存 2023-10-16 17:20:44 +08:00
18792927508 2e91e53da7 小程序认证登录 2023-10-16 17:00:20 +08:00
18792927508 c80c801239 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into wq 2023-10-16 16:56:21 +08:00
qtzandGitea d4b560313c Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-16 15:40:05 +08:00
qitz 8a9eb6198d Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-16 15:37:38 +08:00
qitz cf5852e27b 优化立案申请类 2023-10-16 15:37:22 +08:00
qtzandGitea 7b940dc7b8 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-16 15:18:22 +08:00
qitz 0b280496b5 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-16 15:12:12 +08:00
qitz e9f7ed8480 修改立案申请功能 2023-10-16 15:11:33 +08:00
18792927508 588bf5678b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into wq 2023-10-15 23:09:41 +08:00
bgyandGitea 2fd71bfd6a Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 23:06:23 +08:00
gy b 5fa3e4b735 优化邮件发送功能 2023-10-15 23:04:41 +08:00
18792927508 94294ffd71 缴费详情 2023-10-15 23:01:57 +08:00
wangqiong123andGitea df8ed662e8 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 22:29:18 +08:00
18792927508 41660a5056 不区分权限案件查询 2023-10-15 22:28:44 +08:00
wangqiong123andGitea 969a4f09f8 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 20:03:58 +08:00
18792927508 4a6e28b629 缴费凭证修改 2023-10-15 20:01:40 +08:00
wangqiong123andGitea 8eddc035c5 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 18:55:03 +08:00
18792927508 26c90d4c32 合并 2023-10-15 18:53:25 +08:00
18792927508 c91bbf834a 合并文件 2023-10-15 18:50:54 +08:00
18792927508 913ca3547a 合并 2023-10-15 18:38:28 +08:00
wangqiong123andGitea 5906bbc9ec Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 18:29:57 +08:00
18792927508 b3b6d25d91 合并 2023-10-15 18:27:12 +08:00
qtzandGitea b323e88504 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 17:57:19 +08:00
qitz 775d7c0d56 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-15 17:55:07 +08:00
qitz 3def3b69dc 实现提交仲裁结果功能 2023-10-15 17:54:46 +08:00
qtzandGitea 9132518de4 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 15:56:49 +08:00
qitz c52adbde4b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-15 15:54:17 +08:00
qitz 870c514a15 实现生成庭审笔录接口 2023-10-15 15:53:37 +08:00
18792927508 2300df715c 案件列表修改,缴费确认 2023-10-15 15:51:41 +08:00
qtzandGitea 94b304d417 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-15 10:27:54 +08:00
qitz c64b709e33 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-15 10:17:07 +08:00
qitz 6b56829d92 实现生成庭审笔录 2023-10-15 10:16:48 +08:00
bgyandGitea 2a40d552e3 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 19:25:25 +08:00
gy b 032c7bfca1 优化报错代码 2023-10-13 19:24:52 +08:00
bgyandGitea 01d86180a9 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 18:28:04 +08:00
gy b edfd847318 整合最新的代码 2023-10-13 18:25:51 +08:00
gy b 36ad2c9ecd Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-13 15:26:32 +08:00
gy b ce01c9366a 取消部门接口权限校验 2023-10-13 15:20:50 +08:00
wangqiong123andGitea a74345ea5f Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 15:13:56 +08:00
18792927508 b7b46f1350 跳转微信小程序接口 2023-10-13 15:13:32 +08:00
hejinboandGitea c21e092c89 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 15:01:10 +08:00
hejinbo 867ce2d4ba Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb
# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CaseApplicationServiceImpl.java
2023-10-13 15:00:24 +08:00
hejinbo 0a16acb362 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb
# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/mapper/SealSignRecordMapper.java
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CaseApplicationServiceImpl.java
#	ruoyi-system/src/main/resources/mapper/wisdomarbitrate/SealSignRecordMapper.xml
2023-10-13 14:52:00 +08:00
wangqiong123andGitea 9a59fac610 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 14:35:57 +08:00
18792927508 f20736282b 合并代码及跳转小程序 2023-10-13 14:35:24 +08:00
qtzandGitea 08a6e72cc2 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 14:07:42 +08:00
qitz 16bfd769aa Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-13 14:05:37 +08:00
qitz 3c22cec221 优化定时查询接口 2023-10-13 14:05:12 +08:00
wangqiong123andGitea a583b2b195 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 13:33:14 +08:00
18792927508 bf92e05cbe 房间号短信id修改 2023-10-13 13:32:48 +08:00
hejinbo 7a2a662c5f 审核裁决书接口优化 2023-10-13 13:27:14 +08:00
qtzandGitea e4fa622b71 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 11:18:53 +08:00
qitz d6da8ddd2f Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-13 11:17:07 +08:00
qitz 8306ae0f39 优化签名记录 2023-10-13 11:16:55 +08:00
qtzandGitea 616be649b5 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 11:11:44 +08:00
qitz a0ecc6bd69 1 2023-10-13 11:09:10 +08:00
qitz 3dcf07881a 查询流程状态 2023-10-13 10:57:45 +08:00
hejinbo 4d4276847b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-13 10:38:50 +08:00
hejinbo c7fad71ae2 暂存 2023-10-13 10:38:42 +08:00
wangqiong123andGitea dbc73da777 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-13 09:05:00 +08:00
18792927508 b28a16dcea bug修改 2023-10-13 09:04:29 +08:00
bgyandGitea cf73d6e338 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 20:12:42 +08:00
gy b dcb1139a6a 修改数据库配置 2023-10-12 20:11:09 +08:00
hejinboandGitea 52e0baa614 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 18:22:51 +08:00
hejinbo ede7c4452d Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb
# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/mapper/SealSignRecordMapper.java
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CaseApplicationServiceImpl.java
#	ruoyi-system/src/main/resources/mapper/wisdomarbitrate/SealSignRecordMapper.xml
2023-10-12 18:20:58 +08:00
hejinbo 0ee4c53252 10.12开发 2023-10-12 18:12:12 +08:00
qtzandGitea a9c86dc6dc Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 17:52:08 +08:00
qitz 12ed3200a2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3
# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CaseApplicationServiceImpl.java
2023-10-12 17:48:23 +08:00
qitz 23614f7e9c 1 2023-10-12 17:44:17 +08:00
wangqiong123andGitea 40b623024c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 17:33:54 +08:00
18792927508 be6ec797c7 申请人发送短信名称修改 2023-10-12 17:32:43 +08:00
wangqiong123andGitea 35556e2acd Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 17:24:40 +08:00
18792927508 72d02890b0 给仲裁员发短信修改 2023-10-12 17:23:15 +08:00
qitz bcc07b181d 实现定时查询流程详情 2023-10-12 17:20:40 +08:00
wangqiong123andGitea 00f6ad1417 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 16:11:32 +08:00
18792927508 3398f0db3d 仲裁员改为和用户关联 2023-10-12 16:10:53 +08:00
hejinbo 3262548b25 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-12 13:59:10 +08:00
wangqiong123andGitea 08bb2af98e Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 13:53:54 +08:00
18792927508 8b3c5a3741 1 2023-10-12 13:53:01 +08:00
qtzandGitea bb642be13b Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 13:39:34 +08:00
qitz b2621ace43 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-12 13:37:15 +08:00
qitz 2a6a1b50af 修改签名功能 2023-10-12 13:36:59 +08:00
hejinbo 5a17ed48ae Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-12 13:35:35 +08:00
qtzandGitea c4fa3466a7 Merge branch 'qtz3' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 13:15:43 +08:00
qitz f9230eacc8 实现签名功能 2023-10-12 13:12:54 +08:00
qitz 2101dddcc6 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz3 2023-10-12 13:02:01 +08:00
hejinbo 9c6303addb 暂存 2023-10-12 11:42:12 +08:00
wangqiong123andGitea 8ec8971f2a Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-12 11:18:52 +08:00
18792927508 2158a9ee48 bug修改 2023-10-12 11:17:48 +08:00
18792927508 26bdf8f577 日志查询优化 2023-10-12 09:25:46 +08:00
bgyandGitea e8785fd5b2 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 19:56:00 +08:00
gy b d5fed7fdce Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-11 19:54:46 +08:00
gy b 8ceaf7478c 优化小程序查询案件列表接口 2023-10-11 19:54:13 +08:00
bgyandGitea 80b4d6c91b Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 19:26:11 +08:00
gy b b741879d5a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-11 19:17:04 +08:00
gy b 5e0a84ae10 优化实名认证记录存储SQL 2023-10-11 19:14:55 +08:00
bgyandGitea b89a6ea218 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 18:13:17 +08:00
gy b 69e6b062d7 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-11 18:11:57 +08:00
gy b d40fbccf24 新增人脸核身解密功能 2023-10-11 18:11:32 +08:00
wangqiong123andGitea 5cddef6000 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 17:34:46 +08:00
18792927508 382615570f 缴费确认查询接口修改 2023-10-11 17:33:23 +08:00
wangqiong123andGitea 324c7234f8 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 16:41:08 +08:00
18792927508 24f15d8236 批量导入文件校验 2023-10-11 16:40:40 +08:00
hejinboandGitea 13ac2ef8ba Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 14:26:26 +08:00
hejinbo 3994ca3e77 档案详情接口开发 2023-10-11 14:25:15 +08:00
gy b 87eb8c6cdf Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-11 12:22:13 +08:00
gy b 9aa2ff00eb 优化腾讯人脸核身相关接口 2023-10-11 12:21:09 +08:00
hejinbo fdc27a38e2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-11 12:02:57 +08:00
wangqiong123andGitea f745fdd0aa Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 12:02:47 +08:00
18792927508 4c93945eaf 根据机构id查询案件列表 2023-10-11 11:54:57 +08:00
18792927508 ec864b2b8e 案件日志查询,案件查询 2023-10-11 11:48:33 +08:00
hejinbo f7fcfb3193 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-11 11:47:47 +08:00
hejinbo adf87c8ec2 暂存 2023-10-11 11:47:26 +08:00
wangqiong123andGitea aa2e6af52c Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 11:32:13 +08:00
18792927508 e09da313e0 案件日志 2023-10-11 11:31:35 +08:00
gy b 4b8a127cd2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-11 09:25:52 +08:00
bgyandGitea 90578ca29e Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-11 09:23:18 +08:00
wangqiong123andGitea f7fe71a2d5 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 22:42:12 +08:00
18792927508 fd4a156e25 日志注解简单开发 2023-10-10 22:41:40 +08:00
gy b 5bacc37dd7 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-10 21:25:50 +08:00
gy b a7b7ea826f 优化接口权限 2023-10-10 21:25:29 +08:00
wangqiong123andGitea 0c6b0a2bae Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 20:54:23 +08:00
18792927508 01fd6157e1 查询组织机构修改 2023-10-10 20:53:40 +08:00
wangqiong123andGitea e382c59b6b Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 19:38:32 +08:00
18792927508 373486d54a 关联组织机构修改 2023-10-10 19:37:55 +08:00
gy b d802c83135 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-10 19:31:53 +08:00
wangqiong123andGitea b0d77ea3e4 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 19:24:05 +08:00
18792927508 e1422ce1c8 新增导入立案修改 2023-10-10 19:23:27 +08:00
gy b e296be59b9 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-10 18:31:44 +08:00
bgyandGitea d1093d9717 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 18:27:24 +08:00
gy b 2b3a0d30c7 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-10 18:26:14 +08:00
hejinboandGitea f7b599e200 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 18:25:22 +08:00
gy b af901190b9 接口加入列表和按钮权限 2023-10-10 18:25:15 +08:00
hejinbo db5a2e44e6 1、 获取文件上传地址 ,2、 上传文件流 ,3、 查询文件上传状态 2023-10-10 18:23:45 +08:00
wangqiong123andGitea 9d166377cb Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 17:48:30 +08:00
18792927508 f0f65d0cf0 发送房间号修改 2023-10-10 17:47:12 +08:00
wangqiong123andGitea 2eed2bd0a9 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 16:56:34 +08:00
18792927508 a43ded3a85 跳过token 2023-10-10 16:54:51 +08:00
hejinboandGitea 0fe872e42f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 16:23:19 +08:00
hejinbo 4d4ab28c40 获取文件上传地址 2023-10-10 16:22:24 +08:00
wangqiong123andGitea 35ca824390 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 16:02:05 +08:00
18792927508 62f1e3111d 案件导入修改
发送房间号短信接口
2023-10-10 16:00:34 +08:00
qtzandGitea 7b6bca31ba Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-10 12:15:41 +08:00
qitz 07704327ab Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-10-10 12:13:32 +08:00
qitz db885dfcc8 优化身份认证接口 2023-10-10 12:13:12 +08:00
hejinbo 2d86bbb5e8 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-10 08:59:15 +08:00
bgyandGitea 6db0bbc341 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-09 22:54:42 +08:00
gy b 5ec64621fe 修改时区为上海时区 2023-10-09 22:53:50 +08:00
bgyandGitea 8b60af90ab Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-09 22:11:53 +08:00
gy b a4c1cad581 优化创建时间时区
优化送达接口传参
2023-10-09 22:10:23 +08:00
hejinbo d323fa69af Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-10-09 18:18:09 +08:00
hejinbo 56b4d3fcfc 用印模拟接口开发 2023-10-09 18:18:04 +08:00
hejinboandGitea a9af3ebdbb Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-09 17:37:40 +08:00
hejinbo 4618bfbc4e 10.9开发 2023-10-09 17:36:17 +08:00
wangqiong123andGitea 4c190bd9a7 Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-09 17:15:18 +08:00
18792927508 7bc9b1d4cb 案件批量导入修改 2023-10-09 17:13:46 +08:00
wangqiong123andGitea df98af33ba Merge branch 'wq' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-09 15:52:02 +08:00
18792927508 464bf5c428 查询案件列表时改为创建时间和案件编号倒序,防止批量导入时创建时间一致 2023-10-09 15:00:08 +08:00
18792927508 62878cb969 新增案件或者批量导入时自动生成案件编号 2023-10-09 14:38:30 +08:00
18792927508 0f7b9842bb Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into wq 2023-10-09 14:02:25 +08:00
qtzandGitea 1cce787e62 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-09 13:58:44 +08:00
qitz 3dc4ad7433 优化新增立案申请接口 2023-10-09 13:55:34 +08:00
18792927508 9644ae737d 修改案件信息或者批量导入时自动计算应缴费用 2023-10-09 13:54:57 +08:00
18792927508 7eb500d071 编辑案件资料,修改申请人案件证据bug修改
批量导入案件模板增加申请人仲裁诉求字段
缴费单详情页面返回申请人字段
2023-10-09 09:05:51 +08:00
hejinbo 848581e155 10.8开发 2023-10-08 16:56:30 +08:00
hejinbo 80e9814cd6 10.7开发 2023-10-07 19:00:15 +08:00
qtzandGitea 2374e69b06 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-07 06:33:25 +08:00
qitz 6f892e90b9 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-10-07 06:30:28 +08:00
qitz fb4fefb697 优化裁决书签名功能 2023-10-07 06:30:08 +08:00
qtzandGitea 056d3e103d Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-06 17:43:15 +08:00
qitz ef6973ff50 实现裁决书签名功能 2023-10-06 17:40:06 +08:00
bgyandGitea bb1f5f61ab Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-05 20:37:11 +08:00
gy b f291935cc3 处理合并冲突 2023-10-05 20:36:22 +08:00
gy b 05ece42912 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into bgy 2023-10-05 20:28:41 +08:00
qtzandGitea 8e18e5d16c Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-05 20:23:40 +08:00
qitz 69ffd18af6 实现查询申请状态接口 2023-10-05 20:19:57 +08:00
gy b ba49e0e018 优化上上签个人用户注册
新增查询用户注册状态功能
2023-10-05 20:03:21 +08:00
bgyandGitea 061afe4cf4 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-05 12:27:23 +08:00
gy b 7afc024819 新增上上签个人用户注册功能 2023-10-05 12:25:52 +08:00
qtzandGitea 66ac29f692 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-10-03 13:44:28 +08:00
qitz f5d460eb80 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-10-03 13:41:34 +08:00
qitz 3a8b23f482 实现身份认证功能 2023-10-03 13:40:56 +08:00
hejinboandGitea 9b78889f25 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-30 14:01:46 +08:00
hejinbo 3ac8143589 9.30开发 2023-09-30 14:00:07 +08:00
hejinboandGitea 7e8d1f3d06 Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-27 15:40:50 +08:00
hejinbo 1e5dc3670f 9.27开发 2023-09-27 15:38:24 +08:00
hejinbo 42d28ea80f Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-27 15:34:34 +08:00
hejinbo 2a147f119e 暂存 2023-09-27 15:33:53 +08:00
qtzandGitea 5e07c8010f Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-27 15:20:39 +08:00
qitz c484a45822 优化立案申请功能 2023-09-27 15:17:28 +08:00
qitz 724d723cdc Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-27 13:28:53 +08:00
qitz 626ec17b45 实现身份认证功能 2023-09-27 13:28:32 +08:00
hejinbo c60ad9f3fc 暂存 2023-09-26 15:40:00 +08:00
qtzandGitea 9367e66432 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-26 15:29:59 +08:00
qitz 657ddb761a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-26 15:27:46 +08:00
qitz 9622060ac6 修改新增立案申请功能 2023-09-26 15:27:31 +08:00
hejinbo f0bab6a368 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-26 15:08:18 +08:00
hejinbo 3fc79deee0 暂存 2023-09-26 15:07:15 +08:00
qtzandGitea 32a0937e84 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-26 14:58:28 +08:00
qitz e97418f979 实现立案申请上传附件功能 2023-09-26 14:52:17 +08:00
hejinbo 3be770a718 9.25修复问题改动代码 2023-09-25 17:21:18 +08:00
hejinboandGitea d52ecca5dc Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-23 10:56:32 +08:00
hejinbo 3132a52f2a Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-23 10:51:33 +08:00
hejinbo b4549fa2cc 问题修复 2023-09-23 10:51:08 +08:00
qtzandGitea 672e85fe22 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-22 17:08:12 +08:00
qitz da742f7dc7 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-22 17:03:56 +08:00
qitz 1f6c743356 修改立案申请流程功能 2023-09-22 17:03:26 +08:00
hejinbo 5a0d1dbe0b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-22 15:10:22 +08:00
qtzandGitea 12a40e76d9 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-22 15:01:29 +08:00
qitz b4e37d6c8b Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-22 14:59:29 +08:00
qitz 441dc6f8db 修改案件列表功能 2023-09-22 14:59:02 +08:00
hejinbo 76847fafb1 暂时保存 2023-09-22 14:43:39 +08:00
hejinbo be7004adc8 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-21 19:32:29 +08:00
qtzandGitea 538d8eaede Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-21 19:28:38 +08:00
qitz cf93e86a0c Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-21 19:26:16 +08:00
qitz 411d0e9ad9 实现身份认证查询 2023-09-21 19:25:50 +08:00
hejinbo a23b662332 9.21日开发提交 2023-09-21 19:16:12 +08:00
qtzandGitea b8290279fc Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-21 11:22:54 +08:00
qitz 23b9caa8f2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-21 11:19:01 +08:00
qitz 361f283a15 立案审查提交接口 2023-09-21 11:18:15 +08:00
hejinbo 34867898b9 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-20 19:55:15 +08:00
qtzandGitea 42459eca60 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-20 19:51:47 +08:00
qitz 66d4c9ef0e Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-20 19:50:11 +08:00
qitz ada0e3740a 审核裁决书功能 2023-09-20 19:49:51 +08:00
hejinbo c8d1054640 9.20日开发提交 2023-09-20 19:22:14 +08:00
hejinbo 0d6a9dd348 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-20 19:19:06 +08:00
qtzandGitea 17e58da34d Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-20 18:30:06 +08:00
qitz f515f18ac5 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-20 18:28:14 +08:00
qitz cc0004bab9 优化仲裁结果保存功能 2023-09-20 18:28:00 +08:00
hejinbo 347ab0cb5d Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-20 18:03:07 +08:00
qtzandGitea 8004470a07 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-20 17:59:08 +08:00
qitz b36eec08aa Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-20 17:57:11 +08:00
qitz 5e9a002cd1 优化校验仲裁结果 2023-09-20 17:56:53 +08:00
hejinbo bee394b8c2 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-20 17:46:18 +08:00
qtzandGitea dbd0715c69 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-20 16:54:49 +08:00
qitz f5d55707a9 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-20 16:53:01 +08:00
qitz a5fd491e6c 优化仲裁结果 2023-09-20 16:51:43 +08:00
hejinbo 8766ec4639 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-20 16:10:29 +08:00
hejinbo 273f40bb86 1 2023-09-20 16:10:03 +08:00
qtzandGitea 71a6f04ce0 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-20 15:57:19 +08:00
qitz b6663dc604 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-20 15:54:24 +08:00
qitz 35991eed9f 仲裁结果功能开发 2023-09-20 15:53:56 +08:00
qtzandGitea 4431065e8f Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-19 21:12:19 +08:00
qitz e33e3c5569 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-19 21:09:45 +08:00
qitz 9eae44bc89 组庭确认开发 2023-09-19 21:09:21 +08:00
hejinbo 6485807346 9.19开发提交 2023-09-19 18:57:56 +08:00
qtzandGitea 236358c237 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-19 14:44:46 +08:00
qitz 704a35f473 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-19 14:42:48 +08:00
qitz b47e4899a1 案件质证功能优化 2023-09-19 14:42:31 +08:00
qtzandGitea dd48e1f458 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-19 14:37:13 +08:00
qitz 3fb9bf8f90 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-19 14:34:03 +08:00
qitz 88696a2d0e 案件质证功能 2023-09-19 14:31:17 +08:00
hejinboandGitea 0611cac92f Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-19 11:47:53 +08:00
hejinbo 4135d1096c 案件状态常量引用修改 2023-09-19 11:46:23 +08:00
hejinbo 6945dfd7b1 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-19 11:36:02 +08:00
qtzandGitea c74f16a418 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-19 11:27:04 +08:00
qitz 6917827348 优化功能 2023-09-19 11:24:22 +08:00
qitz cf251ebd28 解决冲突 2023-09-19 11:07:58 +08:00
qitz c5054948f1 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-19 10:48:33 +08:00
qitz 32856e223a 组庭接口优化 2023-09-19 10:13:16 +08:00
hejinbo 9c95738251 证据查询优化路径 2023-09-18 21:45:44 +08:00
bgyandGitea 08b6413634 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-18 20:47:08 +08:00
gy b f62373675d 优化静态文件访问的问题 2023-09-18 20:45:59 +08:00
hejinboandGitea 695aff6bce Merge branch 'hjb' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-18 19:54:39 +08:00
hejinbo 1a4ffa5bee 截止9.18开发更新提交 2023-09-18 19:50:04 +08:00
qtzandGitea 14075b3f3f Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-18 18:19:15 +08:00
qitz 49d611b971 案件日志列表功能 2023-09-18 18:15:34 +08:00
hejinbo 5311b1dc3d 9.18开发提交 2023-09-18 15:33:40 +08:00
hejinbo 6548f00ab0 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-18 09:05:04 +08:00
hejinbo 1e362973a5 确认证据,短信功能 2023-09-18 09:04:50 +08:00
qitz 7959deea83 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-16 18:20:43 +08:00
qitz 8c4094706d 案件日志功能开发 2023-09-16 18:20:19 +08:00
bgyandGitea 25c201b472 Merge branch 'bgy' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-15 20:07:24 +08:00
gy b 04d9172cce 解决静态路径问题 2023-09-15 20:06:01 +08:00
hejinbo 113d5b99bb 9.14更新后提交 2023-09-14 19:58:21 +08:00
qtzandGitea 857ae6a0a1 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-14 18:54:41 +08:00
hejinbo 3028291cce 截止9.14开发 2023-09-14 18:42:55 +08:00
qitz 891c67f39f 立案申请组庭功能开发 2023-09-14 18:40:44 +08:00
hejinbo 30d6828707 证据上传接口开发 2023-09-13 19:08:38 +08:00
hejinbo 60d2b490c2 缴费及缴费确认接口开发 2023-09-12 18:38:39 +08:00
hejinbo aa351abd15 缴费接口开发一 2023-09-11 18:17:17 +08:00
hejinbo 67ccbbd4f7 Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into hjb 2023-09-11 14:46:14 +08:00
hejinbo b4fb054a7f 111 2023-09-11 14:45:44 +08:00
qtzandGitea d38737f642 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-11 14:36:31 +08:00
qitz b43f38c9dd Merge branch 'dev' of http://git.xayunmei.com/SH-Arbitrate/Arbitrate-Backend into qtz 2023-09-11 14:29:38 +08:00
qitz 5662d2f2f5 立案申请功能 2023-09-11 14:29:15 +08:00
hejinbo 4d2d8b0976 对接支付开发 2023-09-09 16:50:34 +08:00
hejinbo 362d433bb3 修改配置文件 2023-09-08 13:54:53 +08:00
277 changed files with 32779 additions and 265 deletions
+59
View File
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.8.6</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>pay</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.7.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.12</version>
</dependency>
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.4.7</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.34.8.ALL</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,32 @@
package com.ruoyi;
/**
* 业务回调处理接口
*/
public interface CallBackService {
/**
* 成功支付--处理业务逻辑
* @param orderSn 订单号
*/
void successPay(String orderSn);
/**
* 失败支付-处理业务逻辑
* @param orderSn 订单号
*/
void failPay(String orderSn);
/**
* 退款成功-处理业务逻辑
* @param orderSn 订单号
*/
void successRefund(String orderSn);
/**
* 退款失败-处理业务逻辑
* @param orderSn 订单号
*/
void failRefund(String orderSn);
}
@@ -0,0 +1,66 @@
package com.ruoyi;
import com.ruoyi.dto.*;
import com.ruoyi.exceptions.TradeException;
public interface ElegentPay {
/**
* 统一下单接口
* @param payRequest 支付请求
* @param tradeType 交易类型
* @param platform 平台
* @return 支付响应
* @throws TradeException
*/
PayResponse requestPay(PayRequest payRequest, String tradeType, String platform) throws TradeException;
/**
* 关闭订单
* @param orderSn 订单号
* @param platform 平台
* @return 是否成功关闭订单
* @throws TradeException
*/
Boolean closePay(String orderSn, String platform) throws TradeException;
/**
* 退款
* @param refundRequest 退款请求封装对象
* @param platform 平台
* @return 是否成功退款
* @throws TradeException
*/
Boolean refund(RefundRequest refundRequest, String platform) throws TradeException;
/**
* 根据订单号查询订单
* @param orderSn 订单号
* @param platform 平台
* @return 查询响应对象
* @throws TradeException
*/
QueryResponse queryTradingOrderNo(String orderSn , String platform) throws TradeException;
/**
* 查询单笔退款API
* @param orderSn 订单号
* @param platform 平台
* @return 查询退款响应对象
* @throws TradeException
*/
QueryRefundResponse queryRefundTrading(String orderSn , String platform) throws TradeException;
/**
* 获得openID
* @param code
* @return
*/
public String getOpenid(String code, String platform);
}
@@ -0,0 +1,40 @@
package com.ruoyi.ali;
import com.ruoyi.key.KeyManager;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 支付宝权限对接类
*/
@Component
@ConfigurationProperties("elegent.pay.alipay")
@Data
public class AlipayConfig {
/**
* 应用识别码
*/
private String appId;
/**
* 密钥加密方式 RSA2
*/
@Value("${elegent.pay.alipay.charset:RSA2}")
private String signType;
@Autowired
private KeyManager keyManager;
public String getPrivateKey(){
return keyManager.getKey("alipay_private.key");
}
public String getPublicKey(){
return keyManager.getKey("alipay_public.key");
}
}
@@ -0,0 +1,30 @@
package com.ruoyi.ali;
import java.util.HashMap;
import java.util.Map;
/**
* ZFBConstant
* @description 支付宝相关的常量
*/
public class AlipayConstant {
public static final String SUCCESS = "SUCCESS";
public static final String FAIL = "FAIL";
/**
* 交易状态(用于转换)
*/
public static final Map<String,String> TRADE_STATE = new HashMap<String,String>(){
{
put("TRADE_SUCCESS", "SUCCESS");
put("WAIT_BUYER_PAY", "NOTPAY");
put("TRADE_CLOSED", "CLOSED");
put("TRADE_FINISHED", "FINISHED");
}
};
public static final String domain="https://openapi.alipay.com/gateway.do";
}
@@ -0,0 +1,461 @@
package com.ruoyi.ali;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.ruoyi.CallBackService;
import com.ruoyi.annotation.TradePlatform;
import com.ruoyi.config.CallbackConfig;
import com.ruoyi.constant.PayConstant;
import com.ruoyi.constant.Platform;
import com.ruoyi.constant.TradeType;
import com.ruoyi.core.ElegentTrade;
import com.ruoyi.dto.*;
import com.ruoyi.exceptions.TradeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Map;
/**
* 支付宝支付的策略类
* @author wgl
*/
@Service
@TradePlatform(Platform.ALI)
@Slf4j
public class AlipayElegentTrade implements ElegentTrade {
@Autowired
private AlipayConfig alipayConfig;
@Autowired
private CallbackConfig callbackConfig;
@Autowired
private CallBackService callBackService;
/**
* 获取回调地址
* @return
*/
private String getPayNotifyUrl(){
return callbackConfig.getDomain()+ PayConstant.CALLBACK_PATH+ PayConstant.NOTIFY +"/"+ Platform.ALI;
}
/**
* 获取退款回调
* @return
*/
private String getRefundNotifyUrl(){
return callbackConfig.getDomain()+ PayConstant.CALLBACK_PATH+ PayConstant.REFUND_NOTIFY +"/"+ Platform.ALI;
}
/**
* 创建支付订单
* @param payRequest
* @return
* @throws TradeException
*/
@Override
public PayResponse requestPay(PayRequest payRequest, String tradeType) throws TradeException {
if(TradeType.NATIVE.equals( tradeType )){
return createNativeOrder(payRequest);
}
if(TradeType.JSAPI.equals( tradeType )){
return createJsApiOrder(payRequest);
}
if(TradeType.H5.equals( tradeType )){
return createH5Order(payRequest);
}
if(TradeType.APP.equals( tradeType )){
return createAPPOrder(payRequest);
}
return createNativeOrder(payRequest);
}
/**
* 本地支付(扫码)
* https://opendocs.alipay.com/open/194/106078?ref=api#预下单
* @param payRequest
* @return
* @throws TradeException
*/
private PayResponse createNativeOrder(PayRequest payRequest) throws TradeException {
try {
AlipayClient alipayClient = getAliHttpClient();
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setNotifyUrl(getPayNotifyUrl());
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", payRequest.getOrderSn());
//转换
//String totalFee= BigDecimal.valueOf(payRequest.getTotalFee()).divide(new BigDecimal(100) ).toString();
bizContent.put("total_amount", fenToYuan(payRequest.getTotalFee()));
bizContent.put("subject", payRequest.getBody());
request.setBizContent(bizContent.toString());
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
PayResponse payResponse =new PayResponse();
payResponse.setSuccess(true);
payResponse.setCode_url(response.getQrCode()); //本地支付二维码
payResponse.setOrder_sn(payRequest.getOrderSn());
return payResponse;
} else {
log.error("调用失败");
return null;
}
}catch (Exception e){
e.printStackTrace();
throw new TradeException("订单创建失败,订单号:"+ payRequest.getOrderSn());
}
}
/**
* 小程序
* https://opendocs.alipay.com/mini/03l5wn
* @param payRequest
* @return
* @throws TradeException
*/
private PayResponse createJsApiOrder(PayRequest payRequest) throws TradeException {
AlipayClient alipayClient = getAliHttpClient();
try {
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setNotifyUrl(getPayNotifyUrl());
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", payRequest.getOrderSn());
bizContent.put("total_amount", fenToYuan( payRequest.getTotalFee() ));
bizContent.put("subject", payRequest.getBody());
bizContent.put("buyer_id", payRequest.getOpenid());
bizContent.put("timeout_express", "10m");
request.setBizContent(bizContent.toString());
AlipayTradeCreateResponse response = alipayClient.sdkExecute(request);
if (response.isSuccess()) {
PayResponse payResponse =new PayResponse();
payResponse.setSuccess(true);
payResponse.setPrepay_id(response.getTradeNo());
payResponse.setOrder_sn(response.getOutTradeNo());
return payResponse;
} else {
log.error("调用失败");
return null;
}
}catch (Exception e){
throw new TradeException("订单创建失败,订单号:"+ payRequest.getOrderSn());
}
}
/**
* H5
* https://opendocs.alipay.com/mini/03l5wn
* @param payRequest
* @return
* @throws TradeException
*/
private PayResponse createH5Order(PayRequest payRequest) throws TradeException {
AlipayClient alipayClient = getAliHttpClient();
try {
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setNotifyUrl(getPayNotifyUrl());
request.setReturnUrl("");
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", payRequest.getOrderSn());
bizContent.put("total_amount", fenToYuan( payRequest.getTotalFee() ));
bizContent.put("subject", payRequest.getBody());
bizContent.put("product_code", "QUICK_WAP_WAY");
request.setBizContent(bizContent.toString());
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
PayResponse payResponse =new PayResponse();
payResponse.setSuccess(true);
payResponse.setPrepay_id(response.getTradeNo());
payResponse.setOrder_sn(response.getOutTradeNo());
return payResponse;
} else {
log.error("调用失败");
return null;
}
}catch (Exception e){
throw new TradeException("订单创建失败,订单号:"+ payRequest.getOrderSn());
}
}
/**
* APP
* https://opendocs.alipay.com/open/02e7gq?ref=api&scene=20
* @param payRequest
* @return
* @throws TradeException
*/
private PayResponse createAPPOrder(PayRequest payRequest) throws TradeException {
AlipayClient alipayClient = getAliHttpClient();
try {
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl(getPayNotifyUrl());
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", payRequest.getOrderSn());
bizContent.put("total_amount", fenToYuan( payRequest.getTotalFee() ));
bizContent.put("subject", payRequest.getBody());
bizContent.put("product_code", "QUICK_MSECURITY_PAY");
request.setBizContent(bizContent.toString());
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if (response.isSuccess()) {
PayResponse payResponse =new PayResponse();
payResponse.setSuccess(true);
payResponse.setPrepay_id(response.getTradeNo());
payResponse.setOrder_sn(response.getOutTradeNo());
return payResponse;
} else {
log.error("调用失败");
return null;
}
}catch (Exception e){
throw new TradeException("订单创建失败,订单号:"+ payRequest.getOrderSn());
}
}
/**
* 关闭订单
* @param orderSn
* @return
* @throws TradeException
*/
@Override
public Boolean closePay(String orderSn) throws TradeException {
try {
AlipayClient alipayClient = getAliHttpClient();
AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("trade_no", orderSn);
request.setBizContent(bizContent.toString());
AlipayTradeCloseResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
log.info("调用成功");
return true;
} else {
log.error("调用失败");
return false;
}
}catch (Exception e){
throw new TradeException("订单关闭失败,订单号:"+orderSn);
}
}
/**
* 退款接口
* alipay.trade.refund(统一收单交易退款接口)
* https://opendocs.alipay.com/open/02ekfk
* @param refundRequest
* @return
* @throws TradeException
*/
@Override
public Boolean refund(RefundRequest refundRequest) throws TradeException {
try {
AlipayClient alipayClient = getAliHttpClient();
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setNotifyUrl(getRefundNotifyUrl()); //退款回调
JSONObject bizContent = new JSONObject();
bizContent.put("refund_amount", fenToYuan(refundRequest.getRefundAmount() ));
bizContent.put("out_trade_no", refundRequest.getOrderSn());
//退款请求号,做幂等性校验
if(refundRequest.getRequestNo()!=null){
bizContent.put("out_request_no", refundRequest.getRequestNo());
}else{
bizContent.put("out_request_no", refundRequest.getOrderSn());
}
request.setBizContent(bizContent.toString());
AlipayTradeRefundResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
if("Y".equals(response.getFundChange())) {
log.info("退款成功{}",refundRequest.getOrderSn());
callBackService.successRefund(refundRequest.getOrderSn());
return true;
}else{
//退款失败
log.error("退款失败{}",refundRequest.getOrderSn());
callBackService.failRefund(refundRequest.getOrderSn());
return false;
}
} else {
log.error("退款调用失败{}",refundRequest.getOrderSn());
return false;
}
}catch (Exception e){
e.printStackTrace();
throw new TradeException("订单退款失败,订单号:"+ refundRequest.getOrderSn());
}
}
/**
* 查询单笔交易订单
* 参考官网: https://opendocs.alipay.com/open/02e7gm?ref=api#请求示例
*
* @param orderSn
* @return
* @throws TradeException
*/
@Override
public QueryResponse queryTradingOrderNo(String orderSn) throws TradeException {
AlipayClient alipayClient = getAliHttpClient();
try {
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", orderSn);
request.setBizContent(bizContent.toString());
AlipayTradeQueryResponse response = alipayClient.execute(request);
QueryResponse queryResponse=new QueryResponse();
queryResponse.setOrder_sn(orderSn );
if (response.isSuccess()) {
queryResponse.setTransaction_id( response.getTradeNo() );
queryResponse.setTrade_state(AlipayConstant.TRADE_STATE.get( response.getTradeStatus()) );//交易状态
//int total = BigDecimal.valueOf(Double.valueOf(response.getTotalAmount())).multiply(new BigDecimal(100)).intValue();
queryResponse.setTotal( yuanToFen(response.getTotalAmount()) ); //总金额
//int buyer_pay_amount = BigDecimal.valueOf(Double.valueOf(response.getBuyerPayAmount())).multiply(new BigDecimal(100)).intValue();
//queryResponse.setPayer_total( yuanToFen(response.getBuyerPayAmount()) );//支付金额
queryResponse.setOpenid( response.getBuyerUserId());
Map map = JSON.parseObject(response.getBody(), Map.class ) ;
queryResponse.setExpand(map);//全部数据
return queryResponse;
} else {
queryResponse.setTrade_state("NOTPAY");
return queryResponse;
}
}catch (Exception e){
e.printStackTrace();
//throw new TradeException("订单查询失败,订单号:"+orderSn);
return null;
}
}
/**
* 查询退款订单
* @param orderSn
* @return
* @throws TradeException
*/
@Override
public QueryRefundResponse queryRefundTrading(String orderSn) throws TradeException {
try {
AlipayClient alipayClient = getAliHttpClient();
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_request_no", orderSn);
request.setBizContent(bizContent.toString());
AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()) {
log.info("调用成功");
Map map = JSON.parseObject(response.getBody(), Map.class );
QueryRefundResponse queryRefundResponse=new QueryRefundResponse();
queryRefundResponse.setOrder_sn( (String) map.get("out_trade_no") );
queryRefundResponse.setTransaction_id( (String) map.get("trade_no") );
queryRefundResponse.setTotal( (Integer) map.get("total_amount") ); //总金额
//queryRefundResponse.setPayer_total( (Integer) map.get("total_amount") );//支付金额
queryRefundResponse.setRefund((Integer) map.get("refund_amount") ); //退款金额
queryRefundResponse.setRefund_id((String) map.get("trade_no") ); //退款单号
queryRefundResponse.setOut_refund_no( (String) map.get("out_request_no") );//退款订单号
//queryRefundResponse.setChannel( (String) map.get("channel") ); //通道
//queryRefundResponse.setUser_received_account( (String) map.get("user_received_account") ); //账号
queryRefundResponse.setStatus( (String) map.get("refund_status") ); //状态
queryRefundResponse.setSuccess_time( (String) map.get("gmt_refund_pay") );
//queryRefundResponse.setCreate_time( (String) map.get("gmt_refund_pay") );
queryRefundResponse.setExpand(map);
return queryRefundResponse;
} else {
log.error("调用失败");
return null;
}
}catch (Exception e){
e.printStackTrace();
//throw new TradeException("退款订单查询失败,订单号:"+ orderSn);
return null;
}
}
@Override
public String getOpenid(String code) {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
alipayConfig.getAppId(), alipayConfig.getPrivateKey(), "json", "utf-8", alipayConfig.getPublicKey(), alipayConfig.getSignType());
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode(code);
request.setGrantType("authorization_code");
try {
AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
return oauthTokenResponse.getUserId();
} catch (AlipayApiException e) {
//处理异常
e.printStackTrace();
return "";
}
}
/**
* 获取支付宝连接
* 参考官网:https://opendocs.alipay.com/open/01csp3?ref=api#公钥模式加签
* 公钥模式加签
* @return
*/
private AlipayClient getAliHttpClient(){
try {
com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();
alipayConfig.setServerUrl(AlipayConstant.domain);
alipayConfig.setAppId(this.alipayConfig.getAppId());
alipayConfig.setPrivateKey(this.alipayConfig.getPrivateKey());
alipayConfig.setFormat("json");
alipayConfig.setCharset("utf-8");
alipayConfig.setAlipayPublicKey(this.alipayConfig.getPublicKey());
alipayConfig.setSignType(this.alipayConfig.getSignType());
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
return alipayClient;
}catch (Exception e){
e.printStackTrace();
throw new TradeException("支付宝支付--初始化,校验系统参数失败");
}
}
/**
* 分转换为元
* @param fen
* @return
*/
private String fenToYuan(int fen){
//转换为元
return BigDecimal.valueOf(fen).divide(new BigDecimal(100) ).toString();
}
private int yuanToFen(String yuan){
return BigDecimal.valueOf(Double.valueOf(yuan)).multiply(new BigDecimal(100)).intValue();
}
}
@@ -0,0 +1,124 @@
package com.ruoyi.ali;
import com.alipay.api.internal.util.AlipaySignature;
import com.ruoyi.annotation.TradePlatform;
import com.ruoyi.constant.Platform;
import com.ruoyi.core.ElegentValid;
import com.ruoyi.dto.ValidResponse;
import com.ruoyi.exceptions.TradeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@Service
@TradePlatform(Platform.ALI)
@Slf4j
public class AlipayElegentValid implements ElegentValid {
@Autowired
private AlipayConfig alipayConfig;
/**
* 订单回调结果通知验签
* 参考代码: https://opendocs.alipay.com/open/194/103296?ref=api 异步返回结果的验签
* @param httpEntity
* @param httpRequest
* @return
*/
@Override
public ValidResponse validPay(HttpEntity<String> httpEntity, HttpServletRequest httpRequest) throws TradeException {
ValidResponse validResponse=new ValidResponse();
try {
Map<String, String> params = getParams(httpRequest);
//获取支付宝POST过来反馈信息,将异步通知中收到的待验证所有参数都存放到map中
//String body = httpEntity.getBody();
//调用SDK验证签名
//公钥验签示例代码
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getPublicKey(), "utf-8", alipayConfig.getSignType());
if (signVerified) {
validResponse.setValid(true);
validResponse.setOrderSn((String) params.get("out_trade_no"));
return validResponse;
} else {
validResponse.setValid(false);
validResponse.setOrderSn( (String) params.get("out_trade_no") );
return validResponse;
}
}catch (Exception e){
e.printStackTrace();
throw new TradeException("验签异常");
}
}
/**
* 退款结果通知验签
* 参考官网 https://opendocs.alipay.com/support/01ravh
* @param httpEntity
* @param httpRequest
* @return
* @throws TradeException
*/
@Override
public ValidResponse validRefund(HttpEntity<String> httpEntity, HttpServletRequest httpRequest) throws TradeException {
ValidResponse validResponse=new ValidResponse();
try {
//获取支付宝POST过来反馈信息,将异步通知中收到的待验证所有参数都存放到map中
Map<String, String> params = getParams(httpRequest);
//调用SDK验证签名
//公钥验签示例代码
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getPublicKey(), "utf-8", alipayConfig.getSignType());
if (signVerified) {
validResponse.setValid(true);
validResponse.setOrderSn( (String) params.get("out_trade_no") );
return validResponse;
} else {
validResponse.setValid(false);
validResponse.setOrderSn( (String) params.get("out_trade_no") );
return validResponse;
}
}catch (Exception e){
e.printStackTrace();
validResponse.setValid(false);
return validResponse;
}
}
private Map<String,String> getParams(HttpServletRequest httpServletRequest){
Map<String,String> params = new HashMap< String , String >();
Map requestParams = httpServletRequest.getParameterMap();
for(Iterator iter = requestParams.keySet().iterator(); iter.hasNext();){
String name = (String)iter.next();
String[] values = (String [])requestParams.get(name);
String valueStr = "";
for(int i = 0;i < values.length;i ++ ){
valueStr = (i==values.length-1)?valueStr + values [i]:valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put (name,valueStr);
}
log.info("params:{}",params);
return params;
}
@Override
public String successResult() {
return AlipayConstant.SUCCESS;
}
@Override
public String failResult() {
return AlipayConstant.FAIL;
}
}
@@ -0,0 +1,20 @@
package com.ruoyi.annotation;
import java.lang.annotation.*;
/**
* create by: wgl
* desc: 自定义支付平台注解,支付平台 微信:wx 支付宝:zfb
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface TradePlatform {
/**
* 平台的id
* Platform.WX
* @return
*/
String value();
}
@@ -0,0 +1,23 @@
package com.ruoyi.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 微信权限对接类
*/
@Component
@ConfigurationProperties("elegent.pay.callback")
@Data
public class CallbackConfig {
private String domain; //回调域名
@Value("${elegent.pay.callback.watch:false}")
private boolean watch; //是否开启监听
@Value("${elegent.pay.callback.cycle:10}")
private int cycle;//检查周期
}
@@ -0,0 +1,11 @@
package com.ruoyi.constant;
public class PayConstant {
public final static String CALLBACK_PATH = "/payCallBack";
public final static String NOTIFY = "/notify";
public final static String REFUND_NOTIFY = "/refund_notify";
}
@@ -0,0 +1,16 @@
package com.ruoyi.constant;
/**
* Platform
* 支付方式
*/
public class Platform {
/**
* 微信
*/
public final static String WX = "wxpay";
/**
* 支付宝
*/
public final static String ALI = "alipay";
}
@@ -0,0 +1,33 @@
package com.ruoyi.constant;
import lombok.Data;
/**
* 交易类型
*/
@Data
public class TradeType {
/**
* native(扫码)
*/
public final static String NATIVE = "native";
/**
* jsapi(小程序)
*/
public final static String JSAPI = "jsapi";
/**
* app
*/
public final static String APP = "app";
/**
* h5
*/
public final static String H5 = "h5";
}
@@ -0,0 +1,35 @@
package com.ruoyi.core;
import com.ruoyi.CallBackService;
import lombok.extern.slf4j.Slf4j;
/**
* 回调类
*/
@Slf4j
public class CallBackServiceImpl implements CallBackService {
@Override
public void successPay(String orderSn) {
log.info("支付成功回调!"+orderSn);
}
@Override
public void failPay(String orderSn) {
log.info("支付失败回调!"+orderSn);
}
@Override
public void successRefund(String orderSn) {
log.info("退款成功回调!"+orderSn);
}
@Override
public void failRefund(String orderSn) {
log.info("退款失败回调!"+orderSn);
}
}
@@ -0,0 +1,90 @@
package com.ruoyi.core;
import com.ruoyi.CallBackService;
import com.ruoyi.constant.PayConstant;
import com.ruoyi.dto.ValidResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* CallbackController
* @description 系统默认提供的微信回调的Controller
*/
@RestController
@Slf4j
@RequestMapping(PayConstant.CALLBACK_PATH)
public class CallbackController {
@Autowired
private CallBackService callBackService;
/**
* 系统提供的默认的微信回调的接口(支付回调)
* @param httpEntity
* @param response
* @return
*/
@RequestMapping( PayConstant.NOTIFY + "/{platform}")
public String notify(HttpEntity<String> httpEntity, HttpServletRequest request, HttpServletResponse response, @PathVariable("platform") String platform){
ElegentValid elegentValid = ElegentLoader.getElegentValid(platform); //获取验证器
try {
ValidResponse validResponse = elegentValid.validPay(httpEntity, request);//验证支付通知
String orderSn =validResponse.getOrderSn(); //订单号
if(validResponse.isValid()){ //返回码成功
callBackService.successPay(orderSn);
//返回成功消费
return elegentValid.successResult();
}else{
callBackService.failPay(orderSn);
return elegentValid.failResult();
}
}catch (Exception e){
log.error("支付回调处理失败",e);
//微信返回的状态非正常
return elegentValid.failResult();
}
}
/**
* 系统提供的默认的微信回调的接口(退款通知)
*
* @param httpEntity
* @param response
* @return
*/
@RequestMapping( PayConstant.REFUND_NOTIFY + "/{platform}")
public String refundNotify(HttpEntity<String> httpEntity, HttpServletRequest request, HttpServletResponse response,@PathVariable("platform") String platform) {
ElegentValid elegentValid = ElegentLoader.getElegentValid(platform); //获取验证器
try {
ValidResponse validResponse = elegentValid.validRefund(httpEntity, request);
String orderSn = validResponse.getOrderSn();
//订单号
if (validResponse.isValid()) { //返回码成功
callBackService.successRefund(orderSn);
//返回成功消费
return elegentValid.successResult();
} else {
callBackService.failRefund(orderSn);
return elegentValid.failResult();
}
} catch (Exception e) {
log.error("退款回调处理失败", e);
//微信返回的状态非正常
return elegentValid.failResult();
}
}
}
@@ -0,0 +1,73 @@
package com.ruoyi.core;
import com.ruoyi.CallBackService;
import com.ruoyi.ElegentPay;
import com.ruoyi.config.CallbackConfig;
import com.ruoyi.dto.QueryRefundResponse;
import com.ruoyi.dto.QueryResponse;
import com.ruoyi.dto.WatchDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Timer;
import java.util.TimerTask;
@Component
@ConditionalOnProperty(prefix = "elegent.pay.callback",name = "watch",havingValue = "true")
@Slf4j
public class CallbackWatch {
@Autowired
private CallBackService callBackService;
@Autowired
private CallbackConfig callbackConfig;
@Autowired
private ElegentPay elegentPay;
@PostConstruct
public void queryWatch(){
if(callbackConfig.getCycle()<=0){
return;
}
//log.info("开启支付结果定期巡检");
Timer timer = new Timer();
// 2、创建 TimerTask 任务线程
TimerTask task=new TimerTask() {
@Override
public void run() {
try{
//查询支付状态
//log.info("支付状态定期巡检,{}",WatchList.payList);
for( WatchDTO watchDTO: WatchList.payList ){
//查询订单是否支付成功
QueryResponse queryResponse = elegentPay.queryTradingOrderNo(watchDTO.getOrderSn(),watchDTO.getPlatform());
if("SUCCESS".equals(queryResponse.getTrade_state())){
callBackService.successPay(queryResponse.getOrder_sn());
WatchList.payList.remove(watchDTO );
}
}
//log.info("退款状态定期巡检,{}",WatchList.refundList);
//查询退款状态
for( WatchDTO watchDTO: WatchList.refundList ){
//查询退款中订单
QueryRefundResponse queryResponse = elegentPay.queryRefundTrading( watchDTO.getOrderSn(),watchDTO.getPlatform());
if("SUCCESS".equals(queryResponse.getStatus())){
callBackService.successRefund(queryResponse.getOrder_sn());
WatchList.refundList.remove(watchDTO);
}
}
}catch (Exception ex){
}
}
};
// 4、启动定时任务
timer.schedule(task, callbackConfig.getCycle()*1000, callbackConfig.getCycle()*1000);
}
}
@@ -0,0 +1,27 @@
package com.ruoyi.core;
import com.ruoyi.CallBackService;
import com.ruoyi.key.KeyManager;
import com.ruoyi.key.impl.DefaultKeyManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElegentConfig {
@Bean
@ConditionalOnMissingBean
public CallBackService callBackService(){
return new CallBackServiceImpl();
}
@Bean
@ConditionalOnMissingBean
public KeyManager keyManager(){
return new DefaultKeyManager();
}
}
@@ -0,0 +1,82 @@
package com.ruoyi.core;
import com.ruoyi.annotation.TradePlatform;
import com.ruoyi.exceptions.TradeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* PlatformLoader
* @description 第三方支付平台类加载器
* 服务启动的时候自动加载第三方支付组件
*/
@Component
@Slf4j
public class ElegentLoader implements ApplicationContextAware {
private static Map<String, ElegentTrade> elegentTradeMap = new HashMap<>();
private static Map<String, ElegentValid> elegentValidMap = new HashMap<>();
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//加载所有的交易实现类
Collection<ElegentTrade> elegentTrades = applicationContext.getBeansOfType(ElegentTrade.class).values();
elegentTrades.stream().forEach(e->{
//通过反射拿到类上的平台注解
TradePlatform annotation = e.getClass().getAnnotation(TradePlatform.class);
if (annotation != null) {
elegentTradeMap.put(annotation.value(), e);
}
});
//加载所有的验证实现类
Collection<ElegentValid> elegentValids = applicationContext.getBeansOfType(ElegentValid.class).values();
elegentValids.stream().forEach(e->{
//通过反射拿到类上的平台注解
TradePlatform annotation = e.getClass().getAnnotation(TradePlatform.class);
if (annotation != null) {
elegentValidMap.put(annotation.value(), e);
}
});
}
/**
* 根据平台id获取具体的第三方平台
* @param platform 平台id
* @return
*/
public static ElegentTrade getElegentTrade(String platform){
ElegentTrade elegentPayTemplate = elegentTradeMap.get(platform);
if(elegentPayTemplate!=null){
return elegentPayTemplate;
}else{
throw new TradeException("未找到适配的交易类型,交易平台id:"+platform);
}
}
/**
* 根据平台id获取具体的验证类
* @param platform 平台id
* @return
*/
public static ElegentValid getElegentValid(String platform){
ElegentValid elegentValidTemplate = elegentValidMap.get(platform);
if(elegentValidTemplate!=null){
return elegentValidTemplate;
}else{
throw new TradeException("未找到适配的交易类型,交易平台id:"+platform);
}
}
}
@@ -0,0 +1,136 @@
package com.ruoyi.core;
import com.ruoyi.ElegentPay;
import com.ruoyi.config.CallbackConfig;
import com.ruoyi.dto.*;
import com.ruoyi.exceptions.TradeException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* ElegentPayTemplate
* @description 统一模板 在模板层进行第三方平台的选择
*/
@Component
public class ElegentPayImpl implements ElegentPay {
@Autowired
private CallbackConfig callbackConfig;
/**
* 统一下单接口
* @param payRequest
* @return
*/
@Override
public PayResponse requestPay(PayRequest payRequest, String tradeType, String platform) throws TradeException {
//获取交易策略
PayResponse payResponse = getPlatFormService(platform).requestPay(payRequest, tradeType);
//加入监听列表
if(callbackConfig.isWatch()){
WatchDTO watchDTO=new WatchDTO();
watchDTO.setOrderSn(payRequest.getOrderSn());
watchDTO.setPlatform(platform);
WatchList.payList.add( watchDTO );
}
return payResponse;
}
/**
* 关闭订单
* @param orderSn
* @param platform
* @return
* @throws Exception
*/
@Override
public Boolean closePay(String orderSn, String platform) throws TradeException {
//调用对应第三方的创建订单接口
Boolean aBoolean = getPlatFormService(platform).closePay(orderSn);
//加入监听列表
if(callbackConfig.isWatch()){
WatchDTO watchDTO=new WatchDTO();
watchDTO.setOrderSn(orderSn);
watchDTO.setPlatform(platform);
WatchList.payList.remove( watchDTO );
}
return aBoolean;
}
/**
* 退款方法
* @param refundRequest
* @return
* @throws Exception
*/
@Override
public Boolean refund(RefundRequest refundRequest, String platform) throws TradeException {
Boolean refund = getPlatFormService(platform).refund(refundRequest);
//加入监听列表
if(callbackConfig.isWatch() && refund){
WatchDTO watchDTO=new WatchDTO();
watchDTO.setOrderSn(refundRequest.getRequestNo());
watchDTO.setPlatform(platform);
WatchList.refundList.add( watchDTO );
}
return refund;
}
/**
* 手动查询订单的方法
* 商户订单号查询 根据订单号查询订单
* 该接口基于生成的订单号来进行订单的查询
* 可以基于查询的结果判断用户订单是否支付成功
* @param orderSn
* @param Platform
* @return
* @throws Exception
*/
@Override
public QueryResponse queryTradingOrderNo(String orderSn , String Platform) throws TradeException {
//调用具体第三方的退款接口
return getPlatFormService(Platform).queryTradingOrderNo(orderSn);
}
/**
* 查询退款单号
*
* @return
* @throws Exception
*/
@Override
public QueryRefundResponse queryRefundTrading(String orderSn , String platform) throws TradeException {
//获取请求参数
return getPlatFormService(platform).queryRefundTrading(orderSn);
}
/**
* 获得openId
* @param code
* @param platform
* @return
*/
@Override
public String getOpenid(String code, String platform) {
return getPlatFormService(platform).getOpenid(code);
}
/**
* ====================================提供的模板类需要使用的方法=====================================
*/
/**
* 跟进具体内容获取实现类的方法
* @param platForm
* @return
*/
private ElegentTrade getPlatFormService(String platForm) {
return ElegentLoader.getElegentTrade(platForm);
}
}
@@ -0,0 +1,54 @@
package com.ruoyi.core;
import com.ruoyi.dto.*;
import com.ruoyi.exceptions.TradeException;
public interface ElegentTrade {
/**
* 单独的创建本地支付订单接口
* 该接口基于设计模式实现,对接了微信V3版支付代码和支付宝支付sdk
* 业务编写人员仅仅只需要准备好请求参数调用该方法即可完成下单请求
* @return 交易数据对象 包含有native支付的二维码+jsApi支付的支付组件
*/
PayResponse requestPay(PayRequest payRequest, String tradeType) throws TradeException;
/**
* 关闭订单
* 该结构基于设计模式实现,对接了微信V3版支付代码和支付宝支付sdk
* 业务编写人员在处理超时订单的时候需要 通知微信 由于是超时订单需要进行远程关闭
*/
Boolean closePay(String orderSn) throws TradeException;
/**
* 退款s申请
* 该接口基于设计模式实现,对接了微信V3版支付代码和支付宝支付sdk
* 业务编写人员在处理业务执行失败时需要进行退款
*/
Boolean refund(RefundRequest refundRequest) throws TradeException;
/**
* 商户订单号查询 根据订单号查询订单
* 该接口基于生成的订单号来进行订单的查询
* 可以基于查询的结果判断用户订单是否支付成功
*/
QueryResponse queryTradingOrderNo(String orderSn) throws TradeException;
/**
* 查询单笔退款API
*
*/
QueryRefundResponse queryRefundTrading(String orderSn) throws TradeException;
/**
* 获得openId
* @param code
* @return
*/
String getOpenid(String code);
}
@@ -0,0 +1,48 @@
package com.ruoyi.core;
import com.ruoyi.dto.ValidResponse;
import com.ruoyi.exceptions.TradeException;
import org.springframework.http.HttpEntity;
import javax.servlet.http.HttpServletRequest;
/**
* 验证器接口
*
*/
public interface ElegentValid {
/**
* 支付结果通知校验
* 该接口基于设计模式实现,对接了微信V3版支付代码和支付宝支付sdk
* 业务编写人员在接收到微信或支付宝回调的时候可以使用该方法验证回调是否成功,是否是伪回调
* @return 交易数据对象
*/
ValidResponse validPay(HttpEntity<String> httpEntity, HttpServletRequest request) throws TradeException;
/**
* 退款结果通知校验
* 该接口基于设计模式实现,对接了微信V3版支付代码和支付宝支付sdk
* 业务编写人员在接收到微信或支付宝回调的时候可以使用该方法验证回调是否成功,是否是伪回调
*/
ValidResponse validRefund(HttpEntity<String> httpEntity, HttpServletRequest request) throws TradeException;
/**
* 成功返回结构
* @return
*/
String successResult();
/**
* 失败返回内容
* @return
*/
String failResult();
}
@@ -0,0 +1,20 @@
package com.ruoyi.core;
import com.ruoyi.dto.WatchDTO;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* 监听列表
*/
public class WatchList {
public static CopyOnWriteArraySet<WatchDTO> payList=new CopyOnWriteArraySet<>(); //支付中列表
public static CopyOnWriteArraySet<WatchDTO> refundList=new CopyOnWriteArraySet<>(); //退款中列表
}
@@ -0,0 +1,20 @@
package com.ruoyi.dto;
import lombok.Data;
/**
* PayRequest
* 支付请求外观类
*/
@Data
public class PayRequest {
private String body;//商品描述
private String orderSn; //订单号
private int totalFee; //订单金额
private String openid;//openId
}
@@ -0,0 +1,29 @@
package com.ruoyi.dto;
import lombok.Data;
import java.util.Map;
/**
* 结果统一封装类
*/
@Data
public class PayResponse {
private boolean success; //是否成功
private String message;//信息
private String order_sn;//订单编号
private Map<String,String> expand;//扩展属性
private String code_url;//二维码连接(native返回)
private String prepay_id;//预支付Id(小程序返回)
private String h5_url;//支付跳转链接
private Map<String,String> jsapiData;//小程序返回
}
@@ -0,0 +1,24 @@
package com.ruoyi.dto;
import lombok.Data;
@Data
public class QueryRefundResponse extends QueryResponse{
private String refund_id; //微信支付退款单号
private String out_refund_no;//商户退款单号
private String channel;//退款渠道
private String user_received_account;//退款账号
private String success_time;//退款成功时间
private String status;//退款状态
private int refund;//退款金额
}
@@ -0,0 +1,25 @@
package com.ruoyi.dto;
import lombok.Data;
import java.util.Map;
/**
* 查询响应对象
*/
@Data
public class QueryResponse {
private String openid;//用户id
private String trade_state;//交易状态
private String order_sn;//订单号
private String transaction_id;//交易单号
private int total;//金额
private Map expand;//扩展(全部的返回数据)
}
@@ -0,0 +1,16 @@
package com.ruoyi.dto;
import lombok.Data;
@Data
public class RefundRequest {
private int totalFee; //订单金额
private int refundAmount; //退款金额
private String orderSn; //订单号
private String requestNo; //退款请求号,做退款幂等性校验,当部分退款时必须给出
}
@@ -0,0 +1,15 @@
package com.ruoyi.dto;
import lombok.Data;
/**
* 验证签名
*/
@Data
public class ValidResponse {
private boolean isValid;// 是否通过验签
private String orderSn;// 订单号
}
@@ -0,0 +1,12 @@
package com.ruoyi.dto;
import lombok.Data;
@Data
public class WatchDTO {
private String orderSn; //订单号
private String platform;//平台
}
@@ -0,0 +1,24 @@
package com.ruoyi.exceptions;
import lombok.Getter;
import lombok.Setter;
/**
* 交易SDK提供的总的异常
*/
@Getter
@Setter
public class TradeException extends RuntimeException{
private String code;
private String msg;
public TradeException(String code, String msg) {
super(msg);
this.code = code;
this.msg = msg;
}
public TradeException(String msg) {
super(msg);
}
}
@@ -0,0 +1,16 @@
package com.ruoyi.key;
/**
* 密钥管理器接口
*/
public interface KeyManager {
/**
* 根据名字获取key字符串
* @param name
* @return
*/
String getKey(String name);
}
@@ -0,0 +1,19 @@
package com.ruoyi.key.impl;
import com.ruoyi.key.KeyManager;
import com.ruoyi.util.FileUtil;
/**
* 默认的key管理器-文件管理器
*/
public class DefaultKeyManager implements KeyManager {
@Override
public String getKey(String name) {
return FileUtil.readToStr(name);
}
}
@@ -0,0 +1,37 @@
package com.ruoyi.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 文件读取类
*/
public class FileUtil {
/**
* 获取文件内容
* @param fileName
* @return
*/
public static String readToStr(String fileName){
InputStream is = FileUtil.class.getClassLoader().getResourceAsStream(fileName);
ByteArrayOutputStream os = new ByteArrayOutputStream(2048);
byte[] buffer = new byte[1024];
String str;
try {
int length;
while((length = is.read(buffer)) != -1) {
os.write(buffer, 0, length);
}
str = os.toString("UTF-8");
} catch (IOException var5) {
throw new IllegalArgumentException("无效的密钥", var5);
}
return str;
}
}
@@ -0,0 +1,459 @@
package com.ruoyi.wx;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.ruoyi.annotation.TradePlatform;
import com.ruoyi.config.CallbackConfig;
import com.ruoyi.constant.PayConstant;
import com.ruoyi.constant.Platform;
import com.ruoyi.core.ElegentTrade;
import com.ruoyi.dto.*;
import com.ruoyi.exceptions.TradeException;
import com.ruoyi.util.FileUtil;
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
@Component
@Slf4j
@TradePlatform(Platform.WX)
public class WxPayElegentTrade implements ElegentTrade {
@Autowired
private WxpayConfig wxpayConfig;
@Autowired
private CallbackConfig callbackConfig;
/**
* 创建微信支付订单方法
* 这里参考官网代码:
* https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml Native下单
* https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml JSAPI 下单
* https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_1.shtml H5下单
* https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml APP下单
* @param payRequest 支付请求
* @return 支付响应
* @throws IOException
*/
@Override
public PayResponse requestPay(PayRequest payRequest, String tradeType)throws TradeException {
PayResponse payResponse = new PayResponse(); //返回结果
try {
// 请求body参数构建
Map<String, Object> params = new HashMap<String, Object>() {
{
put("mchid", wxpayConfig.getMchId());
put("appid", wxpayConfig.getAppId());
put("notify_url", callbackConfig.getDomain()+ PayConstant.CALLBACK_PATH + PayConstant.NOTIFY +"/"+ Platform.WX );
put("out_trade_no", payRequest.getOrderSn());
put("amount", new HashMap<String, Object>() {
{
put("total", payRequest.getTotalFee());//金额,单位:分
put("currency", "CNY");//人民币
}
});
put("description", payRequest.getBody());
}
};
if("h5".equals(tradeType)){ //h5
params.put("scene_info", new HashMap<String, Object>() {
{
put("payer_client_ip", "127.0.0.1");
put("h5_info", new HashMap<String, Object>() {
{
put("type", "Wap");
}
});
}
});
}
if ("jsapi".equals(tradeType)) { //如果是小程序支付
params.put("payer", new HashMap<String, Object>() {
{
put("openid", payRequest.getOpenid());
}
});
}
String url = WxpayConstant.createOrder + tradeType; //创建订单
log.info("elegent-pay 请求参数{}",params);
Map<String, String> map = postApiTemplate(url, params);
if("SUCCESS".equals( map.get("code") )){
payResponse.setOrder_sn(payRequest.getOrderSn());
payResponse.setSuccess(true);
payResponse.setCode_url(map.get("code_url"));
payResponse.setMessage(map.get("message"));
payResponse.setPrepay_id(map.get("prepay_id"));
payResponse.setH5_url( map.get("h5_url") );
payResponse.setExpand(map); //全部数据
if("jsapi".equals(tradeType)){//如果是小程序,需要封装到Expand
Map<String, String> data=new HashMap<>();
String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
String nonceStr = IdUtil.simpleUUID();
String packages = "prepay_id=" + payResponse.getPrepay_id();
String privateKey = FileUtil.readToStr("wxpay_private.key");
String paySign = this.createPaySign(wxpayConfig.getAppId(), timeStamp, nonceStr, packages, privateKey);
data.put("appId", wxpayConfig.getAppId());// appid
data.put("timeStamp", timeStamp);// 时间戳
data.put("nonceStr", nonceStr);// 随机字符串
data.put("package","prepay_id="+payResponse.getPrepay_id());
data.put("signType", "RSA");// 签名类型,默认为RSA,仅支持RSA
data.put("paySign", paySign);// 签名
data.put("orderNo",payRequest.getOrderSn());
payResponse.setJsapiData(data);
}
log.info("createOrder: {}", payResponse);
}else{
payResponse.setSuccess(false);
payResponse.setMessage( map.get("message") );
}
return payResponse;
}catch (Exception e){
e.printStackTrace();
payResponse.setSuccess(false);
}
return payResponse;
}
/**
* 关闭订单
* 参考官网代码
* https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_2.shtml 3.2.5. 【服务端】关闭订单
* @return
*/
@Override
public Boolean closePay(String orderSn) throws TradeException {
// 请求body参数构建
Map<String, Object> params = new HashMap<String, Object>();
params.put("mchid", wxpayConfig.getMchId());
String url = WxpayConstant.closeOrder.replaceAll("\\{out_trade_no\\}",orderSn);
Map map = postApiTemplate(url, params);
if("SUCCESS".equals( map.get("code"))){
return true;
}else{
return false;
}
}
/**
* 退款
* 参考官网代码 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_9.shtml
* @param refundRequest
* @return
*/
@Override
public Boolean refund(RefundRequest refundRequest) {
// 请求body参数构建
// 请求body参数构建
Map<String, Object> params = new HashMap<String, Object>();
params.put("notify_url", callbackConfig.getDomain()+ PayConstant.CALLBACK_PATH +PayConstant.REFUND_NOTIFY +"/"+ Platform.WX ); //回调地址
params.put("out_trade_no", refundRequest.getOrderSn());//订单编号
//out_refund_no
params.put("out_refund_no", refundRequest.getRequestNo());//退款申请单编号 (多次退款需要不一样才行)
params.put("amount", new HashMap<String, Object>() {
{
put("refund",refundRequest.getRefundAmount());//退款金额
put("total", refundRequest.getTotalFee());//原金额,单位:分
put("currency", "CNY");//人民币
}
});
String url = WxpayConstant.refund; //创建订单
Map map = postApiTemplate(url, params);
if("SUCCESS".equals( map.get("code"))){
return true;
}else{
return false;
}
}
/**
* 手动查询订单
* 参考官网代码: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_6_2.shtml 3.2.4. 【服务端】查询订单
* @param orderSn
* @return
*/
@Override
public QueryResponse queryTradingOrderNo(String orderSn) throws TradeException {
// 请求body参数构建
Map<String, String> params = new HashMap<String, String>();
params.put("mchid", wxpayConfig.getMchId());
String url = WxpayConstant.queryOrderNo+orderSn;;
try {
Map map = getApiTemplate(url, params);
QueryResponse queryResponse=new QueryResponse();
queryResponse.setOrder_sn((String)map.get("out_trade_no") ); //订单号
queryResponse.setTransaction_id((String)map.get("transaction_id") ); //交易单类型
queryResponse.setTrade_state( (String) map.get("trade_state") );//交易状态
Map amount = (Map)map.get("amount");
if(amount!=null){
queryResponse.setTotal( (Integer) amount.get("total") ); //总金额
}
Map payer= (Map)map.get("payer");
if(payer!=null){
queryResponse.setOpenid( (String)payer.get("openid") );
}
queryResponse.setExpand(map);//全部数据
return queryResponse;
} catch (URISyntaxException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 查询退款订单
* https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_10.shtml
* @param out_refund_no
* @return
* @throws TradeException
*/
@Override
public QueryRefundResponse queryRefundTrading(String out_refund_no) throws TradeException {
// 请求body参数构建
Map<String, String> params = new HashMap<String, String>();
String url = WxpayConstant.queryRufundOrderNo + out_refund_no;
try {
Map map = getApiTemplate(url, params);
QueryRefundResponse queryRefundResponse=new QueryRefundResponse();
queryRefundResponse.setOrder_sn( (String) map.get("out_trade_no") );
queryRefundResponse.setTransaction_id( (String) map.get("transaction_id") );
Map amount = (Map)map.get("amount");
queryRefundResponse.setTotal( (Integer) amount.get("total") ); //总金额
queryRefundResponse.setRefund((Integer) amount.get("payer_refund") ); //退款金额
queryRefundResponse.setRefund_id((String) map.get("refund_id") ); //退款单号
queryRefundResponse.setOut_refund_no( (String) map.get("out_refund_no") );//退款订单号
queryRefundResponse.setChannel( (String) map.get("channel") ); //通道
queryRefundResponse.setUser_received_account( (String) map.get("user_received_account") ); //账号
queryRefundResponse.setStatus( (String) map.get("status") ); //状态
queryRefundResponse.setSuccess_time( (String) map.get("success_time") );
queryRefundResponse.setExpand(map);
return queryRefundResponse;
} catch (URISyntaxException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public String getOpenid(String code) {
String getOpenIdUrl = "https://api.weixin.qq.com/sns/jscode2session?" +
"appid="+wxpayConfig.getAppId()
+"&secret="+wxpayConfig.getAppSecret()
+"&js_code="+code+"&grant_type=authorization_code";
RestTemplate restTemplate = new RestTemplate();
String respResult = restTemplate.getForObject(getOpenIdUrl,String.class);
log.info("获取openid的url:{},respResult:{}",getOpenIdUrl,respResult);
if( respResult==null || "".equals(respResult) ) return "";
try{
Map<String,String> map = JSON.parseObject(respResult, Map.class);
String errorCode = map.get("errcode") ;
if(errorCode!=null && !"".equals(errorCode)){
int errorCodeInt = Integer.valueOf(errorCode).intValue();
log.info("获取openid的errorCode,{}",errorCodeInt);
if(errorCodeInt != 0) return "";
}
return map.get("openid");
}catch (Exception ex){
ex.printStackTrace();
return "";
}
}
private Map getApiTemplate(String url, Map<String, String> params) throws URISyntaxException, IOException {
URIBuilder uriBuilder = new URIBuilder(url);
//添加参数
for (String key : params.keySet()) {
uriBuilder.addParameter(key, params.get(key));
}
//完成签名并执行请求
HttpGet httpGet = new HttpGet(uriBuilder.build());
httpGet.addHeader("Accept", "application/json");
CloseableHttpClient httpClient = getWxHttpClient();
CloseableHttpResponse response = httpClient.execute(httpGet);
return responseTemplate(response);
}
private Map responseTemplate(CloseableHttpResponse response) {
Map result = null;
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) { //处理成功
// log.info("success,return body = " + EntityUtils.toString(response.getEntity()));
result = JSON.parseObject(EntityUtils.toString(response.getEntity()), Map.class);
result.put("code", "SUCCESS");
} else if (statusCode == 204) { //处理成功,无返回Body
log.info("success");
result = new HashMap<String, Object>() {
{
put("code", "SUCCESS");
}
};
} else {
String returnBody = EntityUtils.toString(response.getEntity());
log.error("failed,resp code = " + statusCode + ",return body = " + returnBody);
//throw new TradeException("创建本地支付订单失败!"+payDTO.getOrderSn());
Map<String, String> map = JSON.parseObject(returnBody, Map.class);
result = new HashMap<String, Object>() {
{
put("code", "FAIL");
put("message", map.get("message"));
}
};
}
} catch (Exception e) {
result = new HashMap<String, Object>() {
{
put("code", "FAIL");
put("message", e.getMessage());
}
};
} finally {
closeConnect(response);
return result;
}
}
private Map postApiTemplate(String url, Map<String, Object> params) {
try {
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(JSON.toJSONString(params));
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpPost.setHeader("Accept", "application/json");
//完成签名并执行请求
CloseableHttpClient httpClient = getWxHttpClient();
CloseableHttpResponse response = httpClient.execute(httpPost);
return responseTemplate( response );
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 获取微信HTTP连接
*
* @return
*/
private CloseableHttpClient getWxHttpClient() {
try {
//这里对秘钥进行加密使用的完全是官网上的代码
//TODO 参考官网代码 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_6_2.shtml
// 加载商户私钥(privateKey:私钥字符串)
String key = FileUtil.readToStr("wxpay_private.key");
PrivateKey merchantPrivateKey = PemUtil
.loadPrivateKey(new ByteArrayInputStream(key.getBytes("utf-8")));
// 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
//PrivateKey merchantPrivateKey = keyManager.getPrivateKey("wxpay_private.key");//读取私钥
PrivateKeySigner privateKeySigner = new PrivateKeySigner(wxpayConfig.getMchSerialNo(), merchantPrivateKey);
WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(
wxpayConfig.getMchId(), privateKeySigner);
// 向证书管理器增加需要自动更新平台证书的商户信息
CertificatesManager certificatesManager = CertificatesManager.getInstance();
certificatesManager.putMerchant(wxpayConfig.getMchId(), wechatPay2Credentials, wxpayConfig.getApiV3Key().getBytes("utf-8"));
// 初始化httpClient
return WechatPayHttpClientBuilder.create()
.withMerchant(wxpayConfig.getMchId(), wxpayConfig.getMchSerialNo(), merchantPrivateKey)
.withValidator(new WechatPay2Validator(certificatesManager.getVerifier(wxpayConfig.getMchId()))).build();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("微信支付--初始化,校验系统参数失败");
}
}
/**
* 关闭资源
*/
private void closeConnect(CloseableHttpResponse response) {
try {
response.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("资源回收出错");
}
}
/**
* 创建支付签名
* @param appid
* @param timeStamp
* @param nonceStr
* @param packages
* @param privateKey
* @return
* @throws Exception
*/
private String createPaySign(String appid, String timeStamp, String nonceStr, String packages,String privateKey) throws Exception {
Signature sign = Signature.getInstance("SHA256withRSA");
// 加载商户私钥
PrivateKey key = PemUtil
.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes(CharsetUtil.CHARSET_UTF_8)));
sign.initSign(key);
String message = StrUtil.format("{}\n{}\n{}\n{}\n",
appid,
timeStamp,
nonceStr,
packages);
sign.update(message.getBytes());
return Base64.getEncoder().encodeToString(sign.sign());
}
}
@@ -0,0 +1,153 @@
package com.ruoyi.wx;
import com.alibaba.fastjson.JSON;
import com.ruoyi.annotation.TradePlatform;
import com.ruoyi.constant.Platform;
import com.ruoyi.core.ElegentValid;
import com.ruoyi.dto.ValidResponse;
import com.ruoyi.exceptions.TradeException;
import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager;
import com.wechat.pay.contrib.apache.httpclient.notification.Notification;
import com.wechat.pay.contrib.apache.httpclient.notification.NotificationHandler;
import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.util.Map;
@Component
@Slf4j
@TradePlatform(Platform.WX)
public class WxPayElegentValid implements ElegentValid {
@Autowired
private WxpayConfig wxpayConfig;
@Override
public ValidResponse validPay(HttpEntity<String> httpEntity, HttpServletRequest httpServletRequest) throws TradeException {
ValidResponse validResponse=new ValidResponse();
try {
//获取请求头
HttpHeaders headers = httpEntity.getHeaders();
//构建微信请求数据对象
NotificationRequest request = new NotificationRequest.Builder()
.withSerialNumber(headers.getFirst("Wechatpay-Serial")) //证书序列号(微信平台)
.withNonce(headers.getFirst("Wechatpay-Nonce")) //随机串
.withTimestamp(headers.getFirst("Wechatpay-Timestamp")) //时间戳
.withSignature(headers.getFirst("Wechatpay-Signature")) //签名字符串
.withBody(httpEntity.getBody())
.build();
//微信通知的业务处理
//验证签名,确保请求来自微信
Map jsonData = null;
try {
//确保在管理器中存在自动更新的商户证书
CertificatesManager certificatesManager = CertificatesManager.getInstance();
Verifier verifier = certificatesManager.getVerifier(wxpayConfig.getMchId());
//验签和解析请求数据
NotificationHandler notificationHandler = new NotificationHandler(verifier, wxpayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8));
Notification notification = notificationHandler.parse(request);
if (!"TRANSACTION.SUCCESS".equals(notification.getEventType())) {
validResponse.setValid(false);
return validResponse;
}
//获取解密后的数据
jsonData = JSON.parseObject(notification.getDecryptData(),Map.class );
log.info("解密后的数据为:"+jsonData);
} catch (Exception e) {
throw new TradeException("验签失败");
}
if (!"SUCCESS".equals(jsonData.get("trade_state"))) {
validResponse.setValid(false);
return validResponse;
}
validResponse.setValid(true);
validResponse.setOrderSn( (String) jsonData.get("out_trade_no") ); //订单号
return validResponse;
} catch (Exception e) {
validResponse.setValid(false);
return validResponse;
}
}
@Override
public ValidResponse validRefund(HttpEntity<String> httpEntity, HttpServletRequest httpServletRequest) throws TradeException {
ValidResponse validResponse=new ValidResponse();
try {
//获取请求头
HttpHeaders headers = httpEntity.getHeaders();
//构建微信请求数据对象
NotificationRequest request = new NotificationRequest.Builder()
.withSerialNumber(headers.getFirst("Wechatpay-Serial")) //证书序列号(微信平台)
.withNonce(headers.getFirst("Wechatpay-Nonce")) //随机串
.withTimestamp(headers.getFirst("Wechatpay-Timestamp")) //时间戳
.withSignature(headers.getFirst("Wechatpay-Signature")) //签名字符串
.withBody(httpEntity.getBody())
.build();
//微信通知的业务处理
Map jsonData = null;
//验证签名,确保请求来自微信
try {
//确保在管理器中存在自动更新的商户证书
CertificatesManager certificatesManager = CertificatesManager.getInstance();
Verifier verifier = certificatesManager.getVerifier(wxpayConfig.getMchId());
//验签和解析请求数据
NotificationHandler notificationHandler = new NotificationHandler(verifier, wxpayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8));
Notification notification = notificationHandler.parse(request);
if (!"REFUND.SUCCESS".equals(notification.getEventType())) {
//非成功请求直接返回,理论上都是成功的请求
validResponse.setValid(false);
return validResponse;
}
//获取解密后的数据
jsonData = JSON.parseObject( notification.getDecryptData(),Map.class );
} catch (Exception e) {
throw new TradeException("验签失败");
}
if (!"SUCCESS".equals(jsonData.get("refund_status"))) {
//非成功请求直接返回,理论上都是成功的请求
validResponse.setValid(false);
return validResponse;
}
//交易单号
validResponse.setValid(true);
validResponse.setOrderSn( (String) jsonData.get("out_trade_no") ); //订单号
return validResponse;
} catch (Exception e) {
//非成功请求直接返回,理论上都是成功的请求
validResponse.setValid(false);
return validResponse;
}
}
@Override
public String successResult() {
return JSON.toJSONString(WxpayConstant.SUCCESS ) ;
}
@Override
public String failResult() {
return JSON.toJSONString( WxpayConstant.FAIL);
}
}
@@ -0,0 +1,20 @@
package com.ruoyi.wx;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 微信权限对接类
*/
@Component
@ConfigurationProperties("elegent.pay.wxpay")
@Data
public class WxpayConfig {
private String mchId; //商户号
private String appId; //APPID
private String appSecret;//app密钥
private String mchSerialNo; //商户证书序列号
private String apiV3Key; //V3密钥
}
@@ -0,0 +1,48 @@
package com.ruoyi.wx;
import java.util.HashMap;
import java.util.Map;
public class WxpayConstant {
public static final Map SUCCESS = new HashMap<String,Object>(){
{
put("code", "SUCCESS");
}
};
public static final Map FAIL = new HashMap<String,Object>(){
{
put("code", "FAIL");
put("message","微信回调错误结果");
}
};
public final static String domain ="https://api.mch.weixin.qq.com/v3";
/**
* 创建订单
*/
public final static String createOrder = domain +"/pay/transactions/";
/**
* 关闭订单
*/
public final static String closeOrder = domain+"/pay/transactions/out-trade-no/{out_trade_no}/close";
/**
* 查询订单编号
*/
public static String queryOrderNo = domain+"/pay/transactions/out-trade-no/";
/**
* 查询退款订单
*/
public static String queryRufundOrderNo =domain+ "/refund/domestic/refunds/";
/**
* 退款接口
*/
public static String refund = domain+"/refund/domestic/refunds";
}
@@ -0,0 +1,14 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ruoyi.config.CallbackConfig,\
com.ruoyi.core.CallbackWatch,\
com.ruoyi.core.ElegentPayImpl,\
com.ruoyi.core.ElegentLoader,\
com.ruoyi.core.ElegentConfig,\
com.ruoyi.key.impl.DefaultKeyManager,\
com.ruoyi.core.CallbackController,\
com.ruoyi.wx.WxpayConfig,\
com.ruoyi.wx.WxPayElegentTrade,\
com.ruoyi.wx.WxPayElegentValid,\
com.ruoyi.ali.AlipayConfig,\
com.ruoyi.ali.AlipayElegentTrade,\
com.ruoyi.ali.AlipayElegentValid
+5
View File
@@ -180,6 +180,7 @@
<module>ruoyi-quartz</module>
<module>ruoyi-generator</module>
<module>ruoyi-common</module>
<module>pay</module>
</modules>
<packaging>pom</packaging>
@@ -193,6 +194,10 @@
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<excludes>
<exclude>ruoyi-system/**</exclude>
<exclude>ruoyi-common/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
+5 -1
View File
@@ -60,7 +60,11 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>pay</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
@@ -3,6 +3,7 @@ package com.ruoyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 启动程序
@@ -10,6 +11,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
* @author ruoyi
*/
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@EnableScheduling
public class RuoYiApplication
{
public static void main(String[] args)
@@ -0,0 +1,33 @@
package com.ruoyi.web.controller.bestsign;
import com.ruoyi.bestsign.domain.ArbitrSignatuVO;
import com.ruoyi.bestsign.domain.PersonRegisterVO;
import com.ruoyi.bestsign.service.ArbitrSignatuService;
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/arbitrSignatu")
public class ArbitrSignatuController {
@Autowired
ArbitrSignatuService arbitrSignatuService;
/**
* 申请状态查询
*
* @param arbitrSignatuVO
* @return
*/
@PostMapping("/selectApplyStatus")
public AjaxResult selectApplyStatus (@Validated @RequestBody ArbitrSignatuVO arbitrSignatuVO) {
return arbitrSignatuService.selectApplyStatus(arbitrSignatuVO);
}
}
@@ -0,0 +1,31 @@
package com.ruoyi.web.controller.bestsign;
import com.ruoyi.bestsign.domain.PersonRegisterVO;
import com.ruoyi.bestsign.service.SignRegisterService;
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/register")
public class RegisterController {
@Autowired
SignRegisterService signRegisterService;
/**
* 注册上上签个人用户
*
* @param personRegisterVO
* @return
*/
@PostMapping("/registerPerson")
public AjaxResult createDocument(@Validated @RequestBody PersonRegisterVO personRegisterVO) {
return signRegisterService.registerPerson(personRegisterVO);
}
// @PostMapping("/registerEnterprise")
// public AjaxResult
}
@@ -2,6 +2,10 @@ package com.ruoyi.web.controller.system;
import java.util.List;
import java.util.Set;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication;
import com.ruoyi.wisdomarbitrate.service.IdentityAuthenticationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -23,8 +27,7 @@ import com.ruoyi.system.service.ISysMenuService;
* @author ruoyi
*/
@RestController
public class SysLoginController
{
public class SysLoginController {
@Autowired
private SysLoginService loginService;
@@ -33,6 +36,10 @@ public class SysLoginController
@Autowired
private SysPermissionService permissionService;
@Autowired
IdentityAuthenticationService identityAuthenticationService;
@Autowired
private ISysUserService sysUserService;
/**
* 登录方法
@@ -41,13 +48,22 @@ public class SysLoginController
* @return 结果
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
public AjaxResult login(@RequestBody LoginBody loginBody) {
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
//判断该用户是否已经实名认证(certificationStatus1已认证0未认证)
IdentityAuthentication identityAuthentication=new IdentityAuthentication();
identityAuthentication.setUserName(loginBody.getUsername());
String status = identityAuthenticationService.checkIsAuthentication(identityAuthentication);
ajax.put("certificationStatus", status);
// 获取用户信息
SysUser sysUser = sysUserService.selectUserByUserName(loginBody.getUsername());
ajax.put("userId", sysUser!=null?sysUser.getUserId():"");
ajax.put("userName", sysUser!=null?sysUser.getUserName():"");
return ajax;
}
@@ -57,8 +73,7 @@ public class SysLoginController
* @return 用户信息
*/
@GetMapping("getInfo")
public AjaxResult getInfo()
{
public AjaxResult getInfo() {
SysUser user = SecurityUtils.getLoginUser().getUser();
// 角色集合
Set<String> roles = permissionService.getRolePermission(user);
@@ -77,8 +92,7 @@ public class SysLoginController
* @return 路由信息
*/
@GetMapping("getRouters")
public AjaxResult getRouters()
{
public AjaxResult getRouters() {
Long userId = SecurityUtils.getUserId();
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus));
@@ -3,18 +3,14 @@ package com.ruoyi.web.controller.system;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.annotation.Anonymous;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
@@ -138,7 +134,7 @@ public class SysUserController extends BaseController
}
user.setCreateBy(getUsername());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
return toAjax(userService.insertUser(user));
return userService.insertUser(user);
}
/**
@@ -164,7 +160,7 @@ public class SysUserController extends BaseController
return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setUpdateBy(getUsername());
return toAjax(userService.updateUser(user));
return userService.updateUser(user);
}
/**
@@ -248,4 +244,15 @@ public class SysUserController extends BaseController
{
return success(deptService.selectDeptTreeList(dept));
}
/**
* 根据userId获取用户信息
* @param userId
* @return
*/
@Anonymous
@GetMapping("/selectUserById")
public AjaxResult selectUserById(@RequestParam(required = true) Long userId){
return AjaxResult.success(userService.selectUserById(userId));
}
}
@@ -0,0 +1,244 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.EsignDemoException;
import com.ruoyi.wisdomarbitrate.StringIdsReq;
import com.ruoyi.wisdomarbitrate.domain.BatchCaseApplication;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.SealSignRecord;
import com.ruoyi.wisdomarbitrate.domain.vo.BookSendVO;
import com.ruoyi.wisdomarbitrate.domain.vo.LogisticsInfoVO;
import com.ruoyi.wisdomarbitrate.service.IAdjudicationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping("/adjudication")
public class AdjudicationController extends BaseController {
@Autowired
private IAdjudicationService adjudicationService;
/**
* 根据签署流程id查询批量签名链接
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:selectSignUrl')")
@PostMapping("/selectBatchSignUrl")
public AjaxResult selectBatchSignUrl(@RequestBody StringIdsReq idsReq) {
if(CollectionUtil.isEmpty(idsReq.getIds())|| StrUtil.isEmpty(idsReq.getPsnAccount())){
return error("参数校验失败");
}
SealSignRecord sealSignRecordselect = adjudicationService.selectBatchSignUrl(idsReq);
return success(sealSignRecordselect);
}
/**
* 根据批号查询批量签名链接
*/
@PostMapping("/getSignUrlBatch")
public AjaxResult getSignUrlBatch(@RequestBody StringIdsReq idsReq) {
if(StrUtil.isEmpty(idsReq.getBatchNumber().toString())|| StrUtil.isEmpty(idsReq.getPsnAccount())){
return error("参数校验失败");
}
SealSignRecord sealSignRecordselect = adjudicationService.getSignUrlBatch(idsReq);
return success(sealSignRecordselect);
}
/**
* 根据签署流程id查询批量用印链接
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:selectSignUrl')")
@PostMapping("/selectBatchSealUrl")
public AjaxResult selectBatchSealUrl(@RequestBody StringIdsReq idsReq) {
if(CollectionUtil.isEmpty(idsReq.getIds())|| StrUtil.isEmpty(idsReq.getPsnAccount())){
return error("参数校验失败");
}
SealSignRecord sealSignRecordselect = adjudicationService.selectBatchSealUrl(idsReq);
return success(sealSignRecordselect);
}
/**
* 根据仲裁员手机号分页查询待签名/待用印的案件
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:selectSignUrl')")
@GetMapping("/pageSignAdjudicate")
public TableDataInfo pageSignAdjudicate(@RequestParam(value = "personAccount",required = false) String personAccount, @RequestParam("caseStatus") Integer caseStatus) {
startPage();
List<CaseApplication> list = adjudicationService.selectSealSigning(personAccount,caseStatus);
return getDataTable(list);
}
/**
* 根据批号查询批量用印链接
*/
@PostMapping("/getSealUrlBatch")
public AjaxResult getSealUrlBatch(@RequestBody StringIdsReq idsReq) {
if(StrUtil.isEmpty(idsReq.getBatchNumber().toString())|| StrUtil.isEmpty(idsReq.getPsnAccount())){
return error("参数校验失败");
}
SealSignRecord sealSignRecordselect = adjudicationService.getSealUrlBatch(idsReq);
return success(sealSignRecordselect);
}
/**
* 生成裁决书
* @param caseApplication
* @return
*/
@PostMapping("/document")
public AjaxResult createDocument(@Validated @RequestBody CaseApplication caseApplication){
if (caseApplication.getId() == null) {
return AjaxResult.error("案件id不能为空");
}
return adjudicationService.createDocument(caseApplication);
}
/**
* 批量生成裁决书
* @param caseApplication
* @return
*/
@PostMapping("/batchDocument")
public AjaxResult batchDocument(@Validated @RequestBody BatchCaseApplication caseApplication){
if (CollectionUtil.isEmpty(caseApplication.getIds())) {
return AjaxResult.error("参数校验失败");
}
return adjudicationService.batchDocument(caseApplication.getIds());
}
/**
* 重新生成裁决书
* @param caseApplication
* @return
*/
@PostMapping("/regenerationDocument")
public AjaxResult regenerationDocument(@Validated @RequestBody CaseApplication caseApplication){
return adjudicationService.regenerationDocument(caseApplication);
}
/**
* 裁决书送达(电子邮件)
* @param bookSendVO
* @return
*/
@PostMapping("/delivery")
public AjaxResult sendDocumentByEmail(@RequestBody BookSendVO bookSendVO){
return adjudicationService.sendDocumentByEmail(bookSendVO.getId(),bookSendVO.getAppEmail(),bookSendVO.getResEmail(),bookSendVO.getApptrackingNum(),bookSendVO.getRestrackingNum());
}
/**
* 根据快递单号查询物流信息
* @param caseApplication
* @return
*/
@GetMapping("/logistics")
// @PreAuthorize("@ss.hasPermi('delivery:detail')")
public AjaxResult getLogisticsInfo(CaseApplication caseApplication){
List<LogisticsInfoVO> logisticsInfo = adjudicationService.getLogisticsInfo(caseApplication);
return AjaxResult.success(logisticsInfo);
}
/**
* 签名(暂时只改案件状态)
* @param caseApplication
* @return
*/
@PostMapping("/signature")
// @PreAuthorize("@ss.hasPermi('awardManagement:list:sign')")
public AjaxResult signature(@Validated @RequestBody CaseApplication caseApplication){
return adjudicationService.signature(caseApplication);
}
/**
* 归档(暂时只改案件状态)
* @param batchCaseApplication
* @return
*/
@PostMapping("/caseFile")
// @PreAuthorize("@ss.hasPermi('awardManagement:list:file')")
public AjaxResult caseFile(@RequestBody BatchCaseApplication batchCaseApplication){
if(CollectionUtil.isEmpty(batchCaseApplication.getIds())){
return error("参数校验失败");
}
return adjudicationService.caseFile(batchCaseApplication.getIds());
}
/**
* 批量归档(暂时只改案件状态)
* @param batchCaseApplication
* @return
*/
@PostMapping("/caseFileBatch")
public AjaxResult caseFileBatch(@RequestBody CaseApplication caseApplication){
if(StrUtil.isEmpty(caseApplication.getBatchNumber().toString())){
return error("参数校验失败");
}
return adjudicationService.caseFileBatch(caseApplication.getBatchNumber());
}
/**
* 送达(不包含发送电子邮件)
* @param bookSendVO
* @return
*/
@PostMapping("/service")
// @PreAuthorize("@ss.hasPermi('awardManagement:list:sendaward')")
public AjaxResult service(@RequestBody BookSendVO bookSendVO){
return adjudicationService.service(bookSendVO.getId(),bookSendVO.getAppEmail(),bookSendVO.getResEmail(),bookSendVO.getApptrackingNum(),bookSendVO.getRestrackingNum());
}
/**
* 批量送达仲裁书
* @param caseApplication
* @return
*/
@PostMapping("/serviceBatch")
public AjaxResult serviceBatch(@Validated @RequestBody CaseApplication caseApplication) throws EsignDemoException, IOException {
if(StrUtil.isEmpty(caseApplication.getBatchNumber().toString())){
return error("参数校验失败");
}
return adjudicationService.serviceBatch(caseApplication.getBatchNumber());
}
/**
* 用印(暂时只改案件状态)
* @param caseApplication
* @return
*/
@PostMapping("/stamp")
// @PreAuthorize("@ss.hasPermi('awardManagement:list:signprint')")
public AjaxResult stamp(@Validated @RequestBody CaseApplication caseApplication){
return adjudicationService.stamp(caseApplication);
}
/**
* 档案详情查询
* @param id 案件id
* @return
*/
@GetMapping("/archives")
public AjaxResult getArchivesDetail(Long id){
return adjudicationService.getArchivesDetail(id);
}
/**
* 根据案件id获取邮箱
* @param id 案件id
* @return
*/
@GetMapping("/emailByCaseId")
public AjaxResult emailByCaseId(@RequestParam("id") Long id){
return adjudicationService.emailByCaseId(id);
}
}
@@ -0,0 +1,54 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.CheckSignatuerUtils;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.vo.CaseApplicationVO;
import com.ruoyi.wisdomarbitrate.service.ICaseApplicationService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/callArbitrateCaseApplication")
public class ArbitrateApplicationController extends BaseController {
@Autowired
private ICaseApplicationService caseApplicationService;
/**
* 新增立案数据
*/
@Anonymous
@PostMapping("/generateCaseApplication")
public AjaxResult generateCaseApplication(@Validated @RequestBody CaseApplicationVO caseApplicationVO) throws Exception {
String paramsbody = JSONUtil.toJsonStr(caseApplicationVO);
boolean checkResult= CheckSignatuerUtils.checkSignuter(paramsbody);
if(checkResult){
CaseApplication caseApplication = new CaseApplication();
BeanUtils.copyProperties(caseApplicationVO,caseApplication);
caseApplication.setCreateBy(getUsername());
return toAjax(caseApplicationService.insertcaseApplication1(caseApplication));
}else {
return AjaxResult.error("签名验证失败");
}
}
}
@@ -0,0 +1,44 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.wisdomarbitrate.domain.Arbitrator;
import com.ruoyi.wisdomarbitrate.service.IArbitratorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/arbitrator")
public class ArbitratorController extends BaseController {
@Autowired
private ISysUserService sysUserService;
/**
* 查询仲裁员信息
*/
// @PreAuthorize("@ss.hasPermi('arbitrator:list')")
@GetMapping("/list")
public TableDataInfo list(Arbitrator arbitrator)
{
startPage();
List<SysUser> list = sysUserService.selectUserListByAdRole(arbitrator);
return getDataTable(list);
}
}
@@ -0,0 +1,580 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.EsignDemoException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.WxAppletNotifyUtils;
import com.ruoyi.wisdomarbitrate.domain.*;
import com.ruoyi.wisdomarbitrate.domain.vo.ReservedConferenceVO;
import com.ruoyi.wisdomarbitrate.domain.vo.SendRoomNoMessageVO;
import com.ruoyi.wisdomarbitrate.domain.vo.ToDoCount;
import com.ruoyi.wisdomarbitrate.service.IAdjudicationService;
import com.ruoyi.wisdomarbitrate.service.ICaseApplicationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
@RestController
@RequestMapping("/caseApplication")
public class CaseApplicationController extends BaseController {
@Autowired
private ICaseApplicationService caseApplicationService;
@Autowired
private IAdjudicationService adjudicationService;
/**
* 查询立案数据
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list')")
@GetMapping("/list")
public TableDataInfo list(CaseApplication caseApplication) {
if(StrUtil.isEmpty(caseApplication.getSelectCaseStatus())){
caseApplication.setSelectCaseStatus("0");
}
startPage();
List<CaseApplication> list = caseApplicationService.selectCaseApplicationListByRole(caseApplication);
return getDataTable(list);
}
/**
* 查询批量管理案件列表
*/
@GetMapping("/listBatch")
public TableDataInfo listBatch(CaseApplication caseApplication) {
startPage();
List<CaseApplication> list = caseApplicationService.selectCaseApplicationListBatchByRole(caseApplication);
return getDataTable(list);
}
/**
* 根据角色查询待办数量
* @return
*/
@GetMapping("/toDoCount")
public AjaxResult toDoCount() {
ToDoCount toDoCount = caseApplicationService.selectToDoCount();
// List<CaseApplication> list = caseApplicationService.selectCaseApplicationList(caseApplication);
return success(toDoCount);
}
/**
* 新增立案数据
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:add')")
@Log(title = "新增立案数据", businessType = BusinessType.INSERT)
@PostMapping("/addCaseApplication")
public AjaxResult addCaseApplication(@Validated @RequestBody CaseApplication caseApplication)
{
caseApplication.setCreateBy(getUsername());
return toAjax(caseApplicationService.insertcaseApplication(caseApplication));
}
/**
* 修改立案数据
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:update')")
@Log(title = "修改立案数据", businessType = BusinessType.UPDATE)
@PostMapping("/editCaseApplication")
public AjaxResult editCaseApplication(@Validated @RequestBody CaseApplication caseApplication) {
caseApplication.setUpdateBy(getUsername());
return caseApplicationService.editCaseApplication(caseApplication);
}
/**
* 修改立案数据自定义字段
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:update')")
@Log(title = "修改立案数据自定义字段", businessType = BusinessType.UPDATE)
@PostMapping("/editCaseApplicationDefineval")
public AjaxResult editCaseApplicationDefineval(@Validated @RequestBody CaseApplication caseApplication) {
return caseApplicationService.editCaseApplicationDefineval(caseApplication);
}
/**
* 提交立案申请
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:submit')")
@Log(title = "提交立案申请", businessType = BusinessType.UPDATE)
@PostMapping("/submitCaseApplication")
public AjaxResult submitCaseApplication(@RequestBody BatchCaseApplication batchCaseApplication) {
if(CollectionUtil.isEmpty(batchCaseApplication.getIds())){
return error("参数校验失败");
}
return toAjax(caseApplicationService.submitCaseApplication(batchCaseApplication.getIds()));
}
/**
* 批量提交立案申请
*/
@Log(title = "批量提交立案申请", businessType = BusinessType.UPDATE)
@PostMapping("/submitCaseApplicationBatch")
public AjaxResult submitCaseApplicationBatch(@RequestBody BatchCaseApplication batchCaseApplication) {
if(StringUtils.isEmpty(batchCaseApplication.getBatchNumber())){
return error("参数校验失败");
}
return toAjax(caseApplicationService.submitCaseApplicationBatch(batchCaseApplication.getBatchNumber()));
}
/**
* 删除立案数据
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:delete')")
@Log(title = "删除立案数据", businessType = BusinessType.DELETE)
@PostMapping("/removeCaseApplication")
public AjaxResult removeCaseApplication(@RequestBody BatchCaseApplication batchCaseApplication) {
if(CollectionUtil.isEmpty(batchCaseApplication.getIds())){
return error("参数校验失败");
}
return success(caseApplicationService.deletecaseApplicationByIds(batchCaseApplication.getIds()));
}
/**
* 查询立案信息
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:detail')")
@PostMapping("/selectCaseApplication")
public AjaxResult selectCaseApplication(@Validated @RequestBody CaseApplication caseApplication) {
CaseApplication caseApplicationselect = caseApplicationService.selectCaseApplication(caseApplication);
return success(caseApplicationselect);
}
/**
* 查询已签署裁决书URL
*/
@PostMapping("/selectSignSealUrl")
public AjaxResult selectSignSealUrl(@Validated @RequestBody CaseApplication caseApplication) throws EsignDemoException {
CaseApplication caseApplicationselect = caseApplicationService.selectSignSealUrl(caseApplication);
return success(caseApplicationselect);
}
/**
* 查询案件进度
*/
@PostMapping("/selectCaseProgress")
public AjaxResult selectCaseProgress(@Validated @RequestBody CaseApplication caseApplication) {
AjaxResult caseApplicationselect = caseApplicationService.selectCaseProgress(caseApplication);
return success(caseApplicationselect);
}
/**
* 查询签名链接
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:selectSignUrl')")
@PostMapping("/selectSignUrl")
public AjaxResult selectSignUrl(@Validated @RequestBody CaseApplication caseApplication) throws EsignDemoException {
SealSignRecord sealSignRecordselect = caseApplicationService.selectSignUrl(caseApplication);
return success(sealSignRecordselect);
}
/**
* 查询用印链接
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:selectSealUrl')")
@PostMapping("/selectSealUrl")
public AjaxResult selectSealUrl(@Validated @RequestBody CaseApplication caseApplication) throws EsignDemoException {
SealSignRecord sealUrlRecordselect = caseApplicationService.selectSealUrl(caseApplication);
return success(sealUrlRecordselect);
}
/**
* 案件证据材料压缩包上传
*
* @param file 附件
* @param id 案件申请id
* @return
*/
@PostMapping("/uploadZipFile")
public AjaxResult uploadZipFile(@RequestParam("file") MultipartFile file, Long id) {
String username = this.getUsername();
Long userId = this.getUserId();
return caseApplicationService.uploadZipFile(file, id, username, userId);
}
/**
* 立案申请导入模板下载
*/
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
// 读取文件
try {
InputStream fileInputStream = new URL("http://121.40.189.20:8000/API/uploadPath/template/案件导入模板.xlsx").openStream();
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("案件导入模板.xlsx","UTF-8"));
byte[] buffer = new byte[1024];
int length;
while ((length = fileInputStream.read(buffer)) > 0) {
response.getOutputStream().write(buffer, 0, length);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Log(title = "立案信息导入", businessType = BusinessType.IMPORT)
// @PreAuthorize("@ss.hasPermi('caseManagement:list:import')")
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file) throws Exception {
if(file==null){
return warn("请上传文件");
}
ExcelUtil<CaseApplication> util = new ExcelUtil<CaseApplication>(CaseApplication.class);
List<CaseApplication> caseApplicationList = util.importExcel(file.getInputStream());
String operName = getUsername();
String message = caseApplicationService.importCaseApplication(caseApplicationList, operName);
return success(message);
}
/**
* 组庭
*/
// @PreAuthorize("@ss.hasPermi('caseApplication:pendTral')")
@Log(title = "组庭", businessType = BusinessType.UPDATE)
@PostMapping("/pendTral")
public AjaxResult pendTral(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.pendTral(caseApplication));
}
/**
* 组庭审核
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:checkgroup')")
@Log(title = "组庭审核", businessType = BusinessType.UPDATE)
@PostMapping("/pendTralCheck")
public AjaxResult pendTralCheck(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.pendTralCheck(caseApplication));
}
/**
* 组庭确认
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:confirmgroup')")
@Log(title = "组庭确认", businessType = BusinessType.UPDATE)
@PostMapping("/pendTralSure")
public AjaxResult pendTralSure(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.pendTralSure(caseApplication));
}
/**
* 批量组庭审核
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:checkgroup')")
@Log(title = "批量组庭审核", businessType = BusinessType.UPDATE)
@PostMapping("/pendTralCheckBatch")
public AjaxResult pendTralCheckBatch(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.pendTralCheckBatch(caseApplication));
}
/**
* 批量组庭确认
*/
@Log(title = "批量组庭确认", businessType = BusinessType.UPDATE)
@PostMapping("/pendTralSureBatch")
public AjaxResult pendTralSureBatch(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.pendTralSureBatch(caseApplication));
}
/**
* 修改开庭时间
*/
@Log(title = "修改开庭时间", businessType = BusinessType.UPDATE)
@PostMapping("/updateHeardate")
public AjaxResult updateHeardate(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.updateHeardate(caseApplication));
}
/**
* 核验裁决书
*/
// @PreAuthorize("@ss.hasPermi('caseApplication:verificationArbitrateRecord')")
@Log(title = "核验裁决书", businessType = BusinessType.UPDATE)
@PostMapping("/verificationArbitrateRecord")
public AjaxResult verificationArbitrateRecord(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.verificationArbitrateRecord(caseApplication));
}
/**
* 部门长审核裁决书
*/
// @PreAuthorize("@ss.hasPermi('caseApplication:checkArbitrateRecord')")
@Log(title = "部门长审核裁决书", businessType = BusinessType.UPDATE)
@PostMapping("/checkArbitrateRecord")
public AjaxResult checkArbitrateRecord(@Validated @RequestBody CaseApplication caseApplication) {
return caseApplicationService.checkArbitrateRecord(caseApplication);
}
/**
* 仲裁员审核裁决书
*/
// @PreAuthorize("@ss.hasPermi('caseApplication:checkArbitrateRecord')")
@Log(title = "仲裁员审核裁决书", businessType = BusinessType.UPDATE)
@PostMapping("/arbitrator/checkArbitrateRecord")
public AjaxResult arbitratorCheckArbitrateRecord(@Validated @RequestBody CaseApplication caseApplication) {
return caseApplicationService.arbitratorCheckArbitrateRecord(caseApplication);
}
/**
* 批量操作仲裁员审核裁决书
*/
@Log(title = "批量操作仲裁员审核裁决书", businessType = BusinessType.UPDATE)
@PostMapping("/arbitrator/checkArbitrateRecordBatch")
public AjaxResult arbitratorCheckArbitrateRecordBatch(@Validated @RequestBody CaseApplication caseApplication) {
return caseApplicationService.arbitratorCheckArbitrateRecordBatch(caseApplication);
}
/**
* 批量部门长审核裁决书
*/
@Log(title = "批量部门长审核裁决书", businessType = BusinessType.UPDATE)
@PostMapping("/checkArbitrateRecordBatch")
public AjaxResult checkArbitrateRecordBatch(@Validated @RequestBody CaseApplication caseApplication) {
return caseApplicationService.checkArbitrateRecordBatch(caseApplication);
}
/**
* 批量核验裁决书
*/
@Log(title = "批量核验裁决书", businessType = BusinessType.UPDATE)
@PostMapping("/verificationArbitrateRecordBatch")
public AjaxResult verificationArbitrateRecordBatch(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.verificationArbitrateRecordBatch(caseApplication));
}
/**
* 是否指派仲裁员
*/
// @PreAuthorize("@ss.hasPermi('caseApplication:pendingAppointArbotrar')")
@Log(title = "是否指派仲裁员", businessType = BusinessType.UPDATE)
@PostMapping("/pendingAppointArbotrar")
public AjaxResult pendingAppointArbotrar(@Validated @RequestBody CaseApplication caseApplication) {
return toAjax(caseApplicationService.pendingAppointArbotrar(caseApplication));
}
/**
* 提交立案审查
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:check')")
@Log(title = "提交立案审查", businessType = BusinessType.UPDATE)
@PostMapping("/submitCaseApplicationCheck")
public AjaxResult submitCaseApplicationCheck(@RequestBody BatchCaseApplication batchCaseApplication) {
if(CollectionUtil.isEmpty(batchCaseApplication.getIds())|| batchCaseApplication.getAgreeOrNotCheck()==null){
return error("参数校验失败");
}
return success(caseApplicationService.submitCaseApplicationCheck(batchCaseApplication.getIds(),batchCaseApplication.getAgreeOrNotCheck(),batchCaseApplication.getCaseCheckReject()));
}
/**
* 确认缴费查询立案信息
*/
// @PreAuthorize("@ss.hasPermi('paymentManagement:list:detail')")
@PostMapping("/selectCaseApplicationConfirm")
public AjaxResult selectCaseApplicationConfirm(@Validated @RequestBody CaseApplication caseApplication) {
CaseApplication caseApplicationselect = caseApplicationService.selectCaseApplicationConfirm(caseApplication);
return success(caseApplicationselect);
}
/**
* 批量提交立案审查
*/
@Log(title = "批量提交立案审查", businessType = BusinessType.UPDATE)
@PostMapping("/submitCaseApplicationCheckBatch")
public AjaxResult submitCaseApplicationCheckBatch(@RequestBody BatchCaseApplication batchCaseApplication) {
if(StringUtils.isEmpty(batchCaseApplication.getBatchNumber()) || batchCaseApplication.getAgreeOrNotCheck()==null){
return error("参数校验失败");
}
return success(caseApplicationService.submitCaseApplicationCheckBatch(batchCaseApplication.getBatchNumber(),batchCaseApplication.getAgreeOrNotCheck(),batchCaseApplication.getCaseCheckReject()));
}
/**
* 下载案件压缩包
*/
@PostMapping("/downloadCaseZipFile")
public AjaxResult downloadCaseZipFile(@Validated @RequestBody CaseApplication caseApplication) {
CaseAttach caseAttach = caseApplicationService.downloadCaseZipFile(caseApplication);
return success(caseAttach);
}
/**
* 发送房间号短信
*/
@Anonymous
@PostMapping("/sendRoomNoMessage")
public AjaxResult sendRoomNoMessage(@Validated @RequestBody SendRoomNoMessageVO messageVO) {
String result = caseApplicationService.sendRoomNoMessage(messageVO);
return success(result);
}
/**
* 获取UrlScheme
*/
@Anonymous
@GetMapping("/getUrlScheme")
public AjaxResult getUrlScheme() {
String schemeUrl = WxAppletNotifyUtils.jumpAppletSchemeUrl();
return success(schemeUrl);
}
/**
* 生成庭审笔录
* @param arbitrateRecord
* @return
*/
@PostMapping("/creatTrialRecord")
// @PreAuthorize("@ss.hasPermi('caseManagement:list:creatTrialRecord')")
public AjaxResult creatTrialRecord(@Validated @RequestBody ArbitrateRecord arbitrateRecord){
return caseApplicationService.creatTrialRecord(arbitrateRecord);
}
/**
* 记录庭审笔录
* @param arbitrateRecord
* @return
*/
@PostMapping("/creatTrialRecordnew")
// @PreAuthorize("@ss.hasPermi('caseManagement:list:creatTrialRecord')")
public AjaxResult creatTrialRecordnew(@Validated @RequestBody ArbitrateRecord arbitrateRecord){
return caseApplicationService.creatTrialRecordnew(arbitrateRecord);
}
/**
* 案件锁定或者解锁
* @param caseApplication
* @return
*/
@PostMapping("/updateCaseLockStatus")
// @PreAuthorize("@ss.hasPermi('caseManagement:list:creatTrialRecord')")
public AjaxResult updateCaseLockStatus(@Validated @RequestBody CaseApplication caseApplication){
if(caseApplication.getId()==null || caseApplication.getLockStatus()==null){
return error("参数校验失败");
}
return AjaxResult.success(caseApplicationService.updateCaseLockStatus(caseApplication));
}
/**
* 查询短信发送记录
* @param smsSendRecord
* @return
*/
@PostMapping("/smsRecord")
public TableDataInfo getSmsSendRecord(@RequestBody SmsSendRecord smsSendRecord){
startPage();
List<SmsSendRecord> list = caseApplicationService.getSmsSendRecord(smsSendRecord);
return getDataTable(list);
}
/**
* 获取userSign
* @param userId
* @return
*/
@Anonymous
@GetMapping("/generateUserSign")
public AjaxResult generateUserSign(@RequestParam(required = true) String userId){
if(StrUtil.isEmpty(userId)){
error("参数校验失败");
}
return AjaxResult.success(caseApplicationService.generateUserSign(userId));
}
/**
* 预约会议
* @param reservedConferenceVO
* @return
*/
@PostMapping("/reservedConference")
public AjaxResult reservedConference(@Validated @RequestBody ReservedConferenceVO reservedConferenceVO) throws Exception {
return caseApplicationService.reservedConference(reservedConferenceVO);
}
/**
* 生成房间号
* @return
*/
@Anonymous
@GetMapping("/createRoomId")
public AjaxResult createRoomId(@RequestParam("caseId") Long caseId) {
return success(caseApplicationService.createRoomId(caseId));
}
/**
* 删除房间号
* @return
*/
@Anonymous
@PostMapping("/deleteRoom")
public AjaxResult deleteRoom(@RequestParam("roomId") String roomId) {
return caseApplicationService.deleteRoom(roomId);
}
/**
* 根据案件id查询已预约的会议
* @param caseId
* @return
*/
@Anonymous
@GetMapping("/reserveConferenceList")
public AjaxResult reserveConferenceList( @RequestParam("caseId") Long caseId) {
return success(caseApplicationService.reserveConferenceList(caseId));
}
/**
* 案件压缩包导入
* @param file
* @return
* @throws IOException
*/
@PostMapping("/uploadCaseZipFile")
public AjaxResult uploadCaseZipFile(@RequestParam("file") MultipartFile file,@RequestParam("templateId") Long templateId) throws IOException {
return caseApplicationService.uploadCaseZipFile(file,templateId);
}
/**
* 根据附件id修改案件id
* @param caseAttach
* @return
*/
@PostMapping("/updateCaseIdByAnnexId")
public AjaxResult updateCaseIdByAnnexId(@RequestBody CaseAttach caseAttach) {
if(caseAttach.getAnnexId()==null || caseAttach.getCaseAppliId()==null){
return error("参数校验失败");
}
return caseApplicationService.updateCaseIdByAnnexId(caseAttach);
}
}
@@ -0,0 +1,107 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.vo.UpdateSubmitVO;
import com.ruoyi.wisdomarbitrate.service.CaseApplicationLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import static com.ruoyi.common.core.domain.AjaxResult.success;
/**
* @author wangqiong
* @description 案件日志
* @date 2023-11-17 13:58
*/
@RestController
@RequestMapping (value = "/caseApplicationLog")
public class CaseApplicationLogController {
@Autowired
private CaseApplicationLogService caseApplicationLogService;
/**
* 新增
* @author wangqiong
* @date 2023/11/17
**/
@PostMapping("/insert")
public AjaxResult insert(@RequestBody CaseApplication caseApplicationLog){
return success(caseApplicationLogService.insert(caseApplicationLog));
}
/**
* 刪除
* @author wangqiong
* @date 2023/11/17
**/
@PostMapping("/delete")
public AjaxResult delete(Long id){
return success(caseApplicationLogService.delete(id));
}
/**
* 修改的案件提交到秘书
* @author wangqiong
* @date 2023/11/17
**/
@PostMapping("/submit")
public AjaxResult submit(@RequestBody UpdateSubmitVO vo){
if(vo.getCaseId()==null || vo.getVersion()==null){
return AjaxResult.error("参数校验错误");
}
return caseApplicationLogService.submit(vo);
}
/**
* 修改撤销申请
* @author wangqiong
* @date 2023/11/17
**/
@PostMapping("/revoke")
public AjaxResult revoke(@RequestBody UpdateSubmitVO vo){
if(vo.getCaseId()==null || vo.getVersion()==null){
return AjaxResult.error("参数校验错误");
}
// todo 需确定
return caseApplicationLogService.revoke(vo);
}
/**
* 查询 根据主键 id 查询
* @author wangqiong
* @date 2023/11/17
**/
@GetMapping("/selectByCaseIdAndVersion")
public AjaxResult selectByCaseIdAndVersion(@RequestParam(value = "caseId") Long caseId,@RequestParam(value = "version")Integer version ){
return success(caseApplicationLogService.selectByCaseIdAndVersion(caseId,version));
}
/**
* 秘书审核修改的案件
* @author wangqiong
* @date 2023/11/17
**/
@PostMapping("/updateAudit")
public AjaxResult updateAudit(@RequestBody UpdateSubmitVO vo){
if(vo.getCaseId()==null || vo.getVersion()==null || vo.getIsAgree()==null || vo.getUpdateSubmitStatus()==null){
return AjaxResult.error("参数校验错误");
}
return caseApplicationLogService.updateAudit(vo);
}
/**
* 查询该版本及之前版本案件进行对比
* @author wangqiong
* @date 2023/11/17
**/
@Anonymous
@PostMapping("/selectCompareCase")
public AjaxResult selectCompareCase(@RequestBody UpdateSubmitVO vo){
if(vo.getCaseId()==null || vo.getVersion()==null ){
return AjaxResult.error("参数校验错误");
}
return caseApplicationLogService.selectCompareCase(vo);
}
}
@@ -0,0 +1,67 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.collection.CollectionUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wisdomarbitrate.domain.ArbitrateRecord;
import com.ruoyi.wisdomarbitrate.domain.BatchCaseApplication;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.CaseIds;
import com.ruoyi.wisdomarbitrate.service.ICaseArbitrateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/arbitrate")
public class CaseArbitrateController extends BaseController {
@Autowired
private ICaseArbitrateService caseArbitrateService;
/**
* 审核仲裁方式
* @param caseApplication
* @param opinion 1同意,0拒绝
* @return
*/
@PutMapping("/method")
// @PreAuthorize("@ss.hasPermi('caseManagement:list:checkarbitrationway')")
public AjaxResult examineArbitrateMethod(@Validated @RequestBody CaseApplication caseApplication
, Integer opinion, Integer arbitratMethod){
return caseArbitrateService.examineArbitrateMethod(caseApplication,opinion,arbitratMethod);
}
/**
* 批量审核仲裁方式
* @param caseApplication
* @return
*/
@PostMapping("/methodBatch")
public AjaxResult examineArbitrateMethodBatch(@Validated @RequestBody CaseApplication caseApplication){
return caseArbitrateService.examineArbitrateMethodBatch(caseApplication);
}
/**
* 书面审理
* @param
* @return
*/
@PostMapping("/writtenHear")
public AjaxResult writtenHear(@RequestBody CaseIds caseIds){
return caseArbitrateService.writtenHear(caseIds);
}
/**
* 批量书面审理
* @param
* @return
*/
@PostMapping("/writtenHearBatch")
public AjaxResult writtenHearBatch(@Validated @RequestBody CaseApplication caseApplication){
return caseArbitrateService.writtenHearBatch(caseApplication);
}
}
@@ -0,0 +1,160 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.CaseEvidenceDirectory;
import com.ruoyi.wisdomarbitrate.domain.dto.CaseEvidenceDTO;
import com.ruoyi.wisdomarbitrate.domain.vo.CaseEvidenceVO;
import com.ruoyi.wisdomarbitrate.service.ICaseEvidenceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
/**
* 案件证据
*/
@RestController
@RequestMapping("/evidence")
public class CaseEvidenceController extends BaseController {
private final ICaseEvidenceService caseEvidenceService;
@Autowired
public CaseEvidenceController(ICaseEvidenceService caseEvidenceService) {
this.caseEvidenceService = caseEvidenceService;
}
/**
* 根据案件id查询案件详情
*
* @param id
* @return
*/
@GetMapping("/{id}")
public AjaxResult getCaseDetailsById(@PathVariable Long id) {
String username = this.getUsername();
return caseEvidenceService.getCaseDetailsById(id, username);
}
/**
* 案件证据上传
*
* @param file 附件
* @param annexType 附件类型,立案申请书(1)、证据材料(2)、仲裁文书(3)、案件视频(4)、身份证件(5)
* @param id 案件申请id
* @return
*/
@PostMapping("/upload")
public AjaxResult uploadEvidence(@RequestParam("file") MultipartFile file, Integer annexType, Long id) {
String username = this.getUsername();
Long userId = this.getUserId();
return caseEvidenceService.uploadEvidence(file, annexType, id, username, userId);
}
/**
* 上传庭审笔录
*
* @param file 附件
* @param annexType 附件类型,庭审笔录(7)
* @param id 案件申请id
* @return
*/
@PostMapping("/uploadRecord")
public AjaxResult uploadRecord(@RequestParam("file") MultipartFile file, Integer annexType, Long id) {
String username = this.getUsername();
Long userId = this.getUserId();
return caseEvidenceService.uploadRecord(file, annexType, id, username, userId);
}
@PostMapping("/batchUpload")
public AjaxResult batchUpload(@RequestParam("file") MultipartFile[] file, Integer annexType, Long id) {
if(file==null){
return error("请选择要上传的文件");
}
String username = this.getUsername();
Long userId = this.getUserId();
return caseEvidenceService.batchUpload(file, annexType, id, username, userId);
}
/**
* 获取附件
* @param caseAppliId
* @param annexTypeList
* @param
* @return
*/
@GetMapping("/fileList")
public AjaxResult fileList(Long caseAppliId, @RequestParam("annexTypeList") List<Integer> annexTypeList){
if(caseAppliId==null){
return error("案件id不能为空");
}
return caseEvidenceService.fileList(caseAppliId, annexTypeList);
}
/**
* 删除附件
* @param fileIds
* @return
*/
@PostMapping("/deleteFile")
public AjaxResult deleteFile( @RequestParam("fileIds") List<Integer> fileIds){
if(CollectionUtil.isEmpty(fileIds)){
return error("附件id不能为空");
}
return toAjax(caseEvidenceService.deleteFile( fileIds));
}
/**
* 查询当前用户案件列表
*
* @param caseStatus
* @return
*/
@GetMapping("/all")
public AjaxResult getCaseListAll(@RequestParam("caseStatus") Integer caseStatus) {
return success(caseEvidenceService.getCaseListAll(caseStatus));
}
/**
* 证据确认
*
* @param caseApplication 案件对象
* @return 统一返回结果
*/
@PutMapping("/confirm")
public AjaxResult evidenceConfirmation(@Validated @RequestBody CaseApplication caseApplication) {
return caseEvidenceService.evidenceConfirmation(caseApplication);
}
/**
* 案件质证
*
* @param caseEvidenceDTO
* @return
*/
@PostMapping("/crossexami")
public AjaxResult caseCrossexamination(@Validated @RequestBody CaseEvidenceDTO caseEvidenceDTO) {
return caseEvidenceService.caseCrossexamination(caseEvidenceDTO);
}
/**
* 获取证据目录树列表
*/
@GetMapping("/evidenceTree")
public AjaxResult evidenceTree(CaseEvidenceDirectory caseEvidenceDirectory)
{
return success(caseEvidenceService.selectEvidenceTreeList(caseEvidenceDirectory)) ;
}
}
@@ -0,0 +1,40 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.CaseLogRecord;
import com.ruoyi.wisdomarbitrate.service.ICaseLogRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/caseLogRecord")
public class CaseLogRecordController extends BaseController {
@Autowired
private ICaseLogRecordService caseLogRecordService;
/**
* 查询案件日志列表
*/
// @PreAuthorize("@ss.hasPermi('caseLog:list')")
@GetMapping("/list")
public AjaxResult list(CaseLogRecord caseLogRecord)
{
List<CaseLogRecord> list = caseLogRecordService.selectCaseLogRecordList(caseLogRecord);
return AjaxResult.success(list);
}
}
@@ -0,0 +1,74 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.wisdomarbitrate.domain.CaseNumRule;
import com.ruoyi.wisdomarbitrate.domain.TemplateManual;
import com.ruoyi.wisdomarbitrate.service.ICaseNumRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/caseNumRule")
public class CaseNumRuleController extends BaseController {
@Autowired
private ICaseNumRuleService caseNumRuleService;
/**
* 新增案件编号规则
* @param caseNumRule
* @return
*/
@PostMapping("/insertCaseNumRule")
public AjaxResult insertCaseNumRule(@RequestBody CaseNumRule caseNumRule){
caseNumRule.setCreateBy(getUsername());
return caseNumRuleService.insertCaseNumRule(caseNumRule);
}
/**
* 修改案件编号规则
* @param caseNumRule
* @return
*/
@PostMapping("/updateCaseNumRule")
public AjaxResult updateCaseNumRule(@RequestBody CaseNumRule caseNumRule){
return caseNumRuleService.updateCaseNumRule(caseNumRule);
}
/**
* 删除案件编号规则
* @param caseNumRule
* @return
*/
@PostMapping("/deleteCaseNumRule")
public AjaxResult deleteCaseNumRule(@RequestBody CaseNumRule caseNumRule){
return caseNumRuleService.deleteCaseNumRule(caseNumRule);
}
/**
* 查询案件编号规则
*/
@GetMapping("/list")
public TableDataInfo list(CaseNumRule caseNumRule) {
startPage();
List<CaseNumRule> list = caseNumRuleService.selectCaseNumRule(caseNumRule);
return getDataTable(list);
}
}
@@ -0,0 +1,110 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.collection.CollectionUtil;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.wisdomarbitrate.domain.BatchCaseApplication;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.dto.CaseConfirmPayDTO;
import com.ruoyi.wisdomarbitrate.service.ICasePaymentService;
import com.ruoyi.wisdomarbitrate.domain.dto.CasePayDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* 缴费支付
*/
@RestController
@RequestMapping("/pay")
public class CasePaymentController {
private final ICasePaymentService paymentService;
@Autowired
public CasePaymentController(ICasePaymentService paymentService){
this.paymentService=paymentService;
}
/**
* 案件缴费
* @param casePayDTO 缴费传入参数
* @return 统一响应结果
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:pay')")
@PostMapping("/casePay")
public AjaxResult casePay(@Validated @RequestBody CasePayDTO casePayDTO) {
return paymentService.casePay(casePayDTO);
}
/**
* 确认缴费
* @param payDTO 缴费传入参数
* @return 统一响应结果
*/
// @PreAuthorize("@ss.hasPermi('caseManagement:list:pay')")
@PostMapping("/confirmPay")
public AjaxResult confirmPay(@Validated @RequestBody CaseConfirmPayDTO payDTO) {
return paymentService.confirmPay(payDTO);
}
/**
* 批量缴费
* @param casePayDTO 缴费传入参数
* @return 统一响应结果
*/
@PostMapping("/casePayBatch")
public AjaxResult casePayBatch(@Validated @RequestBody CasePayDTO casePayDTO) {
return paymentService.casePayBatch(casePayDTO);
}
/**
* 批量缴费
* @param payDTO 缴费传入参数
* @return 统一响应结果
*/
@PostMapping("/confirmPayBatch")
public AjaxResult confirmPayBatch(@Validated @RequestBody CasePayDTO payDTO) {
return paymentService.confirmPayBatch(payDTO);
}
/**
* 缴费确认
* @param batchCaseApplication
* @return
*/
// @PreAuthorize("@ss.hasPermi('paymentManagement:list:payconfirm')")
@PutMapping("/confirm")
public AjaxResult confirmPayment(@Validated @RequestBody BatchCaseApplication batchCaseApplication) {
if(CollectionUtil.isEmpty(batchCaseApplication.getIds())){
return AjaxResult.error("参数校验失败");
}
return paymentService.confirmPayment(batchCaseApplication.getIds());
}
/**
* 缴费列表查询
* @param casePayDTO
* @return
*/
@GetMapping("/list")
public AjaxResult casePayList(CasePayDTO casePayDTO) {
return paymentService.casePayList(casePayDTO);
}
@PostMapping("/listBatch")
public AjaxResult casePayListBatch(@Validated @RequestBody CasePayDTO casePayDTO) {
return paymentService.casePayListBatch(casePayDTO);
}
/**
* 批量缴费确认
* @param batchCaseApplication
* @return
*/
@PostMapping("/confirmBatch")
public AjaxResult confirmPaymentBatch(@Validated @RequestBody BatchCaseApplication batchCaseApplication) {
if(StringUtils.isEmpty(batchCaseApplication.getBatchNumber())){
return AjaxResult.error("参数校验失败");
}
return paymentService.confirmPaymentBatch(batchCaseApplication.getBatchNumber());
}
}
@@ -0,0 +1,237 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.EsignDemoException;
import com.ruoyi.wisdomarbitrate.domain.*;
import com.ruoyi.wisdomarbitrate.domain.vo.SealListVO;
import com.ruoyi.wisdomarbitrate.service.IDeptIdentifyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController
@RequestMapping("/deptIdentify")
public class DeptIdentifyController extends BaseController {
@Autowired
private IDeptIdentifyService deptIdentifyService;
/**
* 新增机构
* @param deptIdentify
* @return
*/
@PostMapping("/insert")
public AjaxResult insertDeptIdentify(@RequestBody DeptIdentify deptIdentify){
return deptIdentifyService.insertDeptIdentify(deptIdentify);
}
/**
* 删除机构
* @param id
* @return
*/
@DeleteMapping("/delete")
public AjaxResult deleteDeptIdentify(Long id){
return deptIdentifyService.deleteDeptIdentify(id);
}
/**
* 修改机构信息
* @param deptIdentify
* @return
*/
@PutMapping("/update")
public AjaxResult updateDeptIdentify(@RequestBody DeptIdentify deptIdentify){
return deptIdentifyService.updateDeptIdentify(deptIdentify);
}
/**
* 查询机构信息
*/
@GetMapping("/list")
public TableDataInfo list(DeptIdentify deptIdentify) {
startPage();
List<DeptIdentify> list = deptIdentifyService.selectDeptIdentify(deptIdentify);
return getDataTable(list);
}
/**
* 查询机构认证链接
*/
@PostMapping("/selectDeptIndefiUrl")
public AjaxResult selectDeptIndefiUrl(@Validated @RequestBody DeptIdentify deptIdentify) throws EsignDemoException {
DeptIdentify deptIdentifyselect = deptIdentifyService.selectDeptIndefiUrl(deptIdentify);
return success(deptIdentifyselect);
}
/**
* 机构启用/禁用
*/
@PostMapping("/enableDept")
public AjaxResult enableDept(@Validated @RequestBody DeptIdentify deptIdentify) {
return deptIdentifyService.enableDept(deptIdentify);
}
/**
* 上传自定义公章
*
* @param
* @param file
* @return
*/
@PostMapping("/sealUpload")
public AjaxResult sealUpload(Long id, String sealName , @RequestParam("file") MultipartFile file) {
return deptIdentifyService.sealUpload(id, sealName ,file);
}
/**
* 接收E签宝回调通知
* @param body
* @return
*/
@GetMapping("/notify")
public AjaxResult receiveNotify(String body) {
return deptIdentifyService.receiveNotify(body);
}
/**
* 公章列表查询
* @param deptIdentify
* @return
*/
@GetMapping("/sealList")
public TableDataInfo getSealList( DeptIdentify deptIdentify ){
startPage();
List<SealManage> sealList = deptIdentifyService.getSealList(deptIdentify);
return getDataTable(sealList);
}
/**
* 印章启用或者禁用
* @param sealManage
* @return
*/
@PostMapping("/updateSealLockStatus")
public AjaxResult updateSealLockStatus(@Validated @RequestBody SealManage sealManage){
if(sealManage.getId()==null ||sealManage.getIsUse()==null){
return error("参数校验失败");
}
return deptIdentifyService.updateSealLockStatus(sealManage);
}
/**
* 新增模板
* @param templateManage
* @return
*/
@PostMapping("/insertTemplate")
public AjaxResult insertTemplate(TemplateManage templateManage,@RequestParam("file") MultipartFile file){
return deptIdentifyService.insertTemplate(templateManage,file);
}
/**
* 修改模板
* @param templateManage
* @return
*/
@PostMapping("/updateTemplate")
public AjaxResult updateTemplate(TemplateManage templateManage,@RequestParam(value = "file", required = false) MultipartFile file){
return deptIdentifyService.updateTemplate(templateManage,file);
}
/**
* 删除模板
* @param id
* @return
*/
@DeleteMapping("/deleteTemplate")
public AjaxResult deleteTemplate(Long id){
return deptIdentifyService.deleteTemplate(id);
}
/**
* 根据机构id查询模板
* @param deptIdentify
* @return
*/
@GetMapping("/getTemplate")
public TableDataInfo getTemplateList( DeptIdentify deptIdentify){
startPage();
List<TemplateManage> sealList = deptIdentifyService.getTemplateList(deptIdentify);
return getDataTable(sealList);
}
/**
* 根据部门id查询岗位用户信息
*/
@GetMapping("selectPostUserByDeptId")
public AjaxResult selectPostUserByDeptId(DeptIdentify deptIdentify){
return AjaxResult.success(deptIdentifyService.selectPostUserByDeptId(deptIdentify));
}
/**
* 给机构绑定经办人
*/
@GetMapping("bindHandler")
public AjaxResult bindHandler(DeptIdentify deptIdentify){
return deptIdentifyService.bindHandler(deptIdentify);
}
/**
* 根据模板id查询抓取规则
* @param templateManage
* @return
*/
@PostMapping("/getFatchRuleByTemplateid")
public AjaxResult getFatchRuleByTemplateid(@RequestBody TemplateManage templateManage){
List<FatchRule> fatchRuleList = deptIdentifyService.getFatchRuleByTemplateid(templateManage);
return AjaxResult.success(fatchRuleList);
}
/**
* 保存抓取规则
* @param templateManage
* @return
*/
@PostMapping("/saveFatchRules")
public AjaxResult saveFatchRules(@RequestBody TemplateManage templateManage){
return deptIdentifyService.saveFatchRules(templateManage);
}
/**
* 查询column和注释
* @return
*/
@PostMapping("/selectColumnandComment")
public AjaxResult selectColumnandComment(){
List<FatchRule> fatchRuleList = deptIdentifyService.selectColumnandComment();
return AjaxResult.success(fatchRuleList);
}
/**
* 查询column
* @return
*/
@PostMapping("/selectColumnbycomment")
public AjaxResult selectColumnbycomment(@RequestBody FatchRule fatchRule){
FatchRule fatchRulesel = deptIdentifyService.selectColumnbycomment(fatchRule);
return AjaxResult.success(fatchRulesel);
}
/**
* 根据模板id查询模板字段列表
* @param id
* @return
*/
@GetMapping("/getTemplateInfoById")
public AjaxResult getTemplateInfoById(@RequestParam("id") Long id){
TemplateManage templateManage = new TemplateManage();
templateManage.setId(id);
List<FatchRule> fatchRuleList = deptIdentifyService.getTemplateInfoById(templateManage);
return AjaxResult.success(fatchRuleList);
}
}
@@ -0,0 +1,43 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication;
import com.ruoyi.wisdomarbitrate.service.IdentityAuthenticationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/identityAuthentication")
public class IdentityAuthenticationController extends BaseController {
@Autowired
private IdentityAuthenticationService identityAuthenticationService;
/**
* 获取EIDtoken
*/
@Anonymous
@PostMapping("/selectIdentityAuthenticaEIDtoken")
public AjaxResult selectIdentityAuthenticaEIDtoken() {
JSONObject tokenResult = identityAuthenticationService.selectIdentityAuthenticaEIDtoken();
return success(tokenResult);
}
/**
* 小程序人脸核身后查询身份认证结果
*/
@Anonymous
@PostMapping("/selectIdentityAuthenticaRespon")
public AjaxResult selectIdentityAuthenticaRespon(@Validated @RequestBody IdentityAuthentication ientityAuthentication) {
AjaxResult checkResult = identityAuthenticationService.selectIdentityAuthenticaRespon(ientityAuthentication);
return checkResult;
}
}
@@ -0,0 +1,48 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.wisdomarbitrate.domain.CaseLogRecord;
import com.ruoyi.wisdomarbitrate.domain.SendMailRecord;
import com.ruoyi.wisdomarbitrate.service.ISendMailRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/sendMailRecord")
public class SendMailRecordController extends BaseController {
@Autowired
private ISendMailRecordService sendMailRecordService;
/**
* 查询发送邮件记录列表
*/
@GetMapping("/list")
public TableDataInfo list(SendMailRecord sendMailRecord)
{
startPage();
List<SendMailRecord> list = sendMailRecordService.selectSendMailRecordList(sendMailRecord);
return getDataTable(list);
}
// /**
// * 新增立案数据
// */
// @Log(title = "新增立案数据", businessType = BusinessType.INSERT)
// @PostMapping("/addSendMailRecord")
// public AjaxResult addSendMailRecord(@Validated @RequestBody SendMailRecord sendMailRecord)
// {
//
// return toAjax(sendMailRecordService.addSendMailRecord(sendMailRecord));
// }
}
@@ -0,0 +1,59 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.wisdomarbitrate.domain.DeptIdentify;
import com.ruoyi.wisdomarbitrate.domain.TemplateManual;
import com.ruoyi.wisdomarbitrate.service.ITemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/template")
public class TemplateController extends BaseController {
@Autowired
private ITemplateService templateService;
/**
* 新增模板
* @param templateManual
* @return
*/
@PostMapping("/insert")
public AjaxResult insertTemplate(@RequestBody TemplateManual templateManual){
return templateService.insertTemplate(templateManual);
}
/**
* 删除模板
* @param id
* @return
*/
@DeleteMapping("/delete")
public AjaxResult deleteTemplate(Long id){
return templateService.deleteTemplate(id);
}
/**
* 修改模板
* @param templateManual
* @return
*/
@PutMapping("/update")
public AjaxResult updateTemplate(@RequestBody TemplateManual templateManual){
return templateService.updateTemplate(templateManual);
}
/**
* 查询模板
*/
@GetMapping("/list")
public TableDataInfo list( TemplateManual templateManual) {
startPage();
List<TemplateManual> list = templateService.selectTemplate(templateManual);
return getDataTable(list);
}
}
@@ -0,0 +1,149 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication;
import com.ruoyi.wisdomarbitrate.domain.vo.ReservedConferenceVO;
import com.ruoyi.wisdomarbitrate.domain.vo.SendRoomNoMessageVO;
import com.ruoyi.wisdomarbitrate.domain.vo.WeChatUserVO;
import com.ruoyi.wisdomarbitrate.service.VideoService;
import com.ruoyi.wisdomarbitrate.service.WeChatUserService;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.*;
import com.tencentyun.TLSSigAPIv2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.IOException;
/**
* @author wangqiong
* @description trtc实时音视频
* @date 2023-10-26 11:25
*/
@RestController
@RequestMapping("/video")
public class VideoController extends BaseController {
@Autowired
private VideoService videoService;
/**
* 从腾讯云下载文件到本地
* @param
* @return
*/
@Anonymous
@PostMapping("/videoRollBack")
public AjaxResult videoRollBack( @RequestBody String body, HttpServletRequest request) {
videoService.videoRollBack(body,request);
return success();
}
/**
* 根据房间号绑定案件ID
* @param
* @return
*/
@Anonymous
@PostMapping("/bindCaseId")
public AjaxResult bindCaseId(@Valid @RequestBody SendRoomNoMessageVO vo) {
return videoService.bindCaseId(vo.getId(),vo.getRoomNo());
}
/**
* 根据案件ID查询视频
* @param caseId 案件id
* @return
*/
@GetMapping("/videoList")
public AjaxResult videoList( @RequestParam Long caseId) {
return videoService.videoList(caseId);
}
/**
* 开启腾讯云录制
* @param vo
* @return
* @throws Exception
*/
@Anonymous
@PostMapping("/openCloudRecording")
private AjaxResult openCloudRecording( @RequestBody ReservedConferenceVO vo) {
if(vo.getCaseId()==null || vo.getRoomId()==null){
return AjaxResult.error("参数错误");
}
return videoService.openCloudRecording(vo.getCaseId(),vo.getRoomId());
}
/**
* 关闭腾讯云录制
* @param taskId 任务ID
* @return
*/
@Anonymous
@PostMapping("/closeDeleteCloudRecording")
public AjaxResult closeDeleteCloudRecording(@RequestParam("taskId") String taskId){
return videoService.closeDeleteCloudRecording(taskId);
}
/**
* 解散房间
* @param reservedConferenceVO
* @return
*/
@Anonymous
@PostMapping("/dissolveRoom")
public AjaxResult dissolveRoom( @RequestBody ReservedConferenceVO reservedConferenceVO) {
if( reservedConferenceVO.getRoomId()==null){
return error("参数校验失败");
}
return videoService.dissolveRoom(reservedConferenceVO.getRoomId());
}
/**
* 根据userId查询该用户是否是秘书
* @param userId
* @return
*/
@Anonymous
@GetMapping("secretaryRoleByUserId")
public AjaxResult secretaryRoleByUserId( @RequestParam(value = "userId",required = true) Long userId) {
return videoService.secretaryRoleByUserId(userId);
}
/**
* 根据html字符串转pdf并和案件关联
* @param reservedConferenceVO
* @return
*/
@Anonymous
@PostMapping("htmlToPDF")
public AjaxResult secretaryRoleByUserId( @RequestBody ReservedConferenceVO reservedConferenceVO) {
if( reservedConferenceVO.getCaseId()==null || StrUtil.isEmpty(reservedConferenceVO.getHtmlContent())){
return success();
}
return videoService.htmlToPDF(reservedConferenceVO);
}
/**
* 根据案件id和类型查询附件
* @param caseAppliId
* @param annexType
* @return
*/
@GetMapping("attachListByCaseId")
public AjaxResult attachListByCaseId( @RequestParam("caseAppliId") Long caseAppliId,@RequestParam("annexType") Integer annexType) {
return videoService.attachListByCaseId(caseAppliId,annexType);
}
}
@@ -0,0 +1,62 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication;
import com.ruoyi.wisdomarbitrate.domain.vo.WeChatUserVO;
import com.ruoyi.wisdomarbitrate.service.WeChatUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author wangqiong
* @description 微信小程序用户注册登录
* @date 2023-10-16 11:25
*/
@RestController
@RequestMapping("/weChatUser")
public class WeChatUserController extends BaseController {
@Autowired
private WeChatUserService weChatUserService;
/**
* 小程序端获取手机验证码
* @param userVO
* @return
*/
@Anonymous
@GetMapping("/sendCode")
public AjaxResult sendCode( WeChatUserVO userVO)
{
if(StrUtil.isEmpty(userVO.getPhone())){
return warn("手机号不能为空");
}
return weChatUserService.sendCode(userVO);
}
/**
* 小程序注册
*/
@Anonymous
@PostMapping("/registerUser")
public AjaxResult registerUser( @RequestBody IdentityAuthentication ientityAuthentication) {
if(ientityAuthentication.getId()==null
|| StrUtil.isEmpty(ientityAuthentication.getName())
|| StrUtil.isEmpty(ientityAuthentication.getIdentityNo())
|| StrUtil.isEmpty(ientityAuthentication.getPhone())
|| StrUtil.isEmpty(ientityAuthentication.getUserName())
|| StrUtil.isEmpty(ientityAuthentication.getEmail())
|| StrUtil.isEmpty(ientityAuthentication.getVerifyCode())
){
return warn("参数校验失败");
}
logger.info("调用小程序注册==="+ientityAuthentication.toString());
return weChatUserService.registerUser(ientityAuthentication);
}
}
@@ -0,0 +1 @@
MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQC12YM9mR+HFQYTx/fHKHZbgszVtDHDB0B/ysWl3MbcPpGtjcZlDr5aynRMRLaoduRHT++A98IaNVIVGj9RHdXrX2j9I/Uz6fYDH63cdu6FZ6Pk82yPwNZW7pebprbVHInR/7gzsKQWSWEST70BgjCRqlbfAE6xzUZFTeYxciCjptm0rUQ2MC24xRdkvZByIDIYFnQ/AdmSFqNtKDR2WpEV/M8aBjyuPPomRJZ1X8oudWuJIU4ySdas04fCbDxD10TY/wyQcDHXuG1IrQpXme4DOGQeJZ0/aOFphBkDFUyPGfYMmLshOPNdBKi2IqWHPPs4XsV4Rv6+tvTSnMF2uGqHAgMBAAECggEAPa1sifPpcZN74DGupGng2uDeQI1BY3iOM8m+h6b9+61tE4RGifgaMAkCsOuNWE4a1uURwphFyUXUdTvVxdlsuMw/e7w6akUsH5sbCO99rtmcCQdXBtrM1+dMnIpK8LUhOYyWGVIMFVMGDYPmAyD5AC7aEAC2sC+DafYl4RdoYpidq1YxeE7DVw1aQHCI2mKhYjZG+3RDDGDfNFvdyH61MgdYjoGkeXNvARzEXgfWvfiTrHZ3H1SYgvOEHofzKDTrWsQL2dvaEsc55Jiw0AgNUVcgby7al8PUekTJoK3ZvrE3pSWaUirBcqsqWISHjeR7Xx501CHIha8EnZwlnDoM4QKBgQDtnYzwQ5mHg7cRHD8Z6QdTpvBvYSEPesiUT/HeI+AKQKDCVJxKiLvJagc6zZkOzV9bZDS/WLgzXWMyxUb+OTjht0jLWAMcf7NfFp3tPKq9wkmQQ/vQSBQ1lFmO6A4Zq1eoGKeUCB4pKBG6cSM+t8+ruhm7s1ZUt+6EBwCVN/izrQKBgQDD62jIm+6NFErdidUaIrGiFUrzqdR13w6JOexfk+O6Aau3wRqsr7Wz4nqQvVVxGMRpXbOH06zpeiS+vMmjwgO973VoLAmH+hJ0GZz8qj3zA2GEOFWjD2V7tqeRvGkQvz0v46pl+8sBJkrRHLN7DWNYY5NDI+b7exwqcTc/LL19gwJ/a6r4MeZvqvgD+7zQ2uy8ZSs/xzg7wsfgG1QeRIn8+qhOL8AnEZ7jeGCS5hJDSHHGw6KkRA/vZ1bpnBfIE2naXGywj3NR9Zfnry6QYO8cbt+adcRYVghTH/QYoKiFuxvonEKPrIQBJqUBY3ngforLjwTEpEie1cSCT1Dc8sBp8QKBgQCaz8fqzRyBKknGKQXVMxj+JKknRUl3IpzP3o9jLu9BqdRQzSwQzH9d91Y2TQXY6mM5hys35xG5JCUo+vCyj7p5OWCiwjl90yMFzr93/+YXwtIpsoIo6R+d1EUxKZoz+4mT7+hT0dUlwWZZOr6wO3IHBBf3c8UvbqZg+zlWmDnblQKBgEs6jwMkb5zaG2fyBJ7PJUN/8nIz8V+X0SxQfcEqIX0J+EC+7MAgFjcdZFp+lca3Vd9z+8Ksd4rMzMa5y856ositL2NZ+K0fs8i8EBaQPny61OgCFUuXEuv5keB2YuGMSns5FYRWuByrtDXl4PxzKXvq05iKWLKCaCq9v4momvKZ
@@ -0,0 +1 @@
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhUnjdAKwZApwZEcfq+5L0pa77Vg3mqcoXv+th8RR0SYotkPsH1f2JkbS48ySaSCM6YNWSMNfqp5qdOla2zUJOBnJ/yaBg7s7fVD6V3M2mEog8kCDYGKt/3P4VII3xYl8lFYMQ3IcFRELkxCBBCA8JDKmf5z2R4F/Z/jFFEuOwxaJvp+7Ke9OzZHYdWGNnU6QP8YYLYUeX7VNZLHEuly34ExAw6A+yJkNDsYEho2Lu31QjT2pLh9g+88MlRfiI92iN25O9NVdeM4f5RcpvBPrBQZQs9tlFmALYSFS3prIf3FAobWM+W7iwxT6J25nFIhst1DdJQfIBpaeRUJVTkn99QIDAQAB
@@ -6,9 +6,9 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/ruyivue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: ruyivue
password: rybackproje13689
url: jdbc:mysql://121.40.189.20:3306/test_smart_arbitration?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: YMzc157#
# 从库数据源
slave:
# 从数据源开关/默认关闭
+73 -7
View File
@@ -9,7 +9,7 @@ ruoyi:
# 实例演示开关
demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
profile: D:/ruoyi/uploadPath
profile: /home/ruoyi/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
@@ -18,7 +18,7 @@ ruoyi:
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8080
port: 8001
servlet:
# 应用的访问路径
context-path: /
@@ -32,7 +32,6 @@ server:
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
# 日志配置
logging:
level:
@@ -59,9 +58,9 @@ spring:
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
max-file-size: 50MB
# 设置总上传的文件大小
max-request-size: 20MB
max-request-size: 500MB
# 服务模块
devtools:
restart:
@@ -70,9 +69,9 @@ spring:
# redis 配置
redis:
# 地址
host: localhost
host: 121.40.189.20
# 端口,默认为6379
port: 6379
port: 6389
# 数据库索引
database: 0
# 密码
@@ -89,6 +88,31 @@ spring:
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
web:
resources:
static-locations: file:/home/ruoyi/
mail:
host: smtp.163.com
port: 25
username: lmj1549843951@163.com
password: JGIOQVFCLAZKXRKO
default-encoding: UTF-8
properties:
mail:
smtp:
connectiontimeout: 5000
timeout: 5000
writetimeout: 5000
socketFactoryClass: javax.net.ssl.SSLSocketFactory
socketFactoryFallback: false
socketFactoryPort: 465
debug: false
protocol: smtp
#上上签配置参数
ssq:
developerId: 1695872832013855470
privateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCiDRuz+dxqkWqHdov0hK+KEWLw/e8MQSqkZZ4c01Yr6cSmQiWyV8Xin0u5S/EA02FWxpjLi1nLriVtOBhZGsoryFmcJrwzSnQ5PORP/HhfcAWFE/Y+3qSQS1OiU7e5wbReCgEUvx4GHZuhdu8cOvq5DG9l33YFZrIEMBTmnf8eKT54STx0tjcKl7U6B6nsiThy3zVtpWXVv6H1HGmxC0KT4EQ388s/PFjrwmk+GFb3EpKCns/GQHf7QrtNz1ZOgCXfgQiQ+91/tcngzUH+zMCIxn5lS+ENAxVI6Ev3W9Y0QHtKwmO4ORVuAskJYzBB2xKI/gw8+PUXNziMAKXuoUAjAgMBAAECggEAd7yHw6vTGUrpE76cGsgPjEzcdoSqpLth7qbG9TWSblAEZXRqtiP0q0ZYhUl/gcSuH5gOPhdw+fZq4RCZrP0GdONMkvxsAtn4lnJPoGpD5wC2k2X0hO+tWJDP8xk4n6BozTNHKTUt0gb+f4eJlapep2xwwy0h30vKLR3504zafEV9j/2D8l5TFSv6rd3UVxUvrDKQ9mhfATEUlrTpjs0SfWupMkr4j7TuJJ8qSUSiEADe4hyUB6+LouDZCt8jV4aLojQBJKrQ6VPVdDFkHGsePu4tHtvcKsaOZJ0pjpJ7MT6D5ElD/sJjo0g/3qK5/FToVFVbrxtykVreK6mE5oSTQQKBgQDpEFSgH1d4N7NsZhviaCIUkB97hO0jpRbD7UZirzZ9ok96Fk+SmfhdmypDMoiaRHCNhQuu5dI9mg5RbUhz9mCZnAhzJRL+DmE4bhNvQmbtJA7KT6n/AdH2zy0mYulrcG17dQspvTr/5421PTEE2+FRoCbG6hBsSSUit9HLvAU13QKBgQCx/7ql+hbx+t0Yb02XckBHiA+MWrFLO4dMX9cKf3LldC0nhn0K9HOSoZmM0KcmXRnMo+/4t89xOJRl7JRXwcLoy/64OaUBVv+8FFV1yY4THka3nEnQE40vVWy+vuNJtt+eKlEhJ35N1GIHXo7/4j0POtEuNU7KSqMnLUD+Oy/t/wKBgEiajcJUASuyLnLWXFlrlzJQs34HKtiv1Se0Avk7G/6HUbr2uFMzI+wFKmVEmMl2CJoNmFYjwhruowc6xBdb6TvxH7C/G+uJD0BFCkjeprG5SeI8bvjB2GbKo4YRyiVuIK0VCSU3jemqeLq9FUguN0L2YR4WTIdvQeJO4UxWhkkBAoGBAJk7TxDHZK1XirIYTzGK928c4FWxVWMwkd7buqGc6epBwwV9r3OY0U1vtGIW1W4fQ7B5iIISqpALZyT/Lw0FDqedxWAOr8+hd3IQBynpI1et/q7d6mUoD6ip332tkrjIp2TfhQwHlaGmreUuL+h0eJ/9wEoJNhTLf/yf5o11omM9AoGBAOLVlXR9FbU2Ubpp3HwTumSzKDWzq3T5eQcqC1zE3BPOo29uAf9BQTumPxe51U64egttW/nif5FH4v4Gentmxb2B2ckdOs/u9zIWz3JPfHU7RqMyMokuWrQ6lMoiSYpH3MSHoavLyAEhAnpceX3oktXgpYHO9d8MfON3XKJl23ip
serverHost: https://openapi.bestsign.info/openapi/v2/
# token配置
token:
@@ -129,3 +153,45 @@ xss:
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
#支付相关配置
elegent:
pay:
wxpay:
mchId: 1561414331
appId: wx6592a2db3f85ed25
appSecret: d9a9ff00a633cd7353a8925119063b01
mchSerialNo: 25FBDE3EFD31B03A4377EB9A4A47C517969E6620
apiV3Key: CZBK51236435wxpay435434323FFDuv3
alipay:
appId: 2021003141676135
callback:
domain: http://121.40.189.20:9001/
watch: true
cycle: 10
identityAuthentication:
credentialSecretId: AKID3xfHgroY4MQHvLXUXMwIQL1UjmbBX1Tv
credentialSecretKey: INDrIXcT8YmomZBcsy0oNirnU0LTN4X7
merchantId: 0NSJ2309281116194321
privateKeyHexDecodeinfo: 4c3b311bf7b98969994e85928e069574a1e95777f24d1c510679cc3c2f460faf
# 腾讯云即时通信相关配置
imConfig:
# sdkAppId
sdkAppId: 1600011167
# 密钥
sdkSecretKey: 17d136d9327576a247f991bdfed3a6d14cebc7d540a52245086829c3a1421a86
# 腾讯云账户 SecretId
secretId: AKID3xfHgroY4MQHvLXUXMwIQL1UjmbBX1Tv
# 腾讯云密钥
secretKey: INDrIXcT8YmomZBcsy0oNirnU0LTN4X7
#jodconverter:
# local:
# host: 121.40.189.20
#暂时关闭预览,启动时会有点慢
# enabled: true
#设置libreoffice主目录 linux地址如:/usr/lib64/libreoffice
# office-home: /usr/lib64/libreoffice/
# office-home: D:\app\libreOffice\
#开启多个libreoffice进程,每个端口对应一个进程
# port-numbers: 8100
#libreoffice进程重启前的最大进程数
# max-tasks-per-process: 100
@@ -0,0 +1 @@
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDBHGgIh80193GhdpD1LtMZfTRpcWI0fImyuBCyrd3gYb3rrsARebGcHdJsQA3mVjVqVp5ybhEZDPa4ecoK4Ye1hTppNpI/lmLt4/uUV/zhF5ahli7hi+116Ty6svHSbuMQBuUZeTFOwGrxjvofU/4pGIwh8ZvkcSnyOp9uX2177UVxDBkhgbZbJp9XF2b83vUa5eHo93CziPzn3hFdAlBCdTXB7DH+m0nN3Jou0szGukvq7cIgGpHku4ycKSTkIhhl9WRhN6OoSEJxq88MXzjkzTruc85PHN52aUTUifwg3T8Y4XqFQ61dTnEmgxeD2O6/pLdB9gLsp6yCGqN5Lqk7AgMBAAECggEBAL4X+WzUSbSjFS9NKNrCMjm4H1zgqTxjj6TnPkC1mGEltjAHwLgzJBw62wWGdGhWWpSIGccpBBm1wjTMZpAZfF66fEpP1t1Ta6UjtGZNyvfFIZmE3jdWZ/WXGBnsxtFQKKKBNwrBW0Fbdqq9BQjLxLitmlxbmwrgPttcy855j6vZqq4MBT1v8CtUT/gz4UWW2xWovVnmWOrRSScv7Nh0pMbRpPLkNHXrBwSSNz/keORzXB9JSm85wlkafa7n5/IJbdTml3A/uAgW3q3JZZQotHxQsYvD4Zb5Cnc9CPAXE5L2Yk877kVXZMGt5QPIVcPMj/72AMtaJT67Y0fN0RYHEGkCgYEA38BIGDY6pePgPbxB7N/l6Df0/OKPP0u8mqR4Q0aQD3VxeGiZUN1uWXEFKsKwlOxLfIFIFk1/6zQeC0xetNTKk0gTL8hpMUTNkE7vI9gFWws2LY6DE86Lm0bdFEIwh6d7Fr7zZtyQKPzMsesC3XV9sdSUExEi5o/VwAyf+xZlOXcCgYEA3PGZYlILjg3esPNkhDz2wxFw432i8l/BCPD8ZtqIV9eguu4fVtFYcUVfawBb0T11RamJkc4eiSOqayC+2ehgb+GyRLJNK4FqbFcsIT+CK0HlscZw51jrMR0MxTc4RzuOIMoYDeZqeGB6/YnNyG4pw2sD8bIwHm8406gtJsX/v10CgYAo8g3/aEUZQHcztPS3fU2cTkkl0ev24Ew2XGypmwsX2R0XtMSBuNPNyFHyvkgEKK2zrhDcC/ihuRraZHJcUyhzBViFgP5HBtk7VEaM36YzP/z9Hzw7bqu7kZ85atdoq6xpwC3Yn/o9le17jY8rqamD1mv2hUdGvAGYsHbCQxnpBwKBgHTkeaMUBzr7yZLS4p435tHje1dQVBJpaKaDYPZFrhbTZR0g+IGlNmaPLmFdCjbUjiPyA2+Znnwt227cHz0IfWUUAo3ny3419QkmwZlBkWuzbIO2mms7lwsf9G6uvV6qepKMeVd5TWEsokVbT/03k27pQmfwPxcK/wS0GFdIL/udAoGAOYdDqY5/aadWCyhzTGI6qXPLvC+fsJBPhK2RXyc+jYV0KmrEv4ewxlK5NksuFsNkyB7wlI1oMCa/xB3T/2vTBALgGFPi8BJqceUjtnTYtI4R2JIVEl08RtEJwyU5JZ2rvWcilsotVZYwfuLZ9KfdhkTrgNxlp/KKkr+UuKce4Vs=
+159
View File
@@ -11,12 +11,76 @@
<artifactId>ruoyi-common</artifactId>
<description>
common通用工具
</description>
<dependencies>
<!--docx文件下载问题-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!-- POI依赖,读取.doc型文档-->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-local</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>jurt</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>ridl</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>juh</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>unoil</artifactId>
<version>3.0.1</version>
</dependency>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
@@ -126,6 +190,101 @@
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!-- 腾讯短信sdk -->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.876</version>
</dependency>
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-faceid</artifactId>
<version>3.1.875</version>
</dependency>
<!--用户信息解密-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.15</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.69</version>
</dependency>
<!-- poi-tl-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-local</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-transformer-msoffice-word</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13</version>
</dependency>
<!-- 发送邮件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,13 @@
package com.ruoyi.common.annotation;
/**
* 一个参数、没有返回
* @author wangqiong
*/
@FunctionalInterface
public interface VoidFunction<T> {
/**
* 有一个参数
* @param param
*/
void apply(T param);
}
@@ -0,0 +1,13 @@
package com.ruoyi.common.config;
public class EsignDemoConfig {
// 应用ID
public static final String EsignAppId = "7438987614";
// 应用密钥
public static final String EsignAppSecret = "9d7844f13830931037772b9d20cf1529";
// e签宝接口调用域名(模拟环境)
public static final String EsignHost = "https://smlopenapi.esign.cn";
// e签宝接口调用域名(正式环境)
// public static final String EsignHost = "https://openapi.esign.cn";
}
@@ -132,4 +132,17 @@ public class RuoYiConfig
{
return getProfile() + "/upload";
}
/**
* 获取上传路径
*/
public static String getVideoUploadPath()
{
return getProfile() + "/video";
}
public static String getHtml2PDFPath()
{
return getProfile() + "/upload/html2PDF";
}
// https://1304001529.vod-qcloud.com/b78823bbvodcq1304001529/3ce565bf3270835011486046286/f0.mp4
}
@@ -41,4 +41,5 @@ public class CacheConstants
* 登录账户密码错误次数 redis key
*/
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
public static final String WE_CHAT_SMS_VERIFY_CODE_KEY="we_chat_sms_verify_code:";
}
@@ -0,0 +1,58 @@
package com.ruoyi.common.constant;
/**
* 立案申请案件状态
*
*/
public class CaseApplicationConstants {
/** 立案申请 */
public static final int CASE_APPLICATION = 0;
/** 待立案审查 */
public static final int CASE_CHECK = 1;
/** 待缴费 */
public static final int PENDING_PAYMENT = 2;
/** 待缴费确认 */
public static final int PENDING_PAYMENT_CONFIRM = 3;
/** 待案件质证 */
public static final int CASE_CROSSEXAMI = 4;
/** 待组庭 */
public static final int PENDING_TRIAL = 26;
/** 待组庭审核 */
public static final int CONFIRMDED_PENDING_TRIAL_SUBMMIT = 5;
/** 待组庭确定 */
public static final int CONFIRMDED_PENDING_TRIAL = 6;
/** 待审核仲裁方式 */
public static final int CHECK_ARBITRATION_METHOD = 7;
/** 待开庭审理 */
public static final int PENDING_OPENCOURT_HEAR = 8;
/** 待书面审理 */
public static final int PENDING_WRIITEN_HEAR = 9;
/** 待生成仲裁文书 */
public static final int GENERATED_ARBITRATION = 10;
/**待秘书核验仲裁文书*/
public static final int VERPRIF_ARBITRATION = 11;
/**待部门长审核仲裁文书*/
public static final int CHECK_ARBITRATION = 12;
/**待仲裁文书签名*/
public static final int SIGN_ARBITRATION = 13;
/** 待仲裁文书用印 */
public static final int ARBITRATED_SEAL = 14;
/** 待仲裁文书送达 */
public static final int ARBITRATION_DELIVERY = 15;
/** 待案件归档*/
public static final int CASE_FILING = 16;
/** 已归档*/
public static final int CASE_ARCHIVED = 17;
/** 待修改开庭时间*/
public static final int MODIFY_HEARDATE = 31;
/**待仲裁员审核仲裁文书*/
public static final int HEAD_CHECK_ARBITRATION = 18;
}
@@ -28,6 +28,14 @@ public class Constants
* http请求
*/
public static final String HTTP = "http://";
/**
* br标签
*/
public static final String BR = "</br>";
/**
* pdf拼接符
*/
public static final String PDFSTR = "∰";
/**
* https请求
@@ -128,6 +136,8 @@ public class Constants
* LDAPS 远程方法调用
*/
public static final String LOOKUP_LDAPS = "ldaps:";
public static final String DEFAULT_PASSWORD = "123456";
public static final String SPLIT_COMMA =",";
/**
* 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)
@@ -0,0 +1,371 @@
/*
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.ruoyi.common.constant;
import com.ruoyi.common.exception.EsignDemoException;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.message.BasicNameValuePair;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.Collator;
import java.text.MessageFormat;
import java.util.*;
/**
* @description 请求数据通用处理类
* @author 澄泓
* @date 2020年10月22日 下午14:25:31
* @since JDK1.7
*/
public class EsignEncryption {
/**
* 不允许外部创建实例
*/
private EsignEncryption(){}
/**
* 拼接待签名字符串
* @param httpMethod
* @param url
* @return
*/
public static String appendSignDataString(String httpMethod, String contentMd5,String accept,String contentType,String headers,String date, String url) throws EsignDemoException {
StringBuffer sb = new StringBuffer();
sb.append(httpMethod).append("\n").append(accept).append("\n").append(contentMd5).append("\n")
.append(contentType).append("\n");
if ("".equals(date) || date == null) {
sb.append("\n");
} else {
sb.append(date).append("\n");
}
if ("".equals(headers) || headers == null) {
sb.append(url);
} else {
sb.append(headers).append("\n").append(url);
}
return new String(sb);
}
/***
* Content-MD5的计算方法
* @param str 待计算的消息
* @return MD5计算后摘要值的Base64编码(ContentMD5)
* @throws EsignDemoException 加密过程中的异常信息
*/
public static String doContentMD5(String str) throws EsignDemoException {
byte[] md5Bytes = null;
MessageDigest md5 = null;
String contentMD5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
// 计算md5函数
md5.update(str.getBytes("UTF-8"));
// 获取文件MD5的二进制数组(128位)
md5Bytes = md5.digest();
// 把MD5摘要后的二进制数组md5Bytes使用Base64进行编码(而不是对32位的16进制字符串进行编码)
contentMD5 = Base64.encodeBase64String(md5Bytes);
} catch (NoSuchAlgorithmException e) {
EsignDemoException ex = new EsignDemoException("不支持此算法",e);
ex.initCause(e);
throw ex;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return contentMD5;
}
/***
* 计算请求签名值-HmacSHA256摘要
* @param message 待签名字符串
* @param secret 密钥APP KEY
* @return reqSignature HmacSHA256计算后摘要值的Base64编码
* @throws EsignDemoException 加密过程中的异常信息
*/
public static String doSignatureBase64(String message, String secret) throws EsignDemoException {
String algorithm = "HmacSHA256";
Mac hmacSha256;
String digestBase64 = null;
try {
hmacSha256 = Mac.getInstance(algorithm);
byte[] keyBytes = secret.getBytes("UTF-8");
byte[] messageBytes = message.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm));
// 使用HmacSHA256对二进制数据消息Bytes计算摘要
byte[] digestBytes = hmacSha256.doFinal(messageBytes);
// 把摘要后的结果digestBytes使用Base64进行编码
digestBase64 = Base64.encodeBase64String(digestBytes);
} catch (NoSuchAlgorithmException e) {
EsignDemoException ex = new EsignDemoException("不支持此算法",e);
ex.initCause(e);
throw ex;
} catch (InvalidKeyException e) {
EsignDemoException ex = new EsignDemoException("无效的密钥规范",e);
ex.initCause(e);
throw ex;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return digestBase64;
}
/**
* 获取时间戳
* @return
*/
public static String timeStamp() {
long timeStamp = System.currentTimeMillis();
return String.valueOf(timeStamp);
}
/**
* byte字节数组转换成字符串
* @param b
* @return
*/
public static String byteArrayToHexString(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toLowerCase();
}
/**
* hash散列加密算法
* @return
*/
public static String Hmac_SHA256(String message,String key) throws EsignDemoException {
byte[] rawHmac=null;
try {
SecretKeySpec sk = new SecretKeySpec(key.getBytes(), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(sk);
rawHmac = mac.doFinal(message.getBytes());
}catch (InvalidKeyException e){
EsignDemoException ex = new EsignDemoException("无效的密钥规范",e);
ex.initCause(e);
throw ex;
} catch (NoSuchAlgorithmException e) {
EsignDemoException ex = new EsignDemoException("不支持此算法",e);
ex.initCause(e);
throw ex;
}catch (Exception e){
EsignDemoException ex = new EsignDemoException("hash散列加密算法报错",e);
ex.initCause(e);
throw ex;
}finally {
return byteArrayToHexString(rawHmac);
}
}
/**
* MD5加密32位
*/
public static String MD5Digest(String text) throws EsignDemoException {
byte[] digest=null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(text.getBytes());
digest = md5.digest();
}catch (NoSuchAlgorithmException e){
EsignDemoException ex = new EsignDemoException("不支持此算法",e);
ex.initCause(e);
throw ex;
}finally {
return byteArrayToHexString(digest);
}
}
public static void formDataSort(List<BasicNameValuePair> param) {
Collections.sort(param, new Comparator<BasicNameValuePair>() {
@Override
public int compare(BasicNameValuePair o1, BasicNameValuePair o2) {
Comparator<Object> com = Collator.getInstance(Locale.CHINA);
return com.compare(o1.getName(), o2.getName());
}
});
}
/***
* 字符串是否为空(含空格校验)
* @param str
* @return
*/
public static boolean isBlank(String str) {
if (null == str || 0 == str.length()) {
return true;
}
int strLen = str.length();
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(str.charAt(i))) {
return false;
}
}
return true;
}
/***
* 对请求URL中的Query参数按照字段名的 ASCII 码从小到大排序(字典排序)
*
* @param apiUrl
* @return 排序后的API接口地址
* @throws Exception
*/
public static String sortApiUrl(String apiUrl) throws EsignDemoException {
if (!apiUrl.contains("?")) {
return apiUrl;
}
int queryIndex = apiUrl.indexOf("?");
String apiUrlPath =apiUrl.substring(0,queryIndex+1);
String apiUrlQuery = apiUrl.substring(queryIndex+1);
//apiUrlQuery为空时返回
if(isBlank(apiUrlQuery)){
return apiUrl.substring(0,apiUrl.length()-1);
}
// 请求URL中Query参数转成Map
Map<Object, Object> queryParamsMap = new HashMap<Object, Object>();
String[] params = apiUrlQuery.split("&");
for (String str : params) {
int index = str.indexOf("=");
String key = str.substring(0, index);
String value = str.substring(index + 1);
if (queryParamsMap.containsKey(key)) {
String msg = MessageFormat.format("请求URL中的Query参数的{0}重复", key);
throw new EsignDemoException(msg);
}
queryParamsMap.put(key, value);
}
ArrayList<String> queryMapKeys = new ArrayList<String>();
for (Map.Entry<Object, Object> entry : queryParamsMap.entrySet()) {
queryMapKeys.add((String) entry.getKey());
}
// 按照字段名的 ASCII 码从小到大排序(字典排序)
Collections.sort(queryMapKeys, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o1.compareToIgnoreCase(o2) == 0 ? -o1.compareTo(o2) : o1.compareToIgnoreCase(o2));
}
});
StringBuffer queryString = new StringBuffer();
// 构造Query参数键值对值对的格式
for (int i = 0; i < queryMapKeys.size(); i++) {
String key = queryMapKeys.get(i);
String value = (String) queryParamsMap.get(key);
queryString.append(key);
queryString.append("=");
queryString.append(value);
queryString.append("&");
}
if (queryString.length() > 0) {
queryString = queryString.deleteCharAt(queryString.length() - 1);
}
// Query参数排序后的接口请求地址
StringBuffer sortApiUrl = new StringBuffer();
sortApiUrl.append(apiUrlPath);
sortApiUrl.append(queryString.toString());
return sortApiUrl.toString();
}
/**
*获取query
* @param apiUrl
* @return
* @throws EsignDemoException
*/
public static ArrayList<BasicNameValuePair> getQuery(String apiUrl) throws EsignDemoException {
ArrayList<BasicNameValuePair> BasicNameValuePairList = new ArrayList<>();
if (!apiUrl.contains("?")) {
return BasicNameValuePairList;
}
int queryIndex = apiUrl.indexOf("\\?");
String apiUrlQuery = apiUrl.substring(queryIndex,apiUrl.length());
// 请求URL中Query参数转成Map
Map<Object, Object> queryParamsMap = new HashMap<Object, Object>();
String[] params = apiUrlQuery.split("&");
for (String str : params) {
int index = str.indexOf("=");
String key = str.substring(0, index);
String value = str.substring(index + 1);
if (queryParamsMap.containsKey(key)) {
String msg = MessageFormat.format("请求URL中的Query参数的{0}重复", key);
throw new EsignDemoException(msg);
}
BasicNameValuePairList.add(new BasicNameValuePair(key,value));
queryParamsMap.put(key, value);
}
return BasicNameValuePairList;
}
/**
*
*/
public static boolean callBackCheck(String timestamp,String requestQuery,String body,String key,String signature){
String algorithm="HmacSHA256";
String encoding="UTF-8";
Mac mac = null;
try {
String data = timestamp + requestQuery + body;
mac = Mac.getInstance(algorithm);
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(encoding), algorithm);
mac.init(secretKey);
mac.update(data.getBytes(encoding));
} catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
e.printStackTrace();
System.out.println("获取Signature签名信息异常:" + e.getMessage());
return false;
}
return byte2hex(mac.doFinal()).equalsIgnoreCase(signature);
}
/***
* 将byte[]转成16进制字符串
*
* @param data
*
* @return 16进制字符串
*/
public static String byte2hex(byte[] data) {
StringBuilder hash = new StringBuilder();
String stmp;
for (int n = 0; data != null && n < data.length; n++) {
stmp = Integer.toHexString(data[n] & 0XFF);
if (stmp.length() == 1)
hash.append('0');
hash.append(stmp);
}
return hash.toString();
}
}
@@ -0,0 +1,26 @@
package com.ruoyi.common.constant;
/**
* @description 头部信息常量
* @author 澄泓
* @date 2020/10/22 15:05
* @version JDK1.7
*/
public enum EsignHeaderConstant {
ACCEPT("*/*"),
DATE(""),
HEADERS( ""),
CONTENTTYPE_FORMDATA("application/x-www-form-urlencoded"),
CONTENTTYPE_JSON("application/json; charset=UTF-8"),
CONTENTTYPE_PDF("application/pdf"),
CONTENTTYPE_STREAM("application/octet-stream"),
AUTHMODE("Signature");
private String value;
private EsignHeaderConstant(String value) {
this.value=value;
}
public String VALUE(){
return this.value;
}
}
@@ -0,0 +1,486 @@
/*
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.ruoyi.common.constant;
import com.ruoyi.common.core.domain.entity.EsignHttpResponse;
import com.ruoyi.common.enums.EsignRequestType;
import com.ruoyi.common.exception.EsignDemoException;
import org.apache.http.*;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.*;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.UnknownHostException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @description Http请求 辅助类
* @author 澄泓
* @since JDK1.7
*/
public class EsignHttpCfgHelper {
private static Logger LOGGER = LoggerFactory.getLogger(EsignHttpCfgHelper.class);
/**
* 超时时间,默认15000毫秒
*/
private static int MAX_TIMEOUT = 15000;
/**
* 请求池最大连接数,默认100个
*/
private static int MAX_TOTAL=100;
/**
* 单域名最大的连接数,默认50个
*/
private static int ROUTE_MAX_TOTAL=50;
/**
* 请求失败重试次数,默认3次
*/
private static int MAX_RETRY = 3;
/**
* 是否需要域名校验,默认不需要校验
*/
private static boolean SSL_VERIFY=false;
/**
* 正向代理IP
*/
private static String PROXY_IP;
/**
* 正向代理端口,默认8888
*/
private static int PROXY_PORT=8888;
/**
* 代理协议,默认http
*/
private static String PROXY_AGREEMENT="http";
/**
* 是否开启代理,默认false
*/
private static boolean OPEN_PROXY=false;
/**
* 代理服务器用户名
*/
private static String PROXY_USERNAME="";
/**
* 代理服务器密码
*/
private static String PROXY_PASSWORD="";
private static PoolingHttpClientConnectionManager connMgr; //连接池
private static HttpRequestRetryHandler retryHandler; //重试机制
private static CloseableHttpClient httpClient=null;
public static int getMaxTimeout() {
return MAX_TIMEOUT;
}
public static void setMaxTimeout(int maxTimeout) {
MAX_TIMEOUT = maxTimeout;
}
public static int getMaxTotal() {
return MAX_TOTAL;
}
public static void setMaxTotal(int maxTotal) {
MAX_TOTAL = maxTotal;
}
public static int getRouteMaxTotal() {
return ROUTE_MAX_TOTAL;
}
public static void setRouteMaxTotal(int routeMaxTotal) {
ROUTE_MAX_TOTAL = routeMaxTotal;
}
public static int getMaxRetry() {
return MAX_RETRY;
}
public static void setMaxRetry(int maxRetry) {
MAX_RETRY = maxRetry;
}
public static boolean isSslVerify() {
return SSL_VERIFY;
}
public static void setSslVerify(boolean sslVerify) {
SSL_VERIFY = sslVerify;
}
public static String getProxyIp() {
return PROXY_IP;
}
public static void setProxyIp(String proxyIp) {
PROXY_IP = proxyIp;
}
public static int getProxyPort() {
return PROXY_PORT;
}
public static void setProxyPort(int proxyPort) {
PROXY_PORT = proxyPort;
}
public static String getProxyAgreement() {
return PROXY_AGREEMENT;
}
public static void setProxyAgreement(String proxyAgreement) {
PROXY_AGREEMENT = proxyAgreement;
}
public static boolean getOpenProxy() {
return OPEN_PROXY;
}
public static void setOpenProxy(boolean openProxy) {
OPEN_PROXY = openProxy;
}
public static String getProxyUsername() {
return PROXY_USERNAME;
}
public static void setProxyUserame(String proxyUsername) {
PROXY_USERNAME = proxyUsername;
}
public static String getProxyPassword() {
return PROXY_PASSWORD;
}
public static void setProxyPassword(String proxyPassword) {
PROXY_PASSWORD = proxyPassword;
}
/**
* 不允许外部创建实例
*/
private EsignHttpCfgHelper() {
}
//------------------------------公有方法start--------------------------------------------
/**
* @description 发起HTTP / HTTPS 请求
*
* @param reqType
* {@link EsignRequestType} 请求类型 GET、 POST 、 DELETE 、 PUT
* @param httpUrl
* {@link String} 请求目标地址
* @param headers
* {@link Map} 请求头
* @param param
* {@link Object} 参数
* @return
* @throws EsignDemoException
* @author 澄泓
*/
public static EsignHttpResponse sendHttp(EsignRequestType reqType, String httpUrl, Map<String, String> headers, Object param, boolean debug)
throws EsignDemoException {
HttpRequestBase reqBase=null;
if(httpUrl.startsWith("http")){
reqBase=reqType.getHttpType(httpUrl);
}else{
throw new EsignDemoException("请求url地址格式错误");
}
if(debug){
LOGGER.info("请求头:{}",headers+"\n");
LOGGER.info("请求参数\n{}", param+"\n");
LOGGER.info("请求地址\n:{}\n请求方式\n:{}",reqBase.getURI(),reqType+"\n");
}
//请求方法不是GET或者DELETE时传入body体,否则不传入。
String[] methods = {"DELETE", "GET"};
if(param instanceof String&&Arrays.binarySearch(methods, reqType.name())<0){//POST或者PUT请求
((HttpEntityEnclosingRequest) reqBase).setEntity(
new StringEntity(String.valueOf(param), ContentType.create("application/json", "UTF-8")));
}
//参数时字节流数组
else if(param instanceof byte[]) {
reqBase=reqType.getHttpType(httpUrl);
byte[] paramBytes = (byte[])param;
((HttpEntityEnclosingRequest) reqBase).setEntity(new ByteArrayEntity(paramBytes));
}
//参数是form表单时
else if(param instanceof List){
((HttpEntityEnclosingRequest) reqBase).setEntity(new UrlEncodedFormEntity((Iterable<? extends NameValuePair>) param));
}
httpClient = getHttpClient();
config(reqBase);
//设置请求头
if(headers != null &&headers.size()>0) {
for(Map.Entry<String, String> entry :headers.entrySet()) {
reqBase.setHeader(entry.getKey(), entry.getValue());
}
}
//响应对象
CloseableHttpResponse res = null;
//响应内容
String resCtx = null;
int status;
EsignHttpResponse esignHttpResponse = new EsignHttpResponse();
try {
//执行请求
res = httpClient.execute(reqBase);
status=res.getStatusLine().getStatusCode();
//获取请求响应对象和响应entity
HttpEntity httpEntity = res.getEntity();
if(httpEntity != null) {
resCtx = EntityUtils.toString(httpEntity,"utf-8");
}
if(debug) {
LOGGER.info("响应\n{}", resCtx + "\n");
LOGGER.info("----------------------------end------------------------");
}
} catch (NoHttpResponseException e) {
throw new EsignDemoException("服务器丢失了",e);
} catch (SSLHandshakeException e){
String msg = MessageFormat.format("SSL握手异常", e);
EsignDemoException ex = new EsignDemoException(msg, e);
throw ex;
} catch (UnknownHostException e){
EsignDemoException ex = new EsignDemoException("服务器找不到", e);
ex.initCause(e);
throw ex;
} catch(ConnectTimeoutException e){
EsignDemoException ex = new EsignDemoException("连接超时", e);
ex.initCause(e);
throw ex;
} catch(SSLException e){
EsignDemoException ex = new EsignDemoException("SSL异常",e);
ex.initCause(e);
throw ex;
} catch (ClientProtocolException e) {
EsignDemoException ex = new EsignDemoException("请求头异常",e);
ex.initCause(e);
throw ex;
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("网络请求失败",e);
ex.initCause(e);
throw ex;
} finally {
if(res != null) {
try {
res.close();
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("--->>关闭请求响应失败",e);
ex.initCause(e);
throw ex;
}
}
}
esignHttpResponse.setStatus(status);
esignHttpResponse.setBody(resCtx);
return esignHttpResponse;
}
//------------------------------公有方法end----------------------------------------------
//------------------------------私有方法start--------------------------------------------
/**
* @description 请求头和超时时间配置
*
* @param httpReqBase
* @author 澄泓
*/
private static void config(HttpRequestBase httpReqBase) {
// 配置请求的超时设置
RequestConfig.Builder builder = RequestConfig.custom()
.setConnectionRequestTimeout(MAX_TIMEOUT)
.setConnectTimeout(MAX_TIMEOUT)
.setSocketTimeout(MAX_TIMEOUT);
if(OPEN_PROXY){
HttpHost proxy=new HttpHost(PROXY_IP,PROXY_PORT,PROXY_AGREEMENT);
builder.setProxy(proxy);
}
RequestConfig requestConfig = builder.build();
httpReqBase.setConfig(requestConfig);
}
/**
* @description 连接池配置
*
* @return
* @author 澄泓
*/
private static void cfgPoolMgr() throws EsignDemoException {
ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory();
if(!SSL_VERIFY){
sslsf=sslConnectionSocketFactory();
}
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", plainsf)
.register("https", sslsf)
.build();
//连接池管理器
connMgr = new PoolingHttpClientConnectionManager(registry);
//请求池最大连接数
connMgr.setMaxTotal(MAX_TOTAL);
//但域名最大的连接数
connMgr.setDefaultMaxPerRoute(ROUTE_MAX_TOTAL);
}
/**
* @description 设置重试机制
*
* @author 澄泓
*/
private static void cfgRetryHandler() {
retryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException e, int excCount, HttpContext ctx) {
//超过最大重试次数,就放弃
if(excCount > MAX_RETRY) {
return false;
}
//服务器丢掉了链接,就重试
if(e instanceof NoHttpResponseException) {
return true;
}
//不重试SSL握手异常
if(e instanceof SSLHandshakeException) {
return false;
}
//中断
if(e instanceof InterruptedIOException) {
return false;
}
//目标服务器不可达
if(e instanceof UnknownHostException) {
return false;
}
//连接超时
//SSL异常
if(e instanceof SSLException) {
return false;
}
HttpClientContext clientCtx = HttpClientContext.adapt(ctx);
HttpRequest req = clientCtx.getRequest();
//如果是幂等请求,就再次尝试
if(!(req instanceof HttpEntityEnclosingRequest)) {
return true;
}
return false;
}
};
}
/**
* 忽略域名校验
*/
private static SSLConnectionSocketFactory sslConnectionSocketFactory() throws EsignDemoException {
try {
SSLContext ctx = SSLContext.getInstance("TLS"); // 创建一个上下文(此处指定的协议类型似乎不是重点)
X509TrustManager tm = new X509TrustManager() { // 创建一个跳过SSL证书的策略
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
};
ctx.init(null, new TrustManager[] { tm }, null); // 使用上面的策略初始化上下文
return new SSLConnectionSocketFactory(ctx, new String[] { "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" }, null, NoopHostnameVerifier.INSTANCE);
}catch (Exception e){
EsignDemoException ex = new EsignDemoException("忽略域名校验失败",e);
ex.initCause(e);
throw ex;
}
}
/**
* @description 获取单例HttpClient
*
* @return
* @author 澄泓
*/
private static synchronized CloseableHttpClient getHttpClient() throws EsignDemoException {
if(httpClient==null) {
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(PROXY_IP,PROXY_PORT),new UsernamePasswordCredentials(PROXY_USERNAME, PROXY_PASSWORD));
cfgPoolMgr();
cfgRetryHandler();
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
httpClient = httpClientBuilder.setDefaultCredentialsProvider(credsProvider).setConnectionManager(connMgr).setRetryHandler(retryHandler).build();
}
return httpClient;
}
//------------------------------私有方法end----------------------------------------------
}
@@ -0,0 +1,286 @@
/*
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.ruoyi.common.constant;
import com.ruoyi.common.exception.EsignDemoException;
import org.apache.commons.codec.binary.Base64;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
/**
* @author 澄泓
* @version JDK1.7
* @description 文件转换类
* @date 2020/10/26 10:47
*/
public class FileTransformation {
/**
* 传入本地文件路径转二进制byte
*
* @param srcFilePath 本地文件路径
* @return
* @throws EsignDemoException
*/
public static byte[] fileToBytes(String srcFilePath) throws EsignDemoException {
return getBytes(srcFilePath);
}
/**
* 图片转base64
*
* @param filePath 本地文件路径
* @return
* @throws EsignDemoException
*/
public static String fileToBase64(String filePath) throws EsignDemoException {
byte[] bytes;
String base64 = null;
bytes = fileToBytes(filePath);
base64 = Base64.encodeBase64String(bytes);
base64 = base64.replaceAll("\r\n", "");
return base64;
}
public static void main(String[] args) throws EsignDemoException {
System.out.println(getFileContentMD5("D:\\文档\\PLT2022-02124CT.pdf"));
}
/***
* 计算文件内容的Content-MD5
* @param filePath 文件路径
* @return
*/
public static String getFileContentMD5(String filePath) throws EsignDemoException {
// 获取文件MD5的二进制数组(128位)
byte[] bytes = getFileMD5Bytes128(filePath);
// 对文件MD5的二进制数组进行base64编码
return new String(Base64.encodeBase64String(bytes));
}
/**
* 下载文件
*
* @param httpUrl 网络文件地址url
* @return
*/
public static boolean downLoadFileByUrl(String httpUrl, String dir) throws EsignDemoException {
boolean downLoadFileFlag = false;
InputStream fis = null;
FileOutputStream fileOutputStream = null;
try {
URL url = new URL(httpUrl);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.connect();
fis = httpConn.getInputStream();
fileOutputStream = new FileOutputStream(new File(dir));
byte[] md5Bytes = null;
byte[] buffer = new byte[1024];
int length = -1;
while ((length = fis.read(buffer, 0, 1024)) != -1) {
fileOutputStream.write(buffer, 0, length);
}
downLoadFileFlag = true;
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("获取文件流异常", e);
ex.initCause(e);
return downLoadFileFlag;
} finally {
try {
if (fis != null) {
fis.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("关闭文件流异常", e);
ex.initCause(e);
return downLoadFileFlag;
}
}
return downLoadFileFlag;
}
/**
* 网络文件转二进制MD5数组并获取文件大小
*
* @param fileUrl 网络文件地址url
* @return
*/
public static Map fileUrlToBytes(String fileUrl) throws EsignDemoException {
HashMap<String, Object> map = new HashMap<String, Object>();
try {
URL url = new URL(fileUrl);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.connect();
InputStream fis = httpConn.getInputStream();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
outStream.close();
map.put("fileSize", fis.available());
byte[] md5Bytes = null;
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int length = -1;
while ((length = fis.read(buffer, 0, 1024)) != -1) {
md5.update(buffer, 0, length);
outStream.write(buffer, 0, length);
}
md5Bytes = md5.digest();
byte[] fileData = outStream.toByteArray();
map.put("fileData", fileData);
outStream.close();
fis.close();
map.put("md5Bytes", md5Bytes);
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("获取文件流异常", e);
ex.initCause(e);
throw ex;
} catch (NoSuchAlgorithmException e) {
EsignDemoException ex = new EsignDemoException("文件计算异常", e);
ex.initCause(e);
throw ex;
}
return map;
}
/***
* 获取文件MD5的二进制数组(128位)
* @param filePath
* @return
* @throws EsignDemoException
*/
public static byte[] getFileMD5Bytes128(String filePath) throws EsignDemoException {
FileInputStream fis = null;
byte[] md5Bytes = null;
try {
File file = new File(filePath);
fis = new FileInputStream(file);
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int length = -1;
while ((length = fis.read(buffer, 0, 1024)) != -1) {
md5.update(buffer, 0, length);
}
md5Bytes = md5.digest();
fis.close();
} catch (FileNotFoundException e) {
EsignDemoException ex = new EsignDemoException("文件找不到", e);
ex.initCause(e);
throw ex;
} catch (NoSuchAlgorithmException e) {
EsignDemoException ex = new EsignDemoException("不支持此算法", e);
ex.initCause(e);
throw ex;
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("输入流或输出流异常", e);
ex.initCause(e);
throw ex;
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("关闭文件输入流失败", e);
ex.initCause(e);
throw ex;
}
}
}
return md5Bytes;
}
/**
* @param path
* @return
* @throws EsignDemoException
* @description 根据文件路径,获取文件base64
* @author 宫清
* @date 2019年7月21日 下午4:22:08
*/
public static String getBase64Str(String path) throws EsignDemoException {
InputStream is = null;
try {
is = new FileInputStream(new File(path));
byte[] bytes = new byte[is.available()];
is.read(bytes);
return Base64.encodeBase64String(bytes);
} catch (Exception e) {
EsignDemoException ex = new EsignDemoException("获取文件输入流失败", e);
ex.initCause(e);
throw ex;
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("关闭文件输入流失败", e);
ex.initCause(e);
throw ex;
}
}
}
}
/**
* @param path 文件路径
* @return
* @description 获取文件名称
* @author 宫清
* @date 2019年7月21日 下午8:21:16
*/
public static String getFileName(String path) {
return new File(path).getName();
}
/**
* @param filePath {@link String} 文件地址
* @return
* @throws EsignDemoException
* @description 获取文件字节流
* @date 2019年7月10日 上午9:17:00
* @author 宫清
*/
public static byte[] getBytes(String filePath) throws EsignDemoException {
File file = new File(filePath);
FileInputStream fis = null;
byte[] buffer = null;
try {
fis = new FileInputStream(file);
buffer = new byte[(int) file.length()];
fis.read(buffer);
} catch (Exception e) {
EsignDemoException ex = new EsignDemoException("获取文件字节流失败", e);
ex.initCause(e);
throw ex;
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
EsignDemoException ex = new EsignDemoException("关闭文件字节流失败", e);
ex.initCause(e);
throw ex;
}
}
}
return buffer;
}
}
@@ -1,118 +1,117 @@
package com.ruoyi.common.core.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
/**
* Entity基类
*
* @author ruoyi
*/
public class BaseEntity implements Serializable
{
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
/** 搜索值 */
/**
* 搜索值
*/
@JsonIgnore
private String searchValue;
/** 创建者 */
/**
* 创建者
*/
private String createBy;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date createTime;
/** 更新者 */
/**
* 更新者
*/
private String updateBy;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date updateTime;
/** 备注 */
/**
* 备注
*/
private String remark;
/** 请求参数 */
/**
* 请求参数
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Map<String, Object> params;
public String getSearchValue()
{
public String getSearchValue() {
return searchValue;
}
public void setSearchValue(String searchValue)
{
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
public String getCreateBy()
{
public String getCreateBy() {
return createBy;
}
public void setCreateBy(String createBy)
{
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public Date getCreateTime()
{
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime)
{
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateBy()
{
public String getUpdateBy() {
return updateBy;
}
public void setUpdateBy(String updateBy)
{
public void setUpdateBy(String updateBy) {
this.updateBy = updateBy;
}
public Date getUpdateTime()
{
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime)
{
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getRemark()
{
public String getRemark() {
return remark;
}
public void setRemark(String remark)
{
public void setRemark(String remark) {
this.remark = remark;
}
public Map<String, Object> getParams()
{
if (params == null)
{
public Map<String, Object> getParams() {
if (params == null) {
params = new HashMap<>();
}
return params;
}
public void setParams(Map<String, Object> params)
{
public void setParams(Map<String, Object> params) {
this.params = params;
}
}
@@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysMenu;
/**
* Treeselect树结构实体类
*
@@ -38,6 +39,7 @@ public class TreeSelect implements Serializable
this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
}
public TreeSelect(SysMenu menu)
{
this.id = menu.getMenuId();
@@ -0,0 +1,24 @@
package com.ruoyi.common.core.domain.entity;
/**
* esignSDK-core信息类
* @author 澄泓
* @date 2022/2/22 13:59
* @version
*/
public class EsignCoreSdkInfo {
private static final String SdkVersion="Esign-Sdk-Core1.0";
private static final String SupportedVersion="JDK1.7 MORE THAN";
private static final String Info="sdk-esign-api核心工具包,主要处理e签宝公有云产品接口调用时的签名计算以及网络请求,通过EsignHttpHelper.signAndBuildSignAndJsonHeader构造签名鉴权+json数据格式的请求头,通过HttpHelper.doCommHttp方法入参发起网络请求。让开发者无需关注具体的请求签名算法,专注于接口业务的json参数构造";
public static String getSdkVersion() {
return SdkVersion;
}
public static String getInfo() {
return Info;
}
public static String getSupportedVersion() {
return SupportedVersion;
}
}
@@ -0,0 +1,24 @@
package com.ruoyi.common.core.domain.entity;
/**
* 网络请求的response类
*/
public class EsignHttpResponse {
private int status;
private String body;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
@@ -31,6 +31,9 @@ public class SysDept extends BaseEntity
/** 部门名称 */
private String deptName;
/** 部门类型 */
private Integer deptType;
/** 显示顺序 */
private Integer orderNum;
@@ -52,6 +55,14 @@ public class SysDept extends BaseEntity
/** 父部门名称 */
private String parentName;
public Integer getDeptType() {
return deptType;
}
public void setDeptType(Integer deptType) {
this.deptType = deptType;
}
/** 子部门 */
private List<SysDept> children = new ArrayList<SysDept>();
@@ -33,10 +33,27 @@ public class SysUser extends BaseEntity
@Excel(name = "登录名称")
private String userName;
/** 用户昵称 */
@Excel(name = "用户名称")
private String nickName;
/** 用户昵称和待办数量 */
private String nickNameAndNum;
public String getNickNameAndNum() {
return nickNameAndNum;
}
public void setNickNameAndNum(String nickNameAndNum) {
this.nickNameAndNum = nickNameAndNum;
}
/** 用户身份证号 */
@Excel(name = "身份证号")
private String idCard;
/** 用户邮箱 */
@Excel(name = "用户邮箱")
private String email;
@@ -297,12 +314,21 @@ public class SysUser extends BaseEntity
this.roleId = roleId;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("userId", getUserId())
.append("deptId", getDeptId())
.append("userName", getUserName())
.append("idCard", getIdCard())
.append("nickName", getNickName())
.append("email", getEmail())
.append("phonenumber", getPhonenumber())
@@ -0,0 +1,39 @@
package com.ruoyi.common.enums;
import org.apache.http.client.methods.*;
/**
* @description 请求类型
* @author 澄泓
* @since JDK1.7
*/
public enum EsignRequestType {
POST{
@Override
public HttpRequestBase getHttpType(String url) {
return new HttpPost(url);
}
},
GET{
@Override
public HttpRequestBase getHttpType(String url) {
return new HttpGet(url);
}
},
DELETE{
@Override
public HttpRequestBase getHttpType(String url) {
return new HttpDelete(url);
}
},
PUT{
@Override
public HttpRequestBase getHttpType(String url) {
return new HttpPut(url);
}
},
;
public abstract HttpRequestBase getHttpType(String url);
}
@@ -2,6 +2,7 @@ package com.ruoyi.common.enums;
import java.util.HashMap;
import java.util.Map;
import org.springframework.lang.Nullable;
/**
@@ -9,28 +10,23 @@ import org.springframework.lang.Nullable;
*
* @author ruoyi
*/
public enum HttpMethod
{
public enum HttpMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
private static final Map<String, HttpMethod> mappings = new HashMap<>(16);
static
{
for (HttpMethod httpMethod : values())
{
static {
for (HttpMethod httpMethod : values()) {
mappings.put(httpMethod.name(), httpMethod);
}
}
@Nullable
public static HttpMethod resolve(@Nullable String method)
{
public static HttpMethod resolve(@Nullable String method) {
return (method != null ? mappings.get(method) : null);
}
public boolean matches(String method)
{
public boolean matches(String method) {
return (this == resolve(method));
}
}
@@ -0,0 +1,38 @@
package com.ruoyi.common.enums;
/**
* @author wangqiong
* @description 修改案件的提交状态
* @date 2023-11-17 14:05
*/
public enum UpdateSubmitStatus
{
UNCOMMITTED(0, "未提交"),
COMMITTED(1, "已提交"),
REVOKE(2, "撤销"),
AGREE(3, "同意已修改的案件"),
REFUSE(4, "拒绝已修改的案件"),
AGREE_REVOKE(5, "同意撤销修改"),
REFUSE_REVOKE(6, "拒绝撤销修改"),
;
private final Integer code;
private final String text;
UpdateSubmitStatus(Integer code, String text)
{
this.code = code;
this.text = text;
}
public Integer getCode()
{
return code;
}
public String getText()
{
return text;
}
}
@@ -0,0 +1,33 @@
package com.ruoyi.common.enums;
/**
* @author wangqiong
* @description 是否枚举
* @date 2023-11-17 14:05
*/
public enum YesOrNoEnum
{
NO(0, "否"),
YES(1, "是"),
;
private final Integer code;
private final String text;
YesOrNoEnum(Integer code, String text)
{
this.code = code;
this.text = text;
}
public Integer getCode()
{
return code;
}
public String getText()
{
return text;
}
}
@@ -0,0 +1,36 @@
package com.ruoyi.common.exception;
/**
* description 自定义全局异常
* @author 澄泓
* datetime 2019年7月1日上午10:43:24
*/
public class EsignDemoException extends Exception {
private static final long serialVersionUID = 4359180081622082792L;
private Exception e;
public EsignDemoException(String msg) {
super(msg);
}
public EsignDemoException(String msg, Throwable cause) {
super(msg,cause);
}
public EsignDemoException(){
}
public Exception getE() {
return e;
}
public void setE(Exception e) {
this.e = e;
}
}
@@ -0,0 +1,58 @@
package com.ruoyi.common.utils;
import cn.hutool.core.io.IoUtil;
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class CheckSignatuerUtils {
public static String getSign(String paramsbody, String accessSec, long timestamp) {
String paramsStr = getParamsStr(paramsbody, timestamp);
return generateSign(paramsStr, accessSec);
}
public static String getParamsStr(String paramsbody,long timestamp) {
StringBuilder strbuild = new StringBuilder();
if (StringUtils.isNotBlank(paramsbody)) {
strbuild.append(paramsbody).append('#');
}
strbuild.append("#timestamp=").append(timestamp);
return strbuild.toString();
}
public static String generateSign(String paramsStr, String accessSec) {
HMac hMac = new HMac(HmacAlgorithm.HmacSHA256, accessSec.getBytes(StandardCharsets.UTF_8));
return hMac.digestHex(paramsStr);
}
public static boolean checkSignuter(String paramsbody) throws Exception {
HttpServletRequest reqParam = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
String timestampstr = reqParam.getHeader("timestampstr");
String signstr = reqParam.getHeader("signstr");
String accessSec = "mCFMA6ffe938v79m";
String newSignuter = getSign(paramsbody, accessSec,Long.parseLong(timestampstr));
if (StringUtils.equals(signstr, newSignuter)) {
return true;
}else {
return false;
}
}
}
@@ -0,0 +1,436 @@
package com.ruoyi.common.utils;
import com.ruoyi.common.utils.uuid.UUID;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.search.*;
import javax.mail.util.ByteArrayDataSource;
import javax.validation.constraints.NotNull;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.Security;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
/**
* @ClassName EmailInUtil
* @Description 邮件发送工具
*/
@Component
@Data
@Slf4j
public class EmailOutUtil {
private static Pattern emailPattern = Pattern.compile("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$");
// private static Pattern phonePattern = Pattern.compile("0?(13|14|15|18)[0-9]{9}");
private static Pattern phonePattern = Pattern.compile("^1\\d{10}$");
// @Autowired
// private JavaMailSender mailSender;
// 发送发邮箱地址(外网地址)
// @Value("${spring.mail-out-network.from}")
// private static String fromOut;
@Value("${spring.mail.host}")
private String hostOut;
// @Value("${spring.mail.username}")
// private String usernameOut;
private String usernameOut="wq18792927508@163.com";
// @Value("${spring.mail.password}")
// private String passwordOut;
private String passwordOut= "WDFHKSEMCKVRELEA";
@Value("${spring.mail.port}")
private Integer portOut;
public JavaMailSender rebuildMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(hostOut);
mailSender.setUsername(usernameOut);
mailSender.setPassword(passwordOut);
mailSender.setPort(portOut);
mailSender.setProtocol("smtp");
mailSender.setDefaultEncoding("UTF-8");
return mailSender;
}
/**
* 发送纯文本邮件信息
*
* @param to 接收方
* @param subject 邮件主题
* @param content 邮件内容(发送内容)
*/
public void sendMessage(String to, String subject, String content, String from, JavaMailSender mailSender) {
// 创建一个邮件对象
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom(from);
msg.setTo(to);
// 设置邮件主题
msg.setSubject(subject);
// 设置邮件内容
msg.setText(content);
// 发送邮件
mailSender.send(msg);
////System.out.println("发送成功:" + from + ":to:" + to);
}
/**
* @param to 收件人
* @param message 邮件内容
* @param subject 邮件主题
* @param fileList 邮件附件
*/
public Boolean sendEmil(String to, String message, String subject, List<File> fileList, File file) {
try {
String messageContent = "<html><body><p style=\"font-family: Arial, sans-serif; font-size: 18px;\">"+message+"。</p></body></html>";
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(messageContent, "text/html;charset=utf-8");
messageBodyPart.setContentID(UUID.randomUUID().toString());
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
//设置邮件会话参数
Properties props = new Properties();
//邮箱的发送服务器地址
props.setProperty("mail.smtp.host", "smtp.163.com");
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
//邮箱发送服务器端口,这里设置为465端口
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
//获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
Session session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usernameOut, passwordOut);
}
});
//通过会话,得到一个邮件,用于发送
Message msg = new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress(usernameOut));
//设置收件人,to为收件人,cc为抄送,bcc为密送
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(to, false));
msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(to, false));
//设置邮件消息
msg.setSubject(subject);
msg.setText(message);
msg.setDescription("messageutf-8html");
//设置发送的日期
msg.setSentDate(new Date());
// 创建邮件正文
MimeMultipart multipart = new MimeMultipart();
// MimeBodyPart bodyPart = new MimeBodyPart();
// bodyPart.setContent("This is the body of the email", "text/html");
multipart.addBodyPart(messageBodyPart);
// 添加附件
if (file != null) {
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(file);
attachmentPart.setFileName(MimeUtility.encodeText(file.getName()));
multipart.addBodyPart(attachmentPart);
//将multipart对象放入邮件
msg.setContent(multipart);
} else if (fileList != null && fileList.size() > 0) {
// 添加附件(多个)
if (fileList != null && fileList.size() > 0) {
for (File tempfile : fileList) {
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(tempfile);
attachmentPart.setFileName(MimeUtility.encodeText(tempfile.getName()));
multipart.addBodyPart(attachmentPart);
}
msg.setContent(multipart);
}
}
//调用Transport的send方法去发送邮件
Transport.send(msg);
}catch (Exception e) {
e.printStackTrace();
return Boolean.FALSE;
}
return Boolean.TRUE;
}
/**
* 发送带附件的邮件信息
*
* @param to 接收方
* @param subject 邮件主题
* @param content 邮件内容(发送内容)
* @param fileList 文件集合 // 可发送多个附件
*/
public void sendMessageCarryFiles(String to, String subject, String content, List<File> fileList, String from, @NotNull JavaMailSender mailSender) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
// 设置邮件主题
helper.setSubject(subject);
// 设置邮件内容
helper.setText(content);
// 添加附件(多个)
if (fileList != null && fileList.size() > 0) {
for (File file : fileList) {
helper.addAttachment(file.getName(), file);
}
}
} catch (MessagingException e) {
e.printStackTrace();
}
// 发送邮件
mailSender.send(mimeMessage);
}
/**
* 发送带附件的邮件信息
*
* @param to 接收方
* @param subject 邮件主题
* @param content 邮件内容(发送内容)
* @param file 单个文件
*/
public void sendMessageCarryFile(String to, String subject, String content, File file, String from, JavaMailSender mailSender) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(to);
// 设置邮件主题
helper.setSubject(subject);
// 设置邮件内容
helper.setText(content);
// 单个附件
helper.addAttachment(file.getName(), file);
} catch (MessagingException e) {
e.printStackTrace();
}
// 发送邮件
mailSender.send(mimeMessage);
}
/**
* 初始化内外网邮件发送对象
*
* @param num
*/
// public static JavaMailSender initJavaMailSender(Integer num) {
// if (num != null && num == 1) {
// //内网
// return rebuildMailSender(hostIn, usernameIn, passwordIn, Integer.parseInt(portIn), "smtps");
// } else {
// //外网
// return rebuildMailSender(hostOut, usernameOut, passwordOut, Integer.parseInt(portOut), "smtps");
// }
// }
// public static String getInnerFrom() {
// return EmailInUtil;
// }
//
// public static String getOutterFrom() {
// return fromOut;
// }
/**
* 验证邮箱格式
*
* @param str
* @return
*/
public static boolean isEmail(String str) {
boolean flag = false;
Matcher matcher = emailPattern.matcher(str);
if (matcher.matches()) {
flag = true;
}
return flag;
}
public static boolean isPhoneNumber(String str) {
boolean flag = false;
Matcher matcher = phonePattern.matcher(str);
if (matcher.matches()) {
flag = true;
}
return flag;
}
public void buildReceiveConnect() throws Exception {
//POP3主机名
String host = "pop3.163.com";
//设置传输协议
String protocol = "pop3";
//用户账号
String username = "wq18792927508@163.com";
//密码或者授权码
String password = "WDFHKSEMCKVRELEA";
/*
* 获取Session
*/
Properties props = new Properties();
//协议
props.setProperty("mail.store.protocol", protocol);
//POP3主机名
props.setProperty("mail.pop3.host", host);
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.pop3.default-encoding", "UTF-8");
Session session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usernameOut, passwordOut);
}
});
URLName urlName = new URLName(protocol, host, 110, null, username, password);
Store store = session.getStore(urlName);
store.connect(username, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
}
/**
* 接收邮件
*/
public List<String> receiverMail() {
List<String> messageIds=new ArrayList<>();
// session.setDebug(true);
try {
//POP3主机名
String host = "pop3.163.com";
//设置传输协议
String protocol = "pop3";
//用户账号
String username = "wq18792927508@163.com";
//密码或者授权码
String password = "WDFHKSEMCKVRELEA";
/*
* 获取Session
*/
Properties props = new Properties();
//协议
props.setProperty("mail.store.protocol", protocol);
//POP3主机名
props.setProperty("mail.pop3.host", host);
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.pop3.default-encoding", "UTF-8");
Session session = Session.getDefaultInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(usernameOut, passwordOut);
}
});
URLName urlName = new URLName(protocol, host, 110, null, username, password);
Store store = session.getStore(urlName);
store.connect(username, password);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
SearchTerm orTerm = new SubjectTerm("退信");
// Message[] messages = folder.search(orTerm);
Date endTime= new Date();
long oneDayMillis=24*60*60*1000L;
Date startTime=new Date(endTime.getTime()-oneDayMillis);
// SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE, startTime);
// SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE, endTime);
// SearchTerm comparisonAndTerm = new AndTerm(comparisonTermGe, comparisonTermLe);
// SearchTerm searchTerm = new AndTerm(comparisonAndTerm, orTerm);
Message[] messages = folder.search(orTerm);
if (messages != null) {
Arrays.stream(messages).forEach(message -> {
String messageId="";
try {
messageId = EmailUtil.getMessageId(message,session);
} catch (Exception e) {
e.printStackTrace();
}
messageIds.add(messageId);
});
}
folder.close(false);
store.close();
} catch (Exception e) {
return messageIds;
}
return messageIds;
}
public void analyseMail(Session session, Object content) throws Exception {
if (content instanceof Multipart) {
Multipart multipart = (Multipart) content;
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
// if (bodyPart.isMimeType("message/rfc822")) { if(bodyPart.getContentType().startsWith("Message/Rfc822"));
// MimeMessage mimeMessage = new MimeMessage(session, bodyPart.getInputStream());
// }
if(bodyPart.isMimeType("Message/Rfc822")){
MimeMessage mimeMessage = new MimeMessage(session, bodyPart.getInputStream());
}
}
}
}
public static String getMessageId(Part part) throws Exception {
if (!part.isMimeType("multipart/*")) {
return "";
}
Multipart multipart = (Multipart) part.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if (part.isMimeType("message/rfc822")) {
return getMessageId((Part) part.getContent());
}
InputStream inputStream = bodyPart.getInputStream();
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
String strLine;
while ((strLine = br.readLine()) != null) {
if (strLine.startsWith("Message_Id:")) {
String[] split = strLine.split("Message_Id:");
return split.length > 1 ? split[1].trim() : null;
}
}
}
}
return "";
}
//检查退信邮件
// Folder folder = ...; //打开收件箱
// Message[] messages = folder.getMessages();
// for (Message message : messages) {
// if (message.getSubject().contains("Delivery Status Notification")) {
// System.out.println("Delivery failed for recipient: " + message.getRecipients()[0]);
// }
// }
}
@@ -0,0 +1,68 @@
package com.ruoyi.common.utils;
import lombok.extern.slf4j.Slf4j;
import javax.mail.*;
import javax.mail.internet.MimeMessage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@Slf4j
public final class EmailUtil {
private static final String multipart = "multipart/*";
public static String getMessageId(Part part, Session session) throws Exception {
if (!part.isMimeType(multipart)) {
return "";
}
Multipart multipart = (Multipart) part.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
if(bodyPart.getContentType().contains("Message/Rfc822")){
MimeMessage mimeMessage = new MimeMessage(session, bodyPart.getInputStream());
if(mimeMessage.getSubject()!=null&&mimeMessage.getSubject().contains("裁决书")){
String[] split = mimeMessage.getSubject().split("裁决书");
if(split.length>0){
return split[0];
}
}
}
} return "";
}
public static boolean isContainAttachment(Part part) {
boolean attachFlag = false;
try {
if (part.isMimeType(multipart)) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null) && ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE))))
attachFlag = true;
else if (mpart.isMimeType(multipart)) {
attachFlag = isContainAttachment((Part) mpart);
} else {
String contype = mpart.getContentType();
if (contype.toLowerCase().contains("application"))
attachFlag = true;
if (contype.toLowerCase().contains("name"))
attachFlag = true;
}
}
} else if (part.isMimeType("message/rfc822")) {
attachFlag = isContainAttachment((Part) part.getContent());
}
} catch (MessagingException | IOException e) {
e.printStackTrace();
}
return attachFlag;
}
}
@@ -0,0 +1,13 @@
package com.ruoyi.common.utils;
public class EsignApplicaConfig {
// 应用ID
public static final String EsignAppId = "7438987614";
// 应用密钥
public static final String EsignAppSecret = "9d7844f13830931037772b9d20cf1529";
// e签宝接口调用域名(模拟环境)
public static final String EsignHost = "https://smlopenapi.esign.cn";
// e签宝接口调用域名(正式环境)
// public static final String EsignHost = "https://openapi.esign.cn";
}
@@ -0,0 +1,178 @@
package com.ruoyi.common.utils;
import com.ruoyi.common.constant.EsignEncryption;
import com.ruoyi.common.constant.EsignHeaderConstant;
import com.ruoyi.common.constant.EsignHttpCfgHelper;
import com.ruoyi.common.core.domain.entity.EsignCoreSdkInfo;
import com.ruoyi.common.core.domain.entity.EsignHttpResponse;
import com.ruoyi.common.enums.EsignRequestType;
import com.ruoyi.common.exception.EsignDemoException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* @description Http 请求 辅助类
* @author 澄泓
* @since JDK1.7
*/
public class EsignHttpHelper {
private static final Logger LOGGER = LoggerFactory.getLogger(EsignHttpHelper.class);
/**
* 不允许外部创建实例
*/
private EsignHttpHelper() {
}
/**
* @description 发送常规HTTP 请求
*
* @param reqType 请求方式
* @param url 请求路径
* @param paramStr 请求参数
* @return
* @throws EsignDemoException
* @author 澄泓
*/
public static EsignHttpResponse doCommHttp(String host, String url, EsignRequestType reqType, Object paramStr , Map<String,String> httpHeader, boolean debug) throws EsignDemoException {
return EsignHttpCfgHelper.sendHttp(reqType, host+url,httpHeader, paramStr, debug);
}
/**
* @description 发送文件流上传 HTTP 请求
*
* @param reqType 请求方式
* @param uploadUrl 请求路径
* @param param 请求参数
* @param fileContentMd5 文件fileContentMd5
* @param contentType 文件MIME类型
* @return
* @throws EsignDemoException
* @author 澄泓
*/
public static EsignHttpResponse doUploadHttp( String uploadUrl,EsignRequestType reqType,byte[] param, String fileContentMd5,
String contentType, boolean debug) throws EsignDemoException {
Map<String, String> uploadHeader = buildUploadHeader(fileContentMd5, contentType);
if(debug){
LOGGER.info("----------------------------start------------------------");
LOGGER.info("fileContentMd5:{}",fileContentMd5);
LOGGER.info("contentType:{}",contentType);
}
return EsignHttpCfgHelper.sendHttp(reqType,uploadUrl, uploadHeader, param,debug);
}
/**
* @description 构建一个签名鉴权+json数据的esign请求头
* @return
* @author 澄泓
*/
public static Map<String, String> buildSignAndJsonHeader(String projectId,String contentMD5,String accept,String contentType,String authMode) {
Map<String, String> header = new HashMap<>();
header.put("X-Tsign-Open-App-Id", projectId);
header.put("X-Tsign-Open-Version-Sdk",EsignCoreSdkInfo.getSdkVersion());
header.put("X-Tsign-Open-Ca-Timestamp", EsignEncryption.timeStamp());
header.put("Accept",accept);
header.put("Content-MD5",contentMD5);
header.put("Content-Type", contentType);
header.put("X-Tsign-Open-Auth-Mode", authMode);
return header;
}
/**
* 签名计算并且构建一个签名鉴权+json数据的esign请求头
* @param httpMethod
* * The name of a supported {@linkplain java.nio.charset.Charset
* * charset}
* @return
*/
public static Map<String,String> signAndBuildSignAndJsonHeader(String projectId, String secret,String paramStr,String httpMethod,String url,boolean debug) throws EsignDemoException {
String contentMD5="";
//统一转大写处理
httpMethod = httpMethod.toUpperCase();
if("GET".equals(httpMethod)||"DELETE".equals(httpMethod)){
paramStr=null;
contentMD5="";
} else if("PUT".equals(httpMethod)||"POST".equals(httpMethod)){
//对body体做md5摘要
contentMD5= EsignEncryption.doContentMD5(paramStr);
}else{
throw new EsignDemoException(String.format("不支持的请求方法%s",httpMethod));
}
//构造一个初步的请求头
Map<String, String> esignHeaderMap = buildSignAndJsonHeader(projectId, contentMD5, EsignHeaderConstant.ACCEPT.VALUE(), EsignHeaderConstant.CONTENTTYPE_JSON.VALUE(), EsignHeaderConstant.AUTHMODE.VALUE());
//排序
url=EsignEncryption.sortApiUrl(url);
//传入生成的bodyMd5,加上其他请求头部信息拼接成字符串
String message = EsignEncryption.appendSignDataString(httpMethod, esignHeaderMap.get("Content-MD5"),esignHeaderMap.get("Accept"),esignHeaderMap.get("Content-Type"),esignHeaderMap.get("Headers"),esignHeaderMap.get("Date"), url);
//整体做sha256签名
String reqSignature = EsignEncryption.doSignatureBase64(message, secret);
//请求头添加签名值
esignHeaderMap.put("X-Tsign-Open-Ca-Signature",reqSignature);
if(debug){
LOGGER.info("----------------------------start------------------------");
LOGGER.info("待计算body值:{}", paramStr+"\n");
LOGGER.info("MD5值:{}",contentMD5+"\n");
LOGGER.info("待签名字符串:{}",message+"\n");
LOGGER.info("签名值:{}",reqSignature+"\n");
}
return esignHeaderMap;
}
/**
* @description 构建一个Token鉴权+jsons数据的esign请求头
* @return
* @author 澄泓
*/
public static Map<String, String> buildTokenAndJsonHeader(String appid,String token) {
Map<String, String> esignHeader = new HashMap<>();
esignHeader.put("X-Tsign-Open-Version-Sdk", EsignCoreSdkInfo.getSdkVersion());
esignHeader.put("Content-Type", EsignHeaderConstant.CONTENTTYPE_JSON.VALUE());
esignHeader.put("X-Tsign-Open-App-Id", appid);
esignHeader.put("X-Tsign-Open-Token", token);
return esignHeader;
}
/**
* @description 构建一个form表单数据的esign请求头
* @return
* @author 澄泓
*/
public static Map<String, String> buildFormDataHeader(String appid) {
Map<String, String> esignHeader = new HashMap<>();
esignHeader.put("X-Tsign-Open-Version-Sdk",EsignCoreSdkInfo.getSdkVersion());
esignHeader.put("X-Tsign-Open-Authorization-Version","v2");
esignHeader.put("Content-Type", EsignHeaderConstant.CONTENTTYPE_FORMDATA.VALUE());
esignHeader.put("X-Tsign-Open-App-Id", appid);
return esignHeader;
}
/**
* @description 创建文件流上传 请求头
*
* @param fileContentMd5
* @param contentType
* @return
* @author 澄泓
*/
public static Map<String, String> buildUploadHeader(String fileContentMd5, String contentType) {
Map<String, String> header = new HashMap<>();
header.put("Content-MD5", fileContentMd5);
header.put("Content-Type", contentType);
return header;
}
// ------------------------------私有方法end----------------------------------------------
}
@@ -0,0 +1,57 @@
package com.ruoyi.common.utils;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
/**
* @author wangqiong
* @description 根据身份证号提取有效信息
* @date 2023-12-11 11:45
*/
public class IdCardUtils {
/**
* 通过身份证号码获取出生日期、性别、年龄
* @param certificateNo
* @return 返回的出生日期格式:1990-01-01 性别格式:1-女,0-男
*/
public static Map<String, String> getBirAgeSex(String certificateNo) {
String birthday = "";
String age = "";
String sexCode = "";
int year = Calendar.getInstance().get(Calendar.YEAR);
char[] number = certificateNo.toCharArray();
boolean flag = true;
if (number.length == 15) {
for (int x = 0; x < number.length; x++) {
if (!flag) return new HashMap<String, String>();
flag = Character.isDigit(number[x]);
}
} else if (number.length == 18) {
for (int x = 0; x < number.length - 1; x++) {
if (!flag) return new HashMap<String, String>();
flag = Character.isDigit(number[x]);
}
}
if (flag && certificateNo.length() == 15) {
birthday = "19" + certificateNo.substring(6, 8) + "-"
+ certificateNo.substring(8, 10) + "-"
+ certificateNo.substring(10, 12);
sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 3, certificateNo.length())) % 2 == 0 ? "1" : "0";
age = (year - Integer.parseInt("19" + certificateNo.substring(6, 8))) + "";
} else if (flag && certificateNo.length() == 18) {
birthday = certificateNo.substring(6, 10) + "-"
+ certificateNo.substring(10, 12) + "-"
+ certificateNo.substring(12, 14);
sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 4, certificateNo.length() - 1)) % 2 == 0 ? "1" : "0";
age = (year - Integer.parseInt(certificateNo.substring(6, 10))) + "";
}
Map<String, String> map = new HashMap<String, String>();
map.put("birthday", birthday);
map.put("age", age);
map.put("sexCode", sexCode);
return map;
}
}
@@ -0,0 +1,48 @@
package com.ruoyi.common.utils;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.ruoyi.common.utils.uuid.UUID;
import java.math.BigInteger;
import java.util.Random;
/**
* 雪花算法工具类
* zq
* @since 2020/10/30 9:59
**/
public class IdWorkerUtil {
private static final long EPOCH = 1479533469598L; //开始时间,固定一个小于当前时间的毫秒数
private static final int max12bit = 4095;
private static final long max41bit= 1099511627775L;
private static String machineId = "" ; // 机器ID
/**
*
* 创建ID
*
* @return
*
*/
public static Long getId(){
long time = System.currentTimeMillis() - EPOCH + max41bit;
// 二进制的 毫秒级时间戳
String base = Long.toBinaryString(time);
// 序列数
String randomStr = StringUtils.leftPad(Integer.toBinaryString(new Random().nextInt(max12bit)),12,'0');
if(StringUtils.isNotEmpty(machineId)){
machineId = StringUtils.leftPad(machineId, 10, '0');
}
//拼接
String appendStr = base + machineId + randomStr;
// 转化为十进制 返回
BigInteger bi = new BigInteger(appendStr, 2);
return Long.valueOf(bi.toString());
}
}
@@ -0,0 +1,53 @@
package com.ruoyi.common.utils;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author wangqiong
* @description 金额格式化
* @date 2023-12-11 11:45
*/
public class MoneyFormatUtils {
/**
* 增加千分位
* @param money
* @return
*/
public static String moneyFormat(String money) {
// 金额格式化
try {
Double.parseDouble(money);
} catch (NumberFormatException e) {
String regEx = "[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(money);
String result = m.replaceAll("").trim();
BigDecimal bigDecimal = null;
if (money.contains("百")) {
bigDecimal = new BigDecimal(result).multiply(new BigDecimal("100"));
} else if (money.contains("千")) {
bigDecimal = new BigDecimal(result).multiply(new BigDecimal("1000"));
} else if (money.contains("万")) {
bigDecimal = new BigDecimal(result).multiply(new BigDecimal("10000"));
} else if (money.contains("百万")) {
bigDecimal = new BigDecimal(result).multiply(new BigDecimal("1000000"));
} else if (money.contains("千万")) {
bigDecimal = new BigDecimal(result).multiply(new BigDecimal("10000000"));
} else if (money.contains("亿")) {
bigDecimal = new BigDecimal(result).multiply(new BigDecimal("100000000"));
}
NumberFormat format = NumberFormat.getInstance();
return format.format(bigDecimal);
}
return "";
}
}
@@ -0,0 +1,57 @@
package com.ruoyi.common.utils;
import cn.hutool.core.util.StrUtil;
import java.lang.reflect.Field;
/**
* 反射工具类
*/
public class ObjectFieldUtils {
public static String getValue(Object obj,String fieldName){
if(obj==null || StrUtil.isEmpty(fieldName)){
return "";
}
Field field=null;
try{
field=obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return String.valueOf(field.get(obj)==null?"":field.get(obj));
}catch (Exception e){
if(obj.getClass().getSuperclass()!=Object.class){
try{
field=obj.getClass().getSuperclass().getDeclaredField(fieldName);
field.setAccessible(true);
return String.valueOf(field.get(obj)==null?"":field.get(obj));
}catch (Exception e1){
e.printStackTrace();
}
}
e.printStackTrace();
}
return null;
}
public static void setValue(Object obj,String fieldName,Object value){
if(obj==null || StrUtil.isEmpty(fieldName)||value==null){
return;
}
Field field=null;
try{
field=obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj,value);
}catch (Exception e){
if(obj.getClass().getSuperclass()!=Object.class){
try{
field=obj.getClass().getSuperclass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj,value);
}catch (Exception e1){
e.printStackTrace();
}
}
e.printStackTrace();
}
}
}
@@ -0,0 +1,147 @@
package com.ruoyi.common.utils;
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.ruoyi.common.config.RuoYiConfig;
import com.tencentcloudapi.teo.v20220901.models.CC;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import static cn.hutool.core.util.ClassLoaderUtil.getClassLoader;
/**
* @author wangqiong
* @description pdf转换工具类
* @date 2023-11-28 15:20
*/
@Slf4j
public class PdfUtils {
/**
* 将html字符串转为pdf
* @param pdfFilePath 保存的路径
* @param htmlcontent:必须是完整的html格式,比如<html><body>123</body></html>
*/
public static boolean htmlStringConvertToPDF(String pdfFilePath, String htmlcontent) {
Document document = new Document();
PdfWriter writer = null;
try {
writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));
// 设置底部距离60,解决重叠问题
document.setPageSize(PageSize.A4);
document.setMargins(50, 45, 50, 60);
document.setMarginMirroring(false);
document.open();
// 解决PDF中文不显示
String fontPath = "/D:/simsun.ttf"; //字体文件路径
XMLWorkerFontProvider provider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
provider.register(fontPath);//注册字体
log.error("注册字体");
XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(htmlcontent.getBytes("UTF-8")), Charset.forName("UTF-8"), provider);
} catch (Exception e) {
log.error("htmlStringConvertToPDF error", e.getMessage());
return false;
} finally {
if (null != document) {
document.close();
}
if (null != writer) {
writer.close();
}
}
return true;
}
/**
* 根据html文件生成pdf
* @param pdfFilePath pdf文件生成路径
* @param htmlFilePath html文件路径
*/
public static boolean htmlFileConvertToPDF(String pdfFilePath, String htmlFilePath) {
Document document = new Document();
PdfWriter writer = null;
FileOutputStream fileOutputStream = null;
FileInputStream fileInputStream = null;
try {
fileOutputStream = new FileOutputStream(pdfFilePath);
writer = PdfWriter.getInstance(document, fileOutputStream);
// 设置底部距离60,解决重叠问题
document.setPageSize(PageSize.A4);
document.setMargins(50, 45, 50, 60);
document.setMarginMirroring(false);
document.open();
StringBuffer sb = new StringBuffer();
fileInputStream = new FileInputStream(htmlFilePath);
BufferedReader br = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8"));
String readStr = "";
while ((readStr = br.readLine()) != null) {
sb.append(readStr);
}
XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(sb.toString().getBytes("Utf-8")), null, Charset.forName("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != document) {
document.close();
}
if (null != writer) {
writer.close();
}
if (null != fileInputStream) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != fileOutputStream) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
* docx转pdf
* @param pdfSaveDirectory:文件保存目录,例:D:\\pdf\\
* @param fileName:保存的文件名称,例:test.pdf
* @param docxFile:需要转换的docx文件
* @return
*/
private static boolean docxConvertToPDF(String pdfSaveDirectory,String fileName,File docxFile) {
// 不存在则新建
File directory = new File(pdfSaveDirectory);
if (!directory.exists()) {
directory.mkdirs();
}
String pdfFilePath = pdfSaveDirectory + fileName;
File outputFile = new File(pdfFilePath);
try {
InputStream docxInputStream = Files.newInputStream(docxFile.toPath());
OutputStream outputStream = Files.newOutputStream(outputFile.toPath());
IConverter converter = LocalConverter.builder().build();
converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();
docxInputStream.close();
outputStream.close();
} catch (Exception e) {
return false;
}
return true;
}
}
@@ -0,0 +1,86 @@
package com.ruoyi.common.utils;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.*;
/**
* @author wangqiong
* @description 读取文件内容
* @date 2023-12-11 11:45
*/
public class ReadFileUtils {
public static String readerTxtFile(String filePath){
BufferedReader br=null;
StringBuilder result=new StringBuilder();
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filePath)),"GBK"));
String line=null;
while ((line=br.readLine())!=null) {
result.append(line).append("\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null!=br){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result.toString();
}
public static String readWord(String filePath) throws Exception{
File file = new File(filePath);
if(file.length()==0) return ""; // 需要操作原因是可能会空文件问题,如果不做处理,在下面读取中会报错
StringBuffer sb = new StringBuffer();
String buffer = "";
try {
if (filePath.endsWith(".doc")) {
InputStream is = new FileInputStream(file);
WordExtractor ex = new WordExtractor(is);
buffer = ex.getText();
if(buffer.length() > 0){
//使用回车换行符分割字符串
String [] arry = buffer.split("r\\n");
for (String string : arry) {
sb.append(string.trim());
}
}
} else if (filePath.endsWith(".docx")) {
FileInputStream fis = new FileInputStream(file);
XWPFDocument xdoc = new XWPFDocument(fis);
XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
buffer = extractor.getText();
sb.append(buffer!=null?buffer:"");
// OPCPackage opcPackage = POIXMLDocument.openPackage(filePath);
// XWPFWordExtractor extractor = new XWPFWordExtractor(opcPackage);
// buffer = extractor.getText();
// if(buffer.length() > 0){
// //使用换行符分割字符串
// String [] arry = buffer.split("\n");
// for (String string : arry) {
// sb.append(string.trim());
// }
// }
} else {
return null;
}
return sb.toString();
} catch (Exception e) {
System.out.print("error---->"+filePath);
e.printStackTrace();
return null;
}
}
}
@@ -0,0 +1,123 @@
package com.ruoyi.common.utils;
import com.ruoyi.common.config.EsignDemoConfig;
import com.ruoyi.common.constant.EsignHeaderConstant;
import com.ruoyi.common.core.domain.entity.EsignHttpResponse;
import com.ruoyi.common.enums.EsignRequestType;
import com.ruoyi.common.exception.EsignDemoException;
import com.ruoyi.common.utils.bean.EsignFileBean;
import java.util.Map;
public class SealUtil {
private static String eSignHost = EsignDemoConfig.EsignHost;
private static String eSignAppId = EsignDemoConfig.EsignAppId;
private static String eSignAppSecret = EsignDemoConfig.EsignAppSecret;
/**
* 获取机构认证&授权页面链接
*
* @return
*/
public static EsignHttpResponse getOrgEmpower() throws EsignDemoException {
String apiaddr = "/v3/org-auth-url";
String nickName = "何进波";
String phonenumber = "15191509780";
String deptName = "西安云美公司";
String jsonParm = "{\n" +
" \"orgAuthConfig\": {\n" +
" \"orgName\": \"" + deptName + " \",\n" +
" \"transactorInfo\": {\n" +
" \"psnAccount\": \"" + phonenumber + "\",\n" +
" \"psnInfo\": {\n" +
" \"psnName\": \"" + nickName + "\",\n" +
" \"psnMobile\": \"" + phonenumber + "\"\n" +
" }\n" +
" }\n" +
" },\n" +
" \"authorizeConfig\": {\n" +
" \"authorizedScopes\": [\n" +
" \"get_org_identity_info\",\n" +
" \"get_psn_identity_info\",\n" +
" \"org_initiate_sign\",\n" +
" \"psn_initiate_sign\",\n" +
" \"manage_org_resource\",\n" +
" \"manage_psn_resource\",\n" +
" \"use_org_order\"\n" +
" ]\n" +
" }\n" +
"}";
//请求方法
EsignRequestType requestType = EsignRequestType.POST;
//生成请求签名鉴权方式的Header
Map<String, String> header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId, eSignAppSecret, jsonParm, requestType.name(), apiaddr, true);
//发起接口请求
return EsignHttpHelper.doCommHttp(eSignHost, apiaddr, requestType, jsonParm, header, true);
}
/**
* 查询认证授权流程详情
*
* @return
*/
public static EsignHttpResponse queryAuthProcess(String authFlowId ) throws EsignDemoException {
String apiaddr = "/v3/auth-flow/" + authFlowId;
//请求参数body体,json格式。get或者delete请求时jsonString传空json:"{}"或者null
String jsonParm=null;
//请求方法
EsignRequestType requestType= EsignRequestType.GET;
//生成签名鉴权方式的的header
Map<String, String> header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId,eSignAppSecret,jsonParm,requestType.name(),apiaddr,true);
//发起接口请求
return EsignHttpHelper.doCommHttp(eSignHost, apiaddr,requestType , jsonParm, header,true);
}
/**
* 步骤一:获取印章图片上传地址fileUploadUrl
*
* @return
*/
public static EsignHttpResponse getFileUploadUrl(String filePath) throws EsignDemoException {
//自定义的文件封装类,传入文件地址可以获取文件的名称大小,文件流等数据
EsignFileBean esignFileBean = new EsignFileBean(filePath);
String apiaddr="/v3/files/file-key";
//请求参数body体,json格式。get或者delete请求时jsonString传空json:"{}"或者null
String jsonParm="{\n" +
" \"contentMd5\": \""+esignFileBean.getFileContentMD5()+"\",\n" +
" \"fileName\":\""+esignFileBean.getFileName()+"\"," +
" \"fileSize\": "+esignFileBean.getFileSize()+",\n" +
" \"contentType\": \""+ EsignHeaderConstant.CONTENTTYPE_STREAM.VALUE()+"\"\n" +
"}";
//请求方法
EsignRequestType requestType= EsignRequestType.POST;
//生成签名鉴权方式的的header
Map<String, String> header = EsignHttpHelper.signAndBuildSignAndJsonHeader(eSignAppId,eSignAppSecret,jsonParm,requestType.name(),apiaddr,true);
//发起接口请求
return EsignHttpHelper.doCommHttp(eSignHost, apiaddr, requestType, jsonParm, header, true);
}
/**
* 步骤二:将印章图片文件流上传到fileUploadUrl
*
* @return
*/
public static EsignHttpResponse fileStreamUpload(String uploadUrl,String filePath) throws EsignDemoException {
//根据文件地址获取文件contentMd5
EsignFileBean esignFileBean = new EsignFileBean(filePath);
//请求方法
EsignRequestType requestType= EsignRequestType.PUT;
return EsignHttpHelper.doUploadHttp(uploadUrl,requestType,esignFileBean.getFileBytes(),esignFileBean.getFileContentMD5(), EsignHeaderConstant.CONTENTTYPE_STREAM.VALUE(),true);
}
public static void main(String[] args) throws Exception {
queryAuthProcess("OF-2b1e52987408005c");
// createOrgByImage();
// getOrgEmpower();
// queryAuthProcess("OF-2b00885895080028");
// getFileUploadUrl();
// String uplodUrl = "https://esignoss.esign.cn/7438987614/8e278262-5960-4004-bff3-297c11e2652e/Snipaste_2023-10-27_09-59-23.jpg?Expires=1699439095&OSSAccessKeyId=STS.NTZ8NBHcTVQXgsxVRH4iyC5AY&Signature=3yu3ZQifphZsnOgN0CI0SJdqFhY%3D&callback-var=eyJ4OmZpbGVfa2V5IjoiJDliM2Y3ZjkyLTdkOWUtNGZkZi04NWU4LWE4ZDU4MzEwZjIzOCQ0MTQwNTE2ODk5In0%3D%0A&callback=eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9zbWx0YXBpLnRzaWduLmNuL2FueWRvb3IvZmlsZS1zeXN0ZW0vY2FsbGJhY2svYWxpb3NzIiwiY2FsbGJhY2tCb2R5IjogIntcIm1pbWVUeXBlXCI6JHttaW1lVHlwZX0sXCJzaXplXCI6ICR7c2l6ZX0sXCJidWNrZXRcIjogJHtidWNrZXR9LFwib2JqZWN0XCI6ICR7b2JqZWN0fSxcImV0YWdcIjogJHtldGFnfSxcImZpbGVfa2V5XCI6JHt4OmZpbGVfa2V5fX0iLCJjYWxsYmFja0JvZHlUeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifQ%3D%3D%0A&security-token=CAIS%2BAF1q6Ft5B2yfSjIr5fvc%2FT2pbx14ZOzZVXJslIdOOZVrPDquzz2IHtKdXRvBu8Xs%2F4wnmxX7f4YlqB6T55OSAmcNZEoWWWTbdH4MeT7oMWQweEurv%2FMQBqyaXPS2MvVfJ%2BOLrf0ceusbFbpjzJ6xaCAGxypQ12iN%2B%2Fm6%2FNgdc9FHHPPD1x8CcxROxFppeIDKHLVLozNCBPxhXfKB0ca0WgVy0EHsPnvm5DNs0uH1AKjkbRM9r6ceMb0M5NeW75kSMqw0eBMca7M7TVd8RAi9t0t1%2FIVpGiY4YDAWQYLv0rda7DOltFiMkpla7MmXqlft%2BhzcgeQY0pc%2FRqAAXGx8FDtPQxW3RSasFgOFBJaxbYjH3WFFrbV25v8a%2BS9OWPAYqOCvmkxbM7N4hOge2iaBAG4SRLMb6ypPJ15YEpoZI8KkdeDvQJryZEWchmc0Lhz0yDRqrN%2BzYhgu4VpBJu1WJg%2FyXrvAZ0gWhBN%2BILrblSR9QHVWVVYZTAKN4ejIAA%3D";
// fileStreamUpload(uplodUrl,"D:\\develop\\Snipaste_2023-10-27_09-59-23.jpg");
}
}
@@ -0,0 +1,78 @@
package com.ruoyi.common.utils;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.cvm.v20170312.CvmClient;
import com.tencentcloudapi.cvm.v20170312.models.DescribeRegionsRequest;
import com.tencentcloudapi.cvm.v20170312.models.DescribeRegionsResponse;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import lombok.var;
import java.util.Objects;
@Slf4j
public class SmsUtils {
//应用id
private static final String SDK_APP_ID = "1400854852";
//API的SecretId
private static final String SECRET_ID = "AKIDeEf2A8uX1HSainvvnXAc3X9ZlhtyvkMp";
//API的SecretKey
private static final String SECRET_KEY = "QjphKo8zkHZigT8j9PVtFPJyfIvO3d6V";
//签名内容
private static final String SIGN_NAME = "乙巢智慧仲裁网";
public static Boolean sendSms(SendSmsRequest request) {
Credential cred = new Credential(SECRET_ID, SECRET_KEY );
SmsClient client = new SmsClient(cred, "ap-guangzhou");
final var req = new com.tencentcloudapi.sms.v20210111.models.SendSmsRequest();
req.setPhoneNumberSet(new String[]{"+86" + request.getPhone()});
req.setSmsSdkAppId(SDK_APP_ID );
req.setSignName(SIGN_NAME);
req.setTemplateId(request.getTemplateId());
req.setTemplateParamSet(request.getTemplateParamSet());
SendSmsResponse res = null;
try {
res = client.SendSms(req);
} catch (TencentCloudSDKException e) {
log.error("发送短信出错:", e);
return Boolean.FALSE;
}
SendStatus sendStatus = res.getSendStatusSet()[0];
log.info("发送短信结果:Code={}, Message={}", sendStatus.getCode(), sendStatus.getMessage());
if (Objects.nonNull(res.getSendStatusSet()) && res.getSendStatusSet().length > 0 && "Ok".equals(res.getSendStatusSet()[0].getCode())){
return Boolean.TRUE;
}
return Boolean.FALSE;
}
/**
* 参数对象
*/
@Data
public static class SendSmsRequest {
/**
* 电话
*/
private String phone;
/**
* 模板 ID: 必须填写已审核通过的模板 ID
*/
private String templateId;
/**
* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空
*/
private String[] templateParamSet;
private Long caseId;
}
}

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