src/main/java/cc/mrbird/febs/mall/controller/member/ApiSaleController.java
New file @@ -0,0 +1,77 @@ package cc.mrbird.febs.mall.controller.member; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto; import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto; import cc.mrbird.febs.mall.service.ApiSaleService; import cc.mrbird.febs.mall.vo.MallMemberVo; import cc.mrbird.febs.mall.vo.sale.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @Slf4j @RestController @Validated @RequestMapping(value = "/api/sale") @RequiredArgsConstructor @Api(value = "ApiSaleController", tags = "365我的推广") public class ApiSaleController { private final ApiSaleService apiSaleService; @ApiOperation(value = "我的推广", notes = "我的推广") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiSaleInfoVo.class) }) @GetMapping(value = "/saleInfo") public FebsResponse saleInfo() { return apiSaleService.saleInfo(); } @ApiOperation(value = "我的团队(头部)", notes = "我的团队(头部)") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiTeamHeaderInfoVo.class) }) @GetMapping(value = "/teamHeader") public FebsResponse teamHeader() { return apiSaleService.teamHeader(); } @ApiOperation(value = "我的团队(团队明细)", notes = "我的团队(团队明细)") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiTeamListInfoVo.class) }) @PostMapping(value = "/teamList") public FebsResponse teamList(@RequestBody @Validated ApiTeamListInfoDto dto) { return apiSaleService.teamList(dto); } @ApiOperation(value = "分销订单(头部)", notes = "分销订单(头部)") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiSaleHeaderInfoVo.class) }) @GetMapping(value = "/saleHeader") public FebsResponse saleHeader() { return apiSaleService.saleHeader(); } @ApiOperation(value = "分销订单(分销明细)", notes = "分销订单(分销明细)") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiSaleListInfoVo.class) }) @PostMapping(value = "/saleList") public FebsResponse saleList(@RequestBody @Validated ApiSaleListInfoDto dto) { return apiSaleService.saleList(dto); } } src/main/java/cc/mrbird/febs/mall/dto/sale/ApiSaleListInfoDto.java
New file @@ -0,0 +1,30 @@ package cc.mrbird.febs.mall.dto.sale; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiSaleListInfoDto", description = "参数") public class ApiSaleListInfoDto { @NotNull(message = "页码不能为空") @ApiModelProperty(value = "页码", example = "1") private Integer pageNow; @NotNull(message = "每页数量不能为空") @ApiModelProperty(value = "每页数量", example = "10") private Integer pageSize; @ApiModelProperty(value = "开始时间", example = "123") private String startTime; @ApiModelProperty(value = "结束时间", example = "123") private String endTime; @ApiModelProperty(hidden = true) private Long memberId; } src/main/java/cc/mrbird/febs/mall/dto/sale/ApiTeamListInfoDto.java
New file @@ -0,0 +1,29 @@ package cc.mrbird.febs.mall.dto.sale; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiTeamListInfoDto", description = "参数") public class ApiTeamListInfoDto { @NotNull(message = "页码不能为空") @ApiModelProperty(value = "页码", example = "1") private Integer pageNow; @NotNull(message = "每页数量不能为空") @ApiModelProperty(value = "每页数量", example = "10") private Integer pageSize; @ApiModelProperty(value = "开始时间", example = "123") private String startTime; @ApiModelProperty(value = "结束时间", example = "123") private String endTime; @ApiModelProperty(hidden = true) private String inviteId; } src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -3,9 +3,13 @@ import cc.mrbird.febs.mall.dto.AgentDto; import cc.mrbird.febs.mall.dto.AgentLevelDto; import cc.mrbird.febs.mall.dto.RankAwardDto; import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto; import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto; import cc.mrbird.febs.mall.entity.AppVersion; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.vo.*; import cc.mrbird.febs.mall.vo.sale.ApiSaleListInfoVo; import cc.mrbird.febs.mall.vo.sale.ApiTeamListInfoVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -94,4 +98,8 @@ void updateReferrerId(@Param("id")Long id); void updateLastLoginTime(@Param("id")Long id,@Param("lastLoginTime") Date lastLoginTime); IPage<ApiTeamListInfoVo> selectTeamPage(Page<ApiTeamListInfoVo> page, @Param("record")ApiTeamListInfoDto dto); Page<ApiSaleListInfoVo> selectSalePage(Page<ApiSaleListInfoVo> objectPage, @Param("record")ApiSaleListInfoDto dto); } src/main/java/cc/mrbird/febs/mall/service/ApiSaleService.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.mall.service; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto; import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto; import cc.mrbird.febs.mall.entity.MallMember; import com.baomidou.mybatisplus.extension.service.IService; public interface ApiSaleService extends IService<MallMember> { FebsResponse saleInfo(); FebsResponse teamHeader(); FebsResponse teamList(ApiTeamListInfoDto dto); FebsResponse saleHeader(); FebsResponse saleList(ApiSaleListInfoDto dto); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiSaleServiceImpl.java
New file @@ -0,0 +1,148 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.mall.dto.sale.ApiSaleListInfoDto; import cc.mrbird.febs.mall.dto.sale.ApiTeamListInfoDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.ApiSaleService; import cc.mrbird.febs.mall.vo.sale.*; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor public class ApiSaleServiceImpl extends ServiceImpl<MallMemberMapper, MallMember> implements ApiSaleService { private final HappySaleLevelMapper happySaleLevelMapper; private final MallMoneyFlowMapper mallMoneyFlowMapper; private final MallOrderInfoMapper mallOrderInfoMapper; private final MallAchieveRecordMapper mallAchieveRecordMapper; @Override public FebsResponse saleInfo() { ApiSaleInfoVo apiSaleInfoVo = new ApiSaleInfoVo(); Long id = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(id); apiSaleInfoVo.setId(mallMember.getId()); apiSaleInfoVo.setName(mallMember.getName()); apiSaleInfoVo.setAvatar(mallMember.getAvatar()); apiSaleInfoVo.setInviteId(mallMember.getInviteId()); HappySaleLevel happySaleLevel = happySaleLevelMapper.selectOne( new LambdaQueryWrapper<HappySaleLevel>() .eq(HappySaleLevel::getCode, mallMember.getStoreMaster()) .last("limit 1") ); if (happySaleLevel != null) { apiSaleInfoVo.setStoreMasterName(happySaleLevel.getName()); apiSaleInfoVo.setStoreMasterPng(happySaleLevel.getIconPng()); } List<MallMember> mallMembers = this.baseMapper.selectAllChildAgentListByInviteId(mallMember.getInviteId()); apiSaleInfoVo.setTotalCnt(CollUtil.isNotEmpty(mallMembers) ? mallMembers.size() : 0); List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList( new LambdaQueryWrapper<MallMoneyFlow>() .eq(MallMoneyFlow::getMemberId, id) .eq(MallMoneyFlow::getType, ScoreFlowTypeEnum.SALE_RECOMMEND.getValue()) ); apiSaleInfoVo.setTotalSaleAmount( CollUtil.isNotEmpty(mallMoneyFlows) ? mallMoneyFlows.stream().map(MallMoneyFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add) : BigDecimal.ZERO); apiSaleInfoVo.setOrderCnt(CollUtil.isNotEmpty(mallMoneyFlows) ? mallMoneyFlows.size() : 0); // todo 提现部分暂无 return new FebsResponse().success().data(apiSaleInfoVo); } @Override public FebsResponse teamHeader() { ApiTeamHeaderInfoVo apiTeamHeaderInfoVo = new ApiTeamHeaderInfoVo(); Long id = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(id); List<MallMember> mallMembers = this.baseMapper.selectAllChildAgentListByInviteId(mallMember.getInviteId()); if(CollUtil.isEmpty(mallMembers)){ apiTeamHeaderInfoVo.setTotalCnt(0); apiTeamHeaderInfoVo.setTotalAmount(BigDecimal.ZERO); }else{ apiTeamHeaderInfoVo.setTotalCnt(mallMembers.size()); //stream流获取mallMembers的全部id的set集合 Set<Long> memberIds = mallMembers.stream().map(MallMember::getId).collect(Collectors.toSet()); List<MallOrderInfo> mallOrderInfos = mallOrderInfoMapper.selectList( new LambdaQueryWrapper<MallOrderInfo>() .select(MallOrderInfo::getAmount) .in(MallOrderInfo::getMemberId, memberIds) .eq(MallOrderInfo::getStatus, OrderStatusEnum.FINISH.getValue()) ); if(CollUtil.isEmpty(mallOrderInfos)){ apiTeamHeaderInfoVo.setTotalAmount(BigDecimal.ZERO); }else{ apiTeamHeaderInfoVo.setTotalAmount( mallOrderInfos.stream().map(MallOrderInfo::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add) ); } } return new FebsResponse().success().data(apiTeamHeaderInfoVo); } @Override public FebsResponse teamList(ApiTeamListInfoDto dto) { Long id = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(id); dto.setInviteId(mallMember.getInviteId()); Page<ApiTeamListInfoVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); IPage<ApiTeamListInfoVo> apiTeamListInfoVoIPage = this.baseMapper.selectTeamPage(page, dto); return new FebsResponse().success().data(apiTeamListInfoVoIPage); } @Override public FebsResponse saleHeader() { ApiSaleHeaderInfoVo apiSaleHeaderInfoVo = new ApiSaleHeaderInfoVo(); Long id = LoginUserUtil.getLoginUser().getId(); List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList( new LambdaQueryWrapper<MallMoneyFlow>() .eq(MallMoneyFlow::getMemberId, id) .eq(MallMoneyFlow::getType, ScoreFlowTypeEnum.SALE_RECOMMEND.getValue()) ); apiSaleHeaderInfoVo.setTotalSaleAmount( CollUtil.isNotEmpty(mallMoneyFlows) ? mallMoneyFlows.stream().map(MallMoneyFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add) : BigDecimal.ZERO); apiSaleHeaderInfoVo.setOrderCnt(CollUtil.isNotEmpty(mallMoneyFlows) ? mallMoneyFlows.size() : 0); return new FebsResponse().success().data(apiSaleHeaderInfoVo); } @Override public FebsResponse saleList(ApiSaleListInfoDto dto) { Long id = LoginUserUtil.getLoginUser().getId(); Page<ApiSaleListInfoVo> objectPage = new Page<>(dto.getPageNow(), dto.getPageSize()); dto.setMemberId(id); Page<ApiSaleListInfoVo> mallAchieveRecordPage = this.baseMapper.selectSalePage(objectPage, dto); return new FebsResponse().success().data(mallAchieveRecordPage); } } src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -37,7 +37,7 @@ @ApiModelProperty(value = "余额") private BigDecimal balance; @ApiModelProperty(value = "代理等级") @ApiModelProperty(value = "会员等级") private String levelName; @ApiModelProperty(value = "推荐人昵称") src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleHeaderInfoVo.java
New file @@ -0,0 +1,18 @@ package cc.mrbird.febs.mall.vo.sale; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "ApiSaleHeaderInfoVo", description = "") public class ApiSaleHeaderInfoVo { @ApiModelProperty(value = "累计佣金") private BigDecimal totalSaleAmount; @ApiModelProperty(value = "分销订单") private int orderCnt; } src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleInfoVo.java
New file @@ -0,0 +1,52 @@ package cc.mrbird.febs.mall.vo.sale; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "ApiSaleInfoVo", description = "我的推广") public class ApiSaleInfoVo { @ApiModelProperty(value = "id") private Long id; @ApiModelProperty(value = "昵称") private String name; @ApiModelProperty(value = "头像") private String avatar; @ApiModelProperty(value = "邀请码") private String inviteId; @ApiModelProperty(value = "分销等级") private String storeMasterName; @ApiModelProperty(value = "分销等级图片") private String storeMasterPng; @ApiModelProperty(value = "累计佣金") private BigDecimal totalSaleAmount; @ApiModelProperty(value = "总推广人(我的团队)") private int totalCnt; @ApiModelProperty(value = "分销订单") private int orderCnt; @ApiModelProperty(value = "佣金排行") private int sortCnt; @ApiModelProperty(value = "可提现") private BigDecimal avaAmount; @ApiModelProperty(value = "提现中") private BigDecimal avaAmountIng; @ApiModelProperty(value = "已提现") private BigDecimal avaAmountDone; } src/main/java/cc/mrbird/febs/mall/vo/sale/ApiSaleListInfoVo.java
New file @@ -0,0 +1,27 @@ package cc.mrbird.febs.mall.vo.sale; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @ApiModel(value = "ApiTeamListInfoVo", description = "") public class ApiSaleListInfoVo { @ApiModelProperty(value = "订单编号") private String orderNo; @ApiModelProperty(value = "返佣时间") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date createdTime; @ApiModelProperty(value = "返佣金额") private BigDecimal costAmount; @ApiModelProperty(value = "订单金额") private BigDecimal amount; } src/main/java/cc/mrbird/febs/mall/vo/sale/ApiTeamHeaderInfoVo.java
New file @@ -0,0 +1,18 @@ package cc.mrbird.febs.mall.vo.sale; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "ApiTeamHeaderInfoVo", description = "我的推广") public class ApiTeamHeaderInfoVo { @ApiModelProperty(value = "总推广人") private int totalCnt; @ApiModelProperty(value = "累计订单金额") private BigDecimal totalAmount; } src/main/java/cc/mrbird/febs/mall/vo/sale/ApiTeamListInfoVo.java
New file @@ -0,0 +1,28 @@ package cc.mrbird.febs.mall.vo.sale; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @ApiModel(value = "ApiTeamListInfoVo", description = "我的推广") public class ApiTeamListInfoVo { @ApiModelProperty(value = "用户") private String memberName; @ApiModelProperty(value = "注册时间") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date createdTime; @ApiModelProperty(value = "下单数量") private int orderCnt; @ApiModelProperty(value = "订单金额") private BigDecimal totalAmount; } src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java
@@ -291,12 +291,12 @@ multiply, ScoreFlowTypeEnum.SALE_RECOMMEND.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(), FlowTypeEnum.COMMISSION.getValue(), StrUtil.format(ScoreFlowTypeEnum.SALE_RECOMMEND.getDesc(),multiply), 2 ); // 更新会员钱包中的余额 mallMemberWalletService.add(multiply, storeMasterMember.getId(), "balance"); mallMemberWalletService.add(multiply, storeMasterMember.getId(), "commission"); MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); mallAchieveRecord.setMemberId(mallOrderInfo.getMemberId()); src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -492,4 +492,73 @@ where id = #{id} </update> <select id="selectTeamPage" resultType="cc.mrbird.febs.mall.vo.sale.ApiTeamListInfoVo"> SELECT a.name memberName, a.CREATED_TIME createdTime, ( SELECT count(c.id) FROM mall_order_info c where a.id = c.member_id AND c.STATUS = 4 ) orderCnt, ifnull( ( SELECT sum(b.amount) FROM mall_order_info b where a.id = b.member_id AND b.STATUS = 4 ), 0) amount FROM mall_member a <where> and find_in_set(#{record.inviteId}, a.referrer_ids) <if test="record != null" > <if test="record.startTime != null and record.startTime != ''"> and a.CREATED_TIME >= #{record.startTime} </if> <if test="record.endTime != null and record.endTime != ''"> and a.CREATED_TIME <= #{record.endTime} </if> </if> </where> order by a.CREATED_TIME desc </select> <select id="selectSalePage" resultType="cc.mrbird.febs.mall.vo.sale.ApiSaleListInfoVo"> SELECT ( SELECT c.order_no FROM mall_order_info c where a.order_id = c.id ) orderNo, a.CREATED_TIME createdTime, a.cost_amount costAmount, a.amount amount FROM mall_achieve_record a <where> and a.member_id = #{record.memberId} <if test="record != null" > <if test="record.startTime != null and record.startTime != ''"> and a.CREATED_TIME >= #{record.startTime} </if> <if test="record.endTime != null and record.endTime != ''"> and a.CREATED_TIME <= #{record.endTime} </if> </if> </where> order by a.CREATED_TIME desc </select> </mapper>