Commit 927f71c7e25cb068495b78fba6039f47f973eb02

Authored by puhui999
2 parents e7d86436 fbb63ee2

Merge remote-tracking branch 'yudao/feature/mall_product' into feature/mall_product

Showing 86 changed files with 935 additions and 1130 deletions
sql/mysql/ruoyi-vue-pro.sql
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 Target Server Version : 80026 11 Target Server Version : 80026
12 File Encoding : 65001 12 File Encoding : 65001
13 13
14 - Date: 13/04/2023 23:37:01 14 + Date: 09/07/2023 20:25:37
15 */ 15 */
16 16
17 SET NAMES utf8mb4; 17 SET NAMES utf8mb4;
@@ -415,7 +415,7 @@ CREATE TABLE `bpm_task_assign_rule` ( @@ -415,7 +415,7 @@ CREATE TABLE `bpm_task_assign_rule` (
415 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 415 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
416 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 416 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
417 PRIMARY KEY (`id`) USING BTREE 417 PRIMARY KEY (`id`) USING BTREE
418 -) ENGINE = InnoDB AUTO_INCREMENT = 275 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Bpm 任务规则表'; 418 +) ENGINE = InnoDB AUTO_INCREMENT = 276 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Bpm 任务规则表';
419 419
420 -- ---------------------------- 420 -- ----------------------------
421 -- Records of bpm_task_assign_rule 421 -- Records of bpm_task_assign_rule
@@ -546,7 +546,7 @@ CREATE TABLE `infra_api_error_log` ( @@ -546,7 +546,7 @@ CREATE TABLE `infra_api_error_log` (
546 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 546 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
547 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 547 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
548 PRIMARY KEY (`id`) USING BTREE 548 PRIMARY KEY (`id`) USING BTREE
549 -) ENGINE = InnoDB AUTO_INCREMENT = 1110 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志'; 549 +) ENGINE = InnoDB AUTO_INCREMENT = 1291 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志';
550 550
551 -- ---------------------------- 551 -- ----------------------------
552 -- Records of infra_api_error_log 552 -- Records of infra_api_error_log
@@ -584,7 +584,7 @@ CREATE TABLE `infra_codegen_column` ( @@ -584,7 +584,7 @@ CREATE TABLE `infra_codegen_column` (
584 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 584 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
585 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 585 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
586 PRIMARY KEY (`id`) USING BTREE 586 PRIMARY KEY (`id`) USING BTREE
587 -) ENGINE = InnoDB AUTO_INCREMENT = 1688 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义'; 587 +) ENGINE = InnoDB AUTO_INCREMENT = 1698 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义';
588 588
589 -- ---------------------------- 589 -- ----------------------------
590 -- Records of infra_codegen_column 590 -- Records of infra_codegen_column
@@ -644,7 +644,7 @@ CREATE TABLE `infra_config` ( @@ -644,7 +644,7 @@ CREATE TABLE `infra_config` (
644 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 644 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
645 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 645 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
646 PRIMARY KEY (`id`) USING BTREE 646 PRIMARY KEY (`id`) USING BTREE
647 -) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '参数配置表'; 647 +) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '参数配置表';
648 648
649 -- ---------------------------- 649 -- ----------------------------
650 -- Records of infra_config 650 -- Records of infra_config
@@ -655,6 +655,7 @@ INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `val @@ -655,6 +655,7 @@ INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `val
655 INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', b'0'); 655 INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (8, 'url', 2, 'SkyWalking 监控的地址', 'url.skywalking', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:57:03', b'0');
656 INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', b'0'); 656 INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (9, 'url', 2, 'Spring Boot Admin 监控的地址', 'url.spring-boot-admin', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:52:07', b'0');
657 INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', b'0'); 657 INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (10, 'url', 2, 'Swagger 接口文档的地址', 'url.swagger', '', b'1', '', '1', '2023-04-07 13:41:16', '1', '2023-04-07 14:59:00', b'0');
  658 +INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `value`, `visible`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (11, 'ui', 2, '腾讯地图 key', 'tencent.lbs.key', 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E', b'1', '腾讯地图 key', '1', '2023-06-03 19:16:27', '1', '2023-06-03 19:16:27', b'0');
658 COMMIT; 659 COMMIT;
659 660
660 -- ---------------------------- 661 -- ----------------------------
@@ -699,7 +700,7 @@ CREATE TABLE `infra_file` ( @@ -699,7 +700,7 @@ CREATE TABLE `infra_file` (
699 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 700 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
700 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 701 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
701 PRIMARY KEY (`id`) USING BTREE 702 PRIMARY KEY (`id`) USING BTREE
702 -) ENGINE = InnoDB AUTO_INCREMENT = 912 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; 703 +) ENGINE = InnoDB AUTO_INCREMENT = 953 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
703 704
704 -- ---------------------------- 705 -- ----------------------------
705 -- Records of infra_file 706 -- Records of infra_file
@@ -753,7 +754,7 @@ CREATE TABLE `infra_file_content` ( @@ -753,7 +754,7 @@ CREATE TABLE `infra_file_content` (
753 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 754 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
754 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 755 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
755 PRIMARY KEY (`id`) USING BTREE 756 PRIMARY KEY (`id`) USING BTREE
756 -) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表'; 757 +) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
757 758
758 -- ---------------------------- 759 -- ----------------------------
759 -- Records of infra_file_content 760 -- Records of infra_file_content
@@ -812,7 +813,7 @@ CREATE TABLE `infra_job_log` ( @@ -812,7 +813,7 @@ CREATE TABLE `infra_job_log` (
812 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 813 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
813 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 814 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
814 PRIMARY KEY (`id`) USING BTREE 815 PRIMARY KEY (`id`) USING BTREE
815 -) ENGINE = InnoDB AUTO_INCREMENT = 168767 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务日志表'; 816 +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务日志表';
816 817
817 -- ---------------------------- 818 -- ----------------------------
818 -- Records of infra_job_log 819 -- Records of infra_job_log
@@ -867,7 +868,7 @@ CREATE TABLE `member_user` ( @@ -867,7 +868,7 @@ CREATE TABLE `member_user` (
867 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 868 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
868 PRIMARY KEY (`id`) USING BTREE, 869 PRIMARY KEY (`id`) USING BTREE,
869 UNIQUE INDEX `uk_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号' 870 UNIQUE INDEX `uk_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号'
870 -) ENGINE = InnoDB AUTO_INCREMENT = 247 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户'; 871 +) ENGINE = InnoDB AUTO_INCREMENT = 248 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户';
871 872
872 -- ---------------------------- 873 -- ----------------------------
873 -- Records of member_user 874 -- Records of member_user
@@ -935,7 +936,7 @@ CREATE TABLE `system_dict_data` ( @@ -935,7 +936,7 @@ CREATE TABLE `system_dict_data` (
935 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 936 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
936 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 937 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
937 PRIMARY KEY (`id`) USING BTREE 938 PRIMARY KEY (`id`) USING BTREE
938 -) ENGINE = InnoDB AUTO_INCREMENT = 1234 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表'; 939 +) ENGINE = InnoDB AUTO_INCREMENT = 1341 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表';
939 940
940 -- ---------------------------- 941 -- ----------------------------
941 -- Records of system_dict_data 942 -- Records of system_dict_data
@@ -1147,6 +1148,24 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st @@ -1147,6 +1148,24 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st
1147 INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', b'0'); 1148 INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1232, 20, 'Vue3 Element Plus 标准模版', '20', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:08', '1', '2023-04-13 00:04:08', b'0');
1148 INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', b'0'); 1149 INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1233, 21, 'Vue3 Element Plus Schema 模版', '21', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', b'0');
1149 INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', b'0'); 1150 INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1234, 30, 'Vue3 vben 模版', '30', 'infra_codegen_front_type', 0, '', '', '', '1', '2023-04-13 00:04:26', '1', '2023-04-13 00:04:26', b'0');
  1151 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1235, 1, '个', '1', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1152 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1236, 1, '件', '2', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1153 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1237, 1, '盒', '3', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1154 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1238, 1, '袋', '4', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1155 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1239, 1, '箱', '5', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1156 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1240, 1, '套', '6', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1157 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1241, 1, '包', '7', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1158 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1242, 1, '双', '8', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1159 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1243, 1, '卷', '9', 'product_unit', 0, '', '', '', '1', '2023-05-23 14:38:38', '1', '2023-05-23 14:38:38', b'0');
  1160 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1244, 0, '按件', '1', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:40', '1', '2023-05-21 22:46:40', b'0');
  1161 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1245, 1, '按重量', '2', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:46:58', '1', '2023-05-21 22:46:58', b'0');
  1162 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1246, 2, '按体积', '3', 'trade_delivery_express_charge_mode', 0, '', '', '', '1', '2023-05-21 22:47:18', '1', '2023-05-21 22:47:18', b'0');
  1163 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1335, 1, '购物', '1', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:27', '1', '2023-06-28 13:48:28', b'0');
  1164 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1336, 2, '签到', '2', 'member_point_biz_type', 0, '', '', '', '1', '2023-06-10 12:15:48', '1', '2023-06-28 13:48:31', b'0');
  1165 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1337, 1, '订单创建', '1', 'member_point_status', 0, '', '', '', '1', '2023-06-10 12:16:42', '1', '2023-06-28 13:48:34', b'0');
  1166 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1338, 2, '冻结期', '2', 'member_point_status', 0, '', '', '', '1', '2023-06-10 12:16:58', '1', '2023-06-28 13:48:36', b'0');
  1167 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1339, 3, '完成', '3', 'member_point_status', 0, '', '', '', '1', '2023-06-10 12:17:07', '1', '2023-06-28 13:48:38', b'0');
  1168 +INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1340, 4, '失效(订单退款)', '4', 'member_point_status', 0, '', '', '', '1', '2023-06-10 12:17:21', '1', '2023-06-28 13:48:42', b'0');
