getChildUserIdsByBinduserId(Long bindUserId,Integer level);
+}
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageWithDrawApi.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageWithDrawApi.java
new file mode 100644
index 0000000..f828d8b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageWithDrawApi.java
@@ -0,0 +1,9 @@
+package cn.iocoder.yudao.module.trade.api.brokerage;
+
+public interface BrokerageWithDrawApi {
+
+
+
+ int updateBrokeageWithDrawById(Long id,String transferBillNo,String transferStatus,String pkInfo,Integer status);
+
+}
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageRecordPageReqDTO.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageRecordPageReqDTO.java
new file mode 100644
index 0000000..5eea066
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageRecordPageReqDTO.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.trade.api.brokerage.dto;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 代理商订单分页 Request DTO")
+@Data
+public class BrokerageRecordPageReqDTO extends PageParam {
+
+ @Schema(description = "用户编号", example = "25973")
+ private Long userId;
+
+ @Schema(description = "业务类型", example = "1")
+ private Integer bizType;
+
+ @Schema(description = "状态", example = "1")
+ private Integer status;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "用户类型", example = "1")
+ private Integer sourceUserLevel;
+
+ @Schema(description = "代理商id", example = "1")
+ private Long agentId;
+
+ @Schema(description = "代理商等级", example = "1")
+ private Long agentLevel;
+
+ @Schema(description = "状态", example = "1")
+ private Integer tradeOrderStatus;
+}
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageRecordRespDTO.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageRecordRespDTO.java
new file mode 100644
index 0000000..3a4fd1a
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageRecordRespDTO.java
@@ -0,0 +1,186 @@
+package cn.iocoder.yudao.module.trade.api.brokerage.dto;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
+import cn.iocoder.yudao.module.trade.enums.DictTypeConstants;
+import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordStatusEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ExcelIgnoreUnannotated
+public class BrokerageRecordRespDTO {
+ /**
+ * 编号
+ */
+ @TableId
+ private Integer id;
+ /**
+ * 用户编号
+ *
+ * 关联 MemberUserDO.id
+ */
+ private Long userId;
+ /**
+ * 业务编号
+ */
+ private String bizId;
+ /**
+ * 业务类型
+ *
+ * 枚举 {@link BrokerageRecordBizTypeEnum}
+ */
+ @ExcelProperty(value = "业务类型",converter = DictConvert.class)
+ @DictFormat(DictTypeConstants.BROKERAGE_RECORD_BIZ_TYPE)
+ private Integer bizType;
+
+ /**
+ * 标题
+ */
+ private String title;
+ /**
+ * 说明
+ */
+ private String description;
+
+ /**
+ * 金额
+ */
+ @ExcelProperty(value = "分红金额", converter = MoneyConvert.class)
+ private Integer price;
+ /**
+ * 当前总佣金
+ */
+ private Integer totalPrice;
+
+ /**
+ * 状态
+ *
+ * 枚举 {@link BrokerageRecordStatusEnum}
+ */
+ private Integer status;
+
+ /**
+ * 冻结时间(天)
+ */
+ private Integer frozenDays;
+ /**
+ * 解冻时间
+ */
+ private LocalDateTime unfreezeTime;
+
+ /**
+ * 来源用户等级
+ *
+ * 被推广用户和 {@link #userId} 的推广层级关系
+ */
+ private Integer sourceUserLevel;
+ /**
+ * 来源用户编号
+ *
+ * 关联 MemberUserDO.id 字段,被推广用户的编号
+ */
+ private Long sourceUserId;
+
+ /*
+ * 流水订单号
+ * */
+ @ExcelProperty("订单编号")
+ private String no;
+
+ /*
+ * 购买的商品数量
+ * */
+ private Integer productCount;
+
+ /*
+ * 订单详情id
+ * */
+ private Long tradeOrderItemId;
+
+ /*
+ * 商品id
+ * */
+ private Long spuId;
+
+ /*
+ 商品名称
+ */
+ private String spuName;
+
+ /*
+ 商品图片
+ */
+ @ExcelProperty("商品图片")
+ private String picUrl;
+
+ /*
+ * 下单时间
+ * */
+ @ExcelProperty("下单时间")
+ private LocalDateTime orderTime;
+
+ /*
+ * 商品价格
+ * */
+ private Integer productPrice;
+
+ /*
+ * 代理商id
+ * */
+ private Long agentId;
+
+
+ /*
+ * 代理商等级id
+ * */
+ private Long agentLevel;
+
+
+ /*
+ * 代理商名称
+ * */
+ private String agentName;
+
+ /*
+ * 地区编码
+ * */
+ private Integer areaId;
+
+ /*
+ * 应付金额
+ * */
+ @ExcelProperty(value = "付款金额", converter = MoneyConvert.class)
+ private Integer payPrice;
+
+ /**
+ * 是否已支付
+ *
+ * true - 已经支付过
+ * false - 没有支付过
+ */
+ private Boolean payStatus;
+
+ /**
+ * 订单状态
+ *
+ * 枚举 {@link TradeOrderStatusEnum}
+ */
+ @ExcelProperty(value = "订单状态", converter = DictConvert.class)
+ @DictFormat(DictTypeConstants.TRADE_ORDER_STATUS)
+ private Integer tradeOrderStatus;
+
+ @ExcelProperty("商品信息")
+ private String productInfo;
+
+ @ExcelProperty("归属")
+ private String belong;
+
+}
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageUserRespDTO.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageUserRespDTO.java
new file mode 100644
index 0000000..9bd485b
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/dto/BrokerageUserRespDTO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.trade.api.brokerage.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class BrokerageUserRespDTO {
+ /**
+ * 用户编号
+ *
+ * 对应 MemberUserDO 的 id 字段
+ */
+ private Long id;
+
+ /**
+ * 推广员编号
+ *
+ * 关联 MemberUserDO 的 id 字段
+ */
+ private Long bindUserId;
+ /**
+ * 推广员绑定时间
+ */
+ private LocalDateTime bindUserTime;
+
+ /**
+ * 是否有分销资格
+ */
+ private Boolean brokerageEnabled;
+ /**
+ * 成为分销员时间
+ */
+ private LocalDateTime brokerageTime;
+
+ /**
+ * 可用佣金
+ */
+ private Integer brokeragePrice;
+ /**
+ * 冻结佣金
+ */
+ private Integer frozenPrice;
+
+ /*
+ * 推广用户数量
+ * */
+ private Integer brokerageUserCount;
+}
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/DictTypeConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/DictTypeConstants.java
index ff09e59..e878324 100644
--- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/DictTypeConstants.java
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/DictTypeConstants.java
@@ -9,4 +9,35 @@ public interface DictTypeConstants {
String BROKERAGE_WITHDRAW_STATUS = "brokerage_withdraw_status"; // 佣金提现状态
+ String BROKEERAGE_WITHDRAW_TYPE = "brokerage_withdraw_type"; // 佣金提现类型
+
+ String BROKERAGE_RECORD_STATUS = "brokerage_record_status"; // 佣金记录状态
+
+ String BROKERAGE_RECORD_BIZ_TYPE = "brokerage_record_biz_type"; // 佣金记录业务类型
+
+ //发票字典
+ String INVOICE_TYPE = "invoice_type"; //发票类型
+
+ String INVOICE_STATUS = "invoice_status"; //开票状态
+
+ String INVOICE_TITLE_TYPE = "invoice_title_type"; //发票抬头类型
+
+ //交易订单字典
+ String TRADE_ORDER_STATUS = "trade_order_status";
+
+ String INFRA_BOOLEAN_STRING = "infra_boolean_string";
+
+ String TERMINAL = "terminal";
+
+ String TRADE_ORDER_TYPE = "trade_order_type";
+
+
+ // pay模块字典
+ String PAY_CHANNEL_CODE = "pay_channel_code";
+
+ String TRADE_ORDER_ITEM_AFTER_SALE_STATUS = "trade_order_item_after_sale_status";
+
+ //物流模块
+ String TRADE_DELIVERY_TYPE = "trade_deliver_type";
+
}
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
index aad6fb4..b0b3b13 100644
--- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
@@ -91,10 +91,15 @@ public interface ErrorCodeConstants {
ErrorCode BROKERAGE_BIND_LOOP = new ErrorCode(1_011_007_007, "下级不能绑定自己的上级");
ErrorCode BROKERAGE_USER_LEVEL_NOT_SUPPORT = new ErrorCode(1_011_007_008, "目前只支持 level 小于等于 2");
+ ErrorCode BROKERAGE_CREATE_USER_EXISTS = new ErrorCode(1_011_007_009, "分销用户已存在");
// ========== 分销提现 模块 1-011-008-000 ==========
ErrorCode BROKERAGE_WITHDRAW_NOT_EXISTS = new ErrorCode(1_011_008_000, "佣金提现记录不存在");
ErrorCode BROKERAGE_WITHDRAW_STATUS_NOT_AUDITING = new ErrorCode(1_011_008_001, "佣金提现记录状态不是审核中");
ErrorCode BROKERAGE_WITHDRAW_MIN_PRICE = new ErrorCode(1_011_008_002, "提现金额不能低于 {} 元");
ErrorCode BROKERAGE_WITHDRAW_USER_BALANCE_NOT_ENOUGH = new ErrorCode(1_011_008_003, "您当前最多可提现 {} 元");
+ // ========== 发票管理 模块 1-011-009-000 ==========
+ ErrorCode INVOICE_NOT_EXISTS = new ErrorCode(1_011_009_000, "发票管理不存在");
+
+ ErrorCode INVOICE_HEADER_NOT_EXISTS = new ErrorCode(1_011_009_001, "发票抬头不存在");
}
diff --git a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java
index 46edf01..254eb20 100644
--- a/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java
+++ b/yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawTypeEnum.java
@@ -19,6 +19,7 @@ public enum BrokerageWithdrawTypeEnum implements IntArrayValuable {
BANK(2, "银行卡"),
WECHAT(3, "微信"),
ALIPAY(4, "支付宝"),
+ WECHAT_API(5, "微信零钱"), // 自动打款,通过微信转账 API
;
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BrokerageWithdrawTypeEnum::getType).toArray();
@@ -37,4 +38,14 @@ public enum BrokerageWithdrawTypeEnum implements IntArrayValuable {
return ARRAYS;
}
+ /**
+ * 是否通过支付平台的 API 打款
+ *
+ * @param type 类型
+ * @return 是否
+ */
+ public static boolean isApi(Integer type) {
+ return WECHAT_API.getType().equals(type);
+ }
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/pom.xml b/yudao-module-mall/yudao-module-trade-biz/pom.xml
index 41bf7cb..46d3643 100644
--- a/yudao-module-mall/yudao-module-trade-biz/pom.xml
+++ b/yudao-module-mall/yudao-module-trade-biz/pom.xml
@@ -97,6 +97,12 @@
yudao-module-promotion-biz
${revision}
+
+ cn.iocoder.boot
+ yudao-module-agent-api
+ 2.1.0-jdk8-snapshot
+ compile
+
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageRecordApiImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageRecordApiImpl.java
new file mode 100644
index 0000000..c9604bb
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageRecordApiImpl.java
@@ -0,0 +1,44 @@
+package cn.iocoder.yudao.module.trade.api.brokerage;
+
+
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordPageReqDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordRespDTO;
+import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserCreateReqVO;
+import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert;
+import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
+import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService;
+import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService;
+import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+@Validated
+public class BrokerageRecordApiImpl implements BrokerageRecordApi{
+
+ @Resource
+ private BrokerageRecordService brokerageRecordService;
+
+ @Resource
+ private TradeOrderQueryService tradeOrderQueryService;
+ @Resource
+ private BrokerageUserService brokerageUserService;
+
+ @Override
+ public List getBrokerageRecordPage(BrokerageRecordPageReqDTO pageReqVO) {
+ List list = brokerageRecordService.getBrokerageRecordList(BrokerageRecordConvert.INSTANCE.convert(pageReqVO));
+ List respDTOS = tradeOrderQueryService.getTradeOrderList(list,pageReqVO);
+ return respDTOS;
+ }
+
+ @Override
+ public void createBrokerUser(Long userId,Long subId) {
+ BrokerageUserCreateReqVO vo = new BrokerageUserCreateReqVO();
+ vo.setUserId(userId);
+ vo.setBindUserId(subId);
+ brokerageUserService.createBrokerageUser(vo);
+ }
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageUserApiImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageUserApiImpl.java
new file mode 100644
index 0000000..3f4e433
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageUserApiImpl.java
@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.trade.api.brokerage;
+
+
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageUserRespDTO;
+import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageUserConvert;
+import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+@Validated
+public class BrokerageUserApiImpl implements BrokerageUserApi{
+
+ @Resource
+ private BrokerageUserService brokerageUserService;
+
+
+ @Override
+ public BrokerageUserRespDTO getBrokerageUser(Long bindUserId) {
+ BrokerageUserRespDTO brokerageUserRespDTO = BrokerageUserConvert.INSTANCE.convert01
+ (brokerageUserService.getBrokerageUser(bindUserId));
+ if (brokerageUserRespDTO != null) {
+ Long count = brokerageUserService.getBrokerageUserCountByBindUserId(bindUserId,null);
+ brokerageUserRespDTO.setBrokerageUserCount(Math.toIntExact(count));
+ return brokerageUserRespDTO;
+ }
+ return null;
+ }
+
+ @Override
+ public List getBrokerageUserIds() {
+ List brokerageUserList = brokerageUserService.getBrokerageUserIds();
+ return brokerageUserList;
+ }
+
+ @Override
+ public List getChildUserIdsByBinduserId(Long bindUserId, Integer level){
+ List childUserIds = brokerageUserService.getChildUserIdsByBinduserId(bindUserId, level);
+ return childUserIds;
+ }
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageWithDrawApiImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageWithDrawApiImpl.java
new file mode 100644
index 0000000..77ebf34
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/brokerage/BrokerageWithDrawApiImpl.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.trade.api.brokerage;
+
+
+import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO;
+import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageWithdrawMapper;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+@Service
+@Validated
+public class BrokerageWithDrawApiImpl implements BrokerageWithDrawApi{
+ @Resource
+ private BrokerageWithdrawMapper withdrawMapper;
+
+
+ @Override
+ public int updateBrokeageWithDrawById(Long id, String transferBillNo,String transferStatus, String pkInfo,Integer status) {
+ BrokerageWithdrawDO withdrawDO = new BrokerageWithdrawDO();
+ withdrawDO.setId(id);
+ if (transferStatus != null) {
+ withdrawDO.setTransferStatus(transferStatus);
+ }
+ if (transferBillNo != null) {
+ withdrawDO.setTransferBillNo(transferBillNo);
+ }
+ if (pkInfo != null) {
+ withdrawDO.setPackageInfo(pkInfo);
+ }
+ if (status != null) {
+ withdrawDO.setStatus(status);
+ }
+ return withdrawMapper.updateById(withdrawDO);
+ }
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageWithdrawController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageWithdrawController.java
index 609cfa4..5df19cc 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageWithdrawController.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/BrokerageWithdrawController.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.pay.api.notify.dto.PayTransferNotifyReqDTO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawRejectReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawRespVO;
@@ -14,11 +15,13 @@ import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageWithdrawService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
import javax.validation.Valid;
import java.util.Map;
@@ -29,6 +32,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
@RestController
@RequestMapping("/trade/brokerage-withdraw")
@Validated
+@Slf4j
public class BrokerageWithdrawController {
@Resource
@@ -75,4 +79,16 @@ public class BrokerageWithdrawController {
return success(BrokerageWithdrawConvert.INSTANCE.convertPage(pageResult, userMap));
}
+ // TODO @luchi:update-transferred,url 改成这个。和 update-paid 、update-refunded 保持一致
+ @PostMapping("/update-transfer")
+ @Operation(summary = "更新转账订单为转账成功") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob
+ @PermitAll // 无需登录,安全由 PayDemoOrderService 内部校验实现
+ public CommonResult updateBrokerageWithdrawTransferred(@RequestBody PayTransferNotifyReqDTO notifyReqDTO) {
+ log.info("[updateAfterRefund][notifyReqDTO({})]", notifyReqDTO);
+ brokerageWithdrawService.updateBrokerageWithdrawTransferred(
+ Long.parseLong(notifyReqDTO.getMerchantTransferId()), notifyReqDTO.getPayTransferId());
+ return success(true);
+ }
+
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserCreateReqVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserCreateReqVO.java
new file mode 100644
index 0000000..1a88809
--- /dev/null
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/user/BrokerageUserCreateReqVO.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 分销用户创建 Request VO")
+@Data
+public class BrokerageUserCreateReqVO {
+
+ @Schema(description = "分销用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "分销用户编号不能为空")
+ private Long userId;
+
+ @Schema(description = "推广员编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4587")
+ private Long bindUserId;
+
+}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawBaseVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawBaseVO.java
index 8aca8a2..e84569e 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawBaseVO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/brokerage/vo/withdraw/BrokerageWithdrawBaseVO.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw;
+import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@@ -65,4 +66,19 @@ public class BrokerageWithdrawBaseVO {
@Schema(description = "备注", example = "随便")
private String remark;
+ /* @Schema(description = "代理商id", example = "1")
+ private Long agentId;
+
+ @Schema(description = "代理商名称", example = "谁便")
+ @ExcelProperty("代理商名称")
+ private String agentName;
+
+ @Schema(description = "凭证", example = "谁便")
+ @ExcelProperty("凭证")
+ private String voucher;*/
+
+ @Schema(description = "转账单据状态", example = "1")
+ @ExcelProperty(value = "转账单据状态")
+ private String transferStatus;
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java
index 0f1fe61..01c0d93 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java
@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordPageReqDTO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordRespVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordPageReqVO;
@@ -78,4 +79,6 @@ public interface BrokerageRecordConvert {
}
void copyTo(MemberUserRespDTO from, @MappingTarget AppBrokerageUserRankByPriceRespVO to);
+
+ BrokerageRecordDO convert(BrokerageRecordPageReqDTO reqVO);
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java
index aa4ba34..998800a 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageUserConvert.java
@@ -4,6 +4,7 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageUserRespDTO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserRespVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserMySummaryRespVO;
@@ -31,6 +32,8 @@ public interface BrokerageUserConvert {
BrokerageUserRespVO convert(BrokerageUserDO bean);
+ BrokerageUserRespDTO convert01(BrokerageUserDO bean);
+
List convertList(List list);
PageResult convertPage(PageResult page, Map userMap, Map brokerageUserCountMap, Map userOrderSummaryMap);
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageWithdrawDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageWithdrawDO.java
index f31c238..6c552a2 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageWithdrawDO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageWithdrawDO.java
@@ -95,4 +95,32 @@ public class BrokerageWithdrawDO extends BaseDO {
*/
private String remark;
+// /*
+// * 代理商id
+// * */
+// private Long agentId;
+//
+// /*
+// * 代理商名称
+// * */
+// private String agentName;
+//
+// /**
+// * 凭证
+// * */
+// private String voucher;
+
+ /**
+ * 用户提现信息
+ */
+ private String packageInfo;
+ /**
+ * 转账单号
+ */
+ private String transferBillNo;
+ /**
+ * 转账单据状态
+ */
+ private String transferStatus;
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
index 4c06c80..cd58be1 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java
@@ -360,4 +360,20 @@ public class TradeOrderDO extends BaseDO {
*/
private Long pointActivityId;
+ /*
+ * 代理商户id
+ * */
+ private Long agentId;
+
+ /*
+ * 是否开发票
+ * */
+ private Integer invoiceStatus;
+
+
+ /**
+ * 核销人员
+ */
+ private Long auditUserId;
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderProperties.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderProperties.java
index 786c000..dc9e7be 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderProperties.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/order/config/TradeOrderProperties.java
@@ -4,6 +4,7 @@ import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
+import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.Duration;
@@ -18,6 +19,8 @@ import java.time.Duration;
@Validated
public class TradeOrderProperties {
+ private static final String PAY_APP_KEY_DEFAULT = "mall";
+
/**
* 应用编号
*/
@@ -42,4 +45,7 @@ public class TradeOrderProperties {
@NotNull(message = "评论超时时间不能为空")
private Duration commentExpireTime;
+ @NotEmpty(message = "Pay 应用标识不能为空")
+ private String payAppKey = PAY_APP_KEY_DEFAULT;
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java
index 1cf1e24..178a647 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordService.java
@@ -156,4 +156,7 @@ public interface BrokerageRecordService {
*/
AppBrokerageProductPriceRespVO calculateProductBrokeragePrice(Long userId, Long spuId);
+
+ List getBrokerageRecordList(BrokerageRecordDO BrokerageRecordDO);
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java
index 8b60c4f..e8a835e 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageRecordServiceImpl.java
@@ -6,6 +6,7 @@ import cn.hutool.core.util.*;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
@@ -365,4 +366,17 @@ public class BrokerageRecordServiceImpl implements BrokerageRecordService {
return SpringUtil.getBean(getClass());
}
+ /*
+ * 查询类列表
+ * */
+ @Override
+ public List getBrokerageRecordList(BrokerageRecordDO brokerageRecordDO) {
+
+ return brokerageRecordMapper.selectList(new LambdaQueryWrapperX()
+ .eqIfPresent(BrokerageRecordDO::getUserId, brokerageRecordDO.getUserId())
+ .eqIfPresent(BrokerageRecordDO::getBizType, brokerageRecordDO.getBizType())
+ .eqIfPresent(BrokerageRecordDO::getStatus, brokerageRecordDO.getStatus())
+ .eqIfPresent(BrokerageRecordDO::getSourceUserId, brokerageRecordDO.getSourceUserId())
+ .orderByDesc(BrokerageRecordDO::getId));
+ }
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java
index 5811752..f0bfe59 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserService.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.trade.service.brokerage;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserCreateReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
@@ -8,6 +9,7 @@ import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokera
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankPageReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO;
+import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
@@ -148,4 +150,16 @@ public interface BrokerageUserService {
void updateBrokerageByUserId(Long id, Long bindUserId);
void updateBrokerageBySecondUserId(Long id, Long secondBindUserId);
+
+ List getBrokerageUserIds();
+
+ List getChildUserIdsByBinduserId(Long bindUserId, Integer level);
+
+ /**
+ * 【管理员】创建分销用户
+ *
+ * @param createReqVO 请求
+ * @return 编号
+ */
+ Long createBrokerageUser(@Valid BrokerageUserCreateReqVO createReqVO);
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
index 7e90dad..8f44f8d 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageUserServiceImpl.java
@@ -8,9 +8,11 @@ import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserCreateReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.user.BrokerageUserPageReqVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryPageReqVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserChildSummaryRespVO;
@@ -28,15 +30,18 @@ import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
+import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMapByFilter;
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.BROKERAGE_CREATE_USER_EXISTS;
/**
* 分销用户 Service 实现类
@@ -405,4 +410,34 @@ public class BrokerageUserServiceImpl implements BrokerageUserService {
throw exception(BROKERAGE_USER_LEVEL_NOT_SUPPORT);
}
+ @Override
+ public List getBrokerageUserIds() {
+ List list = brokerageUserMapper.selectList().stream().map(BrokerageUserDO::getId).collect(Collectors.toList());
+ return list;
+ }
+
+ @Override
+ public List getChildUserIdsByBinduserId(Long bindUserId, Integer level) {
+ return getChildUserIdsByLevel(bindUserId, level);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createBrokerageUser(BrokerageUserCreateReqVO createReqVO) {
+ // 1.1 校验分销用户是否已存在
+ BrokerageUserDO brokerageUser = brokerageUserMapper.selectById(createReqVO.getUserId());
+ if (brokerageUser != null) {
+ throw exception(BROKERAGE_CREATE_USER_EXISTS);
+ }
+ // 1.2 校验是否能绑定用户
+ brokerageUser = BeanUtils.toBean(createReqVO, BrokerageUserDO.class).setId(createReqVO.getUserId())
+ .setBrokerageTime(LocalDateTime.now());
+ validateCanBindUser(brokerageUser, createReqVO.getBindUserId());
+
+ // 2. 创建分销人
+ brokerageUserMapper.insert(brokerageUser);
+ return brokerageUser.getId();
+ }
+
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java
index 04ea9c4..602d0f4 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawService.java
@@ -77,4 +77,5 @@ public interface BrokerageWithdrawService {
return convertMap(getWithdrawSummaryListByUserId(userIds, status), BrokerageWithdrawSummaryRespBO::getUserId);
}
+ void updateBrokerageWithdrawTransferred(Long id, Long payTransferId);
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java
index b6b4034..cee578b 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java
@@ -4,10 +4,22 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
+import cn.iocoder.yudao.module.pay.api.transfer.PayTransferApi;
+import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateReqDTO;
+import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferRespDTO;
+import cn.iocoder.yudao.module.pay.api.wallet.PayWalletApi;
+import cn.iocoder.yudao.module.pay.api.wallet.dto.PayWalletAddBalanceReqDTO;
+import cn.iocoder.yudao.module.pay.enums.transfer.PayTransferStatusEnum;
+import cn.iocoder.yudao.module.pay.enums.transfer.PayTransferTypeEnum;
+import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
+import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
+import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO;
+import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO;
import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO;
import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageWithdrawConvert;
@@ -18,8 +30,10 @@ import cn.iocoder.yudao.module.trade.enums.MessageTemplateConstants;
import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum;
import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum;
+import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageWithdrawSummaryRespBO;
import cn.iocoder.yudao.module.trade.service.config.TradeConfigService;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@@ -33,6 +47,7 @@ import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
/**
@@ -42,6 +57,7 @@ import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
*/
@Service
@Validated
+@Slf4j
public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
@Resource
@@ -58,6 +74,18 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
@Resource
private Validator validator;
+ @Resource
+ private PayWalletApi payWalletApi;
+
+ @Resource
+ private SocialUserApi socialUserApi;
+
+ @Resource
+ private TradeOrderProperties tradeOrderProperties;
+
+ @Resource
+ private PayTransferApi payTransferApi;
+
@Override
@Transactional(rollbackFor = Exception.class)
public void auditBrokerageWithdraw(Integer id, BrokerageWithdrawStatusEnum status, String auditReason) {
@@ -78,6 +106,7 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
String templateCode;
if (BrokerageWithdrawStatusEnum.AUDIT_SUCCESS.equals(status)) {
templateCode = MessageTemplateConstants.BROKERAGE_WITHDRAW_AUDIT_APPROVE;
+ auditBrokerageWithdrawSuccess(withdraw);
// 3.1 通过时佣金转余额
if (BrokerageWithdrawTypeEnum.WALLET.getType().equals(withdraw.getType())) {
// todo 疯狂:
@@ -92,14 +121,55 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
throw new IllegalArgumentException("不支持的提现状态:" + status);
}
- // 4. 通知用户
+ /* // 4. 通知用户
Map templateParams = MapUtil.builder()
.put("createTime", LocalDateTimeUtil.formatNormal(withdraw.getCreateTime()))
.put("price", MoneyUtils.fenToYuanStr(withdraw.getPrice()))
.put("reason", withdraw.getAuditReason())
.build();
notifyMessageSendApi.sendSingleMessageToMember(new NotifySendSingleToUserReqDTO()
- .setUserId(withdraw.getUserId()).setTemplateCode(templateCode).setTemplateParams(templateParams));
+ .setUserId(withdraw.getUserId()).setTemplateCode(templateCode).setTemplateParams(templateParams));*/
+ }
+
+ private void auditBrokerageWithdrawSuccess(BrokerageWithdrawDO withdraw) {
+ // 1.1 钱包
+ if (BrokerageWithdrawTypeEnum.WALLET.getType().equals(withdraw.getType())) {
+ payWalletApi.addWalletBalance(new PayWalletAddBalanceReqDTO()
+ .setUserId(withdraw.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue())
+ .setBizType(PayWalletBizTypeEnum.BROKERAGE_WITHDRAW.getType()).setBizId(withdraw.getId().toString())
+ .setPrice(withdraw.getPrice()));
+ // 1.2 微信 API
+ } else if (BrokerageWithdrawTypeEnum.WECHAT_API.getType().equals(withdraw.getType())) {
+ // TODO @luchi:这里,要加个转账单号的记录;另外,调用 API 转账,是立马成功,还是有延迟的哈?
+ Long payTransferId = createPayTransfer(withdraw);
+ // 1.3 剩余类型,都是手动打款,所以不处理
+ } else {
+ // TODO 可优化:未来可以考虑,接入支付宝、银联等 API 转账,实现自动打款
+ log.info("[auditBrokerageWithdrawSuccess][withdraw({}) 类型({}) 手动打款,无需处理]", withdraw.getId(), withdraw.getType());
+ }
+
+ // 2. 非支付 API,则直接体现成功
+ if (!BrokerageWithdrawTypeEnum.isApi(withdraw.getType())) {
+ brokerageWithdrawMapper.updateByIdAndStatus(Math.toIntExact(withdraw.getId()), BrokerageWithdrawStatusEnum.AUDIT_SUCCESS.getStatus(),
+ new BrokerageWithdrawDO().setStatus(BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS.getStatus()));
+ }
+ }
+
+ private Long createPayTransfer(BrokerageWithdrawDO withdraw) {
+ // 1.1 获取微信 openid
+ SocialUserRespDTO socialUser = socialUserApi.getSocialUserByUserId(
+ UserTypeEnum.MEMBER.getValue(), withdraw.getUserId(), SocialTypeEnum.WECHAT_MINI_APP.getType());
+ // TODO @luchi:这里,需要校验非空。如果空的话,要有业务异常哈;
+ // 1.2 构建请求
+ PayTransferCreateReqDTO payTransferCreateReqDTO = new PayTransferCreateReqDTO()
+ .setAppKey(tradeOrderProperties.getPayAppKey())
+ .setChannelCode("wx_lite").setType(PayTransferTypeEnum.WX_BALANCE.getType())
+ .setMerchantTransferId(withdraw.getId().toString())
+ .setPrice(withdraw.getPrice())
+ .setSubject("佣金提现")
+ .setOpenid(socialUser.getOpenid()).setUserIp(getClientIP());
+ // 2. 发起请求
+ return payTransferApi.createTransfer(payTransferCreateReqDTO);
}
private BrokerageWithdrawDO validateBrokerageWithdrawExists(Integer id) {
@@ -150,6 +220,27 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
return brokerageWithdrawMapper.selectCountAndSumPriceByUserIdAndStatus(userIds, status.getStatus());
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateBrokerageWithdrawTransferred(Long id, Long payTransferId) {
+ BrokerageWithdrawDO withdraw = validateBrokerageWithdrawExists(Math.toIntExact(id));
+ PayTransferRespDTO transfer = payTransferApi.getTransfer(payTransferId);
+ // TODO @luchi:建议参考支付那,即使成功的情况下,也要各种校验;金额是否匹配、转账单号是否匹配、是否重复调用;
+ if (PayTransferStatusEnum.isSuccess(transfer.getStatus())) {
+ withdraw.setStatus(BrokerageWithdrawStatusEnum.WITHDRAW_SUCCESS.getStatus());
+ // TODO @luchi:发送站内信
+ } else if (PayTransferStatusEnum.isPendingStatus(transfer.getStatus())) {
+ // TODO @luchi:这里,是不是不用更新哈?
+ withdraw.setStatus(BrokerageWithdrawStatusEnum.AUDIT_SUCCESS.getStatus());
+ } else {
+ withdraw.setStatus(BrokerageWithdrawStatusEnum.WITHDRAW_FAIL.getStatus());
+ // 3.2 驳回时需要退还用户佣金
+ brokerageRecordService.addBrokerage(withdraw.getUserId(), BrokerageRecordBizTypeEnum.WITHDRAW_REJECT,
+ String.valueOf(withdraw.getId()), withdraw.getPrice(), BrokerageRecordBizTypeEnum.WITHDRAW_REJECT.getTitle());
+ }
+ brokerageWithdrawMapper.updateById(withdraw);
+ }
+
/**
* 计算提现手续费
*
@@ -178,4 +269,6 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
}
return tradeConfig;
}
+
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
index 3e8afb5..34a447f 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
@@ -1,10 +1,13 @@
package cn.iocoder.yudao.module.trade.service.order;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordPageReqDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordRespDTO;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppPointOrderVO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
+import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
@@ -168,5 +171,8 @@ public interface TradeOrderQueryService {
List getPointOrder(Long userId);
-
+ /*
+ * api获取订单列表
+ * */
+ List getTradeOrderList(List list, BrokerageRecordPageReqDTO pageReqVO);
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
index ce5413d..2f8fb61 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
@@ -6,13 +6,18 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.agent.enums.api.agentinfo.AgentInfoApi;
+import cn.iocoder.yudao.module.agent.enums.api.agentinfo.dto.AgentInfoRespDTO;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordPageReqDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordRespDTO;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppPointOrderVO;
import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO;
+import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
@@ -62,6 +67,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
@Resource
private AfterSaleMapper afterSaleMapper;
+ @Resource
+ private AgentInfoApi agentInfoApi;
// =================== Order ===================
@Override
@@ -306,7 +313,63 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
}
+ @Override
+ public List getTradeOrderList(List list, BrokerageRecordPageReqDTO pageReqVO) {
+ if(CollUtil.isEmpty(list)){
+ return Collections.emptyList();
+ }
+ List respDTOS = new ArrayList<>();
+ list.forEach(item->{
+ TradeOrderDO tradeOrder = tradeOrderMapper.selectById(item.getBizId());
+ if(tradeOrder != null){
+ BrokerageRecordRespDTO brokerageRecordRespDTO = new BrokerageRecordRespDTO();
+ brokerageRecordRespDTO.setId(item.getId());
+ brokerageRecordRespDTO.setBizId(item.getBizId());
+ brokerageRecordRespDTO.setBizType(item.getBizType());
+ brokerageRecordRespDTO.setPrice(item.getPrice());
+ brokerageRecordRespDTO.setStatus(item.getStatus());
+ brokerageRecordRespDTO.setUserId(item.getUserId());
+ brokerageRecordRespDTO.setNo(tradeOrder.getNo());
+ brokerageRecordRespDTO.setProductCount(tradeOrder.getProductCount());
+ brokerageRecordRespDTO.setOrderTime(tradeOrder.getCreateTime());
+// brokerageRecordRespDTO.setAgentId(tradeOrder.getAgentId());
+ brokerageRecordRespDTO.setPayPrice(tradeOrder.getPayPrice());
+ brokerageRecordRespDTO.setPayStatus(tradeOrder.getPayStatus());
+ brokerageRecordRespDTO.setTradeOrderStatus(tradeOrder.getStatus());
+ List orderItems = tradeOrderItemMapper.selectListByOrderId(tradeOrder.getId());
+ if (CollUtil.isNotEmpty(orderItems)){
+ brokerageRecordRespDTO.setSpuId(orderItems.get(0).getSpuId());
+ brokerageRecordRespDTO.setSpuName(orderItems.get(0).getSpuName());
+ brokerageRecordRespDTO.setPicUrl(orderItems.get(0).getPicUrl());
+ brokerageRecordRespDTO.setTradeOrderItemId(orderItems.get(0).getId());
+ brokerageRecordRespDTO.setProductPrice(orderItems.get(0).getPrice());
+ AgentInfoRespDTO agentInfoRespDTO = agentInfoApi.getInfoByUserId(item.getUserId());
+ if(agentInfoRespDTO != null) {
+ brokerageRecordRespDTO.setAgentId(agentInfoRespDTO.getId());
+ brokerageRecordRespDTO.setAgentName(agentInfoRespDTO.getAgentName());
+ brokerageRecordRespDTO.setAgentLevel(Long.valueOf(agentInfoRespDTO.getAgentLevelId()));
+ brokerageRecordRespDTO.setAreaId(agentInfoRespDTO.getAreaId());
+ }
+ //过滤查询条件
+ if (
+ // agentId 条件:传入值非空时需匹配,否则忽略
+ (pageReqVO.getAgentId() == null || pageReqVO.getAgentId().equals(brokerageRecordRespDTO.getAgentId())) &&
+ // agentLevel 条件:同上
+ (pageReqVO.getAgentLevel() == null || pageReqVO.getAgentLevel().equals(brokerageRecordRespDTO.getAgentLevel())) &&
+ // status 条件:同上
+ (pageReqVO.getTradeOrderStatus() == null || pageReqVO.getTradeOrderStatus().equals(brokerageRecordRespDTO.getTradeOrderStatus()))
+ ) {
+ respDTOS.add(brokerageRecordRespDTO);
+ }
+ }
+ }
+ });
+ if (CollUtil.isEmpty(respDTOS)){
+ return Collections.emptyList();
+ }
+ return respDTOS;
+ }
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java
index 370a8fd..1bfb795 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java
@@ -206,4 +206,5 @@ public interface TradeOrderUpdateService {
*/
void cancelPaidOrder(Long userId, Long orderId);
+ void updateTradeOrder(TradeOrderDO tradeOrderDO);
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
index fdf60d7..a465e70 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -1110,4 +1110,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
return SpringUtil.getBean(getClass());
}
+ /*
+ * 更新交易订单
+ * */
+ @Override
+ public void updateTradeOrder(TradeOrderDO tradeOrderDO) {
+ tradeOrderMapper.updateById(tradeOrderDO);
+ }
+
}
diff --git a/yudao-module-member/pom.xml b/yudao-module-member/pom.xml
index ea65199..a6eb1f8 100644
--- a/yudao-module-member/pom.xml
+++ b/yudao-module-member/pom.xml
@@ -11,6 +11,8 @@
yudao-module-member-api
yudao-module-member-biz
+ yudao-module-agent-api
+ yudao-module-agent-biz
yudao-module-member
pom
diff --git a/yudao-module-member/yudao-module-agent-api/pom.xml b/yudao-module-member/yudao-module-agent-api/pom.xml
new file mode 100644
index 0000000..a8caf26
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-api/pom.xml
@@ -0,0 +1,33 @@
+
+
+
+ cn.iocoder.boot
+ yudao-module-member
+ ${revision}
+
+ 4.0.0
+ yudao-module-agent-api
+ jar
+
+ ${project.artifactId}
+
+ member 模块 API,暴露给其它模块调用
+
+
+
+
+ cn.iocoder.boot
+ yudao-common
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
+
+
+
diff --git a/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/ErrorCodeConstants.java
new file mode 100644
index 0000000..f8b82de
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/ErrorCodeConstants.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.agent.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * Member 错误码枚举类
+ *
+ * member 系统,使用 1-004-000-000 段
+ */
+public interface ErrorCodeConstants {
+
+ // ========== 用户相关 1-004-001-000 ============
+ ErrorCode USER_NOT_EXISTS = new ErrorCode(1_004_001_000, "用户不存在");
+ ErrorCode USER_MOBILE_NOT_EXISTS = new ErrorCode(1_004_001_001, "手机号未注册用户");
+ ErrorCode USER_MOBILE_USED = new ErrorCode(1_004_001_002, "修改手机失败,该手机号({})已经被使用");
+ ErrorCode USER_POINT_NOT_ENOUGH = new ErrorCode(1_004_001_003, "用户积分余额不足");
+
+ // ========== AUTH 模块 1-004-003-000 ==========
+ ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1_004_003_000, "登录失败,账号密码不正确");
+ ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1_004_003_001, "登录失败,账号被禁用");
+ ErrorCode AUTH_SOCIAL_USER_NOT_FOUND = new ErrorCode(1_004_003_005, "登录失败,解析不到三方登录信息");
+ ErrorCode AUTH_MOBILE_USED = new ErrorCode(1_004_003_007, "手机号已经被使用");
+
+ // ========== 用户收件地址 1-004-004-000 ==========
+ ErrorCode ADDRESS_NOT_EXISTS = new ErrorCode(1_004_004_000, "用户收件地址不存在");
+
+ //========== 用户标签 1-004-006-000 ==========
+ ErrorCode TAG_NOT_EXISTS = new ErrorCode(1_004_006_000, "用户标签不存在");
+ ErrorCode TAG_NAME_EXISTS = new ErrorCode(1_004_006_001, "用户标签已经存在");
+ ErrorCode TAG_HAS_USER = new ErrorCode(1_004_006_002, "用户标签下存在用户,无法删除");
+
+ //========== 积分配置 1-004-007-000 ==========
+
+ //========== 积分记录 1-004-008-000 ==========
+ ErrorCode POINT_RECORD_BIZ_NOT_SUPPORT = new ErrorCode(1_004_008_000, "用户积分记录业务类型不支持");
+
+ //========== 签到配置 1-004-009-000 ==========
+ ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1_004_009_000, "签到天数规则不存在");
+ ErrorCode SIGN_IN_CONFIG_EXISTS = new ErrorCode(1_004_009_001, "签到天数规则已存在");
+
+ //========== 签到配置 1-004-010-000 ==========
+ ErrorCode SIGN_IN_RECORD_TODAY_EXISTS = new ErrorCode(1_004_010_000, "今日已签到,请勿重复签到");
+
+ //========== 用户等级 1-004-011-000 ==========
+ ErrorCode LEVEL_NOT_EXISTS = new ErrorCode(1_004_011_000, "用户等级不存在");
+ ErrorCode LEVEL_NAME_EXISTS = new ErrorCode(1_004_011_001, "用户等级名称[{}]已被使用");
+ ErrorCode LEVEL_VALUE_EXISTS = new ErrorCode(1_004_011_002, "用户等级值[{}]已被[{}]使用");
+ ErrorCode LEVEL_EXPERIENCE_MIN = new ErrorCode(1_004_011_003, "升级经验必须大于上一个等级[{}]设置的升级经验[{}]");
+ ErrorCode LEVEL_EXPERIENCE_MAX = new ErrorCode(1_004_011_004, "升级经验必须小于下一个等级[{}]设置的升级经验[{}]");
+ ErrorCode LEVEL_HAS_USER = new ErrorCode(1_004_011_005, "用户等级下存在用户,无法删除");
+
+ ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1_004_011_201, "用户经验业务类型不支持");
+
+ //========== 用户分组 1-004-012-000 ==========
+ ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1_004_012_000, "用户分组不存在");
+ ErrorCode GROUP_HAS_USER = new ErrorCode(1_004_012_001, "用户分组下存在用户,无法删除");
+
+ ErrorCode INFO_NOT_EXISTS = new ErrorCode(1111111, "代理商信息不存在");
+ ErrorCode AGENT_LEVEL_NOT_EXISTS = new ErrorCode(2222222, "代理商等级不存在");
+
+ //========== 代理商 1-004-013-000 ==========
+ ErrorCode BONUS_NOT_EXISTS = new ErrorCode(1_004_013_000, "代理商分红明细不存在");
+
+}
diff --git a/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/api/agentinfo/AgentInfoApi.java b/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/api/agentinfo/AgentInfoApi.java
new file mode 100644
index 0000000..4f81c14
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/api/agentinfo/AgentInfoApi.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.agent.enums.api.agentinfo;
+
+import cn.iocoder.yudao.module.agent.enums.api.agentinfo.dto.AgentInfoRespDTO;
+
+/**
+ * 代理商 API 接口
+ *
+ * @author owen
+ */
+public interface AgentInfoApi {
+
+ /**
+ * 获得代理等级
+ *
+ * @param id 代理商等级编号
+ * @return 会员等级
+ */
+ AgentInfoRespDTO getAgentByUserId(Long id);
+ AgentInfoRespDTO getAgentByLevelId(Long id);
+
+ Long createAgentInfo(AgentInfoRespDTO agentInfoRespDTO);
+
+ AgentInfoRespDTO getInfo(Long id);
+
+ AgentInfoRespDTO getInfoByUserId(Long userId);
+
+ /**
+ * 禁用代理商等级
+ * @param userId
+ */
+ void disableAgentInfo(Long userId,Integer status);
+
+ AgentInfoRespDTO getInfoBySysUserId(Long sysUserId);
+
+}
diff --git a/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/api/agentinfo/dto/AgentInfoRespDTO.java b/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/api/agentinfo/dto/AgentInfoRespDTO.java
new file mode 100644
index 0000000..84c7675
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-api/src/main/java/cn/iocoder/yudao/module/agent/enums/api/agentinfo/dto/AgentInfoRespDTO.java
@@ -0,0 +1,120 @@
+package cn.iocoder.yudao.module.agent.enums.api.agentinfo.dto;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 会员等级 Resp DTO
+ *
+ * @author 芋道源码
+ */
+@Data
+public class AgentInfoRespDTO {
+
+ /**
+ * 代理商ID
+ */
+ private Long id;
+ /**
+ * 代理商名称
+ */
+ private String agentName;
+ /**
+ * 所属区域
+ */
+ private String region;
+ /**
+ * 代理商等级id
+ */
+ private String agentLevelId;
+ private String agentLevelName;
+ /**
+ * 地址
+ */
+ private String address;
+ /**
+ * 微信头像
+ */
+ private String wxAvatar;
+ /**
+ * 手机号
+ */
+ private String phone;
+ /**
+ * 业绩
+ */
+ private BigDecimal performance;
+ /**
+ * 保证金额
+ */
+ private BigDecimal depositAmount;
+ /**
+ * 团队成员数
+ */
+ private Integer teamSize;
+ /**
+ * 分润结算比
+ */
+ private BigDecimal profitRatio;
+ /**
+ * 开户行
+ */
+ private String bankName;
+ /**
+ * 银行卡号
+ */
+ private String bankCardNo;
+ /**
+ * 持卡人
+ */
+ private String cardholder;
+ /**
+ * 身份证号码
+ */
+ private String idCardNo;
+ /**
+ * 用户id
+ */
+ private Long userId;
+
+ private Integer status;
+
+ private Integer areaId;
+
+ /*
+ * 到期时间
+ * */
+ private String endTime;
+
+ /*
+ * 签约状态
+ * */
+ private Integer contractStatus;
+
+ /*
+ * 微信收款二维码
+ * */
+ private String wechatAccountQrCodeUrl;
+
+ /*
+ * 支付宝收款二维码
+ * */
+ private String alipayAccountQrCodeUrl;
+
+ /*
+ * 关联后台用户id
+ * */
+ private Long sysUserId;
+
+ /*
+ * 微信账号
+ * */
+ private String wechatAccount;
+
+ /*
+ * 支付宝收款二维码
+ * */
+ private String alipayAccount;
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/pom.xml b/yudao-module-member/yudao-module-agent-biz/pom.xml
new file mode 100644
index 0000000..cd68810
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/pom.xml
@@ -0,0 +1,103 @@
+
+
+
+ cn.iocoder.boot
+ yudao-module-member
+ ${revision}
+
+ 4.0.0
+ yudao-module-agent-biz
+ jar
+
+ ${project.artifactId}
+
+ agent 模块,我们放代理商业务。
+ 例如说:代理商中心等等
+
+
+
+
+ cn.iocoder.boot
+ yudao-module-agent-api
+ ${revision}
+
+
+ cn.iocoder.boot
+ yudao-module-system-api
+ ${revision}
+
+
+ cn.iocoder.boot
+ yudao-module-infra-api
+ ${revision}
+
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-biz-tenant
+
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-security
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-mybatis
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-redis
+
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-mq
+
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-test
+ test
+
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-excel
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-biz-ip
+
+
+ cn.iocoder.boot
+ yudao-module-trade-api
+ 2.1.0-jdk8-snapshot
+ compile
+
+
+ cn.iocoder.boot
+ yudao-module-member-api
+ 2.1.0-jdk8-snapshot
+ compile
+
+
+
+
+
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/api/agentinfo/AgentInfoApiImpl.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/api/agentinfo/AgentInfoApiImpl.java
new file mode 100644
index 0000000..7f5ad1a
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/api/agentinfo/AgentInfoApiImpl.java
@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.agent.api.agentinfo;
+
+import cn.iocoder.yudao.module.agent.controller.admin.info.vo.AgentInfoSaveReqVO;
+import cn.iocoder.yudao.module.agent.convert.AgentInfoConvert;
+import cn.iocoder.yudao.module.agent.dal.dataobject.info.AgentInfoDO;
+import cn.iocoder.yudao.module.agent.dal.dataobject.level.AgentLevelDO;
+import cn.iocoder.yudao.module.agent.dal.mysql.info.AgentInfoMapper;
+import cn.iocoder.yudao.module.agent.enums.api.agentinfo.AgentInfoApi;
+import cn.iocoder.yudao.module.agent.enums.api.agentinfo.dto.AgentInfoRespDTO;
+import cn.iocoder.yudao.module.agent.service.info.AgentInfoService;
+import cn.iocoder.yudao.module.agent.service.level.AgentLevelService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+/**
+ * 代理商 API 实现类
+ *
+ * @author owen
+ */
+@Slf4j
+@Service
+@Validated
+public class AgentInfoApiImpl implements AgentInfoApi {
+
+ @Resource
+ private AgentInfoService agentInfoService;
+ @Resource
+ private AgentLevelService agentLevelService;
+
+ @Override
+ public AgentInfoRespDTO getAgentByUserId(Long id) {
+ AgentInfoRespDTO res = AgentInfoConvert.INSTANCE.convert02(agentInfoService.getAgentByUserId(id));
+ if(res!=null){
+ AgentLevelDO agentLevelDO = agentLevelService.getLevel(Long.valueOf(res.getAgentLevelId()));
+ res.setAgentLevelName(agentLevelDO.getLevelName());
+ }
+
+ return res;
+ }
+
+ @Override
+ public AgentInfoRespDTO getAgentByLevelId(Long id) {
+ AgentInfoRespDTO res = AgentInfoConvert.INSTANCE.convert02(agentInfoService.getAgentByLevelId(id));
+ return res;
+ }
+
+ @Override
+ public Long createAgentInfo(AgentInfoRespDTO agentInfoRespDTO) {
+ return agentInfoService.createAgentInfo(agentInfoRespDTO);
+ }
+
+ @Override
+ public AgentInfoRespDTO getInfo(Long id) {
+ AgentInfoRespDTO res = AgentInfoConvert.INSTANCE.convert02(agentInfoService.getInfo(id));
+ if(res!=null){
+ AgentLevelDO agentLevelDO = agentLevelService.getLevel(Long.valueOf(res.getAgentLevelId()));
+ res.setAgentLevelName(agentLevelDO.getLevelName());
+ }
+ return res;
+ }
+
+ @Override
+ public AgentInfoRespDTO getInfoByUserId(Long userId) {
+
+ return AgentInfoConvert.INSTANCE.convert02(agentInfoService.getAgentByUserId(userId));
+ }
+
+ @Override
+ public void disableAgentInfo(Long userId,Integer status) {
+ agentInfoService.disableAgentInfo(userId,status);
+ }
+
+ @Override
+ public AgentInfoRespDTO getInfoBySysUserId(Long sysUserId) {
+ return AgentInfoConvert.INSTANCE.convert02(agentInfoService.getAgentBySysUserId(sysUserId));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/AgentInfoController.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/AgentInfoController.java
new file mode 100644
index 0000000..4ffce3b
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/AgentInfoController.java
@@ -0,0 +1,246 @@
+package cn.iocoder.yudao.module.agent.controller.admin.info;
+
+import cn.iocoder.yudao.framework.ip.core.Area;
+import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
+import cn.iocoder.yudao.module.agent.convert.AgentInfoConvert;
+import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
+import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.BrokerageRecordApi;
+import cn.iocoder.yudao.module.trade.api.brokerage.BrokerageUserApi;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+import cn.iocoder.yudao.module.agent.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.agent.dal.dataobject.info.AgentInfoDO;
+import cn.iocoder.yudao.module.agent.service.info.AgentInfoService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 代理商信息")
+@RestController
+@RequestMapping("/agent/info")
+@Validated
+public class AgentInfoController {
+
+ @Resource
+ private AgentInfoService infoService;
+
+ @Resource
+ private AdminUserApi adminUserApi;
+ @Resource
+ private BrokerageRecordApi brokerageRecordApi;
+ @Resource
+ private MemberUserApi memberUserApi;
+ @Resource
+ private BrokerageUserApi brokerageUserApi;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建代理商信息")
+ @PreAuthorize("@ss.hasPermission('agent:info:create')")
+ public CommonResult createInfo(@Valid @RequestBody AgentInfoSaveReqVO createReqVO) {
+ MemberUserRespDTO memberUserRespDTO = memberUserApi.getUser(createReqVO.getUserId());
+ if (memberUserRespDTO != null) {
+ createReqVO.setWxAvatar(memberUserRespDTO.getAvatar());
+ }
+ /* if (createReqVO.getSysUserId() != null){
+ List bindedSysUserIds = infoService.getBoundUserIdList();
+ if (bindedSysUserIds.contains(createReqVO.getSysUserId())) {
+ return error(400, "该后台用户已绑定代理商");
+ }
+ }*/
+
+
+ Long id = infoService.createInfo(createReqVO);
+ Long bindUser =null;
+// if (createReqVO.getAgentLevelId().equals("3")) {//如果是合伙人
+// AgentInfoDO groupUser = infoService.getAgentByLevelId(4L);
+// bindUser = groupUser.getUserId();
+// brokerageRecordApi.createBrokerUser(createReqVO.getUserId(),bindUser);
+// }
+ return success(id);
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新代理商信息")
+ @PreAuthorize("@ss.hasPermission('agent:info:update')")
+ public CommonResult updateInfo(@Valid @RequestBody AgentInfoSaveReqVO updateReqVO) {
+ /* if (updateReqVO.getSysUserId() != null){
+ List bindedSysUserIds = infoService.getBoundUserIdList();
+ if (bindedSysUserIds.contains(updateReqVO.getSysUserId())) {
+ AgentInfoDO agentInfoDO = infoService.getInfo(updateReqVO.getId());
+ if(agentInfoDO.getSysUserId() == null || !agentInfoDO.getSysUserId().equals(updateReqVO.getSysUserId())){
+ return error(400, "该后台用户已绑定代理商");
+ }
+ }
+ }*/
+ infoService.updateInfo(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除代理商信息")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('agent:info:delete')")
+ public CommonResult deleteInfo(@RequestParam("id") Long id) {
+ infoService.deleteInfo(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得代理商信息")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('agent:info:query')")
+ public CommonResult getInfo(@RequestParam("id") Long id) {
+ AgentInfoDO info = infoService.getInfo(id);
+ return success(BeanUtils.toBean(info, AgentInfoRespVO.class));
+ }
+
+
+
+ @GetMapping("/page")
+ @Operation(summary = "获得代理商信息分页")
+ @PreAuthorize("@ss.hasPermission('agent:info:query')")
+ public CommonResult> getInfoPage(@Valid AgentInfoPageReqVO pageReqVO) {
+
+ /* List list = adminUserApi.getAdminUserByCode("super_admin");
+ List userList = adminUserApi.getAdminUserByCode("dfhg");
+ Long userId = getLoginUserId();
+ if(!list.get(0).getId().equals(userId) && !userList.get(0).getId().equals(userId)){
+ pageReqVO.setSysUserId(userId);
+ AgentInfoDO agentInfoDO = infoService.getAgentBySysUserId(userId);
+ if(agentInfoDO.getUserId() != null){
+ List childUserIds = brokerageUserApi.getChildUserIdsByBinduserId(agentInfoDO.getUserId(),null);
+ pageReqVO.setUserIds(childUserIds != null ? childUserIds : null);
+ }
+ }*/
+ PageResult pageResult = infoService.getInfoPage(pageReqVO);
+ Set userIds = convertSet(pageResult.getList(), AgentInfoDO::getUserId);
+ Map brokerageMap = infoService.getAgentInfoRespMap(userIds);
+ return success(AgentInfoConvert.INSTANCE.convertPage(pageResult, brokerageMap));
+ }
+
+ @GetMapping("/org-page")
+ @Operation(summary = "获得组织信息分页")
+ @PreAuthorize("@ss.hasPermission('agent:info:query')")
+ public CommonResult> getOrgInfoPage(@Valid AgentInfoPageReqVO pageReqVO) {
+ /*List list = adminUserApi.getAdminUserByCode("super_admin");
+ List userList = adminUserApi.getAdminUserByCode("dfhg");
+ Long userId = getLoginUserId();
+ if(!list.get(0).getId().equals(userId) && !userList.get(0).getId().equals(userId)){
+ pageReqVO.setSysUserId(userId);
+ }*/
+ PageResult pageResult = infoService.getOrgInfoPage(pageReqVO);
+ Set userIds = convertSet(pageResult.getList(), AgentInfoDO::getUserId);
+ Map brokerageMap = infoService.getAgentInfoRespMap(userIds);
+ return success(AgentInfoConvert.INSTANCE.convertPage(pageResult, brokerageMap));
+ }
+
+ @GetMapping("/export-org-excel")
+ @Operation(summary = "导出事业部信息 Excel")
+ @PreAuthorize("@ss.hasPermission('agent:info:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportOrgInfoExcel(@Valid AgentInfoPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+
+ /* List list = adminUserApi.getAdminUserByCode("super_admin");
+ List userList = adminUserApi.getAdminUserByCode("dfhg");
+ Long userId = getLoginUserId();
+ if(!list.get(0).getId().equals(userId) && !userList.get(0).getId().equals(userId)){
+ pageReqVO.setSysUserId(userId);
+ }*/
+ PageResult pageResult = infoService.getOrgInfoPage(pageReqVO);
+ Set userIds = convertSet(pageResult.getList(), AgentInfoDO::getUserId);
+ Map brokerageMap = infoService.getAgentInfoRespMap(userIds);
+ PageResult page = AgentInfoConvert.INSTANCE.convertPage(pageResult, brokerageMap);
+
+ // 导出 Excel
+ ExcelUtils.write(response, "事业部信息.xls", "数据", AgentInfoRespVO.class,
+ page.getList());
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出代理商信息 Excel")
+ @PreAuthorize("@ss.hasPermission('agent:info:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportInfoExcel(@Valid AgentInfoPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+
+ /* List list = adminUserApi.getAdminUserByCode("super_admin");
+ List userList = adminUserApi.getAdminUserByCode("dfhg");
+ Long userId = getLoginUserId();
+ if(!list.get(0).getId().equals(userId) && !userList.get(0).getId().equals(userId)){
+ pageReqVO.setSysUserId(userId);
+ AgentInfoDO agentInfoDO = infoService.getAgentBySysUserId(userId);
+ if(agentInfoDO.getUserId() != null){
+ List childUserIds = brokerageUserApi.getChildUserIdsByBinduserId(agentInfoDO.getUserId(),null);
+ pageReqVO.setUserIds(childUserIds != null ? childUserIds : null);
+ }
+ }*/
+ PageResult pageResult = infoService.getInfoPage(pageReqVO);
+ Set userIds = convertSet(pageResult.getList(), AgentInfoDO::getUserId);
+ Map brokerageMap = infoService.getAgentInfoRespMap(userIds);
+ PageResult page = AgentInfoConvert.INSTANCE.convertPage(pageResult, brokerageMap);
+
+ // 导出 Excel
+ ExcelUtils.write(response, "代理商信息.xls", "数据", AgentInfoRespVO.class,
+ page.getList());
+ }
+
+ @GetMapping("/get-agent-list")
+ @PreAuthorize("@ss.hasPermission('agent:info:query')")
+ public CommonResult>> getAgentList() {
+ return success(adminUserApi.getUserListByRoleCode("agent"));
+ }
+
+ @PutMapping("/cancel")
+ @PreAuthorize("@ss.hasPermission('agent:info:update')")
+ public CommonResult cancel(@RequestBody AgentInfoSaveReqVO updateReqVO) {
+ infoService.cancelAgent(updateReqVO);
+ return success(true);
+ }
+
+ @GetMapping("/get-bound-userid-list")
+ @PreAuthorize("@ss.hasPermission('agent:info:query')")
+ public CommonResult> getBoundUserIdList() {
+ return success(infoService.getBoundUserIdList());
+ }
+
+
+ @GetMapping("/cascader-options")
+ public CommonResult>> getCascaderOptions() {
+ return success(AreaUtils.convertToCascaderOptions());
+ }
+
+ @GetMapping("/getAreaList")
+ public CommonResult>> getAreaList() {
+ return success(infoService.getAreaList());
+ }
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoPageReqVO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoPageReqVO.java
new file mode 100644
index 0000000..811eb01
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoPageReqVO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.yudao.module.agent.controller.admin.info.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 代理商信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AgentInfoPageReqVO extends PageParam {
+
+ @Schema(description = "用户id")
+ private Long userId;
+
+ @Schema(description = "代理商名称")
+ private String agentName;
+
+ @Schema(description = "代理商等级id")
+ private String agentLevelId;
+
+ @Schema(description = "手机号")
+ private String phone;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+ private Long areaId;
+
+ @Schema(description = "到期时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] endTime;
+
+ @Schema(description = "合同状态", example = "0:未签1:已签")
+ private Integer contractStatus;
+
+ @Schema(description = "用户id")
+ private Long sysUserId;
+
+ @Schema(description = "用户id列表")
+ private List userIds;
+
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoRespVO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoRespVO.java
new file mode 100644
index 0000000..009bff4
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoRespVO.java
@@ -0,0 +1,130 @@
+package cn.iocoder.yudao.module.agent.controller.admin.info.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 代理商信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AgentInfoRespVO {
+
+ @Schema(description = "代理商ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("代理商ID")
+ private Long id;
+
+ @Schema(description = "代理商名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("代理商名称")
+ private String agentName;
+
+ @Schema(description = "所属区域", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("所属区域")
+ private String region;
+
+ @Schema(description = "代理商等级id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("代理商等级id")
+ private String agentLevelId;
+
+ @Schema(description = "地址")
+ @ExcelProperty("地址")
+ private String address;
+
+ @Schema(description = "微信头像")
+ @ExcelProperty("微信头像")
+ private String wxAvatar;
+
+ @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("手机号")
+ private String phone;
+
+ @Schema(description = "业绩", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("业绩")
+ private BigDecimal performance;
+
+ @Schema(description = "保证金额", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("保证金额")
+ private BigDecimal depositAmount;
+
+ @Schema(description = "团队成员数")
+ @ExcelProperty("团队成员数")
+ private Integer teamSize;
+
+ @Schema(description = "分润结算比", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("分润结算比")
+ private BigDecimal profitRatio;
+
+ @Schema(description = "开户行")
+ @ExcelProperty("开户行")
+ private String bankName;
+
+ @Schema(description = "银行卡号")
+ @ExcelProperty("银行卡号")
+ private String bankCardNo;
+
+ @Schema(description = "持卡人")
+ @ExcelProperty("持卡人")
+ private String cardholder;
+
+ @Schema(description = "身份证号码")
+ @ExcelProperty("身份证号码")
+ private String idCardNo;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("用户id")
+ private Long userId;
+
+ private Integer status;
+ private Long areaId;
+
+ @Schema(description = "到期时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("到期时间")
+ private String endTime;
+
+ @Schema(description = "合同状态", example = "0:未签1:已签")
+ @ExcelProperty("合同状态")
+ private Integer contractStatus;
+
+ @Schema(description = "结算类型:", example = "1-钱包;2-银行卡;3-微信;4-支付宝")
+ @ExcelProperty("结算类型")
+ private Integer closingType;
+
+
+ @Schema(description = "微信收款二维码", example = "")
+ @ExcelProperty("微信收款二维码")
+ private String wechatAccountQrCodeUrl;
+
+
+ @Schema(description = "支付宝收款二维码", example = "")
+ @ExcelProperty("支付宝收款二维码")
+ private String alipayAccountQrCodeUrl;
+
+ @Schema(description = "后台用户id", example = "")
+ @ExcelProperty("后台用户id")
+ private Long sysUserId;
+
+ @Schema(description = "微信账号", example = "")
+ @ExcelProperty("微信账号")
+ private String wechatAccount;
+
+
+ @Schema(description = "支付宝账号", example = "")
+ @ExcelProperty("支付宝账号")
+ private String alipayAccount;
+
+
+ @Schema(description = "登录账号", example = "")
+ private String account;
+
+
+ @Schema(description = "登录密码", example = "")
+ private String password;
+
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoSaveReqVO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoSaveReqVO.java
new file mode 100644
index 0000000..776d9fc
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/info/vo/AgentInfoSaveReqVO.java
@@ -0,0 +1,114 @@
+package cn.iocoder.yudao.module.agent.controller.admin.info.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 代理商信息新增/修改 Request VO")
+@Data
+public class AgentInfoSaveReqVO {
+
+ @Schema(description = "代理商ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long id;
+
+ @Schema(description = "代理商名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "代理商名称不能为空")
+ private String agentName;
+
+ @Schema(description = "所属区域", requiredMode = Schema.RequiredMode.REQUIRED)
+// @NotEmpty(message = "所属区域不能为空")
+ private String region;
+
+ @Schema(description = "代理商等级id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "代理商等级id不能为空")
+ private String agentLevelId;
+
+ @Schema(description = "地址")
+ private String address;
+
+ @Schema(description = "微信头像")
+ private String wxAvatar;
+
+ @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "手机号不能为空")
+ private String phone;
+
+ @Schema(description = "业绩", requiredMode = Schema.RequiredMode.REQUIRED)
+// @NotNull(message = "业绩不能为空")
+ private BigDecimal performance;
+
+ @Schema(description = "保证金额", requiredMode = Schema.RequiredMode.REQUIRED)
+// @NotNull(message = "保证金额不能为空")
+ private BigDecimal depositAmount;
+
+ @Schema(description = "团队成员数")
+ private Integer teamSize;
+
+ @Schema(description = "分润结算比", requiredMode = Schema.RequiredMode.REQUIRED)
+// @NotNull(message = "分润结算比不能为空")
+ private BigDecimal profitRatio;
+
+ @Schema(description = "开户行")
+ private String bankName;
+
+ @Schema(description = "银行卡号")
+ private String bankCardNo;
+
+ @Schema(description = "持卡人")
+ private String cardholder;
+
+ @Schema(description = "身份证号码")
+ private String idCardNo;
+
+ @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "用户id不能为空")
+ private Long userId;
+
+ private Integer status;
+
+ private Long areaId;
+
+ @Schema(description = "到期时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String endTime;
+
+ @Schema(description = "合同状态", example = "0:未签1:已签")
+ @NotNull(message = "合同状态不能为空")
+ private Integer contractStatus;
+
+ @Schema(description = "结算类型:", example = "1-钱包;2-银行卡;3-微信;4-支付宝")
+ private Integer closingType;
+
+
+ @Schema(description = "微信收款二维码", example = "")
+ private String wechatAccountQrCodeUrl;
+
+
+ @Schema(description = "支付宝收款二维码", example = "")
+ private String alipayAccountQrCodeUrl;
+
+ @Schema(description = "后台用户id", example = "")
+ private Long sysUserId;
+
+ @Schema(description = "微信账号", example = "")
+ private String wechatAccount;
+
+
+ @Schema(description = "支付宝账号", example = "")
+ private String alipayAccount;
+
+ @Schema(description = "登录账号", example = "")
+ private String account;
+
+ @Schema(description = "登录密码", example = "")
+ private String password;
+
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/AgentLevelController.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/AgentLevelController.java
new file mode 100644
index 0000000..c4f5c43
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/AgentLevelController.java
@@ -0,0 +1,103 @@
+package cn.iocoder.yudao.module.agent.controller.admin.level;
+
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.agent.controller.admin.level.vo.*;
+import cn.iocoder.yudao.module.agent.dal.dataobject.level.AgentLevelDO;
+import cn.iocoder.yudao.module.agent.service.level.AgentLevelService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 代理商等级")
+@RestController
+@RequestMapping("/agent/level")
+@Validated
+public class AgentLevelController {
+
+ @Resource
+ private AgentLevelService levelService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建代理商等级")
+ @PreAuthorize("@ss.hasPermission('agent:level:create')")
+ public CommonResult createLevel(@Valid @RequestBody AgentLevelSaveReqVO createReqVO) {
+ return success(levelService.createLevel(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新代理商等级")
+ @PreAuthorize("@ss.hasPermission('agent:level:update')")
+ public CommonResult updateLevel(@Valid @RequestBody AgentLevelSaveReqVO updateReqVO) {
+ levelService.updateLevel(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除代理商等级")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('agent:level:delete')")
+ public CommonResult deleteLevel(@RequestParam("id") Long id) {
+ levelService.deleteLevel(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得代理商等级")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('agent:level:query')")
+ public CommonResult getLevel(@RequestParam("id") Long id) {
+ AgentLevelDO level = levelService.getLevel(id);
+ return success(BeanUtils.toBean(level, AgentLevelRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得代理商等级分页")
+ @PreAuthorize("@ss.hasPermission('agent:level:query')")
+ public CommonResult> getLevelPage(@Valid AgentLevelPageReqVO pageReqVO) {
+ PageResult pageResult = levelService.getLevelPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, AgentLevelRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出代理商等级 Excel")
+ @PreAuthorize("@ss.hasPermission('agent:level:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportLevelExcel(@Valid AgentLevelPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = levelService.getLevelPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "代理商等级.xls", "数据", AgentLevelRespVO.class,
+ BeanUtils.toBean(list, AgentLevelRespVO.class));
+ }
+
+ @GetMapping("/get-agent-level-list")
+ @Operation(summary = "获得代理商等级列表")
+ @PreAuthorize("@ss.hasPermission('agent:level:query')")
+ public CommonResult>> getAgentLevelList() {
+ return success( levelService.getAgentLevelList());
+ }
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelPageReqVO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelPageReqVO.java
new file mode 100644
index 0000000..5e661a1
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelPageReqVO.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.agent.controller.admin.level.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 代理商等级分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AgentLevelPageReqVO extends PageParam {
+
+ @Schema(description = "等级名称")
+ private String levelName;
+
+ @Schema(description = "状态")
+ private Integer status;
+
+ @Schema(description = "分润比")
+ private String profitRatio;
+
+ @Schema(description = "备注")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelRespVO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelRespVO.java
new file mode 100644
index 0000000..28c8018
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelRespVO.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.agent.controller.admin.level.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 代理商等级 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AgentLevelRespVO {
+
+ @Schema(description = "代理商等级ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("代理商等级ID")
+ private Long id;
+
+ @Schema(description = "等级名称")
+ @ExcelProperty("等级名称")
+ private String levelName;
+
+ @Schema(description = "状态")
+ @ExcelProperty("状态")
+ private Integer status;
+
+ @Schema(description = "分润比")
+ @ExcelProperty("分润比")
+ private String profitRatio;
+
+ @Schema(description = "备注")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelSaveReqVO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelSaveReqVO.java
new file mode 100644
index 0000000..f9e8e98
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/level/vo/AgentLevelSaveReqVO.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.agent.controller.admin.level.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+
+@Schema(description = "管理后台 - 代理商等级新增/修改 Request VO")
+@Data
+public class AgentLevelSaveReqVO {
+
+ @Schema(description = "代理商等级ID", requiredMode = Schema.RequiredMode.REQUIRED)
+ private Long id;
+
+ @Schema(description = "等级名称")
+ private String levelName;
+
+ @Schema(description = "状态")
+ private Integer status;
+
+ @Schema(description = "分润比")
+ private String profitRatio;
+
+ @Schema(description = "备注")
+ private String remark;
+
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/order/agentOrderController.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/order/agentOrderController.java
new file mode 100644
index 0000000..8494e56
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/controller/admin/order/agentOrderController.java
@@ -0,0 +1,137 @@
+package cn.iocoder.yudao.module.agent.controller.admin.order;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.agent.controller.admin.info.vo.AgentInfoPageReqVO;
+import cn.iocoder.yudao.module.agent.controller.admin.info.vo.AgentInfoRespVO;
+import cn.iocoder.yudao.module.agent.dal.dataobject.info.AgentInfoDO;
+import cn.iocoder.yudao.module.agent.dal.dataobject.level.AgentLevelDO;
+import cn.iocoder.yudao.module.agent.service.info.AgentInfoService;
+import cn.iocoder.yudao.module.agent.service.level.AgentLevelService;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.BrokerageRecordApi;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordPageReqDTO;
+import cn.iocoder.yudao.module.trade.api.brokerage.dto.BrokerageRecordRespDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+
+@Tag(name = "管理后台 - 代理商订单")
+@RestController
+@RequestMapping("/agent/order")
+@Validated
+public class agentOrderController {
+
+ @Resource
+ private BrokerageRecordApi brokerageRecordApi;
+
+ @Resource
+ private AdminUserApi adminUserApi;
+
+ @Resource
+ private AgentInfoService agentInfoService;
+
+ @Resource
+ private AgentLevelService agentLevelService;
+
+ @GetMapping("/page")
+ @Operation(summary = "获得代理商交易订单分页")
+ @PreAuthorize("@ss.hasPermission('agent:order:query')")
+ public CommonResult> getOrderPage(BrokerageRecordPageReqDTO reqVO) {
+ List userList = adminUserApi.getAdminUserByCode("super_admin");
+ List users = adminUserApi.getAdminUserByCode("dfhg");
+ Long userId = getLoginUserId();
+ if(!userList.get(0).getId().equals(userId) && !users.get(0).getId().equals(userId)){
+ AgentInfoDO agentInfoDO = agentInfoService.getAgentBySysUserId(userId);
+ if(agentInfoDO != null){
+ reqVO.setAgentId(agentInfoDO.getId());
+ }
+ else{
+ return success(PageResult.empty());
+ }
+ }
+ // 查询订单
+ List list = brokerageRecordApi.getBrokerageRecordPage(reqVO);
+ PageResult pageResult = new PageResult(list, Long.valueOf(list.size()));
+ if(CollUtil.isEmpty(list)){
+ return success(PageResult.empty());
+ }
+ return success(pageResult);
+ }
+ @GetMapping("/getTongji")
+ @Operation(summary = "统计代理商订单")
+ public CommonResult> getOrderPage() {
+ BrokerageRecordPageReqDTO recordPageReqDTO = new BrokerageRecordPageReqDTO();
+ // 查询订单
+ List list = brokerageRecordApi.getBrokerageRecordPage(null);
+ PageResult pageResult = new PageResult(list, Long.valueOf(list.size()));
+ if(CollUtil.isEmpty(list)){
+ return success(PageResult.empty());
+ }
+ return success(pageResult);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出分销订单 Excel")
+ @PreAuthorize("@ss.hasPermission('agent:order:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportInfoExcel(@Valid BrokerageRecordPageReqDTO reqVO,
+ HttpServletResponse response) throws IOException {
+ reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List userList = adminUserApi.getAdminUserByCode("super_admin");
+ List users = adminUserApi.getAdminUserByCode("dfhg");
+ Long userId = getLoginUserId();
+ AgentInfoDO agentInfoDO = new AgentInfoDO();
+ if(!userList.get(0).getId().equals(userId) && !users.get(0).getId().equals(userId)){
+ agentInfoDO = agentInfoService.getAgentBySysUserId(userId);
+ if(agentInfoDO != null){
+ reqVO.setAgentId(agentInfoDO.getId());
+ }
+ }
+ // 查询订单
+ List list = brokerageRecordApi.getBrokerageRecordPage(reqVO);
+ String productInfo = "";
+ String belong = "";
+ for (BrokerageRecordRespDTO brokerageRecordRespDTO : list){
+ AgentLevelDO agentLevelDO = agentLevelService.getLevel(brokerageRecordRespDTO.getAgentLevel());
+ if(agentLevelDO != null){
+ productInfo = brokerageRecordRespDTO.getSpuName() + "\n" +"x" + brokerageRecordRespDTO.getProductCount();
+ belong = "分销用户id:" + brokerageRecordRespDTO.getUserId() + "\n"
+ +"代理商名称:" + brokerageRecordRespDTO.getAgentName() + "\n"
+ +"代理商等级:" + agentLevelDO.getLevelName();
+ }
+ brokerageRecordRespDTO.setProductInfo(productInfo);
+ brokerageRecordRespDTO.setBelong(belong);
+ }
+ if(!userList.get(0).getId().equals(userId) && !users.get(0).getId().equals(userId) && agentInfoDO == null){
+ list = new ArrayList<>();
+ }
+ // 导出 Excel
+ ExcelUtils.write(response, "分销订单.xls", "数据", BrokerageRecordRespDTO.class
+ ,list);
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/convert/AgentInfoConvert.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/convert/AgentInfoConvert.java
new file mode 100644
index 0000000..ab0d229
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/convert/AgentInfoConvert.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.agent.convert;
+
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.agent.controller.admin.info.vo.AgentInfoRespVO;
+import cn.iocoder.yudao.module.agent.dal.dataobject.info.AgentInfoDO;
+
+import cn.iocoder.yudao.module.agent.enums.api.agentinfo.dto.AgentInfoRespDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 会员等级 Convert
+ *
+ * @author owen
+ */
+@Mapper
+public interface AgentInfoConvert {
+
+ AgentInfoConvert INSTANCE = Mappers.getMapper(AgentInfoConvert.class);
+
+ AgentInfoRespDTO convert02(AgentInfoDO bean);
+
+ PageResult convertPage(PageResult pageResult);
+ default PageResult convertPage(PageResult pageResult, Map map) {
+ PageResult result = convertPage(pageResult);
+ for (AgentInfoRespVO item : result.getList()){
+ Optional.ofNullable(map.get(item.getUserId())).ifPresent(agentInfoRespVO -> {
+ item.setTeamSize(agentInfoRespVO.getTeamSize());
+ item.setPerformance(agentInfoRespVO.getPerformance());
+ });
+ }
+ return result;
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/dataobject/info/AgentInfoDO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/dataobject/info/AgentInfoDO.java
new file mode 100644
index 0000000..bd28931
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/dataobject/info/AgentInfoDO.java
@@ -0,0 +1,149 @@
+package cn.iocoder.yudao.module.agent.dal.dataobject.info;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 代理商信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("agent_info")
+@KeySequence("agent_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AgentInfoDO extends BaseDO {
+
+ /**
+ * 代理商ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 代理商名称
+ */
+ private String agentName;
+ /**
+ * 所属区域
+ */
+ private String region;
+ /**
+ * 代理商等级id
+ */
+ private String agentLevelId;
+ /**
+ * 地址
+ */
+ private String address;
+ /**
+ * 微信头像
+ */
+ private String wxAvatar;
+ /**
+ * 手机号
+ */
+ private String phone;
+ /**
+ * 业绩
+ */
+ private BigDecimal performance;
+ /**
+ * 保证金额
+ */
+ private BigDecimal depositAmount;
+ /**
+ * 团队成员数
+ */
+ private Integer teamSize;
+ /**
+ * 分润结算比
+ */
+ private BigDecimal profitRatio;
+ /**
+ * 开户行
+ */
+ private String bankName;
+ /**
+ * 银行卡号
+ */
+ private String bankCardNo;
+ /**
+ * 持卡人
+ */
+ private String cardholder;
+ /**
+ * 身份证号码
+ */
+ private String idCardNo;
+ /**
+ * 用户id
+ */
+ private Long userId;
+
+ private Integer status;
+
+ private Integer areaId;
+
+ /*
+ * 到期时间
+ * */
+ private String endTime;
+
+ /*
+ * 签约状态
+ * */
+ private Integer contractStatus;
+
+ /*
+ * 结算类型:1-钱包;2-银行卡;3-微信;4-支付宝
+ * */
+ private Integer closingType;
+
+ /*
+ * 微信收款二维码
+ * */
+ private String wechatAccountQrCodeUrl;
+
+ /*
+ * 支付宝收款二维码
+ * */
+ private String alipayAccountQrCodeUrl;
+
+ /**
+ * 后台用户id
+ */
+ @TableField(updateStrategy = FieldStrategy.IGNORED)
+ private Long sysUserId;
+
+ /*
+ * 微信账号
+ * */
+ private String wechatAccount;
+
+ /*
+ * 支付宝收款二维码
+ * */
+ private String alipayAccount;
+
+ /*
+ * 登录账号
+ * */
+ private String account;
+
+ /*
+ * 登录密码
+ * */
+ private String password;
+}
+
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/dataobject/level/AgentLevelDO.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/dataobject/level/AgentLevelDO.java
new file mode 100644
index 0000000..67fd4c1
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/dataobject/level/AgentLevelDO.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.agent.dal.dataobject.level;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 代理商等级 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("agent_level")
+@KeySequence("agent_level_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AgentLevelDO extends BaseDO {
+
+ /**
+ * 代理商等级ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 等级名称
+ */
+ private String levelName;
+ /**
+ * 状态
+ */
+ private Integer status;
+ private String profitRatio;
+ private String remark;
+}
\ No newline at end of file
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/mysql/info/AgentInfoMapper.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/mysql/info/AgentInfoMapper.java
new file mode 100644
index 0000000..daca911
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/mysql/info/AgentInfoMapper.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.agent.dal.mysql.info;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.agent.dal.dataobject.info.AgentInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.agent.controller.admin.info.vo.*;
+
+/**
+ * 代理商信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AgentInfoMapper extends BaseMapperX {
+
+ default PageResult selectPage(AgentInfoPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(AgentInfoDO::getAgentName, reqVO.getAgentName())
+ .eqIfPresent(AgentInfoDO::getAgentLevelId, reqVO.getAgentLevelId())
+ .eqIfPresent(AgentInfoDO::getPhone, reqVO.getPhone())
+ .eqIfPresent(AgentInfoDO::getContractStatus, reqVO.getContractStatus())
+ .inIfPresent(AgentInfoDO::getUserId, reqVO.getUserIds())
+// .eqIfPresent(AgentInfoDO::getSysUserId,reqVO.getSysUserId())
+ .betweenIfPresent(AgentInfoDO::getCreateTime, reqVO.getCreateTime())
+ .betweenIfPresent(AgentInfoDO::getEndTime, reqVO.getEndTime())
+ .orderByDesc(AgentInfoDO::getId));
+ }
+ default AgentInfoDO selectByLevel(Long levelId) {
+ return selectOne(AgentInfoDO::getAgentLevelId, levelId);
+ }
+
+ default AgentInfoDO selectByUserId(Long userId) {
+ return selectOne(new LambdaQueryWrapperX().eq(AgentInfoDO::getUserId, userId));
+ }
+
+ default PageResult selectOrgPage(AgentInfoPageReqVO reqVO){
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(AgentInfoDO::getAgentName, reqVO.getAgentName())
+ .eqIfPresent(AgentInfoDO::getAgentLevelId, reqVO.getAgentLevelId())
+ .eqIfPresent(AgentInfoDO::getPhone, reqVO.getPhone())
+ .eqIfPresent(AgentInfoDO::getContractStatus, reqVO.getContractStatus())
+ .eqIfPresent(AgentInfoDO::getUserId, reqVO.getUserId())
+ .eqIfPresent(AgentInfoDO::getSysUserId, reqVO.getSysUserId())
+ .betweenIfPresent(AgentInfoDO::getCreateTime, reqVO.getCreateTime())
+ .betweenIfPresent(AgentInfoDO::getEndTime, reqVO.getEndTime())
+ .ne(AgentInfoDO::getAgentLevelId, 1)
+ .orderByDesc(AgentInfoDO::getId));
+ }
+}
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/mysql/level/AgentLevelMapper.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/mysql/level/AgentLevelMapper.java
new file mode 100644
index 0000000..a58c732
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/dal/mysql/level/AgentLevelMapper.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.agent.dal.mysql.level;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.agent.dal.dataobject.level.AgentLevelDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.agent.controller.admin.level.vo.*;
+
+/**
+ * 代理商等级 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AgentLevelMapper extends BaseMapperX {
+
+ default PageResult selectPage(AgentLevelPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(AgentLevelDO::getLevelName, reqVO.getLevelName())
+ .eqIfPresent(AgentLevelDO::getStatus, reqVO.getStatus())
+ .orderByDesc(AgentLevelDO::getId));
+ }
+}
\ No newline at end of file
diff --git a/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/service/info/AgentInfoService.java b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/service/info/AgentInfoService.java
new file mode 100644
index 0000000..934a6e2
--- /dev/null
+++ b/yudao-module-member/yudao-module-agent-biz/src/main/java/cn/iocoder/yudao/module/agent/service/info/AgentInfoService.java
@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.agent.service.info;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.ip.core.Area;
+import cn.iocoder.yudao.module.agent.enums.api.agentinfo.dto.AgentInfoRespDTO;
+
+import cn.iocoder.yudao.module.agent.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.agent.dal.dataobject.info.AgentInfoDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 代理商信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AgentInfoService {
+
+ /**
+ * 创建代理商信息
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createInfo(@Valid AgentInfoSaveReqVO createReqVO);
+
+ /**
+ * 写入代理商信息
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createAgentInfo(@Valid AgentInfoRespDTO createReqVO);
+
+ /**
+ * 更新代理商信息
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateInfo(@Valid AgentInfoSaveReqVO updateReqVO);
+ /**
+ * 禁用代理商等级
+ *
+ * @param id 更新信息
+ */
+ void disableAgentInfo(Long id,Integer status);
+
+ /**
+ * 删除代理商信息
+ *
+ * @param id 编号
+ */
+ void deleteInfo(Long id);
+
+ /**
+ * 获得代理商信息
+ *
+ * @param id 编号
+ * @return 代理商信息
+ */
+ AgentInfoDO getInfo(Long id);
+
+ /**
+ * 获得代理商信息分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 代理商信息分页
+ */
+ PageResult getInfoPage(AgentInfoPageReqVO pageReqVO);
+
+ void cancelAgent(AgentInfoSaveReqVO updateReqVO);
+
+ List getBoundUserIdList();
+
+ List