SceneProServiceImpl.java 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  1. package com.fdkankan.ucenter.service.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.thread.ThreadUtil;
  5. import cn.hutool.json.JSONUtil;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  11. import com.fdkankan.common.constant.SceneConstant;
  12. import com.fdkankan.common.constant.SceneKind;
  13. import com.fdkankan.common.constant.SceneVersionType;
  14. import com.fdkankan.common.exception.BusinessException;
  15. import com.fdkankan.common.util.*;
  16. import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
  17. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  18. import com.fdkankan.redis.constant.RedisKey;
  19. import com.fdkankan.ucenter.common.OssPath;
  20. import com.fdkankan.ucenter.common.PageInfo;
  21. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  22. import com.fdkankan.redis.util.RedisUtil;
  23. import com.fdkankan.ucenter.common.constants.ResultCodeMsg;
  24. import com.fdkankan.ucenter.constant.CameraConstant;
  25. import com.fdkankan.ucenter.constant.LoginConstant;
  26. import com.fdkankan.ucenter.entity.*;
  27. import com.fdkankan.ucenter.httpClient.service.LaserService;
  28. import com.fdkankan.ucenter.mapper.ISceneProMapper;
  29. import com.fdkankan.ucenter.mapper.ISceneUpgradeMapper;
  30. import com.fdkankan.ucenter.service.*;
  31. import com.fdkankan.ucenter.util.DateUserUtil;
  32. import com.fdkankan.ucenter.util.SceneResourcePath;
  33. import com.fdkankan.ucenter.vo.ResponseScene;
  34. import com.fdkankan.ucenter.vo.request.RequestScene;
  35. import com.fdkankan.ucenter.vo.request.SceneParam;
  36. import com.fdkankan.ucenter.vo.response.*;
  37. import java.io.File;
  38. import java.util.*;
  39. import java.util.concurrent.CompletableFuture;
  40. import java.util.concurrent.ExecutorService;
  41. import java.util.stream.Collectors;
  42. import lombok.extern.slf4j.Slf4j;
  43. import org.apache.commons.lang3.StringUtils;
  44. import org.joda.time.DateTime;
  45. import org.springframework.beans.BeanUtils;
  46. import org.springframework.beans.factory.annotation.Autowired;
  47. import org.springframework.beans.factory.annotation.Value;
  48. import org.springframework.stereotype.Service;
  49. import org.springframework.util.ObjectUtils;
  50. /**
  51. * <p>
  52. * pro场景表 服务实现类
  53. * </p>
  54. *
  55. * @author
  56. * @since 2022-07-04
  57. */
  58. @Service
  59. @Slf4j
  60. public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
  61. @Autowired
  62. private IUserService userService;
  63. @Autowired
  64. private ISceneCooperationService sceneCooperationService;
  65. @Autowired
  66. private IScenePlusService scenePlusService;
  67. @Autowired
  68. private ISceneService sceneService;
  69. @Autowired
  70. private LaserService fdkkLaserService;
  71. @Autowired
  72. private FYunFileServiceInterface fYunFileService;
  73. @Autowired
  74. private IUserIncrementService userIncrementService;
  75. @Autowired
  76. private IIncrementTypeService incrementTypeService;
  77. @Autowired
  78. private IScenePlusExtService scenePlusExtService;
  79. @Autowired
  80. private ISceneEditInfoService sceneEditInfoService;
  81. @Autowired
  82. private ICameraDetailService cameraDetailService;
  83. @Autowired
  84. ICameraService cameraService;
  85. @Autowired
  86. private IFolderService folderService;
  87. @Autowired
  88. private IFolderSceneService folderSceneService;
  89. @Autowired
  90. private ISceneCopyLogService sceneCopyLogService;
  91. @Autowired
  92. private IScene3dNumService scene3dNumService;
  93. @Autowired
  94. private ISceneProEditService sceneProEditService;
  95. @Autowired
  96. private SceneCommonService sceneCommonService;
  97. @Autowired
  98. private RedisUtil redisUtil;
  99. @Autowired
  100. private ISceneUpgradeMapper sceneUpgradeMapper;
  101. @Autowired
  102. private IInnerService innerService;
  103. @Autowired
  104. LaserService laserService;
  105. @Autowired
  106. private FYunFileServiceInterface fYunFileServiceInterface;
  107. @Autowired
  108. ISceneDelLogService sceneDelLogService;
  109. @Value("${scene.pro.url}")
  110. private String sceneProUrl;
  111. @Value("${scene.pro.new.url}")
  112. private String sceneProNewUrl;
  113. @Value("${queue.modeling.obj.modeling-pre}")
  114. private String queueObjModelingPre;
  115. @Autowired
  116. private RabbitMqProducer mqProducer;
  117. @Autowired
  118. ICameraTypeService cameraTypeService;
  119. @Override
  120. public HashMap<String, SceneNumVo> findSceneNumber(String token) {
  121. User user = userService.getByUserName(JwtUtil.getUsername(token));
  122. SceneNumVo sceneNumVoKk = getSceneNumVoByType(Arrays.asList(1,2,12,13,14), user.getId());
  123. Integer oldNum = sceneService.getCountByUserId(user.getId());
  124. sceneNumVoKk.setSceneNum( oldNum + sceneNumVoKk.getSceneNum());
  125. sceneNumVoKk.setTotalNum(oldNum + sceneNumVoKk.getTotalNum());
  126. SceneNumVo sceneNumVoKj = getSceneNumVoByType(Collections.singletonList(3), user.getId());
  127. SceneNumVo sceneNumVoSS = fdkkLaserService.getLaserSceneNumByUser(token,4);
  128. SceneNumVo sceneNumVoSSObj = getSceneNumVoByObjType(Arrays.asList(4), user.getId());
  129. SceneNumVo sceneNumVoSG = fdkkLaserService.getLaserSceneNumByUser(token,5);
  130. SceneNumVo sceneNumVoSGObj = getSceneNumVoByObjType(Arrays.asList(5), user.getId());
  131. SceneNumVo sceneNumVoE57 = fdkkLaserService.getLaserSceneNumByUser(token,57);
  132. SceneNumVo sceneNumVoE57Obj = getSceneNumVoByObjType(Arrays.asList(57), user.getId());
  133. HashMap<String, SceneNumVo> hashMap = new HashMap<>();
  134. hashMap.put("kk",sceneNumVoKk);
  135. hashMap.put("kJ",sceneNumVoKj);
  136. hashMap.put("SS",sceneNumVoSS);
  137. hashMap.put("SS_OBJ",sceneNumVoSSObj);
  138. hashMap.put("SG",sceneNumVoSG);
  139. hashMap.put("SG_OBJ",sceneNumVoSGObj);
  140. hashMap.put("e57",sceneNumVoE57);
  141. hashMap.put("e57_OBJ",sceneNumVoE57Obj);
  142. return hashMap;
  143. }
  144. private SceneNumVo getSceneNumVoByType(List<Integer> sceneSourceList, Long userId){
  145. SceneNumVo sceneNumVo = new SceneNumVo();
  146. LambdaQueryWrapper<ScenePro> queryWrapper = new LambdaQueryWrapper<>();
  147. queryWrapper.eq(ScenePro::getUserId, userId);
  148. queryWrapper.in(ScenePro::getSceneSource, sceneSourceList);
  149. queryWrapper.eq(ScenePro::getIsUpgrade, 0);
  150. Integer sceneNum = Math.toIntExact(this.count(queryWrapper));
  151. Long count = scenePlusService.getCountByUserId(userId,sceneSourceList);
  152. sceneNumVo.setCooperationSceneNum(sceneCooperationService.getCooperationSceneNum(userId,sceneSourceList));
  153. sceneNumVo.setSceneNum(sceneNum + count);
  154. sceneNumVo.setTotalNum(sceneNumVo.getSceneNum() + sceneNumVo.getCooperationSceneNum());
  155. return sceneNumVo;
  156. }
  157. private SceneNumVo getSceneNumVoByObjType(List<Integer> sceneSourceList, Long userId){
  158. SceneNumVo sceneNumVo = new SceneNumVo();
  159. LambdaQueryWrapper<ScenePro> queryWrapper = new LambdaQueryWrapper<>();
  160. queryWrapper.eq(ScenePro::getUserId, userId);
  161. queryWrapper.in(ScenePro::getSceneSource, sceneSourceList);
  162. queryWrapper.eq(ScenePro::getIsUpgrade, 0);
  163. queryWrapper.eq(ScenePro::getIsObj,1);
  164. Integer sceneNum = Math.toIntExact(this.count(queryWrapper));
  165. List<ScenePlus> scenePlusList = scenePlusService.getCountByUserIdAndSceneSource(userId,sceneSourceList,1);
  166. long plusCount = scenePlusList.size();
  167. Long cooperNum = sceneCooperationService.getCooperationSceneNum(userId, sceneSourceList);
  168. sceneNumVo.setCooperationSceneNum(cooperNum);
  169. sceneNumVo.setSceneNum(sceneNum + plusCount);
  170. sceneNumVo.setTotalNum(sceneNumVo.getSceneNum() + sceneNumVo.getCooperationSceneNum());
  171. return sceneNumVo;
  172. }
  173. @Override
  174. public HashMap<Long,GroupByCount> findSceneNumByCameraIds(List<Long> cameraIdList) {
  175. HashMap<Long,GroupByCount> map = new HashMap<>();
  176. List<GroupByCount> result = this.getBaseMapper().findSceneProNumByCameraIds(cameraIdList);
  177. List<GroupByCount> result2 = this.getBaseMapper().findScenePlusNumByCameraIds(cameraIdList);
  178. result.forEach(entity ->map.put(entity.getId(),entity));
  179. for (GroupByCount groupByCount : result2) {
  180. if (map.get(groupByCount.getId()) != null) {
  181. Long totalCount = map.get(groupByCount.getId()).getCount() + groupByCount.getCount();
  182. String lastTime = DateUserUtil.getLastTime(map.get(groupByCount.getId()).getLastTime(), groupByCount.getLastTime());
  183. groupByCount.setCount(totalCount);
  184. groupByCount.setLastTime(lastTime);
  185. }
  186. map.put(groupByCount.getId(),groupByCount);
  187. }
  188. return map;
  189. }
  190. public void lockOrUnLockBySpace(Long cameraId){
  191. CameraDetail cameraDetail = cameraDetailService.getByCameraId(cameraId);
  192. this.lockOrUnLockBySpace(cameraDetail,cameraId);
  193. }
  194. @Override
  195. public void lockOrUnLockBySpace(CameraDetail cameraDetail, Long cameraId) {
  196. List<SimpleSceneVo> voList = this.getSimpleSceneVo(cameraDetail);
  197. if(voList .size() <=0){
  198. return;
  199. }
  200. CameraType cameraType = cameraTypeService.getByCameraType(cameraDetail.getType());
  201. Long totalSpace = cameraDetailService.getTotalSpaceByCameraId(cameraDetail);
  202. Long usedSpace = 0L;
  203. //获取未被封存的场景容量
  204. List<Long> spaceList = voList.stream().filter(entity -> entity.getPayStatus() == 1).map(SimpleSceneVo::getSpace).collect(Collectors.toList());
  205. if("SP".equals(cameraDetail.getUnit())){
  206. usedSpace = (long) spaceList.size();
  207. }
  208. if("GB".equals(cameraDetail.getUnit())){
  209. for (Long aLong : spaceList) {
  210. usedSpace += aLong;
  211. }
  212. }
  213. //计算时间倒序
  214. List<SimpleSceneVo> sceneVos = voList.stream().sorted(Comparator.comparing(SimpleSceneVo::getCreateTime).reversed()).collect(Collectors.toList());
  215. if(totalSpace == -1){ // 无限容量 全部解封
  216. sceneVos = sceneVos.stream().filter(e -> e.getPayStatus() !=1).collect(Collectors.toList());
  217. lockOrUnLockScenes(sceneVos,1,cameraType);
  218. return;
  219. }
  220. //按计算完成时间由新到旧封存
  221. //按计算完成时间由旧到新解封
  222. //payStatus 1解封,-2封存
  223. List<SimpleSceneVo> lockedIds = new ArrayList<>();
  224. if(usedSpace > totalSpace){
  225. sceneVos = sceneVos.stream().filter(entity -> entity.getPayStatus() ==1).collect(Collectors.toList());
  226. Long space = getSceneLockedIds(lockedIds, sceneVos, usedSpace - totalSpace,cameraDetail.getUnit());
  227. log.info("lockOrUnLockBySpace---cameraId:{},totalSpace:{},useSpace{},space:{},payStatus:{}", cameraId,totalSpace,usedSpace,space,-2);
  228. lockOrUnLockScenes(lockedIds,-2,cameraType);
  229. return;
  230. }
  231. if(usedSpace < totalSpace){ //使用容量小于总容量,解封
  232. sceneVos = sceneVos.stream().filter(entity -> entity.getPayStatus() !=1).collect(Collectors.toList());
  233. CollectionUtil.reverse(sceneVos);
  234. Long space = getSceneUnLockedIds(lockedIds, sceneVos, totalSpace - usedSpace,cameraDetail.getUnit());
  235. log.info("lockOrUnLockBySpace---cameraId:{},totalSpace:{},useSpace{},space:{},payStatus:{}", cameraId,totalSpace,usedSpace,space,1);
  236. lockOrUnLockScenes(lockedIds,1,cameraType);
  237. }
  238. }
  239. private void lockOrUnLockScenes(List<SimpleSceneVo> sceneVos, Integer payStatus,CameraType cameraType){
  240. List<String> v3NumList = sceneVos.stream().filter(e ->"v3".equals(e.getVersion())).map(SimpleSceneVo::getNum).collect(Collectors.toList());
  241. List<String> v4NumList = sceneVos.stream().filter(e ->"v4".equals(e.getVersion())).map(SimpleSceneVo::getNum).collect(Collectors.toList());
  242. lockOrUnLockScenes(v3NumList,v4NumList,payStatus,cameraType.getIsLaser(),null);
  243. }
  244. private Long getSceneUnLockedIds(List<SimpleSceneVo> lockedIds ,List<SimpleSceneVo> list,Long beyondSpace,String unit){
  245. Long space = 0L;
  246. if (list != null && list.size() > 0){
  247. for (SimpleSceneVo scenePro : list){
  248. Long sceneSpace = scenePro.getSpace()== null ? 0 : scenePro.getSpace();
  249. if("SP".equals(unit)){
  250. sceneSpace = 1L;
  251. }
  252. if (space + sceneSpace > beyondSpace){
  253. break;
  254. }
  255. space += sceneSpace;
  256. lockedIds.add(scenePro);
  257. }
  258. }
  259. return space;
  260. }
  261. private Long getSceneLockedIds(List<SimpleSceneVo> lockedIds ,List<SimpleSceneVo> list,Long beyondSpace,String unit){
  262. Long space = 0L;
  263. if (list != null && list.size() > 0){
  264. for (SimpleSceneVo scenePro : list){
  265. if(scenePro.getCompanyId()!=null && scenePro.getCompanyId() == 26L && scenePro.getLocation() != null && scenePro.getLocation() ==7){
  266. continue;
  267. }
  268. Long sceneSpace = scenePro.getSpace()== null ? 0 : scenePro.getSpace();
  269. if("SP".equals(unit)){
  270. sceneSpace = 1L;
  271. }
  272. space += sceneSpace;
  273. lockedIds.add(scenePro);
  274. if (space >= beyondSpace){
  275. break;
  276. }
  277. }
  278. }
  279. return space;
  280. }
  281. // payStatus 为 -2 封存,为 1 解封
  282. @Override
  283. public void lockOrUnLockScenes( List<String> v3NumList,List<String> v4NumList,Integer payStatus,Integer isLaser,List<String> panoNumList) {
  284. if(!v3NumList.isEmpty()){
  285. LambdaUpdateWrapper<ScenePro> updateWrapper = new LambdaUpdateWrapper<>();
  286. updateWrapper.set(ScenePro::getPayStatus,payStatus)
  287. .eq(ScenePro::getIsUpgrade,0)
  288. .in(ScenePro::getNum,v3NumList);
  289. this.update(updateWrapper);
  290. }
  291. if(!v4NumList.isEmpty()){
  292. LambdaUpdateWrapper<ScenePlus> updatePlusWrapper = new LambdaUpdateWrapper<>();
  293. updatePlusWrapper.set(ScenePlus::getPayStatus,payStatus)
  294. .in(ScenePlus::getNum,v4NumList);
  295. scenePlusService.update(updatePlusWrapper);
  296. }
  297. this.updateOssStatus(v3NumList,v4NumList,payStatus);
  298. List<String> numList = new ArrayList<>();
  299. numList.addAll(v3NumList);
  300. numList.addAll(v4NumList);
  301. if(isLaser == 1){
  302. //激光系统相机
  303. //1:场景被删 0:计算中 1计算失败 2计算成功 3封存 4重算中'
  304. if(!numList.isEmpty()){
  305. laserService.updateStatus(numList,payStatus);
  306. }
  307. }
  308. if(panoNumList != null && !panoNumList.isEmpty()){
  309. laserService.updatePanoStatus(numList,payStatus);
  310. }
  311. }
  312. /**
  313. * 修改oss status.json中 payStatus
  314. */
  315. private void updateOssStatus(List<String> v3NumList ,List<String> v4NumList , Integer payStatus) {
  316. if(!v3NumList.isEmpty()){
  317. v3NumList.forEach(e ->this.updateOssStatus(String.format(OssPath.v3_statusPath,e),payStatus,e));
  318. }
  319. if(!v4NumList.isEmpty()){
  320. v4NumList.forEach(e ->this.updateOssStatus(String.format(OssPath.v4_statusPath,e),payStatus,e));
  321. }
  322. }
  323. /**
  324. * 从oss中获取文件,并重写,上传替换
  325. */
  326. public void updateOssStatus(String path,Integer payStatus,String num) {
  327. String localStatusPath = String.format(OssPath.localStatusPath,num);
  328. try {
  329. if(!fYunFileService.fileExist(path)){
  330. return;
  331. }
  332. String data = fYunFileService.getFileContent(path);
  333. if(StringUtils.isBlank(data)){
  334. return;
  335. }
  336. JSONObject jsonObject = JSONObject.parseObject(data);
  337. jsonObject.put("payStatus",payStatus);
  338. String json = JSONUtil.toJsonStr(jsonObject);
  339. FileUtils.writeFile(localStatusPath ,json);
  340. log.info("updateOssStatus--localPath:{},ossPath:{},payStatus:{}",localStatusPath,path,payStatus);
  341. fYunFileService.uploadFile(localStatusPath,path);
  342. }catch (Exception e){
  343. log.info("updateOssStatus--localPath:{},ossPath:{},payStatus:{}",localStatusPath,path,payStatus,e);
  344. }finally {
  345. if(new File(localStatusPath).getParentFile().exists()){
  346. FileUtil.del( new File(localStatusPath).getParentFile());
  347. }
  348. }
  349. }
  350. @Override
  351. public List<ScenePro> getListByCameraId(Long cameraId) {
  352. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  353. wrapper.eq(ScenePro::getCameraId,cameraId)
  354. .eq(ScenePro::getIsUpgrade,0);
  355. return this.list(wrapper);
  356. }
  357. @Override
  358. public void bindOrUnCamera(List<Long> cameraIds, Long userId) {
  359. if(cameraIds.size() >0){
  360. LambdaUpdateWrapper<ScenePro> wrapper = new LambdaUpdateWrapper<>();
  361. wrapper.in(ScenePro::getCameraId,cameraIds)
  362. .eq(ScenePro::getIsUpgrade,0)
  363. .set(ScenePro::getUserId,userId);
  364. this.update(wrapper);
  365. }
  366. }
  367. @Override
  368. public List<ScenePro> getListByCameraIds(List<Long> cameraIds) {
  369. if(cameraIds.size() >0){
  370. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  371. wrapper.in(ScenePro::getCameraId,cameraIds)
  372. .eq(ScenePro::getIsUpgrade,0);
  373. return this.list(wrapper);
  374. }
  375. return new ArrayList<>();
  376. }
  377. @Override
  378. public List<ScenePro> getListByNums(List<String> numList) {
  379. if(numList.size() >0){
  380. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  381. wrapper.in(ScenePro::getNum,numList)
  382. .eq(ScenePro::getIsUpgrade,0);
  383. return this.list(wrapper);
  384. }
  385. return new ArrayList<>();
  386. }
  387. @Override
  388. public Long getCountByUserId(Long userId, List<?> resourceList) {
  389. if(resourceList.size() >0){
  390. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  391. wrapper.eq(ScenePro::getUserId,userId);
  392. wrapper.eq(ScenePro::getIsUpgrade,0);
  393. wrapper.in(ScenePro::getSceneSource,resourceList);
  394. return this.count(wrapper);
  395. }
  396. return 0L;
  397. }
  398. @Override
  399. public Long getCountByUserId(Long id, Integer cameraType) {
  400. return this.getBaseMapper().getCountByUserId(id,cameraType);
  401. }
  402. @Override
  403. public void deleteByIds(List<Long> sceneIds,Long userId) {
  404. if(sceneIds.size() >0){
  405. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  406. wrapper.in(ScenePro::getId,sceneIds)
  407. .eq(ScenePro::getIsUpgrade,0);
  408. List<ScenePro> proList = this.list(wrapper);
  409. LambdaQueryWrapper<ScenePlus> plusWr = new LambdaQueryWrapper<>();
  410. plusWr.in(ScenePlus::getId,sceneIds);
  411. List<ScenePlus> plusList = scenePlusService.list(plusWr);
  412. this.deleteByList(proList,plusList,userId,null);
  413. }
  414. }
  415. @Override
  416. public Page<SceneVo> pageListAndFolder(Page<Object> page, SceneParam param) {
  417. return getBaseMapper().pageListAndFolder(new Page<>(param.getPageNum(),param.getPageSize()),param);
  418. }
  419. @Override
  420. public Object getScenes(String username, RequestScene param) {
  421. User user = userService.getByUserName(username);
  422. log.info("搜索条件是:"+ param.getSearchKey());
  423. //type为12表示一键换装的请求,不查询相机数据
  424. if(StringUtils.isNotEmpty(param.getSearchKey()) && !"11".equals(param.getType())){
  425. List<Long> userIds = userService.getLikeUserName(param.getSearchKey());
  426. if(userIds.size() > 0){
  427. List<String> cooperationList = sceneCooperationService.getNumByUserIds(userIds);
  428. param.setNumList(cooperationList);
  429. }
  430. }
  431. param.setUserId(user.getId());
  432. Page<SceneVo> sceneList = sceneService.getSceneList(param);
  433. for (SceneVo record : sceneList.getRecords()) {
  434. record.setUserName(username);
  435. SceneCooperation sceneCooperationEntity = sceneCooperationService.getByNum(record.getNum());
  436. if(sceneCooperationEntity != null && sceneCooperationEntity.getUserId()!= null){
  437. User user1 = userService.getById(sceneCooperationEntity.getUserId());
  438. if(user1 != null){
  439. record.setCooperationUserId(String.valueOf(sceneCooperationEntity.getUserId()));
  440. record.setCooperationUserName(user1.getUserName());
  441. }
  442. }
  443. }
  444. return PageInfo.PageInfo(sceneList);
  445. }
  446. @Override
  447. public JSONObject newList(SceneParam param, String username) {
  448. param.setSourceList(getSceneSource(param.getSceneSource()));
  449. if(StringUtils.isNotBlank(username)){
  450. User user = userService.getByUserName(username);
  451. param.setUserId(user.getId());
  452. }
  453. Page<SceneVo> sceneVoPage = getBaseMapper().pageListAndFolder(new Page<>(param.getPageNum(),param.getPageSize()),param);
  454. List<SceneVo> folderList = sceneVoPage.getRecords().parallelStream().filter(entity -> entity.getIsFolder() == 1).collect(Collectors.toList());
  455. Long totalSceneNum = sceneVoPage.getTotal();
  456. if(folderList.size() >0){
  457. List<Long> folderIds = folderList.parallelStream().map(SceneVo::getId).collect(Collectors.toList());
  458. List<Folder> allFolderIds = folderService.getAllFolderIds(folderIds);
  459. HashMap<Long,Long> map = folderSceneService.getGroupByFolderIds(allFolderIds);
  460. for (SceneVo vo : sceneVoPage.getRecords()) {
  461. if(vo.getIsFolder() == 1 && vo.getType()!= null && vo.getType()!= 3){
  462. Long sceneNum = map.get(vo.getId()) == null ? 0L : map.get(vo.getId());
  463. vo.setSceneNum(sceneNum);
  464. vo.setCreateTimeStr(vo.getCreateTime());
  465. }else if(vo.getIsFolder() == 1 && vo.getType()!= null && vo.getType() == 3){
  466. if(param.getUserId()!= null){
  467. Integer count = sceneService.getCountByUserId(param.getUserId());
  468. vo.setSceneNum(Long.valueOf(count));
  469. }
  470. }
  471. }
  472. }
  473. //设置协作者信息
  474. if(sceneVoPage.getRecords().size() >0){
  475. List<String> numList = sceneVoPage.getRecords().parallelStream().map(SceneVo::getNum).collect(Collectors.toList());
  476. HashMap<String,List<User>> cooMap = sceneCooperationService.getByNumList(numList);
  477. for (SceneVo vo : sceneVoPage.getRecords()) {
  478. if (StringUtils.isNotBlank(vo.getNum())) {
  479. List<User> userVos = cooMap.get(vo.getNum());
  480. if (userVos != null) {
  481. List<Long> ids = userVos.stream().map(User::getId).collect(Collectors.toList());
  482. List<String> userNameList = userVos.stream().map(User::getUserName).collect(Collectors.toList());
  483. vo.setCooperationUserIdList(ids);
  484. vo.setCooperationUserNameList(userNameList);
  485. }
  486. }
  487. }
  488. }
  489. List<SceneVo> sceneList = sceneVoPage.getRecords().parallelStream().filter(entity -> entity.getIsFolder() == 0)
  490. .peek(vo->{
  491. if (ObjectUtils.isEmpty(vo.getStatus())) {
  492. return;
  493. }
  494. if (vo.getStatus().equals(500)) { //500状态为数据库中手动修改值,当场景本身异常,算法,算不了
  495. vo.setStatus(-1);
  496. }
  497. if (vo.getSceneSource() != null && vo.getSceneSource() != 57 && vo.getStatus().equals(-1)) { //计算失败,钉钉通知之后,判定是否重算,还是修改为 500
  498. vo.setStatus(0);
  499. }
  500. }).collect(Collectors.toList());
  501. if(sceneList.size() >0){
  502. folderList.addAll(sceneList);
  503. }
  504. sceneVoPage.setRecords(folderList);
  505. if(param.getFolderId() == null && param.getIsObj() == null ){
  506. List<String> sourceList = param.getSourceList();
  507. if(param.getUserId()!= null){
  508. totalSceneNum = this.getCountByUserId(param.getUserId(),sourceList);
  509. totalSceneNum += scenePlusService.getCountByUserId(param.getUserId(),sourceList);
  510. totalSceneNum += sceneService.getCountByUserId(param.getUserId());
  511. }
  512. }else if(param.getFolderId() != null ){
  513. totalSceneNum = folderSceneService.getCountByFolderAndSon(param.getFolderId());
  514. }else if(param.getIsObj() != null && param.getIsObj() ==1){
  515. if(param.getUserId()!= null){
  516. totalSceneNum = this.getCountByLaserAndIsObj(param.getUserId(),Integer.valueOf(param.getSceneSource()));
  517. }
  518. }
  519. JSONObject jsonObject = new JSONObject();
  520. jsonObject.put("pageInfo",PageInfo.PageInfo(sceneVoPage));
  521. jsonObject.put("sceneNum",totalSceneNum);
  522. return jsonObject;
  523. }
  524. private Long getCountByLaserAndIsObj(Long userId,Integer sceneSource) {
  525. Long proCount = 0L;
  526. Long plusCount = 0L;
  527. LambdaQueryWrapper<ScenePro> proWr = new LambdaQueryWrapper<>();
  528. proWr.eq(ScenePro::getUserId,userId);
  529. proWr.eq(ScenePro::getSceneSource,sceneSource);
  530. proWr.eq(ScenePro::getIsObj,1);
  531. proWr.eq(ScenePro::getIsUpgrade,0);
  532. proCount = this.count(proWr);
  533. LambdaQueryWrapper<ScenePlus> plusWr = new LambdaQueryWrapper<>();
  534. plusWr.eq(ScenePlus::getUserId,userId);
  535. plusWr.eq(ScenePlus::getSceneSource,sceneSource);
  536. List<ScenePlus> list = scenePlusService.list(plusWr);
  537. if(list.size() >0){
  538. List<Long> plusIds = list.stream().map(ScenePlus::getId).collect(Collectors.toList());
  539. LambdaQueryWrapper<ScenePlusExt> extWr = new LambdaQueryWrapper<>();
  540. extWr.in(ScenePlusExt::getPlusId,plusIds);
  541. extWr.eq(ScenePlusExt::getIsObj,1);
  542. plusCount = scenePlusExtService.count(extWr);
  543. }
  544. return proCount +plusCount;
  545. }
  546. public List<String> getSceneSource(String sceneSource){
  547. List<String> sceneSourceList ;
  548. if(StringUtils.isNotBlank(sceneSource)){
  549. switch (sceneSource){
  550. case "1" : sceneSourceList = Arrays.asList("1","2","12","13","14"); break; //四维看看
  551. case "3" : sceneSourceList = Collections.singletonList("3"); break;//四维看见
  552. case "4" : sceneSourceList = Collections.singletonList("4"); break;//深时场景
  553. default:
  554. if(sceneSource.contains(",")){
  555. sceneSource = sceneSource + ",12,13,14";
  556. sceneSourceList = Arrays.asList(sceneSource.split(","));
  557. break;
  558. }
  559. sceneSourceList = Collections.singletonList(sceneSource);break;
  560. }
  561. return sceneSourceList;
  562. }
  563. return Arrays.asList("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15");
  564. }
  565. @Override
  566. public void copyScene(String sceneNum,String userName) throws Exception {
  567. if(StringUtils.isEmpty(sceneNum)){
  568. throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
  569. }
  570. ScenePro scenePro = this.getByNum(sceneNum);
  571. ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
  572. if((scenePro == null || scenePro.getCameraId() == null ) && (scenePlus== null || scenePlus.getCameraId() == null)){
  573. throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
  574. }
  575. Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
  576. Long userId = scenePro == null ? scenePlus.getUserId() :scenePro.getUserId();
  577. // 判断是否有绑定会员权益
  578. Long count = userIncrementService.getValidCountByCameraId(cameraId);
  579. if(count <= 0){
  580. throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
  581. }
  582. if(userId == null){
  583. throw new BusinessException(SceneConstant.FAILURE_CODE_5013, SceneConstant.FAILURE_MSG_5013);
  584. }
  585. //只能复制自己的场景
  586. User user = userService.getByUserName(userName);
  587. if(user == null || !user.getId().equals(userId) ){
  588. throw new BusinessException(SceneConstant.FAILURE_CODE_5013, SceneConstant.FAILURE_MSG_5013);
  589. }
  590. CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraId);
  591. if(detailEntity == null){
  592. throw new BusinessException(CameraConstant.FAILURE_CODE_6029, CameraConstant.FAILURE_MSG_6029);
  593. }
  594. UserIncrement userIncrement = userIncrementService.getByCameraId(cameraId);
  595. if(userIncrement == null || userIncrement.getIsExpired() == 1){
  596. throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
  597. }
  598. IncrementType incrementType = incrementTypeService.getById(userIncrement.getIncrementTypeId());
  599. if(incrementType == null){
  600. throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
  601. }
  602. Long space = null;
  603. if( scenePro != null ){
  604. space = scenePro.getSpace();
  605. }
  606. if( scenePlus != null ){
  607. ScenePlusExt ext = scenePlusExtService.getByPlusId(scenePlus.getId());
  608. space = ext.getSpace();
  609. }
  610. CameraType cameraType = cameraTypeService.getByCameraType(detailEntity.getType());
  611. Boolean canSpace = cameraDetailService.checkSpace(detailEntity,incrementType,space,cameraType);
  612. if(!canSpace){
  613. throw new BusinessException(CameraConstant.FAILURE_CODE_6008, CameraConstant.FAILURE_MSG_6008);
  614. }
  615. copyScene(sceneNum,detailEntity,scenePro,scenePlus,cameraType);
  616. }
  617. @Override
  618. public synchronized void copySceneNoCheck(String sceneNum) throws Exception {
  619. ScenePro scenePro = this.getByNum(sceneNum);
  620. ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
  621. Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
  622. CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraId);
  623. if(detailEntity == null){
  624. throw new BusinessException(CameraConstant.FAILURE_CODE_6029, CameraConstant.FAILURE_MSG_6029);
  625. }
  626. IncrementType incrementType = null;
  627. UserIncrement userIncrement = userIncrementService.getByCameraId(cameraId);
  628. if(userIncrement != null && userIncrement.getIsExpired() != 1){
  629. incrementType = incrementTypeService.getById(userIncrement.getIncrementTypeId());
  630. }
  631. Long space = null;
  632. if( scenePro != null ){
  633. space = scenePro.getSpace();
  634. }
  635. if( scenePlus != null ){
  636. ScenePlusExt ext = scenePlusExtService.getByPlusId(scenePlus.getId());
  637. space = ext.getSpace();
  638. }
  639. CameraType cameraType = cameraTypeService.getByCameraType(detailEntity.getType());
  640. Boolean canSpace = cameraDetailService.checkSpace(detailEntity,incrementType,space,cameraType);
  641. if(!canSpace){
  642. throw new BusinessException(CameraConstant.FAILURE_CODE_6008, CameraConstant.FAILURE_MSG_6008);
  643. }
  644. copyScene(sceneNum,detailEntity,scenePro,scenePlus,cameraType);
  645. }
  646. @Autowired
  647. RabbitMqProducer rabbitMqProducer;
  648. @Value("${queue.scene.copy:ucenter-copy-scene}")
  649. private String copySceneQueue;
  650. private void copyScene(String oldNum,CameraDetail detailEntity,ScenePro scenePro,ScenePlus scenePlus,CameraType cameraType) throws Exception {
  651. String newNum = scene3dNumService.generateSceneNum(detailEntity.getType());
  652. Long userId = scenePro == null ? scenePlus.getUserId() :scenePro.getUserId();
  653. sceneCopyLogService.saveByNum(oldNum,newNum,userId);
  654. HashMap<String,String > map = new HashMap<>();
  655. map.put("oldNum",oldNum);
  656. map.put("newNum",newNum);
  657. rabbitMqProducer.sendByWorkQueue(copySceneQueue,map);
  658. }
  659. @Override
  660. public ScenePro getByNum(String sceneNum) {
  661. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  662. wrapper.eq(ScenePro::getNum,sceneNum);
  663. wrapper.eq(ScenePro::getIsUpgrade,0);
  664. List<ScenePro> list = this.list(wrapper);
  665. if(list!= null && list.size() >0){
  666. return list.get(0);
  667. }
  668. return null;
  669. }
  670. @Override
  671. public Long copyV3Scene(ScenePro scenePro,String newNum,CameraDetail cameraDetail,CameraType cameraType) throws Exception {
  672. String oldNum = scenePro.getNum();
  673. Long sceneProId = scenePro.getId();
  674. scenePro.setNum(newNum);
  675. scenePro.setId(null);
  676. scenePro.setSceneName(scenePro.getSceneName() +"(copy)");
  677. scenePro.setViewCount(0);
  678. scenePro.setThumb(scenePro.getThumb().replaceAll(oldNum,scenePro.getNum()));
  679. scenePro.setWebSite(scenePro.getWebSite().replaceAll(oldNum,scenePro.getNum()));
  680. scenePro.setStatus(0);
  681. this.save(scenePro);
  682. ExecutorService executor = ThreadUtil.newSingleExecutor();
  683. try {
  684. CompletableFuture.runAsync(() -> {
  685. String oldDataSource = scenePro.getDataSource();
  686. String newDataSource = sceneCommonService.getNewDataSource(oldDataSource);
  687. log.info("sceneCopy--oldNum:{},oldDataSource:{},newNum:{},newDataSource:{}",
  688. oldNum,oldDataSource,newNum,newDataSource);
  689. scenePro.setDataSource(newDataSource);
  690. this.updateById(scenePro);
  691. SceneProEdit oldEditScene = sceneProEditService.getByProId(sceneProId);
  692. oldEditScene.setId(null);
  693. oldEditScene.setProId(scenePro.getId());
  694. oldEditScene.setScreencapVoiceSrc(oldEditScene.getScreencapVoiceSrc() == null ? null : oldEditScene.getScreencapVoiceSrc().replace(oldNum, scenePro.getNum()));
  695. oldEditScene.setScreencapVoiceSound(oldEditScene.getScreencapVoiceSound() == null ? null : oldEditScene.getScreencapVoiceSound().replace(oldNum, scenePro.getNum()));
  696. oldEditScene.setScreencapVoiceSoundsync(oldEditScene.getScreencapVoiceSoundsync() == null ? null : oldEditScene.getScreencapVoiceSoundsync().replace(oldNum, scenePro.getNum()));
  697. oldEditScene.setPlayData(oldEditScene.getPlayData() == null ? null : oldEditScene.getPlayData().replace(oldNum, scenePro.getNum()));
  698. oldEditScene.setScreencapThumb(oldEditScene.getScreencapThumb() == null ? null : oldEditScene.getScreencapThumb().replace(oldNum, scenePro.getNum()));
  699. oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(oldNum, scenePro.getNum()));
  700. sceneProEditService.save(oldEditScene);
  701. if(scenePro.getSceneSource() == 4 || scenePro.getSceneSource() == 5) { //深时复制
  702. laserService.copy(oldNum,newNum,newDataSource,true);
  703. }
  704. try {
  705. //重新生成编辑页基础设置二维码
  706. sceneCommonService.createNewQrCode(SceneVersionType.V3.code(),oldEditScene.getShareLogo(),newNum,scenePro.getWebSite());
  707. //copyDataSource
  708. // cn.hutool.core.io.FileUtil.copyContent(new File(oldDataSource),new File(newDataSource),true);
  709. String sourceData = String.format(SceneResourcePath.dataPath, oldNum);
  710. String targetData = String.format(SceneResourcePath.dataPath, scenePro.getNum());
  711. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceData,targetData);
  712. //修改 oss status.json ,nas scene.json
  713. sceneCommonService.updateOssJson(targetData,oldNum,newNum,"status.json");
  714. sceneCommonService.updateOssJson(targetData,oldNum,newNum,"hot.json");
  715. sceneCommonService.updateNasSceneJson(targetData,oldNum,newNum,scenePro.getSceneName(),"v3","scene.json");
  716. sceneCommonService.updateNasSceneJson(targetData,oldNum,newNum,scenePro.getSceneName(),"v3","hot.json");
  717. String sourceImages = String.format(SceneResourcePath.imagesPath, oldNum);
  718. String targetImages = String.format(SceneResourcePath.imagesPath, scenePro.getNum());
  719. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceImages,targetImages);
  720. String sourceVideo = String.format(SceneResourcePath.videoPath, oldNum);
  721. String targetVideo = String.format(SceneResourcePath.videoPath, scenePro.getNum());
  722. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceVideo,targetVideo);
  723. String sourceVoice = String.format(SceneResourcePath.voicePath, oldNum);
  724. String targetVoice = String.format(SceneResourcePath.voicePath, scenePro.getNum());
  725. this.copyOssAndNas(oldNum,scenePro.getNum(),sourceVoice,targetVoice);
  726. if(scenePro.getSceneSource() == 4 || scenePro.getSceneSource() == 5){ //深时复制
  727. laserService.copy(oldNum,newNum,newDataSource,false);
  728. }
  729. scenePro.setStatus(-2);
  730. this.updateById(scenePro);
  731. sceneCopyLogService.saveByNum(oldNum,newNum,scenePro.getUserId());
  732. Boolean checkSpace = cameraDetailService.checkSpace(cameraDetail.getCameraId(),cameraType);
  733. if(!checkSpace){
  734. this.lockOrUnLockScenes(Arrays.asList(scenePro.getNum()),new ArrayList<>(),-2,cameraType.getIsLaser(),null);
  735. }
  736. cameraDetailService.addUsedSpace(cameraDetail,scenePro.getSpace());
  737. }catch ( Exception e){
  738. log.error("复制场景失败-sceneNum:{},error:{}",oldNum,e);
  739. scenePro.setStatus(-1);
  740. this.updateById(scenePro);
  741. throw new BusinessException(ResultCodeMsg.FAILURE_CODE_400006, ResultCodeMsg.FAILURE_MSG_400006);
  742. }
  743. }, executor).whenComplete((reslut, e) -> {
  744. log.info("copy-success-");
  745. });
  746. }catch ( Exception e){
  747. log.error("copyError",e);
  748. }
  749. return scenePro.getId();
  750. }
  751. private void copyOssAndNas(String oldNum ,String newNum ,String sourcePath,String targetPath){
  752. log.info("sceneCopy-ossSource-oldNum:{},newNum:{},sourcePath:{},targetPath:{}",oldNum,newNum,sourcePath,targetPath);
  753. fYunFileServiceInterface.copyFileInBucket(sourcePath,targetPath);
  754. File fileData = new File(SceneResourcePath.nasBasePath + sourcePath);
  755. if(fileData.exists()){
  756. if(targetPath.contains("images")){
  757. sceneCommonService.delLink(fileData.getPath());
  758. }
  759. cn.hutool.core.io.FileUtil.copyContent(fileData,new File(SceneResourcePath.nasBasePath + targetPath),true);
  760. }
  761. }
  762. @Override
  763. public void delete(String sceneNum,Long userId,String platform) {
  764. if(StringUtils.isEmpty(sceneNum)){
  765. throw new BusinessException(LoginConstant.FAILURE_CODE_3001,LoginConstant.FAILURE_MSG_3001);
  766. }
  767. String[] nums = sceneNum.split(",");
  768. List<String> numList = Arrays.asList(nums);
  769. List<ScenePro> proList = this.getListByNums(numList);
  770. List<ScenePlus> plusList = scenePlusService.getListByNums(numList);
  771. this.deleteByList(proList,plusList,userId,platform);
  772. }
  773. @Override
  774. public void deleteByList(List<ScenePro> proList,List<ScenePlus> plusList,Long userId,String platform) {
  775. HashMap<Long ,Long >cameraMap = new HashMap<>();
  776. if(proList.size() >0){
  777. for (ScenePro scenePro : proList) {
  778. cameraMap.merge(scenePro.getCameraId(), scenePro.getSpace(), Long::sum);
  779. sceneDelLogService.saveLog(scenePro.getNum(),userId);
  780. if(StringUtils.isBlank(platform) && (scenePro.getSceneSource() == 4 || scenePro.getSceneSource() == 5 || scenePro.getSceneSource() == 57)){
  781. laserService.delete(scenePro.getNum());
  782. }
  783. }
  784. List<Long> proIds = proList.parallelStream().map(ScenePro::getId).collect(Collectors.toList());
  785. this.removeByIds(proIds);
  786. folderSceneService.delBySceneId(proIds);
  787. }
  788. if(plusList.size() >0){
  789. List<Long> plusIds = plusList.parallelStream().map(ScenePlus::getId).collect(Collectors.toList());
  790. HashMap<Long, ScenePlusExt> plusMap = scenePlusExtService.getByPlusIds(plusIds);
  791. for (ScenePlus scenePlus : plusList) {
  792. if(scenePlus.getCameraId()!= null && plusMap.get(scenePlus.getId())!=null){
  793. Long space = plusMap.get(scenePlus.getId()).getSpace() == null ? 0 :plusMap.get(scenePlus.getId()).getSpace();
  794. cameraMap.merge(scenePlus.getCameraId(), space, Long::sum);
  795. }
  796. sceneDelLogService.saveLog(scenePlus.getNum(),userId);
  797. if(StringUtils.isBlank(platform) && ( scenePlus.getSceneSource() == 4 || scenePlus.getSceneSource() == 5|| scenePlus.getSceneSource() == 57)){
  798. laserService.delete(scenePlus.getNum());
  799. }
  800. }
  801. scenePlusService.removeByIds(plusIds);
  802. scenePlusExtService.removeByPlusIds(plusIds);
  803. folderSceneService.delBySceneId(plusIds);
  804. }
  805. //恢复相机使用容量
  806. if(cameraMap.size() >0){
  807. cameraDetailService.addUsedSpace(cameraMap);
  808. }
  809. }
  810. @Override
  811. public ScenePro getByUnicode(String unicode) {
  812. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  813. wrapper.like(ScenePro::getDataSource,unicode);
  814. wrapper.eq(ScenePro::getIsUpgrade,0);
  815. wrapper.orderByDesc(ScenePro::getCreateTime);
  816. List<ScenePro> list = this.list(wrapper);
  817. if(list !=null && list.size() >0){
  818. return list.get(0);
  819. }
  820. return null;
  821. }
  822. @Override
  823. public SceneInfoVo getInfo(String num) {
  824. if(StringUtils.isEmpty(num)){
  825. throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
  826. }
  827. ScenePro scenePro = this.getByNum(num);
  828. ScenePlus scenePlus = scenePlusService.getByNum(num);
  829. if(scenePro == null && scenePlus == null){
  830. throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
  831. }
  832. if(scenePro!=null && scenePro.getStatus() != 1 && scenePro.getStatus() != -2){
  833. throw new BusinessException(SceneConstant.FAILURE_CODE_5033, SceneConstant.FAILURE_MSG_5033);
  834. }
  835. if(scenePlus!=null && scenePlus.getSceneStatus() != 1 && scenePlus.getSceneStatus() != -2){
  836. throw new BusinessException(SceneConstant.FAILURE_CODE_5033, SceneConstant.FAILURE_MSG_5033);
  837. }
  838. if(scenePro!=null && scenePro.getPayStatus() != 1){
  839. throw new BusinessException(SceneConstant.FAILURE_CODE_5034, SceneConstant.FAILURE_MSG_5034);
  840. }
  841. if(scenePlus!=null && scenePlus.getPayStatus() != 1){
  842. throw new BusinessException(SceneConstant.FAILURE_CODE_5034, SceneConstant.FAILURE_MSG_5034);
  843. }
  844. SceneInfoVo infoVo = new SceneInfoVo();
  845. String dataSource = null;
  846. if(scenePro!=null){
  847. dataSource = scenePro.getDataSource();
  848. SceneProEdit sceneProEdit = sceneProEditService.getByProId(scenePro.getId());
  849. if(sceneProEdit !=null){
  850. BeanUtils.copyProperties(sceneProEdit, infoVo);
  851. }
  852. BeanUtils.copyProperties(scenePro,infoVo);
  853. if(StringUtils.isNotEmpty(scenePro.getGps())){
  854. infoVo.setGps(JSONObject.parseObject(scenePro.getGps()).toJSONString());
  855. }
  856. infoVo.setSceneKey("");
  857. infoVo.setCreateDate(DateUserUtil.getDate(scenePro.getCreateTime()).getTime());
  858. }else {
  859. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  860. ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId());
  861. if(sceneEditInfo != null){
  862. BeanUtils.copyProperties(sceneEditInfo,infoVo);
  863. }
  864. if(scenePlusExt !=null){
  865. BeanUtils.copyProperties(scenePlusExt,infoVo);
  866. }
  867. BeanUtils.copyProperties(scenePlus,infoVo);
  868. infoVo.setSceneName(scenePlus.getTitle());
  869. infoVo.setStatus(scenePlus.getSceneStatus());
  870. dataSource = scenePlusExt.getDataSource();
  871. }
  872. if(dataSource != null){
  873. if(!fYunFileService.fileExist(dataSource.replace("/mnt/data","home") +"/data.fdage")){
  874. infoVo.setResourceDel(1);
  875. }
  876. }
  877. if(StringUtils.isNotEmpty(infoVo.getEntry())){
  878. infoVo.setEntry(JSONObject.parseObject(infoVo.getEntry()).toJSONString());
  879. }
  880. if(StringUtils.isEmpty(infoVo.getSceneKey())){
  881. infoVo.setIsPublic(0);
  882. }else {
  883. infoVo.setIsPublic(1);
  884. }
  885. //查询是否有随心装场景
  886. if(num.contains("vr-")){
  887. infoVo.setVrNum(null);
  888. infoVo.setVideosUser(null);
  889. infoVo.setBgMusicName(null);
  890. infoVo.setBgMusic(null);
  891. }
  892. infoVo.setSceneVer(innerService.getSceneNumVersion(num));
  893. infoVo.setVersion(infoVo.getSceneVer());
  894. this.updateViewCount(num);
  895. return infoVo;
  896. }
  897. @Override
  898. public void updateViewCount(String num) {
  899. String redisKey = RedisKey.SCENE_VISIT_CNT;
  900. if(!redisUtil.hHasKey(redisKey,num)){
  901. Integer count = 0;
  902. ScenePro pro = this.getByNum(num);
  903. if(pro !=null){
  904. count = pro.getViewCount() == null ? 0 : pro.getViewCount();
  905. }else {
  906. ScenePlus plus = scenePlusService.getByNum(num);
  907. if(plus !=null){
  908. ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(plus.getId());
  909. if(scenePlusExt != null){
  910. count = scenePlusExt.getViewCount() == null ? 0 :scenePlusExt.getViewCount();
  911. }
  912. }
  913. }
  914. redisUtil.hset(redisKey,num,String.valueOf(count));
  915. }
  916. redisUtil.hincr(redisKey,num,1);
  917. }
  918. @Override
  919. public void updateDbViewCount(String num, String count) {
  920. LambdaUpdateWrapper<ScenePro> wrapper = new LambdaUpdateWrapper<>();
  921. wrapper.eq(ScenePro::getNum,num);
  922. wrapper.set(ScenePro::getViewCount,count);
  923. this.update(wrapper);
  924. ScenePlus plus = scenePlusService.getByNum(num);
  925. if(plus !=null){
  926. LambdaUpdateWrapper<ScenePlusExt> exWr = new LambdaUpdateWrapper<>();
  927. exWr.eq(ScenePlusExt::getPlusId,plus.getId())
  928. .set(ScenePlusExt::getViewCount,count);
  929. scenePlusExtService.update(exWr);
  930. }
  931. }
  932. @Override
  933. public ScenePro findByFileId(String fileId) {
  934. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  935. wrapper.like(ScenePro::getDataSource,fileId);
  936. List<ScenePro> list = this.list(wrapper);
  937. if(list !=null && list.size() >0){
  938. return list.get(0);
  939. }
  940. return null;
  941. }
  942. @Override
  943. public Integer getSceneSourceByNum(String sceneNum) {
  944. Integer sceneSource = null;
  945. ScenePro scenePro = this.getByNum(sceneNum);
  946. if(scenePro != null){
  947. sceneSource = scenePro.getSceneSource();
  948. }
  949. if(scenePro == null){
  950. ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
  951. if(scenePlus != null){
  952. sceneSource = scenePlus.getSceneSource();
  953. }
  954. }
  955. return sceneSource;
  956. }
  957. @Override
  958. public List<SimpleSceneVo> getSimpleSceneVo(CameraDetail cameraDetail) {
  959. List<SimpleSceneVo> voList = new ArrayList<>();
  960. List<ScenePro> proList = this.getListByCameraId(cameraDetail.getCameraId());
  961. for (ScenePro scenePro : proList) {
  962. if(scenePro.getStatus() !=-2){
  963. continue;
  964. }
  965. SimpleSceneVo sceneVo = new SimpleSceneVo();
  966. sceneVo.setId(scenePro.getId());
  967. sceneVo.setNum(scenePro.getNum());
  968. sceneVo.setPayStatus(scenePro.getPayStatus());
  969. sceneVo.setCreateTime(DateUserUtil.getDate(scenePro.getCreateTime()).getTime());
  970. sceneVo.setSpace(scenePro.getSpace());
  971. sceneVo.setVersion("v3");
  972. sceneVo.setCompanyId(cameraDetail.getCompanyId());
  973. voList.add(sceneVo);
  974. }
  975. List<ScenePlus> plusList = scenePlusService.getListByCameraId(cameraDetail.getCameraId());
  976. List<Long> plusIds = plusList.stream().map(ScenePlus::getId).collect(Collectors.toList());
  977. HashMap<Long, ScenePlusExt> plusMap = scenePlusExtService.getByPlusIds(plusIds);
  978. for (ScenePlus scenePlus : plusList) {
  979. ScenePlusExt ext = plusMap.get(scenePlus.getId());
  980. if(ext == null || scenePlus.getSceneStatus() !=-2 ){
  981. continue;
  982. }
  983. SimpleSceneVo sceneVo = new SimpleSceneVo();
  984. sceneVo.setId(scenePlus.getId());
  985. sceneVo.setNum(scenePlus.getNum());
  986. sceneVo.setPayStatus(scenePlus.getPayStatus());
  987. String time = ext.getAlgorithmTime();
  988. if(ext.getAlgorithmTime() == null){
  989. time = ext.getCreateTime();
  990. }
  991. sceneVo.setCreateTime(DateUserUtil.getDate(time).getTime());
  992. sceneVo.setSpace(ext.getSpace());
  993. sceneVo.setVersion("v4");
  994. sceneVo.setLocation(ext.getLocation());
  995. sceneVo.setCompanyId(cameraDetail.getCompanyId());
  996. voList.add(sceneVo);
  997. }
  998. return voList;
  999. }
  1000. @Override
  1001. public void generateObjFile(String num) {
  1002. // LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  1003. // wrapper.eq(ScenePro::getNum,num).eq(ScenePro::getRecStatus,"A");
  1004. // ScenePro sceneProEntity = this.getOne(wrapper);
  1005. ScenePro sceneProEntity = this.getByNum(num);
  1006. if(ObjectUtils.isEmpty(sceneProEntity)){
  1007. generatePlusObjFile(num);
  1008. return;
  1009. }
  1010. if(sceneProEntity.getSceneSource() != 4 && sceneProEntity.getSceneSource() != 5){
  1011. throw new BusinessException(LoginConstant.FAILURE_CODE_3003, "只能操作激光场景");
  1012. }
  1013. // 拷贝文件
  1014. String path = sceneProEntity.getDataSource();
  1015. String ossPath = path.replace("/mnt/data","home")+"/data.fdage";
  1016. if(!fYunFileService.fileExist(ossPath)){
  1017. throw new BusinessException(LoginConstant.FAILURE_CODE_3037, LoginConstant.FAILURE_MSG_3037);
  1018. }
  1019. // 获取最新的场景名称
  1020. JSONObject sceneInfo = fdkkLaserService.getSceneByNum(sceneProEntity.getNum());
  1021. LambdaUpdateWrapper<ScenePro> updateWrapper = new LambdaUpdateWrapper<>();
  1022. updateWrapper
  1023. .set(ScenePro::getStatus, 0)
  1024. .set(ScenePro::getIsObj, 1)
  1025. .set(ScenePro::getIsUpgrade, 2) // 升级中
  1026. .set(ScenePro::getSceneName, sceneInfo.getString("title"))
  1027. .eq(ScenePro::getNum, sceneProEntity.getNum());
  1028. this.update(updateWrapper);
  1029. //同步到scenePlus、scenePlus
  1030. ScenePlus scenePlus = scenePlusService.getByNum(num);
  1031. if(Objects.nonNull(scenePlus)){
  1032. sceneUpgradeMapper.deleteScenePlus(num);
  1033. sceneUpgradeMapper.deleteScenePlusExt(scenePlus.getId());
  1034. }
  1035. sceneUpgradeMapper.transferScenePlus(num);
  1036. scenePlus = scenePlusService.getByNum(num);
  1037. String sceneKind = sceneProEntity.getSceneScheme() == 3 ? SceneKind.FACE.code():SceneKind.TILES.code();
  1038. sceneUpgradeMapper.transferScenePlusExt(num, scenePlus.getId(), sceneKind);
  1039. log.info("开始发送激光场景生成obj mq消息");
  1040. // 发送MQ
  1041. BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
  1042. mqMsg.setSceneNum(sceneProEntity.getNum());
  1043. mqMsg.setAlgorithm(sceneProEntity.getAlgorithm());
  1044. mqMsg.setBuildType(sceneProEntity.getBuildType());
  1045. mqMsg.setPath(sceneProEntity.getDataSource());
  1046. mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg);
  1047. }
  1048. public void generatePlusObjFile(String num) {
  1049. ScenePlus scenePlus = scenePlusService.getByNum(num);
  1050. if(ObjectUtils.isEmpty(scenePlus)){
  1051. throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
  1052. }
  1053. if(scenePlus.getSceneSource() != 4 && scenePlus.getSceneSource() !=5){
  1054. throw new BusinessException(LoginConstant.FAILURE_CODE_3003, "只能操作激光场景");
  1055. }
  1056. ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId());
  1057. String ossPath = scenePlusExt.getDataSource().replace("/mnt/data","home")+"/data.fdage";
  1058. if(!fYunFileService.fileExist(ossPath)){
  1059. throw new BusinessException(LoginConstant.FAILURE_CODE_3037, LoginConstant.FAILURE_MSG_3037);
  1060. }
  1061. // 获取最新的场景名称
  1062. JSONObject sceneInfo = fdkkLaserService.getSceneByNum(num);
  1063. LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<>();
  1064. updateWrapper
  1065. .set(ScenePlus::getSceneStatus, 0)
  1066. .set(ScenePlus::getTitle, sceneInfo.getString("title"))
  1067. .eq(ScenePlus::getNum, num);
  1068. scenePlusService.update(updateWrapper);
  1069. LambdaUpdateWrapper<ScenePlusExt> plusExtUpdateWrapper = new LambdaUpdateWrapper<>();
  1070. plusExtUpdateWrapper
  1071. .set(ScenePlusExt::getIsObj, 1)
  1072. .eq(ScenePlusExt::getPlusId, scenePlus.getId());
  1073. scenePlusExtService.update(plusExtUpdateWrapper);
  1074. log.info("开始发送激光场景生成obj mq消息");
  1075. // 发送MQ
  1076. BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
  1077. mqMsg.setSceneNum(num);
  1078. mqMsg.setAlgorithm(scenePlusExt.getAlgorithm());
  1079. mqMsg.setBuildType(scenePlusExt.getBuildType());
  1080. mqMsg.setPath(scenePlusExt.getDataSource());
  1081. mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg);
  1082. }
  1083. @Override
  1084. public ResponseScene getSceneDetail(String sceneNum) {
  1085. if(StringUtils.isBlank(sceneNum)){
  1086. return null;
  1087. }
  1088. ResponseScene vo = new ResponseScene();
  1089. Scene sceneEntity = sceneService.getByNum(sceneNum);
  1090. if(sceneEntity != null){
  1091. return getResponseScene(vo, sceneEntity);
  1092. }
  1093. ScenePro sceneProEntity = this.getByNum(sceneNum);
  1094. if(sceneProEntity != null){
  1095. SceneProEdit sceneProEditEntity = sceneProEditService.getByProId(sceneProEntity.getId());
  1096. return getResponseProScene(vo, sceneProEntity, sceneProEditEntity);
  1097. }
  1098. ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
  1099. if(scenePlus != null){
  1100. ScenePlusExt ext = scenePlusExtService.getByPlusId(scenePlus.getId());
  1101. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  1102. return getResponseProScene(vo, scenePlus, ext,sceneEditInfo);
  1103. }
  1104. return vo;
  1105. }
  1106. private ResponseScene getResponseScene(ResponseScene vo, Scene sceneEntity) {
  1107. if (sceneEntity != null){
  1108. BeanUtils.copyProperties(sceneEntity, vo);
  1109. vo.setThumbImg(sceneEntity.getThumbStatus());
  1110. vo.setCreateTime(new DateTime(sceneEntity.getCreateTime()).toString("yyyy-MM-dd HH:mm"));
  1111. vo.setSceneIndex(sceneEntity.getStyle());
  1112. vo.setHasBGM(sceneEntity.getBgMusic());
  1113. vo.setCameraType(sceneEntity.getSceneScheme());
  1114. vo.setIsPublic(StringUtils.isEmpty(sceneEntity.getSceneKey()) ? 0 : 1);
  1115. }
  1116. return vo;
  1117. }
  1118. private ResponseScene getResponseProScene(ResponseScene vo, ScenePro sceneProEntity, SceneProEdit sceneProEditEntity) {
  1119. if (sceneProEntity != null){
  1120. BeanUtils.copyProperties(sceneProEditEntity, vo);
  1121. BeanUtils.copyProperties(sceneProEntity, vo);
  1122. vo.setCreateTime(DateUserUtil.getMDate(vo.getCreateTime()));
  1123. vo.setCameraType(sceneProEntity.getSceneScheme());
  1124. vo.setThumbImg(sceneProEditEntity.getThumbStatus());
  1125. vo.setHasBGM(sceneProEditEntity.getBgMusic());
  1126. vo.setIsPublic(StringUtils.isEmpty(sceneProEditEntity.getSceneKey()) ? 0 : 1);
  1127. }
  1128. return vo;
  1129. }
  1130. private ResponseScene getResponseProScene(ResponseScene vo, ScenePlus plus, ScenePlusExt ext,SceneEditInfo editInfo) {
  1131. if (plus != null){
  1132. BeanUtils.copyProperties(plus, vo);
  1133. BeanUtils.copyProperties(ext, vo);
  1134. BeanUtils.copyProperties(editInfo, vo);
  1135. vo.setNum(plus.getNum());
  1136. vo.setSceneName(plus.getTitle());
  1137. vo.setCreateTime(DateUserUtil.getMDate(vo.getCreateTime()));
  1138. vo.setCameraType(ext.getSceneScheme());
  1139. vo.setThumbImg(1);
  1140. vo.setHasBGM(editInfo.getMusic());
  1141. vo.setIsPublic(StringUtils.isEmpty(editInfo.getScenePassword()) ? 0 : 1);
  1142. }
  1143. return vo;
  1144. }
  1145. @Override
  1146. public Long getCountByCameraId(Long cameraId,Boolean status) {
  1147. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  1148. wrapper.eq(ScenePro::getCameraId,cameraId);
  1149. wrapper.eq(ScenePro::getIsUpgrade,0);
  1150. if(status){
  1151. wrapper.eq(ScenePro::getStatus,-2);
  1152. }
  1153. return this.count(wrapper);
  1154. }
  1155. @Override
  1156. public Long getCountByCameraId(Long cameraId) {
  1157. LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
  1158. wrapper.eq(ScenePro::getCameraId,cameraId);
  1159. wrapper.eq(ScenePro::getIsUpgrade,0);
  1160. wrapper.in(ScenePro::getStatus,0,-2);
  1161. return this.count(wrapper);
  1162. }
  1163. @Override
  1164. public Long getSpaceSumByCameraId(Long cameraId) {
  1165. return this.getBaseMapper().getSpaceSumByCameraId(cameraId);
  1166. }
  1167. /**
  1168. * 队列名:remove-portrait
  1169. * 载荷:{"num":"xxx"}
  1170. * 表:t_scene_plus增加字段remove_portrait
  1171. */
  1172. @Override
  1173. public void removePortrait(String num) {
  1174. ScenePlus scenePlus = scenePlusService.getByNum(num);
  1175. if(scenePlus == null){
  1176. throw new BusinessException(ResultCodeMsg.FAILURE_CODE_400002, ResultCodeMsg.FAILURE_MSG_400002);
  1177. }
  1178. HashMap<String,String> map = new HashMap<>();
  1179. map.put("num",num);
  1180. rabbitMqProducer.sendByWorkQueue("remove-portrait",map);
  1181. }
  1182. }