Commit 52848d6341f4692ec57cafa49986497be9daad36

Authored by puhui999
2 parents 1d2a6ad0 c766f7da

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

# Conflicts:
#	yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/AppSeckillActivityController.java
#	yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityService.java
Showing 56 changed files with 989 additions and 411 deletions
sql/mysql/brokerage.sql
@@ -2,41 +2,50 @@ @@ -2,41 +2,50 @@
2 create table trade_config 2 create table trade_config
3 ( 3 (
4 id bigint auto_increment comment '自增主键' primary key, 4 id bigint auto_increment comment '自增主键' primary key,
5 - brokerage_enabled bit default 1 not null comment '是å¦å¯ç”¨åˆ†ä½£',  
6 - brokerage_enabled_condition tinyint default 0 not null comment '分佣模å¼ï¼š1-人人分销 2-指定分销',  
7 - brokerage_bind_mode tinyint default 0 not null comment '分销关系绑定模å¼: 1-没有推广人,2-新用户, 3-扫ç è¦†ç›–',  
8 - brokerage_post_urls varchar(2000) default '' null comment 'åˆ†é”€æµ·æŠ¥å›¾åœ°å€æ•°ç»„',  
9 - brokerage_first_percent int default 0 not null comment '一级返佣比例',  
10 - brokerage_second_percent int default 0 not null comment '二级返佣比例',  
11 - brokerage_withdraw_min_price int default 0 not null comment '用户æçŽ°æœ€ä½Žé‡‘é¢',  
12 - brokerage_bank_names varchar(200) default '' not null comment 'æçŽ°é“¶è¡Œï¼ˆå­—å…¸ç±»åž‹=brokerage_bank_name)',  
13 - brokerage_frozen_days int default 7 not null comment '佣金冻结时间(天)',  
14 - brokerage_withdraw_type varchar(32) default '1,2,3,4' not null comment 'æçŽ°æ–¹å¼ï¼š1-钱包;2-银行å¡ï¼›3-微信;4-支付å®',  
15 - creator varchar(64) collate utf8mb4_unicode_ci default '' null comment '创建者',  
16 - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',  
17 - updater varchar(64) collate utf8mb4_unicode_ci default '' null comment '更新者',  
18 - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',  
19 - deleted bit default b'0' not null comment '是å¦åˆ é™¤',  
20 - tenant_id bigint default 0 not null comment '租户编å·' 5 + brokerage_enabled bit default 1 not null comment '是å¦å¯ç”¨åˆ†ä½£',
  6 + brokerage_enabled_condition tinyint default 0 not null comment '分佣模å¼ï¼š1-人人分销 2-指定分销',
  7 + brokerage_bind_mode tinyint default 0 not null comment '分销关系绑定模å¼: 1-没有推广人,2-新用户, 3-扫ç è¦†ç›–',
  8 + brokerage_post_urls varchar(2000) default '' null comment 'åˆ†é”€æµ·æŠ¥å›¾åœ°å€æ•°ç»„',
  9 + brokerage_first_percent int default 0 not null comment '一级返佣比例',
  10 + brokerage_second_percent int default 0 not null comment '二级返佣比例',
  11 + brokerage_withdraw_min_price int default 0 not null comment '用户æçŽ°æœ€ä½Žé‡‘é¢',
  12 + brokerage_bank_names varchar(200) default '' not null comment 'æçŽ°é“¶è¡Œï¼ˆå­—å…¸ç±»åž‹=brokerage_bank_name)',
  13 + brokerage_frozen_days int default 7 not null comment '佣金冻结时间(天)',
  14 + brokerage_withdraw_type varchar(32) default '1,2,3,4' not null comment 'æçŽ°æ–¹å¼ï¼š1-钱包;2-银行å¡ï¼›3-微信;4-支付å®',
  15 + creator varchar(64) default '' null comment '创建者',
  16 + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  17 + updater varchar(64) default '' null comment '更新者',
  18 + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',
  19 + deleted bit default b'0' not null comment '是å¦åˆ é™¤',
  20 + tenant_id bigint default 0 not null comment '租户编å·'
21 ) comment '交易中心é…ç½®'; 21 ) comment '交易中心é…ç½®';
22 22
  23 +# alter table trade_brokerage_user
  24 +# add level int not null default 1 comment '等级' after frozen_price;
  25 +# alter table trade_brokerage_user
  26 +# add path varchar(2000) null comment '路径' after level;
  27 +
  28 +
23 -- 增加分销用户扩展表 29 -- 增加分销用户扩展表
24 create table trade_brokerage_user 30 create table trade_brokerage_user
25 ( 31 (
26 id bigint auto_increment comment '用户编å·' primary key, 32 id bigint auto_increment comment '用户编å·' primary key,
27 - bind_user_id bigint null comment '推广员编å·',  
28 - bind_user_time datetime null comment '推广员绑定时间',  
29 - brokerage_enabled bit default 1 not null comment 'æ˜¯å¦æˆä¸ºæŽ¨å¹¿å‘˜',  
30 - brokerage_time datetime null comment 'æˆä¸ºåˆ†é”€å‘˜æ—¶é—´',  
31 - price int default 0 not null comment 'å¯ç”¨ä½£é‡‘',  
32 - frozen_price int default 0 not null comment '冻结佣金',  
33 - creator varchar(64) collate utf8mb4_unicode_ci default '' null comment '创建者',  
34 - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',  
35 - updater varchar(64) collate utf8mb4_unicode_ci default '' null comment '更新者',  
36 - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',  
37 - deleted bit default b'0' not null comment '是å¦åˆ é™¤',  
38 - tenant_id bigint default 0 not null comment '租户编å·'  
39 -) comment '分销用户'; 33 + bind_user_id bigint null comment '推广员编å·',
  34 + bind_user_time datetime null comment '推广员绑定时间',
  35 + brokerage_enabled bit default 1 not null comment 'æ˜¯å¦æˆä¸ºæŽ¨å¹¿å‘˜',
  36 + brokerage_time datetime null comment 'æˆä¸ºåˆ†é”€å‘˜æ—¶é—´',
  37 + price int default 0 not null comment 'å¯ç”¨ä½£é‡‘',
  38 + frozen_price int default 0 not null comment '冻结佣金',
  39 + level int default 1 not null comment '等级',
  40 + path varchar(2000) null comment '路径',
  41 + creator varchar(64) default '' null comment '创建者',
  42 + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  43 + updater varchar(64) default '' null comment '更新者',
  44 + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',
  45 + deleted bit default b'0' not null comment '是å¦åˆ é™¤',
  46 + tenant_id bigint default 0 not null comment '租户编å·'
  47 +)
  48 + comment '分销用户';
40 49
41 create index idx_invite_user_id on trade_brokerage_user (bind_user_id) comment '推广员编å·'; 50 create index idx_invite_user_id on trade_brokerage_user (bind_user_id) comment '推广员编å·';
42 create index idx_agent on trade_brokerage_user (brokerage_enabled) comment 'æ˜¯å¦æˆä¸ºæŽ¨å¹¿å‘˜'; 51 create index idx_agent on trade_brokerage_user (brokerage_enabled) comment 'æ˜¯å¦æˆä¸ºæŽ¨å¹¿å‘˜';
@@ -44,26 +53,26 @@ create index idx_agent on trade_brokerage_user (brokerage_enabled) comment '是å @@ -44,26 +53,26 @@ create index idx_agent on trade_brokerage_user (brokerage_enabled) comment '是å
44 53
45 create table trade_brokerage_record 54 create table trade_brokerage_record
46 ( 55 (
47 - id int auto_increment comment 'ç¼–å·' 56 + id int auto_increment comment 'ç¼–å·'
48 primary key, 57 primary key,
49 - user_id bigint not null comment '用户编å·',  
50 - biz_id varchar(64) default '' not null comment '业务编å·',  
51 - biz_type tinyint default 0 not null comment '业务类型:1-订å•,2-æçް',  
52 - title varchar(64) default '' not null comment '标题',  
53 - price int default 0 not null comment '金é¢',  
54 - total_price int default 0 not null comment '当剿€»ä½£é‡‘',  
55 - description varchar(500) default '' not null comment '说明',  
56 - status tinyint default 0 not null comment '状æ€ï¼š0-待结算,1-已结算,2-已喿¶ˆ',  
57 - frozen_days int default 0 not null comment '冻结时间(天)',  
58 - unfreeze_time datetime null comment '解冻时间',  
59 - source_user_type tinyint not null comment 'æ¥æºç”¨æˆ·ç±»åž‹ï¼š1-一级推广用户,2-二级推广用户',  
60 - source_user_id bigint not null comment 'æ¥æºç”¨æˆ·ç¼–å·',  
61 - creator varchar(64) collate utf8mb4_general_ci default '' null comment '创建者',  
62 - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',  
63 - updater varchar(64) collate utf8mb4_general_ci default '' null comment '更新者',  
64 - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',  
65 - deleted bit default b'0' not null comment '是å¦åˆ é™¤',  
66 - tenant_id bigint default 0 not null comment '租户编å·' 58 + user_id bigint not null comment '用户编å·',
  59 + biz_id varchar(64) default '' not null comment '业务编å·',
  60 + biz_type tinyint default 0 not null comment '业务类型:1-订å•,2-æçް',
  61 + title varchar(64) default '' not null comment '标题',
  62 + price int default 0 not null comment '金é¢',
  63 + total_price int default 0 not null comment '当剿€»ä½£é‡‘',
  64 + description varchar(500) default '' not null comment '说明',
  65 + status tinyint default 0 not null comment '状æ€ï¼š0-待结算,1-已结算,2-已喿¶ˆ',
  66 + frozen_days int default 0 not null comment '冻结时间(天)',
  67 + unfreeze_time datetime null comment '解冻时间',
  68 + source_user_level int not null comment 'æ¥æºç”¨æˆ·ç­‰çº§',
  69 + source_user_id bigint not null comment 'æ¥æºç”¨æˆ·ç¼–å·',
  70 + creator varchar(64) default '' null comment '创建者',
  71 + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  72 + updater varchar(64) default '' null comment '更新者',
  73 + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',
  74 + deleted bit default b'0' not null comment '是å¦åˆ é™¤',
  75 + tenant_id bigint default 0 not null comment '租户编å·'
67 ) 76 )
68 comment '佣金记录'; 77 comment '佣金记录';
69 78
@@ -76,26 +85,26 @@ create table trade_brokerage_withdraw @@ -76,26 +85,26 @@ create table trade_brokerage_withdraw
76 ( 85 (
77 id int auto_increment comment 'ç¼–å·' 86 id int auto_increment comment 'ç¼–å·'
78 primary key, 87 primary key,
79 - user_id bigint not null comment '用户编å·',  
80 - price int default 0 not null comment 'æçް金é¢',  
81 - fee_price int default 0 not null comment 'æçŽ°æ‰‹ç»­è´¹',  
82 - total_price int default 0 not null comment '当剿€»ä½£é‡‘',  
83 - type tinyint default 0 not null comment 'æçŽ°ç±»åž‹ï¼š1-钱包;2-银行å¡ï¼›3-微信;4-支付å®',  
84 - name varchar(64) null comment '真实姓å',  
85 - account_no varchar(64) null comment 'è´¦å·',  
86 - bank_name varchar(100) null comment '银行åç§°',  
87 - bank_address varchar(200) null comment '开户地å€',  
88 - account_qr_code_url varchar(512) null comment '收款ç ',  
89 - status tinyint(2) default 0 not null comment '状æ€ï¼š0-审核中,10-审核通过 20-审核ä¸é€šè¿‡ï¼›é¢„留:11 - æçްæˆåŠŸï¼›21-æçŽ°å¤±è´¥',  
90 - audit_reason varchar(128) null comment '审核驳回原因',  
91 - audit_time datetime null comment '审核时间',  
92 - remark varchar(500) null comment '备注',  
93 - creator varchar(64) collate utf8mb4_general_ci default '' null comment '创建者',  
94 - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',  
95 - updater varchar(64) collate utf8mb4_general_ci default '' null comment '更新者',  
96 - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',  
97 - deleted bit default b'0' not null comment '是å¦åˆ é™¤',  
98 - tenant_id bigint default 0 not null comment '租户编å·' 88 + user_id bigint not null comment '用户编å·',
  89 + price int default 0 not null comment 'æçް金é¢',
  90 + fee_price int default 0 not null comment 'æçŽ°æ‰‹ç»­è´¹',
  91 + total_price int default 0 not null comment '当剿€»ä½£é‡‘',
  92 + type tinyint default 0 not null comment 'æçŽ°ç±»åž‹ï¼š1-钱包;2-银行å¡ï¼›3-微信;4-支付å®',
  93 + name varchar(64) null comment '真实姓å',
  94 + account_no varchar(64) null comment 'è´¦å·',
  95 + bank_name varchar(100) null comment '银行åç§°',
  96 + bank_address varchar(200) null comment '开户地å€',
  97 + account_qr_code_url varchar(512) null comment '收款ç ',
  98 + status tinyint(2) default 0 not null comment '状æ€ï¼š0-审核中,10-审核通过 20-审核ä¸é€šè¿‡ï¼›é¢„留:11 - æçްæˆåŠŸï¼›21-æçŽ°å¤±è´¥',
  99 + audit_reason varchar(128) null comment '审核驳回原因',
  100 + audit_time datetime null comment '审核时间',
  101 + remark varchar(500) null comment '备注',
  102 + creator varchar(64) default '' null comment '创建者',
  103 + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  104 + updater varchar(64) default '' null comment '更新者',
  105 + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment 'æ›´æ–°æ—¶é—´',
  106 + deleted bit default b'0' not null comment '是å¦åˆ é™¤',
  107 + tenant_id bigint default 0 not null comment '租户编å·'
99 ) 108 )
100 comment '佣金æçް'; 109 comment '佣金æçް';
101 110
@@ -139,12 +148,12 @@ values ('brokerage_record_status', '待结算', 0, 0), @@ -139,12 +148,12 @@ values ('brokerage_record_status', '待结算', 0, 0),
139 148
140 insert into system_dict_type(type, name) 149 insert into system_dict_type(type, name)
141 values ('brokerage_withdraw_status', '佣金æçŽ°çŠ¶æ€'); 150 values ('brokerage_withdraw_status', '佣金æçŽ°çŠ¶æ€');
142 -insert into system_dict_data(dict_type, label, value, sort)  
143 -values ('brokerage_withdraw_status', '审核中', 0, 0),  
144 - ('brokerage_withdraw_status', '审核通过', 10, 10),  
145 - ('brokerage_withdraw_status', 'æçްæˆåŠŸ', 11, 11),  
146 - ('brokerage_withdraw_status', '审核ä¸é€šè¿‡', 20, 20),  
147 - ('brokerage_withdraw_status', 'æçŽ°å¤±è´¥', 21, 21); 151 +insert into system_dict_data(dict_type, label, value, sort, color_type)
  152 +values ('brokerage_withdraw_status', '审核中', 0, 0, ''),
  153 + ('brokerage_withdraw_status', '审核通过', 10, 10, 'success'),
  154 + ('brokerage_withdraw_status', 'æçްæˆåŠŸ', 11, 11, 'success'),
  155 + ('brokerage_withdraw_status', '审核ä¸é€šè¿‡', 20, 20, 'danger'),
  156 + ('brokerage_withdraw_status', 'æçŽ°å¤±è´¥', 21, 21, 'danger');
