|  | @@ -604,6 +604,7 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 | 
	
		
			
				|  |  |              throw new BizException("剩余扣减数量不足");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        Date now = new Date();
 | 
	
		
			
				|  |  |          LocalDateTime maxEndTime = collect.stream().map(VipCardRecord::getEndTime).max(Comparator.naturalOrder()).get().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
 | 
	
		
			
				|  |  |          // 扣减后的开始时间
 | 
	
		
			
				|  |  |          LocalDateTime deductedStartTime;
 | 
	
	
		
			
				|  | @@ -631,18 +632,20 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 | 
	
		
			
				|  |  |          Date minStartTime = collect.stream().map(VipCardRecord::getStartTime).min(Comparator.naturalOrder()).get();
 | 
	
		
			
				|  |  |          // 如果扣减的数量超过1天,则提示扣减数量不足
 | 
	
		
			
				|  |  |          if (deductedStartDate.before(minStartTime)) {
 | 
	
		
			
				|  |  | +            double day = (minStartTime.getTime() - deductedStartDate.getTime()) * 1.0D / (24 * 60 * 60 * 1000);
 | 
	
		
			
				|  |  | +            if (day > 1.0D) {
 | 
	
		
			
				|  |  | +                throw new BizException("剩余扣减数量不足");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              deductedStartDate = minStartTime;
 | 
	
		
			
				|  |  | -//            double day = (minStartTime.getTime() - deductedStartDate.getTime()) * 1.0D / (24 * 60 * 60 * 1000);
 | 
	
		
			
				|  |  | -//            if (day > 1.0D) {
 | 
	
		
			
				|  |  | -//                throw new BizException("剩余扣减数量不足");
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 重新计算会员时间,每一条记录置换成一条新的记录,时间区间重新计算
 | 
	
		
			
				|  |  |          List<VipCardRecord> updateRecords = new ArrayList<>();
 | 
	
		
			
				|  |  |          Long deductMills = null;
 | 
	
		
			
				|  |  | +        Long endDeductMills = null;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          EVipType vipType = addVipCardRecord.getVipType();
 | 
	
		
			
				|  |  | +        boolean giveFlag = false; // 扣减后,剩余时间前移,第一条记录赠送当天的时间
 | 
	
		
			
				|  |  |          for (VipCardRecord vipCardRecord : vipCardRecordList) {
 | 
	
		
			
				|  |  |              Date startTime = vipCardRecord.getStartTime();
 | 
	
		
			
				|  |  |              Date endTime = vipCardRecord.getEndTime();
 | 
	
	
		
			
				|  | @@ -657,24 +660,34 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 | 
	
		
			
				|  |  |              Long addId = null;
 | 
	
		
			
				|  |  |              // 扣减到当前时间区间
 | 
	
		
			
				|  |  |              if ((deductedStartDate.after(startTime) || deductedStartDate.equals(startTime)) && deductedStartDate.before(endTime)) {
 | 
	
		
			
				|  |  | -                VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
 | 
	
		
			
				|  |  | -                addRecord.setId(null);
 | 
	
		
			
				|  |  | -                addRecord.setDisplayFlag(false);
 | 
	
		
			
				|  |  | -                addRecord.setEfficientFlag(true);
 | 
	
		
			
				|  |  | -                addRecord.setEndTime(formatEnd(deductedStartDate));
 | 
	
		
			
				|  |  | -                addRecord.setStatus(EVipRecordStatus.UPDATE);
 | 
	
		
			
				|  |  | -                save(addRecord);
 | 
	
		
			
				|  |  | -                addId = addRecord.getId();
 | 
	
		
			
				|  |  | +                if (deductedStartDate.after(now)) { // 还有剩余天数,不足一天,补充到当前全天
 | 
	
		
			
				|  |  | +                    VipCardRecord addRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
 | 
	
		
			
				|  |  | +                    addRecord.setId(null);
 | 
	
		
			
				|  |  | +                    addRecord.setDisplayFlag(false);
 | 
	
		
			
				|  |  | +                    addRecord.setEfficientFlag(true);
 | 
	
		
			
				|  |  | +                    addRecord.setEndTime(formatEnd(deductedStartDate));
 | 
	
		
			
				|  |  | +                    addRecord.setStatus(EVipRecordStatus.UPDATE);
 | 
	
		
			
				|  |  | +                    save(addRecord);
 | 
	
		
			
				|  |  | +                    addId = addRecord.getId();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  deductMills = endTime.getTime() - deductedStartDate.getTime();
 | 
	
		
			
				|  |  | +                endDeductMills = endTime.getTime() - formatEnd(deductedStartDate).getTime();
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  // 有扣减,整体时间前移
 | 
	
		
			
				|  |  |                  if (deductMills != null) {
 | 
	
		
			
				|  |  |                      VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
 | 
	
		
			
				|  |  |                      newRecord.setId(null);
 | 
	
		
			
				|  |  | +                    newRecord.setDisplayFlag(false);
 | 
	
		
			
				|  |  |                      newRecord.setEfficientFlag(true);
 | 
	
		
			
				|  |  | -                    newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
 | 
	
		
			
				|  |  | -                    newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - deductMills));
 | 
	
		
			
				|  |  | +                    if (!giveFlag) {
 | 
	
		
			
				|  |  | +                        newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
 | 
	
		
			
				|  |  | +                        giveFlag = true;
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - endDeductMills));
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - endDeductMills));
 | 
	
		
			
				|  |  |                      newRecord.setStatus(EVipRecordStatus.UPDATE);
 | 
	
		
			
				|  |  |                      save(newRecord);
 | 
	
		
			
				|  |  |                      addId = newRecord.getId();
 | 
	
	
		
			
				|  | @@ -709,27 +722,36 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 最后一个非永久SVIP的结束时间
 | 
	
		
			
				|  |  |          Date lastUnPereutalDate = new Date();
 | 
	
		
			
				|  |  | -        long deductMills = 0L;
 | 
	
		
			
				|  |  | +        Date lastEndUnPereutalDate = formatEnd(new Date());
 | 
	
		
			
				|  |  | +        Long deductMills = null;
 | 
	
		
			
				|  |  | +        Long endDeductMills = null;
 | 
	
		
			
				|  |  | +        boolean giveFlag = false;
 | 
	
		
			
				|  |  |          for (VipCardRecord vipCardRecord : vipCardRecordList) {
 | 
	
		
			
				|  |  |              if (EVipType.SVIP.equals(vipCardRecord.getVipType())) {
 | 
	
		
			
				|  |  |                  // 获取后续VIP向前平移的开始时间
 | 
	
		
			
				|  |  |                  if (!PeriodEnum.PERPETUAL.equals(vipCardRecord.getType())) {
 | 
	
		
			
				|  |  |                      if (vipCardRecord.getEndTime().after(lastUnPereutalDate)) {
 | 
	
		
			
				|  |  |                          lastUnPereutalDate = vipCardRecord.getEndTime();
 | 
	
		
			
				|  |  | +                        lastEndUnPereutalDate = vipCardRecord.getEndTime();
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      continue;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  vipCardRecord.setEfficientFlag(false);
 | 
	
		
			
				|  |  |                  updateById(vipCardRecord);
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  | -                deductMills += vipCardRecord.getStartTime().getTime() - lastUnPereutalDate.getTime();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |                  VipCardRecord newRecord = JSON.parseObject(JSON.toJSONString(vipCardRecord), VipCardRecord.class);
 | 
	
		
			
				|  |  |                  newRecord.setId(null);
 | 
	
		
			
				|  |  |                  newRecord.setDisplayFlag(false);
 | 
	
		
			
				|  |  |                  newRecord.setEfficientFlag(true);
 | 
	
		
			
				|  |  | -                newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
 | 
	
		
			
				|  |  | -                newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - deductMills));
 | 
	
		
			
				|  |  | +                if (!giveFlag) {
 | 
	
		
			
				|  |  | +                    deductMills = vipCardRecord.getStartTime().getTime() - lastUnPereutalDate.getTime();
 | 
	
		
			
				|  |  | +                    endDeductMills = vipCardRecord.getStartTime().getTime() - lastEndUnPereutalDate.getTime();
 | 
	
		
			
				|  |  | +                    newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - deductMills));
 | 
	
		
			
				|  |  | +                    giveFlag = true;
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    newRecord.setStartTime(new Date(newRecord.getStartTime().getTime() - endDeductMills));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                newRecord.setEndTime(new Date(newRecord.getEndTime().getTime() - endDeductMills));
 | 
	
		
			
				|  |  |                  save(newRecord);
 | 
	
		
			
				|  |  |                  Long refId = newRecord.getId();
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -895,4 +917,14 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
 | 
	
		
			
				|  |  |          c1.set(Calendar.SECOND, 59);
 | 
	
		
			
				|  |  |          return c1.getTime();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private Date formatStart(Date date) {
 | 
	
		
			
				|  |  | +        Calendar c1 = Calendar.getInstance();
 | 
	
		
			
				|  |  | +        c1.setTime(date);
 | 
	
		
			
				|  |  | +        c1.set(Calendar.HOUR_OF_DAY, 0);
 | 
	
		
			
				|  |  | +        c1.set(Calendar.MINUTE, 0);
 | 
	
		
			
				|  |  | +        c1.set(Calendar.SECOND, 0);
 | 
	
		
			
				|  |  | +        c1.set(Calendar.MILLISECOND, 0);
 | 
	
		
			
				|  |  | +        return c1.getTime();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |