package com.mzl.flower.service.impl.coupon;
|
|
import cn.hutool.core.util.IdUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.mzl.flower.config.exception.ValidationException;
|
import com.mzl.flower.config.security.SecurityUtils;
|
import com.mzl.flower.constant.Constants;
|
import com.mzl.flower.dto.request.coupon.*;
|
import com.mzl.flower.dto.response.coupon.CouponPointStatisVO;
|
import com.mzl.flower.dto.response.coupon.CouponTemplateCustomerVO;
|
import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
|
import com.mzl.flower.entity.coupon.CouponRecordDO;
|
import com.mzl.flower.entity.coupon.CouponTemplateCustomerDO;
|
import com.mzl.flower.entity.coupon.CouponTemplateDO;
|
import com.mzl.flower.entity.customer.Customer;
|
import com.mzl.flower.entity.menber.Member;
|
import com.mzl.flower.entity.point.CustomerPoint;
|
import com.mzl.flower.entity.point.CustomerPointDetail;
|
import com.mzl.flower.enums.*;
|
import com.mzl.flower.mapper.coupon.CouponTemplateMapper;
|
import com.mzl.flower.mapper.coupon.CouponTemplateMapperCustom;
|
import com.mzl.flower.mapper.customer.CustomerMapper;
|
import com.mzl.flower.mapper.point.CustomerPointDetailMapper;
|
import com.mzl.flower.mapper.point.CustomerPointMapper;
|
import com.mzl.flower.service.coupon.CouponRecordService;
|
import com.mzl.flower.service.coupon.CouponTemplateCustomerService;
|
import com.mzl.flower.service.coupon.CouponTemplateService2;
|
import com.mzl.flower.service.menber.MemberService;
|
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author @TaoJie
|
* @since 2024-08-22
|
*/
|
@Service
|
public class CouponTemplateServiceImpl2 extends ServiceImpl<CouponTemplateMapper, CouponTemplateDO> implements CouponTemplateService2 {
|
|
@Autowired
|
private CouponTemplateMapperCustom couponTemplateMapperCustom;
|
|
@Autowired
|
private CouponTemplateCustomerService pointCustomReService;
|
|
@Autowired
|
private CouponRecordService couponRecordService;
|
|
@Autowired
|
private CustomerMapper customerMapper;
|
|
@Autowired
|
private CustomerPointMapper customerPointMapper;
|
|
@Autowired
|
private CouponTemplateService2 couponTemplateService;
|
|
@Autowired
|
private CustomerPointDetailMapper customerPointDetailMapper;
|
|
@Autowired
|
private MemberService memberService;
|
|
|
|
@Transactional
|
@Override
|
public boolean createCouponTemplate(CreateCouponTemplateBO dto) {
|
CouponTemplateDO couponTemplateDO = new CouponTemplateDO();
|
BeanUtils.copyProperties(dto, couponTemplateDO);
|
// 设置id,关联使用到的id
|
couponTemplateDO.setId(IdUtil.simpleUUID());
|
|
couponTemplateDO.create(SecurityUtils.getUserId());
|
if (StringUtils.isBlank(dto.getStatus())) {
|
// 优惠券状态 初始化为未激活状态
|
couponTemplateDO.setStatus(CouponStatusEnum.INACTIVE.getStatus());
|
}
|
|
// 指定会员:需要添加制定用户的关联信息
|
if (CollectionUtils.isNotEmpty(dto.getPointCostomIdList())) {
|
|
final List<CouponTemplateCustomerDO> couponCustomList = dto.getPointCostomIdList().stream().map(customId -> {
|
CouponTemplateCustomerDO customReDO = new CouponTemplateCustomerDO();
|
// 解决本地不加ID不报错,线上报错问题
|
customReDO.setId(IdUtil.simpleUUID());
|
customReDO.setCouponId(couponTemplateDO.getId());
|
customReDO.setCustomId(customId);
|
return customReDO;
|
}).collect(Collectors.toList());
|
|
// 批量插入 优惠券与指定用户关联关系
|
pointCustomReService.saveBatch(couponCustomList);
|
|
// 设置优惠券的数量
|
couponTemplateDO.setCouponAmount(dto.getPointCostomIdList().size());
|
|
}
|
|
return baseMapper.insert(couponTemplateDO) > 0;
|
}
|
|
@Transactional
|
@Override
|
public boolean updateCouponTemplate(CreateCouponTemplateBO dto) {
|
CouponTemplateDO couponTemplateDO = baseMapper.selectById(dto.getId());
|
BeanUtils.copyProperties(dto, couponTemplateDO);
|
couponTemplateDO.update(SecurityUtils.getUserId());
|
|
if (CollectionUtils.isNotEmpty(dto.getPointCostomIdList())) {
|
// 根据优惠券的信息删除关联信息
|
pointCustomReService.deleteByCouponTemplateId(couponTemplateDO.getId());
|
}
|
// 指定会员:需要添加制定用户的关联信息
|
if (CollectionUtils.isNotEmpty(dto.getPointCostomIdList())) {
|
|
final List<CouponTemplateCustomerDO> couponCustomList = dto.getPointCostomIdList().stream().map(customId -> {
|
CouponTemplateCustomerDO customReDO = new CouponTemplateCustomerDO();
|
// 解决本地不加ID不报错,线上报错问题
|
customReDO.setId(IdUtil.simpleUUID());
|
customReDO.setCouponId(couponTemplateDO.getId());
|
customReDO.setCustomId(customId);
|
return customReDO;
|
}).collect(Collectors.toList());
|
|
// 批量插入 优惠券与指定用户关联关系
|
pointCustomReService.saveBatch(couponCustomList);
|
|
// 设置优惠券总数当前人数
|
couponTemplateDO.setCouponAmount(couponCustomList.size());
|
|
}
|
|
|
return baseMapper.updateById(couponTemplateDO) > 0;
|
}
|
|
@Override
|
public List<CouponTemplateVO> getList(QueryCouponDTO dto) {
|
|
List<CouponTemplateVO> list =new ArrayList<>();
|
if(StringUtils.isNotBlank(dto.getCategory())
|
&& dto.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())
|
){
|
// 会员优惠券
|
list = couponTemplateMapperCustom.getVipList(dto);
|
}else{
|
list = couponTemplateMapperCustom.getList(dto);
|
}
|
return list;
|
}
|
|
@Override
|
public Page<CouponTemplateVO> getPage(Page page, QueryCouponDTO dto) {
|
List<CouponTemplateVO> result =new ArrayList<>();
|
if(StringUtils.isNotBlank(dto.getCategory())
|
&& dto.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())
|
){
|
// 会员优惠券
|
result = couponTemplateMapperCustom.getCouponTemplateVipPage(page, dto);
|
}else{
|
result = couponTemplateMapperCustom.getCouponTemplatePage(page, dto);
|
}
|
return page.setRecords(result);
|
}
|
|
@Override
|
public CouponTemplateVO getDetailById(String id) {
|
QueryCouponDTO dto = new QueryCouponDTO();
|
dto.setId(id);
|
final List<CouponTemplateVO> list = getList(dto);
|
if (CollectionUtils.isNotEmpty(list)) {
|
CouponTemplateVO vo =list.get(0);
|
// 用户获取
|
if(StringUtils.isNotBlank(vo.getCategory())
|
&& vo.getCategory().equals(CouponCategoryEnum.USER.getStatus())){
|
List<CouponTemplateCustomerVO> customerList= couponTemplateMapperCustom.getCouponCustomerList(id);
|
vo.setCustomerList(customerList);
|
}
|
// 会员等级
|
if(StringUtils.isNotBlank(vo.getCategory()) && null!=vo.getMemberId()
|
&& vo.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())){
|
final Member member = memberService.getById(vo.getMemberId());
|
if(null!=member){
|
vo.setMember(member);
|
vo.setMemberName(member.getName());
|
}
|
|
}
|
|
return vo;
|
}
|
return null;
|
}
|
|
@Transactional
|
@Override
|
public boolean deleteCouponTemplate(String id) {
|
return baseMapper.deleteById(id) > 0;
|
}
|
|
@Transactional
|
@Override
|
public boolean activeCouponTemplate(String id) {
|
|
CouponTemplateDO couponTemplateDO = baseMapper.selectById(id);
|
couponTemplateDO.setStatus(CouponStatusEnum.ACTIVE.getStatus());
|
|
// 判断当前的优惠券的用户类型是指定用户还是全部用户,如果是指定用户的情况下需要发布优惠券
|
if (StringUtils.isNotBlank(couponTemplateDO.getGetUserType())
|
&& StringUtils.isNotBlank(couponTemplateDO.getCategory())
|
&& couponTemplateDO.getGetUserType().equals(CouponGetUserTypeEnum.TARGET.getType())
|
&& couponTemplateDO.getCategory().equals(CouponCategoryEnum.USER.getStatus())
|
) {
|
|
// 获取当前优惠券下的指定人员信息
|
List<CouponTemplateCustomerDO> couponTemplateCustomerDOList = pointCustomReService.getPointCustomReList(id);
|
|
if (CollectionUtils.isNotEmpty(couponTemplateCustomerDOList)) {
|
|
// 根据发放后有效期来设置时间
|
if (couponTemplateDO.getUsageTimeNum() == null || couponTemplateDO.getUsageTimeNum() <= 0) {
|
throw new IllegalArgumentException("使用时间数量必须为正整数");
|
}
|
LocalDateTime currentTime = LocalDateTime.now();
|
couponTemplateDO.setUsageStartDate(currentTime);
|
if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.DAY.getType())) {
|
// 天
|
couponTemplateDO.setUsageEndDate(currentTime.plusDays(couponTemplateDO.getUsageTimeNum()));
|
}
|
if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.HOUR.getType())) {
|
// 小时
|
couponTemplateDO.setUsageEndDate(currentTime.plusHours(couponTemplateDO.getUsageTimeNum()));
|
}
|
if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.MINUTE.getType())) {
|
// 分钟
|
couponTemplateDO.setUsageEndDate(currentTime.plusMinutes(couponTemplateDO.getUsageTimeNum()));
|
}
|
|
// 优惠券的总数等于下发人员的总数
|
couponTemplateDO.setCouponAmount(couponTemplateCustomerDOList.size());
|
|
List<CouponRecordDO> couponUsageDOList = couponTemplateCustomerDOList.stream().map(pointCustomRe -> {
|
|
CouponRecordDO couponRecordDO = new CouponRecordDO();
|
couponRecordDO.setId(IdUtil.simpleUUID());
|
couponRecordDO.setCouponId(pointCustomRe.getCouponId());
|
couponRecordDO.setCustomerId(pointCustomRe.getCustomId());
|
final Customer customer = customerMapper.selectById(pointCustomRe.getCustomId());
|
if (null != customer && StringUtils.isNotBlank(customer.getUserId())) {
|
// 设置所属用户id
|
couponRecordDO.setUserId(customer.getUserId());
|
}
|
couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType());
|
|
// 设置优惠券的使用开始时间
|
couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate());
|
// 设置优惠券的使用结束时间
|
couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate());
|
|
// 优惠券的冗余字段
|
couponRecordDO.setCouponCode(couponTemplateDO.getCouponCode());
|
couponRecordDO.setCouponName(couponTemplateDO.getCouponName());
|
// 优惠券种类
|
couponRecordDO.setCategory(couponTemplateDO.getCategory());
|
couponRecordDO.setMinOrderAmount(couponTemplateDO.getMinOrderAmount());
|
couponRecordDO.setCouponDiscountValue(couponTemplateDO.getCouponDiscountValue());
|
couponRecordDO.setGetType(couponTemplateDO.getGetType());
|
couponRecordDO.setCouponDiscountType(couponTemplateDO.getCouponDiscountType());
|
couponRecordDO.setGetUserType(couponTemplateDO.getGetUserType());
|
couponRecordDO.setPoint(couponTemplateDO.getPoint());
|
couponRecordDO.setMemberId(couponRecordDO.getMemberId());
|
|
// 创建相关信息
|
couponRecordDO.create(SecurityUtils.getUserId());
|
|
// 查看当前优惠券是不是已经存在,存在的话则不能添加,防止同一人员重复下发同一张指定的优惠券
|
if(!couponRecordService.checkUserCouponExists(pointCustomRe.getCouponId(),pointCustomRe.getCustomId())){
|
return couponRecordDO;
|
}else{
|
return null;
|
}
|
|
}).filter(Objects::nonNull).collect(Collectors.toList());
|
|
// 批量保存优惠券信息
|
couponRecordService.saveBatch(couponUsageDOList);
|
}
|
}
|
return baseMapper.updateById(couponTemplateDO) > 0;
|
}
|
|
@Transactional
|
@Override
|
public boolean expireCouponTemplate(String id) {
|
CouponTemplateDO couponTemplateDO = baseMapper.selectById(id);
|
couponTemplateDO.setStatus(CouponStatusEnum.EXPIRED.getStatus());
|
return baseMapper.updateById(couponTemplateDO) > 0;
|
}
|
|
/**
|
* 获取所有会员优惠券模版
|
*
|
* @return
|
*/
|
@Transactional
|
@Override
|
public List<CouponTemplateDO> getVipCouponTemplate() {
|
QueryWrapper<CouponTemplateDO> queryWrapper = new QueryWrapper<>();
|
queryWrapper.lambda()
|
.eq(CouponTemplateDO::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
|
.eq(CouponTemplateDO::getCategory, CouponCategoryEnum.MEMBER.getStatus())
|
.eq(CouponTemplateDO::getStatus, CouponStatusEnum.ACTIVE.getStatus());
|
|
return baseMapper.selectList(queryWrapper);
|
|
}
|
|
@Transactional
|
@Override
|
public boolean deleteBatchCouponTemplate(BatchCouponTemplateDTO dto) {
|
|
if (CollectionUtils.isNotEmpty(dto.getIdList())) {
|
dto.setUpdateBy(SecurityUtils.getUserId());
|
return couponTemplateMapperCustom.deleteBatchCouponTemplate(dto) > 0;
|
}
|
return false;
|
}
|
|
@Transactional
|
@Override
|
public boolean activeBatchCouponTemplate(BatchCouponTemplateDTO dto) {
|
if (CollectionUtils.isNotEmpty(dto.getIdList())) {
|
dto.setUpdateBy(SecurityUtils.getUserId());
|
return couponTemplateMapperCustom.activeBatchCouponTemplate(dto) > 0;
|
}
|
return false;
|
}
|
|
@Transactional
|
@Override
|
public boolean expireBatchCouponTemplate(BatchCouponTemplateDTO dto) {
|
if (CollectionUtils.isNotEmpty(dto.getIdList())) {
|
dto.setUpdateBy(SecurityUtils.getUserId());
|
return couponTemplateMapperCustom.expireBatchCouponTemplate(dto) > 0;
|
}
|
return false;
|
}
|
|
@Override
|
public CouponPointStatisVO statisCouponTemplatePoint(QueryCouponStatisticsBO queryCouponStatisticsBO) {
|
CouponPointStatisVO vo=new CouponPointStatisVO();
|
//优惠券总数
|
vo.setTotalAmount(couponRecordService.statisCouponTemplateCount(queryCouponStatisticsBO));
|
// 本月兑换优惠券总数
|
vo.setCurMonExchangeAmount(couponRecordService.statisCouponTemplateCurMonCount(queryCouponStatisticsBO));
|
// 本月兑换积分总数
|
vo.setCurMonExchangePointAmount(couponRecordService.statisCouponPointCurMonPontAmonut(queryCouponStatisticsBO));
|
return vo;
|
}
|
|
@Override
|
public List<CouponTemplateVO> getPointList(QueryActivePointCouponDTO dto) {
|
if(StringUtils.isBlank(dto.getOrderStr())){
|
dto.setOrderStr(" create_time desc ");
|
}
|
return couponTemplateMapperCustom.getCouponPointList(dto);
|
}
|
|
@Override
|
public Page<CouponTemplateVO> getPointPage(Page page, QueryActivePointCouponDTO dto) {
|
if(StringUtils.isBlank(dto.getOrderStr())){
|
dto.setOrderStr(" create_time desc ");
|
}
|
return couponTemplateMapperCustom.getPointPage(page,dto);
|
}
|
|
@Override
|
public synchronized void exchangeCoupon(ExchangeCouponDTO dto) {
|
dto.setNum(1);
|
|
final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
|
if(couponTemplateDO==null){
|
throw new ValidationException("优惠券不存在");
|
}
|
|
CustomerPoint cp = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
|
.eq(CustomerPoint::getUserId, SecurityUtils.getUserId()));
|
if(cp == null || (cp.getTotalPoint()-cp.getUsedPoint()-cp.getExpiredPoint()) < couponTemplateDO.getPoint() * dto.getNum()){
|
throw new ValidationException("积分不足");
|
}
|
|
CreateCouponRecordDTO recordDTO =new CreateCouponRecordDTO();
|
recordDTO.setCouponId(dto.getCouponId());
|
recordDTO.setUserId(SecurityUtils.getUserId());
|
Customer customer = customerMapper.selectOne(new LambdaQueryWrapper<Customer>()
|
.eq(Customer::getUserId, SecurityUtils.getUserId()));
|
if(customer == null){
|
throw new ValidationException("商户不存在");
|
}
|
recordDTO.setCustomerId(customer.getId());
|
couponRecordService.createCouponRecord(recordDTO);
|
|
//更新积分汇总
|
cp.setUsedPoint(cp.getUsedPoint()+couponTemplateDO.getPoint());
|
customerPointMapper.updateById(cp);
|
|
//记录积分明细
|
CustomerPointDetail detail = new CustomerPointDetail();
|
detail.setUserId(customer.getUserId());
|
detail.setCustomerId(customer.getId());
|
detail.setPoint(couponTemplateDO.getPoint());
|
detail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name());
|
detail.setType(Constants.POINT_TYPE.exchange.name());
|
detail.setRecordDate(LocalDate.now());
|
detail.setRemarks(couponTemplateDO.getCouponName());
|
detail.create(SecurityUtils.getUserId());
|
customerPointDetailMapper.insert(detail);
|
}
|
|
@Override
|
public List<CouponTemplateVO> getActivityEffectList(QueryActivityEffectCouponDTO dto) {
|
|
return couponTemplateMapperCustom.getActivityEffectList(dto);
|
}
|
|
}
|