148 157
149 insert into system_dict_type(type, name) 158 insert into system_dict_type(type, name)
150 values ('brokerage_bank_name', '佣金æçŽ°é“¶è¡Œ'); 159 values ('brokerage_bank_name', '佣金æçŽ°é“¶è¡Œ');
@@ -220,4 +229,10 @@ SELECT @parentId := LAST_INSERT_ID(); @@ -220,4 +229,10 @@ SELECT @parentId := LAST_INSERT_ID();
220 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) 229 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
221 VALUES ('佣金æçŽ°æŸ¥è¯¢', 'trade:brokerage-withdraw:query', 3, 1, @parentId, '', '', '', 0); 230 VALUES ('佣金æçŽ°æŸ¥è¯¢', 'trade:brokerage-withdraw:query', 3, 1, @parentId, '', '', '', 0);
222 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) 231 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
223 -VALUES ('佣金æçŽ°å®¡æ ¸', 'trade:brokerage-withdraw:audit', 3, 2, @parentId, '', '', '', 0);  
224 \ No newline at end of file 232 \ No newline at end of file
  233 +VALUES ('佣金æçŽ°å®¡æ ¸', 'trade:brokerage-withdraw:audit', 3, 2, @parentId, '', '', '', 0);
  234 +
  235 +-- 站内信模æ¿
  236 +INSERT INTO `ruoyi-vue-pro`.system_notify_template (name, code, nickname, content, type, params, status)
  237 +VALUES
  238 + ('佣金æçŽ°ï¼ˆå®¡æ ¸é€šè¿‡ï¼‰', 'brokerage_withdraw_audit_approve', 'system', '您在{createTime}æçŽ°ï¿¥{price}元的申请已通过审核', 2, '["createTime","price"]', 0),
  239 + ('佣金æçŽ°ï¼ˆå®¡æ ¸ä¸é€šè¿‡ï¼‰', 'brokerage_withdraw_audit_reject', 'system', '您在{createTime}æçŽ°ï¿¥{price}元的申请未通过审核,原因:{reason}', 2, '["createTime","price","reason"]', 0);
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
@@ -50,6 +50,7 @@ public class LocalDateTimeUtils { @@ -50,6 +50,7 @@ public class LocalDateTimeUtils {
50 * @return 指定时间 50 * @return 指定时间
51 */ 51 */
52 public static LocalDateTime buildTime(String timeStr) { 52 public static LocalDateTime buildTime(String timeStr) {
  53 + // TODO @puhui999:这个方法的实现,和 LocalDateTimeUtil.parse() 的差异点是啥呀
53 return LocalDateTime.of(LocalDate.now(), LocalTime.parse(timeStr)); 54 return LocalDateTime.of(LocalDate.now(), LocalTime.parse(timeStr));
54 } 55 }
55 56
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/query/LambdaQueryWrapperX.java
@@ -100,6 +100,14 @@ public class LambdaQueryWrapperX<T> extends LambdaQueryWrapper<T> { @@ -100,6 +100,14 @@ public class LambdaQueryWrapperX<T> extends LambdaQueryWrapper<T> {
100 return betweenIfPresent(column, val1, val2); 100 return betweenIfPresent(column, val1, val2);
101 } 101 }
102 102
  103 + // TODO @疯狂:这个是 mysql 独有的,不好做成通用的哈。如果多层级,有没可能先查询一个层级,再查询一个层级;形成 set 后,直接去 in?
  104 + public LambdaQueryWrapperX<T> findInSetIfPresent(SFunction<T, ?> column, Object val) {
  105 + if (val != null) {
  106 + return (LambdaQueryWrapperX<T>) super.apply("FIND_IN_SET({0}, " + columnToString(column) + ")", val);
  107 + }
  108 + return this;
  109 + }
  110 +
103 // ========== 重写父类方法,方便链式调用 ========== 111 // ========== 重写父类方法,方便链式调用 ==========
104 112
105 @Override 113 @Override
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm
@@ -64,14 +64,14 @@ public class ${table.className}ServiceImpl implements ${table.className}Service @@ -64,14 +64,14 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
64 64
65 @Override 65 @Override
66 public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { 66 public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) {
67 - if (CollUtil.isEmpty(ids)) {  
68 - return ListUtil.empty();  
69 - }  
70 return ${classNameVar}Mapper.selectById(id); 67 return ${classNameVar}Mapper.selectById(id);
71 } 68 }
72 69
73 @Override 70 @Override
74 public List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids) { 71 public List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids) {
  72 + if (CollUtil.isEmpty(ids)) {
  73 + return ListUtil.empty();
  74 + }
75 return ${classNameVar}Mapper.selectBatchIds(ids); 75 return ${classNameVar}Mapper.selectBatchIds(ids);
76 } 76 }
77 77
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApi.java
@@ -31,7 +31,7 @@ public interface CombinationRecordApi { @@ -31,7 +31,7 @@ public interface CombinationRecordApi {
31 boolean isCombinationRecordSuccess(Long userId, Long orderId); 31 boolean isCombinationRecordSuccess(Long userId, Long orderId);
32 32
33 /** 33 /**
34 - * 更新拼团状态为 成功 34 + * 更新拼团状态为【成功】
35 * 35 *
36 * @param userId 用户编号 36 * @param userId 用户编号
37 * @param orderId 订单编号 37 * @param orderId 订单编号
@@ -39,7 +39,7 @@ public interface CombinationRecordApi { @@ -39,7 +39,7 @@ public interface CombinationRecordApi {
39 void updateRecordStatusToSuccess(Long userId, Long orderId); 39 void updateRecordStatusToSuccess(Long userId, Long orderId);
40 40
41 /** 41 /**
42 - * 更新拼团状态为 失败 42 + * 更新拼团状态为【失败】
43 * 43 *
44 * @param userId 用户编号 44 * @param userId 用户编号
45 * @param orderId 订单编号 45 * @param orderId 订单编号
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/seckill/SeckillActivityApi.java
@@ -7,6 +7,7 @@ package cn.iocoder.yudao.module.promotion.api.seckill; @@ -7,6 +7,7 @@ package cn.iocoder.yudao.module.promotion.api.seckill;
7 */ 7 */
8 public interface SeckillActivityApi { 8 public interface SeckillActivityApi {
9 9
  10 + // TODO @puhui999:activityId 改成 id 好点哈;
10 /** 11 /**
11 * 更新秒杀库存 12 * 更新秒杀库存
12 * 13 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/BargainActivityController.java
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.promotion.controller.admin.bargain; @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.promotion.controller.admin.bargain;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;  
7 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; 6 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
8 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; 7 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
9 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO; 8 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO;
@@ -25,6 +24,7 @@ import javax.validation.Valid; @@ -25,6 +24,7 @@ import javax.validation.Valid;
25 import java.util.List; 24 import java.util.List;
26 25
27 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
28 28
29 @Tag(name = "管理后台 - 砍价活动") 29 @Tag(name = "管理后台 - 砍价活动")
30 @RestController 30 @RestController
@@ -79,7 +79,9 @@ public class BargainActivityController { @@ -79,7 +79,9 @@ public class BargainActivityController {
79 if (CollUtil.isEmpty(pageResult.getList())) { 79 if (CollUtil.isEmpty(pageResult.getList())) {
80 return success(PageResult.empty(pageResult.getTotal())); 80 return success(PageResult.empty(pageResult.getTotal()));
81 } 81 }
82 - List<ProductSpuRespDTO> spuList = spuApi.getSpuList(CollectionUtils.convertList(pageResult.getList(), BargainActivityDO::getSpuId)); 82 +
  83 + // 拼接数据
  84 + List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(pageResult.getList(), BargainActivityDO::getSpuId));
83 return success(BargainActivityConvert.INSTANCE.convertPage(pageResult, spuList)); 85 return success(BargainActivityConvert.INSTANCE.convertPage(pageResult, spuList));
84 } 86 }
85 87
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainActivityController.java
@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageParam; 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;  
8 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; 7 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
9 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; 8 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
10 import cn.iocoder.yudao.module.promotion.controller.app.bargain.vo.activity.AppBargainActivityDetailRespVO; 9 import cn.iocoder.yudao.module.promotion.controller.app.bargain.vo.activity.AppBargainActivityDetailRespVO;
@@ -25,6 +24,7 @@ import javax.annotation.Resource; @@ -25,6 +24,7 @@ import javax.annotation.Resource;
25 import java.util.List; 24 import java.util.List;
26 25
27 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
28 28
29 @Tag(name = "用户 App - 砍价活动") 29 @Tag(name = "用户 App - 砍价活动")
30 @RestController 30 @RestController
@@ -39,27 +39,27 @@ public class AppBargainActivityController { @@ -39,27 +39,27 @@ public class AppBargainActivityController {
39 @GetMapping("/page") 39 @GetMapping("/page")
40 @Operation(summary = "获得砍价活动分页") 40 @Operation(summary = "获得砍价活动分页")
41 public CommonResult<PageResult<AppBargainActivityRespVO>> getBargainActivityPage(PageParam pageReqVO) { 41 public CommonResult<PageResult<AppBargainActivityRespVO>> getBargainActivityPage(PageParam pageReqVO) {
42 - PageResult<BargainActivityDO> result = bargainActivityService.getBargainActivityAppPage(pageReqVO); 42 + PageResult<BargainActivityDO> result = bargainActivityService.getBargainActivityPageForApp(pageReqVO);
43 if (CollUtil.isEmpty(result.getList())) { 43 if (CollUtil.isEmpty(result.getList())) {
44 return success(PageResult.empty(result.getTotal())); 44 return success(PageResult.empty(result.getTotal()));
45 } 45 }
46 -  
47 - List<ProductSpuRespDTO> spuList = spuApi.getSpuList(CollectionUtils.convertList(result.getList(), BargainActivityDO::getSpuId)); 46 + // 拼接数据
  47 + List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(result.getList(), BargainActivityDO::getSpuId));
48 return success(BargainActivityConvert.INSTANCE.convertAppPage(result, spuList)); 48 return success(BargainActivityConvert.INSTANCE.convertAppPage(result, spuList));
49 } 49 }
50 50
  51 + // TODO 芋艿:增加 Spring Cache
51 @GetMapping("/list") 52 @GetMapping("/list")
52 @Operation(summary = "获得砍价活动列表", description = "用于小程序首页") 53 @Operation(summary = "获得砍价活动列表", description = "用于小程序首页")
53 @Parameter(name = "count", description = "需要展示的数量", example = "6") 54 @Parameter(name = "count", description = "需要展示的数量", example = "6")
54 public CommonResult<List<AppBargainActivityRespVO>> getBargainActivityList( 55 public CommonResult<List<AppBargainActivityRespVO>> getBargainActivityList(
55 @RequestParam(name = "count", defaultValue = "6") Integer count) { 56 @RequestParam(name = "count", defaultValue = "6") Integer count) {
56 - List<BargainActivityDO> list = bargainActivityService.getBargainActivityAppList(count); 57 + List<BargainActivityDO> list = bargainActivityService.getBargainActivityListForApp(count);
57 if (CollUtil.isEmpty(list)) { 58 if (CollUtil.isEmpty(list)) {
58 return success(BargainActivityConvert.INSTANCE.convertAppList(list)); 59 return success(BargainActivityConvert.INSTANCE.convertAppList(list));
59 } 60 }
60 -  
61 - List<ProductSpuRespDTO> spuList = spuApi.getSpuList(CollectionUtils.convertList(list, BargainActivityDO::getSpuId));  
62 - // TODO 芋艿:增加 Spring Cache 61 + // 拼接数据
  62 + List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(list, BargainActivityDO::getSpuId));
63 return success(BargainActivityConvert.INSTANCE.convertAppList(list, spuList)); 63 return success(BargainActivityConvert.INSTANCE.convertAppList(list, spuList));
64 } 64 }
65 65
@@ -71,9 +71,9 @@ public class AppBargainActivityController { @@ -71,9 +71,9 @@ public class AppBargainActivityController {
71 if (activity == null) { 71 if (activity == null) {
72 return success(null); 72 return success(null);
73 } 73 }
74 - 74 + // 拼接数据
75 ProductSpuRespDTO spu = spuApi.getSpu(activity.getSpuId()); 75 ProductSpuRespDTO spu = spuApi.getSpu(activity.getSpuId());
76 - return success(BargainActivityConvert.INSTANCE.convert1(activity, spu)); 76 + return success(BargainActivityConvert.INSTANCE.convert(activity, spu));
77 } 77 }
78 78
79 } 79 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/AppSeckillActivityController.java
@@ -53,19 +53,20 @@ public class AppSeckillActivityController { @@ -53,19 +53,20 @@ public class AppSeckillActivityController {
53 @GetMapping("/get-now") 53 @GetMapping("/get-now")
54 @Operation(summary = "获得当前秒杀活动", description = "获取当前正在进行的活动,提供给首页使用") 54 @Operation(summary = "获得当前秒杀活动", description = "获取当前正在进行的活动,提供给首页使用")
55 public CommonResult<AppSeckillActivityNowRespVO> getNowSeckillActivity() { 55 public CommonResult<AppSeckillActivityNowRespVO> getNowSeckillActivity() {
56 - // 1、获取当前时间处在哪个秒杀阶段 56 + // 1. 获取当前时间处在哪个秒杀阶段
  57 + // TODO @puhui999:可以考虑在 service 写个方法;这样 controller 不用关注过多逻辑
57 List<SeckillConfigDO> configList = configService.getSeckillConfigList(); 58 List<SeckillConfigDO> configList = configService.getSeckillConfigList();
58 SeckillConfigDO filteredConfig = findFirst(configList, config -> ObjectUtil.equal(config.getStatus(), 59 SeckillConfigDO filteredConfig = findFirst(configList, config -> ObjectUtil.equal(config.getStatus(),
59 CommonStatusEnum.ENABLE.getStatus()) && isBetween(config.getStartTime(), config.getEndTime())); 60 CommonStatusEnum.ENABLE.getStatus()) && isBetween(config.getStartTime(), config.getEndTime()));
60 - // 1、1 时段不存在直接返回 null  
61 - if (filteredConfig == null) { 61 + if (filteredConfig == null) { // 时段不存在直接返回 null
62 return success(null); 62 return success(null);
63 } 63 }
64 64
65 - // 2、查询满足当前阶段的活动 65 + // 2. 查询满足当前阶段的活动
  66 + // TODO @puhui999:最好直接返回开启的;不多查询数据
66 List<SeckillActivityDO> activityList = activityService.getSeckillActivityListByConfigIds(Arrays.asList(filteredConfig.getId())); 67 List<SeckillActivityDO> activityList = activityService.getSeckillActivityListByConfigIds(Arrays.asList(filteredConfig.getId()));
67 List<SeckillActivityDO> filteredList = filterList(activityList, item -> ObjectUtil.equal(item.getStatus(), CommonStatusEnum.ENABLE.getStatus())); 68 List<SeckillActivityDO> filteredList = filterList(activityList, item -> ObjectUtil.equal(item.getStatus(), CommonStatusEnum.ENABLE.getStatus()));
68 - // 2、1 获取 spu 信息 69 + // 3 获取 spu 信息
69 List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(filteredList, SeckillActivityDO::getSpuId)); 70 List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(filteredList, SeckillActivityDO::getSpuId));
70 // TODO 芋艿:需要增加 spring cache 71 // TODO 芋艿:需要增加 spring cache
71 return success(SeckillActivityConvert.INSTANCE.convert(filteredConfig, filteredList, spuList)); 72 return success(SeckillActivityConvert.INSTANCE.convert(filteredConfig, filteredList, spuList));
@@ -74,9 +75,10 @@ public class AppSeckillActivityController { @@ -74,9 +75,10 @@ public class AppSeckillActivityController {
74 @GetMapping("/page") 75 @GetMapping("/page")
75 @Operation(summary = "获得秒杀活动分页") 76 @Operation(summary = "获得秒杀活动分页")
76 public CommonResult<PageResult<AppSeckillActivityRespVO>> getSeckillActivityPage(AppSeckillActivityPageReqVO pageReqVO) { 77 public CommonResult<PageResult<AppSeckillActivityRespVO>> getSeckillActivityPage(AppSeckillActivityPageReqVO pageReqVO) {
77 - // 1、查询满足当前阶段的活动 78 + // 1. 查询满足当前阶段的活动
78 PageResult<SeckillActivityDO> pageResult = activityService.getSeckillActivityAppPageByConfigId(pageReqVO); 79 PageResult<SeckillActivityDO> pageResult = activityService.getSeckillActivityAppPageByConfigId(pageReqVO);
79 - // 1、1 获取 spu 信息 80 +
  81 + // 2. 拼接数据
80 List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(pageResult.getList(), SeckillActivityDO::getSpuId)); 82 List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(pageResult.getList(), SeckillActivityDO::getSpuId));
81 return success(SeckillActivityConvert.INSTANCE.convertPage(pageResult, spuList)); 83 return success(SeckillActivityConvert.INSTANCE.convertPage(pageResult, spuList));
82 } 84 }
@@ -86,15 +88,15 @@ public class AppSeckillActivityController { @@ -86,15 +88,15 @@ public class AppSeckillActivityController {
86 @Parameter(name = "id", description = "活动编号", required = true, example = "1024") 88 @Parameter(name = "id", description = "活动编号", required = true, example = "1024")
87 public CommonResult<AppSeckillActivityDetailRespVO> getSeckillActivity(@RequestParam("id") Long id) { 89 public CommonResult<AppSeckillActivityDetailRespVO> getSeckillActivity(@RequestParam("id") Long id) {
88 // 1、获取当前时间处在哪个秒杀阶段 90 // 1、获取当前时间处在哪个秒杀阶段
  91 + // TODO puhui999:这里,和 58 行是雷同的
89 List<SeckillConfigDO> configList = configService.getSeckillConfigList(); 92 List<SeckillConfigDO> configList = configService.getSeckillConfigList();
90 SeckillConfigDO filteredConfig = findFirst(configList, config -> ObjectUtil.equal(config.getStatus(), 93 SeckillConfigDO filteredConfig = findFirst(configList, config -> ObjectUtil.equal(config.getStatus(),
91 CommonStatusEnum.ENABLE.getStatus()) && isBetween(config.getStartTime(), config.getEndTime())); 94 CommonStatusEnum.ENABLE.getStatus()) && isBetween(config.getStartTime(), config.getEndTime()));
92 - // 1、1 时段不存在直接返回 null  
93 - if (filteredConfig == null) { 95 + if (filteredConfig == null) { // 时段不存在直接返回 null
94 return success(null); 96 return success(null);
95 } 97 }
96 98
97 - // 2、获取活动 99 + // 2. 获取活动
98 SeckillActivityDO seckillActivity = activityService.getSeckillActivity(id); 100 SeckillActivityDO seckillActivity = activityService.getSeckillActivity(id);
99 if (seckillActivity == null) { 101 if (seckillActivity == null) {
100 return success(null); 102 return success(null);
@@ -103,7 +105,7 @@ public class AppSeckillActivityController { @@ -103,7 +105,7 @@ public class AppSeckillActivityController {
103 throw exception(SECKILL_ACTIVITY_APP_STATUS_CLOSED); 105 throw exception(SECKILL_ACTIVITY_APP_STATUS_CLOSED);
104 } 106 }
105 107
106 - // 3、获取活动商品 108 + // 3. 拼接数据
107 List<SeckillProductDO> products = activityService.getSeckillProductListByActivityId(seckillActivity.getId()); 109 List<SeckillProductDO> products = activityService.getSeckillProductListByActivityId(seckillActivity.getId());
108 return success(SeckillActivityConvert.INSTANCE.convert3(seckillActivity, products, filteredConfig)); 110 return success(SeckillActivityConvert.INSTANCE.convert3(seckillActivity, products, filteredConfig));
109 } 111 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/AppSeckillConfigController.java
@@ -32,19 +32,12 @@ public class AppSeckillConfigController { @@ -32,19 +32,12 @@ public class AppSeckillConfigController {
32 @Operation(summary = "获得秒杀时间段列表") 32 @Operation(summary = "获得秒杀时间段列表")
33 public CommonResult<List<AppSeckillConfigRespVO>> getSeckillConfigList() { 33 public CommonResult<List<AppSeckillConfigRespVO>> getSeckillConfigList() {
34 List<SeckillConfigDO> list = configService.getSeckillConfigListByStatus(CommonStatusEnum.ENABLE.getStatus()); 34 List<SeckillConfigDO> list = configService.getSeckillConfigListByStatus(CommonStatusEnum.ENABLE.getStatus());
  35 + // TODO @puhui999:如果这种,不用判空也问题不大;
35 if (CollectionUtil.isEmpty(list)) { 36 if (CollectionUtil.isEmpty(list)) {
36 return success(Collections.emptyList()); 37 return success(Collections.emptyList());
37 } 38 }
38 39
39 return success(SeckillConfigConvert.INSTANCE.convertList2(list)); 40 return success(SeckillConfigConvert.INSTANCE.convertList2(list));
40 - //return success(Arrays.asList(  
41 - // new AppSeckillConfigRespVO().setId(1L).setStartTime("00:00").setEndTime("09:59")  
42 - // .setSliderPicUrls(Arrays.asList("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg",  
43 - // "https://static.iocoder.cn/mall/132.jpeg")),  
44 - // new AppSeckillConfigRespVO().setId(2L).setStartTime("10:00").setEndTime("12:59"),  
45 - // new AppSeckillConfigRespVO().setId(2L).setStartTime("13:00").setEndTime("22:59"),  
46 - // new AppSeckillConfigRespVO().setId(2L).setStartTime("23:00").setEndTime("23:59")  
47 - //));  
48 } 41 }
49 42
50 } 43 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/bargain/BargainActivityConvert.java
@@ -42,9 +42,11 @@ public interface BargainActivityConvert { @@ -42,9 +42,11 @@ public interface BargainActivityConvert {
42 42
43 default PageResult<BargainActivityRespVO> convertPage(PageResult<BargainActivityDO> page, List<ProductSpuRespDTO> spuList) { 43 default PageResult<BargainActivityRespVO> convertPage(PageResult<BargainActivityDO> page, List<ProductSpuRespDTO> spuList) {
44 PageResult<BargainActivityRespVO> result = convertPage(page); 44 PageResult<BargainActivityRespVO> result = convertPage(page);
  45 + // 拼接关联属性
45 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId); 46 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
46 List<BargainActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> { 47 List<BargainActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> {
47 findAndThen(spuMap, item.getSpuId(), spu -> { 48 findAndThen(spuMap, item.getSpuId(), spu -> {
  49 + // TODO @puhui999:这里可以使用链式哈
48 item.setPicUrl(spu.getPicUrl()); 50 item.setPicUrl(spu.getPicUrl());
49 item.setSpuName(spu.getName()); 51 item.setSpuName(spu.getName());
50 }); 52 });
@@ -56,7 +58,7 @@ public interface BargainActivityConvert { @@ -56,7 +58,7 @@ public interface BargainActivityConvert {
56 58
57 AppBargainActivityDetailRespVO convert1(BargainActivityDO bean); 59 AppBargainActivityDetailRespVO convert1(BargainActivityDO bean);
58 60
59 - default AppBargainActivityDetailRespVO convert1(BargainActivityDO bean, ProductSpuRespDTO spu) { 61 + default AppBargainActivityDetailRespVO convert(BargainActivityDO bean, ProductSpuRespDTO spu) {
60 AppBargainActivityDetailRespVO detail = convert1(bean); 62 AppBargainActivityDetailRespVO detail = convert1(bean);
61 if (spu != null) { 63 if (spu != null) {
62 detail.setPicUrl(spu.getPicUrl()); 64 detail.setPicUrl(spu.getPicUrl());
@@ -70,9 +72,11 @@ public interface BargainActivityConvert { @@ -70,9 +72,11 @@ public interface BargainActivityConvert {
70 72
71 default PageResult<AppBargainActivityRespVO> convertAppPage(PageResult<BargainActivityDO> page, List<ProductSpuRespDTO> spuList) { 73 default PageResult<AppBargainActivityRespVO> convertAppPage(PageResult<BargainActivityDO> page, List<ProductSpuRespDTO> spuList) {
72 PageResult<AppBargainActivityRespVO> result = convertAppPage(page); 74 PageResult<AppBargainActivityRespVO> result = convertAppPage(page);
  75 + // 拼接关联属性
73 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId); 76 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
74 List<AppBargainActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> { 77 List<AppBargainActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> {
75 findAndThen(spuMap, item.getSpuId(), spu -> { 78 findAndThen(spuMap, item.getSpuId(), spu -> {
  79 + // TODO @puhui999:这里可以使用链式哈
76 item.setPicUrl(spu.getPicUrl()); 80 item.setPicUrl(spu.getPicUrl());
77 item.setMarketPrice(spu.getMarketPrice()); 81 item.setMarketPrice(spu.getMarketPrice());
78 }); 82 });
@@ -89,6 +93,7 @@ public interface BargainActivityConvert { @@ -89,6 +93,7 @@ public interface BargainActivityConvert {
89 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId); 93 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
90 return CollectionUtils.convertList(activityList, item -> { 94 return CollectionUtils.convertList(activityList, item -> {
91 findAndThen(spuMap, item.getSpuId(), spu -> { 95 findAndThen(spuMap, item.getSpuId(), spu -> {
  96 + // TODO @puhui999:这里可以使用链式哈
92 item.setPicUrl(spu.getPicUrl()); 97 item.setPicUrl(spu.getPicUrl());
93 item.setMarketPrice(spu.getMarketPrice()); 98 item.setMarketPrice(spu.getMarketPrice());
94 }); 99 });
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
@@ -97,8 +97,10 @@ public interface CombinationActivityConvert { @@ -97,8 +97,10 @@ public interface CombinationActivityConvert {
97 97
98 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO); 98 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO);
99 99
100 - default CombinationRecordDO convert1(CombinationRecordCreateReqDTO reqDTO, CombinationActivityDO activity, MemberUserRespDTO user,  
101 - ProductSpuRespDTO spu, ProductSkuRespDTO sku) { 100 + default CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO,
  101 + CombinationActivityDO activity, MemberUserRespDTO user,
  102 + ProductSpuRespDTO spu, ProductSkuRespDTO sku) {
  103 + // TODO @puhui999:搞成链式的 set;这样会更规整一点;
102 CombinationRecordDO record = convert(reqDTO); 104 CombinationRecordDO record = convert(reqDTO);
103 record.setVirtualGroup(false); 105 record.setVirtualGroup(false);
104 record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration())); 106 record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration()));
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java
@@ -98,6 +98,7 @@ public interface SeckillActivityConvert { @@ -98,6 +98,7 @@ public interface SeckillActivityConvert {
98 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId); 98 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
99 respVO.setActivities(CollectionUtils.convertList(convertList3(activityList), item -> { 99 respVO.setActivities(CollectionUtils.convertList(convertList3(activityList), item -> {
100 findAndThen(spuMap, item.getSpuId(), spu -> { 100 findAndThen(spuMap, item.getSpuId(), spu -> {
  101 + // TODO @puhui999:可以尝试链式 set 哈;
101 item.setPicUrl(spu.getPicUrl()); 102 item.setPicUrl(spu.getPicUrl());
102 item.setMarketPrice(spu.getMarketPrice()); 103 item.setMarketPrice(spu.getMarketPrice());
103 item.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit())); 104 item.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
@@ -114,6 +115,7 @@ public interface SeckillActivityConvert { @@ -114,6 +115,7 @@ public interface SeckillActivityConvert {
114 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId); 115 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
115 List<AppSeckillActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> { 116 List<AppSeckillActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> {
116 findAndThen(spuMap, item.getSpuId(), spu -> { 117 findAndThen(spuMap, item.getSpuId(), spu -> {
  118 + // TODO @puhui999:可以尝试链式 set 哈;
117 item.setPicUrl(spu.getPicUrl()); 119 item.setPicUrl(spu.getPicUrl());
118 item.setMarketPrice(spu.getMarketPrice()); 120 item.setMarketPrice(spu.getMarketPrice());
119 item.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit())); 121 item.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
@@ -131,6 +133,7 @@ public interface SeckillActivityConvert { @@ -131,6 +133,7 @@ public interface SeckillActivityConvert {
131 default AppSeckillActivityDetailRespVO convert3(SeckillActivityDO seckillActivity, List<SeckillProductDO> products, SeckillConfigDO filteredConfig) { 133 default AppSeckillActivityDetailRespVO convert3(SeckillActivityDO seckillActivity, List<SeckillProductDO> products, SeckillConfigDO filteredConfig) {
132 AppSeckillActivityDetailRespVO respVO = convert2(seckillActivity); 134 AppSeckillActivityDetailRespVO respVO = convert2(seckillActivity);
133 respVO.setProducts(convertList1(products)); 135 respVO.setProducts(convertList1(products));
  136 + // TODO @puhui999:可以尝试链式 set 哈;
134 respVO.setStartTime(buildTime(filteredConfig.getStartTime())); 137 respVO.setStartTime(buildTime(filteredConfig.getStartTime()));
135 respVO.setEndTime(buildTime(filteredConfig.getEndTime())); 138 respVO.setEndTime(buildTime(filteredConfig.getEndTime()));
136 return respVO; 139 return respVO;
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
@@ -41,7 +41,7 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; { @@ -41,7 +41,7 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
41 default int updateActivityStock(Long id, int count) { 41 default int updateActivityStock(Long id, int count) {
42 return update(null, new LambdaUpdateWrapper<BargainActivityDO>() 42 return update(null, new LambdaUpdateWrapper<BargainActivityDO>()
43 .eq(BargainActivityDO::getId, id) 43 .eq(BargainActivityDO::getId, id)
44 - .gt(BargainActivityDO::getStock, count) 44 + .ge(BargainActivityDO::getStock, count)
45 .setSql("stock = stock - " + count)); 45 .setSql("stock = stock - " + count));
46 } 46 }
47 47
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java
@@ -52,6 +52,7 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; { @@ -52,6 +52,7 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; {
52 default PageResult<SeckillActivityDO> selectPage(AppSeckillActivityPageReqVO pageReqVO, Integer status) { 52 default PageResult<SeckillActivityDO> selectPage(AppSeckillActivityPageReqVO pageReqVO, Integer status) {
53 return selectPage(pageReqVO, new LambdaQueryWrapperX<SeckillActivityDO>() 53 return selectPage(pageReqVO, new LambdaQueryWrapperX<SeckillActivityDO>()
54 .eqIfPresent(SeckillActivityDO::getStatus, status) 54 .eqIfPresent(SeckillActivityDO::getStatus, status)
  55 + // TODO 芋艿:对 find in set 的想法;
55 .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0")); 56 .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0"));
56 } 57 }
57 58
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityService.java
@@ -63,20 +63,22 @@ public interface BargainActivityService { @@ -63,20 +63,22 @@ public interface BargainActivityService {
63 */ 63 */
64 PageResult<BargainActivityDO> getBargainActivityPage(BargainActivityPageReqVO pageReqVO); 64 PageResult<BargainActivityDO> getBargainActivityPage(BargainActivityPageReqVO pageReqVO);
65 65
  66 + // TODO @puhui999:这里可以改成进行中的活动;尽量避免专门为 app 定制,或者类似的名字哈;mapper 那也是
  67 +
66 /** 68 /**
67 * 获取 APP 端活动分页数据 69 * 获取 APP 端活动分页数据
68 * 70 *
69 * @param pageReqVO 分页请求 71 * @param pageReqVO 分页请求
70 * @return 砍价活动分页 72 * @return 砍价活动分页
71 */ 73 */
72 - PageResult<BargainActivityDO> getBargainActivityAppPage(PageParam pageReqVO); 74 + PageResult<BargainActivityDO> getBargainActivityPageForApp(PageParam pageReqVO);
73 75
74 /** 76 /**
75 * 获取 APP 端活动展示数据 77 * 获取 APP 端活动展示数据
76 * 78 *
77 * @param count 需要的数量 79 * @param count 需要的数量
78 - * @return 活动列表 80 + * @return 砍价活动分页
79 */ 81 */
80 - List<BargainActivityDO> getBargainActivityAppList(Integer count); 82 + List<BargainActivityDO> getBargainActivityListForApp(Integer count);
81 83
82 } 84 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
@@ -142,18 +142,20 @@ public class BargainActivityServiceImpl implements BargainActivityService { @@ -142,18 +142,20 @@ public class BargainActivityServiceImpl implements BargainActivityService {
142 } 142 }
143 143
144 @Override 144 @Override
145 - public PageResult<BargainActivityDO> getBargainActivityAppPage(PageParam pageReqVO) { 145 + public PageResult<BargainActivityDO> getBargainActivityPageForApp(PageParam pageReqVO) {
146 // 只查询进行中,且在时间范围内的 146 // 只查询进行中,且在时间范围内的
147 return bargainActivityMapper.selectAppPage(pageReqVO, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now()); 147 return bargainActivityMapper.selectAppPage(pageReqVO, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now());
148 -  
149 } 148 }
150 149
151 @Override 150 @Override
152 - public List<BargainActivityDO> getBargainActivityAppList(Integer count) { 151 + public List<BargainActivityDO> getBargainActivityListForApp(Integer count) {
  152 + // TODO @puhui999:这种 default count 的逻辑,可以放到 controller 哈;然后可以使用 ObjectUtils.default 方法
153 if (count == null) { 153 if (count == null) {
154 count = 6; 154 count = 6;
155 } 155 }
156 - PageResult<BargainActivityDO> result = bargainActivityMapper.selectAppPage(new PageParam().setPageSize(count), CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now()); 156 + // TODO @puhui999:这种不要用 page;会浪费一次 count;
  157 + PageResult<BargainActivityDO> result = bargainActivityMapper.selectAppPage(new PageParam().setPageSize(count),
  158 + CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now());
157 return result.getList(); 159 return result.getList();
158 } 160 }
159 161
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java
@@ -75,6 +75,7 @@ public interface CombinationActivityService { @@ -75,6 +75,7 @@ public interface CombinationActivityService {
75 75
76 /** 76 /**
77 * 校验是否满足拼团条件 77 * 校验是否满足拼团条件
  78 + * 如果不满足,会抛出异常
78 * 79 *
79 * @param activityId 活动编号 80 * @param activityId 活动编号
80 * @param userId 用户编号 81 * @param userId 用户编号
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
@@ -224,6 +224,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -224,6 +224,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
224 throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE); 224 throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE);
225 } 225 }
226 // 1.3 校验是否超出单次限购数量 226 // 1.3 校验是否超出单次限购数量
  227 + // TODO puhui999:count > activity.getSingleLimitCount() 会更好理解点;
227 if (activity.getSingleLimitCount() < count) { 228 if (activity.getSingleLimitCount() < count) {
228 throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED); 229 throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
229 } 230 }
@@ -243,7 +244,6 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -243,7 +244,6 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
243 if (activity.getTotalLimitCount() < countSum) { 244 if (activity.getTotalLimitCount() < countSum) {
244 throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED); 245 throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);
245 } 246 }
246 -  
247 } 247 }
248 248
249 @Override 249 @Override
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
@@ -132,7 +132,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -132,7 +132,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
132 MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId()); 132 MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId());
133 ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId()); 133 ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId());
134 ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId()); 134 ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId());
135 - recordMapper.insert(CombinationActivityConvert.INSTANCE.convert1(reqDTO, activity, user, spu, sku)); 135 + recordMapper.insert(CombinationActivityConvert.INSTANCE.convert(reqDTO, activity, user, spu, sku));
136 } 136 }
137 137
138 @Override 138 @Override
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageApi.java deleted
1 -package cn.iocoder.yudao.module.trade.api.brokerage;  
2 -  
3 -import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;  
4 -import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageUserDTO;  
5 -  
6 -import javax.validation.constraints.NotNull;  
7 -import java.time.LocalDateTime;  
8 -  
9 -// TODO @疯狂:是不是不需要这个啦?  
10 -/**  
11 - * 分销 API 接口  
12 - *  
13 - * @author owen  
14 - */  
15 -public interface BrokerageApi {  
16 -  
17 - /**  
18 - * 获得分销用户  
19 - *  
20 - * @param userId 用户编号  
21 - * @return 分销用户信息  
22 - */  
23 - BrokerageUserDTO getBrokerageUser(Long userId);  
24 -  
25 - /**  
26 - * 【会员】绑定推广员  
27 - *  
28 - * @param userId 用户编号  
29 - * @param bindUserId 推广员编号  
30 - * @param registerTime 用户注册时间  
31 - * @return 是否绑定  
32 - */  
33 - default boolean bindUser(@NotNull Long userId, @NotNull Long bindUserId, @NotNull LocalDateTime registerTime) {  
34 - // 注册时间在30秒内的,都算新用户  
35 - // TODO @疯狂:这个要不抽到 service 里哈?  
36 - boolean isNewUser = LocalDateTimeUtils.afterNow(registerTime.minusSeconds(30));  
37 - return bindUser(userId, bindUserId, isNewUser);  
38 - }  
39 -  
40 - /**  
41 - * 绑定推广员  
42 - *  
43 - * @param userId 用户编号  
44 - * @param bindUserId 推广员编号  
45 - * @param isNewUser 是否为新用户  
46 - * @return 是否绑定  
47 - */  
48 - boolean bindUser(@NotNull(message = "用户编号不能为空") Long userId,  
49 - @NotNull(message = "推广员编号不能为空") Long bindUserId,  
50 - @NotNull Boolean isNewUser);  
51 -  
52 -}  
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageUserDTO.java deleted
1 -package cn.iocoder.yudao.module.trade.api.brokerage.dto;  
2 -  
3 -import lombok.Data;  
4 -  
5 -import java.time.LocalDateTime;  
6 -  
7 -/**  
8 - * 分销用户 DTO  
9 - *  
10 - * @author owen  
11 - */  
12 -@Data  
13 -public class BrokerageUserDTO {  
14 -  
15 - /**  
16 - * 用户编号  
17 - * <p>  
18 - * 对应 MemberUserDO 的 id 字段  
19 - */  
20 - private Long id;  
21 -  
22 - /**  
23 - * 推广员编号  
24 - * <p>  
25 - * 关联 MemberUserDO 的 id 字段  
26 - */  
27 - private Long bindUserId;  
28 - /**  
29 - * 推广员绑定时间  
30 - */  
31 - private LocalDateTime bindUserTime;  
32 -  
33 - /**  
34 - * 推广资格  
35 - */  
36 - private Boolean brokerageEnabled;  
37 - /**  
38 - * 成为分销员时间  
39 - */  
40 - private LocalDateTime brokerageTime;  
41 -  
42 - /**  
43 - * 可用佣金  
44 - */  
45 - private Integer price;  
46 - /**  
47 - * 冻结佣金  
48 - */  
49 - private Integer frozenPrice;  
50 -  
51 -}  
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -88,4 +88,9 @@ public interface ErrorCodeConstants { @@ -88,4 +88,9 @@ public interface ErrorCodeConstants {
88 ErrorCode BROKERAGE_BIND_OVERRIDE = new ErrorCode(1011007006, "已绑定了推广人"); 88 ErrorCode BROKERAGE_BIND_OVERRIDE = new ErrorCode(1011007006, "已绑定了推广人");
89 ErrorCode BROKERAGE_BIND_LOOP = new ErrorCode(1011007007, "下级不能绑定自己的上级"); 89 ErrorCode BROKERAGE_BIND_LOOP = new ErrorCode(1011007007, "下级不能绑定自己的上级");
90 90
  91 +
  92 + // ========== 分销提现 模块 1011008000 ==========
  93 + ErrorCode BROKERAGE_WITHDRAW_NOT_EXISTS = new ErrorCode(1011008000, "佣金提现记录不存在");
  94 + ErrorCode BROKERAGE_WITHDRAW_STATUS_NOT_AUDITING = new ErrorCode(1011008001, "佣金提现记录状态不是审核中");
  95 +
91 } 96 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/MessageTemplateConstants.java
@@ -10,4 +10,7 @@ public interface MessageTemplateConstants { @@ -10,4 +10,7 @@ public interface MessageTemplateConstants {
10 10
11 String ORDER_DELIVERY = "order_delivery"; // 短信模版编号 11 String ORDER_DELIVERY = "order_delivery"; // 短信模版编号
12 12
  13 + String BROKERAGE_WITHDRAW_AUDIT_APPROVE = "brokerage_withdraw_audit_approve"; // 佣金提现(审核通过)
  14 + String BROKERAGE_WITHDRAW_AUDIT_REJECT = "brokerage_withdraw_audit_reject"; // 佣金提现(审核不通过)
  15 +
13 } 16 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageUserTypeEnum.java deleted
1 -package cn.iocoder.yudao.module.trade.enums.brokerage;  
2 -  
3 -import cn.iocoder.yudao.framework.common.core.IntArrayValuable;  
4 -import lombok.AllArgsConstructor;  
5 -import lombok.Getter;  
6 -  
7 -import java.util.Arrays;  
8 -  
9 -// TODO @疯狂:是不是搞成层级,类似 level 这样?因为本质上,它是 1 级、2 级、3 级这样的关系哈  
10 -/**  
11 - * 分销用户类型枚举  
12 - *  
13 - * @author owen  
14 - */  
15 -@AllArgsConstructor  
16 -@Getter  
17 -public enum BrokerageUserTypeEnum implements IntArrayValuable {  
18 -  
19 - ALL(0, "全部"),  
20 - FIRST(1, "一级推广人"),  
21 - SECOND(2, "二级推广人"),  
22 - ;  
23 -  
24 - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageUserTypeEnum::getType).toArray();  
25 -  
26 - /**  
27 - * 类型  
28 - */  
29 - private final Integer type;  
30 - /**  
31 - * 名字  
32 - */  
33 - private final String name;  
34 -  
35 - @Override  
36 - public int[] array() {  
37 - return ARRAYS;  
38 - }  
39 -  
40 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageApiImpl.java deleted
1 -package cn.iocoder.yudao.module.trade.api.brokerage;  
2 -  
3 -import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageUserDTO;  
4 -import cn.iocoder.yudao.module.trade.convert.brokerage.user.BrokerageUserConvert;  
5 -import cn.iocoder.yudao.module.trade.service.brokerage.user.BrokerageUserService;  
6 -import org.springframework.stereotype.Service;  
7 -import org.springframework.validation.annotation.Validated;  
8 -  
9 -import javax.annotation.Resource;  
10 -  
11 -/**  
12 - * 分销 API 接口实现类  
13 - *  
14 - * @author owen  
15 - */  
16 -@Service  
17 -@Validated  
18 -public class BrokerageApiImpl implements BrokerageApi {  
19 -  
20 - @Resource  
21 - private BrokerageUserService brokerageUserService;  
22 -  
23 - @Override  
24 - public BrokerageUserDTO getBrokerageUser(Long userId) {  
25 - return BrokerageUserConvert.INSTANCE.convertDTO(brokerageUserService.getBrokerageUser(userId));  
26 - }  
27 -  
28 - @Override  
29 - public boolean bindUser(Long userId, Long bindUserId, Boolean isNewUser) {  
30 - return brokerageUserService.bindBrokerageUser(userId, bindUserId, isNewUser);  
31 - }  
32 -  
33 -}  
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordBaseVO.java
@@ -57,8 +57,8 @@ public class BrokerageRecordBaseVO { @@ -57,8 +57,8 @@ public class BrokerageRecordBaseVO {
57 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 57 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
58 private LocalDateTime unfreezeTime; 58 private LocalDateTime unfreezeTime;
59 59
60 - @Schema(description = "来源用户类型")  
61 - private Integer sourceUserType; 60 + @Schema(description = "来源用户等级")
  61 + private Integer sourceUserLevel;
62 62
63 @Schema(description = "来源用户编号") 63 @Schema(description = "来源用户编号")
64 private Long sourceUserId; 64 private Long sourceUserId;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/record/vo/BrokerageRecordPageReqVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo; 1 package cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
5 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
6 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
7 import lombok.Data; 5 import lombok.Data;
8 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
@@ -32,8 +30,7 @@ public class BrokerageRecordPageReqVO extends PageParam { @@ -32,8 +30,7 @@ public class BrokerageRecordPageReqVO extends PageParam {
32 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 30 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
33 private LocalDateTime[] createTime; 31 private LocalDateTime[] createTime;
34 32
35 - @Schema(description = "用户类型")  
36 - @InEnum(value = BrokerageUserTypeEnum.class, message = "用户类型必须是 {value}")  
37 - private Integer sourceUserType; 33 + @Schema(description = "用户类型", example = "1")
  34 + private Integer sourceUserLevel;
38 35
39 } 36 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/user/BrokerageUserController.java
@@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.trade.convert.brokerage.user.BrokerageUserConvert @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.trade.convert.brokerage.user.BrokerageUserConvert
9 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; 9 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO;
10 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 10 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
11 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; 11 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
12 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
13 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; 12 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO;
14 import cn.iocoder.yudao.module.trade.service.brokerage.record.BrokerageRecordService; 13 import cn.iocoder.yudao.module.trade.service.brokerage.record.BrokerageRecordService;
15 import cn.iocoder.yudao.module.trade.service.brokerage.user.BrokerageUserService; 14 import cn.iocoder.yudao.module.trade.service.brokerage.user.BrokerageUserService;
@@ -96,7 +95,7 @@ public class BrokerageUserController { @@ -96,7 +95,7 @@ public class BrokerageUserController {
96 // 合计推广用户数量 95 // 合计推广用户数量
97 Map<Long, Long> brokerageUserCountMap = convertMap(userIds, 96 Map<Long, Long> brokerageUserCountMap = convertMap(userIds,
98 userId -> userId, 97 userId -> userId,
99 - userId -> brokerageUserService.getBrokerageUserCountByBindUserId(userId, BrokerageUserTypeEnum.ALL)); 98 + userId -> brokerageUserService.getBrokerageUserCountByBindUserId(userId, null));
100 99
101 // todo 合计提现 100 // todo 合计提现
102 101
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/user/vo/BrokerageUserPageReqVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo; 1 package cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
5 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
6 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
7 import lombok.Data; 5 import lombok.Data;
8 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
@@ -22,18 +20,18 @@ public class BrokerageUserPageReqVO extends PageParam { @@ -22,18 +20,18 @@ public class BrokerageUserPageReqVO extends PageParam {
22 @Schema(description = "推广员编号", example = "4587") 20 @Schema(description = "推广员编号", example = "4587")
23 private Long bindUserId; 21 private Long bindUserId;
24 22
25 - @Schema(description = "推广资格") 23 + @Schema(description = "推广资格", example = "true")
26 private Boolean brokerageEnabled; 24 private Boolean brokerageEnabled;
27 25
28 @Schema(description = "创建时间") 26 @Schema(description = "创建时间")
29 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 27 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
30 private LocalDateTime[] createTime; 28 private LocalDateTime[] createTime;
31 29
32 - @Schema(description = "用户类型")  
33 - @InEnum(value = BrokerageUserTypeEnum.class, message = "用户类型必须是 {value}")  
34 - private Integer userType; 30 + @Schema(description = "用户等级", example = "1") // 注意,这了不是用户的会员等级,而是过滤推广的层级
  31 + private Integer level;
35 32
36 @Schema(description = "绑定时间") 33 @Schema(description = "绑定时间")
37 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 34 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
38 private LocalDateTime[] bindUserTime; 35 private LocalDateTime[] bindUserTime;
  36 +
39 } 37 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/withdraw/BrokerageWithdrawController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  7 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawRejectReqVO;
  8 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawPageReqVO;
  9 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawRespVO;
  10 +import cn.iocoder.yudao.module.trade.convert.brokerage.withdraw.BrokerageWithdrawConvert;
  11 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.withdraw.BrokerageWithdrawDO;
  12 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
  13 +import cn.iocoder.yudao.module.trade.service.brokerage.withdraw.BrokerageWithdrawService;
  14 +import io.swagger.v3.oas.annotations.Operation;
  15 +import io.swagger.v3.oas.annotations.Parameter;
  16 +import io.swagger.v3.oas.annotations.tags.Tag;
  17 +import org.springframework.security.access.prepost.PreAuthorize;
  18 +import org.springframework.validation.annotation.Validated;
  19 +import org.springframework.web.bind.annotation.*;
  20 +
  21 +import javax.annotation.Resource;
  22 +import javax.validation.Valid;
  23 +import java.util.Map;
  24 +
  25 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  26 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  27 +
  28 +@Tag(name = "管理后台 - 佣金提现")
  29 +@RestController
  30 +@RequestMapping("/trade/brokerage-withdraw")
  31 +@Validated
  32 +public class BrokerageWithdrawController {
  33 +
  34 + @Resource
  35 + private BrokerageWithdrawService brokerageWithdrawService;
  36 +
  37 + @Resource
  38 + private MemberUserApi memberUserApi;
  39 +
  40 + @PutMapping("/approve")
  41 + @Operation(summary = "通过申请")
  42 + @PreAuthorize("@ss.hasPermission('trade:brokerage-withdraw:audit')")
  43 + public CommonResult<Boolean> approveBrokerageWithdraw(@RequestParam("id") Integer id) {
  44 + brokerageWithdrawService.auditBrokerageWithdraw(id, BrokerageWithdrawStatusEnum.AUDIT_SUCCESS, "");
  45 + return success(true);
  46 + }
  47 +
  48 + @PutMapping("/reject")
  49 + @Operation(summary = "驳回申请")
  50 + @PreAuthorize("@ss.hasPermission('trade:brokerage-withdraw:audit')")
  51 + public CommonResult<Boolean> rejectBrokerageWithdraw(@Valid @RequestBody BrokerageWithdrawRejectReqVO reqVO) {
  52 + brokerageWithdrawService.auditBrokerageWithdraw(reqVO.getId(), BrokerageWithdrawStatusEnum.AUDIT_FAIL, reqVO.getAuditReason());
  53 + return success(true);
  54 + }
  55 +
  56 + @GetMapping("/get")
  57 + @Operation(summary = "获得佣金提现")
  58 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  59 + @PreAuthorize("@ss.hasPermission('trade:brokerage-withdraw:query')")
  60 + public CommonResult<BrokerageWithdrawRespVO> getBrokerageWithdraw(@RequestParam("id") Integer id) {
  61 + BrokerageWithdrawDO brokerageWithdraw = brokerageWithdrawService.getBrokerageWithdraw(id);
  62 + return success(BrokerageWithdrawConvert.INSTANCE.convert(brokerageWithdraw));
  63 + }
  64 +
  65 + @GetMapping("/page")
  66 + @Operation(summary = "获得佣金提现分页")
  67 + @PreAuthorize("@ss.hasPermission('trade:brokerage-withdraw:query')")
  68 + public CommonResult<PageResult<BrokerageWithdrawRespVO>> getBrokerageWithdrawPage(@Valid BrokerageWithdrawPageReqVO pageVO) {
  69 + // 分页查询
  70 + PageResult<BrokerageWithdrawDO> pageResult = brokerageWithdrawService.getBrokerageWithdrawPage(pageVO);
  71 +
  72 + // 拼接信息
  73 + Map<Long, MemberUserRespDTO> userMap = memberUserApi.getUserMap(
  74 + convertSet(pageResult.getList(), BrokerageWithdrawDO::getUserId));
  75 + return success(BrokerageWithdrawConvert.INSTANCE.convertPage(pageResult, userMap));
  76 + }
  77 +
  78 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/withdraw/vo/BrokerageWithdrawBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +import java.time.LocalDateTime;
  9 +
  10 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +/**
  13 + * 佣金提现 Base VO,提供给添加、修改、详细的子 VO 使用
  14 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  15 + */
  16 +@Data
  17 +public class BrokerageWithdrawBaseVO {
  18 +
  19 + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11436")
  20 + @NotNull(message = "用户编号不能为空")
  21 + private Long userId;
  22 +
  23 + @Schema(description = "提现金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "18781")
  24 + @NotNull(message = "提现金额不能为空")
  25 + private Integer price;
  26 +
  27 + @Schema(description = "提现手续费", requiredMode = Schema.RequiredMode.REQUIRED, example = "11417")
  28 + @NotNull(message = "提现手续费不能为空")
  29 + private Integer feePrice;
  30 +
  31 + @Schema(description = "当前总佣金", requiredMode = Schema.RequiredMode.REQUIRED, example = "18576")
  32 + @NotNull(message = "当前总佣金不能为空")
  33 + private Integer totalPrice;
  34 +
  35 + @Schema(description = "提现类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  36 + @NotNull(message = "提现类型不能为空")
  37 + private Integer type;
  38 +
  39 + @Schema(description = "真实姓名", example = "赵六")
  40 + private String name;
  41 +
  42 + @Schema(description = "账号", example = "88677912132")
  43 + private String accountNo;
  44 +
  45 + @Schema(description = "银行名称", example = "1")
  46 + private String bankName;
  47 +
  48 + @Schema(description = "开户地址", example = "海淀支行")
  49 + private String bankAddress;
  50 +
  51 + @Schema(description = "收款码", example = "https://www.iocoder.cn")
  52 + private String accountQrCodeUrl;
  53 +
  54 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  55 + @NotNull(message = "状态不能为空")
  56 + private Integer status;
  57 +
  58 + @Schema(description = "审核驳回原因", example = "不对")
  59 + private String auditReason;
  60 +
  61 + @Schema(description = "审核时间")
  62 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  63 + private LocalDateTime auditTime;
  64 +
  65 + @Schema(description = "备注", example = "随便")
  66 + private String remark;
  67 +
  68 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/withdraw/vo/BrokerageWithdrawPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
  6 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum;
  7 +import io.swagger.v3.oas.annotations.media.Schema;
  8 +import lombok.Data;
  9 +import lombok.EqualsAndHashCode;
  10 +import lombok.ToString;
  11 +import org.springframework.format.annotation.DateTimeFormat;
  12 +
  13 +import java.time.LocalDateTime;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  16 +
  17 +@Schema(description = "管理后台 - 佣金提现分页 Request VO")
  18 +@Data
  19 +@EqualsAndHashCode(callSuper = true)
  20 +@ToString(callSuper = true)
  21 +public class BrokerageWithdrawPageReqVO extends PageParam {
  22 +
  23 + @Schema(description = "用户编号", example = "11436")
  24 + private Long userId;
  25 +
  26 + @Schema(description = "提现类型", example = "1")
  27 + @InEnum(value = BrokerageWithdrawTypeEnum.class, message = "提现类型必须是 {value}")
  28 + private Integer type;
  29 +
  30 + @Schema(description = "真实姓名", example = "赵六")
  31 + private String name;
  32 +
  33 + @Schema(description = "账号", example = "886779132")
  34 + private String accountNo;
  35 +
  36 + @Schema(description = "银行名称", example = "1")
  37 + private String bankName;
  38 +
  39 + @Schema(description = "状态", example = "1")
  40 + @InEnum(value = BrokerageWithdrawStatusEnum.class, message = "状态必须是 {value}")
  41 + private Integer status;
  42 +
  43 + @Schema(description = "创建时间")
  44 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  45 + private LocalDateTime[] createTime;
  46 +
  47 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/withdraw/vo/BrokerageWithdrawRejectReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.ToString;
  6 +
  7 +import javax.validation.constraints.NotEmpty;
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +@Schema(description = "管理后台 - 驳回申请 Request VO")
  11 +@Data
  12 +@ToString(callSuper = true)
  13 +public class BrokerageWithdrawRejectReqVO {
  14 +
  15 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7161")
  16 + @NotNull(message = "编号不能为空")
  17 + private Integer id;
  18 +
  19 + @Schema(description = "审核驳回原因", example = "不对")
  20 + @NotEmpty(message = "审核驳回原因不能为空")
  21 + private String auditReason;
  22 +
  23 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/withdraw/vo/BrokerageWithdrawRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - 佣金提现 Response VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class BrokerageWithdrawRespVO extends BrokerageWithdrawBaseVO {
  15 +
  16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7161")
  17 + private Integer id;
  18 +
  19 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  20 + private LocalDateTime createTime;
  21 +
  22 + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  23 + private String userNickname;
  24 +
  25 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/record/BrokerageRecordConvert.java
@@ -35,7 +35,7 @@ public interface BrokerageRecordConvert { @@ -35,7 +35,7 @@ public interface BrokerageRecordConvert {
35 35
36 default BrokerageRecordDO convert(BrokerageUserDO user, BrokerageRecordBizTypeEnum bizType, String bizId, 36 default BrokerageRecordDO convert(BrokerageUserDO user, BrokerageRecordBizTypeEnum bizType, String bizId,
37 Integer brokerageFrozenDays, int brokeragePrice, LocalDateTime unfreezeTime, 37 Integer brokerageFrozenDays, int brokeragePrice, LocalDateTime unfreezeTime,
38 - String title, Long sourceUserId, Integer sourceUserType) { 38 + String title, Long sourceUserId, Integer sourceUserLevel) {
39 brokerageFrozenDays = ObjectUtil.defaultIfNull(brokerageFrozenDays, 0); 39 brokerageFrozenDays = ObjectUtil.defaultIfNull(brokerageFrozenDays, 0);
40 // 不冻结时,佣金直接就是结算状态 40 // 不冻结时,佣金直接就是结算状态
41 Integer status = brokerageFrozenDays > 0 41 Integer status = brokerageFrozenDays > 0
@@ -47,7 +47,7 @@ public interface BrokerageRecordConvert { @@ -47,7 +47,7 @@ public interface BrokerageRecordConvert {
47 .setTitle(title) 47 .setTitle(title)
48 .setDescription(StrUtil.format(bizType.getDescription(), String.format("¥%.2f", brokeragePrice / 100d))) 48 .setDescription(StrUtil.format(bizType.getDescription(), String.format("¥%.2f", brokeragePrice / 100d)))
49 .setStatus(status).setFrozenDays(brokerageFrozenDays).setUnfreezeTime(unfreezeTime) 49 .setStatus(status).setFrozenDays(brokerageFrozenDays).setUnfreezeTime(unfreezeTime)
50 - .setSourceUserType(sourceUserType).setSourceUserId(sourceUserId); 50 + .setSourceUserLevel(sourceUserLevel).setSourceUserId(sourceUserId);
51 } 51 }
52 52
53 default PageResult<BrokerageRecordRespVO> convertPage(PageResult<BrokerageRecordDO> pageResult, Map<Long, MemberUserRespDTO> userMap) { 53 default PageResult<BrokerageRecordRespVO> convertPage(PageResult<BrokerageRecordDO> pageResult, Map<Long, MemberUserRespDTO> userMap) {
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/user/BrokerageUserConvert.java
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.trade.convert.brokerage.user; @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.trade.convert.brokerage.user;
3 import cn.hutool.core.map.MapUtil; 3 import cn.hutool.core.map.MapUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 5 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
6 -import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageUserDTO;  
7 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserRespVO; 6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserRespVO;
8 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; 7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO;
9 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; 8 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO;
@@ -56,6 +55,4 @@ public interface BrokerageUserConvert { @@ -56,6 +55,4 @@ public interface BrokerageUserConvert {
56 user -> target.setNickname(user.getNickname()).setAvatar(user.getAvatar())); 55 user -> target.setNickname(user.getNickname()).setAvatar(user.getAvatar()));
57 return target; 56 return target;
58 } 57 }
59 -  
60 - BrokerageUserDTO convertDTO(BrokerageUserDO brokerageUser);  
61 } 58 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/withdraw/BrokerageWithdrawConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.convert.brokerage.withdraw;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawRejectReqVO;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawRespVO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.withdraw.BrokerageWithdrawDO;
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.factory.Mappers;
  10 +
  11 +import java.util.List;
  12 +import java.util.Map;
  13 +import java.util.Optional;
  14 +
  15 +/**
  16 + * 佣金提现 Convert
  17 + *
  18 + * @author 芋道源码
  19 + */
  20 +@Mapper
  21 +public interface BrokerageWithdrawConvert {
  22 +
  23 + BrokerageWithdrawConvert INSTANCE = Mappers.getMapper(BrokerageWithdrawConvert.class);
  24 +
  25 + BrokerageWithdrawDO convert(BrokerageWithdrawRejectReqVO bean);
  26 +
  27 + BrokerageWithdrawRespVO convert(BrokerageWithdrawDO bean);
  28 +
  29 + List<BrokerageWithdrawRespVO> convertList(List<BrokerageWithdrawDO> list);
  30 +
  31 + PageResult<BrokerageWithdrawRespVO> convertPage(PageResult<BrokerageWithdrawDO> page);
  32 +
  33 + default PageResult<BrokerageWithdrawRespVO> convertPage(PageResult<BrokerageWithdrawDO> pageResult, Map<Long, MemberUserRespDTO> userMap) {
  34 + PageResult<BrokerageWithdrawRespVO> result = convertPage(pageResult);
  35 + for (BrokerageWithdrawRespVO vo : result.getList()) {
  36 + vo.setUserNickname(Optional.ofNullable(userMap.get(vo.getUserId())).map(MemberUserRespDTO::getNickname).orElse(null));
  37 + }
  38 + return result;
  39 + }
  40 +
  41 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -27,7 +27,6 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO; @@ -27,7 +27,6 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO;
27 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; 27 import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
28 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 28 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
29 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 29 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
30 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;  
31 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum; 30 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
32 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; 31 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
33 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 32 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
@@ -274,10 +273,10 @@ public interface TradeOrderConvert { @@ -274,10 +273,10 @@ public interface TradeOrderConvert {
274 273
275 TradeOrderDO convert(TradeOrderRemarkReqVO reqVO); 274 TradeOrderDO convert(TradeOrderRemarkReqVO reqVO);
276 275
277 - default BrokerageAddReqBO convert(TradeOrderItemDO item, ProductSkuRespDTO sku) { 276 + default BrokerageAddReqBO convert(MemberUserRespDTO user, TradeOrderItemDO item, ProductSkuRespDTO sku) {
278 return new BrokerageAddReqBO().setBizId(String.valueOf(item.getId())).setSourceUserId(item.getUserId()) 277 return new BrokerageAddReqBO().setBizId(String.valueOf(item.getId())).setSourceUserId(item.getUserId())
279 .setBasePrice(item.getPayPrice() * item.getCount()) 278 .setBasePrice(item.getPayPrice() * item.getCount())
280 - .setTitle(BrokerageRecordBizTypeEnum.ORDER.getTitle()) // TODO @疯狂:标题类似:木晴冰雪成功购买云时代的JVM原理与实战;茫农成功购买深入拆解消息队列47讲 279 + .setTitle(StrUtil.format("{}成功购买{}", user.getNickname(), item.getSpuName()))
281 .setFirstFixedPrice(sku.getFirstBrokeragePrice()).setSecondFixedPrice(sku.getSecondBrokeragePrice()); 280 .setFirstFixedPrice(sku.getFirstBrokeragePrice()).setSecondFixedPrice(sku.getSecondBrokeragePrice());
282 } 281 }
283 282
@@ -292,6 +291,7 @@ public interface TradeOrderConvert { @@ -292,6 +291,7 @@ public interface TradeOrderConvert {
292 @Mapping(target = "userId", source = "userId"), 291 @Mapping(target = "userId", source = "userId"),
293 @Mapping(target = "payPrice", source = "tradeOrderDO.payPrice"), 292 @Mapping(target = "payPrice", source = "tradeOrderDO.payPrice"),
294 }) 293 })
295 - TradeAfterOrderCreateReqBO convert(Long userId, AppTradeOrderCreateReqVO createReqVO, TradeOrderDO tradeOrderDO, TradeOrderItemDO orderItem); 294 + TradeAfterOrderCreateReqBO convert(Long userId, AppTradeOrderCreateReqVO createReqVO,
  295 + TradeOrderDO tradeOrderDO, TradeOrderItemDO orderItem);
296 296
297 } 297 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/record/BrokerageRecordDO.java
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record; @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 4 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
5 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; 5 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
6 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
7 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
8 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
9 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
@@ -83,11 +82,11 @@ public class BrokerageRecordDO extends BaseDO { @@ -83,11 +82,11 @@ public class BrokerageRecordDO extends BaseDO {
83 private LocalDateTime unfreezeTime; 82 private LocalDateTime unfreezeTime;
84 83
85 /** 84 /**
86 - * 来源用户类型 85 + * 来源用户等级
87 * <p> 86 * <p>
88 - * 枚举 {@link BrokerageUserTypeEnum},被推广用户和 {@link #userId} 的推广层级关系 87 + * 被推广用户和 {@link #userId} 的推广层级关系
89 */ 88 */
90 - private Integer sourceUserType; 89 + private Integer sourceUserLevel;
91 /** 90 /**
92 * 来源用户编号 91 * 来源用户编号
93 * <p> 92 * <p>
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/user/BrokerageUserDO.java
@@ -60,4 +60,12 @@ public class BrokerageUserDO extends BaseDO { @@ -60,4 +60,12 @@ public class BrokerageUserDO extends BaseDO {
60 */ 60 */
61 private Integer frozenPrice; 61 private Integer frozenPrice;
62 62
  63 + /**
  64 + * 等级
  65 + */
  66 + private Integer level;
  67 + /**
  68 + * 路径
  69 + */
  70 + private String path;
63 } 71 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/withdraw/BrokerageWithdrawDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.withdraw;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
  5 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum;
  6 +import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableId;
  8 +import com.baomidou.mybatisplus.annotation.TableName;
  9 +import lombok.*;
  10 +
  11 +import java.time.LocalDateTime;
  12 +
  13 +/**
  14 + * 佣金提现 DO
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@TableName("trade_brokerage_withdraw")
  19 +@KeySequence("trade_brokerage_withdraw_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  20 +@Data
  21 +@EqualsAndHashCode(callSuper = true)
  22 +@ToString(callSuper = true)
  23 +@Builder
  24 +@NoArgsConstructor
  25 +@AllArgsConstructor
  26 +public class BrokerageWithdrawDO extends BaseDO {
  27 +
  28 + /**
  29 + * 编号
  30 + */
  31 + @TableId
  32 + private Integer id;
  33 + /**
  34 + * 用户编号
  35 + *
  36 + * 关联 MemberUserDO 的 id 字段
  37 + */
  38 + private Long userId;
  39 +
  40 + /**
  41 + * 提现金额,单位:分
  42 + */
  43 + private Integer price;
  44 + /**
  45 + * 提现手续费,单位:分
  46 + */
  47 + private Integer feePrice;
  48 + /**
  49 + * 当前总佣金,单位:分
  50 + */
  51 + private Integer totalPrice;
  52 + /**
  53 + * 提现类型
  54 + * <p>
  55 + * 枚举 {@link BrokerageWithdrawTypeEnum}
  56 + */
  57 + private Integer type;
  58 +
  59 + /**
  60 + * 真实姓名
  61 + */
  62 + private String name;
  63 + /**
  64 + * 账号
  65 + */
  66 + private String accountNo;
  67 + /**
  68 + * 银行名称
  69 + */
  70 + private String bankName;
  71 + /**
  72 + * 开户地址
  73 + */
  74 + private String bankAddress;
  75 + /**
  76 + * 收款码
  77 + */
  78 + private String accountQrCodeUrl;
  79 + /**
  80 + * 状态
  81 + * <p>
  82 + * 枚举 {@link BrokerageWithdrawStatusEnum}
  83 + */
  84 + private Integer status;
  85 + /**
  86 + * 审核驳回原因
  87 + */
  88 + private String auditReason;
  89 + /**
  90 + * 审核时间
  91 + */
  92 + private LocalDateTime auditTime;
  93 + /**
  94 + * 备注
  95 + */
  96 + private String remark;
  97 +
  98 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/record/BrokerageRecordMapper.java
@@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordPageReqVO; 6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.record.vo.BrokerageRecordPageReqVO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO; 7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.record.BrokerageRecordDO;
8 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
9 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; 8 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO;
10 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 9 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
11 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
@@ -24,14 +23,12 @@ import java.util.List; @@ -24,14 +23,12 @@ import java.util.List;
24 public interface BrokerageRecordMapper extends BaseMapperX<BrokerageRecordDO> { 23 public interface BrokerageRecordMapper extends BaseMapperX<BrokerageRecordDO> {
25 24
26 default PageResult<BrokerageRecordDO> selectPage(BrokerageRecordPageReqVO reqVO) { 25 default PageResult<BrokerageRecordDO> selectPage(BrokerageRecordPageReqVO reqVO) {
27 - boolean sourceUserTypeCondition = reqVO.getSourceUserType() != null &&  
28 - !BrokerageUserTypeEnum.ALL.getType().equals(reqVO.getSourceUserType());  
29 // 分页查询 26 // 分页查询
30 return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageRecordDO>() 27 return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageRecordDO>()
31 .eqIfPresent(BrokerageRecordDO::getUserId, reqVO.getUserId()) 28 .eqIfPresent(BrokerageRecordDO::getUserId, reqVO.getUserId())
32 .eqIfPresent(BrokerageRecordDO::getBizType, reqVO.getBizType()) 29 .eqIfPresent(BrokerageRecordDO::getBizType, reqVO.getBizType())
33 .eqIfPresent(BrokerageRecordDO::getStatus, reqVO.getStatus()) 30 .eqIfPresent(BrokerageRecordDO::getStatus, reqVO.getStatus())
34 - .eq(sourceUserTypeCondition, BrokerageRecordDO::getSourceUserType, reqVO.getSourceUserType()) 31 + .eqIfPresent(BrokerageRecordDO::getSourceUserLevel, reqVO.getSourceUserLevel())
35 .betweenIfPresent(BrokerageRecordDO::getCreateTime, reqVO.getCreateTime()) 32 .betweenIfPresent(BrokerageRecordDO::getCreateTime, reqVO.getCreateTime())
36 .orderByDesc(BrokerageRecordDO::getId)); 33 .orderByDesc(BrokerageRecordDO::getId));
37 } 34 }
@@ -59,4 +56,5 @@ public interface BrokerageRecordMapper extends BaseMapperX&lt;BrokerageRecordDO&gt; { @@ -59,4 +56,5 @@ public interface BrokerageRecordMapper extends BaseMapperX&lt;BrokerageRecordDO&gt; {
59 UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId, 56 UserBrokerageSummaryBO selectCountAndSumPriceByUserIdAndBizTypeAndStatus(@Param("userId") Long userId,
60 @Param("bizType") Integer bizType, 57 @Param("bizType") Integer bizType,
61 @Param("status") Integer status); 58 @Param("status") Integer status);
  59 +
62 } 60 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/user/BrokerageUserMapper.java
1 package cn.iocoder.yudao.module.trade.dal.mysql.brokerage.user; 1 package cn.iocoder.yudao.module.trade.dal.mysql.brokerage.user;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 -import cn.hutool.core.util.StrUtil;  
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
8 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO; 7 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO;
9 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; 8 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO;
10 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
11 -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;  
12 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 9 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
13 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
14 -import org.apache.ibatis.annotations.Select; 11 +
  12 +import java.util.List;
15 13
16 /** 14 /**
17 * 分销用户 Mapper 15 * 分销用户 Mapper
@@ -21,35 +19,16 @@ import org.apache.ibatis.annotations.Select; @@ -21,35 +19,16 @@ import org.apache.ibatis.annotations.Select;
21 @Mapper 19 @Mapper
22 public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> { 20 public interface BrokerageUserMapper extends BaseMapperX<BrokerageUserDO> {
23 21
24 - default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO) { 22 + default PageResult<BrokerageUserDO> selectPage(BrokerageUserPageReqVO reqVO, List<Integer> levels) {
25 return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>() 23 return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageUserDO>()
26 .eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled()) 24 .eqIfPresent(BrokerageUserDO::getBrokerageEnabled, reqVO.getBrokerageEnabled())
27 .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime()) 25 .betweenIfPresent(BrokerageUserDO::getCreateTime, reqVO.getCreateTime())
28 .betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime()) 26 .betweenIfPresent(BrokerageUserDO::getBindUserTime, reqVO.getBindUserTime())
29 - .and(reqVO.getBindUserId() != null, w -> buildBindUserCondition(reqVO, w)) 27 + .findInSetIfPresent(BrokerageUserDO::getPath, reqVO.getBindUserId())
  28 + .inIfPresent(BrokerageUserDO::getLevel, levels)
30 .orderByDesc(BrokerageUserDO::getId)); 29 .orderByDesc(BrokerageUserDO::getId));
31 } 30 }
32 31
33 - static void buildBindUserCondition(BrokerageUserPageReqVO reqVO, LambdaQueryWrapper<BrokerageUserDO> wrapper) {  
34 - if (BrokerageUserTypeEnum.FIRST.getType().equals(reqVO.getUserType())) {  
35 - buildFirstBindUserCondition(reqVO.getBindUserId(), wrapper);  
36 - } else if (BrokerageUserTypeEnum.SECOND.getType().equals(reqVO.getUserType())) {  
37 - buildSecondBindUserCondition(reqVO.getBindUserId(), wrapper);  
38 - } else {  
39 - // TODO @疯狂:要不要把这个逻辑,挪到 Service 里,算出子用户有哪些,然后 IN?  
40 - buildFirstBindUserCondition(reqVO.getBindUserId(), wrapper);  
41 - buildSecondBindUserCondition(reqVO.getBindUserId(), wrapper.or()); // 通过 or 实现多个条件  
42 - }  
43 - }  
44 -  
45 - static void buildFirstBindUserCondition(Long bindUserId, LambdaQueryWrapper<BrokerageUserDO> wrapper) {  
46 - wrapper.eq(BrokerageUserDO::getBindUserId, bindUserId);  
47 - }  
48 -  
49 - static void buildSecondBindUserCondition(Long bindUserId, LambdaQueryWrapper<BrokerageUserDO> wrapper) {  
50 - wrapper.inSql(BrokerageUserDO::getBindUserId, StrUtil.format("SELECT id FROM trade_brokerage_user WHERE bind_user_id = {}", bindUserId));  
51 - }  
52 -  
53 /** 32 /**
54 * 更新用户可用佣金(增加) 33 * 更新用户可用佣金(增加)
55 * 34 *
@@ -128,7 +107,8 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; { @@ -128,7 +107,8 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
128 default void updateBindUserIdAndBindUserTimeToNull(Long id) { 107 default void updateBindUserIdAndBindUserTimeToNull(Long id) {
129 update(null, new LambdaUpdateWrapper<BrokerageUserDO>() 108 update(null, new LambdaUpdateWrapper<BrokerageUserDO>()
130 .eq(BrokerageUserDO::getId, id) 109 .eq(BrokerageUserDO::getId, id)
131 - .set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null)); 110 + .set(BrokerageUserDO::getBindUserId, null).set(BrokerageUserDO::getBindUserTime, null)
  111 + .set(BrokerageUserDO::getLevel, 1).set(BrokerageUserDO::getPath, ""));
132 } 112 }
133 113
134 default void updateEnabledFalseAndBrokerageTimeToNull(Long id) { 114 default void updateEnabledFalseAndBrokerageTimeToNull(Long id) {
@@ -137,11 +117,10 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; { @@ -137,11 +117,10 @@ public interface BrokerageUserMapper extends BaseMapperX&lt;BrokerageUserDO&gt; {
137 .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null)); 117 .set(BrokerageUserDO::getBrokerageEnabled, false).set(BrokerageUserDO::getBrokerageTime, null));
138 } 118 }
139 119
140 - default Long selectCountByBindUserId(Long bindUserId) {  
141 - return selectCount(BrokerageUserDO::getBindUserId, bindUserId); 120 + default Long selectCountByBindUserIdAndLevelIn(Long bindUserId, List<Integer> levels) {
  121 + return selectCount(new LambdaQueryWrapperX<BrokerageUserDO>()
  122 + .findInSetIfPresent(BrokerageUserDO::getPath, bindUserId)
  123 + .inIfPresent(BrokerageUserDO::getLevel, levels));
142 } 124 }
143 125
144 - @Select("SELECT COUNT(1) from trade_brokerage_user WHERE bind_user_id IN (SELECT id FROM trade_brokerage_user WHERE bind_user_id = #{bindUserId})")  
145 - Long selectCountByBindUserIdInBindUserId(Long bindUserId);  
146 -  
147 } 126 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/brokerage/withdraw/BrokerageWithdrawMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.dal.mysql.brokerage.withdraw;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawPageReqVO;
  7 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.withdraw.BrokerageWithdrawDO;
  8 +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +/**
  12 + * 佣金提现 Mapper
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@Mapper
  17 +public interface BrokerageWithdrawMapper extends BaseMapperX<BrokerageWithdrawDO> {
  18 +
  19 + default PageResult<BrokerageWithdrawDO> selectPage(BrokerageWithdrawPageReqVO reqVO) {
  20 + return selectPage(reqVO, new LambdaQueryWrapperX<BrokerageWithdrawDO>()
  21 + .eqIfPresent(BrokerageWithdrawDO::getUserId, reqVO.getUserId())
  22 + .eqIfPresent(BrokerageWithdrawDO::getType, reqVO.getType())
  23 + .likeIfPresent(BrokerageWithdrawDO::getName, reqVO.getName())
  24 + .eqIfPresent(BrokerageWithdrawDO::getAccountNo, reqVO.getAccountNo())
  25 + .likeIfPresent(BrokerageWithdrawDO::getBankName, reqVO.getBankName())
  26 + .eqIfPresent(BrokerageWithdrawDO::getStatus, reqVO.getStatus())
  27 + .betweenIfPresent(BrokerageWithdrawDO::getCreateTime, reqVO.getCreateTime())
  28 + .orderByAsc(BrokerageWithdrawDO::getStatus).orderByDesc(BrokerageWithdrawDO::getId));
  29 + }
  30 +
  31 + default int updateByIdAndStatus(Integer id, Integer status, BrokerageWithdrawDO updateObj) {
  32 + return update(updateObj, new LambdaUpdateWrapper<BrokerageWithdrawDO>()
  33 + .eq(BrokerageWithdrawDO::getId, id)
  34 + .eq(BrokerageWithdrawDO::getStatus, status));
  35 + }
  36 +
  37 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/record/BrokerageRecordServiceImpl.java
@@ -15,7 +15,6 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; @@ -15,7 +15,6 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
15 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.record.BrokerageRecordMapper; 15 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.record.BrokerageRecordMapper;
16 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; 16 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
17 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum; 17 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
18 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
19 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; 18 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
20 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO; 19 import cn.iocoder.yudao.module.trade.service.brokerage.bo.UserBrokerageSummaryBO;
21 import cn.iocoder.yudao.module.trade.service.brokerage.user.BrokerageUserService; 20 import cn.iocoder.yudao.module.trade.service.brokerage.user.BrokerageUserService;
@@ -29,6 +28,7 @@ import javax.annotation.Resource; @@ -29,6 +28,7 @@ import javax.annotation.Resource;
29 import java.time.LocalDateTime; 28 import java.time.LocalDateTime;
30 import java.util.ArrayList; 29 import java.util.ArrayList;
31 import java.util.List; 30 import java.util.List;
  31 +import java.util.Objects;
32 32
33 /** 33 /**
34 * 佣金记录 Service 实现类 34 * 佣金记录 Service 实现类
@@ -74,7 +74,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { @@ -74,7 +74,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
74 } 74 }
75 // 1.2 计算一级分佣 75 // 1.2 计算一级分佣
76 addBrokerage(firstUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageFirstPercent(), 76 addBrokerage(firstUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageFirstPercent(),
77 - bizType, BrokerageUserTypeEnum.FIRST); 77 + bizType, 1);
78 78
79 // 2.1 获得二级推广员 79 // 2.1 获得二级推广员
80 if (firstUser.getBindUserId() == null) { 80 if (firstUser.getBindUserId() == null) {
@@ -86,7 +86,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { @@ -86,7 +86,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
86 } 86 }
87 // 2.2 计算二级分佣 87 // 2.2 计算二级分佣
88 addBrokerage(secondUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageSecondPercent(), 88 addBrokerage(secondUser, list, memberConfig.getBrokerageFrozenDays(), memberConfig.getBrokerageSecondPercent(),
89 - bizType, BrokerageUserTypeEnum.SECOND); 89 + bizType, 2);
90 } 90 }
91 91
92 @Override 92 @Override
@@ -142,10 +142,10 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { @@ -142,10 +142,10 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
142 * @param brokerageFrozenDays 冻结天数 142 * @param brokerageFrozenDays 冻结天数
143 * @param brokeragePercent 佣金比例 143 * @param brokeragePercent 佣金比例
144 * @param bizType 业务类型 144 * @param bizType 业务类型
145 - * @param sourceUserType 来源用户类型 145 + * @param sourceUserLevel 来源用户等级
146 */ 146 */
147 private void addBrokerage(BrokerageUserDO user, List<BrokerageAddReqBO> list, Integer brokerageFrozenDays, 147 private void addBrokerage(BrokerageUserDO user, List<BrokerageAddReqBO> list, Integer brokerageFrozenDays,
148 - Integer brokeragePercent, BrokerageRecordBizTypeEnum bizType, BrokerageUserTypeEnum sourceUserType) { 148 + Integer brokeragePercent, BrokerageRecordBizTypeEnum bizType, Integer sourceUserLevel) {
149 // 1.1 处理冻结时间 149 // 1.1 处理冻结时间
150 LocalDateTime unfreezeTime = null; 150 LocalDateTime unfreezeTime = null;
151 if (brokerageFrozenDays != null && brokerageFrozenDays > 0) { 151 if (brokerageFrozenDays != null && brokerageFrozenDays > 0) {
@@ -157,12 +157,12 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { @@ -157,12 +157,12 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
157 for (BrokerageAddReqBO item : list) { 157 for (BrokerageAddReqBO item : list) {
158 // 计算金额 158 // 计算金额
159 Integer fixedPrice; 159 Integer fixedPrice;
160 - if (BrokerageUserTypeEnum.FIRST.equals(sourceUserType)) { 160 + if (Objects.equals(sourceUserLevel, 1)) {
161 fixedPrice = item.getFirstFixedPrice(); 161 fixedPrice = item.getFirstFixedPrice();
162 - } else if (BrokerageUserTypeEnum.SECOND.equals(sourceUserType)) { 162 + } else if (Objects.equals(sourceUserLevel, 2)) {
163 fixedPrice = item.getSecondFixedPrice(); 163 fixedPrice = item.getSecondFixedPrice();
164 } else { 164 } else {
165 - throw new IllegalArgumentException(StrUtil.format("来源用户({}) 不合法", sourceUserType)); 165 + throw new IllegalArgumentException(StrUtil.format("用户等级({}) 不合法", sourceUserLevel));
166 } 166 }
167 int brokeragePrice = calculatePrice(item.getBasePrice(), brokeragePercent, fixedPrice); 167 int brokeragePrice = calculatePrice(item.getBasePrice(), brokeragePercent, fixedPrice);
168 if (brokeragePrice <= 0) { 168 if (brokeragePrice <= 0) {
@@ -172,7 +172,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService { @@ -172,7 +172,7 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
172 // 创建记录实体 172 // 创建记录实体
173 records.add(BrokerageRecordConvert.INSTANCE.convert(user, bizType, item.getBizId(), 173 records.add(BrokerageRecordConvert.INSTANCE.convert(user, bizType, item.getBizId(),
174 brokerageFrozenDays, brokeragePrice, unfreezeTime, item.getTitle(), 174 brokerageFrozenDays, brokeragePrice, unfreezeTime, item.getTitle(),
175 - item.getSourceUserId(), sourceUserType.getType())); 175 + item.getSourceUserId(), sourceUserLevel));
176 } 176 }
177 if (CollUtil.isEmpty(records)) { 177 if (CollUtil.isEmpty(records)) {
178 return; 178 return;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/user/BrokerageUserService.java
1 package cn.iocoder.yudao.module.trade.service.brokerage.user; 1 package cn.iocoder.yudao.module.trade.service.brokerage.user;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
4 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO; 5 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO;
5 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; 6 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO;
6 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
7 7
  8 +import javax.validation.constraints.NotNull;
  9 +import java.time.LocalDateTime;
8 import java.util.Collection; 10 import java.util.Collection;
9 import java.util.List; 11 import java.util.List;
10 12
@@ -91,10 +93,24 @@ public interface BrokerageUserService { @@ -91,10 +93,24 @@ public interface BrokerageUserService {
91 * 获得推广用户数量 93 * 获得推广用户数量
92 * 94 *
93 * @param bindUserId 绑定的推广员编号 95 * @param bindUserId 绑定的推广员编号
94 - * @param userType 用户类型 96 + * @param level 推广用户等级
95 * @return 推广用户数量 97 * @return 推广用户数量
96 */ 98 */
97 - Long getBrokerageUserCountByBindUserId(Long bindUserId, BrokerageUserTypeEnum userType); 99 + Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level);
  100 +
  101 + /**
  102 + * 【会员】绑定推广员
  103 + *
  104 + * @param userId 用户编号
  105 + * @param bindUserId 推广员编号
  106 + * @param registerTime 用户注册时间
  107 + * @return 是否绑定
  108 + */
  109 + default boolean bindBrokerageUser(@NotNull Long userId, @NotNull Long bindUserId, @NotNull LocalDateTime registerTime) {
  110 + // 注册时间在30秒内的,都算新用户
  111 + boolean isNewUser = LocalDateTimeUtils.afterNow(registerTime.minusSeconds(30));
  112 + return bindBrokerageUser(userId, bindUserId, isNewUser);
  113 + }
98 114
99 /** 115 /**
100 * 【会员】绑定推广员 116 * 【会员】绑定推广员
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/user/BrokerageUserServiceImpl.java
1 package cn.iocoder.yudao.module.trade.service.brokerage.user; 1 package cn.iocoder.yudao.module.trade.service.brokerage.user;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
4 import cn.hutool.core.util.BooleanUtil; 5 import cn.hutool.core.util.BooleanUtil;
  6 +import cn.hutool.core.util.ObjectUtil;
  7 +import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO; 9 import cn.iocoder.yudao.module.trade.controller.admin.brokerage.user.vo.BrokerageUserPageReqVO;
7 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO; 10 import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.user.BrokerageUserDO;
@@ -9,17 +12,13 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; @@ -9,17 +12,13 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO;
9 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.user.BrokerageUserMapper; 12 import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.user.BrokerageUserMapper;
10 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageBindModeEnum; 13 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageBindModeEnum;
11 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageEnabledConditionEnum; 14 import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageEnabledConditionEnum;
12 -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageUserTypeEnum;  
13 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService; 15 import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
14 import org.springframework.stereotype.Service; 16 import org.springframework.stereotype.Service;
15 import org.springframework.validation.annotation.Validated; 17 import org.springframework.validation.annotation.Validated;
16 18
17 import javax.annotation.Resource; 19 import javax.annotation.Resource;
18 import java.time.LocalDateTime; 20 import java.time.LocalDateTime;
19 -import java.util.Collection;  
20 -import java.util.List;  
21 -import java.util.Objects;  
22 -import java.util.Optional; 21 +import java.util.*;
23 22
24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 23 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
25 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; 24 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
@@ -51,7 +50,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -51,7 +50,8 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
51 50
52 @Override 51 @Override
53 public PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) { 52 public PageResult<BrokerageUserDO> getBrokerageUserPage(BrokerageUserPageReqVO pageReqVO) {
54 - return brokerageUserMapper.selectPage(pageReqVO); 53 + List<Integer> levels = buildUserQueryLevels(pageReqVO.getBindUserId(), pageReqVO.getLevel());
  54 + return brokerageUserMapper.selectPage(pageReqVO, levels);
55 } 55 }
56 56
57 @Override 57 @Override
@@ -66,10 +66,15 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -66,10 +66,15 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
66 return; 66 return;
67 } 67 }
68 68
  69 + // 绑定关系未发生变化
  70 + // TODO @疯狂:这个放到“情况一”之前,貌似也没关系?
  71 + if (Objects.equals(brokerageUser.getBindUserId(), bindUserId)) {
  72 + return;
  73 + }
  74 +
69 // 情况二:修改推广员 75 // 情况二:修改推广员
70 validateCanBindUser(brokerageUser, bindUserId); 76 validateCanBindUser(brokerageUser, bindUserId);
71 - brokerageUserMapper.updateById(new BrokerageUserDO().setId(id)  
72 - .setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())); 77 + brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(id)));
73 } 78 }
74 79
75 @Override 80 @Override
@@ -132,19 +137,12 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -132,19 +137,12 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
132 } 137 }
133 138
134 @Override 139 @Override
135 - public Long getBrokerageUserCountByBindUserId(Long bindUserId, BrokerageUserTypeEnum userType) {  
136 - switch (userType) {  
137 - case ALL: // TODO @疯狂:ALL 是不是不用搞个枚举,默认为空就是不过滤哈~  
138 - Long firstCount = brokerageUserMapper.selectCountByBindUserId(bindUserId);  
139 - Long secondCount = brokerageUserMapper.selectCountByBindUserIdInBindUserId(bindUserId);  
140 - return firstCount + secondCount;  
141 - case FIRST:  
142 - return brokerageUserMapper.selectCountByBindUserId(bindUserId);  
143 - case SECOND:  
144 - return brokerageUserMapper.selectCountByBindUserIdInBindUserId(bindUserId);  
145 - default:  
146 - return 0L; 140 + public Long getBrokerageUserCountByBindUserId(Long bindUserId, Integer level) {
  141 + List<Integer> levels = buildUserQueryLevels(bindUserId, level);
  142 + if (CollUtil.isEmpty(levels)) {
  143 + return 0L;
147 } 144 }
  145 + return brokerageUserMapper.selectCountByBindUserIdAndLevelIn(bindUserId, levels);
148 } 146 }
149 147
150 @Override 148 @Override
@@ -171,14 +169,30 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -171,14 +169,30 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
171 brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now()); 169 brokerageUser.setBrokerageEnabled(true).setBrokerageTime(LocalDateTime.now());
172 } 170 }
173 brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now()); 171 brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now());
174 - brokerageUserMapper.insert(brokerageUser); 172 + brokerageUserMapper.insert(fillBindUserData(bindUserId, brokerageUser));
175 } else { 173 } else {
176 - brokerageUserMapper.updateById(new BrokerageUserDO().setId(userId)  
177 - .setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())); 174 + brokerageUserMapper.updateById(fillBindUserData(bindUserId, new BrokerageUserDO().setId(userId)));
178 } 175 }
179 return true; 176 return true;
180 } 177 }
181 178
  179 + private BrokerageUserDO fillBindUserData(Long bindUserId, BrokerageUserDO brokerageUser) {
  180 + BrokerageUserDO bindUser = getBrokerageUser(bindUserId);
  181 +
  182 + Integer bindUserLevel = 0;
  183 + String bindUserPath = "";
  184 + if (bindUser != null) {
  185 + bindUserLevel = ObjectUtil.defaultIfNull(bindUser.getLevel(), 0);
  186 + bindUserPath = bindUser.getPath();
  187 + }
  188 +
  189 + String path = StrUtil.isEmpty(bindUserPath)
  190 + ? String.valueOf(bindUserId)
  191 + : String.format("%s,%s", bindUserPath, bindUserId);
  192 + return brokerageUser.setBindUserId(bindUserId).setBindUserTime(LocalDateTime.now())
  193 + .setLevel(bindUserLevel + 1).setPath(path);
  194 + }
  195 +
182 @Override 196 @Override
183 public Boolean getUserBrokerageEnabled(Long userId) { 197 public Boolean getUserBrokerageEnabled(Long userId) {
184 // 全局分销功能是否开启 198 // 全局分销功能是否开启
@@ -231,11 +245,30 @@ public class BrokerageUserServiceImpl implements BrokerageUserService { @@ -231,11 +245,30 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
231 throw exception(BROKERAGE_BIND_SELF); 245 throw exception(BROKERAGE_BIND_SELF);
232 } 246 }
233 247
234 - // TODO @疯狂:这块是不是一直查询到根节点,中间不允许出现自己;就是不能形成环。虽然目前是 2 级,但是未来可能会改多级; = = 环的话,就会存在问题哈  
235 - // A->B->A:下级不能绑定自己的上级, A->B->C->A可以!!  
236 - if (Objects.equals(user.getId(), bindUser.getBindUserId())) { 248 + // 下级不能绑定自己的上级
  249 + if (StrUtil.split(bindUser.getPath(), ",").contains(String.valueOf(user.getId()))) {
237 throw exception(BROKERAGE_BIND_LOOP); 250 throw exception(BROKERAGE_BIND_LOOP);
238 } 251 }
239 } 252 }
240 253
  254 + // TODO @芋艿:这个层级,要微信讨论下;
  255 + private List<Integer> buildUserQueryLevels(Long bindUserId, Integer level) {
  256 + List<Integer> levels = new ArrayList<>(2);
  257 +
  258 + BrokerageUserDO bindUser = getBrokerageUser(bindUserId);
  259 + if (bindUser == null) {
  260 + return levels;
  261 + }
  262 +
  263 + if (level == null) {
  264 + // 默认查两层
  265 + levels.add(bindUser.getLevel() + 1);
  266 + levels.add(bindUser.getLevel() + 2);
  267 + } else {
  268 + levels.add(bindUser.getLevel() + level);
  269 + }
  270 + return levels;
  271 +
  272 + }
  273 +
241 } 274 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/withdraw/BrokerageWithdrawService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage.withdraw;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawPageReqVO;
  5 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.withdraw.BrokerageWithdrawDO;
  6 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
  7 +
  8 +/**
  9 + * 佣金提现 Service 接口
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +public interface BrokerageWithdrawService {
  14 +
  15 + /**
  16 + * 审核佣金提现
  17 + *
  18 + * @param id 佣金编号
  19 + * @param status 审核状态
  20 + * @param auditReason 驳回原因
  21 + */
  22 +
  23 + void auditBrokerageWithdraw(Integer id, BrokerageWithdrawStatusEnum status, String auditReason);
  24 +
  25 + /**
  26 + * 获得佣金提现
  27 + *
  28 + * @param id 编号
  29 + * @return 佣金提现
  30 + */
  31 + BrokerageWithdrawDO getBrokerageWithdraw(Integer id);
  32 +
  33 + /**
  34 + * 获得佣金提现分页
  35 + *
  36 + * @param pageReqVO 分页查询
  37 + * @return 佣金提现分页
  38 + */
  39 + PageResult<BrokerageWithdrawDO> getBrokerageWithdrawPage(BrokerageWithdrawPageReqVO pageReqVO);
  40 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/withdraw/BrokerageWithdrawServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.brokerage.withdraw;
  2 +
  3 +import cn.hutool.core.date.LocalDateTimeUtil;
  4 +import cn.hutool.core.map.MapUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
  8 +import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
  9 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawPageReqVO;
  10 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.withdraw.BrokerageWithdrawDO;
  11 +import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.withdraw.BrokerageWithdrawMapper;
  12 +import cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants;
  13 +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
  14 +import cn.iocoder.yudao.module.trade.service.brokerage.record.BrokerageRecordService;
  15 +import org.springframework.stereotype.Service;
  16 +import org.springframework.transaction.annotation.Transactional;
  17 +import org.springframework.validation.annotation.Validated;
  18 +
  19 +import javax.annotation.Resource;
  20 +import java.time.LocalDateTime;
  21 +import java.util.Map;
  22 +
  23 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  24 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.BROKERAGE_WITHDRAW_NOT_EXISTS;
  25 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.BROKERAGE_WITHDRAW_STATUS_NOT_AUDITING;
  26 +
  27 +/**
  28 + * 佣金提现 Service 实现类
  29 + *
  30 + * @author 芋道源码
  31 + */
  32 +@Service
  33 +@Validated
  34 +public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
  35 +
  36 + @Resource
  37 + private BrokerageWithdrawMapper brokerageWithdrawMapper;
  38 +
  39 + @Resource
  40 + private BrokerageRecordService brokerageRecordService;
  41 +
  42 + @Resource
  43 + private NotifyMessageSendApi notifyMessageSendApi;
  44 +
  45 + @Override
  46 + @Transactional(rollbackFor = Exception.class)
  47 + public void auditBrokerageWithdraw(Integer id, BrokerageWithdrawStatusEnum status, String auditReason) {
  48 + // 1.1 校验存在
  49 + BrokerageWithdrawDO withdraw = validateBrokerageWithdrawExists(id);
  50 + // 1.2 校验状态为审核中
  51 + if (ObjectUtil.notEqual(BrokerageWithdrawStatusEnum.AUDITING.getStatus(), withdraw.getStatus())) {
  52 + throw exception(BROKERAGE_WITHDRAW_STATUS_NOT_AUDITING);
  53 + }
  54 +
  55 + // 2. 更新
  56 + BrokerageWithdrawDO updateObj = new BrokerageWithdrawDO()
  57 + .setStatus(status.getStatus())
  58 + .setAuditReason(auditReason)
  59 + .setAuditTime(LocalDateTime.now());
  60 + int rows = brokerageWithdrawMapper.updateByIdAndStatus(id, BrokerageWithdrawStatusEnum.AUDITING.getStatus(), updateObj);
  61 + if (rows == 0) {
  62 + throw exception(BROKERAGE_WITHDRAW_STATUS_NOT_AUDITING);
  63 + }
  64 +
  65 + // 3. 驳回时需要退还用户佣金
  66 + String templateCode = MessageTemplateConstants.BROKERAGE_WITHDRAW_AUDIT_APPROVE;
  67 + if (BrokerageWithdrawStatusEnum.AUDIT_FAIL.equals(status)) {
  68 + templateCode = MessageTemplateConstants.BROKERAGE_WITHDRAW_AUDIT_REJECT;
  69 +
  70 + // todo @owen
  71 +// brokerageRecordService.addBrokerage(withdraw.getUserId(), BrokerageRecordBizTypeEnum.WITHDRAW, withdraw.getPrice(), "");
  72 + }
  73 +
  74 + // 4. 通知用户
  75 + Map<String, Object> templateParams = MapUtil.<String, Object>builder()
  76 + .put("createTime", LocalDateTimeUtil.formatNormal(withdraw.getCreateTime()))
  77 + .put("price", String.format("%.2f", withdraw.getPrice() / 100d))
  78 + .put("reason", withdraw.getAuditReason())
  79 + .build();
  80 + NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO()
  81 + .setUserId(withdraw.getUserId())
  82 + .setTemplateCode(templateCode).setTemplateParams(templateParams);
  83 + notifyMessageSendApi.sendSingleMessageToMember(reqDTO);
  84 + }
  85 +
  86 + private BrokerageWithdrawDO validateBrokerageWithdrawExists(Integer id) {
  87 + BrokerageWithdrawDO withdraw = brokerageWithdrawMapper.selectById(id);
  88 + if (withdraw == null) {
  89 + throw exception(BROKERAGE_WITHDRAW_NOT_EXISTS);
  90 + }
  91 + return withdraw;
  92 + }
  93 +
  94 + @Override
  95 + public BrokerageWithdrawDO getBrokerageWithdraw(Integer id) {
  96 + return brokerageWithdrawMapper.selectById(id);
  97 + }
  98 +
  99 + @Override
  100 + public PageResult<BrokerageWithdrawDO> getBrokerageWithdrawPage(BrokerageWithdrawPageReqVO pageReqVO) {
  101 + return brokerageWithdrawMapper.selectPage(pageReqVO);
  102 + }
  103 +
  104 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -12,6 +12,8 @@ import cn.iocoder.yudao.module.member.api.address.AddressApi; @@ -12,6 +12,8 @@ import cn.iocoder.yudao.module.member.api.address.AddressApi;
12 import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; 12 import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
13 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; 13 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
14 import cn.iocoder.yudao.module.member.api.point.MemberPointApi; 14 import cn.iocoder.yudao.module.member.api.point.MemberPointApi;
  15 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  16 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
15 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 17 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
16 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; 18 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
17 import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; 19 import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
@@ -115,6 +117,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -115,6 +117,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
115 @Resource 117 @Resource
116 private BargainRecordApi bargainRecordApi; 118 private BargainRecordApi bargainRecordApi;
117 @Resource 119 @Resource
  120 + private MemberUserApi memberUserApi;
  121 + @Resource
118 private MemberLevelApi memberLevelApi; 122 private MemberLevelApi memberLevelApi;
119 @Resource 123 @Resource
120 private MemberPointApi memberPointApi; 124 private MemberPointApi memberPointApi;
@@ -782,9 +786,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -782,9 +786,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
782 786
783 @Async 787 @Async
784 protected void addBrokerageAsync(Long userId, Long orderId) { 788 protected void addBrokerageAsync(Long userId, Long orderId) {
  789 + MemberUserRespDTO user = memberUserApi.getUser(userId);
  790 + Assert.notNull(user);
  791 +
785 List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(orderId); 792 List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(orderId);
786 List<BrokerageAddReqBO> list = convertList(orderItems, 793 List<BrokerageAddReqBO> list = convertList(orderItems,
787 - item -> TradeOrderConvert.INSTANCE.convert(item, productSkuApi.getSku(item.getSkuId()))); 794 + item -> TradeOrderConvert.INSTANCE.convert(user, item, productSkuApi.getSku(item.getSkuId())));
788 brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, list); 795 brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, list);
789 } 796 }
790 797
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java
@@ -14,6 +14,8 @@ import javax.validation.constraints.NotNull; @@ -14,6 +14,8 @@ import javax.validation.constraints.NotNull;
14 @Data 14 @Data
15 public class TradeBeforeOrderCreateReqBO { 15 public class TradeBeforeOrderCreateReqBO {
16 16
  17 + // TODO @puhui999:注释也写下哈;bo 还是写注释噢
  18 +
17 @NotNull(message = "订单类型不能为空") 19 @NotNull(message = "订单类型不能为空")
18 private Integer orderType; 20 private Integer orderType;
19 21
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/withdraw/BrokerageWithdrawServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.withdraw;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.withdraw.vo.BrokerageWithdrawPageReqVO;
  6 +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.withdraw.BrokerageWithdrawDO;
  7 +import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.withdraw.BrokerageWithdrawMapper;
  8 +import cn.iocoder.yudao.module.trade.service.brokerage.withdraw.BrokerageWithdrawServiceImpl;
  9 +import org.junit.jupiter.api.Disabled;
  10 +import org.junit.jupiter.api.Test;
  11 +import org.springframework.context.annotation.Import;
  12 +
  13 +import javax.annotation.Resource;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
  16 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  17 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  18 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  19 +import static org.junit.jupiter.api.Assertions.assertEquals;
  20 +
  21 +// TODO 芋艿:后续 review
  22 +/**
  23 + * {@link BrokerageWithdrawServiceImpl} 的单元测试类
  24 + *
  25 + * @author 芋道源码
  26 + */
  27 +@Import(BrokerageWithdrawServiceImpl.class)
  28 +public class BrokerageWithdrawServiceImplTest extends BaseDbUnitTest {
  29 +
  30 + @Resource
  31 + private BrokerageWithdrawServiceImpl brokerageWithdrawService;
  32 +
  33 + @Resource
  34 + private BrokerageWithdrawMapper brokerageWithdrawMapper;
  35 +
  36 + @Test
  37 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  38 + public void testGetBrokerageWithdrawPage() {
  39 + // mock 数据
  40 + BrokerageWithdrawDO dbBrokerageWithdraw = randomPojo(BrokerageWithdrawDO.class, o -> { // 等会查询到
  41 + o.setUserId(null);
  42 + o.setType(null);
  43 + o.setName(null);
  44 + o.setAccountNo(null);
  45 + o.setBankName(null);
  46 + o.setStatus(null);
  47 + o.setCreateTime(null);
  48 + });
  49 + brokerageWithdrawMapper.insert(dbBrokerageWithdraw);
  50 + // 测试 userId 不匹配
  51 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setUserId(null)));
  52 + // 测试 type 不匹配
  53 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setType(null)));
  54 + // 测试 name 不匹配
  55 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setName(null)));
  56 + // 测试 accountNo 不匹配
  57 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setAccountNo(null)));
  58 + // 测试 bankName 不匹配
  59 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setBankName(null)));
  60 + // 测试 status 不匹配
  61 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setStatus(null)));
  62 + // 测试 auditReason 不匹配
  63 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setAuditReason(null)));
  64 + // 测试 auditTime 不匹配
  65 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setAuditTime(null)));
  66 + // 测试 remark 不匹配
  67 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setRemark(null)));
  68 + // 测试 createTime 不匹配
  69 + brokerageWithdrawMapper.insert(cloneIgnoreId(dbBrokerageWithdraw, o -> o.setCreateTime(null)));
  70 + // 准备参数
  71 + BrokerageWithdrawPageReqVO reqVO = new BrokerageWithdrawPageReqVO();
  72 + reqVO.setUserId(null);
  73 + reqVO.setType(null);
  74 + reqVO.setName(null);
  75 + reqVO.setAccountNo(null);
  76 + reqVO.setBankName(null);
  77 + reqVO.setStatus(null);
  78 + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  79 +
  80 + // 调用
  81 + PageResult<BrokerageWithdrawDO> pageResult = brokerageWithdrawService.getBrokerageWithdrawPage(reqVO);
  82 + // 断言
  83 + assertEquals(1, pageResult.getTotal());
  84 + assertEquals(1, pageResult.getList().size());
  85 + assertPojoEquals(dbBrokerageWithdraw, pageResult.getList().get(0));
  86 + }
  87 +
  88 +}
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/clean.sql
@@ -4,3 +4,4 @@ DELETE FROM trade_after_sale; @@ -4,3 +4,4 @@ DELETE FROM trade_after_sale;
4 DELETE FROM trade_after_sale_log; 4 DELETE FROM trade_after_sale_log;
5 DELETE FROM trade_brokerage_user; 5 DELETE FROM trade_brokerage_user;
6 DELETE FROM trade_brokerage_record; 6 DELETE FROM trade_brokerage_record;
  7 +DELETE FROM "trade_brokerage_withdraw";
yudao-module-mall/yudao-module-trade-biz/src/test/resources/sql/create_tables.sql
@@ -163,4 +163,29 @@ CREATE TABLE IF NOT EXISTS &quot;trade_brokerage_record&quot; @@ -163,4 +163,29 @@ CREATE TABLE IF NOT EXISTS &quot;trade_brokerage_record&quot;
163 "deleted" bit NOT NULL DEFAULT FALSE, 163 "deleted" bit NOT NULL DEFAULT FALSE,
164 "tenant_id" bigint not null default '0', 164 "tenant_id" bigint not null default '0',
165 PRIMARY KEY ("id") 165 PRIMARY KEY ("id")
166 -) COMMENT '佣金记录';  
167 \ No newline at end of file 166 \ No newline at end of file
  167 +) COMMENT '佣金记录';
  168 +CREATE TABLE IF NOT EXISTS "trade_brokerage_withdraw"
  169 +(
  170 + "id" int NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  171 + "user_id" bigint NOT NULL,
  172 + "price" int NOT NULL,
  173 + "fee_price" int NOT NULL,
  174 + "total_price" int NOT NULL,
  175 + "type" varchar NOT NULL,
  176 + "name" varchar,
  177 + "account_no" varchar,
  178 + "bank_name" varchar,
  179 + "bank_address" varchar,
  180 + "account_qr_code_url" varchar,
  181 + "status" varchar NOT NULL,
  182 + "audit_reason" varchar,
  183 + "audit_time" varchar,
  184 + "remark" varchar,
  185 + "creator" varchar DEFAULT '',
  186 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  187 + "updater" varchar DEFAULT '',
  188 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  189 + "deleted" bit NOT NULL DEFAULT FALSE,
  190 + "tenant_id" bigint not null default '0',目
  191 + PRIMARY KEY ("id")
  192 +) COMMENT '佣金提现';
168 \ No newline at end of file 193 \ No newline at end of file
yudao-server/src/main/resources/application-local.yaml
@@ -44,31 +44,31 @@ spring: @@ -44,31 +44,31 @@ spring:
44 primary: master 44 primary: master
45 datasource: 45 datasource:
46 master: 46 master:
47 - name: mall  
48 - url: jdbc:mysql://10.211.55.5:3308/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 47 + name: ruoyi-vue-pro
  48 + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
49 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 49 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
50 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例 50 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
51 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 51 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
52 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 52 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
53 username: root 53 username: root
54 - password: 1qaz!QAZ 54 + password: 123456
55 # username: sa 55 # username: sa
56 # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W 56 # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
57 slave: # 模拟从库,可根据自己需要修改 57 slave: # 模拟从库,可根据自己需要修改
58 - name: mall  
59 - url: jdbc:mysql://10.211.55.5:3308/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 58 + name: ruoyi-vue-pro
  59 + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
60 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 60 # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例
61 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 61 # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例
62 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 62 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
63 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 63 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例
64 username: root 64 username: root
65 - password: 1qaz!QAZ 65 + password: 123456
66 # username: sa 66 # username: sa
67 # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W 67 # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W
68 68
69 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 69 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
70 redis: 70 redis:
71 - host: 10.211.55.5 # 地址 71 + host: 127.0.0.1 # 地址
72 port: 6379 # 端口 72 port: 6379 # 端口
73 database: 0 # 数据库索引 73 database: 0 # 数据库索引
74 # password: dev # 密码,建议生产环境开启 74 # password: dev # 密码,建议生产环境开启