package com.fdkankan.contro.service.impl; import cn.hutool.core.collection.CollUtil; 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.service.impl.ServiceImpl; import com.fdkankan.common.constant.*; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.contro.common.Result; import com.fdkankan.contro.entity.ScenePlus; import com.fdkankan.contro.entity.ScenePlusExt; import com.fdkankan.contro.entity.ScenePro; import com.fdkankan.contro.httpclient.LaserClient; import com.fdkankan.contro.mapper.ISceneProMapper; import com.fdkankan.contro.mapper.ISceneUpgradeMapper; import com.fdkankan.contro.service.IScenePlusExtService; import com.fdkankan.contro.service.IScenePlusService; import com.fdkankan.contro.service.ISceneProService; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage; import com.fdkankan.rabbitmq.util.RabbitMqProducer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.util.List; import java.util.Objects; /** *

* pro场景表 服务实现类 *

* * @author dengsixing * @since 2021-12-23 */ @Slf4j @Service public class SceneProServiceImpl extends ServiceImpl implements ISceneProService { @Value("${queue.modeling.obj.modeling-pre}") private String queueObjModelingPre; @Autowired private IScenePlusService scenePlusService; @Resource private FYunFileServiceInterface fYunFileService; @Resource private LaserClient laserClient; @Autowired private ISceneUpgradeMapper sceneUpgradeMapper; @Resource private RabbitMqProducer mqProducer; @Autowired private IScenePlusExtService scenePlusExtService; @Override public ScenePro getByNum(String num) { return this.getOne(new LambdaQueryWrapper().eq(ScenePro::getNum, num)); } @Override public Long sumUsedSpaceByCameraId(Long cameraId, String spaceTypeStr) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(ScenePro::getCameraId, cameraId) .in(ScenePro::getStatus, SceneStatus.SUCCESS.code(), SceneStatus.NO_DISPLAY.code()) .eq(ScenePro::getIsUpgrade, CommonStatus.NO.code()); SpaceType spaceType = SpaceType.get(spaceTypeStr); switch (spaceType){ case GB: wrapper.select(ScenePro::getSpace); List list = this.list(wrapper); if(CollUtil.isEmpty(list)){ return 0L; } return list.stream().mapToLong(pro -> { Long space = pro.getSpace(); return Objects.isNull(space) ? 0L : space; }).sum(); case SP: wrapper.eq(ScenePro::getPayStatus, PayStatus.PAY.code()); return this.count(wrapper); } return 0L; } @Override public void generateObjFile(String num) { ScenePro sceneProEntity = this.getByNum(num); if(ObjectUtils.isEmpty(sceneProEntity) || sceneProEntity.getIsUpgrade() == 1){ generatePlusObjFile(num); return; } if(sceneProEntity.getSceneSource() != 4 && sceneProEntity.getSceneSource() != 5){ throw new BusinessException(ErrorCode.FAILURE_CODE_3003, "只能操作激光场景"); } // 拷贝文件 String path = sceneProEntity.getDataSource(); String ossPath = path.replace("/mnt/data","home")+"/data.fdage"; if(!fYunFileService.fileExist(ossPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3037); } // 获取最新的场景名称 Result laserSceneByNum = laserClient.getSceneByNum(num); if(laserSceneByNum.getCode() != HttpStatus.OK.value()){ throw new RuntimeException("获取激光转台场景失败!"); } JSONObject sceneInfo = JSONObject.parseObject(JSONObject.toJSONString(laserSceneByNum.getData())); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper .set(ScenePro::getStatus, 0) .set(ScenePro::getIsObj, 1) .set(ScenePro::getIsUpgrade, 2) // 升级中 .set(ScenePro::getSceneName, sceneInfo.getString("title")) .eq(ScenePro::getNum, sceneProEntity.getNum()); this.update(updateWrapper); //同步到scenePlus、scenePlus ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.nonNull(scenePlus)){ sceneUpgradeMapper.deleteScenePlus(num); sceneUpgradeMapper.deleteScenePlusExt(scenePlus.getId()); } sceneUpgradeMapper.transferScenePlus(num); scenePlus = scenePlusService.getScenePlusByNum(num); String sceneKind = sceneProEntity.getSceneScheme() == 3 ? SceneKind.FACE.code():SceneKind.TILES.code(); sceneUpgradeMapper.transferScenePlusExt(num, scenePlus.getId(), sceneKind); log.info("开始发送激光场景生成obj mq消息"); // 发送MQ BuildSceneCallMessage mqMsg = new BuildSceneCallMessage(); mqMsg.setSceneNum(sceneProEntity.getNum()); mqMsg.setAlgorithm(sceneProEntity.getAlgorithm()); mqMsg.setBuildType(sceneProEntity.getBuildType()); mqMsg.setPath(sceneProEntity.getDataSource()); mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg); } public void generatePlusObjFile(String num) { ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(ObjectUtils.isEmpty(scenePlus)){ throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005); } if(scenePlus.getSceneSource() != 4 && scenePlus.getSceneSource() !=5){ throw new BusinessException(ErrorCode.FAILURE_CODE_3003, "只能操作激光场景"); } ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); String ossPath = scenePlusExt.getDataSource().replace("/mnt/data","home")+"/data.fdage"; if(!fYunFileService.fileExist(ossPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3037); } // 获取最新的场景名称 Result laserSceneByNum = laserClient.getSceneByNum(num); if(laserSceneByNum.getCode() != HttpStatus.OK.value()){ throw new RuntimeException("获取激光转台场景失败!"); } JSONObject sceneInfo = JSONObject.parseObject(JSONObject.toJSONString(laserSceneByNum.getData())); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper .set(ScenePlus::getSceneStatus, 0) .set(ScenePlus::getTitle, sceneInfo.getString("title")) .eq(ScenePlus::getNum, num); scenePlusService.update(updateWrapper); LambdaUpdateWrapper plusExtUpdateWrapper = new LambdaUpdateWrapper<>(); plusExtUpdateWrapper .set(ScenePlusExt::getIsObj, 1) .eq(ScenePlusExt::getPlusId, scenePlus.getId()); scenePlusExtService.update(plusExtUpdateWrapper); log.info("开始发送激光场景生成obj mq消息"); // 发送MQ BuildSceneCallMessage mqMsg = new BuildSceneCallMessage(); mqMsg.setSceneNum(num); mqMsg.setAlgorithm(scenePlusExt.getAlgorithm()); mqMsg.setBuildType(scenePlusExt.getBuildType()); mqMsg.setPath(scenePlusExt.getDataSource()); mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg); } public JSONObject getSceneByNum(String num) { Result result = laserClient.getSceneByNum(num); if(result.getCode() != HttpStatus.OK.value()){ log.error("获取激光转台场景失败!"); return null; } return JSONObject.parseObject(JSONObject.toJSONString(result.getData())); } }