| 
					
				 | 
			
			
				@@ -623,6 +623,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; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -650,18 +651,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(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -676,24 +679,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(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -728,27 +741,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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -914,4 +936,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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |