sql/xc_mall.sql
@@ -298,5 +298,8 @@ alter table mall_order_refund add phone varchar(32) null comment '联系电话'; alter table mall_order_refund add address text null comment '地址'; alter table mall_money_flow add rt_member_id bigint null comment '返利用户ID'; alter table mall_money_flow add status int null comment '提现状态 1-提现中2-成功3-拒绝'; src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
New file @@ -0,0 +1,38 @@ package cc.mrbird.febs.common.enumerates; import lombok.Getter; /** * @author wzy * @date 2021-09-24 * 1-分红收入 2-业绩奖励 3-订单支付 4-退款 5-转账 **/ @Getter public enum MoneyFlowTypeEnum { /** * 分红 */ BONUS(1), /** * 业绩 */ ACHIEVE(2), /** * 支付 */ PAY(3), /** * 退款 */ REFUND(4), /** * 转账 */ TRANSFER(5); private final int value; MoneyFlowTypeEnum(int value) { this.value = value; } } src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -3,9 +3,11 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.ForgetPwdDto; import cc.mrbird.febs.mall.dto.ModifyMemberInfoDto; import cc.mrbird.febs.mall.dto.MoneyFlowDto; import cc.mrbird.febs.mall.dto.TeamListDto; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.vo.MallMemberVo; import cc.mrbird.febs.mall.vo.MoneyFlowVo; import cc.mrbird.febs.mall.vo.TeamListVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -67,6 +69,15 @@ }) @PostMapping(value = "/teamList") public FebsResponse teamList(@RequestBody TeamListDto teamListDto) { return memberService.teamList(teamListDto); } @ApiOperation(value = "资金流水列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = MoneyFlowVo.class) }) @PostMapping(value = "/moneyFlow") public FebsResponse moneyFlow(@RequestBody MoneyFlowDto moneyFlowDto) { return null; } } src/main/java/cc/mrbird/febs/mall/dto/MoneyFlowDto.java
New file @@ -0,0 +1,26 @@ package cc.mrbird.febs.mall.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author wzy * @date 2021-09-24 **/ @Data @ApiModel(value = "MoneyFlowDto", description = "资金流水接收参数类") public class MoneyFlowDto { @ApiModelProperty(value = "一页多少个", example = "10") private Integer pageSize; @ApiModelProperty(value = "页码", example = "1") private Integer pageNum; @ApiModelProperty(value = "类型 1-全部 2-支出 3-收入") private Integer type; @ApiModelProperty(hidden = true) private Long memberId; } src/main/java/cc/mrbird/febs/mall/dto/TeamListDto.java
@@ -12,6 +12,6 @@ @ApiModel(value = "TeamListDto", description = "我的团队接收参数类") public class TeamListDto { @ApiModelProperty(value = "用户ID", example = "1") @ApiModelProperty(value = "用户ID, 若查询本账号则不传", example = "1") private Long id; } src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
@@ -18,7 +18,21 @@ private BigDecimal amount; /** * 流水类型 1-分红收入 2-业绩奖励 3-订单支付 4-退款 5-转账 */ private Integer type; private String orderNo; private String description; private String remark; private Long rtMemberId; /** * 提现状态 1-提现中2-成功 3-拒绝 */ private Integer status; } src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java
@@ -10,6 +10,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.Map; public interface MallGoodsMapper extends BaseMapper<MallGoods> { IPage<MallGoodsListVo> selectMallGoodsListQueryInPage(@Param("record") MallGoodsQueryDto queryDto, Page<MallGoodsListVo> page); @@ -23,4 +26,6 @@ Integer selectMallGoodsCountByGoodsNo(@Param("goodsNo")String goodsNo); AdminMailGoodsDetailVo selectMallGoodsInfoById(@Param("id")long id); Map<String, BigDecimal> selectGoodsStockAndVolume(@Param("id") Long id); } src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -2,10 +2,14 @@ import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.vo.MallMemberVo; import cc.mrbird.febs.mall.vo.TeamListVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.List; /** * @author wzy @@ -22,4 +26,12 @@ MallMember selectInfoByAccountAndPwd(@Param("account") String account, @Param("password") String password); MallMemberVo getMallMemberInfoById(@Param("id")long id); List<TeamListVo> selectTeamListByInviteId(@Param("inviteId") String inviteId); BigDecimal selectOwnOrderAmountByInviteId(@Param("inviteId") String inviteId); Integer selectOwnCntByInviteId(@Param("inviteId") String inviteId); Integer selectOwnOrderCntByInviteId(@Param("inviteId") String inviteId); } src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
@@ -1,8 +1,10 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.dto.MoneyFlowDto; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.vo.AdminMallMoneyFlowVo; import cc.mrbird.febs.mall.vo.MoneyFlowVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -12,4 +14,5 @@ IPage<AdminMallMoneyFlowVo> selectMoneyFlowInPage(Page<AdminMallMoneyFlowVo> page, @Param("record")MallMember mallMember); IPage<MoneyFlowVo> selectApiMoneyFlowInPage(IPage<MoneyFlowVo> page, @Param("record") MoneyFlowDto moneyFlowDto); } src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -1,12 +1,11 @@ package cc.mrbird.febs.mall.service; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.ForgetPwdDto; import cc.mrbird.febs.mall.dto.LoginDto; import cc.mrbird.febs.mall.dto.ModifyMemberInfoDto; import cc.mrbird.febs.mall.dto.RegisterDto; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.MallMember; import com.baomidou.mybatisplus.extension.service.IService; import java.math.BigDecimal; public interface IApiMallMemberService extends IService<MallMember> { FebsResponse register(RegisterDto registerDto); @@ -24,4 +23,10 @@ FebsResponse setTradePwd(ForgetPwdDto forgetPwdDto); FebsResponse modifyMemberInfo(ModifyMemberInfoDto modifyMemberInfoDto); FebsResponse teamList(TeamListDto teamListDto); FebsResponse moneyFlows(MoneyFlowDto moneyFlowDto); void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, String description, String remark, Long rtMemberId, Integer status); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsServiceImpl.java
@@ -17,7 +17,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; import java.util.Map; /** * @author wzy @@ -44,6 +46,10 @@ } List<String> images = goodsImagesMapper.selectGoodsImagesByGoodsId(mallGoods.getId()); MallGoodsDetailsVo mallGoodsDetailsVo = MallGoodsConversion.INSTANCE.entityToDetailsVo(mallGoods); Map<String, BigDecimal> stockAndVolume = this.baseMapper.selectGoodsStockAndVolume(id); mallGoodsDetailsVo.setStock(stockAndVolume.get("stock").intValue()); mallGoodsDetailsVo.setVolume(stockAndVolume.get("volume").intValue()); mallGoodsDetailsVo.setImages(images); return mallGoodsDetailsVo; } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -7,20 +7,17 @@ import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.ShareCodeUtil; import cc.mrbird.febs.mall.conversion.MallMemberConversion; import cc.mrbird.febs.mall.dto.ForgetPwdDto; import cc.mrbird.febs.mall.dto.LoginDto; import cc.mrbird.febs.mall.dto.ModifyMemberInfoDto; import cc.mrbird.febs.mall.dto.RegisterDto; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMemberWallet; import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.entity.MallShoppingCart; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.mapper.MallShoppingCartMapper; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.mall.vo.MallMemberVo; import cc.mrbird.febs.mall.vo.MoneyFlowVo; import cc.mrbird.febs.mall.vo.TeamListVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; @@ -29,6 +26,8 @@ import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; import com.alibaba.fastjson.JSONObject; 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; @@ -55,6 +54,7 @@ private final RedisUtils redisUtils; private final MallOrderInfoMapper mallOrderInfoMapper; private final MallShoppingCartMapper mallShoppingCartMapper; private final MallMoneyFlowMapper mallMoneyFlowMapper; @Value("${spring.profiles.active}") private String active; @@ -264,4 +264,55 @@ this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("修改成功"); } @Override public FebsResponse teamList(TeamListDto teamListDto) { Long memberId = null; if (teamListDto.getId() == null) { memberId = LoginUserUtil.getLoginUser().getId(); } else { memberId = teamListDto.getId(); } MallMember mallMember = this.baseMapper.selectById(memberId); List<TeamListVo> list = this.baseMapper.selectTeamListByInviteId(mallMember.getInviteId()); BigDecimal ownAmount = this.baseMapper.selectOwnOrderAmountByInviteId(mallMember.getInviteId()); TeamListVo own = new TeamListVo(); own.setCreatedTime(mallMember.getCreatedTime()); own.setAmount(ownAmount); own.setName(mallMember.getName()); own.setPhone(mallMember.getPhone()); own.setInviteId(mallMember.getInviteId()); own.setIsCurrent(1); own.setCnt(this.baseMapper.selectOwnCntByInviteId(mallMember.getInviteId())); own.setOrderCnt(this.baseMapper.selectOwnOrderCntByInviteId(mallMember.getInviteId())); own.setId(mallMember.getId()); list.add(0, own); return new FebsResponse().success().data(list); } @Override public FebsResponse moneyFlows(MoneyFlowDto moneyFlowDto) { IPage<MoneyFlowVo> page = new Page<>(moneyFlowDto.getPageNum(), moneyFlowDto.getPageSize()); Long id = LoginUserUtil.getLoginUser().getId(); moneyFlowDto.setMemberId(id); IPage<MoneyFlowVo> pages = mallMoneyFlowMapper.selectApiMoneyFlowInPage(page, moneyFlowDto); return new FebsResponse().success().data(pages); } @Override public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, String description, String remark, Long rtMemberId, Integer status) { MallMoneyFlow flow = new MallMoneyFlow(); flow.setMemberId(memberId); flow.setAmount(amount); flow.setType(type); flow.setOrderNo(orderNo); flow.setDescription(description); flow.setRemark(remark); flow.setRtMemberId(rtMemberId); flow.setStatus(status); mallMoneyFlowMapper.insert(flow); } } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -1,5 +1,6 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.enumerates.OrderRefundStatusEnum; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.exception.FebsException; @@ -12,8 +13,10 @@ import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.service.MallMemberService; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; import cc.mrbird.febs.mall.vo.OrderRefundVo; @@ -55,6 +58,7 @@ private final MallOrderRefundMapper mallOrderRefundMapper; private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper; private final MallShoppingCartMapper mallShoppingCartMapper; private final IApiMallMemberService memberService; private final RedisUtils redisUtils; @Override @@ -113,6 +117,7 @@ mallOrderItemMapper.insert(orderItem); sku.setStock(sku.getStock() - item.getCnt()); sku.setSkuVolume(sku.getSkuVolume() + item.getCnt()); mallGoodsSkuMapper.updateById(sku); if (addOrderDto.getType() == 1) { @@ -160,19 +165,32 @@ throw new FebsException("订单状态不能支付"); } String orderNo = ""; switch (payOrderDto.getType()) { case "1": // TODO 微信支付 orderInfo.setPayMethod("微信支付"); break; case "2": // TODO 支付宝支付 orderInfo.setPayMethod("支付宝支付"); break; case "3": return balancePay(orderInfo, payOrderDto.getTradePwd()); orderNo = balancePay(orderInfo, payOrderDto.getTradePwd()); orderInfo.setPayMethod("积分支付"); default: } return ""; orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); orderInfo.setPayTime(new Date()); orderInfo.setPayOrderNo(orderInfo.getOrderNo()); orderInfo.setPayResult("1"); this.baseMapper.updateById(orderInfo); memberService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null); return orderNo; } private String balancePay(MallOrderInfo orderInfo, String tradePwd) { @@ -192,12 +210,6 @@ memberWalletService.reduceBalance(orderInfo.getAmount(), mallMember.getId()); orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); orderInfo.setPayTime(new Date()); orderInfo.setPayMethod("积分支付"); orderInfo.setPayOrderNo(orderInfo.getOrderNo()); orderInfo.setPayResult("1"); this.baseMapper.updateById(orderInfo); return orderInfo.getOrderNo(); } @@ -288,6 +300,7 @@ throw new FebsException("该订单不能退款"); } Integer beforeStatus = orderInfo.getStatus(); MallMember member = LoginUserUtil.getLoginUser(); orderInfo.setStatus(OrderStatusEnum.REFUNDING.getValue()); this.baseMapper.updateById(orderInfo); @@ -301,7 +314,7 @@ orderRefund.setReason(addRefundDto.getReason()); orderRefund.setType(addRefundDto.getType()); orderRefund.setRefundTime(new Date()); orderRefund.setBeforeStatus(orderInfo.getStatus()); orderRefund.setBeforeStatus(beforeStatus); orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue()); mallOrderRefundMapper.insert(orderRefund); } else { @@ -309,7 +322,7 @@ orderRefund.setReason(addRefundDto.getReason()); orderRefund.setType(addRefundDto.getType()); orderRefund.setRefundTime(new Date()); orderRefund.setBeforeStatus(orderInfo.getStatus()); orderRefund.setBeforeStatus(beforeStatus); orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue()); mallOrderRefundMapper.updateById(orderRefund); } src/main/java/cc/mrbird/febs/mall/vo/MoneyFlowVo.java
New file @@ -0,0 +1,40 @@ package cc.mrbird.febs.mall.vo; 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; /** * @author wzy * @date 2021-09-24 **/ @Data @ApiModel(value = "MoneyFlowVo", description = "资金列表返回参数类") public class MoneyFlowVo { @ApiModelProperty(value = "订单号") private String orderNo; @ApiModelProperty(value = "金额,有正负") private BigDecimal amount; @ApiModelProperty(value = "类型 1-分红收入 2-业绩奖励 3-订单支付 4-退款 5-转账") private Integer type; @ApiModelProperty(value = "对方手机号") private String phone; @ApiModelProperty(value = "代理等级") private String memberLevel; @ApiModelProperty(value = "提现状态 1-提现中2-成功 3-拒绝") private Integer status; @ApiModelProperty(value = "时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; } src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java
@@ -1,5 +1,6 @@ package cc.mrbird.febs.mall.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -23,6 +24,7 @@ private String orderNo; @ApiModelProperty(value = "下单时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date orderTime; @ApiModelProperty(value = "支付方式") src/main/java/cc/mrbird/febs/mall/vo/TeamListVo.java
@@ -31,7 +31,10 @@ @ApiModelProperty(value = "金额") private BigDecimal amount; @ApiModelProperty(value = "数量") @ApiModelProperty(value = "订单数量") private Integer orderCnt; @ApiModelProperty(value = "团队数量") private Integer cnt; @ApiModelProperty(value = "注册时间") src/main/resources/mapper/modules/MallGoodsMapper.xml
@@ -118,4 +118,12 @@ <select id="selectMallGoodsInfoById" resultType="cc.mrbird.febs.mall.vo.AdminMailGoodsDetailVo"> select * from mall_goods a where a.id = #{id} </select> <select id="selectGoodsStockAndVolume" resultType="java.util.HashMap"> select sum(stock) stock, sum(sku_volume) volume from mall_goods_sku where goods_id=#{id} </select> </mapper> src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -55,4 +55,43 @@ <select id="selectInfoByAccountAndPwd" resultType="cc.mrbird.febs.mall.entity.MallMember"> select * from mall_member where (phone=#{account} or email=#{account}) and password=#{password} </select> <select id="selectTeamListByInviteId" resultType="cc.mrbird.febs.mall.vo.TeamListVo"> select a.id, a.name, a.phone, a.invite_id, 2 isCurrent, a.created_time, (select sum(b.amount) from mall_member e inner join mall_order_info b on e.id=b.member_id and b.status=4 where e.invite_id=a.invite_id or e.referrer_id=a.invite_id) amount, (select count(1) from mall_member e inner join mall_order_info b on e.id=b.member_id and b.status=4 where e.invite_id=a.invite_id or e.referrer_id=a.invite_id) orderCnt, (select count(1) from mall_member x where x.referrer_id=a.invite_id) cnt from mall_member a where a.referrer_id=#{inviteId} </select> <select id="selectOwnOrderAmountByInviteId" resultType="java.math.BigDecimal"> select IFNULL(sum(b.amount),0) from mall_member e inner join mall_order_info b on e.id=b.member_id and b.status=4 where e.invite_id=#{inviteId} or e.referrer_id=#{inviteId} </select> <select id="selectOwnCntByInviteId" resultType="java.lang.Integer"> select IFNULL(count(1),0) from mall_member x where x.referrer_id=#{inviteId} </select> <select id="selectOwnOrderCntByInviteId" resultType="java.lang.Integer"> select IFNULL(count(1),0) from mall_member e inner join mall_order_info b on e.id=b.member_id and b.status=4 where e.invite_id=#{inviteId} or e.referrer_id=#{inviteId} </select> </mapper> src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -7,4 +7,22 @@ order by a.CREATED_TIME desc </select> <select id="selectApiMoneyFlowInPage" resultType="cc.mrbird.febs.mall.vo.MoneyFlowVo"> select a.*, b.phone from mall_money_flow a inner join mall_member on a.rt_member_id=b.member_id <where> <if test="record.type == 2"> and a.amount > 0 </if> <if test="record.type == 3"> and 0 > a.amount </if> <if test="record.memberId != null"> and a.member_id=#{record.memberId} </if> </where> </select> </mapper>