20221220
1、会员注册后level为会员
2、代理每天一点更新一次定时器
3、确认收货后返还订单金额,并且产生其余补贴
2 files added
19 files modified
| | |
| | | @Getter |
| | | public enum DataDictionaryEnum { |
| | | |
| | | /** |
| | | * 代理等级 |
| | | * value : {"levelSelf":"一星","directLevelCnt":"3","teamLevelCnt":"5","minTeamLevelCnt":"2","ManageSubsidyPercent":"2"} |
| | | * levelSelf:自身星级 |
| | | * directLevelCnt:直推星级数量 |
| | | * teamLevelCnt:团队星级数量 |
| | | * minTeamLevelCnt:两个市场均有上一个代理等级 |
| | | * ManageSubsidyPercent:团队管理补贴百分比例,基数为订单补贴金额 |
| | | * subsidyPercent:平级团队管理补贴百分比例,基数为订单补贴金额 |
| | | */ |
| | | //{"levelSelf":"一星","directLevelCnt":"3","teamLevelCnt":"5","minTeamLevelCnt":"0","manageSubsidyPercent":"2","subsidyPercent":"0"} |
| | | AGENT_ONE("MEMBER_AGENT_LEVEL", "AGENT_ONE"),//区代 |
| | | //{"levelSelf":"二星","directLevelCnt":"5","teamLevelCnt":"50","minTeamLevelCnt":"2","manageSubsidyPercent":"4","subsidyPercent":"1"} |
| | | AGENT_TWO("MEMBER_AGENT_LEVEL", "AGENT_TWO"),//县代 |
| | | //{"levelSelf":"二星","directLevelCnt":"10","teamLevelCnt":"300","minTeamLevelCnt":"2","manageSubsidyPercent":"7","subsidyPercent":"1"} |
| | | AGENT_THREE("MEMBER_AGENT_LEVEL", "AGENT_THREE"),//市代 |
| | | //{"levelSelf":"三星","directLevelCnt":"10","teamLevelCnt":"1000","minTeamLevelCnt":"2","manageSubsidyPercent":"12","subsidyPercent":"1"} |
| | | AGENT_FOUR("MEMBER_AGENT_LEVEL", "AGENT_FOUR"),//省代 |
| | | //{"levelSelf":"三星","directLevelCnt":"10","teamLevelCnt":"5000","minTeamLevelCnt":"2","manageSubsidyPercent":"20","subsidyPercent":"1"} |
| | | AGENT_FIVE("MEMBER_AGENT_LEVEL", "AGENT_FIVE"),//总代 |
| | | |
| | | //第一代分享奖比例 |
| | | LEVEL_ONE("SHARE_PERCENT", "LEVEL_ONE"), |
| | | |
| | | //第二代分享奖比例 |
| | | LEVEL_TWO("SHARE_PERCENT", "LEVEL_TWO"), |
| | | |
| | | //直推返利的比例 |
| | | REWARD_PERCENT("DIRECT_REWARD", "REWARD_PERCENT"), |
| | | |
| | | //会员每日可用订单数 |
| | | BUY_TIMES("ORDER_BUY", "BUY_TIMES"), |
| | | |
| | | //商品补贴比例 |
| | | SUBSIDY_PERCENT("GOODS_SUBSIDY", "SUBSIDY_PERCENT"), |
| | | |
New file |
| | |
| | | package cc.mrbird.febs.common.enumerates; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum MallMoneyFlowTypeEnum { |
| | | |
| | | TEAM_REWARD("团队管理补贴",6), |
| | | PAY("支付",5), |
| | | SHARE_REWARD_TWO("第二代分享奖励",4), |
| | | SHARE_REWARD_ONE("第一代分享奖励",3), |
| | | DIRECT_REWARD("直推奖励",2), |
| | | MARKET_SUBSIDIES("市场补贴",1); |
| | | |
| | | private String name; |
| | | private Integer code; |
| | | |
| | | MallMoneyFlowTypeEnum(String name,Integer code) { |
| | | this.name = name; |
| | | this.code = code; |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.common.enumerates; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum MemberAgentLevelEnum { |
| | | AGENT_FIVE("总代","AGENT_FIVE",5),//总代 |
| | | AGENT_FOUR("省代","AGENT_FOUR",4),//省代 |
| | | AGENT_THREE("市代","AGENT_THREE",3),//市代 |
| | | AGENT_TWO("县代","AGENT_TWO",2),//县代 |
| | | AGENT_ONE("区代","AGENT_ONE",1),//区代 |
| | | AGENT("会员","AGENT",0);//会员 |
| | | |
| | | private String name; |
| | | private String code; |
| | | private Integer value; |
| | | |
| | | MemberAgentLevelEnum(String name,String code,Integer value) { |
| | | this.name = name; |
| | | this.code = code; |
| | | this.value = value; |
| | | } |
| | | |
| | | /** |
| | | * |
| | | 根据传入的name,比较两个级别的大小 |
| | | levelOne等于levelTwo返回2,levelOne大于levelTwo返回1,否则返回0 |
| | | */ |
| | | public int compareLevel(String levelOne ,String levelTwo) { |
| | | int codeOne = 0; |
| | | int codeTwo = 0; |
| | | for (MemberAgentLevelEnum memberAgentLevelEnum : MemberAgentLevelEnum.values()) { |
| | | if(memberAgentLevelEnum.name.equals(levelOne)){ |
| | | codeOne = memberAgentLevelEnum.value; |
| | | } |
| | | if(memberAgentLevelEnum.name.equals(levelTwo)){ |
| | | codeTwo = memberAgentLevelEnum.value; |
| | | } |
| | | } |
| | | if(codeOne > codeTwo){ |
| | | return 1; |
| | | } |
| | | if(codeOne == codeTwo){ |
| | | return 2; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | /** |
| | | * 根据传入的等级code,输出上一等级name |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public String minLevel(String code) { |
| | | String minLevel = null; |
| | | for (MemberAgentLevelEnum memberAgentLevelEnum : MemberAgentLevelEnum.values()) { |
| | | if(memberAgentLevelEnum.getCode().equals(code)){ |
| | | minLevel = getNameByValue(memberAgentLevelEnum.getValue() - 1); |
| | | } |
| | | } |
| | | return minLevel; |
| | | } |
| | | private String getNameByValue(Integer value){ |
| | | String name = null; |
| | | for (MemberAgentLevelEnum memberAgentLevelEnum : MemberAgentLevelEnum.values()) { |
| | | if(memberAgentLevelEnum.getValue() == value){ |
| | | name = memberAgentLevelEnum.getName(); |
| | | } |
| | | } |
| | | return name; |
| | | } |
| | | |
| | | /** |
| | | * 根据传入的等级code,输出等级name |
| | | * @param code |
| | | * @return |
| | | */ |
| | | public String getNameByCode(String code){ |
| | | String name = null; |
| | | for (MemberAgentLevelEnum memberAgentLevelEnum : MemberAgentLevelEnum.values()) { |
| | | if(memberAgentLevelEnum.getCode() == code){ |
| | | name = memberAgentLevelEnum.getName(); |
| | | } |
| | | } |
| | | return name; |
| | | } |
| | | |
| | | /** |
| | | * 根据传入的等级name,输出等级code |
| | | * @param name |
| | | * @return |
| | | */ |
| | | public String getCodeByName(String name){ |
| | | String code = null; |
| | | for (MemberAgentLevelEnum memberAgentLevelEnum : MemberAgentLevelEnum.values()) { |
| | | if(memberAgentLevelEnum.getName() == name){ |
| | | code = memberAgentLevelEnum.getCode(); |
| | | } |
| | | } |
| | | return code; |
| | | } |
| | | } |
| | |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * |
| | | * 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款 |
| | | * @author wzy |
| | | * @date 2021-09-24 |
| | | **/ |
| | | @Getter |
| | | public enum MoneyFlowTypeEnum { |
| | | /** |
| | | * 静态收益 |
| | | * 市场补贴 |
| | | */ |
| | | STATIC_BONUS(1), |
| | | MARKET_DUBSIDIES(1), |
| | | STATIC_BONUS(100), |
| | | /** |
| | | * 直推奖 |
| | | */ |
| | |
| | | private Long rtMemberId; |
| | | |
| | | /** |
| | | * 提现状态 1-提现中2-成功 3-拒绝 |
| | | * 提现状态 1-进行中2-成功 3-拒绝 |
| | | */ |
| | | private Integer status; |
| | | public static final Integer STATUS_ING = 1; |
| | | public static final Integer STATUS_SUCCESS = 2; |
| | | public static final Integer STATUS_FAIL = 3; |
| | | |
| | | /** |
| | | * 是否返利 1-是 2-否 |
| | | */ |
| | | private Integer isReturn; |
| | | public static final Integer IS_RETURN_Y = 1; |
| | | public static final Integer IS_RETURN_N = 2; |
| | | |
| | | /** |
| | | * 流水类型 1-余额 2-赠送积分 3-竞猜积分 4-佣金 |
| | |
| | | private Integer deliverType; |
| | | |
| | | private Long shopId; |
| | | //补贴金额 |
| | | private BigDecimal subsidyAmount; |
| | | } |
| | |
| | | List<MallMember> selectDirectorsOrStoreMaster(@Param("type") Integer type); |
| | | |
| | | List<MallMember> selectMemberWithLevel(String level); |
| | | |
| | | List<MallMember> selectByAccountLevel(@Param("accountLevel")String accountLevel); |
| | | |
| | | Integer selectByRefererIdAndAccountLevel(@Param("refererId")String refererId,@Param("accountLevel") String accountLevel); |
| | | |
| | | Integer selectByReferersIdAndAccountLevel(@Param("inviteId")String inviteId,@Param("accountLevel") String accountLevel); |
| | | |
| | | void updateLevelById(@Param("level")String name, @Param("id")Long id); |
| | | |
| | | Integer selectByReferersIdAndLevel(@Param("inviteId")String inviteId, @Param("level")String minLevel); |
| | | } |
| | |
| | | BigDecimal selectCommissionIncome(@Param("type") Integer type, @Param("date") Date date, @Param("memberId") Long memebrid); |
| | | |
| | | BigDecimal selectThankfulCommission(@Param("date") Date date, @Param("memberId") Long memberId); |
| | | |
| | | MallMoneyFlow selectOneByMemberIdAndOrderNoAndTypeAndStatusAndIsReturn(@Param("memberId")Long memberId, |
| | | @Param("orderNo")String orderNo, |
| | | @Param("type")Integer type, |
| | | @Param("status")Integer status, |
| | | @Param("isReturn")Integer isReturn); |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.quartz; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; |
| | | import cc.mrbird.febs.common.enumerates.MemberAccountLevelEnum; |
| | | import cc.mrbird.febs.common.enumerates.MemberAgentLevelEnum; |
| | | import cc.mrbird.febs.common.enumerates.OrderStatusEnum; |
| | | import cc.mrbird.febs.mall.entity.DataDictionaryCustom; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallOrderInfo; |
| | | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DateUnit; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.json.JSONObject; |
| | | import cn.hutool.json.JSONUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | |
| | | @Autowired |
| | | private MallOrderInfoMapper orderInfoMapper; |
| | | |
| | | @Autowired |
| | | private MallMemberMapper mallMemberMapper; |
| | | |
| | | @Autowired |
| | | private DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | |
| | | @Scheduled(cron = "0 0/5 * * * ? ") |
| | | public void overtimeJob() { |
| | | log.info("订单超时任务执行"); |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | @Scheduled(cron = "0 0 1 * * ? ") |
| | | public void updateMemberAgentLevel() { |
| | | log.info("会员代理等级升级任务执行"); |
| | | /** |
| | | * 获取会员信息 |
| | | * 1、已经升级成为一星 |
| | | */ |
| | | /** |
| | | * 区代 |
| | | * 1、自身一星 |
| | | * 2、直推三个星级 |
| | | * 3、团队五个星级 |
| | | */ |
| | | updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_ONE.getType(),DataDictionaryEnum.AGENT_ONE.getCode()); |
| | | /** |
| | | * 县代 |
| | | * 1、自身2星 |
| | | * 2、直推5个星级 |
| | | * 3、团队50个星级 |
| | | */ |
| | | updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_TWO.getType(),DataDictionaryEnum.AGENT_TWO.getCode()); |
| | | updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_THREE.getType(),DataDictionaryEnum.AGENT_THREE.getCode()); |
| | | updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_FOUR.getType(),DataDictionaryEnum.AGENT_FOUR.getCode()); |
| | | updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_FIVE.getType(),DataDictionaryEnum.AGENT_FIVE.getCode()); |
| | | } |
| | | |
| | | private void updateMemberAgentLevelByName(String name,String code){ |
| | | DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | name, |
| | | code |
| | | ); |
| | | JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue()); |
| | | //自身星级 |
| | | String levelSelf = jsonObject.get("levelSelf").toString(); |
| | | //直推星级数量 |
| | | String directLevelCnt = jsonObject.get("directLevelCnt").toString(); |
| | | //团队星级数量 |
| | | String teamLevelCnt = jsonObject.get("teamLevelCnt").toString(); |
| | | //两个市场均有上一个代理等级 |
| | | String minTeamLevelCnt = jsonObject.get("minTeamLevelCnt").toString(); |
| | | List<MallMember> agentLevelList = mallMemberMapper.selectByAccountLevel(levelSelf); |
| | | if(CollUtil.isNotEmpty(agentLevelList)){ |
| | | for(MallMember mallMember : agentLevelList){ |
| | | //有星级的直推 |
| | | Integer directCnt = mallMemberMapper.selectByRefererIdAndAccountLevel(mallMember.getInviteId(),MemberAccountLevelEnum.NORMAL.getName()); |
| | | //团队中星级会员数量 |
| | | Integer teamCnt = mallMemberMapper.selectByReferersIdAndAccountLevel(mallMember.getInviteId(),MemberAccountLevelEnum.NORMAL.getName()); |
| | | //两个市场均有上一个代理等级 |
| | | Integer minCnt = 0; |
| | | if(0 < Integer.parseInt(minTeamLevelCnt)){ |
| | | String minLevel = MemberAgentLevelEnum.AGENT_ONE.minLevel(code); |
| | | //获取所有直推用户 |
| | | List<MallMember> mallMembers = mallMemberMapper.selectByRefererId(mallMember.getInviteId()); |
| | | if(CollUtil.isNotEmpty(mallMembers) && mallMembers.size() > 2){ |
| | | Integer levelCnt = 0; |
| | | for(MallMember directMember : mallMembers){ |
| | | Integer minlevelCnt = mallMemberMapper.selectByReferersIdAndLevel(directMember.getInviteId(),minLevel); |
| | | if(0 < minlevelCnt){ |
| | | levelCnt = levelCnt + 1; |
| | | } |
| | | if(levelCnt >= Integer.parseInt(minTeamLevelCnt)){ |
| | | minCnt = 1; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | }else{ |
| | | //区代不需要判断这个市场条件 |
| | | minCnt = 1; |
| | | } |
| | | if(Integer.parseInt(directLevelCnt) <= directCnt |
| | | && Integer.parseInt(teamLevelCnt) <= teamCnt |
| | | && minCnt > 0){ |
| | | //更新会员代理等级 |
| | | mallMemberMapper.updateLevelById(MemberAgentLevelEnum.AGENT_ONE.getNameByCode(code),mallMember.getId()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | void returnMoneyToAgent(Long orderId); |
| | | |
| | | void rankReturnMoney(Long orderId); |
| | | |
| | | /** |
| | | * 消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息 |
| | | * @param directRewardId |
| | | */ |
| | | void directReward(Long directRewardId); |
| | | } |
| | |
| | | |
| | | void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType); |
| | | |
| | | Long addMoneyFlow(Long memberId, String orderNo,BigDecimal amount, Integer type, Integer status, Integer isReturn,Long rtMemberId, Integer flowType,String description); |
| | | |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.AgentLevelEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.*; |
| | | import cc.mrbird.febs.common.utils.AppContants; |
| | | import cc.mrbird.febs.mall.entity.AgentInfo; |
| | | import cc.mrbird.febs.mall.entity.DataDictionaryCustom; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallOrderInfo; |
| | | import cc.mrbird.febs.mall.entity.*; |
| | | import cc.mrbird.febs.mall.mapper.*; |
| | | import cc.mrbird.febs.mall.service.IAgentService; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberService; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; |
| | | import cc.mrbird.febs.mall.service.IMallAchieveService; |
| | | import cc.mrbird.febs.mall.service.*; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import jdk.nashorn.internal.ir.IfNode; |
| | | import lombok.RequiredArgsConstructor; |
| | |
| | | |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | private final MallMemberMapper memberMapper; |
| | | private final MallOrderInfoMapper mallOrderInfoMapper; |
| | | private final IMallMoneyFlowService mallMoneyFlowService; |
| | | private final IApiMallMemberWalletService memberWalletService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | /** |
| | | * 团队业绩是否达标 |
| | | * |
| | | * @param mallMember |
| | | * @param agentInfo |
| | | * @return |
| | | */ |
| | |
| | | public void rankReturnMoney(Long orderId) { |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void directReward(Long directRewardId) { |
| | | log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息,ID:{}", directRewardId); |
| | | //获取订单信息 |
| | | MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(directRewardId); |
| | | if(ObjectUtil.isEmpty(orderInfo)){ |
| | | return; |
| | | } |
| | | Integer status = orderInfo.getStatus(); |
| | | if(OrderStatusEnum.FINISH.getValue() != status){ |
| | | return; |
| | | } |
| | | //下单补贴金额 |
| | | BigDecimal subsidyAmount = orderInfo.getSubsidyAmount(); |
| | | //下单人 |
| | | Long memberId = orderInfo.getMemberId(); |
| | | MallMember mallMember = memberMapper.selectById(memberId); |
| | | /** |
| | | * 生成补贴的流水记录 |
| | | * 1、待生效 |
| | | * 2、返利对象,下单人 |
| | | * 3、金额,补贴金额 |
| | | */ |
| | | Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | mallMember.getId(), |
| | | orderInfo.getOrderNo(), |
| | | subsidyAmount.setScale(BigDecimal.ROUND_DOWN, 2), |
| | | MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_Y, |
| | | mallMember.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getName() |
| | | ); |
| | | |
| | | memberWalletService.addBalance(subsidyAmount.setScale(BigDecimal.ROUND_DOWN, 2),mallMember.getId()); |
| | | |
| | | /** |
| | | * 生成直推返利的流水记录 |
| | | * 1、待生效 |
| | | * 2、返利对象:下单人的直推上级 |
| | | * 3、金额:返利比例乘以补贴金额 |
| | | */ |
| | | //下单人的直推上级 |
| | | MallMember mallMemberOne = memberMapper.selectInfoByInviteId(mallMember.getReferrerId()); |
| | | DataDictionaryCustom rewardPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.REWARD_PERCENT.getType(), |
| | | DataDictionaryEnum.REWARD_PERCENT.getCode() |
| | | ); |
| | | BigDecimal rewardPercent = new BigDecimal(rewardPercentDic.getValue()).multiply(new BigDecimal(0.01)).setScale(BigDecimal.ROUND_DOWN,2); |
| | | BigDecimal directRewardAmount = subsidyAmount.multiply(rewardPercent).setScale(BigDecimal.ROUND_DOWN, 2); |
| | | |
| | | Long marketSubsidyFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | mallMember.getId(), |
| | | orderInfo.getOrderNo(), |
| | | directRewardAmount, |
| | | MallMoneyFlowTypeEnum.DIRECT_REWARD.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_Y, |
| | | mallMemberOne.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.DIRECT_REWARD.getName() |
| | | ); |
| | | memberWalletService.addBalance(directRewardAmount,mallMemberOne.getId()); |
| | | /** |
| | | * 生成分享奖励的流水记录 |
| | | * 1、待生效 |
| | | * 2、返利对象:下单人的直推上级 10%,直推的直推 5% |
| | | * 3、金额:补贴金额乘以分享奖励的比例 |
| | | */ |
| | | DataDictionaryCustom shareOneDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.LEVEL_ONE.getType(), |
| | | DataDictionaryEnum.LEVEL_ONE.getCode() |
| | | ); |
| | | BigDecimal shareOne = new BigDecimal(shareOneDic.getValue()).multiply(new BigDecimal(0.01)).setScale(BigDecimal.ROUND_DOWN,2); |
| | | BigDecimal shareOneAmount = subsidyAmount.multiply(shareOne).setScale(BigDecimal.ROUND_DOWN, 2); |
| | | Long ShareOneFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | mallMember.getId(), |
| | | orderInfo.getOrderNo(), |
| | | shareOneAmount, |
| | | MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_Y, |
| | | mallMemberOne.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getName() |
| | | ); |
| | | memberWalletService.addBalance(shareOneAmount,mallMemberOne.getId()); |
| | | //下单人的直推上级的直推 |
| | | MallMember mallMemberTwo = memberMapper.selectInfoByInviteId(mallMemberOne.getReferrerId()); |
| | | if(ObjectUtil.isNotEmpty(mallMemberTwo)){ |
| | | DataDictionaryCustom shareTwoDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.LEVEL_TWO.getType(), |
| | | DataDictionaryEnum.LEVEL_TWO.getCode() |
| | | ); |
| | | BigDecimal shareTwo = new BigDecimal(shareTwoDic.getValue()).multiply(new BigDecimal(0.01)).setScale(BigDecimal.ROUND_DOWN,2); |
| | | BigDecimal shareTwoAmount = subsidyAmount.multiply(shareTwo).setScale(BigDecimal.ROUND_DOWN, 2); |
| | | Long shareTwoFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | mallMember.getId(), |
| | | orderInfo.getOrderNo(), |
| | | shareTwoAmount, |
| | | MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_Y, |
| | | mallMemberTwo.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getName() |
| | | ); |
| | | memberWalletService.addBalance(shareTwoAmount,mallMemberTwo.getId()); |
| | | } |
| | | /** |
| | | * 团队管理补贴 |
| | | */ |
| | | //下单人所有的上级 |
| | | String referrerIds = mallMember.getReferrerIds(); |
| | | List<String> refererIdList = StrUtil.split(referrerIds, ",", -1, true, true); |
| | | //下单人所有符合条件的上级-邀请码 |
| | | ArrayList<String> refererIdListUp = new ArrayList<>(); |
| | | //初始级别即当前下单人的级别 |
| | | String levelStart = mallMember.getLevel(); |
| | | for(String inviteId : refererIdList){ |
| | | MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId); |
| | | String levelUp = mallMemberUp.getLevel(); |
| | | //团队补贴从区代开始 |
| | | if(!MemberAgentLevelEnum.AGENT.getName().equals(levelUp)){ |
| | | //比较两个代理级别,同级别或者大于下单人的级别都保留 |
| | | int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp,levelStart); |
| | | if(0 < compareLevel){ |
| | | levelStart = levelUp; |
| | | refererIdListUp.add(inviteId); |
| | | } |
| | | } |
| | | } |
| | | if(CollUtil.isNotEmpty(refererIdListUp)){ |
| | | for(String inviteId : refererIdList){ |
| | | MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId); |
| | | String levelUp = mallMemberUp.getLevel(); |
| | | //获取团队分享比例 |
| | | BigDecimal manageSubsidyPercent = getManageSubsidyPercent(levelStart, levelUp); |
| | | if(manageSubsidyPercent.compareTo(BigDecimal.ZERO) > 0){ |
| | | BigDecimal teamManageAmount = subsidyAmount.multiply(manageSubsidyPercent).setScale(BigDecimal.ROUND_DOWN, 2); |
| | | //生成团队分享流水 |
| | | Long teamManageFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | mallMember.getId(), |
| | | orderInfo.getOrderNo(), |
| | | teamManageAmount, |
| | | MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_Y, |
| | | mallMemberUp.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.TEAM_REWARD.getName() |
| | | ); |
| | | |
| | | memberWalletService.addBalance(teamManageAmount,mallMemberUp.getId()); |
| | | } |
| | | levelStart = levelUp; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 根据传入的两个级别,比较之后获取对应的团队管理奖励比例 |
| | | * @param levelStart |
| | | * @param levelUp |
| | | * @return |
| | | */ |
| | | private BigDecimal getManageSubsidyPercent(String levelStart,String levelUp){ |
| | | BigDecimal manageSubsidyPercent = BigDecimal.ZERO; |
| | | String agentCodeStart = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelStart); |
| | | String agentCodeUp = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelUp); |
| | | int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp, levelStart); |
| | | //如果是平级 |
| | | if(compareLevel == 2){ |
| | | manageSubsidyPercent = getDicSubsidyPercent(agentCodeStart); |
| | | } |
| | | //如果不是平级 |
| | | if(compareLevel == 1){ |
| | | //1、初始级别不能是会员 |
| | | //2、当前级别的上一个级别是否是levelStart, |
| | | // 满足,需要减去levelStart的团队管理奖励 |
| | | String minLevel = MemberAgentLevelEnum.AGENT_ONE.minLevel(agentCodeUp); |
| | | if(levelStart.equals(minLevel) |
| | | && MemberAgentLevelEnum.AGENT.getName() != levelStart){ |
| | | BigDecimal dicManageSubsidyPercentUp = getDicManageSubsidyPercent(agentCodeUp); |
| | | BigDecimal dicManageSubsidyPercentStart = getDicManageSubsidyPercent(agentCodeStart); |
| | | manageSubsidyPercent = dicManageSubsidyPercentUp.subtract(dicManageSubsidyPercentStart); |
| | | }else{ |
| | | manageSubsidyPercent = getDicManageSubsidyPercent(agentCodeUp); |
| | | } |
| | | } |
| | | return manageSubsidyPercent; |
| | | } |
| | | |
| | | /** |
| | | * 获取对应的团队管理奖励比例 |
| | | * @param agentCode |
| | | * @return |
| | | */ |
| | | private BigDecimal getDicManageSubsidyPercent(String agentCode){ |
| | | BigDecimal manageSubsidyPercent = BigDecimal.ZERO; |
| | | DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.AGENT_ONE.getType(), |
| | | agentCode |
| | | ); |
| | | cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue()); |
| | | String manageSubsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString(); |
| | | manageSubsidyPercent = new BigDecimal(manageSubsidyPercentStr) |
| | | .multiply(new BigDecimal(0.01)) |
| | | .setScale(BigDecimal.ROUND_DOWN,2); |
| | | return manageSubsidyPercent; |
| | | } |
| | | |
| | | /** |
| | | * 获取对应的平级团队管理奖励比例 |
| | | * @param agentCode |
| | | * @return |
| | | */ |
| | | private BigDecimal getDicSubsidyPercent(String agentCode){ |
| | | BigDecimal subsidyPercent = BigDecimal.ZERO; |
| | | DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.AGENT_ONE.getType(), |
| | | agentCode |
| | | ); |
| | | cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue()); |
| | | String subsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString(); |
| | | subsidyPercent = new BigDecimal(subsidyPercentStr) |
| | | .multiply(new BigDecimal(0.01)) |
| | | .setScale(BigDecimal.ROUND_DOWN,2); |
| | | return subsidyPercent; |
| | | } |
| | | |
| | | } |
| | |
| | | mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); |
| | | mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); |
| | | mallMember.setAccountLevel(MemberAccountLevelEnum.NORMAL.getName()); |
| | | mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name()); |
| | | mallMember.setLevel(MemberAgentLevelEnum.AGENT.getName()); |
| | | mallMember.setSex("男"); |
| | | mallMember.setBindPhone(registerDto.getAccount()); |
| | | |
| | |
| | | private final MallShoppingCartMapper mallShoppingCartMapper; |
| | | private final IApiMallMemberService memberService; |
| | | private final IMallMoneyFlowService mallMoneyFlowService; |
| | | private final MallMoneyFlowMapper mallMoneyFlowMapper; |
| | | private final RedisUtils redisUtils; |
| | | |
| | | private final AgentProducer agentProducer; |
| | |
| | | // orderInfo.setLongitude(address.getLongitude()); |
| | | orderInfo.setRemark(addOrderDto.getRemark()); |
| | | orderInfo.setOrderType(addOrderDto.getOrderType()); |
| | | |
| | | //补贴金额 |
| | | orderInfo.setSubsidyAmount(goods.getSubsidyAmount()); |
| | | if (CollUtil.isEmpty(addOrderDto.getItems())) { |
| | | throw new FebsException("参数错误"); |
| | | } |
| | |
| | | orderInfo.setPayTime(new Date()); |
| | | orderInfo.setPayResult("1"); |
| | | |
| | | // boolean hasTc = false; |
| | | // 静态倍数 |
| | | // List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId()); |
| | | // if (CollUtil.isNotEmpty(orderItems)) { |
| | | // for (MallOrderItem orderItem : orderItems) { |
| | | // MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); |
| | | // BigDecimal score = BigDecimal.ZERO; |
| | | // MallGoodsSku sku = mallGoodsSkuMapper.selectById(orderItem.getSkuId()); |
| | | // if (mallGoods.getIsNormal() == 2) { |
| | | // hasTc = true; |
| | | // score = sku.getPresentPrice().multiply(mallGoods.getStaticMulti()).multiply(new BigDecimal(orderItem.getCnt())); |
| | | //// BigDecimal staticMulti = mallGoods.getStaticMulti() == null ? BigDecimal.ZERO : mallGoods.getStaticMulti(); |
| | | //// score = sku.getPresentPrice().multiply(staticMulti); |
| | | // // 普通商品也及时结算,不再10天结算 |
| | | // } else { |
| | | // score = sku.getPresentPrice(); |
| | | // } |
| | | // |
| | | // if (score.compareTo(BigDecimal.ZERO) > 0) { |
| | | // memberWalletService.add(score, member.getId(), "score"); |
| | | // mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue()); |
| | | // |
| | | // // 添加业绩 |
| | | // mallAchieveService.add(orderItem.getId()); |
| | | // } |
| | | // } |
| | | // } |
| | | // mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue()); |
| | | /** |
| | | * 生成下单的流水记录 |
| | | */ |
| | | Long payFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | member.getId(), |
| | | orderInfo.getOrderNo(), |
| | | orderInfo.getAmount().negate().setScale(BigDecimal.ROUND_DOWN, 2), |
| | | MallMoneyFlowTypeEnum.PAY.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_N, |
| | | member.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.PAY.getName() |
| | | ); |
| | | |
| | | // 购买套餐后,升级为普通会员 |
| | | // if (hasTc) { |
| | | // MallMember mallMember = memberMapper.selectById(member.getId()); |
| | | // if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { |
| | | // mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); |
| | | // memberMapper.updateById(mallMember); |
| | | // } |
| | | // } |
| | | |
| | | mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue()); |
| | | // agentProducer.sendAutoLevelUpMsg(member.getId()); |
| | | // agentProducer.sendOrderReturn(orderInfo.getId()); |
| | | break; |
| | | case "4": |
| | | if (orderInfo.getOrderType() != 2) { |
| | |
| | | orderInfo.setStatus(OrderStatusEnum.FINISH.getValue()); |
| | | orderInfo.setReceivingTime(new Date()); |
| | | this.baseMapper.updateById(orderInfo); |
| | | /** |
| | | * 通过支付流水记录,返回下单金额 |
| | | */ |
| | | MallMoneyFlow payFlow = mallMoneyFlowMapper.selectOneByMemberIdAndOrderNoAndTypeAndStatusAndIsReturn( |
| | | member.getId(), |
| | | orderInfo.getOrderNo(), |
| | | MallMoneyFlowTypeEnum.PAY.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_N); |
| | | if(ObjectUtil.isNotEmpty(payFlow)){ |
| | | memberWalletService.addBalance(payFlow.getAmount().negate(),payFlow.getRtMemberId()); |
| | | payFlow.setIsReturn(MallMoneyFlow.IS_RETURN_Y); |
| | | mallMoneyFlowMapper.updateById(payFlow); |
| | | } |
| | | //产生补贴流水记录 |
| | | agentProducer.sendDirectRewardMsg(orderInfo.getId()); |
| | | |
| | | } |
| | | |
| | | @Override |
| | |
| | | public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType) { |
| | | this.addMoneyFlow(memberId, amount, type, orderNo, null, null, rtMemberId, null, flowType, null); |
| | | } |
| | | |
| | | @Override |
| | | public Long addMoneyFlow(Long memberId,String orderNo,BigDecimal amount, Integer type, Integer status, Integer isReturn, Long rtMemberId, Integer flowType, String description) { |
| | | MallMoneyFlow flow = new MallMoneyFlow(); |
| | | flow.setMemberId(memberId); |
| | | flow.setOrderNo(orderNo); |
| | | flow.setAmount(amount); |
| | | flow.setType(type); |
| | | flow.setStatus(status); |
| | | flow.setIsReturn(isReturn); |
| | | flow.setRtMemberId(rtMemberId); |
| | | flow.setFlowType(flowType); |
| | | flow.setDescription(description); |
| | | this.baseMapper.insert(flow); |
| | | return flow.getId(); |
| | | } |
| | | |
| | | } |
| | |
| | | public static final String AGENT_AUTO_LEVEL_UP = "queue_agent_auto_level_up"; |
| | | public static final String AGENT_RETURN_MONEY = "queue_agent_return_money"; |
| | | public static final String ORDER_RETURN_MONEY = "queue_order_return_money"; |
| | | public static final String MALL_COIN_DIRECT_REWARD = "queue_mall_coin_direct_reward"; |
| | | } |
| | |
| | | log.error("订单返利异常:", e); |
| | | } |
| | | } |
| | | |
| | | @RabbitListener(queues = QueueConstants.MALL_COIN_DIRECT_REWARD) |
| | | public void directReward(Long directRewardId) { |
| | | log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息:{}", directRewardId); |
| | | try { |
| | | agentService.directReward(directRewardId); |
| | | } catch (Exception e) { |
| | | log.error("消费奖励异常", e); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | @Getter |
| | | public enum RabbitQueueEnum { |
| | | //补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴 |
| | | MALL_COIN_DIRECT_REWARD("exchange_mall_coin_direct_reward", "route_key_mall_coin_direct_reward", "queue_mall_coin_direct_reward"), |
| | | |
| | | DEFAULT("exchange_default", "route_key_default", "queue_default"), |
| | | |
| | |
| | | log.info("发送返利消息:{}", orderId); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange(), RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute(), orderId); |
| | | } |
| | | |
| | | /** |
| | | * 发送直推奖励消息 |
| | | * @param directRewardId 订单ID |
| | | */ |
| | | public void sendDirectRewardMsg(@NotNull Long directRewardId) { |
| | | log.info("发送补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息:{}", directRewardId); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.MALL_COIN_DIRECT_REWARD.getExchange(), RabbitQueueEnum.MALL_COIN_DIRECT_REWARD.getRoute(), directRewardId); |
| | | } |
| | | } |
| | |
| | | select * from mall_member |
| | | where level=#{level} |
| | | </select> |
| | | |
| | | <select id="selectByAccountLevel" resultType="cc.mrbird.febs.mall.entity.MallMember"> |
| | | select * from mall_member |
| | | where account_level = #{accountLevel} |
| | | </select> |
| | | |
| | | <select id="selectByRefererIdAndAccountLevel" resultType="java.lang.Integer"> |
| | | select count(id) from mall_member |
| | | where account_level != #{accountLevel} |
| | | and referer_id = #{refererId} |
| | | </select> |
| | | |
| | | <select id="selectByReferersIdAndAccountLevel" resultType="java.lang.Integer"> |
| | | select count(id) from mall_member |
| | | where account_level != #{accountLevel} |
| | | and FIND_IN_SET(#{inviteId}, referrer_ids) |
| | | </select> |
| | | |
| | | <update id="updateLevelById"> |
| | | update mall_member |
| | | set |
| | | level = #{level} |
| | | where |
| | | id = #{id} |
| | | </update> |
| | | |
| | | <select id="selectByReferersIdAndLevel" resultType="java.lang.Integer"> |
| | | select count(id) from mall_member |
| | | where level = #{level} |
| | | and FIND_IN_SET(#{inviteId}, referrer_ids) |
| | | </select> |
| | | </mapper> |
| | |
| | | and date_format(created_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') |
| | | and type in (2,3,4) |
| | | </select> |
| | | |
| | | <select id="selectOneByMemberIdAndOrderNoAndTypeAndStatusAndIsReturn" resultType="cc.mrbird.febs.mall.entity.MallMoneyFlow"> |
| | | select a.* |
| | | from mall_money_flow a |
| | | where a.memberId = #{memberId} |
| | | and a.order_no = #{orderNo} |
| | | and a.type = #{type} |
| | | and a.status = #{status} |
| | | and a.is_return = #{isReturn} |
| | | </select> |
| | | </mapper> |