From a768dc3daa04d35fedfbe75c0a59b9b2545b85c4 Mon Sep 17 00:00:00 2001
From: gongzuming <gongzuming>
Date: 星期四, 19 九月 2024 16:59:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2'

---
 src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java |  493 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 493 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java
new file mode 100644
index 0000000..b33c44a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java
@@ -0,0 +1,493 @@
+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 com.mzl.flower.service.payment.RedisLockService;
+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;
+
+    @Autowired
+    private RedisLockService lockService;
+
+
+
+    @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 ValidationException("使用时间数量必须为正整数");
+                }
+                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(couponTemplateDO.getMemberId());
+                    couponRecordDO.setImageUrl(couponTemplateDO.getImageUrl());
+
+                    // 创建相关信息
+                    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);
+            }
+        }
+
+        // 如果是活动优惠券且领取渠道是Home类型的,那么只能设置当前优惠券为激活状态,其他优惠券是激活状态的设置为下架状态
+        if (StringUtils.isNotBlank(couponTemplateDO.getCategory())  && couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus())
+                && StringUtils.isNotBlank(couponTemplateDO.getGetType()) && couponTemplateDO.getGetType().equals(CouponGetTypeEnum.HOME.getType())
+        ) {
+
+            couponTemplateMapperCustom.expireHomeActivityCouponTemplate();
+        }
+
+        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  void exchangeCoupon(ExchangeCouponDTO dto) {
+
+        String key="EXCHANGE_COUPON:"+dto.getCouponId()+":"+SecurityUtils.getUserId();
+        boolean lock = lockService.getObjectLock(key, "");
+        if(!lock){
+            throw new ValidationException("系统操作频繁,请稍后重试");
+        }
+        try {
+            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()- 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);
+        }catch (Exception e){
+            throw new ValidationException("兑换失败");
+        }finally {
+            lockService.releaseObjectLock(key,"");
+        }
+
+    }
+
+    @Override
+    public CouponTemplateVO getHomeActivityEffectAlert(QueryActivityEffectCouponDTO dto) {
+
+        // 存在用户是空的情况
+        final CouponTemplateVO homeActivityEffectAlert = couponTemplateMapperCustom.getHomeActivityEffectAlert(dto);
+        if(null!=homeActivityEffectAlert ){
+            if(StringUtils.isNotBlank(SecurityUtils.getUserId()) ){
+                // 查看当前已经领取了几张
+                final Integer getCnt = couponRecordService.getUserGainCouponRecordAmountByUserId(homeActivityEffectAlert.getId(), SecurityUtils.getUserId());
+                // 如果当前领取的数量小于限制领取的数量的时候,可以再次领取
+                if(null!=homeActivityEffectAlert.getGetLimit() && null!=getCnt
+                        && homeActivityEffectAlert.getGetLimit().compareTo(getCnt)>0){
+                    return homeActivityEffectAlert;
+                }
+            }else{
+                return homeActivityEffectAlert;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<CouponTemplateVO> getActivityEffectList(QueryActivityEffectCouponDTO dto) {
+
+        return couponTemplateMapperCustom.getActivityEffectList(dto);
+    }
+
+}

--
Gitblit v1.9.3