|
@@ -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
|