1150 COMMIT; 1169 COMMIT;
1151 1170
1152 -- ---------------------------- 1171 -- ----------------------------
@@ -1167,7 +1186,7 @@ CREATE TABLE `system_dict_type` ( @@ -1167,7 +1186,7 @@ CREATE TABLE `system_dict_type` (
1167 `deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间', 1186 `deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
1168 PRIMARY KEY (`id`) USING BTREE, 1187 PRIMARY KEY (`id`) USING BTREE,
1169 UNIQUE INDEX `dict_type`(`type` ASC) USING BTREE 1188 UNIQUE INDEX `dict_type`(`type` ASC) USING BTREE
1170 -) ENGINE = InnoDB AUTO_INCREMENT = 169 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表'; 1189 +) ENGINE = InnoDB AUTO_INCREMENT = 173 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表';
1171 1190
1172 -- ---------------------------- 1191 -- ----------------------------
1173 -- Records of system_dict_type 1192 -- Records of system_dict_type
@@ -1233,6 +1252,10 @@ INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creat @@ -1233,6 +1252,10 @@ INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creat
1233 INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', b'0', '1970-01-01 00:00:00'); 1252 INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (166, '邮件发送状态', 'system_mail_send_status', 0, '邮件发送状态', '1', '2023-01-26 09:53:13', '1', '2023-01-26 09:53:13', b'0', '1970-01-01 00:00:00');
1234 INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', b'0', '1970-01-01 00:00:00'); 1253 INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (167, '站内信模版的类型', 'system_notify_template_type', 0, '站内信模版的类型', '1', '2023-01-28 10:35:10', '1', '2023-01-28 10:35:10', b'0', '1970-01-01 00:00:00');
1235 INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', b'0', '1970-01-01 00:00:00'); 1254 INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (168, '代码生成的前端类型', 'infra_codegen_front_type', 0, '', '1', '2023-04-12 23:57:52', '1', '2023-04-12 23:57:52', b'0', '1970-01-01 00:00:00');
  1255 +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (169, '商品的单位', 'product_unit', 0, '商品的单位', '1', '2023-05-24 21:23:59', '1', '2023-05-24 21:23:59', b'0', '1970-01-01 00:00:00');
  1256 +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (170, '快递计费方式', 'trade_delivery_express_charge_mode', 0, '用于商城交易模块配送管理', '1', '2023-05-21 22:45:03', '1', '2023-05-21 22:45:03', b'0', '1970-01-01 00:00:00');
  1257 +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (171, '积分业务类型', 'member_point_biz_type', 0, '', '1', '2023-06-10 12:15:00', '1', '2023-06-28 13:48:20', b'0', '1970-01-01 00:00:00');
  1258 +INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (172, '积分订单状态', 'member_point_status', 0, '', '1', '2023-06-10 12:16:27', '1', '2023-06-28 13:48:17', b'0', '1970-01-01 00:00:00');
1236 COMMIT; 1259 COMMIT;
1237 1260
1238 -- ---------------------------- 1261 -- ----------------------------
@@ -1252,7 +1275,7 @@ CREATE TABLE `system_error_code` ( @@ -1252,7 +1275,7 @@ CREATE TABLE `system_error_code` (
1252 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 1275 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
1253 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 1276 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
1254 PRIMARY KEY (`id`) USING BTREE 1277 PRIMARY KEY (`id`) USING BTREE
1255 -) ENGINE = InnoDB AUTO_INCREMENT = 5832 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '错误码表'; 1278 +) ENGINE = InnoDB AUTO_INCREMENT = 5833 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '错误码表';
1256 1279
1257 -- ---------------------------- 1280 -- ----------------------------
1258 -- Records of system_error_code 1281 -- Records of system_error_code
@@ -1281,7 +1304,7 @@ CREATE TABLE `system_login_log` ( @@ -1281,7 +1304,7 @@ CREATE TABLE `system_login_log` (
1281 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 1304 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
1282 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 1305 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
1283 PRIMARY KEY (`id`) USING BTREE 1306 PRIMARY KEY (`id`) USING BTREE
1284 -) ENGINE = InnoDB AUTO_INCREMENT = 2163 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录'; 1307 +) ENGINE = InnoDB AUTO_INCREMENT = 2223 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录';
1285 1308
1286 -- ---------------------------- 1309 -- ----------------------------
1287 -- Records of system_login_log 1310 -- Records of system_login_log
@@ -1411,7 +1434,7 @@ CREATE TABLE `system_menu` ( @@ -1411,7 +1434,7 @@ CREATE TABLE `system_menu` (
1411 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 1434 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
1412 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 1435 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
1413 PRIMARY KEY (`id`) USING BTREE 1436 PRIMARY KEY (`id`) USING BTREE
1414 -) ENGINE = InnoDB AUTO_INCREMENT = 2162 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表'; 1437 +) ENGINE = InnoDB AUTO_INCREMENT = 2301 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表';
1415 1438
1416 -- ---------------------------- 1439 -- ----------------------------
1417 -- Records of system_menu 1440 -- Records of system_menu
@@ -1550,7 +1573,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i @@ -1550,7 +1573,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i
1550 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0'); 1573 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1128, '支付应用信息创建', 'pay:app:create', 3, 2, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
1551 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0'); 1574 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1129, '支付应用信息更新', 'pay:app:update', 3, 3, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
1552 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0'); 1575 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1130, '支付应用信息删除', 'pay:app:delete', 3, 4, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');
1553 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1131, '支付应用信息导出', 'pay:app:export', 3, 5, 1126, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:31', '', '2022-04-20 17:03:10', b'0');  
1554 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', b'0'); 1576 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1132, '秘钥解析', 'pay:channel:parsing', 3, 6, 1129, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2021-11-08 15:15:47', '1', '2022-04-20 17:03:10', b'0');
1555 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0'); 1577 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1133, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0');
1556 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0'); 1578 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1134, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1132, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-11-10 01:13:41', '', '2022-04-20 17:03:10', b'0');
@@ -1576,12 +1598,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i @@ -1576,12 +1598,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i
1576 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); 1598 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1176, '支付订单更新', 'pay:order:update', 3, 3, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
1577 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); 1599 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1177, '支付订单删除', 'pay:order:delete', 3, 4, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
1578 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0'); 1600 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1178, '支付订单导出', 'pay:order:export', 3, 5, 1173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 08:49:43', '', '2022-04-20 17:03:10', b'0');
1579 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1179, '商户信息', '', 2, 0, 1117, 'merchant', 'merchant', 'pay/merchant/index', 'PayApp', 0, b'1', b'1', b'1', '', '2021-12-25 09:01:44', '1', '2023-04-08 10:42:32', b'0');  
1580 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1180, '支付商户信息查询', 'pay:merchant:query', 3, 1, 1179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');  
1581 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1181, '支付商户信息创建', 'pay:merchant:create', 3, 2, 1179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');  
1582 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1182, '支付商户信息更新', 'pay:merchant:update', 3, 3, 1179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');  
1583 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1183, '支付商户信息删除', '', 3, 4, 1179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');  
1584 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1184, '支付商户信息导出', 'pay:merchant:export', 3, 5, 1179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2021-12-25 09:01:44', '', '2022-04-20 17:03:10', b'0');  
1585 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'tool', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:26:36', '103', '2022-04-20 17:03:10', b'0'); 1601 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1185, '工作流程', '', 1, 50, 0, '/bpm', 'tool', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:26:36', '103', '2022-04-20 17:03:10', b'0');
1586 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'nested', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:28:30', '1', '2022-04-20 17:03:10', b'0'); 1602 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1186, '流程管理', '', 1, 10, 1185, 'manager', 'nested', NULL, NULL, 0, b'1', b'1', b'1', '1', '2021-12-30 20:28:30', '1', '2022-04-20 17:03:10', b'0');
1587 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1187, '流程表单', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 'BpmForm', 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2023-04-08 10:50:37', b'0'); 1603 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1187, '流程表单', '', 2, 0, 1186, 'form', 'form', 'bpm/form/index', 'BpmForm', 0, b'1', b'1', b'1', '', '2021-12-30 12:38:22', '1', '2023-04-08 10:50:37', b'0');
@@ -1692,118 +1708,26 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i @@ -1692,118 +1708,26 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i
1692 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', b'0'); 1708 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', b'0');
1693 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2047, '限时折扣活动', '', 2, 7, 2030, 'discount-activity', 'time', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '1', '2023-04-08 11:45:44', b'0'); 1709 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2047, '限时折扣活动', '', 2, 7, 2030, 'discount-activity', 'time', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '1', '2023-04-08 11:45:44', b'0');
1694 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0'); 1710 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0');
1695 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1696 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1697 - `updater`, `update_time`, `deleted`)  
1698 -VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, b'1', b'1',  
1699 - b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0');  
1700 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1701 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1702 - `updater`, `update_time`, `deleted`)  
1703 -VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, b'1', b'1',  
1704 - b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');  
1705 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1706 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1707 - `updater`, `update_time`, `deleted`)  
1708 -VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, b'1', b'1',  
1709 - b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');  
1710 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1711 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1712 - `updater`, `update_time`, `deleted`)  
1713 -VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, b'1', b'1',  
1714 - b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');  
1715 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1716 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1717 - `updater`, `update_time`, `deleted`)  
1718 -VALUES (2059, '秒杀活动管理', '', 2, 0, 2030, 'seckill-activity', 'time-range',  
1719 - 'mall/promotion/seckill/seckillActivity/index', 'PromotionSeckillActivity', 0, b'1', b'1', b'1', '',  
1720 - '2022-11-06 22:24:49', '1', '2023-04-08 11:46:02', b'0');  
1721 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1722 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1723 - `updater`, `update_time`, `deleted`)  
1724 -VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '',  
1725 - '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1726 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1727 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1728 - `updater`, `update_time`, `deleted`)  
1729 -VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',  
1730 - '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1731 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1732 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1733 - `updater`, `update_time`, `deleted`)  
1734 -VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',  
1735 - '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1736 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1737 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1738 - `updater`, `update_time`, `deleted`)  
1739 -VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',  
1740 - '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1741 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1742 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1743 - `updater`, `update_time`, `deleted`)  
1744 -VALUES (2064, '秒杀活动导出', 'promotion:seckill-activity:export', 3, 5, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',  
1745 - '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1746 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1747 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1748 - `updater`, `update_time`, `deleted`)  
1749 -VALUES (2066, '秒杀时段管理', '', 2, 0, 2030, 'seckill-time', '', 'mall/promotion/seckill/SeckillConfig/index',  
1750 - 'PromotionSeckillConfig', 0, b'0', b'1', b'1', '', '2022-11-15 19:46:50', '1', '2023-04-08 11:46:17', b'0');  
1751 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1752 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1753 - `updater`, `update_time`, `deleted`)  
1754 -VALUES (2067, '秒杀时段查询', 'promotion:seckill-time:query', 3, 1, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',  
1755 - '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1756 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1757 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1758 - `updater`, `update_time`, `deleted`)  
1759 -VALUES (2068, '秒杀时段创建', 'promotion:seckill-time:create', 3, 2, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',  
1760 - '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1761 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1762 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1763 - `updater`, `update_time`, `deleted`)  
1764 -VALUES (2069, '秒杀时段更新', 'promotion:seckill-time:update', 3, 3, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',  
1765 - '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1766 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1767 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1768 - `updater`, `update_time`, `deleted`)  
1769 -VALUES (2070, '秒杀时段删除', 'promotion:seckill-time:delete', 3, 4, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',  
1770 - '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1771 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1772 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1773 - `updater`, `update_time`, `deleted`)  
1774 -VALUES (2071, '秒杀时段导出', 'promotion:seckill-time:export', 3, 5, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',  
1775 - '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1776 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1777 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1778 - `updater`, `update_time`, `deleted`)  
1779 -VALUES (2072, '订单中心', '', 1, 65, 0, '/trade', 'order', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-11-19 18:57:19',  
1780 - '1', '2022-12-10 16:32:57', b'0');  
1781 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1782 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1783 - `updater`, `update_time`, `deleted`)  
1784 -VALUES (2073, '售后退款', '', 2, 1, 2072, 'trade/after-sale', 'education', 'mall/trade/afterSale/index',  
1785 - 'TradeAfterSale', 0, b'1', b'1', b'1', '', '2022-11-19 20:15:32', '1', '2023-04-08 11:43:19', b'0');  
1786 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1787 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1788 - `updater`, `update_time`, `deleted`)  
1789 -VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, b'1', b'1', b'1', '',  
1790 - '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', b'0');  
1791 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1792 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1793 - `updater`, `update_time`, `deleted`)  
1794 -VALUES (2075, '秒杀活动关闭', 'promotion:sekill-activity:close', 3, 6, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '1',  
1795 - '2022-11-28 20:20:15', '1', '2022-11-28 20:20:15', b'0');  
1796 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,  
1797 - `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,  
1798 - `updater`, `update_time`, `deleted`)  
1799 -VALUES (2076, '订单列表', '', 2, 0, 2072, 'trade/order', 'list', 'mall/trade/order/index', 'TradeOrder', 0, b'1', b'1',  
1800 - b'1', '1', '2022-12-10 21:05:44', '1', '2023-04-08 11:42:23', b'0');  
1801 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2077, '物流公司管理管理', '', 2, 0, 2072, 'express-company', '', 'mall/trade/expressCompany/index', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '1', '2022-12-20 23:36:20', b'0');  
1802 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2078, '物流公司管理查询', 'trade:express-company:query', 3, 1, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0');  
1803 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2079, '物流公司管理创建', 'trade:express-company:create', 3, 2, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0');  
1804 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2080, '物流公司管理更新', 'trade:express-company:update', 3, 3, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0');  
1805 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2081, '物流公司管理删除', 'trade:express-company:delete', 3, 4, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0');  
1806 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2082, '物流公司管理导出', 'trade:express-company:export', 3, 5, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0'); 1711 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0');
  1712 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
  1713 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
  1714 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
  1715 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2059, '秒杀商品', '', 2, 2, 2209, 'activity', 'ep:basketball', 'mall/promotion/seckill/activity/index', 'PromotionSeckillActivity', 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '1', '2023-06-24 18:57:25', b'0');
  1716 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  1717 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  1718 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  1719 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  1720 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2064, '秒杀活动导出', 'promotion:seckill-activity:export', 3, 5, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  1721 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2066, '秒杀时段', '', 2, 1, 2209, 'config', 'ep:baseball', 'mall/promotion/seckill/config/index', 'PromotionSeckillConfig', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:50', '1', '2023-06-24 18:57:14', b'0');
  1722 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2067, '秒杀时段查询', 'promotion:seckill-config:query', 3, 1, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:25', b'0');
  1723 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2068, '秒杀时段创建', 'promotion:seckill-config:create', 3, 2, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:48:39', b'0');
  1724 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2069, '秒杀时段更新', 'promotion:seckill-config:update', 3, 3, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:29', b'0');
  1725 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2070, '秒杀时段删除', 'promotion:seckill-config:delete', 3, 4, 2066, '', '', '', '', 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '1', '2023-06-24 17:50:32', b'0');
  1726 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2072, '订单中心', '', 1, 65, 0, '/trade', 'order', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-11-19 18:57:19', '1', '2022-12-10 16:32:57', b'0');
  1727 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2073, '售后退款', '', 2, 1, 2072, 'trade/after-sale', 'education', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, b'1', b'1', b'1', '', '2022-11-19 20:15:32', '1', '2023-04-08 11:43:19', b'0');
  1728 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', b'0');
  1729 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2075, '秒杀活动关闭', 'promotion:sekill-activity:close', 3, 6, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-11-28 20:20:15', '1', '2022-11-28 20:20:15', b'0');
  1730 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2076, '订单列表', '', 2, 0, 2072, 'trade/order', 'list', 'mall/trade/order/index', 'TradeOrder', 0, b'1', b'1', b'1', '1', '2022-12-10 21:05:44', '1', '2023-04-08 11:42:23', b'0');
1807 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'row', 'system/area/index', 'SystemArea', 0, b'1', b'1', b'1', '1', '2022-12-23 17:35:05', '1', '2023-04-08 09:01:37', b'0'); 1731 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2083, '地区管理', '', 2, 14, 1, 'area', 'row', 'system/area/index', 'SystemArea', 0, b'1', b'1', b'1', '1', '2022-12-23 17:35:05', '1', '2023-04-08 09:01:37', b'0');
1808 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'wechat', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-01-01 20:11:04', '1', '2023-01-15 11:28:57', b'0'); 1732 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2084, '公众号管理', '', 1, 100, 0, '/mp', 'wechat', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-01-01 20:11:04', '1', '2023-01-15 11:28:57', b'0');
1809 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'phone', 'mp/account/index', 'MpAccount', 0, b'1', b'1', b'1', '1', '2023-01-01 20:13:31', '1', '2023-02-09 23:56:39', b'0'); 1733 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2085, '账号管理', '', 2, 1, 2084, 'account', 'phone', 'mp/account/index', 'MpAccount', 0, b'1', b'1', b'1', '1', '2023-01-01 20:13:31', '1', '2023-02-09 23:56:39', b'0');
@@ -1883,6 +1807,45 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i @@ -1883,6 +1807,45 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i
1883 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'education', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:46:28', '1', '2023-02-10 22:46:28', b'0'); 1807 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2159, 'Boot 开发文档', '', 1, 1, 0, 'https://doc.iocoder.cn/', 'education', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:46:28', '1', '2023-02-10 22:46:28', b'0');
1884 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'documentation', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:47:07', '1', '2023-02-10 22:47:07', b'0'); 1808 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2160, 'Cloud 开发文档', '', 1, 2, 0, 'https://cloud.iocoder.cn', 'documentation', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-02-10 22:47:07', '1', '2023-02-10 22:47:07', b'0');
1885 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2161, '接入示例', '', 2, 99, 1117, 'demo-order', 'drag', 'pay/demo/index', NULL, 0, b'1', b'1', b'1', '', '2023-02-11 14:21:42', '1', '2023-02-11 22:26:35', b'0'); 1809 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2161, '接入示例', '', 2, 99, 1117, 'demo-order', 'drag', 'pay/demo/index', NULL, 0, b'1', b'1', b'1', '', '2023-02-11 14:21:42', '1', '2023-02-11 22:26:35', b'0');
  1810 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2162, '商品导出', 'product:spu:export', 3, 5, 2014, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-07-30 14:22:58', '', '2022-07-30 14:22:58', b'0');
  1811 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2164, '配送管理', '', 1, 2, 2072, 'delivery', '', '', '', 0, b'1', b'1', b'1', '1', '2023-05-18 09:18:02', '1', '2023-05-24 23:24:13', b'0');
  1812 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2165, '快递发货', '', 1, 0, 2164, 'express', '', '', '', 0, b'1', b'1', b'1', '1', '2023-05-18 09:22:06', '1', '2023-05-18 09:22:06', b'0');
  1813 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2166, '门店自提', '', 1, 1, 2164, 'pick-up-store', '', '', '', 0, b'1', b'1', b'1', '1', '2023-05-18 09:23:14', '1', '2023-05-18 09:23:14', b'0');
  1814 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2167, '快递公司', '', 2, 0, 2165, 'express', '', 'mall/trade/delivery/express/index', 'Express', 0, b'1', b'1', b'1', '1', '2023-05-18 09:27:21', '1', '2023-05-18 22:11:14', b'0');
  1815 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2168, '快递公司查询', 'trade:delivery:express:query', 3, 1, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0');
  1816 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2169, '快递公司创建', 'trade:delivery:express:create', 3, 2, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0');
  1817 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2170, '快递公司更新', 'trade:delivery:express:update', 3, 3, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0');
  1818 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2171, '快递公司删除', 'trade:delivery:express:delete', 3, 4, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0');
  1819 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2172, '快递公司导出', 'trade:delivery:express:export', 3, 5, 2167, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-18 09:37:53', '', '2023-05-18 09:37:53', b'0');
  1820 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2173, '运费模版', 'trade:delivery:express-template:query', 2, 1, 2165, 'express-template', '', 'mall/trade/delivery/expressTemplate/index', 'ExpressTemplate', 0, b'1', b'1', b'1', '1', '2023-05-20 06:48:10', '1', '2023-05-20 06:48:29', b'0');
  1821 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2174, '快递运费模板查询', 'trade:delivery:express-template:query', 3, 1, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0');
  1822 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2175, '快递运费模板创建', 'trade:delivery:express-template:create', 3, 2, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0');
  1823 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2176, '快递运费模板更新', 'trade:delivery:express-template:update', 3, 3, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0');
  1824 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2177, '快递运费模板删除', 'trade:delivery:express-template:delete', 3, 4, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0');
  1825 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2178, '快递运费模板导出', 'trade:delivery:express-template:export', 3, 5, 2173, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-20 06:49:53', '', '2023-05-20 06:49:53', b'0');
  1826 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2179, '门店管理', '', 2, 1, 2166, 'pick-up-store', '', 'mall/trade/delivery/pickUpStore/index', 'PickUpStore', 0, b'1', b'1', b'1', '1', '2023-05-25 10:50:00', '1', '2023-05-25 10:50:00', b'0');
  1827 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2180, '自提门店查询', 'trade:delivery:pick-up-store:query', 3, 1, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0');
  1828 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2181, '自提门店创建', 'trade:delivery:pick-up-store:create', 3, 2, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0');
  1829 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2182, '自提门店更新', 'trade:delivery:pick-up-store:update', 3, 3, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0');
  1830 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2183, '自提门店删除', 'trade:delivery:pick-up-store:delete', 3, 4, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0');
  1831 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2184, '自提门店导出', 'trade:delivery:pick-up-store:export', 3, 5, 2179, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-05-25 10:53:29', '', '2023-05-25 10:53:29', b'0');
  1832 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2209, '秒杀活动', '', 2, 3, 2030, 'seckill', 'ep:place', '', '', 0, b'1', b'1', b'1', '1', '2023-06-24 17:39:13', '1', '2023-06-24 18:55:15', b'0');
  1833 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2262, '会员中心', '', 1, 55, 0, '/member', 'date-range', NULL, NULL, 0, b'1', b'1', b'1', '1', '2023-06-10 00:42:03', '1', '2023-06-28 22:52:34', b'0');
  1834 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2275, '积分配置', '', 2, 0, 2299, 'config', '', 'member/point/config/index', 'PointConfig', 0, b'1', b'1', b'1', '', '2023-06-10 02:07:44', '1', '2023-06-27 22:50:59', b'0');
  1835 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2276, '积分设置查询', 'point:config:query', 3, 1, 2275, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 02:07:44', '', '2023-06-10 02:07:44', b'0');
  1836 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2277, '积分设置创建', 'point:config:save', 3, 2, 2275, '', '', '', '', 0, b'1', b'1', b'1', '', '2023-06-10 02:07:44', '1', '2023-06-27 20:32:31', b'0');
  1837 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2281, '签到配置', '', 2, 2, 2300, 'sign-in-config', '', 'member/signin/config/index', 'SignInConfig', 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '1', '2023-07-02 15:04:15', b'0');
  1838 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2282, '积分签到规则查询', 'point:sign-in-config:query', 3, 1, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0');
  1839 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2283, '积分签到规则创建', 'point:sign-in-config:create', 3, 2, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0');
  1840 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2284, '积分签到规则更新', 'point:sign-in-config:update', 3, 3, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0');
  1841 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2285, '积分签到规则删除', 'point:sign-in-config:delete', 3, 4, 2281, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 03:26:12', '', '2023-06-10 03:26:12', b'0');
  1842 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2287, '积分记录', '', 2, 1, 2299, 'record', '', 'member/point/record/index', 'PointRecord', 0, b'1', b'1', b'1', '', '2023-06-10 04:18:50', '1', '2023-06-27 22:51:07', b'0');
  1843 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2288, '用户积分记录查询', 'point:record:query', 3, 1, 2287, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 04:18:50', '', '2023-06-10 04:18:50', b'0');
  1844 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2293, '签到记录', '', 2, 3, 2300, 'sign-in-record', '', 'member/signin/record/index', 'SignInRecord', 0, b'1', b'1', b'1', '', '2023-06-10 04:48:22', '1', '2023-07-02 15:04:10', b'0');
  1845 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2294, '用户签到积分查询', 'point:sign-in-record:query', 3, 1, 2293, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', b'0');
  1846 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2297, '用户签到积分删除', 'point:sign-in-record:delete', 3, 4, 2293, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2023-06-10 04:48:22', '', '2023-06-10 04:48:22', b'0');
  1847 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2299, '会员积分', '', 1, 1, 2262, 'point', '', '', '', 0, b'1', b'1', b'1', '1', '2023-06-27 22:48:51', '1', '2023-06-27 22:48:51', b'0');
  1848 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2300, '会员签到', '', 1, 2, 2262, 'signin', '', '', '', 0, b'1', b'1', b'1', '1', '2023-06-27 22:49:53', '1', '2023-06-27 22:49:53', b'0');
1886 COMMIT; 1849 COMMIT;
1887 1850
1888 -- ---------------------------- 1851 -- ----------------------------
@@ -1999,7 +1962,7 @@ CREATE TABLE `system_oauth2_access_token` ( @@ -1999,7 +1962,7 @@ CREATE TABLE `system_oauth2_access_token` (
1999 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 1962 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
2000 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 1963 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
2001 PRIMARY KEY (`id`) USING BTREE 1964 PRIMARY KEY (`id`) USING BTREE
2002 -) ENGINE = InnoDB AUTO_INCREMENT = 1785 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌'; 1965 +) ENGINE = InnoDB AUTO_INCREMENT = 2007 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌';
2003 1966
2004 -- ---------------------------- 1967 -- ----------------------------
2005 -- Records of system_oauth2_access_token 1968 -- Records of system_oauth2_access_token
@@ -2121,7 +2084,7 @@ CREATE TABLE `system_oauth2_refresh_token` ( @@ -2121,7 +2084,7 @@ CREATE TABLE `system_oauth2_refresh_token` (
2121 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 2084 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
2122 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 2085 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
2123 PRIMARY KEY (`id`) USING BTREE 2086 PRIMARY KEY (`id`) USING BTREE
2124 -) ENGINE = InnoDB AUTO_INCREMENT = 738 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌'; 2087 +) ENGINE = InnoDB AUTO_INCREMENT = 785 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌';
2125 2088
2126 -- ---------------------------- 2089 -- ----------------------------
2127 -- Records of system_oauth2_refresh_token 2090 -- Records of system_oauth2_refresh_token
@@ -2161,7 +2124,7 @@ CREATE TABLE `system_operate_log` ( @@ -2161,7 +2124,7 @@ CREATE TABLE `system_operate_log` (
2161 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 2124 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
2162 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', 2125 `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
2163 PRIMARY KEY (`id`) USING BTREE 2126 PRIMARY KEY (`id`) USING BTREE
2164 -) ENGINE = InnoDB AUTO_INCREMENT = 6440 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录'; 2127 +) ENGINE = InnoDB AUTO_INCREMENT = 6601 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录';
2165 2128
2166 -- ---------------------------- 2129 -- ----------------------------
2167 -- Records of system_operate_log 2130 -- Records of system_operate_log
@@ -2743,7 +2706,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t @@ -2743,7 +2706,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t
2743 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2706 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2062, 2, 1128, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2744 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2707 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2063, 2, 1129, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2745 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2708 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2064, 2, 1130, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2746 -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2065, 2, 1131, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);  
2747 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2709 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2066, 2, 1132, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2748 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2710 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2067, 2, 1133, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2749 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2711 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2068, 2, 1134, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
@@ -2771,12 +2733,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t @@ -2771,12 +2733,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t
2771 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2733 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2090, 2, 1176, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2772 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2734 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2091, 2, 1177, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2773 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2735 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2092, 2, 1178, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2774 -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2093, 2, 1179, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);  
2775 -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2094, 2, 1180, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);  
2776 -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2095, 2, 1181, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);  
2777 -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2096, 2, 1182, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);  
2778 -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2097, 2, 1183, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);  
2779 -INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2098, 2, 1184, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);  
2780 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2736 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2099, 2, 1226, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2781 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2737 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2100, 2, 1227, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
2782 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1); 2738 INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (2101, 2, 1228, '1', '2023-01-25 08:42:52', '1', '2023-01-25 08:42:52', b'0', 1);
@@ -3321,7 +3277,7 @@ CREATE TABLE `system_tenant` ( @@ -3321,7 +3277,7 @@ CREATE TABLE `system_tenant` (
3321 BEGIN; 3277 BEGIN;
3322 INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'https://www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2022-02-23 12:15:11', b'0'); 3278 INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, '芋道源码', NULL, '芋艿', '17321315478', 0, 'https://www.iocoder.cn', 0, '2099-02-19 17:14:16', 9999, '1', '2021-01-05 17:03:47', '1', '2022-02-23 12:15:11', b'0');
3323 INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'http://www.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2022-05-17 10:03:59', b'0'); 3279 INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (121, '小租户', 110, '小王2', '15601691300', 0, 'http://www.iocoder.cn', 111, '2024-03-11 00:00:00', 20, '1', '2022-02-22 00:56:14', '1', '2022-05-17 10:03:59', b'0');
3324 -INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'https://www.iocoder.cn', 111, '2022-04-30 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2022-03-07 21:37:58', b'0'); 3280 +INSERT INTO `system_tenant` (`id`, `name`, `contact_user_id`, `contact_name`, `contact_mobile`, `status`, `domain`, `package_id`, `expire_time`, `account_count`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (122, '测试租户', 113, '芋道', '15601691300', 0, 'https://www.iocoder.cn', 111, '2022-04-30 00:00:00', 50, '1', '2022-03-07 21:37:58', '1', '2023-04-15 09:17:54', b'0');
3325 COMMIT; 3281 COMMIT;
3326 3282
3327 -- ---------------------------- 3283 -- ----------------------------
@@ -3459,7 +3415,7 @@ CREATE TABLE `system_users` ( @@ -3459,7 +3415,7 @@ CREATE TABLE `system_users` (
3459 -- Records of system_users 3415 -- Records of system_users
3460 -- ---------------------------- 3416 -- ----------------------------
3461 BEGIN; 3417 BEGIN;
3462 -INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://test.yudao.iocoder.cn/e1fdd7271685ec143a0900681606406621717a666ad0b2798b096df41422b32f.png', 0, '0:0:0:0:0:0:0:1', '2023-04-13 23:09:16', 'admin', '2021-01-05 17:03:47', NULL, '2023-04-13 23:09:16', b'0', 1); 3418 +INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1, 'admin', '$2a$10$mRMIYLDtRHlf6.9ipiqH1.Z.bh/R9dO9d5iHiGYPigi6r5KOoR2Wm', '芋道源码', '管理员', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://test.yudao.iocoder.cn/e1fdd7271685ec143a0900681606406621717a666ad0b2798b096df41422b32f.png', 0, '127.0.0.1', '2023-07-09 12:19:37', 'admin', '2021-01-05 17:03:47', NULL, '2023-07-09 12:19:37', b'0', 1);
3463 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', b'0', 1); 3419 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 104, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '127.0.0.1', '2022-07-09 23:03:33', '', '2021-01-07 09:07:17', NULL, '2022-07-09 23:03:33', b'0', 1);
3464 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '127.0.0.1', '2022-07-08 01:26:27', '', '2021-01-13 23:50:35', NULL, '2022-07-08 01:26:27', b'0', 1); 3420 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (103, 'yuanma', '$2a$10$YMpimV4T6BtDhIaA8jSW.u8UTGBeGhc/qwXP4oxoMr4mOw9.qttt6', '源码', NULL, 106, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '127.0.0.1', '2022-07-08 01:26:27', '', '2021-01-13 23:50:35', NULL, '2022-07-08 01:26:27', b'0', 1);
3465 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, 'test', '$2a$10$GP8zvqHB//TekuzYZSBYAuBQJiNq1.fxQVDYJ.uBCOnWCtDVKE4H6', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '127.0.0.1', '2022-05-28 15:43:17', '', '2021-01-21 02:13:53', NULL, '2022-07-09 09:00:33', b'0', 1); 3421 INSERT INTO `system_users` (`id`, `username`, `password`, `nickname`, `remark`, `dept_id`, `post_ids`, `email`, `mobile`, `sex`, `avatar`, `status`, `login_ip`, `login_date`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (104, 'test', '$2a$10$GP8zvqHB//TekuzYZSBYAuBQJiNq1.fxQVDYJ.uBCOnWCtDVKE4H6', '测试号', NULL, 107, '[1,2]', '111@qq.com', '15601691200', 1, '', 0, '127.0.0.1', '2022-05-28 15:43:17', '', '2021-01-21 02:13:53', NULL, '2022-07-09 09:00:33', b'0', 1);
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClientConfig.java
1 package cn.iocoder.yudao.framework.pay.core.client; 1 package cn.iocoder.yudao.framework.pay.core.client;
2 2
  3 +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
3 import com.fasterxml.jackson.annotation.JsonTypeInfo; 4 import com.fasterxml.jackson.annotation.JsonTypeInfo;
4 5
5 import javax.validation.ConstraintViolation; 6 import javax.validation.ConstraintViolation;
@@ -20,23 +21,10 @@ import java.util.Set; @@ -20,23 +21,10 @@ import java.util.Set;
20 public interface PayClientConfig { 21 public interface PayClientConfig {
21 22
22 /** 23 /**
23 - * 配置验证参数是  
24 - *  
25 - * @param validator 校验对象  
26 - * @return 配置好的验证参数  
27 - */  
28 - Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator);  
29 -  
30 - // TODO @aquan:貌似抽象一个 validation group 就好了!  
31 - /**  
32 * 参数校验 24 * 参数校验
33 * 25 *
34 * @param validator 校验对象 26 * @param validator 校验对象
35 */ 27 */
36 - default void validate(Validator validator) {  
37 - Set<ConstraintViolation<PayClientConfig>> violations = verifyParam(validator);  
38 - if (!violations.isEmpty()) {  
39 - throw new ConstraintViolationException(violations);  
40 - }  
41 - } 28 + void validate(Validator validator);
  29 +
42 } 30 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/order/PayOrderUnifiedRespDTO.java
1 package cn.iocoder.yudao.framework.pay.core.client.dto.order; 1 package cn.iocoder.yudao.framework.pay.core.client.dto.order;
2 2
  3 +import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
3 import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum; 4 import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
4 -import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum;  
5 import lombok.Data; 5 import lombok.Data;
6 6
7 /** 7 /**
@@ -24,19 +24,15 @@ public class PayOrderUnifiedRespDTO { @@ -24,19 +24,15 @@ public class PayOrderUnifiedRespDTO {
24 private String displayContent; 24 private String displayContent;
25 25
26 /** 26 /**
27 - * 支付状态 27 + * 同步的通知信息
28 * 28 *
29 - * 枚举 {@link PayOrderStatusRespEnum} 类 29 + * 目前只有 bar 条码支付才会出现,它是支付发起时,直接返回是否支付成功的,而其它支付还是异步通知
30 */ 30 */
31 - private Integer status; 31 + private PayOrderNotifyRespDTO notify;
32 32
33 public PayOrderUnifiedRespDTO(String displayMode, String displayContent) { 33 public PayOrderUnifiedRespDTO(String displayMode, String displayContent) {
34 - this(displayMode, displayContent, PayOrderStatusRespEnum.WAITING.getStatus());  
35 - }  
36 -  
37 - public PayOrderUnifiedRespDTO(String displayMode, String displayContent, Integer status) {  
38 this.displayMode = displayMode; 34 this.displayMode = displayMode;
39 this.displayContent = displayContent; 35 this.displayContent = displayContent;
40 - this.status = status;  
41 } 36 }
  37 +
42 } 38 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java
1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; 1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
2 2
  3 +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
3 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig; 4 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
4 import lombok.Data; 5 import lombok.Data;
5 6
@@ -19,15 +20,6 @@ import java.util.Set; @@ -19,15 +20,6 @@ import java.util.Set;
19 public class AlipayPayClientConfig implements PayClientConfig { 20 public class AlipayPayClientConfig implements PayClientConfig {
20 21
21 /** 22 /**
22 - * 网关地址 - 线上  
23 - */  
24 - public static final String SERVER_URL_PROD = "https://openapi.alipay.com/gateway.do";  
25 - /**  
26 - * 网关地址 - 沙箱  
27 - */  
28 - public static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do";  
29 -  
30 - /**  
31 * 公钥类型 - 公钥模式 23 * 公钥类型 - 公钥模式
32 */ 24 */
33 public static final Integer MODE_PUBLIC_KEY = 1; 25 public static final Integer MODE_PUBLIC_KEY = 1;
@@ -43,8 +35,9 @@ public class AlipayPayClientConfig implements PayClientConfig { @@ -43,8 +35,9 @@ public class AlipayPayClientConfig implements PayClientConfig {
43 35
44 /** 36 /**
45 * 网关地址 37 * 网关地址
46 - * 1. {@link #SERVER_URL_PROD}  
47 - * 2. {@link #SERVER_URL_SANDBOX} 38 + *
  39 + * 1. <a href="https://openapi.alipay.com/gateway.do">生产环境</a>
  40 + * 2. <a href="https://openapi-sandbox.dl.alipaydev.com/gateway.do">沙箱环境</a>
48 */ 41 */
49 @NotBlank(message = "网关地址不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) 42 @NotBlank(message = "网关地址不能为空", groups = {ModePublicKey.class, ModeCertificate.class})
50 private String serverUrl; 43 private String serverUrl;
@@ -108,9 +101,8 @@ public class AlipayPayClientConfig implements PayClientConfig { @@ -108,9 +101,8 @@ public class AlipayPayClientConfig implements PayClientConfig {
108 } 101 }
109 102
110 @Override 103 @Override
111 - public Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator) {  
112 - // TODO 芋艿:参数校验  
113 - return validator.validate(this, 104 + public void validate(Validator validator) {
  105 + ValidationUtils.validate(validator, this,
114 MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class); 106 MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class);
115 } 107 }
116 108
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/WxBarPayClient.java
@@ -5,13 +5,13 @@ import cn.hutool.core.thread.ThreadUtil; @@ -5,13 +5,13 @@ import cn.hutool.core.thread.ThreadUtil;
5 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
6 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; 6 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
  8 +import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
8 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; 9 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
9 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO; 10 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
10 import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; 11 import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
11 import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedRespDTO; 12 import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedRespDTO;
12 import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum; 13 import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
13 import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum; 14 import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
14 -import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum;  
15 import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest; 15 import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
16 import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult; 16 import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
17 import com.github.binarywang.wxpay.constant.WxPayConstants; 17 import com.github.binarywang.wxpay.constant.WxPayConstants;
@@ -70,9 +70,15 @@ public class WxBarPayClient extends AbstractWxPayClient { @@ -70,9 +70,15 @@ public class WxBarPayClient extends AbstractWxPayClient {
70 try { 70 try {
71 WxPayMicropayResult response = client.micropay(request); 71 WxPayMicropayResult response = client.micropay(request);
72 // 支付成功(例如说,用户输入了密码) 72 // 支付成功(例如说,用户输入了密码)
  73 + PayOrderNotifyRespDTO notify = PayOrderNotifyRespDTO.builder()
  74 + .orderExtensionNo(response.getOutTradeNo())
  75 + .channelOrderNo(response.getTransactionId())
  76 + .channelUserId(response.getOpenid())
  77 + .successTime(parseDateV2(response.getTimeEnd()))
  78 + .build();
73 return new PayOrderUnifiedRespDTO(PayOrderDisplayModeEnum.BAR_CODE.getMode(), 79 return new PayOrderUnifiedRespDTO(PayOrderDisplayModeEnum.BAR_CODE.getMode(),
74 - JsonUtils.toJsonString(response),  
75 - PayOrderStatusRespEnum.SUCCESS.getStatus()); 80 + JsonUtils.toJsonString(response))
  81 + .setNotify(notify);
76 } catch (WxPayException ex) { 82 } catch (WxPayException ex) {
77 // 如果不满足这 3 种任一的,则直接抛出 WxPayException 异常,不仅需处理 83 // 如果不满足这 3 种任一的,则直接抛出 WxPayException 异常,不仅需处理
78 // 1. SYSTEMERROR:接口返回错误:请立即调用被扫订单结果查询API,查询当前订单状态,并根据订单的状态决定下一步的操作。 84 // 1. SYSTEMERROR:接口返回错误:请立即调用被扫订单结果查询API,查询当前订单状态,并根据订单的状态决定下一步的操作。
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/WxPayClientConfig.java
1 package cn.iocoder.yudao.framework.pay.core.client.impl.weixin; 1 package cn.iocoder.yudao.framework.pay.core.client.impl.weixin;
2 2
3 import cn.hutool.core.io.IoUtil; 3 import cn.hutool.core.io.IoUtil;
  4 +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
4 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig; 5 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
5 import lombok.Data; 6 import lombok.Data;
6 7
7 -import javax.validation.ConstraintViolation;  
8 import javax.validation.Validator; 8 import javax.validation.Validator;
9 import javax.validation.constraints.NotBlank; 9 import javax.validation.constraints.NotBlank;
10 import java.io.FileInputStream; 10 import java.io.FileInputStream;
11 import java.io.FileNotFoundException; 11 import java.io.FileNotFoundException;
12 -import java.util.Set;  
13 12
14 /** 13 /**
15 * 微信支付的 PayClientConfig 实现类 14 * 微信支付的 PayClientConfig 实现类
@@ -100,8 +99,9 @@ public class WxPayClientConfig implements PayClientConfig { @@ -100,8 +99,9 @@ public class WxPayClientConfig implements PayClientConfig {
100 } 99 }
101 100
102 @Override 101 @Override
103 - public Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator) {  
104 - return validator.validate(this, this.getApiVersion().equals(API_VERSION_V2) ? V2.class : V3.class); 102 + public void validate(Validator validator) {
  103 + ValidationUtils.validate(validator, this,
  104 + API_VERSION_V2.equals(this.getApiVersion()) ? V2.class : V3.class);
105 } 105 }
106 106
107 public static void main(String[] args) throws FileNotFoundException { 107 public static void main(String[] args) throws FileNotFoundException {
yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn/iocoder/yudao/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java
@@ -24,6 +24,8 @@ import java.io.FileNotFoundException; @@ -24,6 +24,8 @@ import java.io.FileNotFoundException;
24 @Disabled 24 @Disabled
25 public class PayClientFactoryImplIntegrationTest { 25 public class PayClientFactoryImplIntegrationTest {
26 26
  27 + private static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do";
  28 +
27 private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl(); 29 private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl();
28 30
29 /** 31 /**
@@ -79,7 +81,7 @@ public class PayClientFactoryImplIntegrationTest { @@ -79,7 +81,7 @@ public class PayClientFactoryImplIntegrationTest {
79 // 创建配置 81 // 创建配置
80 AlipayPayClientConfig config = new AlipayPayClientConfig(); 82 AlipayPayClientConfig config = new AlipayPayClientConfig();
81 config.setAppId("2021000118634035"); 83 config.setAppId("2021000118634035");
82 - config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX); 84 + config.setServerUrl(SERVER_URL_SANDBOX);
83 config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); 85 config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
84 config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); 86 config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");
85 config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); 87 config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
@@ -103,7 +105,7 @@ public class PayClientFactoryImplIntegrationTest { @@ -103,7 +105,7 @@ public class PayClientFactoryImplIntegrationTest {
103 // 创建配置 105 // 创建配置
104 AlipayPayClientConfig config = new AlipayPayClientConfig(); 106 AlipayPayClientConfig config = new AlipayPayClientConfig();
105 config.setAppId("2021000118634035"); 107 config.setAppId("2021000118634035");
106 - config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX); 108 + config.setServerUrl(SERVER_URL_SANDBOX);
107 config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); 109 config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
108 config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); 110 config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");
109 config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); 111 config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
yudao-framework/yudao-spring-boot-starter-biz-pay/src/test/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java
@@ -22,9 +22,11 @@ import static org.mockito.Mockito.when; @@ -22,9 +22,11 @@ import static org.mockito.Mockito.when;
22 22
23 public class AlipayQrPayClientTest extends BaseMockitoUnitTest { 23 public class AlipayQrPayClientTest extends BaseMockitoUnitTest {
24 24
  25 + private static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do";
  26 +
25 private final AlipayPayClientConfig config = new AlipayPayClientConfig() 27 private final AlipayPayClientConfig config = new AlipayPayClientConfig()
26 .setAppId("2021000118634035") 28 .setAppId("2021000118634035")
27 - .setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX) 29 + .setServerUrl(SERVER_URL_SANDBOX)
28 .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT) 30 .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)
29 // TODO @tina:key 可以随机就好,简洁一点哈。 31 // TODO @tina:key 可以随机就好,简洁一点哈。
30 .setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJ" + 32 .setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJ" +
yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/util/TenantUtils.java
@@ -82,9 +82,9 @@ public class TenantUtils { @@ -82,9 +82,9 @@ public class TenantUtils {
82 * 将多租户编号,添加到 header 中 82 * 将多租户编号,添加到 header 中
83 * 83 *
84 * @param headers HTTP 请求 headers 84 * @param headers HTTP 请求 headers
  85 + * @param tenantId 租户编号
85 */ 86 */
86 - public static void addTenantHeader(Map<String, String> headers) {  
87 - Long tenantId = TenantContextHolder.getTenantId(); 87 + public static void addTenantHeader(Map<String, String> headers, Long tenantId) {
88 if (tenantId != null) { 88 if (tenantId != null) {
89 headers.put(HEADER_TENANT_ID, tenantId.toString()); 89 headers.put(HEADER_TENANT_ID, tenantId.toString());
90 } 90 }
yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java
@@ -102,6 +102,10 @@ public class RandomUtils { @@ -102,6 +102,10 @@ public class RandomUtils {
102 return randomString() + "@qq.com"; 102 return randomString() + "@qq.com";
103 } 103 }
104 104
  105 + public static String randomURL() {
  106 + return "https://www.iocoder.cn/" + randomString();
  107 + }
  108 +
105 @SafeVarargs 109 @SafeVarargs
106 public static <T> T randomPojo(Class<T> clazz, Consumer<T>... consumers) { 110 public static <T> T randomPojo(Class<T> clazz, Consumer<T>... consumers) {
107 T pojo = PODAM_FACTORY.manufacturePojo(clazz); 111 T pojo = PODAM_FACTORY.manufacturePojo(clazz);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/TradeAfterSaleConvert.java
@@ -38,7 +38,7 @@ public interface TradeAfterSaleConvert { @@ -38,7 +38,7 @@ public interface TradeAfterSaleConvert {
38 38
39 @Mappings({ 39 @Mappings({
40 @Mapping(source = "afterSale.applyReason", target = "reason"), 40 @Mapping(source = "afterSale.applyReason", target = "reason"),
41 - @Mapping(source = "afterSale.refundPrice", target = "amount") 41 + @Mapping(source = "afterSale.refundPrice", target = "price")
42 }) 42 })
43 PayRefundCreateReqDTO convert(String userIp, TradeAfterSaleDO afterSale, 43 PayRefundCreateReqDTO convert(String userIp, TradeAfterSaleDO afterSale,
44 TradeOrderProperties orderProperties); 44 TradeOrderProperties orderProperties);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -106,7 +106,7 @@ public interface TradeOrderConvert { @@ -106,7 +106,7 @@ public interface TradeOrderConvert {
106 createReqDTO.setSubject(subject); 106 createReqDTO.setSubject(subject);
107 createReqDTO.setBody(subject); // TODO 芋艿:临时写死 107 createReqDTO.setBody(subject); // TODO 芋艿:临时写死
108 // 订单相关字段 108 // 订单相关字段
109 - createReqDTO.setAmount(order.getPayPrice()).setExpireTime(addTime(orderProperties.getExpireTime())); 109 + createReqDTO.setPrice(order.getPayPrice()).setExpireTime(addTime(orderProperties.getExpireTime()));
110 return createReqDTO; 110 return createReqDTO;
111 } 111 }
112 112
@@ -238,7 +238,7 @@ public interface TradeOrderConvert { @@ -238,7 +238,7 @@ public interface TradeOrderConvert {
238 AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems); 238 AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems);
239 orderVO.setPayExpireTime(addTime(tradeOrderProperties.getExpireTime())); 239 orderVO.setPayExpireTime(addTime(tradeOrderProperties.getExpireTime()));
240 if (StrUtil.isNotEmpty(order.getPayChannelCode())) { 240 if (StrUtil.isNotEmpty(order.getPayChannelCode())) {
241 - orderVO.setPayChannelName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.CHANNEL_CODE_TYPE, order.getPayChannelCode())); 241 + orderVO.setPayChannelName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.CHANNEL_CODE, order.getPayChannelCode()));
242 } 242 }
243 // 处理商品属性 243 // 处理商品属性
244 Map<Long, ProductPropertyValueDetailRespDTO> propertyValueDetailMap = convertMap(propertyValueDetails, ProductPropertyValueDetailRespDTO::getValueId); 244 Map<Long, ProductPropertyValueDetailRespDTO> propertyValueDetailMap = convertMap(propertyValueDetails, ProductPropertyValueDetailRespDTO::getValueId);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
@@ -320,7 +320,7 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -320,7 +320,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
320 throw exception(ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS); 320 throw exception(ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS);
321 } 321 }
322 // 校验支付金额一致 322 // 校验支付金额一致
323 - if (ObjectUtil.notEqual(payOrder.getAmount(), order.getPayPrice())) { 323 + if (ObjectUtil.notEqual(payOrder.getPrice(), order.getPayPrice())) {
324 log.error("[validateOrderPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]", 324 log.error("[validateOrderPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]",
325 id, payOrderId, JsonUtils.toJsonString(order), JsonUtils.toJsonString(payOrder)); 325 id, payOrderId, JsonUtils.toJsonString(order), JsonUtils.toJsonString(payOrder));
326 throw exception(ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH); 326 throw exception(ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH);
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceTest.java
@@ -144,7 +144,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { @@ -144,7 +144,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
144 assertNotNull(createReqDTO.getMerchantOrderId()); // 由于 tradeOrderId 后生成,只能校验非空 144 assertNotNull(createReqDTO.getMerchantOrderId()); // 由于 tradeOrderId 后生成,只能校验非空
145 assertEquals(createReqDTO.getSubject(), "商品 1 等多件"); 145 assertEquals(createReqDTO.getSubject(), "商品 1 等多件");
146 assertNull(createReqDTO.getBody()); 146 assertNull(createReqDTO.getBody());
147 - assertEquals(createReqDTO.getAmount(), 80); 147 + assertEquals(createReqDTO.getPrice(), 80);
148 assertNotNull(createReqDTO.getExpireTime()); 148 assertNotNull(createReqDTO.getExpireTime());
149 return true; 149 return true;
150 }))).thenReturn(1000L); 150 }))).thenReturn(1000L);
@@ -257,7 +257,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest { @@ -257,7 +257,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
257 // mock 方法(支付单) 257 // mock 方法(支付单)
258 when(payOrderApi.getOrder(eq(10L))).thenReturn(randomPojo(PayOrderRespDTO.class, 258 when(payOrderApi.getOrder(eq(10L))).thenReturn(randomPojo(PayOrderRespDTO.class,
259 o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()).setChannelCode("wx_pub") 259 o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()).setChannelCode("wx_pub")
260 - .setMerchantOrderId("1")).setAmount(100)); 260 + .setMerchantOrderId("1")).setPrice(100));
261 261
262 // 调用 262 // 调用
263 tradeOrderService.updateOrderPaid(id, payOrderId); 263 tradeOrderService.updateOrderPaid(id, payOrderId);
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/api/order/dto/PayOrderCreateReqDTO.java
@@ -42,7 +42,6 @@ public class PayOrderCreateReqDTO implements Serializable { @@ -42,7 +42,6 @@ public class PayOrderCreateReqDTO implements Serializable {
42 /** 42 /**
43 * 商品描述 43 * 商品描述
44 */ 44 */
45 -// @NotEmpty(message = "商品描述信息不能为空")  
46 @Length(max = 128, message = "商品描述信息长度不能超过128") 45 @Length(max = 128, message = "商品描述信息长度不能超过128")
47 private String body; 46 private String body;
48 47
@@ -53,7 +52,7 @@ public class PayOrderCreateReqDTO implements Serializable { @@ -53,7 +52,7 @@ public class PayOrderCreateReqDTO implements Serializable {
53 */ 52 */
54 @NotNull(message = "支付金额不能为空") 53 @NotNull(message = "支付金额不能为空")
55 @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") 54 @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
56 - private Integer amount; 55 + private Integer price;
57 56
58 /** 57 /**
59 * 支付过期时间 58 * 支付过期时间
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/api/order/dto/PayOrderRespDTO.java
@@ -35,7 +35,7 @@ public class PayOrderRespDTO { @@ -35,7 +35,7 @@ public class PayOrderRespDTO {
35 /** 35 /**
36 * 支付金额,单位:分 36 * 支付金额,单位:分
37 */ 37 */
38 - private Integer amount; 38 + private Integer price;
39 /** 39 /**
40 * 支付状态 40 * 支付状态
41 * 41 *
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/api/refund/dto/PayRefundCreateReqDTO.java
@@ -48,5 +48,5 @@ public class PayRefundCreateReqDTO { @@ -48,5 +48,5 @@ public class PayRefundCreateReqDTO {
48 */ 48 */
49 @NotNull(message = "退款金额不能为空") 49 @NotNull(message = "退款金额不能为空")
50 @Min(value = 1, message = "退款金额必须大于零") 50 @Min(value = 1, message = "退款金额必须大于零")
51 - private Integer amount; 51 + private Integer price;
52 } 52 }
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/api/refund/dto/PayRefundRespDTO.java
@@ -30,7 +30,7 @@ public class PayRefundRespDTO { @@ -30,7 +30,7 @@ public class PayRefundRespDTO {
30 /** 30 /**
31 * 退款金额,单位:分 31 * 退款金额,单位:分
32 */ 32 */
33 - private Integer refundAmount; 33 + private Integer refundPrice;
34 34
35 // ========== 商户相关字段 ========== 35 // ========== 商户相关字段 ==========
36 /** 36 /**
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/DictTypeConstants.java
@@ -7,7 +7,7 @@ package cn.iocoder.yudao.module.pay.enums; @@ -7,7 +7,7 @@ package cn.iocoder.yudao.module.pay.enums;
7 */ 7 */
8 public interface DictTypeConstants { 8 public interface DictTypeConstants {
9 9
10 - String CHANNEL_CODE_TYPE = "pay_channel_code_type"; // 支付-渠道名 10 + String CHANNEL_CODE = "pay_channel_code"; // 支付-渠道名
11 11
12 String ORDER_STATUS = "pay_order_status"; // 支付-订单-订单状态 12 String ORDER_STATUS = "pay_order_status"; // 支付-订单-订单状态
13 String ORDER_NOTIFY_STATUS = "pay_order_notify_status"; // 支付-订单-订单回调商户状态 13 String ORDER_NOTIFY_STATUS = "pay_order_notify_status"; // 支付-订单-订单回调商户状态
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java
@@ -12,7 +12,8 @@ public interface ErrorCodeConstants { @@ -12,7 +12,8 @@ public interface ErrorCodeConstants {
12 // ========== APP 模块 1007000000 ========== 12 // ========== APP 模块 1007000000 ==========
13 ErrorCode PAY_APP_NOT_FOUND = new ErrorCode(1007000000, "App 不存在"); 13 ErrorCode PAY_APP_NOT_FOUND = new ErrorCode(1007000000, "App 不存在");
14 ErrorCode PAY_APP_IS_DISABLE = new ErrorCode(1007000002, "App 已经被禁用"); 14 ErrorCode PAY_APP_IS_DISABLE = new ErrorCode(1007000002, "App 已经被禁用");
15 - ErrorCode PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE = new ErrorCode(1007000003, "支付应用存在交易中的订单,无法删除"); 15 + ErrorCode PAY_APP_EXIST_ORDER_CANT_DELETE = new ErrorCode(1007000003, "支付应用存在支付订单,无法删除");
  16 + ErrorCode PAY_APP_EXIST_REFUND_CANT_DELETE = new ErrorCode(1007000004, "支付应用存在退款订单,无法删除");
16 17
17 // ========== CHANNEL 模块 1007001000 ========== 18 // ========== CHANNEL 模块 1007001000 ==========
18 ErrorCode PAY_CHANNEL_NOT_FOUND = new ErrorCode(1007001000, "支付渠道的配置不存在"); 19 ErrorCode PAY_CHANNEL_NOT_FOUND = new ErrorCode(1007001000, "支付渠道的配置不存在");
@@ -25,22 +26,19 @@ public interface ErrorCodeConstants { @@ -25,22 +26,19 @@ public interface ErrorCodeConstants {
25 ErrorCode PAY_ORDER_NOT_FOUND = new ErrorCode(1007002000, "支付订单不存在"); 26 ErrorCode PAY_ORDER_NOT_FOUND = new ErrorCode(1007002000, "支付订单不存在");
26 ErrorCode PAY_ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(1007002001, "支付订单不处于待支付"); 27 ErrorCode PAY_ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(1007002001, "支付订单不处于待支付");
27 ErrorCode PAY_ORDER_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007002002, "支付订单不处于已支付"); 28 ErrorCode PAY_ORDER_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007002002, "支付订单不处于已支付");
  29 + ErrorCode PAY_ORDER_IS_EXPIRED = new ErrorCode(1007002003, "支付订单已经过期");
28 30
29 // ========== ORDER 模块(拓展单) 1007003000 ========== 31 // ========== ORDER 模块(拓展单) 1007003000 ==========
30 ErrorCode PAY_ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1007003000, "支付交易拓展单不存在"); 32 ErrorCode PAY_ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1007003000, "支付交易拓展单不存在");
31 ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1007003001, "支付交易拓展单不处于待支付"); 33 ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1007003001, "支付交易拓展单不处于待支付");
32 34
33 // ========== 支付模块(退款) 1007006000 ========== 35 // ========== 支付模块(退款) 1007006000 ==========
34 - ErrorCode PAY_REFUND_AMOUNT_EXCEED = new ErrorCode(1007006000, "退款金额超过订单可退款金额"); 36 + ErrorCode PAY_PRICE_PRICE_EXCEED = new ErrorCode(1007006000, "退款金额超过订单可退款金额");
35 ErrorCode PAY_REFUND_ALL_REFUNDED = new ErrorCode(1007006001, "订单已经全额退款"); 37 ErrorCode PAY_REFUND_ALL_REFUNDED = new ErrorCode(1007006001, "订单已经全额退款");
36 ErrorCode PAY_REFUND_CHN_ORDER_NO_IS_NULL = new ErrorCode(1007006002, "该订单的渠道订单为空"); 38 ErrorCode PAY_REFUND_CHN_ORDER_NO_IS_NULL = new ErrorCode(1007006002, "该订单的渠道订单为空");
37 ErrorCode PAY_REFUND_SUCCEED = new ErrorCode(1007006003, "已经退款成功"); 39 ErrorCode PAY_REFUND_SUCCEED = new ErrorCode(1007006003, "已经退款成功");
38 ErrorCode PAY_REFUND_NOT_FOUND = new ErrorCode(1007006004, "支付退款单不存在"); 40 ErrorCode PAY_REFUND_NOT_FOUND = new ErrorCode(1007006004, "支付退款单不存在");
39 41
40 - // ========== 支付商户信息 1007004000 ==========  
41 - ErrorCode PAY_MERCHANT_NOT_EXISTS = new ErrorCode(1007004000, "支付商户信息不存在");  
42 - ErrorCode PAY_MERCHANT_EXIST_APP_CANT_DELETE = new ErrorCode(1007004001, "支付商户存在支付应用,无法删除");  
43 -  
44 // ========== 示例订单 1007900000 ========== 42 // ========== 示例订单 1007900000 ==========
45 ErrorCode PAY_DEMO_ORDER_NOT_FOUND = new ErrorCode(1007900000, "示例订单不存在"); 43 ErrorCode PAY_DEMO_ORDER_NOT_FOUND = new ErrorCode(1007900000, "示例订单不存在");
46 ErrorCode PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID = new ErrorCode(1007900001, "示例订单更新支付状态失败,订单不是【未支付】状态"); 44 ErrorCode PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID = new ErrorCode(1007900001, "示例订单更新支付状态失败,订单不是【未支付】状态");
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/app/PayAppController.java
@@ -24,6 +24,7 @@ import javax.validation.Valid; @@ -24,6 +24,7 @@ import javax.validation.Valid;
24 import java.util.*; 24 import java.util.*;
25 25
26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
27 28
28 @Slf4j 29 @Slf4j
29 @Tag(name = "管理后台 - 支付应用信息") 30 @Tag(name = "管理后台 - 支付应用信息")
@@ -78,15 +79,6 @@ public class PayAppController { @@ -78,15 +79,6 @@ public class PayAppController {
78 return success(PayAppConvert.INSTANCE.convert(app)); 79 return success(PayAppConvert.INSTANCE.convert(app));
79 } 80 }
80 81
81 - @GetMapping("/list")  
82 - @Operation(summary = "获得支付应用信息列表")  
83 - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")  
84 - @PreAuthorize("@ss.hasPermission('pay:app:query')")  
85 - public CommonResult<List<PayAppRespVO>> getAppList(@RequestParam("ids") Collection<Long> ids) {  
86 - List<PayAppDO> list = appService.getAppList(ids);  
87 - return success(PayAppConvert.INSTANCE.convertList(list));  
88 - }  
89 -  
90 @GetMapping("/page") 82 @GetMapping("/page")
91 @Operation(summary = "获得支付应用信息分页") 83 @Operation(summary = "获得支付应用信息分页")
92 @PreAuthorize("@ss.hasPermission('pay:app:query')") 84 @PreAuthorize("@ss.hasPermission('pay:app:query')")
@@ -94,34 +86,15 @@ public class PayAppController { @@ -94,34 +86,15 @@ public class PayAppController {
94 // 得到应用分页列表 86 // 得到应用分页列表
95 PageResult<PayAppDO> pageResult = appService.getAppPage(pageVO); 87 PageResult<PayAppDO> pageResult = appService.getAppPage(pageVO);
96 if (CollUtil.isEmpty(pageResult.getList())) { 88 if (CollUtil.isEmpty(pageResult.getList())) {
97 - return success(new PageResult<>(pageResult.getTotal())); 89 + return success(PageResult.empty());
98 } 90 }
99 91
100 // 得到所有的应用编号,查出所有的渠道 92 // 得到所有的应用编号,查出所有的渠道
101 - Collection<Long> payAppIds = CollectionUtils.convertList(pageResult.getList(), PayAppDO::getId);  
102 - List<PayChannelDO> channels = channelService.getChannelListByAppIds(payAppIds);  
103 - // TODO @aquan:可以基于 appId 简历一个 multiMap。这样下面,直接 get 到之后,CollUtil buildSet 即可  
104 - Iterator<PayChannelDO> iterator = channels.iterator();  
105 -  
106 - // 利用反射将渠道数据复制到返回的数据结构中去  
107 - List<PayAppPageItemRespVO> appList = new ArrayList<>(pageResult.getList().size());  
108 - pageResult.getList().forEach(app -> {  
109 - // 写入应用信息的数据  
110 - PayAppPageItemRespVO respVO = PayAppConvert.INSTANCE.pageConvert(app);  
111 - // 写入支付渠道信息的数据  
112 - Set<String> channelCodes = new HashSet<>(PayChannelEnum.values().length);  
113 - while (iterator.hasNext()) {  
114 - PayChannelDO channelDO = iterator.next();  
115 - if (channelDO.getAppId().equals(app.getId())) {  
116 - channelCodes.add(channelDO.getCode());  
117 - iterator.remove();  
118 - }  
119 - }  
120 - respVO.setChannelCodes(channelCodes);  
121 - appList.add(respVO);  
122 - }); 93 + Collection<Long> appIds = convertList(pageResult.getList(), PayAppDO::getId);
  94 + List<PayChannelDO> channels = channelService.getChannelListByAppIds(appIds);
123 95
124 - return success(new PageResult<>(appList, pageResult.getTotal())); 96 + // 拼接后返回
  97 + return success(PayAppConvert.INSTANCE.convertPage(pageResult, channels));
125 } 98 }
126 99
127 } 100 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/app/vo/PayAppBaseVO.java
1 package cn.iocoder.yudao.module.pay.controller.admin.app.vo; 1 package cn.iocoder.yudao.module.pay.controller.admin.app.vo;
  2 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
2 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
3 import lombok.*; 5 import lombok.*;
  6 +import org.hibernate.validator.constraints.URL;
  7 +
4 import javax.validation.constraints.*; 8 import javax.validation.constraints.*;
5 9
6 /** 10 /**
@@ -10,23 +14,26 @@ import javax.validation.constraints.*; @@ -10,23 +14,26 @@ import javax.validation.constraints.*;
10 @Data 14 @Data
11 public class PayAppBaseVO { 15 public class PayAppBaseVO {
12 16
13 - @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED) 17 + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "小豆")
14 @NotNull(message = "应用名不能为空") 18 @NotNull(message = "应用名不能为空")
15 private String name; 19 private String name;
16 20
17 - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED) 21 + @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
18 @NotNull(message = "开启状态不能为空") 22 @NotNull(message = "开启状态不能为空")
  23 + @InEnum(CommonStatusEnum.class)
19 private Integer status; 24 private Integer status;
20 25
21 - @Schema(description = "备注") 26 + @Schema(description = "备注", example = "我是一个测试应用")
22 private String remark; 27 private String remark;
23 28
24 - @Schema(description = "支付结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED) 29 + @Schema(description = "支付结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/pay-callback")
25 @NotNull(message = "支付结果的回调地址不能为空") 30 @NotNull(message = "支付结果的回调地址不能为空")
  31 + @URL(message = "支付结果的回调地址必须为 URL 格式")
26 private String payNotifyUrl; 32 private String payNotifyUrl;
27 33
28 - @Schema(description = "退款结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED) 34 + @Schema(description = "退款结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/refund-callback")
29 @NotNull(message = "退款结果的回调地址不能为空") 35 @NotNull(message = "退款结果的回调地址不能为空")
  36 + @URL(message = "退款结果的回调地址必须为 URL 格式")
30 private String refundNotifyUrl; 37 private String refundNotifyUrl;
31 38
32 } 39 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/app/vo/PayAppPageItemRespVO.java
@@ -14,13 +14,13 @@ import java.util.Set; @@ -14,13 +14,13 @@ import java.util.Set;
14 @ToString(callSuper = true) 14 @ToString(callSuper = true)
15 public class PayAppPageItemRespVO extends PayAppBaseVO { 15 public class PayAppPageItemRespVO extends PayAppBaseVO {
16 16
17 - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED) 17 + @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
18 private Long id; 18 private Long id;
19 19
20 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 20 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
21 private LocalDateTime createTime; 21 private LocalDateTime createTime;
22 22
23 - @Schema(description = "渠道编码集合", requiredMode = Schema.RequiredMode.REQUIRED, example = "[alipay_pc, alipay_wap]") 23 + @Schema(description = "已配置的支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "[alipay_pc, alipay_wap]")
24 private Set<String> channelCodes; 24 private Set<String> channelCodes;
25 25
26 } 26 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/app/vo/PayAppPageReqVO.java
@@ -17,21 +17,12 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -17,21 +17,12 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
17 @ToString(callSuper = true) 17 @ToString(callSuper = true)
18 public class PayAppPageReqVO extends PageParam { 18 public class PayAppPageReqVO extends PageParam {
19 19
20 - @Schema(description = "应用名") 20 + @Schema(description = "应用名", example = "小豆")
21 private String name; 21 private String name;
22 22
23 - @Schema(description = "开启状态") 23 + @Schema(description = "开启状态", example = "0")
24 private Integer status; 24 private Integer status;
25 25
26 - @Schema(description = "备注")  
27 - private String remark;  
28 -  
29 - @Schema(description = "支付结果的回调地址")  
30 - private String payNotifyUrl;  
31 -  
32 - @Schema(description = "退款结果的回调地址")  
33 - private String refundNotifyUrl;  
34 -  
35 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 26 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
36 @Schema(description = "创建时间") 27 @Schema(description = "创建时间")
37 private LocalDateTime[] createTime; 28 private LocalDateTime[] createTime;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/app/vo/PayAppRespVO.java
@@ -10,7 +10,7 @@ import java.time.LocalDateTime; @@ -10,7 +10,7 @@ import java.time.LocalDateTime;
10 @ToString(callSuper = true) 10 @ToString(callSuper = true)
11 public class PayAppRespVO extends PayAppBaseVO { 11 public class PayAppRespVO extends PayAppBaseVO {
12 12
13 - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED) 13 + @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 private Long id; 14 private Long id;
15 15
16 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 16 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/app/vo/PayAppUpdateReqVO.java
@@ -9,7 +9,7 @@ import javax.validation.constraints.*; @@ -9,7 +9,7 @@ import javax.validation.constraints.*;
9 @ToString(callSuper = true) 9 @ToString(callSuper = true)
10 public class PayAppUpdateReqVO extends PayAppBaseVO { 10 public class PayAppUpdateReqVO extends PayAppBaseVO {
11 11
12 - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED) 12 + @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 @NotNull(message = "应用编号不能为空") 13 @NotNull(message = "应用编号不能为空")
14 private Long id; 14 private Long id;
15 15
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/app/vo/PayAppUpdateStatusReqVO.java
@@ -9,11 +9,11 @@ import javax.validation.constraints.NotNull; @@ -9,11 +9,11 @@ import javax.validation.constraints.NotNull;
9 @Data 9 @Data
10 public class PayAppUpdateStatusReqVO { 10 public class PayAppUpdateStatusReqVO {
11 11
12 - @Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")  
13 - @NotNull(message = "商户编号不能为空") 12 + @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  13 + @NotNull(message = "应用编号不能为空")
14 private Long id; 14 private Long id;
15 15
16 - @Schema(description = "状态,见 SysCommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 16 + @Schema(description = "状态,见 SysCommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
17 @NotNull(message = "状态不能为空") 17 @NotNull(message = "状态不能为空")
18 private Integer status; 18 private Integer status;
19 19
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/channel/PayChannelController.java
1 package cn.iocoder.yudao.module.pay.controller.admin.channel; 1 package cn.iocoder.yudao.module.pay.controller.admin.channel;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; 4 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
6 -import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;  
7 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelRespVO; 5 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelRespVO;
8 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; 6 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
9 import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert; 7 import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert;
@@ -11,7 +9,6 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO; @@ -11,7 +9,6 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
11 import cn.iocoder.yudao.module.pay.service.channel.PayChannelService; 9 import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
12 import io.swagger.v3.oas.annotations.Operation; 10 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.Parameter; 11 import io.swagger.v3.oas.annotations.Parameter;
14 -import io.swagger.v3.oas.annotations.Parameters;  
15 import io.swagger.v3.oas.annotations.tags.Tag; 12 import io.swagger.v3.oas.annotations.tags.Tag;
16 import org.springframework.security.access.prepost.PreAuthorize; 13 import org.springframework.security.access.prepost.PreAuthorize;
17 import org.springframework.validation.annotation.Validated; 14 import org.springframework.validation.annotation.Validated;
@@ -59,39 +56,19 @@ public class PayChannelController { @@ -59,39 +56,19 @@ public class PayChannelController {
59 } 56 }
60 57
61 @GetMapping("/get") 58 @GetMapping("/get")
62 - @Operation(summary = "获得支付渠道 ") 59 + @Operation(summary = "获得支付渠道")
63 @Parameter(name = "id", description = "编号", required = true, example = "1024") 60 @Parameter(name = "id", description = "编号", required = true, example = "1024")
64 @PreAuthorize("@ss.hasPermission('pay:channel:query')") 61 @PreAuthorize("@ss.hasPermission('pay:channel:query')")
65 - public CommonResult<PayChannelRespVO> getChannel(@RequestParam("id") Long id) {  
66 - PayChannelDO channel = channelService.getChannel(id);  
67 - return success(PayChannelConvert.INSTANCE.convert(channel));  
68 - }  
69 -  
70 - @GetMapping("/page")  
71 - @Operation(summary = "获得支付渠道分页")  
72 - @PreAuthorize("@ss.hasPermission('pay:channel:query')")  
73 - public CommonResult<PageResult<PayChannelRespVO>> getChannelPage(@Valid PayChannelPageReqVO pageVO) {  
74 - PageResult<PayChannelDO> pageResult = channelService.getChannelPage(pageVO);  
75 - return success(PayChannelConvert.INSTANCE.convertPage(pageResult));  
76 - }  
77 -  
78 - // TODO 芋艿:需要 review 下实现  
79 - @GetMapping("/get-channel")  
80 - @Operation(summary = "根据条件查询微信支付渠道")  
81 - @Parameters({  
82 - @Parameter(name = "appId", description = "应用编号", required = true, example = "1"),  
83 - @Parameter(name = "code", description = "支付渠道编码", required = true, example = "wx_pub")  
84 - })  
85 - @PreAuthorize("@ss.hasPermission('pay:channel:query')")  
86 - public CommonResult<PayChannelRespVO> getChannel(@RequestParam Long appId, @RequestParam String code) {  
87 - // 獲取渠道  
88 - PayChannelDO channel = channelService.getChannelByConditions(appId, code);  
89 - if (channel == null) {  
90 - return success(new PayChannelRespVO()); 62 + public CommonResult<PayChannelRespVO> getChannel(@RequestParam(value = "id", required = false) Long id,
  63 + @RequestParam(value = "appId", required = false) Long appId,
  64 + @RequestParam(value = "code", required = false) String code) {
  65 + PayChannelDO channel = null;
  66 + if (id != null) {
  67 + channel = channelService.getChannel(id);
  68 + } else if (appId != null && code != null) {
  69 + channel = channelService.getChannelByAppIdAndCode(appId, code);
91 } 70 }
92 - // 拼凑数据  
93 - PayChannelRespVO respVo = PayChannelConvert.INSTANCE.convert(channel);  
94 - return success(respVo); 71 + return success(PayChannelConvert.INSTANCE.convert(channel));
95 } 72 }
96 73
97 @GetMapping("/get-enable-code-list") 74 @GetMapping("/get-enable-code-list")
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/channel/vo/PayChannelBaseVO.java
1 package cn.iocoder.yudao.module.pay.controller.admin.channel.vo; 1 package cn.iocoder.yudao.module.pay.controller.admin.channel.vo;
  2 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
2 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
3 import lombok.*; 5 import lombok.*;
4 import javax.validation.constraints.*; 6 import javax.validation.constraints.*;
@@ -10,22 +12,19 @@ import javax.validation.constraints.*; @@ -10,22 +12,19 @@ import javax.validation.constraints.*;
10 @Data 12 @Data
11 public class PayChannelBaseVO { 13 public class PayChannelBaseVO {
12 14
13 - @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED)  
14 - @NotNull(message = "渠道编码不能为空")  
15 - private String code;  
16 -  
17 - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED) 15 + @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
18 @NotNull(message = "开启状态不能为空") 16 @NotNull(message = "开启状态不能为空")
  17 + @InEnum(CommonStatusEnum.class)
19 private Integer status; 18 private Integer status;
20 19
21 - @Schema(description = "备注") 20 + @Schema(description = "备注", example = "我是小备注")
22 private String remark; 21 private String remark;
23 22
24 - @Schema(description = "渠道费率,单位:百分比", requiredMode = Schema.RequiredMode.REQUIRED) 23 + @Schema(description = "渠道费率,单位:百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
25 @NotNull(message = "渠道费率,单位:百分比不能为空") 24 @NotNull(message = "渠道费率,单位:百分比不能为空")
26 private Double feeRate; 25 private Double feeRate;
27 26
28 - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED) 27 + @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
29 @NotNull(message = "应用编号不能为空") 28 @NotNull(message = "应用编号不能为空")
30 private Long appId; 29 private Long appId;
31 30
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/channel/vo/PayChannelCreateReqVO.java
@@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 import javax.validation.constraints.NotBlank; 8 import javax.validation.constraints.NotBlank;
  9 +import javax.validation.constraints.NotNull;
9 10
10 @Schema(description = "管理后台 - 支付渠道 创建 Request VO") 11 @Schema(description = "管理后台 - 支付渠道 创建 Request VO")
11 @Data 12 @Data
@@ -13,6 +14,10 @@ import javax.validation.constraints.NotBlank; @@ -13,6 +14,10 @@ import javax.validation.constraints.NotBlank;
13 @ToString(callSuper = true) 14 @ToString(callSuper = true)
14 public class PayChannelCreateReqVO extends PayChannelBaseVO { 15 public class PayChannelCreateReqVO extends PayChannelBaseVO {
15 16
  17 + @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
  18 + @NotNull(message = "渠道编码不能为空")
  19 + private String code;
  20 +
16 @Schema(description = "渠道配置的 json 字符串") 21 @Schema(description = "渠道配置的 json 字符串")
17 @NotBlank(message = "渠道配置不能为空") 22 @NotBlank(message = "渠道配置不能为空")
18 private String config; 23 private String config;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/channel/vo/PayChannelPageReqVO.java deleted
1 -package cn.iocoder.yudao.module.pay.controller.admin.channel.vo;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
4 -import io.swagger.v3.oas.annotations.media.Schema;  
5 -import lombok.Data;  
6 -import lombok.EqualsAndHashCode;  
7 -import lombok.ToString;  
8 -import org.springframework.format.annotation.DateTimeFormat;  
9 -  
10 -import java.time.LocalDateTime;  
11 -  
12 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
13 -  
14 -@Schema(description = "管理后台 - 支付渠道 分页 Request VO")  
15 -@Data  
16 -@EqualsAndHashCode(callSuper = true)  
17 -@ToString(callSuper = true)  
18 -public class PayChannelPageReqVO extends PageParam {  
19 -  
20 - @Schema(description = "渠道编码")  
21 - private String code;  
22 -  
23 - @Schema(description = "开启状态")  
24 - private Integer status;  
25 -  
26 - @Schema(description = "备注")  
27 - private String remark;  
28 -  
29 - @Schema(description = "渠道费率,单位:百分比")  
30 - private Double feeRate;  
31 -  
32 - @Schema(description = "应用编号")  
33 - private Long appId;  
34 -  
35 - @Schema(description = "支付渠道配置")  
36 - private String config;  
37 -  
38 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
39 - @Schema(description = "创建时间")  
40 - private LocalDateTime[] createTime;  
41 -  
42 -}  
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/channel/vo/PayChannelRespVO.java
@@ -10,12 +10,16 @@ import java.time.LocalDateTime; @@ -10,12 +10,16 @@ import java.time.LocalDateTime;
10 @ToString(callSuper = true) 10 @ToString(callSuper = true)
11 public class PayChannelRespVO extends PayChannelBaseVO { 11 public class PayChannelRespVO extends PayChannelBaseVO {
12 12
13 - @Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED) 13 + @Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 private Long id; 14 private Long id;
15 15
16 - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 16 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
17 private LocalDateTime createTime; 17 private LocalDateTime createTime;
18 18
  19 + @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
  20 + private String code;
  21 +
19 @Schema(description = "配置", requiredMode = Schema.RequiredMode.REQUIRED) 22 @Schema(description = "配置", requiredMode = Schema.RequiredMode.REQUIRED)
20 private String config; 23 private String config;
  24 +
21 } 25 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/channel/vo/PayChannelUpdateReqVO.java
@@ -16,4 +16,5 @@ public class PayChannelUpdateReqVO extends PayChannelBaseVO { @@ -16,4 +16,5 @@ public class PayChannelUpdateReqVO extends PayChannelBaseVO {
16 @Schema(description = "渠道配置的json字符串") 16 @Schema(description = "渠道配置的json字符串")
17 @NotBlank(message = "渠道配置不能为空") 17 @NotBlank(message = "渠道配置不能为空")
18 private String config; 18 private String config;
  19 +
19 } 20 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/demo/vo/PayDemoOrderRespVO.java
@@ -28,7 +28,7 @@ public class PayDemoOrderRespVO { @@ -28,7 +28,7 @@ public class PayDemoOrderRespVO {
28 private Integer price; 28 private Integer price;
29 29
30 @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED) 30 @Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
31 - private Boolean payed; 31 + private Boolean payStatus;
32 32
33 @Schema(description = "支付订单编号", example = "16863") 33 @Schema(description = "支付订单编号", example = "16863")
34 private Long payOrderId; 34 private Long payOrderId;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderBaseVO.java
@@ -49,17 +49,13 @@ public class PayOrderBaseVO { @@ -49,17 +49,13 @@ public class PayOrderBaseVO {
49 49
50 @Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED) 50 @Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
51 @NotNull(message = "支付金额,单位:分不能为空") 51 @NotNull(message = "支付金额,单位:分不能为空")
52 - private Long amount;  
53 -  
54 - @Schema(description = "支付金额,单位:分", required = true)  
55 - @NotNull(message = "支付金额,单位:分不能为空")  
56 private Long price; 52 private Long price;
57 53
58 @Schema(description = "渠道手续费,单位:百分比") 54 @Schema(description = "渠道手续费,单位:百分比")
59 private Double channelFeeRate; 55 private Double channelFeeRate;
60 56
61 @Schema(description = "渠道手续金额,单位:分") 57 @Schema(description = "渠道手续金额,单位:分")
62 - private Long channelFeeAmount; 58 + private Long channelFeePrice;
63 59
64 @Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED) 60 @Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED)
65 @NotNull(message = "支付状态不能为空") 61 @NotNull(message = "支付状态不能为空")
@@ -95,7 +91,7 @@ public class PayOrderBaseVO { @@ -95,7 +91,7 @@ public class PayOrderBaseVO {
95 91
96 @Schema(description = "退款总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED) 92 @Schema(description = "退款总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
97 @NotNull(message = "退款总金额,单位:分不能为空") 93 @NotNull(message = "退款总金额,单位:分不能为空")
98 - private Long refundAmount; 94 + private Long refundPrice;
99 95
100 @Schema(description = "渠道用户编号") 96 @Schema(description = "渠道用户编号")
101 private String channelUserId; 97 private String channelUserId;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExcelVO.java
@@ -35,10 +35,10 @@ public class PayOrderExcelVO { @@ -35,10 +35,10 @@ public class PayOrderExcelVO {
35 private String no; 35 private String no;
36 36
37 @ExcelProperty("支付金额,单位:元") 37 @ExcelProperty("支付金额,单位:元")
38 - private String amount; 38 + private String price;
39 39
40 @ExcelProperty("渠道手续金额,单位:元") 40 @ExcelProperty("渠道手续金额,单位:元")
41 - private String channelFeeAmount; 41 + private String channelFeePrice;
42 42
43 @ExcelProperty("渠道手续费,单位:百分比") 43 @ExcelProperty("渠道手续费,单位:百分比")
44 private String channelFeeRate; 44 private String channelFeeRate;
@@ -80,7 +80,7 @@ public class PayOrderExcelVO { @@ -80,7 +80,7 @@ public class PayOrderExcelVO {
80 private Integer refundTimes; 80 private Integer refundTimes;
81 81
82 @ExcelProperty("退款总金额,单位:元") 82 @ExcelProperty("退款总金额,单位:元")
83 - private String refundAmount; 83 + private String refundPrice;
84 84
85 @ExcelProperty("商品描述") 85 @ExcelProperty("商品描述")
86 private String body; 86 private String body;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java
@@ -37,13 +37,13 @@ public class PayOrderExportReqVO { @@ -37,13 +37,13 @@ public class PayOrderExportReqVO {
37 private Integer notifyStatus; 37 private Integer notifyStatus;
38 38
39 @Schema(description = "支付金额,单位:分") 39 @Schema(description = "支付金额,单位:分")
40 - private Long amount; 40 + private Long price;
41 41
42 @Schema(description = "渠道手续费,单位:百分比") 42 @Schema(description = "渠道手续费,单位:百分比")
43 private Double channelFeeRate; 43 private Double channelFeeRate;
44 44
45 @Schema(description = "渠道手续金额,单位:分") 45 @Schema(description = "渠道手续金额,单位:分")
46 - private Long channelFeeAmount; 46 + private Long channelFeePrice;
47 47
48 @Schema(description = "支付状态") 48 @Schema(description = "支付状态")
49 private Integer status; 49 private Integer status;
@@ -73,7 +73,7 @@ public class PayOrderExportReqVO { @@ -73,7 +73,7 @@ public class PayOrderExportReqVO {
73 private Integer refundTimes; 73 private Integer refundTimes;
74 74
75 @Schema(description = "退款总金额,单位:分") 75 @Schema(description = "退款总金额,单位:分")
76 - private Long refundAmount; 76 + private Long refundPrice;
77 77
78 @Schema(description = "渠道用户编号") 78 @Schema(description = "渠道用户编号")
79 private String channelUserId; 79 private String channelUserId;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java
@@ -42,13 +42,13 @@ public class PayOrderPageReqVO extends PageParam { @@ -42,13 +42,13 @@ public class PayOrderPageReqVO extends PageParam {
42 private Integer notifyStatus; 42 private Integer notifyStatus;
43 43
44 @Schema(description = "支付金额,单位:分") 44 @Schema(description = "支付金额,单位:分")
45 - private Long amount; 45 + private Long price;
46 46
47 @Schema(description = "渠道手续费,单位:百分比") 47 @Schema(description = "渠道手续费,单位:百分比")
48 private Double channelFeeRate; 48 private Double channelFeeRate;
49 49
50 @Schema(description = "渠道手续金额,单位:分") 50 @Schema(description = "渠道手续金额,单位:分")
51 - private Long channelFeeAmount; 51 + private Long channelFeePrice;
52 52
53 @Schema(description = "支付状态") 53 @Schema(description = "支付状态")
54 private Integer status; 54 private Integer status;
@@ -78,7 +78,7 @@ public class PayOrderPageReqVO extends PageParam { @@ -78,7 +78,7 @@ public class PayOrderPageReqVO extends PageParam {
78 private Integer refundTimes; 78 private Integer refundTimes;
79 79
80 @Schema(description = "退款总金额,单位:分") 80 @Schema(description = "退款总金额,单位:分")
81 - private Long refundAmount; 81 + private Long refundPrice;
82 82
83 @Schema(description = "渠道用户编号") 83 @Schema(description = "渠道用户编号")
84 private String channelUserId; 84 private String channelUserId;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderSubmitRespVO.java
1 package cn.iocoder.yudao.module.pay.controller.admin.order.vo; 1 package cn.iocoder.yudao.module.pay.controller.admin.order.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.AllArgsConstructor;  
5 -import lombok.Builder;  
6 import lombok.Data; 4 import lombok.Data;
7 -import lombok.NoArgsConstructor;  
8 -import lombok.experimental.Accessors;  
9 5
10 @Schema(description = "管理后台 - 支付订单提交 Response VO") 6 @Schema(description = "管理后台 - 支付订单提交 Response VO")
11 @Data 7 @Data
12 public class PayOrderSubmitRespVO { 8 public class PayOrderSubmitRespVO {
13 9
  10 + @Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") // 参见 PayOrderStatusEnum 枚举
  11 + private Integer status;
  12 +
14 @Schema(description = "展示模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "url") // 参见 PayDisplayModeEnum 枚举 13 @Schema(description = "展示模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "url") // 参见 PayDisplayModeEnum 枚举
15 private String displayMode; 14 private String displayMode;
16 -  
17 @Schema(description = "展示内容", requiredMode = Schema.RequiredMode.REQUIRED) 15 @Schema(description = "展示内容", requiredMode = Schema.RequiredMode.REQUIRED)
18 private String displayContent; 16 private String displayContent;
19 17
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java
@@ -53,10 +53,10 @@ public class PayRefundExcelVO { @@ -53,10 +53,10 @@ public class PayRefundExcelVO {
53 private Integer type; 53 private Integer type;
54 54
55 @ExcelProperty("支付金额,单位:元") 55 @ExcelProperty("支付金额,单位:元")
56 - private String payAmount; 56 + private String payPrice;
57 57
58 @ExcelProperty("退款金额,单位:元") 58 @ExcelProperty("退款金额,单位:元")
59 - private String refundAmount; 59 + private String refundPrice;
60 60
61 @ExcelProperty("退款原因") 61 @ExcelProperty("退款原因")
62 private String reason; 62 private String reason;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java
@@ -46,10 +46,10 @@ public class PayRefundExportReqVO { @@ -46,10 +46,10 @@ public class PayRefundExportReqVO {
46 private Integer type; 46 private Integer type;
47 47
48 @Schema(description = "支付金额,单位分") 48 @Schema(description = "支付金额,单位分")
49 - private Long payAmount; 49 + private Long payPrice;
50 50
51 @Schema(description = "退款金额,单位分") 51 @Schema(description = "退款金额,单位分")
52 - private Long refundAmount; 52 + private Long refundPrice;
53 53
54 @Schema(description = "退款原因") 54 @Schema(description = "退款原因")
55 private String reason; 55 private String reason;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java
@@ -51,10 +51,10 @@ public class PayRefundPageReqVO extends PageParam { @@ -51,10 +51,10 @@ public class PayRefundPageReqVO extends PageParam {
51 private Integer type; 51 private Integer type;
52 52
53 @Schema(description = "支付金额,单位分") 53 @Schema(description = "支付金额,单位分")
54 - private Long payAmount; 54 + private Long payPrice;
55 55
56 @Schema(description = "退款金额,单位分") 56 @Schema(description = "退款金额,单位分")
57 - private Long refundAmount; 57 + private Long refundPrice;
58 58
59 @Schema(description = "退款原因") 59 @Schema(description = "退款原因")
60 private String reason; 60 private String reason;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/app/order/AppPayOrderController.http
@@ -19,7 +19,7 @@ tenant-id: {{appTenentId}} @@ -19,7 +19,7 @@ tenant-id: {{appTenentId}}
19 "id": 202, 19 "id": 202,
20 "channelCode": "wx_bar", 20 "channelCode": "wx_bar",
21 "channelExtras": { 21 "channelExtras": {
22 - "authCode": "132990241553789274" 22 + "authCode": "134042110834344848"
23 } 23 }
24 } 24 }
25 25
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/app/PayAppConvert.java
1 package cn.iocoder.yudao.module.pay.convert.app; 1 package cn.iocoder.yudao.module.pay.convert.app;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO; 5 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO;
5 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageItemRespVO; 6 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageItemRespVO;
6 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppRespVO; 7 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppRespVO;
7 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO; 8 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
8 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; 9 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
  10 +import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
9 import org.mapstruct.Mapper; 11 import org.mapstruct.Mapper;
10 import org.mapstruct.factory.Mappers; 12 import org.mapstruct.factory.Mappers;
11 13
12 import java.util.List; 14 import java.util.List;
  15 +import java.util.Map;
  16 +import java.util.Set;
  17 +import java.util.function.Consumer;
13 18
14 /** 19 /**
15 * 支付应用信息 Convert 20 * 支付应用信息 Convert
@@ -31,6 +36,14 @@ public interface PayAppConvert { @@ -31,6 +36,14 @@ public interface PayAppConvert {
31 36
32 List<PayAppRespVO> convertList(List<PayAppDO> list); 37 List<PayAppRespVO> convertList(List<PayAppDO> list);
33 38
34 - PageResult<PayAppRespVO> convertPage(PageResult<PayAppDO> page); 39 + PageResult<PayAppPageItemRespVO> convertPage(PageResult<PayAppDO> page);
  40 +
  41 + default PageResult<PayAppPageItemRespVO> convertPage(PageResult<PayAppDO> pageResult, List<PayChannelDO> channels) {
  42 + PageResult<PayAppPageItemRespVO> voPageResult = convertPage(pageResult);
  43 + // 处理 channel 关系
  44 + Map<Long, Set<String>> appIdChannelMap = CollectionUtils.convertMultiMap2(channels, PayChannelDO::getAppId, PayChannelDO::getCode);
  45 + voPageResult.getList().forEach(app -> app.setChannelCodes(appIdChannelMap.get(app.getId())));
  46 + return voPageResult;
  47 + }
35 48
36 } 49 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/order/PayOrderConvert.java
@@ -27,7 +27,6 @@ public interface PayOrderConvert { @@ -27,7 +27,6 @@ public interface PayOrderConvert {
27 27
28 PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class); 28 PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class);
29 29
30 - @Mapping(source = "amount", target = "price")  
31 PayOrderRespVO convert(PayOrderDO bean); 30 PayOrderRespVO convert(PayOrderDO bean);
32 31
33 PayOrderRespDTO convert2(PayOrderDO order); 32 PayOrderRespDTO convert2(PayOrderDO order);
@@ -40,8 +39,6 @@ public interface PayOrderConvert { @@ -40,8 +39,6 @@ public interface PayOrderConvert {
40 39
41 PageResult<PayOrderRespVO> convertPage(PageResult<PayOrderDO> page); 40 PageResult<PayOrderRespVO> convertPage(PageResult<PayOrderDO> page);
42 41
43 - List<PayOrderExcelVO> convertList02(List<PayOrderDO> list);  
44 -  
45 /** 42 /**
46 * 订单 DO 转自定义分页对象 43 * 订单 DO 转自定义分页对象
47 * 44 *
@@ -76,14 +73,14 @@ public interface PayOrderConvert { @@ -76,14 +73,14 @@ public interface PayOrderConvert {
76 73
77 BigDecimal multiple = new BigDecimal(100); 74 BigDecimal multiple = new BigDecimal(100);
78 75
79 - payOrderExcelVO.setAmount(BigDecimal.valueOf(bean.getAmount()) 76 + payOrderExcelVO.setPrice(BigDecimal.valueOf(bean.getPrice())
80 .divide(multiple, 2, RoundingMode.HALF_UP).toString()); 77 .divide(multiple, 2, RoundingMode.HALF_UP).toString());
81 78
82 - payOrderExcelVO.setChannelFeeAmount(BigDecimal.valueOf(bean.getChannelFeeAmount()) 79 + payOrderExcelVO.setChannelFeePrice(BigDecimal.valueOf(bean.getChannelFeePrice())
83 .divide(multiple, 2, RoundingMode.HALF_UP).toString()); 80 .divide(multiple, 2, RoundingMode.HALF_UP).toString());
84 payOrderExcelVO.setChannelFeeRate(java.math.BigDecimal.valueOf(bean.getChannelFeeRate()) 81 payOrderExcelVO.setChannelFeeRate(java.math.BigDecimal.valueOf(bean.getChannelFeeRate())
85 .multiply(multiple).toString()); 82 .multiply(multiple).toString());
86 - payOrderExcelVO.setRefundAmount(BigDecimal.valueOf(bean.getRefundAmount()) 83 + payOrderExcelVO.setRefundPrice(BigDecimal.valueOf(bean.getRefundPrice())
87 .divide(multiple, 2, RoundingMode.HALF_UP).toString()); 84 .divide(multiple, 2, RoundingMode.HALF_UP).toString());
88 85
89 return payOrderExcelVO; 86 return payOrderExcelVO;
@@ -96,7 +93,7 @@ public interface PayOrderConvert { @@ -96,7 +93,7 @@ public interface PayOrderConvert {
96 93
97 PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqVO reqVO, String userIp); 94 PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqVO reqVO, String userIp);
98 95
99 - PayOrderSubmitRespVO convert(PayOrderUnifiedRespDTO bean); 96 + PayOrderSubmitRespVO convert(PayOrderDO order, PayOrderUnifiedRespDTO unifiedRespDTO);
100 97
101 AppPayOrderSubmitRespVO convert3(PayOrderSubmitRespVO bean); 98 AppPayOrderSubmitRespVO convert3(PayOrderSubmitRespVO bean);
102 99
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/refund/PayRefundConvert.java
@@ -77,9 +77,9 @@ public interface PayRefundConvert { @@ -77,9 +77,9 @@ public interface PayRefundConvert {
77 payRefundExcelVO.setCreateTime(bean.getCreateTime()); 77 payRefundExcelVO.setCreateTime(bean.getCreateTime());
78 78
79 BigDecimal multiple = new BigDecimal(100); 79 BigDecimal multiple = new BigDecimal(100);
80 - payRefundExcelVO.setPayAmount(BigDecimal.valueOf(bean.getPayAmount()) 80 + payRefundExcelVO.setPayPrice(BigDecimal.valueOf(bean.getPayPrice())
81 .divide(multiple, 2, RoundingMode.HALF_UP).toString()); 81 .divide(multiple, 2, RoundingMode.HALF_UP).toString());
82 - payRefundExcelVO.setRefundAmount(BigDecimal.valueOf(bean.getRefundAmount()) 82 + payRefundExcelVO.setRefundPrice(BigDecimal.valueOf(bean.getRefundPrice())
83 .divide(multiple, 2, RoundingMode.HALF_UP).toString()); 83 .divide(multiple, 2, RoundingMode.HALF_UP).toString());
84 84
85 return payRefundExcelVO; 85 return payRefundExcelVO;
@@ -87,7 +87,7 @@ public interface PayRefundConvert { @@ -87,7 +87,7 @@ public interface PayRefundConvert {
87 87
88 //TODO 太多需要处理了, 暂时不用 88 //TODO 太多需要处理了, 暂时不用
89 @Mappings(value = { 89 @Mappings(value = {
90 - @Mapping(source = "amount", target = "payAmount"), 90 + @Mapping(source = "price", target = "payPrice"),
91 @Mapping(source = "id", target = "orderId"), 91 @Mapping(source = "id", target = "orderId"),
92 @Mapping(target = "status",ignore = true) 92 @Mapping(target = "status",ignore = true)
93 }) 93 })
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/demo/PayDemoOrderDO.java
@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.annotation.TableName; @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
7 import lombok.*; 7 import lombok.*;
8 8
9 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
10 -import java.util.Date;  
11 10
12 /** 11 /**
13 * 示例订单 12 * 示例订单
@@ -53,7 +52,7 @@ public class PayDemoOrderDO extends BaseDO { @@ -53,7 +52,7 @@ public class PayDemoOrderDO extends BaseDO {
53 /** 52 /**
54 * 是否支付 53 * 是否支付
55 */ 54 */
56 - private Boolean payed; 55 + private Boolean payStatus;
57 /** 56 /**
58 * 支付订单编号 57 * 支付订单编号
59 * 58 *
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/member/MemberWalletTransactionDO.java
@@ -67,7 +67,7 @@ public class MemberWalletTransactionDO extends BaseDO { @@ -67,7 +67,7 @@ public class MemberWalletTransactionDO extends BaseDO {
67 /** 67 /**
68 * 交易金额, 单位分 68 * 交易金额, 单位分
69 */ 69 */
70 - private Integer amount; 70 + private Integer price;
71 71
72 /** 72 /**
73 * 余额, 单位分 73 * 余额, 单位分
@@ -83,4 +83,4 @@ public class MemberWalletTransactionDO extends BaseDO { @@ -83,4 +83,4 @@ public class MemberWalletTransactionDO extends BaseDO {
83 * 交易时间 83 * 交易时间
84 */ 84 */
85 private LocalDateTime transactionTime; 85 private LocalDateTime transactionTime;
86 -}  
87 \ No newline at end of file 86 \ No newline at end of file
  87 +}
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java
1 package cn.iocoder.yudao.module.pay.dal.dataobject.notify; 1 package cn.iocoder.yudao.module.pay.dal.dataobject.notify;
2 2
3 -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 +import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
4 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; 4 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
5 import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; 5 import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
6 import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; 6 import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
@@ -25,7 +25,7 @@ import java.time.LocalDateTime; @@ -25,7 +25,7 @@ import java.time.LocalDateTime;
25 @Data 25 @Data
26 @EqualsAndHashCode(callSuper = true) 26 @EqualsAndHashCode(callSuper = true)
27 @Accessors(chain = true) 27 @Accessors(chain = true)
28 -public class PayNotifyTaskDO extends BaseDO { 28 +public class PayNotifyTaskDO extends TenantBaseDO {
29 29
30 /** 30 /**
31 * 通知频率,单位为秒。 31 * 通知频率,单位为秒。
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/order/PayOrderDO.java
@@ -76,17 +76,13 @@ public class PayOrderDO extends BaseDO { @@ -76,17 +76,13 @@ public class PayOrderDO extends BaseDO {
76 * 枚举 {@link PayOrderNotifyStatusEnum} 76 * 枚举 {@link PayOrderNotifyStatusEnum}
77 */ 77 */
78 private Integer notifyStatus; 78 private Integer notifyStatus;
79 -// /**  
80 -// * 商户拓展参数  
81 -// */  
82 -// private Map<String, String> merchantExtras;  
83 79
84 // ========== 订单相关字段 ========== 80 // ========== 订单相关字段 ==========
85 81
86 /** 82 /**
87 * 支付金额,单位:分 83 * 支付金额,单位:分
88 */ 84 */
89 - private Integer amount; 85 + private Integer price;
90 /** 86 /**
91 * 渠道手续费,单位:百分比 87 * 渠道手续费,单位:百分比
92 * 88 *
@@ -96,7 +92,7 @@ public class PayOrderDO extends BaseDO { @@ -96,7 +92,7 @@ public class PayOrderDO extends BaseDO {
96 /** 92 /**
97 * 渠道手续金额,单位:分 93 * 渠道手续金额,单位:分
98 */ 94 */
99 - private Long channelFeeAmount; 95 + private Long channelFeePrice;
100 /** 96 /**
101 * 支付状态 97 * 支付状态
102 * 98 *
@@ -140,7 +136,7 @@ public class PayOrderDO extends BaseDO { @@ -140,7 +136,7 @@ public class PayOrderDO extends BaseDO {
140 /** 136 /**
141 * 退款总金额,单位:分 137 * 退款总金额,单位:分
142 */ 138 */
143 - private Long refundAmount; 139 + private Long refundPrice;
144 140
145 // ========== 渠道相关字段 ========== 141 // ========== 渠道相关字段 ==========
146 /** 142 /**
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/refund/PayRefundDO.java
@@ -124,11 +124,11 @@ public class PayRefundDO extends BaseDO { @@ -124,11 +124,11 @@ public class PayRefundDO extends BaseDO {
124 /** 124 /**
125 * 支付金额,单位:分 125 * 支付金额,单位:分
126 */ 126 */
127 - private Integer payAmount; 127 + private Integer payPrice;
128 /** 128 /**
129 * 退款金额,单位:分 129 * 退款金额,单位:分
130 */ 130 */
131 - private Integer refundAmount; 131 + private Integer refundPrice;
132 132
133 /** 133 /**
134 * 退款原因 134 * 退款原因
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/app/PayAppMapper.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.dal.mysql.app; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.dal.mysql.app;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO; 7 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO;
7 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; 8 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
@@ -11,14 +12,11 @@ import org.apache.ibatis.annotations.Mapper; @@ -11,14 +12,11 @@ import org.apache.ibatis.annotations.Mapper;
11 public interface PayAppMapper extends BaseMapperX<PayAppDO> { 12 public interface PayAppMapper extends BaseMapperX<PayAppDO> {
12 13
13 default PageResult<PayAppDO> selectPage(PayAppPageReqVO reqVO) { 14 default PageResult<PayAppDO> selectPage(PayAppPageReqVO reqVO) {
14 - return selectPage(reqVO, new QueryWrapperX<PayAppDO>()  
15 - .likeIfPresent("name", reqVO.getName())  
16 - .eqIfPresent("status", reqVO.getStatus())  
17 - .eqIfPresent("remark", reqVO.getRemark())  
18 - .eqIfPresent("pay_notify_url", reqVO.getPayNotifyUrl())  
19 - .eqIfPresent("refund_notify_url", reqVO.getRefundNotifyUrl())  
20 - .betweenIfPresent("create_time", reqVO.getCreateTime())  
21 - .orderByDesc("id")); 15 + return selectPage(reqVO, new LambdaQueryWrapperX<PayAppDO>()
  16 + .likeIfPresent(PayAppDO::getName, reqVO.getName())
  17 + .eqIfPresent(PayAppDO::getStatus, reqVO.getStatus())
  18 + .betweenIfPresent(PayAppDO::getCreateTime, reqVO.getCreateTime())
  19 + .orderByDesc(PayAppDO::getId));
22 } 20 }
23 21
24 } 22 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/channel/PayChannelMapper.java
1 package cn.iocoder.yudao.module.pay.dal.mysql.channel; 1 package cn.iocoder.yudao.module.pay.dal.mysql.channel;
2 2
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;  
7 -import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;  
8 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO; 5 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
9 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
  8 +import org.apache.ibatis.annotations.Select;
11 9
  10 +import java.time.LocalDateTime;
12 import java.util.Collection; 11 import java.util.Collection;
13 import java.util.List; 12 import java.util.List;
14 13
@@ -19,41 +18,8 @@ public interface PayChannelMapper extends BaseMapperX&lt;PayChannelDO&gt; { @@ -19,41 +18,8 @@ public interface PayChannelMapper extends BaseMapperX&lt;PayChannelDO&gt; {
19 return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code); 18 return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code);
20 } 19 }
21 20
22 - default PageResult<PayChannelDO> selectPage(PayChannelPageReqVO reqVO) {  
23 - return selectPage(reqVO, new QueryWrapperX<PayChannelDO>()  
24 - .eqIfPresent("code", reqVO.getCode())  
25 - .eqIfPresent("status", reqVO.getStatus())  
26 - .eqIfPresent("remark", reqVO.getRemark())  
27 - .eqIfPresent("fee_rate", reqVO.getFeeRate())  
28 - .eqIfPresent("app_id", reqVO.getAppId())  
29 - .betweenIfPresent("create_time", reqVO.getCreateTime())  
30 - .orderByDesc("id"));  
31 - }  
32 -  
33 - /**  
34 - * 根据条件获取渠道  
35 - *  
36 - * @param appId 应用编号  
37 - * @param code 渠道编码  
38 - * @return 数量  
39 - */  
40 - default PayChannelDO selectOne(Long appId, String code) {  
41 - return this.selectOne((new QueryWrapper<PayChannelDO>().lambda()  
42 - .eq(PayChannelDO::getAppId, appId)  
43 - .eq(PayChannelDO::getCode, code)  
44 - ));  
45 - }  
46 -  
47 - // TODO @aquan:select 命名  
48 - /**  
49 - * 根据支付应用ID集合获得支付渠道列表  
50 - *  
51 - * @param appIds 应用编号集合  
52 - * @return 支付渠道列表  
53 - */  
54 - default List<PayChannelDO> getChannelListByAppIds(Collection<Long> appIds){  
55 - return this.selectList(new QueryWrapper<PayChannelDO>().lambda()  
56 - .in(PayChannelDO::getAppId, appIds)); 21 + default List<PayChannelDO> selectListByAppIds(Collection<Long> appIds){
  22 + return selectList(PayChannelDO::getAppId, appIds);
57 } 23 }
58 24
59 default List<PayChannelDO> selectListByAppId(Long appId, Integer status) { 25 default List<PayChannelDO> selectListByAppId(Long appId, Integer status) {
@@ -62,4 +28,7 @@ public interface PayChannelMapper extends BaseMapperX&lt;PayChannelDO&gt; { @@ -62,4 +28,7 @@ public interface PayChannelMapper extends BaseMapperX&lt;PayChannelDO&gt; {
62 .eq(PayChannelDO::getStatus, status)); 28 .eq(PayChannelDO::getStatus, status));
63 } 29 }
64 30
  31 + @Select("SELECT COUNT(*) FROM pay_channel WHERE update_time > #{maxUpdateTime}")
  32 + Long selectCountByUpdateTimeGt(LocalDateTime maxUpdateTime);
  33 +
65 } 34 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/demo/PayDemoOrderMapper.java
@@ -22,7 +22,7 @@ public interface PayDemoOrderMapper extends BaseMapperX&lt;PayDemoOrderDO&gt; { @@ -22,7 +22,7 @@ public interface PayDemoOrderMapper extends BaseMapperX&lt;PayDemoOrderDO&gt; {
22 22
23 default int updateByIdAndPayed(Long id, boolean wherePayed, PayDemoOrderDO updateObj) { 23 default int updateByIdAndPayed(Long id, boolean wherePayed, PayDemoOrderDO updateObj) {
24 return update(updateObj, new LambdaQueryWrapperX<PayDemoOrderDO>() 24 return update(updateObj, new LambdaQueryWrapperX<PayDemoOrderDO>()
25 - .eq(PayDemoOrderDO::getId, id).eq(PayDemoOrderDO::getPayed, wherePayed)); 25 + .eq(PayDemoOrderDO::getId, id).eq(PayDemoOrderDO::getPayStatus, wherePayed));
26 } 26 }
27 27
28 } 28 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/order/PayOrderMapper.java
@@ -50,17 +50,8 @@ public interface PayOrderMapper extends BaseMapperX&lt;PayOrderDO&gt; { @@ -50,17 +50,8 @@ public interface PayOrderMapper extends BaseMapperX&lt;PayOrderDO&gt; {
50 .in(PayOrderDO::getId, idList)); 50 .in(PayOrderDO::getId, idList));
51 } 51 }
52 52
53 - /**  
54 - * 查询符合的订单数量  
55 - *  
56 - * @param appId 应用编号  
57 - * @param status 订单状态  
58 - * @return 条数  
59 - */  
60 - default Long selectCount(Long appId, Integer status) {  
61 - return selectCount(new LambdaQueryWrapper<PayOrderDO>()  
62 - .eq(PayOrderDO::getAppId, appId)  
63 - .in(PayOrderDO::getStatus, status)); 53 + default Long selectCountByAppId(Long appId) {
  54 + return selectCount(PayOrderDO::getAppId, appId);
64 } 55 }
65 56
66 default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) { 57 default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) {
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/refund/PayRefundMapper.java
@@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 7 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
8 import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; 8 import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
9 -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;  
10 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
11 10
12 import java.util.List; 11 import java.util.List;
@@ -38,11 +37,8 @@ public interface PayRefundMapper extends BaseMapperX&lt;PayRefundDO&gt; { @@ -38,11 +37,8 @@ public interface PayRefundMapper extends BaseMapperX&lt;PayRefundDO&gt; {
38 .orderByDesc("id")); 37 .orderByDesc("id"));
39 } 38 }
40 39
41 - default Long selectCount(Long appId, Integer status) {  
42 -  
43 - return selectCount(new LambdaQueryWrapper<PayRefundDO>()  
44 - .eq(PayRefundDO::getAppId, appId)  
45 - .eq(PayRefundDO::getStatus, status)); 40 + default Long selectCountByApp(Long appId) {
  41 + return selectCount(PayRefundDO::getAppId, appId);
46 } 42 }
47 43
48 default PayRefundDO selectByReqNo(String reqNo) { 44 default PayRefundDO selectByReqNo(String reqNo) {
@@ -52,4 +48,5 @@ public interface PayRefundMapper extends BaseMapperX&lt;PayRefundDO&gt; { @@ -52,4 +48,5 @@ public interface PayRefundMapper extends BaseMapperX&lt;PayRefundDO&gt; {
52 default PayRefundDO selectByTradeNoAndMerchantRefundNo(String tradeNo, String merchantRefundNo){ 48 default PayRefundDO selectByTradeNoAndMerchantRefundNo(String tradeNo, String merchantRefundNo){
53 return selectOne("trade_no", tradeNo, "merchant_refund_no", merchantRefundNo); 49 return selectOne("trade_no", tradeNo, "merchant_refund_no", merchantRefundNo);
54 } 50 }
  51 +
55 } 52 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/job/package-info.java
  1 +/**
  2 + * 占位,无特殊含义
  3 + */
1 package cn.iocoder.yudao.module.pay.job; 4 package cn.iocoder.yudao.module.pay.job;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/app/PayAppService.java
@@ -36,6 +36,14 @@ public interface PayAppService { @@ -36,6 +36,14 @@ public interface PayAppService {
36 void updateApp(@Valid PayAppUpdateReqVO updateReqVO); 36 void updateApp(@Valid PayAppUpdateReqVO updateReqVO);
37 37
38 /** 38 /**
  39 + * 修改应用信息状态
  40 + *
  41 + * @param id 应用编号
  42 + * @param status 状态
  43 + */
  44 + void updateAppStatus(Long id, Integer status);
  45 +
  46 + /**
39 * 删除支付应用信息 47 * 删除支付应用信息
40 * 48 *
41 * @param id 编号 49 * @param id 编号
@@ -67,14 +75,6 @@ public interface PayAppService { @@ -67,14 +75,6 @@ public interface PayAppService {
67 PageResult<PayAppDO> getAppPage(PayAppPageReqVO pageReqVO); 75 PageResult<PayAppDO> getAppPage(PayAppPageReqVO pageReqVO);
68 76
69 /** 77 /**
70 - * 修改应用信息状态  
71 - *  
72 - * @param id 应用编号  
73 - * @param status 状态{@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}  
74 - */  
75 - void updateAppStatus(Long id, Integer status);  
76 -  
77 - /**  
78 * 获得指定编号的商户 Map 78 * 获得指定编号的商户 Map
79 * 79 *
80 * @param ids 应用编号集合 80 * @param ids 应用编号集合
@@ -85,7 +85,6 @@ public interface PayAppService { @@ -85,7 +85,6 @@ public interface PayAppService {
85 return CollectionUtils.convertMap(list, PayAppDO::getId); 85 return CollectionUtils.convertMap(list, PayAppDO::getId);
86 } 86 }
87 87
88 -  
89 /** 88 /**
90 * 支付应用的合法性 89 * 支付应用的合法性
91 * 90 *
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/app/PayAppServiceImpl.java
@@ -9,12 +9,13 @@ import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO; @@ -9,12 +9,13 @@ import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
9 import cn.iocoder.yudao.module.pay.convert.app.PayAppConvert; 9 import cn.iocoder.yudao.module.pay.convert.app.PayAppConvert;
10 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; 10 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
11 import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper; 11 import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper;
12 -import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper;  
13 import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper; 12 import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper;
14 import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants; 13 import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
15 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; 14 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
16 import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum; 15 import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum;
17 -import com.google.common.annotations.VisibleForTesting; 16 +import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
  17 +import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
  18 +import org.springframework.context.annotation.Lazy;
18 import org.springframework.stereotype.Service; 19 import org.springframework.stereotype.Service;
19 import org.springframework.validation.annotation.Validated; 20 import org.springframework.validation.annotation.Validated;
20 21
@@ -23,11 +24,10 @@ import java.util.Collection; @@ -23,11 +24,10 @@ import java.util.Collection;
23 import java.util.List; 24 import java.util.List;
24 25
25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 26 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
26 -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE;  
27 -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_APP_NOT_FOUND; 27 +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*;
28 28
29 /** 29 /**
30 - * 支付应用信息 Service 实现类 30 + * 支付应用 Service 实现类
31 * 31 *
32 * @author aquan 32 * @author aquan
33 */ 33 */
@@ -37,11 +37,13 @@ public class PayAppServiceImpl implements PayAppService { @@ -37,11 +37,13 @@ public class PayAppServiceImpl implements PayAppService {
37 37
38 @Resource 38 @Resource
39 private PayAppMapper appMapper; 39 private PayAppMapper appMapper;
40 - // TODO 芋艿:不能调用对方的 mapper 40 +
41 @Resource 41 @Resource
42 - private PayOrderMapper orderMapper; 42 + @Lazy // 延迟加载,避免循环依赖报错
  43 + private PayOrderService orderService;
43 @Resource 44 @Resource
44 - private PayRefundMapper refundMapper; 45 + @Lazy // 延迟加载,避免循环依赖报错
  46 + private PayRefundService refundService;
45 47
46 @Override 48 @Override
47 public Long createApp(PayAppCreateReqVO createReqVO) { 49 public Long createApp(PayAppCreateReqVO createReqVO) {
@@ -55,17 +57,31 @@ public class PayAppServiceImpl implements PayAppService { @@ -55,17 +57,31 @@ public class PayAppServiceImpl implements PayAppService {
55 @Override 57 @Override
56 public void updateApp(PayAppUpdateReqVO updateReqVO) { 58 public void updateApp(PayAppUpdateReqVO updateReqVO) {
57 // 校验存在 59 // 校验存在
58 - this.validateAppExists(updateReqVO.getId()); 60 + validateAppExists(updateReqVO.getId());
59 // 更新 61 // 更新
60 PayAppDO updateObj = PayAppConvert.INSTANCE.convert(updateReqVO); 62 PayAppDO updateObj = PayAppConvert.INSTANCE.convert(updateReqVO);
61 appMapper.updateById(updateObj); 63 appMapper.updateById(updateObj);
62 } 64 }
63 65
64 @Override 66 @Override
  67 + public void updateAppStatus(Long id, Integer status) {
  68 + // 校验商户存在
  69 + validateAppExists(id);
  70 + // 更新状态
  71 + appMapper.updateById(new PayAppDO().setId(id).setStatus(status));
  72 + }
  73 +
  74 + @Override
65 public void deleteApp(Long id) { 75 public void deleteApp(Long id) {
66 // 校验存在 76 // 校验存在
67 - this.validateAppExists(id);  
68 - this.validateOrderTransactionExist(id); 77 + validateAppExists(id);
  78 + // 校验关联数据是否存在
  79 + if (orderService.getOrderCountByAppId(id) > 0) {
  80 + throw exception(PAY_APP_EXIST_ORDER_CANT_DELETE);
  81 + }
  82 + if (refundService.getRefundCountByAppId(id) > 0) {
  83 + throw exception(PAY_APP_EXIST_REFUND_CANT_DELETE);
  84 + }
69 85
70 // 删除 86 // 删除
71 appMapper.deleteById(id); 87 appMapper.deleteById(id);
@@ -93,58 +109,15 @@ public class PayAppServiceImpl implements PayAppService { @@ -93,58 +109,15 @@ public class PayAppServiceImpl implements PayAppService {
93 } 109 }
94 110
95 @Override 111 @Override
96 - public void updateAppStatus(Long id, Integer status) {  
97 - // 校验商户存在  
98 - this.checkAppExists(id);  
99 - // 更新状态  
100 - PayAppDO app = new PayAppDO();  
101 - app.setId(id);  
102 - app.setStatus(status);  
103 - appMapper.updateById(app);  
104 - }  
105 -  
106 - /**  
107 - * 检查商户是否存在  
108 - *  
109 - * @param id 商户编号  
110 - */  
111 - @VisibleForTesting  
112 - public void checkAppExists(Long id) {  
113 - if (id == null) {  
114 - return;  
115 - }  
116 - PayAppDO payApp = appMapper.selectById(id);  
117 - if (payApp == null) {  
118 - throw exception(PAY_APP_NOT_FOUND);  
119 - }  
120 - }  
121 -  
122 - /**  
123 - * 验证是否存在交易中或者退款中等处理中状态的订单  
124 - *  
125 - * @param appId 应用 ID  
126 - */  
127 - private void validateOrderTransactionExist(Long appId) {  
128 - // 查看交易订单  
129 - if (orderMapper.selectCount(appId, PayOrderStatusEnum.WAITING.getStatus()) > 0) {  
130 - throw exception(PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE);  
131 - }  
132 - // 查看退款订单  
133 - if (refundMapper.selectCount(appId, PayRefundStatusEnum.CREATE.getStatus()) > 0) {  
134 - throw exception(PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE);  
135 - }  
136 - }  
137 -  
138 - @Override  
139 public PayAppDO validPayApp(Long id) { 112 public PayAppDO validPayApp(Long id) {
140 PayAppDO app = appMapper.selectById(id); 113 PayAppDO app = appMapper.selectById(id);
141 // 校验是否存在 114 // 校验是否存在
142 if (app == null) { 115 if (app == null) {
143 - throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_NOT_FOUND); 116 + throw exception(ErrorCodeConstants.PAY_APP_NOT_FOUND);
144 } 117 }
145 // 校验是否禁用 118 // 校验是否禁用
146 if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) { 119 if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) {
147 - throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_IS_DISABLE); 120 + throw exception(ErrorCodeConstants.PAY_APP_IS_DISABLE);
148 } 121 }
149 return app; 122 return app;
150 } 123 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelService.java
1 package cn.iocoder.yudao.module.pay.service.channel; 1 package cn.iocoder.yudao.module.pay.service.channel;
2 2
3 import cn.iocoder.yudao.framework.common.exception.ServiceException; 3 import cn.iocoder.yudao.framework.common.exception.ServiceException;
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; 4 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
6 -import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;  
7 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; 5 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
8 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO; 6 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
9 7
@@ -19,11 +17,6 @@ import java.util.List; @@ -19,11 +17,6 @@ import java.util.List;
19 public interface PayChannelService { 17 public interface PayChannelService {
20 18
21 /** 19 /**
22 - * 初始化支付客户端  
23 - */  
24 - void initLocalCache();  
25 -  
26 - /**  
27 * 创建支付渠道 20 * 创建支付渠道
28 * 21 *
29 * @param createReqVO 创建信息 22 * @param createReqVO 创建信息
@@ -54,15 +47,7 @@ public interface PayChannelService { @@ -54,15 +47,7 @@ public interface PayChannelService {
54 PayChannelDO getChannel(Long id); 47 PayChannelDO getChannel(Long id);
55 48
56 /** 49 /**
57 - * 获得支付渠道分页  
58 - *  
59 - * @param pageReqVO 分页查询  
60 - * @return 支付渠道分页  
61 - */  
62 - PageResult<PayChannelDO> getChannelPage(PayChannelPageReqVO pageReqVO);  
63 -  
64 - /**  
65 - * 根据支付应用ID集合获得支付渠道列表 50 + * 根据支付应用 ID 集合,获得支付渠道列表
66 * 51 *
67 * @param appIds 应用编号集合 52 * @param appIds 应用编号集合
68 * @return 支付渠道列表 53 * @return 支付渠道列表
@@ -72,11 +57,11 @@ public interface PayChannelService { @@ -72,11 +57,11 @@ public interface PayChannelService {
72 /** 57 /**
73 * 根据条件获取渠道 58 * 根据条件获取渠道
74 * 59 *
75 - * @param appid 应用编号 60 + * @param appId 应用编号
76 * @param code 渠道编码 61 * @param code 渠道编码
77 * @return 数量 62 * @return 数量
78 */ 63 */
79 - PayChannelDO getChannelByConditions(Long appid, String code); 64 + PayChannelDO getChannelByAppIdAndCode(Long appId, String code);
80 65
81 /** 66 /**
82 * 支付渠道的合法性 67 * 支付渠道的合法性
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelServiceImpl.java
1 package cn.iocoder.yudao.module.pay.service.channel; 1 package cn.iocoder.yudao.module.pay.service.channel;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
3 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
4 -import cn.hutool.json.JSONUtil;  
5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;  
7 -import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  8 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
8 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig; 9 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
9 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; 10 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
10 import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum; 11 import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
11 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; 12 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
12 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; 13 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
13 -import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;  
14 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; 14 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
15 import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert; 15 import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert;
16 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO; 16 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
17 import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper; 17 import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper;
18 import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants; 18 import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
  19 +import lombok.Getter;
  20 +import lombok.Setter;
19 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
  22 +import org.springframework.scheduling.annotation.Scheduled;
20 import org.springframework.stereotype.Service; 23 import org.springframework.stereotype.Service;
21 import org.springframework.validation.annotation.Validated; 24 import org.springframework.validation.annotation.Validated;
22 25
23 import javax.annotation.PostConstruct; 26 import javax.annotation.PostConstruct;
24 import javax.annotation.Resource; 27 import javax.annotation.Resource;
25 import javax.validation.Validator; 28 import javax.validation.Validator;
  29 +import java.time.LocalDateTime;
26 import java.util.Collection; 30 import java.util.Collection;
27 import java.util.List; 31 import java.util.List;
  32 +import java.util.concurrent.TimeUnit;
28 33
29 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 34 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
30 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_EXIST_SAME_CHANNEL_ERROR; 35 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_EXIST_SAME_CHANNEL_ERROR;
@@ -40,6 +45,10 @@ import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_E @@ -40,6 +45,10 @@ import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_E
40 @Validated 45 @Validated
41 public class PayChannelServiceImpl implements PayChannelService { 46 public class PayChannelServiceImpl implements PayChannelService {
42 47
  48 + @Getter // 为了方便测试,这里提供 getter 方法
  49 + @Setter
  50 + private volatile List<PayChannelDO> channelCache;
  51 +
43 @Resource 52 @Resource
44 private PayClientFactory payClientFactory; 53 private PayClientFactory payClientFactory;
45 54
@@ -52,7 +61,6 @@ public class PayChannelServiceImpl implements PayChannelService { @@ -52,7 +61,6 @@ public class PayChannelServiceImpl implements PayChannelService {
52 /** 61 /**
53 * 初始化 {@link #payClientFactory} 缓存 62 * 初始化 {@link #payClientFactory} 缓存
54 */ 63 */
55 - @Override  
56 @PostConstruct 64 @PostConstruct
57 public void initLocalCache() { 65 public void initLocalCache() {
58 // 注意:忽略自动多租户,因为要全局初始化缓存 66 // 注意:忽略自动多租户,因为要全局初始化缓存
@@ -64,49 +72,101 @@ public class PayChannelServiceImpl implements PayChannelService { @@ -64,49 +72,101 @@ public class PayChannelServiceImpl implements PayChannelService {
64 // 第二步:构建缓存:创建或更新支付 Client 72 // 第二步:构建缓存:创建或更新支付 Client
65 channels.forEach(payChannel -> payClientFactory.createOrUpdatePayClient(payChannel.getId(), 73 channels.forEach(payChannel -> payClientFactory.createOrUpdatePayClient(payChannel.getId(),
66 payChannel.getCode(), payChannel.getConfig())); 74 payChannel.getCode(), payChannel.getConfig()));
  75 + this.channelCache = channels;
67 }); 76 });
68 } 77 }
69 78
  79 + /**
  80 + * 通过定时任务轮询,刷新缓存
  81 + *
  82 + * 目的:多节点部署时,通过轮询”通知“所有节点,进行刷新
  83 + */
  84 + @Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS)
  85 + public void refreshLocalCache() {
  86 + // 情况一:如果缓存里没有数据,则直接刷新缓存
  87 + if (CollUtil.isEmpty(channelCache)) {
  88 + initLocalCache();
  89 + return;
  90 + }
  91 +
  92 + // 情况二,如果缓存里数据,则通过 updateTime 判断是否有数据变更,有变更则刷新缓存
  93 + LocalDateTime maxTime = CollectionUtils.getMaxValue(channelCache, PayChannelDO::getUpdateTime);
  94 + if (channelMapper.selectCountByUpdateTimeGt(maxTime) > 0) {
  95 + initLocalCache();
  96 + }
  97 + }
  98 +
70 @Override 99 @Override
71 public Long createChannel(PayChannelCreateReqVO reqVO) { 100 public Long createChannel(PayChannelCreateReqVO reqVO) {
72 // 断言是否有重复的 101 // 断言是否有重复的
73 - PayChannelDO channelDO = this.getChannelByConditions(reqVO.getAppId(), reqVO.getCode());  
74 - if (ObjectUtil.isNotNull(channelDO)) { 102 + PayChannelDO dbChannel = getChannelByAppIdAndCode(reqVO.getAppId(), reqVO.getCode());
  103 + if (dbChannel != null) {
75 throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR); 104 throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR);
76 } 105 }
77 106
78 // 新增渠道 107 // 新增渠道
79 - PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO);  
80 - settingConfigAndCheckParam(channel, reqVO.getConfig()); 108 + PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO)
  109 + .setConfig(parseConfig(reqVO.getCode(), reqVO.getConfig()));
81 channelMapper.insert(channel); 110 channelMapper.insert(channel);
82 - // TODO 芋艿:缺少刷新本地缓存的机制 111 +
  112 + // 刷新缓存
  113 + refreshLocalCache();
83 return channel.getId(); 114 return channel.getId();
84 } 115 }
85 116
86 @Override 117 @Override
87 public void updateChannel(PayChannelUpdateReqVO updateReqVO) { 118 public void updateChannel(PayChannelUpdateReqVO updateReqVO) {
88 // 校验存在 119 // 校验存在
89 - this.validateChannelExists(updateReqVO.getId()); 120 + PayChannelDO dbChannel = validateChannelExists(updateReqVO.getId());
  121 +
90 // 更新 122 // 更新
91 - PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO);  
92 - settingConfigAndCheckParam(channel, updateReqVO.getConfig()); 123 + PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO)
  124 + .setConfig(parseConfig(dbChannel.getCode(), updateReqVO.getConfig()));
93 channelMapper.updateById(channel); 125 channelMapper.updateById(channel);
94 - // TODO 芋艿:缺少刷新本地缓存的机制 126 +
  127 + // 刷新缓存
  128 + refreshLocalCache();
  129 + }
  130 +
  131 + /**
  132 + * 解析并校验配置
  133 + *
  134 + * @param code 渠道编码
  135 + * @param configStr 配置
  136 + * @return 支付配置
  137 + */
  138 + private PayClientConfig parseConfig(String code, String configStr) {
  139 + // 解析配置
  140 + Class<? extends PayClientConfig> payClass = PayChannelEnum.getByCode(code).getConfigClass();
  141 + if (ObjectUtil.isNull(payClass)) {
  142 + throw exception(CHANNEL_NOT_EXISTS);
  143 + }
  144 + PayClientConfig config = JsonUtils.parseObject2(configStr, payClass);
  145 + Assert.notNull(config);
  146 +
  147 + // 验证参数
  148 + config.validate(validator);
  149 + return config;
95 } 150 }
96 151
97 @Override 152 @Override
98 public void deleteChannel(Long id) { 153 public void deleteChannel(Long id) {
99 // 校验存在 154 // 校验存在
100 - this.validateChannelExists(id); 155 + validateChannelExists(id);
  156 +
101 // 删除 157 // 删除
102 channelMapper.deleteById(id); 158 channelMapper.deleteById(id);
103 - // TODO 芋艿:缺少刷新本地缓存的机制 159 +
  160 + // 刷新缓存
  161 + refreshLocalCache();
104 } 162 }
105 163
106 - private void validateChannelExists(Long id) {  
107 - if (channelMapper.selectById(id) == null) { 164 + private PayChannelDO validateChannelExists(Long id) {
  165 + PayChannelDO channel = channelMapper.selectById(id);
  166 + if (channel == null) {
108 throw exception(CHANNEL_NOT_EXISTS); 167 throw exception(CHANNEL_NOT_EXISTS);
109 } 168 }
  169 + return channel;
110 } 170 }
111 171
112 @Override 172 @Override
@@ -115,44 +175,19 @@ public class PayChannelServiceImpl implements PayChannelService { @@ -115,44 +175,19 @@ public class PayChannelServiceImpl implements PayChannelService {
115 } 175 }
116 176
117 @Override 177 @Override
118 - public PageResult<PayChannelDO> getChannelPage(PayChannelPageReqVO pageReqVO) {  
119 - return channelMapper.selectPage(pageReqVO);  
120 - }  
121 -  
122 - @Override  
123 public List<PayChannelDO> getChannelListByAppIds(Collection<Long> appIds) { 178 public List<PayChannelDO> getChannelListByAppIds(Collection<Long> appIds) {
124 - return channelMapper.getChannelListByAppIds(appIds); 179 + return channelMapper.selectListByAppIds(appIds);
125 } 180 }
126 181
127 @Override 182 @Override
128 - public PayChannelDO getChannelByConditions(Long appid, String code) {  
129 - return this.channelMapper.selectOne(appid, code);  
130 - }  
131 -  
132 - /**  
133 - * 设置渠道配置以及参数校验  
134 - *  
135 - * @param channel 渠道  
136 - * @param configStr 配置  
137 - */  
138 - private void settingConfigAndCheckParam(PayChannelDO channel, String configStr) {  
139 - // 得到这个渠道是微信的还是支付宝的  
140 - Class<? extends PayClientConfig> payClass = PayChannelEnum.getByCode(channel.getCode()).getConfigClass();  
141 - if (ObjectUtil.isNull(payClass)) {  
142 - throw exception(CHANNEL_NOT_EXISTS);  
143 - }  
144 - // TODO @芋艿:不要使用 hutool 的 json 工具,用项目的  
145 - PayClientConfig config = JSONUtil.toBean(configStr, payClass);  
146 -  
147 - // 验证参数  
148 - config.validate(validator);  
149 - channel.setConfig(config); 183 + public PayChannelDO getChannelByAppIdAndCode(Long appId, String code) {
  184 + return channelMapper.selectByAppIdAndCode(appId, code);
150 } 185 }
151 186
152 @Override 187 @Override
153 public PayChannelDO validPayChannel(Long id) { 188 public PayChannelDO validPayChannel(Long id) {
154 PayChannelDO channel = channelMapper.selectById(id); 189 PayChannelDO channel = channelMapper.selectById(id);
155 - this.validPayChannel(channel); 190 + validPayChannel(channel);
156 return channel; 191 return channel;
157 } 192 }
158 193
@@ -163,18 +198,18 @@ public class PayChannelServiceImpl implements PayChannelService { @@ -163,18 +198,18 @@ public class PayChannelServiceImpl implements PayChannelService {
163 return channel; 198 return channel;
164 } 199 }
165 200
166 - @Override  
167 - public List<PayChannelDO> getEnableChannelList(Long appId) {  
168 - return channelMapper.selectListByAppId(appId, CommonStatusEnum.ENABLE.getStatus());  
169 - }  
170 -  
171 private void validPayChannel(PayChannelDO channel) { 201 private void validPayChannel(PayChannelDO channel) {
172 if (channel == null) { 202 if (channel == null) {
173 - throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_NOT_FOUND); 203 + throw exception(ErrorCodeConstants.PAY_CHANNEL_NOT_FOUND);
174 } 204 }
175 if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) { 205 if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) {
176 - throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_IS_DISABLE); 206 + throw exception(ErrorCodeConstants.PAY_CHANNEL_IS_DISABLE);
177 } 207 }
178 } 208 }
179 209
  210 + @Override
  211 + public List<PayChannelDO> getEnableChannelList(Long appId) {
  212 + return channelMapper.selectListByAppId(appId, CommonStatusEnum.ENABLE.getStatus());
  213 + }
  214 +
180 } 215 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoOrderServiceImpl.java
1 package cn.iocoder.yudao.module.pay.service.demo; 1 package cn.iocoder.yudao.module.pay.service.demo;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 -import cn.hutool.core.util.ObjectUtil;  
5 import cn.iocoder.yudao.framework.common.pojo.PageParam; 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 -import cn.iocoder.yudao.framework.common.util.json.JsonUtils;  
8 import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; 6 import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
9 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; 7 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
10 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; 8 import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
@@ -85,14 +83,14 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -85,14 +83,14 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
85 // 1.2 插入 demo 订单 83 // 1.2 插入 demo 订单
86 PayDemoOrderDO demoOrder = new PayDemoOrderDO().setUserId(userId) 84 PayDemoOrderDO demoOrder = new PayDemoOrderDO().setUserId(userId)
87 .setSpuId(createReqVO.getSpuId()).setSpuName(spuName) 85 .setSpuId(createReqVO.getSpuId()).setSpuName(spuName)
88 - .setPrice(price).setPayed(false).setRefundPrice(0); 86 + .setPrice(price).setPayStatus(false).setRefundPrice(0);
89 payDemoOrderMapper.insert(demoOrder); 87 payDemoOrderMapper.insert(demoOrder);
90 88
91 // 2.1 创建支付单 89 // 2.1 创建支付单
92 Long payOrderId = payOrderApi.createOrder(new PayOrderCreateReqDTO() 90 Long payOrderId = payOrderApi.createOrder(new PayOrderCreateReqDTO()
93 .setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用 91 .setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用
94 .setMerchantOrderId(demoOrder.getId().toString()) // 业务的订单编号 92 .setMerchantOrderId(demoOrder.getId().toString()) // 业务的订单编号
95 - .setSubject(spuName).setBody("").setAmount(price) // 价格信息 93 + .setSubject(spuName).setBody("").setPrice(price) // 价格信息
96 .setExpireTime(addTime(Duration.ofHours(2L)))); // 支付的过期时间 94 .setExpireTime(addTime(Duration.ofHours(2L)))); // 支付的过期时间
97 // 2.2 更新支付单到 demo 订单 95 // 2.2 更新支付单到 demo 订单
98 payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(demoOrder.getId()) 96 payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(demoOrder.getId())
@@ -101,12 +99,6 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -101,12 +99,6 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
101 return demoOrder.getId(); 99 return demoOrder.getId();
102 } 100 }
103 101
104 -// private void validateDemoOrderExists(Long id) {  
105 -// if (demoOrderMapper.selectById(id) == null) {  
106 -// throw exception(DEMO_ORDER_NOT_EXISTS);  
107 -// }  
108 -// }  
109 -  
110 @Override 102 @Override
111 public PayDemoOrderDO getDemoOrder(Long id) { 103 public PayDemoOrderDO getDemoOrder(Long id) {
112 return payDemoOrderMapper.selectById(id); 104 return payDemoOrderMapper.selectById(id);
@@ -124,7 +116,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -124,7 +116,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
124 116
125 // 更新 PayDemoOrderDO 状态为已支付 117 // 更新 PayDemoOrderDO 状态为已支付
126 int updateCount = payDemoOrderMapper.updateByIdAndPayed(id, false, 118 int updateCount = payDemoOrderMapper.updateByIdAndPayed(id, false,
127 - new PayDemoOrderDO().setPayed(true).setPayTime(LocalDateTime.now()) 119 + new PayDemoOrderDO().setPayStatus(true).setPayTime(LocalDateTime.now())
128 .setPayChannelCode(payOrder.getChannelCode())); 120 .setPayChannelCode(payOrder.getChannelCode()));
129 if (updateCount == 0) { 121 if (updateCount == 0) {
130 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID); 122 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
@@ -148,7 +140,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -148,7 +140,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
148 throw exception(PAY_DEMO_ORDER_NOT_FOUND); 140 throw exception(PAY_DEMO_ORDER_NOT_FOUND);
149 } 141 }
150 // 1.2 校验订单未支付 142 // 1.2 校验订单未支付
151 - if (order.getPayed()) { 143 + if (order.getPayStatus()) {
152 log.error("[validateDemoOrderCanPaid][order({}) 不处于待支付状态,请进行处理!order 数据是:{}]", 144 log.error("[validateDemoOrderCanPaid][order({}) 不处于待支付状态,请进行处理!order 数据是:{}]",
153 id, toJsonString(order)); 145 id, toJsonString(order));
154 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID); 146 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
@@ -173,7 +165,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -173,7 +165,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
173 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS); 165 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS);
174 } 166 }
175 // 2.3 校验支付金额一致 167 // 2.3 校验支付金额一致
176 - if (notEqual(payOrder.getAmount(), order.getPrice())) { 168 + if (notEqual(payOrder.getPrice(), order.getPrice())) {
177 log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]", 169 log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]",
178 id, payOrderId, toJsonString(order), toJsonString(payOrder)); 170 id, payOrderId, toJsonString(order), toJsonString(payOrder));
179 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH); 171 throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH);
@@ -196,7 +188,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -196,7 +188,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
196 Long payRefundId = payRefundApi.createPayRefund(new PayRefundCreateReqDTO() 188 Long payRefundId = payRefundApi.createPayRefund(new PayRefundCreateReqDTO()
197 .setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用 189 .setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用
198 .setPayOrderId(order.getPayOrderId()) // 支付单号 190 .setPayOrderId(order.getPayOrderId()) // 支付单号
199 - .setReason("想退钱").setAmount(order.getPrice()));// 价格信息 191 + .setReason("想退钱").setPrice(order.getPrice()));// 价格信息
200 // 2.2 更新退款单到 demo 订单 192 // 2.2 更新退款单到 demo 订单
201 payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(id) 193 payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(id)
202 .setPayRefundId(payRefundId).setRefundPrice(order.getPrice())); 194 .setPayRefundId(payRefundId).setRefundPrice(order.getPrice()));
@@ -209,7 +201,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -209,7 +201,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
209 throw exception(PAY_DEMO_ORDER_NOT_FOUND); 201 throw exception(PAY_DEMO_ORDER_NOT_FOUND);
210 } 202 }
211 // 校验订单是否支付 203 // 校验订单是否支付
212 - if (!order.getPayed()) { 204 + if (!order.getPayStatus()) {
213 throw exception(PAY_DEMO_ORDER_REFUND_FAIL_NOT_PAID); 205 throw exception(PAY_DEMO_ORDER_REFUND_FAIL_NOT_PAID);
214 } 206 }
215 // 校验订单是否已退款 207 // 校验订单是否已退款
@@ -251,7 +243,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService { @@ -251,7 +243,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
251 throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_NOT_SUCCESS); 243 throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_NOT_SUCCESS);
252 } 244 }
253 // 2.3 校验退款金额一致 245 // 2.3 校验退款金额一致
254 - if (notEqual(payRefund.getRefundAmount(), order.getPrice())) { 246 + if (notEqual(payRefund.getRefundPrice(), order.getPrice())) {
255 log.error("[validateDemoOrderCanRefunded][order({}) payRefund({}) 退款金额不匹配,请进行处理!order 数据是:{},payRefund 数据是:{}]", 247 log.error("[validateDemoOrderCanRefunded][order({}) payRefund({}) 退款金额不匹配,请进行处理!order 数据是:{},payRefund 数据是:{}]",
256 id, payRefundId, toJsonString(order), toJsonString(payRefund)); 248 id, payRefundId, toJsonString(order), toJsonString(payRefund));
257 throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_PRICE_NOT_MATCH); 249 throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_PRICE_NOT_MATCH);
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyServiceImpl.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.notify; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.notify;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.exceptions.ExceptionUtil; 4 import cn.hutool.core.exceptions.ExceptionUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.http.HttpResponse; 6 import cn.hutool.http.HttpResponse;
6 import cn.hutool.http.HttpUtil; 7 import cn.hutool.http.HttpUtil;
7 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 8 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -24,10 +25,11 @@ import cn.iocoder.yudao.module.pay.service.order.PayOrderService; @@ -24,10 +25,11 @@ import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
24 import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; 25 import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
25 import lombok.extern.slf4j.Slf4j; 26 import lombok.extern.slf4j.Slf4j;
26 import org.springframework.context.annotation.Lazy; 27 import org.springframework.context.annotation.Lazy;
27 -import org.springframework.scheduling.annotation.Async;  
28 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 28 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
29 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
30 import org.springframework.transaction.annotation.Transactional; 30 import org.springframework.transaction.annotation.Transactional;
  31 +import org.springframework.transaction.support.TransactionSynchronization;
  32 +import org.springframework.transaction.support.TransactionSynchronizationManager;
