| | |
| | | package cc.mrbird.febs.mall.quartz; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.OrderStatusEnum; |
| | | import cc.mrbird.febs.mall.entity.MallOrderInfo; |
| | | import cc.mrbird.febs.common.enumerates.*; |
| | | import cc.mrbird.febs.mall.entity.*; |
| | | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberStarBuyMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; |
| | | import cc.mrbird.febs.mall.service.IMallMoneyFlowService; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DateUnit; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | 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; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | |
| | | |
| | | @Autowired |
| | | private MallOrderInfoMapper orderInfoMapper; |
| | | |
| | | @Autowired |
| | | private MallMemberMapper mallMemberMapper; |
| | | |
| | | @Autowired |
| | | private DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | |
| | | @Autowired |
| | | private MallMemberStarBuyMapper mallMemberStarBuyMapper; |
| | | |
| | | @Autowired |
| | | private IApiMallMemberWalletService memberWalletService; |
| | | |
| | | @Autowired |
| | | private IMallMoneyFlowService mallMoneyFlowService; |
| | | |
| | | @Scheduled(cron = "0 0/5 * * * ? ") |
| | | public void overtimeJob() { |
| | |
| | | } |
| | | |
| | | } |
| | | |
| | | @Scheduled(cron = "0 0 2 * * ? ") |
| | | public void returnBuyStarAmount(){ |
| | | log.info("会员星级保证金返还任务执行"); |
| | | /** |
| | | * 1、生效中的记录 |
| | | * 2、判断剩余返还金额 |
| | | * 3、生成流水记录 |
| | | * 4、增加用户金额 |
| | | */ |
| | | //生效中记录 |
| | | List<MallMemberStarBuy> mallMemberStarBuys = mallMemberStarBuyMapper.selectByStatus(1); |
| | | if(CollUtil.isEmpty(mallMemberStarBuys)){ |
| | | return; |
| | | } |
| | | for(MallMemberStarBuy mallMemberStarBuy : mallMemberStarBuys){ |
| | | Long memberId = mallMemberStarBuy.getMemberId(); |
| | | MallMember mallMember = mallMemberMapper.selectById(memberId); |
| | | //用户不存在跳出本次循环 |
| | | if(ObjectUtil.isEmpty(mallMember)){ |
| | | continue; |
| | | } |
| | | //返还总金额 |
| | | BigDecimal amount = mallMemberStarBuy.getAmount(); |
| | | //剩余返还总金额不足,跳出本次循环 |
| | | BigDecimal avaAmount = mallMemberStarBuy.getAvaAmount(); |
| | | if(avaAmount.compareTo(BigDecimal.ZERO) <= 0){ |
| | | continue; |
| | | } |
| | | //每次返还比例 |
| | | DataDictionaryCustom returnPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.RETURN_PERCENT.getType(), |
| | | DataDictionaryEnum.RETURN_PERCENT.getCode() |
| | | ); |
| | | String returnPercentStr = returnPercentDic.getValue(); |
| | | BigDecimal returnPercent = new BigDecimal(returnPercentStr).multiply(new BigDecimal(0.01)); |
| | | //本次返还金额 |
| | | BigDecimal returnAmount = amount.multiply(returnPercent); |
| | | /** |
| | | * 如果本次返还金额大于剩余返还总金额 |
| | | */ |
| | | if(returnAmount.compareTo(avaAmount) >= 0){ |
| | | returnAmount = avaAmount; |
| | | avaAmount = BigDecimal.ZERO; |
| | | }else{ |
| | | avaAmount = avaAmount.subtract(returnAmount).setScale(2,BigDecimal.ROUND_DOWN); |
| | | } |
| | | //增加用户金额 |
| | | memberWalletService.addBalance(returnAmount,mallMember.getId()); |
| | | //生成流水记录 |
| | | Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow( |
| | | mallMember.getId(), |
| | | mallMemberStarBuy.getBuyCode(), |
| | | returnAmount, |
| | | MallMoneyFlowTypeEnum.RETURN_MARKET_STAR.getCode(), |
| | | MallMoneyFlow.STATUS_SUCCESS, |
| | | MallMoneyFlow.IS_RETURN_Y, |
| | | mallMember.getId(), |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | MallMoneyFlowTypeEnum.RETURN_MARKET_STAR.getName() |
| | | ); |
| | | //更新记录 |
| | | mallMemberStarBuyMapper.updateAvaAmountById(avaAmount,mallMemberStarBuy.getId()); |
| | | } |
| | | } |
| | | |
| | | @Scheduled(cron = "0 30 2 * * ? ") |
| | | public void updateMemberAccountLevelAndBuyStarRecord(){ |
| | | log.info("会员星级更新任务执行"); |
| | | //生效中的记录 |
| | | List<MallMemberStarBuy> mallMemberStarBuys = mallMemberStarBuyMapper.selectByStatus(1); |
| | | if(CollUtil.isEmpty(mallMemberStarBuys)){ |
| | | return; |
| | | } |
| | | for(MallMemberStarBuy mallMemberStarBuy : mallMemberStarBuys){ |
| | | Long memberId = mallMemberStarBuy.getMemberId(); |
| | | MallMember mallMember = mallMemberMapper.selectById(memberId); |
| | | //用户不存在跳出本次循环 |
| | | if(ObjectUtil.isEmpty(mallMember)){ |
| | | continue; |
| | | } |
| | | BigDecimal avaAmount = mallMemberStarBuy.getAvaAmount(); |
| | | /** |
| | | * 剩余返还总金额等于零,更新为已结束 |
| | | * 判断用户是否还有其他的购买星级的生效记录 |
| | | */ |
| | | if(BigDecimal.ZERO.compareTo(avaAmount) >= 0){ |
| | | mallMemberStarBuyMapper.updateStatusById(2,mallMemberStarBuy.getId()); |
| | | List<MallMemberStarBuy> mallMemberStarBuysIng = mallMemberStarBuyMapper.selectByStatusAndMemberId(1,memberId); |
| | | //如果没有其他生效中的记录,则更新用户的星级 |
| | | if(CollUtil.isEmpty(mallMemberStarBuysIng)){ |
| | | mallMemberMapper.updateAccountLevelById(MemberAccountLevelEnum.NORMAL.getName(), memberId); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @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()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |