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.dto.request.point.ChangePointDTO; import com.mzl.flower.dto.request.point.QueryCustomerPointDTO; import com.mzl.flower.dto.request.point.QueryPointDetailDTO; import com.mzl.flower.dto.response.point.CustomerPointDTO; import com.mzl.flower.dto.response.point.CustomerPointDetailDTO; import com.mzl.flower.entity.customer.Customer; import com.mzl.flower.entity.point.CustomerPoint; import com.mzl.flower.entity.point.CustomerPointDetail; import com.mzl.flower.mapper.point.CustomerPointDetailMapper; import com.mzl.flower.mapper.point.CustomerPointMapper; import com.mzl.flower.service.BaseService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import com.mzl.flower.constant.Constants.*; @Service @Transactional public class CustomerPointService extends BaseService { private final CustomerPointMapper customerPointMapper; private final CustomerPointDetailMapper customerPointDetailMapper; public CustomerPointService(CustomerPointMapper customerPointMapper, CustomerPointDetailMapper customerPointDetailMapper) { this.customerPointMapper = customerPointMapper; this.customerPointDetailMapper = customerPointDetailMapper; } public Page queryPage(QueryCustomerPointDTO dto, Page page) { List list = customerPointMapper.queryPage(dto, page); page.setRecords(list); return page; } public Page queryCustomerDetails(QueryPointDetailDTO dto, Page page) { List list = customerPointMapper.queryCustomerDetails(dto, page); page.setRecords(list); return page; } public void giveawayPoint(ChangePointDTO dto) { CustomerPointDetail detail = new CustomerPointDetail(); Customer customer = getCustomer(dto.getCustomerId()); detail.setCustomerId(customer.getId()); detail.setUserId(customer.getUserId()); detail.setPoint(dto.getPoint()); detail.setRemarks(dto.getRemarks()); detail.setRecordDate(LocalDate.now()); detail.setChangeType(POINT_CHANGE_TYPE.add.name()); detail.setType(POINT_TYPE.giveaway.name()); detail.create(SecurityUtils.getUserId()); customerPointDetailMapper.insert(detail); //更新汇总表 updateCustomerPoint(detail); } public void updateCustomerPoint(CustomerPointDetail detail) { CustomerPoint point = customerPointMapper.selectOne(new LambdaQueryWrapper() .eq(CustomerPoint::getCustomerId, detail.getCustomerId())); boolean isAdd = false; if(point == null){ isAdd = true; point = new CustomerPoint(); point.setCustomerId(detail.getCustomerId()); point.setUserId(detail.getUserId()); point.setTotalPoint(0); point.setUsedPoint(0); point.setExpiredPoint(0); point.setDeductionPoint(0); point.create(SecurityUtils.getUserId()); } if(POINT_CHANGE_TYPE.add.name().equals(detail.getChangeType())){ point.setTotalPoint(point.getTotalPoint() + detail.getPoint()); }else if(POINT_CHANGE_TYPE.reduce.name().equals(detail.getChangeType())){ Integer detailPoint = detail.getPoint(); if(POINT_TYPE.deduction.name().equals(detail.getType())){ //积分扣减 Integer balancePoint = point.getTotalPoint() - point.getUsedPoint()-point.getExpiredPoint()-point.getDeductionPoint();//可用积分 balancePoint = balancePoint.intValue()>0?balancePoint.intValue():0; if(balancePoint.intValue() >= detail.getPoint().intValue()){ point.setDeductionPoint(point.getDeductionPoint() + detail.getPoint()); }else{ //积分不足,直接清0 point.setDeductionPoint(point.getDeductionPoint() + balancePoint); detail.setPoint(balancePoint); detail.setRemarks(detail.getRemarks()+",当前积分不足"+detailPoint+",实际扣除积分"+balancePoint); } } } if(isAdd){ customerPointMapper.insert(point); }else{ customerPointMapper.updateById(point); } } public void deductionPoint(ChangePointDTO dto) { CustomerPointDetail detail = new CustomerPointDetail(); Customer customer = getCustomer(dto.getCustomerId()); detail.setCustomerId(customer.getId()); detail.setUserId(customer.getUserId()); detail.setPoint(dto.getPoint()); detail.setRemarks(dto.getRemarks()); detail.setRecordDate(LocalDate.now()); detail.setChangeType(POINT_CHANGE_TYPE.reduce.name()); detail.setType(POINT_TYPE.deduction.name()); detail.create(SecurityUtils.getUserId()); //更新汇总表 updateCustomerPoint(detail); customerPointDetailMapper.insert(detail); } public void consumptionPoint(BigDecimal orderAmount, String orderNo,String userId) { CustomerPointDetail detail = new CustomerPointDetail(); Customer customer = getCustomerByUserId(userId); detail.setCustomerId(customer.getId()); detail.setUserId(customer.getUserId()); BigDecimal point = orderAmount.setScale(0, BigDecimal.ROUND_HALF_UP); detail.setPoint(point.intValue()); detail.setRemarks(orderNo); detail.setRecordDate(LocalDate.now()); detail.setChangeType(POINT_CHANGE_TYPE.add.name()); detail.setType(POINT_TYPE.consume.name()); detail.create(SecurityUtils.getUserId()); customerPointDetailMapper.insert(detail); //更新汇总表 updateCustomerPoint(detail); } public void signIn() { if(signToday()){ throw new ValidationException("今天已经签到过了"); } int signNum = customerPointDetailMapper .selectCount(new LambdaQueryWrapper() .eq(CustomerPointDetail::getUserId, SecurityUtils.getUserId()) .ge(CustomerPointDetail::getRecordDate,LocalDate.now().minusDays(9)) .eq(CustomerPointDetail::getChangeType,POINT_CHANGE_TYPE.add.name()) .eq(CustomerPointDetail::getType,POINT_TYPE.sign.name()) ); int point = 1; if(signNum==9){ point = 3; } CustomerPointDetail detail = new CustomerPointDetail(); Customer customer = getCurrentCustomer(); detail.setCustomerId(customer.getId()); detail.setUserId(customer.getUserId()); detail.setPoint(point); detail.setRemarks("签到"); detail.setRecordDate(LocalDate.now()); detail.setChangeType(POINT_CHANGE_TYPE.add.name()); detail.setType(POINT_TYPE.sign.name()); detail.create(SecurityUtils.getUserId()); customerPointDetailMapper.insert(detail); //更新汇总表 updateCustomerPoint(detail); } public List signList(LocalDate startDate, LocalDate endDate) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() .eq(CustomerPointDetail::getUserId, SecurityUtils.getUserId()) .eq(CustomerPointDetail::getChangeType, POINT_CHANGE_TYPE.add.name()) .eq(CustomerPointDetail::getType, POINT_TYPE.sign.name()); lambdaQueryWrapper.orderByDesc(CustomerPointDetail::getRecordDate); if(startDate!=null){ lambdaQueryWrapper.ge(CustomerPointDetail::getRecordDate,startDate); } if (endDate != null) { lambdaQueryWrapper.le(CustomerPointDetail::getRecordDate, endDate); } List details = customerPointDetailMapper.selectList(lambdaQueryWrapper); List dtos = new ArrayList<>(); for (CustomerPointDetail detail : details) { CustomerPointDetailDTO dto = new CustomerPointDetailDTO(); BeanUtils.copyProperties(detail, dto); dtos.add(dto); } return dtos; } public Boolean signToday() { return customerPointDetailMapper.selectCount(new LambdaQueryWrapper() .eq(CustomerPointDetail::getUserId, SecurityUtils.getUserId()) .eq(CustomerPointDetail::getRecordDate,LocalDate.now()) .eq(CustomerPointDetail::getChangeType,POINT_CHANGE_TYPE.add.name()) .eq(CustomerPointDetail::getType,POINT_TYPE.sign.name()))>0; } }