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<MallOrderInfo> 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<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)).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<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);
|
|
//如果代理等级为手动设置,则跳过该会员
|
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<MallMember> 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<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());
|
}
|
}
|
}
|
}
|
}
|