Selaa lähdekoodia

处理全部扣减后,后续VIP前移,当天剩余时间属于赠送

yuanliang 8 kuukautta sitten
vanhempi
commit
b7d9985b35

+ 51 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java

@@ -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();
+    }
 }