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.common.util.PatternUtils;
import com.fdkankan.common.util.SecurityUtil;
import com.fdkankan.sms.SendMailAcceUtils;
import com.fdkankan.sms.SmsService;
import com.fdkankan.ucenter.common.MailUtil;
import com.fdkankan.ucenter.common.PageInfo;
import com.fdkankan.common.util.DateUtil;
import com.fdkankan.ucenter.common.constants.NacosProperty;
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 jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
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.util.ObjectUtils;
import java.security.GeneralSecurityException;
import java.util.*;
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;
@Autowired
SmsService smsService;
@Autowired
IMailTemplateService mailTemplateService;
@Autowired
ICameraIncrementLogService cameraIncrementLogService;
@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());
queryWrapper.and(i ->i.eq(UserIncrement::getIsExpired,0).or().isNotNull(UserIncrement::getCameraId));
if(cameraIdList!=null ){
queryWrapper.in(UserIncrement::getCameraId,cameraIdList);
}
queryWrapper.orderByDesc(UserIncrement::getId);
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) {
if(cameraIds.size() >0){
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.in(UserIncrement::getCameraId,cameraIds);
if("local".equals(NacosProperty.uploadType)){
this.remove(wrapper);
}else {
wrapper.set(UserIncrement::getCameraId,null);
this.update(wrapper);
}
}
}
@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);
}
if(userIncrement.getIsExpired() == 1){
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);
cameraIncrementLogService.saveLog(cameraEntity.getId(),userIncrement.getId(),user.getId(),0);
sceneProService.lockOrUnLockBySpace(cameraDetailEntity,cameraEntity.getId());
}
@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);
}
User user = userService.getByUserName(param.getUserName());
if(user == null){
throw new BusinessException(CameraConstant.FAILURE_CODE_6003, CameraConstant.FAILURE_MSG_6003);
}
cameraIncrementLogService.saveLog(userIncrement.getCameraId(),userIncrement.getId(),user.getId(),1);
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(UserIncrement::getId,param.getId());
wrapper.set(UserIncrement::getCameraId,null);
this.update(wrapper);
if(cameraDetail.getType() !=10){
sceneProService.lockOrUnLockBySpace(cameraDetail,cameraDetail.getCameraId());
}
}
@Override
public void incrementExpire() {
//查找所有刚过期的会员权益
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserIncrement::getIsExpired,0);
wrapper.lt(UserIncrement::getIncrementEndTime,DateUserUtil.getDate(new Date()));
List list = this.list(wrapper);
lockScene(list);
}
public void lockScene(List list){
for (UserIncrement userIncrement : list) {
if(DateUserUtil.getDate(userIncrement.getIncrementEndTime()).getTime() > new Date().getTime()){
userIncrement.setIsExpired(0);
}else {
userIncrement.setIsExpired(1);
}
userIncrement.setUpdateTime(null);
this.updateById(userIncrement);
//解除相机权益
if(userIncrement.getCameraId() != null){
CameraDetail cameraDetail = cameraDetailService.getByCameraId(userIncrement.getCameraId());
if(cameraDetail == null){
continue;
}
if(cameraDetail.getType() !=10){
sceneProService.lockOrUnLockBySpace(cameraDetail,cameraDetail.getCameraId());
}
}
}
}
@Override
public void incrementExpireSendSms() throws Exception {
//查找所有即将到期的会员权益
List expireData30 = this.getBaseMapper().findReadyExpire(30, 0);
List expireData15 = this.getBaseMapper().findReadyExpire(15, 0);
List expireData5 = this.getBaseMapper().findReadyExpire(5, 0);
List expireData3 = this.getBaseMapper().findReadyExpire(3, 0);
List expireData0 = this.getBaseMapper().findReadyExpire(0, 0);
List expireData = this.getBaseMapper().findReadyExpire(-1, 1);
Map userIdsRP = new HashMap<>();
Map userIdsSE = new HashMap<>();
for (UserIncrement userIncrementEntity : expireData30) {
if(userIncrementEntity.getUserId() != null){
if(StringUtils.isBlank(userIncrementEntity.getMemberLevels() ) || "PR".equals(userIncrementEntity.getMemberLevels())){
userIdsRP.put(userIncrementEntity.getUserId(), 30);
}
}
}
for (UserIncrement userIncrementEntity : expireData15) {
if(userIncrementEntity.getUserId() != null){
if(StringUtils.isBlank(userIncrementEntity.getMemberLevels() ) ||"PR".equals(userIncrementEntity.getMemberLevels())){
userIdsRP.put(userIncrementEntity.getUserId(), 15);
}
}
}
for (UserIncrement userIncrementEntity : expireData5) {
if(userIncrementEntity.getUserId() != null){
if(StringUtils.isBlank(userIncrementEntity.getMemberLevels() ) ||"PR".equals(userIncrementEntity.getMemberLevels())){
userIdsRP.put(userIncrementEntity.getUserId(), 5);
}
if("SE".equals(userIncrementEntity.getMemberLevels())){
userIdsSE.put(userIncrementEntity.getUserId(), 5);
}
}
}
for (UserIncrement userIncrementEntity : expireData3) {
if(userIncrementEntity.getUserId() != null){
if("SE".equals(userIncrementEntity.getMemberLevels())){
userIdsSE.put(userIncrementEntity.getUserId(), 3);
}
}
}
for (UserIncrement userIncrementEntity : expireData0) {
if(userIncrementEntity.getUserId() != null){
if(StringUtils.isBlank(userIncrementEntity.getMemberLevels() ) ||"PR".equals(userIncrementEntity.getMemberLevels())){
userIdsRP.put(userIncrementEntity.getUserId(), 0);
}
if("SE".equals(userIncrementEntity.getMemberLevels())){
userIdsSE.put(userIncrementEntity.getUserId(), 0);
}
}
}
for (UserIncrement userIncrementEntity : expireData) {
if(userIncrementEntity.getUserId() != null){
if(StringUtils.isBlank(userIncrementEntity.getMemberLevels() ) ||"PR".equals(userIncrementEntity.getMemberLevels())){
userIdsRP.put(userIncrementEntity.getUserId(), -1);
}
if("SE".equals(userIncrementEntity.getMemberLevels())){
userIdsSE.put(userIncrementEntity.getUserId(), -1);
}
}
}
this.sendMsg(userIdsRP,"premium");
this.sendMsg(userIdsSE,"senior");
}
private void sendMsg(Map userIds,String msgType) throws Exception {
String cnCode = "SMS_216275556";
String expireCode = "SMS_216425565";
for (Long userId : userIds.keySet()) {
User userEntity = userService.getById(userId);
if(userEntity != null){
if("oss".equals(NacosProperty.uploadType) && StringUtil.isNotBlank(userEntity.getUserName()) && StringUtils.isNumeric(userEntity.getUserName())){
if(userIds.get(userId) == -1){
smsService.sendSms(userEntity.getUserName(), "{\"time\":\"" + userIds.get(userId) + "\"}", expireCode);
continue;
}
smsService.sendSms(userEntity.getUserName(), "{\"time\":\"" + userIds.get(userId) + "\"}", cnCode);
}
if("aws".equals(NacosProperty.uploadType) && StringUtil.isNotBlank(userEntity.getUserName())){
Integer days = userIds.get(userId);
if(days == null || days<0){
mailTemplateService.sendPeExMail(userEntity.getUserName());
continue;
}
if(days > 0){
mailTemplateService.sendPeNoExMail(userEntity.getUserName(),userIds.get(userId));
continue;
}
mailTemplateService.sendPeTodayExMail(userEntity.getUserName());
}
}
}
}
@Override
public void addByCameraAndUser(List cameraIds, Long userId) {
this.delByCameraId(cameraIds);
for (Long cameraId : cameraIds) {
UserIncrement userIncrement = new UserIncrement();
userIncrement.setKeyWord(UUID.randomUUID().toString().replace("-", ""));
userIncrement.setIsExpired(0);
userIncrement.setIncrementStartTime(DateUserUtil.getDate(new Date()));
userIncrement.setCameraId(cameraId);
userIncrement.setIncrementTypeId(1);
userIncrement.setIncrementEndTime("2199-01-01 00:00:00");
userIncrement.setUserId(userId);
this.save(userIncrement);
}
}
@Override
public void delByCameraId(List cameraIds) {
if(cameraIds.size() >0){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(UserIncrement::getCameraId,cameraIds);
this.remove(wrapper);
}
}
@Override
public HashMap> getByOrderSnList(Set orderSns) {
HashMap> map = new HashMap<>();
if(orderSns.size() >0){
for (String orderSn : orderSns) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.like(UserIncrement::getOrderSn,orderSn);
List list = this.list(wrapper);
for (UserIncrement userIncrement : list) {
map.computeIfAbsent(userIncrement.getOrderSn(), k -> new ArrayList<>());
map.get(userIncrement.getOrderSn()).add(userIncrement.getId());
}
}
}
return map;
}
}