31 33
32 import javax.annotation.Resource; 34 import javax.annotation.Resource;
33 import javax.validation.Valid; 35 import javax.validation.Valid;
@@ -41,7 +43,6 @@ import java.util.concurrent.CountDownLatch; @@ -41,7 +43,6 @@ import java.util.concurrent.CountDownLatch;
41 import java.util.concurrent.TimeUnit; 43 import java.util.concurrent.TimeUnit;
42 44
43 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime; 45 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
44 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.afterNow;  
45 import static cn.iocoder.yudao.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR; 46 import static cn.iocoder.yudao.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR;
46 47
47 /** 48 /**
@@ -86,6 +87,7 @@ public class PayNotifyServiceImpl implements PayNotifyService { @@ -86,6 +87,7 @@ public class PayNotifyServiceImpl implements PayNotifyService {
86 private PayNotifyServiceImpl self; 87 private PayNotifyServiceImpl self;
87 88
88 @Override 89 @Override
  90 + @Transactional(rollbackFor = Exception.class)
89 public void createPayNotifyTask(PayNotifyTaskCreateReqDTO reqDTO) { 91 public void createPayNotifyTask(PayNotifyTaskCreateReqDTO reqDTO) {
90 PayNotifyTaskDO task = new PayNotifyTaskDO(); 92 PayNotifyTaskDO task = new PayNotifyTaskDO();
91 task.setType(reqDTO.getType()).setDataId(reqDTO.getDataId()); 93 task.setType(reqDTO.getType()).setDataId(reqDTO.getDataId());
@@ -105,8 +107,13 @@ public class PayNotifyServiceImpl implements PayNotifyService { @@ -105,8 +107,13 @@ public class PayNotifyServiceImpl implements PayNotifyService {
105 // 执行插入 107 // 执行插入
106 payNotifyTaskMapper.insert(task); 108 payNotifyTaskMapper.insert(task);
107 109
108 - // 异步直接发起任务。虽然会有定时任务扫描,但是会导致延迟  
109 - self.executeNotifyAsync(task); 110 + // 必须在事务提交后,在发起任务,否则 PayNotifyTaskDO 还没入库,就提前回调接入的业务
  111 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
  112 + @Override
  113 + public void afterCommit() {
  114 + executeNotify(task);
  115 + }
  116 + });
110 } 117 }
111 118
112 @Override 119 @Override
@@ -121,7 +128,7 @@ public class PayNotifyServiceImpl implements PayNotifyService { @@ -121,7 +128,7 @@ public class PayNotifyServiceImpl implements PayNotifyService {
121 CountDownLatch latch = new CountDownLatch(tasks.size()); 128 CountDownLatch latch = new CountDownLatch(tasks.size());
122 tasks.forEach(task -> threadPoolTaskExecutor.execute(() -> { 129 tasks.forEach(task -> threadPoolTaskExecutor.execute(() -> {
123 try { 130 try {
124 - executeNotifySync(task); 131 + executeNotify(task);
125 } finally { 132 } finally {
126 latch.countDown(); 133 latch.countDown();
127 } 134 }
@@ -151,39 +158,30 @@ public class PayNotifyServiceImpl implements PayNotifyService { @@ -151,39 +158,30 @@ public class PayNotifyServiceImpl implements PayNotifyService {
151 } 158 }
152 159
153 /** 160 /**
154 - * 异步执行单个支付通知  
155 - *  
156 - * @param task 通知任务  
157 - */  
158 - @Async  
159 - public void executeNotifyAsync(PayNotifyTaskDO task) {  
160 - self.executeNotifySync(task); // 使用 self,避免事务不发起  
161 - }  
162 -  
163 - /**  
164 * 同步执行单个支付通知 161 * 同步执行单个支付通知
165 * 162 *
166 * @param task 通知任务 163 * @param task 通知任务
167 */ 164 */
168 - public void executeNotifySync(PayNotifyTaskDO task) { 165 + public void executeNotify(PayNotifyTaskDO task) {
169 // 分布式锁,避免并发问题 166 // 分布式锁,避免并发问题
170 payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> { 167 payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> {
171 // 校验,当前任务是否已经被通知过 168 // 校验,当前任务是否已经被通知过
172 // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。 169 // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。
  170 + // 因此,此处我们通过第 notifyTimes 通知次数是否匹配来判断
173 PayNotifyTaskDO dbTask = payNotifyTaskMapper.selectById(task.getId()); 171 PayNotifyTaskDO dbTask = payNotifyTaskMapper.selectById(task.getId());
174 - if (afterNow(dbTask.getNextNotifyTime())) {  
175 - log.info("[executeNotifySync][dbTask({}) 任务被忽略,原因是未到达下次通知时间,可能是因为并发执行了]",  
176 - JsonUtils.toJsonString(dbTask)); 172 + if (ObjectUtil.notEqual(task.getNotifyTimes(), dbTask.getNotifyTimes())) {
  173 + log.warn("[executeNotifySync][task({}) 任务被忽略,原因是它的通知不是第 ({}) 次,可能是因为并发执行了]",
  174 + JsonUtils.toJsonString(task), dbTask.getNotifyTimes());
177 return; 175 return;
178 } 176 }
179 177
180 // 执行通知 178 // 执行通知
181 - self.executeNotify(dbTask); 179 + self.executeNotify0(dbTask);
182 }); 180 });
183 } 181 }
184 182
185 @Transactional 183 @Transactional
186 - public void executeNotify(PayNotifyTaskDO task) { 184 + public void executeNotify0(PayNotifyTaskDO task) {
187 // 发起回调 185 // 发起回调
188 CommonResult<?> invokeResult = null; 186 CommonResult<?> invokeResult = null;
189 Throwable invokeException = null; 187 Throwable invokeException = null;
@@ -223,7 +221,7 @@ public class PayNotifyServiceImpl implements PayNotifyService { @@ -223,7 +221,7 @@ public class PayNotifyServiceImpl implements PayNotifyService {
223 } 221 }
224 // 拼接 header 参数 222 // 拼接 header 参数
225 Map<String, String> headers = new HashMap<>(); 223 Map<String, String> headers = new HashMap<>();
226 - TenantUtils.addTenantHeader(headers); 224 + TenantUtils.addTenantHeader(headers, task.getTenantId());
227 225
228 // 发起请求 226 // 发起请求
229 try (HttpResponse response = HttpUtil.createPost(task.getNotifyUrl()) 227 try (HttpResponse response = HttpUtil.createPost(task.getNotifyUrl())
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java
@@ -33,6 +33,14 @@ public interface PayOrderService { @@ -33,6 +33,14 @@ public interface PayOrderService {
33 PayOrderDO getOrder(Long id); 33 PayOrderDO getOrder(Long id);
34 34
35 /** 35 /**
  36 + * 获得指定应用的订单数量
  37 + *
  38 + * @param appId 应用编号
  39 + * @return 订单数量
  40 + */
  41 + Long getOrderCountByAppId(Long appId);
  42 +
  43 + /**
36 * 获得支付订单 44 * 获得支付订单
37 * 分页 45 * 分页
38 * 46 *
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceImpl.java
1 package cn.iocoder.yudao.module.pay.service.order; 1 package cn.iocoder.yudao.module.pay.service.order;
2 2
3 import cn.hutool.core.date.DateUtil; 3 import cn.hutool.core.date.DateUtil;
  4 +import cn.hutool.core.lang.Pair;
4 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.core.util.RandomUtil; 6 import cn.hutool.core.util.RandomUtil;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
7 import cn.iocoder.yudao.framework.pay.config.PayProperties; 9 import cn.iocoder.yudao.framework.pay.config.PayProperties;
8 import cn.iocoder.yudao.framework.pay.core.client.PayClient; 10 import cn.iocoder.yudao.framework.pay.core.client.PayClient;
9 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; 11 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
@@ -28,6 +30,7 @@ import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants; @@ -28,6 +30,7 @@ import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
28 import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum; 30 import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum;
29 import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum; 31 import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum;
30 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; 32 import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
  33 +import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum;
31 import cn.iocoder.yudao.module.pay.service.app.PayAppService; 34 import cn.iocoder.yudao.module.pay.service.app.PayAppService;
32 import cn.iocoder.yudao.module.pay.service.channel.PayChannelService; 35 import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
33 import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService; 36 import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService;
@@ -41,6 +44,7 @@ import javax.annotation.Resource; @@ -41,6 +44,7 @@ import javax.annotation.Resource;
41 import java.time.LocalDateTime; 44 import java.time.LocalDateTime;
42 import java.util.Collection; 45 import java.util.Collection;
43 import java.util.List; 46 import java.util.List;
  47 +import java.util.Objects;
44 48
45 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 49 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
46 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; 50 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
@@ -79,6 +83,11 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -79,6 +83,11 @@ public class PayOrderServiceImpl implements PayOrderService {
79 } 83 }
80 84
81 @Override 85 @Override
  86 + public Long getOrderCountByAppId(Long appId) {
  87 + return orderMapper.selectCountByAppId(appId);
  88 + }
  89 +
  90 + @Override
82 public PageResult<PayOrderDO> getOrderPage(PayOrderPageReqVO pageReqVO) { 91 public PageResult<PayOrderDO> getOrderPage(PayOrderPageReqVO pageReqVO) {
83 return orderMapper.selectPage(pageReqVO); 92 return orderMapper.selectPage(pageReqVO);
84 } 93 }
@@ -109,22 +118,19 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -109,22 +118,19 @@ public class PayOrderServiceImpl implements PayOrderService {
109 } 118 }
110 119
111 // 创建支付交易单 120 // 创建支付交易单
112 - order = PayOrderConvert.INSTANCE.convert(reqDTO).setAppId(app.getId());  
113 - // 商户相关字段  
114 - order.setNotifyUrl(app.getPayNotifyUrl())  
115 - .setNotifyStatus(PayOrderNotifyStatusEnum.NO.getStatus());  
116 - // 订单相关字段  
117 - order.setStatus(PayOrderStatusEnum.WAITING.getStatus());  
118 - // 退款相关字段  
119 - // todo @芋艿 创建支付的订单的退款状态枚举是不是有问题,应该是 PayRefundTypeEnum 吧 您这填写的是 PayOrderNotifyStatusEnum 回调状态枚举  
120 - order.setRefundStatus(PayOrderNotifyStatusEnum.NO.getStatus())  
121 - .setRefundTimes(0).setRefundAmount(0L); 121 + order = PayOrderConvert.INSTANCE.convert(reqDTO).setAppId(app.getId())
  122 + // 商户相关字段
  123 + .setNotifyUrl(app.getPayNotifyUrl()).setNotifyStatus(PayOrderNotifyStatusEnum.NO.getStatus())
  124 + // 订单相关字段
  125 + .setStatus(PayOrderStatusEnum.WAITING.getStatus())
  126 + // 退款相关字段
  127 + .setRefundStatus(PayRefundTypeEnum.NO.getStatus()).setRefundTimes(0).setRefundPrice(0L);
122 orderMapper.insert(order); 128 orderMapper.insert(order);
123 - // 最终返回  
124 return order.getId(); 129 return order.getId();
125 } 130 }
126 131
127 @Override 132 @Override
  133 + @Transactional(rollbackFor = Exception.class)
128 public PayOrderSubmitRespVO submitPayOrder(PayOrderSubmitReqVO reqVO, String userIp) { 134 public PayOrderSubmitRespVO submitPayOrder(PayOrderSubmitReqVO reqVO, String userIp) {
129 // 1. 获得 PayOrderDO ,并校验其是否存在 135 // 1. 获得 PayOrderDO ,并校验其是否存在
130 PayOrderDO order = validatePayOrderCanSubmit(reqVO.getId()); 136 PayOrderDO order = validatePayOrderCanSubmit(reqVO.getId());
@@ -147,12 +153,18 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -147,12 +153,18 @@ public class PayOrderServiceImpl implements PayOrderService {
147 .setNotifyUrl(genChannelPayNotifyUrl(channel)) 153 .setNotifyUrl(genChannelPayNotifyUrl(channel))
148 .setReturnUrl(reqVO.getReturnUrl()) 154 .setReturnUrl(reqVO.getReturnUrl())
149 // 订单相关字段 155 // 订单相关字段
150 - .setAmount(order.getAmount()).setExpireTime(order.getExpireTime()); 156 + .setAmount(order.getPrice()).setExpireTime(order.getExpireTime());
151 PayOrderUnifiedRespDTO unifiedOrderRespDTO = client.unifiedOrder(unifiedOrderReqDTO); 157 PayOrderUnifiedRespDTO unifiedOrderRespDTO = client.unifiedOrder(unifiedOrderReqDTO);
152 158
153 - // TODO 轮询三方接口,是否已经支付的任务 159 + // 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功
  160 + if (unifiedOrderRespDTO.getNotify() != null) {
  161 + notifyPayOrderSuccess(channel, unifiedOrderRespDTO.getNotify(), null);
  162 + // 此处需要读取最新的状态
  163 + order = orderMapper.selectById(order.getId());
  164 + }
  165 +
154 // 返回成功 166 // 返回成功
155 - return PayOrderConvert.INSTANCE.convert(unifiedOrderRespDTO); 167 + return PayOrderConvert.INSTANCE.convert(order, unifiedOrderRespDTO);
156 } 168 }
157 169
158 private PayOrderDO validatePayOrderCanSubmit(Long id) { 170 private PayOrderDO validatePayOrderCanSubmit(Long id) {
@@ -163,6 +175,9 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -163,6 +175,9 @@ public class PayOrderServiceImpl implements PayOrderService {
163 if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 175 if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
164 throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); 176 throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
165 } 177 }
  178 + if (LocalDateTimeUtils.beforeNow(order.getExpireTime())) { // 校验是否过期
  179 + throw exception(ErrorCodeConstants.PAY_ORDER_IS_EXPIRED);
  180 + }
166 return order; 181 return order;
167 } 182 }
168 183
@@ -214,17 +229,22 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -214,17 +229,22 @@ public class PayOrderServiceImpl implements PayOrderService {
214 public void notifyPayOrder(Long channelId, PayOrderNotifyRespDTO notify, PayNotifyReqDTO rawNotify) { 229 public void notifyPayOrder(Long channelId, PayOrderNotifyRespDTO notify, PayNotifyReqDTO rawNotify) {
215 // 校验支付渠道是否有效 230 // 校验支付渠道是否有效
216 PayChannelDO channel = channelService.validPayChannel(channelId); 231 PayChannelDO channel = channelService.validPayChannel(channelId);
217 - TenantUtils.execute(channel.getTenantId(), () -> {  
218 - // 1. 更新 PayOrderExtensionDO 支付成功  
219 - PayOrderExtensionDO orderExtension = updatePayOrderExtensionSuccess(notify.getOrderExtensionNo(),  
220 - rawNotify);  
221 - // 2. 更新 PayOrderDO 支付成功  
222 - PayOrderDO order = updatePayOrderSuccess(channel, orderExtension, notify);  
223 -  
224 - // 3. 插入支付通知记录  
225 - notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder()  
226 - .type(PayNotifyTypeEnum.ORDER.getType()).dataId(order.getId()).build());  
227 - }); 232 + // 更新支付订单为已支付
  233 + TenantUtils.execute(channel.getTenantId(), () -> notifyPayOrderSuccess(channel, notify, rawNotify));
  234 + }
  235 +
  236 + private void notifyPayOrderSuccess(PayChannelDO channel, PayOrderNotifyRespDTO notify, PayNotifyReqDTO rawNotify) {
  237 + // 1. 更新 PayOrderExtensionDO 支付成功
  238 + PayOrderExtensionDO orderExtension = updatePayOrderExtensionSuccess(notify.getOrderExtensionNo(), rawNotify);
  239 + // 2. 更新 PayOrderDO 支付成功
  240 + Pair<Boolean, PayOrderDO> order = updatePayOrderSuccess(channel, orderExtension, notify);
  241 + if (order.getKey()) { // 如果之前已经成功回调,则直接返回,不用重复记录支付通知记录;例如说:支付平台重复回调
  242 + return;
  243 + }
  244 +
  245 + // 3. 插入支付通知记录
  246 + notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder()
  247 + .type(PayNotifyTypeEnum.ORDER.getType()).dataId(order.getValue().getId()).build());
228 } 248 }
229 249
230 /** 250 /**
@@ -235,15 +255,20 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -235,15 +255,20 @@ public class PayOrderServiceImpl implements PayOrderService {
235 * @return PayOrderExtensionDO 对象 255 * @return PayOrderExtensionDO 对象
236 */ 256 */
237 private PayOrderExtensionDO updatePayOrderExtensionSuccess(String no, PayNotifyReqDTO rawNotify) { 257 private PayOrderExtensionDO updatePayOrderExtensionSuccess(String no, PayNotifyReqDTO rawNotify) {
238 - // 1.1 查询 PayOrderExtensionDO 258 + // 1. 查询 PayOrderExtensionDO
239 PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(no); 259 PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(no);
240 if (orderExtension == null) { 260 if (orderExtension == null) {
241 throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_NOT_FOUND); 261 throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_NOT_FOUND);
242 } 262 }
  263 + if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) { // 如果已经是成功,直接返回,不用重复更新
  264 + log.info("[updatePayOrderSuccess][支付拓展单({}) 已经是已支付,无需更新为已支付]", orderExtension.getId());
  265 + return orderExtension;
  266 + }
243 if (ObjectUtil.notEqual(orderExtension.getStatus(), PayOrderStatusEnum.WAITING.getStatus())) { // 校验状态,必须是待支付 267 if (ObjectUtil.notEqual(orderExtension.getStatus(), PayOrderStatusEnum.WAITING.getStatus())) { // 校验状态,必须是待支付
244 throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); 268 throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
245 } 269 }
246 - // 1.2 更新 PayOrderExtensionDO 270 +
  271 + // 2. 更新 PayOrderExtensionDO
247 int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(), 272 int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(),
248 PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId()) 273 PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId())
249 .status(PayOrderStatusEnum.SUCCESS.getStatus()) 274 .status(PayOrderStatusEnum.SUCCESS.getStatus())
@@ -261,19 +286,26 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -261,19 +286,26 @@ public class PayOrderServiceImpl implements PayOrderService {
261 * @param channel 支付渠道 286 * @param channel 支付渠道
262 * @param orderExtension 支付拓展单 287 * @param orderExtension 支付拓展单
263 * @param notify 通知回调 288 * @param notify 通知回调
264 - * @return PayOrderDO 对象 289 + * @return key:是否之前已经成功回调
  290 + * value:PayOrderDO 对象
265 */ 291 */
266 - private PayOrderDO updatePayOrderSuccess(PayChannelDO channel, PayOrderExtensionDO orderExtension,  
267 - PayOrderNotifyRespDTO notify) {  
268 - // 2.1 判断 PayOrderDO 是否处于待支付 292 + private Pair<Boolean, PayOrderDO> updatePayOrderSuccess(PayChannelDO channel, PayOrderExtensionDO orderExtension,
  293 + PayOrderNotifyRespDTO notify) {
  294 + // 1. 判断 PayOrderDO 是否处于待支付
269 PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId()); 295 PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId());
270 if (order == null) { 296 if (order == null) {
271 throw exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND); 297 throw exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND);
272 } 298 }
  299 + if (PayOrderStatusEnum.isSuccess(order.getStatus()) // 如果已经是成功,直接返回,不用重复更新
  300 + && Objects.equals(order.getSuccessExtensionId(), orderExtension.getId())) {
  301 + log.info("[updatePayOrderSuccess][支付订单({}) 已经是已支付,无需更新为已支付]", order.getId());
  302 + return Pair.of(true, order);
  303 + }
