|  | @@ -1,18 +1,19 @@
 | 
	
		
			
				|  |  |  package com.yonge.cooleshow.biz.dal.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import cn.hutool.core.thread.ThreadUtil;
 | 
	
		
			
				|  |  | +import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.common.webportal.exception.BizException;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.entity.DiscountCardRecord;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.biz.dal.entity.Student;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.entity.SysUser;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.enums.*;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.mapper.DiscountCardRecordMapper;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.service.*;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.biz.dal.wrapper.VipCardRecordWrapper;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.wrapper.DiscountCardRecordWrapper;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.utils.date.DateUtil;
 | 
	
		
			
				|  |  |  import lombok.extern.slf4j.Slf4j;
 | 
	
	
		
			
				|  | @@ -21,13 +22,10 @@ import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.annotation.Resource;
 | 
	
		
			
				|  |  | -import java.time.LocalDate;
 | 
	
		
			
				|  |  |  import java.time.LocalDateTime;
 | 
	
		
			
				|  |  |  import java.time.LocalTime;
 | 
	
		
			
				|  |  |  import java.time.ZoneId;
 | 
	
		
			
				|  |  | -import java.util.Date;
 | 
	
		
			
				|  |  | -import java.util.List;
 | 
	
		
			
				|  |  | -import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
	
		
			
				|  | @@ -59,65 +57,296 @@ public class DiscountCardRecordServiceImpl extends ServiceImpl<DiscountCardRecor
 | 
	
		
			
				|  |  |              return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        DiscountCardRecord discountCardRecord = new DiscountCardRecord();
 | 
	
		
			
				|  |  | +        DiscountCardRecordWrapper.DiscountCardRecordChange discountCardRecord = new DiscountCardRecordWrapper.DiscountCardRecordChange();
 | 
	
		
			
				|  |  |          discountCardRecord.setUserId(orderDetailVo.getUserId());
 | 
	
		
			
				|  |  |          discountCardRecord.setVipCardId(orderDetailVo.getBizId());
 | 
	
		
			
				|  |  |          discountCardRecord.setOrderNo(orderDetailVo.getOrderNo());
 | 
	
		
			
				|  |  |          discountCardRecord.setSourceType(SourceTypeEnum.ORDER);
 | 
	
		
			
				|  |  |          discountCardRecord.setClientType(orderDetailVo.getOrderClient());
 | 
	
		
			
				|  |  |          discountCardRecord.setSubOrderNo(orderDetailVo.getSubOrderNo());
 | 
	
		
			
				|  |  | -        discountCardRecord.setCreateBy(orderDetailVo.getUserId());
 | 
	
		
			
				|  |  |          discountCardRecord.setType(detail.getPeriod());
 | 
	
		
			
				|  |  |          discountCardRecord.setTimes(orderDetailVo.getGoodNum());
 | 
	
		
			
				|  |  | -        discountCardRecord.setVipType(detail.getVipType());
 | 
	
		
			
				|  |  | +        discountCardRecord.setStatus(EVipRecordStatus.ADD);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        addStudentDiscount(discountCardRecord);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private List<DiscountCardRecord> usedDiscountCardRecordList(Long userId) {
 | 
	
		
			
				|  |  | +        return this.lambdaQuery()
 | 
	
		
			
				|  |  | +                .eq(DiscountCardRecord::getUserId, userId)
 | 
	
		
			
				|  |  | +                .eq(DiscountCardRecord::getEfficientFlag, 1)
 | 
	
		
			
				|  |  | +                .gt(DiscountCardRecord::getEndTime, new Date())
 | 
	
		
			
				|  |  | +                .list();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void addStudentVip(DiscountCardRecordWrapper.AddDiscountCardRecord result) {
 | 
	
		
			
				|  |  | +        DiscountCardRecordWrapper.DiscountCardRecordChange discountCardRecordChange = JSON.parseObject(JSON.toJSONString(result), DiscountCardRecordWrapper.DiscountCardRecordChange.class);
 | 
	
		
			
				|  |  | +        discountCardRecordChange.setSourceType(SourceTypeEnum.BACKEND_GIVE);
 | 
	
		
			
				|  |  | +        addStudentDiscount(discountCardRecordChange);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (Boolean.TRUE.equals(result.getSendMsg())) {
 | 
	
		
			
				|  |  | +            ThreadUtil.execute(() -> sendVipDeductionMessage(result.getUserId(),result.getTimes(),result.getType(),result.getReason()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void sendVipDeductionMessage(Long userId, Integer num,PeriodEnum period,String reason) {
 | 
	
		
			
				|  |  | +        // 添加VIP时长短信
 | 
	
		
			
				|  |  | +        com.yonge.cooleshow.auth.api.entity.SysUser sysUser = sysUserService.getByUserId(userId);
 | 
	
		
			
				|  |  | +        if (sysUser == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Map<Long, String> receivers = new HashMap<>();
 | 
	
		
			
				|  |  | +        receivers.put(sysUser.getId(), sysUser.getPhone());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 短信
 | 
	
		
			
				|  |  | +        MessageTypeEnum messageTypeEnum = MessageTypeEnum.ADD_DISCOUNT_SMS;
 | 
	
		
			
				|  |  | +        if (num < 0) {
 | 
	
		
			
				|  |  | +            messageTypeEnum = MessageTypeEnum.DEDUCTION_DISCOUNT_SMS;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, messageTypeEnum,receivers,
 | 
	
		
			
				|  |  | +                    null,0,null,ClientEnum.STUDENT.name()
 | 
	
		
			
				|  |  | +                    ,Math.abs(num) + period.getMsg(),reason);
 | 
	
		
			
				|  |  | +        } catch (Exception e) {
 | 
	
		
			
				|  |  | +            log.error("消息发送失败 ", e);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public int deductionStudentDiscount(DiscountCardRecordWrapper.DeductionDiscountCardRecord result) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 查找被扣除的记录
 | 
	
		
			
				|  |  | +        DiscountCardRecord record = this.getById(result.getRecordId());
 | 
	
		
			
				|  |  | +        if (record == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("记录不存在");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (record.getDeductionTime() != null) {
 | 
	
		
			
				|  |  | +            throw new BizException("记录已扣除");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Date endTime = record.getEndTime();
 | 
	
		
			
				|  |  | +        if (endTime.before(new Date())) {
 | 
	
		
			
				|  |  | +            throw new BizException("记录已过期");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 获取 剩余时长
 | 
	
		
			
				|  |  | +        int days =0;
 | 
	
		
			
				|  |  | +        if (record.getStartTime().before(new Date())) {
 | 
	
		
			
				|  |  | +            days = DateUtil.daysBetweenUp(new Date(), endTime);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            days = DateUtil.daysBetweenUp(record.getStartTime(), endTime);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        DiscountCardRecord deductionRecord = new DiscountCardRecord();
 | 
	
		
			
				|  |  | +        deductionRecord.setId(record.getId());
 | 
	
		
			
				|  |  | +        deductionRecord.setDeductionTime(new Date());
 | 
	
		
			
				|  |  | +        deductionRecord.setDeductionReason(result.getReason());
 | 
	
		
			
				|  |  | +        deductionRecord.setEndTime(addTime(record.getEndTime(), PeriodEnum.DAY, -days,1));
 | 
	
		
			
				|  |  | +        deductionRecord.setDeductionBy(result.getCreateBy());
 | 
	
		
			
				|  |  | +        deductionRecord.setDeductionStatus(EDeductionStatus.DEDUCT);
 | 
	
		
			
				|  |  | +        deductionRecord.setEfficientFlag(false);
 | 
	
		
			
				|  |  | +        this.updateById(deductionRecord);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 对比剩余天数
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 获取其他有效的记录
 | 
	
		
			
				|  |  | +        List<DiscountCardRecord> list = this.lambdaQuery()
 | 
	
		
			
				|  |  | +                .eq(DiscountCardRecord::getUserId, record.getUserId())
 | 
	
		
			
				|  |  | +                .gt(DiscountCardRecord::getEndTime, endTime)
 | 
	
		
			
				|  |  | +                .eq(DiscountCardRecord::getEfficientFlag, 1)
 | 
	
		
			
				|  |  | +                .list();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(list)) {
 | 
	
		
			
				|  |  | +            return days;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<DiscountCardRecord> updateList = new ArrayList<>();
 | 
	
		
			
				|  |  | +        for (DiscountCardRecord discountCardRecord : list) {
 | 
	
		
			
				|  |  | +            DiscountCardRecord cardRecord = new DiscountCardRecord();
 | 
	
		
			
				|  |  | +            cardRecord.setId(discountCardRecord.getId());
 | 
	
		
			
				|  |  | +            cardRecord.setStartTime(addTime(discountCardRecord.getStartTime(), PeriodEnum.DAY, -days,0));
 | 
	
		
			
				|  |  | +            cardRecord.setEndTime(addTime(discountCardRecord.getEndTime(), PeriodEnum.DAY, -days,1));
 | 
	
		
			
				|  |  | +            updateList.add(cardRecord);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        this.updateBatchById(updateList);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return days;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private Long addStudentDiscount(DiscountCardRecordWrapper.DiscountCardRecordChange result) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        DiscountCardRecord discountCardRecord = new DiscountCardRecord();
 | 
	
		
			
				|  |  | +        discountCardRecord.setUserId(result.getUserId());
 | 
	
		
			
				|  |  | +        discountCardRecord.setVipCardId(result.getVipCardId());
 | 
	
		
			
				|  |  | +        discountCardRecord.setOrderNo(result.getOrderNo());
 | 
	
		
			
				|  |  | +        discountCardRecord.setSourceType(result.getSourceType());
 | 
	
		
			
				|  |  | +        discountCardRecord.setClientType(ClientEnum.STUDENT);
 | 
	
		
			
				|  |  | +        discountCardRecord.setSubOrderNo(result.getSubOrderNo());
 | 
	
		
			
				|  |  | +        discountCardRecord.setCreateBy(result.getCreateBy());
 | 
	
		
			
				|  |  | +        discountCardRecord.setType(result.getType());
 | 
	
		
			
				|  |  | +        discountCardRecord.setTimes(result.getTimes());
 | 
	
		
			
				|  |  | +        discountCardRecord.setReason(result.getReason());
 | 
	
		
			
				|  |  | +        discountCardRecord.setVipType(EVipType.DISCOUNT);
 | 
	
		
			
				|  |  |          discountCardRecord.setStatus(EVipRecordStatus.ADD);
 | 
	
		
			
				|  |  |          discountCardRecord.setDisplayFlag(true);
 | 
	
		
			
				|  |  |          discountCardRecord.setEfficientFlag(true);
 | 
	
		
			
				|  |  | -        discountCardRecord.setSendMsg(false);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 设置时间
 | 
	
		
			
				|  |  | -        Student student = studentService.getById(orderDetailVo.getUserId());
 | 
	
		
			
				|  |  | -        LocalDate startTime = LocalDate.now();
 | 
	
		
			
				|  |  | -        if (student.getDiscountEndTime() != null && student.getDiscountEndTime().after(new Date())) {
 | 
	
		
			
				|  |  | -            startTime = student.getDiscountEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        LocalDate endTime = LocalDate.now();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        switch (discountCardRecord.getType()) {
 | 
	
		
			
				|  |  | -            case DAY:
 | 
	
		
			
				|  |  | -                endTime = startTime.plusDays(discountCardRecord.getTimes());
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            case MONTH:
 | 
	
		
			
				|  |  | -                endTime = startTime.plusMonths(discountCardRecord.getTimes());
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            case QUARTERLY:
 | 
	
		
			
				|  |  | -                endTime = startTime.plusMonths(discountCardRecord.getTimes() * 3L);
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            case YEAR_HALF:
 | 
	
		
			
				|  |  | -                endTime = startTime.plusMonths(discountCardRecord.getTimes() * 6L);
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            case YEAR:
 | 
	
		
			
				|  |  | -                endTime = startTime.plusYears(discountCardRecord.getTimes());
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            default:
 | 
	
		
			
				|  |  | -                log.error("时间类型错误{}", discountCardRecord.getType());
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        if (startTime.isAfter(LocalDate.now())) {
 | 
	
		
			
				|  |  | -            startTime = startTime.plusDays(1);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 设置开始时间
 | 
	
		
			
				|  |  | +        List<DiscountCardRecord> discountCardRecords = usedDiscountCardRecordList(result.getUserId());
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isNotEmpty(discountCardRecords)) {
 | 
	
		
			
				|  |  | +            discountCardRecord.setStartTime(discountCardRecords.stream().max(Comparator.comparing(DiscountCardRecord::getEndTime)).get().getEndTime());
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            discountCardRecord.setStartTime(new Date());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        discountCardRecord.setStartTime(DateUtil.localDateTimeToDate(startTime.atTime(LocalTime.MIN)));
 | 
	
		
			
				|  |  | -        discountCardRecord.setEndTime(DateUtil.localDateTimeToDate(endTime.atTime(23,59,59)));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        discountCardRecord.setEndTime(addTime(discountCardRecord.getStartTime(), discountCardRecord.getType(), discountCardRecord.getTimes(),1));
 | 
	
		
			
				|  |  | +        formatVipRecordTime(discountCardRecord);
 | 
	
		
			
				|  |  | +        discountCardRecord.setEstimatedEndTime(discountCardRecord.getStartTime());
 | 
	
		
			
				|  |  | +        discountCardRecord.setEstimatedStartTime(discountCardRecord.getEndTime());
 | 
	
		
			
				|  |  |          this.save(discountCardRecord);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        updateUserTime(discountCardRecord.getUserId(),discountCardRecord.getClientType());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return discountCardRecord.getId();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void updateUserTime(Long userId, ClientEnum clientType) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 设置开始时间
 | 
	
		
			
				|  |  | +        List<DiscountCardRecord> discountCardRecords = usedDiscountCardRecordList(userId);
 | 
	
		
			
				|  |  | +        Date endTime = null;
 | 
	
		
			
				|  |  | +        Date startTime = null;
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isNotEmpty(discountCardRecords)) {
 | 
	
		
			
				|  |  | +            endTime = discountCardRecords.stream().max(Comparator.comparing(DiscountCardRecord::getEndTime)).get().getEndTime();
 | 
	
		
			
				|  |  | +            startTime = discountCardRecords.stream().min(Comparator.comparing(DiscountCardRecord::getStartTime)).get().getStartTime();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // 更新学生时长
 | 
	
		
			
				|  |  | -        studentService.lambdaUpdate()
 | 
	
		
			
				|  |  | -                .set(Student::getDiscountEndTime, discountCardRecord.getEndTime())
 | 
	
		
			
				|  |  | -                .set(student.getDiscountStartTime() == null,Student::getDiscountStartTime, discountCardRecord.getStartTime())
 | 
	
		
			
				|  |  | -                .eq(Student::getUserId, orderDetailVo.getUserId())
 | 
	
		
			
				|  |  | -                .update();
 | 
	
		
			
				|  |  | +        baseMapper.updateUserDiscountTime(userId, startTime, endTime);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public IPage<DiscountCardRecordWrapper.DiscountCardRecord> selectPage(IPage<DiscountCardRecordWrapper.DiscountCardRecord> page, DiscountCardRecordWrapper.DiscountCardRecordQuery query) {
 | 
	
		
			
				|  |  | +        IPage<DiscountCardRecordWrapper.DiscountCardRecord> discountCardRecordIPage = baseMapper.selectPage(page, query);
 | 
	
		
			
				|  |  | +        List<DiscountCardRecordWrapper.DiscountCardRecord> records = discountCardRecordIPage.getRecords();
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(records)) {
 | 
	
		
			
				|  |  | +            return discountCardRecordIPage;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 创建人ID集合
 | 
	
		
			
				|  |  | +        List<Long> createByList = records.stream()
 | 
	
		
			
				|  |  | +                .map(DiscountCardRecordWrapper.DiscountCardRecord::getOperatorId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
 | 
	
		
			
				|  |  | +        Map<Long, SysUser> userMap = sysUserService.getMapByIds(createByList);
 | 
	
		
			
				|  |  | +        records.forEach(discountCardRecord -> {
 | 
	
		
			
				|  |  | +            SysUser sysUser = userMap.get(discountCardRecord.getOperatorId());
 | 
	
		
			
				|  |  | +            if (sysUser != null) {
 | 
	
		
			
				|  |  | +                discountCardRecord.setOperatorName(sysUser.getRealName());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        return discountCardRecordIPage;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 获取剩余时长
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public DiscountCardRecordWrapper.Info info(DiscountCardRecordWrapper.InfoQuery infoQuery) {
 | 
	
		
			
				|  |  | +        DiscountCardRecordWrapper.Info info = new DiscountCardRecordWrapper.Info();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<DiscountCardRecord> discountCardRecords = usedDiscountCardRecordList(infoQuery.getUserId());
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(discountCardRecords)) {
 | 
	
		
			
				|  |  | +            return info;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 最大时间
 | 
	
		
			
				|  |  | +        DiscountCardRecord discountCardRecord = discountCardRecords.stream().max(Comparator.comparing(DiscountCardRecord::getEndTime)).get();
 | 
	
		
			
				|  |  | +        info.setSurplusDay(DateUtil.daysBetweenUp(new Date(), discountCardRecord.getEndTime()));
 | 
	
		
			
				|  |  | +        return info;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 扣减畅学卡
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void deduction(DiscountCardRecordWrapper.DeductionDiscountCardRecord result) {
 | 
	
		
			
				|  |  | +        // 判断是否是生效中
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        DiscountCardRecord discountCardRecord = this.getById(result.getRecordId());
 | 
	
		
			
				|  |  | +        if (discountCardRecord == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("畅学卡记录不存在");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (discountCardRecord.getEndTime().before(new Date())) {
 | 
	
		
			
				|  |  | +            throw new BizException("畅学卡已过期");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        int days = deductionStudentDiscount(result);
 | 
	
		
			
				|  |  | +        updateUserTime(result.getUserId(),ClientEnum.STUDENT);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (Boolean.TRUE.equals(result.getSendMsg())) {
 | 
	
		
			
				|  |  | +            ThreadUtil.execute(() -> sendVipDeductionMessage(result.getUserId(),-days,PeriodEnum.DAY,result.getReason()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private Date addTime(Date time, PeriodEnum period, Integer times, int type) {
 | 
	
		
			
				|  |  | +        Calendar cal = Calendar.getInstance();
 | 
	
		
			
				|  |  | +        cal.setTime(time);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (PeriodEnum.DAY.equals(period)) {
 | 
	
		
			
				|  |  | +            cal.add(Calendar.DAY_OF_MONTH, times);
 | 
	
		
			
				|  |  | +        } else if (PeriodEnum.MONTH.equals(period)) {
 | 
	
		
			
				|  |  | +            cal.add(Calendar.MONTH, times);
 | 
	
		
			
				|  |  | +        } else if (PeriodEnum.YEAR.equals(period)) {
 | 
	
		
			
				|  |  | +            cal.add(Calendar.YEAR, times);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (type ==0) {
 | 
	
		
			
				|  |  | +            cal.set(Calendar.HOUR_OF_DAY, 0);
 | 
	
		
			
				|  |  | +            cal.set(Calendar.MINUTE, 0);
 | 
	
		
			
				|  |  | +            cal.set(Calendar.SECOND, 0);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            cal.set(Calendar.HOUR_OF_DAY, 23);
 | 
	
		
			
				|  |  | +            cal.set(Calendar.MINUTE, 59);
 | 
	
		
			
				|  |  | +            cal.set(Calendar.SECOND, 59);
 | 
	
		
			
				|  |  | +            cal.set(Calendar.MILLISECOND, 0);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        cal.set(Calendar.MILLISECOND, 0);
 | 
	
		
			
				|  |  | +        return cal.getTime();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public DiscountCardRecord formatVipRecordTime(DiscountCardRecord discountCardRecord) {
 | 
	
		
			
				|  |  | +        // 如果开始时间是23:59:59,开始时间改为第二天的00:00:00
 | 
	
		
			
				|  |  | +        LocalDateTime startTime = discountCardRecord.getStartTime().toInstant()
 | 
	
		
			
				|  |  | +                .atZone(ZoneId.systemDefault()).toLocalDateTime();
 | 
	
		
			
				|  |  | +        if (startTime.toLocalTime().equals(LocalTime.of(23, 59, 59))) {
 | 
	
		
			
				|  |  | +            startTime = startTime.plusDays(1);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        startTime = startTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
 | 
	
		
			
				|  |  | +        // 如果结束时间是00:00:00,开始时间改为前一天的23:59:59
 | 
	
		
			
				|  |  | +        LocalDateTime endTime = discountCardRecord.getEndTime().toInstant()
 | 
	
		
			
				|  |  | +                .atZone(ZoneId.systemDefault()).toLocalDateTime();
 | 
	
		
			
				|  |  | +        if (endTime.toLocalTime().equals(LocalTime.of(0, 0, 0))) {
 | 
	
		
			
				|  |  | +            endTime = endTime.plusDays(-1);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        endTime = endTime.withHour(23).withMinute(59).withSecond(59).withNano(0);
 | 
	
		
			
				|  |  | +        discountCardRecord.setStartTime(Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()));
 | 
	
		
			
				|  |  | +        discountCardRecord.setEndTime(Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()));
 | 
	
		
			
				|  |  | +        if (discountCardRecord.getStartTime().after(discountCardRecord.getEndTime())) {
 | 
	
		
			
				|  |  | +            discountCardRecord.setEndTime(discountCardRecord.getStartTime());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return discountCardRecord;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 |