| | |
| | | import com.mzl.flower.mapper.point.CustomerPointDetailMapper; |
| | | import com.mzl.flower.mapper.point.CustomerPointMapper; |
| | | import com.mzl.flower.service.BaseService; |
| | | import com.mzl.flower.service.payment.RedisLockService; |
| | | import com.mzl.flower.utils.DateUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | |
| | | private final CustomerPointDetailMapper customerPointDetailMapper; |
| | | |
| | | private final RedisLockService redisLockService; |
| | | |
| | | public CustomerPointService(CustomerPointMapper customerPointMapper, CustomerPointDetailMapper customerPointDetailMapper) { |
| | | |
| | | public CustomerPointService(CustomerPointMapper customerPointMapper, CustomerPointDetailMapper customerPointDetailMapper, RedisLockService redisLockService) { |
| | | this.customerPointMapper = customerPointMapper; |
| | | this.customerPointDetailMapper = customerPointDetailMapper; |
| | | this.redisLockService = redisLockService; |
| | | } |
| | | |
| | | public Page<CustomerPointDTO> queryPage(QueryCustomerPointDTO dto, Page page) { |
| | |
| | | } |
| | | |
| | | public Page<CustomerPointDetailDTO> queryCustomerDetails(QueryPointDetailDTO dto, Page page) { |
| | | if(StringUtils.isNotBlank(dto.getCreateTimeStartStr())){ |
| | | dto.setCreateTimeStart(DateUtils.dateTimeStringToLocalDateTime(dto.getCreateTimeStartStr())); |
| | | } |
| | | if(StringUtils.isNotBlank(dto.getCreateTimeEndStr())){ |
| | | dto.setCreateTimeEnd(DateUtils.dateTimeStringToLocalDateTime(dto.getCreateTimeEndStr())); |
| | | } |
| | | List<CustomerPointDetailDTO> list = customerPointMapper.queryCustomerDetails(dto, page); |
| | | page.setRecords(list); |
| | | |
| | |
| | | } |
| | | |
| | | public void updateCustomerPoint(CustomerPointDetail detail) { |
| | | CustomerPoint point = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>() |
| | | .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()); |
| | | boolean lock = redisLockService.getObjectLock("LOCK_KEY_CUSTOMER_POINT_", detail.getUserId()); |
| | | if(!lock){ |
| | | return; |
| | | } |
| | | try { |
| | | CustomerPoint point = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>() |
| | | .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(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); |
| | | } |
| | | }finally { |
| | | redisLockService.releaseObjectLock("LOCK_KEY_CUSTOMER_POINT_", detail.getUserId()); |
| | | } |
| | | if(isAdd){ |
| | | customerPointMapper.insert(point); |
| | | }else{ |
| | | customerPointMapper.updateById(point); |
| | | } |
| | | |
| | | } |
| | | |
| | | public void deductionPoint(ChangePointDTO dto) { |