package com.fdkankan.contro.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.common.constant.*;
import com.fdkankan.contro.entity.CameraDetail;
import com.fdkankan.contro.entity.ScenePlus;
import com.fdkankan.contro.entity.ScenePlusExt;
import com.fdkankan.contro.entity.ScenePro;
import com.fdkankan.contro.mapper.IScenePlusMapper;
import com.fdkankan.contro.service.ICameraDetailService;
import com.fdkankan.contro.service.IScenePlusExtService;
import com.fdkankan.contro.service.IScenePlusService;
import com.fdkankan.web.response.ResultData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
* 场景主表 服务实现类
*
*
* @author
* @since 2022-03-16
*/
@Slf4j
@Service
public class ScenePlusServiceImpl extends ServiceImpl implements IScenePlusService {
@Autowired
private IScenePlusExtService scenePlusExtService;
@Autowired
private ICameraDetailService cameraDetailService;
@Override
public ScenePlus getScenePlusByNum(String num) {
return this.getOne(new LambdaQueryWrapper().eq(ScenePlus::getNum, num));
}
@Override
public ResultData resetSpace(String num){
ScenePlus scenePlus = this.getScenePlusByNum(num);
ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
if(Objects.isNull(scenePlus)){
log.info("该场景不存在无法重置容量,场景码为:" + num);
return ResultData.error(ErrorCode.FAILURE_CODE_5058);
}
if(scenePlus.getSceneStatus() == SceneStatus.EXCEED_SPACE.code()){//超出容量的场景不需要更新容量
return ResultData.ok();
}
if(!ObjectUtils.isEmpty(scenePlusExt) && !ObjectUtils.isEmpty(scenePlusExt.getSpace())){
Long space = -scenePlusExt.getSpace();
CameraDetail cameraDetail = cameraDetailService.getByCameraId(scenePlus.getCameraId());
String spaceType = cameraDetail.getUnit();
if(spaceType.equals(SpaceType.SP.code())){
space = -1L;
}
if(scenePlus.getSceneSource() == SceneSource.BM.code()
|| scenePlus.getSceneSource() == SceneSource.ZT.code()
|| (spaceType.equals(SpaceType.SP.code()))){
try {
cameraDetailService.updateCameraDetailByCameraIdAndSpace(scenePlus.getCameraId(), space);
}catch (Exception e){
log.error("重算回退相机已使用用量失败, num:{}, cameraId:{}", num, scenePlus.getCameraId(), e);
}
}
}
scenePlusExt.setSpace(Long.parseLong("0"));
scenePlusExtService.updateById(scenePlusExt);
return ResultData.ok();
}
@Override
public String getDataSourceLikeUnicode(String unicode) {
// 防止plus表删除,ext表未删除
ScenePlusExt scenePlusExt = scenePlusExtService.getOne(
new LambdaQueryWrapper().select(ScenePlusExt::getPlusId, ScenePlusExt::getDataSource).like(ScenePlusExt::getDataSource, unicode));
if (Objects.isNull(scenePlusExt)) {
return null;
}
ScenePlus plus = getById(scenePlusExt.getPlusId());
if (Objects.nonNull(plus)) {
return scenePlusExt.getDataSource();
}
scenePlusExtService.removeById(scenePlusExt);
return null;
}
@Override
public ScenePlus getByFileId(String fileId) {
// 防止plus表删除,ext表未删除
List scenePlusExts = scenePlusExtService.list(
new LambdaQueryWrapper().like(ScenePlusExt::getDataSource, fileId)
.eq(ScenePlusExt::getRecStatus, "A"));
if (ObjectUtils.isEmpty(scenePlusExts)) {
return null;
}
for (ScenePlusExt scenePlusExt : scenePlusExts) {
ScenePlus plus = getById(scenePlusExt.getPlusId());
if (!ObjectUtils.isEmpty(plus) && plus.getRecStatus().equals("A")) {
return plus;
}
}
return null;
}
@Override
public Long sumUsedSpaceByCameraId(Long cameraId, String spaceTypeStr) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
.eq(ScenePlus::getCameraId, cameraId)
.in(ScenePlus::getSceneStatus, SceneStatus.SUCCESS.code(), SceneStatus.NO_DISPLAY.code());
SpaceType spaceType = SpaceType.get(spaceTypeStr);
switch (spaceType){
case GB:
List list = this.list(wrapper);
if(CollUtil.isEmpty(list)){
return 0L;
}
List plusIdList = list.stream().map(scenePlus -> scenePlus.getId()).collect(Collectors.toList());
List scenePlusExtList = scenePlusExtService.list(new LambdaQueryWrapper().in(ScenePlusExt::getPlusId, plusIdList));
return scenePlusExtList.stream().mapToLong(pro -> {
Long space = pro.getSpace();
return Objects.isNull(space) ? 0L : space;
}).sum();
case SP:
wrapper.eq(ScenePlus::getPayStatus, PayStatus.PAY.code());
return this.count(wrapper);
}
return null;
}
}