Kaynağa Gözat

feat: 添加复制迁移

tangning 2 yıl önce
ebeveyn
işleme
cfd077e0a1

+ 23 - 0
src/api/scene/list.ts

@@ -24,6 +24,8 @@ enum Api {
   generateDefaultLiveRoom = '/zfb-api/zfb/scene/generateDefaultLiveRoom',
   generateReality = '/zfb-api/zfb/scene/createVrScene',
   getShareList = '/zfb-api/zfb/scene/getVRShareLinks',
+  sceneCopy = '/zfb-api/zfb/scene/copyScene',
+  sceneMove = '/zfb-api/zfb/scene/moveScene',
 }
 
 /**
@@ -147,6 +149,27 @@ export const generateRealityApi = (params: SceneDownloadParam) =>
     },
   });
 
+export const sceneCopy = (params) =>
+  defHttp.post<Result>({
+    url: Api.sceneCopy,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const sceneMove = (params) =>
+  defHttp.post<Result>({
+    url: Api.sceneMove,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 export const getShareListApi = (params: SceneDownloadParam) =>
   defHttp.post<Result>(
     {

+ 5 - 0
src/locales/lang/zh-CN/routes/scenes.ts

@@ -56,4 +56,9 @@ export default {
     102: '未开始',
     103: '已结束',
   },
+  copyInfi: {
+    title: '复制场景',
+    content: '复制场景,场景归属在原相机下。<br/>确定要复制场景吗?',
+    ok: '复制成功',
+  },
 };

+ 146 - 0
src/views/scenes/MoveModal.vue

@@ -0,0 +1,146 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="迁移场景"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, onMounted, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { sceneMove } from '/@/api/scene/list';
+  import { useI18n } from '/@/hooks/web/useI18n';
+
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        file: null,
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'type',
+          component: 'Input',
+          // defaultValue: '场景标题',
+          label: '场景标题',
+          slot: 'text',
+          colProps: {
+            span: 24,
+          },
+          // required: true,
+        },
+        {
+          field: 'snCode',
+          component: 'Input',
+          label: '迁移至',
+
+          required: true,
+          colProps: {
+            span: 16,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                if (!value) {
+                  return Promise.reject('请输入相机SN码');
+                }
+                if (/.*[\u4e00-\u9fa5]+.*$/.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('不支持中文字符');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+          componentProps: {
+            placeholder: '请输入相机SN码',
+            maxLength: 15,
+            onChange: (data) => {
+              console.log('data', data);
+            },
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        console.log(data);
+        data && onDataReceive(data);
+      });
+
+      function onDataReceive(data) {
+        modelRef.value = data;
+        resetFields();
+        setFieldsValue({
+          type: data.sceneName,
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const apiData = {
+            snCode: params.snCode,
+            num: modelRef.value.num,
+          };
+          console.log('res', apiData, params);
+          const res = await sceneMove(apiData);
+          console.log('res', res);
+          closeModal();
+          resetFields();
+          createMessage.success('场景迁移成功。');
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange() {
+        // console.log(v);
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 46 - 3
src/views/scenes/list.vue

@@ -47,6 +47,18 @@
                       (record.lived !== true && getCheckRole(['super', 'plat_admin'])),
                     onClick: generateDefaultLiveRoom.bind(null, record),
                   },
+                  {
+                    label: '复制',
+                    //disabled:!(record.status == 1 || (record.status == -2 && record.payStatus == 1)),
+                    //ifShow:getCheckRole('scenes-copy'),
+                    onClick: handleCopy.bind(null, record),
+                  },
+                  {
+                    label: '迁移',
+                    //disabled:!(record.status == 1 || record.status == -2),
+                    //ifShow:getCheckRole('scenes-move'),
+                    onClick: handleMove.bind(null, record),
+                  },
                   // {
                   //   color: 'warning',
                   //   label: '虚实同步',
@@ -68,6 +80,7 @@
     <DownloadModal @register="registerDownloadModal" />
     <EditorModal @register="registerEditorModal" @reload="reload" />
     <ShareModal @register="registerShareModal" @reload="reload" />
+    <MoveModal @register="registerMoveModal" />
   </div>
 </template>
 <script lang="ts">
@@ -91,6 +104,7 @@
     downloadSceneDataAPi,
     generateDefaultLiveRoomApi,
     generateRealityApi,
+    sceneCopy,
   } from '/@/api/scene/list';
   import { useI18n } from '/@/hooks/web/useI18n';
   import {
@@ -104,15 +118,24 @@
   import DownloadModal from './downloadModal.vue';
   import EditorModal from './editorModal.vue';
   import ShareModal from './shareModal.vue';
-
+  import MoveModal from './MoveModal.vue';
   export default defineComponent({
-    components: { BasicTable, TableAction, TableImg, DownloadModal, EditorModal, ShareModal },
+    components: {
+      BasicTable,
+      TableAction,
+      TableImg,
+      DownloadModal,
+      EditorModal,
+      MoveModal,
+      ShareModal,
+    },
     emits: ['register'],
     setup() {
-      const { createMessage } = useMessage();
+      const { createMessage, createConfirm } = useMessage();
       const [registerDownloadModal, { openModal: openDownloadModal }] = useModal();
       const [registerEditorModal, { openModal: openEditorModal }] = useModal();
       const [registerShareModal, { openModal: openShareModal }] = useModal();
+      const [registerMoveModal, { openModal: openMoveModal }] = useModal();
       const { t } = useI18n();
       const userStore = useUserStore();
       const { getCheckRole, getEquity } = userStore;
@@ -321,6 +344,23 @@
           reload();
         }
       }
+      async function handleCopy(record: Recordable) {
+        createConfirm({
+          title: t('routes.scenes.copyInfi.title'),
+          content: t('routes.scenes.copyInfi.content'),
+          onOk: async () => {
+            sceneCopy({ num: record.num }).then(() => {
+              createMessage.success(t('routes.scenes.copyInfi.ok'));
+              reload();
+            });
+          },
+        });
+      }
+      async function handleMove(record: Recordable) {
+        openMoveModal(true, {
+          ...record,
+        });
+      }
       async function syncReality(record: Recordable) {
         let res = await generateRealityApi({
           sceneNum: record.num,
@@ -339,11 +379,14 @@
         createMessage,
         t,
         reload,
+        handleMove,
+        handleCopy,
         openSceneEditor,
         openEditorModal,
         registerEditorModal,
         handleDownloadScene,
         registerDownloadModal,
+        registerMoveModal,
         generateDefaultLiveRoom,
         openSceneEditorModal,
         getEquity,