package com.dsh.activity.service.impl;
|
|
import cn.hutool.core.collection.CollUtil;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.dsh.activity.entity.THuiminCard;
|
import com.dsh.activity.entity.TPayHuimin;
|
import com.dsh.activity.entity.TStudent;
|
import com.dsh.activity.enums.HuiminCardPaymentStatusEnum;
|
import com.dsh.activity.enums.HuiminCardPaymentTypeEnum;
|
import com.dsh.activity.enums.HuiminCardRefundStatusEnum;
|
import com.dsh.activity.enums.HuiminCardTypeEnum;
|
import com.dsh.activity.feignclient.account.StudentClient;
|
import com.dsh.activity.mapper.HuiminCardMapper;
|
import com.dsh.activity.model.response.MyHuiminCardVO;
|
import com.dsh.activity.service.HuiminCardService;
|
import com.dsh.activity.service.PayHuiminService;
|
import com.dsh.activity.util.UUIDUtil;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.time.LocalDateTime;
|
import java.time.ZoneId;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* @author zhibing.pu
|
* @date 2023/7/11 17:31
|
*/
|
@Service
|
public class HuiminCardServiceImpl extends ServiceImpl<HuiminCardMapper, THuiminCard> implements HuiminCardService {
|
|
private static final int ANNUAL_CARD_VALID_DAYS = 365;
|
private static final int YEAR_END_MONTH = Calendar.DECEMBER;
|
private static final int YEAR_END_DAY = 31;
|
private static final int DAY_END_HOUR = 23;
|
private static final int DAY_END_MINUTE = 59;
|
private static final int DAY_END_SECOND = 59;
|
|
@Resource
|
private PayHuiminService payHuiminService;
|
@Resource
|
private StudentClient studentClient;
|
|
@Override
|
public List<THuiminCard> getHuiminAgreementAndList(Integer pageNo, Integer pageSize, Integer storeId) {
|
return this.baseMapper.getHuiminAgreementAndList(pageNo,pageSize,storeId);
|
}
|
@Override
|
public List<THuiminCard> getHuiminAgreementAndListNolimit(Integer storeId) {
|
return this.baseMapper.getHuiminAgreementAndListNolimit(storeId);
|
}
|
|
@Override
|
public List<MyHuiminCardVO> getMyHuiminCardList(Integer pageNo, Integer pageSize,Integer appUserId) {
|
return this.baseMapper.getMyHuiminCardList(pageNo,pageSize,appUserId);
|
}
|
|
/**
|
* 为指定绑定人员录入赠送的玩湃惠民卡订单。
|
* 业务流程:参数校验 → 校验卡及人员 → 计算有效期 → 保存赠送订单。
|
*
|
* @param studentId 绑定人员ID,不可为空
|
* @param cardId 玩湃惠民卡ID,不可为空
|
* @throws IllegalArgumentException 惠民卡或绑定人员不存在时抛出
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void recordGiftHuiminCard(Integer studentId, Integer cardId) {
|
// STEP 1: 校验录入所需的基础参数。
|
if (studentId == null || cardId == null) {
|
throw new IllegalArgumentException("绑定人员和惠民卡不能为空");
|
}
|
|
// STEP 2: 查询并校验惠民卡和绑定人员,确保订单关联数据有效。
|
THuiminCard huiminCard = this.getById(cardId);
|
if (huiminCard == null) {
|
throw new IllegalArgumentException("玩湃惠民卡不存在");
|
}
|
List<TStudent> students = studentClient.getStudentByIds(String.valueOf(studentId));
|
if (CollUtil.isEmpty(students) || students.get(0).getAppUserId() == null) {
|
throw new IllegalArgumentException("绑定人员不存在或未关联用户");
|
}
|
|
// STEP 3: 按卡类型计算赠送卡的有效期。
|
Date currentTime = new Date();
|
TPayHuimin giftOrder = new TPayHuimin();
|
giftOrder.setSalesMoney(huiminCard.getSalesMoney());
|
giftOrder.setAppUserId(students.get(0).getAppUserId());
|
giftOrder.setStudentId(String.valueOf(studentId));
|
giftOrder.setEndTime(calculateEndTime(huiminCard.getHuiMinType(), currentTime));
|
|
// STEP 4: 以赠送类型保存已支付订单,保留卡面金额但不参与售卖金额统计。
|
giftOrder.setInsertTime(currentTime);
|
giftOrder.setPaymentTime(currentTime);
|
giftOrder.setPaymentType(HuiminCardPaymentTypeEnum.GIFT.getCode());
|
giftOrder.setStatus(HuiminCardPaymentStatusEnum.PAID.getCode());
|
giftOrder.setRefundStatus(HuiminCardRefundStatusEnum.PENDING_REFUND.getCode());
|
giftOrder.setCardId(huiminCard.getId());
|
giftOrder.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(5));
|
payHuiminService.save(giftOrder);
|
}
|
|
/**
|
* 根据惠民卡类型计算有效期。
|
*
|
* @param cardType 惠民卡类型
|
* @param currentTime 当前时间
|
* @return 有效期结束时间;未知类型时返回 null
|
*/
|
private Date calculateEndTime(Integer cardType, Date currentTime) {
|
if (HuiminCardTypeEnum.ANNUAL_CARD.matches(cardType)) {
|
LocalDateTime expirationTime = LocalDateTime.now().plusDays(ANNUAL_CARD_VALID_DAYS);
|
return Date.from(expirationTime.atZone(ZoneId.systemDefault()).toInstant());
|
}
|
if (HuiminCardTypeEnum.CURRENT_YEAR_CARD.matches(cardType)) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(currentTime);
|
calendar.set(Calendar.MONTH, YEAR_END_MONTH);
|
calendar.set(Calendar.DAY_OF_MONTH, YEAR_END_DAY);
|
calendar.set(Calendar.HOUR_OF_DAY, DAY_END_HOUR);
|
calendar.set(Calendar.MINUTE, DAY_END_MINUTE);
|
calendar.set(Calendar.SECOND, DAY_END_SECOND);
|
calendar.set(Calendar.MILLISECOND, 0);
|
return calendar.getTime();
|
}
|
return null;
|
}
|
}
|