package com.fdkankan.ucenter.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.ucenter.common.PageInfo;
import com.fdkankan.common.util.DateUtil;
import com.fdkankan.ucenter.constant.CameraConstant;
import com.fdkankan.ucenter.constant.LoginConstant;
import com.fdkankan.ucenter.entity.Camera;
import com.fdkankan.ucenter.entity.CameraDetail;
import com.fdkankan.ucenter.entity.User;
import com.fdkankan.ucenter.entity.UserIncrement;
import com.fdkankan.ucenter.mapper.IUserIncrementMapper;
import com.fdkankan.ucenter.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.ucenter.util.DateUserUtil;
import com.fdkankan.ucenter.vo.request.IncrementParam;
import com.fdkankan.ucenter.vo.response.UserIncrementVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 用户增值权益表 服务实现类
*
*
* @author
* @since 2022-07-04
*/
@Service
public class UserIncrementServiceImpl extends ServiceImpl implements IUserIncrementService {
@Autowired
ICameraService cameraService;
@Autowired
IUserService userService;
@Autowired
ICameraDetailService cameraDetailService;
@Autowired
ISceneProService sceneProService;
@Override
public Long getCountByUserId(Long userId, int type) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserIncrement::getUserId,userId);
if(type == 0){
wrapper.eq(UserIncrement::getIsExpired,0);
}else if(type == 1){
wrapper.isNotNull(UserIncrement::getCameraId);
}
return this.count(wrapper);
}
@Override
public PageInfo pageList(IncrementParam param) {
Page pageVo = new Page<>(param.getPageNum(), param.getPageSize());
User user = userService.getByUserName(param.getUserName());
List cameraIdList = null;
if(StrUtil.isNotEmpty(param.getSnCode()) && StrUtil.isNotEmpty(param.getSnCode().trim())){
List cameraEntityList = cameraService.getCameraLikeSnCode(param.getSnCode().trim());
if(cameraEntityList == null || cameraEntityList.size()<=0){
return PageInfo.PageInfo(pageVo);
}
cameraIdList = cameraEntityList.stream().map(Camera::getId)
.collect(Collectors.toList());
}
Page page = new Page<>(param.getPageNum(), param.getPageSize());
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserIncrement::getUserId,user.getId());
if(cameraIdList!=null ){
queryWrapper.in(UserIncrement::getCameraId,cameraIdList);
}
queryWrapper.orderByDesc(UserIncrement::getCreateTime);
Page pageEntity = this.page(page, queryWrapper);
List responseList = convert(pageEntity.getRecords());
pageVo.setTotal(pageEntity.getTotal());
pageVo.setRecords(responseList);
return PageInfo.PageInfo(pageVo);
}
public List convert(List list) {
List result = new ArrayList<>();
if(list == null){
return result;
}
UserIncrementVo responseUserIncrement = new UserIncrementVo();
for (UserIncrement userIncrementEntity : list) {
responseUserIncrement = new UserIncrementVo();
BeanUtils.copyProperties(userIncrementEntity, responseUserIncrement);
if(responseUserIncrement.getCameraId() != null){
Camera cameraEntity = cameraService.getById(responseUserIncrement.getCameraId());
responseUserIncrement.setSnCode(cameraEntity != null ? cameraEntity.getSnCode() : null);
}
responseUserIncrement.setIsExpire(userIncrementEntity.getIsExpired() != 0);
result.add(responseUserIncrement);
}
return result;
}
@Override
public HashMap findByCameraIds(List cameraIdList) {
HashMap map = new HashMap<>();
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(UserIncrement::getCameraId,cameraIdList);
List list = this.list(wrapper);
list.forEach(entity -> map.put(entity.getCameraId(),entity));
return map;
}
@Override
public Long getValidCountByCameraId(Long cameraId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserIncrement::getCameraId,cameraId);
wrapper.gt(UserIncrement::getIncrementEndTime, DateUtil.date2String(new Date(),DateUtil.DEFAULT_DATE_FORMAT));
return this.count(wrapper);
}
@Override
public void unbindCamera(List cameraIds) {
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.set(UserIncrement::getCameraId,null)
.in(UserIncrement::getCameraId,cameraIds);
this.update(wrapper);
}
@Override
public Long getCount(Long userId, Integer cameraType, int isBind) {
return this.getBaseMapper().getCount(userId,cameraType,isBind);
}
@Override
public UserIncrement getByCameraId(Long cameraId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserIncrement::getCameraId,cameraId);
List list = this.list(wrapper);
if(list !=null && list.size() >0){
return list.get(0);
}
return null;
}
@Override
public void bindCamera(IncrementParam param) {
if(param.getId() == null || param.getSnCode() == null){
throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
}
UserIncrement userIncrement = this.getById(param.getId());
if(userIncrement == null){
throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
}
Camera cameraEntity = cameraService.getBySnCode(param.getSnCode());
if(cameraEntity == null){
throw new BusinessException(CameraConstant.FAILURE_CODE_6003, CameraConstant.FAILURE_MSG_6003);
}
UserIncrement byCameraId = this.getByCameraId(cameraEntity.getId());
if(byCameraId != null){
throw new BusinessException(LoginConstant.FAILURE_CODE_3032, LoginConstant.FAILURE_MSG_3032);
}
CameraDetail cameraDetailEntity = cameraDetailService.getByCameraId(cameraEntity.getId());
if(cameraDetailEntity == null){
throw new BusinessException(CameraConstant.FAILURE_CODE_6003, CameraConstant.FAILURE_MSG_6003);
}
User user = userService.getByUserName(param.getUserName());
if(user == null){
throw new BusinessException(CameraConstant.FAILURE_CODE_6003, CameraConstant.FAILURE_MSG_6003);
}
if(cameraDetailEntity.getUserId() == null || !cameraDetailEntity.getUserId().equals(user.getId())){
throw new BusinessException(CameraConstant.FAILURE_CODE_6005, CameraConstant.FAILURE_MSG_6005);
}
userIncrement.setCameraId(cameraEntity.getId());
userIncrement.setUpdateTime(DateUserUtil.getDate(new Date()));
this.updateById(userIncrement);
sceneProService.lockOrUnLockBySpace(cameraDetailEntity,cameraEntity.getId(),1);
}
@Override
public void unbindCamera(IncrementParam param) {
if(param.getId() == null){
throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
}
UserIncrement userIncrement = this.getById(param.getId());
if(userIncrement == null){
throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
}
if(userIncrement.getCameraId() == null){
return;
}
CameraDetail cameraDetail = cameraDetailService.getByCameraId(userIncrement.getCameraId());
if(cameraDetail == null){
throw new BusinessException(CameraConstant.FAILURE_CODE_6003, CameraConstant.FAILURE_MSG_6003);
}
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(UserIncrement::getId,param.getId());
wrapper.set(UserIncrement::getCameraId,null);
this.update(wrapper);
sceneProService.lockOrUnLockBySpace(cameraDetail,cameraDetail.getCameraId(),-2);
}
}