mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-23 07:41:53 +08:00
Merge remote-tracking branch 'yudao/feature/mall_product' into feature/mall_product
This commit is contained in:
commit
927f71c7e2
@ -11,7 +11,7 @@
|
|||||||
Target Server Version : 80026
|
Target Server Version : 80026
|
||||||
File Encoding : 65001
|
File Encoding : 65001
|
||||||
|
|
||||||
Date: 13/04/2023 23:37:01
|
Date: 09/07/2023 20:25:37
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
@ -415,7 +415,7 @@ CREATE TABLE `bpm_task_assign_rule` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 275 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Bpm 任务规则表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 276 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Bpm 任务规则表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of bpm_task_assign_rule
|
-- Records of bpm_task_assign_rule
|
||||||
@ -546,7 +546,7 @@ CREATE TABLE `infra_api_error_log` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 1110 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志';
|
) ENGINE = InnoDB AUTO_INCREMENT = 1291 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统异常日志';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_api_error_log
|
-- Records of infra_api_error_log
|
||||||
@ -584,7 +584,7 @@ CREATE TABLE `infra_codegen_column` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 1688 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义';
|
) ENGINE = InnoDB AUTO_INCREMENT = 1698 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成表字段定义';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_codegen_column
|
-- Records of infra_codegen_column
|
||||||
@ -644,7 +644,7 @@ CREATE TABLE `infra_config` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '参数配置表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '参数配置表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_config
|
-- Records of infra_config
|
||||||
@ -655,6 +655,7 @@ INSERT INTO `infra_config` (`id`, `category`, `type`, `name`, `config_key`, `val
|
|||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
|
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');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -699,7 +700,7 @@ CREATE TABLE `infra_file` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 912 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 953 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_file
|
-- Records of infra_file
|
||||||
@ -753,7 +754,7 @@ CREATE TABLE `infra_file_content` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '文件表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_file_content
|
-- Records of infra_file_content
|
||||||
@ -812,7 +813,7 @@ CREATE TABLE `infra_job_log` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 168767 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务日志表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '定时任务日志表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of infra_job_log
|
-- Records of infra_job_log
|
||||||
@ -867,7 +868,7 @@ CREATE TABLE `member_user` (
|
|||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
UNIQUE INDEX `uk_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号'
|
UNIQUE INDEX `uk_mobile`(`mobile` ASC) USING BTREE COMMENT '手机号'
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 247 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户';
|
) ENGINE = InnoDB AUTO_INCREMENT = 248 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of member_user
|
-- Records of member_user
|
||||||
@ -935,7 +936,7 @@ CREATE TABLE `system_dict_data` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 1234 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 1341 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典数据表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_dict_data
|
-- Records of system_dict_data
|
||||||
@ -1147,6 +1148,24 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st
|
|||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -1167,7 +1186,7 @@ CREATE TABLE `system_dict_type` (
|
|||||||
`deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
|
`deleted_time` datetime NULL DEFAULT NULL COMMENT '删除时间',
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
UNIQUE INDEX `dict_type`(`type` ASC) USING BTREE
|
UNIQUE INDEX `dict_type`(`type` ASC) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 169 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 173 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '字典类型表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_dict_type
|
-- Records of system_dict_type
|
||||||
@ -1233,6 +1252,10 @@ INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creat
|
|||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -1252,7 +1275,7 @@ CREATE TABLE `system_error_code` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 5832 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '错误码表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 5833 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '错误码表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_error_code
|
-- Records of system_error_code
|
||||||
@ -1281,7 +1304,7 @@ CREATE TABLE `system_login_log` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 2163 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录';
|
) ENGINE = InnoDB AUTO_INCREMENT = 2223 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '系统访问记录';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_login_log
|
-- Records of system_login_log
|
||||||
@ -1411,7 +1434,7 @@ CREATE TABLE `system_menu` (
|
|||||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 2162 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表';
|
) ENGINE = InnoDB AUTO_INCREMENT = 2301 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_menu
|
-- Records of system_menu
|
||||||
@ -1550,7 +1573,6 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i
|
|||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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
|
|||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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
|
|||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
|
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');
|
||||||
`component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
|
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');
|
||||||
`updater`, `update_time`, `deleted`)
|
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');
|
||||||
VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, b'1', b'1',
|
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');
|
||||||
b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0');
|
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');
|
||||||
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
|
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');
|
||||||
`component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
|
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');
|
||||||
`updater`, `update_time`, `deleted`)
|
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');
|
||||||
VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, b'1', b'1',
|
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');
|
||||||
b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
|
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');
|
||||||
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
|
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');
|
||||||
`component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
|
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');
|
||||||
`updater`, `update_time`, `deleted`)
|
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');
|
||||||
VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, b'1', b'1',
|
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');
|
||||||
b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
|
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');
|
||||||
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
|
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');
|
||||||
`component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
|
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');
|
||||||
`updater`, `update_time`, `deleted`)
|
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');
|
||||||
VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, b'1', b'1',
|
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');
|
||||||
b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
|
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');
|
||||||
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, 0, 2030, 'seckill-activity', 'time-range',
|
|
||||||
'mall/promotion/seckill/seckillActivity/index', 'PromotionSeckillActivity', 0, b'1', b'1', b'1', '',
|
|
||||||
'2022-11-06 22:24:49', '1', '2023-04-08 11:46:02', b'0');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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, 0, 2030, 'seckill-time', '', 'mall/promotion/seckill/SeckillConfig/index',
|
|
||||||
'PromotionSeckillConfig', 0, b'0', b'1', b'1', '', '2022-11-15 19:46:50', '1', '2023-04-08 11:46:17', b'0');
|
|
||||||
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-time:query', 3, 1, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
|
|
||||||
'2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
|
|
||||||
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-time:create', 3, 2, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
|
|
||||||
'2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
|
|
||||||
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-time:update', 3, 3, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
|
|
||||||
'2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
|
|
||||||
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-time:delete', 3, 4, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
|
|
||||||
'2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
|
|
||||||
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 (2071, '秒杀时段导出', 'promotion:seckill-time:export', 3, 5, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
|
|
||||||
'2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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
|
|||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
|
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');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -1999,7 +1962,7 @@ CREATE TABLE `system_oauth2_access_token` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 1785 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌';
|
) ENGINE = InnoDB AUTO_INCREMENT = 2007 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 访问令牌';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_oauth2_access_token
|
-- Records of system_oauth2_access_token
|
||||||
@ -2121,7 +2084,7 @@ CREATE TABLE `system_oauth2_refresh_token` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 738 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌';
|
) ENGINE = InnoDB AUTO_INCREMENT = 785 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'OAuth2 刷新令牌';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_oauth2_refresh_token
|
-- Records of system_oauth2_refresh_token
|
||||||
@ -2161,7 +2124,7 @@ CREATE TABLE `system_operate_log` (
|
|||||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||||
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 6440 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录';
|
) ENGINE = InnoDB AUTO_INCREMENT = 6601 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '操作日志记录';
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Records of system_operate_log
|
-- Records of system_operate_log
|
||||||
@ -2743,7 +2706,6 @@ INSERT INTO `system_role_menu` (`id`, `role_id`, `menu_id`, `creator`, `create_t
|
|||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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
|
|||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
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);
|
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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` (
|
|||||||
BEGIN;
|
BEGIN;
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
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');
|
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');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
@ -3459,7 +3415,7 @@ CREATE TABLE `system_users` (
|
|||||||
-- Records of system_users
|
-- Records of system_users
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
BEGIN;
|
BEGIN;
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.framework.pay.core.client;
|
package cn.iocoder.yudao.framework.pay.core.client;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||||
|
|
||||||
import javax.validation.ConstraintViolation;
|
import javax.validation.ConstraintViolation;
|
||||||
@ -19,24 +20,11 @@ import java.util.Set;
|
|||||||
// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型
|
// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型
|
||||||
public interface PayClientConfig {
|
public interface PayClientConfig {
|
||||||
|
|
||||||
/**
|
|
||||||
* 配置验证参数是
|
|
||||||
*
|
|
||||||
* @param validator 校验对象
|
|
||||||
* @return 配置好的验证参数
|
|
||||||
*/
|
|
||||||
Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator);
|
|
||||||
|
|
||||||
// TODO @aquan:貌似抽象一个 validation group 就好了!
|
|
||||||
/**
|
/**
|
||||||
* 参数校验
|
* 参数校验
|
||||||
*
|
*
|
||||||
* @param validator 校验对象
|
* @param validator 校验对象
|
||||||
*/
|
*/
|
||||||
default void validate(Validator validator) {
|
void validate(Validator validator);
|
||||||
Set<ConstraintViolation<PayClientConfig>> violations = verifyParam(validator);
|
|
||||||
if (!violations.isEmpty()) {
|
|
||||||
throw new ConstraintViolationException(violations);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.yudao.framework.pay.core.client.dto.order;
|
package cn.iocoder.yudao.framework.pay.core.client.dto.order;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
|
import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -24,19 +24,15 @@ public class PayOrderUnifiedRespDTO {
|
|||||||
private String displayContent;
|
private String displayContent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付状态
|
* 同步的通知信息
|
||||||
*
|
*
|
||||||
* 枚举 {@link PayOrderStatusRespEnum} 类
|
* 目前只有 bar 条码支付才会出现,它是支付发起时,直接返回是否支付成功的,而其它支付还是异步通知
|
||||||
*/
|
*/
|
||||||
private Integer status;
|
private PayOrderNotifyRespDTO notify;
|
||||||
|
|
||||||
public PayOrderUnifiedRespDTO(String displayMode, String displayContent) {
|
public PayOrderUnifiedRespDTO(String displayMode, String displayContent) {
|
||||||
this(displayMode, displayContent, PayOrderStatusRespEnum.WAITING.getStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
public PayOrderUnifiedRespDTO(String displayMode, String displayContent, Integer status) {
|
|
||||||
this.displayMode = displayMode;
|
this.displayMode = displayMode;
|
||||||
this.displayContent = displayContent;
|
this.displayContent = displayContent;
|
||||||
this.status = status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
|
package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ -18,15 +19,6 @@ import java.util.Set;
|
|||||||
@Data
|
@Data
|
||||||
public class AlipayPayClientConfig implements PayClientConfig {
|
public class AlipayPayClientConfig implements PayClientConfig {
|
||||||
|
|
||||||
/**
|
|
||||||
* 网关地址 - 线上
|
|
||||||
*/
|
|
||||||
public static final String SERVER_URL_PROD = "https://openapi.alipay.com/gateway.do";
|
|
||||||
/**
|
|
||||||
* 网关地址 - 沙箱
|
|
||||||
*/
|
|
||||||
public static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 公钥类型 - 公钥模式
|
* 公钥类型 - 公钥模式
|
||||||
*/
|
*/
|
||||||
@ -43,8 +35,9 @@ public class AlipayPayClientConfig implements PayClientConfig {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 网关地址
|
* 网关地址
|
||||||
* 1. {@link #SERVER_URL_PROD}
|
*
|
||||||
* 2. {@link #SERVER_URL_SANDBOX}
|
* 1. <a href="https://openapi.alipay.com/gateway.do">生产环境</a>
|
||||||
|
* 2. <a href="https://openapi-sandbox.dl.alipaydev.com/gateway.do">沙箱环境</a>
|
||||||
*/
|
*/
|
||||||
@NotBlank(message = "网关地址不能为空", groups = {ModePublicKey.class, ModeCertificate.class})
|
@NotBlank(message = "网关地址不能为空", groups = {ModePublicKey.class, ModeCertificate.class})
|
||||||
private String serverUrl;
|
private String serverUrl;
|
||||||
@ -108,9 +101,8 @@ public class AlipayPayClientConfig implements PayClientConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator) {
|
public void validate(Validator validator) {
|
||||||
// TODO 芋艿:参数校验
|
ValidationUtils.validate(validator, this,
|
||||||
return validator.validate(this,
|
|
||||||
MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class);
|
MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,13 +5,13 @@ import cn.hutool.core.thread.ThreadUtil;
|
|||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
|
import cn.iocoder.yudao.framework.pay.core.client.dto.notify.PayOrderNotifyRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedRespDTO;
|
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedRespDTO;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
|
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
|
import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum;
|
|
||||||
import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
|
import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
|
||||||
import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
|
import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
|
||||||
import com.github.binarywang.wxpay.constant.WxPayConstants;
|
import com.github.binarywang.wxpay.constant.WxPayConstants;
|
||||||
@ -70,9 +70,15 @@ public class WxBarPayClient extends AbstractWxPayClient {
|
|||||||
try {
|
try {
|
||||||
WxPayMicropayResult response = client.micropay(request);
|
WxPayMicropayResult response = client.micropay(request);
|
||||||
// 支付成功(例如说,用户输入了密码)
|
// 支付成功(例如说,用户输入了密码)
|
||||||
|
PayOrderNotifyRespDTO notify = PayOrderNotifyRespDTO.builder()
|
||||||
|
.orderExtensionNo(response.getOutTradeNo())
|
||||||
|
.channelOrderNo(response.getTransactionId())
|
||||||
|
.channelUserId(response.getOpenid())
|
||||||
|
.successTime(parseDateV2(response.getTimeEnd()))
|
||||||
|
.build();
|
||||||
return new PayOrderUnifiedRespDTO(PayOrderDisplayModeEnum.BAR_CODE.getMode(),
|
return new PayOrderUnifiedRespDTO(PayOrderDisplayModeEnum.BAR_CODE.getMode(),
|
||||||
JsonUtils.toJsonString(response),
|
JsonUtils.toJsonString(response))
|
||||||
PayOrderStatusRespEnum.SUCCESS.getStatus());
|
.setNotify(notify);
|
||||||
} catch (WxPayException ex) {
|
} catch (WxPayException ex) {
|
||||||
// 如果不满足这 3 种任一的,则直接抛出 WxPayException 异常,不仅需处理
|
// 如果不满足这 3 种任一的,则直接抛出 WxPayException 异常,不仅需处理
|
||||||
// 1. SYSTEMERROR:接口返回错误:请立即调用被扫订单结果查询API,查询当前订单状态,并根据订单的状态决定下一步的操作。
|
// 1. SYSTEMERROR:接口返回错误:请立即调用被扫订单结果查询API,查询当前订单状态,并根据订单的状态决定下一步的操作。
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
package cn.iocoder.yudao.framework.pay.core.client.impl.weixin;
|
package cn.iocoder.yudao.framework.pay.core.client.impl.weixin;
|
||||||
|
|
||||||
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.io.IoUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import javax.validation.ConstraintViolation;
|
|
||||||
import javax.validation.Validator;
|
import javax.validation.Validator;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信支付的 PayClientConfig 实现类
|
* 微信支付的 PayClientConfig 实现类
|
||||||
@ -100,8 +99,9 @@ public class WxPayClientConfig implements PayClientConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<ConstraintViolation<PayClientConfig>> verifyParam(Validator validator) {
|
public void validate(Validator validator) {
|
||||||
return validator.validate(this, this.getApiVersion().equals(API_VERSION_V2) ? V2.class : V3.class);
|
ValidationUtils.validate(validator, this,
|
||||||
|
API_VERSION_V2.equals(this.getApiVersion()) ? V2.class : V3.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws FileNotFoundException {
|
public static void main(String[] args) throws FileNotFoundException {
|
||||||
|
@ -24,6 +24,8 @@ import java.io.FileNotFoundException;
|
|||||||
@Disabled
|
@Disabled
|
||||||
public class PayClientFactoryImplIntegrationTest {
|
public class PayClientFactoryImplIntegrationTest {
|
||||||
|
|
||||||
|
private static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do";
|
||||||
|
|
||||||
private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl();
|
private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,7 +81,7 @@ public class PayClientFactoryImplIntegrationTest {
|
|||||||
// 创建配置
|
// 创建配置
|
||||||
AlipayPayClientConfig config = new AlipayPayClientConfig();
|
AlipayPayClientConfig config = new AlipayPayClientConfig();
|
||||||
config.setAppId("2021000118634035");
|
config.setAppId("2021000118634035");
|
||||||
config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX);
|
config.setServerUrl(SERVER_URL_SANDBOX);
|
||||||
config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
|
config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
|
||||||
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=");
|
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=");
|
||||||
config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
|
config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
|
||||||
@ -103,7 +105,7 @@ public class PayClientFactoryImplIntegrationTest {
|
|||||||
// 创建配置
|
// 创建配置
|
||||||
AlipayPayClientConfig config = new AlipayPayClientConfig();
|
AlipayPayClientConfig config = new AlipayPayClientConfig();
|
||||||
config.setAppId("2021000118634035");
|
config.setAppId("2021000118634035");
|
||||||
config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX);
|
config.setServerUrl(SERVER_URL_SANDBOX);
|
||||||
config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
|
config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
|
||||||
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=");
|
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=");
|
||||||
config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
|
config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
|
||||||
|
@ -22,9 +22,11 @@ import static org.mockito.Mockito.when;
|
|||||||
|
|
||||||
public class AlipayQrPayClientTest extends BaseMockitoUnitTest {
|
public class AlipayQrPayClientTest extends BaseMockitoUnitTest {
|
||||||
|
|
||||||
|
private static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do";
|
||||||
|
|
||||||
private final AlipayPayClientConfig config = new AlipayPayClientConfig()
|
private final AlipayPayClientConfig config = new AlipayPayClientConfig()
|
||||||
.setAppId("2021000118634035")
|
.setAppId("2021000118634035")
|
||||||
.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX)
|
.setServerUrl(SERVER_URL_SANDBOX)
|
||||||
.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)
|
.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)
|
||||||
// TODO @tina:key 可以随机就好,简洁一点哈。
|
// TODO @tina:key 可以随机就好,简洁一点哈。
|
||||||
.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJ" +
|
.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJ" +
|
||||||
|
@ -82,9 +82,9 @@ public class TenantUtils {
|
|||||||
* 将多租户编号,添加到 header 中
|
* 将多租户编号,添加到 header 中
|
||||||
*
|
*
|
||||||
* @param headers HTTP 请求 headers
|
* @param headers HTTP 请求 headers
|
||||||
|
* @param tenantId 租户编号
|
||||||
*/
|
*/
|
||||||
public static void addTenantHeader(Map<String, String> headers) {
|
public static void addTenantHeader(Map<String, String> headers, Long tenantId) {
|
||||||
Long tenantId = TenantContextHolder.getTenantId();
|
|
||||||
if (tenantId != null) {
|
if (tenantId != null) {
|
||||||
headers.put(HEADER_TENANT_ID, tenantId.toString());
|
headers.put(HEADER_TENANT_ID, tenantId.toString());
|
||||||
}
|
}
|
||||||
|
@ -102,6 +102,10 @@ public class RandomUtils {
|
|||||||
return randomString() + "@qq.com";
|
return randomString() + "@qq.com";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String randomURL() {
|
||||||
|
return "https://www.iocoder.cn/" + randomString();
|
||||||
|
}
|
||||||
|
|
||||||
@SafeVarargs
|
@SafeVarargs
|
||||||
public static <T> T randomPojo(Class<T> clazz, Consumer<T>... consumers) {
|
public static <T> T randomPojo(Class<T> clazz, Consumer<T>... consumers) {
|
||||||
T pojo = PODAM_FACTORY.manufacturePojo(clazz);
|
T pojo = PODAM_FACTORY.manufacturePojo(clazz);
|
||||||
|
@ -38,7 +38,7 @@ public interface TradeAfterSaleConvert {
|
|||||||
|
|
||||||
@Mappings({
|
@Mappings({
|
||||||
@Mapping(source = "afterSale.applyReason", target = "reason"),
|
@Mapping(source = "afterSale.applyReason", target = "reason"),
|
||||||
@Mapping(source = "afterSale.refundPrice", target = "amount")
|
@Mapping(source = "afterSale.refundPrice", target = "price")
|
||||||
})
|
})
|
||||||
PayRefundCreateReqDTO convert(String userIp, TradeAfterSaleDO afterSale,
|
PayRefundCreateReqDTO convert(String userIp, TradeAfterSaleDO afterSale,
|
||||||
TradeOrderProperties orderProperties);
|
TradeOrderProperties orderProperties);
|
||||||
|
@ -106,7 +106,7 @@ public interface TradeOrderConvert {
|
|||||||
createReqDTO.setSubject(subject);
|
createReqDTO.setSubject(subject);
|
||||||
createReqDTO.setBody(subject); // TODO 芋艿:临时写死
|
createReqDTO.setBody(subject); // TODO 芋艿:临时写死
|
||||||
// 订单相关字段
|
// 订单相关字段
|
||||||
createReqDTO.setAmount(order.getPayPrice()).setExpireTime(addTime(orderProperties.getExpireTime()));
|
createReqDTO.setPrice(order.getPayPrice()).setExpireTime(addTime(orderProperties.getExpireTime()));
|
||||||
return createReqDTO;
|
return createReqDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,7 +238,7 @@ public interface TradeOrderConvert {
|
|||||||
AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems);
|
AppTradeOrderDetailRespVO orderVO = convert3(order, orderItems);
|
||||||
orderVO.setPayExpireTime(addTime(tradeOrderProperties.getExpireTime()));
|
orderVO.setPayExpireTime(addTime(tradeOrderProperties.getExpireTime()));
|
||||||
if (StrUtil.isNotEmpty(order.getPayChannelCode())) {
|
if (StrUtil.isNotEmpty(order.getPayChannelCode())) {
|
||||||
orderVO.setPayChannelName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.CHANNEL_CODE_TYPE, order.getPayChannelCode()));
|
orderVO.setPayChannelName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.CHANNEL_CODE, order.getPayChannelCode()));
|
||||||
}
|
}
|
||||||
// 处理商品属性
|
// 处理商品属性
|
||||||
Map<Long, ProductPropertyValueDetailRespDTO> propertyValueDetailMap = convertMap(propertyValueDetails, ProductPropertyValueDetailRespDTO::getValueId);
|
Map<Long, ProductPropertyValueDetailRespDTO> propertyValueDetailMap = convertMap(propertyValueDetails, ProductPropertyValueDetailRespDTO::getValueId);
|
||||||
|
@ -320,7 +320,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
|
|||||||
throw exception(ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS);
|
throw exception(ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS);
|
||||||
}
|
}
|
||||||
// 校验支付金额一致
|
// 校验支付金额一致
|
||||||
if (ObjectUtil.notEqual(payOrder.getAmount(), order.getPayPrice())) {
|
if (ObjectUtil.notEqual(payOrder.getPrice(), order.getPayPrice())) {
|
||||||
log.error("[validateOrderPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]",
|
log.error("[validateOrderPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]",
|
||||||
id, payOrderId, JsonUtils.toJsonString(order), JsonUtils.toJsonString(payOrder));
|
id, payOrderId, JsonUtils.toJsonString(order), JsonUtils.toJsonString(payOrder));
|
||||||
throw exception(ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH);
|
throw exception(ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH);
|
||||||
|
@ -144,7 +144,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
|
|||||||
assertNotNull(createReqDTO.getMerchantOrderId()); // 由于 tradeOrderId 后生成,只能校验非空
|
assertNotNull(createReqDTO.getMerchantOrderId()); // 由于 tradeOrderId 后生成,只能校验非空
|
||||||
assertEquals(createReqDTO.getSubject(), "商品 1 等多件");
|
assertEquals(createReqDTO.getSubject(), "商品 1 等多件");
|
||||||
assertNull(createReqDTO.getBody());
|
assertNull(createReqDTO.getBody());
|
||||||
assertEquals(createReqDTO.getAmount(), 80);
|
assertEquals(createReqDTO.getPrice(), 80);
|
||||||
assertNotNull(createReqDTO.getExpireTime());
|
assertNotNull(createReqDTO.getExpireTime());
|
||||||
return true;
|
return true;
|
||||||
}))).thenReturn(1000L);
|
}))).thenReturn(1000L);
|
||||||
@ -257,7 +257,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
|
|||||||
// mock 方法(支付单)
|
// mock 方法(支付单)
|
||||||
when(payOrderApi.getOrder(eq(10L))).thenReturn(randomPojo(PayOrderRespDTO.class,
|
when(payOrderApi.getOrder(eq(10L))).thenReturn(randomPojo(PayOrderRespDTO.class,
|
||||||
o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()).setChannelCode("wx_pub")
|
o -> o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()).setChannelCode("wx_pub")
|
||||||
.setMerchantOrderId("1")).setAmount(100));
|
.setMerchantOrderId("1")).setPrice(100));
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
tradeOrderService.updateOrderPaid(id, payOrderId);
|
tradeOrderService.updateOrderPaid(id, payOrderId);
|
||||||
|
@ -42,7 +42,6 @@ public class PayOrderCreateReqDTO implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 商品描述
|
* 商品描述
|
||||||
*/
|
*/
|
||||||
// @NotEmpty(message = "商品描述信息不能为空")
|
|
||||||
@Length(max = 128, message = "商品描述信息长度不能超过128")
|
@Length(max = 128, message = "商品描述信息长度不能超过128")
|
||||||
private String body;
|
private String body;
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ public class PayOrderCreateReqDTO implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@NotNull(message = "支付金额不能为空")
|
@NotNull(message = "支付金额不能为空")
|
||||||
@DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
|
@DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
|
||||||
private Integer amount;
|
private Integer price;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付过期时间
|
* 支付过期时间
|
||||||
|
@ -35,7 +35,7 @@ public class PayOrderRespDTO {
|
|||||||
/**
|
/**
|
||||||
* 支付金额,单位:分
|
* 支付金额,单位:分
|
||||||
*/
|
*/
|
||||||
private Integer amount;
|
private Integer price;
|
||||||
/**
|
/**
|
||||||
* 支付状态
|
* 支付状态
|
||||||
*
|
*
|
||||||
|
@ -48,5 +48,5 @@ public class PayRefundCreateReqDTO {
|
|||||||
*/
|
*/
|
||||||
@NotNull(message = "退款金额不能为空")
|
@NotNull(message = "退款金额不能为空")
|
||||||
@Min(value = 1, message = "退款金额必须大于零")
|
@Min(value = 1, message = "退款金额必须大于零")
|
||||||
private Integer amount;
|
private Integer price;
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ public class PayRefundRespDTO {
|
|||||||
/**
|
/**
|
||||||
* 退款金额,单位:分
|
* 退款金额,单位:分
|
||||||
*/
|
*/
|
||||||
private Integer refundAmount;
|
private Integer refundPrice;
|
||||||
|
|
||||||
// ========== 商户相关字段 ==========
|
// ========== 商户相关字段 ==========
|
||||||
/**
|
/**
|
||||||
|
@ -7,7 +7,7 @@ package cn.iocoder.yudao.module.pay.enums;
|
|||||||
*/
|
*/
|
||||||
public interface DictTypeConstants {
|
public interface DictTypeConstants {
|
||||||
|
|
||||||
String CHANNEL_CODE_TYPE = "pay_channel_code_type"; // 支付-渠道名
|
String CHANNEL_CODE = "pay_channel_code"; // 支付-渠道名
|
||||||
|
|
||||||
String ORDER_STATUS = "pay_order_status"; // 支付-订单-订单状态
|
String ORDER_STATUS = "pay_order_status"; // 支付-订单-订单状态
|
||||||
String ORDER_NOTIFY_STATUS = "pay_order_notify_status"; // 支付-订单-订单回调商户状态
|
String ORDER_NOTIFY_STATUS = "pay_order_notify_status"; // 支付-订单-订单回调商户状态
|
||||||
|
@ -12,7 +12,8 @@ public interface ErrorCodeConstants {
|
|||||||
// ========== APP 模块 1007000000 ==========
|
// ========== APP 模块 1007000000 ==========
|
||||||
ErrorCode PAY_APP_NOT_FOUND = new ErrorCode(1007000000, "App 不存在");
|
ErrorCode PAY_APP_NOT_FOUND = new ErrorCode(1007000000, "App 不存在");
|
||||||
ErrorCode PAY_APP_IS_DISABLE = new ErrorCode(1007000002, "App 已经被禁用");
|
ErrorCode PAY_APP_IS_DISABLE = new ErrorCode(1007000002, "App 已经被禁用");
|
||||||
ErrorCode PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE = new ErrorCode(1007000003, "支付应用存在交易中的订单,无法删除");
|
ErrorCode PAY_APP_EXIST_ORDER_CANT_DELETE = new ErrorCode(1007000003, "支付应用存在支付订单,无法删除");
|
||||||
|
ErrorCode PAY_APP_EXIST_REFUND_CANT_DELETE = new ErrorCode(1007000004, "支付应用存在退款订单,无法删除");
|
||||||
|
|
||||||
// ========== CHANNEL 模块 1007001000 ==========
|
// ========== CHANNEL 模块 1007001000 ==========
|
||||||
ErrorCode PAY_CHANNEL_NOT_FOUND = new ErrorCode(1007001000, "支付渠道的配置不存在");
|
ErrorCode PAY_CHANNEL_NOT_FOUND = new ErrorCode(1007001000, "支付渠道的配置不存在");
|
||||||
@ -25,22 +26,19 @@ public interface ErrorCodeConstants {
|
|||||||
ErrorCode PAY_ORDER_NOT_FOUND = new ErrorCode(1007002000, "支付订单不存在");
|
ErrorCode PAY_ORDER_NOT_FOUND = new ErrorCode(1007002000, "支付订单不存在");
|
||||||
ErrorCode PAY_ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(1007002001, "支付订单不处于待支付");
|
ErrorCode PAY_ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(1007002001, "支付订单不处于待支付");
|
||||||
ErrorCode PAY_ORDER_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007002002, "支付订单不处于已支付");
|
ErrorCode PAY_ORDER_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007002002, "支付订单不处于已支付");
|
||||||
|
ErrorCode PAY_ORDER_IS_EXPIRED = new ErrorCode(1007002003, "支付订单已经过期");
|
||||||
|
|
||||||
// ========== ORDER 模块(拓展单) 1007003000 ==========
|
// ========== ORDER 模块(拓展单) 1007003000 ==========
|
||||||
ErrorCode PAY_ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1007003000, "支付交易拓展单不存在");
|
ErrorCode PAY_ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1007003000, "支付交易拓展单不存在");
|
||||||
ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1007003001, "支付交易拓展单不处于待支付");
|
ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1007003001, "支付交易拓展单不处于待支付");
|
||||||
|
|
||||||
// ========== 支付模块(退款) 1007006000 ==========
|
// ========== 支付模块(退款) 1007006000 ==========
|
||||||
ErrorCode PAY_REFUND_AMOUNT_EXCEED = new ErrorCode(1007006000, "退款金额超过订单可退款金额");
|
ErrorCode PAY_PRICE_PRICE_EXCEED = new ErrorCode(1007006000, "退款金额超过订单可退款金额");
|
||||||
ErrorCode PAY_REFUND_ALL_REFUNDED = new ErrorCode(1007006001, "订单已经全额退款");
|
ErrorCode PAY_REFUND_ALL_REFUNDED = new ErrorCode(1007006001, "订单已经全额退款");
|
||||||
ErrorCode PAY_REFUND_CHN_ORDER_NO_IS_NULL = new ErrorCode(1007006002, "该订单的渠道订单为空");
|
ErrorCode PAY_REFUND_CHN_ORDER_NO_IS_NULL = new ErrorCode(1007006002, "该订单的渠道订单为空");
|
||||||
ErrorCode PAY_REFUND_SUCCEED = new ErrorCode(1007006003, "已经退款成功");
|
ErrorCode PAY_REFUND_SUCCEED = new ErrorCode(1007006003, "已经退款成功");
|
||||||
ErrorCode PAY_REFUND_NOT_FOUND = new ErrorCode(1007006004, "支付退款单不存在");
|
ErrorCode PAY_REFUND_NOT_FOUND = new ErrorCode(1007006004, "支付退款单不存在");
|
||||||
|
|
||||||
// ========== 支付商户信息 1007004000 ==========
|
|
||||||
ErrorCode PAY_MERCHANT_NOT_EXISTS = new ErrorCode(1007004000, "支付商户信息不存在");
|
|
||||||
ErrorCode PAY_MERCHANT_EXIST_APP_CANT_DELETE = new ErrorCode(1007004001, "支付商户存在支付应用,无法删除");
|
|
||||||
|
|
||||||
// ========== 示例订单 1007900000 ==========
|
// ========== 示例订单 1007900000 ==========
|
||||||
ErrorCode PAY_DEMO_ORDER_NOT_FOUND = new ErrorCode(1007900000, "示例订单不存在");
|
ErrorCode PAY_DEMO_ORDER_NOT_FOUND = new ErrorCode(1007900000, "示例订单不存在");
|
||||||
ErrorCode PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID = new ErrorCode(1007900001, "示例订单更新支付状态失败,订单不是【未支付】状态");
|
ErrorCode PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID = new ErrorCode(1007900001, "示例订单更新支付状态失败,订单不是【未支付】状态");
|
||||||
|
@ -24,6 +24,7 @@ import javax.validation.Valid;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Tag(name = "管理后台 - 支付应用信息")
|
@Tag(name = "管理后台 - 支付应用信息")
|
||||||
@ -78,15 +79,6 @@ public class PayAppController {
|
|||||||
return success(PayAppConvert.INSTANCE.convert(app));
|
return success(PayAppConvert.INSTANCE.convert(app));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list")
|
|
||||||
@Operation(summary = "获得支付应用信息列表")
|
|
||||||
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
|
|
||||||
@PreAuthorize("@ss.hasPermission('pay:app:query')")
|
|
||||||
public CommonResult<List<PayAppRespVO>> getAppList(@RequestParam("ids") Collection<Long> ids) {
|
|
||||||
List<PayAppDO> list = appService.getAppList(ids);
|
|
||||||
return success(PayAppConvert.INSTANCE.convertList(list));
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@Operation(summary = "获得支付应用信息分页")
|
@Operation(summary = "获得支付应用信息分页")
|
||||||
@PreAuthorize("@ss.hasPermission('pay:app:query')")
|
@PreAuthorize("@ss.hasPermission('pay:app:query')")
|
||||||
@ -94,34 +86,15 @@ public class PayAppController {
|
|||||||
// 得到应用分页列表
|
// 得到应用分页列表
|
||||||
PageResult<PayAppDO> pageResult = appService.getAppPage(pageVO);
|
PageResult<PayAppDO> pageResult = appService.getAppPage(pageVO);
|
||||||
if (CollUtil.isEmpty(pageResult.getList())) {
|
if (CollUtil.isEmpty(pageResult.getList())) {
|
||||||
return success(new PageResult<>(pageResult.getTotal()));
|
return success(PageResult.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到所有的应用编号,查出所有的渠道
|
// 得到所有的应用编号,查出所有的渠道
|
||||||
Collection<Long> payAppIds = CollectionUtils.convertList(pageResult.getList(), PayAppDO::getId);
|
Collection<Long> appIds = convertList(pageResult.getList(), PayAppDO::getId);
|
||||||
List<PayChannelDO> channels = channelService.getChannelListByAppIds(payAppIds);
|
List<PayChannelDO> channels = channelService.getChannelListByAppIds(appIds);
|
||||||
// TODO @aquan:可以基于 appId 简历一个 multiMap。这样下面,直接 get 到之后,CollUtil buildSet 即可
|
|
||||||
Iterator<PayChannelDO> iterator = channels.iterator();
|
|
||||||
|
|
||||||
// 利用反射将渠道数据复制到返回的数据结构中去
|
// 拼接后返回
|
||||||
List<PayAppPageItemRespVO> appList = new ArrayList<>(pageResult.getList().size());
|
return success(PayAppConvert.INSTANCE.convertPage(pageResult, channels));
|
||||||
pageResult.getList().forEach(app -> {
|
|
||||||
// 写入应用信息的数据
|
|
||||||
PayAppPageItemRespVO respVO = PayAppConvert.INSTANCE.pageConvert(app);
|
|
||||||
// 写入支付渠道信息的数据
|
|
||||||
Set<String> channelCodes = new HashSet<>(PayChannelEnum.values().length);
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
PayChannelDO channelDO = iterator.next();
|
|
||||||
if (channelDO.getAppId().equals(app.getId())) {
|
|
||||||
channelCodes.add(channelDO.getCode());
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
respVO.setChannelCodes(channelCodes);
|
|
||||||
appList.add(respVO);
|
|
||||||
});
|
|
||||||
|
|
||||||
return success(new PageResult<>(appList, pageResult.getTotal()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package cn.iocoder.yudao.module.pay.controller.admin.app.vo;
|
package cn.iocoder.yudao.module.pay.controller.admin.app.vo;
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
import org.hibernate.validator.constraints.URL;
|
||||||
|
|
||||||
import javax.validation.constraints.*;
|
import javax.validation.constraints.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -10,23 +14,26 @@ import javax.validation.constraints.*;
|
|||||||
@Data
|
@Data
|
||||||
public class PayAppBaseVO {
|
public class PayAppBaseVO {
|
||||||
|
|
||||||
@Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "小豆")
|
||||||
@NotNull(message = "应用名不能为空")
|
@NotNull(message = "应用名不能为空")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
||||||
@NotNull(message = "开启状态不能为空")
|
@NotNull(message = "开启状态不能为空")
|
||||||
|
@InEnum(CommonStatusEnum.class)
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "备注")
|
@Schema(description = "备注", example = "我是一个测试应用")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
@Schema(description = "支付结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "支付结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/pay-callback")
|
||||||
@NotNull(message = "支付结果的回调地址不能为空")
|
@NotNull(message = "支付结果的回调地址不能为空")
|
||||||
|
@URL(message = "支付结果的回调地址必须为 URL 格式")
|
||||||
private String payNotifyUrl;
|
private String payNotifyUrl;
|
||||||
|
|
||||||
@Schema(description = "退款结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "退款结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/refund-callback")
|
||||||
@NotNull(message = "退款结果的回调地址不能为空")
|
@NotNull(message = "退款结果的回调地址不能为空")
|
||||||
|
@URL(message = "退款结果的回调地址必须为 URL 格式")
|
||||||
private String refundNotifyUrl;
|
private String refundNotifyUrl;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,13 @@ import java.util.Set;
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class PayAppPageItemRespVO extends PayAppBaseVO {
|
public class PayAppPageItemRespVO extends PayAppBaseVO {
|
||||||
|
|
||||||
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
@Schema(description = "渠道编码集合", requiredMode = Schema.RequiredMode.REQUIRED, example = "[alipay_pc, alipay_wap]")
|
@Schema(description = "已配置的支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "[alipay_pc, alipay_wap]")
|
||||||
private Set<String> channelCodes;
|
private Set<String> channelCodes;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,21 +17,12 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class PayAppPageReqVO extends PageParam {
|
public class PayAppPageReqVO extends PageParam {
|
||||||
|
|
||||||
@Schema(description = "应用名")
|
@Schema(description = "应用名", example = "小豆")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "开启状态")
|
@Schema(description = "开启状态", example = "0")
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "备注")
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
@Schema(description = "支付结果的回调地址")
|
|
||||||
private String payNotifyUrl;
|
|
||||||
|
|
||||||
@Schema(description = "退款结果的回调地址")
|
|
||||||
private String refundNotifyUrl;
|
|
||||||
|
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
private LocalDateTime[] createTime;
|
private LocalDateTime[] createTime;
|
||||||
|
@ -10,7 +10,7 @@ import java.time.LocalDateTime;
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class PayAppRespVO extends PayAppBaseVO {
|
public class PayAppRespVO extends PayAppBaseVO {
|
||||||
|
|
||||||
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@ -9,7 +9,7 @@ import javax.validation.constraints.*;
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class PayAppUpdateReqVO extends PayAppBaseVO {
|
public class PayAppUpdateReqVO extends PayAppBaseVO {
|
||||||
|
|
||||||
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
@NotNull(message = "应用编号不能为空")
|
@NotNull(message = "应用编号不能为空")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
|
@ -9,11 +9,11 @@ import javax.validation.constraints.NotNull;
|
|||||||
@Data
|
@Data
|
||||||
public class PayAppUpdateStatusReqVO {
|
public class PayAppUpdateStatusReqVO {
|
||||||
|
|
||||||
@Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
@NotNull(message = "商户编号不能为空")
|
@NotNull(message = "应用编号不能为空")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "状态,见 SysCommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
@Schema(description = "状态,见 SysCommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
@NotNull(message = "状态不能为空")
|
@NotNull(message = "状态不能为空")
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.pay.controller.admin.channel;
|
package cn.iocoder.yudao.module.pay.controller.admin.channel;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelRespVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelRespVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert;
|
import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert;
|
||||||
@ -11,7 +9,6 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
|||||||
import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
|
import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.Parameters;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@ -59,39 +56,19 @@ public class PayChannelController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/get")
|
@GetMapping("/get")
|
||||||
@Operation(summary = "获得支付渠道 ")
|
@Operation(summary = "获得支付渠道")
|
||||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
@PreAuthorize("@ss.hasPermission('pay:channel:query')")
|
@PreAuthorize("@ss.hasPermission('pay:channel:query')")
|
||||||
public CommonResult<PayChannelRespVO> getChannel(@RequestParam("id") Long id) {
|
public CommonResult<PayChannelRespVO> getChannel(@RequestParam(value = "id", required = false) Long id,
|
||||||
PayChannelDO channel = channelService.getChannel(id);
|
@RequestParam(value = "appId", required = false) Long appId,
|
||||||
return success(PayChannelConvert.INSTANCE.convert(channel));
|
@RequestParam(value = "code", required = false) String code) {
|
||||||
}
|
PayChannelDO channel = null;
|
||||||
|
if (id != null) {
|
||||||
@GetMapping("/page")
|
channel = channelService.getChannel(id);
|
||||||
@Operation(summary = "获得支付渠道分页")
|
} else if (appId != null && code != null) {
|
||||||
@PreAuthorize("@ss.hasPermission('pay:channel:query')")
|
channel = channelService.getChannelByAppIdAndCode(appId, code);
|
||||||
public CommonResult<PageResult<PayChannelRespVO>> getChannelPage(@Valid PayChannelPageReqVO pageVO) {
|
|
||||||
PageResult<PayChannelDO> pageResult = channelService.getChannelPage(pageVO);
|
|
||||||
return success(PayChannelConvert.INSTANCE.convertPage(pageResult));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO 芋艿:需要 review 下实现
|
|
||||||
@GetMapping("/get-channel")
|
|
||||||
@Operation(summary = "根据条件查询微信支付渠道")
|
|
||||||
@Parameters({
|
|
||||||
@Parameter(name = "appId", description = "应用编号", required = true, example = "1"),
|
|
||||||
@Parameter(name = "code", description = "支付渠道编码", required = true, example = "wx_pub")
|
|
||||||
})
|
|
||||||
@PreAuthorize("@ss.hasPermission('pay:channel:query')")
|
|
||||||
public CommonResult<PayChannelRespVO> getChannel(@RequestParam Long appId, @RequestParam String code) {
|
|
||||||
// 獲取渠道
|
|
||||||
PayChannelDO channel = channelService.getChannelByConditions(appId, code);
|
|
||||||
if (channel == null) {
|
|
||||||
return success(new PayChannelRespVO());
|
|
||||||
}
|
}
|
||||||
// 拼凑数据
|
return success(PayChannelConvert.INSTANCE.convert(channel));
|
||||||
PayChannelRespVO respVo = PayChannelConvert.INSTANCE.convert(channel);
|
|
||||||
return success(respVo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/get-enable-code-list")
|
@GetMapping("/get-enable-code-list")
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.pay.controller.admin.channel.vo;
|
package cn.iocoder.yudao.module.pay.controller.admin.channel.vo;
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import javax.validation.constraints.*;
|
import javax.validation.constraints.*;
|
||||||
@ -10,22 +12,19 @@ import javax.validation.constraints.*;
|
|||||||
@Data
|
@Data
|
||||||
public class PayChannelBaseVO {
|
public class PayChannelBaseVO {
|
||||||
|
|
||||||
@Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
@NotNull(message = "渠道编码不能为空")
|
|
||||||
private String code;
|
|
||||||
|
|
||||||
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED)
|
|
||||||
@NotNull(message = "开启状态不能为空")
|
@NotNull(message = "开启状态不能为空")
|
||||||
|
@InEnum(CommonStatusEnum.class)
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "备注")
|
@Schema(description = "备注", example = "我是小备注")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
@Schema(description = "渠道费率,单位:百分比", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "渠道费率,单位:百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
|
||||||
@NotNull(message = "渠道费率,单位:百分比不能为空")
|
@NotNull(message = "渠道费率,单位:百分比不能为空")
|
||||||
private Double feeRate;
|
private Double feeRate;
|
||||||
|
|
||||||
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
@NotNull(message = "应用编号不能为空")
|
@NotNull(message = "应用编号不能为空")
|
||||||
private Long appId;
|
private Long appId;
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
|
|||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 支付渠道 创建 Request VO")
|
@Schema(description = "管理后台 - 支付渠道 创建 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@ -13,6 +14,10 @@ import javax.validation.constraints.NotBlank;
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class PayChannelCreateReqVO extends PayChannelBaseVO {
|
public class PayChannelCreateReqVO extends PayChannelBaseVO {
|
||||||
|
|
||||||
|
@Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
|
||||||
|
@NotNull(message = "渠道编码不能为空")
|
||||||
|
private String code;
|
||||||
|
|
||||||
@Schema(description = "渠道配置的 json 字符串")
|
@Schema(description = "渠道配置的 json 字符串")
|
||||||
@NotBlank(message = "渠道配置不能为空")
|
@NotBlank(message = "渠道配置不能为空")
|
||||||
private String config;
|
private String config;
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
package cn.iocoder.yudao.module.pay.controller.admin.channel.vo;
|
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.ToString;
|
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 支付渠道 分页 Request VO")
|
|
||||||
@Data
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@ToString(callSuper = true)
|
|
||||||
public class PayChannelPageReqVO extends PageParam {
|
|
||||||
|
|
||||||
@Schema(description = "渠道编码")
|
|
||||||
private String code;
|
|
||||||
|
|
||||||
@Schema(description = "开启状态")
|
|
||||||
private Integer status;
|
|
||||||
|
|
||||||
@Schema(description = "备注")
|
|
||||||
private String remark;
|
|
||||||
|
|
||||||
@Schema(description = "渠道费率,单位:百分比")
|
|
||||||
private Double feeRate;
|
|
||||||
|
|
||||||
@Schema(description = "应用编号")
|
|
||||||
private Long appId;
|
|
||||||
|
|
||||||
@Schema(description = "支付渠道配置")
|
|
||||||
private String config;
|
|
||||||
|
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
|
||||||
@Schema(description = "创建时间")
|
|
||||||
private LocalDateTime[] createTime;
|
|
||||||
|
|
||||||
}
|
|
@ -10,12 +10,16 @@ import java.time.LocalDateTime;
|
|||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class PayChannelRespVO extends PayChannelBaseVO {
|
public class PayChannelRespVO extends PayChannelBaseVO {
|
||||||
|
|
||||||
@Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
@Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
|
||||||
|
private String code;
|
||||||
|
|
||||||
@Schema(description = "配置", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "配置", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private String config;
|
private String config;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,4 +16,5 @@ public class PayChannelUpdateReqVO extends PayChannelBaseVO {
|
|||||||
@Schema(description = "渠道配置的json字符串")
|
@Schema(description = "渠道配置的json字符串")
|
||||||
@NotBlank(message = "渠道配置不能为空")
|
@NotBlank(message = "渠道配置不能为空")
|
||||||
private String config;
|
private String config;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ public class PayDemoOrderRespVO {
|
|||||||
private Integer price;
|
private Integer price;
|
||||||
|
|
||||||
@Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private Boolean payed;
|
private Boolean payStatus;
|
||||||
|
|
||||||
@Schema(description = "支付订单编号", example = "16863")
|
@Schema(description = "支付订单编号", example = "16863")
|
||||||
private Long payOrderId;
|
private Long payOrderId;
|
||||||
|
@ -49,17 +49,13 @@ public class PayOrderBaseVO {
|
|||||||
|
|
||||||
@Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotNull(message = "支付金额,单位:分不能为空")
|
@NotNull(message = "支付金额,单位:分不能为空")
|
||||||
private Long amount;
|
|
||||||
|
|
||||||
@Schema(description = "支付金额,单位:分", required = true)
|
|
||||||
@NotNull(message = "支付金额,单位:分不能为空")
|
|
||||||
private Long price;
|
private Long price;
|
||||||
|
|
||||||
@Schema(description = "渠道手续费,单位:百分比")
|
@Schema(description = "渠道手续费,单位:百分比")
|
||||||
private Double channelFeeRate;
|
private Double channelFeeRate;
|
||||||
|
|
||||||
@Schema(description = "渠道手续金额,单位:分")
|
@Schema(description = "渠道手续金额,单位:分")
|
||||||
private Long channelFeeAmount;
|
private Long channelFeePrice;
|
||||||
|
|
||||||
@Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotNull(message = "支付状态不能为空")
|
@NotNull(message = "支付状态不能为空")
|
||||||
@ -95,7 +91,7 @@ public class PayOrderBaseVO {
|
|||||||
|
|
||||||
@Schema(description = "退款总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "退款总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
@NotNull(message = "退款总金额,单位:分不能为空")
|
@NotNull(message = "退款总金额,单位:分不能为空")
|
||||||
private Long refundAmount;
|
private Long refundPrice;
|
||||||
|
|
||||||
@Schema(description = "渠道用户编号")
|
@Schema(description = "渠道用户编号")
|
||||||
private String channelUserId;
|
private String channelUserId;
|
||||||
|
@ -35,10 +35,10 @@ public class PayOrderExcelVO {
|
|||||||
private String no;
|
private String no;
|
||||||
|
|
||||||
@ExcelProperty("支付金额,单位:元")
|
@ExcelProperty("支付金额,单位:元")
|
||||||
private String amount;
|
private String price;
|
||||||
|
|
||||||
@ExcelProperty("渠道手续金额,单位:元")
|
@ExcelProperty("渠道手续金额,单位:元")
|
||||||
private String channelFeeAmount;
|
private String channelFeePrice;
|
||||||
|
|
||||||
@ExcelProperty("渠道手续费,单位:百分比")
|
@ExcelProperty("渠道手续费,单位:百分比")
|
||||||
private String channelFeeRate;
|
private String channelFeeRate;
|
||||||
@ -80,7 +80,7 @@ public class PayOrderExcelVO {
|
|||||||
private Integer refundTimes;
|
private Integer refundTimes;
|
||||||
|
|
||||||
@ExcelProperty("退款总金额,单位:元")
|
@ExcelProperty("退款总金额,单位:元")
|
||||||
private String refundAmount;
|
private String refundPrice;
|
||||||
|
|
||||||
@ExcelProperty("商品描述")
|
@ExcelProperty("商品描述")
|
||||||
private String body;
|
private String body;
|
||||||
|
@ -37,13 +37,13 @@ public class PayOrderExportReqVO {
|
|||||||
private Integer notifyStatus;
|
private Integer notifyStatus;
|
||||||
|
|
||||||
@Schema(description = "支付金额,单位:分")
|
@Schema(description = "支付金额,单位:分")
|
||||||
private Long amount;
|
private Long price;
|
||||||
|
|
||||||
@Schema(description = "渠道手续费,单位:百分比")
|
@Schema(description = "渠道手续费,单位:百分比")
|
||||||
private Double channelFeeRate;
|
private Double channelFeeRate;
|
||||||
|
|
||||||
@Schema(description = "渠道手续金额,单位:分")
|
@Schema(description = "渠道手续金额,单位:分")
|
||||||
private Long channelFeeAmount;
|
private Long channelFeePrice;
|
||||||
|
|
||||||
@Schema(description = "支付状态")
|
@Schema(description = "支付状态")
|
||||||
private Integer status;
|
private Integer status;
|
||||||
@ -73,7 +73,7 @@ public class PayOrderExportReqVO {
|
|||||||
private Integer refundTimes;
|
private Integer refundTimes;
|
||||||
|
|
||||||
@Schema(description = "退款总金额,单位:分")
|
@Schema(description = "退款总金额,单位:分")
|
||||||
private Long refundAmount;
|
private Long refundPrice;
|
||||||
|
|
||||||
@Schema(description = "渠道用户编号")
|
@Schema(description = "渠道用户编号")
|
||||||
private String channelUserId;
|
private String channelUserId;
|
||||||
|
@ -42,13 +42,13 @@ public class PayOrderPageReqVO extends PageParam {
|
|||||||
private Integer notifyStatus;
|
private Integer notifyStatus;
|
||||||
|
|
||||||
@Schema(description = "支付金额,单位:分")
|
@Schema(description = "支付金额,单位:分")
|
||||||
private Long amount;
|
private Long price;
|
||||||
|
|
||||||
@Schema(description = "渠道手续费,单位:百分比")
|
@Schema(description = "渠道手续费,单位:百分比")
|
||||||
private Double channelFeeRate;
|
private Double channelFeeRate;
|
||||||
|
|
||||||
@Schema(description = "渠道手续金额,单位:分")
|
@Schema(description = "渠道手续金额,单位:分")
|
||||||
private Long channelFeeAmount;
|
private Long channelFeePrice;
|
||||||
|
|
||||||
@Schema(description = "支付状态")
|
@Schema(description = "支付状态")
|
||||||
private Integer status;
|
private Integer status;
|
||||||
@ -78,7 +78,7 @@ public class PayOrderPageReqVO extends PageParam {
|
|||||||
private Integer refundTimes;
|
private Integer refundTimes;
|
||||||
|
|
||||||
@Schema(description = "退款总金额,单位:分")
|
@Schema(description = "退款总金额,单位:分")
|
||||||
private Long refundAmount;
|
private Long refundPrice;
|
||||||
|
|
||||||
@Schema(description = "渠道用户编号")
|
@Schema(description = "渠道用户编号")
|
||||||
private String channelUserId;
|
private String channelUserId;
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
package cn.iocoder.yudao.module.pay.controller.admin.order.vo;
|
package cn.iocoder.yudao.module.pay.controller.admin.order.vo;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import lombok.experimental.Accessors;
|
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 支付订单提交 Response VO")
|
@Schema(description = "管理后台 - 支付订单提交 Response VO")
|
||||||
@Data
|
@Data
|
||||||
public class PayOrderSubmitRespVO {
|
public class PayOrderSubmitRespVO {
|
||||||
|
|
||||||
|
@Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") // 参见 PayOrderStatusEnum 枚举
|
||||||
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "展示模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "url") // 参见 PayDisplayModeEnum 枚举
|
@Schema(description = "展示模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "url") // 参见 PayDisplayModeEnum 枚举
|
||||||
private String displayMode;
|
private String displayMode;
|
||||||
|
|
||||||
@Schema(description = "展示内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "展示内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private String displayContent;
|
private String displayContent;
|
||||||
|
|
||||||
|
@ -53,10 +53,10 @@ public class PayRefundExcelVO {
|
|||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
@ExcelProperty("支付金额,单位:元")
|
@ExcelProperty("支付金额,单位:元")
|
||||||
private String payAmount;
|
private String payPrice;
|
||||||
|
|
||||||
@ExcelProperty("退款金额,单位:元")
|
@ExcelProperty("退款金额,单位:元")
|
||||||
private String refundAmount;
|
private String refundPrice;
|
||||||
|
|
||||||
@ExcelProperty("退款原因")
|
@ExcelProperty("退款原因")
|
||||||
private String reason;
|
private String reason;
|
||||||
|
@ -46,10 +46,10 @@ public class PayRefundExportReqVO {
|
|||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
@Schema(description = "支付金额,单位分")
|
@Schema(description = "支付金额,单位分")
|
||||||
private Long payAmount;
|
private Long payPrice;
|
||||||
|
|
||||||
@Schema(description = "退款金额,单位分")
|
@Schema(description = "退款金额,单位分")
|
||||||
private Long refundAmount;
|
private Long refundPrice;
|
||||||
|
|
||||||
@Schema(description = "退款原因")
|
@Schema(description = "退款原因")
|
||||||
private String reason;
|
private String reason;
|
||||||
|
@ -51,10 +51,10 @@ public class PayRefundPageReqVO extends PageParam {
|
|||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
@Schema(description = "支付金额,单位分")
|
@Schema(description = "支付金额,单位分")
|
||||||
private Long payAmount;
|
private Long payPrice;
|
||||||
|
|
||||||
@Schema(description = "退款金额,单位分")
|
@Schema(description = "退款金额,单位分")
|
||||||
private Long refundAmount;
|
private Long refundPrice;
|
||||||
|
|
||||||
@Schema(description = "退款原因")
|
@Schema(description = "退款原因")
|
||||||
private String reason;
|
private String reason;
|
||||||
|
@ -19,7 +19,7 @@ tenant-id: {{appTenentId}}
|
|||||||
"id": 202,
|
"id": 202,
|
||||||
"channelCode": "wx_bar",
|
"channelCode": "wx_bar",
|
||||||
"channelExtras": {
|
"channelExtras": {
|
||||||
"authCode": "132990241553789274"
|
"authCode": "134042110834344848"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,15 +1,20 @@
|
|||||||
package cn.iocoder.yudao.module.pay.convert.app;
|
package cn.iocoder.yudao.module.pay.convert.app;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageItemRespVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageItemRespVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppRespVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppRespVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
||||||
|
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付应用信息 Convert
|
* 支付应用信息 Convert
|
||||||
@ -31,6 +36,14 @@ public interface PayAppConvert {
|
|||||||
|
|
||||||
List<PayAppRespVO> convertList(List<PayAppDO> list);
|
List<PayAppRespVO> convertList(List<PayAppDO> list);
|
||||||
|
|
||||||
PageResult<PayAppRespVO> convertPage(PageResult<PayAppDO> page);
|
PageResult<PayAppPageItemRespVO> convertPage(PageResult<PayAppDO> page);
|
||||||
|
|
||||||
|
default PageResult<PayAppPageItemRespVO> convertPage(PageResult<PayAppDO> pageResult, List<PayChannelDO> channels) {
|
||||||
|
PageResult<PayAppPageItemRespVO> voPageResult = convertPage(pageResult);
|
||||||
|
// 处理 channel 关系
|
||||||
|
Map<Long, Set<String>> appIdChannelMap = CollectionUtils.convertMultiMap2(channels, PayChannelDO::getAppId, PayChannelDO::getCode);
|
||||||
|
voPageResult.getList().forEach(app -> app.setChannelCodes(appIdChannelMap.get(app.getId())));
|
||||||
|
return voPageResult;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ public interface PayOrderConvert {
|
|||||||
|
|
||||||
PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class);
|
PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class);
|
||||||
|
|
||||||
@Mapping(source = "amount", target = "price")
|
|
||||||
PayOrderRespVO convert(PayOrderDO bean);
|
PayOrderRespVO convert(PayOrderDO bean);
|
||||||
|
|
||||||
PayOrderRespDTO convert2(PayOrderDO order);
|
PayOrderRespDTO convert2(PayOrderDO order);
|
||||||
@ -40,8 +39,6 @@ public interface PayOrderConvert {
|
|||||||
|
|
||||||
PageResult<PayOrderRespVO> convertPage(PageResult<PayOrderDO> page);
|
PageResult<PayOrderRespVO> convertPage(PageResult<PayOrderDO> page);
|
||||||
|
|
||||||
List<PayOrderExcelVO> convertList02(List<PayOrderDO> list);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单 DO 转自定义分页对象
|
* 订单 DO 转自定义分页对象
|
||||||
*
|
*
|
||||||
@ -76,14 +73,14 @@ public interface PayOrderConvert {
|
|||||||
|
|
||||||
BigDecimal multiple = new BigDecimal(100);
|
BigDecimal multiple = new BigDecimal(100);
|
||||||
|
|
||||||
payOrderExcelVO.setAmount(BigDecimal.valueOf(bean.getAmount())
|
payOrderExcelVO.setPrice(BigDecimal.valueOf(bean.getPrice())
|
||||||
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
||||||
|
|
||||||
payOrderExcelVO.setChannelFeeAmount(BigDecimal.valueOf(bean.getChannelFeeAmount())
|
payOrderExcelVO.setChannelFeePrice(BigDecimal.valueOf(bean.getChannelFeePrice())
|
||||||
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
||||||
payOrderExcelVO.setChannelFeeRate(java.math.BigDecimal.valueOf(bean.getChannelFeeRate())
|
payOrderExcelVO.setChannelFeeRate(java.math.BigDecimal.valueOf(bean.getChannelFeeRate())
|
||||||
.multiply(multiple).toString());
|
.multiply(multiple).toString());
|
||||||
payOrderExcelVO.setRefundAmount(BigDecimal.valueOf(bean.getRefundAmount())
|
payOrderExcelVO.setRefundPrice(BigDecimal.valueOf(bean.getRefundPrice())
|
||||||
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
||||||
|
|
||||||
return payOrderExcelVO;
|
return payOrderExcelVO;
|
||||||
@ -96,7 +93,7 @@ public interface PayOrderConvert {
|
|||||||
|
|
||||||
PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqVO reqVO, String userIp);
|
PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqVO reqVO, String userIp);
|
||||||
|
|
||||||
PayOrderSubmitRespVO convert(PayOrderUnifiedRespDTO bean);
|
PayOrderSubmitRespVO convert(PayOrderDO order, PayOrderUnifiedRespDTO unifiedRespDTO);
|
||||||
|
|
||||||
AppPayOrderSubmitRespVO convert3(PayOrderSubmitRespVO bean);
|
AppPayOrderSubmitRespVO convert3(PayOrderSubmitRespVO bean);
|
||||||
|
|
||||||
|
@ -77,9 +77,9 @@ public interface PayRefundConvert {
|
|||||||
payRefundExcelVO.setCreateTime(bean.getCreateTime());
|
payRefundExcelVO.setCreateTime(bean.getCreateTime());
|
||||||
|
|
||||||
BigDecimal multiple = new BigDecimal(100);
|
BigDecimal multiple = new BigDecimal(100);
|
||||||
payRefundExcelVO.setPayAmount(BigDecimal.valueOf(bean.getPayAmount())
|
payRefundExcelVO.setPayPrice(BigDecimal.valueOf(bean.getPayPrice())
|
||||||
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
||||||
payRefundExcelVO.setRefundAmount(BigDecimal.valueOf(bean.getRefundAmount())
|
payRefundExcelVO.setRefundPrice(BigDecimal.valueOf(bean.getRefundPrice())
|
||||||
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
.divide(multiple, 2, RoundingMode.HALF_UP).toString());
|
||||||
|
|
||||||
return payRefundExcelVO;
|
return payRefundExcelVO;
|
||||||
@ -87,7 +87,7 @@ public interface PayRefundConvert {
|
|||||||
|
|
||||||
//TODO 太多需要处理了, 暂时不用
|
//TODO 太多需要处理了, 暂时不用
|
||||||
@Mappings(value = {
|
@Mappings(value = {
|
||||||
@Mapping(source = "amount", target = "payAmount"),
|
@Mapping(source = "price", target = "payPrice"),
|
||||||
@Mapping(source = "id", target = "orderId"),
|
@Mapping(source = "id", target = "orderId"),
|
||||||
@Mapping(target = "status",ignore = true)
|
@Mapping(target = "status",ignore = true)
|
||||||
})
|
})
|
||||||
|
@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 示例订单
|
* 示例订单
|
||||||
@ -53,7 +52,7 @@ public class PayDemoOrderDO extends BaseDO {
|
|||||||
/**
|
/**
|
||||||
* 是否支付
|
* 是否支付
|
||||||
*/
|
*/
|
||||||
private Boolean payed;
|
private Boolean payStatus;
|
||||||
/**
|
/**
|
||||||
* 支付订单编号
|
* 支付订单编号
|
||||||
*
|
*
|
||||||
|
@ -67,7 +67,7 @@ public class MemberWalletTransactionDO extends BaseDO {
|
|||||||
/**
|
/**
|
||||||
* 交易金额, 单位分
|
* 交易金额, 单位分
|
||||||
*/
|
*/
|
||||||
private Integer amount;
|
private Integer price;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 余额, 单位分
|
* 余额, 单位分
|
||||||
@ -83,4 +83,4 @@ public class MemberWalletTransactionDO extends BaseDO {
|
|||||||
* 交易时间
|
* 交易时间
|
||||||
*/
|
*/
|
||||||
private LocalDateTime transactionTime;
|
private LocalDateTime transactionTime;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.pay.dal.dataobject.notify;
|
package cn.iocoder.yudao.module.pay.dal.dataobject.notify;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
|
||||||
@ -25,7 +25,7 @@ import java.time.LocalDateTime;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
public class PayNotifyTaskDO extends BaseDO {
|
public class PayNotifyTaskDO extends TenantBaseDO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通知频率,单位为秒。
|
* 通知频率,单位为秒。
|
||||||
|
@ -76,17 +76,13 @@ public class PayOrderDO extends BaseDO {
|
|||||||
* 枚举 {@link PayOrderNotifyStatusEnum}
|
* 枚举 {@link PayOrderNotifyStatusEnum}
|
||||||
*/
|
*/
|
||||||
private Integer notifyStatus;
|
private Integer notifyStatus;
|
||||||
// /**
|
|
||||||
// * 商户拓展参数
|
|
||||||
// */
|
|
||||||
// private Map<String, String> merchantExtras;
|
|
||||||
|
|
||||||
// ========== 订单相关字段 ==========
|
// ========== 订单相关字段 ==========
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付金额,单位:分
|
* 支付金额,单位:分
|
||||||
*/
|
*/
|
||||||
private Integer amount;
|
private Integer price;
|
||||||
/**
|
/**
|
||||||
* 渠道手续费,单位:百分比
|
* 渠道手续费,单位:百分比
|
||||||
*
|
*
|
||||||
@ -96,7 +92,7 @@ public class PayOrderDO extends BaseDO {
|
|||||||
/**
|
/**
|
||||||
* 渠道手续金额,单位:分
|
* 渠道手续金额,单位:分
|
||||||
*/
|
*/
|
||||||
private Long channelFeeAmount;
|
private Long channelFeePrice;
|
||||||
/**
|
/**
|
||||||
* 支付状态
|
* 支付状态
|
||||||
*
|
*
|
||||||
@ -140,7 +136,7 @@ public class PayOrderDO extends BaseDO {
|
|||||||
/**
|
/**
|
||||||
* 退款总金额,单位:分
|
* 退款总金额,单位:分
|
||||||
*/
|
*/
|
||||||
private Long refundAmount;
|
private Long refundPrice;
|
||||||
|
|
||||||
// ========== 渠道相关字段 ==========
|
// ========== 渠道相关字段 ==========
|
||||||
/**
|
/**
|
||||||
|
@ -124,11 +124,11 @@ public class PayRefundDO extends BaseDO {
|
|||||||
/**
|
/**
|
||||||
* 支付金额,单位:分
|
* 支付金额,单位:分
|
||||||
*/
|
*/
|
||||||
private Integer payAmount;
|
private Integer payPrice;
|
||||||
/**
|
/**
|
||||||
* 退款金额,单位:分
|
* 退款金额,单位:分
|
||||||
*/
|
*/
|
||||||
private Integer refundAmount;
|
private Integer refundPrice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退款原因
|
* 退款原因
|
||||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.dal.mysql.app;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
||||||
@ -11,14 +12,11 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
public interface PayAppMapper extends BaseMapperX<PayAppDO> {
|
public interface PayAppMapper extends BaseMapperX<PayAppDO> {
|
||||||
|
|
||||||
default PageResult<PayAppDO> selectPage(PayAppPageReqVO reqVO) {
|
default PageResult<PayAppDO> selectPage(PayAppPageReqVO reqVO) {
|
||||||
return selectPage(reqVO, new QueryWrapperX<PayAppDO>()
|
return selectPage(reqVO, new LambdaQueryWrapperX<PayAppDO>()
|
||||||
.likeIfPresent("name", reqVO.getName())
|
.likeIfPresent(PayAppDO::getName, reqVO.getName())
|
||||||
.eqIfPresent("status", reqVO.getStatus())
|
.eqIfPresent(PayAppDO::getStatus, reqVO.getStatus())
|
||||||
.eqIfPresent("remark", reqVO.getRemark())
|
.betweenIfPresent(PayAppDO::getCreateTime, reqVO.getCreateTime())
|
||||||
.eqIfPresent("pay_notify_url", reqVO.getPayNotifyUrl())
|
.orderByDesc(PayAppDO::getId));
|
||||||
.eqIfPresent("refund_notify_url", reqVO.getRefundNotifyUrl())
|
|
||||||
.betweenIfPresent("create_time", reqVO.getCreateTime())
|
|
||||||
.orderByDesc("id"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
package cn.iocoder.yudao.module.pay.dal.mysql.channel;
|
package cn.iocoder.yudao.module.pay.dal.mysql.channel;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
|
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -19,41 +18,8 @@ public interface PayChannelMapper extends BaseMapperX<PayChannelDO> {
|
|||||||
return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code);
|
return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
default PageResult<PayChannelDO> selectPage(PayChannelPageReqVO reqVO) {
|
default List<PayChannelDO> selectListByAppIds(Collection<Long> appIds){
|
||||||
return selectPage(reqVO, new QueryWrapperX<PayChannelDO>()
|
return selectList(PayChannelDO::getAppId, appIds);
|
||||||
.eqIfPresent("code", reqVO.getCode())
|
|
||||||
.eqIfPresent("status", reqVO.getStatus())
|
|
||||||
.eqIfPresent("remark", reqVO.getRemark())
|
|
||||||
.eqIfPresent("fee_rate", reqVO.getFeeRate())
|
|
||||||
.eqIfPresent("app_id", reqVO.getAppId())
|
|
||||||
.betweenIfPresent("create_time", reqVO.getCreateTime())
|
|
||||||
.orderByDesc("id"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据条件获取渠道
|
|
||||||
*
|
|
||||||
* @param appId 应用编号
|
|
||||||
* @param code 渠道编码
|
|
||||||
* @return 数量
|
|
||||||
*/
|
|
||||||
default PayChannelDO selectOne(Long appId, String code) {
|
|
||||||
return this.selectOne((new QueryWrapper<PayChannelDO>().lambda()
|
|
||||||
.eq(PayChannelDO::getAppId, appId)
|
|
||||||
.eq(PayChannelDO::getCode, code)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO @aquan:select 命名
|
|
||||||
/**
|
|
||||||
* 根据支付应用ID集合获得支付渠道列表
|
|
||||||
*
|
|
||||||
* @param appIds 应用编号集合
|
|
||||||
* @return 支付渠道列表
|
|
||||||
*/
|
|
||||||
default List<PayChannelDO> getChannelListByAppIds(Collection<Long> appIds){
|
|
||||||
return this.selectList(new QueryWrapper<PayChannelDO>().lambda()
|
|
||||||
.in(PayChannelDO::getAppId, appIds));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default List<PayChannelDO> selectListByAppId(Long appId, Integer status) {
|
default List<PayChannelDO> selectListByAppId(Long appId, Integer status) {
|
||||||
@ -62,4 +28,7 @@ public interface PayChannelMapper extends BaseMapperX<PayChannelDO> {
|
|||||||
.eq(PayChannelDO::getStatus, status));
|
.eq(PayChannelDO::getStatus, status));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Select("SELECT COUNT(*) FROM pay_channel WHERE update_time > #{maxUpdateTime}")
|
||||||
|
Long selectCountByUpdateTimeGt(LocalDateTime maxUpdateTime);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ public interface PayDemoOrderMapper extends BaseMapperX<PayDemoOrderDO> {
|
|||||||
|
|
||||||
default int updateByIdAndPayed(Long id, boolean wherePayed, PayDemoOrderDO updateObj) {
|
default int updateByIdAndPayed(Long id, boolean wherePayed, PayDemoOrderDO updateObj) {
|
||||||
return update(updateObj, new LambdaQueryWrapperX<PayDemoOrderDO>()
|
return update(updateObj, new LambdaQueryWrapperX<PayDemoOrderDO>()
|
||||||
.eq(PayDemoOrderDO::getId, id).eq(PayDemoOrderDO::getPayed, wherePayed));
|
.eq(PayDemoOrderDO::getId, id).eq(PayDemoOrderDO::getPayStatus, wherePayed));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -50,17 +50,8 @@ public interface PayOrderMapper extends BaseMapperX<PayOrderDO> {
|
|||||||
.in(PayOrderDO::getId, idList));
|
.in(PayOrderDO::getId, idList));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
default Long selectCountByAppId(Long appId) {
|
||||||
* 查询符合的订单数量
|
return selectCount(PayOrderDO::getAppId, appId);
|
||||||
*
|
|
||||||
* @param appId 应用编号
|
|
||||||
* @param status 订单状态
|
|
||||||
* @return 条数
|
|
||||||
*/
|
|
||||||
default Long selectCount(Long appId, Integer status) {
|
|
||||||
return selectCount(new LambdaQueryWrapper<PayOrderDO>()
|
|
||||||
.eq(PayOrderDO::getAppId, appId)
|
|
||||||
.in(PayOrderDO::getStatus, status));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) {
|
default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) {
|
||||||
|
@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -38,11 +37,8 @@ public interface PayRefundMapper extends BaseMapperX<PayRefundDO> {
|
|||||||
.orderByDesc("id"));
|
.orderByDesc("id"));
|
||||||
}
|
}
|
||||||
|
|
||||||
default Long selectCount(Long appId, Integer status) {
|
default Long selectCountByApp(Long appId) {
|
||||||
|
return selectCount(PayRefundDO::getAppId, appId);
|
||||||
return selectCount(new LambdaQueryWrapper<PayRefundDO>()
|
|
||||||
.eq(PayRefundDO::getAppId, appId)
|
|
||||||
.eq(PayRefundDO::getStatus, status));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default PayRefundDO selectByReqNo(String reqNo) {
|
default PayRefundDO selectByReqNo(String reqNo) {
|
||||||
@ -52,4 +48,5 @@ public interface PayRefundMapper extends BaseMapperX<PayRefundDO> {
|
|||||||
default PayRefundDO selectByTradeNoAndMerchantRefundNo(String tradeNo, String merchantRefundNo){
|
default PayRefundDO selectByTradeNoAndMerchantRefundNo(String tradeNo, String merchantRefundNo){
|
||||||
return selectOne("trade_no", tradeNo, "merchant_refund_no", merchantRefundNo);
|
return selectOne("trade_no", tradeNo, "merchant_refund_no", merchantRefundNo);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* 占位,无特殊含义
|
||||||
|
*/
|
||||||
package cn.iocoder.yudao.module.pay.job;
|
package cn.iocoder.yudao.module.pay.job;
|
||||||
|
@ -35,6 +35,14 @@ public interface PayAppService {
|
|||||||
*/
|
*/
|
||||||
void updateApp(@Valid PayAppUpdateReqVO updateReqVO);
|
void updateApp(@Valid PayAppUpdateReqVO updateReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改应用信息状态
|
||||||
|
*
|
||||||
|
* @param id 应用编号
|
||||||
|
* @param status 状态
|
||||||
|
*/
|
||||||
|
void updateAppStatus(Long id, Integer status);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除支付应用信息
|
* 删除支付应用信息
|
||||||
*
|
*
|
||||||
@ -66,14 +74,6 @@ public interface PayAppService {
|
|||||||
*/
|
*/
|
||||||
PageResult<PayAppDO> getAppPage(PayAppPageReqVO pageReqVO);
|
PageResult<PayAppDO> getAppPage(PayAppPageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改应用信息状态
|
|
||||||
*
|
|
||||||
* @param id 应用编号
|
|
||||||
* @param status 状态{@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
|
|
||||||
*/
|
|
||||||
void updateAppStatus(Long id, Integer status);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得指定编号的商户 Map
|
* 获得指定编号的商户 Map
|
||||||
*
|
*
|
||||||
@ -85,7 +85,6 @@ public interface PayAppService {
|
|||||||
return CollectionUtils.convertMap(list, PayAppDO::getId);
|
return CollectionUtils.convertMap(list, PayAppDO::getId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付应用的合法性
|
* 支付应用的合法性
|
||||||
*
|
*
|
||||||
|
@ -9,12 +9,13 @@ import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
|
|||||||
import cn.iocoder.yudao.module.pay.convert.app.PayAppConvert;
|
import cn.iocoder.yudao.module.pay.convert.app.PayAppConvert;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper;
|
import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper;
|
||||||
import cn.iocoder.yudao.module.pay.dal.mysql.order.PayOrderMapper;
|
|
||||||
import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper;
|
import cn.iocoder.yudao.module.pay.dal.mysql.refund.PayRefundMapper;
|
||||||
import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
|
import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
|
||||||
import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
|
import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
|
||||||
import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum;
|
import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
|
||||||
|
import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
@ -23,11 +24,10 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE;
|
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*;
|
||||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_APP_NOT_FOUND;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付应用信息 Service 实现类
|
* 支付应用 Service 实现类
|
||||||
*
|
*
|
||||||
* @author aquan
|
* @author aquan
|
||||||
*/
|
*/
|
||||||
@ -37,11 +37,13 @@ public class PayAppServiceImpl implements PayAppService {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private PayAppMapper appMapper;
|
private PayAppMapper appMapper;
|
||||||
// TODO 芋艿:不能调用对方的 mapper
|
|
||||||
@Resource
|
@Resource
|
||||||
private PayOrderMapper orderMapper;
|
@Lazy // 延迟加载,避免循环依赖报错
|
||||||
|
private PayOrderService orderService;
|
||||||
@Resource
|
@Resource
|
||||||
private PayRefundMapper refundMapper;
|
@Lazy // 延迟加载,避免循环依赖报错
|
||||||
|
private PayRefundService refundService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long createApp(PayAppCreateReqVO createReqVO) {
|
public Long createApp(PayAppCreateReqVO createReqVO) {
|
||||||
@ -55,17 +57,31 @@ public class PayAppServiceImpl implements PayAppService {
|
|||||||
@Override
|
@Override
|
||||||
public void updateApp(PayAppUpdateReqVO updateReqVO) {
|
public void updateApp(PayAppUpdateReqVO updateReqVO) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
this.validateAppExists(updateReqVO.getId());
|
validateAppExists(updateReqVO.getId());
|
||||||
// 更新
|
// 更新
|
||||||
PayAppDO updateObj = PayAppConvert.INSTANCE.convert(updateReqVO);
|
PayAppDO updateObj = PayAppConvert.INSTANCE.convert(updateReqVO);
|
||||||
appMapper.updateById(updateObj);
|
appMapper.updateById(updateObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateAppStatus(Long id, Integer status) {
|
||||||
|
// 校验商户存在
|
||||||
|
validateAppExists(id);
|
||||||
|
// 更新状态
|
||||||
|
appMapper.updateById(new PayAppDO().setId(id).setStatus(status));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteApp(Long id) {
|
public void deleteApp(Long id) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
this.validateAppExists(id);
|
validateAppExists(id);
|
||||||
this.validateOrderTransactionExist(id);
|
// 校验关联数据是否存在
|
||||||
|
if (orderService.getOrderCountByAppId(id) > 0) {
|
||||||
|
throw exception(PAY_APP_EXIST_ORDER_CANT_DELETE);
|
||||||
|
}
|
||||||
|
if (refundService.getRefundCountByAppId(id) > 0) {
|
||||||
|
throw exception(PAY_APP_EXIST_REFUND_CANT_DELETE);
|
||||||
|
}
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
appMapper.deleteById(id);
|
appMapper.deleteById(id);
|
||||||
@ -92,59 +108,16 @@ public class PayAppServiceImpl implements PayAppService {
|
|||||||
return appMapper.selectPage(pageReqVO);
|
return appMapper.selectPage(pageReqVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateAppStatus(Long id, Integer status) {
|
|
||||||
// 校验商户存在
|
|
||||||
this.checkAppExists(id);
|
|
||||||
// 更新状态
|
|
||||||
PayAppDO app = new PayAppDO();
|
|
||||||
app.setId(id);
|
|
||||||
app.setStatus(status);
|
|
||||||
appMapper.updateById(app);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 检查商户是否存在
|
|
||||||
*
|
|
||||||
* @param id 商户编号
|
|
||||||
*/
|
|
||||||
@VisibleForTesting
|
|
||||||
public void checkAppExists(Long id) {
|
|
||||||
if (id == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
PayAppDO payApp = appMapper.selectById(id);
|
|
||||||
if (payApp == null) {
|
|
||||||
throw exception(PAY_APP_NOT_FOUND);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 验证是否存在交易中或者退款中等处理中状态的订单
|
|
||||||
*
|
|
||||||
* @param appId 应用 ID
|
|
||||||
*/
|
|
||||||
private void validateOrderTransactionExist(Long appId) {
|
|
||||||
// 查看交易订单
|
|
||||||
if (orderMapper.selectCount(appId, PayOrderStatusEnum.WAITING.getStatus()) > 0) {
|
|
||||||
throw exception(PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE);
|
|
||||||
}
|
|
||||||
// 查看退款订单
|
|
||||||
if (refundMapper.selectCount(appId, PayRefundStatusEnum.CREATE.getStatus()) > 0) {
|
|
||||||
throw exception(PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PayAppDO validPayApp(Long id) {
|
public PayAppDO validPayApp(Long id) {
|
||||||
PayAppDO app = appMapper.selectById(id);
|
PayAppDO app = appMapper.selectById(id);
|
||||||
// 校验是否存在
|
// 校验是否存在
|
||||||
if (app == null) {
|
if (app == null) {
|
||||||
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_NOT_FOUND);
|
throw exception(ErrorCodeConstants.PAY_APP_NOT_FOUND);
|
||||||
}
|
}
|
||||||
// 校验是否禁用
|
// 校验是否禁用
|
||||||
if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) {
|
if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) {
|
||||||
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_IS_DISABLE);
|
throw exception(ErrorCodeConstants.PAY_APP_IS_DISABLE);
|
||||||
}
|
}
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.pay.service.channel;
|
package cn.iocoder.yudao.module.pay.service.channel;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
||||||
|
|
||||||
@ -18,11 +16,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public interface PayChannelService {
|
public interface PayChannelService {
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化支付客户端
|
|
||||||
*/
|
|
||||||
void initLocalCache();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建支付渠道
|
* 创建支付渠道
|
||||||
*
|
*
|
||||||
@ -54,15 +47,7 @@ public interface PayChannelService {
|
|||||||
PayChannelDO getChannel(Long id);
|
PayChannelDO getChannel(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得支付渠道分页
|
* 根据支付应用 ID 集合,获得支付渠道列表
|
||||||
*
|
|
||||||
* @param pageReqVO 分页查询
|
|
||||||
* @return 支付渠道分页
|
|
||||||
*/
|
|
||||||
PageResult<PayChannelDO> getChannelPage(PayChannelPageReqVO pageReqVO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据支付应用ID集合获得支付渠道列表
|
|
||||||
*
|
*
|
||||||
* @param appIds 应用编号集合
|
* @param appIds 应用编号集合
|
||||||
* @return 支付渠道列表
|
* @return 支付渠道列表
|
||||||
@ -72,11 +57,11 @@ public interface PayChannelService {
|
|||||||
/**
|
/**
|
||||||
* 根据条件获取渠道
|
* 根据条件获取渠道
|
||||||
*
|
*
|
||||||
* @param appid 应用编号
|
* @param appId 应用编号
|
||||||
* @param code 渠道编码
|
* @param code 渠道编码
|
||||||
* @return 数量
|
* @return 数量
|
||||||
*/
|
*/
|
||||||
PayChannelDO getChannelByConditions(Long appid, String code);
|
PayChannelDO getChannelByAppIdAndCode(Long appId, String code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 支付渠道的合法性
|
* 支付渠道的合法性
|
||||||
|
@ -1,30 +1,35 @@
|
|||||||
package cn.iocoder.yudao.module.pay.service.channel;
|
package cn.iocoder.yudao.module.pay.service.channel;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
|
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
|
||||||
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
|
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert;
|
import cn.iocoder.yudao.module.pay.convert.channel.PayChannelConvert;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper;
|
import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper;
|
||||||
import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
|
import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Validator;
|
import javax.validation.Validator;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_EXIST_SAME_CHANNEL_ERROR;
|
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
|
|||||||
@Validated
|
@Validated
|
||||||
public class PayChannelServiceImpl implements PayChannelService {
|
public class PayChannelServiceImpl implements PayChannelService {
|
||||||
|
|
||||||
|
@Getter // 为了方便测试,这里提供 getter 方法
|
||||||
|
@Setter
|
||||||
|
private volatile List<PayChannelDO> channelCache;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private PayClientFactory payClientFactory;
|
private PayClientFactory payClientFactory;
|
||||||
|
|
||||||
@ -52,7 +61,6 @@ public class PayChannelServiceImpl implements PayChannelService {
|
|||||||
/**
|
/**
|
||||||
* 初始化 {@link #payClientFactory} 缓存
|
* 初始化 {@link #payClientFactory} 缓存
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void initLocalCache() {
|
public void initLocalCache() {
|
||||||
// 注意:忽略自动多租户,因为要全局初始化缓存
|
// 注意:忽略自动多租户,因为要全局初始化缓存
|
||||||
@ -64,49 +72,101 @@ public class PayChannelServiceImpl implements PayChannelService {
|
|||||||
// 第二步:构建缓存:创建或更新支付 Client
|
// 第二步:构建缓存:创建或更新支付 Client
|
||||||
channels.forEach(payChannel -> payClientFactory.createOrUpdatePayClient(payChannel.getId(),
|
channels.forEach(payChannel -> payClientFactory.createOrUpdatePayClient(payChannel.getId(),
|
||||||
payChannel.getCode(), payChannel.getConfig()));
|
payChannel.getCode(), payChannel.getConfig()));
|
||||||
|
this.channelCache = channels;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过定时任务轮询,刷新缓存
|
||||||
|
*
|
||||||
|
* 目的:多节点部署时,通过轮询”通知“所有节点,进行刷新
|
||||||
|
*/
|
||||||
|
@Scheduled(initialDelay = 60, fixedRate = 60, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public void refreshLocalCache() {
|
||||||
|
// 情况一:如果缓存里没有数据,则直接刷新缓存
|
||||||
|
if (CollUtil.isEmpty(channelCache)) {
|
||||||
|
initLocalCache();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 情况二,如果缓存里数据,则通过 updateTime 判断是否有数据变更,有变更则刷新缓存
|
||||||
|
LocalDateTime maxTime = CollectionUtils.getMaxValue(channelCache, PayChannelDO::getUpdateTime);
|
||||||
|
if (channelMapper.selectCountByUpdateTimeGt(maxTime) > 0) {
|
||||||
|
initLocalCache();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long createChannel(PayChannelCreateReqVO reqVO) {
|
public Long createChannel(PayChannelCreateReqVO reqVO) {
|
||||||
// 断言是否有重复的
|
// 断言是否有重复的
|
||||||
PayChannelDO channelDO = this.getChannelByConditions(reqVO.getAppId(), reqVO.getCode());
|
PayChannelDO dbChannel = getChannelByAppIdAndCode(reqVO.getAppId(), reqVO.getCode());
|
||||||
if (ObjectUtil.isNotNull(channelDO)) {
|
if (dbChannel != null) {
|
||||||
throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR);
|
throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增渠道
|
// 新增渠道
|
||||||
PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO);
|
PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO)
|
||||||
settingConfigAndCheckParam(channel, reqVO.getConfig());
|
.setConfig(parseConfig(reqVO.getCode(), reqVO.getConfig()));
|
||||||
channelMapper.insert(channel);
|
channelMapper.insert(channel);
|
||||||
// TODO 芋艿:缺少刷新本地缓存的机制
|
|
||||||
|
// 刷新缓存
|
||||||
|
refreshLocalCache();
|
||||||
return channel.getId();
|
return channel.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateChannel(PayChannelUpdateReqVO updateReqVO) {
|
public void updateChannel(PayChannelUpdateReqVO updateReqVO) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
this.validateChannelExists(updateReqVO.getId());
|
PayChannelDO dbChannel = validateChannelExists(updateReqVO.getId());
|
||||||
|
|
||||||
// 更新
|
// 更新
|
||||||
PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO);
|
PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO)
|
||||||
settingConfigAndCheckParam(channel, updateReqVO.getConfig());
|
.setConfig(parseConfig(dbChannel.getCode(), updateReqVO.getConfig()));
|
||||||
channelMapper.updateById(channel);
|
channelMapper.updateById(channel);
|
||||||
// TODO 芋艿:缺少刷新本地缓存的机制
|
|
||||||
|
// 刷新缓存
|
||||||
|
refreshLocalCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析并校验配置
|
||||||
|
*
|
||||||
|
* @param code 渠道编码
|
||||||
|
* @param configStr 配置
|
||||||
|
* @return 支付配置
|
||||||
|
*/
|
||||||
|
private PayClientConfig parseConfig(String code, String configStr) {
|
||||||
|
// 解析配置
|
||||||
|
Class<? extends PayClientConfig> payClass = PayChannelEnum.getByCode(code).getConfigClass();
|
||||||
|
if (ObjectUtil.isNull(payClass)) {
|
||||||
|
throw exception(CHANNEL_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
PayClientConfig config = JsonUtils.parseObject2(configStr, payClass);
|
||||||
|
Assert.notNull(config);
|
||||||
|
|
||||||
|
// 验证参数
|
||||||
|
config.validate(validator);
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteChannel(Long id) {
|
public void deleteChannel(Long id) {
|
||||||
// 校验存在
|
// 校验存在
|
||||||
this.validateChannelExists(id);
|
validateChannelExists(id);
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
channelMapper.deleteById(id);
|
channelMapper.deleteById(id);
|
||||||
// TODO 芋艿:缺少刷新本地缓存的机制
|
|
||||||
|
// 刷新缓存
|
||||||
|
refreshLocalCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateChannelExists(Long id) {
|
private PayChannelDO validateChannelExists(Long id) {
|
||||||
if (channelMapper.selectById(id) == null) {
|
PayChannelDO channel = channelMapper.selectById(id);
|
||||||
|
if (channel == null) {
|
||||||
throw exception(CHANNEL_NOT_EXISTS);
|
throw exception(CHANNEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -114,45 +174,20 @@ public class PayChannelServiceImpl implements PayChannelService {
|
|||||||
return channelMapper.selectById(id);
|
return channelMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult<PayChannelDO> getChannelPage(PayChannelPageReqVO pageReqVO) {
|
|
||||||
return channelMapper.selectPage(pageReqVO);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PayChannelDO> getChannelListByAppIds(Collection<Long> appIds) {
|
public List<PayChannelDO> getChannelListByAppIds(Collection<Long> appIds) {
|
||||||
return channelMapper.getChannelListByAppIds(appIds);
|
return channelMapper.selectListByAppIds(appIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PayChannelDO getChannelByConditions(Long appid, String code) {
|
public PayChannelDO getChannelByAppIdAndCode(Long appId, String code) {
|
||||||
return this.channelMapper.selectOne(appid, code);
|
return channelMapper.selectByAppIdAndCode(appId, code);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置渠道配置以及参数校验
|
|
||||||
*
|
|
||||||
* @param channel 渠道
|
|
||||||
* @param configStr 配置
|
|
||||||
*/
|
|
||||||
private void settingConfigAndCheckParam(PayChannelDO channel, String configStr) {
|
|
||||||
// 得到这个渠道是微信的还是支付宝的
|
|
||||||
Class<? extends PayClientConfig> payClass = PayChannelEnum.getByCode(channel.getCode()).getConfigClass();
|
|
||||||
if (ObjectUtil.isNull(payClass)) {
|
|
||||||
throw exception(CHANNEL_NOT_EXISTS);
|
|
||||||
}
|
|
||||||
// TODO @芋艿:不要使用 hutool 的 json 工具,用项目的
|
|
||||||
PayClientConfig config = JSONUtil.toBean(configStr, payClass);
|
|
||||||
|
|
||||||
// 验证参数
|
|
||||||
config.validate(validator);
|
|
||||||
channel.setConfig(config);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PayChannelDO validPayChannel(Long id) {
|
public PayChannelDO validPayChannel(Long id) {
|
||||||
PayChannelDO channel = channelMapper.selectById(id);
|
PayChannelDO channel = channelMapper.selectById(id);
|
||||||
this.validPayChannel(channel);
|
validPayChannel(channel);
|
||||||
return channel;
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,18 +198,18 @@ public class PayChannelServiceImpl implements PayChannelService {
|
|||||||
return channel;
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validPayChannel(PayChannelDO channel) {
|
||||||
|
if (channel == null) {
|
||||||
|
throw exception(ErrorCodeConstants.PAY_CHANNEL_NOT_FOUND);
|
||||||
|
}
|
||||||
|
if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) {
|
||||||
|
throw exception(ErrorCodeConstants.PAY_CHANNEL_IS_DISABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PayChannelDO> getEnableChannelList(Long appId) {
|
public List<PayChannelDO> getEnableChannelList(Long appId) {
|
||||||
return channelMapper.selectListByAppId(appId, CommonStatusEnum.ENABLE.getStatus());
|
return channelMapper.selectListByAppId(appId, CommonStatusEnum.ENABLE.getStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validPayChannel(PayChannelDO channel) {
|
|
||||||
if (channel == null) {
|
|
||||||
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_NOT_FOUND);
|
|
||||||
}
|
|
||||||
if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) {
|
|
||||||
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_IS_DISABLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package cn.iocoder.yudao.module.pay.service.demo;
|
package cn.iocoder.yudao.module.pay.service.demo;
|
||||||
|
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
|
||||||
import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
|
import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
|
||||||
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
|
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
|
||||||
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
|
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
|
||||||
@ -85,14 +83,14 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
// 1.2 插入 demo 订单
|
// 1.2 插入 demo 订单
|
||||||
PayDemoOrderDO demoOrder = new PayDemoOrderDO().setUserId(userId)
|
PayDemoOrderDO demoOrder = new PayDemoOrderDO().setUserId(userId)
|
||||||
.setSpuId(createReqVO.getSpuId()).setSpuName(spuName)
|
.setSpuId(createReqVO.getSpuId()).setSpuName(spuName)
|
||||||
.setPrice(price).setPayed(false).setRefundPrice(0);
|
.setPrice(price).setPayStatus(false).setRefundPrice(0);
|
||||||
payDemoOrderMapper.insert(demoOrder);
|
payDemoOrderMapper.insert(demoOrder);
|
||||||
|
|
||||||
// 2.1 创建支付单
|
// 2.1 创建支付单
|
||||||
Long payOrderId = payOrderApi.createOrder(new PayOrderCreateReqDTO()
|
Long payOrderId = payOrderApi.createOrder(new PayOrderCreateReqDTO()
|
||||||
.setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用
|
.setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用
|
||||||
.setMerchantOrderId(demoOrder.getId().toString()) // 业务的订单编号
|
.setMerchantOrderId(demoOrder.getId().toString()) // 业务的订单编号
|
||||||
.setSubject(spuName).setBody("").setAmount(price) // 价格信息
|
.setSubject(spuName).setBody("").setPrice(price) // 价格信息
|
||||||
.setExpireTime(addTime(Duration.ofHours(2L)))); // 支付的过期时间
|
.setExpireTime(addTime(Duration.ofHours(2L)))); // 支付的过期时间
|
||||||
// 2.2 更新支付单到 demo 订单
|
// 2.2 更新支付单到 demo 订单
|
||||||
payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(demoOrder.getId())
|
payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(demoOrder.getId())
|
||||||
@ -101,12 +99,6 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
return demoOrder.getId();
|
return demoOrder.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
// private void validateDemoOrderExists(Long id) {
|
|
||||||
// if (demoOrderMapper.selectById(id) == null) {
|
|
||||||
// throw exception(DEMO_ORDER_NOT_EXISTS);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PayDemoOrderDO getDemoOrder(Long id) {
|
public PayDemoOrderDO getDemoOrder(Long id) {
|
||||||
return payDemoOrderMapper.selectById(id);
|
return payDemoOrderMapper.selectById(id);
|
||||||
@ -124,7 +116,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
|
|
||||||
// 更新 PayDemoOrderDO 状态为已支付
|
// 更新 PayDemoOrderDO 状态为已支付
|
||||||
int updateCount = payDemoOrderMapper.updateByIdAndPayed(id, false,
|
int updateCount = payDemoOrderMapper.updateByIdAndPayed(id, false,
|
||||||
new PayDemoOrderDO().setPayed(true).setPayTime(LocalDateTime.now())
|
new PayDemoOrderDO().setPayStatus(true).setPayTime(LocalDateTime.now())
|
||||||
.setPayChannelCode(payOrder.getChannelCode()));
|
.setPayChannelCode(payOrder.getChannelCode()));
|
||||||
if (updateCount == 0) {
|
if (updateCount == 0) {
|
||||||
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
|
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
|
||||||
@ -148,7 +140,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
throw exception(PAY_DEMO_ORDER_NOT_FOUND);
|
throw exception(PAY_DEMO_ORDER_NOT_FOUND);
|
||||||
}
|
}
|
||||||
// 1.2 校验订单未支付
|
// 1.2 校验订单未支付
|
||||||
if (order.getPayed()) {
|
if (order.getPayStatus()) {
|
||||||
log.error("[validateDemoOrderCanPaid][order({}) 不处于待支付状态,请进行处理!order 数据是:{}]",
|
log.error("[validateDemoOrderCanPaid][order({}) 不处于待支付状态,请进行处理!order 数据是:{}]",
|
||||||
id, toJsonString(order));
|
id, toJsonString(order));
|
||||||
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
|
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
|
||||||
@ -173,7 +165,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS);
|
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS);
|
||||||
}
|
}
|
||||||
// 2.3 校验支付金额一致
|
// 2.3 校验支付金额一致
|
||||||
if (notEqual(payOrder.getAmount(), order.getPrice())) {
|
if (notEqual(payOrder.getPrice(), order.getPrice())) {
|
||||||
log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]",
|
log.error("[validateDemoOrderCanPaid][order({}) payOrder({}) 支付金额不匹配,请进行处理!order 数据是:{},payOrder 数据是:{}]",
|
||||||
id, payOrderId, toJsonString(order), toJsonString(payOrder));
|
id, payOrderId, toJsonString(order), toJsonString(payOrder));
|
||||||
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH);
|
throw exception(PAY_DEMO_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH);
|
||||||
@ -196,7 +188,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
Long payRefundId = payRefundApi.createPayRefund(new PayRefundCreateReqDTO()
|
Long payRefundId = payRefundApi.createPayRefund(new PayRefundCreateReqDTO()
|
||||||
.setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用
|
.setAppId(PAY_APP_ID).setUserIp(getClientIP()) // 支付应用
|
||||||
.setPayOrderId(order.getPayOrderId()) // 支付单号
|
.setPayOrderId(order.getPayOrderId()) // 支付单号
|
||||||
.setReason("想退钱").setAmount(order.getPrice()));// 价格信息
|
.setReason("想退钱").setPrice(order.getPrice()));// 价格信息
|
||||||
// 2.2 更新退款单到 demo 订单
|
// 2.2 更新退款单到 demo 订单
|
||||||
payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(id)
|
payDemoOrderMapper.updateById(new PayDemoOrderDO().setId(id)
|
||||||
.setPayRefundId(payRefundId).setRefundPrice(order.getPrice()));
|
.setPayRefundId(payRefundId).setRefundPrice(order.getPrice()));
|
||||||
@ -209,7 +201,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
throw exception(PAY_DEMO_ORDER_NOT_FOUND);
|
throw exception(PAY_DEMO_ORDER_NOT_FOUND);
|
||||||
}
|
}
|
||||||
// 校验订单是否支付
|
// 校验订单是否支付
|
||||||
if (!order.getPayed()) {
|
if (!order.getPayStatus()) {
|
||||||
throw exception(PAY_DEMO_ORDER_REFUND_FAIL_NOT_PAID);
|
throw exception(PAY_DEMO_ORDER_REFUND_FAIL_NOT_PAID);
|
||||||
}
|
}
|
||||||
// 校验订单是否已退款
|
// 校验订单是否已退款
|
||||||
@ -251,7 +243,7 @@ public class PayDemoOrderServiceImpl implements PayDemoOrderService {
|
|||||||
throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_NOT_SUCCESS);
|
throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_NOT_SUCCESS);
|
||||||
}
|
}
|
||||||
// 2.3 校验退款金额一致
|
// 2.3 校验退款金额一致
|
||||||
if (notEqual(payRefund.getRefundAmount(), order.getPrice())) {
|
if (notEqual(payRefund.getRefundPrice(), order.getPrice())) {
|
||||||
log.error("[validateDemoOrderCanRefunded][order({}) payRefund({}) 退款金额不匹配,请进行处理!order 数据是:{},payRefund 数据是:{}]",
|
log.error("[validateDemoOrderCanRefunded][order({}) payRefund({}) 退款金额不匹配,请进行处理!order 数据是:{},payRefund 数据是:{}]",
|
||||||
id, payRefundId, toJsonString(order), toJsonString(payRefund));
|
id, payRefundId, toJsonString(order), toJsonString(payRefund));
|
||||||
throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_PRICE_NOT_MATCH);
|
throw exception(PAY_DEMO_ORDER_REFUND_FAIL_REFUND_PRICE_NOT_MATCH);
|
||||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.notify;
|
|||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.exceptions.ExceptionUtil;
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpResponse;
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
@ -24,10 +25,11 @@ import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
|
|||||||
import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
|
import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.scheduling.annotation.Async;
|
|
||||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.transaction.support.TransactionSynchronization;
|
||||||
|
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
@ -41,7 +43,6 @@ import java.util.concurrent.CountDownLatch;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
|
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.afterNow;
|
|
||||||
import static cn.iocoder.yudao.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR;
|
import static cn.iocoder.yudao.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,6 +87,7 @@ public class PayNotifyServiceImpl implements PayNotifyService {
|
|||||||
private PayNotifyServiceImpl self;
|
private PayNotifyServiceImpl self;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void createPayNotifyTask(PayNotifyTaskCreateReqDTO reqDTO) {
|
public void createPayNotifyTask(PayNotifyTaskCreateReqDTO reqDTO) {
|
||||||
PayNotifyTaskDO task = new PayNotifyTaskDO();
|
PayNotifyTaskDO task = new PayNotifyTaskDO();
|
||||||
task.setType(reqDTO.getType()).setDataId(reqDTO.getDataId());
|
task.setType(reqDTO.getType()).setDataId(reqDTO.getDataId());
|
||||||
@ -105,8 +107,13 @@ public class PayNotifyServiceImpl implements PayNotifyService {
|
|||||||
// 执行插入
|
// 执行插入
|
||||||
payNotifyTaskMapper.insert(task);
|
payNotifyTaskMapper.insert(task);
|
||||||
|
|
||||||
// 异步直接发起任务。虽然会有定时任务扫描,但是会导致延迟
|
// 必须在事务提交后,在发起任务,否则 PayNotifyTaskDO 还没入库,就提前回调接入的业务
|
||||||
self.executeNotifyAsync(task);
|
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
||||||
|
@Override
|
||||||
|
public void afterCommit() {
|
||||||
|
executeNotify(task);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -121,7 +128,7 @@ public class PayNotifyServiceImpl implements PayNotifyService {
|
|||||||
CountDownLatch latch = new CountDownLatch(tasks.size());
|
CountDownLatch latch = new CountDownLatch(tasks.size());
|
||||||
tasks.forEach(task -> threadPoolTaskExecutor.execute(() -> {
|
tasks.forEach(task -> threadPoolTaskExecutor.execute(() -> {
|
||||||
try {
|
try {
|
||||||
executeNotifySync(task);
|
executeNotify(task);
|
||||||
} finally {
|
} finally {
|
||||||
latch.countDown();
|
latch.countDown();
|
||||||
}
|
}
|
||||||
@ -150,40 +157,31 @@ public class PayNotifyServiceImpl implements PayNotifyService {
|
|||||||
log.error("[awaitExecuteNotify][任务未处理完,总任务数({}) 剩余任务数({})]", size, latch.getCount());
|
log.error("[awaitExecuteNotify][任务未处理完,总任务数({}) 剩余任务数({})]", size, latch.getCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 异步执行单个支付通知
|
|
||||||
*
|
|
||||||
* @param task 通知任务
|
|
||||||
*/
|
|
||||||
@Async
|
|
||||||
public void executeNotifyAsync(PayNotifyTaskDO task) {
|
|
||||||
self.executeNotifySync(task); // 使用 self,避免事务不发起
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 同步执行单个支付通知
|
* 同步执行单个支付通知
|
||||||
*
|
*
|
||||||
* @param task 通知任务
|
* @param task 通知任务
|
||||||
*/
|
*/
|
||||||
public void executeNotifySync(PayNotifyTaskDO task) {
|
public void executeNotify(PayNotifyTaskDO task) {
|
||||||
// 分布式锁,避免并发问题
|
// 分布式锁,避免并发问题
|
||||||
payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> {
|
payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> {
|
||||||
// 校验,当前任务是否已经被通知过
|
// 校验,当前任务是否已经被通知过
|
||||||
// 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。
|
// 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。
|
||||||
|
// 因此,此处我们通过第 notifyTimes 通知次数是否匹配来判断
|
||||||
PayNotifyTaskDO dbTask = payNotifyTaskMapper.selectById(task.getId());
|
PayNotifyTaskDO dbTask = payNotifyTaskMapper.selectById(task.getId());
|
||||||
if (afterNow(dbTask.getNextNotifyTime())) {
|
if (ObjectUtil.notEqual(task.getNotifyTimes(), dbTask.getNotifyTimes())) {
|
||||||
log.info("[executeNotifySync][dbTask({}) 任务被忽略,原因是未到达下次通知时间,可能是因为并发执行了]",
|
log.warn("[executeNotifySync][task({}) 任务被忽略,原因是它的通知不是第 ({}) 次,可能是因为并发执行了]",
|
||||||
JsonUtils.toJsonString(dbTask));
|
JsonUtils.toJsonString(task), dbTask.getNotifyTimes());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行通知
|
// 执行通知
|
||||||
self.executeNotify(dbTask);
|
self.executeNotify0(dbTask);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void executeNotify(PayNotifyTaskDO task) {
|
public void executeNotify0(PayNotifyTaskDO task) {
|
||||||
// 发起回调
|
// 发起回调
|
||||||
CommonResult<?> invokeResult = null;
|
CommonResult<?> invokeResult = null;
|
||||||
Throwable invokeException = null;
|
Throwable invokeException = null;
|
||||||
@ -223,7 +221,7 @@ public class PayNotifyServiceImpl implements PayNotifyService {
|
|||||||
}
|
}
|
||||||
// 拼接 header 参数
|
// 拼接 header 参数
|
||||||
Map<String, String> headers = new HashMap<>();
|
Map<String, String> headers = new HashMap<>();
|
||||||
TenantUtils.addTenantHeader(headers);
|
TenantUtils.addTenantHeader(headers, task.getTenantId());
|
||||||
|
|
||||||
// 发起请求
|
// 发起请求
|
||||||
try (HttpResponse response = HttpUtil.createPost(task.getNotifyUrl())
|
try (HttpResponse response = HttpUtil.createPost(task.getNotifyUrl())
|
||||||
|
@ -32,6 +32,14 @@ public interface PayOrderService {
|
|||||||
*/
|
*/
|
||||||
PayOrderDO getOrder(Long id);
|
PayOrderDO getOrder(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得指定应用的订单数量
|
||||||
|
*
|
||||||
|
* @param appId 应用编号
|
||||||
|
* @return 订单数量
|
||||||
|
*/
|
||||||
|
Long getOrderCountByAppId(Long appId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得支付订单
|
* 获得支付订单
|
||||||
* 分页
|
* 分页
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.pay.service.order;
|
package cn.iocoder.yudao.module.pay.service.order;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.lang.Pair;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
||||||
import cn.iocoder.yudao.framework.pay.config.PayProperties;
|
import cn.iocoder.yudao.framework.pay.config.PayProperties;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClient;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClient;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
||||||
@ -28,6 +30,7 @@ import cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants;
|
|||||||
import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum;
|
import cn.iocoder.yudao.module.pay.enums.notify.PayNotifyTypeEnum;
|
||||||
import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum;
|
import cn.iocoder.yudao.module.pay.enums.order.PayOrderNotifyStatusEnum;
|
||||||
import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
|
import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
|
||||||
|
import cn.iocoder.yudao.module.pay.enums.refund.PayRefundTypeEnum;
|
||||||
import cn.iocoder.yudao.module.pay.service.app.PayAppService;
|
import cn.iocoder.yudao.module.pay.service.app.PayAppService;
|
||||||
import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
|
import cn.iocoder.yudao.module.pay.service.channel.PayChannelService;
|
||||||
import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService;
|
import cn.iocoder.yudao.module.pay.service.notify.PayNotifyService;
|
||||||
@ -41,6 +44,7 @@ import javax.annotation.Resource;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
|
import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
|
||||||
@ -78,6 +82,11 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
return orderMapper.selectById(id);
|
return orderMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getOrderCountByAppId(Long appId) {
|
||||||
|
return orderMapper.selectCountByAppId(appId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<PayOrderDO> getOrderPage(PayOrderPageReqVO pageReqVO) {
|
public PageResult<PayOrderDO> getOrderPage(PayOrderPageReqVO pageReqVO) {
|
||||||
return orderMapper.selectPage(pageReqVO);
|
return orderMapper.selectPage(pageReqVO);
|
||||||
@ -109,22 +118,19 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建支付交易单
|
// 创建支付交易单
|
||||||
order = PayOrderConvert.INSTANCE.convert(reqDTO).setAppId(app.getId());
|
order = PayOrderConvert.INSTANCE.convert(reqDTO).setAppId(app.getId())
|
||||||
// 商户相关字段
|
// 商户相关字段
|
||||||
order.setNotifyUrl(app.getPayNotifyUrl())
|
.setNotifyUrl(app.getPayNotifyUrl()).setNotifyStatus(PayOrderNotifyStatusEnum.NO.getStatus())
|
||||||
.setNotifyStatus(PayOrderNotifyStatusEnum.NO.getStatus());
|
// 订单相关字段
|
||||||
// 订单相关字段
|
.setStatus(PayOrderStatusEnum.WAITING.getStatus())
|
||||||
order.setStatus(PayOrderStatusEnum.WAITING.getStatus());
|
// 退款相关字段
|
||||||
// 退款相关字段
|
.setRefundStatus(PayRefundTypeEnum.NO.getStatus()).setRefundTimes(0).setRefundPrice(0L);
|
||||||
// todo @芋艿 创建支付的订单的退款状态枚举是不是有问题,应该是 PayRefundTypeEnum 吧 您这填写的是 PayOrderNotifyStatusEnum 回调状态枚举
|
|
||||||
order.setRefundStatus(PayOrderNotifyStatusEnum.NO.getStatus())
|
|
||||||
.setRefundTimes(0).setRefundAmount(0L);
|
|
||||||
orderMapper.insert(order);
|
orderMapper.insert(order);
|
||||||
// 最终返回
|
|
||||||
return order.getId();
|
return order.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public PayOrderSubmitRespVO submitPayOrder(PayOrderSubmitReqVO reqVO, String userIp) {
|
public PayOrderSubmitRespVO submitPayOrder(PayOrderSubmitReqVO reqVO, String userIp) {
|
||||||
// 1. 获得 PayOrderDO ,并校验其是否存在
|
// 1. 获得 PayOrderDO ,并校验其是否存在
|
||||||
PayOrderDO order = validatePayOrderCanSubmit(reqVO.getId());
|
PayOrderDO order = validatePayOrderCanSubmit(reqVO.getId());
|
||||||
@ -147,12 +153,18 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
.setNotifyUrl(genChannelPayNotifyUrl(channel))
|
.setNotifyUrl(genChannelPayNotifyUrl(channel))
|
||||||
.setReturnUrl(reqVO.getReturnUrl())
|
.setReturnUrl(reqVO.getReturnUrl())
|
||||||
// 订单相关字段
|
// 订单相关字段
|
||||||
.setAmount(order.getAmount()).setExpireTime(order.getExpireTime());
|
.setAmount(order.getPrice()).setExpireTime(order.getExpireTime());
|
||||||
PayOrderUnifiedRespDTO unifiedOrderRespDTO = client.unifiedOrder(unifiedOrderReqDTO);
|
PayOrderUnifiedRespDTO unifiedOrderRespDTO = client.unifiedOrder(unifiedOrderReqDTO);
|
||||||
|
|
||||||
// TODO 轮询三方接口,是否已经支付的任务
|
// 4. 如果调用直接支付成功,则直接更新支付单状态为成功。例如说:付款码支付,免密支付时,就直接验证支付成功
|
||||||
|
if (unifiedOrderRespDTO.getNotify() != null) {
|
||||||
|
notifyPayOrderSuccess(channel, unifiedOrderRespDTO.getNotify(), null);
|
||||||
|
// 此处需要读取最新的状态
|
||||||
|
order = orderMapper.selectById(order.getId());
|
||||||
|
}
|
||||||
|
|
||||||
// 返回成功
|
// 返回成功
|
||||||
return PayOrderConvert.INSTANCE.convert(unifiedOrderRespDTO);
|
return PayOrderConvert.INSTANCE.convert(order, unifiedOrderRespDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PayOrderDO validatePayOrderCanSubmit(Long id) {
|
private PayOrderDO validatePayOrderCanSubmit(Long id) {
|
||||||
@ -163,6 +175,9 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
|
if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
|
||||||
throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
|
throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
|
||||||
}
|
}
|
||||||
|
if (LocalDateTimeUtils.beforeNow(order.getExpireTime())) { // 校验是否过期
|
||||||
|
throw exception(ErrorCodeConstants.PAY_ORDER_IS_EXPIRED);
|
||||||
|
}
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,17 +229,22 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
public void notifyPayOrder(Long channelId, PayOrderNotifyRespDTO notify, PayNotifyReqDTO rawNotify) {
|
public void notifyPayOrder(Long channelId, PayOrderNotifyRespDTO notify, PayNotifyReqDTO rawNotify) {
|
||||||
// 校验支付渠道是否有效
|
// 校验支付渠道是否有效
|
||||||
PayChannelDO channel = channelService.validPayChannel(channelId);
|
PayChannelDO channel = channelService.validPayChannel(channelId);
|
||||||
TenantUtils.execute(channel.getTenantId(), () -> {
|
// 更新支付订单为已支付
|
||||||
// 1. 更新 PayOrderExtensionDO 支付成功
|
TenantUtils.execute(channel.getTenantId(), () -> notifyPayOrderSuccess(channel, notify, rawNotify));
|
||||||
PayOrderExtensionDO orderExtension = updatePayOrderExtensionSuccess(notify.getOrderExtensionNo(),
|
}
|
||||||
rawNotify);
|
|
||||||
// 2. 更新 PayOrderDO 支付成功
|
|
||||||
PayOrderDO order = updatePayOrderSuccess(channel, orderExtension, notify);
|
|
||||||
|
|
||||||
// 3. 插入支付通知记录
|
private void notifyPayOrderSuccess(PayChannelDO channel, PayOrderNotifyRespDTO notify, PayNotifyReqDTO rawNotify) {
|
||||||
notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder()
|
// 1. 更新 PayOrderExtensionDO 支付成功
|
||||||
.type(PayNotifyTypeEnum.ORDER.getType()).dataId(order.getId()).build());
|
PayOrderExtensionDO orderExtension = updatePayOrderExtensionSuccess(notify.getOrderExtensionNo(), rawNotify);
|
||||||
});
|
// 2. 更新 PayOrderDO 支付成功
|
||||||
|
Pair<Boolean, PayOrderDO> order = updatePayOrderSuccess(channel, orderExtension, notify);
|
||||||
|
if (order.getKey()) { // 如果之前已经成功回调,则直接返回,不用重复记录支付通知记录;例如说:支付平台重复回调
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 插入支付通知记录
|
||||||
|
notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder()
|
||||||
|
.type(PayNotifyTypeEnum.ORDER.getType()).dataId(order.getValue().getId()).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -235,15 +255,20 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
* @return PayOrderExtensionDO 对象
|
* @return PayOrderExtensionDO 对象
|
||||||
*/
|
*/
|
||||||
private PayOrderExtensionDO updatePayOrderExtensionSuccess(String no, PayNotifyReqDTO rawNotify) {
|
private PayOrderExtensionDO updatePayOrderExtensionSuccess(String no, PayNotifyReqDTO rawNotify) {
|
||||||
// 1.1 查询 PayOrderExtensionDO
|
// 1. 查询 PayOrderExtensionDO
|
||||||
PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(no);
|
PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(no);
|
||||||
if (orderExtension == null) {
|
if (orderExtension == null) {
|
||||||
throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_NOT_FOUND);
|
throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
if (PayOrderStatusEnum.isSuccess(orderExtension.getStatus())) { // 如果已经是成功,直接返回,不用重复更新
|
||||||
|
log.info("[updatePayOrderSuccess][支付拓展单({}) 已经是已支付,无需更新为已支付]", orderExtension.getId());
|
||||||
|
return orderExtension;
|
||||||
|
}
|
||||||
if (ObjectUtil.notEqual(orderExtension.getStatus(), PayOrderStatusEnum.WAITING.getStatus())) { // 校验状态,必须是待支付
|
if (ObjectUtil.notEqual(orderExtension.getStatus(), PayOrderStatusEnum.WAITING.getStatus())) { // 校验状态,必须是待支付
|
||||||
throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
|
throw exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
|
||||||
}
|
}
|
||||||
// 1.2 更新 PayOrderExtensionDO
|
|
||||||
|
// 2. 更新 PayOrderExtensionDO
|
||||||
int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(),
|
int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(),
|
||||||
PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId())
|
PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId())
|
||||||
.status(PayOrderStatusEnum.SUCCESS.getStatus())
|
.status(PayOrderStatusEnum.SUCCESS.getStatus())
|
||||||
@ -261,19 +286,26 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
* @param channel 支付渠道
|
* @param channel 支付渠道
|
||||||
* @param orderExtension 支付拓展单
|
* @param orderExtension 支付拓展单
|
||||||
* @param notify 通知回调
|
* @param notify 通知回调
|
||||||
* @return PayOrderDO 对象
|
* @return key:是否之前已经成功回调
|
||||||
|
* value:PayOrderDO 对象
|
||||||
*/
|
*/
|
||||||
private PayOrderDO updatePayOrderSuccess(PayChannelDO channel, PayOrderExtensionDO orderExtension,
|
private Pair<Boolean, PayOrderDO> updatePayOrderSuccess(PayChannelDO channel, PayOrderExtensionDO orderExtension,
|
||||||
PayOrderNotifyRespDTO notify) {
|
PayOrderNotifyRespDTO notify) {
|
||||||
// 2.1 判断 PayOrderDO 是否处于待支付
|
// 1. 判断 PayOrderDO 是否处于待支付
|
||||||
PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId());
|
PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId());
|
||||||
if (order == null) {
|
if (order == null) {
|
||||||
throw exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND);
|
throw exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
if (PayOrderStatusEnum.isSuccess(order.getStatus()) // 如果已经是成功,直接返回,不用重复更新
|
||||||
|
&& Objects.equals(order.getSuccessExtensionId(), orderExtension.getId())) {
|
||||||
|
log.info("[updatePayOrderSuccess][支付订单({}) 已经是已支付,无需更新为已支付]", order.getId());
|
||||||
|
return Pair.of(true, order);
|
||||||
|
}
|
||||||
if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
|
if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付
|
||||||
throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
|
throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
|
||||||
}
|
}
|
||||||
// 2.2 更新 PayOrderDO
|
|
||||||
|
// 2. 更新 PayOrderDO
|
||||||
int updateCounts = orderMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(),
|
int updateCounts = orderMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(),
|
||||||
PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus())
|
PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus())
|
||||||
.channelId(channel.getId()).channelCode(channel.getCode())
|
.channelId(channel.getId()).channelCode(channel.getCode())
|
||||||
@ -284,7 +316,7 @@ public class PayOrderServiceImpl implements PayOrderService {
|
|||||||
throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
|
throw exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING);
|
||||||
}
|
}
|
||||||
log.info("[updatePayOrderSuccess][支付订单({}) 更新为已支付]", order.getId());
|
log.info("[updatePayOrderSuccess][支付订单({}) 更新为已支付]", order.getId());
|
||||||
return order;
|
return Pair.of(false, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,14 @@ public interface PayRefundService {
|
|||||||
*/
|
*/
|
||||||
PayRefundDO getRefund(Long id);
|
PayRefundDO getRefund(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得指定应用的退款数量
|
||||||
|
*
|
||||||
|
* @param appId 应用编号
|
||||||
|
* @return 退款数量
|
||||||
|
*/
|
||||||
|
Long getRefundCountByAppId(Long appId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得退款订单分页
|
* 获得退款订单分页
|
||||||
*
|
*
|
||||||
|
@ -80,6 +80,11 @@ public class PayRefundServiceImpl implements PayRefundService {
|
|||||||
return refundMapper.selectById(id);
|
return refundMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getRefundCountByAppId(Long appId) {
|
||||||
|
return refundMapper.selectCountByApp(appId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<PayRefundDO> getRefundPage(PayRefundPageReqVO pageReqVO) {
|
public PageResult<PayRefundDO> getRefundPage(PayRefundPageReqVO pageReqVO) {
|
||||||
return refundMapper.selectPage(pageReqVO);
|
return refundMapper.selectPage(pageReqVO);
|
||||||
@ -117,7 +122,7 @@ public class PayRefundServiceImpl implements PayRefundService {
|
|||||||
validatePayRefund(reqDTO, order);
|
validatePayRefund(reqDTO, order);
|
||||||
// 退款类型
|
// 退款类型
|
||||||
PayRefundTypeEnum refundType = PayRefundTypeEnum.SOME;
|
PayRefundTypeEnum refundType = PayRefundTypeEnum.SOME;
|
||||||
if (Objects.equals(reqDTO.getAmount(), order.getAmount())) {
|
if (Objects.equals(reqDTO.getPrice(), order.getPrice())) {
|
||||||
refundType = PayRefundTypeEnum.ALL;
|
refundType = PayRefundTypeEnum.ALL;
|
||||||
}
|
}
|
||||||
PayOrderExtensionDO orderExtensionDO = orderExtensionService.getOrderExtension(order.getSuccessExtensionId());
|
PayOrderExtensionDO orderExtensionDO = orderExtensionService.getOrderExtension(order.getSuccessExtensionId());
|
||||||
@ -144,8 +149,8 @@ public class PayRefundServiceImpl implements PayRefundService {
|
|||||||
.orderId(order.getId())
|
.orderId(order.getId())
|
||||||
.merchantRefundNo(merchantRefundId) // TODO 芋艿:需要优化
|
.merchantRefundNo(merchantRefundId) // TODO 芋艿:需要优化
|
||||||
.notifyUrl(app.getRefundNotifyUrl())
|
.notifyUrl(app.getRefundNotifyUrl())
|
||||||
.payAmount(order.getAmount())
|
.payPrice(order.getPrice())
|
||||||
.refundAmount(reqDTO.getAmount())
|
.refundPrice(reqDTO.getPrice())
|
||||||
.userIp(reqDTO.getUserIp())
|
.userIp(reqDTO.getUserIp())
|
||||||
.merchantOrderId(order.getMerchantOrderId())
|
.merchantOrderId(order.getMerchantOrderId())
|
||||||
.tradeNo(orderExtensionDO.getNo())
|
.tradeNo(orderExtensionDO.getNo())
|
||||||
@ -159,7 +164,7 @@ public class PayRefundServiceImpl implements PayRefundService {
|
|||||||
// TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下;
|
// TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下;
|
||||||
PayRefundUnifiedReqDTO unifiedReqDTO = new PayRefundUnifiedReqDTO();
|
PayRefundUnifiedReqDTO unifiedReqDTO = new PayRefundUnifiedReqDTO();
|
||||||
unifiedReqDTO.setUserIp(reqDTO.getUserIp())
|
unifiedReqDTO.setUserIp(reqDTO.getUserIp())
|
||||||
.setAmount(reqDTO.getAmount())
|
.setAmount(reqDTO.getPrice())
|
||||||
.setChannelOrderNo(order.getChannelOrderNo())
|
.setChannelOrderNo(order.getChannelOrderNo())
|
||||||
.setPayTradeNo(orderExtensionDO.getNo())
|
.setPayTradeNo(orderExtensionDO.getNo())
|
||||||
.setMerchantRefundId(merchantRefundId) // TODO 芋艿:需要优化
|
.setMerchantRefundId(merchantRefundId) // TODO 芋艿:需要优化
|
||||||
@ -209,17 +214,17 @@ public class PayRefundServiceImpl implements PayRefundService {
|
|||||||
|
|
||||||
// 得到已退金额
|
// 得到已退金额
|
||||||
PayOrderDO payOrderDO = orderService.getOrder(refundDO.getOrderId());
|
PayOrderDO payOrderDO = orderService.getOrder(refundDO.getOrderId());
|
||||||
Long refundedAmount = payOrderDO.getRefundAmount();
|
Long refundedAmount = payOrderDO.getRefundPrice();
|
||||||
|
|
||||||
PayOrderStatusEnum orderStatus = PayOrderStatusEnum.SUCCESS;
|
PayOrderStatusEnum orderStatus = PayOrderStatusEnum.SUCCESS;
|
||||||
if(Objects.equals(payOrderDO.getAmount(), refundedAmount+ refundDO.getRefundAmount())){
|
if(Objects.equals(payOrderDO.getPrice(), refundedAmount+ refundDO.getRefundPrice())){
|
||||||
//支付金额 = 已退金额 + 本次退款金额。
|
//支付金额 = 已退金额 + 本次退款金额。
|
||||||
orderStatus = PayOrderStatusEnum.CLOSED;
|
orderStatus = PayOrderStatusEnum.CLOSED;
|
||||||
}
|
}
|
||||||
// 更新支付订单
|
// 更新支付订单
|
||||||
PayOrderDO updateOrderDO = new PayOrderDO();
|
PayOrderDO updateOrderDO = new PayOrderDO();
|
||||||
updateOrderDO.setId(refundDO.getOrderId())
|
updateOrderDO.setId(refundDO.getOrderId())
|
||||||
.setRefundAmount(refundedAmount + refundDO.getRefundAmount())
|
.setRefundPrice(refundedAmount + refundDO.getRefundPrice())
|
||||||
.setStatus(orderStatus.getStatus())
|
.setStatus(orderStatus.getStatus())
|
||||||
.setRefundTimes(payOrderDO.getRefundTimes() + 1)
|
.setRefundTimes(payOrderDO.getRefundTimes() + 1)
|
||||||
.setRefundStatus(refundDO.getType());
|
.setRefundStatus(refundDO.getType());
|
||||||
@ -257,8 +262,8 @@ public class PayRefundServiceImpl implements PayRefundService {
|
|||||||
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_ALL_REFUNDED);
|
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_ALL_REFUNDED);
|
||||||
}
|
}
|
||||||
// 校验金额 退款金额不能大于 原定的金额
|
// 校验金额 退款金额不能大于 原定的金额
|
||||||
if (reqDTO.getAmount() + order.getRefundAmount() > order.getAmount()){
|
if (reqDTO.getPrice() + order.getRefundPrice() > order.getPrice()){
|
||||||
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_AMOUNT_EXCEED);
|
throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_PRICE_PRICE_EXCEED);
|
||||||
}
|
}
|
||||||
// 校验渠道订单号
|
// 校验渠道订单号
|
||||||
if (StrUtil.isEmpty(order.getChannelOrderNo())) {
|
if (StrUtil.isEmpty(order.getChannelOrderNo())) {
|
||||||
|
@ -30,7 +30,7 @@ public class PayOrderServiceIntegrationTest extends BaseDbIntegrationTest {
|
|||||||
reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis()));
|
reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis()));
|
||||||
reqDTO.setSubject("标题");
|
reqDTO.setSubject("标题");
|
||||||
reqDTO.setBody("内容");
|
reqDTO.setBody("内容");
|
||||||
reqDTO.setAmount(100);
|
reqDTO.setPrice(100);
|
||||||
reqDTO.setExpireTime(DateUtils.addTime(Duration.ofDays(1)));
|
reqDTO.setExpireTime(DateUtils.addTime(Duration.ofDays(1)));
|
||||||
// 发起请求
|
// 发起请求
|
||||||
payOrderService.createPayOrder(reqDTO);
|
payOrderService.createPayOrder(reqDTO);
|
||||||
|
@ -3,27 +3,42 @@ package cn.iocoder.yudao.module.pay.service.app;
|
|||||||
import cn.hutool.core.util.RandomUtil;
|
import cn.hutool.core.util.RandomUtil;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
|
||||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
|
import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppPageReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.PayAppUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper;
|
import cn.iocoder.yudao.module.pay.dal.mysql.app.PayAppMapper;
|
||||||
|
import cn.iocoder.yudao.module.pay.service.order.PayOrderService;
|
||||||
|
import cn.iocoder.yudao.module.pay.service.refund.PayRefundService;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
|
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
|
||||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*;
|
||||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_APP_NOT_FOUND;
|
import static java.util.Collections.singleton;
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link PayAppServiceImpl} 的单元测试
|
||||||
|
*
|
||||||
|
* @author aquan
|
||||||
|
*/
|
||||||
@Import(PayAppServiceImpl.class)
|
@Import(PayAppServiceImpl.class)
|
||||||
public class PayAppServiceTest extends BaseDbUnitTest {
|
public class PayAppServiceTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
@ -33,17 +48,23 @@ public class PayAppServiceTest extends BaseDbUnitTest {
|
|||||||
@Resource
|
@Resource
|
||||||
private PayAppMapper appMapper;
|
private PayAppMapper appMapper;
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
private PayOrderService orderService;
|
||||||
|
@MockBean
|
||||||
|
private PayRefundService refundService;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateApp_success() {
|
public void testCreateApp_success() {
|
||||||
// 准备参数
|
// 准备参数
|
||||||
PayAppCreateReqVO reqVO = randomPojo(PayAppCreateReqVO.class, o ->
|
PayAppCreateReqVO reqVO = randomPojo(PayAppCreateReqVO.class, o ->
|
||||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))
|
||||||
|
.setPayNotifyUrl(randomURL())
|
||||||
|
.setRefundNotifyUrl(randomURL()));
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
Long appId = appService.createApp(reqVO);
|
Long appId = appService.createApp(reqVO);
|
||||||
// 断言
|
// 断言
|
||||||
assertNotNull(appId);
|
assertNotNull(appId);
|
||||||
// 校验记录的属性是否正确
|
|
||||||
PayAppDO app = appMapper.selectById(appId);
|
PayAppDO app = appMapper.selectById(appId);
|
||||||
assertPojoEquals(reqVO, app);
|
assertPojoEquals(reqVO, app);
|
||||||
}
|
}
|
||||||
@ -51,12 +72,12 @@ public class PayAppServiceTest extends BaseDbUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testUpdateApp_success() {
|
public void testUpdateApp_success() {
|
||||||
// mock 数据
|
// mock 数据
|
||||||
PayAppDO dbApp = randomPojo(PayAppDO.class, o ->
|
PayAppDO dbApp = randomPojo(PayAppDO.class);
|
||||||
o.setStatus(CommonStatusEnum.DISABLE.getStatus()));
|
|
||||||
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
// 准备参数
|
// 准备参数
|
||||||
PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> {
|
PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> {
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||||
|
o.setPayNotifyUrl(randomURL()).setRefundNotifyUrl(randomURL());
|
||||||
o.setId(dbApp.getId()); // 设置更新的 ID
|
o.setId(dbApp.getId()); // 设置更新的 ID
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -77,10 +98,26 @@ public class PayAppServiceTest extends BaseDbUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDeleteApp_success() {
|
public void testUpdateAppStatus() {
|
||||||
// mock 数据
|
// mock 数据
|
||||||
PayAppDO dbApp = randomPojo(PayAppDO.class, o ->
|
PayAppDO dbApp = randomPojo(PayAppDO.class, o ->
|
||||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
o.setStatus(CommonStatusEnum.DISABLE.getStatus()));
|
||||||
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
|
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbApp.getId();
|
||||||
|
Integer status = CommonStatusEnum.ENABLE.getStatus();
|
||||||
|
// 调用
|
||||||
|
appService.updateAppStatus(id, status);
|
||||||
|
// 断言
|
||||||
|
PayAppDO app = appMapper.selectById(id); // 获取最新的
|
||||||
|
assertEquals(status, app.getStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteApp_success() {
|
||||||
|
// mock 数据
|
||||||
|
PayAppDO dbApp = randomPojo(PayAppDO.class);
|
||||||
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
// 准备参数
|
// 准备参数
|
||||||
Long id = dbApp.getId();
|
Long id = dbApp.getId();
|
||||||
@ -100,15 +137,71 @@ public class PayAppServiceTest extends BaseDbUnitTest {
|
|||||||
assertServiceException(() -> appService.deleteApp(id), PAY_APP_NOT_FOUND);
|
assertServiceException(() -> appService.deleteApp(id), PAY_APP_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteApp_existOrder() {
|
||||||
|
// mock 数据
|
||||||
|
PayAppDO dbApp = randomPojo(PayAppDO.class);
|
||||||
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbApp.getId();
|
||||||
|
// mock 订单有订单
|
||||||
|
when(orderService.getOrderCountByAppId(eq(id))).thenReturn(10L);
|
||||||
|
|
||||||
|
// 调用, 并断言异常
|
||||||
|
assertServiceException(() -> appService.deleteApp(id), PAY_APP_EXIST_ORDER_CANT_DELETE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeleteApp_existRefund() {
|
||||||
|
// mock 数据
|
||||||
|
PayAppDO dbApp = randomPojo(PayAppDO.class);
|
||||||
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbApp.getId();
|
||||||
|
// mock 订单有订单
|
||||||
|
when(refundService.getRefundCountByAppId(eq(id))).thenReturn(10L);
|
||||||
|
|
||||||
|
// 调用, 并断言异常
|
||||||
|
assertServiceException(() -> appService.deleteApp(id), PAY_APP_EXIST_REFUND_CANT_DELETE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testApp() {
|
||||||
|
// mock 数据
|
||||||
|
PayAppDO dbApp = randomPojo(PayAppDO.class);
|
||||||
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbApp.getId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
PayAppDO app = appService.getApp(id);
|
||||||
|
// 校验数据一致
|
||||||
|
assertPojoEquals(app, dbApp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAppMap() {
|
||||||
|
// mock 数据
|
||||||
|
PayAppDO dbApp01 = randomPojo(PayAppDO.class);
|
||||||
|
appMapper.insert(dbApp01);// @Sql: 先插入出一条存在的数据
|
||||||
|
PayAppDO dbApp02 = randomPojo(PayAppDO.class);
|
||||||
|
appMapper.insert(dbApp02);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbApp01.getId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
Map<Long, PayAppDO> appMap = appService.getAppMap(singleton(id));
|
||||||
|
// 校验数据一致
|
||||||
|
assertEquals(1, appMap.size());
|
||||||
|
assertPojoEquals(dbApp01, appMap.get(id));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetAppPage() {
|
public void testGetAppPage() {
|
||||||
// mock 数据
|
// mock 数据
|
||||||
PayAppDO dbApp = randomPojo(PayAppDO.class, o -> { // 等会查询到
|
PayAppDO dbApp = randomPojo(PayAppDO.class, o -> { // 等会查询到
|
||||||
o.setName("灿灿姐的杂货铺");
|
o.setName("灿灿姐的杂货铺");
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||||
o.setRemark("敏敏姐的小卖铺");
|
|
||||||
o.setPayNotifyUrl("https://www.hc.com");
|
|
||||||
o.setRefundNotifyUrl("https://www.xm.com");
|
|
||||||
o.setCreateTime(buildTime(2021,11,20));
|
o.setCreateTime(buildTime(2021,11,20));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -117,22 +210,13 @@ public class PayAppServiceTest extends BaseDbUnitTest {
|
|||||||
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setName("敏敏姐的杂货铺")));
|
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setName("敏敏姐的杂货铺")));
|
||||||
// 测试 status 不匹配
|
// 测试 status 不匹配
|
||||||
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||||
// 测试 remark 不匹配
|
|
||||||
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRemark("灿灿姐的小卖部")));
|
|
||||||
// 测试 payNotifyUrl 不匹配
|
|
||||||
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setPayNotifyUrl("xm.com")));
|
|
||||||
// 测试 refundNotifyUrl 不匹配
|
|
||||||
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRefundNotifyUrl("hc.com")));
|
|
||||||
// 测试 createTime 不匹配
|
// 测试 createTime 不匹配
|
||||||
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setCreateTime(buildTime(2021,12,21))));
|
appMapper.insert(cloneIgnoreId(dbApp, o -> o.setCreateTime(buildTime(2021,12,21))));
|
||||||
// 准备参数
|
// 准备参数
|
||||||
PayAppPageReqVO reqVO = new PayAppPageReqVO();
|
PayAppPageReqVO reqVO = new PayAppPageReqVO();
|
||||||
reqVO.setName("灿灿姐的杂货铺");
|
reqVO.setName("灿灿姐的杂货铺");
|
||||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||||
reqVO.setRemark("敏敏姐的小卖铺");
|
reqVO.setCreateTime(buildBetweenTime(2021, 11, 19, 2021, 11, 21));
|
||||||
reqVO.setPayNotifyUrl("https://www.hc.com");
|
|
||||||
reqVO.setRefundNotifyUrl("https://www.xm.com");
|
|
||||||
reqVO.setCreateTime((new LocalDateTime[]{buildTime(2021,11,19),buildTime(2021,11,21)}));
|
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
PageResult<PayAppDO> pageResult = appService.getAppPage(reqVO);
|
PageResult<PayAppDO> pageResult = appService.getAppPage(reqVO);
|
||||||
@ -142,4 +226,37 @@ public class PayAppServiceTest extends BaseDbUnitTest {
|
|||||||
assertPojoEquals(dbApp, pageResult.getList().get(0));
|
assertPojoEquals(dbApp, pageResult.getList().get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidPayApp_success() {
|
||||||
|
// mock 数据
|
||||||
|
PayAppDO dbApp = randomPojo(PayAppDO.class,
|
||||||
|
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||||
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbApp.getId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
PayAppDO app = appService.validPayApp(id);
|
||||||
|
// 校验数据一致
|
||||||
|
assertPojoEquals(app, dbApp);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidPayApp_notFound() {
|
||||||
|
assertServiceException(() -> appService.validPayApp(randomLongId()), PAY_APP_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValidPayApp_disable() {
|
||||||
|
// mock 数据
|
||||||
|
PayAppDO dbApp = randomPojo(PayAppDO.class,
|
||||||
|
o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()));
|
||||||
|
appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long id = dbApp.getId();
|
||||||
|
|
||||||
|
// 调用,并断言异常
|
||||||
|
assertServiceException(() -> appService.validPayApp(id), PAY_APP_IS_DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,38 +1,40 @@
|
|||||||
package cn.iocoder.yudao.module.pay.service.channel;
|
package cn.iocoder.yudao.module.pay.service.channel;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
|
import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
|
||||||
import cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig;
|
import cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig;
|
||||||
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
|
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
|
||||||
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelPageReqVO;
|
|
||||||
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
import cn.iocoder.yudao.module.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO;
|
||||||
import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper;
|
import cn.iocoder.yudao.module.pay.dal.mysql.channel.PayChannelMapper;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.validation.Validator;
|
import javax.validation.Validator;
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
|
import java.util.Collections;
|
||||||
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
|
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
|
||||||
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
|
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_EXIST_SAME_CHANNEL_ERROR;
|
||||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_EXISTS;
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
@Import({PayChannelServiceImpl.class})
|
@Import({PayChannelServiceImpl.class})
|
||||||
public class PayChannelServiceTest extends BaseDbUnitTest {
|
public class PayChannelServiceTest extends BaseDbUnitTest {
|
||||||
|
|
||||||
|
private static final String ALIPAY_SERVER_URL = "https://openapi.alipay.com/gateway.do";
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private PayChannelServiceImpl channelService;
|
private PayChannelServiceImpl channelService;
|
||||||
|
|
||||||
@ -44,110 +46,62 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
|
|||||||
@MockBean
|
@MockBean
|
||||||
private Validator validator;
|
private Validator validator;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setUp() {
|
||||||
|
channelService.setChannelCache(null);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateWechatVersion2Channel_success() {
|
public void testCreateChannel_success() {
|
||||||
// 准备参数
|
// 准备参数
|
||||||
WxPayClientConfig v2Config = getV2Config();
|
WxPayClientConfig config = randomWxPayClientConfig();
|
||||||
PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
|
PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
|
||||||
|
o.setStatus(randomCommonStatus());
|
||||||
o.setCode(PayChannelEnum.WX_PUB.getCode());
|
o.setCode(PayChannelEnum.WX_PUB.getCode());
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setConfig(JsonUtils.toJsonString(config));
|
||||||
o.setConfig(JSON.toJSONString(v2Config));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
Long channelId = channelService.createChannel(reqVO);
|
Long channelId = channelService.createChannel(reqVO);
|
||||||
// 断言
|
|
||||||
assertNotNull(channelId);
|
|
||||||
// 校验记录的属性是否正确
|
// 校验记录的属性是否正确
|
||||||
PayChannelDO channel = channelMapper.selectById(channelId);
|
PayChannelDO channel = channelMapper.selectById(channelId);
|
||||||
assertPojoEquals(reqVO, channel, "config");
|
assertPojoEquals(reqVO, channel, "config");
|
||||||
// 关于config 对象应该拿出来重新对比
|
assertPojoEquals(config, channel.getConfig());
|
||||||
assertPojoEquals(v2Config, channel.getConfig());
|
// 校验缓存
|
||||||
|
assertEquals(1, channelService.getChannelCache().size());
|
||||||
|
assertEquals(channel, channelService.getChannelCache().get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateWechatVersion3Channel_success() {
|
public void testCreateChannel_exists() {
|
||||||
|
// mock 数据
|
||||||
|
PayChannelDO dbChannel = randomPojo(PayChannelDO.class,
|
||||||
|
o -> o.setConfig(randomWxPayClientConfig()));
|
||||||
|
channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
|
||||||
// 准备参数
|
// 准备参数
|
||||||
WxPayClientConfig v3Config = getV3Config();
|
|
||||||
PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
|
PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
|
||||||
o.setCode(PayChannelEnum.WX_PUB.getCode());
|
o.setAppId(dbChannel.getAppId());
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setCode(dbChannel.getCode());
|
||||||
o.setConfig(JSON.toJSONString(v3Config));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 调用
|
// 调用, 并断言异常
|
||||||
Long channelId = channelService.createChannel(reqVO);
|
assertServiceException(() -> channelService.createChannel(reqVO), CHANNEL_EXIST_SAME_CHANNEL_ERROR);
|
||||||
// 断言
|
|
||||||
assertNotNull(channelId);
|
|
||||||
// 校验记录的属性是否正确
|
|
||||||
PayChannelDO channel = channelMapper.selectById(channelId);
|
|
||||||
assertPojoEquals(reqVO, channel, "config");
|
|
||||||
// 关于config 对象应该拿出来重新对比
|
|
||||||
assertPojoEquals(v3Config, channel.getConfig());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreateAliPayPublicKeyChannel_success() {
|
|
||||||
// 准备参数
|
|
||||||
|
|
||||||
AlipayPayClientConfig payClientConfig = getPublicKeyConfig();
|
|
||||||
PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
|
|
||||||
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
|
||||||
o.setConfig(JSON.toJSONString(payClientConfig));
|
|
||||||
});
|
|
||||||
|
|
||||||
// 调用
|
|
||||||
Long channelId = channelService.createChannel(reqVO);
|
|
||||||
// 断言
|
|
||||||
assertNotNull(channelId);
|
|
||||||
// 校验记录的属性是否正确
|
|
||||||
PayChannelDO channel = channelMapper.selectById(channelId);
|
|
||||||
assertPojoEquals(reqVO, channel, "config");
|
|
||||||
// 关于config 对象应该拿出来重新对比
|
|
||||||
assertPojoEquals(payClientConfig, channel.getConfig());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreateAliPayCertificateChannel_success() {
|
|
||||||
// 准备参数
|
|
||||||
|
|
||||||
AlipayPayClientConfig payClientConfig = getCertificateConfig();
|
|
||||||
PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> {
|
|
||||||
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
|
||||||
o.setConfig(JSON.toJSONString(payClientConfig));
|
|
||||||
});
|
|
||||||
|
|
||||||
// 调用
|
|
||||||
Long channelId = channelService.createChannel(reqVO);
|
|
||||||
// 断言
|
|
||||||
assertNotNull(channelId);
|
|
||||||
// 校验记录的属性是否正确
|
|
||||||
PayChannelDO channel = channelMapper.selectById(channelId);
|
|
||||||
assertPojoEquals(reqVO, channel, "config");
|
|
||||||
// 关于config 对象应该拿出来重新对比
|
|
||||||
assertPojoEquals(payClientConfig, channel.getConfig());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateChannel_success() {
|
public void testUpdateChannel_success() {
|
||||||
// mock 数据
|
// mock 数据
|
||||||
AlipayPayClientConfig payClientConfig = getCertificateConfig();
|
|
||||||
PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
|
PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
|
||||||
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setConfig(randomAlipayPayClientConfig());
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
});
|
});
|
||||||
channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
|
channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
|
||||||
// 准备参数
|
// 准备参数
|
||||||
AlipayPayClientConfig payClientPublicKeyConfig = getPublicKeyConfig();
|
AlipayPayClientConfig config = randomAlipayPayClientConfig();
|
||||||
PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> {
|
PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> {
|
||||||
o.setCode(dbChannel.getCode());
|
|
||||||
o.setStatus(dbChannel.getStatus());
|
|
||||||
o.setConfig(JSON.toJSONString(payClientPublicKeyConfig));
|
|
||||||
o.setId(dbChannel.getId()); // 设置更新的 ID
|
o.setId(dbChannel.getId()); // 设置更新的 ID
|
||||||
|
o.setStatus(randomCommonStatus());
|
||||||
|
o.setConfig(JsonUtils.toJsonString(config));
|
||||||
});
|
});
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
@ -155,15 +109,17 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
|
|||||||
// 校验是否更新正确
|
// 校验是否更新正确
|
||||||
PayChannelDO channel = channelMapper.selectById(reqVO.getId()); // 获取最新的
|
PayChannelDO channel = channelMapper.selectById(reqVO.getId()); // 获取最新的
|
||||||
assertPojoEquals(reqVO, channel, "config");
|
assertPojoEquals(reqVO, channel, "config");
|
||||||
assertPojoEquals(payClientPublicKeyConfig, channel.getConfig());
|
assertPojoEquals(config, channel.getConfig());
|
||||||
|
// 校验缓存
|
||||||
|
assertEquals(1, channelService.getChannelCache().size());
|
||||||
|
assertEquals(channel, channelService.getChannelCache().get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateChannel_notExists() {
|
public void testUpdateChannel_notExists() {
|
||||||
// 准备参数
|
// 准备参数
|
||||||
AlipayPayClientConfig payClientPublicKeyConfig = getPublicKeyConfig();
|
AlipayPayClientConfig payClientPublicKeyConfig = randomAlipayPayClientConfig();
|
||||||
PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> {
|
PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> {
|
||||||
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||||
o.setConfig(JSON.toJSONString(payClientPublicKeyConfig));
|
o.setConfig(JSON.toJSONString(payClientPublicKeyConfig));
|
||||||
});
|
});
|
||||||
@ -175,11 +131,9 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testDeleteChannel_success() {
|
public void testDeleteChannel_success() {
|
||||||
// mock 数据
|
// mock 数据
|
||||||
AlipayPayClientConfig payClientConfig = getCertificateConfig();
|
|
||||||
PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
|
PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
|
||||||
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setConfig(randomAlipayPayClientConfig());
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
});
|
});
|
||||||
channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
|
channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
|
||||||
// 准备参数
|
// 准备参数
|
||||||
@ -189,6 +143,8 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
|
|||||||
channelService.deleteChannel(id);
|
channelService.deleteChannel(id);
|
||||||
// 校验数据不存在了
|
// 校验数据不存在了
|
||||||
assertNull(channelMapper.selectById(id));
|
assertNull(channelMapper.selectById(id));
|
||||||
|
// 校验缓存
|
||||||
|
assertEquals(0, channelService.getChannelCache().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -200,119 +156,80 @@ public class PayChannelServiceTest extends BaseDbUnitTest {
|
|||||||
assertServiceException(() -> channelService.deleteChannel(id), CHANNEL_NOT_EXISTS);
|
assertServiceException(() -> channelService.deleteChannel(id), CHANNEL_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test // TODO 请修改 null 为需要的值
|
@Test
|
||||||
public void testGetChannelPage() {
|
public void testGetChannel() {
|
||||||
// mock 数据
|
// mock 数据
|
||||||
AlipayPayClientConfig payClientConfig = getCertificateConfig();
|
PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
|
||||||
PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { // 等会查询到
|
|
||||||
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
||||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
o.setConfig(randomAlipayPayClientConfig());
|
||||||
o.setRemark("灿灿子的支付渠道");
|
|
||||||
o.setFeeRate(0.03);
|
|
||||||
o.setAppId(1L);
|
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
o.setCreateTime(buildTime(2021,11,20));
|
|
||||||
});
|
});
|
||||||
channelMapper.insert(dbChannel);
|
channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
|
||||||
// 执行拷贝的时候会出现异常,所以在插入后要重置为null 后续在写入新的
|
|
||||||
dbChannel.setConfig(null);
|
|
||||||
// 测试 code 不匹配
|
|
||||||
channelMapper.insert(cloneIgnoreId(dbChannel, o -> {
|
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
o.setCode(PayChannelEnum.WX_PUB.getCode());
|
|
||||||
}));
|
|
||||||
// 测试 status 不匹配
|
|
||||||
channelMapper.insert(cloneIgnoreId(dbChannel, o -> {
|
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
o.setStatus(CommonStatusEnum.DISABLE.getStatus());
|
|
||||||
}));
|
|
||||||
// 测试 remark 不匹配
|
|
||||||
channelMapper.insert(cloneIgnoreId(dbChannel, o ->{
|
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
o.setRemark("敏敏子的渠道");
|
|
||||||
}));
|
|
||||||
// 测试 feeRate 不匹配
|
|
||||||
channelMapper.insert(cloneIgnoreId(dbChannel, o -> {
|
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
o.setFeeRate(1.23);
|
|
||||||
}));
|
|
||||||
// 测试 appId 不匹配
|
|
||||||
channelMapper.insert(cloneIgnoreId(dbChannel, o -> {
|
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
o.setAppId(2L);
|
|
||||||
}));
|
|
||||||
// 测试 createTime 不匹配
|
|
||||||
channelMapper.insert(cloneIgnoreId(dbChannel, o -> {
|
|
||||||
o.setConfig(payClientConfig);
|
|
||||||
o.setCreateTime(buildTime(2021, 10, 20));
|
|
||||||
}));
|
|
||||||
// 准备参数
|
// 准备参数
|
||||||
PayChannelPageReqVO reqVO = new PayChannelPageReqVO();
|
Long id = dbChannel.getId();
|
||||||
reqVO.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
|
||||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
|
||||||
reqVO.setRemark("灿灿子的支付渠道");
|
|
||||||
reqVO.setFeeRate(0.03);
|
|
||||||
reqVO.setAppId(1L);
|
|
||||||
reqVO.setConfig(JSON.toJSONString(payClientConfig));
|
|
||||||
reqVO.setCreateTime((new LocalDateTime[]{buildTime(2021,11,19),buildTime(2021,11,21)}));
|
|
||||||
|
|
||||||
// 调用
|
// 调用
|
||||||
PageResult<PayChannelDO> pageResult = channelService.getChannelPage(reqVO);
|
PayChannelDO channel = channelService.getChannel(id);
|
||||||
|
// 校验是否更新正确
|
||||||
|
assertPojoEquals(dbChannel, channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetChannelListByAppIds() {
|
||||||
|
// mock 数据
|
||||||
|
PayChannelDO dbChannel01 = randomPojo(PayChannelDO.class, o -> {
|
||||||
|
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
||||||
|
o.setConfig(randomAlipayPayClientConfig());
|
||||||
|
});
|
||||||
|
channelMapper.insert(dbChannel01);// @Sql: 先插入出一条存在的数据
|
||||||
|
PayChannelDO dbChannel02 = randomPojo(PayChannelDO.class, o -> {
|
||||||
|
o.setCode(PayChannelEnum.WX_PUB.getCode());
|
||||||
|
o.setConfig(randomWxPayClientConfig());
|
||||||
|
});
|
||||||
|
channelMapper.insert(dbChannel02);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long appId = dbChannel01.getAppId();
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
List<PayChannelDO> channels = channelService.getChannelListByAppIds(Collections.singleton(appId));
|
||||||
|
// 校验是否更新正确
|
||||||
|
assertEquals(1, channels.size());
|
||||||
|
assertPojoEquals(dbChannel01, channels.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetChannelByAppIdAndCode() {
|
||||||
|
// mock 数据
|
||||||
|
PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> {
|
||||||
|
o.setCode(PayChannelEnum.ALIPAY_APP.getCode());
|
||||||
|
o.setConfig(randomAlipayPayClientConfig());
|
||||||
|
});
|
||||||
|
channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据
|
||||||
|
// 准备参数
|
||||||
|
Long appId = dbChannel.getAppId();
|
||||||
|
String code = dbChannel.getCode();;
|
||||||
|
|
||||||
|
// 调用
|
||||||
|
PayChannelDO channel = channelService.getChannelByAppIdAndCode(appId, code);
|
||||||
// 断言
|
// 断言
|
||||||
assertEquals(1, pageResult.getTotal());
|
assertPojoEquals(channel, dbChannel);
|
||||||
assertEquals(1, pageResult.getList().size());
|
|
||||||
assertPojoEquals(dbChannel, pageResult.getList().get(0), "config");
|
|
||||||
assertPojoEquals(payClientConfig, pageResult.getList().get(0).getConfig());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public WxPayClientConfig getV2Config() {
|
public WxPayClientConfig randomWxPayClientConfig() {
|
||||||
return new WxPayClientConfig()
|
return new WxPayClientConfig()
|
||||||
.setAppId("APP00001")
|
.setAppId(randomString())
|
||||||
.setMchId("MCH00001")
|
.setMchId(randomString())
|
||||||
.setApiVersion(WxPayClientConfig.API_VERSION_V2)
|
.setApiVersion(WxPayClientConfig.API_VERSION_V2)
|
||||||
.setMchKey("dsa1d5s6a1d6sa16d1sa56d15a61das6")
|
.setMchKey(randomString());
|
||||||
.setApiV3Key("")
|
|
||||||
.setPrivateCertContent("")
|
|
||||||
.setPrivateKeyContent("");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public WxPayClientConfig getV3Config() {
|
public AlipayPayClientConfig randomAlipayPayClientConfig() {
|
||||||
return new WxPayClientConfig()
|
|
||||||
.setAppId("APP00001")
|
|
||||||
.setMchId("MCH00001")
|
|
||||||
.setApiVersion(WxPayClientConfig.API_VERSION_V3)
|
|
||||||
.setMchKey("")
|
|
||||||
.setApiV3Key("sdadasdsadadsa")
|
|
||||||
.setPrivateKeyContent("dsa445das415d15asd16ad156as")
|
|
||||||
.setPrivateCertContent("dsadasd45asd4s5a");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public AlipayPayClientConfig getPublicKeyConfig() {
|
|
||||||
return new AlipayPayClientConfig()
|
return new AlipayPayClientConfig()
|
||||||
.setServerUrl(AlipayPayClientConfig.SERVER_URL_PROD)
|
.setServerUrl(randomURL())
|
||||||
.setAppId("APP00001")
|
.setAppId(randomString())
|
||||||
.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)
|
.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)
|
||||||
.setMode(AlipayPayClientConfig.MODE_PUBLIC_KEY)
|
.setMode(AlipayPayClientConfig.MODE_PUBLIC_KEY)
|
||||||
.setPrivateKey("13131321312")
|
.setPrivateKey(randomString())
|
||||||
.setAlipayPublicKey("13321321321")
|
.setAlipayPublicKey(randomString());
|
||||||
.setAppCertContent("")
|
|
||||||
.setAlipayPublicCertContent("")
|
|
||||||
.setRootCertContent("");
|
|
||||||
}
|
|
||||||
|
|
||||||
public AlipayPayClientConfig getCertificateConfig() {
|
|
||||||
return new AlipayPayClientConfig()
|
|
||||||
.setServerUrl(AlipayPayClientConfig.SERVER_URL_PROD)
|
|
||||||
.setAppId("APP00001")
|
|
||||||
.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT)
|
|
||||||
.setMode(AlipayPayClientConfig.MODE_CERTIFICATE)
|
|
||||||
.setPrivateKey("")
|
|
||||||
.setAlipayPublicKey("")
|
|
||||||
.setAppCertContent("13321321321sda")
|
|
||||||
.setAlipayPublicCertContent("13321321321aqeqw")
|
|
||||||
.setRootCertContent("13321321321dsad");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -75,9 +75,9 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
|
|||||||
o.setBody("斌斌子送给灿灿子的炸弹猫");
|
o.setBody("斌斌子送给灿灿子的炸弹猫");
|
||||||
o.setNotifyUrl("https://hc.com/lbh");
|
o.setNotifyUrl("https://hc.com/lbh");
|
||||||
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
||||||
o.setAmount(10000);
|
o.setPrice(10000);
|
||||||
o.setChannelFeeRate(0.01);
|
o.setChannelFeeRate(0.01);
|
||||||
o.setChannelFeeAmount(1L);
|
o.setChannelFeePrice(1L);
|
||||||
o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
|
o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
|
||||||
o.setUserIp("127.0.0.1");
|
o.setUserIp("127.0.0.1");
|
||||||
o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0));
|
o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0));
|
||||||
@ -87,7 +87,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
|
|||||||
o.setSuccessExtensionId(1L);
|
o.setSuccessExtensionId(1L);
|
||||||
o.setRefundStatus(PayRefundTypeEnum.NO.getStatus());
|
o.setRefundStatus(PayRefundTypeEnum.NO.getStatus());
|
||||||
o.setRefundTimes(0);
|
o.setRefundTimes(0);
|
||||||
o.setRefundAmount(0L);
|
o.setRefundPrice(0L);
|
||||||
o.setChannelUserId("1008611");
|
o.setChannelUserId("1008611");
|
||||||
o.setChannelOrderNo(channelOrderId);
|
o.setChannelOrderNo(channelOrderId);
|
||||||
o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15));
|
o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15));
|
||||||
@ -143,9 +143,9 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
|
|||||||
o.setBody("斌斌子送给灿灿子的炸弹猫");
|
o.setBody("斌斌子送给灿灿子的炸弹猫");
|
||||||
o.setNotifyUrl("https://hc.com/lbh");
|
o.setNotifyUrl("https://hc.com/lbh");
|
||||||
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
||||||
o.setAmount(10000);
|
o.setPrice(10000);
|
||||||
o.setChannelFeeRate(0.01);
|
o.setChannelFeeRate(0.01);
|
||||||
o.setChannelFeeAmount(1L);
|
o.setChannelFeePrice(1L);
|
||||||
o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
|
o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
|
||||||
o.setUserIp("127.0.0.1");
|
o.setUserIp("127.0.0.1");
|
||||||
o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0));
|
o.setCreateTime(LocalDateTime.of(2018, 1, 1, 10, 1, 0));
|
||||||
@ -155,7 +155,7 @@ public class PayOrderServiceTest extends BaseDbUnitTest {
|
|||||||
o.setSuccessExtensionId(1L);
|
o.setSuccessExtensionId(1L);
|
||||||
o.setRefundStatus(PayRefundTypeEnum.NO.getStatus());
|
o.setRefundStatus(PayRefundTypeEnum.NO.getStatus());
|
||||||
o.setRefundTimes(0);
|
o.setRefundTimes(0);
|
||||||
o.setRefundAmount(0L);
|
o.setRefundPrice(0L);
|
||||||
o.setChannelUserId("1008611");
|
o.setChannelUserId("1008611");
|
||||||
o.setChannelOrderNo(channelOrderId);
|
o.setChannelOrderNo(channelOrderId);
|
||||||
o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15));
|
o.setUpdateTime(LocalDateTime.of(2018, 1, 1, 10, 10, 15));
|
||||||
|
@ -69,8 +69,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest {
|
|||||||
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
||||||
o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus());
|
o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus());
|
||||||
o.setType(PayRefundTypeEnum.SOME.getStatus());
|
o.setType(PayRefundTypeEnum.SOME.getStatus());
|
||||||
o.setPayAmount(100);
|
o.setPayPrice(100);
|
||||||
o.setRefundAmount(500);
|
o.setRefundPrice(500);
|
||||||
o.setReason("就是想退款了,你有意见吗");
|
o.setReason("就是想退款了,你有意见吗");
|
||||||
o.setUserIp("127.0.0.1");
|
o.setUserIp("127.0.0.1");
|
||||||
o.setChannelOrderNo("CH0000001");
|
o.setChannelOrderNo("CH0000001");
|
||||||
@ -134,8 +134,8 @@ public class PayRefundServiceTest extends BaseDbUnitTest {
|
|||||||
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus());
|
||||||
o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus());
|
o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus());
|
||||||
o.setType(PayRefundTypeEnum.SOME.getStatus());
|
o.setType(PayRefundTypeEnum.SOME.getStatus());
|
||||||
o.setPayAmount(100);
|
o.setPayPrice(100);
|
||||||
o.setRefundAmount(500);
|
o.setRefundPrice(500);
|
||||||
o.setReason("就是想退款了,你有意见吗");
|
o.setReason("就是想退款了,你有意见吗");
|
||||||
o.setUserIp("127.0.0.1");
|
o.setUserIp("127.0.0.1");
|
||||||
o.setChannelOrderNo("CH0000001");
|
o.setChannelOrderNo("CH0000001");
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
DELETE FROM pay_merchant;
|
|
||||||
DELETE FROM pay_app;
|
DELETE FROM pay_app;
|
||||||
DELETE FROM pay_channel;
|
DELETE FROM pay_channel;
|
||||||
DELETE FROM pay_order;
|
DELETE FROM pay_order;
|
||||||
|
@ -1,18 +1,3 @@
|
|||||||
CREATE TABLE IF NOT EXISTS "pay_merchant" (
|
|
||||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
|
||||||
"no" varchar(32) NOT NULL,
|
|
||||||
"name" varchar(64) NOT NULL,
|
|
||||||
"short_name" varchar(64) NOT NULL,
|
|
||||||
"status" tinyint NOT NULL,
|
|
||||||
"remark" varchar(255) DEFAULT NULL,
|
|
||||||
"creator" varchar(64) DEFAULT '',
|
|
||||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
"updater" varchar(64) DEFAULT '',
|
|
||||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
||||||
"deleted" bit(1) NOT NULL DEFAULT FALSE,
|
|
||||||
PRIMARY KEY ("id")
|
|
||||||
) COMMENT '支付商户信息';
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS "pay_app" (
|
CREATE TABLE IF NOT EXISTS "pay_app" (
|
||||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||||
"name" varchar(64) NOT NULL,
|
"name" varchar(64) NOT NULL,
|
||||||
@ -20,14 +5,13 @@ CREATE TABLE IF NOT EXISTS "pay_app" (
|
|||||||
"remark" varchar(255) DEFAULT NULL,
|
"remark" varchar(255) DEFAULT NULL,
|
||||||
`pay_notify_url` varchar(1024) NOT NULL,
|
`pay_notify_url` varchar(1024) NOT NULL,
|
||||||
`refund_notify_url` varchar(1024) NOT NULL,
|
`refund_notify_url` varchar(1024) NOT NULL,
|
||||||
`merchant_id` bigint(20) NOT NULL,
|
|
||||||
"creator" varchar(64) DEFAULT '',
|
"creator" varchar(64) DEFAULT '',
|
||||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
"updater" varchar(64) DEFAULT '',
|
"updater" varchar(64) DEFAULT '',
|
||||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
"deleted" bit(1) NOT NULL DEFAULT FALSE,
|
"deleted" bit(1) NOT NULL DEFAULT FALSE,
|
||||||
PRIMARY KEY ("id")
|
PRIMARY KEY ("id")
|
||||||
) COMMENT = '支付应用信息';
|
) COMMENT = '支付应用';
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS "pay_channel" (
|
CREATE TABLE IF NOT EXISTS "pay_channel" (
|
||||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||||
@ -35,7 +19,6 @@ CREATE TABLE IF NOT EXISTS "pay_channel" (
|
|||||||
"status" tinyint(4) NOT NULL,
|
"status" tinyint(4) NOT NULL,
|
||||||
"remark" varchar(255) DEFAULT NULL,
|
"remark" varchar(255) DEFAULT NULL,
|
||||||
"fee_rate" double NOT NULL DEFAULT 0,
|
"fee_rate" double NOT NULL DEFAULT 0,
|
||||||
"merchant_id" bigint(20) NOT NULL,
|
|
||||||
"app_id" bigint(20) NOT NULL,
|
"app_id" bigint(20) NOT NULL,
|
||||||
"config" varchar(10240) NOT NULL,
|
"config" varchar(10240) NOT NULL,
|
||||||
"creator" varchar(64) NULL DEFAULT '',
|
"creator" varchar(64) NULL DEFAULT '',
|
||||||
@ -49,7 +32,6 @@ CREATE TABLE IF NOT EXISTS "pay_channel" (
|
|||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `pay_order` (
|
CREATE TABLE IF NOT EXISTS `pay_order` (
|
||||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||||
`merchant_id` bigint(20) NOT NULL,
|
|
||||||
`app_id` bigint(20) NOT NULL,
|
`app_id` bigint(20) NOT NULL,
|
||||||
`channel_id` bigint(20) DEFAULT NULL,
|
`channel_id` bigint(20) DEFAULT NULL,
|
||||||
`channel_code` varchar(32) DEFAULT NULL,
|
`channel_code` varchar(32) DEFAULT NULL,
|
||||||
@ -82,7 +64,6 @@ CREATE TABLE IF NOT EXISTS `pay_order` (
|
|||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `pay_refund` (
|
CREATE TABLE IF NOT EXISTS `pay_refund` (
|
||||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||||
`merchant_id` bigint(20) NOT NULL,
|
|
||||||
`app_id` bigint(20) NOT NULL,
|
`app_id` bigint(20) NOT NULL,
|
||||||
`channel_id` bigint(20) NOT NULL,
|
`channel_id` bigint(20) NOT NULL,
|
||||||
`channel_code` varchar(32) NOT NULL,
|
`channel_code` varchar(32) NOT NULL,
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
<!-- <artifactId>yudao-module-bpm-biz</artifactId>-->
|
<!-- <artifactId>yudao-module-bpm-biz</artifactId>-->
|
||||||
<!-- <version>${revision}</version>-->
|
<!-- <version>${revision}</version>-->
|
||||||
<!-- </dependency>-->
|
<!-- </dependency>-->
|
||||||
<!-- 支付服务 -->
|
<!-- 支付服务。默认注释,保证编译速度 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.iocoder.boot</groupId>
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
<artifactId>yudao-module-pay-biz</artifactId>
|
<artifactId>yudao-module-pay-biz</artifactId>
|
||||||
|
@ -27,15 +27,6 @@ export function deleteChannel(id) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得支付渠道分页
|
|
||||||
export function getChannelPage(query) {
|
|
||||||
return request({
|
|
||||||
url: '/pay/channel/page',
|
|
||||||
method: 'get',
|
|
||||||
params: query
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获得支付渠道
|
// 获得支付渠道
|
||||||
export function getChannel(appId,code) {
|
export function getChannel(appId,code) {
|
||||||
return request({
|
return request({
|
||||||
|
@ -36,6 +36,9 @@ export default {
|
|||||||
return router.push(lastPath || '/');
|
return router.push(lastPath || '/');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (typeof obj === "function") {
|
||||||
|
return store.dispatch('tagsView/delView', router.currentRoute).then(obj);
|
||||||
|
}
|
||||||
return store.dispatch('tagsView/delView', obj);
|
return store.dispatch('tagsView/delView', obj);
|
||||||
},
|
},
|
||||||
// 关闭所有tab页签
|
// 关闭所有tab页签
|
||||||
|
@ -227,14 +227,14 @@ export const constantRoutes = [
|
|||||||
component: Layout,
|
component: Layout,
|
||||||
hidden: true,
|
hidden: true,
|
||||||
children: [{
|
children: [{
|
||||||
path: 'order/submit',
|
path: 'cashier',
|
||||||
name: 'PayOrderSubmit',
|
name: 'PayCashier',
|
||||||
hidden: true,
|
hidden: true,
|
||||||
meta: {
|
meta: {
|
||||||
title: '收银台',
|
title: '收银台',
|
||||||
noCache: true
|
noCache: true
|
||||||
},
|
},
|
||||||
component: (resolve) => require(['@/views/pay/order/submit'], resolve)
|
component: (resolve) => require(['@/views/pay/cashier'], resolve)
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -54,7 +54,7 @@ export const DICT_TYPE = {
|
|||||||
PAY_CHANNEL_ALIPAY_SIGN_TYPE: 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型
|
PAY_CHANNEL_ALIPAY_SIGN_TYPE: 'pay_channel_alipay_sign_type', // 支付渠道支付宝算法类型
|
||||||
PAY_CHANNEL_ALIPAY_MODE: 'pay_channel_alipay_mode', // 支付宝公钥类型
|
PAY_CHANNEL_ALIPAY_MODE: 'pay_channel_alipay_mode', // 支付宝公钥类型
|
||||||
PAY_CHANNEL_ALIPAY_SERVER_TYPE: 'pay_channel_alipay_server_type', // 支付宝网关地址
|
PAY_CHANNEL_ALIPAY_SERVER_TYPE: 'pay_channel_alipay_server_type', // 支付宝网关地址
|
||||||
PAY_CHANNEL_CODE_TYPE: 'pay_channel_code_type', // 支付渠道编码类型
|
PAY_CHANNEL_CODE: 'pay_channel_code', // 支付渠道编码类型
|
||||||
PAY_ORDER_NOTIFY_STATUS: 'pay_order_notify_status', // 商户支付订单回调状态
|
PAY_ORDER_NOTIFY_STATUS: 'pay_order_notify_status', // 商户支付订单回调状态
|
||||||
PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态
|
PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态
|
||||||
PAY_ORDER_REFUND_STATUS: 'pay_order_refund_status', // 商户支付订单退款状态
|
PAY_ORDER_REFUND_STATUS: 'pay_order_refund_status', // 商户支付订单退款状态
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<el-descriptions-item label="商家备注">{{ order.remark }}</el-descriptions-item>
|
<el-descriptions-item label="商家备注">{{ order.remark }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="支付单号">{{ order.payOrderId }}</el-descriptions-item>
|
<el-descriptions-item label="支付单号">{{ order.payOrderId }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="付款方式">
|
<el-descriptions-item label="付款方式">
|
||||||
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE_TYPE" :value="order.payChannelCode" />
|
<dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="order.payChannelCode" />
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="买家">{{ order.user.nickname }}</el-descriptions-item> <!-- TODO 芋艿:待实现:跳转会员 -->
|
<el-descriptions-item label="买家">{{ order.user.nickname }}</el-descriptions-item> <!-- TODO 芋艿:待实现:跳转会员 -->
|
||||||
<el-descriptions-item label="收货地址">
|
<el-descriptions-item label="收货地址">
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
<el-col :span="6" :xs="24">
|
<el-col :span="6" :xs="24">
|
||||||
<el-form-item label="支付方式" prop="payChannelCode">
|
<el-form-item label="支付方式" prop="payChannelCode">
|
||||||
<el-select v-model="queryParams.payChannelCode" clearable style="width: 240px">
|
<el-select v-model="queryParams.payChannelCode" clearable style="width: 240px">
|
||||||
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)"
|
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE)"
|
||||||
:key="dict.value" :label="dict.label" :value="dict.value"/>
|
:key="dict.value" :label="dict.label" :value="dict.value"/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -86,7 +86,7 @@
|
|||||||
<dict-tag :type="DICT_TYPE.TERMINAL" :value="row.terminal" />
|
<dict-tag :type="DICT_TYPE.TERMINAL" :value="row.terminal" />
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="4">支付方式:
|
<el-col :span="4">支付方式:
|
||||||
<dict-tag v-if="row.payChannelCode" :type="DICT_TYPE.PAY_CHANNEL_CODE_TYPE" :value="row.payChannelCode" />
|
<dict-tag v-if="row.payChannelCode" :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="row.payChannelCode" />
|
||||||
<span v-else>未支付</span>
|
<span v-else>未支付</span>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" align="right">
|
<el-col :span="6" align="right">
|
||||||
@ -113,7 +113,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的总金额,就是 order.payPrice -->
|
<!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的总金额,就是 order.payPrice -->
|
||||||
<el-table-column label="实付金额(元)" prop="amount" align="center" width="100"/>
|
<el-table-column label="实付金额(元)" prop="price" align="center" width="100"/>
|
||||||
<!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的收件信息;使用 order.receiverXXX 开头的字段 -->
|
<!-- TODO @小程:这里应该是一个订单下,多个商品,只展示订单上的收件信息;使用 order.receiverXXX 开头的字段 -->
|
||||||
<el-table-column label="买家/收货人" prop="buyer" header-align="center" width="auto" min-width="300">
|
<el-table-column label="买家/收货人" prop="buyer" header-align="center" width="auto" min-width="300">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
|
@ -41,17 +41,17 @@
|
|||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<div v-if="form.aliPayConfig.mode === 1">
|
<div v-if="form.aliPayConfig.mode === 1">
|
||||||
<el-form-item label-width="180px" label="商户私钥" prop="aliPayConfig.privateKey">
|
<el-form-item label-width="180px" label="应用私钥" prop="aliPayConfig.privateKey">
|
||||||
<el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.privateKey"
|
<el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.privateKey"
|
||||||
placeholder="请输入商户私钥" clearable :style="{width: '100%'}">
|
placeholder="请输入应用私钥" clearable :style="{width: '100%'}">
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label-width="180px" label="支付宝公钥字符串" prop="aliPayConfig.alipayPublicKey">
|
<el-form-item label-width="180px" label="支付宝公钥" prop="aliPayConfig.alipayPublicKey">
|
||||||
<el-input
|
<el-input
|
||||||
type="textarea"
|
type="textarea"
|
||||||
:autosize="{minRows: 8, maxRows: 8}"
|
:autosize="{minRows: 8, maxRows: 8}"
|
||||||
v-model="form.aliPayConfig.alipayPublicKey"
|
v-model="form.aliPayConfig.alipayPublicKey"
|
||||||
placeholder="请输入支付宝公钥字符串" clearable
|
placeholder="请输入支付宝公钥" clearable
|
||||||
:style="{width: '100%'}">
|
:style="{width: '100%'}">
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<el-descriptions-item label="支付单号">{{ payOrder.id }}</el-descriptions-item>
|
<el-descriptions-item label="支付单号">{{ payOrder.id }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="商品标题">{{ payOrder.subject }}</el-descriptions-item>
|
<el-descriptions-item label="商品标题">{{ payOrder.subject }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="商品内容">{{ payOrder.body }}</el-descriptions-item>
|
<el-descriptions-item label="商品内容">{{ payOrder.body }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="支付金额">¥{{ (payOrder.amount / 100.0).toFixed(2) }}</el-descriptions-item>
|
<el-descriptions-item label="支付金额">¥{{ (payOrder.price / 100.0).toFixed(2) }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="创建时间">{{ parseTime(payOrder.createTime) }}</el-descriptions-item>
|
<el-descriptions-item label="创建时间">{{ parseTime(payOrder.createTime) }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="过期时间">{{ parseTime(payOrder.expireTime) }}</el-descriptions-item>
|
<el-descriptions-item label="过期时间">{{ parseTime(payOrder.expireTime) }}</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
@ -18,24 +18,25 @@
|
|||||||
<el-descriptions title="选择支付宝支付">
|
<el-descriptions title="选择支付宝支付">
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
<div class="pay-channel-container">
|
<div class="pay-channel-container">
|
||||||
<div class="box" v-for="channel in aliPayChannels" :key="channel.code" @click="submit(channel.code)">
|
<div class="box" v-for="channel in channels" v-if="channel.code.indexOf('alipay_') === 0" :key="channel.code" @click="submit(channel.code)">
|
||||||
<img :src="icons[channel.code]">
|
<img :src="channel.icon">
|
||||||
<div class="title">{{ channel.name }}</div>
|
<div class="title">{{ channel.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 微信支付 -->
|
<!-- 微信支付 -->
|
||||||
<el-descriptions title="选择微信支付" style="margin-top: 20px;" />
|
<el-descriptions title="选择微信支付" style="margin-top: 20px;" />
|
||||||
<div class="pay-channel-container">
|
<div class="pay-channel-container">
|
||||||
<div class="box" v-for="channel in wxPayChannels" :key="channel.code">
|
<div class="box" v-for="channel in channels" v-if="channel.code.indexOf('wx_') === 0" :key="channel.code">
|
||||||
<img :src="icons[channel.code]">
|
<img :src="channel.icon">
|
||||||
<div class="title">{{ channel.name }}</div>
|
<div class="title">{{ channel.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 其它支付 -->
|
<!-- 其它支付 -->
|
||||||
<el-descriptions title="选择其它支付" style="margin-top: 20px;" />
|
<el-descriptions title="选择其它支付" style="margin-top: 20px;" />
|
||||||
<div class="pay-channel-container">
|
<div class="pay-channel-container">
|
||||||
<div class="box" v-for="channel in otherPayChannels" :key="channel.code">
|
<div class="box" v-for="channel in channels" :key="channel.code"
|
||||||
<img :src="icons[channel.code]">
|
v-if="channel.code.indexOf('alipay_') === -1 && channel.code.indexOf('wx_') === -1">
|
||||||
|
<img :src="channel.icon">
|
||||||
<div class="title">{{ channel.name }}</div>
|
<div class="title">{{ channel.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -47,15 +48,6 @@
|
|||||||
<qrcode-vue :value="qrCode.url" size="310" level="L" />
|
<qrcode-vue :value="qrCode.url" size="310" level="L" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!-- 展示形式:IFrame -->
|
|
||||||
<el-dialog :title="iframe.title" :visible.sync="iframe.visible" width="800px" height="800px" append-to-body
|
|
||||||
:close-on-press-escape="false">
|
|
||||||
<iframe :src="iframe.url" width="100%" />
|
|
||||||
</el-dialog>
|
|
||||||
|
|
||||||
<!-- 展示形式:Form -->
|
|
||||||
<div ref="formRef" v-html="form.value" />
|
|
||||||
|
|
||||||
<!-- 展示形式:BarCode 条形码 -->
|
<!-- 展示形式:BarCode 条形码 -->
|
||||||
<el-dialog :title="barCode.title" :visible.sync="barCode.visible" width="500px" append-to-body
|
<el-dialog :title="barCode.title" :visible.sync="barCode.visible" width="500px" append-to-body
|
||||||
:close-on-press-escape="false">
|
:close-on-press-escape="false">
|
||||||
@ -88,32 +80,56 @@
|
|||||||
import QrcodeVue from 'qrcode.vue'
|
import QrcodeVue from 'qrcode.vue'
|
||||||
import { DICT_TYPE, getDictDatas } from "@/utils/dict";
|
import { DICT_TYPE, getDictDatas } from "@/utils/dict";
|
||||||
import { getOrder, submitOrder } from '@/api/pay/order';
|
import { getOrder, submitOrder } from '@/api/pay/order';
|
||||||
import {PayChannelEnum, PayDisplayModeEnum, PayOrderStatusEnum} from "@/utils/constants";
|
import { PayChannelEnum, PayDisplayModeEnum, PayOrderStatusEnum } from "@/utils/constants";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "PayOrderSubmit",
|
name: "PayCashier",
|
||||||
components: {
|
components: {
|
||||||
QrcodeVue,
|
QrcodeVue,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
id: undefined, // 请假编号
|
id: undefined, // 请假编号
|
||||||
|
returnUrl: undefined, // 支付完的回调地址
|
||||||
loading: false, // 支付信息的 loading
|
loading: false, // 支付信息的 loading
|
||||||
payOrder: {}, // 支付信息
|
payOrder: {}, // 支付信息
|
||||||
aliPayChannels: [], // 阿里支付的渠道
|
channels: [{
|
||||||
wxPayChannels: [], // 微信支付的渠道
|
name: '支付宝 PC 网站支付',
|
||||||
otherPayChannels: [], // 其它的支付渠道
|
icon: require("@/assets/images/pay/icon/alipay_pc.svg"),
|
||||||
icons: {
|
code: "alipay_pc"
|
||||||
alipay_qr: require("@/assets/images/pay/icon/alipay_qr.svg"),
|
}, {
|
||||||
alipay_app: require("@/assets/images/pay/icon/alipay_app.svg"),
|
name: '支付宝 Wap 网站支付',
|
||||||
alipay_wap: require("@/assets/images/pay/icon/alipay_wap.svg"),
|
icon: require("@/assets/images/pay/icon/alipay_wap.svg"),
|
||||||
alipay_pc: require("@/assets/images/pay/icon/alipay_pc.svg"),
|
code: "alipay_wap"
|
||||||
alipay_bar: require("@/assets/images/pay/icon/alipay_bar.svg"),
|
}, {
|
||||||
wx_app: require("@/assets/images/pay/icon/wx_app.svg"),
|
name: '支付宝 App 网站支付',
|
||||||
wx_lite: require("@/assets/images/pay/icon/wx_lite.svg"),
|
icon: require("@/assets/images/pay/icon/alipay_app.svg"),
|
||||||
wx_pub: require("@/assets/images/pay/icon/wx_pub.svg"),
|
code: "alipay_app"
|
||||||
mock: require("@/assets/images/pay/icon/mock.svg"),
|
}, {
|
||||||
},
|
name: '支付宝扫码支付',
|
||||||
|
icon: require("@/assets/images/pay/icon/alipay_app.svg"),
|
||||||
|
code: "alipay_qr"
|
||||||
|
}, {
|
||||||
|
name: '支付宝条码支付',
|
||||||
|
icon: require("@/assets/images/pay/icon/alipay_bar.svg"),
|
||||||
|
code: "alipay_bar"
|
||||||
|
}, {
|
||||||
|
name: '微信公众号支付',
|
||||||
|
icon: require("@/assets/images/pay/icon/wx_pub.svg"),
|
||||||
|
code: "wx_pub"
|
||||||
|
}, {
|
||||||
|
name: '微信小程序支付',
|
||||||
|
icon: require("@/assets/images/pay/icon/wx_lite.svg"),
|
||||||
|
code: "wx_lite"
|
||||||
|
}, {
|
||||||
|
name: '微信 App 支付',
|
||||||
|
icon: require("@/assets/images/pay/icon/wx_app.svg"),
|
||||||
|
code: "wx_app"
|
||||||
|
}, {
|
||||||
|
name: '模拟支付',
|
||||||
|
icon: require("@/assets/images/pay/icon/mock.svg"),
|
||||||
|
code: "mock"
|
||||||
|
}],
|
||||||
submitLoading: false, // 提交支付的 loading
|
submitLoading: false, // 提交支付的 loading
|
||||||
interval: undefined, // 定时任务,轮询是否完成支付
|
interval: undefined, // 定时任务,轮询是否完成支付
|
||||||
qrCode: { // 展示形式:二维码
|
qrCode: { // 展示形式:二维码
|
||||||
@ -121,14 +137,6 @@ export default {
|
|||||||
title: '',
|
title: '',
|
||||||
visible: false,
|
visible: false,
|
||||||
},
|
},
|
||||||
iframe: { // 展示形式:iframe
|
|
||||||
url: '',
|
|
||||||
title: '',
|
|
||||||
visible: false
|
|
||||||
},
|
|
||||||
form: { // 展示形式:form
|
|
||||||
html: '',
|
|
||||||
},
|
|
||||||
barCode: { // 展示形式:条形码
|
barCode: { // 展示形式:条形码
|
||||||
channelCode: '',
|
channelCode: '',
|
||||||
value: '',
|
value: '',
|
||||||
@ -139,46 +147,35 @@ export default {
|
|||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.id = this.$route.query.id;
|
this.id = this.$route.query.id;
|
||||||
|
if (this.$route.query.returnUrl) {
|
||||||
|
this.returnUrl = decodeURIComponent(this.$route.query.returnUrl)
|
||||||
|
}
|
||||||
this.getDetail();
|
this.getDetail();
|
||||||
this.initPayChannels();
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
/** 初始化支付渠道 */
|
|
||||||
initPayChannels() {
|
|
||||||
// 微信支付
|
|
||||||
for (const dict of getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE)) {
|
|
||||||
const payChannel = {
|
|
||||||
name: dict.label,
|
|
||||||
code: dict.value
|
|
||||||
}
|
|
||||||
if (dict.value.indexOf('wx_') === 0) {
|
|
||||||
this.wxPayChannels.push(payChannel);
|
|
||||||
} else if (dict.value.indexOf('alipay_') === 0) {
|
|
||||||
this.aliPayChannels.push(payChannel);
|
|
||||||
} else {
|
|
||||||
this.otherPayChannels.push(payChannel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
/** 获得支付信息 */
|
/** 获得支付信息 */
|
||||||
getDetail() {
|
getDetail() {
|
||||||
// 1.1 未传递订单编号
|
// 1.1 未传递订单编号
|
||||||
if (!this.id) {
|
if (!this.id) {
|
||||||
this.$message.error('未传递支付单号,无法查看对应的支付信息');
|
this.$message.error('未传递支付单号,无法查看对应的支付信息');
|
||||||
this.goBackToList();
|
this.goReturnUrl('cancel');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
getOrder(this.id).then(response => {
|
getOrder(this.id).then(response => {
|
||||||
// 1.2 无法查询到支付信息
|
// 1.2 无法查询到支付信息
|
||||||
if (!response.data) {
|
if (!response.data) {
|
||||||
this.$message.error('支付订单不存在,请检查!');
|
this.$message.error('支付订单不存在,请检查!');
|
||||||
this.goBackToList();
|
this.goReturnUrl('cancel');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 1.3 订单已支付
|
// 1.3 如果已支付、或者已关闭,则直接跳转
|
||||||
if (response.data.status !== PayOrderStatusEnum.WAITING.status) {
|
if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
|
||||||
this.$message.error('支付订单不处于待支付状态,请检查!');
|
this.$message.success('支付成功');
|
||||||
this.goBackToList();
|
this.goReturnUrl('success');
|
||||||
|
return;
|
||||||
|
} else if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
|
||||||
|
this.$message.error('无法支付,原因:订单已关闭');
|
||||||
|
this.goReturnUrl('close');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,15 +204,12 @@ export default {
|
|||||||
submitOrder({
|
submitOrder({
|
||||||
id: this.id,
|
id: this.id,
|
||||||
channelCode: channelCode,
|
channelCode: channelCode,
|
||||||
|
returnUrl: location.href, // 支付成功后,支付渠道跳转回当前页;再由当前页,跳转回 {@link returnUrl} 对应的地址
|
||||||
...this.buildSubmitParam(channelCode)
|
...this.buildSubmitParam(channelCode)
|
||||||
}).then(response => {
|
}).then(response => {
|
||||||
const data = response.data
|
const data = response.data
|
||||||
if (data.displayMode === PayDisplayModeEnum.IFRAME.mode) {
|
if (data.displayMode === PayDisplayModeEnum.URL.mode) {
|
||||||
this.displayIFrame(channelCode, data)
|
|
||||||
} else if (data.displayMode === PayDisplayModeEnum.URL.mode) {
|
|
||||||
this.displayUrl(channelCode, data)
|
this.displayUrl(channelCode, data)
|
||||||
} else if (data.displayMode === PayDisplayModeEnum.FORM.mode) {
|
|
||||||
this.displayForm(channelCode, data)
|
|
||||||
} else if (data.displayMode === PayDisplayModeEnum.QR_CODE.mode) {
|
} else if (data.displayMode === PayDisplayModeEnum.QR_CODE.mode) {
|
||||||
this.displayQrCode(channelCode, data)
|
this.displayQrCode(channelCode, data)
|
||||||
}
|
}
|
||||||
@ -228,53 +222,7 @@ export default {
|
|||||||
},
|
},
|
||||||
/** 构建提交支付的额外参数 */
|
/** 构建提交支付的额外参数 */
|
||||||
buildSubmitParam(channelCode) {
|
buildSubmitParam(channelCode) {
|
||||||
// ① 支付宝 PC 支付时,有多种展示形态
|
// ① 支付宝 BarCode 支付时,需要传递 authCode 条形码
|
||||||
if (channelCode === PayChannelEnum.ALIPAY_PC.code) {
|
|
||||||
// 情况【前置模式】:将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体支持的枚举值有以下几种:
|
|
||||||
// 0:订单码-简约前置模式,对应 iframe 宽度不能小于 600px,高度不能小于 300px
|
|
||||||
// return {
|
|
||||||
// "channelExtras": {
|
|
||||||
// "qr_pay_mode": "0"
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// 1:订单码-前置模式,对应iframe 宽度不能小于 300px,高度不能小于 600px
|
|
||||||
// return {
|
|
||||||
// "channelExtras": {
|
|
||||||
// "qr_pay_mode": "1"
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// 3:订单码-迷你前置模式,对应 iframe 宽度不能小于 75px,高度不能小于 75px
|
|
||||||
// return {
|
|
||||||
// "channelExtras": {
|
|
||||||
// "qr_pay_mode": "3"
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// 4:订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小
|
|
||||||
// return {
|
|
||||||
// "channelExtras": {
|
|
||||||
// "qr_pay_mode": "4"
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// 情况【跳转模式】:跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。支持传入的枚举值有
|
|
||||||
return {
|
|
||||||
"channelExtras": {
|
|
||||||
"qr_pay_mode": "2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 情况【表单模式】:直接提交当前页面到支付宝
|
|
||||||
// return {
|
|
||||||
// displayMode: PayDisplayModeEnum.FORM.mode
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
// ② 支付宝 Wap 支付时,引导手机扫码支付
|
|
||||||
if (channelCode === PayChannelEnum.ALIPAY_WAP.code) {
|
|
||||||
return {
|
|
||||||
displayMode: PayDisplayModeEnum.QR_CODE.mode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ③ 支付宝 BarCode 支付时,需要传递 authCode 条形码
|
|
||||||
if (channelCode === PayChannelEnum.ALIPAY_BAR.code) {
|
if (channelCode === PayChannelEnum.ALIPAY_BAR.code) {
|
||||||
return {
|
return {
|
||||||
"channelExtras": {
|
"channelExtras": {
|
||||||
@ -284,36 +232,12 @@ export default {
|
|||||||
}
|
}
|
||||||
return {}
|
return {}
|
||||||
},
|
},
|
||||||
/** 提交支付后,IFrame 内置 URL 的展示形式 */
|
|
||||||
displayIFrame(channelCode, data) {
|
|
||||||
// TODO 芋艿:目前有点奇怪,支付宝总是会显示“支付环境存在风险”
|
|
||||||
this.iframe = {
|
|
||||||
title: '支付窗口',
|
|
||||||
url: data.displayContent,
|
|
||||||
visible: true
|
|
||||||
}
|
|
||||||
this.submitLoading = false
|
|
||||||
},
|
|
||||||
/** 提交支付后,URL 的展示形式 */
|
/** 提交支付后,URL 的展示形式 */
|
||||||
displayUrl(channelCode, data) {
|
displayUrl(channelCode, data) {
|
||||||
window.open(data.displayContent)
|
// window.open(data.displayContent)
|
||||||
|
location.href = data.displayContent
|
||||||
this.submitLoading = false
|
this.submitLoading = false
|
||||||
},
|
},
|
||||||
/** 提交支付后,Form 的展示形式 */
|
|
||||||
displayForm(channelCode, data) {
|
|
||||||
// 渲染支付页面
|
|
||||||
this.form = {
|
|
||||||
value: data.displayContent
|
|
||||||
}
|
|
||||||
// 防抖避免重复支付
|
|
||||||
this.$nextTick(() => {
|
|
||||||
// 提交支付表单
|
|
||||||
this.$refs.formRef.children[0].submit();
|
|
||||||
setTimeout(() => {
|
|
||||||
this.submitLoading = false
|
|
||||||
}, 1000);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
/** 提交支付后(支付宝扫码支付) */
|
/** 提交支付后(支付宝扫码支付) */
|
||||||
displayQrCode(channelCode, data) {
|
displayQrCode(channelCode, data) {
|
||||||
let title = '请使用手机浏览器“扫一扫”';
|
let title = '请使用手机浏览器“扫一扫”';
|
||||||
@ -342,13 +266,13 @@ export default {
|
|||||||
if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
|
if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
|
||||||
this.clearQueryInterval();
|
this.clearQueryInterval();
|
||||||
this.$message.success('支付成功!');
|
this.$message.success('支付成功!');
|
||||||
this.goBackToList();
|
this.goReturnUrl();
|
||||||
}
|
}
|
||||||
// 已取消
|
// 已取消
|
||||||
if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
|
if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
|
||||||
this.clearQueryInterval();
|
this.clearQueryInterval();
|
||||||
this.$message.error('支付已关闭!');
|
this.$message.error('支付已关闭!');
|
||||||
this.goBackToList();
|
this.goReturnUrl();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, 1000 * 2)
|
}, 1000 * 2)
|
||||||
@ -365,10 +289,34 @@ export default {
|
|||||||
clearInterval(this.interval)
|
clearInterval(this.interval)
|
||||||
this.interval = undefined
|
this.interval = undefined
|
||||||
},
|
},
|
||||||
/** 回到列表 **/
|
/**
|
||||||
goBackToList() {
|
* 回到业务的 URL
|
||||||
this.$tab.closePage();
|
*
|
||||||
this.$router.go(-1);
|
* @param payResult 支付结果
|
||||||
|
* ① success:支付成功
|
||||||
|
* ② cancel:取消支付
|
||||||
|
* ③ close:支付已关闭
|
||||||
|
*/
|
||||||
|
goReturnUrl(payResult) {
|
||||||
|
// 未配置的情况下,只能关闭
|
||||||
|
if (!this.returnUrl) {
|
||||||
|
this.$tab.closePage();
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = this.returnUrl.indexOf('?') >= 0
|
||||||
|
? this.returnUrl + '&payResult=' + payResult
|
||||||
|
: this.returnUrl + '?payResult=' + payResult
|
||||||
|
// 如果有配置,且是 http 开头,则浏览器跳转
|
||||||
|
if (this.returnUrl.indexOf('http') === 0) {
|
||||||
|
location.href = url;
|
||||||
|
} else {
|
||||||
|
this.$tab.closePage(() => {
|
||||||
|
this.$router.push({
|
||||||
|
path: url
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -29,9 +29,9 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="支付单号" align="center" prop="payOrderId" />
|
<el-table-column label="支付单号" align="center" prop="payOrderId" />
|
||||||
<el-table-column label="是否支付" align="center" prop="payed">
|
<el-table-column label="是否支付" align="center" prop="payStatus">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.payed" />
|
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.payStatus" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="支付时间" align="center" prop="payTime" width="180">
|
<el-table-column label="支付时间" align="center" prop="payTime" width="180">
|
||||||
@ -47,9 +47,9 @@
|
|||||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handlePay(scope.row)"
|
<el-button size="mini" type="text" icon="el-icon-edit" @click="handlePay(scope.row)"
|
||||||
v-if="!scope.row.payed">前往支付</el-button>
|
v-if="!scope.row.payStatus">前往支付</el-button>
|
||||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleRefund(scope.row)"
|
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleRefund(scope.row)"
|
||||||
v-if="scope.row.payed && !scope.row.payRefundId">发起退款</el-button>
|
v-if="scope.row.payStatus && !scope.row.payRefundId">发起退款</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@ -78,12 +78,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {createDemoOrder, getDemoOrderPage, refundDemoOrder} from "@/api/pay/demo";
|
import { createDemoOrder, getDemoOrderPage, refundDemoOrder } from "@/api/pay/demo";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "PayDemoOrder",
|
name: "PayDemoOrder",
|
||||||
components: {
|
|
||||||
},
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
@ -192,9 +190,10 @@ export default {
|
|||||||
/** 支付按钮操作 */
|
/** 支付按钮操作 */
|
||||||
handlePay(row) {
|
handlePay(row) {
|
||||||
this.$router.push({
|
this.$router.push({
|
||||||
name: 'PayOrderSubmit',
|
name: 'PayCashier',
|
||||||
query:{
|
query:{
|
||||||
id: row.payOrderId
|
id: row.payOrderId,
|
||||||
|
returnUrl: encodeURIComponent('/pay/demo-order?id=' + row.id)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -81,19 +81,19 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="商品标题" align="center" prop="subject" width="180" :show-overflow-tooltip="true"/>
|
<el-table-column label="商品标题" align="center" prop="subject" width="180" :show-overflow-tooltip="true"/>
|
||||||
<el-table-column label="支付金额" align="center" prop="amount" width="100">
|
<el-table-column label="支付金额" align="center" prop="price" width="100">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
¥{{ parseFloat(scope.row.amount / 100).toFixed(2) }}
|
¥{{ parseFloat(scope.row.price / 100).toFixed(2) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="手续金额" align="center" prop="channelFeeAmount" width="100">
|
<el-table-column label="手续金额" align="center" prop="channelFeePrice" width="100">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
¥{{ parseFloat(scope.row.channelFeeAmount / 100).toFixed(2) }}
|
¥{{ parseFloat(scope.row.channelFeePrice / 100).toFixed(2) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="退款金额" align="center" prop="refundAmount" width="100">
|
<el-table-column label="退款金额" align="center" prop="refundPrice" width="100">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
¥{{ parseFloat(scope.row.refundAmount / 100).toFixed(2) }}
|
¥{{ parseFloat(scope.row.refundPrice / 100).toFixed(2) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="支付状态" align="center" prop="status">
|
<el-table-column label="支付状态" align="center" prop="status">
|
||||||
@ -154,10 +154,10 @@
|
|||||||
</el-tag>
|
</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="金额">
|
<el-descriptions-item label="金额">
|
||||||
<el-tag type="success" size="small">{{ parseFloat(orderDetail.amount / 100, 2) }}</el-tag>
|
<el-tag type="success" size="small">{{ parseFloat(orderDetail.price / 100, 2) }}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="手续费">
|
<el-descriptions-item label="手续费">
|
||||||
<el-tag type="warning" size="small">{{ parseFloat(orderDetail.channelFeeAmount / 100, 2) }}</el-tag>
|
<el-tag type="warning" size="small">{{ parseFloat(orderDetail.channelFeePrice / 100, 2) }}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="手续费比例">
|
<el-descriptions-item label="手续费比例">
|
||||||
{{ parseFloat(orderDetail.channelFeeRate / 100, 2) }}%
|
{{ parseFloat(orderDetail.channelFeeRate / 100, 2) }}%
|
||||||
@ -184,7 +184,7 @@
|
|||||||
<el-descriptions-item label="退款次数">{{ orderDetail.refundTimes }}</el-descriptions-item>
|
<el-descriptions-item label="退款次数">{{ orderDetail.refundTimes }}</el-descriptions-item>
|
||||||
<el-descriptions-item label="退款金额">
|
<el-descriptions-item label="退款金额">
|
||||||
<el-tag type="warning">
|
<el-tag type="warning">
|
||||||
{{ parseFloat(orderDetail.refundAmount / 100, 2) }}
|
{{ parseFloat(orderDetail.refundPrice / 100, 2) }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
@ -213,16 +213,16 @@ const defaultOrderDetail = {
|
|||||||
merchantOrderId: null,
|
merchantOrderId: null,
|
||||||
channelOrderNo: '',
|
channelOrderNo: '',
|
||||||
body: '',
|
body: '',
|
||||||
amount: null,
|
price: null,
|
||||||
channelFeeRate: null,
|
channelFeeRate: null,
|
||||||
channelFeeAmount: null,
|
channelFeePrice: null,
|
||||||
userIp: '',
|
userIp: '',
|
||||||
status: null,
|
status: null,
|
||||||
notifyUrl: '',
|
notifyUrl: '',
|
||||||
notifyStatus: null,
|
notifyStatus: null,
|
||||||
refundStatus: null,
|
refundStatus: null,
|
||||||
refundTimes: '',
|
refundTimes: '',
|
||||||
refundAmount: null,
|
refundPrice: null,
|
||||||
createTime: '',
|
createTime: '',
|
||||||
successTime: '',
|
successTime: '',
|
||||||
notifyTime: '',
|
notifyTime: '',
|
||||||
@ -262,15 +262,15 @@ export default {
|
|||||||
body: null,
|
body: null,
|
||||||
notifyUrl: null,
|
notifyUrl: null,
|
||||||
notifyStatus: null,
|
notifyStatus: null,
|
||||||
amount: null,
|
price: null,
|
||||||
channelFeeRate: null,
|
channelFeeRate: null,
|
||||||
channelFeeAmount: null,
|
channelFeePrice: null,
|
||||||
status: null,
|
status: null,
|
||||||
userIp: null,
|
userIp: null,
|
||||||
successExtensionId: null,
|
successExtensionId: null,
|
||||||
refundStatus: null,
|
refundStatus: null,
|
||||||
refundTimes: null,
|
refundTimes: null,
|
||||||
refundAmount: null,
|
refundPrice: null,
|
||||||
channelUserId: null,
|
channelUserId: null,
|
||||||
channelOrderNo: null,
|
channelOrderNo: null,
|
||||||
expireTime: [],
|
expireTime: [],
|
||||||
@ -285,7 +285,7 @@ export default {
|
|||||||
// 支付应用列表集合
|
// 支付应用列表集合
|
||||||
appList: null,
|
appList: null,
|
||||||
// 支付渠道编码字典数据集合
|
// 支付渠道编码字典数据集合
|
||||||
payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE),
|
payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE),
|
||||||
// 订单回调商户状态字典数据集合
|
// 订单回调商户状态字典数据集合
|
||||||
payOrderNotifyDictDatum: getDictDatas(DICT_TYPE.PAY_ORDER_NOTIFY_STATUS),
|
payOrderNotifyDictDatum: getDictDatas(DICT_TYPE.PAY_ORDER_NOTIFY_STATUS),
|
||||||
// 订单状态字典数据集合
|
// 订单状态字典数据集合
|
||||||
|
@ -95,14 +95,14 @@
|
|||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="支付金额(元)" align="center" prop="payAmount" width="100">
|
<el-table-column label="支付金额(元)" align="center" prop="payPrice" width="100">
|
||||||
<template v-slot="scope" class="">
|
<template v-slot="scope" class="">
|
||||||
¥{{ parseFloat(scope.row.payAmount / 100).toFixed(2) }}
|
¥{{ parseFloat(scope.row.payPrice / 100).toFixed(2) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="退款金额(元)" align="center" prop="refundAmount" width="100">
|
<el-table-column label="退款金额(元)" align="center" prop="refundPrice" width="100">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
¥{{ parseFloat(scope.row.refundAmount / 100).toFixed(2) }}
|
¥{{ parseFloat(scope.row.refundPrice / 100).toFixed(2) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="退款类型" align="center" prop="type" width="80">
|
<el-table-column label="退款类型" align="center" prop="type" width="80">
|
||||||
@ -160,10 +160,10 @@
|
|||||||
<el-divider></el-divider>
|
<el-divider></el-divider>
|
||||||
<el-descriptions :column="2" label-class-name="desc-label">
|
<el-descriptions :column="2" label-class-name="desc-label">
|
||||||
<el-descriptions-item label="支付金额">
|
<el-descriptions-item label="支付金额">
|
||||||
{{ parseFloat(refundDetail.payAmount / 100).toFixed(2) }}
|
{{ parseFloat(refundDetail.payPrice / 100).toFixed(2) }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="退款金额" size="mini">
|
<el-descriptions-item label="退款金额" size="mini">
|
||||||
<el-tag class="tag-purple" size="mini">{{ parseFloat(refundDetail.refundAmount / 100).toFixed(2) }}</el-tag>
|
<el-tag class="tag-purple" size="mini">{{ parseFloat(refundDetail.refundPrice / 100).toFixed(2) }}</el-tag>
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="退款类型">
|
<el-descriptions-item label="退款类型">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
@ -234,9 +234,9 @@ const defaultRefundDetail = {
|
|||||||
notifyTime: null,
|
notifyTime: null,
|
||||||
notifyUrl: '',
|
notifyUrl: '',
|
||||||
orderId: null,
|
orderId: null,
|
||||||
payAmount: null,
|
payPrice: null,
|
||||||
reason: '',
|
reason: '',
|
||||||
refundAmount: null,
|
refundPrice: null,
|
||||||
status: null,
|
status: null,
|
||||||
subject: '',
|
subject: '',
|
||||||
successTime: null,
|
successTime: null,
|
||||||
@ -277,8 +277,8 @@ export default {
|
|||||||
notifyStatus: null,
|
notifyStatus: null,
|
||||||
status: null,
|
status: null,
|
||||||
type: null,
|
type: null,
|
||||||
payAmount: null,
|
payPrice: null,
|
||||||
refundAmount: null,
|
refundPrice: null,
|
||||||
reason: null,
|
reason: null,
|
||||||
userIp: null,
|
userIp: null,
|
||||||
channelOrderNo: null,
|
channelOrderNo: null,
|
||||||
@ -298,7 +298,7 @@ export default {
|
|||||||
// 支付应用列表集合
|
// 支付应用列表集合
|
||||||
appList: null,
|
appList: null,
|
||||||
// 支付渠道编码字典数据集合
|
// 支付渠道编码字典数据集合
|
||||||
payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE_TYPE),
|
payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE),
|
||||||
// 订单退款状态字典数据集合
|
// 订单退款状态字典数据集合
|
||||||
payRefundOrderDictDatum: getDictDatas(DICT_TYPE.PAY_REFUND_ORDER_STATUS),
|
payRefundOrderDictDatum: getDictDatas(DICT_TYPE.PAY_REFUND_ORDER_STATUS),
|
||||||
// 退款订单类别字典数据集合
|
// 退款订单类别字典数据集合
|
||||||
|
Loading…
Reference in New Issue
Block a user