273 if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 304 if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
274 throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); 305 throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
275 } 306 }
276 - // 2.2 更新 PayOrderDO 307 +
  308 + // 2. 更新 PayOrderDO
277 int updateCounts = orderMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(), 309 int updateCounts = orderMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(),
278 PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus()) 310 PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus())
279 .channelId(channel.getId()).channelCode(channel.getCode()) 311 .channelId(channel.getId()).channelCode(channel.getCode())
@@ -284,7 +316,7 @@ public class PayOrderServiceImpl implements PayOrderService { @@ -284,7 +316,7 @@ public class PayOrderServiceImpl implements PayOrderService {
284 throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); 316 throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
285 } 317 }
286 log.info("[updatePayOrderSuccess][支付订单({}) 更新为已支付]", order.getId()); 318 log.info("[updatePayOrderSuccess][支付订单({}) 更新为已支付]", order.getId());
287 - return order; 319 + return Pair.of(false, order);
288 } 320 }
289 321
290 } 322 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundService.java
@@ -26,6 +26,14 @@ public interface PayRefundService { @@ -26,6 +26,14 @@ public interface PayRefundService {
26 PayRefundDO getRefund(Long id); 26 PayRefundDO getRefund(Long id);
27 27
28 /** 28 /**
  29 + * 获得指定应用的退款数量
  30 + *
  31 + * @param appId 应用编号
  32 + * @return 退款数量
  33 + */
  34 + Long getRefundCountByAppId(Long appId);
  35 +
  36 + /**
29 * 获得退款订单分页 37 * 获得退款订单分页
30 * 38 *
31 * @param pageReqVO 分页查询 39 * @param pageReqVO 分页查询
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceImpl.java
@@ -81,6 +81,11 @@ public class PayRefundServiceImpl implements PayRefundService { @@ -81,6 +81,11 @@ public class PayRefundServiceImpl implements PayRefundService {
81 } 81 }
82 82
83 @Override 83 @Override
  84 + public Long getRefundCountByAppId(Long appId) {
  85 + return refundMapper.selectCountByApp(appId);
  86 + }
  87 +
  88 + @Override
84 public PageResult<PayRefundDO> getRefundPage(PayRefundPageReqVO pageReqVO) { 89 public PageResult<PayRefundDO> getRefundPage(PayRefundPageReqVO pageReqVO) {
85 return refundMapper.selectPage(pageReqVO); 90 return refundMapper.selectPage(pageReqVO);
86 } 91 }
@@ -117,7 +122,7 @@ public class PayRefundServiceImpl implements PayRefundService { @@ -117,7 +122,7 @@ public class PayRefundServiceImpl implements PayRefundService {
117 validatePayRefund(reqDTO, order); 122 validatePayRefund(reqDTO, order);
118 // 退款类型 123 // 退款类型
119 PayRefundTypeEnum refundType = PayRefundTypeEnum.SOME; 124 PayRefundTypeEnum refundType = PayRefundTypeEnum.SOME;
120 - if (Objects.equals(reqDTO.getAmount(), order.getAmount())) { 125 + if (Objects.equals(reqDTO.getPrice(), order.getPrice())) {
121 refundType = PayRefundTypeEnum.ALL; 126 refundType = PayRefundTypeEnum.ALL;
122 } 127 }
123 PayOrderExtensionDO orderExtensionDO = orderExtensionService.getOrderExtension(order.getSuccessExtensionId()); 128 PayOrderExtensionDO orderExtensionDO = orderExtensionService.getOrderExtension(order.getSuccessExtensionId());
@@ -144,8 +149,8 @@ public class PayRefundServiceImpl implements PayRefundService { @@ -144,8 +149,8 @@ public class PayRefundServiceImpl implements PayRefundService {
144 .orderId(order.getId()) 149 .orderId(order.getId())
145 .merchantRefundNo(merchantRefundId) // TODO 芋艿:需要优化 150 .merchantRefundNo(merchantRefundId) // TODO 芋艿:需要优化
146 .notifyUrl(app.getRefundNotifyUrl()) 151 .notifyUrl(app.getRefundNotifyUrl())
147 - .payAmount(order.getAmount())  
148 - .refundAmount(reqDTO.getAmount()) 152 + .payPrice(order.getPrice())
  153 + .refundPrice(reqDTO.getPrice())
149 .userIp(reqDTO.getUserIp()) 154 .userIp(reqDTO.getUserIp())
150 .merchantOrderId(order.getMerchantOrderId()) 155 .merchantOrderId(order.getMerchantOrderId())
151 .tradeNo(orderExtensionDO.getNo()) 156 .tradeNo(orderExtensionDO.getNo())
@@ -159,7 +164,7 @@ public class PayRefundServiceImpl implements PayRefundService { @@ -159,7 +164,7 @@ public class PayRefundServiceImpl implements PayRefundService {
159 // TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下; 164 // TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下;
160 PayRefundUnifiedReqDTO unifiedReqDTO = new PayRefundUnifiedReqDTO(); 165 PayRefundUnifiedReqDTO unifiedReqDTO = new PayRefundUnifiedReqDTO();
161 unifiedReqDTO.setUserIp(reqDTO.getUserIp()) 166 unifiedReqDTO.setUserIp(reqDTO.getUserIp())
162 - .setAmount(reqDTO.getAmount()) 167 + .setAmount(reqDTO.getPrice())
163 .setChannelOrderNo(order.getChannelOrderNo()) 168 .setChannelOrderNo(order.getChannelOrderNo())
164 .setPayTradeNo(orderExtensionDO.getNo()) 169 .setPayTradeNo(orderExtensionDO.getNo())
165 .setMerchantRefundId(merchantRefundId) // TODO 芋艿:需要优化 170 .setMerchantRefundId(merchantRefundId) // TODO 芋艿:需要优化
@@ -209,17 +214,17 @@ public class PayRefundServiceImpl implements PayRefundService { @@ -209,17 +214,17 @@ public class PayRefundServiceImpl implements PayRefundService {
209 214
210 // 得到已退金额 215 // 得到已退金额
211 PayOrderDO payOrderDO = orderService.getOrder(refundDO.getOrderId()); 216 PayOrderDO payOrderDO = orderService.getOrder(refundDO.getOrderId());
212 - Long refundedAmount = payOrderDO.getRefundAmount(); 217 + Long refundedAmount = payOrderDO.getRefundPrice();
213 218
214 PayOrderStatusEnum orderStatus = PayOrderStatusEnum.SUCCESS; 219 PayOrderStatusEnum orderStatus = PayOrderStatusEnum.SUCCESS;
215 - if(Objects.equals(payOrderDO.getAmount(), refundedAmount+ refundDO.getRefundAmount())){ 220 + if(Objects.equals(payOrderDO.getPrice(), refundedAmount+ refundDO.getRefundPrice())){
216 //支付金额 = 已退金额 + 本次退款金额。 221 //支付金额 = 已退金额 + 本次退款金额。
217 orderStatus = PayOrderStatusEnum.CLOSED; 222 orderStatus = PayOrderStatusEnum.CLOSED;
218 } 223 }
219 // 更新支付订单 224 // 更新支付订单
220 PayOrderDO updateOrderDO = new PayOrderDO(); 225 PayOrderDO updateOrderDO = new PayOrderDO();
221 updateOrderDO.setId(refundDO.getOrderId()) 226 updateOrderDO.setId(refundDO.getOrderId())
222 - .setRefundAmount(refundedAmount + refundDO.getRefundAmount()) 227 + .setRefundPrice(refundedAmount + refundDO.getRefundPrice())
223 .setStatus(orderStatus.getStatus()) 228 .setStatus(orderStatus.getStatus())
224 .setRefundTimes(payOrderDO.getRefundTimes() + 1) 229 .setRefundTimes(payOrderDO.getRefundTimes() + 1)
225 .setRefundStatus(refundDO.getType()); 230 .setRefundStatus(refundDO.getType());
@@ -257,8 +262,8 @@ public class PayRefundServiceImpl implements PayRefundService { @@ -257,8 +262,8 @@ public class PayRefundServiceImpl implements PayRefundService {
257 throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_ALL_REFUNDED); 262 throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_ALL_REFUNDED);
258 } 263 }
259 // 校验金额 退款金额不能大于 原定的金额 264 // 校验金额 退款金额不能大于 原定的金额
260 - if (reqDTO.getAmount() + order.getRefundAmount() > order.getAmount()){  
261 - throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_AMOUNT_EXCEED); 265 + if (reqDTO.getPrice() + order.getRefundPrice() > order.getPrice()){
  266 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_PRICE_PRICE_EXCEED);
262 } 267 }
263 // 校验渠道订单号 268 // 校验渠道订单号
264 if (StrUtil.isEmpty(order.getChannelOrderNo())) { 269 if (StrUtil.isEmpty(order.getChannelOrderNo())) {
yudao-module-pay/yudao-module-pay-biz/src/test-integration/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceIntegrationTest.java
@@ -30,7 +30,7 @@ public class PayOrderServiceIntegrationTest extends BaseDbIntegrationTest { @@ -30,7 +30,7 @@ public class PayOrderServiceIntegrationTest extends BaseDbIntegrationTest {
30 reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis())); 30 reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis()));
31 reqDTO.setSubject("标题"); 31 reqDTO.setSubject("标题");
32 reqDTO.setBody("内容"); 32 reqDTO.setBody("内容");
33 - reqDTO.setAmount(100); 33 + reqDTO.setPrice(100);
34 reqDTO.setExpireTime(DateUtils.addTime(Duration.ofDays(1))); 34 reqDTO.setExpireTime(DateUtils.addTime(Duration.ofDays(1)));
35 // 发起请求 35 // 发起请求
36 payOrderService.createPayOrder(reqDTO); 36 payOrderService.createPayOrder(reqDTO);
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/app/PayAppServiceTest.java
@@ -3,27 +3,42 @@ package cn.iocoder.yudao.module.pay.service.app; @@ -3,27 +3,42 @@ package cn.iocoder.yudao.module.pay.service.app;
3 import cn.hutool.core.util.RandomUtil; 3 import cn.hutool.core.util.RandomUtil;
4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
6 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 7 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  8 +import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
7 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO; 9 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO;
8 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO; 10 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO;
9 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO; 11 import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
10 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; 12 import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
11 import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper; 13 import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper;
  14 +import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
  15 +import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
12 import org.junit.jupiter.api.Test; 16 import org.junit.jupiter.api.Test;
  17 +import org.springframework.boot.test.mock.mockito.MockBean;
13 import org.springframework.context.annotation.Import; 18 import org.springframework.context.annotation.Import;
14 19
15 import javax.annotation.Resource; 20 import javax.annotation.Resource;
16 import java.time.LocalDateTime; 21 import java.time.LocalDateTime;
  22 +import java.util.Collections;
  23 +import java.util.Map;
17 24
  25 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
18 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime; 26 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
19 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; 27 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
20 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; 28 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
21 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; 29 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
22 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;  
23 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;  
24 -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_APP_NOT_FOUND; 30 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  31 +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*;
  32 +import static java.util.Collections.singleton;
25 import static org.junit.jupiter.api.Assertions.*; 33 import static org.junit.jupiter.api.Assertions.*;
  34 +import static org.mockito.ArgumentMatchers.eq;
  35 +import static org.mockito.Mockito.when;
26 36
  37 +/**
  38 + * {@link PayAppServiceImpl} 的单元测试
  39 + *
  40 + * @author aquan
  41 + */
27 @Import(PayAppServiceImpl.class) 42 @Import(PayAppServiceImpl.class)
28 public class PayAppServiceTest extends BaseDbUnitTest { 43 public class PayAppServiceTest extends BaseDbUnitTest {
29 44
@@ -33,17 +48,23 @@ public class PayAppServiceTest extends BaseDbUnitTest { @@ -33,17 +48,23 @@ public class PayAppServiceTest extends BaseDbUnitTest {
33 @Resource 48 @Resource
34 private PayAppMapper appMapper; 49 private PayAppMapper appMapper;
35 50
  51 + @MockBean
  52 + private PayOrderService orderService;
  53 + @MockBean
  54 + private PayRefundService refundService;
  55 +
36 @Test 56 @Test
37 public void testCreateApp_success() { 57 public void testCreateApp_success() {
38 // 准备参数 58 // 准备参数
39 PayAppCreateReqVO reqVO = randomPojo(PayAppCreateReqVO.class, o -> 59 PayAppCreateReqVO reqVO = randomPojo(PayAppCreateReqVO.class, o ->
40 - o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))); 60 + o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))
  61 + .setPayNotifyUrl(randomURL())
  62 + .setRefundNotifyUrl(randomURL()));
41 63
42 // 调用 64 // 调用
43 Long appId = appService.createApp(reqVO); 65 Long appId = appService.createApp(reqVO);
44 // 断言 66 // 断言
45 assertNotNull(appId); 67 assertNotNull(appId);
46 - // 校验记录的属性是否正确  
47 PayAppDO app = appMapper.selectById(appId); 68 PayAppDO app = appMapper.selectById(appId);
48 assertPojoEquals(reqVO, app); 69 assertPojoEquals(reqVO, app);
49 } 70 }
@@ -51,12 +72,12 @@ public class PayAppServiceTest extends BaseDbUnitTest { @@ -51,12 +72,12 @@ public class PayAppServiceTest extends BaseDbUnitTest {
51 @Test 72 @Test
52 public void testUpdateApp_success() { 73 public void testUpdateApp_success() {
53 // mock 数据 74 // mock 数据
54 - PayAppDO dbApp = randomPojo(PayAppDO.class, o ->  
55 - o.setStatus(CommonStatusEnum.DISABLE.getStatus())); 75 + PayAppDO dbApp = randomPojo(PayAppDO.class);
56 appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 76 appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
57 // 准备参数 77 // 准备参数
58 PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> { 78 PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> {
59 o.setStatus(CommonStatusEnum.ENABLE.getStatus()); 79 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  80 + o.setPayNotifyUrl(randomURL()).setRefundNotifyUrl(randomURL());
60 o.setId(dbApp.getId()); // 设置更新的 ID 81 o.setId(dbApp.getId()); // 设置更新的 ID
61 }); 82 });
62 83
@@ -77,10 +98,26 @@ public class PayAppServiceTest extends BaseDbUnitTest { @@ -77,10 +98,26 @@ public class PayAppServiceTest extends BaseDbUnitTest {
77 } 98 }
78 99
79 @Test 100 @Test
80 - public void testDeleteApp_success() { 101 + public void testUpdateAppStatus() {
81 // mock 数据 102 // mock 数据
82 PayAppDO dbApp = randomPojo(PayAppDO.class, o -> 103 PayAppDO dbApp = randomPojo(PayAppDO.class, o ->
83 - o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))); 104 + o.setStatus(CommonStatusEnum.DISABLE.getStatus()));
  105 + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
  106 +
  107 + // 准备参数
  108 + Long id = dbApp.getId();
  109 + Integer status = CommonStatusEnum.ENABLE.getStatus();
  110 + // 调用
  111 + appService.updateAppStatus(id, status);
  112 + // 断言
  113 + PayAppDO app = appMapper.selectById(id); // 获取最新的
  114 + assertEquals(status, app.getStatus());
  115 + }
  116 +
  117 + @Test
  118 + public void testDeleteApp_success() {
  119 + // mock 数据
  120 + PayAppDO dbApp = randomPojo(PayAppDO.class);
84 appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 121 appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
85 // 准备参数 122 // 准备参数
86 Long id = dbApp.getId(); 123 Long id = dbApp.getId();
@@ -101,14 +138,70 @@ public class PayAppServiceTest extends BaseDbUnitTest { @@ -101,14 +138,70 @@ public class PayAppServiceTest extends BaseDbUnitTest {
101 } 138 }
102 139
103 @Test 140 @Test
  141 + public void testDeleteApp_existOrder() {
  142 + // mock 数据
  143 + PayAppDO dbApp = randomPojo(PayAppDO.class);
  144 + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
  145 + // 准备参数
  146 + Long id = dbApp.getId();
  147 + // mock 订单有订单
  148 + when(orderService.getOrderCountByAppId(eq(id))).thenReturn(10L);
  149 +
  150 + // 调用, 并断言异常
  151 + assertServiceException(() -> appService.deleteApp(id), PAY_APP_EXIST_ORDER_CANT_DELETE);
  152 + }
  153 +
  154 + @Test
  155 + public void testDeleteApp_existRefund() {
  156 + // mock 数据
  157 + PayAppDO dbApp = randomPojo(PayAppDO.class);
  158 + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
  159 + // 准备参数
  160 + Long id = dbApp.getId();
  161 + // mock 订单有订单
  162 + when(refundService.getRefundCountByAppId(eq(id))).thenReturn(10L);
  163 +
  164 + // 调用, 并断言异常
  165 + assertServiceException(() -> appService.deleteApp(id), PAY_APP_EXIST_REFUND_CANT_DELETE);
  166 + }
  167 +
  168 + @Test
  169 + public void testApp() {
  170 + // mock 数据
  171 + PayAppDO dbApp = randomPojo(PayAppDO.class);
  172 + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
  173 + // 准备参数
  174 + Long id = dbApp.getId();
  175 +
  176 + // 调用
  177 + PayAppDO app = appService.getApp(id);
  178 + // 校验数据一致
  179 + assertPojoEquals(app, dbApp);
  180 + }
  181 +
  182 + @Test
  183 + public void testAppMap() {
  184 + // mock 数据
  185 + PayAppDO dbApp01 = randomPojo(PayAppDO.class);
  186 + appMapper.insert(dbApp01);// @Sql: 先插入出一条存在的数据
  187 + PayAppDO dbApp02 = randomPojo(PayAppDO.class);
  188 + appMapper.insert(dbApp02);// @Sql: 先插入出一条存在的数据
  189 + // 准备参数
  190 + Long id = dbApp01.getId();
  191 +
  192 + // 调用
  193 + Map<Long, PayAppDO> appMap = appService.getAppMap(singleton(id));
  194 + // 校验数据一致
  195 + assertEquals(1, appMap.size());
  196 + assertPojoEquals(dbApp01, appMap.get(id));
  197 + }
  198 +
  199 + @Test
104 public void testGetAppPage() { 200 public void testGetAppPage() {
105 // mock 数据 201 // mock 数据
106 PayAppDO dbApp = randomPojo(PayAppDO.class, o -> { // 等会查询到 202 PayAppDO dbApp = randomPojo(PayAppDO.class, o -> { // 等会查询到
107 o.setName("灿灿姐的杂货铺"); 203 o.setName("灿灿姐的杂货铺");
108 o.setStatus(CommonStatusEnum.ENABLE.getStatus()); 204 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
109 - o.setRemark("敏敏姐的小卖铺");  
110 - o.setPayNotifyUrl("https://www.hc.com");  
111 - o.setRefundNotifyUrl("https://www.xm.com");  
112 o.setCreateTime(buildTime(2021,11,20)); 205 o.setCreateTime(buildTime(2021,11,20));
113 }); 206 });
114 207
@@ -117,22 +210,13 @@ public class PayAppServiceTest extends BaseDbUnitTest { @@ -117,22 +210,13 @@ public class PayAppServiceTest extends BaseDbUnitTest {
117 appMapper.insert(cloneIgnoreId(dbApp, o -> o.setName("敏敏姐的杂货铺"))); 210 appMapper.insert(cloneIgnoreId(dbApp, o -> o.setName("敏敏姐的杂货铺")));
118 // 测试 status 不匹配 211 // 测试 status 不匹配
119 appMapper.insert(cloneIgnoreId(dbApp, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); 212 appMapper.insert(cloneIgnoreId(dbApp, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
120 - // 测试 remark 不匹配  
121 - appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRemark("灿灿姐的小卖部")));  
122 - // 测试 payNotifyUrl 不匹配  
123 - appMapper.insert(cloneIgnoreId(dbApp, o -> o.setPayNotifyUrl("xm.com")));  
124 - // 测试 refundNotifyUrl 不匹配  
125 - appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRefundNotifyUrl("hc.com")));  
126 // 测试 createTime 不匹配 213 // 测试 createTime 不匹配
127 appMapper.insert(cloneIgnoreId(dbApp, o -> o.setCreateTime(buildTime(2021,12,21)))); 214 appMapper.insert(cloneIgnoreId(dbApp, o -> o.setCreateTime(buildTime(2021,12,21))));
128 // 准备参数 215 // 准备参数
129 PayAppPageReqVO reqVO = new PayAppPageReqVO(); 216 PayAppPageReqVO reqVO = new PayAppPageReqVO();
130 reqVO.setName("灿灿姐的杂货铺"); 217 reqVO.setName("灿灿姐的杂货铺");
131 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); 218 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
132 - reqVO.setRemark("敏敏姐的小卖铺");  
133 - reqVO.setPayNotifyUrl("https://www.hc.com");  
134 - reqVO.setRefundNotifyUrl("https://www.xm.com");  
135 - reqVO.setCreateTime((new LocalDateTime[]{buildTime(2021,11,19),buildTime(2021,11,21)})); 219 + reqVO.setCreateTime(buildBetweenTime(2021, 11, 19, 2021, 11, 21));
136 220
137 // 调用 221 // 调用
138 PageResult<PayAppDO> pageResult = appService.getAppPage(reqVO); 222 PageResult<PayAppDO> pageResult = appService.getAppPage(reqVO);
@@ -142,4 +226,37 @@ public class PayAppServiceTest extends BaseDbUnitTest { @@ -142,4 +226,37 @@ public class PayAppServiceTest extends BaseDbUnitTest {
142 assertPojoEquals(dbApp, pageResult.getList().get(0)); 226 assertPojoEquals(dbApp, pageResult.getList().get(0));
143 } 227 }
144 228
  229 + @Test
  230 + public void testValidPayApp_success() {
  231 + // mock 数据
  232 + PayAppDO dbApp = randomPojo(PayAppDO.class,
  233 + o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
  234 + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
  235 + // 准备参数
  236 + Long id = dbApp.getId();
  237 +
  238 + // 调用
  239 + PayAppDO app = appService.validPayApp(id);
  240 + // 校验数据一致
  241 + assertPojoEquals(app, dbApp);
  242 + }
  243 +
  244 + @Test
  245 + public void testValidPayApp_notFound() {
  246 + assertServiceException(() -> appService.validPayApp(randomLongId()), PAY_APP_NOT_FOUND);
  247 + }
  248 +
  249 + @Test
  250 + public void testValidPayApp_disable() {
  251 + // mock 数据
  252 + PayAppDO dbApp = randomPojo(PayAppDO.class,
  253 + o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()));
  254 + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
  255 + // 准备参数
  256 + Long id = dbApp.getId();
  257 +
  258 + // 调用,并断言异常
  259 + assertServiceException(() -> appService.validPayApp(id), PAY_APP_IS_DISABLE);
  260 + }
  261 +
145 } 262 }
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/channel/PayChannelServiceTest.java
1 package cn.iocoder.yudao.module.pay.service.channel; 1 package cn.iocoder.yudao.module.pay.service.channel;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 +import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
5 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; 5 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
6 import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; 6 import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
7 import cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig; 7 import cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig;
8 import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum; 8 import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
9 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 9 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
10 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO; 10 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
11 -import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;  
12 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO; 11 import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
13 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO; 12 import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
14 import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper; 13 import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper;
15 import com.alibaba.fastjson.JSON; 14 import com.alibaba.fastjson.JSON;
  15 +import org.junit.jupiter.api.BeforeEach;
16 import org.junit.jupiter.api.Test; 16 import org.junit.jupiter.api.Test;
17 import org.springframework.boot.test.mock.mockito.MockBean; 17 import org.springframework.boot.test.mock.mockito.MockBean;
18 import org.springframework.context.annotation.Import; 18 import org.springframework.context.annotation.Import;
19 19
20 import javax.annotation.Resource; 20 import javax.annotation.Resource;
21 import javax.validation.Validator; 21 import javax.validation.Validator;
22 -import java.time.LocalDateTime;  
23 22
24 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;  
25 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; 23 +import java.util.Collections;
  24 +import java.util.List;
  25 +
26 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; 26 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
27 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; 27 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
28 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;  
29 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; 28 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  29 +import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_EXIST_SAME_CHANNEL_ERROR;
30 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_EXISTS; 30 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_EXISTS;
31 import static org.junit.jupiter.api.Assertions.*; 31 import static org.junit.jupiter.api.Assertions.*;
32 32
33 @Import({PayChannelServiceImpl.class}) 33 @Import({PayChannelServiceImpl.class})
34 public class PayChannelServiceTest extends BaseDbUnitTest { 34 public class PayChannelServiceTest extends BaseDbUnitTest {
35 35
  36 + private static final String ALIPAY_SERVER_URL = "https://openapi.alipay.com/gateway.do";
  37 +
36 @Resource 38 @Resource
37 private PayChannelServiceImpl channelService; 39 private PayChannelServiceImpl channelService;
38 40
@@ -44,110 +46,62 @@ public class PayChannelServiceTest extends BaseDbUnitTest { @@ -44,110 +46,62 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
44 @MockBean 46 @MockBean
45 private Validator validator; 47 private Validator validator;
46 48
47 - @Test  
48 - public void testCreateWechatVersion2Channel_success() {  
49 - // 准备参数  
50 - WxPayClientConfig v2Config = getV2Config();  
51 - PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {  
52 - o.setCode(PayChannelEnum.WX_PUB.getCode());  
53 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
54 - o.setConfig(JSON.toJSONString(v2Config));  
55 - });  
56 -  
57 - // 调用  
58 - Long channelId = channelService.createChannel(reqVO);  
59 - // 断言  
60 - assertNotNull(channelId);  
61 - // 校验记录的属性是否正确  
62 - PayChannelDO channel = channelMapper.selectById(channelId);  
63 - assertPojoEquals(reqVO, channel, "config");  
64 - // 关于config 对象应该拿出来重新对比  
65 - assertPojoEquals(v2Config, channel.getConfig()); 49 + @BeforeEach
  50 + public void setUp() {
  51 + channelService.setChannelCache(null);
66 } 52 }
67 53
68 @Test 54 @Test
69 - public void testCreateWechatVersion3Channel_success() { 55 + public void testCreateChannel_success() {
70 // 准备参数 56 // 准备参数
71 - WxPayClientConfig v3Config = getV3Config(); 57 + WxPayClientConfig config = randomWxPayClientConfig();
72 PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { 58 PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
  59 + o.setStatus(randomCommonStatus());
73 o.setCode(PayChannelEnum.WX_PUB.getCode()); 60 o.setCode(PayChannelEnum.WX_PUB.getCode());
74 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
75 - o.setConfig(JSON.toJSONString(v3Config)); 61 + o.setConfig(JsonUtils.toJsonString(config));
76 }); 62 });
77 63
78 // 调用 64 // 调用
79 Long channelId = channelService.createChannel(reqVO); 65 Long channelId = channelService.createChannel(reqVO);
80 - // 断言  
81 - assertNotNull(channelId);  
82 // 校验记录的属性是否正确 66 // 校验记录的属性是否正确
83 PayChannelDO channel = channelMapper.selectById(channelId); 67 PayChannelDO channel = channelMapper.selectById(channelId);
84 assertPojoEquals(reqVO, channel, "config"); 68 assertPojoEquals(reqVO, channel, "config");
85 - // 关于config 对象应该拿出来重新对比  
86 - assertPojoEquals(v3Config, channel.getConfig()); 69 + assertPojoEquals(config, channel.getConfig());
  70 + // 校验缓存
  71 + assertEquals(1, channelService.getChannelCache().size());
  72 + assertEquals(channel, channelService.getChannelCache().get(0));
87 } 73 }
88 74
89 @Test 75 @Test
90 - public void testCreateAliPayPublicKeyChannel_success() {  
91 - // 准备参数  
92 -  
93 - AlipayPayClientConfig payClientConfig = getPublicKeyConfig();  
94 - PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {  
95 - o.setCode(PayChannelEnum.ALIPAY_APP.getCode());  
96 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
97 - o.setConfig(JSON.toJSONString(payClientConfig));  
98 - });  
99 -  
100 - // 调用  
101 - Long channelId = channelService.createChannel(reqVO);  
102 - // 断言  
103 - assertNotNull(channelId);  
104 - // 校验记录的属性是否正确  
105 - PayChannelDO channel = channelMapper.selectById(channelId);  
106 - assertPojoEquals(reqVO, channel, "config");  
107 - // 关于config 对象应该拿出来重新对比  
108 - assertPojoEquals(payClientConfig, channel.getConfig());  
109 -  
110 - }  
111 -  
112 - @Test  
113 - public void testCreateAliPayCertificateChannel_success() { 76 + public void testCreateChannel_exists() {
  77 + // mock 数据
  78 + PayChannelDO dbChannel = randomPojo(PayChannelDO.class,
  79 + o -> o.setConfig(randomWxPayClientConfig()));
  80 + channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
114 // 准备参数 81 // 准备参数
115 -  
116 - AlipayPayClientConfig payClientConfig = getCertificateConfig();  
117 PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { 82 PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
118 - o.setCode(PayChannelEnum.ALIPAY_APP.getCode());  
119 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
120 - o.setConfig(JSON.toJSONString(payClientConfig)); 83 + o.setAppId(dbChannel.getAppId());
  84 + o.setCode(dbChannel.getCode());
121 }); 85 });
122 86
123 - // 调用  
124 - Long channelId = channelService.createChannel(reqVO);  
125 - // 断言  
126 - assertNotNull(channelId);  
127 - // 校验记录的属性是否正确  
128 - PayChannelDO channel = channelMapper.selectById(channelId);  
129 - assertPojoEquals(reqVO, channel, "config");  
130 - // 关于config 对象应该拿出来重新对比  
131 - assertPojoEquals(payClientConfig, channel.getConfig()); 87 + // 调用, 并断言异常
  88 + assertServiceException(() -> channelService.createChannel(reqVO), CHANNEL_EXIST_SAME_CHANNEL_ERROR);
