tangning 1 年間 前
コミット
7133fa26a8

+ 45 - 1
src/api/operate/index.ts

@@ -32,7 +32,7 @@ enum Api {
   //留言
   intercomMessageList = '/service/manage/intercomMessage/list',
   intercomMessageHandle = '/service/manage/intercomMessage/handle',
-
+  cameraSceneList = '/service/manage/overall/cameraSceneList',
   operateSceneList = '/service/manage/scene/list',
   sceneMove = '/service/manage/scene/move',
   sceneRestStore = '/service/manage/scene/restStore',
@@ -71,6 +71,9 @@ enum Api {
   feedbackOptionAdd = '/service/manage/feedbackOption/add',
   feedbackOptionDel = '/service/manage/feedbackOption/update',
   feedbackhandle = '/service/manage/feedback/handle',
+  mqQueueConfigList = '/service/manage/mqQueueConfig/allList',
+  getInfo = '/service/manage/mqQueueConfig/getInfo',
+  updateModelingLevel = '/service/manage/mqQueueConfig/updateModelingLevel',
   downTemplate = '/service/manage/feedback/export',
 }
 
@@ -78,6 +81,36 @@ enum Api {
  * @description: Get sample list value
  */
 
+export const mqQueueConfigList = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.mqQueueConfigList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const getInfo = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.getInfo,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const updateModelingLevel = (params: PageParams) =>
+  defHttp.post<RentListGetResultModel>({
+    url: Api.updateModelingLevel,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 export const agentAuditList = (params: PageParams) =>
   defHttp.post<RentListGetResultModel>({
     url: Api.agentAuditList,
@@ -297,6 +330,17 @@ export const newDelete = (params: PageParams) =>
     },
   });
 
+export const cameraSceneList = (params: operateList) =>
+  defHttp.post<Result>({
+    url: Api.cameraSceneList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
 export const operateSceneList = (params: operateList) =>
   defHttp.post<Result>({
     url: Api.operateSceneList,

+ 3 - 0
src/views/device/index.vue

@@ -43,6 +43,7 @@
     <batchPutModal @register="registerPut" @reload="reload" />
     <PutModal @register="registerEnter" @reload="reload" />
     <editModal @register="registerEditModal" @reload="reload" />
+    <priorityMoadl @update="reload" @register="registerPriority" />
   </PageWrapper>
 </template>
 <script lang="ts">
@@ -59,6 +60,7 @@
   import { Descriptions } from 'ant-design-vue';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
+  import priorityMoadl from './priorityMoadl.vue';
   import { cameraList } from '/@/api/customer';
   import { cameraDelete } from '/@/api/device'
   import batchOutflowModal from './OutflowModal.vue';
@@ -77,6 +79,7 @@ import { lte } from 'lodash';
       TableAction,
       PageWrapper,
       TableImg,
+      priorityMoadl,
       editModal,
       batchOutflowModal,
       detailModal,

+ 142 - 0
src/views/device/priorityMoadl.vue

@@ -0,0 +1,142 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="优先级设置"
+    @ok="handleSubmit"
+    :height="300"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <div style="padding-left: 125px; line-height: 32px;" v-if="model.numList && model.numList.length">仅计算成功、封存场景支持迁移</div>
+      <BasicForm @register="registerForm" :model="model">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, 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 { updateModelingLevel, mqQueueConfigList, getInfo } from '/@/api/operate';
+  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({
+        num: '',
+        numList: []
+      });
+      const fileFlow = reactive({
+        file: null,
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'num',
+          component: 'Input',
+          label: 'num',
+          show: false,
+        },
+        {
+          field: 'cameraId',
+          component: 'Input',
+          label: 'num',
+          show: false,
+        },
+        {
+          field: 'configId',
+          component: 'ApiRadioGroup',
+          label: '优先级',
+          required: true,
+          colProps: {
+            span: 16,
+          },
+          defaultValue: 2,
+          componentProps: {
+            placeholder: '请输入相机SN码',
+            maxLength: 15,
+            api: mqQueueConfigList,
+            // numberToString: true,
+            labelField: 'remark',
+            valueField: 'id',
+            immediate: true,
+            params: {
+              agentName: '',
+            },
+            onChange: (data) => {
+              console.log('data', data);
+            },
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        console.log(data);
+        data && onDataReceive(data);
+      });
+
+      async function onDataReceive(data) {
+        let { id } = await getInfo(data);
+        modelRef.value = data;
+        resetFields();
+        updateSchema({
+          field: 'type',
+          ifShow: false,
+        });
+        setFieldsValue({
+          ...data,
+          configId: id,
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const res = await updateModelingLevel(params);
+          console.log('res', res);
+          closeModal();
+          resetFields();
+          createMessage.success('优先级设置成功。');
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        // console.log(v);
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 271 - 262
src/views/operate/caseList.vue

@@ -1,4 +1,4 @@
- <template>
+<template>
   <PageWrapper contentBackground>
     <template #footer>
       <a-tabs v-model:activeKey="language" @change="changeTable">
@@ -10,7 +10,11 @@
     <div class="desc-wrap-BasicTable">
       <BasicTable @register="registerTable">
         <template #toolbar>
-          <a-button type="primary" @click="openModal(true, {language})" v-if="getCheckPerm('case-add')">
+          <a-button
+            type="primary"
+            @click="openModal(true, { language })"
+            v-if="getCheckPerm('case-add')"
+          >
             新增案例</a-button
           >
         </template>
@@ -60,287 +64,292 @@
   </PageWrapper>
 </template>
 <script lang="ts">
-import { defineComponent, h, ref } from 'vue';
-import {
-  BasicTable,
-  useTable,
-  TableAction,
-  BasicColumn,
-  TableImg,
-  FormProps,
-} from '/@/components/Table';
-import { PageWrapper } from '/@/components/Page';
-import { Time } from '/@/components/Time';
-import { caseListApi, caseReleaseApi, casePublicApi, caseDelApi } from '/@/api/operate';
-import {  Descriptions, Switch, Tabs } from 'ant-design-vue';
-import { useModal } from '/@/components/Modal';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { useMessage } from '/@/hooks/web/useMessage';
-import addNewModal from './components/case/addModal.vue';
-import { usePermissionStore } from '/@/store/modules/permission';
-import { useUserStore } from '/@/store/modules/user';
-
-export default defineComponent({
-  components: {
+  import { defineComponent, h, ref } from 'vue';
+  import {
     BasicTable,
+    useTable,
     TableAction,
-    PageWrapper,
+    BasicColumn,
     TableImg,
-    addNewModal,
-    [Descriptions.name]: Descriptions,
-    [Descriptions.Item.name]: Descriptions.Item,
-    [Tabs.name]: Tabs,
-    [Tabs.TabPane.name]: Tabs.TabPane,
-  },
-  setup() {
-    const { t } = useI18n();
-    const { createMessage } = useMessage();
-    const permissionStore = usePermissionStore();
-    const { getCheckPerm } = permissionStore;
-    const userStore = useUserStore();
-    const [register, { openModal }] = useModal();
-    const language = ref<string>('cn'); //未处理,0已处理(默认1)
-    const columns: BasicColumn[] = [
-      {
-        title: '案例标题',
-        dataIndex: 'title',
-        ellipsis: true,
-        width: 250,
-      },
-      // {
-      //   title: '来源',
-      //   dataIndex: 'source',
-      //   ellipsis: true,
-      //   width: 120,
-      // },
-      {
-        title: '类型',
-        dataIndex: 'typeId',
-        ellipsis: true,
-        width: 80,
-        customRender: ({ record }) => {
-          let obj = {
-            'smartCity':'智慧城市',
-            'museum':'博物馆',
-            'government':'刑侦消防',
-            'property':'房产营销',
-          }
-          return obj[record.typeId] || '智慧城市';
+    FormProps,
+  } from '/@/components/Table';
+  import { PageWrapper } from '/@/components/Page';
+  import { Time } from '/@/components/Time';
+  import { caseListApi, caseReleaseApi, casePublicApi, caseDelApi } from '/@/api/operate';
+  import { Descriptions, Switch, Tabs } from 'ant-design-vue';
+  import { useModal } from '/@/components/Modal';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import addNewModal from './components/case/addModal.vue';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { useUserStore } from '/@/store/modules/user';
+
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      PageWrapper,
+      TableImg,
+      addNewModal,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+      [Tabs.name]: Tabs,
+      [Tabs.TabPane.name]: Tabs.TabPane,
+    },
+    setup() {
+      const { t } = useI18n();
+      const { createMessage } = useMessage();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const userStore = useUserStore();
+      const [register, { openModal }] = useModal();
+      const language = ref<string>('cn'); //未处理,0已处理(默认1)
+      const columns: BasicColumn[] = [
+        {
+          title: '案例标题',
+          dataIndex: 'title',
+          ellipsis: true,
+          width: 250,
         },
-      },
-      {
-        title: '创建人',
-        ellipsis: true,
-        dataIndex: 'sysUserName',
-        width: 120,
-      },
-      {
-        title: '创建时间',
-        dataIndex: 'createTime',
-        width: 150,
-        customRender: ({ record }) => {
-          return (
-            record.createTime &&
-            h(Time, {
-              value: record.createTime,
-              mode: 'datetime',
-            })
-          );
+        // {
+        //   title: '来源',
+        //   dataIndex: 'source',
+        //   ellipsis: true,
+        //   width: 120,
+        // },
+        {
+          title: '类型',
+          dataIndex: 'typeId',
+          ellipsis: true,
+          width: 80,
+          customRender: ({ record }) => {
+            let obj = {
+              smartCity: '智慧城市',
+              museum: '博物馆',
+              government: '刑侦消防',
+              property: '房产营销',
+            };
+            return obj[record.typeId] || '智慧城市';
+          },
         },
-      },
-      {
-        title: '发布时间',
-        dataIndex: 'publicTime',
-        width: 150,
-        customRender: ({ record }) => {
-          return (
-            record.publicTime &&
-            h(Time, {
-              value: record.publicTime,
-              mode: 'datetime',
-            })
-          );
+        {
+          title: '创建人',
+          ellipsis: true,
+          dataIndex: 'sysUserName',
+          width: 120,
         },
-      },
-      {
-        title: '排序',
-        ellipsis: true,
-        dataIndex: 'sort',
-        width: 80,
-      },
-      // {
-      //   title: '是否显示',
-      //   dataIndex: 'isShow',
-      //   ifShow: getCheckPerm('case-display'),
-      //   width: 80,
-      //   customRender: ({ record }) => {
-      //     if (!Reflect.has(record, 'pendingStatus')) {
-      //       record.pendingStatus = false;
-      //     }
-      //     return h(Switch, {
-      //       checked: record.isShow === 1,
-      //       checkedChildren: '是',
-      //       unCheckedChildren: '否',
-      //       loading: false,
-      //       onChange: async (checked: boolean) => {
-      //         record.pendingStatus = true;
-      //         const id: string = record.id || '';
-      //         const newStatus = checked ? 1 : 0;
-      //         Reflect.set(record, 'isShow', newStatus);
-      //         await caseReleaseApi({ id: id, isShow: newStatus });
-      //         createMessage.success(t('common.optSuccess'));
-      //         // reload()
-      //       },
-      //     });
-      //   },
-      //},
-    ];
-    const searchForm: Partial<FormProps> = {
-      labelWidth: 100,
-      autoSubmitOnEnter: true,
-      schemas: [
         {
-          field: 'publicTime',
-          label: t('routes.operate.releaseTime'),
-          component: 'RangePicker',
-          componentProps: {
-            maxLength: 100,
-            format: 'YYYY-MM-DD',
-            valueFormat: 'YYYY-MM-DD',
-            showTime: true,
-          },
-          colProps: {
-            xl: 8,
-            xxl: 8,
+          title: '创建时间',
+          dataIndex: 'createTime',
+          width: 150,
+          customRender: ({ record }) => {
+            return (
+              record.createTime &&
+              h(Time, {
+                value: record.createTime,
+                mode: 'datetime',
+              })
+            );
           },
         },
         {
-          field: 'title',
-          label: '案例标题',
-          component: 'Input',
-          colProps: {
-            xl: 5,
-            xxl: 5,
+          title: '发布时间',
+          dataIndex: 'publicTime',
+          width: 150,
+          customRender: ({ record }) => {
+            return (
+              record.publicTime &&
+              h(Time, {
+                value: record.publicTime,
+                mode: 'datetime',
+              })
+            );
           },
         },
         {
-          field: 'typeId',
-          label: '类型',
-          component: 'Select',
-          componentProps: {
-          placeholder: '请选择类型',
-          options: [
-            {
-              label: '智慧城市',
-              value: 'smartCity',
-              key: 'smartCity',
+          title: '排序',
+          ellipsis: true,
+          dataIndex: 'sort',
+          width: 80,
+        },
+        // {
+        //   title: '是否显示',
+        //   dataIndex: 'isShow',
+        //   ifShow: getCheckPerm('case-display'),
+        //   width: 80,
+        //   customRender: ({ record }) => {
+        //     if (!Reflect.has(record, 'pendingStatus')) {
+        //       record.pendingStatus = false;
+        //     }
+        //     return h(Switch, {
+        //       checked: record.isShow === 1,
+        //       checkedChildren: '是',
+        //       unCheckedChildren: '否',
+        //       loading: false,
+        //       onChange: async (checked: boolean) => {
+        //         record.pendingStatus = true;
+        //         const id: string = record.id || '';
+        //         const newStatus = checked ? 1 : 0;
+        //         Reflect.set(record, 'isShow', newStatus);
+        //         await caseReleaseApi({ id: id, isShow: newStatus });
+        //         createMessage.success(t('common.optSuccess'));
+        //         // reload()
+        //       },
+        //     });
+        //   },
+        //},
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        autoSubmitOnEnter: true,
+        schemas: [
+          {
+            field: 'publicTime',
+            label: t('routes.operate.releaseTime'),
+            component: 'RangePicker',
+            componentProps: {
+              maxLength: 100,
+              format: 'YYYY-MM-DD',
+              valueFormat: 'YYYY-MM-DD',
+              showTime: true,
             },
-            {
-              label: '博物馆',
-              value: 'museum',
-              key: 'museum',
+            colProps: {
+              xl: 8,
+              xxl: 8,
             },
-            {
-              label: '刑侦消防',
-              value: 'government',
-              key: 'government',
+          },
+          {
+            field: 'title',
+            label: '案例标题',
+            component: 'Input',
+            colProps: {
+              xl: 5,
+              xxl: 5,
             },
-            {
-              label: '房产营销',
-              value: 'property',
-              key: 'property',
+          },
+          {
+            field: 'typeId',
+            label: '类型',
+            component: 'Select',
+            componentProps: {
+              placeholder: '请选择类型',
+              options: [
+                {
+                  label: '智慧城市',
+                  value: 'smartCity',
+                  key: 'smartCity',
+                },
+                {
+                  label: '博物馆',
+                  value: 'museum',
+                  key: 'museum',
+                },
+                {
+                  label: '刑侦消防',
+                  value: 'government',
+                  key: 'government',
+                },
+                {
+                  label: '房产营销',
+                  value: 'property',
+                  key: 'property',
+                },
+              ],
+            },
+            colProps: {
+              xl: 5,
+              xxl: 5,
             },
-          ],
-        },
-          colProps: {
-            xl: 5,
-            xxl: 5,
           },
+        ],
+      };
+      const [registerTable, { reload }] = useTable({
+        api: caseListApi,
+        title: '案例列表',
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        showIndexColumn: false,
+        searchInfo: { language },
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
         },
-      ],
-    };
-    const [registerTable, { reload }] = useTable({
-      api: caseListApi,
-      title: '案例列表',
-      columns: columns,
-      useSearchForm: true,
-      formConfig: searchForm,
-      showTableSetting: true,
-      showIndexColumn: false,
-      searchInfo: { language },
-      rowKey: 'id',
-      fetchSetting: {
-        pageField: 'pageNum',
-        sizeField: 'pageSize',
-        listField: 'list',
-        totalField: 'total',
-      },
-      beforeFetch: (T) => {
-        if (T.ctivated) {
-          T.publicTimeStart = T.ctivated[0];
-          T.publicTimeEnd = T.ctivated[1];
+        beforeFetch: (T) => {
+          if (T.ctivated) {
+            T.publicTimeStart = T.ctivated[0];
+            T.publicTimeEnd = T.ctivated[1];
+          }
+          return T;
+        },
+        actionColumn: {
+          width: 230,
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+        },
+        canResize: true,
+      });
+      async function handleDelete(record: Recordable) {
+        await caseDelApi({ id: record.id });
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      async function handlePublish(record: Recordable) {
+        console.log('点击了发布', record);
+        await casePublicApi({ id: record.id, isPublic: 1 });
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      function handleEdit(record: Recordable) {
+        console.log('点击了编辑', record);
+        openModal(true, { ...record, language });
+      }
+      function handlePreview(record: Recordable) {
+        const host = userStore.isEnv;
+        console.log('host', host);
+        let url =
+          window.location.host == 'www.4dkankan.com'
+            ? `https://www.4dkankan.com/#/cases/detail/${record.id}`
+            : `https://test.4dkankan.com/#/cases/detail/${record.id}`;
+        if (host) {
+          url = window.location.host.includes('test')
+            ? `https://testeur.4dkankan.com/#/cases/detail/${record.id}`
+            : `https://eur.4dkankan.com/#/cases/detail/${record.id}`;
         }
-        return T;
-      },
-      actionColumn: {
-        width: 230,
-        title: '操作',
-        dataIndex: 'action',
-        slots: { customRender: 'action' },
-      },
-      canResize: true,
-    });
-    async function handleDelete(record: Recordable) {
-      await caseDelApi({ id: record.id });
-      createMessage.success(t('common.optSuccess'));
-      reload();
-    }
-    async function handlePublish(record: Recordable) {
-      console.log('点击了发布', record);
-      await casePublicApi({ id: record.id, isPublic: 1 });
-      createMessage.success(t('common.optSuccess'));
-      reload();
-    }
-    function handleEdit(record: Recordable) {
-      console.log('点击了编辑', record);
-      openModal(true, {...record,language});
-    }
-    function handlePreview(record: Recordable) {
-      const host = userStore.isEnv
-      console.log('host',host)
-      let url = window.location.host == 'www.4dkankan.com'?`https://www.4dkankan.com/#/cases/detail/${record.id}`:`https://test.4dkankan.com/#/cases/detail/${record.id}`
-      if(host){
-        url = window.location.host.includes('test')?`https://testeur.4dkankan.com/#/cases/detail/${record.id}`:`https://eur.4dkankan.com/#/cases/detail/${record.id}`
+        window.open(url, '_blank');
       }
-      window.open(url, "_blank")
-    }
-    async function handleWithdraw(record: Recordable) {
-      await casePublicApi({ id: record.id, isPublic: 0 });
-      createMessage.success(t('common.optSuccess'));
-      reload();
-    }
-    function changeTable(val: string) {
+      async function handleWithdraw(record: Recordable) {
+        await casePublicApi({ id: record.id, isPublic: 0 });
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      function changeTable(val: string) {
         language.value = val;
         reload();
       }
-    function hendleAddNew() {
-      console.log('新增新闻');
-    }
-    return {
-      registerTable,
-      handleDelete,
-      handleEdit,
-      handleWithdraw,
-      handlePublish,
-      hendleAddNew,
-      changeTable,
-      reload,
-      language,
-      register,
-      openModal,
-      getCheckPerm,
-      handlePreview,
-    };
-  },
-});
-</script>
+      function hendleAddNew() {
+        console.log('新增新闻');
+      }
+      return {
+        registerTable,
+        handleDelete,
+        handleEdit,
+        handleWithdraw,
+        handlePublish,
+        hendleAddNew,
+        changeTable,
+        reload,
+        language,
+        register,
+        openModal,
+        getCheckPerm,
+        handlePreview,
+      };
+    },
+  });
+</script>

+ 59 - 1
src/views/operate/components/case/addModal.vue

@@ -69,12 +69,23 @@
           },
         },
         {
+          field: 'introduction',
+          component: 'Input',
+          label: '副标题',
+          componentProps: {
+            maxlength: 50,
+          },
+          colProps: {
+            span: 22,
+          },
+        },
+        {
           field: 'subTitle',
           component: 'InputTextArea',
           required: true,
           label: '摘要',
           componentProps: {
-            maxLength: 500,
+            maxLength: 1000,
             rows: 4,
             placeholder: '请输入摘要',
           },
@@ -221,6 +232,49 @@
           },
         },
         {
+          field: 'type',
+          component: 'RadioGroup',
+          label: '是否外部链接',
+          defaultValue: 0,
+          required: true,
+          componentProps: {
+            options: [
+              {
+                label: '否',
+                value: 0,
+              },
+              {
+                label: '是',
+                value: 1,
+              },
+            ],
+            onChange: (val) => {
+              let typeShow = val.target.value;
+              console.log('typeShow', typeShow);
+              updateSchema([
+                { field: 'outsideLink', ifShow: typeShow == 1 },
+                { field: 'detailContent', ifShow: typeShow == 0 },
+              ]);
+            },
+          },
+          colProps: {
+            span: 22,
+          },
+        },
+        {
+          field: 'outsideLink',
+          component: 'Input',
+          label: '链接地址',
+          required: true,
+          ifShow: false,
+          componentProps: {
+            maxlength: 50,
+          },
+          colProps: {
+            span: 22,
+          },
+        },
+        {
           field: 'detailContent',
           label: '正文',
           component: 'Input',
@@ -263,6 +317,10 @@
           title.value = '编辑案例';
           const detail = data;
           console.log('detail', detail, detail.iconIds && JSON.parse(detail.iconIds));
+          updateSchema([
+            { field: 'outsideLink', ifShow: data.outsideLink == 0 },
+            { field: 'detailContent', ifShow: data.outsideLink != 1 },
+          ]);
           setFieldsValue({
             ...detail,
             iconIdList: detail.iconIds && JSON.parse(detail.iconIds),

+ 32 - 249
src/views/productOperation/cameraScene.vue

@@ -14,7 +14,7 @@
     <div class="desc-wrap-BasicTable">
       <BasicTable @register="registerTable" ref="tableRef">
         <template #toolbar>
-          <!-- <a-button type="primary" @click="exportExcel"> 导出1</a-button> -->
+          <a-button type="primary" @click="handleMoveAll"> 批量迁移</a-button>
         </template>
         <template #status="{ record }">
           <span v-if="record.status != '-1'">{{ record.statusString }}</span>
@@ -52,6 +52,11 @@
                 onClick: handleMove.bind(null, record),
               },
               {
+                label: '优先级',
+                ifShow: getTypeCheckPerm('scenes-move') && record.statusString == -4,
+                onClick: handlePriority.bind(null, record),
+              },
+              {
                 label: '解冻',
                 disabled: !record.isColdStorage || !(record.status == 1 || record.status == -2),
                 ifShow: getTypeCheckPerm('scenes-thaw'),
@@ -108,6 +113,7 @@
       :okButtonProps="{ disabled: canDownload }"
     />
     <MoveModal @update="reload" @register="registerMoveModal" />
+    <priorityMoadl @update="reload" @register="registerPriority" />
   </PageWrapper>
 </template>
 <script lang="ts">
@@ -124,6 +130,7 @@
   import { PageWrapper } from '/@/components/Page';
   import DownLoadModal from './modal/DownLoadModal.vue';
   import MoveModal from './modal/MoveModal.vue';
+  import priorityMoadl from './modal/priorityMoadl.vue';
   import { Time } from '/@/components/Time';
   import { Icon } from '/@/components/Icon';
   import { Descriptions, Tabs, Progress, Tooltip } from 'ant-design-vue';
@@ -146,12 +153,14 @@
   import { usePermissionStore } from '/@/store/modules/permission';
   import { func } from 'vue-types';
   import { truncate } from 'fs/promises';
+  import { getSchemas, getColumns } from './data';
   export default defineComponent({
     components: {
       DownLoadModal,
       MoveModal,
       BasicTable,
       TableAction,
+      priorityMoadl,
       PageWrapper,
       Icon,
       Tooltip,
@@ -168,184 +177,6 @@
       const loading = ref(false);
       const tableRef = ref<Nullable<TableActionType>>(null);
       const tableType = ref<Number>(0); //0看看 、1看见、2深时
-      function columns(isobj): BasicColumn[] {
-        return [
-          {
-            title: '场景标题',
-            dataIndex: 'sceneName',
-            slots: { customRender: 'href' },
-            width: 150,
-          },
-          {
-            title: '场景码',
-            dataIndex: 'num',
-            ellipsis: true,
-            width: 180,
-          },
-          {
-            title: '拍摄时间',
-            dataIndex: 'createTime',
-            sorter: true,
-            width: 180,
-            customRender: ({ record }) => {
-              return (
-                record.createTime &&
-                h(Time, {
-                  value: record.createTime,
-                  mode: 'datetime',
-                })
-              );
-            },
-          },
-          {
-            title: 'obj生成状态',
-            dataIndex: 'isObj',
-            ellipsis: true,
-            ifShow: isobj,
-            width: 180,
-            customRender: ({ record }) => {
-              return record.isObj == 0 ? '未生成' : record.isObj == 1 ? '已生成' : '计算中';
-            },
-          },
-          {
-            title: '计算完成时间',
-            dataIndex: 'amount',
-            width: 180,
-            customRender: ({ record }) => {
-              return (
-                (record.algorithmTime &&
-                  h(Time, {
-                    value: record.algorithmTime,
-                    mode: 'datetime',
-                  })) ||
-                '-'
-              );
-            },
-          },
-          {
-            title: 'SN码',
-            dataIndex: 'snCode',
-            width: 180,
-          },
-          {
-            title: '点位数量',
-            dataIndex: 'shootCount',
-            width: 80,
-            // customRender: ({ record }) => {
-            //   return ( tableType.value == 2 || tableType.value == 6 )||!record.shootCount ? '-' : record.shootCount
-            // },
-          },
-          {
-            title: '场景大小',
-            dataIndex: 'sceneSize',
-            width: 80,
-            customRender: ({ record }) => {
-              return record.sceneSize && record.sceneSize != 0
-                ? h('span', { class: 'sceneSize' }, Math.ceil(record.sceneSize / 1024 / 1024) + 'M')
-                : '-';
-            },
-          },
-          {
-            title: '拍摄位置',
-            dataIndex: 'addressComponent',
-            width: 100,
-            customRender: ({ record }) => {
-              if (!record.addressComponent) {
-                return '';
-              }
-              return record && record.addressComponent && record.addressComponent.city; // + district + township;
-            },
-          },
-          {
-            title: '是否复制',
-            dataIndex: 'isCopy',
-            width: 80,
-            customRender: ({ record }) => {
-              return record.isCopy ? '是' : '否';
-            },
-          },
-          {
-            title: '复制时间',
-            dataIndex: 'copyTime',
-            width: 180,
-            customRender: ({ record }) => {
-              return record.copyTime
-                ? h(Time, {
-                    value: record.copyTime,
-                    mode: 'datetime',
-                  })
-                : '-';
-            },
-          },
-          {
-            title: '绑定账号',
-            dataIndex: 'userName',
-            width: 100,
-          },
-          {
-            title: '浏览量',
-            dataIndex: 'viewCount',
-            sorter: true,
-            width: 80,
-          },
-          {
-            title: '状态',
-            dataIndex: 'statusString',
-            width: 120,
-            slots: { customRender: 'status' },
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            slots: { customRender: 'action' },
-            ifShow: true,
-            fixed: 'right',
-            flag: 'ACTION',
-            width: 280,
-          },
-        ];
-      }
-      // const searchForm: Partial<FormProps> = {
-      //   labelWidth: 100,
-      //   schemas: [
-      //     {
-      //       field: 'sceneName',
-      //       label: '场景标题',
-      //       component: 'Input',
-      //       componentProps: {
-      //         maxLength: 100,
-      //       },
-      //       colProps: {
-      //         xl: 7,
-      //         xxl: 7,
-      //       },
-      //     },
-      //     {
-      //       field: 'snCode',
-      //       label: 'SN码',
-      //       component: 'Input',
-      //       componentProps: {
-      //         maxLength: 100,
-      //       },
-      //       colProps: {
-      //         xl: 7,
-      //         xxl: 7,
-      //       },
-      //     },
-      //     {
-      //       field: 'userName',
-      //       label: '绑定账号',
-      //       component: 'Input',
-      //       componentProps: {
-      //         maxLength: 100,
-      //       },
-      //       colProps: {
-      //         xl: 6,
-      //         xxl: 6,
-      //       },
-      //     },
-      //   ],
-      // };
 
       const searchFormSs: Partial<FormProps> = {
         labelWidth: 100,
@@ -354,82 +185,19 @@
         actionColOptions: {
           span: 24,
         },
-        schemas: [
-          {
-            field: 'sceneName',
-            label: '场景标题',
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 7,
-              xxl: 7,
-            },
-          },
-          {
-            field: 'num',
-            label: '场景码',
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 7,
-              xxl: 7,
-            },
-          },
-          {
-            field: 'snCode',
-            label: 'SN码',
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 7,
-              xxl: 7,
-            },
-          },
-          {
-            field: 'userName',
-            label: '绑定账号',
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 7,
-              xxl: 7,
-            },
-          },
-          {
-            field: 'timeList',
-            label: '拍摄时间段',
-            component: 'RangePicker',
-            componentProps: {
-              maxLength: 100,
-              minWidth: '385px',
-              format: 'YYYY-MM-DD',
-              valueFormat: 'YYYY-MM-DD',
-              showTime: true,
-            },
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-          },
-        ],
+        schemas: getSchemas(),
       };
       function cancelDownload() {
         downloadOption.value = {};
       }
+      const [registerPriority, { openModal: openPriorityModal }] = useModal();
       const [registerDownModal, { openModal: openDownModal }] = useModal();
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
-      const [registerTable, { reload, setColumns }] = useTable({
+      const [registerTable, { reload, setColumns, getSelectRowKeys, clearSelectedRowKeys }] = useTable({
         api: operateSceneList,
         title: `场景列表`,
-        columns: columns(false),
+        columns: getColumns(false),
+        rowSelection: { type: 'checkbox' },
         searchInfo: { type: tableType },
         useSearchForm: true,
         formConfig: searchFormSs,
@@ -462,10 +230,22 @@
 
       function changeTable(val: string) {
         tableType.value = val;
-        setColumns(columns(val == 2));
-        // setColumns(columns)
+        setColumns(getColumns(val == 2));
+        clearSelectedRowKeys()
         reload();
       }
+      function handlePriority(record) {
+        openPriorityModal(true, record);
+      }
+      function handleMoveAll() {
+        let numList = getSelectRowKeys() || [];
+        if(numList.length == 0){
+          return createMessage.error('请选择批量迁移的场景');
+        }
+        openMoveModal(true, {
+          numList,
+        });
+      }
       async function handleCopy(record: Recordable) {
         createConfirm({
           title: '复制场景',
@@ -587,6 +367,8 @@
         handleDownload,
         handleReset,
         handleColdStorage,
+        handleMoveAll,
+        handlePriority,
         tableType,
         loading,
         reload,
@@ -595,6 +377,7 @@
         openDownModal,
         registerDownModal,
         registerMoveModal,
+        registerPriority,
         afterClose,
         timer,
         canDownload,

+ 443 - 0
src/views/productOperation/data.ts

@@ -0,0 +1,443 @@
+import { useI18n } from '/@/hooks/web/useI18n';
+const { t } = useI18n();
+import { Time } from '/@/components/Time';
+import { BasicColumn } from '/@/components/Table/src/types/table';
+import { h } from 'vue';
+export const getSchemas = () => {
+  return [
+    {
+      field: 'sceneName',
+      label: '场景标题',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 7,
+        xxl: 7,
+      },
+    },
+    {
+      field: 'num',
+      label: '场景码',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 7,
+        xxl: 7,
+      },
+    },
+    {
+      field: 'snCode',
+      label: 'SN码',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 7,
+        xxl: 7,
+      },
+    },
+    {
+      field: 'userName',
+      label: '绑定账号',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 7,
+        xxl: 7,
+      },
+    },
+    {
+      field: 'timeList',
+      label: '拍摄时间段',
+      component: 'RangePicker',
+      componentProps: {
+        maxLength: 100,
+        minWidth: '385px',
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        showTime: true,
+      },
+      colProps: {
+        xl: 8,
+        xxl: 8,
+      },
+    },
+  ];
+};
+export const getviewSchemas = () => {
+  return [
+    {
+      field: 'sceneName',
+      label: '作品标题',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 7,
+        xxl: 7,
+      },
+    },
+    {
+      field: 'sceneCodes',
+      label: '作品码',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 7,
+        xxl: 7,
+      },
+    },
+    {
+      field: 'userName',
+      label: '用户账号',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 6,
+        xxl: 6,
+      },
+    },
+    {
+      field: 'timeList',
+      label: '创建时间',
+      component: 'RangePicker',
+      componentProps: {
+        maxLength: 100,
+        minWidth: '385px',
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        showTime: true,
+      },
+      colProps: {
+        xl: 8,
+        xxl: 8,
+      },
+    },
+  ];
+};
+export const getviewColumns = () => {
+  return [
+    {
+      title: '作品标题',
+      dataIndex: 'name',
+      slots: { customRender: 'href' },
+      width: 150,
+      // customRender: ({ record }) => {
+      //   return record.name ? h('span', record.name) : '-';
+      // },
+    },
+    {
+      title: '作品码',
+      dataIndex: 'sceneCodes',
+      ellipsis: true,
+      width: 180,
+    },
+    {
+      title: '用户账号',
+      dataIndex: 'userId',
+      width: 100,
+    },
+
+    {
+      title: '创建时间',
+      dataIndex: 'createTime',
+      sorter: true,
+      width: 180,
+      customRender: ({ record }) => {
+        return record.createTime
+          ? h(Time, {
+              value: record.createTime,
+              mode: 'datetime',
+            })
+          : '-';
+      },
+    },
+    {
+      title: '最新编辑时间',
+      dataIndex: 'updateTime',
+      width: 180,
+      customRender: ({ record }) => {
+        return record.updateTime
+          ? h(Time, {
+              value: record.updateTime,
+              mode: 'datetime',
+            })
+          : '-';
+      },
+    },
+    {
+      title: '是否加密',
+      dataIndex: 'status',
+      width: 80,
+      customRender: ({ record }) => {
+        return record.isPassword == 1 ? '是' : '否';
+      },
+    },
+    {
+      title: '浏览量',
+      dataIndex: 'visit',
+      sorter: true,
+      width: 80,
+    },
+    {
+      title: '操作',
+      dataIndex: 'action',
+      slots: { customRender: 'action' },
+      ifShow: true,
+      fixed: 'right',
+      flag: 'ACTION',
+      width: 50,
+    },
+  ];
+};
+export const getColumns = (isobj) => {
+  return [
+    {
+      title: '场景标题',
+      dataIndex: 'sceneName',
+      slots: { customRender: 'href' },
+      width: 150,
+    },
+    {
+      title: '场景码',
+      dataIndex: 'num',
+      ellipsis: true,
+      width: 180,
+    },
+    {
+      title: '拍摄时间',
+      dataIndex: 'createTime',
+      sorter: true,
+      width: 180,
+      customRender: ({ record }) => {
+        return (
+          record.createTime &&
+          h(Time, {
+            value: record.createTime,
+            mode: 'datetime',
+          })
+        );
+      },
+    },
+    {
+      title: 'obj生成状态',
+      dataIndex: 'isObj',
+      ellipsis: true,
+      ifShow: isobj,
+      width: 180,
+      customRender: ({ record }) => {
+        return record.isObj == 0 ? '未生成' : record.isObj == 1 ? '已生成' : '计算中';
+      },
+    },
+    {
+      title: '计算完成时间',
+      dataIndex: 'amount',
+      width: 180,
+      customRender: ({ record }) => {
+        return (
+          (record.algorithmTime &&
+            h(Time, {
+              value: record.algorithmTime,
+              mode: 'datetime',
+            })) ||
+          '-'
+        );
+      },
+    },
+    {
+      title: 'SN码',
+      dataIndex: 'snCode',
+      width: 180,
+    },
+    {
+      title: '点位数量',
+      dataIndex: 'shootCount',
+      width: 80,
+      // customRender: ({ record }) => {
+      //   return ( tableType.value == 2 || tableType.value == 6 )||!record.shootCount ? '-' : record.shootCount
+      // },
+    },
+    {
+      title: '场景大小',
+      dataIndex: 'sceneSize',
+      width: 80,
+      customRender: ({ record }) => {
+        return record.sceneSize && record.sceneSize != 0
+          ? h('span', { class: 'sceneSize' }, Math.ceil(record.sceneSize / 1024 / 1024) + 'M')
+          : '-';
+      },
+    },
+    {
+      title: '拍摄位置',
+      dataIndex: 'addressComponent',
+      width: 100,
+      customRender: ({ record }) => {
+        if (!record.addressComponent) {
+          return '';
+        }
+        return record && record.addressComponent && record.addressComponent.city; // + district + township;
+      },
+    },
+    {
+      title: '是否复制',
+      dataIndex: 'isCopy',
+      width: 80,
+      customRender: ({ record }) => {
+        return record.isCopy ? '是' : '否';
+      },
+    },
+    {
+      title: '复制时间',
+      dataIndex: 'copyTime',
+      width: 180,
+      customRender: ({ record }) => {
+        return record.copyTime
+          ? h(Time, {
+              value: record.copyTime,
+              mode: 'datetime',
+            })
+          : '-';
+      },
+    },
+    {
+      title: '绑定账号',
+      dataIndex: 'userName',
+      width: 100,
+    },
+    {
+      title: '浏览量',
+      dataIndex: 'viewCount',
+      sorter: true,
+      width: 80,
+    },
+    {
+      title: '状态',
+      dataIndex: 'statusString',
+      width: 120,
+      slots: { customRender: 'status' },
+    },
+    {
+      title: '操作',
+      dataIndex: 'action',
+      slots: { customRender: 'action' },
+      ifShow: true,
+      fixed: 'right',
+      flag: 'ACTION',
+      width: 280,
+    },
+  ];
+};
+export const getVrColumns = () => {
+  return [
+    {
+      title: '作品标题',
+      dataIndex: 'sceneName',
+      slots: { customRender: 'href' },
+      width: 150,
+    },
+    {
+      title: '作品码',
+      dataIndex: 'sceneCodes',
+      ellipsis: true,
+      width: 200,
+    },
+    {
+      title: '场景码',
+      dataIndex: 'num',
+      ellipsis: true,
+      width: 180,
+    },
+    {
+      title: '拍摄时间',
+      dataIndex: 'createTime',
+      sorter: true,
+      width: 180,
+      customRender: ({ record }) => {
+        return (
+          record.createTime &&
+          h(Time, {
+            value: record.createTime,
+            mode: 'datetime',
+          })
+        );
+      },
+    },
+    {
+      title: '计算完成时间',
+      dataIndex: 'amount',
+      width: 180,
+      customRender: ({ record }) => {
+        return (
+          (record.algorithmTime &&
+            h(Time, {
+              value: record.algorithmTime,
+              mode: 'datetime',
+            })) ||
+          '-'
+        );
+      },
+    },
+    {
+      title: 'SN码',
+      dataIndex: 'snCode',
+      width: 180,
+    },
+    {
+      title: '点位数量',
+      dataIndex: 'shootCount',
+      width: 80,
+      // customRender: ({ record }) => {
+      //   return ( tableType.value == 2 || tableType.value == 6 )||!record.shootCount ? '-' : record.shootCount
+      // },
+    },
+    {
+      title: '拍摄位置',
+      dataIndex: 'addressComponent',
+      width: 100,
+      customRender: ({ record }) => {
+        if (!record.addressComponent) {
+          return '';
+        }
+        return record && record.addressComponent && record.addressComponent.city; // + district + township;
+      },
+    },
+    {
+      title: '绑定账号',
+      dataIndex: 'userName',
+      width: 100,
+    },
+    {
+      title: '浏览量',
+      dataIndex: 'viewCount',
+      sorter: true,
+      width: 80,
+    },
+    {
+      title: '状态',
+      dataIndex: 'statusString',
+      width: 120,
+      slots: { customRender: 'status' },
+    },
+    {
+      title: '操作',
+      dataIndex: 'action',
+      slots: { customRender: 'action' },
+      ifShow: true,
+      fixed: 'right',
+      flag: 'ACTION',
+      width: 280,
+    },
+  ];
+};

+ 0 - 1
src/views/productOperation/modal/DownLoadModal.vue

@@ -4,7 +4,6 @@
     @register="register"
     title="场景下载"
     :minHeight="0"
-    @visible-change="handleVisibleChange"
     @cancel="hundleCancel"
     @ok="handleSubmit"
   >

+ 11 - 3
src/views/productOperation/modal/MoveModal.vue

@@ -9,6 +9,7 @@
     :min-height="0"
   >
     <div class="pt-2px pr-3px">
+      <div style="padding-left: 125px; line-height: 32px;" v-if="model.numList && model.numList.length">仅计算成功、封存场景支持迁移</div>
       <BasicForm @register="registerForm" :model="model">
         <template #text="{ model, field }">
           {{ model[field] }}
@@ -33,7 +34,10 @@
     },
     emits: ['update', 'register'],
     setup(props, { emit }) {
-      const modelRef = ref({});
+      const modelRef = ref({
+        num: '',
+        numList: []
+      });
       const fileFlow = reactive({
         file: null,
       });
@@ -85,7 +89,7 @@
           },
         },
       ];
-      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
         labelWidth: 120,
         schemas,
         showActionButtonGroup: false,
@@ -103,6 +107,10 @@
       function onDataReceive(data) {
         modelRef.value = data;
         resetFields();
+        updateSchema({
+          field: 'type',
+          ifShow: !(data && data.numList && data.numList.length > 0),
+        });
         setFieldsValue({
           type: data.sceneName,
         });
@@ -112,7 +120,7 @@
           const params = await validate();
           const apiData = {
             snCode: params.snCode,
-            num: modelRef.value.num,
+            ...modelRef.value
           };
           console.log('res', apiData, params);
           const res = await sceneMove(apiData);

+ 142 - 0
src/views/productOperation/modal/priorityMoadl.vue

@@ -0,0 +1,142 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="优先级设置"
+    @ok="handleSubmit"
+    :height="300"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <div style="padding-left: 125px; line-height: 32px;" v-if="model.numList && model.numList.length">仅计算成功、封存场景支持迁移</div>
+      <BasicForm @register="registerForm" :model="model">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, 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 { updateModelingLevel, mqQueueConfigList, getInfo } from '/@/api/operate';
+  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({
+        num: '',
+        numList: []
+      });
+      const fileFlow = reactive({
+        file: null,
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'num',
+          component: 'Input',
+          label: 'num',
+          show: false,
+        },
+        {
+          field: 'cameraId',
+          component: 'Input',
+          label: 'num',
+          show: false,
+        },
+        {
+          field: 'configId',
+          component: 'ApiRadioGroup',
+          label: '优先级',
+          required: true,
+          colProps: {
+            span: 16,
+          },
+          defaultValue: 2,
+          componentProps: {
+            placeholder: '请输入相机SN码',
+            maxLength: 15,
+            api: mqQueueConfigList,
+            // numberToString: true,
+            labelField: 'remark',
+            valueField: 'id',
+            immediate: true,
+            params: {
+              agentName: '',
+            },
+            onChange: (data) => {
+              console.log('data', data);
+            },
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        console.log(data);
+        data && onDataReceive(data);
+      });
+
+      async function onDataReceive(data) {
+        let { id } = await getInfo(data);
+        modelRef.value = data;
+        resetFields();
+        updateSchema({
+          field: 'type',
+          ifShow: false,
+        });
+        setFieldsValue({
+          ...data,
+          configId: id,
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const res = await updateModelingLevel(params);
+          console.log('res', res);
+          closeModal();
+          resetFields();
+          createMessage.success('优先级设置成功。');
+          emit('update');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        // console.log(v);
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+      };
+    },
+  });
+</script>

+ 323 - 167
src/views/productOperation/viewKankan.vue

@@ -1,33 +1,131 @@
 <template>
-  <BasicTable @register="registerTable">
-    <template #toolbar>
-      <!-- <a-button type="primary" @click="exportExcel"> 导出1</a-button> -->
+  <PageWrapper contentBackground>
+    <template #footer>
+      <a-tabs v-model:activeKey="tableType">
+        <a-tab-pane :key="0" tab="用户作品" />
+        <a-tab-pane :key="1" tab="看见全景VR" />
+      </a-tabs>
     </template>
-    <template #href="{ record }">
-          <a v-if="record.name" target="_blank" :href="record.share">{{record.name}}</a>
+    <div class="desc-wrap-BasicTable">
+      <BasicTable v-if="tableType == 0" @register="registerTable">
+        <template #toolbar>
+          <!-- <a-button type="primary" @click="handleMoveAll"> 批量迁移</a-button> -->
+        </template>
+        <template #href="{ record }">
+          <a v-if="record.name" target="_blank" :href="record.share">{{ record.name }}</a>
           <span v-else>-</span>
-    </template>
-    <template #action="{ record }">
-      <TableAction
-        stopButtonPropagation
-        :actions="[
-          {
-            label: '删除',
-            color: 'error',
-            ifShow:getCheckPerm('projects-delete'),
-            popConfirm: {
-              title: '是否删除?',
-              confirm: handleDelete.bind(null, record),
-              placement: 'topLeft',
-            },
-          },
-        ]"
-      />
-    </template>
-  </BasicTable>
+        </template>
+        <template #action="{ record }">
+          <TableAction
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '删除',
+                color: 'error',
+                ifShow: getCheckPerm('projects-delete'),
+                popConfirm: {
+                  title: '是否删除?',
+                  confirm: handleDelete.bind(null, record),
+                  placement: 'topLeft',
+                },
+              },
+            ]"
+          />
+        </template>
+      </BasicTable>
+      <BasicTable v-else @register="registerTableScene" ref="tableRef">
+        <template #toolbar>
+          <a-button type="primary" @click="handleMoveAll"> 批量迁移</a-button>
+        </template>
+        <template #status="{ record }">
+          <span v-if="record.status != '-1'">{{ record.statusString }}</span>
+          <Tooltip v-else placement="right">
+            <template #title>
+              <span>失败原因:{{ record.buildErrorReason }}</span>
+              <p>
+                <span>serverPath:{{ record.dataSource }}</span>
+              </p>
+            </template>
+            <span
+              >{{ record.statusString }}
+              <Icon icon="mdi:warning-octagon-outline" />
+            </span>
+          </Tooltip>
+        </template>
+        <template #href="{ record }">
+          <a
+            v-if="record.sceneName && record.thumb"
+            target="_blank"
+            :href="record.webSite || record.thumb"
+            >{{ record.sceneName }}</a
+          >
+          <span v-else-if="record.sceneName">{{ record.sceneName }}</span>
+          <span v-else>-</span>
+        </template>
+        <template #action="{ record }">
+          <TableAction
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '迁移',
+                disabled: !(record.status == 1 || record.status == -2),
+                ifShow: getTypeCheckPerm('scenes-move') && tableType != 3,
+                onClick: handleMove.bind(null, record),
+              },
+              {
+                label: '优先级',
+                ifShow: getTypeCheckPerm('scenes-move') && record.statusString == -4,
+                onClick: handlePriority.bind(null, record),
+              },
+              {
+                label: '解冻',
+                disabled: !record.isColdStorage || !(record.status == 1 || record.status == -2),
+                ifShow: getTypeCheckPerm('scenes-thaw'),
+                onClick: handleColdStorage.bind(null, record),
+              },
+              {
+                label: '重算',
+                disabled: record.status == 0 || (record.status == -2 && record.payStatus != 1),
+                ifShow: getTypeCheckPerm('scenes-recalculate') && tableType != 3,
+                popConfirm: {
+                  title: '是否重算?',
+                  confirm: handleReset.bind(null, record),
+                },
+              },
+              {
+                label: '删除',
+                //icon: 'ic:outline-delete-outline',
+                color: 'error',
+                ifShow: getTypeCheckPerm('scenes-delete'),
+                disabled: record.status == 0,
+                //onClick: handleDelete.bind(null, record),
+                popConfirm: {
+                  title: '是否删除?',
+                  confirm: handleDelete.bind(null, record),
+                  placement: 'topRight',
+                },
+              },
+            ]"
+          />
+        </template>
+      </BasicTable>
+    </div>
+    <DownLoadModal
+      :downloadOption="downloadOption"
+      @cancel="afterClose"
+      @register="registerDownModal"
+      @update="reload"
+      cancelText="取消下载"
+      okText="下载"
+      @cancelDownload="cancelDownload"
+      :okButtonProps="{ disabled: canDownload }"
+    />
+    <MoveModal @update="reload" @register="registerMoveModal" />
+    <priorityMoadl @update="reload" @register="registerPriority" />
+  </PageWrapper>
 </template>
 <script lang="ts">
-  import { defineComponent, h, reactive, toRefs } from 'vue';
+  import { defineComponent, h, reactive, toRefs, ref } from 'vue';
   import {
     BasicTable,
     useTable,
@@ -38,19 +136,29 @@
   } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
   import { Time } from '/@/components/Time';
-  import { Descriptions } from 'ant-design-vue';
+  import { Descriptions, Tabs } from 'ant-design-vue';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { Switch } from 'ant-design-vue';
-  import { overallList, overallDelete } from '/@/api/operate';
+  import { overallList, overallDelete, cameraSceneList, sceneDelete } from '/@/api/operate';
   import { message } from 'ant-design-vue';
+  import { useModal } from '/@/components/Modal';
+  import DownLoadModal from './modal/DownLoadModal.vue';
+  import MoveModal from './modal/MoveModal.vue';
+  import priorityMoadl from './modal/priorityMoadl.vue';
   import { usePermissionStore } from '/@/store/modules/permission';
+  import { getSchemas, getVrColumns, getviewColumns, getviewSchemas } from './data';
   export default defineComponent({
     components: {
       BasicTable,
       TableAction,
       PageWrapper,
+      DownLoadModal,
+      MoveModal,
+      priorityMoadl,
       TableImg,
+      [Tabs.name]: Tabs,
+      [Tabs.TabPane.name]: Tabs.TabPane,
       [Descriptions.name]: Descriptions,
       [Descriptions.Item.name]: Descriptions.Item,
     },
@@ -59,144 +167,63 @@
       const { createMessage, createConfirm } = useMessage();
       const permissionStore = usePermissionStore();
       const { getCheckPerm } = permissionStore;
-      const columns: BasicColumn[] = [
-        {
-          title: '作品标题',
-          dataIndex: 'name',
-          slots: { customRender: 'href' },
-          width: 150,
-          // customRender: ({ record }) => {
-          //   return record.name ? h('span', record.name) : '-';
-          // },
-        },
-        {
-          title: '作品码',
-          dataIndex: 'sceneCodes',
-          ellipsis: true,
-          width: 180,
-        },
-        {
-          title: '用户账号',
-          dataIndex: 'userId',
-          width: 100,
-        },
-
-        {
-          title: '创建时间',
-          dataIndex: 'createTime',
-          sorter: true,
-          width: 180,
-          customRender: ({ record }) => {
-            return record.createTime
-              ? h(Time, {
-                  value: record.createTime,
-                  mode: 'datetime',
-                })
-              : '-';
-          },
-        },
-        {
-          title: '最新编辑时间',
-          dataIndex: 'updateTime',
-          width: 180,
-          customRender: ({ record }) => {
-            return record.updateTime
-              ? h(Time, {
-                  value: record.updateTime,
-                  mode: 'datetime',
-                })
-              : '-';
-          },
-        },
-        {
-          title: '是否加密',
-          dataIndex: 'status',
-          width: 80,
-          customRender: ({ record }) => {
-            return record.isPassword == 1 ? '是' : '否';
-          },
-        },
-        {
-          title: '浏览量',
-          dataIndex: 'visit',
-          sorter: true,
-          width: 80,
-        },
-        {
-          title: '操作',
-          dataIndex: 'action',
-          slots: { customRender: 'action' },
-          ifShow: true,
-          fixed: 'right',
-          flag: 'ACTION',
-          width: 50,
-        },
-      ];
+      const tableType = ref<Number>(0); //0看看 、1看见、2深时
+      const loading = ref(false);
       const searchForm: Partial<FormProps> = {
         labelWidth: 100,
-        autoSubmitOnEnter:true,
-        autoAdvancedLine:1,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
         actionColOptions: {
           span: 24,
         },
-        schemas: [
-          {
-            field: 'sceneName',
-            label: '作品标题',
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 7,
-              xxl: 7,
-            },
-          },{
-            field: 'sceneCodes',
-            label: '作品码',
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 7,
-              xxl: 7,
-            },
-          },
-          {
-            field: 'userName',
-            label: '用户账号',
-            component: 'Input',
-            componentProps: {
-              maxLength: 100,
-            },
-            colProps: {
-              xl: 6,
-              xxl: 6,
-            },
-          },{
-            field: 'timeList',
-            label: '创建时间',
-            component: 'RangePicker',
-            componentProps: {
-              maxLength: 100,
-              minWidth:'385px',
-              format: 'YYYY-MM-DD',
-              valueFormat: 'YYYY-MM-DD',
-              showTime: true,
-            },
-            colProps: {
-              xl: 8,
-              xxl: 8,
-            },
-          },
-        ],
+        schemas: getviewSchemas(),
+      };
+      const searchFormSs: Partial<FormProps> = {
+        labelWidth: 100,
+        autoSubmitOnEnter: true,
+        autoAdvancedLine: 1,
+        actionColOptions: {
+          span: 24,
+        },
+        schemas: getSchemas(),
       };
-      const [registerTable, { reload }] = useTable({
+      const [registerPriority, { openModal: openPriorityModal }] = useModal();
+      const [registerDownModal, { openModal: openDownModal }] = useModal();
+      const [registerMoveModal, { openModal: openMoveModal }] = useModal();
+      const [
+        registerTableScene,
+        { reload: reload1, setColumns, getSelectRowKeys, clearSelectedRowKeys },
+      ] = useTable({
+        api: cameraSceneList,
+        title: `全景VR列表`,
+        columns: getVrColumns(),
+        rowSelection: { type: 'checkbox' },
+        searchInfo: { type: tableType },
+        useSearchForm: true,
+        formConfig: searchFormSs,
+        showTableSetting: true,
+        beforeFetch: (T) => {
+          loading.value = true;
+          return T;
+        },
+        afterFetch: (T) => {
+          loading.value = false;
+          return T;
+        },
+        rowKey: 'num',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: true,
+      });
+      const [registerTable, { reload: reload0 }] = useTable({
         api: overallList,
         title: '作品列表',
         // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
-        columns: columns,
+        columns: getviewColumns(),
         searchInfo: { type: 1 },
         useSearchForm: true,
         formConfig: searchForm,
@@ -212,29 +239,140 @@
       });
       async function handleDelete(record: Recordable) {
         console.log('handleDelete', record);
+        if (tableType.value == 1) {
+          sceneDelete({ num: record.num }).then(() => {
+            message.success({
+              content: '删除成功',
+            });
 
-        overallDelete({ id: record.id })
-          .then(() => {
+            reload1();
+          });
+        } else {
+          overallDelete({ id: record.id }).then(() => {
             message.success({
               content: '删除成功',
             });
 
-            reload();
-          })
+            reload0();
+          });
+        }
       }
-      async function handleMove(record: Recordable) {
-        sceneMove({ snCode: record.snCode, num: record.num })
-          .then(() => {
-            message.success({
-              content: '迁移成功',
+
+      function getTypeCheckPerm(val) {
+        let myType = tableType.value;
+        return getCheckPerm(val) || getCheckPerm(`${val}-${myType}`);
+      }
+      function reload() {
+        reload0();
+        reload1();
+      }
+      function handlePriority(record) {
+        openPriorityModal(true, record);
+      }
+      function handleMoveAll() {
+        let numList = getSelectRowKeys() || [];
+        if (numList.length == 0) {
+          return createMessage.error('请选择批量迁移的场景');
+        }
+        openMoveModal(true, {
+          numList,
+        });
+      }
+      function cancelDownload() {
+        downloadOption.value = {};
+      }
+      async function handleColdStorage(record: Recordable) {
+        createConfirm({
+          title: '删除',
+          content: '确定要解冻场景吗?',
+          onOk: async () => {
+            sceneRestStore({ num: record.num }).then(() => {
+              message.success({
+                content: '已提交解冻',
+              });
+
+              reload();
+            });
+          },
+        });
+      }
+      async function handleCopy(record: Recordable) {
+        createConfirm({
+          title: '复制场景',
+          content: '复制场景,场景归属在原相机下。<br/>确定要复制场景吗?',
+          onOk: async () => {
+            sceneCopy({ num: record.num }).then(() => {
+              message.success({
+                content: '复制成功',
+              });
+              reload();
             });
-          })
+          },
+        });
       }
+      async function handleMove(record: Recordable) {
+        openMoveModal(true, {
+          ...record,
+        });
+      }
+      let timer: null = ref(null);
+      const downloadOption = ref<Object>({});
+      const canDownload = ref<boolean>(true);
       function handleDownload(record: Recordable) {
-        console.log('handleDownload', record);
+        let isObj = tableType.value == 5 || tableType.value == 7 ? 1 : 0;
+        let params = { num: record.num, isObj: 0 };
+        if (tableType.value == 4 || tableType.value == 5 || tableType.value == 7) {
+          params.isObj = isObj;
+        }
+        canDownload.value = true;
+        checkDownLoad(params).then((res) => {
+          if (res.downloadStatus != 3) {
+            // 未下载过,需要打包
+            sceneDownload(params).then((res) => {
+              console.log(res);
+              openDownModal(true, {
+                ...record,
+                isObj: params.isObj,
+              });
+              if (res.downloadStatus == 1) {
+                if (timer.value) {
+                  afterClose();
+                }
+                timer.value = setInterval(() => {
+                  downloadProcess(params).then((res) => {
+                    if (res.status == '1003') {
+                      createMessage.error('下载失败');
+                      afterClose();
+                      return;
+                    }
+                    if (res.percent >= 100) {
+                      canDownload.value = false;
+                      afterClose();
+                    }
+                    downloadOption.value = res;
+                    console.log(res);
+                  });
+                }, 1000);
+              }
+            });
+          } else {
+            canDownload.value = false;
+            window.open(res.downloadUrl);
+          }
+        });
+      }
+      function afterClose() {
+        clearInterval(timer.value);
+        timer.value = null;
       }
       function handleReset(record: Recordable) {
         console.log('handleReset', record);
+        rebuildScene({ num: record.num }).then(() => {
+          message.success({
+            content: '操作成功',
+          });
+          reload();
+        });
       }
       // function exportExcel() {
       //   createConfirm({
@@ -248,11 +386,29 @@
       // }
       return {
         registerTable,
+        registerTableScene,
         handleDelete,
         handleMove,
         handleDownload,
         handleReset,
         getCheckPerm,
+        getTypeCheckPerm,
+        tableType,
+        loading,
+        reload,
+        handleMoveAll,
+        handlePriority,
+        openDownModal,
+        registerDownModal,
+        registerMoveModal,
+        registerPriority,
+        afterClose,
+        timer,
+        canDownload,
+        downloadOption,
+        cancelDownload,
+        handleColdStorage,
+        handleCopy,
       };
     },
   });