Cui Zhi Feng
2024-09-05 9adfc0c5aa084bc61807ce43badf8b9f48b588c3
src/main/java/com/mzl/flower/service/point/PointGoodsService.java
@@ -1,22 +1,30 @@
package com.mzl.flower.service.point;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.point.PointGoodsCreateDTO;
import com.mzl.flower.dto.request.point.PointGoodsQueryDTO;
import com.mzl.flower.dto.request.point.PointGoodsUpdateDTO;
import com.mzl.flower.dto.request.point.*;
import com.mzl.flower.dto.response.point.PointGoodsDTO;
import com.mzl.flower.dto.response.point.PointGoodsListDTO;
import com.mzl.flower.dto.response.point.PointGoodsRecordDTO;
import com.mzl.flower.entity.point.CustomerPoint;
import com.mzl.flower.entity.point.CustomerPointDetail;
import com.mzl.flower.entity.point.PointGoods;
import com.mzl.flower.entity.point.PointGoodsRecord;
import com.mzl.flower.mapper.point.CustomerPointDetailMapper;
import com.mzl.flower.mapper.point.CustomerPointMapper;
import com.mzl.flower.mapper.point.PointGoodsMapper;
import com.mzl.flower.mapper.point.PointGoodsRecordMapper;
import com.mzl.flower.service.BaseService;
import com.mzl.flower.utils.UUIDGenerator;
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.util.List;
@Service
@@ -25,6 +33,16 @@
    @Autowired
    private PointGoodsMapper pointGoodsMapper;
    @Autowired
    private PointGoodsRecordMapper pointGoodsRecordMapper;
    @Autowired
    private CustomerPointMapper customerPointMapper;
    @Autowired
    private CustomerPointDetailMapper customerPointDetailMapper;
    public Long addPointGoods(PointGoodsCreateDTO dto){
        PointGoods p = new PointGoods();
@@ -53,8 +71,14 @@
        return p.getId();
    }
    public void deletePointGoods(Long id){
        pointGoodsMapper.deleteById(id);
    public void deletePointGoods(String idStr){
        List<String> ids = splitParam(idStr);
        if (ids != null && ids.size() > 0) {
            for(String idd : ids) {
                Long id = Long.parseLong(idd);
                pointGoodsMapper.deleteById(id);
            }
        }
    }
    public Page<PointGoodsListDTO> selectGoodsList(Page page, PointGoodsQueryDTO dto){
@@ -75,4 +99,112 @@
        return dto;
    }
    public void updateStatus(String idStr, String status){
        List<String> ids = splitParam(idStr);
        if(ids != null && ids.size() > 0) {
            for(String idd : ids) {
                Long id = Long.parseLong(idd);
                PointGoods p = pointGoodsMapper.selectById(id);
                if (p == null) {
                    continue;
                }
                p.setStatus(status);
                p.update(SecurityUtils.getUserId());
                pointGoodsMapper.updateById(p);
            }
        }
    }
    public synchronized void exchangeGoods(ExchangeGoodsDTO dto) {
        PointGoods p = pointGoodsMapper.selectById(dto.getGoodsId());
        if(p == null){
            throw new ValidationException("商品未找到");
        }
        if(!Constants.POINT_GOODS_STATUS.A.name().equals(p.getStatus())){
            throw new ValidationException("商品未上架");
        }
        if(p.getStock()< dto.getNum()){
            throw new ValidationException("商品库存不足");
        }
        CustomerPoint cp = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
                .eq(CustomerPoint::getUserId, SecurityUtils.getUserId()));
        if(cp == null || (cp.getTotalPoint()-cp.getUsedPoint()-cp.getExpiredPoint()) < p.getPoint() * dto.getNum()){
            throw new ValidationException("积分不足");
        }
        //记录兑换记录
        PointGoodsRecord record = new PointGoodsRecord();
        record.setUserId(SecurityUtils.getUserId());
        record.setCustomerId(getCustomerByUserId(SecurityUtils.getUserId()).getId());
        record.setGoodsId(dto.getGoodsId());
        record.setNum(dto.getNum());
        record.setPoint(p.getPoint());
        record.setName(p.getName());
        record.setPictures(p.getPictures());
        record.setDescription(p.getDescription());
        record.setTotalPoint(p.getPoint() * dto.getNum());
        record.setCover(p.getCover());
        record.setRedeemCode(UUIDGenerator.getUUID());
        record.setStatus(Constants.POINT_GOODS_RECORD_STATUS.A.name());//未使用
        pointGoodsRecordMapper.insert(record);
        //更新积分汇总
        cp.setUsedPoint(cp.getUsedPoint()+record.getTotalPoint());
        customerPointMapper.updateById(cp);
        //记录积分明细
        CustomerPointDetail detail = new CustomerPointDetail();
        detail.setUserId(SecurityUtils.getUserId());
        detail.setCustomerId(record.getCustomerId());
        detail.setPoint(record.getTotalPoint());
        detail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name());
        detail.setType(Constants.POINT_TYPE.exchange.name());
        detail.setRecordDate(LocalDate.now());
        detail.setRemarks(record.getName());
        detail.create(SecurityUtils.getUserId());
        customerPointDetailMapper.insert(detail);
        //更新库存
        p.setStock(p.getStock()- dto.getNum());
        pointGoodsMapper.updateById(p);
    }
    public Page<PointGoodsRecordDTO> myExchangeGoods(QueryExchangeGoodsDTO dto, Page page) {
        dto.setUserId(SecurityUtils.getUserId());
        List<PointGoodsRecordDTO> list = pointGoodsRecordMapper.selectMyExchangeGoods(dto,page);
        page.setRecords(list);
        return page;
    }
    public void useExchangeGoods(Long recordId,String orderId) {
        PointGoodsRecord record = pointGoodsRecordMapper.selectById(recordId);
        if(record == null){
            throw new ValidationException("兑换券不存在");
        }
        if(!Constants.POINT_GOODS_RECORD_STATUS.A.name().equals(record.getStatus())){
            throw new ValidationException("兑换券已使用或过期");
        }
        if(!SecurityUtils.getUserId().equals(record.getUserId())){
            throw new ValidationException("兑换券不属于当前用户");
        }
        record.setStatus(Constants.POINT_GOODS_RECORD_STATUS.U.name());
        record.setOrderId(orderId);
        pointGoodsRecordMapper.updateById(record);
    }
    public void revertExchangeGoods(Long recordId) {
        PointGoodsRecord record = pointGoodsRecordMapper.selectById(recordId);
        if(record == null){
            throw new ValidationException("兑换券不存在");
        }
        if(!Constants.POINT_GOODS_RECORD_STATUS.U.name().equals(record.getStatus())){
            throw new ValidationException("兑换券未使用或过期");
        }
        if(!SecurityUtils.getUserId().equals(record.getUserId())){
            throw new ValidationException("兑换券不属于当前用户");
        }
        record.setStatus(Constants.POINT_GOODS_RECORD_STATUS.A.name());
        record.setOrderId(null);
        pointGoodsRecordMapper.updateById(record);
    }
}