132 } 89 }
133 90
134 @Test 91 @Test
135 public void testUpdateChannel_success() { 92 public void testUpdateChannel_success() {
136 // mock 数据 93 // mock 数据
137 - AlipayPayClientConfig payClientConfig = getCertificateConfig();  
138 PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { 94 PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
139 o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); 95 o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
140 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
141 - o.setConfig(payClientConfig); 96 + o.setConfig(randomAlipayPayClientConfig());
142 }); 97 });
143 channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 98 channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
144 // 准备参数 99 // 准备参数
145 - AlipayPayClientConfig payClientPublicKeyConfig = getPublicKeyConfig(); 100 + AlipayPayClientConfig config = randomAlipayPayClientConfig();
146 PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> { 101 PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> {
147 - o.setCode(dbChannel.getCode());  
148 - o.setStatus(dbChannel.getStatus());  
149 - o.setConfig(JSON.toJSONString(payClientPublicKeyConfig));  
150 o.setId(dbChannel.getId()); // 设置更新的 ID 102 o.setId(dbChannel.getId()); // 设置更新的 ID
  103 + o.setStatus(randomCommonStatus());
  104 + o.setConfig(JsonUtils.toJsonString(config));
151 }); 105 });
152 106
153 // 调用 107 // 调用
@@ -155,15 +109,17 @@ public class PayChannelServiceTest extends BaseDbUnitTest { @@ -155,15 +109,17 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
155 // 校验是否更新正确 109 // 校验是否更新正确
156 PayChannelDO channel = channelMapper.selectById(reqVO.getId()); // 获取最新的 110 PayChannelDO channel = channelMapper.selectById(reqVO.getId()); // 获取最新的
157 assertPojoEquals(reqVO, channel, "config"); 111 assertPojoEquals(reqVO, channel, "config");
158 - assertPojoEquals(payClientPublicKeyConfig, channel.getConfig()); 112 + assertPojoEquals(config, channel.getConfig());
  113 + // 校验缓存
  114 + assertEquals(1, channelService.getChannelCache().size());
  115 + assertEquals(channel, channelService.getChannelCache().get(0));
159 } 116 }
160 117
161 @Test 118 @Test
162 public void testUpdateChannel_notExists() { 119 public void testUpdateChannel_notExists() {
163 // 准备参数 120 // 准备参数
164 - AlipayPayClientConfig payClientPublicKeyConfig = getPublicKeyConfig(); 121 + AlipayPayClientConfig payClientPublicKeyConfig = randomAlipayPayClientConfig();
165 PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> { 122 PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> {
166 - o.setCode(PayChannelEnum.ALIPAY_APP.getCode());  
167 o.setStatus(CommonStatusEnum.ENABLE.getStatus()); 123 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
168 o.setConfig(JSON.toJSONString(payClientPublicKeyConfig)); 124 o.setConfig(JSON.toJSONString(payClientPublicKeyConfig));
169 }); 125 });
@@ -175,11 +131,9 @@ public class PayChannelServiceTest extends BaseDbUnitTest { @@ -175,11 +131,9 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
175 @Test 131 @Test
176 public void testDeleteChannel_success() { 132 public void testDeleteChannel_success() {
177 // mock 数据 133 // mock 数据
178 - AlipayPayClientConfig payClientConfig = getCertificateConfig();  
179 PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { 134 PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
180 o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); 135 o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
181 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
182 - o.setConfig(payClientConfig); 136 + o.setConfig(randomAlipayPayClientConfig());
183 }); 137 });
184 channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 138 channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
185 // 准备参数 139 // 准备参数
@@ -189,6 +143,8 @@ public class PayChannelServiceTest extends BaseDbUnitTest { @@ -189,6 +143,8 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
189 channelService.deleteChannel(id); 143 channelService.deleteChannel(id);
190 // 校验数据不存在了 144 // 校验数据不存在了
191 assertNull(channelMapper.selectById(id)); 145 assertNull(channelMapper.selectById(id));
  146 + // 校验缓存
  147 + assertEquals(0, channelService.getChannelCache().size());
192 } 148 }
193 149
194 @Test 150 @Test
@@ -200,119 +156,80 @@ public class PayChannelServiceTest extends BaseDbUnitTest { @@ -200,119 +156,80 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
200 assertServiceException(() -> channelService.deleteChannel(id), CHANNEL_NOT_EXISTS); 156 assertServiceException(() -> channelService.deleteChannel(id), CHANNEL_NOT_EXISTS);
201 } 157 }
202 158
203 - @Test // TODO 请修改 null 为需要的值  
204 - public void testGetChannelPage() { 159 + @Test
  160 + public void testGetChannel() {
205 // mock 数据 161 // mock 数据
206 - AlipayPayClientConfig payClientConfig = getCertificateConfig();  
207 - PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { // 等会查询到 162 + PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
208 o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); 163 o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
209 - o.setStatus(CommonStatusEnum.ENABLE.getStatus());  
210 - o.setRemark("灿灿子的支付渠道");  
211 - o.setFeeRate(0.03);  
212 - o.setAppId(1L);  
213 - o.setConfig(payClientConfig);  
214 - o.setCreateTime(buildTime(2021,11,20)); 164 + o.setConfig(randomAlipayPayClientConfig());
215 }); 165 });
216 - channelMapper.insert(dbChannel);  
217 - // 执行拷贝的时候会出现异常,所以在插入后要重置为null 后续在写入新的  
218 - dbChannel.setConfig(null);  
219 - // 测试 code 不匹配  
220 - channelMapper.insert(cloneIgnoreId(dbChannel, o -> {  
221 - o.setConfig(payClientConfig);  
222 - o.setCode(PayChannelEnum.WX_PUB.getCode());  
223 - }));  
224 - // 测试 status 不匹配  
225 - channelMapper.insert(cloneIgnoreId(dbChannel, o -> {  
226 - o.setConfig(payClientConfig);  
227 - o.setStatus(CommonStatusEnum.DISABLE.getStatus());  
228 - }));  
229 - // 测试 remark 不匹配  
230 - channelMapper.insert(cloneIgnoreId(dbChannel, o ->{  
231 - o.setConfig(payClientConfig);  
232 - o.setRemark("敏敏子的渠道");  
233 - }));  
234 - // 测试 feeRate 不匹配  
235 - channelMapper.insert(cloneIgnoreId(dbChannel, o -> {  
236 - o.setConfig(payClientConfig);  
237 - o.setFeeRate(1.23);  
238 - }));  
239 - // 测试 appId 不匹配  
240 - channelMapper.insert(cloneIgnoreId(dbChannel, o -> {  
241 - o.setConfig(payClientConfig);  
242 - o.setAppId(2L);  
243 - }));  
244 - // 测试 createTime 不匹配  
245 - channelMapper.insert(cloneIgnoreId(dbChannel, o -> {  
246 - o.setConfig(payClientConfig);  
247 - o.setCreateTime(buildTime(2021, 10, 20));  
248 - })); 166 + channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
249 // 准备参数 167 // 准备参数
250 - PayChannelPageReqVO reqVO = new PayChannelPageReqVO();  
251 - reqVO.setCode(PayChannelEnum.ALIPAY_APP.getCode());  
252 - reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());  
253 - reqVO.setRemark("灿灿子的支付渠道");  
254 - reqVO.setFeeRate(0.03);  
255 - reqVO.setAppId(1L);  
256 - reqVO.setConfig(JSON.toJSONString(payClientConfig));  
257 - reqVO.setCreateTime((new LocalDateTime[]{buildTime(2021,11,19),buildTime(2021,11,21)})); 168 + Long id = dbChannel.getId();
258 169
259 // 调用 170 // 调用
260 - PageResult<PayChannelDO> pageResult = channelService.getChannelPage(reqVO);  
261 - // 断言  
262 - assertEquals(1, pageResult.getTotal());  
263 - assertEquals(1, pageResult.getList().size());  
264 - assertPojoEquals(dbChannel, pageResult.getList().get(0), "config");  
265 - assertPojoEquals(payClientConfig, pageResult.getList().get(0).getConfig());  
266 - 171 + PayChannelDO channel = channelService.getChannel(id);
  172 + // 校验是否更新正确
  173 + assertPojoEquals(dbChannel, channel);
