package com.fdkankan.agent.service.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fdkankan.agent.common.OssPath; import com.fdkankan.agent.common.PageInfo; import com.fdkankan.agent.common.ResultCode; import com.fdkankan.agent.entity.*; import com.fdkankan.agent.exception.BusinessException; import com.fdkankan.agent.httpClient.client.FdKKClient; import com.fdkankan.agent.httpClient.service.LaserService; import com.fdkankan.agent.mapper.ISceneProMapper; import com.fdkankan.agent.request.SceneParam; import com.fdkankan.agent.response.SceneVo; import com.fdkankan.agent.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.agent.util.MangerUploadToOssUtil; import com.fdkankan.agent.util.SceneStatusUtil; import com.fdkankan.common.constant.SceneConstant; import com.fdkankan.common.util.FileUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; /** *

* pro场景表 服务实现类 *

* * @author * @since 2022-11-09 */ @Service @Slf4j public class SceneProServiceImpl extends ServiceImpl implements ISceneProService { @Autowired LaserService laserService; @Autowired IScenePlusService scenePlusService; @Autowired IScenePlusExtService scenePlusExtService; @Resource FdKKClient fdKKClient; @Autowired ICameraService cameraService; @Autowired ICameraDetailService cameraDetailService; @Autowired IUserIncrementService userIncrementService; @Autowired IIncrementTypeService incrementTypeService; @Autowired MangerUploadToOssUtil mangerUploadToOssUtil; @Autowired IFolderSceneService folderSceneService; @Override public Object pageList(SceneParam param) { if(param.getType() == 2){ //深时 return laserService.pageList(param); } Page page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(),param.getPageSize()),param); // for (SceneVo record : page.getRecords()) { // record.setStatusString(SceneStatusUtil.getStatusString(record)); // } return PageInfo.PageInfo(page); } @Override public void move(SceneParam param) { Camera camera = cameraService.getBySnCode(param.getSnCode()); if(camera == null){ throw new BusinessException(ResultCode.CAMERA_EMPTY); } CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId()); if(cameraDetail == null){ throw new BusinessException(ResultCode.CAMERA_EMPTY); } ScenePro scenePro = this.getByNum(param.getNum()); ScenePlus scenePlus = scenePlusService.getByNum(param.getNum()); if((scenePro == null || scenePro.getCameraId() == null ) && (scenePlus== null || scenePlus.getCameraId() == null)){ throw new BusinessException(ResultCode.SCENE_EMPTY); } Integer status = scenePro == null ? scenePlus.getSceneStatus() : scenePro.getStatus(); if(status == 0){ throw new BusinessException(ResultCode.SCENE_BUILD); } Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId(); Long space = scenePro == null ? 0 :scenePro.getSpace(); if(scenePlus !=null){ ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId()); space = scenePlusExt.getSpace(); } space = space == null ? 0 :space; Long newUseSpace = space + cameraDetail.getUsedSpace(); Long totalSpace = cameraDetail.getTotalSpace(); UserIncrement userIncrement = userIncrementService.getByCameraId(cameraId); if(userIncrement!=null){ IncrementType incrementType = incrementTypeService.getById(userIncrement.getIncrementTypeId()); if(incrementType!=null){ if(incrementType.getCameraCapacity() == -1){ totalSpace = -1L; }else { totalSpace = incrementType.getCameraCapacity() * 1024 * 1024L; } } } //深时场景无限容量 if(cameraDetail.getType() != 10 && totalSpace !=-1 && newUseSpace > totalSpace){ throw new BusinessException(ResultCode.CAMERA_SPACE_ERROR); } Camera oldCamera = cameraService.getById(cameraId); if(oldCamera == null){ throw new BusinessException(ResultCode.CAMERA_EMPTY); } CameraDetail oldCameraDetail = cameraDetailService.getByCameraId(oldCamera.getId()); if(oldCameraDetail == null){ throw new BusinessException(ResultCode.CAMERA_EMPTY); } if(!oldCameraDetail.getType().equals(cameraDetail.getType())){ throw new BusinessException(ResultCode.CAMERA_TYPE_NOT_ERROR); } if(oldCameraDetail.getAgentId() == null || cameraDetail.getAgentId() == null || !oldCameraDetail.getAgentId().equals(cameraDetail.getAgentId()) ){ throw new BusinessException(ResultCode.CAMERA_SN_ERROR); } Long oldUseSpace = oldCameraDetail.getUsedSpace() - space < 0 ? 0 : oldCameraDetail.getUsedSpace() - space; oldCameraDetail.setUsedSpace(oldUseSpace); Long subSpace = oldCameraDetail.getTotalSpace() - oldUseSpace; if(cameraDetail.getType() != 10 && subSpace >0){ //有剩余容量解封容量内场景 this.lockOrUnLockBySpace(oldCameraDetail,oldCameraDetail.getCameraId(),1); } cameraDetailService.updateById(oldCameraDetail); cameraDetail.setUsedSpace(newUseSpace); cameraDetailService.updateById(cameraDetail); if(scenePro!=null){ LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(ScenePro::getId,scenePro.getId()); wrapper.set(ScenePro::getCameraId,camera.getId()); wrapper.set(ScenePro::getUserId,cameraDetail.getUserId()); this.update(wrapper); //场景迁移到另外的相机清除本身在的文件夹 folderSceneService.delBySceneId(scenePro.getId()); } if(scenePlus!=null){ LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(ScenePlus::getId,scenePlus.getId()); wrapper.set(ScenePlus::getCameraId,camera.getId()); wrapper.set(ScenePlus::getUserId,cameraDetail.getUserId()); scenePlusService.update(wrapper); folderSceneService.delBySceneId(scenePlus.getId()); } if(cameraDetail.getType() == 10){ //深时场景 laserService.move(param.getNum(),oldCamera.getSnCode(),camera.getSnCode()); } } @Override public void copy(String sceneNum) throws Exception { ScenePro scenePro = this.getByNum(sceneNum); ScenePlus scenePlus = scenePlusService.getByNum(sceneNum); if((scenePro == null || scenePro.getCameraId() == null ) && (scenePlus== null || scenePlus.getCameraId() == null)){ throw new BusinessException(ResultCode.SCENE_EMPTY); } Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId(); Camera camera = cameraService.getById(cameraId); if(camera == null){ throw new BusinessException(ResultCode.CAMERA_EMPTY); } CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraId); if(detailEntity == null){ throw new BusinessException(ResultCode.CAMERA_EMPTY); } HashMap param = new HashMap<>(); param.put("num",sceneNum); fdKKClient.copyScene(param,"m_a_n_a_g_e"); } @Override public ScenePro getByNum(String num) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ScenePro::getNum,num); wrapper.eq(ScenePro::getIsUpgrade,0); List list = this.list(wrapper); if(list == null || list.size() <=0){ return null; } return list.get(0); } /** * @param payStatus -2 封存,为 1 解封 */ @Override public void lockOrUnLockBySpace(CameraDetail cameraDetail, Long cameraId, Integer payStatus) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper plusWr = new LambdaQueryWrapper<>(); Long totalSpace = cameraDetail.getTotalSpace(); UserIncrement userIncrement = userIncrementService.getByCameraId(cameraId); if(userIncrement!=null){ IncrementType incrementType = incrementTypeService.getById(userIncrement.getIncrementTypeId()); if(incrementType!=null){ if(incrementType.getCameraCapacity() == -1){ totalSpace = -1L; }else { totalSpace = incrementType.getCameraCapacity() * 1024 * 1024L; } } } log.info("lockOrUnLockBySpace---cameraId:{},payStatus:{},totalSpace:{},useSpace{}", cameraId,payStatus,totalSpace,cameraDetail.getUsedSpace()); if(payStatus == 1){ //解封,判断用户权益,用户会员权益无限容量 wrapper.orderByAsc(ScenePro::getCreateTime); plusWr.orderByAsc(ScenePlus::getCreateTime); wrapper.eq(ScenePro::getPayStatus,-2); plusWr.eq(ScenePlus::getPayStatus,-2); }else { if (totalSpace >= cameraDetail.getUsedSpace()) { // 总容量大于已使用容量,不予封存 return; } wrapper.orderByDesc(ScenePro::getCreateTime); plusWr.orderByDesc(ScenePlus::getCreateTime); wrapper.eq(ScenePro::getPayStatus,1); plusWr.eq(ScenePlus::getPayStatus,1); } wrapper.eq(ScenePro::getCameraId,cameraId) .eq(ScenePro::getIsUpgrade,0); plusWr.eq(ScenePlus::getCameraId,cameraId); List list = this.list(wrapper); List plusList = scenePlusService.list(plusWr); Long beyondSpace = Math.abs(cameraDetail.getUsedSpace() - totalSpace); Long accumulateSpace = 0L; List lockedIds = new ArrayList<>(); if(payStatus == 1){ Long doSpace = getScenePlusLockedIds(lockedIds, plusList, totalSpace, beyondSpace, accumulateSpace); beyondSpace -= doSpace; getSceneLockedIds(lockedIds,list,totalSpace,beyondSpace,accumulateSpace); }else { Long doSpace = getSceneLockedIds(lockedIds, list, totalSpace, beyondSpace, accumulateSpace); beyondSpace -= doSpace; getScenePlusLockedIds(lockedIds,plusList,totalSpace,beyondSpace,accumulateSpace); } lockOrUnLockScenes(lockedIds,payStatus); } private Long getSceneLockedIds(List lockedIds ,List list,Long count,Long beyondSpace,Long accumulateSpace){ if (list != null && list.size() > 0){ for (ScenePro scenePro : list){ accumulateSpace += scenePro.getSpace(); if (count ==-1 && accumulateSpace.compareTo(beyondSpace) > 0){ return accumulateSpace - scenePro.getSpace(); } lockedIds.add(scenePro.getId()); } } return accumulateSpace; } private Long getScenePlusLockedIds(List lockedIds , List list, Long count, Long beyondSpace, Long accumulateSpace){ if (list != null && list.size() > 0){ List plusIds = list.parallelStream().map(ScenePlus::getId).collect(Collectors.toList()); HashMap byPlusIds = scenePlusExtService.getByPlusIds(plusIds); for (ScenePlus scenePlus : list){ ScenePlusExt scenePlusExt = byPlusIds.get(scenePlus.getId()); accumulateSpace += scenePlusExt.getSpace(); if (count ==-1 && accumulateSpace.compareTo(beyondSpace) > 0){ return accumulateSpace - scenePlusExt.getSpace(); } lockedIds.add(scenePlus.getId()); } } return accumulateSpace; } // payStatus 为 -2 封存,为 1 解封 private void lockOrUnLockScenes(List lockedIds,Integer payStatus) { if (lockedIds == null || lockedIds.size() == 0){ return; } LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(ScenePro::getPayStatus,payStatus) .eq(ScenePro::getIsUpgrade,0) .in(ScenePro::getId,lockedIds); this.update(updateWrapper); LambdaUpdateWrapper updatePlusWrapper = new LambdaUpdateWrapper<>(); updatePlusWrapper.set(ScenePlus::getPayStatus,payStatus) .in(ScenePlus::getId,lockedIds); scenePlusService.update(updatePlusWrapper); this.updateOssStatus(lockedIds,payStatus); } /** * 修改oss status.json中 payStatus */ private void updateOssStatus(List lockedIds, Integer payStatus) { LambdaQueryWrapper proWr = new LambdaQueryWrapper<>(); proWr.eq(ScenePro::getIsUpgrade,0); proWr.in(ScenePro::getId,lockedIds); List proList = this.list(proWr); LambdaQueryWrapper pluWr = new LambdaQueryWrapper<>(); pluWr.in(ScenePlus::getId,lockedIds); List plusList = scenePlusService.list(pluWr); for (ScenePro scenePro : proList) { this.updateOssStatus(String.format(OssPath.v3_statusPath,scenePro.getNum()),payStatus); } for (ScenePlus scenePlus : plusList) { this.updateOssStatus(String.format(OssPath.v4_statusPath,scenePlus.getNum()),payStatus); } } /** * 从oss中获取文件,并重写,上传替换 */ private void updateOssStatus(String path,Integer payStatus) { try { if(!mangerUploadToOssUtil.existKey(path)){ return; } String data = mangerUploadToOssUtil.getObjectContent("4dkankan",path); if(StringUtils.isBlank(data)){ return; } JSONObject jsonObject = JSONObject.parseObject(data); jsonObject.put("payStatus",payStatus); String json = JSONUtil.toJsonStr(jsonObject); FileUtils.writeFile(OssPath.localStatusPath ,json); log.info("updateOssStatus--localPath:{},ossPath:{}",OssPath.localStatusPath,path); mangerUploadToOssUtil.upload(OssPath.localStatusPath,path); }catch (Exception e){ e.printStackTrace(); }finally { FileUtil.del(OssPath.localStatusPath); } } }