708 Commits
Author SHA1 Message Date
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
qtzandGitea 6a913f49f0 Merge branch 'dev' of SH-Arbitrate/Arbitrate-Backend into master 2023-09-07 10:57:00 +08:00
qtzandGitea c4840e46d3 Merge branch 'qtz' of SH-Arbitrate/Arbitrate-Backend into dev 2023-09-07 10:48:06 +08:00
qitz fe4c2e3f20 仲裁系统后端 2023-09-06 18:13:01 +08:00
521 changed files with 65454 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
*.swp
!*/build/*.java
!*/build/*.html
!*/build/*.xml
+20
View File
@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2018 RuoYi
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+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
+231
View File
@@ -0,0 +1,231 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.8.6</version>
<name>ruoyi</name>
<url>http://www.ruoyi.vip</url>
<description>若依管理系统</description>
<properties>
<ruoyi.version>3.8.6</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<druid.version>1.2.16</druid.version>
<bitwalker.version>1.21</bitwalker.version>
<swagger.version>3.0.0</swagger.version>
<kaptcha.version>2.3.3</kaptcha.version>
<pagehelper.boot.version>1.4.6</pagehelper.boot.version>
<fastjson.version>2.0.39</fastjson.version>
<oshi.version>6.4.4</oshi.version>
<commons.io.version>2.13.0</commons.io.version>
<commons.collections.version>3.2.2</commons.collections.version>
<poi.version>4.1.2</poi.version>
<velocity.version>2.3</velocity.version>
<jwt.version>0.9.1</jwt.version>
</properties>
<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.15</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- 解析客户端操作系统、浏览器等 -->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>${bitwalker.version}</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version>
</dependency>
<!-- 获取系统信息 -->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>${oshi.version}</version>
</dependency>
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- io常用工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<!-- velocity代码生成使用模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
</dependency>
<!-- collections工具类 -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>${commons.collections.version}</version>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<!-- 验证码 -->
<dependency>
<groupId>pro.fessional</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 代码生成-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 系统模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 通用工具-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${ruoyi.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>ruoyi-admin</module>
<module>ruoyi-framework</module>
<module>ruoyi-system</module>
<module>ruoyi-quartz</module>
<module>ruoyi-generator</module>
<module>ruoyi-common</module>
<module>pay</module>
</modules>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<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>
</build>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
+100
View File
@@ -0,0 +1,100 @@
<?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>
<packaging>jar</packaging>
<artifactId>ruoyi-admin</artifactId>
<description>
web服务入口
</description>
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- swagger3-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.6.2</version>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId>
</dependency>
<!-- 代码生成-->
<dependency>
<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>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.15</version>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>
@@ -0,0 +1,32 @@
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;
/**
* 启动程序
*
* @author ruoyi
*/
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@EnableScheduling
public class RuoYiApplication
{
public static void main(String[] args)
{
// System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(RuoYiApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +
" .-------. ____ __ \n" +
" | _ _ \\ \\ \\ / / \n" +
" | ( ' ) | \\ _. / ' \n" +
" |(_ o _) / _( )_ .' \n" +
" | (_,_).' __ ___(_ o _)' \n" +
" | |\\ \\ | || |(_,_)' \n" +
" | | \\ `' /| `-' / \n" +
" | | \\ / \\ / \n" +
" ''-' `'-' `-..-' ");
}
}
@@ -0,0 +1,18 @@
package com.ruoyi;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* web容器中进行部署
*
* @author ruoyi
*/
public class RuoYiServletInitializer extends SpringBootServletInitializer
{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
{
return application.sources(RuoYiApplication.class);
}
}
@@ -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
}
@@ -0,0 +1,94 @@
package com.ruoyi.web.controller.common;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.code.kaptcha.Producer;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.sign.Base64;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.service.ISysConfigService;
/**
* 验证码操作处理
*
* @author ruoyi
*/
@RestController
public class CaptchaController
{
@Resource(name = "captchaProducer")
private Producer captchaProducer;
@Resource(name = "captchaProducerMath")
private Producer captchaProducerMath;
@Autowired
private RedisCache redisCache;
@Autowired
private ISysConfigService configService;
/**
* 生成验证码
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
AjaxResult ajax = AjaxResult.success();
boolean captchaEnabled = configService.selectCaptchaEnabled();
ajax.put("captchaEnabled", captchaEnabled);
if (!captchaEnabled)
{
return ajax;
}
// 保存验证码信息
String uuid = IdUtils.simpleUUID();
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
String capStr = null, code = null;
BufferedImage image = null;
// 生成验证码
String captchaType = RuoYiConfig.getCaptchaType();
if ("math".equals(captchaType))
{
String capText = captchaProducerMath.createText();
capStr = capText.substring(0, capText.lastIndexOf("@"));
code = capText.substring(capText.lastIndexOf("@") + 1);
image = captchaProducerMath.createImage(capStr);
}
else if ("char".equals(captchaType))
{
capStr = code = captchaProducer.createText();
image = captchaProducer.createImage(capStr);
}
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
// 转换流信息写出
FastByteArrayOutputStream os = new FastByteArrayOutputStream();
try
{
ImageIO.write(image, "jpg", os);
}
catch (IOException e)
{
return AjaxResult.error(e.getMessage());
}
ajax.put("uuid", uuid);
ajax.put("img", Base64.encode(os.toByteArray()));
return ajax;
}
}
@@ -0,0 +1,163 @@
package com.ruoyi.web.controller.common;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.ServerConfig;
/**
* 通用请求处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/common")
public class CommonController
{
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@Autowired
private ServerConfig serverConfig;
private static final String FILE_DELIMETER = ",";
/**
* 通用下载请求
*
* @param fileName 文件名称
* @param delete 是否删除
*/
@GetMapping("/download")
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
{
try
{
if (!FileUtils.checkAllowDownload(fileName))
{
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
}
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
String filePath = RuoYiConfig.getDownloadPath() + fileName;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, realFileName);
FileUtils.writeBytes(filePath, response.getOutputStream());
if (delete)
{
FileUtils.deleteFile(filePath);
}
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
}
/**
* 通用上传请求(单个)
*/
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
try
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("url", url);
ajax.put("fileName", fileName);
ajax.put("newFileName", FileUtils.getName(fileName));
ajax.put("originalFilename", file.getOriginalFilename());
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
/**
* 通用上传请求(多个)
*/
@PostMapping("/uploads")
public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
{
try
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
List<String> urls = new ArrayList<String>();
List<String> fileNames = new ArrayList<String>();
List<String> newFileNames = new ArrayList<String>();
List<String> originalFilenames = new ArrayList<String>();
for (MultipartFile file : files)
{
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
urls.add(url);
fileNames.add(fileName);
newFileNames.add(FileUtils.getName(fileName));
originalFilenames.add(file.getOriginalFilename());
}
AjaxResult ajax = AjaxResult.success();
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
/**
* 本地资源通用下载
*/
@GetMapping("/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
try
{
if (!FileUtils.checkAllowDownload(resource))
{
throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
}
// 本地资源路径
String localPath = RuoYiConfig.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
}
}
@@ -0,0 +1,120 @@
package com.ruoyi.web.controller.monitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysCache;
/**
* 缓存监控
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/cache")
public class CacheController
{
@Autowired
private RedisTemplate<String, String> redisTemplate;
private final static List<SysCache> caches = new ArrayList<SysCache>();
{
caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping()
public AjaxResult getInfo() throws Exception
{
Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
Map<String, Object> result = new HashMap<>(3);
result.put("info", info);
result.put("dbSize", dbSize);
List<Map<String, String>> pieList = new ArrayList<>();
commandStats.stringPropertyNames().forEach(key -> {
Map<String, String> data = new HashMap<>(2);
String property = commandStats.getProperty(key);
data.put("name", StringUtils.removeStart(key, "cmdstat_"));
data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
pieList.add(data);
});
result.put("commandStats", pieList);
return AjaxResult.success(result);
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping("/getNames")
public AjaxResult cache()
{
return AjaxResult.success(caches);
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping("/getKeys/{cacheName}")
public AjaxResult getCacheKeys(@PathVariable String cacheName)
{
Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
return AjaxResult.success(cacheKeys);
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@GetMapping("/getValue/{cacheName}/{cacheKey}")
public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
{
String cacheValue = redisTemplate.opsForValue().get(cacheKey);
SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
return AjaxResult.success(sysCache);
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@DeleteMapping("/clearCacheName/{cacheName}")
public AjaxResult clearCacheName(@PathVariable String cacheName)
{
Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
redisTemplate.delete(cacheKeys);
return AjaxResult.success();
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@DeleteMapping("/clearCacheKey/{cacheKey}")
public AjaxResult clearCacheKey(@PathVariable String cacheKey)
{
redisTemplate.delete(cacheKey);
return AjaxResult.success();
}
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
@DeleteMapping("/clearCacheAll")
public AjaxResult clearCacheAll()
{
Collection<String> cacheKeys = redisTemplate.keys("*");
redisTemplate.delete(cacheKeys);
return AjaxResult.success();
}
}
@@ -0,0 +1,27 @@
package com.ruoyi.web.controller.monitor;
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 com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.framework.web.domain.Server;
/**
* 服务器监控
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/server")
public class ServerController
{
@PreAuthorize("@ss.hasPermi('monitor:server:list')")
@GetMapping()
public AjaxResult getInfo() throws Exception
{
Server server = new Server();
server.copyTo();
return AjaxResult.success(server);
}
}
@@ -0,0 +1,82 @@
package com.ruoyi.web.controller.monitor;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.service.SysPasswordService;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.service.ISysLogininforService;
/**
* 系统访问记录
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/logininfor")
public class SysLogininforController extends BaseController
{
@Autowired
private ISysLogininforService logininforService;
@Autowired
private SysPasswordService passwordService;
@PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
@GetMapping("/list")
public TableDataInfo list(SysLogininfor logininfor)
{
startPage();
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
return getDataTable(list);
}
@Log(title = "登录日志", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysLogininfor logininfor)
{
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
util.exportExcel(response, list, "登录日志");
}
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
@Log(title = "登录日志", businessType = BusinessType.DELETE)
@DeleteMapping("/{infoIds}")
public AjaxResult remove(@PathVariable Long[] infoIds)
{
return toAjax(logininforService.deleteLogininforByIds(infoIds));
}
@PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
@Log(title = "登录日志", businessType = BusinessType.CLEAN)
@DeleteMapping("/clean")
public AjaxResult clean()
{
logininforService.cleanLogininfor();
return success();
}
@PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')")
@Log(title = "账户解锁", businessType = BusinessType.OTHER)
@GetMapping("/unlock/{userName}")
public AjaxResult unlock(@PathVariable("userName") String userName)
{
passwordService.clearLoginRecordCache(userName);
return success();
}
}
@@ -0,0 +1,69 @@
package com.ruoyi.web.controller.monitor;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.service.ISysOperLogService;
/**
* 操作日志记录
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/operlog")
public class SysOperlogController extends BaseController
{
@Autowired
private ISysOperLogService operLogService;
@PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
@GetMapping("/list")
public TableDataInfo list(SysOperLog operLog)
{
startPage();
List<SysOperLog> list = operLogService.selectOperLogList(operLog);
return getDataTable(list);
}
@Log(title = "操作日志", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysOperLog operLog)
{
List<SysOperLog> list = operLogService.selectOperLogList(operLog);
ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
util.exportExcel(response, list, "操作日志");
}
@Log(title = "操作日志", businessType = BusinessType.DELETE)
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/{operIds}")
public AjaxResult remove(@PathVariable Long[] operIds)
{
return toAjax(operLogService.deleteOperLogByIds(operIds));
}
@Log(title = "操作日志", businessType = BusinessType.CLEAN)
@PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
@DeleteMapping("/clean")
public AjaxResult clean()
{
operLogService.cleanOperLog();
return success();
}
}
@@ -0,0 +1,83 @@
package com.ruoyi.web.controller.monitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService;
/**
* 在线用户监控
*
* @author ruoyi
*/
@RestController
@RequestMapping("/monitor/online")
public class SysUserOnlineController extends BaseController
{
@Autowired
private ISysUserOnlineService userOnlineService;
@Autowired
private RedisCache redisCache;
@PreAuthorize("@ss.hasPermi('monitor:online:list')")
@GetMapping("/list")
public TableDataInfo list(String ipaddr, String userName)
{
Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
for (String key : keys)
{
LoginUser user = redisCache.getCacheObject(key);
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
{
userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
}
else if (StringUtils.isNotEmpty(ipaddr))
{
userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
}
else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
{
userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
}
else
{
userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
}
}
Collections.reverse(userOnlineList);
userOnlineList.removeAll(Collections.singleton(null));
return getDataTable(userOnlineList);
}
/**
* 强退用户
*/
@PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
@Log(title = "在线用户", businessType = BusinessType.FORCE)
@DeleteMapping("/{tokenId}")
public AjaxResult forceLogout(@PathVariable String tokenId)
{
redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
return success();
}
}
@@ -0,0 +1,133 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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 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.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
/**
* 参数配置 信息操作处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/config")
public class SysConfigController extends BaseController
{
@Autowired
private ISysConfigService configService;
/**
* 获取参数配置列表
*/
@PreAuthorize("@ss.hasPermi('system:config:list')")
@GetMapping("/list")
public TableDataInfo list(SysConfig config)
{
startPage();
List<SysConfig> list = configService.selectConfigList(config);
return getDataTable(list);
}
@Log(title = "参数管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:config:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysConfig config)
{
List<SysConfig> list = configService.selectConfigList(config);
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
util.exportExcel(response, list, "参数数据");
}
/**
* 根据参数编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:config:query')")
@GetMapping(value = "/{configId}")
public AjaxResult getInfo(@PathVariable Long configId)
{
return success(configService.selectConfigById(configId));
}
/**
* 根据参数键名查询参数值
*/
@GetMapping(value = "/configKey/{configKey}")
public AjaxResult getConfigKey(@PathVariable String configKey)
{
return success(configService.selectConfigByKey(configKey));
}
/**
* 新增参数配置
*/
@PreAuthorize("@ss.hasPermi('system:config:add')")
@Log(title = "参数管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysConfig config)
{
if (!configService.checkConfigKeyUnique(config))
{
return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
config.setCreateBy(getUsername());
return toAjax(configService.insertConfig(config));
}
/**
* 修改参数配置
*/
@PreAuthorize("@ss.hasPermi('system:config:edit')")
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysConfig config)
{
if (!configService.checkConfigKeyUnique(config))
{
return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
config.setUpdateBy(getUsername());
return toAjax(configService.updateConfig(config));
}
/**
* 删除参数配置
*/
@PreAuthorize("@ss.hasPermi('system:config:remove')")
@Log(title = "参数管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{configIds}")
public AjaxResult remove(@PathVariable Long[] configIds)
{
configService.deleteConfigByIds(configIds);
return success();
}
/**
* 刷新参数缓存
*/
@PreAuthorize("@ss.hasPermi('system:config:remove')")
@Log(title = "参数管理", businessType = BusinessType.CLEAN)
@DeleteMapping("/refreshCache")
public AjaxResult refreshCache()
{
configService.resetConfigCache();
return success();
}
}
@@ -0,0 +1,132 @@
package com.ruoyi.web.controller.system;
import java.util.List;
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 com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
/**
* 部门信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/dept")
public class SysDeptController extends BaseController
{
@Autowired
private ISysDeptService deptService;
/**
* 获取部门列表
*/
@PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list")
public AjaxResult list(SysDept dept)
{
List<SysDept> depts = deptService.selectDeptList(dept);
return success(depts);
}
/**
* 查询部门列表(排除节点)
*/
@PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list/exclude/{deptId}")
public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
{
List<SysDept> depts = deptService.selectDeptList(new SysDept());
depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
return success(depts);
}
/**
* 根据部门编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:dept:query')")
@GetMapping(value = "/{deptId}")
public AjaxResult getInfo(@PathVariable Long deptId)
{
deptService.checkDeptDataScope(deptId);
return success(deptService.selectDeptById(deptId));
}
/**
* 新增部门
*/
@PreAuthorize("@ss.hasPermi('system:dept:add')")
@Log(title = "部门管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysDept dept)
{
if (!deptService.checkDeptNameUnique(dept))
{
return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
}
dept.setCreateBy(getUsername());
return toAjax(deptService.insertDept(dept));
}
/**
* 修改部门
*/
@PreAuthorize("@ss.hasPermi('system:dept:edit')")
@Log(title = "部门管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysDept dept)
{
Long deptId = dept.getDeptId();
deptService.checkDeptDataScope(deptId);
if (!deptService.checkDeptNameUnique(dept))
{
return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
}
else if (dept.getParentId().equals(deptId))
{
return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
}
else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
{
return error("该部门包含未停用的子部门!");
}
dept.setUpdateBy(getUsername());
return toAjax(deptService.updateDept(dept));
}
/**
* 删除部门
*/
@PreAuthorize("@ss.hasPermi('system:dept:remove')")
@Log(title = "部门管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{deptId}")
public AjaxResult remove(@PathVariable Long deptId)
{
if (deptService.hasChildByDeptId(deptId))
{
return warn("存在下级部门,不允许删除");
}
if (deptService.checkDeptExistUser(deptId))
{
return warn("部门存在用户,不允许删除");
}
deptService.checkDeptDataScope(deptId);
return toAjax(deptService.deleteDeptById(deptId));
}
}
@@ -0,0 +1,121 @@
package com.ruoyi.web.controller.system;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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 com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService;
/**
* 数据字典信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/dict/data")
public class SysDictDataController extends BaseController
{
@Autowired
private ISysDictDataService dictDataService;
@Autowired
private ISysDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list")
public TableDataInfo list(SysDictData dictData)
{
startPage();
List<SysDictData> list = dictDataService.selectDictDataList(dictData);
return getDataTable(list);
}
@Log(title = "字典数据", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysDictData dictData)
{
List<SysDictData> list = dictDataService.selectDictDataList(dictData);
ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
util.exportExcel(response, list, "字典数据");
}
/**
* 查询字典数据详细
*/
@PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictCode}")
public AjaxResult getInfo(@PathVariable Long dictCode)
{
return success(dictDataService.selectDictDataById(dictCode));
}
/**
* 根据字典类型查询字典数据信息
*/
@GetMapping(value = "/type/{dictType}")
public AjaxResult dictType(@PathVariable String dictType)
{
List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
if (StringUtils.isNull(data))
{
data = new ArrayList<SysDictData>();
}
return success(data);
}
/**
* 新增字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典数据", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysDictData dict)
{
dict.setCreateBy(getUsername());
return toAjax(dictDataService.insertDictData(dict));
}
/**
* 修改保存字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典数据", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictData dict)
{
dict.setUpdateBy(getUsername());
return toAjax(dictDataService.updateDictData(dict));
}
/**
* 删除字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictCodes}")
public AjaxResult remove(@PathVariable Long[] dictCodes)
{
dictDataService.deleteDictDataByIds(dictCodes);
return success();
}
}
@@ -0,0 +1,131 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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 com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDictType;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictTypeService;
/**
* 数据字典信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/dict/type")
public class SysDictTypeController extends BaseController
{
@Autowired
private ISysDictTypeService dictTypeService;
@PreAuthorize("@ss.hasPermi('system:dict:list')")
@GetMapping("/list")
public TableDataInfo list(SysDictType dictType)
{
startPage();
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
return getDataTable(list);
}
@Log(title = "字典类型", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:dict:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysDictType dictType)
{
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
util.exportExcel(response, list, "字典类型");
}
/**
* 查询字典类型详细
*/
@PreAuthorize("@ss.hasPermi('system:dict:query')")
@GetMapping(value = "/{dictId}")
public AjaxResult getInfo(@PathVariable Long dictId)
{
return success(dictTypeService.selectDictTypeById(dictId));
}
/**
* 新增字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:add')")
@Log(title = "字典类型", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysDictType dict)
{
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
dict.setCreateBy(getUsername());
return toAjax(dictTypeService.insertDictType(dict));
}
/**
* 修改字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:edit')")
@Log(title = "字典类型", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictType dict)
{
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
dict.setUpdateBy(getUsername());
return toAjax(dictTypeService.updateDictType(dict));
}
/**
* 删除字典类型
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.DELETE)
@DeleteMapping("/{dictIds}")
public AjaxResult remove(@PathVariable Long[] dictIds)
{
dictTypeService.deleteDictTypeByIds(dictIds);
return success();
}
/**
* 刷新字典缓存
*/
@PreAuthorize("@ss.hasPermi('system:dict:remove')")
@Log(title = "字典类型", businessType = BusinessType.CLEAN)
@DeleteMapping("/refreshCache")
public AjaxResult refreshCache()
{
dictTypeService.resetDictCache();
return success();
}
/**
* 获取字典选择框列表
*/
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
return success(dictTypes);
}
}
@@ -0,0 +1,29 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.StringUtils;
/**
* 首页
*
* @author ruoyi
*/
@RestController
public class SysIndexController
{
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
/**
* 访问首页,提示语
*/
@RequestMapping("/")
public String index()
{
return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
}
}
@@ -0,0 +1,100 @@
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;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.system.service.ISysMenuService;
/**
* 登录验证
*
* @author ruoyi
*/
@RestController
public class SysLoginController {
@Autowired
private SysLoginService loginService;
@Autowired
private ISysMenuService menuService;
@Autowired
private SysPermissionService permissionService;
@Autowired
IdentityAuthenticationService identityAuthenticationService;
@Autowired
private ISysUserService sysUserService;
/**
* 登录方法
*
* @param loginBody 登录信息
* @return 结果
*/
@PostMapping("/login")
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;
}
/**
* 获取用户信息
*
* @return 用户信息
*/
@GetMapping("getInfo")
public AjaxResult getInfo() {
SysUser user = SecurityUtils.getLoginUser().getUser();
// 角色集合
Set<String> roles = permissionService.getRolePermission(user);
// 权限集合
Set<String> permissions = permissionService.getMenuPermission(user);
AjaxResult ajax = AjaxResult.success();
ajax.put("user", user);
ajax.put("roles", roles);
ajax.put("permissions", permissions);
return ajax;
}
/**
* 获取路由信息
*
* @return 路由信息
*/
@GetMapping("getRouters")
public AjaxResult getRouters() {
Long userId = SecurityUtils.getUserId();
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus));
}
}
@@ -0,0 +1,142 @@
package com.ruoyi.web.controller.system;
import java.util.List;
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 com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysMenuService;
/**
* 菜单信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/menu")
public class SysMenuController extends BaseController
{
@Autowired
private ISysMenuService menuService;
/**
* 获取菜单列表
*/
@PreAuthorize("@ss.hasPermi('system:menu:list')")
@GetMapping("/list")
public AjaxResult list(SysMenu menu)
{
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
return success(menus);
}
/**
* 根据菜单编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:menu:query')")
@GetMapping(value = "/{menuId}")
public AjaxResult getInfo(@PathVariable Long menuId)
{
return success(menuService.selectMenuById(menuId));
}
/**
* 获取菜单下拉树列表
*/
@GetMapping("/treeselect")
public AjaxResult treeselect(SysMenu menu)
{
List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
return success(menuService.buildMenuTreeSelect(menus));
}
/**
* 加载对应角色菜单列表树
*/
@GetMapping(value = "/roleMenuTreeselect/{roleId}")
public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
{
List<SysMenu> menus = menuService.selectMenuList(getUserId());
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
ajax.put("menus", menuService.buildMenuTreeSelect(menus));
return ajax;
}
/**
* 新增菜单
*/
@PreAuthorize("@ss.hasPermi('system:menu:add')")
@Log(title = "菜单管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysMenu menu)
{
if (!menuService.checkMenuNameUnique(menu))
{
return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
}
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
{
return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
}
menu.setCreateBy(getUsername());
return toAjax(menuService.insertMenu(menu));
}
/**
* 修改菜单
*/
@PreAuthorize("@ss.hasPermi('system:menu:edit')")
@Log(title = "菜单管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysMenu menu)
{
if (!menuService.checkMenuNameUnique(menu))
{
return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
}
else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
{
return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
}
else if (menu.getMenuId().equals(menu.getParentId()))
{
return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
}
menu.setUpdateBy(getUsername());
return toAjax(menuService.updateMenu(menu));
}
/**
* 删除菜单
*/
@PreAuthorize("@ss.hasPermi('system:menu:remove')")
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{menuId}")
public AjaxResult remove(@PathVariable("menuId") Long menuId)
{
if (menuService.hasChildByMenuId(menuId))
{
return warn("存在子菜单,不允许删除");
}
if (menuService.checkMenuExistRole(menuId))
{
return warn("菜单已分配,不允许删除");
}
return toAjax(menuService.deleteMenuById(menuId));
}
}
@@ -0,0 +1,91 @@
package com.ruoyi.web.controller.system;
import java.util.List;
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 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.system.domain.SysNotice;
import com.ruoyi.system.service.ISysNoticeService;
/**
* 公告 信息操作处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/notice")
public class SysNoticeController extends BaseController
{
@Autowired
private ISysNoticeService noticeService;
/**
* 获取通知公告列表
*/
@PreAuthorize("@ss.hasPermi('system:notice:list')")
@GetMapping("/list")
public TableDataInfo list(SysNotice notice)
{
startPage();
List<SysNotice> list = noticeService.selectNoticeList(notice);
return getDataTable(list);
}
/**
* 根据通知公告编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:notice:query')")
@GetMapping(value = "/{noticeId}")
public AjaxResult getInfo(@PathVariable Long noticeId)
{
return success(noticeService.selectNoticeById(noticeId));
}
/**
* 新增通知公告
*/
@PreAuthorize("@ss.hasPermi('system:notice:add')")
@Log(title = "通知公告", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysNotice notice)
{
notice.setCreateBy(getUsername());
return toAjax(noticeService.insertNotice(notice));
}
/**
* 修改通知公告
*/
@PreAuthorize("@ss.hasPermi('system:notice:edit')")
@Log(title = "通知公告", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysNotice notice)
{
notice.setUpdateBy(getUsername());
return toAjax(noticeService.updateNotice(notice));
}
/**
* 删除通知公告
*/
@PreAuthorize("@ss.hasPermi('system:notice:remove')")
@Log(title = "通知公告", businessType = BusinessType.DELETE)
@DeleteMapping("/{noticeIds}")
public AjaxResult remove(@PathVariable Long[] noticeIds)
{
return toAjax(noticeService.deleteNoticeByIds(noticeIds));
}
}
@@ -0,0 +1,129 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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 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.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService;
/**
* 岗位信息操作处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/post")
public class SysPostController extends BaseController
{
@Autowired
private ISysPostService postService;
/**
* 获取岗位列表
*/
@PreAuthorize("@ss.hasPermi('system:post:list')")
@GetMapping("/list")
public TableDataInfo list(SysPost post)
{
startPage();
List<SysPost> list = postService.selectPostList(post);
return getDataTable(list);
}
@Log(title = "岗位管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:post:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysPost post)
{
List<SysPost> list = postService.selectPostList(post);
ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
util.exportExcel(response, list, "岗位数据");
}
/**
* 根据岗位编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:post:query')")
@GetMapping(value = "/{postId}")
public AjaxResult getInfo(@PathVariable Long postId)
{
return success(postService.selectPostById(postId));
}
/**
* 新增岗位
*/
@PreAuthorize("@ss.hasPermi('system:post:add')")
@Log(title = "岗位管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysPost post)
{
if (!postService.checkPostNameUnique(post))
{
return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
}
else if (!postService.checkPostCodeUnique(post))
{
return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
}
post.setCreateBy(getUsername());
return toAjax(postService.insertPost(post));
}
/**
* 修改岗位
*/
@PreAuthorize("@ss.hasPermi('system:post:edit')")
@Log(title = "岗位管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysPost post)
{
if (!postService.checkPostNameUnique(post))
{
return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
}
else if (!postService.checkPostCodeUnique(post))
{
return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
}
post.setUpdateBy(getUsername());
return toAjax(postService.updatePost(post));
}
/**
* 删除岗位
*/
@PreAuthorize("@ss.hasPermi('system:post:remove')")
@Log(title = "岗位管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{postIds}")
public AjaxResult remove(@PathVariable Long[] postIds)
{
return toAjax(postService.deletePostByIds(postIds));
}
/**
* 获取岗位选择框列表
*/
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
List<SysPost> posts = postService.selectPostAll();
return success(posts);
}
}
@@ -0,0 +1,136 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.service.ISysUserService;
/**
* 个人信息 业务处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/user/profile")
public class SysProfileController extends BaseController
{
@Autowired
private ISysUserService userService;
@Autowired
private TokenService tokenService;
/**
* 个人信息
*/
@GetMapping
public AjaxResult profile()
{
LoginUser loginUser = getLoginUser();
SysUser user = loginUser.getUser();
AjaxResult ajax = AjaxResult.success(user);
ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
return ajax;
}
/**
* 修改用户
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult updateProfile(@RequestBody SysUser user)
{
LoginUser loginUser = getLoginUser();
SysUser currentUser = loginUser.getUser();
currentUser.setNickName(user.getNickName());
currentUser.setEmail(user.getEmail());
currentUser.setPhonenumber(user.getPhonenumber());
currentUser.setSex(user.getSex());
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
{
return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
}
if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
{
return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
if (userService.updateUserProfile(currentUser) > 0)
{
// 更新缓存用户信息
tokenService.setLoginUser(loginUser);
return success();
}
return error("修改个人信息异常,请联系管理员");
}
/**
* 重置密码
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/updatePwd")
public AjaxResult updatePwd(String oldPassword, String newPassword)
{
LoginUser loginUser = getLoginUser();
String userName = loginUser.getUsername();
String password = loginUser.getPassword();
if (!SecurityUtils.matchesPassword(oldPassword, password))
{
return error("修改密码失败,旧密码错误");
}
if (SecurityUtils.matchesPassword(newPassword, password))
{
return error("新密码不能与旧密码相同");
}
if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
{
// 更新缓存用户密码
loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));
tokenService.setLoginUser(loginUser);
return success();
}
return error("修改密码异常,请联系管理员");
}
/**
* 头像上传
*/
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
@PostMapping("/avatar")
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
{
if (!file.isEmpty())
{
LoginUser loginUser = getLoginUser();
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
{
AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", avatar);
// 更新缓存用户头像
loginUser.getUser().setAvatar(avatar);
tokenService.setLoginUser(loginUser);
return ajax;
}
}
return error("上传图片异常,请联系管理员");
}
}
@@ -0,0 +1,38 @@
package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.SysRegisterService;
import com.ruoyi.system.service.ISysConfigService;
/**
* 注册验证
*
* @author ruoyi
*/
@RestController
public class SysRegisterController extends BaseController
{
@Autowired
private SysRegisterService registerService;
@Autowired
private ISysConfigService configService;
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
{
return error("当前系统没有开启注册功能!");
}
String msg = registerService.register(user);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
}
@@ -0,0 +1,262 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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 com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
/**
* 角色信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/role")
public class SysRoleController extends BaseController
{
@Autowired
private ISysRoleService roleService;
@Autowired
private TokenService tokenService;
@Autowired
private SysPermissionService permissionService;
@Autowired
private ISysUserService userService;
@Autowired
private ISysDeptService deptService;
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/list")
public TableDataInfo list(SysRole role)
{
startPage();
List<SysRole> list = roleService.selectRoleList(role);
return getDataTable(list);
}
@Log(title = "角色管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:role:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysRole role)
{
List<SysRole> list = roleService.selectRoleList(role);
ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
util.exportExcel(response, list, "角色数据");
}
/**
* 根据角色编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping(value = "/{roleId}")
public AjaxResult getInfo(@PathVariable Long roleId)
{
roleService.checkRoleDataScope(roleId);
return success(roleService.selectRoleById(roleId));
}
/**
* 新增角色
*/
@PreAuthorize("@ss.hasPermi('system:role:add')")
@Log(title = "角色管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysRole role)
{
if (!roleService.checkRoleNameUnique(role))
{
return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
}
else if (!roleService.checkRoleKeyUnique(role))
{
return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
role.setCreateBy(getUsername());
return toAjax(roleService.insertRole(role));
}
/**
* 修改保存角色
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
if (!roleService.checkRoleNameUnique(role))
{
return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
}
else if (!roleService.checkRoleKeyUnique(role))
{
return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
role.setUpdateBy(getUsername());
if (roleService.updateRole(role) > 0)
{
// 更新缓存用户权限
LoginUser loginUser = getLoginUser();
if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
{
loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
tokenService.setLoginUser(loginUser);
}
return success();
}
return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
}
/**
* 修改保存数据权限
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping("/dataScope")
public AjaxResult dataScope(@RequestBody SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
return toAjax(roleService.authDataScope(role));
}
/**
* 状态修改
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
role.setUpdateBy(getUsername());
return toAjax(roleService.updateRoleStatus(role));
}
/**
* 删除角色
*/
@PreAuthorize("@ss.hasPermi('system:role:remove')")
@Log(title = "角色管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{roleIds}")
public AjaxResult remove(@PathVariable Long[] roleIds)
{
return toAjax(roleService.deleteRoleByIds(roleIds));
}
/**
* 获取角色选择框列表
*/
@PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping("/optionselect")
public AjaxResult optionselect()
{
return success(roleService.selectRoleAll());
}
/**
* 查询已分配用户角色列表
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/allocatedList")
public TableDataInfo allocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectAllocatedList(user);
return getDataTable(list);
}
/**
* 查询未分配用户角色列表
*/
@PreAuthorize("@ss.hasPermi('system:role:list')")
@GetMapping("/authUser/unallocatedList")
public TableDataInfo unallocatedList(SysUser user)
{
startPage();
List<SysUser> list = userService.selectUnallocatedList(user);
return getDataTable(list);
}
/**
* 取消授权用户
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancel")
public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
{
return toAjax(roleService.deleteAuthUser(userRole));
}
/**
* 批量取消授权用户
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancelAll")
public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
{
return toAjax(roleService.deleteAuthUsers(roleId, userIds));
}
/**
* 批量选择用户授权
*/
@PreAuthorize("@ss.hasPermi('system:role:edit')")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/selectAll")
public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
{
roleService.checkRoleDataScope(roleId);
return toAjax(roleService.insertAuthUsers(roleId, userIds));
}
/**
* 获取对应角色部门树列表
*/
@PreAuthorize("@ss.hasPermi('system:role:query')")
@GetMapping(value = "/deptTree/{roleId}")
public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
{
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
return ajax;
}
}
@@ -0,0 +1,258 @@
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.*;
import org.springframework.web.multipart.MultipartFile;
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.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
/**
* 用户信息
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController
{
@Autowired
private ISysUserService userService;
@Autowired
private ISysRoleService roleService;
@Autowired
private ISysDeptService deptService;
@Autowired
private ISysPostService postService;
/**
* 获取用户列表
*/
@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
public TableDataInfo list(SysUser user)
{
startPage();
List<SysUser> list = userService.selectUserList(user);
return getDataTable(list);
}
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:user:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysUser user)
{
List<SysUser> list = userService.selectUserList(user);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
util.exportExcel(response, list, "用户数据");
}
@Log(title = "用户管理", businessType = BusinessType.IMPORT)
@PreAuthorize("@ss.hasPermi('system:user:import')")
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
List<SysUser> userList = util.importExcel(file.getInputStream());
String operName = getUsername();
String message = userService.importUser(userList, updateSupport, operName);
return success(message);
}
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response)
{
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
util.importTemplateExcel(response, "用户数据");
}
/**
* 根据用户编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping(value = { "/", "/{userId}" })
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
{
userService.checkUserDataScope(userId);
AjaxResult ajax = AjaxResult.success();
List<SysRole> roles = roleService.selectRoleAll();
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
ajax.put("posts", postService.selectPostAll());
if (StringUtils.isNotNull(userId))
{
SysUser sysUser = userService.selectUserById(userId);
ajax.put(AjaxResult.DATA_TAG, sysUser);
ajax.put("postIds", postService.selectPostListByUserId(userId));
ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
}
return ajax;
}
/**
* 新增用户
*/
@PreAuthorize("@ss.hasPermi('system:user:add')")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysUser user)
{
if (!userService.checkUserNameUnique(user))
{
return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
}
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
{
return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
{
return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setCreateBy(getUsername());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
return userService.insertUser(user);
}
/**
* 修改用户
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
if (!userService.checkUserNameUnique(user))
{
return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
}
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
{
return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
{
return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setUpdateBy(getUsername());
return userService.updateUser(user);
}
/**
* 删除用户
*/
@PreAuthorize("@ss.hasPermi('system:user:remove')")
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{userIds}")
public AjaxResult remove(@PathVariable Long[] userIds)
{
if (ArrayUtils.contains(userIds, getUserId()))
{
return error("当前用户不能删除");
}
return toAjax(userService.deleteUserByIds(userIds));
}
/**
* 重置密码
*/
@PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/resetPwd")
public AjaxResult resetPwd(@RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
user.setUpdateBy(getUsername());
return toAjax(userService.resetPwd(user));
}
/**
* 状态修改
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public AjaxResult changeStatus(@RequestBody SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setUpdateBy(getUsername());
return toAjax(userService.updateUserStatus(user));
}
/**
* 根据用户编号获取授权角色
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping("/authRole/{userId}")
public AjaxResult authRole(@PathVariable("userId") Long userId)
{
AjaxResult ajax = AjaxResult.success();
SysUser user = userService.selectUserById(userId);
List<SysRole> roles = roleService.selectRolesByUserId(userId);
ajax.put("user", user);
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
return ajax;
}
/**
* 用户授权角色
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole")
public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
{
userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds);
return success();
}
/**
* 获取部门树列表
*/
@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/deptTree")
public AjaxResult deptTree(SysDept dept)
{
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,183 @@
package com.ruoyi.web.controller.tool;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
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 com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
/**
* swagger 用户测试方法
*
* @author ruoyi
*/
@Api("用户信息管理")
@RestController
@RequestMapping("/test/user")
public class TestController extends BaseController
{
private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
{
users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
}
@ApiOperation("获取用户列表")
@GetMapping("/list")
public R<List<UserEntity>> userList()
{
List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
return R.ok(userList);
}
@ApiOperation("获取用户详细")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@GetMapping("/{userId}")
public R<UserEntity> getUser(@PathVariable Integer userId)
{
if (!users.isEmpty() && users.containsKey(userId))
{
return R.ok(users.get(userId));
}
else
{
return R.fail("用户不存在");
}
}
@ApiOperation("新增用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class),
@ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class),
@ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class)
})
@PostMapping("/save")
public R<String> save(UserEntity user)
{
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
{
return R.fail("用户ID不能为空");
}
users.put(user.getUserId(), user);
return R.ok();
}
@ApiOperation("更新用户")
@PutMapping("/update")
public R<String> update(@RequestBody UserEntity user)
{
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
{
return R.fail("用户ID不能为空");
}
if (users.isEmpty() || !users.containsKey(user.getUserId()))
{
return R.fail("用户不存在");
}
users.remove(user.getUserId());
users.put(user.getUserId(), user);
return R.ok();
}
@ApiOperation("删除用户信息")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@DeleteMapping("/{userId}")
public R<String> delete(@PathVariable Integer userId)
{
if (!users.isEmpty() && users.containsKey(userId))
{
users.remove(userId);
return R.ok();
}
else
{
return R.fail("用户不存在");
}
}
}
@ApiModel(value = "UserEntity", description = "用户实体")
class UserEntity
{
@ApiModelProperty("用户ID")
private Integer userId;
@ApiModelProperty("用户名称")
private String username;
@ApiModelProperty("用户密码")
private String password;
@ApiModelProperty("用户手机")
private String mobile;
public UserEntity()
{
}
public UserEntity(Integer userId, String username, String password, String mobile)
{
this.userId = userId;
this.username = username;
this.password = password;
this.mobile = mobile;
}
public Integer getUserId()
{
return userId;
}
public void setUserId(Integer userId)
{
this.userId = userId;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getMobile()
{
return mobile;
}
public void setMobile(String mobile)
{
this.mobile = mobile;
}
}
@@ -0,0 +1,137 @@
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.common.core.redis.RedisCache;
import com.ruoyi.wisdomarbitrate.domain.BatchCaseApplication;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
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.util.List;
@RestController
@RequestMapping("/adjudication")
public class AdjudicationController extends BaseController {
@Autowired
private IAdjudicationService adjudicationService;
/**
* 生成裁决书
* @param caseApplication
* @return
*/
@PostMapping("/document")
public AjaxResult createDocument(@Validated @RequestBody CaseApplication caseApplication){
return adjudicationService.createDocument(caseApplication);
}
/**
* 重新生成裁决书
* @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 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("/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,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,454 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alipay.api.internal.util.file.IOUtils;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.FileTransformation;
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.exception.ServiceException;
import com.ruoyi.common.utils.WxAppletNotifyUtils;
import com.ruoyi.util.FileUtil;
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.ICaseApplicationService;
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 com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
@RestController
@RequestMapping("/caseApplication")
public class CaseApplicationController extends BaseController {
@Autowired
private ICaseApplicationService caseApplicationService;
/**
* 查询立案数据
*/
// @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);
}
/**
* 根据角色查询待办数量
* @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: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()));
}
/**
* 删除立案数据
*/
// @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));
}
/**
* 修改开庭时间
*/
@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: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()));
}
/**
* 确认缴费查询立案信息
*/
// @PreAuthorize("@ss.hasPermi('paymentManagement:list:detail')")
@PostMapping("/selectCaseApplicationConfirm")
public AjaxResult selectCaseApplicationConfirm(@Validated @RequestBody CaseApplication caseApplication) {
CaseApplication caseApplicationselect = caseApplicationService.selectCaseApplicationConfirm(caseApplication);
return success(caseApplicationselect);
}
/**
* 发送房间号短信
*/
@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 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) throws IOException {
return caseApplicationService.uploadCaseZipFile(file);
}
/**
* 根据附件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,47 @@
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){
return caseArbitrateService.examineArbitrateMethod(caseApplication,opinion);
}
/**
* 书面审理
* @param
* @return
*/
@PostMapping("/writtenHear")
public AjaxResult writtenHear(@RequestBody CaseIds caseIds){
return caseArbitrateService.writtenHear(caseIds);
}
}
@@ -0,0 +1,144 @@
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);
}
@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,63 @@
package com.ruoyi.web.controller.wisdomarbitrate;
import com.ruoyi.common.core.domain.AjaxResult;
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.*;
/**
* 缴费支付
*/
@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 caseApplication
* @return
*/
// @PreAuthorize("@ss.hasPermi('paymentManagement:list:payconfirm')")
@PutMapping("/confirm")
public AjaxResult confirmPayment(@Validated @RequestBody CaseApplication caseApplication) {
return paymentService.confirmPayment(caseApplication);
}
/**
* 缴费列表查询
* @param casePayDTO
* @return
*/
@GetMapping("/list")
public AjaxResult casePayList(CasePayDTO casePayDTO) {
return paymentService.casePayList(casePayDTO);
}
}
@@ -0,0 +1,180 @@
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.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);
}
}
@@ -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,125 @@
package com.ruoyi.web.core.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.ruoyi.common.config.RuoYiConfig;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Swagger2的接口配置
*
* @author ruoyi
*/
@Configuration
public class SwaggerConfig
{
/** 系统基础配置 */
@Autowired
private RuoYiConfig ruoyiConfig;
/** 是否开启swagger */
@Value("${swagger.enabled}")
private boolean enabled;
/** 设置请求的统一前缀 */
@Value("${swagger.pathMapping}")
private String pathMapping;
/**
* 创建API
*/
@Bean
public Docket createRestApi()
{
return new Docket(DocumentationType.OAS_30)
// 是否启用Swagger
.enable(enabled)
// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api,用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
// 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
/* 设置安全模式,swagger可以设置访问token */
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.pathMapping(pathMapping);
}
/**
* 安全模式,这里指定token通过Authorization头请求头传递
*/
private List<SecurityScheme> securitySchemes()
{
List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
return apiKeyList;
}
/**
* 安全上下文
*/
private List<SecurityContext> securityContexts()
{
List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
.securityReferences(defaultAuth())
.operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.build());
return securityContexts;
}
/**
* 默认的安全上引用
*/
private List<SecurityReference> defaultAuth()
{
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:若依管理系统_接口文档")
// 描述
.description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
// 作者信息
.contact(new Contact(ruoyiConfig.getName(), null, null))
// 版本
.version("版本号:" + ruoyiConfig.getVersion())
.build();
}
}
@@ -0,0 +1 @@
restart.include.json=/com.alibaba.fastjson.*.jar
@@ -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
@@ -0,0 +1,61 @@
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
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:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
@@ -0,0 +1,185 @@
# 项目相关配置
ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.8.6
# 版权年份
copyrightYear: 2023
# 实例演示开关
demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
profile: /home/ruoyi/uploadPath
# 获取ip地址开关
addressEnabled: false
# 验证码类型 math 数字计算 char 字符验证
captchaType: math
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8001
servlet:
# 应用的访问路径
context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 1000
threads:
# tomcat最大线程数,默认为200
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
# 日志配置
logging:
level:
com.ruoyi: debug
org.springframework: warn
# 用户配置
user:
password:
# 密码最大错误次数
maxRetryCount: 5
# 密码锁定时间(默认10分钟)
lockTime: 10
# Spring配置
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
profiles:
active: druid
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 50MB
# 设置总上传的文件大小
max-request-size: 500MB
# 服务模块
devtools:
restart:
# 热部署开关
enabled: true
# redis 配置
redis:
# 地址
host: 121.40.189.20
# 端口,默认为6379
port: 6389
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
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:
# 令牌自定义标识
header: Authorization
# 令牌密钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 30
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
# Swagger配置
swagger:
# 是否开启swagger
enabled: true
# 请求前缀
pathMapping: /dev-api
# 防止XSS攻击
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
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
+24
View File
@@ -0,0 +1,24 @@
Application Version: ${ruoyi.version}
Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////
@@ -0,0 +1,38 @@
#错误消息
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误
user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
login.blocked=很遗憾,访问IP已被列入系统黑名单
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
user.password.not.valid=* 5-50个字符
user.email.not.valid=邮箱格式错误
user.mobile.phone.number.not.valid=手机号格式错误
user.login.success=登录成功
user.register.success=注册成功
user.notfound=请重新登录
user.forcelogout=管理员强制退出,请重新登录
user.unknown.error=未知错误,请重新登录
##文件上传消息
upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
upload.filename.exceed.length=上传的文件名最长{0}个字符
##权限
no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路径 -->
<property name="log.path" value="/home/ruoyi/logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
@@ -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=
+226
View File
@@ -0,0 +1,226 @@
<?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>ruoyi-common</artifactId>
<description>
common通用工具
</description>
<dependencies>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- SpringWeb模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- spring security 安全认证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<!-- 自定义验证注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--常用工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- JSON工具类 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- 动态数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<!-- io常用工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- Token生成与解析-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
<!-- Jaxb -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- pool 对象池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 解析客户端操作系统、浏览器等 -->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
</dependency>
<!-- servlet包 -->
<dependency>
<groupId>javax.servlet</groupId>
<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,19 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 匿名访问不鉴权注解
*
* @author ruoyi
*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous
{
}
@@ -0,0 +1,33 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据权限过滤注解
*
* @author ruoyi
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope
{
/**
* 部门表的别名
*/
public String deptAlias() default "";
/**
* 用户表的别名
*/
public String userAlias() default "";
/**
* 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来
*/
public String permission() default "";
}
@@ -0,0 +1,28 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.DataSourceType;
/**
* 自定义多数据源切换注解
*
* 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
*
* @author ruoyi
*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource
{
/**
* 切换数据源名称
*/
public DataSourceType value() default DataSourceType.MASTER;
}
@@ -0,0 +1,187 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
/**
* 自定义导出Excel数据注解
*
* @author ruoyi
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
/**
* 导出时在excel中排序
*/
public int sort() default Integer.MAX_VALUE;
/**
* 导出到Excel中的名字.
*/
public String name() default "";
/**
* 日期格式, 如: yyyy-MM-dd
*/
public String dateFormat() default "";
/**
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
*/
public String dictType() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
public String readConverterExp() default "";
/**
* 分隔符,读取字符串组内容
*/
public String separator() default ",";
/**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
*/
public int scale() default -1;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/**
* 导出时在excel中每个列的高度
*/
public double height() default 14;
/**
* 导出时在excel中每个列的宽度
*/
public double width() default 16;
/**
* 文字后缀,如% 90 变成90%
*/
public String suffix() default "";
/**
* 当值为空时,字段的默认值
*/
public String defaultValue() default "";
/**
* 提示信息
*/
public String prompt() default "";
/**
* 设置只能选择不能输入的列内容.
*/
public String[] combo() default {};
/**
* 是否需要纵向合并单元格,应对需求:含有list集合单元格)
*/
public boolean needMerge() default false;
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
public boolean isExport() default true;
/**
* 另一个类中的属性名称,支持多级获取,以小数点隔开
*/
public String targetAttr() default "";
/**
* 是否自动统计数据,在最后追加一行统计数据总和
*/
public boolean isStatistics() default false;
/**
* 导出类型(0数字 1字符串 2图片)
*/
public ColumnType cellType() default ColumnType.STRING;
/**
* 导出列头背景颜色
*/
public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
/**
* 导出列头字体颜色
*/
public IndexedColors headerColor() default IndexedColors.WHITE;
/**
* 导出单元格背景颜色
*/
public IndexedColors backgroundColor() default IndexedColors.WHITE;
/**
* 导出单元格字体颜色
*/
public IndexedColors color() default IndexedColors.BLACK;
/**
* 导出字段对齐方式
*/
public HorizontalAlignment align() default HorizontalAlignment.CENTER;
/**
* 自定义数据处理器
*/
public Class<?> handler() default ExcelHandlerAdapter.class;
/**
* 自定义数据处理器参数
*/
public String[] args() default {};
/**
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
*/
Type type() default Type.ALL;
public enum Type
{
ALL(0), EXPORT(1), IMPORT(2);
private final int value;
Type(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
public enum ColumnType
{
NUMERIC(0), STRING(1), IMAGE(2);
private final int value;
ColumnType(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
}
@@ -0,0 +1,18 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Excel注解集
*
* @author ruoyi
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Excels
{
public Excel[] value();
}
@@ -0,0 +1,51 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.OperatorType;
/**
* 自定义操作日志记录注解
*
* @author ruoyi
*
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log
{
/**
* 模块
*/
public String title() default "";
/**
* 功能
*/
public BusinessType businessType() default BusinessType.OTHER;
/**
* 操作人类别
*/
public OperatorType operatorType() default OperatorType.MANAGE;
/**
* 是否保存请求的参数
*/
public boolean isSaveRequestData() default true;
/**
* 是否保存响应的参数
*/
public boolean isSaveResponseData() default true;
/**
* 排除指定的请求参数
*/
public String[] excludeParamNames() default {};
}
@@ -0,0 +1,40 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.enums.LimitType;
/**
* 限流注解
*
* @author ruoyi
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter
{
/**
* 限流key
*/
public String key() default CacheConstants.RATE_LIMIT_KEY;
/**
* 限流时间,单位秒
*/
public int time() default 60;
/**
* 限流次数
*/
public int count() default 100;
/**
* 限流类型
*/
public LimitType limitType() default LimitType.DEFAULT;
}
@@ -0,0 +1,31 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解防止表单重复提交
*
* @author ruoyi
*
*/
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit
{
/**
* 间隔时间(ms),小于此时间视为重复提交
*/
public int interval() default 5000;
/**
* 提示消息
*/
public String message() default "不允许重复提交,请稍候再试";
}

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