267 } 174 }
268 175
269 - public WxPayClientConfig getV2Config() {  
270 - return new WxPayClientConfig()  
271 - .setAppId("APP00001")  
272 - .setMchId("MCH00001")  
273 - .setApiVersion(WxPayClientConfig.API_VERSION_V2)  
274 - .setMchKey("dsa1d5s6a1d6sa16d1sa56d15a61das6")  
275 - .setApiV3Key("")  
276 - .setPrivateCertContent("")  
277 - .setPrivateKeyContent(""); 176 + @Test
  177 + public void testGetChannelListByAppIds() {
  178 + // mock 数据
  179 + PayChannelDO dbChannel01 = randomPojo(PayChannelDO.class, o -> {
  180 + o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
  181 + o.setConfig(randomAlipayPayClientConfig());
  182 + });
  183 + channelMapper.insert(dbChannel01);// @Sql: 先插入出一条存在的数据
  184 + PayChannelDO dbChannel02 = randomPojo(PayChannelDO.class, o -> {
  185 + o.setCode(PayChannelEnum.WX_PUB.getCode());
  186 + o.setConfig(randomWxPayClientConfig());
  187 + });
  188 + channelMapper.insert(dbChannel02);// @Sql: 先插入出一条存在的数据
  189 + // 准备参数
  190 + Long appId = dbChannel01.getAppId();
  191 +
  192 + // 调用
  193 + List<PayChannelDO> channels = channelService.getChannelListByAppIds(Collections.singleton(appId));
  194 + // 校验是否更新正确
  195 + assertEquals(1, channels.size());
  196 + assertPojoEquals(dbChannel01, channels.get(0));
278 } 197 }
279 198
280 - public WxPayClientConfig getV3Config() {  
281 - return new WxPayClientConfig()  
282 - .setAppId("APP00001")  
283 - .setMchId("MCH00001")  
284 - .setApiVersion(WxPayClientConfig.API_VERSION_V3)  
285 - .setMchKey("")  
286 - .setApiV3Key("sdadasdsadadsa")  
287 - .setPrivateKeyContent("dsa445das415d15asd16ad156as")  
288 - .setPrivateCertContent("dsadasd45asd4s5a"); 199 + @Test
  200 + public void testGetChannelByAppIdAndCode() {
  201 + // mock 数据
  202 + PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
  203 + o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
  204 + o.setConfig(randomAlipayPayClientConfig());
  205 + });
  206 + channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
  207 + // 准备参数
  208 + Long appId = dbChannel.getAppId();
  209 + String code = dbChannel.getCode();;
289 210
  211 + // 调用
  212 + PayChannelDO channel = channelService.getChannelByAppIdAndCode(appId, code);
  213 + // 断言
  214 + assertPojoEquals(channel, dbChannel);
290 } 215 }
291 216
292 - public AlipayPayClientConfig getPublicKeyConfig() {  
293 - return new AlipayPayClientConfig()  
294 - .setServerUrl(AlipayPayClientConfig.SERVER_URL_PROD)  
295 - .setAppId("APP00001")  
296 - .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)  
297 - .setMode(AlipayPayClientConfig.MODE_PUBLIC_KEY)  
298 - .setPrivateKey("13131321312")  
299 - .setAlipayPublicKey("13321321321")  
300 - .setAppCertContent("")  
301 - .setAlipayPublicCertContent("")  
302 - .setRootCertContent(""); 217 + public WxPayClientConfig randomWxPayClientConfig() {
  218 + return new WxPayClientConfig()
  219 + .setAppId(randomString())
  220 + .setMchId(randomString())
  221 + .setApiVersion(WxPayClientConfig.API_VERSION_V2)
  222 + .setMchKey(randomString());
303 } 223 }
304 224
305 - public AlipayPayClientConfig getCertificateConfig() { 225 + public AlipayPayClientConfig randomAlipayPayClientConfig() {
306 return new AlipayPayClientConfig() 226 return new AlipayPayClientConfig()
307 - .setServerUrl(AlipayPayClientConfig.SERVER_URL_PROD)  
308 - .setAppId("APP00001") 227 + .setServerUrl(randomURL())
  228 + .setAppId(randomString())
309 .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT) 229 .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)
310 - .setMode(AlipayPayClientConfig.MODE_CERTIFICATE)  
311 - .setPrivateKey("")  
312 - .setAlipayPublicKey("")  
313 - .setAppCertContent("13321321321sda")  
314 - .setAlipayPublicCertContent("13321321321aqeqw")  
315 - .setRootCertContent("13321321321dsad"); 230 + .setMode(AlipayPayClientConfig.MODE_PUBLIC_KEY)
  231 + .setPrivateKey(randomString())
  232 + .setAlipayPublicKey(randomString());
316 } 233 }
317 234
318 } 235 }
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java
@@ -75,9 +75,9 @@ public class PayOrderServiceTest extends BaseDbUnitTest { @@ -75,9 +75,9 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
75 o.setBody("斌斌子送给灿灿子的炸弹猫"); 75 o.setBody("斌斌子送给灿灿子的炸弹猫");
76 o.setNotifyUrl("https://hc.com/lbh"); 76 o.setNotifyUrl("https://hc.com/lbh");
77 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); 77 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
78 - o.setAmount(10000); 78 + o.setPrice(10000);
79 o.setChannelFeeRate(0.01); 79 o.setChannelFeeRate(0.01);
80 - o.setChannelFeeAmount(1L); 80 + o.setChannelFeePrice(1L);
81 o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); 81 o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
82 o.setUserIp("127.0.0.1"); 82 o.setUserIp("127.0.0.1");
83 o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0)); 83 o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0));
@@ -87,7 +87,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest { @@ -87,7 +87,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
87 o.setSuccessExtensionId(1L); 87 o.setSuccessExtensionId(1L);
88 o.setRefundStatus(PayRefundTypeEnum.NO.getStatus()); 88 o.setRefundStatus(PayRefundTypeEnum.NO.getStatus());
89 o.setRefundTimes(0); 89 o.setRefundTimes(0);
90 - o.setRefundAmount(0L); 90 + o.setRefundPrice(0L);
91 o.setChannelUserId("1008611"); 91 o.setChannelUserId("1008611");
92 o.setChannelOrderNo(channelOrderId); 92 o.setChannelOrderNo(channelOrderId);
93 o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15)); 93 o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15));
@@ -143,9 +143,9 @@ public class PayOrderServiceTest extends BaseDbUnitTest { @@ -143,9 +143,9 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
143 o.setBody("斌斌子送给灿灿子的炸弹猫"); 143 o.setBody("斌斌子送给灿灿子的炸弹猫");
144 o.setNotifyUrl("https://hc.com/lbh"); 144 o.setNotifyUrl("https://hc.com/lbh");
145 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); 145 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
146 - o.setAmount(10000); 146 + o.setPrice(10000);
147 o.setChannelFeeRate(0.01); 147 o.setChannelFeeRate(0.01);
148 - o.setChannelFeeAmount(1L); 148 + o.setChannelFeePrice(1L);
149 o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); 149 o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
150 o.setUserIp("127.0.0.1"); 150 o.setUserIp("127.0.0.1");
151 o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0)); 151 o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0));
@@ -155,7 +155,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest { @@ -155,7 +155,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
155 o.setSuccessExtensionId(1L); 155 o.setSuccessExtensionId(1L);
156 o.setRefundStatus(PayRefundTypeEnum.NO.getStatus()); 156 o.setRefundStatus(PayRefundTypeEnum.NO.getStatus());
157 o.setRefundTimes(0); 157 o.setRefundTimes(0);
158 - o.setRefundAmount(0L); 158 + o.setRefundPrice(0L);
159 o.setChannelUserId("1008611"); 159 o.setChannelUserId("1008611");
160 o.setChannelOrderNo(channelOrderId); 160 o.setChannelOrderNo(channelOrderId);
161 o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15)); 161 o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15));
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java
@@ -69,8 +69,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest { @@ -69,8 +69,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest {
69 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); 69 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
70 o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); 70 o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus());
71 o.setType(PayRefundTypeEnum.SOME.getStatus()); 71 o.setType(PayRefundTypeEnum.SOME.getStatus());
72 - o.setPayAmount(100);  
73 - o.setRefundAmount(500); 72 + o.setPayPrice(100);
  73 + o.setRefundPrice(500);
74 o.setReason("就是想退款了,你有意见吗"); 74 o.setReason("就是想退款了,你有意见吗");
75 o.setUserIp("127.0.0.1"); 75 o.setUserIp("127.0.0.1");
76 o.setChannelOrderNo("CH0000001"); 76 o.setChannelOrderNo("CH0000001");
@@ -134,8 +134,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest { @@ -134,8 +134,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest {
134 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); 134 o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
135 o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); 135 o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus());
136 o.setType(PayRefundTypeEnum.SOME.getStatus()); 136 o.setType(PayRefundTypeEnum.SOME.getStatus());
137 - o.setPayAmount(100);  
138 - o.setRefundAmount(500); 137 + o.setPayPrice(100);
  138 + o.setRefundPrice(500);
