bill преди 2 години
родител
ревизия
77a826a033
променени са 6 файла, в които са добавени 57 реда и са изтрити 12 реда
  1. 11 3
      src/api/instance.ts
  2. 10 1
      src/api/scene.ts
  3. 1 0
      src/constant/api.ts
  4. 17 2
      src/store/scene.ts
  5. 14 2
      src/views/scene/content.tsx
  6. 4 4
      src/views/scene/header.tsx

+ 11 - 3
src/api/instance.ts

@@ -1,6 +1,6 @@
 import { axiosFactory } from './setup'
 import { message } from 'antd'
-import { LOGIN, ResCode, ResCodeDesc } from 'constant'
+import { GET_MODEL_SCENE_STATUS, LOGIN, ResCode, ResCodeDesc } from 'constant'
 import { showLoading, hideLoading } from 'components/loading'
 import { baseURI } from 'env'
 
@@ -38,8 +38,16 @@ addResErrorHandler(
 )
 
 addHook({
-  before: showLoading,
-  after: hideLoading
+  before(config) {
+    if (config.url !== GET_MODEL_SCENE_STATUS) {
+      showLoading()
+    }
+  },
+  after(config) {
+    if (config.url !== GET_MODEL_SCENE_STATUS) {
+      hideLoading()
+    }
+  }
 })
 
 addUnsetTokenURLS(LOGIN)

+ 10 - 1
src/api/scene.ts

@@ -15,7 +15,8 @@ import {
   SCENE_LIST, 
   MODEL_SCENE_LIST, 
   UPLOAD_MODEL,
-  DELETE_MODEL
+  DELETE_MODEL,
+  GET_MODEL_SCENE_STATUS
 } from 'constant'
 
 
@@ -82,6 +83,14 @@ export const getSceneByType = async (data: GetSceneByTypeParams): Promise<Paging
   }
 }
 
+export const getModelSceneStatus = async (sceneId: Scene['id']) => {
+  const progress = await axios.get<number>(GET_MODEL_SCENE_STATUS, { params: { modelId: sceneId } })
+  return {
+    id: sceneId,
+    status: progress >= 100 ? ModelSceneStatus.SUCCESS : ModelSceneStatus.RUN
+  }
+}
+
 // 上传模型文件
 export type UploadModelSceneProps = { file: File, progressCallback?: UploadProgressCallback }
 export const uploadModelScene = ({ file, progressCallback }: UploadModelSceneProps) => 

+ 1 - 0
src/constant/api.ts

@@ -25,6 +25,7 @@ export const UPDATE_MODEL_TITLE = `/fusion/model/updateTitle`
 export const MODEL_SCENE_LIST = `/fusion/model/list`
 export const UPLOAD_MODEL = `/fusion/model/uploadObj`
 export const DELETE_MODEL = `/fusion/model/delete`
+export const GET_MODEL_SCENE_STATUS = `/fusion/model/uploadObjProgress`
 
 // 案件
 export const EXAMPLE_LIST = `/fusion/case/list`

+ 17 - 2
src/store/scene.ts

@@ -4,7 +4,9 @@ import {
   getSceneByType, 
   getToken, 
   uploadModelScene as uploadModelSceneApi,
-  deleteModelScene as deleteModelSceneApi
+  deleteModelScene as deleteModelSceneApi,
+  getModelSceneStatus,
+  ModelScene
 } from 'api'
 import { 
   ModelSceneStatus, 
@@ -30,6 +32,9 @@ const sceneSlice = createSlice({
   name: 'scene',
   initialState,
   reducers: {
+    checkSceneStatus() {
+      
+    }
   },
   extraReducers(builder) {
     thunkStatusAutoSet(
@@ -42,6 +47,16 @@ const sceneSlice = createSlice({
         ]
       }
     )
+
+    builder.addCase(checkSceneStatus.fulfilled, (state, data) => {
+      const scene = state.value.find(scene => scene.id === data.payload.id) as ModelScene
+      if (scene) {
+        state.value[state.value.indexOf(scene)] = {
+          ...scene,
+          status: data.payload.status
+        }
+      }
+    })
   }
 })
 
@@ -59,7 +74,7 @@ export const {
 export const fetchScenes = createAsyncThunk('fetch/scenes', getSceneByType)
 export const uploadModelScene = createAsyncThunk('upload/modelScene', uploadModelSceneApi)
 export const deleteModelScene = createAsyncThunk('delete/modelScene', deleteModelSceneApi)
-
+export const checkSceneStatus = createAsyncThunk('fetch/scene', getModelSceneStatus)
 
 export enum SceneLinkFlag { query, edit }
 export const getSceneLink = (scene: Scene, flag: SceneLinkFlag): URL => {

+ 14 - 2
src/views/scene/content.tsx

@@ -12,9 +12,10 @@ import {
   filterScenesSelector,
   fetchScenes,
   deleteModelScene,
-  useDispatch
+  useDispatch,
+  checkSceneStatus
 } from 'store'
-import { useState } from 'react'
+import { useEffect, useState } from 'react'
 import { updateModelSceneTitle } from 'api'
 
 import type { SceneColumn } from './columns'
@@ -65,6 +66,17 @@ export const SceneTabContent = ({type}: {type: SceneType}) => {
   const states = useThunkPaging({ type, sceneName: '' }, fetchScenes)
   const [[paging, setPaging], [params, setParams], refresh] = states
 
+  useEffect(() => {
+    const runScenes = scenes.filter(scene => scene.status === ModelSceneStatus.RUN)
+    if (type === SceneType.SWMX && runScenes.length) {
+      const clear = setTimeout(
+        () => runScenes.forEach(scene => dispatch(checkSceneStatus(scene.id))), 
+        2000
+      )
+      return () => clearTimeout(clear)
+    } 
+  }, [scenes, type, dispatch])
+
   const actionColumn: SceneColumn = {
     title: '操作',
     key: 'action',

+ 4 - 4
src/views/scene/header.tsx

@@ -19,9 +19,9 @@ export const SceneHeader = memo(({ readonly, type, onSearch, onDataChange }: Lis
   const onUpload: UploadProps['beforeUpload'] = file => {
     const filename = file.name
     const ext = filename.substring(filename.lastIndexOf('.'))
-    const isZip = ['.zip', '.rar'].includes(ext)
+    const isZip = ['.zip'].includes(ext)
     if (!isZip) {
-      message.error('只能上传zip或rar文件')
+      message.error('只能上传zip文件')
       return Upload.LIST_IGNORE
     }
     dispatch(uploadModelScene({ file }))
@@ -31,8 +31,8 @@ export const SceneHeader = memo(({ readonly, type, onSearch, onDataChange }: Lis
   }
 
   const renderUpload = readonly || (type === SceneType.SWMX && (
-    <Upload beforeUpload={onUpload} multiple={false} accept="application/zip,application/rar">
-      <Popover content="请上传zip/rar文件(支持obj/ply/las格式的数据),大小在1GB以内">
+    <Upload beforeUpload={onUpload} multiple={false} accept="application/zip">
+      <Popover content="请上传zip文件(支持obj/ply/las格式的数据),大小在1GB以内">
         <Button type="primary" children="上传数据" />
       </Popover>
     </Upload>