package cc.mrbird.febs.mall.quartz; 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; /** * @author wzy * @date 2021-09-25 **/ @Slf4j @Component public class OrderOvertimeJob { @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() { log.info("订单超时任务执行"); List orderList = orderInfoMapper.selectOrderInfoByStatus(OrderStatusEnum.WAIT_PAY.getValue()); if (CollUtil.isNotEmpty(orderList)) { for (MallOrderInfo orderInfo : orderList) { long subTime = DateUtil.between(orderInfo.getOrderTime(), new Date(), DateUnit.MINUTE, false); if (subTime > 15) { orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue()); orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY); orderInfoMapper.updateById(orderInfo); } } } } @Scheduled(cron = "0 0 2 * * ? ") public void returnBuyStarAmount(){ log.info("会员星级保证金返还任务执行"); /** * 1、生效中的记录 * 2、判断剩余返还金额 * 3、生成流水记录 * 4、增加用户金额 */ //生效中记录 List 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)).setScale(2,BigDecimal.ROUND_DOWN); //本次返还金额 BigDecimal returnAmount = amount.multiply(returnPercent).setScale(2,BigDecimal.ROUND_DOWN); /** * 如果本次返还金额大于剩余返还总金额 */ 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 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 mallMemberStarBuysIng = mallMemberStarBuyMapper.selectByStatusAndMemberId(1,memberId); //如果没有其他生效中的记录,则更新用户的星级为普通,更新会员代理等级为代理 if(CollUtil.isEmpty(mallMemberStarBuysIng)){ mallMemberMapper.updateAccountLevelById(MemberAccountLevelEnum.NORMAL.getName(), memberId); //如果代理等级为手动设置,则跳过该会员 int levelStatus = ObjectUtil.isEmpty(mallMember.getLevelStatus()) ? 0 : 1; if(1 == levelStatus){ continue; } mallMemberMapper.updateLevelById(MemberAgentLevelEnum.AGENT.getName(),mallMember.getId()); } } } } @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 agentLevelList = mallMemberMapper.selectByAccountLevel(levelSelf); if(CollUtil.isNotEmpty(agentLevelList)){ for(MallMember mallMember : agentLevelList){ //如果代理等级为手动设置,则跳过该会员 int levelStatus = ObjectUtil.isEmpty(mallMember.getLevelStatus()) ? 0 : 1; if(1 == levelStatus){ continue; } //有星级的直推 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 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()); } } } } }