139 o.setReason("就是想退款了,你有意见吗"); 139 o.setReason("就是想退款了,你有意见吗");
140 o.setUserIp("127.0.0.1"); 140 o.setUserIp("127.0.0.1");
141 o.setChannelOrderNo("CH0000001"); 141 o.setChannelOrderNo("CH0000001");
yudao-module-pay/yudao-module-pay-biz/src/test/resources/sql/clean.sql
1 -DELETE FROM pay_merchant;  
2 DELETE FROM pay_app; 1 DELETE FROM pay_app;
3 DELETE FROM pay_channel; 2 DELETE FROM pay_channel;
4 DELETE FROM pay_order; 3 DELETE FROM pay_order;
yudao-module-pay/yudao-module-pay-biz/src/test/resources/sql/create_tables.sql
1 -CREATE TABLE IF NOT EXISTS "pay_merchant" (  
2 - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,  
3 - "no" varchar(32) NOT NULL,  
4 - "name" varchar(64) NOT NULL,  
5 - "short_name" varchar(64) NOT NULL,  
6 - "status" tinyint NOT NULL,  
7 - "remark" varchar(255) DEFAULT NULL,  
8 - "creator" varchar(64) DEFAULT '',  
9 - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
10 - "updater" varchar(64) DEFAULT '',  
11 - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  
12 - "deleted" bit(1) NOT NULL DEFAULT FALSE,  
13 - PRIMARY KEY ("id")  
14 -) COMMENT '支付商户信息';  
15 -  
16 CREATE TABLE IF NOT EXISTS "pay_app" ( 1 CREATE TABLE IF NOT EXISTS "pay_app" (
17 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, 2 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
18 "name" varchar(64) NOT NULL, 3 "name" varchar(64) NOT NULL,
@@ -20,14 +5,13 @@ CREATE TABLE IF NOT EXISTS &quot;pay_app&quot; ( @@ -20,14 +5,13 @@ CREATE TABLE IF NOT EXISTS &quot;pay_app&quot; (
20 "remark" varchar(255) DEFAULT NULL, 5 "remark" varchar(255) DEFAULT NULL,
21 `pay_notify_url` varchar(1024) NOT NULL, 6 `pay_notify_url` varchar(1024) NOT NULL,
22 `refund_notify_url` varchar(1024) NOT NULL, 7 `refund_notify_url` varchar(1024) NOT NULL,
23 - `merchant_id` bigint(20) NOT NULL,  
24 "creator" varchar(64) DEFAULT '', 8 "creator" varchar(64) DEFAULT '',
25 "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 9 "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
26 "updater" varchar(64) DEFAULT '', 10 "updater" varchar(64) DEFAULT '',
27 "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 11 "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
28 "deleted" bit(1) NOT NULL DEFAULT FALSE, 12 "deleted" bit(1) NOT NULL DEFAULT FALSE,
29 PRIMARY KEY ("id") 13 PRIMARY KEY ("id")
30 -) COMMENT = '支付应用信息'; 14 +) COMMENT = '支付应用';
31 15
32 CREATE TABLE IF NOT EXISTS "pay_channel" ( 16 CREATE TABLE IF NOT EXISTS "pay_channel" (
33 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, 17 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
@@ -35,7 +19,6 @@ CREATE TABLE IF NOT EXISTS &quot;pay_channel&quot; ( @@ -35,7 +19,6 @@ CREATE TABLE IF NOT EXISTS &quot;pay_channel&quot; (
35 "status" tinyint(4) NOT NULL, 19 "status" tinyint(4) NOT NULL,
36 "remark" varchar(255) DEFAULT NULL, 20 "remark" varchar(255) DEFAULT NULL,
37 "fee_rate" double NOT NULL DEFAULT 0, 21 "fee_rate" double NOT NULL DEFAULT 0,
38 - "merchant_id" bigint(20) NOT NULL,  
39 "app_id" bigint(20) NOT NULL, 22 "app_id" bigint(20) NOT NULL,
40 "config" varchar(10240) NOT NULL, 23 "config" varchar(10240) NOT NULL,
41 "creator" varchar(64) NULL DEFAULT '', 24 "creator" varchar(64) NULL DEFAULT '',
@@ -49,7 +32,6 @@ CREATE TABLE IF NOT EXISTS &quot;pay_channel&quot; ( @@ -49,7 +32,6 @@ CREATE TABLE IF NOT EXISTS &quot;pay_channel&quot; (
49 32
50 CREATE TABLE IF NOT EXISTS `pay_order` ( 33 CREATE TABLE IF NOT EXISTS `pay_order` (
51 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, 34 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
52 - `merchant_id` bigint(20) NOT NULL,  
53 `app_id` bigint(20) NOT NULL, 35 `app_id` bigint(20) NOT NULL,
54 `channel_id` bigint(20) DEFAULT NULL, 36 `channel_id` bigint(20) DEFAULT NULL,
55 `channel_code` varchar(32) DEFAULT NULL, 37 `channel_code` varchar(32) DEFAULT NULL,
@@ -82,7 +64,6 @@ CREATE TABLE IF NOT EXISTS `pay_order` ( @@ -82,7 +64,6 @@ CREATE TABLE IF NOT EXISTS `pay_order` (
82 64
83 CREATE TABLE IF NOT EXISTS `pay_refund` ( 65 CREATE TABLE IF NOT EXISTS `pay_refund` (
84 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, 66 "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
85 - `merchant_id` bigint(20) NOT NULL,  
86 `app_id` bigint(20) NOT NULL, 67 `app_id` bigint(20) NOT NULL,
87 `channel_id` bigint(20) NOT NULL, 68 `channel_id` bigint(20) NOT NULL,
88 `channel_code` varchar(32) NOT NULL, 69 `channel_code` varchar(32) NOT NULL,
yudao-server/pom.xml
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 <!-- <artifactId>yudao-module-bpm-biz</artifactId>--> 53 <!-- <artifactId>yudao-module-bpm-biz</artifactId>-->
54 <!-- <version>${revision}</version>--> 54 <!-- <version>${revision}</version>-->
55 <!-- </dependency>--> 55 <!-- </dependency>-->
56 - <!-- 支付服务 --> 56 + <!-- 支付服务。默认注释,保证编译速度 -->
57 <dependency> 57 <dependency>
58 <groupId>cn.iocoder.boot</groupId> 58 <groupId>cn.iocoder.boot</groupId>
59 <artifactId>yudao-module-pay-biz</artifactId> 59 <artifactId>yudao-module-pay-biz</artifactId>
yudao-ui-admin/src/api/pay/channel.js
@@ -27,15 +27,6 @@ export function deleteChannel(id) { @@ -27,15 +27,6 @@ export function deleteChannel(id) {
27 }) 27 })
28 } 28 }
29 29
30 -// 获得支付渠道分页  
31 -export function getChannelPage(query) {  
32 - return request({  
33 - url: '/pay/channel/page',  
34 - method: 'get',  
35 - params: query  
36 - })  
37 -}  
38 -  
39 // 获得支付渠道 30 // 获得支付渠道
40 export function getChannel(appId,code) { 31 export function getChannel(appId,code) {
41 return request({ 32 return request({
yudao-ui-admin/src/plugins/tab.js
@@ -36,6 +36,9 @@ export default { @@ -36,6 +36,9 @@ export default {
36 return router.push(lastPath || '/'); 36 return router.push(lastPath || '/');
37 }); 37 });
38 } 38 }
  39 + if (typeof obj === "function") {
  40 + return store.dispatch('tagsView/delView', router.currentRoute).then(obj);
  41 + }
39 return store.dispatch('tagsView/delView', obj); 42 return store.dispatch('tagsView/delView', obj);
40 }, 43 },
41 // 关闭所有tab页签 44 // 关闭所有tab页签
yudao-ui-admin/src/router/index.js
@@ -227,14 +227,14 @@ export const constantRoutes = [ @@ -227,14 +227,14 @@ export const constantRoutes = [
227 component: Layout, 227 component: Layout,
228 hidden: true, 228 hidden: true,
229 children: [{ 229 children: [{
230 - path: 'order/submit',  
231 - name: 'PayOrderSubmit', 230 + path: 'cashier',
  231 + name: 'PayCashier',
232 hidden: true, 232 hidden: true,
233 meta: { 233 meta: {
234 title: '收银台', 234 title: '收银台',
235 noCache: true 235 noCache: true
236 }, 236 },
237 - component: (resolve) => require(['@/views/pay/order/submit'], resolve) 237 + component: (resolve) => require(['@/views/pay/cashier'], resolve)
238 }] 238 }]
239 } 239 }
240 ] 240 ]
yudao-ui-admin/src/utils/dict.js
@@ -54,7 +54,7 @@ export const DICT_TYPE = { @@ -54,7 +54,7 @@ export const DICT_TYPE = {
54 PAY_CHANNEL_ALIPAY_SIGN_TYPE: 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型 54 PAY_CHANNEL_ALIPAY_SIGN_TYPE: 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型
55 PAY_CHANNEL_ALIPAY_MODE: 'pay_channel_alipay_mode', // 支付宝公钥类型 55 PAY_CHANNEL_ALIPAY_MODE: 'pay_channel_alipay_mode', // 支付宝公钥类型
56 PAY_CHANNEL_ALIPAY_SERVER_TYPE: 'pay_channel_alipay_server_type', // 支付宝网关地址 56 PAY_CHANNEL_ALIPAY_SERVER_TYPE: 'pay_channel_alipay_server_type', // 支付宝网关地址
57 - PAY_CHANNEL_CODE_TYPE: 'pay_channel_code_type', // 支付渠道编码类型 57 + PAY_CHANNEL_CODE: 'pay_channel_code', // 支付渠道编码类型
58 PAY_ORDER_NOTIFY_STATUS: 'pay_order_notify_status', // 商户支付订单回调状态 58 PAY_ORDER_NOTIFY_STATUS: 'pay_order_notify_status', // 商户支付订单回调状态
59 PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态 59 PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态
60 PAY_ORDER_REFUND_STATUS: 'pay_order_refund_status', // 商户支付订单退款状态 60 PAY_ORDER_REFUND_STATUS: 'pay_order_refund_status', // 商户支付订单退款状态
yudao-ui-admin/src/views/mall/trade/order/detail.vue
@@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
17 <el-descriptions-item label="商家备注">{{ order.remark }}</el-descriptions-item> 17 <el-descriptions-item label="商家备注">{{ order.remark }}</el-descriptions-item>
18 <el-descriptions-item label="支付单号">{{ order.payOrderId }}</el-descriptions-item> 18 <el-descriptions-item label="支付单号">{{ order.payOrderId }}</el-descriptions-item>
19 <el-descriptions-item label="付款方式"> 19 <el-descriptions-item label="付款方式">
20 - <dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE_TYPE" :value="order.payChannelCode" /> 20 + <dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="order.payChannelCode" />
21 </el-descriptions-item> 21 </el-descriptions-item>
22 <el-descriptions-item label="买家">{{ order.user.nickname }}</el-descriptions-item> <!-- TODO 芋艿:待实现:跳转会员 --> 22 <el-descriptions-item label="买家">{{ order.user.nickname }}</el-descriptions-item> <!-- TODO 芋艿:待实现:跳转会员 -->
23 <el-descriptions-item label="收货地址"> 23 <el-descriptions-item label="收货地址">
yudao-ui-admin/src/views/mall/trade/order/index.vue
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 <el-col :span="6" :xs="24"> 42 <el-col :span="6" :xs="24">
43 <el-form-item label="支付方式" prop="payChannelCode"> 43 <el-form-item label="支付方式" prop="payChannelCode">
44 <el-select v-model="queryParams.payChannelCode" clearable style="width: 240px"> 44 <el-select v-model="queryParams.payChannelCode" clearable style="width: 240px">
45 - <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)" 45 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE)"
46 :key="dict.value" :label="dict.label" :value="dict.value"/> 46 :key="dict.value" :label="dict.label" :value="dict.value"/>
47 </el-select> 47 </el-select>
48 </el-form-item> 48 </el-form-item>
@@ -86,7 +86,7 @@ @@ -86,7 +86,7 @@
86 <dict-tag :type="DICT_TYPE.TERMINAL" :value="row.terminal" /> 86 <dict-tag :type="DICT_TYPE.TERMINAL" :value="row.terminal" />
87 </el-col> 87 </el-col>
88 <el-col :span="4">支付方式: 88 <el-col :span="4">支付方式:
89 - <dict-tag v-if="row.payChannelCode" :type="DICT_TYPE.PAY_CHANNEL_CODE_TYPE" :value="row.payChannelCode" /> 89 + <dict-tag v-if="row.payChannelCode" :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="row.payChannelCode" />
90 <span v-else>未支付</span> 90 <span v-else>未支付</span>
91 </el-col> 91 </el-col>
92 <el-col :span="6" align="right"> 92 <el-col :span="6" align="right">
@@ -113,7 +113,7 @@ @@ -113,7 +113,7 @@
113 </template> 113 </template>
114 </el-table-column> 114 </el-table-column>
115 <!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的总金额,就是 order.payPrice --> 115 <!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的总金额,就是 order.payPrice -->
116 - <el-table-column label="实付金额(元)" prop="amount" align="center" width="100"/> 116 + <el-table-column label="实付金额(元)" prop="price" align="center" width="100"/>
117 <!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的收件信息;使用 order.receiverXXX 开头的字段 --> 117 <!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的收件信息;使用 order.receiverXXX 开头的字段 -->
118 <el-table-column label="买家/收货人" prop="buyer" header-align="center" width="auto" min-width="300"> 118 <el-table-column label="买家/收货人" prop="buyer" header-align="center" width="auto" min-width="300">
119 <template v-slot="{ row }"> 119 <template v-slot="{ row }">
yudao-ui-admin/src/views/pay/app/components/aliPayChannelForm.vue
@@ -41,17 +41,17 @@ @@ -41,17 +41,17 @@
41 </el-radio-group> 41 </el-radio-group>
42 </el-form-item> 42 </el-form-item>
43 <div v-if="form.aliPayConfig.mode === 1"> 43 <div v-if="form.aliPayConfig.mode === 1">
44 - <el-form-item label-width="180px" label="商户私钥" prop="aliPayConfig.privateKey"> 44 + <el-form-item label-width="180px" label="应用私钥" prop="aliPayConfig.privateKey">
45 <el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.privateKey" 45 <el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.privateKey"
46 - placeholder="请输入商户私钥" clearable :style="{width: '100%'}"> 46 + placeholder="请输入应用私钥" clearable :style="{width: '100%'}">
47 </el-input> 47 </el-input>
48 </el-form-item> 48 </el-form-item>
49 - <el-form-item label-width="180px" label="支付宝公钥字符串" prop="aliPayConfig.alipayPublicKey"> 49 + <el-form-item label-width="180px" label="支付宝公钥" prop="aliPayConfig.alipayPublicKey">
50 <el-input 50 <el-input
51 type="textarea" 51 type="textarea"
52 :autosize="{minRows: 8, maxRows: 8}" 52 :autosize="{minRows: 8, maxRows: 8}"
53 v-model="form.aliPayConfig.alipayPublicKey" 53 v-model="form.aliPayConfig.alipayPublicKey"
54 - placeholder="请输入支付宝公钥字符串" clearable 54 + placeholder="请输入支付宝公钥" clearable
55 :style="{width: '100%'}"> 55 :style="{width: '100%'}">
56 </el-input> 56 </el-input>
57 </el-form-item> 57 </el-form-item>
yudao-ui-admin/src/views/pay/order/submit.vue renamed to yudao-ui-admin/src/views/pay/cashier/index.vue
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <el-descriptions-item label="支付单号">{{ payOrder.id }}</el-descriptions-item> 6 <el-descriptions-item label="支付单号">{{ payOrder.id }}</el-descriptions-item>
7 <el-descriptions-item label="商品标题">{{ payOrder.subject }}</el-descriptions-item> 7 <el-descriptions-item label="商品标题">{{ payOrder.subject }}</el-descriptions-item>
8 <el-descriptions-item label="商品内容">{{ payOrder.body }}</el-descriptions-item> 8 <el-descriptions-item label="商品内容">{{ payOrder.body }}</el-descriptions-item>
9 - <el-descriptions-item label="支付金额">¥{{ (payOrder.amount / 100.0).toFixed(2) }}</el-descriptions-item> 9 + <el-descriptions-item label="支付金额">¥{{ (payOrder.price / 100.0).toFixed(2) }}</el-descriptions-item>
10 <el-descriptions-item label="创建时间">{{ parseTime(payOrder.createTime) }}</el-descriptions-item> 10 <el-descriptions-item label="创建时间">{{ parseTime(payOrder.createTime) }}</el-descriptions-item>
11 <el-descriptions-item label="过期时间">{{ parseTime(payOrder.expireTime) }}</el-descriptions-item> 11 <el-descriptions-item label="过期时间">{{ parseTime(payOrder.expireTime) }}</el-descriptions-item>
12 </el-descriptions> 12 </el-descriptions>
@@ -18,24 +18,25 @@ @@ -18,24 +18,25 @@
18 <el-descriptions title="选择支付宝支付"> 18 <el-descriptions title="选择支付宝支付">
19 </el-descriptions> 19 </el-descriptions>
20 <div class="pay-channel-container"> 20 <div class="pay-channel-container">
21 - <div class="box" v-for="channel in aliPayChannels" :key="channel.code" @click="submit(channel.code)">  
22 - <img :src="icons[channel.code]"> 21 + <div class="box" v-for="channel in channels" v-if="channel.code.indexOf('alipay_') === 0" :key="channel.code" @click="submit(channel.code)">
  22 + <img :src="channel.icon">
23 <div class="title">{{ channel.name }}</div> 23 <div class="title">{{ channel.name }}</div>
24 </div> 24 </div>
25 </div> 25 </div>
26 <!-- 微信支付 --> 26 <!-- 微信支付 -->
27 <el-descriptions title="选择微信支付" style="margin-top: 20px;" /> 27 <el-descriptions title="选择微信支付" style="margin-top: 20px;" />
28 <div class="pay-channel-container"> 28 <div class="pay-channel-container">
29 - <div class="box" v-for="channel in wxPayChannels" :key="channel.code">  
30 - <img :src="icons[channel.code]"> 29 + <div class="box" v-for="channel in channels" v-if="channel.code.indexOf('wx_') === 0" :key="channel.code">
  30 + <img :src="channel.icon">
31 <div class="title">{{ channel.name }}</div> 31 <div class="title">{{ channel.name }}</div>
32 </div> 32 </div>
33 </div> 33 </div>
34 <!-- 其它支付 --> 34 <!-- 其它支付 -->
35 <el-descriptions title="选择其它支付" style="margin-top: 20px;" /> 35 <el-descriptions title="选择其它支付" style="margin-top: 20px;" />
36 <div class="pay-channel-container"> 36 <div class="pay-channel-container">
37 - <div class="box" v-for="channel in otherPayChannels" :key="channel.code">  
38 - <img :src="icons[channel.code]"> 37 + <div class="box" v-for="channel in channels" :key="channel.code"
  38 + v-if="channel.code.indexOf('alipay_') === -1 && channel.code.indexOf('wx_') === -1">
  39 + <img :src="channel.icon">
39 <div class="title">{{ channel.name }}</div> 40 <div class="title">{{ channel.name }}</div>
40 </div> 41 </div>
41 </div> 42 </div>
@@ -47,15 +48,6 @@ @@ -47,15 +48,6 @@
47 <qrcode-vue :value="qrCode.url" size="310" level="L" /> 48 <qrcode-vue :value="qrCode.url" size="310" level="L" />
48 </el-dialog> 49 </el-dialog>
49 50
50 - <!-- 展示形式:IFrame -->  
51 - <el-dialog :title="iframe.title" :visible.sync="iframe.visible" width="800px" height="800px" append-to-body  
52 - :close-on-press-escape="false">  
53 - <iframe :src="iframe.url" width="100%" />  
54 - </el-dialog>  
55 -  
56 - <!-- 展示形式:Form -->  
57 - <div ref="formRef" v-html="form.value" />  
58 -  
59 <!-- 展示形式:BarCode 条形码 --> 51 <!-- 展示形式:BarCode 条形码 -->
60 <el-dialog :title="barCode.title" :visible.sync="barCode.visible" width="500px" append-to-body 52 <el-dialog :title="barCode.title" :visible.sync="barCode.visible" width="500px" append-to-body
61 :close-on-press-escape="false"> 53 :close-on-press-escape="false">
@@ -88,32 +80,56 @@ @@ -88,32 +80,56 @@
88 import QrcodeVue from 'qrcode.vue' 80 import QrcodeVue from 'qrcode.vue'
89 import { DICT_TYPE, getDictDatas } from "@/utils/dict"; 81 import { DICT_TYPE, getDictDatas } from "@/utils/dict";
90 import { getOrder, submitOrder } from '@/api/pay/order'; 82 import { getOrder, submitOrder } from '@/api/pay/order';
91 -import {PayChannelEnum, PayDisplayModeEnum, PayOrderStatusEnum} from "@/utils/constants"; 83 +import { PayChannelEnum, PayDisplayModeEnum, PayOrderStatusEnum } from "@/utils/constants";
92 84
93 export default { 85 export default {
94 - name: "PayOrderSubmit", 86 + name: "PayCashier",
95 components: { 87 components: {
96 QrcodeVue, 88 QrcodeVue,
97 }, 89 },
98 data() { 90 data() {
99 return { 91 return {
100 id: undefined, // 请假编号 92 id: undefined, // 请假编号
  93 + returnUrl: undefined, // 支付完的回调地址
101 loading: false, // 支付信息的 loading 94 loading: false, // 支付信息的 loading
102 payOrder: {}, // 支付信息 95 payOrder: {}, // 支付信息
103 - aliPayChannels: [], // 阿里支付的渠道  
104 - wxPayChannels: [], // 微信支付的渠道  
105 - otherPayChannels: [], // 其它的支付渠道  
106 - icons: {  
107 - alipay_qr: require("@/assets/images/pay/icon/alipay_qr.svg"),  
108 - alipay_app: require("@/assets/images/pay/icon/alipay_app.svg"),  
109 - alipay_wap: require("@/assets/images/pay/icon/alipay_wap.svg"),  
110 - alipay_pc: require("@/assets/images/pay/icon/alipay_pc.svg"),  
111 - alipay_bar: require("@/assets/images/pay/icon/alipay_bar.svg"),  
112 - wx_app: require("@/assets/images/pay/icon/wx_app.svg"),  
113 - wx_lite: require("@/assets/images/pay/icon/wx_lite.svg"),  
114 - wx_pub: require("@/assets/images/pay/icon/wx_pub.svg"),  
115 - mock: require("@/assets/images/pay/icon/mock.svg"),  
116 - }, 96 + channels: [{
  97 + name: '支付宝 PC 网站支付',
  98 + icon: require("@/assets/images/pay/icon/alipay_pc.svg"),
  99 + code: "alipay_pc"
  100 + }, {
  101 + name: '支付宝 Wap 网站支付',
  102 + icon: require("@/assets/images/pay/icon/alipay_wap.svg"),
  103 + code: "alipay_wap"
  104 + }, {
  105 + name: '支付宝 App 网站支付',
  106 + icon: require("@/assets/images/pay/icon/alipay_app.svg"),
  107 + code: "alipay_app"
  108 + }, {
  109 + name: '支付宝扫码支付',
  110 + icon: require("@/assets/images/pay/icon/alipay_app.svg"),
  111 + code: "alipay_qr"
  112 + }, {
  113 + name: '支付宝条码支付',
  114 + icon: require("@/assets/images/pay/icon/alipay_bar.svg"),
  115 + code: "alipay_bar"
  116 + }, {
  117 + name: '微信公众号支付',
  118 + icon: require("@/assets/images/pay/icon/wx_pub.svg"),
  119 + code: "wx_pub"
  120 + }, {
  121 + name: '微信小程序支付',
  122 + icon: require("@/assets/images/pay/icon/wx_lite.svg"),
  123 + code: "wx_lite"
  124 + }, {
  125 + name: '微信 App 支付',
  126 + icon: require("@/assets/images/pay/icon/wx_app.svg"),
  127 + code: "wx_app"
  128 + }, {
  129 + name: '模拟支付',
  130 + icon: require("@/assets/images/pay/icon/mock.svg"),
  131 + code: "mock"
  132 + }],
117 submitLoading: false, // 提交支付的 loading 133 submitLoading: false, // 提交支付的 loading
118 interval: undefined, // 定时任务,轮询是否完成支付 134 interval: undefined, // 定时任务,轮询是否完成支付
119 qrCode: { // 展示形式:二维码 135 qrCode: { // 展示形式:二维码
@@ -121,14 +137,6 @@ export default { @@ -121,14 +137,6 @@ export default {
121 title: '', 137 title: '',
122 visible: false, 138 visible: false,
123 }, 139 },
124 - iframe: { // 展示形式:iframe  
125 - url: '',  
126 - title: '',  
127 - visible: false  
128 - },  
129 - form: { // 展示形式:form  
130 - html: '',  
131 - },  
132 barCode: { // 展示形式:条形码 140 barCode: { // 展示形式:条形码
133 channelCode: '', 141 channelCode: '',
134 value: '', 142 value: '',
@@ -139,46 +147,35 @@ export default { @@ -139,46 +147,35 @@ export default {
139 }, 147 },
140 created() { 148 created() {
141 this.id = this.$route.query.id; 149 this.id = this.$route.query.id;
  150 + if (this.$route.query.returnUrl) {
  151 + this.returnUrl = decodeURIComponent(this.$route.query.returnUrl)
  152 + }
142 this.getDetail(); 153 this.getDetail();
143 - this.initPayChannels();  
144 }, 154 },
145 methods: { 155 methods: {
146 - /** 初始化支付渠道 */  
147 - initPayChannels() {  
148 - // 微信支付  
149 - for (const dict of getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)) {  
150 - const payChannel = {  
151 - name: dict.label,  
152 - code: dict.value  
153 - }  
154 - if (dict.value.indexOf('wx_') === 0) {  
155 - this.wxPayChannels.push(payChannel);  
156 - } else if (dict.value.indexOf('alipay_') === 0) {  
157 - this.aliPayChannels.push(payChannel);  
158 - } else {  
159 - this.otherPayChannels.push(payChannel);  
160 - }  
161 - }  
162 - },  
163 /** 获得支付信息 */ 156 /** 获得支付信息 */
164 getDetail() { 157 getDetail() {
165 // 1.1 未传递订单编号 158 // 1.1 未传递订单编号
166 if (!this.id) { 159 if (!this.id) {
167 this.$message.error('未传递支付单号,无法查看对应的支付信息'); 160 this.$message.error('未传递支付单号,无法查看对应的支付信息');
168 - this.goBackToList(); 161 + this.goReturnUrl('cancel');
169 return; 162 return;
170 } 163 }
171 getOrder(this.id).then(response => { 164 getOrder(this.id).then(response => {
172 // 1.2 无法查询到支付信息 165 // 1.2 无法查询到支付信息
173 if (!response.data) { 166 if (!response.data) {
174 this.$message.error('支付订单不存在,请检查!'); 167 this.$message.error('支付订单不存在,请检查!');
175 - this.goBackToList(); 168 + this.goReturnUrl('cancel');
176 return; 169 return;
177 } 170 }
178 - // 1.3 订单已支付  
179 - if (response.data.status !== PayOrderStatusEnum.WAITING.status) {  
180 - this.$message.error('支付订单不处于待支付状态,请检查!');  
181 - this.goBackToList(); 171 + // 1.3 如果已支付、或者已关闭,则直接跳转
  172 + if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
  173 + this.$message.success('支付成功');
  174 + this.goReturnUrl('success');
  175 + return;
  176 + } else if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
  177 + this.$message.error('无法支付,原因:订单已关闭');
  178 + this.goReturnUrl('close');
182 return; 179 return;
183 } 180 }
184 181
@@ -207,15 +204,12 @@ export default { @@ -207,15 +204,12 @@ export default {
207 submitOrder({ 204 submitOrder({
208 id: this.id, 205 id: this.id,
209 channelCode: channelCode, 206 channelCode: channelCode,
  207 + returnUrl: location.href, // 支付成功后,支付渠道跳转回当前页;再由当前页,跳转回 {@link returnUrl} 对应的地址
210 ...this.buildSubmitParam(channelCode) 208 ...this.buildSubmitParam(channelCode)
211 }).then(response => { 209 }).then(response => {
212 const data = response.data 210 const data = response.data
213 - if (data.displayMode === PayDisplayModeEnum.IFRAME.mode) {  
214 - this.displayIFrame(channelCode, data)  
215 - } else if (data.displayMode === PayDisplayModeEnum.URL.mode) { 211 + if (data.displayMode === PayDisplayModeEnum.URL.mode) {
216 this.displayUrl(channelCode, data) 212 this.displayUrl(channelCode, data)
217 - } else if (data.displayMode === PayDisplayModeEnum.FORM.mode) {  
218 - this.displayForm(channelCode, data)  
219 } else if (data.displayMode === PayDisplayModeEnum.QR_CODE.mode) { 213 } else if (data.displayMode === PayDisplayModeEnum.QR_CODE.mode) {
220 this.displayQrCode(channelCode, data) 214 this.displayQrCode(channelCode, data)
221 } 215 }
@@ -228,53 +222,7 @@ export default { @@ -228,53 +222,7 @@ export default {
228 }, 222 },
229 /** 构建提交支付的额外参数 */ 223 /** 构建提交支付的额外参数 */
230 buildSubmitParam(channelCode) { 224 buildSubmitParam(channelCode) {
231 - // ① 支付宝 PC 支付时,有多种展示形态  
232 - if (channelCode === PayChannelEnum.ALIPAY_PC.code) {  
233 - // 情况【前置模式】:将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体支持的枚举值有以下几种:  
234 - // 0:订单码-简约前置模式,对应 iframe 宽度不能小于 600px,高度不能小于 300px  
235 - // return {  
236 - // "channelExtras": {  
237 - // "qr_pay_mode": "0"  
238 - // }  
239 - // }  
240 - // 1:订单码-前置模式,对应iframe 宽度不能小于 300px,高度不能小于 600px  
241 - // return {  
242 - // "channelExtras": {  
243 - // "qr_pay_mode": "1"  
244 - // }  
245 - // }  
246 - // 3:订单码-迷你前置模式,对应 iframe 宽度不能小于 75px,高度不能小于 75px  
247 - // return {  
248 - // "channelExtras": {  
249 - // "qr_pay_mode": "3"  
250 - // }  
251 - // }  
252 - // 4:订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小  
253 - // return {  
254 - // "channelExtras": {  
255 - // "qr_pay_mode": "4"  
256 - // }  
257 - // }  
258 - // 情况【跳转模式】:跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。支持传入的枚举值有  
259 - return {  
260 - "channelExtras": {  
261 - "qr_pay_mode": "2"  
262 - }  
263 - }  
264 - // 情况【表单模式】:直接提交当前页面到支付宝  
265 - // return {  
266 - // displayMode: PayDisplayModeEnum.FORM.mode  
267 - // }  
268 - }  
269 -  
270 - // ② 支付宝 Wap 支付时,引导手机扫码支付  
271 - if (channelCode === PayChannelEnum.ALIPAY_WAP.code) {  
272 - return {  
273 - displayMode: PayDisplayModeEnum.QR_CODE.mode  
274 - }  
275 - }  
276 -  
277 - // ③ 支付宝 BarCode 支付时,需要传递 authCode 条形码 225 + // ① 支付宝 BarCode 支付时,需要传递 authCode 条形码
278 if (channelCode === PayChannelEnum.ALIPAY_BAR.code) { 226 if (channelCode === PayChannelEnum.ALIPAY_BAR.code) {
279 return { 227 return {
280 "channelExtras": { 228 "channelExtras": {
@@ -284,36 +232,12 @@ export default { @@ -284,36 +232,12 @@ export default {
284 } 232 }
285 return {} 233 return {}
286 }, 234 },
287 - /** 提交支付后,IFrame 内置 URL 的展示形式 */  
288 - displayIFrame(channelCode, data) {  
289 - // TODO 芋艿:目前有点奇怪,支付宝总是会显示“支付环境存在风险”  
290 - this.iframe = {  
291 - title: '支付窗口',  
292 - url: data.displayContent,  
293 - visible: true  
294 - }  
295 - this.submitLoading = false  
296 - },  
297 /** 提交支付后,URL 的展示形式 */ 235 /** 提交支付后,URL 的展示形式 */
298 displayUrl(channelCode, data) { 236 displayUrl(channelCode, data) {
299 - window.open(data.displayContent) 237 + // window.open(data.displayContent)
  238 + location.href = data.displayContent
300 this.submitLoading = false 239 this.submitLoading = false
301 }, 240 },
302 - /** 提交支付后,Form 的展示形式 */  
303 - displayForm(channelCode, data) {  
304 - // 渲染支付页面  
305 - this.form = {  
306 - value: data.displayContent  
307 - }  
308 - // 防抖避免重复支付  
309 - this.$nextTick(() => {  
310 - // 提交支付表单  
311 - this.$refs.formRef.children[0].submit();  
312 - setTimeout(() => {  
313 - this.submitLoading = false  
314 - }, 1000);  
315 - });  
316 - },  
317 /** 提交支付后(支付宝扫码支付) */ 241 /** 提交支付后(支付宝扫码支付) */
318 displayQrCode(channelCode, data) { 242 displayQrCode(channelCode, data) {
319 let title = '请使用手机浏览器“扫一扫”'; 243 let title = '请使用手机浏览器“扫一扫”';
@@ -342,13 +266,13 @@ export default { @@ -342,13 +266,13 @@ export default {
342 if (response.data.status === PayOrderStatusEnum.SUCCESS.status) { 266 if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
343 this.clearQueryInterval(); 267 this.clearQueryInterval();
344 this.$message.success('支付成功!'); 268 this.$message.success('支付成功!');
345 - this.goBackToList(); 269 + this.goReturnUrl();
346 } 270 }
347 // 已取消 271 // 已取消
348 if (response.data.status === PayOrderStatusEnum.CLOSED.status) { 272 if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
349 this.clearQueryInterval(); 273 this.clearQueryInterval();
350 this.$message.error('支付已关闭!'); 274 this.$message.error('支付已关闭!');
351 - this.goBackToList(); 275 + this.goReturnUrl();
352 } 276 }
353 }) 277 })
354 }, 1000 * 2) 278 }, 1000 * 2)
@@ -365,10 +289,34 @@ export default { @@ -365,10 +289,34 @@ export default {
365 clearInterval(this.interval) 289 clearInterval(this.interval)
366 this.interval = undefined 290 this.interval = undefined
367 }, 291 },
368 - /** 回到列表 **/  
369 - goBackToList() {  
370 - this.$tab.closePage();  
371 - this.$router.go(-1); 292 + /**
  293 + * 回到业务的 URL
  294 + *
  295 + * @param payResult 支付结果
  296 + * ① success:支付成功
  297 + * ② cancel:取消支付
  298 + * ③ close:支付已关闭
  299 + */
  300 + goReturnUrl(payResult) {
  301 + // 未配置的情况下,只能关闭
  302 + if (!this.returnUrl) {
  303 + this.$tab.closePage();
  304 + return
  305 + }
  306 +
  307 + const url = this.returnUrl.indexOf('?') >= 0
  308 + ? this.returnUrl + '&payResult=' + payResult
  309 + : this.returnUrl + '?payResult=' + payResult
  310 + // 如果有配置,且是 http 开头,则浏览器跳转
  311 + if (this.returnUrl.indexOf('http') === 0) {
  312 + location.href = url;
  313 + } else {
  314 + this.$tab.closePage(() => {
  315 + this.$router.push({
  316 + path: url
  317 + });
  318 + });
  319 + }
372 } 320 }
373 } 321 }
374 }; 322 };
yudao-ui-admin/src/views/pay/demo/index.vue
@@ -29,9 +29,9 @@ @@ -29,9 +29,9 @@
29 </template> 29 </template>
30 </el-table-column> 30 </el-table-column>
31 <el-table-column label="支付单号" align="center" prop="payOrderId" /> 31 <el-table-column label="支付单号" align="center" prop="payOrderId" />
32 - <el-table-column label="是否支付" align="center" prop="payed"> 32 + <el-table-column label="是否支付" align="center" prop="payStatus">
33 <template v-slot="scope"> 33 <template v-slot="scope">
34 - <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.payed" /> 34 + <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.payStatus" />
35 </template> 35 </template>
36 </el-table-column> 36 </el-table-column>
37 <el-table-column label="支付时间" align="center" prop="payTime" width="180"> 37 <el-table-column label="支付时间" align="center" prop="payTime" width="180">
@@ -47,9 +47,9 @@ @@ -47,9 +47,9 @@
47 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 47 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
48 <template v-slot="scope"> 48 <template v-slot="scope">
49 <el-button size="mini" type="text" icon="el-icon-edit" @click="handlePay(scope.row)" 49 <el-button size="mini" type="text" icon="el-icon-edit" @click="handlePay(scope.row)"
50 - v-if="!scope.row.payed">前往支付</el-button> 50 + v-if="!scope.row.payStatus">前往支付</el-button>
51 <el-button size="mini" type="text" icon="el-icon-delete" @click="handleRefund(scope.row)" 51 <el-button size="mini" type="text" icon="el-icon-delete" @click="handleRefund(scope.row)"
52 - v-if="scope.row.payed && !scope.row.payRefundId">发起退款</el-button> 52 + v-if="scope.row.payStatus && !scope.row.payRefundId">发起退款</el-button>
53 </template> 53 </template>
54 </el-table-column> 54 </el-table-column>
55 </el-table> 55 </el-table>
@@ -78,12 +78,10 @@ @@ -78,12 +78,10 @@
78 </template> 78 </template>
79 79
80 <script> 80 <script>
81 -import {createDemoOrder, getDemoOrderPage, refundDemoOrder} from "@/api/pay/demo"; 81 +import { createDemoOrder, getDemoOrderPage, refundDemoOrder } from "@/api/pay/demo";
82 82
83 export default { 83 export default {
84 name: "PayDemoOrder", 84 name: "PayDemoOrder",
85 - components: {  
86 - },  
87 data() { 85 data() {
88 return { 86 return {
89 // 遮罩层 87 // 遮罩层
@@ -192,9 +190,10 @@ export default { @@ -192,9 +190,10 @@ export default {
192 /** 支付按钮操作 */ 190 /** 支付按钮操作 */
193 handlePay(row) { 191 handlePay(row) {
194 this.$router.push({ 192 this.$router.push({
195 - name: 'PayOrderSubmit', 193 + name: 'PayCashier',
196 query:{ 194 query:{
197 - id: row.payOrderId 195 + id: row.payOrderId,
  196 + returnUrl: encodeURIComponent('/pay/demo-order?id=' + row.id)
198 } 197 }
199 }) 198 })
200 }, 199 },
yudao-ui-admin/src/views/pay/order/index.vue
@@ -81,19 +81,19 @@ @@ -81,19 +81,19 @@
81 </template> 81 </template>
82 </el-table-column> 82 </el-table-column>
83 <el-table-column label="商品标题" align="center" prop="subject" width="180" :show-overflow-tooltip="true"/> 83 <el-table-column label="商品标题" align="center" prop="subject" width="180" :show-overflow-tooltip="true"/>
84 - <el-table-column label="支付金额" align="center" prop="amount" width="100"> 84 + <el-table-column label="支付金额" align="center" prop="price" width="100">
85 <template v-slot="scope"> 85 <template v-slot="scope">
86 - ¥{{ parseFloat(scope.row.amount / 100).toFixed(2) }} 86 + ¥{{ parseFloat(scope.row.price / 100).toFixed(2) }}
87 </template> 87 </template>
88 </el-table-column> 88 </el-table-column>
89 - <el-table-column label="手续金额" align="center" prop="channelFeeAmount" width="100"> 89 + <el-table-column label="手续金额" align="center" prop="channelFeePrice" width="100">
90 <template v-slot="scope"> 90 <template v-slot="scope">
91 - ¥{{ parseFloat(scope.row.channelFeeAmount / 100).toFixed(2) }} 91 + ¥{{ parseFloat(scope.row.channelFeePrice / 100).toFixed(2) }}
92 </template> 92 </template>
93 </el-table-column> 93 </el-table-column>
94 - <el-table-column label="退款金额" align="center" prop="refundAmount" width="100"> 94 + <el-table-column label="退款金额" align="center" prop="refundPrice" width="100">
95 <template v-slot="scope"> 95 <template v-slot="scope">
96 - ¥{{ parseFloat(scope.row.refundAmount / 100).toFixed(2) }} 96 + ¥{{ parseFloat(scope.row.refundPrice / 100).toFixed(2) }}
97 </template> 97 </template>
98 </el-table-column> 98 </el-table-column>
99 <el-table-column label="支付状态" align="center" prop="status"> 99 <el-table-column label="支付状态" align="center" prop="status">
@@ -154,10 +154,10 @@ @@ -154,10 +154,10 @@
154 </el-tag> 154 </el-tag>
155 </el-descriptions-item> 155 </el-descriptions-item>
156 <el-descriptions-item label="金额"> 156 <el-descriptions-item label="金额">
157 - <el-tag type="success" size="small">{{ parseFloat(orderDetail.amount / 100, 2) }}</el-tag> 157 + <el-tag type="success" size="small">{{ parseFloat(orderDetail.price / 100, 2) }}</el-tag>
158 </el-descriptions-item> 158 </el-descriptions-item>
159 <el-descriptions-item label="手续费"> 159 <el-descriptions-item label="手续费">
160 - <el-tag type="warning" size="small">{{ parseFloat(orderDetail.channelFeeAmount / 100, 2) }}</el-tag> 160 + <el-tag type="warning" size="small">{{ parseFloat(orderDetail.channelFeePrice / 100, 2) }}</el-tag>
161 </el-descriptions-item> 161 </el-descriptions-item>
162 <el-descriptions-item label="手续费比例"> 162 <el-descriptions-item label="手续费比例">
163 {{ parseFloat(orderDetail.channelFeeRate / 100, 2) }}% 163 {{ parseFloat(orderDetail.channelFeeRate / 100, 2) }}%
@@ -184,7 +184,7 @@ @@ -184,7 +184,7 @@
184 <el-descriptions-item label="退款次数">{{ orderDetail.refundTimes }}</el-descriptions-item> 184 <el-descriptions-item label="退款次数">{{ orderDetail.refundTimes }}</el-descriptions-item>
185 <el-descriptions-item label="退款金额"> 185 <el-descriptions-item label="退款金额">
186 <el-tag type="warning"> 186 <el-tag type="warning">
187 - {{ parseFloat(orderDetail.refundAmount / 100, 2) }} 187 + {{ parseFloat(orderDetail.refundPrice / 100, 2) }}
188 </el-tag> 188 </el-tag>
189 </el-descriptions-item> 189 </el-descriptions-item>
190 </el-descriptions> 190 </el-descriptions>
@@ -213,16 +213,16 @@ const defaultOrderDetail = { @@ -213,16 +213,16 @@ const defaultOrderDetail = {
213 merchantOrderId: null, 213 merchantOrderId: null,
214 channelOrderNo: '', 214 channelOrderNo: '',
215 body: '', 215 body: '',
216 - amount: null, 216 + price: null,
217 channelFeeRate: null, 217 channelFeeRate: null,
218 - channelFeeAmount: null, 218 + channelFeePrice: null,
219 userIp: '', 219 userIp: '',
220 status: null, 220 status: null,
221 notifyUrl: '', 221 notifyUrl: '',
222 notifyStatus: null, 222 notifyStatus: null,
223 refundStatus: null, 223 refundStatus: null,
224 refundTimes: '', 224 refundTimes: '',
225 - refundAmount: null, 225 + refundPrice: null,
226 createTime: '', 226 createTime: '',
227 successTime: '', 227 successTime: '',
228 notifyTime: '', 228 notifyTime: '',
@@ -262,15 +262,15 @@ export default { @@ -262,15 +262,15 @@ export default {
262 body: null, 262 body: null,
263 notifyUrl: null, 263 notifyUrl: null,
264 notifyStatus: null, 264 notifyStatus: null,
265 - amount: null, 265 + price: null,
266 channelFeeRate: null, 266 channelFeeRate: null,
267 - channelFeeAmount: null, 267 + channelFeePrice: null,
268 status: null, 268 status: null,
269 userIp: null, 269 userIp: null,
270 successExtensionId: null, 270 successExtensionId: null,
271 refundStatus: null, 271 refundStatus: null,
272 refundTimes: null, 272 refundTimes: null,
273 - refundAmount: null, 273 + refundPrice: null,
274 channelUserId: null, 274 channelUserId: null,
275 channelOrderNo: null, 275 channelOrderNo: null,
276 expireTime: [], 276 expireTime: [],
@@ -285,7 +285,7 @@ export default { @@ -285,7 +285,7 @@ export default {
285 // 支付应用列表集合 285 // 支付应用列表集合
286 appList: null, 286 appList: null,
287 // 支付渠道编码字典数据集合 287 // 支付渠道编码字典数据集合
288 - payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE), 288 + payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE),
289 // 订单回调商户状态字典数据集合 289 // 订单回调商户状态字典数据集合
290 payOrderNotifyDictDatum: getDictDatas(DICT_TYPE.PAY_ORDER_NOTIFY_STATUS), 290 payOrderNotifyDictDatum: getDictDatas(DICT_TYPE.PAY_ORDER_NOTIFY_STATUS),
291 // 订单状态字典数据集合 291 // 订单状态字典数据集合
yudao-ui-admin/src/views/pay/refund/index.vue
@@ -95,14 +95,14 @@ @@ -95,14 +95,14 @@
95 </p> 95 </p>
96 </template> 96 </template>
97 </el-table-column> 97 </el-table-column>
98 - <el-table-column label="支付金额(元)" align="center" prop="payAmount" width="100"> 98 + <el-table-column label="支付金额(元)" align="center" prop="payPrice" width="100">
99 <template v-slot="scope" class=""> 99 <template v-slot="scope" class="">
100 - ¥{{ parseFloat(scope.row.payAmount / 100).toFixed(2) }} 100 + ¥{{ parseFloat(scope.row.payPrice / 100).toFixed(2) }}
101 </template> 101 </template>
102 </el-table-column> 102 </el-table-column>
103 - <el-table-column label="退款金额(元)" align="center" prop="refundAmount" width="100"> 103 + <el-table-column label="退款金额(元)" align="center" prop="refundPrice" width="100">
104 <template v-slot="scope"> 104 <template v-slot="scope">
105 - ¥{{ parseFloat(scope.row.refundAmount / 100).toFixed(2) }} 105 + ¥{{ parseFloat(scope.row.refundPrice / 100).toFixed(2) }}
106 </template> 106 </template>
107 </el-table-column> 107 </el-table-column>
108 <el-table-column label="退款类型" align="center" prop="type" width="80"> 108 <el-table-column label="退款类型" align="center" prop="type" width="80">
@@ -160,10 +160,10 @@ @@ -160,10 +160,10 @@
160 <el-divider></el-divider> 160 <el-divider></el-divider>
161 <el-descriptions :column="2" label-class-name="desc-label"> 161 <el-descriptions :column="2" label-class-name="desc-label">
162 <el-descriptions-item label="支付金额"> 162 <el-descriptions-item label="支付金额">
163 - {{ parseFloat(refundDetail.payAmount / 100).toFixed(2) }} 163 + {{ parseFloat(refundDetail.payPrice / 100).toFixed(2) }}
164 </el-descriptions-item> 164 </el-descriptions-item>
165 <el-descriptions-item label="退款金额" size="mini"> 165 <el-descriptions-item label="退款金额" size="mini">
166 - <el-tag class="tag-purple" size="mini">{{ parseFloat(refundDetail.refundAmount / 100).toFixed(2) }}</el-tag> 166 + <el-tag class="tag-purple" size="mini">{{ parseFloat(refundDetail.refundPrice / 100).toFixed(2) }}</el-tag>
167 </el-descriptions-item> 167 </el-descriptions-item>
168 <el-descriptions-item label="退款类型"> 168 <el-descriptions-item label="退款类型">
169 <template v-slot="scope"> 169 <template v-slot="scope">
@@ -234,9 +234,9 @@ const defaultRefundDetail = { @@ -234,9 +234,9 @@ const defaultRefundDetail = {
234 notifyTime: null, 234 notifyTime: null,
235 notifyUrl: '', 235 notifyUrl: '',
236 orderId: null, 236 orderId: null,
237 - payAmount: null, 237 + payPrice: null,
238 reason: '', 238 reason: '',
239 - refundAmount: null, 239 + refundPrice: null,
240 status: null, 240 status: null,
241 subject: '', 241 subject: '',
242 successTime: null, 242 successTime: null,
@@ -277,8 +277,8 @@ export default { @@ -277,8 +277,8 @@ export default {
277 notifyStatus: null, 277 notifyStatus: null,
278 status: null, 278 status: null,
279 type: null, 279 type: null,
280 - payAmount: null,  
281 - refundAmount: null, 280 + payPrice: null,
  281 + refundPrice: null,
282 reason: null, 282 reason: null,
283 userIp: null, 283 userIp: null,
284 channelOrderNo: null, 284 channelOrderNo: null,
@@ -298,7 +298,7 @@ export default { @@ -298,7 +298,7 @@ export default {
298 // 支付应用列表集合 298 // 支付应用列表集合
299 appList: null, 299 appList: null,
300 // 支付渠道编码字典数据集合 300 // 支付渠道编码字典数据集合
301 - payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE), 301 + payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE),
302 // 订单退款状态字典数据集合 302 // 订单退款状态字典数据集合
303 payRefundOrderDictDatum: getDictDatas(DICT_TYPE.PAY_REFUND_ORDER_STATUS), 303 payRefundOrderDictDatum: getDictDatas(DICT_TYPE.PAY_REFUND_ORDER_STATUS),
304 // 退款订单类别字典数据集合 304 // 退款订单类别字典数据集合