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